From ee67b2e77a59b3c7bbd90052a1c75352af412ac7 Mon Sep 17 00:00:00 2001 From: KaiserY Date: Thu, 5 Dec 2024 09:41:25 +0000 Subject: [PATCH] deploy: dc17354769d0b9fa371448a909e3ffe13881ef27 --- 404.html | 226 + FontAwesome/css/font-awesome.css | 4 + FontAwesome/fonts/FontAwesome.ttf | Bin 0 -> 165548 bytes FontAwesome/fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes FontAwesome/fonts/fontawesome-webfont.svg | 2671 ++ FontAwesome/fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes FontAwesome/fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes FontAwesome/fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes ...3\344\270\255\346\226\207\347\211\210.pdf" | Bin 0 -> 3521817 bytes appendix-00.html | 245 + appendix-01-keywords.html | 330 + appendix-02-operators.html | 412 + appendix-03-derivable-traits.html | 290 + appendix-04-useful-development-tools.html | 331 + appendix-05-editions.html | 259 + appendix-06-translation.html | 269 + appendix-07-nightly-rust.html | 309 + ayu-highlight.css | 78 + book.js | 697 + ch00-00-introduction.html | 298 + ch01-00-getting-started.html | 250 + ch01-01-installation.html | 299 + ch01-02-hello-world.html | 326 + ch01-03-hello-cargo.html | 347 + ch02-00-guessing-game-tutorial.html | 940 + ch03-00-common-programming-concepts.html | 250 + ch03-01-variables-and-mutability.html | 357 + ch03-02-data-types.html | 457 + ch03-03-how-functions-work.html | 429 + ch03-04-comments.html | 269 + ch03-05-control-flow.html | 536 + ch04-00-understanding-ownership.html | 245 + ch04-01-what-is-ownership.html | 514 + ch04-02-references-and-borrowing.html | 506 + ch04-03-slices.html | 544 + ch05-00-structs.html | 246 + ch05-01-defining-structs.html | 480 + ch05-02-example-structs.html | 430 + ch05-03-method-syntax.html | 458 + ch06-00-enums.html | 245 + ch06-01-defining-an-enum.html | 489 + ch06-02-match.html | 484 + ch06-03-if-let.html | 316 + ...ects-with-packages-crates-and-modules.html | 256 + ch07-01-packages-and-crates.html | 262 + ...-modules-to-control-scope-and-privacy.html | 333 + ...ferring-to-an-item-in-the-module-tree.html | 454 + ...paths-into-scope-with-the-use-keyword.html | 498 + ...parating-modules-into-different-files.html | 296 + ch08-00-common-collections.html | 252 + ch08-01-vectors.html | 381 + ch08-02-strings.html | 470 + ch08-03-hash-maps.html | 375 + ch09-00-error-handling.html | 247 + ch09-01-unrecoverable-errors-with-panic.html | 315 + ch09-02-recoverable-errors-with-result.html | 512 + ch09-03-to-panic-or-not-to-panic.html | 348 + ch10-00-generics.html | 336 + ch10-01-syntax.html | 512 + ch10-02-traits.html | 623 + ch10-03-lifetime-syntax.html | 672 + ch11-00-testing.html | 249 + ch11-01-writing-tests.html | 994 + ch11-02-running-tests.html | 492 + ch11-03-test-organization.html | 426 + ch12-00-an-io-project.html | 257 + ch12-01-accepting-command-line-arguments.html | 315 + ch12-02-reading-a-file.html | 301 + ...proving-error-handling-and-modularity.html | 807 + ...04-testing-the-librarys-functionality.html | 686 + ...05-working-with-environment-variables.html | 784 + ...6-writing-to-stderr-instead-of-stdout.html | 295 + ch13-00-functional-features.html | 254 + ch13-01-closures.html | 601 + ch13-02-iterators.html | 420 + ch13-03-improving-our-io-project.html | 802 + ch13-04-performance.html | 280 + ch14-00-more-about-cargo.html | 253 + ch14-01-release-profiles.html | 269 + ch14-02-publishing-to-crates-io.html | 495 + ch14-03-cargo-workspaces.html | 429 + ch14-04-installing-binaries.html | 259 + ch14-05-extending-cargo.html | 247 + ch15-00-smart-pointers.html | 256 + ch15-01-box.html | 372 + ch15-02-deref.html | 454 + ch15-03-drop.html | 359 + ch15-04-rc.html | 343 + ch15-05-interior-mutability.html | 664 + ch15-06-reference-cycles.html | 533 + ch16-00-concurrency.html | 257 + ch16-01-threads.html | 465 + ch16-02-message-passing.html | 435 + ch16-03-shared-state.html | 432 + ...-extensible-concurrency-sync-and-send.html | 261 + ch17-00-async-await.html | 287 + ch17-01-futures-and-syntax.html | 478 + ch17-02-concurrency-with-async.html | 604 + ch17-03-more-futures.html | 1094 + ch17-04-streams.html | 373 + ch17-05-traits-for-async.html | 239 + ch17-06-futures-tasks-threads.html | 239 + ch18-00-oop.html | 245 + ch18-01-what-is-oo.html | 314 + ch18-02-trait-objects.html | 433 + ch18-03-oo-design-patterns.html | 818 + ch19-00-patterns.html | 255 + ch19-01-all-the-places-for-patterns.html | 387 + ch19-02-refutability.html | 309 + ch19-03-pattern-syntax.html | 659 + ch20-00-advanced-features.html | 254 + ch20-01-unsafe-rust.html | 495 + ch20-03-advanced-traits.html | 731 + ch20-04-advanced-types.html | 453 + ch20-05-advanced-functions-and-closures.html | 324 + ch20-06-macros.html | 460 + ch21-00-final-project-a-web-server.html | 257 + ch21-01-single-threaded.html | 600 + ch21-02-multithreaded.html | 1155 + ch21-03-graceful-shutdown-and-cleanup.html | 1023 + clipboard.min.js | 7 + css/chrome.css | 604 + css/general.css | 232 + css/print.css | 50 + css/variables.css | 279 + elasticlunr.min.js | 10 + favicon.png | Bin 0 -> 5679 bytes favicon.svg | 22 + ferris.css | 45 + ferris.js | 65 + fonts/OPEN-SANS-LICENSE.txt | 202 + fonts/SOURCE-CODE-PRO-LICENSE.txt | 93 + fonts/fonts.css | 100 + fonts/open-sans-v17-all-charsets-300.woff2 | Bin 0 -> 44352 bytes ...open-sans-v17-all-charsets-300italic.woff2 | Bin 0 -> 40656 bytes fonts/open-sans-v17-all-charsets-600.woff2 | Bin 0 -> 44936 bytes ...open-sans-v17-all-charsets-600italic.woff2 | Bin 0 -> 42120 bytes fonts/open-sans-v17-all-charsets-700.woff2 | Bin 0 -> 44988 bytes ...open-sans-v17-all-charsets-700italic.woff2 | Bin 0 -> 40800 bytes fonts/open-sans-v17-all-charsets-800.woff2 | Bin 0 -> 44536 bytes ...open-sans-v17-all-charsets-800italic.woff2 | Bin 0 -> 40812 bytes fonts/open-sans-v17-all-charsets-italic.woff2 | Bin 0 -> 41076 bytes .../open-sans-v17-all-charsets-regular.woff2 | Bin 0 -> 43236 bytes ...source-code-pro-v11-all-charsets-500.woff2 | Bin 0 -> 59140 bytes foreword.html | 251 + highlight.css | 82 + highlight.js | 54 + img/ferris/does_not_compile.svg | 72 + img/ferris/not_desired_behavior.svg | 75 + img/ferris/panics.svg | 70 + img/trpl04-01.svg | 68 + img/trpl04-02.svg | 95 + img/trpl04-03.svg | 123 + img/trpl04-04.svg | 96 + img/trpl04-05.svg | 95 + img/trpl04-06.svg | 87 + img/trpl04-07.svg | 115 + img/trpl14-01.png | Bin 0 -> 123988 bytes img/trpl14-02.png | Bin 0 -> 81694 bytes img/trpl14-03.png | Bin 0 -> 94569 bytes img/trpl14-04.png | Bin 0 -> 241098 bytes img/trpl15-01.svg | 43 + img/trpl15-02.svg | 26 + img/trpl15-03.svg | 109 + img/trpl15-04.svg | 84 + img/trpl17-01.svg | 110 + img/trpl17-02.svg | 96 + img/trpl17-03.svg | 110 + img/trpl17-04.svg | 30 + img/trpl17-05.svg | 46 + img/trpl17-06.svg | 69 + img/trpl17-07.svg | 86 + img/trpl17-08.svg | 57 + img/trpl17-09.svg | 85 + img/trpl20-01.png | Bin 0 -> 8491 bytes index.html | 246 + mark.min.js | 7 + print.html | 20854 ++++++++++++++++ searcher.js | 483 + searchindex.js | 1 + searchindex.json | 1 + theme/2018-edition.css | 9 + theme/listing.css | 8 + theme/semantic-notes.css | 13 + title-page.html | 246 + tomorrow-night.css | 102 + 186 files changed, 76123 insertions(+) create mode 100644 404.html create mode 100644 FontAwesome/css/font-awesome.css create mode 100644 FontAwesome/fonts/FontAwesome.ttf create mode 100644 FontAwesome/fonts/fontawesome-webfont.eot create mode 100644 FontAwesome/fonts/fontawesome-webfont.svg create mode 100644 FontAwesome/fonts/fontawesome-webfont.ttf create mode 100644 FontAwesome/fonts/fontawesome-webfont.woff create mode 100644 FontAwesome/fonts/fontawesome-webfont.woff2 create mode 100644 "Rust \347\250\213\345\272\217\350\256\276\350\256\241\350\257\255\350\250\200 \347\256\200\344\275\223\344\270\255\346\226\207\347\211\210.pdf" create mode 100644 appendix-00.html create mode 100644 appendix-01-keywords.html create mode 100644 appendix-02-operators.html create mode 100644 appendix-03-derivable-traits.html create mode 100644 appendix-04-useful-development-tools.html create mode 100644 appendix-05-editions.html create mode 100644 appendix-06-translation.html create mode 100644 appendix-07-nightly-rust.html create mode 100644 ayu-highlight.css create mode 100644 book.js create mode 100644 ch00-00-introduction.html create mode 100644 ch01-00-getting-started.html create mode 100644 ch01-01-installation.html create mode 100644 ch01-02-hello-world.html create mode 100644 ch01-03-hello-cargo.html create mode 100644 ch02-00-guessing-game-tutorial.html create mode 100644 ch03-00-common-programming-concepts.html create mode 100644 ch03-01-variables-and-mutability.html create mode 100644 ch03-02-data-types.html create mode 100644 ch03-03-how-functions-work.html create mode 100644 ch03-04-comments.html create mode 100644 ch03-05-control-flow.html create mode 100644 ch04-00-understanding-ownership.html create mode 100644 ch04-01-what-is-ownership.html create mode 100644 ch04-02-references-and-borrowing.html create mode 100644 ch04-03-slices.html create mode 100644 ch05-00-structs.html create mode 100644 ch05-01-defining-structs.html create mode 100644 ch05-02-example-structs.html create mode 100644 ch05-03-method-syntax.html create mode 100644 ch06-00-enums.html create mode 100644 ch06-01-defining-an-enum.html create mode 100644 ch06-02-match.html create mode 100644 ch06-03-if-let.html create mode 100644 ch07-00-managing-growing-projects-with-packages-crates-and-modules.html create mode 100644 ch07-01-packages-and-crates.html create mode 100644 ch07-02-defining-modules-to-control-scope-and-privacy.html create mode 100644 ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html create mode 100644 ch07-04-bringing-paths-into-scope-with-the-use-keyword.html create mode 100644 ch07-05-separating-modules-into-different-files.html create mode 100644 ch08-00-common-collections.html create mode 100644 ch08-01-vectors.html create mode 100644 ch08-02-strings.html create mode 100644 ch08-03-hash-maps.html create mode 100644 ch09-00-error-handling.html create mode 100644 ch09-01-unrecoverable-errors-with-panic.html create mode 100644 ch09-02-recoverable-errors-with-result.html create mode 100644 ch09-03-to-panic-or-not-to-panic.html create mode 100644 ch10-00-generics.html create mode 100644 ch10-01-syntax.html create mode 100644 ch10-02-traits.html create mode 100644 ch10-03-lifetime-syntax.html create mode 100644 ch11-00-testing.html create mode 100644 ch11-01-writing-tests.html create mode 100644 ch11-02-running-tests.html create mode 100644 ch11-03-test-organization.html create mode 100644 ch12-00-an-io-project.html create mode 100644 ch12-01-accepting-command-line-arguments.html create mode 100644 ch12-02-reading-a-file.html create mode 100644 ch12-03-improving-error-handling-and-modularity.html create mode 100644 ch12-04-testing-the-librarys-functionality.html create mode 100644 ch12-05-working-with-environment-variables.html create mode 100644 ch12-06-writing-to-stderr-instead-of-stdout.html create mode 100644 ch13-00-functional-features.html create mode 100644 ch13-01-closures.html create mode 100644 ch13-02-iterators.html create mode 100644 ch13-03-improving-our-io-project.html create mode 100644 ch13-04-performance.html create mode 100644 ch14-00-more-about-cargo.html create mode 100644 ch14-01-release-profiles.html create mode 100644 ch14-02-publishing-to-crates-io.html create mode 100644 ch14-03-cargo-workspaces.html create mode 100644 ch14-04-installing-binaries.html create mode 100644 ch14-05-extending-cargo.html create mode 100644 ch15-00-smart-pointers.html create mode 100644 ch15-01-box.html create mode 100644 ch15-02-deref.html create mode 100644 ch15-03-drop.html create mode 100644 ch15-04-rc.html create mode 100644 ch15-05-interior-mutability.html create mode 100644 ch15-06-reference-cycles.html create mode 100644 ch16-00-concurrency.html create mode 100644 ch16-01-threads.html create mode 100644 ch16-02-message-passing.html create mode 100644 ch16-03-shared-state.html create mode 100644 ch16-04-extensible-concurrency-sync-and-send.html create mode 100644 ch17-00-async-await.html create mode 100644 ch17-01-futures-and-syntax.html create mode 100644 ch17-02-concurrency-with-async.html create mode 100644 ch17-03-more-futures.html create mode 100644 ch17-04-streams.html create mode 100644 ch17-05-traits-for-async.html create mode 100644 ch17-06-futures-tasks-threads.html create mode 100644 ch18-00-oop.html create mode 100644 ch18-01-what-is-oo.html create mode 100644 ch18-02-trait-objects.html create mode 100644 ch18-03-oo-design-patterns.html create mode 100644 ch19-00-patterns.html create mode 100644 ch19-01-all-the-places-for-patterns.html create mode 100644 ch19-02-refutability.html create mode 100644 ch19-03-pattern-syntax.html create mode 100644 ch20-00-advanced-features.html create mode 100644 ch20-01-unsafe-rust.html create mode 100644 ch20-03-advanced-traits.html create mode 100644 ch20-04-advanced-types.html create mode 100644 ch20-05-advanced-functions-and-closures.html create mode 100644 ch20-06-macros.html create mode 100644 ch21-00-final-project-a-web-server.html create mode 100644 ch21-01-single-threaded.html create mode 100644 ch21-02-multithreaded.html create mode 100644 ch21-03-graceful-shutdown-and-cleanup.html create mode 100644 clipboard.min.js create mode 100644 css/chrome.css create mode 100644 css/general.css create mode 100644 css/print.css create mode 100644 css/variables.css create mode 100644 elasticlunr.min.js create mode 100644 favicon.png create mode 100644 favicon.svg create mode 100644 ferris.css create mode 100644 ferris.js create mode 100644 fonts/OPEN-SANS-LICENSE.txt create mode 100644 fonts/SOURCE-CODE-PRO-LICENSE.txt create mode 100644 fonts/fonts.css create mode 100644 fonts/open-sans-v17-all-charsets-300.woff2 create mode 100644 fonts/open-sans-v17-all-charsets-300italic.woff2 create mode 100644 fonts/open-sans-v17-all-charsets-600.woff2 create mode 100644 fonts/open-sans-v17-all-charsets-600italic.woff2 create mode 100644 fonts/open-sans-v17-all-charsets-700.woff2 create mode 100644 fonts/open-sans-v17-all-charsets-700italic.woff2 create mode 100644 fonts/open-sans-v17-all-charsets-800.woff2 create mode 100644 fonts/open-sans-v17-all-charsets-800italic.woff2 create mode 100644 fonts/open-sans-v17-all-charsets-italic.woff2 create mode 100644 fonts/open-sans-v17-all-charsets-regular.woff2 create mode 100644 fonts/source-code-pro-v11-all-charsets-500.woff2 create mode 100644 foreword.html create mode 100644 highlight.css create mode 100644 highlight.js create mode 100644 img/ferris/does_not_compile.svg create mode 100644 img/ferris/not_desired_behavior.svg create mode 100644 img/ferris/panics.svg create mode 100644 img/trpl04-01.svg create mode 100644 img/trpl04-02.svg create mode 100644 img/trpl04-03.svg create mode 100644 img/trpl04-04.svg create mode 100644 img/trpl04-05.svg create mode 100644 img/trpl04-06.svg create mode 100644 img/trpl04-07.svg create mode 100644 img/trpl14-01.png create mode 100644 img/trpl14-02.png create mode 100644 img/trpl14-03.png create mode 100644 img/trpl14-04.png create mode 100644 img/trpl15-01.svg create mode 100644 img/trpl15-02.svg create mode 100644 img/trpl15-03.svg create mode 100644 img/trpl15-04.svg create mode 100644 img/trpl17-01.svg create mode 100644 img/trpl17-02.svg create mode 100644 img/trpl17-03.svg create mode 100644 img/trpl17-04.svg create mode 100644 img/trpl17-05.svg create mode 100644 img/trpl17-06.svg create mode 100644 img/trpl17-07.svg create mode 100644 img/trpl17-08.svg create mode 100644 img/trpl17-09.svg create mode 100644 img/trpl20-01.png create mode 100644 index.html create mode 100644 mark.min.js create mode 100644 print.html create mode 100644 searcher.js create mode 100644 searchindex.js create mode 100644 searchindex.json create mode 100644 theme/2018-edition.css create mode 100644 theme/listing.css create mode 100644 theme/semantic-notes.css create mode 100644 title-page.html create mode 100644 tomorrow-night.css diff --git a/404.html b/404.html new file mode 100644 index 000000000..4a58e901c --- /dev/null +++ b/404.html @@ -0,0 +1,226 @@ + + + + + + Page not found - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Document not found (404)

+

This URL is invalid, sorry. Please use the navigation bar or search to continue.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/FontAwesome/css/font-awesome.css b/FontAwesome/css/font-awesome.css new file mode 100644 index 000000000..540440ce8 --- /dev/null +++ b/FontAwesome/css/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/FontAwesome/fonts/FontAwesome.ttf b/FontAwesome/fonts/FontAwesome.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 GIT binary patch literal 165548 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 z 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 d0mW2@EHO9NV8h3u2x_sp}KECIB>@9+Qn{FBV{ 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 G*yFsbY~cLNXLP73aA74Mq6M9f^&YV`isWW zU@CY~qxP|&bnWBDi{LM9r0!uDR`&3$@xh)p^>voF;SAaZi_ozepkmLV+&hGKrp0jy9{6cAs)nGCitl6Cw2c%Z0GVz1C zH-$3>en`tRh)Z(8))4y=esC5oyjkopd;K_uLM(K16Uoowyo4@9gTv5u=A_uBd0McB zG~8g=+O1_GWtp;w*7oD;g7xT0>D9KH`rx%cs^JH~P_@+@N5^&vZtAIXZ@TH+Rb$iX zv8(8dKV^46(Z&yFGFn4hNolFPVozn;+&27G?m@2LsJe7YgGEHj?!M`nn`S-w=q$Y4 zB>(63Fnnw_J_&IJT0ztZtSecc!QccI&<3XK0KsV4VV(j@25^A-xlh_$hgq6}Ke~GZ zhiQV3X|Mlv6UKb8uXL$*D>r^GD8;;u+Pi;zrDxZzjvWE#@cNGO`q~o7B+DH$I?5#T zf_t7@)B41BzjIgI68Bcci{s-$P8pU>=kLG8SB$x;c&X=_mE3UN@*eF+YgP|eXQVn) z)pd&9U^7r1QaaX{+Wb-9S8_jQZC19~W) z*_+RuH*MPD=B_m7we#2A@YwQv$kH2gA%qk7H)?k!jWbzcHWK497Ke<$ggzW+IYI2A zFQ_A$Ae4bxFvl4XPu2-7cn1vW-EWQ6?|>Qm*6uI!JNaRLXZFc5@3r48t0~)bwpU*5 z-KNE}N45AiuXh{&18l_quuV$6w|?c-PtzqcPhY)q{d+Hc_@OkartG`dddteZXK&Je zGpYJ-+PmEUR`sOnx42*X$6KT~@9ze#J>YvvaN24jI}4QG3M;w<>~!2i@r)9lI!6N1 z0GN((xJjHUB^|#9vJgy=07qv}Kw>zE+6qQns-L}JIqLFtY3pDu_$~YrZOO$WEpF>3 zXTu#w7J9w+@)x-6oW(5`w;GI8gk@*+!5ew8iD$g=DR*n@|2*R`zxe7azdr7~Z;$%< zSH@*lQ9U(Hx^%Fb|1?Smv({(NaZW+DGsnNWwX(DFUG8)(b6Rn>MzUxlZhNbVe>`mS zl&aJjk3F~9{lT-}y>e~pI}kOf@0^%Vdj&m(iK4LTf6kmF!_0HQ$`f-eBnmdTsf$_3 zR`hz2EjKIKWL6z@jj1}us>ZmY)iQInPifzSiOFN92j9$pX*CuV8SPrD#b%Qa97~TI zS6)?BPUgFnkqG8{{HUwd)%ZsvurI~=Jr8YSkhUA!RANJ;o|D->9S9QB5DxTybH&PGFtc0Z>dLwr|Ah}aX`XwTtE&UssYSEILtNijh)8)WWjMm$uT;+p1|=L z><4lEg%APBLn+FRr&2tGd)7icqrVXFE;+3j`3p~mvsiDMU>yK$19$B@8$Dy4GClfzo4)s_o2NuM3t-WhCrXE>LQ z_CQtR*!a0mhnw#I2S=WxT_H@^Saif`)uhLNJC zq4{bSCwYBd!4>6KGH5y~WZc@7_X~RqtaSN(`jfT!KhgGR)3iN50ecR$!|?Vq8|xa+ zY#*+B=>j4;wypclu7?wd+y06`GlVf2vBXzuPA;JgpfkIa1gXG88sZ*aS`(w z_9`LL4@aT0p!4H7sWP`mwUZRKCu@UWdNi-yebkfmNN+*QU+N*lf6BAJ$FNs^SLmDz z^algGcLq`f>-uKOd_Ws4y^1_2ucQaL>xyaQjy!eVD6OQi>km;_zvHS=ZpZZrw4)}Z zPz(rC?a`hZiQV9o^s>b?f-~ljm1*4IE<3plqCV}_shIiuQl=uKB4vUx2T$RCFr0{u z1v660Y3?>kX@{19i6;*CA}pJsFpo{nculW61+66XAOBZD< z{H|h`mJS5C2;ymL##}U*MC%fL0R97OSQ@lUXQ-j?i{z{=l-!$64H{LlTLo{Ln<|OV zBWq*5LP`KJl74fC{GzzP_Z;;;6i--QpZUrtHC@+RBlt+=_3TyV4gk=4b{TBJAx!GehYbTby(&-R337 zQ%g2)Uc&K|x|eL0yR*VCXDBqZ89C(obOFYYht(k`^q0OaQ*Y{)@7xE~KQ7XN)hGlZ zl5$1<#s!tyf%>mbIG(9WR`R*{Qc_h(ZGT^8>7lXOw^g1iIE2EdRaR^3nx_UUDy#W6 zy!q(v^QLL*42nxBK!$WVOv)I9Z4InlKtv#qJOzoZTxx86<5tQ*v528nxJ^sm+_tRp zT7oVNE7-NgcoqA#NPr*AT|8xEa)x&K#QaWEb{M34!cH-0Ro63!ec@APIJoOuP&|13 z9CFAVMAe@*(L6g{3h&p2m!K zEG?(A$c(3trJ5LHQ@(h3@`CB*ep}GDYSOwpgT=cZU;F&F6(b=V*TLLD z*fq(p>yRHTG1ttB*(Q8xLAl4cZdp^?6=QjcG;_V(q>MY0FOru|-SE}@^WElQTpCQZ zAMJy_$l;GISf1ZmbTzkD(^S!#q?(lDIA?SIrj2H$hs*|^{b|Kp!zXPTcjcCcfA+KN zdlV!rFo2RY@10$^a_d*-?j7HJC;KhfoB%@;*{;(hx_iP`#qI(?qa{b zH|YEvx~cE^RQ4J}dS>z%gK-XYm&uvZcgoyLClEhS(`FJ^zV!Vl&2c{U4N9z_|1($J znob`V2~>KDKA&dTi9YwyS#e-5dYkH?3rN(#;$}@K&5Yu}2s&MGF*w{xhbAzS@z(qi z&k99O!34}xTQ`?X!RRgjc)80Qud0{3UN4(nS5uZ1#K=^l&$CdhVr%4<67S=#uNP z$hnqV471K$Gy&){4ElZt?A?0NLoW2o_3R)!o~sw#>7&;Vq954STsM(+32Z#w^MksO zsrqpE@Js9$)|uQzKbXiMwttapenf8iB|j(wIa2-@GqE@(2P#M09Rvvhdu!sE0Mx&cK&$EtK}}WywYEC~MF5r3cUj%d$|lLwY4>`) z_D++uNojUl@4Cz8YF3nvwp>JWtwGtSG`nnfeNp(_RYv`S2?qhgb_(1$KD6ymTRgnD zx^~3GBD2+4vB9{=V_iMG*kQTX;ycG^`f{n+VxR4Ah!t~JQ6Z?Q;ws}Jw|#YE0jR0S z+36oq6_8xno^4J?Y02d!iad3xPm+8~r^*Vvr4A<|$^#UEbKvJ9YHF=Ch2jF`4!QS# zl8We8%)x>ejzT^IH%ymE#EBe2~-$}ZXtz&vZ_NgVk4kc zOv-dk(6ie2e{lAqYwn9Q$weL#^Nh?MpPUK z#Cb)4d96*6`>t7Zwsz#_qbv6CnswLS9Jt|b`8Mqz?`?H1tT99K#4#d+VwAy}#eC74 z;%UFxaNB!Zw`R9){Pncrny4>k;D}TV2BU0ua-+Fsp>wmcX#SGkn`h0O`pN*`jUj8q zIlnc7x6NRbR)=wP1g`-}2unC>O6ow=s{=NV6pfEo3=tY8 z=*$TKFk8Wv0K8B_**m*Q>+VW*1&gD#{#GSc(h#YQL?*<(ZUx~>L^RyAG3}j0&Q|mJtT7ec|Y7cr~ z+A`Wz!Sqz9bk0u-kftk^q{FPl4N+T(>4(fl@jEEVfNE$b*XSE)(t-A>4>`O^cXfrj zd_nrA-@@u?czM(o3OVDok%p3(((12`76;LwysK$;diTl$BdV)!p5Gj=swpb=j2N>b zqJ1D5E#zO9e(vJ6+rGuy<(PS-B6=gHvFat&)qr%j7T`vT1ju zIvHwGCk5)id{uDi@-e?0J*(-W-RGZs)uhSeqv7TA&h|CUx(R0ysoiQC8XnxL&RXI3 zO`H`8Pe&^ePw*`{rIJhzUg@MuhUL`IONG^*V?R0h5@BRDFgEF45b0jSrg0r{<4X)nw^c)uQ_Ai_p>ic!=K$pmnyqYb=`6fUo40ru#Gh= zMRJxOD(1n?Mjz_|IWyJK5^fh3*n>eI0MmEKq%=-oIdGd4F-LT>RL)Bp5FWxb4aNLNXB^o?YBSXQ`SwN zI*N~(CQW~P$HpzwrMG4IZKI>TVI4nQ$a-#)zV}LE(xgQ5MG@L#e!e@ ziNtg{Ph&qpX9FLaMlqMh>3)Nu%sAO#1NEsbe=#4Vqx0Y;<~+mV!xwj%}Z=xZn= zSqjxSH4T~v>Xd*=2wmHPN?@+9!}aQz-9(UIITZ==EB9}pgY1H4xu^-WdOFSK!ocZc zd-qhN$eZcN#Q^0>8J%)XI$4W(IW6R810*ucIM7Q#`twI|?$LYR1kr>3#{B{Z4X(xm&Cb21d^F9MKiD=wk_r+a=nyK!s^$zdXglCdshbfKBqa5aMwN#LmSNj6+DPhH4K-GxRl;#@=IJc zm{h}JsmQFrHCioWCBGzjr5p9L4$t4`c5#Cz(NJ#+R7q-)Tx2)6>#WZDhLGJD964iJ zJXu`snOYJYy=`<+b*HDiI9XPo8XK$TF86)Ub5=NC@VN#f$~GDsjk01g$;wDY!KqOh zC$x={(PT7CH7c?ZPH{RNz}Tel$>M0p;je4|O2|%Yq8@sCb7gRhgR4a*qf+WGD>E8~ z`wb<@^QX)i-7&*Z>U6qXMt_B2M#tzmqZTA1PNgzcvs|(|-E z4t*ZT-`kgepLl0g1>H!{(h8b`Ko=fR+|!L_Iji>5-Qf34-}z%X8+*Qwe^XrIS4Re$ zWUblH=yEfj!IgeIQ>m}+`V(4u?6c;s&Ym_6+pt|V`IQ1!oAC@R1XC3tL4BQ7`!TnU zWaoqG=nhI@e7dV7)8VzO8ivuC!q{hcxO7fo#2I=<`rktP0OfAO-CQE!ZT@}e7lw;{c) z@2l7RV$@&S5H@{=Bj~^Kp5At=Jq=Y92rXP@{-D4j>U=-a^gM2s-nIZA;u=fbm2BP=Zca5W81_cA>Tr z)x+r@{pu_la2Q(wm`Zqyd@GhNDNT&4oNHb_>w4{jIU}m&iXykMxvi;WL8;y7t}cp& z9CEpR)WlI1qmOq!zg4QTmzv#eP3>NLd7V-+YKmuyLFP533rd>WnvL$F3b}g39PYk; z)^hXQ%5jO(B}-TMio7@t<(V?7M5!ycd)u4Z+~!hym9+KwPVO^Wkhi^Dc7$R@)o$oh z^mRbgQ@5EvalJa}V4Bi3cs^w5pYtbXXz5W|e%+z-K;8M%Lf~BlZRvNI7=)cG6lbjg z?)l8iOw!mU`uaKN@UL4>d#edM9^-ePb(VICy6Cg-H^Ew$n_s801w`A83W!_Z{D+1G z(<9A>WB@>)D%cxw7c?Xv7N}6gg?&TkLX|0@k&VL)YMI~SsE^dzj2^3BKL7SM$!0Lt zj;ytKWw|(58n6_NNH$JVRh!W*wewMr7)H2jOCruuJAIIfPMFpf6j=hL!D3nVT9Dpo zut}|VoG<%v&w;HrQtz<%%T&X##*z5{D!!egoRN}R_Xxuy+E3dhx6!7mlNyuqsKR-P zlP#8EKGt{Ij~8kXY?&*%q)PkPG;rziWPd>HefyPwV49!>f&Q_@Fn{8Cyz{HCXuo+( zJMu<#{Tl}^-dh%nM0IrDa@V zMHgAog4`tk;DNK-c{HwRhx%Fn%ir3mex!XeZQ4QY)vQ_iZ(j4-GcO?@6Z-Y*f?u7_ zmf!}WRoGkI#BO9;5CFvMobtV@Qm?#eNKbbX!O@xEVhnm z6LFnWu=E}6kB82ZEf!g}n5&IuivccTHk-_5cazDAe+O!_j+dQ~aUBy~PM34Eq0X-LOl zjunFnO<4Nq|BL`!xwvyj&g9Q0(A_*xLT~l{^nM&kGzB7+^hP^L&bD7iVdXe3wobJXVX~o*tX$ zI5xthE?gAl!4+v~+ASbN2nYIqNn_#3>!fi2k=g*Hg_%caA#plNQR+RtHTiW>(*OFG*-nzu~6DMCrX>xzP`3sj}D!||8 zf3dk-w(NCUMu^C%k|t?sa>9gU_Ms-R2Hhm~4jNfPPyH!3Zy zV0QFf=MWK%>|(eV$pB5qOkC)uou{oIJwb_i4epV{W95%N)`+uOrLx7fNtD^czsq4B znAWb+Zsk|YX}a?b+sS-!*t2w1JUqU6Ol`&Jrqa5=4eeLWzr1DX1fWW`6MYf+8SOW< z+EMJ|fp${RJ7q9G7J+`pLof$#kBJP^i@%wNnG3fnK?&k>3IUVo3dbs9Nt)x_q|wIB zlBAi#1Xv-<+nr<13SBfkdzI?dJ|3~?-e>MzG(yRsA}I_oEd{HEGZ&7H|Km9mEbL6r z{Ubhh;h6_QXN_?>r(eWJ@CM1-yn6Y#am!aXXW!EfCpu}=btdYT?EJ>j+jeuc%;P2g z5*J%*$9La$^cy>u0DqjO#J%*IdaaPnAX#A6rRQ+sAHhY@o32==Ct3IF&sM14!2`FD zA))>ZKsccTyp$U0)vjABEY_N5lh(@e+Gj>sYOTgf?=82K)zw-?JX2d$x}n2Y0v%SjDtBXDxV2TyyxQmN?2%8zkKkKF*!AA$P$1#qrF%fUu~URt`tp3C_(>^tkcbHhO0Hh0A zpTVQR{DjsD=y-Bsl#nuTVKRxYbjpSJg|K+SEP+^Y*z3S9p(_-s9^YP5Zc?Vz*o(Qx z?f03co`dGfW}0T>UdEZaW>s0XVEzlw@s&bc+B-9;^^AGsx$AE~!1-7?tn9z|p4}_? zRsM&sjg1>#Rb#6jFBRKMeZ>I_4<%=&rF3yqUD&Lik@7<@2*(0rC)UqPj`Gfe8L&{S zhGtB67KhF{GnLZCF}gN0IrIPU_9lQ)mFNEOyl0tx-!qeCCX<;7*??>lNC*Q7`xe43 z2$7wD3MhiII4W*v6;Y775v{FSYqhp+|6)6BZR@Rdz4}#KZR4%=+E%T%_gX8-9KPT4 zo|$Aa1ohtUet#uro3p&@^FHhEX`OcGjq==$UeAQ~<6AZzZ|l75nn<#}+mo0rqWv5$ z1N<|1yMgX+Qmz?53v|%P=^&74bwqfH?xIC`L()W{|G`j^>kbs7q<$hb6fL@S za#nHyi$$TJ7*i!6estChR}QriMs#yy!@Po#AYdeWL~* zUR%)FT#4Q~O-N!O&it}b8zFOmbe=egH*Ka<9jT?dFCMAcagAo<>tKrW%w?P_A_gd& zXwHTn>a>WEWRzimu7EJ*$3~Jfv|@bLg}6iH4mgJB!o60eP#_N!xYrQoMf4&rGLau~D9ila zYGD*3*MNN?v*n6op+dQM!Kkr@qH1|^ zh7skG&aC;+$C$OSR2!ke>7|B6JDpjV%$Jo5hI14PGyx1I=Diw7>h@vzL?PLTzC;`; z?}nkmP%J6$BG!9mxz?+Np zIHbVy&<#H&Ekz1(ksSJ_NDQ+XHyg-!YcW8YvE5v*jFQ->F;|Q-IB@Mw6YP~v=jY$~9n@~8MVO{1g z@g=-I$aXs1BH&>hK(~|d>Y9n*;xRm&07=pLuqVYV-bwyCUIKgMdLSrovEs2f3{b z<++d|UX&}*7)y8){Ntc{RL*udOS8r%JV4EZ64fUF85n7%NAWejYbLV}NB|lS>SnYN z?PFpysSR*OodDcNK;OVKsSbKS^g;|bSdogA=};1?3rYq|Nc_tR!b2ln>=bNTL59uS zZjF^Y1RoS7qF^>LEqt<#Mu0ZjpiUNLtsc5%t*8}5lW4OWwFXfqGn-q~H)5}2mSRZ^ zKpfQxOe+KC(M5V`tz1zQ)@pTTQ2?NgStmwpvPCi&U9wd)m<^I-w&{(`Vb?Q*4ApV5 z(G}DMfgox!S_C+OTa5UkEbB#G$SC<8vLrDPPT_Uq5N~7`%Js5Ut3!o!f@HJm?b;(N zbbv90V6J7=E&)E`b|}N4n`VOOuvo$IEMx`%EkX8mpug0yY80enF3?M57gI zQ((b(;dv_v7PDKFgL|6)q^sb%Gp_aU)wp^uX96>jGEsOmBhyuDZ8}+y{bG?UqGqyDfYMtJ{6@xXI>fVC9g+uG zbQzl4fY>P6VAkv8GEpapl2>quqSIoui)Mr95Nuw@voGBux%Mq zYqG!&A9RXvoI%gZRwI->g2SYPB1tbg0U9UkC70cRFPTKU0L{E!2e?|as;p-wNwA;> zm}yKfYURNzE545Jz^T+srPZUGX{3qx0H&3ol`)Eow3xXj!2lx+DkB=}EoF`(n^)2W z_26hljpwvSdw}akJQN9;WAQnnHTN=3Ko19hR`Qqt#60*^1acxN84Oi8W-4nXd^@w0 zVpMzKqWw_(cHwQ`*uQ>F4F;Ncc?}XU{q867ZF>zihsu1j_i%f38%41S53RkO-5Bq< z<^ffy6fQNDn;z=lDz2OXjU+MMr0ziZ)HseHI3+}-N8v$8UWEK_n5pL6VPUS@YH^ z-F?^bJ%5Vt}@l0B2B$XfpF!7J0KUW$rc!~hPD3+Ms%)ia=pl{0nuS0_) zMk9rt16uqE&;%{gtVGqhUs{u$%()O~zzC_11`vYVVXfdfEU}YwTDn~JYTSiTDRNih z4#ap?$m%48h4*c`rhEH7?VLTW9aCi~b>z~)W0xM$c|y(8H%u~4?Yic=Yr3WyCvBMC z9P;P}Ra`!CY1TVd3~%qgX48EO<*6O5d**2Osm_lAM&ZKw?7XUKU$o?gjCIcqH|%NJ zuxtIAj>_t$YW%D0ShIfD2DzU5%qnHsRN0vm^B3-wcim7D^;K7~Uj8EuKZ;X3tlbVD z(=eh%wxAVAWPvDL3Mmg=TPKpMGzTdG=aT&qTw(TFBIg<;`kFOrB)&>#;&>KE1kb>+ z2B2dhdAN+pj}^ZH_t#P}WOC_RDs4ppbD0<}eknMnviR2G%#`AniYwzKw-y(_5*$-_ zmw5S-TNmxQbkR$TmM>p=*`CF(EG{@lszbazB$k;2MYhTooy&w{`02hJ3>+yIKEOe7 z@JMkSHwDW^-jsRwlSM}sEqQs-p1n(#FUOllp3=O)Tup&?1<^)a@`nk7JGz35N>n$} zBOy~(>fI9qX^_jCE*5|=cn@Q((|dZ4jk)4MmOAk+0xA#wuDRF-%lTtBwIA!9Gr9Ct z$c`7mj%LBTedqC%Rm_T=dk5?Lu6Ta&XaF9q!a$AUtk$ z*e$72Su7q{Rad`o)%w|Sbyv5rzAip{{VH|GtUY1tf`Dk1!6*HuN9YH|>@$Gpvq}N6 zCzbi<_XLxmE|LLdr@JCzPlDyUYO2J>kDK?krp5CY@11*7)8aCVVb&~zrEGE2O>>tojkD`+_dDb1*Ao``HQpP(giSRL)4OKuTMcNVOb@(m7M?noGc?geUJ;8t6u0>WYa5RLDJ>(^Zu~>-DTzEbb z=Pw6=C#Q(ao#It|Sa^jEBWtV8YNL5Ce+KO1 zHqBg6?QNQUAP0QbaOG=Lqb?5ZLlZP3JdqXFBbSG?_!QPegco`UzEDBCfy7n?l|5O(2uWh*{9fh*}OFkZGv)4J9g^Su_Z-y zktO~$6KAdO?4HIhm;a)+gVRbF%BNDw_qH-YUp3>pUiriPU-DaPao4J;%WF%Dllm58 z#~3FQnvO5O$UIv}o~Up(EN-l>@f8Ipwl+*yG^2h|U81N>`H9+~R;Nq6WZk+k_l_|; zqH`}-wki9Eekf?yVOxp~wx$i7mS&wyRfA;|YZ$pD0iFQM7=^Of;Mb5{*g%Q+MV}ZZ z4uCY|_@8q>JQ{}h=B5NG!svf6mRKr5#bVli@?ZR%doi+~75m0rb2XFdcTK&}XtK)Y z#n$?!<(KX3?3gc;rSMQ3)+>e{<=;f)h)dXgJA+DdJ5q_(=fbyjlD zyxOq~%LPEFsh*KmXEIW|_M9hDm%Gdrv97&s&LCvUqb)02CoZ4W(b4X%EB2q(#G5YM z&@wJkH_qwtRocyZt7Y4`(pa=cD4!kEPl#4{yum=*q|U{&O2DV&=)yXRws%3})r>`7 zty6tM=kuW2FpR*(!{^GYty*Jp1woSmG%(Qs4H^#!;!Q>OdkH@{*K(vzM1v#qO$_R{ z7+Jto9d&*4xTs#V1lt-9mM`tTxU{8|32n(X!6M-UNsS#R?m__F|Gn3X9 z&{djT%C$c`e{S8Bi4#KMy0LTS?(Vvq%{y6Caq7xk-@t{Re0DV4heM^6gkrEpL-{{% z)|>$4EU3Gq;JmPH{E@zsRX+#@>gc;qk2i2FwVHuCI??#%xdiMweM zWaT78*EG!|+OV634wd0UaR@TenRhksaP%AUUdHC0VcZ2nT> z|Lq#TX5O&2h!GYviFiX{IRHYEViDCLf^Wf)se&K4oOU>MQK$_!7!L(|E5Bx`dn|^Z z8D!P9pUu^~tYLFpB<~24WRqgt9Jadj5ce6JRV}}8O%6hRA!!0JH5LHs91WhgWWLJ- z!KL(|#^$p^amdJ5g8rZ$Ggy6?%`B;J_Kppf<0XMKcmmW9@>-TJn~gIShXI5aI(xEx zlSd-_6cOeEGR2J$MBqWpK*2%7D7_wEFG0(EP;?Sr1EpZsk|pld3%9nq47KjwNtga; z^X`AUY0HzBudMExSE>hYgVxdT>O;3bbp6&zv#t6lVjtU=7OitgFDbdK>r_jozEYb*t7qdj?MRk%pu)4==CR^bNgHOU-j*emraW7T2WR%b?1^<K?p<`lIUQwM$W=cui|bx}?bTOb6E1v3`QcM^BdcQe z=PpkFc*njs2H)6MH*NX+$l&D3bkD1=@_CF6^b#6m7%YZwDoKJobt%*>6l7EZ=V>@G zzzY{zEr!q?#B%Vk9VD%4E~MxbJ)hcn+q^0Z=@qNy9XNJiUX{8Ns(OzNq-fqrsbhbE ziWT!T7SLhKQavnveOJ`2^uK@O;eGSx?>nsSlq%#_#sdo9iphZ#Jwo|{FhMbfSrS>R zQiwFss8KQy?9j`|&<*8j64q^OVgV#e63^ksE_l^9($wb9f`EyHv4&?kqn<@TAOMm< ze1YGL4dcENbcWZd&n7h~Atmwe(#RoslRpeyDguGF}j}$MRo9?SM8!=4Q2wU($EzceOopeaHDv$UhoQfY3;W=e^g5xM87H z;I{8*GeL)G;HH8ITBt8$#)NOPnG>ql&Qh*h zWt>ty34rm;*F33uigBg#?eg{u7R{5>Q`U$R2j3@_Lkx_M{bOC#*zx1XR_*c*B-IGq(GV|B@o{8hJ3p1*lD@AJn%&$i*n1|9(=hKoMs|KsjeFu0HwhG-gj z6NR02xQ2KllvU2l&Q+ddYuKj6LihSj-&!x-tUR@F>EtCIlkybUel`o1t{IyqKm3Y# z^I%x~1FN64cI~X$=bbnBPUd;Rxn=jXhSG-2Z`jT3lX2q?hsL#({W072*)OlJJQjT){R0dcw$MIV@Im_3E)riYBiU=q`Y_6ca&e9uVeb_jW)Y(*6X`BKYM85 z!b8t)Ui*XT*XL>UuiVO9x8B8yUlNM}WBcAqm)&yESfoE>5R7X!w(jnYSbl8TpaivJ~v3;LD^f$vOykiS%0kDp1GRq zVCg_iC;5ATIf&(~gt_DK_8Vo2`%JbUh z9jfe_*S6Eje-d8cyItyiX=UK|B_;1L?UVG9n?6x~K;xR|0vZ5x!At8OJYq-&B}jT5 z#x}{P70vb-p^szS5EvI&o&q#3;_jrm%4X&6S8u*@Sv#ZVm@V<@Hf3s4l;7vm>@w-r|)yZS%w?(I1*QeIrsG=I+5nepzsGxrc~ z!pSc|SCA)uB~*o*q}1leH+COyX<6)cl^Ly@AOH2^A6)<8mq0BH{PW9E7WVFW74(6f z)`kEd2^SPxr15s^#3*QkxXWqEyk{wqj1GtNbEQ|(J1tK6 zUnIYs&2$CihuMv=&x^lu`v>+G339PrtlYp%HorK*>MU~Tjmr477+hGhviLYl@>d-K zU!uTPY~kv}%w^h&xW}uU?TFq&;?(Rl#6glkWN>Gw4B#URl`pWSWHsaPj-^{T?+Rl%;){@`StD{A2dwJ|V96v& z$16bph~Zles|b2KXKVo$Gy2J6qqP8xDY~bRh4}rn$()b-mt@e#Fwd)MdNQq8Y*-I^ zKqOSY68uyOQhX&e!epDI){mhNNM=IwXQLY2+&brLfPWf!2x1u(hS5ey?BxMlyyvL* z=no!g*pcWU2>q^rYg;4Lqki3-zG)X;d+6E=r*#^~7*m$_EGg_eQ=4jA+oZ8YMYWd6 zb?&a!UGBQcmfE7Cu~J)W?WPsCJoTfeZdoCs5nPtKdb}+(w{hma1+}#c_RZX|z*J-U z`YpG79lHe^?%Xkc?nU**&Cy^m+F0WA*VWfFHrCYF`F$mgbgj9#{-U|#cig$|;T=<^ z?0A^d|2~dA8{jc0T&>LodGPkA2Ce<%xn1wIlX?a%!@Eq4Md6Y$Pjh8C)#tL9&B{-Z zDl*AaMfM==qY6ZMs*j2-_o&#DtOvEgKO^o#a!G8V!FLJa99SgR=R+3-1WD>6kPt4T zQEnn&KOhDe*4&&kDJBfJWl@4anq%Se(e27Iv}pbO#r>3wvWJpUt}zNZYx9klkhS?P zCbrI418eh@4+uTT5z<4YR!}Wu!0bb{)|g-CHs~wgPLx_;gZ}Pe*r4aOmyr#+pp0lb zHFY6iYKHu9A$fn1?OWE+XV41w8uJSK1!e3*OLwh>v1U`ou!Z{BA27G z@n6d|J;N3qwe4uQiV3KTDcpf57p!m?0p3so1Ax@X#2IiaA}2>9&SUXL^1&>Xh8#Oo zQ?C?L-8M|oiJLpU6Q{%GGh;&0K{owhQSY%3!h1qcSn>U|R_L;f`cCNUO-efJ#sSbh zkg5Hb9y)Ys=YeAvt+X|EzTjRz37BGClh(UmXfNBmxvV{Ttan9870vRhk`;uSF?`m! zyWBXXtg*^vTY1s31F*aP^xb!Xf`+yrz9*G!3+V51{2PK^bPhMbp(nxq$mtS*2*~V% z(N&JbY2FYBI?V#24?IeNyZFFOpZ~&zB|@M?sbh`bnlV9zkG}tHdLK zx+5aQXm)byO7#8XHFtDn$5~LO*5aqH%?m z$2wT6nTmGDI)?$JimeWHNO7Kra|S#r4ugug1UgoGf)+&L03keV@p1OHE$p^lBA zt*GJGLDNniq=XZ4I+Mb*82pqbfoQ@+p_JGdB0aQaeTB!Lr#Z$97FjWL@MMe@Z^D+s z&IK)jih;Wbb%1MocDc@#$)|IKVWN*g2&aNVGFMmdoaL`cE`T^;1?Tcf@^i>q-czu= zA7p!sX62V=__ATa&S(g9I0rd{)J6Sdr^qB}JA4(U(1Y-`7)a4D)MA`g7I!Mwm6+KC z^C_nUK7sX}(ukntS*u>(uyyY=UeDi#4Mlus`)o8@(xaLmYhKp;LGw3oP&Rni)G|cQ z7Ur#P!U!VO1g(pNoJAP;`R9fA(}??`-wW?AJpaG_{Fi;Nu)eT^;QuU%IRlFc*+_>_ zx`&U5+e^|ih7FuRhmOU(m+aK71UlNUGH`jW!KA(Xf;sb)=69M;|L@O||H&xL zl74Wt!{fDxvzf&5M8E`Lo>IUfK@P&dqXA1j9Ysfw#32a=jPn2f=>Dps?=)zh0y=nF zlN*J67GXr@2Az6He%|WXWJyrTG^F6<|JoS+k`Xm{tCR{6!43_i__z|&s!LT*4`;a3 zwB^UO!_$ZGtWdT77?_S^7Dqv~y|xiDP)-YnK8%pxr7p+Lxp?4~wPvULd zUmZLLn47GQg>WUt!yAzB$G%F{zYS~B=am%aex&q3x^I|U4B;Xp?}AZk z^YIrlk>Jo6{xrIjl;V~Ot%d0#DhpmMHo+{Xi^Rz)*c5L{kRh`PE-|>;1QQ0h^lDfo zd@>|=U5Y91Dt-M)<#*Gl`Fr}3$-Z}Nfx!+IeZ!v7G% ztcDQl>kp+vdVk8V$G)HSg>V(Daj1A4`JRB+&HA5cq3-~n7Y2oBATKb2YG`uA6X8S{ zY?6>Vt(nsVyAxRF6YnNNtUn~CLrIFaIITfuxMVt=e)j}2Or%oj&|p93A5+|pOZ*pd z#pmb`Sv&G65piAWD5e2SoNSIcgY-cWl#06J$28$_X(YT)8umd{pHg7Zo=kQW0->a_ z7yr))>upwE8ZMWr(itk!ke5-mNGO~-u?owjq}8&~H}EaBRQUYJk_kzaMJ-j~1H#0S z1rxw$&lCSsY5*5Eh9p`{{~@y^&(mjM(r6cji;VSvEmZ0dZ}u7v>WxNaH@lu48ujuc z{04p_HtH?AmEG!dXI$pv!-8`CYpz_XJ(2siAQuczyy!!@pi$wT{)yp>!Xhe@`nl`z z1^zAe8p<`=WnrFL1*!@PPZ=huBJ={PS>a{s$9bBsNe$AX5$!cHKZH|luaOs}hA*pi zw$Rj=>@_5!LqS+x4X9Y`l2I@7_L`@81m(I&E!VL96$Z9khIpPCg?Db=MU?BT)g7f3 z1oR}eOn#rEov2`=TqatC@g-cu`;n}|1~nUG-Vnn;qJfhg6hp5T(E`dSLj-kY;GX6Q zi-z9$l?TDudYiv<9p*t?+4_WO=CNA5llp|}o}F1=q4CAqvoxnl z-+26xjr)Osgn&kH{tC8-tSujYAX&ByDk<0rhH0A)eE8>_MbIX>Z9mf=3Xu{d5DSGe z{bXd;!bUBGMEs02AatuZk6h5A3ny8K=vdpjVylr_0=J@48tARLevxvQQ6xQRF2uMT zDdlo6=qryT!$n?JVgWh91v4nu1G=%?-N5?j)BLSd2l{{#%0EAV&&xf1Dr{4qxZQ5= zL(D1c=mH9)qTh-=!wPQK;G!Plb9%5!QL&)AKmk+G}epRD9NQD(&9O0C6ZElh(DA_jLN=MkxobFd(kGnzu)+M~#d1*vxjpI7N&Q;y&0Q(nt9Ov@ z0UAx~93%#q(<@Bk9CzjhzLPRMRY32Y!M4>0SFb)OeWL#Q0u->@`-CeGuA;1us}BAQ zc@mIQK>2shoeQcVJ#!PiaLyd@Kj_ibnQy2+9_9fE%1-skgH%88v00xH6V6~l&y7;< z3z*+Y;rwAP`&tJ>jA`DJcZ`7&@iupQ%b%(G56`bmS<#9BG;0CU_T(luy zt=;C3Nlc<}xz{ z@bcSeLnyAw`PUGAL>*F~12pf(YnG!XZdkkO7$`Hc?ByN%$Z$rECfLDLP%2`Mw2Lkn z%iuczcuO)T(Vwa}C$&16nxS+qnzVRQ5p9I84;?;p=#nva%=pfXYl&x;$;i_ zP|dt~6wqbsm-{)G2ROAL$rK4<&wrWS4F}$7>VLjZ~K@NB#Cl zO&Qzj{Xrj9Q?1IwthH&{H`*sEN1LX>TEL$T9bDBnzAi-V%H>rqOSs{8i9DPnOQEm? zKnSNAa;HMY+M##OP3;`0pT=G%gsg(SQ~>24N?A+(Cl^G2rTi+Y_Xmo`>Wi*@@Y*8% zxO%^0U>2&c=s7QU*VIcq8^q`sm^J3$P#9i9SGJWj|-YQ|Bbro{q^IrwHjL#@aw6r zO5(p)w}zsz_FT2}`msf*s$lq^*3AS90U;2;%8zQ$AmjS~uU@58ERcbWhv?f>K#BeL zYN8qi*%SY*!e{wB?9^3;*7vWVA<6l3`r<8_4JXqkECB$U^#wWOuf$1XFNlXZ{n58dU(CAELUC!&Oi-&kb(YyL&bkw zFG94K{HSTIT!grnt(x7Mt9azgH#FZz%{*?b|DaQ#z(AfKI!4Z}p<~>Ge#1Se1*{80 z*9-3X((C!(%0GrhVCY#e9J%8rDwB&WM#Ib#hh$(WdygIeQucm3{$#|=Kl+eJTk1Z-(L@12&%MZxw-kLv=48+WES(PWIT1Ks z0C<=YX2Yy?Fc%$1$a>sE6N@S(ydbyNTznjed+MRp# zqQd(Tx2JkitUck{ZkFv%h>+T$y361us*p`!x@ITML#@u!?BZJ-!@DqEXFzk1cNoI{ zJl=+S{D?*ZKK1{XW)YK5yzt`pzw`QU#6SP_sM{sCSn6GMftpB-*B5YYd}6E1T{V8s zBM)6)8@_GeJO87$68vfVhG%-%V?Wnl^6Z65%hMOv_5&oUSnJohv?fUse?PIwpgrjj zbkDBTKUc**{+~4@My+3;_M*cli^%=z;`psm^74d} zCj*Zab%E6QT+owC_c5m2HMR6aD{F5vvrm4M^bRUw2oc1;q9jPZaA_vxsFaP~U?%O27@cleW3dOF$d>Vq0Zl}ZBVHjH ztf_?4md<5`q8EHId=*llqXPIzIAX%~1B?b5_S~HV>kar}&i$g+Smv7ZlTat1QzXxJ z$_Fac3X5RMSd@80O63eVgMA|`7viFSV3ZmRpY_8pOoLm0i@%=q@I7J=7Vq5YX9ffA z{>R`WG+DU(#C;6O|HMaLg9l zl)V7Zh_060KjCS9biA=f=azMILnJ&h}h zly@(WRadr83lyzrB*7h*#Kz%c#TEcwRZLH44Gb)Vv~oEAv$QE>6AfHr(F(C#@+ zLJlGHE;Y1|WL2(ysP_V;dWc_?Nl(dVTAaYOpjag5{{*~1y#T?AsgabJdOGqoA-oeB zE0oxN_!V3X&c0eE1?A93*;A)ACcg=udm8GzJ~h))e_kxCET|AT%Htl--e2VXnV<@TsN3YA17M0e6&-Kk=YQOE2LMDBtsJQIke# z@?QDP5g#LZ(1S@bh&gBDacz8F` zRpD-jIg8-ap`Ym@6rNlM3=JFCvr)2b9N_9ODp{J#8`v;h=Es?IOxlxNiKM<#Q9_2M;_jSYUH}t zqe$Y&x^->4;JRt+*3Xu{ylQW~6s%=u)@ z9}!qmL7OlT#T4rTQru(OPi>~6!BlKwMiZNC$FYcG5yvTlmyw#v=M)cWYQ~gfFJVt> zq~`S7oR)6J2?icV&xW6Z&I8CNu=}8Y!-3V5*oU(pJV!{pyvacr8HA5P0nDoEQ%(JY zi_HlS4K2djpeQwr8f|LDf-$pdJEIqbnAcQ(`R2Mwiz8zq+ZHaqq%>Mu7wuYe%n&tL zfGjDLMa5%lx}tTse#w%qZMbXkq~r%<8NgEgk(yfXgz;U~-7DFX3+bnQ@#AqBY=^OF zLbS7X)|dq=R(4l+ji2DHt%>*r30Rp-(iA+JEy;u?keU%+qc(@`QA$BS9Orf!N}fVd zAL_Iua?ljh5MAJ^c}*yLOiMzDF9{(p(30MIi+m$<`Ua+XOL>c2D0t=$9GupiRQ`FA z{BOl%>K)}7|3O^Dzk_}@em{Rc@>6mR)GzU+fJP3!_lP56}Ebt+|2<0=uUVxPy z3)N6@44izF$8~7*yh5H)fjBg#!VE4emB7mt}4}d2r)5g#{ZnU8q)|NhnorPaQnz>S+LontCn2s+La0 zh$jQ|3fkihRKrX7xJMtz8qh?orW`edrfqDgrtxfxOwvIr^UxInxzk2wXb_tKnHl(z^v|lS3R^;C5-qU z@k^Q^e256y0(|hy8uo+8d0&n6hRC-))pyDz3Z=lgVFfaOs{79aG081CD(x1Z!z{a6rfg{`f{nt;>Z~S~76JTgmet|iqonNy9qSRCrj5SG zE*k8okuHXMA1b|YZ0qc>KB6<%`;DPFQ>HnqYN&4EGLuv20mv@Zt>Scu^WHjG$A{{M zn0_!1B4y#@2tE)shK{KGiRKDSUb&Ams?2};;|q5pJXA^P3}#c(A}>+?UHMSdS`A5u zx!-7KdwaT0vc*icx+RrkWvS1Vqu=l9QLeTd`z1pXyttbcEn$YF%gs^<``o$khc~%U z9?(+A$FHjL21BG2Kpc=@FYF5APed6YZ)jh=UwQm-OL4H}p<%olMV739mlk7y|VeJq6h({N-N`F)AkKU*9A zZncuEumPCb0)>TTg$*!DALN=JPBdym6qG@%J)>S~Clne0KH`mlb{f%P!tPP}AjxA# z93;`Q1V$D?)kIu!LsQfhjw9EQ9F=y_B1`piC?(juo)nIC0- zDn9&Z<}dFxHQlKEWj$Lbgq~n;oLYO|eW)MPm|++FFVI|Qe8Ff4uCPwVdtGoTV=nn! z9Mg!5}_H(v@l9y2_n5lmXZ?=E&S(lJU6Imo&ZWZIn@mAKqMS=Au89C=0ru@=+;YS z)498q9ZI9JWB0j$+}686F?+mvy={HRr$^I7WzrL;!!dIDMD^t8ryc8UdcBwRSe?@Q zeCZwRQ~JDm!Eo-)4?J-5xd4^sKe}D^^(*(gg=;zY{*Cfo)5#lh`mXYC@C%ts-TPOr zx4Ya5jAH>O zc|Naas2cQjC5qX ztN*_ zp0iX-C5(oALou489mBshd<ac}LWi(CgsaDL(eO*GXYH2uLp{vr@SV&-2TX_wJ$c zu;DVWH;0OocbL`LWcxFSsKaT)I-4jmq{X-c2t|aJQkL}QXiTVMz=F`J*S(Tc{UO0! zi%CAn@koN|GR(ehQJ(p;)$Op{@wSOMEh&o|_Qx>8!DwP- z`FJ}oaQjgCpV#o@Nx!OH&py^S(Mo<6#&dsVsr*A}PIAih}WFPR&w zCRp$^BQjucQVv0ZvdTb~5Y%*mLkorYIJsDrg^}#t?y#MKoS(VfIorvSE~hJ+Nkv_H z1NyT0bd&Z4`Byk{k++vY9$qbIp;T4E&6tF`tlp*!>j)C5KxYI&p)K>A@*LYD^nxH$ z?vczftYFCQBHl2#E4np$pk;es%l>Foya6Zs>Eu9EYEz!e5Y{R^h4l>CRPYp*(qm5H z=D~}jc&KkX?%Ns_4@L11PWDH)q8*0URaN#UIU9C%a`k~+cScW=kFDx3OHQ<-c(1A| zhLPT?d~EY|Lya>!Q^W8jeqE%Xq@>T#)`R;Q;n0=BC`ofPQDBM+{rFksZ55a(iGAa) zU*eU+_dJAYMzc*kC0`CJJP^FOO9?7Xpo<{uSO7rZNrA__;wfikngXyqdcC>NU}wp6 zrPBc|2Xff6WKjHOlr*OB8%+b_HySNtDX$lf;WU+r55_k%G}>I?y}14c>;mc66GV=~ zB>p6tL*)LIuB-?uX}lCp$PRoG3NBNh#Q-2Qmv!*o*&zk*WvQ}QR7jc9RyUZv;eI1q z1myA@D>js9##>)#Y7`z3u*P$CtoC0yo8w|Q6F271w2yF)%8KD0_2xTV;x+lRX_)S7 zLESy7mmECL$tj(~EAaM1nhN5QP)RT+`Em;B3)pSP8(VtVYgUKyj>BSg0P|KE5JF0S zre930DlR@=+*Q0v=*uq{`_A#ko)-3hEcA%gLXTvULWp5*D*ZywDm-z#xOi1heo6D& zsfhffDTW$dtI)HAE!7yiAVDOsdl1 z^kJ2l>S9UXuCtekeIpWyAb)r;s3gmj-+uKnaX)3%EDkWLFD+A&-j7eww|&#xTfkW^^2cYa9_rm4Q zin3x4(yLf3=0BYT{IwK{%rJaGAcrfB}x_x6~ z?NgR#`|L{eSv%T*Hvmwtyp-4g+;<#Yu-bvpE@#a&$atCK%V}j(r9`g}0;71P)B2$A z^>07GDy&Am=Vx|<@=_YGAKMS!>s6Le->|zU{Oc`LG~#QV)<2JRJPc{DYNOS8_y_LC zl{@TCrW62$lakMd)^-st?P%lI2t z)Hp`>W4-6c4x>S@{PH(^%>AB~t9w+1&30NhSzJq;*3A}|Fx76iJC$XzW&Y(3cE8JR zb!47(SvFgpOI(&s!0&j{;v!y#gh|u^kVZJ9B^rTLKq!cWhf6jz7>B3{VIyUy6St8` zt}7v#!kob_%sj7rhkZ`%r086h2XZFre!9|+So+}e;-=^KDM@y(a^Sx%DRgARg`+6@ zF2u-VGLQ-ZWzz#K(++!YiRJ=~3|GVj`!3)x5$zUkh)3uGfML}Os*EV|5hF(UJ{A{; zN;^ys#azEYS4VvUT}QTW$g@cuN;(_~!om}CfZ=y>M0q>J?!6&0ot>C}-$GouFs%Hh zTmXOk#{D|~3BT@JuRegi$szQ;LUnyKd=u@?UxB<`_Ui-kIc(E;I{yK`ZY?|iTsd&P z-Ds3oUP!mxQvQ9=j3s~$dYyr~$?Q9b+{-|eMivJd_6zn%Diy*g%^dgph0WMnjlyQm zYvbd%&X(IOX1{WrZT72MGXRGk%-(<@szG$F^a0wjK{JzM4tXi@39NXYNK<*-69LR< zHA_JJax@?fIF6fq^$B30HaB2{+{uk~5)kSg_1^k+EuCO#z)8DSy4iVj*ToiH!~Bac z@4lm}>JH~j*Yjl;)*~sL(K7eK*OTEpx-0KkaM|Wbua?%#Xj@*tK(C(|>l{C&ZhWb0 zMo~pu{jBOKI=QucYE5gb!YQVnoLhYCh8f$YkM&BY2iPFc51wjZM;I&Xyq~eb&xB70 zb!DyRW$vzMsVFjQ1?9U8snP5KICcCp+z|F5YaW9djR7^>S60XQbPOU4qinn+8ToxO zNmqH=nTD{Wfv@awt2Of=f=NR|5D_7WgKt``%4VxKRM|4nPih20e86-edqM8Km6$g( zF)F>V8F&FIKjPI0*Fu5JJohBIjc8gc^_8vam+bbN) z^b&a)S?@-wcXYVkV5Z!+PTi!3PaWYx6x{?3=UUM zy8MhLFoOTujq!`V*3tMSxoiS#=D?7Pp0%n(Q89qC3)`8F5QUBrh37*5=v^&^@-+(> z0htu_oq#P)lq8+7G(S15;V0Pkj8^Mm@ObujJiy12bM!;%^Wpm2hU;Hg%d@u!H?ron zhpV7{3eP3fX1D@MX!O<)`U>hiqBVv!FrlFe?i{Tt*v_Hf&)NWd%*!uj=XwWu1V=%m zC=E2Y%d?O9C>(f5K@*3!6y2GKU?CtUfo5X3XhJ~Qjcg?3QbPGiIU@?a)bx-J>E7bj!{QCXu3mQVoR({~yqt$+}u$pqisO>>~0Lk}B@ByTU1@@rY z>u~r$XBHw_V;CUK2l9wfE-|f+u$d`;80<3WWT;92N!SjR2{H~6qAwgjz)%Q~BE5t{ z5sXHIfmk23I8e_Z=spyPNqq^MSm$uq;)aRIt1IR@rrxz|-rh(cR#D{NJiasR3>XYL zQ?c6>sGBu5Y=Z}>%ZU`B67$U8nWmTEokDOZfCCqnPOb^fozyaELUjAIxk6bm033#B zK)9kPDhNB1%fimKXjQzX&F%7()mOHa`eSoz%C&yCm5&2z3k}+W{3v)^aQ~O=ST2;{ zqh1e}hLNfmPB0wKxK4n)$lD{=B-9?QB4!5iAyd1#&(;uI5^TqO<*$<7Dnfn947Tvt zS#<%IyV#^N7y{04=lIS3qKa4`vUlFHyQVtkR$QH&Xo%Y!jyh4ywM6DmD$Evdk4Gmh zpTE=U_G_b+^J4zew#xc4kIUUw6R(Q4Im646I|U(HBwPXSFjgH1mI-sGZI4bs!_5s5 z3VlxJW8l7`)tX5d8S9bLfPC=@;-9uH}`2fVh;~5}+A$u3Um=pMOMiBA#5(f+jB~MSC zn)!Lx?D_0_9r0+`pq+|DG;S}OtTT^^ggZJy6=Tf00YNken;J_z?vjl`&(-CAEmN*Y zCIyenIJNpZr0o0Xx|%6Qw;Ryo*9)=h0Xy!_Sk9T#&@^8c(nn0QS=duDz9H!G1RKVe zc%JC!;BeL*S`*&RKFe1V{`u~DM2I|G-q7&DbY%s5VEO^&mde^;UG{pRiU8kB^nWzuB+3UUR4BQ7)%rO`tFm8O&c}Ju*E2W7p9T9;I7yo!5lX z(M02^IocHA0|sI3XLKxj9>WcSSUt~xtJ8+~5J5C2jfxN-A*?|}r&Io+23KzE5u-v> z$p^6hGe@ZSLfq%|`r@qnoO1>zZdIP&vYv%jtSCiNV75YUt{d0P9x(tvw|d2j+HuYB z@9tg+vR3!~V7#LD=YyVw>~Aj&yNQK8!ugN z9UCp~oxz?gj&*j#ii=|%ov~uJU}aN%okhQriOygttN7OrFRS%-*41?$TfI8-OZKsH zO_fIsv2DtwH7}(~ORJa!MK2%;=)9#Q0e- z_BW5)m|^T*v&rE5TV+7}mC2O(gmsyWM(^LM{K_LvffdF7!z*rZDzod#Dcu7mwar$` z*4sUU=djGz-40u=a6w4CiClcL>lMlWR2F#kgGfL)E^!$C{h|!XpPfWluYi?|c7qNc3!frpzTKbdDdEx|9tNx80$qoyY*K46?85f0sW& z!7aa2ZZbRGWXiX!R!fDr&>YFc1tlDTfX&`!!oS+D8#!ILKE()Z+kfC_7D`;pT=h~J zBhY)eOM-}%pyjLp^|L}=3dbtO3hGJ%;x`FW2IZS?*ETc@zhv(z#m_v*Cd`@z?SI%G zDz$1|ag-7Xu5}ewtF<)b4}(GsDA&ELygY7vMMZRq|I9nAAvVB{pUSXJ24sg9wMM(o zrY%~PNZvB0^154YNvyzv?6VoQqUfS5)sk!s6`k=rvd$y_Iq}U&@DFME5PHT1kJKP} zEE^;b^Tc&c&>7%g!ecN)VEqyZlqJhD3)xb|seD(iW8I2Rd5A4z ze^$P$IK@fI%gP_wWaYhW%I|O^7V&L8tQdZqg7Tj9rt(MS6=qfbuKb7c6ILP~P=2EP zosEO=Vggafln`{`kuTQ?GZ?HQo+QOOT z9l{$Ong7}-Y~1)3dncttGLMU)9@dYzj8x6t-@Ho*98n&*MR;;==JZ~1Z|3qI;fhoD zo;ZPVIc$SdeJ>VhHsNXxx8JS}#q7!uNUUwQid_t{L=-8{Fsd9E_Udc(|1mz31cb(?I^6JaRZ zOzye$B}*=ydBfR%5-yO9@4d2IXr z(+>fwmj~Z*h2;hVYeof&)GC0`+b19}sRuI!+(055HHC{*^C?{$8X}1Po$Hc}qp<{*!Dk8*^uyoeAHZJU8U%?shoMt&Xib zYl<(OwlbyH9~UkQMhyC~<8{XJKyk#ND=F6NBZJPshK^b8abrb?-d)}l>3Pm>xa~G= zd5ie;1B$=2vDk4S7Tj(w853+Y)IY!XJ2L~drKL7goinzKq9^I6`gfQW4iB zl2x2%Fos>-71gXdzIe8N`N3XMNYqZh`AK(2yynh_YGNH8OI>;CFJ22*)VG*q+r7%> z`^<8{Humn%zh7QzyVl^S-u|WnM2=W>gQWLXXqjH?v~2l46QA&xl}Y1RW&YR{?x?Qw zy0NsUFij`?*r{2|!NL28 zsjd^jAOi;(BavJnJkV5@q6Njrx_pnV*!;-$`QZm=?(7`rmYGiaFE&qk+!E>-H~;02 zBJE6QS+!@+L?QH>z_N2MTvjXVl;wk&Q>BefNa&bv=T|ex#<8>^A^`R?a_9izLs%{U zRyz#ZBUff=dwWf5MPreXAx*?dJ(G)?HgsNDz3k3))2?Or<+tCQr@YKpImX9s`YD@k ztXaBwY0)>8)e|o6og%Pt(%Ag!lmACj$e`|sn$To(P86!}giq}j+a3JN9kL(9`Y z{Ef9%UIYG44HLEL>^n)PM^>{TZ54Di;NP@qDndc2gsadLfSJs%0vZVKL>I%adq*nDoUyd%E&iq!a(OQ%d)xUk{) z(OY-yczEWP&E>UgH_q6-y0LLVWXd7s-ICJD&CSscan9_=7?KCFDf{<77Yc>TaU%cy zy(5Q9OUuirR3tkZR`1yN3+b{+bLLELcAB(Dw{0CG+Tm`l`qF8*ueg}y4qyR}!j*y$ z0Mxzk?aWg8)20S@k!zRW%qtMWj59&|43(l zRJX}G;SP2*@$+4~exA6>qSKlWR#hD|Yju{)(cDwjt*ux`iSPOxO`=Czlrud(#EbK_y0L1SShwjawriLP+%D;20XRBpcdlLLkoHhta{ z^Z{xF;tp98FCrCAgdqm6q(YM3jowOiLFwCZj(R6>PGxJRo2b$0UM!pZ&2S<>8&R`n zUrgV^M@nVkc9Q|AcjZ-*&4_qD$p(`w8qDrlhMGW8GnNH=QI#WB9u9gff}qu! zbQZCAL9^FW=p|LAIrKz`K!ZhG)m9I;zuz}q$8H2&*a%a$KunOLo)9!W|Th6I$ zoiwXyoGBg(hea#1+5+~Vw1K&p){Ik|XtHRPZl(uZm)?Z-H6oK4I$TihaQbaUL3@d@ zTvsiRyTI+9eBZ^Df>e81UA(Ofz7Xx*r4?S!lybd@%#`(wOq^QeLacmJF0J$!MEwC9 z1W4TksMIEu*=ouJ(PUsHE^jHTs*r3}vyWK=vfgKd1B`>24GzQqOWS*Z$5EYa!+WM| z@4c_KuXm)KB}*=Hmz!{J;EH=$7dkdzzy@rv=rM+bVv4~K1p*-uz`UjeUW!S8 z03o3UjIAAi_nDP!;gG<4{nzg@J9DO=Iprz$b3a-so`jY9I1>j66mTJ=@l)$fIt8a- zfa8&};F79ws#SG91uJvZ7d3mNzp6COmD?@8dbisIw|K)Gbrxs4M4>B)vAXKw0(-Mu zFK2j#tW2*P9+68698FNSO)Il33nn{_;Vc!KV{kIS-w>VoX*u#mvr4!&8GV8y#^Wl3 zoNyfBTrAIg#z^Iij%YMePQ$|jqGkzq@_DtxX0-zLY~)PsF1^gC@L183@s-?J4nk@) zXxVCm$~IA@FA9egYEEek1ls&&p4I4bq;|DcrEAt26jFy=nx$o>d1Vbz!&7DL0fk*} z_0V+QbIY5}SCuV&u6up1g?L;!`r&}3Di6xhT1ghHCIw(Tse_keCZxa!8>CMEC@gPmB+B{eEN#oA z1IAc_fg+2Kz<3QQEg&oBsg)HQoGB8eXNjW;IHZ6pDjz~C$4PQ#GK{|bx=oh`b&q|v zz1ET?{889VCXFt+_VV?SFlU^%X2a!uS)_n{=YRe%F?-2%{a;~HXGR@9(J^Ypfr8_`djf#7FG;gj{on>7Lh|!^&$cLg14JiQ18@Y;(tRcsrUG z3+;eso*#O7N`aS=bwnIyon$&@w6X#g2swm6!^;6&2#s}x&kI=yAv+`PiDpH|v|Rwd z7_Chj>zYZtg~AX`Lo5c=K`Me|#9587gAgM8 zsU=O3_6aq+x~*BG8%oC%=ahI#O20kOcJY!%vgm{TTjzJST_v1)a*2NQzy{&z26?Mw zYz=Djv%|PD17Ve!3((nH1d+{kg36>_HLwOjNdpL5V*u z=6|HfKUmY*pv6QRmWYl&qh+8mnc_e+Q7Mrs2td3+mLH7y0U=4O)brQ;?-hu4YAon2 zXoRmw@qPYZJ*BY<5Wu$0BdK|9;HDCKwmrUW+v5bdkX$l;yD&#*1abG51&xgbAU1Ux zb!6{$;b3k>%ws31MT>-#o$a9~Y|A_=ctwsQ&Yq%!2ZUWXT|}Yx++VnbQD=kChukQm zE0T><5$KBlSO>8v$U24N;?uB6nt}y+0ebqEicfM>D5AgY)k3dW-V1sV^3vJoNQr&a zBJpEfLz9H)gYk>jT>&+=S#6;qV-(Ai>2UrO#wOI-Lp9YQd+mhm0yu=YN#_hOpOLq$ z?L9sxnRNOI zjpoF3Dd1?Nq=(lT)F)18^w>*EGJDnP%wFMT?A2>doKTD3JjFkScnu?3s3c6sH9D+G z#SsvhI>TaCS~25#c}SF$Da8i`4r2pcKmRPRctm*N(ELB1MmX8lt1(|jrVAGx-$zr- zu6ULhZ_G0o{S&6_I(gly3$lG$*{67$@<;matPy_w=2j3Nu7BpmZ`Qp`-1}}Mwm)r@ zGTGU_k*}<{?&PjgqfZ+{pU&8%Gd}HH`ZdI%3S+VV-*Eir`nb8|5H<~F?$92LJtrl! zJ4>--?h<1JiKIVCi$pIhx$7(s2YNCi$vWLD?SXxuk)pxS>T{t0Bc@1f1{fD%mj=B; z;XosWnIF(9N?{074C0VzbMT{43=jkn=!aQWX%Cn@nvTK|UT%DjHzyls7Ntt(v{h?$ zkDA?f&?g&Ss5(v`==gmmFs|OmcH9TPRnvXPokB}G^#oBq!5}5`!PT!K7QtkCme*%z zAwPG2$`y@jw66f98#n)Tc`w2!NhEV(<}$+DjO3yxop;e=xQ%bQsx2+kN)znAayW6$Ci4qlA^oC@uqVxC@94?~JFB#t zbTC$N#^8$9-OHxg9m?S1`8#T)ET_vMMzxja^>TBWPVXttjkz_9)TmJM3<5VCH5#Md z8h^YiZgy#93B@mf%WUiBbrG+F z4;Z|sM-ba&`ZK+bYeOii|R4-PiVHNXH+FB6*2!InG{fP0yA<503J#ROk-<} z*re(pQVIiHP7%pk8i5N!42ldDFHjEc5*Nj#@f}fyYvLvaXu%m3ow*%!j)9RDtFd{^ zN;wiMdSnK#*86b&UzRKyQ&{-w!X-1HBlZfXcfBwCuU64Z$gcNcD~PmT{W~Eod@OwX z`qnE_2gv01hI~${)k&pSyit&!&+uBMx^ims%5e^pJlBQ?Gf%3w=Wx8!UPH!DER8Bk z%AIm|sIKnbiS8n`&%OTZ{y>XP>+}bPWx4ihTs+9vd|F;LeQr-EaCpYFsV>jMH9gn0 zXl?)4mHFA(eATx3bxo@uUA%&DsRI|cC$G_}(F&OA+WHk5ElBf>RSTFI)7Mwv?s$g! z9u4kp&*n9wdeSRgPGgCy>rnHsxKZk>D3m%u!f{r%SPlz`iRO!^Gz3wo@Q~UKASs|p znM26XjDgaCXie_?gU|l{;N{N*g3kzh(|>vxFm*2e@SoBTkC-2kxccf7e68T> z7tWjYCb2(3hP{!_5k7fy7TMoVKJvaHpnJl8NM(n0kkb%NNVF^!RizS`MlkbYEY>ox zo`BJov6a(xp04vSIK>Ni=>41)8V-i1I?O*>+L5Jnm0y=NY5M$G(?`|l4ai} zb05i_8yY@+(##2C{mY-fWO=68P?#bXkXFdHkh)j>+6ek`gLtm^RV`%%XTz7+D3Oz z8rxE?({WRsGFyGT%E#D7Ztkk}8qs~&YcG}AstY1av4oRYfPwxyTz3>nZWiOKLHqq)>>1s5FqT!cnZjT$io>v){#=BbB;qt1GGS*1GmWAB z&%t19AH`Ow2g1hGk^bj?K|B~zMNog{pv-Ih4;cdn{JA;*EpNa;bUhgw+xPG312QtX zbQ)xGi=-T*fK3#~AfXu(mi224wJiu1$y#_nBhY* z?N1NAx0fjPJxp@yww1qs5r~VnzUy3`LjI(8{dQJmaFo_hZya`>On5()3JPHE%*d3Y z{4VAjBJkF+(2p_2V93OblQHR1l^OFE#d9IPn|^6L{ve`*S1S+xZA@Ndyo$Rrm>bn( zdAC+Ca4mL~b*L&!bTzu>o}2&j&dH(vBX;YbrE=jLQ%~hP2g?8Wq*^x3-eYendnob0 ziHBgAc9G5fXZ*ve+;EJJ~ zrU!<`Y~@l<3P*n1t2Mp}7=}V)`*iTvs6`=Jt#jIt(Fbxm8m|M=kARQ|rmvt0%^yj> zxl-OAVHRI-ODd@`$*MX#s}Qb~Ox*V~NX`Y*J_Dt(3m;`Vur!6dL3z6sh6)Q<^GFj-iI~arAz&Pyw!emlrWp$-_ zp}bNZYnAnfmWI4V*A)qGL~@D{tON0#93{ueQ3{piG=7I=baJ47K*L2e0PUk^v(nN_Hq_^KsVXqabL;TRA*y^fdwtP8U||3%%{Y4=vh##I+~ z>Jq{W3Hi91!VX>HMvtX-Od@aJf_+YFO;;lC=6GfYfL`VD@$}&MZ5C_I_?o<%7u;d* z?jGlQl| zhSFC)I0?YGN!x?8q>fL7>&Q?L2@6Vzz_an0jg2!4pDI-6C@W%YGFFku?(d6L)P@Tm zj>Nq(RG+Q@?h7HSFnTd&t>j9uqcNq`_YX%#E1Fe(MvxfwdXto>Yv)%Qey0j zk+MS&10M;|?h;B^q@2af*$l)Kh9@n~*|<94%MXPs-}ob$_SRd%rzHLvdtW&H&9$p< zC6+(Y6s0Ni9qCCj|PMBy5(bAJooxH476d1n0HDI&v_AL9~=?{dP|bgwBak5^Q=lfjY7T})HDR;6N|8AhHZu`6`CCI7&a z)qZ;IOB1!)=&Y)X4JU9L+Ftk%#5q(#{Ir)LzB<#hLZw+Y8Jtv@0N+XrnmT|LI?BDrrNiJgMIV>QbpV^ul?g6 zS8sh^IPw10qTy4!!kD(tj1x5OH6R%&dL!^bvZ(b0`Z~3*m53liw3!k(9jMw@VogwD zn@H3IxCMnJpo$<*fgcZRqPqtR4puvWt?OVfJUdEYbg*)*dVQVn&pJKgw53IB*Az>Q z!m+aUc)XqbHr`%_wNov#Lt7uNf1VbG%bo9c9%e)~n_b2)z zS*F+3)#>z7X>qaiHCzmBsXI)sS=LqD66%%`SAMuG-X1S0<}JeWvhHw8aj;6~^6Y%! zg`HUrUF8#JMwUzm#~4G$Q(8|MTd)rG6coo((N;y9Ev+Y7O<~bMO{+(&Ct6{&qEI=J zXabW2{5n5fRj6f34-Jpl(5VMf5_?diiGLo~Xm~xJ^KuTa7leYkg8XDY>B{`R2?&O7 z*-hmKNxqNzU5YGE8n~L9mU#1WYqFgDmj~|oQtI%L(xD3xn0z=?h&`(>c`^FbpfQ6l zKqMbK14|KK5aJ(X0}tWj13;BpA_Lbv8qkkmk~6zk_O5hCTzgh@jalI`n_T3w-Snrs zX60=w$e43%>C9nQ-KeEYMhPF8T`u#QbzRGsjV72(-KO&Q*KIPp+@|$T_xjNYUb^pG z13Mj~ZTR31CYuv-sfG-`;y^)vdyJ51#tr zexk0e628upRT7j{d<|gw%BhSYB(<#F5K+H9`;|;8(G;YFn9Dfnt zV8AqTc76Dt(w~#z>&cBTz4THSV@dy=3>O}w1vfEf>}eIiD!HEfxIddYjD5?5t8h#! zbC`Jl1UAb4uG_or$P}Jg9n!z3T`P$1kwmYf6)whn3|Z6D{v^d;Ln4l5#faO%%*MIh zhqHFXb6xJ7xbUxm6=u`@8_gzLV&aBlrHvc!eqdvJ)8oeywHsO6&>Cc#Q{9LyHjpu? zDfBm8Ow>=YBdcae)7!IOHZcpZ8R~xwtK`Iw>sKksKCO_wgt=p@dd{M$C~Rst#Wl%mQ`*2euFzN+Y!(PRk?B*lRc{ckhUVvz~+7*JzTDEd29}5?fTlJ z@I%r0ZRA!qSXo*DLV{5ZZeduDRGF_f9rG!(*|h`+B*M&K3tLv7H@sqDqSl+J*N6Ar zcjWr>82G~Yu*{?OI>J`Jvp%~6Z9=K{wOcinwHC%1pSI~nGv{1t)$45RLakM!1VV^t zvJ7FXL1$%Sdgr6P#i0Oew(E_iyf$Z+o<)#{FX?u~VvI`n25*t;q!8d4Fr4Rl{muf{ zScM|rO-KisF~bsy+VTyRrVgDVKH<*ia#@8^VJerY`o}qQedPree7=eesUIj3j>1Ku zQ^6LR%V=cGN;A+e=?!Dm(qiE1>6J4&t`XzQKY;@+mrO%eB?*8S8EXjIi3lG@8-ag> zT1PUyOoY^do`PyPu*(Cd0QMT30+cUpM-e#YgN0dcPkh5s;qSsx;p5j+(dw=dU4TaTxMo8oD!HI zMyJ&oq@0=*TJ!VWW5ph9nGFq{NkVGd>IfSs$X@gE9m3y!yLiPPh`V?4 z-5ZvTNP3j=usLRTPad;3;u-1E*oO^Ywdo*6GqAV}$Pix4lHHOu7!P!Ca7F1Spvpla z0tMS91Kq8)q@HDMkg0(C^szET?+_Rva0t4-t(@ix!WmI&PEX)iFtD)+AN8mJybq8! zWo3#2)(BQMHd@cr5t}%0a0R`4ybbq_*Dq}wzh?3!A478$3;qO;D{EIera!rS}GJvcS^Py>|TYrTPiKZcyK#3eS&(>4A)q-m!fF zy(9j5n+{LZ;lb982@3=WJ6tv}rlQ`prcllYx1v z{)$s4m`Bp>+*@-Wp8e;!`NxC;rdBw4OL=VTt}6eyQD4=|m2%GQ=i2UTopJSeoiD5; z*Y}^)rVC^mklrKS2kLJD14XwQR2VO?hz~P+_&76f+O z1UD9EkQx{%tJepaAP{f>-C3BDO1@-_TUy4DVsc!kvFX&TP3J^69sAWIy7Fe=B)K z@;)T7(+G|90VGg=rX8Fy`$I0GF`k2|g{5HO{XcE9Khr*buKk?5pSCAFoY?+EyW{`I z>;GTd=ef^w?lzyK2BA|Dx+HxW`k%AxKmTbh^-B*tdmMuXJ0va8f4cJ76T~&zjFYqh z{vQ@nIPiWD?OakUh2v*V6~6wt)d$ZUFogH$XID>ATA~b}40HBDfA+Ng|HH9EE(TeI z0iH?E_3=IMBO?Agve@K>o2wGOR z(3=6+y(7HS|GWsTO9?3vT310r^Z@sVAJP*(%3$j<_LLOtT{`HWrHE%7gPw?~mg+r_ z9jRUd_&&s(0kH>Z)Jix2Tg7}aFfs)LG-*tD$kEtG!c;RF5T_uYsUwqWJ2uo{*}1+( zxMy5v$F>%6K`viKjE@EC8*`h#sBcWSKf3hpqhxsPq)5&BPP*JcW_ONj+15c9T&!l% z$QAqA=yGrR*yvSD_O*{*z2xS?XM|5z6x4cD-II4sIQHvR$3`xyY2Uj7%eH+h=C2;z zzHiB@(d{=cfo(5|n65sINi;ST@)?Ywbk<3jGOvm^W%`!S$Y(-G))Zp$XDlDT`<~t7 z*)OkoHr)Rr?N)3&{OmQUZ*IQ%8+DNhOg!rz&$iI-kjfA8{@#bcMJTGBUj z_iYgVXF>Nf=|__Z(9+4@JW5QLzIU0yyJT(2-G`oP>%96+chjaR4|iqVwRXh%aaGQN zZ-_4__CGJ|KY4hQRx!`dIsPwd0}_psc=!Sa*}EXAng@P(j2M2DLs!h8(kW9DTVg{b zCyPoM>Ipk0>>!&i?7eDHw0&IX{kN|^@9>iw7-jQtvX@-HC3VLw7r#_@xvH&rnM&YV z79vRhcR%)m3D@-hW5u#ta>|xgj><6zPe0Z@U3lQFW%IK-hAGY4AGmkxC3pNb5F;0? zt7s(3PQ0I}Yl)nWGWcJjkOR)3B`9(;K;?O=1Hi~aHCV*|4!%Qq!Ym2W2(tjx1p^O_ z%O(=pN~8r>y>Qi4FQj+un(uPW?`-h-Zs@RdnX^{4&S#H4v}yB04{hG`&~D*hM}!gT zr?;R)*DA-ba+@6&|HK#D*WtGz@tjzwsk8`KFrG#+`- z5LQc-7OHrJ={KbBC}Zi{(|$)$)6f=07#CmzZ!hm%wyamsuk5Or?kFp$S>v#m)^=IV zU2K2GGjgf|bYX8Tqj_c!X9oMHg(OF^ZJinzx&v$*9lLN@M`iJsNIF$**kVT zzjKEKY~!aVNWTE)Sp%zVKJ?@fltBt^XFv?`wV*&*UC@|W(7P7Utcr;!uwM}7prNrQ zS_7aG2}e!PdA&T%4k|+cTm&TvHk_cqHNG5Dy_Id&F~U^zeU(h72rwh_4qaP+UXhRG zo~eppC$ejr2eTG{K)#HpqEE z@fK$SNBuA-QrH+ZL!f0;6VxAV9ySVLAjgqrY5Ml9?1{;YU6Gb3>+eS9g^QHrKFh_1O$xC6bxt*_Sv@CAs7DRfH_Dn#k5n z1@u25ZbBZ&f{t=rd_M^!E6RV3_YxHlOox8-$OQcqXO@^B0ind_8d&nj0plnk%8*0o zbA*&cC~-ziWY#k}QCj$vDdK#V?85RRvI_`p!;Xj}7<5E-7=Yp?*PdCVz&Vc- zBEtFNV#ruyk>moGM6oafY*=FK5rueA$6$E^r8Ev_ury07HK8;l+7k!M0VKfTb!14a z1UJw7JK>_6a$HtEYx|PF90WGN-4pzW@W&f>7X=+M@479-_Nra$2riCo5+1z&PrWu@ zwom1`=-2y6{ydAxll#&+ejw74Wm*wX0Ymg2Yg0Ya3B0 z3wwPz@^EvlI(y1F&LBceBMs4aEuh% z;i*4`b&}7$ntt3ToaYt3@RCBN)l2q!iNTA$XTbj}6%uZxM2i`gX0)#XW`7)Fd z(F7vK2uy{5NYnCC0Q}GH$gCqE92{t+NJ(NsY%e{|ge`00+^x(m(Z+~SCYJ7|b0Byx z=twZQh1fi+NmeZGV@z>OIkYt(hcp_nDAmydiH+U?#veV=C>5X)A{vF2fa)r&NkQ3(-heM@gEEYzonr^c(YK_IBQTJe5D^-}y z3aOTC5#G00lrlYIG%|Xba=OW+l4A|qa@9dd-XTCLuy zCu%j(TXnB%jZPzxO4Wc6z-|u6`rNxN?Ek06=pNtm4DlM`l^5Q1$5)I>snsge|N2U) zDLclr>*WY%)l1V)lD`wBOr?-%$l}x{g|1v9?Fz%iV9^;;I{r3#nAUQ)exEvgl${dFuG0rse z4kn2ce!=PJJ1fz5F2R_DQ4^DxIBX7xGd7vQPxC1g3bv*$TsYXo=848Dv!H!b{R0k+ zOmGOb^8(^VZLl=vpqfEDhItpSjRhnNEuuhe804@&635@D88L=96vkhecM-U11vsLN zKjMa^>m&eO0C%NedfQIcDAmFr)MOToHA_pt<5gN+b*&dc+(gK7AjFs;wbyawo z)%KMgMOu#AE}Gcr-6?5w%-t+p>QR$Q^+_W_;bNrsq=Xsc^va5@P_94{AM@L*g_ANh z;grtUynKa@Va6}LbW_*fl9~K+`NeyXdnQt`imwg+Pg;F)6_T!}(@*rxML`pvv&Wj+TU*o7~HYmz= zLDV=~8vogvUeI#K{*;Ub@iXDs)c!kKgx9)f@eBig0U~9tUVb&hBlenM_*vb*pxW5f zqVyv2k=d!2+t~o3J(=qfrr2(FT4)|&K1;#))9)*MAj5N-$s<4$p6zd$dKml5>Vbv= z1mPK|rrux#`v&PYo2d+_D5wp%5eh+E2);uT`?Hk*Dmcf8dAyRxOLIt4!7l0`!REea znuJf==W%L;pAb%}TG%1H*Zkzuzn~gETe$F6nMuw`IXGZ%UAT}Kh;z}R{W25B;yUX6 zsFN>+k7zp(u|(o{lX?FNDuMozUMkiA6ifKGp`^g|NSPghL!c82rS<&zcg`ZM(=O}C zX&TjDU(_XBJ(cjQ*Od7x>U_WK1@G3`Qe9)#xJ--EuM;~Eg8r__KHX2fQx4+Xf6+T( z2#UiS#8LGM;dVd!3S6pR(npOSqkES^oc;yRO^`yWkDijk@k@IlwwxL72kkOJFoh+M zhr0{U4A2dLH=coC%g=w8ASGD`Op#&@Fq&c*G=Zic(>gOCMl-1taDwzdTk~JXz!Z`P zF*_E?uX*npxn)*rlr?Zf%=N}0{lJ+&1ctHSLr$Jq1FAM0?{lTKg_1t$Uv zBW3hkVWJzD?=tPL64_~||H7|DLBCXPLZ(Zq2vHpf-fn=p^iVp{3vE`t$hs0m5v7o& zB{%^(_s@P=0wIUyj=T%$S&)q7E2qvD{9vt#Y?xrD`Pr#Z%t9=POLj4>7Og_~o+yw^^Ow9b@)&2% zCAb1oXQun;`x9k1QKIet+xJhvb};1^zF8fO9mQB{qrP*5BO-jo4@vvOI%1#Lya7{&d48vLyz?3}H+{eE)=e&kL-c~re%iXYG_KKc~F5+@dTDxx4 zfmJ(iJ9_BBr>bO*rs@Wxuc{=T{GZ$Em}j4}T`GKit24jI5MO@P2jI=T;FY(9J;E2y z^&I%ea1uM*_pf7p`!^F#9nG3IW@7iODUZK7;L{g!&L@zi zI6P=@hVEwI!;n$XpEH^GVA04J!mWR1rU(xT5C86WY$?{h5gzO$dQ4tlUO`5t@8n+k zo$xTxr0--)1N|>q@+|!?1p;g-R!{&-&IM%N`=Kpc`rjeD4!wWzBab{X?R_#2^pjs~ zAx!8H*(KbVn|?3bmVQs8VFI>n2KkAY03`YMC^;O(gVPt`*Fc7ym}!$#6~k1Q%Rttl z*blLyZ6fX-ehw+k&R9aFO?sHP&&!K2(FnC(X1)n_WwL6?mt6Mw-JFg+)rwHwdp^Hl zs``!#XLODr(TDCL_S?zHKmBUMW%Km)>ZZ;_XJLt7cAX>?j-E zUYR?pp|P!NN&UKenErx4th?h=qWs&P7d&1b&0TR@)lElk6+XXRY8Sp-w{w=cP212^ z9&gTR?&@mJxoY*=o#!o1HkMWn%M|ROuPTnk1O9i)y-A~L5-2|>Xdsk@S1GY20KzCs zM5V|hi)A1xGiH^Gxn+5fz#z@MnR(&gq5n*uu>IiEUH5c7ed?>H-R`HmnMSf9Q}6=G zq>5!{Ki%E^G*Ih5ffUwahnt>CuW(Ss6~VgVm|vPs&W=udbu%CQjA{6 ziC_{jfE}X|4TFc?Ps2B;>6ZrM>A+I~7!h5e3>AoY7lYjkIA}ek)?%;RW*oqlo8*6f z7Qy1NWQCt^8(uQM6OinvTjv6uV0M0vRx>|3(rhAt=-%4vkFuO~l-oToughfe1t8UHkOQTpF4kRD`LB6e|+5u(v^{W#I~k}o*RR`YMNxRWGzrXH)680 zL_$$O(C`mR9q5H*5q-i2YcZ@=G>TCM3kHxtwsIED45bvhV?z@}Y=#UVAKEPGUMx#+ z0bB+H<-lRl@(`GGv0KDm;)Db}MLdf(1%R5*1j9h#rol01f@LTSo?UoUxMg9LC$HhU zcMJ{bzl^oIDre5D^qRVYyu50maLdt(2E#koHRP@PRIB~O*L1kDyQpkxSy6Z8;U?cF zTJ5L)#>3T+$iKURM5jC!ODfChttojbXmuSf?XzWrL{5`p*N{$coiWI znoB+ueveq0-+y??B_EO+#IDqQ_|Q*ukhzW0SMCiImsI{LZ-SaJxNFM%hsaHb{1p}M z*-OtCJ_+3W3W)916Y_plS;9;ioiib4^wiGVnv7p5m0uZ~ZtI*X7ESB8t=agcQu(E^ z`L+%w(#WVLre)fq znR7$!ot>e`T_Yrdo%hfB1z%-qT$6QEyc|2p%~>48|#zg`tjqsOT!yIp5+rt=IdBPbKK5`=jJyB z^+%eLTHa^Rlj|-RWkDrEHt255c-whUEDS7^_m$^s+>R19y? z`@uwlI)&{73vrf%Mpr_D<*3|fDWyLOL+SvlRUAD1mB`<6=uLiGtMn> z{$s}8dCR?fs%xq@Y*x2od`NH+X)?Lu>NK^gr8Bbl=(>0Sk@*c;% z$1&4d=hbzWc;ukYlUgD@(!WX%>MFJ4C)TFF99da4dQ^3lb@u!@?9|$>Yc3%#y`Wa+ zW^aDTCXYmY$S&y3A6qFLbyO~Dzq5wR9)G@@vmY39#o@yKr}8H==S>gzr=<5ze&F}f zSWVBQYBB?C9#3_Y2eUUk#R=DL?XyKz=DJY_3EOv;R3MzL6eK4un;VCI7+OfxSnX`R^TYKhc{kv_@ax7yJ|`TKC_x6 zj4anVF&a`>3>K9h)-b-h%{(?C2Q)nS&-jWlNu6AqlxN@96>MHLuEFe6Rhu~^t1Mch z;W@dnEgNPhkU_p}@|&yl);jeSB)6t9VJWW~*)nT%6+gB~Tc##FPnQ32aqe=RIm_aM zk>;jh=5Rp{XP2I5w3>Jru}D7n2c6~NSk%K?ruP)(t~$t> zPm4U^e#ppeB8M#PqjcC4N2|fra^|Ot2@d8!yhP&y3fQPD5u&Ujlv$3VS8P-w4S{=J zEMb~UvU3|7bF*1TY0Qb>% zWIM|$IRmr#?H7?vp15z{{%N}Y!q+E0e13Sx*Tnnvjve2i{ZPBWY4i z_f3B#ykYcc6(*|?3$tuc3O<7u-#s~(jAmyDfwOmiQ#fo9@BaJWX|tndw$E}>%jfn# zdl|F2|E~kjkeL_D#4&-&ANX<^UAB};h69}+?Ew^0s1(s^4nq%wN%7-Sc41nWF^Gts zVNl^pK$!U9zI%li&IgMBGNn#0YkO_={3kCTGv@Lq=g&OUav4oWEdUi5i+Z;%BBpEi zA@VSNauB?CT!iAWZsB>#&2`Oor9*zXf>F+xkJFFhDy@x|BLOzW64K1vTjnfT_wo&y zENw~f7xci0@}qatLFSW4vb2m|l*2(D@}p?7twMiBvKB?~xd+KL=Qs{|3B>N92MLe< zn{TiVJ1}O0U1!^&eVy0B{Pg*)$B zvno3r67>k$Uns6^Fz*OO5H|rCC80KIiY^@LaUv))!AeSh*>m@uvrV%W(KMB$N9bkx zD5!6M*R8j|_xN$CB%O8qY#|HO>EHoO^7!%oUTP*CEFluGIbfTSq+m2orMMsM5rADi zOBpwCm^cPz#)2^Fx5P@bhoBBA&mKl{%%fpCuV$efV?r(EUkyv*5(%b$Hp>mUmWfXNs11uDEuozE5 zR|)R=%UMtGbm+g-bC-kp+AUH8=NYe{FOd@o&!* zdZ-eIIguCrrV_I<@2wrT2i16TGjJlO|I$$s0Hk zS9X1&pi6~V@`QNp-ho>gjl%}-k0;9DRK>dGfXm01hn0@?Gv}Cq2!Qr71d>OhHa?t? z$^c7171WpRQ!j3h z32zLGMu(A{7+M0T{;BGNu_?m`Rgc+}W(}bhhTD+4?g$+nGG90|Q3CmJ&Ndy<=;-yI z_J`>%KMo51+>t-O-ybjIIg#U`j)R@S%OQZ_M>nV2nOU8}_4{Zu!D7fNll;lz^waJL z!$e%n>7U&FAI>7Fv>F6B~0i|3=)Q5JAE;XFJO2j3kToIaVB2zXbyQnZE z(dgOLT@lxoEv`uV|8NSqT%(-NkU2_?p{!#>XH_^{)j0wVg^6eHIu4h_h3V%OeI#Pr zr7Ug~y#w@wsI8ru005!^HVDDenc9payEPyOfNEis&uDY}nKb~coxp5i;Qm2oXFh?d zhEbYsVkG~SUDp2=r8+_aE|C2Wu5o>7>`(X6nE;661-5jO>Fb9lO)N+P6fUum#PQ>_ z&cvlS#-p8zIw0g+*uOEpa8ZH@Dq@615NL3*5Wmv@4Tps#yL)dJst*ghA0`Vo6yDyu z8<^*X?O|c*XXKj5LasWp0LW(?Q@BAqX-BeEcff)W*J&hkBZdB{HiUf^%J4OnQziArTgI@?1AXGOO^WKk$=5m16h z$|*KrKs&Y=66IEQ!R7}y;~)8MQ}^V}n49`Rv!v6aIQ=Sum@x zbQx)ZrIQH1US3j|6^C5*)H#l)X!!;?=F{vJM!j8VCeV@68m(2)vKr%Z~PMQw{(FsuMxco}qr z6XO~q*v4c;U0kpq(+|PoDc%-gxSk_bi#8@K;ac=yl3AHC zbIpcH%!HsTcbZNaG^T&|eAKM$(8)p1YAuYBIR_i1CWGx=il3r+YN#J4C4RfJ8R3GE zTPyG#@%2P0j}8n}+8g?x%CHF5rMwOZ3>Zr3;Ew}dNIm&9DO@_mOW-db@*hGToZM3Q zzg0ZqK~hUc{{ZAHK|>N!ry&5c67f8&4fx~5-~J@q*Po=L1(!V4=l4apw@-;!RW6yr zsW}pj>v z0P9qg`B6D%j_ummwQ)Yvv3cv}5v*~Ka^&Y9e?C&VM{-)FzVwqD#vj}~yNWUFRst|Z zQe@3`*5l$4TiD%~%0*$``2fDD3jo`oj339Rs}& zqnj86MGcdHK2dc}96-?60JOsp1xRZYN+7H>us~3+yNF1KQ2K?@I#CGZIU+olVECxx zl*P^}g2s@7k8HbW-fx!9joVcOF~y^9EExUXvMai~XB(NZL?yfhEdD2azK59**j%(| z8M|)W8ll#$I&9A(4;Rg& zWJgx1I#GI+zzPovY&Z;g1cdlyTv$vCWGV%9p(#j{a^MSKz^9@jG#Qz-6rmLq_(DY+ z*oVSU;n>mytVpHjwqn_%mut(AAd6L>+*+kd3g0rwj;XuN;9NEQlHU+MeAoQDm>Y(T zUcV1S%|(%#=!6!lt$oSXo0%(%^NI_=u}k_=4c6~|9ej<~-2{8`39&iJu|#r`oeGfD zC)NOmpcyq)XrJ7&+9NQ`mh>iOtKPM0`rP5Rkj0zjS6v+-Yi2KOb_6U|KXJ(SmZuN( zSlijBPl*@f#kOfbQ#UkPA{WsHNoe|$FcQoIK6{;HpX4#gA0!`1en8$k2kI25u*f82 zExZEX8WogD&H?2x!Wh9*kBoapaD*8d)D>*%G+HVc0BSD?XGS#>56Yrgi`z;QtOdN1 z)x=U7Ehz<<2=-^hVU)&8L!#+Ntnd(Gs5q)1id*FaYXMsziXoN`vKW4gOX5^-w-(zh zR*TF{VDJt~k*pVxGflx7H{UzVDI>k00ROHuummRZcA9Ua;~ zeg1M=R4RJC;z3-7z5-k^i2)08g6@mbJC&Zj3$9|N*TqgeBz+a}y64{XM<)#I9DE>I zAc#gM`sHX|Zd{A9yTdXD6I+zl6L7tQvUWzm=4PaBocH9VW5!&1Wd4n*ZPRDmzG>=| z&6}r8owjwx^lhmd=O3Z_o}70hGe>5Su^x_>N_iw&;^ho75rGs%`~z?(OHNs>CZpAA zG?6=N_!e@B74nVAc+wWK*+Q34%p?qIqRkzkN_rNGP9A{|J4>ha*>zs8-|O*v@A7yI zPMT=Mt$VOgYjfDlY7oYF3pIA1!>n=mJ^rn7jmA_|wzX%kH&n%=z z%%6uN`rl$%q#@FnbsCLOiOf|<{fb)9@Ocrt!)UTk%<^Sc93cnY_Fyl43f!LFoq}$$ zjxBCH_Sx-b{Uswpp%L_dbCcd2tBaZK0V%^Nbt=2oZuZkvgVtt1)Q8Mk>&nh{)t2mx z`Ld!WtIn^^isJl^Am`?AqTa3{_K00=*IzMssda<9uV`M^YR<07Hlscmu}0`ah|feh zzVY?218?%t(4j!&i^zC6Oo$TH+0zg%(?`aEVO^jzBK!e()Wr$i7y zsX{nL7IJJ2jE`r!6y`EfL>lZ>qAwYpj`of??RBC<2AoK0hKE2nC@+M?O!TG%29Nl_ ze^M$UujuXK|K>F$l_3wJ&T8Eu>6b~9x&DW-vq#OC(Vk!9ZD=6L?1abSvUu!)?8>~F zP(fI3a$AdRIeD$6Nn#CW7uVMpA6va*#p=h%C8HN~)K#3q|Y|^eR zR~AK>-_x5el#>a^j|=xGD!MD$D}{%y)Q>DI6CS#V37t|`j2v0PeTyX($KekcnBy4a zXx2gxbpvG;fi^k{zOR=hf58aOgZMK99L!80X-dI$MF(SyYhhd5Rz`>4l5pmSWPbQk z#4ZQpvS8E_j0R<(@--Ps0aG$-Iav2mhR`6tErHW4fGLXuWDxnO2S+DNj5cwshxnhs z0PK%@nexFxL(qb|M>8WdoqNSC*%=*I+<|e@Z$ay#|7Btf5-y0AMkfl9!IQ31!a-2} z0FZ#O7{^k?wCJJ}%iwij#X_Vn6!#52CiD=JX}~xQqCVOqrX%XZx0ZVeFim3P#y+Ik zIJ*yF zd2w=HzqN6C<@D{2OB^jLdoEZwzLU8@WpLZ0_H4zb(PNPXgd5%U%K5^(Z@qQHb=UE) zW!lyfN5b*8X_=YvAg!IvmdqZna8x+{8hGT8_ zR)wlYT{m^zcIU;85nC>*m*wbuptyB~JX6m*f7Wt#!s7JBqec}c%12)CR*ipH%u`Fg z_S8fc7Ybj!hCekmL!_C)(|& zY%zr*;3?1dTV@fR7nUb%`@L~RP-j)jW&$wgNw36RD{xolfbbR3rB_ahCl0_=c zav)S9Zttv)n}qpNrRf4WY*^?0h450PKeo87y2Wl*EA(K&Qz-ZC)+=~s`F3upT%#mQ zD+W%{to-*=h#u*r?j>54(1Y}eCSnR&aXTA%|3_0XwXqD0=St`-CBPd^#5lefabH(R z_Gac`OsG`)<%4uFFz*gXoRA!W1u)5q~4m((-dPA8D<{IR3#ij*}=vm()!ss_8(ruR9F%d*4&kGb~_jH*ie$LHKKHPc(_WG2bX zg!DF<1V}Oo5K1V45Qx;!JA__D7&;0lMG!$SE24;s;@U-w?%I`AS6p>1aaUd4RoB;D zT}U#Q@8`LbgrK29ZNvq?a;IcW*mv@~9S511Xthz~oXu+4 zFp$p6jrK_U*x$o~PTU5sSQT_gXMIY>}9Qzx0p<#K&)cJ){SPDfezTqimnj+mM zoIrj5vx-x_$>tH3^EgE9TtV_2qTGct357-r#1Pucf4|Q>5Y{|Ec>yy-9(-saeD)}0 z8Bs~-6G@Mg%&;Iprx4jMu;>ZX)N?!1%3AVNTIn}h6~74f%t=)pEme~m=`I$iHV#i` zq4eR#Y8Eh9nzSf8E zj^v9#kVD9>L69yyLSoSxFyj&NKv#yS+-1|_e$EF)ST}g->eAPxubJu9l)71?N=z$E zn+EMX{n(BDcWRU?mD-M;?kDg9|A~(ZJGY=dgGd_TKV* zUPiS_qv11u$&00@AEE)04PyFH2U23766Kg{;f_L%E%x4as~g|yh#;nrk2f{(%4+j6%Dy|XN}UTnw*;`7TrGS zSEo1sY0KE{J}9a*;tFI4;8uxo?!?{=Re3;q|Dekg{?pTlY3T(#LG8@;Epi?|IX@p% zFekW+^VgKkziUdLo=e?B&MKi5{E%@x+ejxll`_ zMX5L={cGaKvvJ{DTKQVQ9VuQ7$k)opW`8oNEhJyt5-pEX0!=l^7|k+;RCMXup#~(+ ze}@8odR%~fk&*mPIih+_w)F6pDXZ5#GJ#vyr{hWgwmK$A-~Zv-vrBuc`j?a&dl}*? z;Y6=gOsuYGi0rs_{1fZLqq%;??LQ2i?-+Pq`sc(uURxm+_*1-96Z@o5ASBU-XuD*0 zqv^>A)#y4jq`|Erc$GR5B3Y^1$XP1oGqi2BlMiMTI~I}lG&5gyha?&Beq;pe{EJF7 z^3;KzciE=+(;b!Kq9VK2m*~n&jZJqrlG18(vTM^^cBel!HPe;os~s0TnIi9GcV3g7 zQ=69LaHP{UKfOghiw6ScgYqIo|6oLER}3l%)L0W!60N>*+|TZW$*7Z<5S!pIn5=Q} ziAiyBQ0O>tAW=RlZ?RBI^lV~$^z4r=jE_rjw7}fcB89qsO}uGXT}>bTzwzKT&}8-|qV_y-mZug_yK4wtYYKG8WOznTvzQ06iXEq-ZAZAM>rvNOBSoNAMK z;hpe4&d?=fi_`LG7!Tv|MsD$s5!}%%dUe-;eI-tCjt$oDv($L1l=b*`f z!p#u-YLC+XVAoV3&lE1;ME`^*77zY4H7#8uaQSJ)P&-&B`n8?`g|%xr)0F8+=>-X_ zuFsTeXQ_X{h;ZGEN9Xdw#8V5NoM_Ya%~*2H(t~%-Zd#V3PIdH33ziJcn0Ih?PcJX_ z>HSq&y*H85>$tRBqcLq@u{O!Jv{q$mY)DcY6MMyry{mWU?w`4GP=3?n)7kt-7cWeR zT~Isd)bcqe=B>0(?mfP=zdvCI_gPPmFuC8$HeSMxO@>uKaYg3cG*aw)DD@3&xaG_O zSO>5;Ih+Z-1ki3w2zUCiMpwM-6)UY;kZ&H+3MA0?N@wCOolH=NOn$fU&=qfF zQm1=tmnZC=D+(jie{%7_G(gdpv9NX%Di?+a7(3R9J?r<+1$76lu_$2+EXp3CZ1tx)>pbH-6&lgQC%tBZt*^OlOamX;Y zWXAQaWCe$f`PcOy$y*AKjp@eEc!Gti-R;R|qzh;E{Jp;7W)|K&YyWSV`b@0U;Vd%f zpwXVZaq}4_KNnA$a(~5CDKq}g4-mMz1ew1cgH;}GnMJ-tsR?eY@*FASACOl^GAv3p z)OTPGhS|T%o@^zU9|GcnCIeqgcEQIkh>iz7kCYgr%N2~)sfa>?<&(n2oK{DteOQQE zgp&q|sm_kM&Qx)b=yM4^m+vo$wn*5Pm}uj|Hg+EwgChzo!f~@Sr;&MX3`;nznd4-- z9`;`@hJ~F;Nlq#3%E{ptrY9z*Cq~9cj)wy^HGyz+$&GJX#9kP_qHo_7!=>Ic<#}N{ z=9CMV7jg(&fMRse73eEM8ut^!Puqk7C5I7!c+09$2U5b6Bl{G-KMu&==nDGixVjJ7 zqAcWfu5e1f56GVLkBvRH8B7Eo4-3X zn=LI!+hpGKf%Ln(e~{))dz#K}#y-nG@jcr=?Mzw$_vh-u!s@~?V@4OGrWM?D;sNRH z(_P!M9{3-&Iklj^{%+}aA8umW_X^VFJ(mCBCh3Rw3Mj5Z2dAy?F&EOeO+f!&E@O)G zP76RCQ{-6b98?WXVFgZDR8y3^oSd4BS2V9+H)_&C+AxYnLDP_;!X*R?a08@WnT5vO zW5;3O%OLcOW+gOA5GDk9;-QDCE(Z#eY8Gk>hqD}E!MK_yCvlF(mEXtlPb^t}+*c~? zbn)Jln2c2E_1n#EW8c*^c~;wqS({S~PPg7yT9srgJQ~;M;*mceJ_tFWM0$CtHzp>t z|Ja66NhVdS$tWcDFLQ^k@$$m;8nuTTSv=|L(?xDNE{gY}D{g z&mnd^r&qu75#E8LZZ8|*GfXu7O||NbI8LSFw@j6;fiY?F z2dN$3r`@$P-Vi(7T{|^YEFI}pvFFZ{_b@IqZ>S|dpc7pwMTu4*wpguciSdruob3aW zm%3sA*mRCl83KcE8=2w>#mqLxqCYtpEHH$f} zmJ15bbo7xgUV83trX)|T#|MT!`n#9P)G-#WqCzn0)qP)l^NknF)CPm- zaaRI~K-2dH{?#`0aQX+n0EDa&d_fZM%4Cm6$h#2WAuM{pnsx5bNQZxz*@h;g;ocb< zf?PFVkvezyRynt1bCdL~ya9pzjcuQ9Vc{*GZjbWB8&(yNE(EHunOyNqplaRr#`ZTFw{LG0@*1~uk1nC7&_ZepR2CIg z2HG5s&*|9b-Rl*H0+p2kX{O!&a7HC}dl7mPn1}vkIOnbpgHPq) z_et;X`;rBvGtwaG4E!@^At~n zEV=|`@*uL>(@EDb5rVqO%i--v*E5Nz$i2JTf^$q9v)s8}k)8Jas(RwQBa zL)qqWdhtwn3HVj1K^~gJpw+{Q#X?9pP6zLS;|aVUR1PSwaFf#RShtxrSr8iY{ z+BKZlZx&UBfS=0c&}(>~U&94>YpRv0Dvbj7G8fw$*(j;_MMmhfbW?expq7IJfog@zuC+)hx%PnE!D8%j+SHi zCzR!FO#dCn-@9R$$ZfDE3({>GjSZ^@)M{sn#b&d4V%0Hhgph30XxMZy*@kPNXAxMM zkN&PLUPCJY^rqB#3u?!J}DhkzR1Qur{-A8OD~z)M=Qnt zBjzCG)$1W?cOom6?h%Z*`m|DHtEyP#T^~MuTFnPwo;T@FGrdlF`3UR%)kkXS!jPA_ znAT4+fp_{WD>UwsKK(F@ZExq$5O%Z|`~(FlAIYVD_*nY9<9g{cmhk64SF<_Dh+#wv z+%^i5DD_nt|DQ1L6tYpZTMLPA-95e?g^z9G0JiYhrjCDZdQ5oZ!BCErm=mhZ<{LIW z!)CTsZ9aQ;bK1k~9>Oq}Y&rd+^kx(2&2_L)P-gF5=;4BbM<=1+NaQ!C9SE7sqVPs{ zL_&%yR=~g6!6P}Pl(N$HI%|Am6q`PApmc5I`9%}Uo48`>*iz)on3iskK9E8yXYs## z_SCk+3)qm??6sBR+|^Q&^z1cb-(XW-zoBy6;>feowS&g7ja={czHB;YTQOnQDybZa z?`;K@qn)p_nuP~9KhQ}Vkmu`PvhOcZa&prI(?LH_aceO=)r$+=3{xGkEAnxk1YKuw z5aG#mNX`!BEOx499Nx6Xdf-6o z^Y^Zuv--htuiSUvcfsG^eDI?Oo0qJ8bNQRc?|Vg9)vhibfAh`bON9&T=gw`vtF)4j z4BxeDcn6=El{$ZZ3co|R<#1I;U17n@d0?W6k3NpMdA!U;Qv?=djbG9`|Kj;5j|%$I z6KO@JEig2G;Id7$x#WfPsmnHlwy}_K{A%0c_OI@0PrK`@b#t`8T0C=jHp_T=f5$$< zw)>8AAKG0mdnA<}03atUBVW^!-A_xYPTrm?Zy&(&uDiba>aJzaBYbZ0ulhaq*L@xP zt4ch71kLrM4a#L%LI7>2JZ*${lLQ13%GH*QZ0`Yh?Un(xdjS0ThQWWg9x*8sL7iv8 zk983um{!7@bv>-C*8^vCk77TtFpewEV?>bZhg^^~P?_2(dd>OcAD~5@J${susOJx^ z0=V<%e{{ak9{iaroB=wEK>wfo5CbDqf0{5D!p)1Zfhi-k+n)|5qiALTI2{Ial%%{? zDmpGi)Z%SzFLC?1V{I>uL^`ABzY60VV={g&c|F@WVvcdnD*RS=t~)B1FxygQU&?IQ zxV+u|xOXYi3|@Ks+u=*Qp6m5Swr_a+@eLavdrW%I-?x8Xf76tBKDpoIq+m&Euy#bS zSGqlAuo2vNn#N^_cf=$G10JZQc1x$&s7n55$5iQkG5zJ2rFWJty}8H#n^JN;hLoHX z`sqD6DJeOg+(|hpIrN*Di;(s=(|+_%x^KkND-SIlk#@y1@%+@sHbzU!u1o8s0V1|N zzpx@h>&QyZ$yG5O@(u&TtT!|AI$p^k&lb)1Jo?^JjK5uwbxiORzfy(;hx?P@JUQB^ zSY|XP-`;xkXe%!rZN2^WR@PdPec|2gii&LZKvszRE|kR{$gW`9>D*Deuxas8p``6h zRz*dY*q@fa`W2RVBk`f>pkMD{Jr2|hxoTyBC`To83q)1Oqd_b{yfC)Fh_5RWNLu;1Ip0#Av!Ma1gdE@r!@79a%M76=*cZT%+ z`YoSqV+rS0ojT%QLgJtGOF{1dM|zxT+S z!3nE2Z&@`V_}HySo~$VolB{+^Y@lKOvUj$=&P-!>+g+-XuAkmG;=TH&U%;jH|SFgI`+P`8dF_u3_ zmvq3r+u`L-zZO-SnBt5&0YNaQ<9+;H)y0*Tc&Uy*Fwymos|=p&j!Syv;3=-ezC2iIM8-Uz6ITRz89wPj@`WoqSFDhFiqO zNv%>FyM~2fsp|+?dRsa|Ca4F(7LO42@QTPR?$(YDUI+tnGTiYO?pAq&g=b0%ORl*? zVY3MebFPI0egUGPVf*iMJ}6_?z`$wF4R@e)UBp_M*)Lt zRET+5@AxupZ;)ZJXV-q ztVTvqFvKiI`9`p?vLQeN6&?@an2e3(YA871UDHi(_#kw^keTR5XFzTV>ws<~y6aFC zs$4u5YHXy22sbhX$7#n@Pf;bRrc{psUJCx{@Sl$n^*Xpe>(g?qTD>ktr`K9@()3OX zKsm%1o-Tny?;U$rcN|!~SCf=8GBEBP2lw1t<^gH$EZ6+L^Ici)v;pR~o>L{fGpgd6 z3=<*>LKGqu3UdVlr?zsO70@jf4UaT+9(BChrb5Q>xYQINB%~stUX03ygB}68Dow|+ z)i>O*x@^hy3#Y_?5DLY>U!*jne0PSoyxg0yyF8<`Bz@$FPdw|JZ=!h=S}?dc2vdH6a#b?oX$O#h8f&HB~XrkD{U1~xAACR|bs=vIRd9U6P>BO#gY z58pa1D~VGqt^de{7#d$}#AB;oVojJqCx5+k)9#yIx$ySV2c6OjsWyvwUv3r@@M0Kh z@hf%i?4Prq**;XI`?Pt{iv#D?e!4Ni-=!H($X*C~n^2JC2xq&TuEaS@kc0qp&V3aL z@$W_2_bf_wCqtqm#XB_jSE}2i{D%U5D6QaeN6<{@fp3DFd{LoMgJ%%T3I;*tf{B9< z%D@_EHCU)f%)8R#gfvmalyIH1q!_;T_3x#&?_a;RYT2rR@mYeH9N)XKG#$}Mc~dt& z^Y$|vr{?j@m|oi0J3d(yvf>A>T2>{6k=i~Asesn22{0(d8|7SA6*J0`lgnmQLW||r33e72nPH0u+Vy8msqDTzhd(siII)*BiaTYC zPq0gQhxdGNA#-pjEiE)S^8)d39CYSku|tlnfi_5?A_rwcm4{z)RF?=7N0+wFoWr0n z#TOPVX=E$HPY6rzz1K>5Kj;#n4vcOd_{WAA-HuPToMaiNpsGw zuP%>XO*gG$>*U9@g)i5INQtb=5W<*u%c8M!fCW{k;P(BqO&IXO!Uk75P#n+?kPY+} znUbiKU4`b$_nbzf$|Y%(UmM+gPkQh4p5qk=bRA$2G&aD{t;`tGu~6mJR&yZe}0Uc-oX;o4ax2Tw8+abbF_%jM^aDALO~F3YgTeIm?5y ztG$5&f%g7|`cW5wJ_SSo0cgHJSEU36MbCGAjdfS6-~NAWj4?6yt1CWeP+Zz-utc_9 zu9k>?g|CC9#jy3#(U-4YL3ASX;n!HE(@<57%s1_gJ-?Rxt>oC!d4wMF-_(u19n_fJ zki(rLq>G3}hm8}ot`n)a*nMRqh`-zj_{i&uW@zHId0M8K19!R*Rh)1KEQT#}$8??; zS9+A~J^Ej^5_N-@j|LWLnL10Ipk3O8w(jw9=1uB6F|B0Xx}UTn>3%>nloDdrOQ6%Q zfpw8AGY$^v-hbNfJwHQ4sE1(IbRgZj381okfy|I#x&%#Ozz@R1;2~~;*A#U*q)V1! zHvHp&{Q0AF20ZYU{ps5~OngYql?4Y6o0%Cn7l2S#qp&EFnli(eFl|BddSqWdUG*}>I!WtblG7ZD5 z*mK~)0x1tD_<<0k;w)!g7_u;>D1bnWc0+SP67|ai)Wwun^t7QBj%4Y($KH~T^;`bN zzFM{BhCgjv@yBcA{?p^jOMOxv-76nNfa@La<9|o^qvJd?yc+m$8yb>tK?C9dLJ0yN z3XMHS+Goj0cdo~T4&@KJzk&mBTz5^A9munB|didgX&N!xjvh~Tmr(W(Hl?rr0 z#ABp&84c;7g;OPu{(fnxX9;mO2tr)($uRlxCZsU@3Pz#f(WQYp2Mg@h_d- z5O~*^BunpREq9l8bay=|bT?rj$b5=yck2U*;mSEP3Xw!o9SyA>vuE(K$K=n>qvv;O zG&vwbJBMF6pANq-di=ig|9)P5XQwtE576uyapn9v{J!Y%`_9Yl`qO!qyClf-Y^j{j z(E&_n4uEYi>spF~fo=vRAj`U4j-Oplp_jV_7xi&5apCuv|CIF3$t|Dk&=F;6rf=Fj zAzFx6ATYiXttSX&Wr}{b;}fFyyll0;9DUG) z<8p1!2O3B+4nHpc52T1?xdBm7slTo!l0*sbC$W@`k7LD>=Jn zR@DNa$-fV{r);hE3F&?Ljhlb2jLi3hR-28B+e4SD#38E~9uYn9L@PB#E9Rk7ETg-9 zq6eRdzNO>qpUkWBw;}ydl!xr%&uGF#9FU9aDy+;d%0EQ33|ICfEi?&G3jgOz) zFf3H!-6tWkNHn#6Iu zan!s8s1C{3m)4-|wnCmLC&Us3j8`Z&SSBhYsuPT+BXfXN0P`zX2s0c0fKuG;5Qpha z6?9m-V90Q*NQPcZG5=cpJtAi|EzB+5GIjURL5v?5o2ZOcS&eFS!2mI(f63$+t+8qS zmnWuAKk=o6)v6KS9R*ou&R15gdPVy3*590zCU2j=>J_e_K_hBCnf^d|_THv>W7XsP zIe5L@wq0c(tW~K8hXQ#jX+-Bkuv-7>@h^wX7H85!q;t}judJH1mF<7%_qXE79fJ}Bf5jy^ZiQZ)3N zf*V!`W-OmRxnH`u4FAlHLn+A&^}(>}Uvm8l6@+fsRX^&92osReGUO%dP$3U71PV}E zK2nFt7z-+qT)&cW?d6I(+;kdn#ps=v>-oqZ_r%4s4?iVNgF>p60twx_14*) zS5){A8*<2IO-xFR_jcDe^6}3<}_O5Q|AsXT#4L(ySAtzr_v_aV|D}gwKbR9VGwm9aK+asZPABUsxY{yvv z*J0a1XAgvK{{-7%G%)5goRn>$4%y2EfqWhnG{kUY4|x2ZKq2YKk=!s87HDhxu{Erpq?rG%QXz#}!Yv&wJgpc&)_4V`D|!!o+vs~}u1Q7x z3It-3!PCf}ssgGOkmR&NOJ@Qk8czc8{p}B*H<=vmtqzmv{KM_w%f6M9IN`~l^-pc- z2yc8`e8rfaZhS?2d?O#;@>E-koU@6&K`>AB4~=@oyXCR{bMNm;z(nuw&T{&*W%*My zXK5$`tDL;aLXnoADONPqD|?QL73sM{Wdvt&=?2iD75M%XV^5ejXdVzyP=2Sxr zmm~<|+vg#1=a<@Cr?AYHXuPE0XLTH9TCTeNPjSim5BSgcj%NmPYdB+~Qu+>BCX@^9 zj4?@gT!>QWiLVatyB}eyBa76PNb17LsP|i}V)P}Y`cC8?j>akHD*D5+-ocd20`FNb z=zL!`kd0)MfJ3>G{hB?;-h%-~;^0sy5>gteU7(sk7V~H(X1`Avl($KA@+qU&V6MeA z49F>+;5z>3tP31eh+3+04!T|kcxOlSiGtTaX^#<)0C+XHW<-~Oe^XeP{jLG0a&Ev<36z*n$Lg|I&(VWrEFU=#2jo9Du>`K zPD67Pl>^7bF27lcdgCSPR3-95qs&S`(a;eR_#J#PAq)CY8md-tkP0H-1+ItU*OaPM zl*uUol^Z+qJ*oBrFI7ubjNFg-Lw)2&i2z%tRw0jG6rX*h_F3Wr92=E@N)@Sm);PE} z)g?F_rTVcc*+aJFrRTOS(T|C4=5Q~wUa1Kw#lE6Mv1tS{2)9oA$J&HN*R2@IeW$jn z*!Xa9UV|etGV)vJ*nD8>a-vnOj58#tG`hqjm)@C}8gH@bRDlNMPc;tbQhbS`KF7dw z+Fn|t(b=DsFHUsZ)utiN-hjA4TIq!Ryn^&Kxn(o=TyM)L@|4E_3o9_SZ+#jQRltg2 zd~fGq3uem1MSTax0`@#Z1NB6fUQG0*a3c&FbxcD*t70}wd}^Z8;E7MrY1N5(r}VvM zluJlRw7G|;#_9XH^detUXdL1)Wa#V;lk4JH*C>t0nwXHD)L$Q$>NOSy1}7Av)Wao1g6+*LehE>mffHY95VQTk2|n3lIWL8;WGY?Th0dX*Y2 zfO!`OJjZ)CGv{6RG5cW;fM(29#`uy#XzEp3PN`AFAh)blm|H5uxJ*E4{BoSPM+ zHfwq(v60A);qSG&K}_9PTsTJW6n^vk)ZPA*v!lclu+oy%I!*|-_fsiC!Mb!F&{ zHvkdSEW{d+%*JTUFldrFQ_O3>et~Ng8&+lb2AFy6n8MpNJPzM$;`U9!_$vbdV#askxc zE05z3*EuZ7I<3Z$l%&xbY=$ItOd>v+aWJPH5b$M|d(2*KoJB-t0-&4dlN{rDYnk;&aHqm8Q^A7;_Xu9{>B&)C@V@q$n z+h7RIFd4OM=~}-3*8J)2xFm~UO}chRvZ42u45iUDz0zE{c9DR#yk;Kn_wBM;RBGF% zz8tsd__F24k1t;)`Opy)R$x%+_(A=i6dD@P?6%RPL?ic7pOtZHrNwk}61UN*-}OQ; z|G8WBcEC3g#*m7Q%fOIS>+?l5fSvFVrm>l=I>4=&ODi<$9KAj%4b2kSY%mR6p^FL3 zD-P6hT;C5WN*0$DZJ&a~2>|Z0I(2$oUB8sq?e=~7sScjEC-x1q+~O*qhYcHw{u67n z2*~4bc2b|6#q$C&x|P)?Lq3X+#Ms0$^wR(+8T_u1Jf@M)`wGtt=0dx|E+Y_0Qk9E2 zSf%Bt#D6w!pE6~8Wa*Ucjg8wQ<4WgkyZ$%OF0#^hcl`dADcO9+!1-&3JuxF`^2Ek! zU(AR@(&-b@2Om7WacTelp4?2j3AfWy%~kQ;w?-pW2>WmrWpjbCMTx*ZM`xxYLUg1Ur*5EYYXMjx z*hMhU7YgJ>1BFdU5+?v!RS;S9D9Vy2YcEkCZ~N_4aG@i^O%lDU)fB1;r1my1A$`FTbMMpuU(@|ICPy?%-!#(6 z#)+FYO^j~sJ$J6-MtDsSCreATEc!@i>=Yn-Wh)bSH3qzip5CZ1@C9UUibU=%**EsQ&7?sWlHESQ&cHTK}bD|V2`6XBwv)BmjjjHN(+u4VlkgFk?L^BcmCtpha?@Ph| zN8bkm(j`&27P_QFyd4Zvst2wI(Nviv^g@+{P&H!qg#~i@kBu*DZLz20@^sHgFInSb zV$#!NViGLuYozv&(r~y2r`d0DPBdqTtr=#~s-Sl$cyRLYaaAz4oq)B>HV>9=ztRJ@ zQ8#cT0)^%xdD~fxGki#DfsP^+3Q6BKA8`-Dt!SZ zlERb=IC__W^PT_Na0hZdU`aV2Xe)vi!w3s=G|K1(R7y*2s8OH|NrH{)hzj9NKshYn zNzt=bSJn-ohn+QKJ!=U~q!$u)S5+x{FtSqo8;WiXm#IGH7MHTSl6!L+tTlg^5C3-L2$kF}sK336IXvY@)pY|Z7h)zmTIz7~DRZw~%IeSUEh@9z^rajEAGZs8vFbeUdjnShe=^c$F zgGS*XWJ#C*c%VT}X;~B1Za-x!cjPOV~^4 ziH{>)dxxUy)l6|giz|-s=n%}EUcxuyTq7<*CU+`Y30_Sfvl9 zt8Pzrs~BLRUkOnJuoaQp$%zjXqzG&S6Ixl3^jh!1eVU9& zuH{)=q*70Pa;jQY*c5~O^vd+w#$}DQ=}O_o;sGMB?w1p+;vshr=8LbuA0iz}SjM^~ ztb=&Orj}C=FhH${=v%+Jm=XiYNEry&a0^ThBfXyf z>(lt(D>9@PdsBK&`VLQcZ{_XGaO8+IbjSC1HQph;^W?qKA5YG>=PO=$MRnvpr|9O@ zz*~wxnuUKHnMR)Xm*;62(=Td603V?YTlMWwmRj{fNN){Ks%n?H0RgN7#$4CAW|>i- zgN<}q=V4*k<%=h=@@84zN)N+h=vpM%rar1rhp{4G)&M+K>JcRdT?}dI&}1rfuTK4M zO4N(S1AiY16^@#t%Q2&ogR-n57P|CnQHu+7!N7=yGFTvx8bUhhKA>y??NnR@ncx-d z5ko~f*GNoHTZ_#4G^SS=Bs*=gzuBj*ooZ))qn$`aRc>xouCROJjr%t5yK!RmlIgPr z%TS9jd-{^3L(nA5DD>NJhJV3nZuM9q7E;Ww@L>NER{D*cy?}8$CSa#syv>m zWrKA)-+c5*mB*uc^3gYU>aKdUr;allIwu7Kx`4yd9o?G z(6uLqk#lCz+_};ssr_=5Atmm?h}gr#%f}*plh!}<-R8~TJ+wYalh>dA`$nR_MEft7onoo}H(#f-?1*zj(cxMDOJ4*+@NU;S2t! z-{9Os4|N!Jy_}Kp@~$iU)4=~_iBqraPfC@Cut5Hc&UF1e?##UF(XIaTO8lfF74F$n zNImL`?_h*=dobwXk4Q=o4#_!czsI0fAd?iX zC@_o9#dnddy+pL-V29`iXdqPPkfAXtkqjNQ(vmKLWf+%`TXy%RpThV+J86L%RRp#X zoy1s_v=%@m47R+Ohj8Q$<>ge#i&R$ZM_w6-#oGB=`DlUPpux$?0#QA>vb3tt?34ue z^qu+z%BI>#c=UYfwV}JF=|ts@$wfJXgfPG%Cg$}+WMrM|K3cctrb_SnD@g2(>y^eH zPV4mp9d=)rUa97)a>8p0hlwm)kW!qlx@r0kg{9Ka*xcHt<)c~p;F+z{cCpDD?E`46 zQTr&Aji3|xKw?*rVpx`wv5tfKmYRtghgt^B0+~aO5+U)l>&ou7K>Qf;Z17Q*%uo0d zB%Y8upW`Ps9>@to48Lba+qh(Q0B`SI1KdIXk1j!&HcNvu^WAxIYa>je34d`$pGf@^`4QTY`tL|f8FiIz;0siMG!tc|X;FCr^q9f6u`FK39z5-I2W zGH22JQG;1sW-(L*uWe7Gb}ua&kmHkH3Gd1eh_2-Wd|KE7&54_8=N>Ts{lMJF^oAYw zdMEedz#)d9C#On#NLyQQNr8>cdUd?r>nI3mnhinTd_i3kNUt)y6hfHK+!rb`XLcy8 z^|}FB+--rHb)J0b-JJ63oHyR6&QgyIWDGKcVs`dDSsqN2@$t};Fbq3+!ZPOVW>)AU z&<8;!Bt^NC!dKgaF-b;YxeH>%$|KqdyGQ3{v9P{uVH($WMN_SW zgf7ybA|KT@-LsP2nGqQ^eV@9rsaDxCG4dOKsG|}AS0=NzFqsc^v|w93D4Pq9PcIQe zTHtjKsG5YaoNv;zvREXjU>Ma(MM-|gKW=|XIsywr?dhAEYTYaE32&P=VwStM>0%3; zc4R%TFY?8^Q*&&|J~vV`8nSwqq#KPbN#03S?s%W-s6Hp*d0Bxak4f3rumBjWpjkdY z1wG3Pvd0klNdQw!YdN5n?}Q{le7-W3C-3xBOn=d_YwfX#218sw#xg>hWYVVsUPC;L zT~RuS+c3n7eC*X>tF1Hi;xg6RiRMjX>o(fzX4y8@U9-h7VU_AyZP1aIk{>tcKxu&_ z_OH+Pm1*u=zeiK%%M0_L7<+4As{|gLom7>o3zR zi$B0uTvAM~VS7povmNZi1lPpv+WPskMoM?G`$o=MI#zqb#Mo3xp~^J5bh?}8lsEaL z&4tQvo-Z4-1J|>d>|>L@GHebsbv*~h!tpRocdm`z9s2pG!KNv1xM5b z8oA!V5#hu0KHvt}$EvnXdT-eRX?JL3lnl9*@3`Xn+9jA>v4Ji5SG9x^M0-XT5z#LuC5g1AjLkm|MFk(F{VBU>~sj zNl(x)WMHtM7PP7A0f*NfuhwtYR^{MuvnJGDslG5Xv*HC%rJB%7hN^VvZ4G(oz5%=`mjy18Z9Idcz;ACk402(i>I z4i2WdjvcPZXQOQKIaS+Crc6ts^bu{Rxmcsc2CVE^j@ZbG0gH0Jf^olQMKv5~pdTHCG*8;MB7-JsBf`?)9kAvn&##OnR=MDl*tWXA0yo6sz zxLzq($%%cS5Cm`)MIjJG5yNCn9)|oi@Y;FDqTdFuoj>TUKy``JTLr@~rqSxR##mU+ z(`x%Fo90Y5v&3xEYc<2MzR{-nK&$2T!iO5$F1>|sU9Puuye;3HWzjD;SghKP3cXHi zj^Tz%V-bvbZ{(pEvsP>1pN%nFBNt*5RH+&SeVM6Bs8A=4r3R7By`ymm1QHHes~AO< z>*D80ff5Y@0gVSzLUbN5mp?Ck`=jScHSi*T_}d$A{FV*vGNbgYcQ$B^oau_eN)K(2--ihb z97gvLas)}S<?ck0Bl{6I@z&V}9WabcIzcen5?o&E(5a0>yaP-o zozbKY=#9K7D=;ei=HEWY$KXMuRq-4eO8EtXMw zfzu-|kQD_dY{c!Ib_BR|)x7X?AA6;)T(sC!Qj7 zsa4e?x@Dgdg+_3y{2CV2@cy7v1Lsi{<64Q>MH;#06ODr;H*0-X`j~6xnj?+aXRVU^ zS>|b!!dxpUR_TO%868fhi#ji(+dgSzVd~?uyejLB$dAPj(up@Y;fv!8`ZZ$E9|U48 zBKxoGy4>r?L-1uoOQZB9bEc17FZJfL*b7o`WC3vED050*rjO-^UZs+cB1+BK@C+`Y z8^gGzioJka{|AqI29Lvy4S>-5X{RJz^#{<`rJ-%Cuq#BfYz_dD(|83cLe7F+y|T-y z3aoeHTMLSz&_nmc7Uc_&4XzGcBX1!(oSixC(c9@>)F*#KD=7 zHjq3zAes}YPlIBKd_p{O@^fwn9BG1ZTMr5wgTsTt;T`_P&5QA0*s!>E#FE9$9RrRn zU3Tow&yNWkk1bnz3_BekOaJrCb#Jd-`}TFu@b^j*;tZtaZ{Iq8?EZ7yNa;IdK}AXh zwoYK{v&uCK4@nmeZ~3A&ca*N)UHj#h!_tLA3pM3gY{7nZ+n-w54O~L>^+Ar_UOb83 zxp*;?%g`df_!#^A*s;%#N$G4IGp;?~c7Cm(TeNWep|_VWee>WXcs}DWJ_BAW2!-nl zZ+Y@I>B6l|(@L&&toBY@d@EDm_T()%K7DZ$`pir?;2pv|tHHN`zp%m$?`kX%k|mP? za?XKA5aldafi0F1k>M001GOU0F?k*3AmthPA-Mqa2NFUKM0{UqyYvIo0=Y*k9e8}x zrpGt2EWMyl&-O2UX)x2dTrtUGlKZ_ReV;rAo5@T!=+!0u>~vhBP0I^;L|fIMrqc0u zd3~NxUK+O?8K%$RNk5!=Yp{8H>LsxT)FJ6+G)LqtOZ3HoNIFBE%H1< zE>)G1l4M~<#V(e}-Nh0A%b9#`gygz^qCUQT;^v7HH?u-*TAyUCZ|%kv2?@!4(zK5B zeswn$-k9%jXdGpZXO;}ZQsZzuQ?zSzzx07;rGK71i-bUHdP1GTa}Q6N82P~#E5@l~ z)6*=LI5F0i-6tzxD7rDP^8rhTMjv^$$Pmct1FyB1v-C9fMMr4mJ@>5STd>5JC4N4v zd|V8}kB@x#WC2n}V+4RVq(DeDmpO8cjPEH6-O8lOaoazWo_*j!>DkY>PY7|(=BBcn zy#w+g`#&u`otl$BAdT(!h~e>-k&6#XEuU}O_BjhZ$f-gT+TZmMz+(OYkMs&F_6*1` zOp(@-PKTi^2SEd7QJ)hLSp-uBq8Jf;kqSgGkKF()Jq0qWLG6j&77*=G2QIi}`H(?8 z007oP90IAg7V`$`rVB^@7QAHOV%aRdD$i%jwCy6oil9oBb} ze8)J}x1ZfJ-@ULRw*O=nI=|0azQl80|Cx$CVHnsap1sD{j`GNNo>|;u`H@Ro;BfLR zZ+oR+=@`+cF5nV-r}pXCJ-v(_&hWEO0|U4MmdoYjRR6vIJNtwAoGMMpSUy)?AXR&i z`k24y%QwKElgkozwTEh=e638QwXo?d0av@X2gM`F6Cuv5T=3ddXbL1vfNQWy)_;)S zaEhN2%n^+v+9k_NMpAGD36>WUQ!WNyki6b8bAuJ8)F;pYK-_|KZ*x>&V467c@aW0R zT*1ijk9gwZeJKUt4JK)pZ{0DOmyW4cZQePFyJ0q;7$@la4Eb=A34DW+nFbAc@qQL- z)nkxwi;pG`(CWngh6S7_LD0w9Y{ObN8#z6$GY+hH?E!y`&b#Q=a{6N zN8J7J$o|GToYy7jlhXN`Pc|C?BY@Wq>UZvb<}k%5tuZl8hg`T$tkN$i(da`pA8m}` zs0#W)f018~Vq7i|x8W*NmP|8P=iKU0q!2m|Bg>lChtE}2b2oi1{gdr) z(9Mua+D@NtJFQf3Yqoyl*WA6Aow)seX?|qRO*bb=WuA*{{Rd1JJRm(IeHf|RV&E2S zVihZtxZ`vijVr`aLXY&aY)x=0fC&o08i-!Ri_;i_M<`J^mD8_;F|eF$2Z*Z2Jm`0^ za##n^uh3smc0plva0Vvu+oaE=0rPuXst?Z6>6Yj-zFt003L;_x`E0@@3UE#g1_BKN z3@gEV19lb(NCgH!a~fL3Ky>B&G;EOG`26wb4ohFnthq)IuBn;HY=@sazFK3F>&GE^%L86W$bF3xPI@#`Ky@v z=5JX4(~lBw%2sw7qdEnX#WQ9wEY`kV~?+5Xugcq6Z@qbhxwP>8nsJQe{Xm)*G&5Y`~qv!8k{px_ii!V$W zv-FlVkL65d7r1xDcW>JL2X1Uh-rnaYj=ue$Tk4iE)zap^_psSNj6iw|3!BWA#|NiY zEj#%rd$4Y5b?!ZjwzaPvGqG;aM_XU#hTM4eEUFlte^g=2KSn~={;@|`)T(LkG6r^Q z-2&K>XD6IdDXjX7FhGLpz)T4!HNj&O+cm!dqG2$kVCnb!N%+1RecHlxQ|9S@w z!AmJbmtlch`4-uNN#$~2Ui>S{PuE^nRjIJHCD|x;D#;HY0mTb$(2I zRYL!>$Bw-;+}A6lkI^}E^WD=QpthBB*NCfSeMzyd0#g)Kb%*h^E`_6ao)Q-wDGEGr|*4vly)8^c~?~OP2_AX8|njjPUbhCF48aR92 zz|g|YjSp=dyldx+FYOG(a%$xNwI|!n`~sJ&<2*}Wo3mie>UU~KX6Gbpbh>!GMm2Xv z_~tDe5-cEn`i=M8dGLCja&dVmRMFJ5ch;ChwK|dU;|8pqIkmW?B#06Vyw%H%l1r>D zs}fC|(V)^+R+*A4VpXNtl`v$*!Z{;rCrqdvHQS>~Fq;ym^=Eb5_QqM~_U?Pbq$?;? z^Stt=Su?5!)(&crru7@V^})$6?Ap0AkisGTxmt7@xf4d`LMbU@v^8f!?Z`Pz>opP&nU^)=EmtwLTRWs^_e8tTs}dcNkG3}MjAG6F#<;oAT~La7Py=kUbw~=dogF= zk6>!R?E_ZLz-MrnDde~Z!t4Vql z(daPh%QxKm@rsq-JbZk5ids-=^wuK!!%a9$=mQrZ8XzaOWm@MM6teH${P-|f8 zfd8*@Zb8mkX>)?tXVCvSeYn-CGx%0+-@R#ec}c@{t9DK+u&0bw+WQvuwMg%0jazqm z=JY$JRK`UbtE&c&b{YE2UQpRrsZ6q(f+PFomycgQv6sdOggjw+{)1!E-!je1uj^&d zTC;C;s5Cr)iK5A3InI=)RK>7+lB)_bbh=jWFq=*1=rcB5nOAqy_|ZEj4(^qx;nr8W z1DwM(YB>C537(sJ|+!H_AXVCJJHXb@sXt6LfNtIPb%1p9ZbU)Irl#?Mx z6N7^g60wY~F2QKoMIj?SwuNvT94%UjcDBk_^w<;?LyIo^uQU?*ZR}h|ku{=TsXeya zEEIakg?{`b`Jq>|j}bB{wGnx+b(%M2>kDQA2FIme#QyBz*VA45C}v@_Y0*|f7>*$= zR5LDw+)xS;RRvgDcQf#c%i9djOjl{OaM4iKjGLnuM&1$>EkCKVL9YMst2Y#hK$!m( zoqfU&&PDDM-pe3s6vurzlAe&!NEAngqW`mY7)ufOXU;@p%%6Tb8g<^af98y)!~Nei z%`FJbzslp}fPZ?t)cXIey=;)9(t#QRtXO#U6KE2eiW*2>{NFW@=#&)5IwQ44Tjm26 zZL0Rh|E^iMzLEl<%kF4<<7x6^BfbBN#voZb%JU|5(h(B=z^!zyFhzHF|wFm&D|vAM^8g7eqt!jo!d*7tt6EN z-tEP>_@g{Wc`42!s)FjSkf)nCf*;0M=v3cdrlwF~Q-3HVmtN(YTJ5gH^tKlHy`gAS zsvkvRi7q0ERk?*Y~*0% zpw?hDW0%7&H=CR7Zja?c?Tt{jw?xRvssDZBeh77ebca8FZsFLHv6-T-Z;WVtM*qlOdHA`-l z8Y|YS627=%xBY}#$tf&Wy;=z*9jg+|dRxe*hJw+Gx!tBlWB&9Ae@UUWwt-3K88$@l z?DXA99&$q-qR15^_;PZH?bHExWmM@}L!&KAM(an#~5!gihJ+=mfgm_V7GDdeYo}Vf0lzJb?@D4xxYjU z@EV=bA$knn_`JM+{&A6;PBH(z_folKI^Lt)IW%|u7{OHN)Hags1bP`TPe2O?)G}D+ zG{E~oAnmFU>8S(0Vjm>)auK>PctA4L%f+r*voEFD(vdfB+Bh~LHs|2AnWY2DUSreV ze3Ol&3Rl;>AhqRJipE%h7ZFq&!>RJ@y<%OuBad7*8F7#FsByIREWG2Z>ziI3QqVYl zWW{`+QoZ9VX8B6maSDy0exRR04LT#31S8l&b--DYGbsHUraZ9m>-%QRxbJKEJ8A@l z_%HN8CA`%2M5Td2ZDw&uBY`ys@e3woc}d$qF7-!FOYib4Bd1xqaFn*W5z>2f6fMaV zqb{{5?-xUI9J-Q0;m`YcXv$Q65-5Vj4yT3Mkv4JAB07}!Yo)W&uRptSYF5Lbddq@g zu_tnFtDn5gndJyp7S5WX)~_iItzvcUeA`#j6lo+=HM1(F96Hs0OZp9J&4wM)Cu1)D z>R0tU;@R~&HGSi#9#sK(kte@m~gm za=r8h-AnyCs(S`w0bj8C&ii4faRyjLFq+#4(I0o)6VD>%5N2!S9TzNsgO0FD|(zW^%wCkPf)x*s0X2LHS!YHx9LF z^@CZk5O{!84i_Ay3wHFG=NN? zx=)vNGr92N8wqO<*?OV|8N`ptMi`KD@@4SChU^rfpX;9%s z71kh+VDS{59tlUCd@6#4pa+BZfimy?A>Z%XcVTz^o);Hx`f}(W7D~6j@+;~6x7V$E zoB4iqo-LL_+#}0iDF5csE=&2NNOp1jy4(GY+uhkQ+Uy?|t-4|Ng}n=3+*7}L{&n}X ztb1E}AJhYnc!#T&nj;b{_Fd+6>H9CGWz7shBqizS+ivhFt@wt7)zXPa5cDv=8KD?v zAUZQ~U*ymPer($#j|;ck_C>y86Qr1qd)Rb<>TbNH%?lmlQg=RALW16?A z>@=F7uPMaEvi%gq(q2&P;&AWfd+;noWBots-UB?2>gpTcduL{QlXkVMu2oz0w%T14 z+p?PFZp*z}bycit6*r0n#x`K8u^pO?3B83-LJh<~0)&JTLJK6s7*a?=38`Rf{Qb_% z$d(Psn|$x{J^$x#YiI7OB27?qt;@uqGejpF5p{d=MAqr#Fzo z?`}uB*XQ%5JEEZL?tI;0b69aK116lB$mtxvY7i#=08co^1YX{Nz5*jdCAX%rRGdvp z$_5ZJ9SV*l=%tNup#*+LI{2$tXbJOxvjwhIS(SbYm>+mlx+V*J3=vB-(VAW(+9w|| z8chc0iQ6*^olz;?6kk*`c#p~sP(EUhZuV8?7ba#!yS$0{1+ntAo=aDf(9X(BJzcQ{ z`H5avbXH!P-Crlb$6gpEfKsaKCXEZ|9-~wio z|G~t^U@y+by1(J@gz)|^FfLh;NvOoRL<>d-!fV7;1n-cHT)?{~f>;W$p;hfptB&!) zW!m0_jAsBV>Tp`&1wT^D=FIXdEUFCWsVHJQDO7;IuRdgO8ggQ-)|5oEciZdd>^c_i zZS>?+=`)SFx(+{>avNN3Q#-#hVig#l`5EGo!7+>Cr7r zx67O3b;aAFdwZj8@$psB?2#!=F$G1jiGsNzdFHHheztAz*2D$g>U_`K{cr3aSa8LQ zpWSucN1n$%lArrs+>=}Hzbe%hH9fwI@viu)3|ssa^>XYBX}0L9_*~A0}Nt$Vj3PmAMLZh(kbpaUoX5thz%5kMGrcDrx!qhctbY6 z(sNm%sAzoQoDjym1aGoY`sMi#Z{Pm#`5zD8kh=HdzQ@jKh3R5bV!@IPi}MqV-o)Ol z?BN5^1>yDUW+ysEuIS9kS+nbfZChTvV6{IvFPtC6^{)6}Mq#4cu`)BWzAe}6uRnjq zyz|!0E>3fqxoy?xl#t9>$Kv>c ze1D)I&1NWDJ#@+X1y}88sR%CK&|O+MJ1@y>j`oLFgq<$NsupC%`oqOjlHw}D)nyIg z**Gj9_*Lm9RexP~_UQrff-tKUDQ3)aMdwRVN~dkWk!W~!r@6y$WoJH(ou%5%nu!rK znJJ`&*-3f5>giV1Kc7U)sq!{BZ-O@cDQ$S2uZlSf!3knc5BWI3_KCPoM4}P;IpdiZ zovG8#4zcX7_U`>keg{|fDYZwL`zohO2})--{P=hFeswC>0+pZj_0K>XPt&jD(eP_M z2|S>x^P}g)>d7UrBmb_izScjd$4rw)`d7VEruN1uV2DjsWa2fC zo2fUS1e1YS4TPa4!Z&^Jfewg4(^-ze{=Ep4(rnVR13VEPpHOxn3x6cW0XDr*2#QD% zv!#+^9@iDl zG7dXPu9QXM)47l51nHU?#}4CL@dw=s_1^4*Oh*phrN>Kgna9sxcTvQ3+3Gt~dG$M1 zU*?Kjw9Yc401;##{f>ee0`=hdhQg^+3;6*APaNeCsXiQ^F6O|Lc3fID!ssNqS?Q|N z;TXi{i0Skqho_0}%I)m&l>?M$V5K~h-I!la;c~!#DsaiKK_>{XGY=10=>i>o!Q}={ zoXC`0sz97`f{OH0A%YTxkK{TXqWO%|Goe%wa-|TJApE*ot`_8S1I%SsvoeR-ES5|0 z^5csPu}7U|ldwQW=mQ*9A@pOqAtjqxO<^S^o4LpkcT|0UDn#X&h#iHa^M4+VJ*l(W z?MGwf$FRIPS^2~r4@YB}`i{+_ck+u9cdM1=fT-)iIM z!+raO%l7X((ZXJ10sMb${GjgSI*2O#02$aI5avIvOfCMLT<4ft#7SVdK5`vi^JT9sjd@DX z1^Jy`Hp)hO!8Lec{3Cqh#JZvKk#eA4q&vkq(l|;wr(Ut<=OXSGota=O$`oWRYHx7J z(KT;g*EoLo6X$)PS|q%{cKoQz2MDx@KIJ~%tiAaurJE-x$>+%_69x>AxTC)si}%O7 zqb1y))S}S=l1?}|Q$H>}j+t(TyrLIAzu*rBQfOta90(K^Y%gGpN+|5@5@Ju> z2%{ho_6px8KQjLL^K#&MV?Zj77;unrqY$e+8ilG8Ccep*7sG-lO!_tBH}ZDx_)ht! zF?qJ}OND>n$*aJH%5OW0IYFl`=p}3f(wU+|o&~b2EI?NGa2Sl;1GrNl-_n$wS_b+G z{YBiiXf}5EurQ-*&+adq*~)+JyFkuXY#WTVt&+zd+xAMOYo4p}m2Hp7}X9wAD z*}>2Gk)z{ptj*x8X>N043uEUUJ@Vvj9orAS-@THtmEG?j+}?59ljKkyD-Xem>C|{m z?6X|p{^w~r-_VmF&t|kQJ@o_j%Y#dK0}+^5dp$%Pu(DJMf0I^XLV8>{0na#J$oH^i zB$hkgEM!@YK6%&cugkl9Myu5*zGK9e?QwYn-}5V6jxDb`o?W$kd6oE1)pEXZY)p4@ z`*xYEAL!KZiCZbhN!>m7U``s3XQK>p{ec4q+^4gVB}rP3v1tVCr_icIqS^Fck0W(R z>p-lM&P^$XvqFhy`K*WsCqN$qznC!e#D%f0@;$GmWvnu1WmQF1hVo5fe&fjSHFK|n z`;buL{GZB;=WSdvrLu5t7N*fNEcEfEi<2e0&Bp4wV>q7m`cq2^QT^T@Y-KK&jJ_E8hqf+-`xG-=A}!$aLSm( zW8tO)AENO-@f~DMgX~Up;_C{TLGFaS`WRyYGzDav02P<@7c0tk2^;+7stiST=o7TYoY!Yg|)iz zteU9K-fgeQADva9T>K3?DWYNOfxn4YM14F9{fkv+VjtzA$!W+^IbgV#0qpgVQBjQj zQU5zwCS+TQ1>lCLr?RU6PXPf?J<_@LQocAXM=#`82KLjuC9IEC*Iw#de7dc_8s3lvS;ec{O=7#* zyU)0B`#U#Y64`b2D{C(uN?`dbZcdhJS0=sbHAKt5i7BcJ{NBy(>Y`%4dV1QPk-cB- z`~JQ?EBmf~8DB+v#tC|#By?9}UYt76RtaeaqX3X(QxCh9BW{=rQ0!We3<>QBNr+bw zGT}Zr!%F79DyU`B`gV%G6$UjI#fQnVQu4Gszc0zFM8zbOrX+>(R|Lzml1fcZi?P=% z8n%6S!F!*|CqB8SqvM`Wn5f*@)n^mMjVMelmK_T;Rwly*OH0f`2Q>_W(x z182D4#S{OPeRTp!_b77?n?ynJQO@YNfow2h>XGCRq&U+3S#TW-$e{;6^N?szh<#^l z?b@+5?6RqKcKK?^ga`)9Hgxbl@2#{Z~h(BIaQ@v(Qb0~}L2nm_eWFh50i1D(2-ou2Ik>+r4 zP4D=#%w>Pa?vj61W{#Hs7UQz?d>oL8{9drd-uF=@@(9aD<7bgqhz|1aZ}c?%Al^aV7m)?$YO znIZ|y9TJxFV*w_{4J-k|OBgJBV2?q_pQKR1v#0lvy94afhMB~|=)bZ$xPY^WNra4` zd%)P!dq9mN3Jf46296b!2yD1fjuM4!xPf=agR(HfUS@`OeQcUdZuXT-1Yxv{UPSU5c?MK6^2{UzlI(?P>t4ri5w{D*da|pTIgmV@wv|=fNseH+=qH22wy9jj(oy zGjj&*C}o7y)eK~X^M%nSo580U-lTB&S10Df|I({Ot)Ko&`oJuS(KCRud2;~jd5^gHdM4ME6yqmwv?$}RH#jwV~F>Z zEY%c4CLZYy1CLh{Y3Ff0IEsqUfJ=5Nq~51D;1RWJa=4IZFpgt4Hj37@l~L zRbg{0f|YdO- z{><*kjyi0ydw#YrYX8=hg#klKL(w@`WltBS;_Rh!3q!-58S%mcr&7eH7bL~0X+&d2 z+2mBw|E4NtPh{y-7q8~9i9I(|o@z|VN()`6-MJFWqSND}QleP0uw zr(p6IGH_?e#SZD+VHtG5>pV!cfas$M0=uWUUG&&RUF35FK}>%5Bgx3hPRl6u9@s!I zeA5RGe^N?%M$o(FhVf^QjXz~gv)*a7>Z@`2IDTgB1#4clrST&gxbM}#pM6N~?dUFr|q~~c%f~`fdMZP#pPJ<_@esS8$-VJ*jJ*zxc{nTh?;*Jw% zsOf=9h0L4uF6`0AflkF)83}?I^ymjt^YQ>12ni5h7GxE@QF@Vhzvvt~we*5YRXPn+ z7Jw~R73m@{3YYreyV2mKWI!4G_fVShW@UBvMrF(>5)-X%Gj~=yUHl7&QSWK2PPyYT zhu)lI^se9WVDs*qvQ~usx3bj2LLUxz8$)>>$pCo<_Tg7E&UvaIrVuyHlZ41E%RMQs zZQ`r3NhuC*rTmXe@|P?qf;@rMJfDT;uNl9?U}J*Qw9e?t*pss6fos>_adBv@yDpJ= zvjVgHsoB%lZEDUnae@8qSnsiCFL#;bYg^@SX9yKlHp349Lk#Ea+aX^!4L;&_qjyLY z7Jsx0M#&l=kg-1iX@0Irvuhh6ZmD2d7*;GfV*%25AW<8#Yo7 zM%wQRo;CpUl3)?^mz29pdv>7*DN(o#1`ekC65gLyvNzi@OJC#zGxD%0t0L@YqFkL* z0n5`_?1}Mz%jT7mz^kI^0jB+v5^qo_JTv_>>7O*5XT< zlW+ysGheiDn?rOITgx`^oV}sy_tSDqGyfQ8PfML23ys*XVq!AW=eqxVu_Goeb3xQI z5o2;Jlt{~SvdV>~=zZB0cNb2T+kAOqxvxAM@`k>tIaxtgEmh~F7ffAmo}QUez?(B! zq3t~HqE!D&=Vfv~{2oXwWkHiHU1ZQArIGz(OQT7z#vXtXu*Lh zNw7+fr4VU$;|RXmO@;9TSW{6lni!#G=Gd)`=dsz(dKj4wnI7j)oa}DH7CD? zD2vN{Zna!*sLT=m`Kie^r2_o>th`uuuEl!kk#&M)sYzZ@T&B zo8G?WAA3`(suTZy=iQ%ta`&qFwv5)fN90%9ndH0t&e!i>Gb8QrxA|Mgrks=?pSxvy zrfdDxap5VMOXKsCoy#h__w`Mi5ABFaeEfJ_4!FJbpn8EBvj7qk#3|-BTuoTzUAuS7LTxpIY;^$AI-Wkr(@P~uWLq4c4kz2O>nb6I46|* z`PbHj34Yi@MQ%>{CK_tmI^&x`+|e-8vPinV#M+~1)t47m2#TZC15=G|ifk2bV2@2^ zhlwXWbsb5DtfH(;w>8@$8l|X=UCUmW7X?`qYqmKi9d8WPyF8b0qr+(}wWn9-&&k7;+(w6wJ?3birdl`x|+Bn)*X{%^*Hpd zOOqr|p-0MfnUd3!@n>{rOCEOoY(5y%Ilvd(h&}Eaj6aYvfh!HAGWCg808%E#0YNbq zM|8r3J`?o^NtO}nQ9&I&M%qf07bG!7!&X}3t~V<2F|u%An8;%CvaJdn>|Fl* z{Ah4cKuftncqnjiDL2}kwo+SqjS2@f>9(NF;V`mGneL3q03fihtRbms4G5+O7i0hk z{PX?uxHC=#0*jr1pooCLtO9|_l_z)v%UN@Q5pP(rbxl~$E~(@XfII^t;8hIVZZMZ5 zW&b4TiI#-$Rv}~xf}tRWIa-G)AbHEGL=e>`-HgH7kjEpKOTCVUnnq($mwb=>>$N{G zTHtidd~C_ic~5}mHd*xgXC1z=V|!)Y#fx_}=31Hl(vOd@z8_1jicmv&(B8rQr88TC zwdZcG)$0n^Hq6c~(no(%m^9s=uTOc=esAb}XR^VNFxQu9OY!5x-6G$SWQbkGSz=*Y z6!?4kGS&|-LncRB!R*2Z#QDwVTvfAp^PE)mOhvJu+5nn)J?uY|Y#W&T!0(fOX<20k zSS>mIBd$Jh`=lSxBi!Ge@e6XuR??gyl#mhaQslCsi$I62%0znvQ3_Q4C%yiY4_w)AJynX_(SpIo&5*5 zuJg_7z=a^?c*2NfST3Ty zz>Dfnxxv(EbQW#MfJD_4gfzpdeL5n#uusA2qbxPb8wDd{K1!rtFG6~qwzPC?tlX$q zDS#zAi;`p0M_W5(5y!HGy^2DuQyXY0=OFh8(<=?~2ust-)6&W>%$b^haXOXYX&Kj+P>7RPj5xFva7d9tqzzkXkGd18re@WLx*MI|?dk0md8 zaPL5yO>U@et)AXKosZ7_R_pw$%8J)?gjQuh_*I;{jCt#(R?45Q5vSy71(czXqVm zr~>{W*Xs7^bnq95Nhd+b*g%>|I9Ds=XpaNl7$9mbK)DJnAfIGt22BE}FF>f}bV>9+R zYUiLRxWa%uP0bQ>ah)|(A*NZf>WdiUZ1~}Lzr8*&=uNbgms_JU;zKDlP7IeqOX(CG znyKuaPHzJs{0+hYRI(Qx=wTTc8{!p!ys!&Ej^K0q!5knV1}Rw#R0#&CH+%(^2aB;P zrlDcmZT(VHabsm;V6DFYwrvd!F;zy(_)nQ(u|oc06b)U*PRr^q**)(hghsoz=xf9KeN1C;PJI6N2f z$gI9<$wKo8m@G_z9t|(c0LQ}>g^$fFq*Rm|XxyL)&`jd7VF!W!LMG}lSZ$J?%`yt+ zygSYpvvL>C$z&{Z&VqcuwB?R0G&a+iU|Ii$G(UevEMu`V@?jjBms#SUUp-@u{Fcy| z+d$C`xsAfxKdubf4Wu@xnE9X%&N+uY4;NbV=Tez-=ND$=9Xqx%hYytEi_

5q!RY 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 + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FontAwesome/fonts/fontawesome-webfont.ttf b/FontAwesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 GIT binary patch literal 165548 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 z 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 d0mRO}xo^G_%I z2O^L=ATW7lM&^H<^*^2eAN0eSJq3(x4DA1L)&F4euaO6sK5joV1E+r+DAqq4sQ>Wu z0|aVj?P25hA?l{GgpFa`oP%>HM?@(=7t5y$lA|Hyyb+&}%lcF7Py zVOq>>oZbI%cmJ;c1Ox&!PmnY&6cmq2?4Nt?RBbj#@*S#u% z($dm;AKJG3Yv)w@yrS19dscW!&dp@T$utcaiktwRu?l%Fgn7##v*Q%&IaI$|O!P}5 zE!tXI-Ss#N&%~+2xwep6)=D=@bER^nrNZX=A{Jq3H3E=sm}xcLG|pUA-88}8wRPyv zPnoSTxscjcm{McuVx_s+*=h#*Xv3UB1T}&E{uxPi!CD1QZy{>6F_-GvT;_v+@h3%S z3~p6JKLUMaO+O0%W$iTHs4{|UN^?L;ts#@G+64bnV>gujTO1A$SfkJKhUN{&{#iBu zbrz-NBAI4CWjjIN*&fwVu4RubbB`IvgcJ!WV;{$}bpWy2K1lw(2Xe|eWcN9U#V^J= z0v&sgD$Y5Kh^J4utKJ8w`)YkScnEwZDG=2~oYvdtqau)|6HAhwqW$r>MKydMdi-xf z|IPEi=Mls`ySoS4Uu8Lk>GP(?uENKw#l^+NO;vrl>caNS*3!n4J~PMG6%1?`Lo`8D zP!I`IikK!Gm+D~0Tx5dT2;-4lEPJvvNz@Roxn4bK2&F(-3ukKoTzvdLw9r!ZsOd)GFakMtPqh`I$P>j#E63N~^t! z8t)N`OP-Ey8cNVPKsgcS6B*&w9LA&4rPERq64J$9K^)cnN)EQxZgj#nJKXDP(AwtHNPvj4d!y|3WE|h>aXutjp#eR1Va1(D~!1cD@#G$XK@| z8ScdxW>*_WC0A}fCWQ_Gk+039h^tbyU`-AaRQXE3C@|xuc#bIvB-u`7jVA9qExYjR z=L}OyA;5`@PuJUM+d|rr+H3CQORerU?U9!{Bot;XUqe}i%R=!=DIcZf5IBHt${UX7 z$u&nXerDE=@3Wd|0@Hz$q*rpVDJ+Wsi!-OJ!$UKaeXQAz3oz@z3unQS7l<)x)linz zAH493JdOfC{BNrjX7CVfZBLDtgiqO>03bm9Y%opN;dZI*d!CgC7s1So zx$n!T6vhxG4g7BozT_i+(EXciSh1 z*WKx5dLayUw$Hadz3+<5D}%BZCKe`cE4yNK&2O zC_2B@YGbYTJ=@>6O14_I7;gA)sBiMPW}zMqr`$mljy|@#K)X4 zywlOE7bt(D_<9aY(j=81rYh}wpQBZ2>BFX$_0y{XD7Q1jV-(PFSPU`4DYgBSjuXGW zB&TypZ4-Ia;ZDv{*YiZ4BK%bLvA^d#3^`kw)^(lO=^V#PS}I{JY8vD2<6?gDUgByH zoos%w5n5SA70~&_wmZ}=sE_CH+$5D%I~M^tEkJ<ZQI7BsvH)rso$j0Tno$9{71< z@V}SCAhApjLIvlX0Pxk%zZqkf%M1LSF2n#NI}?5xPC=! zobSQlu20xcw~DY&-wOel-n@?qJ&by)A02bP=f7VUb$6h9A&zxij{$poi1x&>usk&q z)o~Zd^jeapPeoI1Jmh>Rc-6+ws~2@GiSZz{hBgw^soz#me0J4++L57M=6^+@00R~q za2yth-1NjYw%qz!q2gOQL3>x?qI6L_n5iR9jUE#0ppndAXQSaxXgAAg+?Y2ZVSq`= z9KUjbab4|QH-zBoMtL>BP)ja&OJ4O?2yYF#*>9aH4X@u0(otsJ5@}kXX@!4~Fy4Wh zDN>w`7i{CSlIi9?H2YDBB_h~K`_cJqA-9`a@G}pVc;w6b)PGdJz9MqO5mS;`wb~72i`W#}dhh!aglheCet+(79kLz+P{)7XRuyhb{YxtDFZ#1N?6e^# zh*vvtce7F3I~yiY){1)rPtn#OV%8zxe}b9$IU5=66PVl01yCBSd^dXUKhK1G0R|IV zcvk_Ac>q2IN6uR13{;c-_cRbEqYJTB_{Fr4IijaDP_s&jXx0$`sG}^H^o5 zz-Q`#Xift$p?Wb<=fxuzXVyNKg#>QnXBe)ocjuyk{hgW=c?V zRs~?RkX9n-Kuh2ogdASyGctZ-79U~PP*d!u<<~CRR3B7LYtxF8T{?!Nye0d%0n1-I zI4RC68nKpBKg^rfqiJ-i4HXbQx4>=dyxjLao>lA4TIu938pOX`7jX~@WPeN@jr_P# z^lTrnNnS5FJgePCzFZ$yZEE2?4_z#R){UKOsw3qqM;Tb8H@A2_3MP!1!fsit%Vn(B za_2OfhiiPV49y_-YDhUHAURUHq=tlP%rx5l^&mD@G^8z-Y=Z-tIt3L`u!>WVQxz;^ z&9LZUjm7~;VIecrymMSz9sAiMQWB|u=tF>$?NZ<_+~80;Rt&KJZ1cdqEdhb%EWus! zdJaxE0R*U{g1~6{#~l&e3R1mY+6nb{2=-5{7mcd@paR4GV(zxv{CelE`s$Ei#`XXd z)c6s?t)+nM8@GOItmYqze$tkR-@pNBhUdU3!dN9ILMYJOj4^aUvZMFQFK=P@cL1r6 z@U=sJ<=N(Bq`QQC3-wJHuee;+1OIT=^WJf^vichJbLK-(8A>DTum-ya`_|C7PvY^V z-X#zAoguBv{!+QTW6rx3-!1S_UiFDt_}ti$D*F?fI@AHKaETKn;7R7C5HXlh^h{!o zsrxdvVOX}7A?4Tr{6o+@q_3pMQZTg)Ea1)Q8|O#l$}N5<%GqV~ZE>N)M!~x7JUKA5 z9t(l39F)9Tiu!T`O`2ZQdW$v?+Qe4m558`xNHnv~bX8j4G6ay*PnvTLCWgm@K+IP1 z^SI~_P^NN)(Qy;gv`8wrCM0r zdu^7~mAS%W$G8dDhB^z`1T=lN-^sNz%Wcwkz4|)K)IQg@u1iEb91XhJ5xEwYDfvM6 zkLOfT>Goml>)dkK7RrcGd}4t$1w4`Vi@x?8r-Xz-T@erhoTTvYj;62sm##V72KMKy z7jCvo37#eEob8=(e^%k-w*#CwiWcoBL~yaY-mZ;3#7$hwrE0n&Z&_iqW9;qZ8h>;~ zOjAz(rmb4$^7bp}HHOIkg&1oXJz&O9f5ETRc`KDiwH!c>87$jXR}9R=#e{N-{typMNosUZX^8aPu^3Zb=_A_|$kJ2>CKI25a~u?@$|xUD0E z3rV0H2Dkhmtcz}Bqr1R;PGC&s1*q_(cw=w!eh^JIxmYy6ip|~R@0t~6h9kSKF8k`r z-rmZ)soKb2jgHIODnmo-1=6%KLu=Va>yJSJgYnC@P2eB{+<2U~g=4b-hjNb|x!65z z5!Z3c@32#?=kl#m5f8>l8a@f=Wi6&X>j+N1+ruaQG?CtDV~PXb>@WWf2Q($z>z7U+ zMBlz(Z=2s-T8$d;Ue6M3l3xRuVhSxm5s{3BKIpgmi-?-oisza zkmgcLp`Vnlx?L~qe?(H=WYV)H)PPR{pA7{5h`m_l^X{d`q$MOR49YduCf{c>9PI^G zU)!twAe$_^TtGrD{jAw%Wfw1k)5`DgJXWP`-7XNQ20MryLW6t0#t42k2 z0hnOio5PA`bpihQ)A=v&;|;YU&l?F@fC_Npa}OspB^Vr!zTb{NLwi)Hy`}19z@fr? zU3Jh7xd)*wL=El;v+()ck_u(iI_w^muPd_R6?OAcCyxtX2(vAWE-tjbs3u$PJ&jfGp*j;7`8P+@e0HF88@NU#6t?jH*EMz0L$My9PHiB zRVebeoyHC8Wl&pm$IT(G**{Utw9Bh)HAE_^TCH*ta-8|<-fxJ&aV4hWUSV75)+$)r zdIu%X^B9`Hh`wv*IW6Ho^#zL)v08Di99QNKyQ4Ex^x@3G;Cg6K(hX}D-{D_(j!D%6g}xd;qA)E>mv@<*$ZX$rUpcaK+~5kxF2pAac=%N>3B`6+-EO>fzLHkzfcD>r`}fy+!N&}- zUH9`HP&unio@pV+24r=ON7xE68a7?3>8!kAzHyK4Lb=YbvQ+HBn+||W{Eg?GVcYQ!l ztSPK!t!;Un>i4P0$ET?I9pdIh^EU0+RcYthPqRm& zPB}LVBWJC5;`qzHr{VN*QZ9;5?qvVIY@^viP)2>OQxb+mdkWDzLq#%PR5z67y??M+ zSjDiw%%q&n3QENt>Lwj~Ps8*c{0xvFm@csrU=eyiH}Cpb=6h0&O92O%dTc0WV%R`6~bS z;QT3eZTz7V7f#K|S{Kj{_}e_u;Joz^)V0uvH!H@e3WnVKG*Y;R5RQx=UKb=?4!qeb z=_DKa-vz<$?}ZxrbHii^hC> zLN`k`gS9^kaeye-(%)p=Q!i(kFa)B=q#!VbG7-calS3zKZMl8Kg`I^HD#h_iN?($! z>66rNVaPiYq<@#JX$rYXkw1$h7(yVDzNky$V^i%H!;0ZYI+ZXhW#@zfK7#lXMnh2Y z^3kcr0*7W=&Ss!urbd>4di6HWv0K><1f+uu%DQIF7AJcpusQzmE==J_e z-fwZbee~KU31mUe(k?U$jD<>ni>OKvN0|-t=m-(#j;6O&G~<{8=r6^gv3$D&K-xY8 z-A~Ae;#6^CAZ`&J{>W;EQAqsZ`r@~1+yiz(zXcIDK*GBO!0caA&f@eEcUcd0SLAp% ziK^4%9xfj7AK-j%&m}#)l$Krz(B|KAu~u{JsH3mYsRF-@7#pkE z;OJGjbEEV%#{Qt8>G*G(Vfh9<)rQPk1eaSAEZCJ)F~PoR(h+g}tl-VX($ zYO0R@KF7}dH^^v=pHnQ9YSNiTJWm+f!v@BwqQ$Y$ei`a_1{_|I-ss`3Ry;b`bNIE$Rnb+z+c*ky}aexvI*zKtJjccvTTZIqk!Rw!$+NgN&BT7q-IM^YM>9lAFF3qsj z{Ui)Y_-SRrj^=N_HhESJD-ltQtL~Y=Od(%jfPRpq8P9`F;O6pc)s_oF{z{=|n6er5 z!u-{h;{bvm_L%5agg+m)4aA0YAb@K`Qv~YLWx~sGmt6*V!|?F z%7PdL2(eqp+SqbvQ;>6xmHK-4tnG6El;(blqDJ+}Q2=*wlRYGBr%&K>9+K^{Aa z9GQ#O*$%Ki>UYmph71RnuwA?#!9vfTIuG|p%N;AWWwB5C+IE2*>xGPGkT?t@?Dvhd zt%Wpg_71*1_@0kBba@@FZN^TvjpVY+rkq1h2gtm zJPXCjvMjf7K+`s#pH$0kv}>*SPOV2H-e;NChSuuNAtqhRtEe-DVqBG7vr*enVEmVd zAv-&^RqMyAthD#nN)(w!Yp^GI_VB1e$~skiRlP3K6DJObNVTJM{r0E+{x$grTNFbh z_uBsc88W7$jtTI-pPGD>}Uj((F_m&nMmhI4lhx z;SZUOC;SP$w;q=0ux8Ozq190iFGeAoD%-HBSfOO9W&PK~Tem;KeV~3gA0dW>Pv6I1 zYNn)N-+Qq-I+AJB!=V9uxeoR-tL7t;-ZGy%%>9l;tMtQJm7z}(vh)}z8v;!QqkT%c z`Pr;kXU{<7gZGe(<&Zjp1|1&SGt0&iI1JiBIdPElDo}oD(oS=FPy1_j?dy9UkEB(@ z9bfbpt~myqXy`*o?NPpA2S*3Iq3$t0QzT^=d^GlO7pmjpsXe^IwU{J-P?mtkdD4jT zbfg}pfa66t&>R@5s6DBCTElqWD~=VAB5A$Y$g3nSX4Ol}s9ozugn47sFrns|d)D7D8mh1^h>F8%3W z2a5TI9W)%RgrtE1+L(i!DwwV@xZ@VytBSnvu3ay?9Y$%KBd@=bFp#4X>B};lBl^>;B5%>LW8TFDeNLsW?@@;#fCxMm!*pX9lfHt)uuajgiV$d zT#h**{Ipyhjltvp#_fvwZ6(9T&)Rb;VTsa~=gJDe$;q~EJzFO3Apn2EXrlA~F^1;i;H_jG>WmV*SvFHky zf3twjY=>%B`6@dr95pk37;>@x#zI%UP>yJ?6%2RCAY-s(SLIof9c#sG+>FEDjD6gU zD+r3UOyZKt5Q%XW6oZUQHH@|K!@vgu>y(j~#NpH5x9l+GPE6*P91EzHBE}krNo7~5 zb|0;8aj<>dJDCakJW=LK#vk^V^`8D9UP$2lLk&K$X+Ag;(w#ZeR7?dFGzJkJMi;Oc zoicM8#T@0|)<b|u?YyW0!6Ew$>Y~pX2XU`J zDYoQ`d*fm7~YwxoZtL1W7$X*5n>+fi8oUqvJri& z6nm&FFcO9AAX=7k9_;yussklMDtxu6t5OkjY3tvL7s1PUqGstoYssPT_ItLMXX))Z zJ03DK>_IPJgIKX7x8Rw<+?!kIc9MEA5hw)}5-iqzE8VFOr%mr5VC50inCtJ#tAQL} z1%tXg16rH5cZ?pPJcaYO6~hh*gGh%x5*s)RLDozXG<$(Q=kn_7fh78e%R|8C^X%4F zm9*vMr4{4*^7ibRo5iK-C*+ed7*^J_i&Im+>V~x=%ybD)(9wLptciZLN_)YB5O^v@ z{$Ja{Qtd!!GiH0^v6Ue$NG8nsD)~)N*JjWChU+1?Ny%198}eb+iG#cLFl;OopkF>K zIJg1zG{!THV!AKNdnO5aW zt-47+g@#B%3Z{it%Q@M`87PUsQr8-l>(V z7?crSbh@OEA$m#}=67-ZTp889W3?AU=1tjMdw;Ne(Izfm0-RQ+6jH&8gwGA_(Q}sf z2cqudmvKpmxhIPXLGEOm41F$3^s>mhI5{xLs3uHjw&8hlNfyhYWJ>LMMzm7Au8{{4 z-78CWHW(hd0`W;PqChl|g^3)t!&RZbm@=i00BhlV_)wg0=hMU42F)9g3L@3ao5I}H z8I}fZ8eb0a?<61oj=9=X+T!Eq!RN*aH=0Y9i8s}rg8IT>C(zNJ!Th>8L<=0PZ>~y% zhz0Bh?ag(U19g*K4YsztBIx+FBiiPs)+@S)uF6ph=|=6xgUL*jcixtPvskp*56`B0 z={4aNiYE!i0tq@Z1;pR-k?I3o>lQ~?sYinu)T9ag!9h~z6;ikT8&2oT|A@)-z( zaQOIKXY~=W6~KLycubCWOz(G95I!BBDB0Pny<_|zlgVmqx-mrqM_VmHhiBtJ`$Z5w zCPrd45%V_Ko8gYvDbKOB4l<(Fy#)}+&?NnmY-1A}rTwO$s?$(4W6U5%XfMI)w58zk zbnp#zcaX9eQujFlW$d|exgN>CX+D9ODCFX{GoRcYei!0W`_4DPA4@ELI0BSq?GTP9{qy5{Jp>{!$ilU=1r*;&BcRg z$*q-IA(UIbR;y$MuoVtrm}_sru-Iv6QF-Z$*v_HQLPEzhFGyrl8>MSf`fNpzygHW~ z_QJA574ufXwN23TR!mhNU*^BKQw@5<dJs*_=x{mDYt5qy%uW6HuIrYQdUw=BHHG z5Nt@%wEdaq4{)mv_E2B_!pNn?M`+Gf3%JA^GCHQY{6Z+#==o?VMBVKN&I-5tw2=+-ea|`(iVDzDkf` z_o4ZdXMG*j@}fOMk`);6@zP0?jJxg|pqYLnuYp;NEjq=E37d$523+{9c|=_m;Y=FC2zr0q z9ABp`#xa?^D8x?{^m9Pb8P5(LYi&GbahTA*2ISmx(8c(0gM7mGV0*-m^P2+5>2y*D zK>!ty(}TsN$-pvPyv8MaFTTJ&O7I6s@>;4;BIl36G56wWqHwlP{~pWLHf$Uy#0Puy zeV;G?gvis^Jxj`$>M5o?zm}_}UVzVP!9jt89Pwn(1x#nRAN`d2;9sJ`tk0AOz$1+E zH{8RxgaNe%M&|1hrS+*9C*P^Q=fDJ&p_?m6QWaQ!V5kK*vuF%HaecM^I*D{f1%Ubp+IA5m}APs2n1ZJu)J^J{Rl04s^nuyFN`DfFR|@!RJFA-DyQV<_xaV4SNKY62@hT@DgkLAq~ zhG+%xacHfgNfA`ZaU>zuj+4n`fU3TLj}&960XK1bcKm{wvmh9SVn*;5QgF*KxDXp> z;Zr51Q6HgH%jqJevB^Jiu6LMSlE`WNR1ubZUzzA5+#sU+UBVg8!D?yT@>=FvY+EEQ zC!*yn>I=^d@TLt~CRiEKJXWgp@5P+?!Jd%4yZjSDVZ z`OkMD7`^B2*g{%}qlKpgf7Zmo0$lvg7&BQ)Aza@3G~b|J$Ysk*P8I&CB}bAMZW-~Z zIR_wi6Up0t%hZXSOGa=}k*;=(xjt200^6TTRMf=`GX0xknXv$dY&rT#xsb_X8RNyA_$By$)d>6vNs2f?oR!rfdl)uT3^wm? zQwUBwSI&b&0r(I>$MjJH`fi%N1_>bz?&Ie_?js~TGj-`X%$+E9%n{r<<}`S$e`-p) z=*`trS)6S1Q%@D>CURjquWCtl()2l|<=i+Y;!j1i7jdhWpckp=OwWUJ0MIi}l3TJ6 z%ie2wuVKrrw_6uhff+-6)=_Nlw(qWRJwWbgGK?~1p|U<-iQ8R_>vJhnE;jiLPcBi1 zRW@hF{B?5XRh6|AR&h%$^yWc*ouol%@U#QTr4H?XOSYZzd|Vm2@o@5F7Ops_jl7Q) z_!ybL>GEq;&gio9wM`Qi-TlKa5EY2IY0@jteHNx%WR6`sJuJP1f$&aYFSPnLp{u4Y zEC0QDql)X^>kq8ecE4t_gb{C=2=3N2Gdry^aVqO$<8QdOeXI3e?r5`^^}Z(42qSR{ z0UzZY8>scj$7ip(7LQ+vQ=uIKkHj_~tcpcgSP5 zl5+MbW(cv;e_PPRsa@@MkrcgqMx5Z%N!L9-bn~Ur<+53s7!rjk3?KlB}I?)Qdv;%ICl2PJN$ftp)ow;+k%4wA>Ck$|vtQ zY_;32dscrw)Oop1ekSSV`gS{<%RUw@3VxU0lDzU1SQNO$YkfWP$ke$i6f&=S)<#|) zlsaMpADLw$TU8oa^N=>@h~Cf?=Nn=+j|^}w(vlxqQu54&1r>x{W^6ldqjSsVb<$rwy}rmwYQ01Baz>U?dDE) z6Enk8YWv#EPCC25t@EorUGU5O{POaAz%~D^imu19F!K|CcOQ6u9A(3jzt&6Lx23hJ z_sY^Wy`DrdJCS0duxEW>Bp16>_r;eS+N9O(hQNvjVv4ZBkPTG)KZS(quq)nebe34H)H7M%ti+!MZpA9N4oWcss21+ zAQwnD0vc>}2(d1Q#3z7x%6;?j6E#S26$>I+F1&^X5Yhyy)jZx2)-|Upucn@=gqJ|1 znjL{ulPOb0eXL1wk8Ah>PJa-YixeC}tZx!&A(kWBz|&k)2zfAfgt^NQ;Olk0Vk3P% zSYd$?<92$LGI`4r+F>*)w>2H8@J!QRnSiB-i2PD1f4t*yB0TW=VEPmk1ex?YExNMN zI9GtnDg}xUYG}IWCAHvEm4{~@{-51el6Asc*;aKov?K-kv&2q9S;tVToYnO+c-B=` znQKkgiC7CwY$Fiqj<-%#M!D%}%W?y{P=lzvRFF$pViFDB=NX-O>E6kM3WCB9`o^B* z{MM$j4lm`~NPO5-ia@%@awPiq@h@2GFf=ysU@*00s(yk}5oIaOg0TGff)nIUWYyxN zcEn}cZ}y^F)#s&R>KDsgsBwSUKb9_R?p87K-R`$x3itD)iTviK$x&+bcHFT*Q!eFg zNcceU!8YQz_sVsSd;ERa>;c4~o)C6(H5wX?RrI-;Mgfj(au5r*P)ju{uKG+ds!M@l zW?klvU;Oq*8pDCohHSQ24f7DeFk&%(PZcU>rFa>O6fcD4U}U3XS#+b?NZOc2maoDf zS5>B4E6*}7JnfMM)^Z2!u|FFCSETDqB*+}eo{nd-W7`sNQ!;2e+6~Ni)KbM22iZWB z%yRrZnm~6U0RBToY0kZLy)+s{VKacat74^qa)$4)&Ph1*?@Ov-g?MMEm?8Zb;eqt! zLvhaQgRdzKuk?`*jXV%Juuj*{CsQsj!V&}8J|X^iw$%6jIW)vwOI{HkFX{!z0lWlKgw@5_{( zOMVy%4F^Dsc0R@>XubIc?i6ec|UaBw?M>gea5yPFzj5S zT>m(ee^IdLw=-~?{o7xKpf^)qkrM(2p!((az6XGrED0(FM33D<0}i-zg79zA=DNXS zEsb+Zs~m#O<|j?o&r=|HRfL83{B0M~P{4zigdGU_Y0sk`&i#!eN@q9FI$Eh0D@$c= zHCwJI_FH!WbsFo5orbP4n^#UY>8;Ped9MS08=u=>R+PXtTkh6>nUbtX-mk~TlT<&} zv`4nQ78`LiHas=DuR9r3LjJaDID5~MGzV7ac6>D$N#lJ)K*b$#vtKZ<$~-Garg^@I zP>8fe%19Y_zr@ojHZ~{hg_(b+=~elZnQQ=ZFK<0h^nP0I2;dD#pcOcEKg%FDH|FA= zgCO~T$_6o8I$2SShA9w6s>(w(SXOn4pJ?h|oFzAC(qSCg$%!_$fG;Qnflw=yLUdWW zA)3k1AMBe)===HMKi6Z+RK3K-|6!Nf$WbMb-SFwgWqST%&t-)@hRVSed2jSKYbX^_BIu^IWwbNF9 zpJnu1Rn|Wqa>o_q$=jWj4UQukG7HKuhoijLbIp1FaSe$CRlFxs!%%g2>DL85wjvj( zy86kPCL7BS#|tDau=B}#QE|ffG7?kw$s+S;oe~>*PDr08^U!7HjxX!ohnTQt-D1S< zv>{kD2r9{5>ItH#v8$A+WSK86m8%+ql61HsP9hz+9q#mvT0C!ly1bL)-)G``ieJy& zd%tNl6e$!ua=U}>dM}XA>NTG{gA*PE_J3EIFWC8k4~p(C2wkZV>yfP7W~hmm#ntLo z8zO~R9Z9@lS@sMv$@L065Op;&QPR1FUw{cSF>(@B%9&rewXJ#8_cAc=o6*#1DT$xOzeycmC9E)Kw;29{@u_qV|P2(ZS zxS}xa+vYYvo$*1@$w1$QXeJ2ZsA|VX769oq82C&5=~|MRo4VlmF*%RSB7`4{P#pDd zHVO!rfZDXw4$Zpt!Il+oD?D$1+{uEk#nJjBK(eeJY%HhD`*}7)n_Btv{`Im!O4a(D z%EQ}+PvTbP=WADI;~|5XOqn2(kOqamX)kKHqw#y&_tnem731aRZGz5@?m$TdETNl9 zYS>UXk-v4THB7I;csa~%`a0{~6#Le+(mw=byX1PI&dDx!XDsGYB|_m zcnJe4os^9}S8d;{%WfLBg;;#j0-p7l;vBtSuFqcnEiu4ur+K*sVg3u1YtU+w(t}S* znYH047Q2SAnx}fb`rn$h^+M=ct#RG8&mx;^A;cRG6M`R-O{L-D%KMi~ug2yjTfo~> zH4VQ8Mvs>gE0<^aSeNJZh7>i+(1$u(`q{(nwWQK^YY{7>(QcDGjqqfWJw2Vyf}@0< z*0q@`%Zi=ABF2bB1I%U^tnxIB&zV$RNhKpCH@w6qHX=p|SL^r?GC$PTAhC+K`1sxu z=1&f_c)8l2Cc3u2W@J%(6;VRUbf0Btl2F`Y)VYf`m|vxeoTi>`gW96 zdvwr9$IR>Y)MUHq$%$rM=IkMf`b<@d5=nY#^q%C`fbwITF7v&Kd~K}4z;F$*^rQ0@ z4Sj#ac5hQzCLMN`*^3>aRyVd2a?)5z3k(T7strykphhh$nsZ>Qc7_&FaAzY51H=Kq zn4HbEn!l9dl5~X1xNQFng5l~P)~B!E-}j`fMweF^Ns421yno{$UANe9e-h$_dT3dQTzRcqepkzHk^z|s)HyzqDH#~EbY*nE z!3acTnuFHKm4Be2=5dmGaC(Z~Y(EH2Sh?kod(}((&UA6`XTR-YOn2Lq=K8Ed9J;;w zkQ210aTLZ=kK-~tSZUlpgbb=&zrtSoh^z`D-34aSz#KFN6OkBL#w9Qm3&c|6wm}xW zpST@|N0Y+_&$;v!^lp@ufMv?cYmi{r4I{lR1#NwKkwjJrH|5aRv8PE^P+iKQnnsxV zp9t{@(G&~gYy7pdSBcci0$eh7${KG?ZP|P5B!Hh!V~Ydjpyepjlz9e_y56W~f?UN1 zT}>?Ii^u;+sVa<|K{^5K$KG$V_fNK*c-!7`SKC-ilQU~8d^Yh?4bl^Be3ZK^lT{8= zS8p}8Foc24u}xec3~k@==9w{AJZg;u$Bsi94Ws6U%vuicdGkP86 zxPP_v64Oubdj3pnSIZt6EKDi*gaANFtS^9aDeN6?*l&Po^l(+nHNdVjB*mkA<#9R( zcBb{DRXMY=mRP1rN=ufcI?i2TqDX}okf?on<4}r zl;fjdikvb6STV!q@K~{=8VjL*l6Q)k40Kr!tD_9n-j}cIQH4J3L)rJNMja`rb^JJA zOox=e;F?5I3T&fsrC0_^(Yus3APsM;-FFE!Cx%+-tsa;5@zPj%AVh-)t$ zF+X@&4pt>X7%PsBv14&KggqdqHG1W^!jSt~HJUay?gXlvWsLkQPE0grR#Im*_Tl>X z$Zi}x0nE$Bk%)~}`lYFe!RX7JuD=ox%p`whlQ6|bqgsXfHaF81jT$YIL9{f(HSak? zpn0T?m@}WjLFh8hI=OyV6rERA*m#w}U1h2qzjXGbsml6#Jw&N*zdT-dd=15Ie+EtT z*#yE+H{;eR8(c31v!LGR%vg8(nR?iWQ!X zgB&?&SyDYVk5FD=GAgy6YMPzYc)U?f6w91AysneldB*ZfNwqr7o)r^k6yycj+5=oG zIsm{uOIXjQV$7>=Gfq1Zc(Qc~$x7f?D4xDB3DhOeHps*Sz*-D^I+uTCI|L@ z!^~0YFTBJ!r7pCmhdi8L0w%yf7id5|2Cex45Bt0=AS`Qc>_st%GM2eiFurXA8)&vn z(v1_c41I0zS)vsNNO%C$bu$RG48L{WZ2&C)?)C# z>17e@z3yu@{by7YpJ=5K$JiT#A#la2nF;S3f; zDSR=#+R(v$PoqqAEtF7EmCxP>bl;Bz4el=aO=r4jf0+oz{lpsf`JTJPo^$7U#Lirz z*rL0Ew*_?NZcc0iwo4?}+q1LDEVUGyv&xom@Y2<247cIV0>W%XhlS_CXn+GXfhKB1 zlkLEMF9fYoKw9yoIFBEbwmtAoO2?fPtK2%89$@3BqiiYqJ(gJ#O3CSZtS5)QCq#Td zD;_7RGd7geKFUW=+l}kCIyx@xSzhNHB=BU*rOC2NCU#BeGr7%XUc3KTRu(22MeP|OfeK}h6Sw$9 znybF@fKbPT$!GsTdDghElPCbj>FE=w$Ot1AM3OO`xCeU~O~LnREf(PRSZF*d#^Q?o z>;6J)+eJi7qg3szm{M%>vS1BMpTSV>egNC$?5H3hAr1~m4Pbo}?=89Nzi~9tHbPTP z;2V^AM16l1wX0b{vq4OIUpnQ|fwiRQ8kTb|JSWSTROq@C$lwruW0aX#qk-YnxK8H> zHw!#`jFjBf=_XQx5f~Oa{a_)-ei$&AuTgrk;Fu{BoqrAlS)sby2vM(P>jNt|rNgh>#=@{8vwQ;2CN+C+RNN7dj;t?ykeFtlMtesE?J!WjV9* z3rus4%J)WW(aIZ8p^48E4n3tHQ9k8b_cpaLHU+paT&KQ&zhG@L^d~+YM|w33YEs); zo?4rq3NcCzHtF8B$38y_U>LwR7r2++O5|Bv z#$sZ13Jk+K41jjkomNzn@>A+j*ifN0KeIZ^$OW<*yfL`NGz?~QZUTT{3buT*ARp{p{y4spA`#PCdq%(!t zgVbI=WSZrJZYhdd&(h!^D?ghV6EWy@F=6~$$K`8cR2A~~Yg!i~=>Q|o`GeD>@AK1s z*Uv*oP}N%In7?%8Abm7D=%i3{BPIHITKaU$uuS!$8KP0af*C~(-(~u;_{URw3*`*_ zdq{v!3xx93adJg%>3)ftaFArB(~d`3U&FxMhmx>t4)wF+v~l@12ZgHeOpelk^&}8 z>}dr$wl6ypRB);DsHO8~b^1t@aoA=_md7tRbz;K2)jSa&9J7=@>-9u+J;6&>r7Fe} z1Q+j@6rI;ze+5kFhp}4Uw>xg0GSfUi8Zhbz}Y@6}@->kHZ+jo_eNB zh(V%q_s&vwdO2BFfGpWxY$G-%v(_2hc5_AcDm2Jepu?qKUkzVEKPk4WM>j+2dM@ow z8vq`m^&8RJX*`fav$SU)?UJt_67BmEgZxsQOvV2JJV3+0J-Z{8?Apzzotf{|zIMm{ zv!jhM>cxsvuURNkE@|ysfs8o<_zT7QN@VBJQPZ3}3lcCuLXJ*(Vf-n-Y6LJ=XrD6d ztc1sN0qxRH0G(w}9yLBmu9JSRk?N^2Appkvq5mzs20=JsXT)mCPH|p0tTyVyWvdgg zFNy5FhuyPMb=0E4S|_06JTmFIA{Aep?DP~m+37hq-Z^Hn+1lxt zjM>@#ipY5E0K9@)7GY0>x+%?jWiTetLN0y zEVe7E>1ZOYDLtsHRm(ok5FV|sc~;NMl_AU6R$a+j>o`YW3Kwcu3mdMoaHyt8>hvJi ztWh>ls2=G!J$JBCIlEm~jLh;lFuvFj6jER{Lt;v4rIl!cMM*%Xx!m-4piw}Fxh>dAv%`Oh{%GoMl%m&=Avcrz zha=aWj=EV2(W6)pt)ZS4nWhCY?9WY&>4|QM(#Dh+q|(i4CW0erg?KVggqHH&GZrj>>FO8onE`P~>Jp5+Qe*(xghpone*3 zu1DM1jR5gVrXYiMOB;=6>H$|z)2x)cOke3Fn~-#fv72Fx=vyIaCjK5x7wtYu7UH2y zLT24kfdm$wx}YVs4BMkNA>nVV1`C;nts)i#B-$)Wy&Zc9@e*t@B2jO_27`#O6(d3f zQ70iH5)l(4vDyrxo=5_+I*Bd`ZwZPf{sW51Mjs9JdX%( zA>}GQiTJA7Gl{)M} zh#*o$5avbfvtlA(tb<&{U~yv6rqjDcLB!Z>auT6hXE50Xt6vJsSTIUh@ClI6sk78M z1cEWI$09;bEVuyMDLC~9Yl2At^On5i86XGx%Y{aA|c5HRqkDqve$iyKc zNpBn+=_%prn2e*^$A7B%LVg zWb8%&7H(uS14v;QdcBtj&=W}%3^t`B-iD(fdyIE)BbuN+J z1Hjl=s|20iY}O0NVkM%7POR0$TLmwSrGY9}IG_Rm2jl^`t3p2+aIGK&TbgU&-=>v>s+%nlBRP1Tm*_D-F+c#|3O2I|S|Agvju6c28f}K4-G;3MQTwF;jYKaR z&B!iPI|xqze2HK&#K2`YN;M;x*q2|8Z3>7gbgv0;-zr;{WR!>9^6WaP0KdH^d8 zVS^|P-yVJh>H%cIL|dzaX{L}ypaNJ{SQG$?t3+72Myw~i4LU;%adVx$%IfB&Y8}&# zaGi09w=$Z^MKvKyD89a^kxS)QYXQue!~|#K*taO0lHl@apQF%FEBv{_QmUi6UQzI| z=)?FePs_XaXv#qCyC&Fd>TkX!Jb07dYA@b}{2r1=Hc~BCd~D6bXn%C-9nWb@rC_bG z-gs|kjzX! z{0(PIY%gm5;t%KYP}*An+WRJfV{)o)schzsDjc(KMa6}i>~*TltlOR8WL2ggffBez z{#Ok(s$B3f!*-nPLw`W;*ECS2V!nLOO_Z@re6@? z_~N%!=oLKu5cbuSvwSa@ilceTLf3Y;3y*eQdwYlAQZRPiL&yIL~}Uiw~k zk*Ck;F=Z3DM!pQBXD3jJ@sy@YK~m`>Mw-nmD+EQg@t_%5tU%N!(B=0-r%N9Ux?g=l zed2yPK*f&%-H$GZ0NH0U#poRxOM@mT4EL^ow@$B$T*xrLR{r(-BNu zi3t!xUR+Fp7e0N}9g8;KEcWf_nA$7wxdS&2AG+~?jy~~bP52Q56fT^HE^BP^L~8CXSa#ff_m0%s zZC6}6HP)1Bg1^|*ORw0rR){m%Lba~=sqDg2^A_GDY`eQA;%RC`>se$;Pwjqjv+yAo ziw2^{|F1O6x^s;(QIsPOiO ziw`Wm=*Nq9+_ZH0awvJUw`k)s$839Z8eDMHKnpdgNI!_BUBgPXNXota)ag8Im-lYP zXu`=S5$c#Ru>MfPZO^0JQ*Xl_y5~1(zx5=V@WQ>_ht~J?)cyqMjq72}nVEilkXn6b zP?ymp`-_q`P4pNDqG-w$F1Vlb33>@xcyw&=D&a#f06BR3^}(H zmpa4Q6HG9d$!ONIZ^*FgXohW5A>rbrQ|4ltnc-&SL?TYQnaLn1i~6Xw6)1#RaYqv5 ziXxZ9jQN8*Lu(}(;|y&?r~O2z&6#a>OJUwMIv#N1HH-H=aM#imMrqBWJqH#~)0=nh zH0!4=KCoxe8cAqqx@hkMdls*eAf@ga{AG*XX3o_L#D98Kb9~{dE9OMCSM$Pnb9BxX ztF#xg3wCJlJjwJ9RBSVgs}Y{d)jsv+BYv13Jv}Hr}V^v*_?X!fW?1+PP83)pHRp zLBA|9>K>+eLYA~uT=sNALP0$W%JdK^exfs(E_=km(v47Ih<*_Q(N989y8_cXbL!7g zQ-M9di#kxZRP5S**amTB`oZKQK!7WL!IZ zmDlV1z-YA3)M{L-%V2h6l@rl*#YLhM*Bk)7r3FnQrOd zxmsB9{jh6qm1n_Ui5W^N*NwjuIh zDv_kvrYJ=-3Ht>H;g(Gc*Y{4IG`XhfYM*XWShh{Etw(b&O>|=Qkl51O+fq~29J&RV-l}mAJ*F{yQYFKdO6j$mz5UH5H9OeJR^BrqBbCImq)JXt=8jaZOE($K+EIK zc*=uC)4OH&$jE7TSg_$lm9cgWTO&GRuI^0ksb9KiYi(OC!kyVp*^H1yoEYj_e(}0x zZB4EAu-zqDf##O$o360nC9n7I09t=ybhcawZ^`QQRhApfQSlx1PdCr&2)6hg!LYxrefHz?*Bo5hG1V19m@G9A zGgi!!*My9s)hES_vU=xtHuX18X`dVjHn;TkZ(r~Pn)`B9_|)yCxp8oup)A8O_L~Ct zaZhO$BP#oDALAc8HviN9vGtApMkxJGdBrE{E8L@FRPNkypFCxyo07Xs7D1pQab=r^ z=-#qZ9dQ!Nc%c_eP*E6~SNVlex(`>Md8}xULT37sP1M2%5WXnP6tILut>#!upXKY!LZ!58LIB^o^PRM0)Iu4MVKth5Dp^$Ke0O2O) zD$tNZxp@h#+5)BA;e}FKXiZCb3oS?6mjbc1`OnO*4j&=B@BjNgh_$o3v%531vop^# z&-46#c%*0p;51w2hak8?{yi)cPo5NG;)|lla(H|4m6aKt6SG&l{pcpHlmZ}-lVPS&85{;Y5Mk9GhZqr%A{xj4Dn9cH)-#oi+0E$s3k{i#|D_Sb=hN>&lb+Gqn>Haxk@WWbpmY z%4P7Tl=$Iv`Fw}A!nVHoiN8$V^<-b~6T8nUpEbj1V{|NMseR-A8}GlouNha)9<6Da z?_BA$Je40~ymOKN;cz_&|7qSG7j`!E?7D2?+S|RXPN=Xrq}D};-?{se2mZdW*}r{Z zam|FybEnqGD_7r|4Mfh_w%kNs!`O*FTSQRd1Zo{|Txv5Gbb^s+Ac|xhTf`O_DWTFg za`NH#X!rQ}u~k=HwQ6Zg?>RU24-E9*_X=2i?z!io|A3e;!@?b|&^~8fEO5)?qix0UoTI_``5>_HnA!vfJrG-6}# z__6%cH*b``e16-u=Yjb~;Cby=+aKO_V&~2iyXIbbR(mmr^s2`V^r{nYojCCp-1w&a z>{B=+CNHoB>wK0 z);6*cMUUX2|$Yqei7s%w7PUQH4LMqk(gY+B9 zn2C}hcm}8#3?<14jMkZu2w4(+7D-DWCDmnc9+28d(Fx^RQUw(O0RxZ>5zK)U#vDii z;wvF34*ANp2`ULOLVz*LtgAvBV9h@FASRK2A1TA9oP-G`ugnUNpaZ}JDYNn{9Db82 zd`Nxn@YtFnii-G%Z)6bjL5`kV`(aNyDY56Kldwmj&d$zvOmeW_D0!Kl!KB2zmd`_i z`)7(#u;<((TU8v|y8dfXY`-LM;}*V2?)#xuM-dgOC+@x(5S zMw0vP?GDD_flZLuzJoCg9Y*m2Qw~XBK?$+qsx(o`LU~04=)1gO%J~rhBIi$O_z{@e zP`s>^o$ zAq*DGIv9}$6MS`1i71v7Rr86@oMqRy&Fo!H-uWYFJUfTP{gtcu7Iwu|7kd+u6@7)G z-e&QM=4#-x1xSb`SSCLSR)BT$;GEU#ez=;sR(@*sg0}fKz5Ems`#~qPmQ7jLcJxj9 z+94nPM^M|ja%JbVv(Fy-ApH^)*YB7V@kG+^f@{H-a=m#o>i z^L13l(o;6>Z|rZePn&NTXe|y-^>8@emsO9oG9(NI)f*T0$?v0`HQ`8=zRDd?d%xLIB+O2nqE@Nq-+*_#C+VvjV6VjP2Ityoof&i9| zl@;7PM%F!mD#xo-8-mf`Il&;nma%exo+UslhccOUA#{P>uGNy2G9$W`-i>amK{vNS z^ceK4(OFTc#>l$o6jhGu63$_GDE`Ely%k$Frsra-v%;Jds{%NRo%nlTF5!|9IWit` zz|1RlA4`V$9V7`0GSDlVuh($y+A4lc^K!Gb`_=r^H@@gq?@&^Iw zYK&$D&H-ItUIWOP=}@IdJ_7c*Dh0Po-pkHto^hbGdq(pXLCNt7*=$$xrR2ds6cv2{ zxF_*VuK7}aJTopRm|J!{|4~R#L$VKsq~~J_8huI39Aa`{To`^}I2soLiSCkn~*E4ZCWUitU^n_ih#+p}bL+c_al zbLHQG`1fDsfV*s#F>t$n48li`=GGu^>_#KCI=>d#I@E>mTlfwX1@PVY2}t~-7t629 z|GuNI=j?#Lup&Bh`Yk|r#~tZAF>b=~GoUN5jo%AZ;Tk5{`{>#^H`mwCvr5G}q4&{O zAN}k8zn=kWVep$Xqb%&Y-~<{Uz$uEp2#sMr#SW_&AmS3M7$;O`cr;4TK^*Y1UDT&P zG8Qp9i-mbX?qf8fQDlG3IL% zSqbyGKjsf#4@F83l21pHBaeBE7;Xc(30}eTvH4UKL7u8FRYD4TWQwfFj=9%W2bFyi zcv#v4F>+sNeSSD%DwWAS#$H`lDswG9n(C@c)#qfB6w+pAQHxc%DC6*sk#j7uT4j|H zt4&40@vkDydUo{!gz0#)12MAWfB3lwsfB=hMe~ zZ@#$~i!ik_XV$_FeaI;3s;Z_n>qkNRp}%n3!eg(E4r`$^8pCoS_$Dw zER-@?yNU*B#BQvCus+3>;v2PC;>*Txw+tsmA*=T^l5Fw1yPU-AjA^o(2~(&J6eyS9 zfmF`eQeVoTl+A?af+Swb2mQdC#fnXzi}KG;lXu>)EYoAtiqVATgPyEhNw{FlR4KKT z*d|F>xvDdv=2xQ{tO`?hBu4bzxD|W2WuY;!W=I0I$eYXjVR!Nmy9I4#t+{P;P1n}i!dTGl z4%QVpoK>|Ib#)cBRZd4y9X=K-tlipGv-!4FM>kKHu=yw%{}t?67l}b3%hWmBkisKL z+$GF;xRjw>pt=HQW<1$184U*c=UOdD5UR)?Oom8MCQtSgl;0i&MH2L&TA+VAln*m5 zCNM&z1brE>NV2q?g@nvt1QKqdD2V|s&sl&nwk%8#$bN@inWaQwfZTWhlTr3yGRhS? zn6Wlrbw0K>-wx=eDJ%L8kK21c>=8uJL+m{LgaNZ3RcnReZDNDo`+nSGd>d5!_+abd zzOL5d6Qj!*CXUMrK1J3KH=-g!oVJYkF{l;p(&ZKQJIdHE;F_TP27@5Vq>Vw3B!70A zLT38A8vnJ3>d9Gj*sQMx9Y#z@|hsip2 zD5hQ}q_}P9gN?l%_QuJZ`ZrB!DA)%k?{M>e)xX^R;-NiUAnAB&aomSDmXm12~beaIJq-laFD z_~Mf_A?5AiaABKrhDZ{%*|3Ev4GMhpz3+!yoX*l5z;5rp;^RPbyx51+fo6-2bA{f& z7awYvf?9`GoDLGLD{b=jBOiWvWS{l72MMHxrvyoHqI@1%y*nhLoe~ek{9p%vYu!f< zUTIs|ike2{`c&+ySep$hzENxr9v$gUk*q6}ilH9Kctpwl1l5u0AEJ_q3lyaGElr?< zOcH~}?ORHt^dOSA6wjxDq14iSEVU1{X)Z=AG9p6k`$vV*iSHQ*_PqkX6xlGL%JzQp zrb%UiPwDii!92B z#X^zeXqY&@54+m2sdN&37DHd*kAT*r4+Sdlusy^XuYY9vTf&(E(dbQk_Z?U4zDoRx zgk}Q;19vWAG_Z{{vhx-n=0pYR3~$K+}5} z|Nr{>GvyyyUyKND$#`3i!eYX_(pfPrhu2Nz(x>v$^l6TtF8zNaKRnIx;bq47skm+g z7>mkhe;>%!^k1VZo_8$$uQ3jemHI!GQ6B4H?&sw77<6<%5#aLNf$<9DcYHHXQNO3Y z`hWkG{BL?`)-NNkzZQTD-#{Qb+}o%HL~Nt+?IXUd2J?TVcYojBcM5C5XdJ|8r5BP@ zdF4r}_sjH6kU*m(=D|t)AM2xM=ut!0Gf6KVu)Tvx(y!>0QqZ2BtYejuuFQQtfLtLD zgpkmY$nuzD+iNpM2Fka-5(w9fI46!In^P>%&wH`W8EtD9STd{d-A;M0*;e zifKh!OcLpbNe!m@bJC(09R&Sj*XHx@6e2VD90V60TPips-~);XUQS0NmH;0JW2;~^ z9F1c`W;7mgprg?ysQCJVh=WDiI-dmchjRZwLjL_E-26TLi9~;@$Lmd|Qc173Cx!Qk zFf<7S69b?pc~AorUi3dw!vw7t^bdGbUX3&9)S&GE==W-|BADjV~aZN6xnv}ZW(i~Eq6gz>hgM;SCRB$G!zOnAY7mri*TINstE6`d|8QmNF3M?fNx zOs2d;1H(8|G4n}|E_H<8qXG{?@DE4f01-bvnac6j!VGh2zU?-p*sd@IM#hGP2Lu^= z0nq<3!Z&e5xxNpV>saNIQ%c!V%CnSGB}SG^A#+VAr5k<$Y#d%Nh~(@U^uL%0lH$f; zjdmm#F0Td5SO?)&U9HZgldE((@D@tc>U8oBupb;4^YAf}B1h1Vl4XayLpSzeQZ6GZ z*MDZpMdf^3a-6!%SO?);{BY&I`_U7~O~G5JTw@)EGnBHDz5QUnTH-3**oSesW>8l% z5oYeN_8QI)A&zyBiJYm{!w!Eos;Kz+;QTQUQ%bpxp>l1_Z?6#?6XIA0QMpcA-7yZs zW20X#%7F_u#$h}bq5cK8lJ|&9r3EADmQhDia}Vn`^k-u?78&1A-+*(o_x#?S;B;@B z+;avnG7);Na?k(43k2t$?w#O!R-$`u&6V?eHa=Z>n&wpP(2Cqxt>C5Rqx2}Ye5)s` zk=M0?Xxg4n85#2U!4zHy z?N?x%`sqz(bHCXPC z_aNf{KQ}za}--K*7MVC)=<*B%t6N9($#_rVs$xPB$sFlj;+&^LXkdHKHO%l9!~s-|}Z z&}{F%rI__`>Aqj~O~)DK|5BuN#gLx92H$Y{bow9o(&g!Ul#@zGg1kk!G9$-k`z)1@ zbis{8B~g7F^E%@&{#szAF{FYDVv7C2+4AB3S2jz;E1}WxV%lWj4Q7*tWdp4%H{WvG zN=#ZSQxeu8(FYHIeRmY}|4{xj?{{e}R+Bcsb;Q^7Z=WA4HsF|Dk`4c06j%A&A7rs) zDe~RbP>b+PAOL?As3R*|A8y| ze63fwBj?<^;rhF8*th=P4H5ShptpNoN5{P3KNnr_fK9KrJ#fLIOQ%-~Lgn;Jf#!{i zW^8H>XgO(I>*@)+-u&#yoJHH#&YBnS&Y8J(+rruX!@nyBehccjhrgQd9DNnGB&3R` z6FKuUCXF3Mpfmu> zxte_XGQMnW?lx$+9`W6dT{k;{@l)*m*y93!F8_nNX`Hp=)ml{-xSSeXS2_Mat6QX? z+MKDD2Hgf#6>9&tb<-2y{c>#O&-fwYF82MalnlAjMBju-mmK<^)kHB0f+zk*g;(V~ zv{7c6_V2es!i@0mDlt<5e>lJ?5D>mvIw1-vQAi4+67i5p!h~8GbtAw1cIwdkhf;6L zZ-a`r>EzoWHR>9iTt}*-dUz3>@?;WJfCm6(F*jw`MetaR{iyL=IhR^NZJ>5gmy(s& zd#J~V6(7|J4F{+m@w{|6FOBk`_lDA_7Qxf!IpguurP=(nC7X`oeTlG>jkF1vd(7xx z(mY^B|I|H(G7lkvk?t|4v**bMjJ=!L%9OgF+oIcU!WVptrq$`uZwYoLM$iPCNRBV_ ze$!u$IwX&=qi%q*QUA&PB%c|_pAIGQAAS&xe-)8Bp{~{0sWNH-mew-9LA-_Vgb-{1 zFv4u8S_d=HaoEw6$)ZQZiQ8)?Vhj!L$p`n(XhCY(`;B|nQZ~V=P6v&sMSb8_;J8$D{l$4 z#-&XL)+}0a>`$idEb75!R4p}`+Je7Bj<>}m@{7{pC>koYs5xw;QVtuc7dnaRYP0|U zY8E>2#4E2o_R!n!(x3e8Mytfu8*8O1S4E)0?r=$KpV%N-%W5t-_Tc_X-wlHg{jb^z zI#cE~&-8#tUeKKX+(x1~w*oR%)+oV>*88HWBtV^qr>w?O{6C7S2Uz~}$FhQw=2 zNG>7k2PFy{=ZN(KyLDvzDeN3;K|#kl&d58OO<*DoWxy)ze z`3)+^=&IGc)4@sdm5jsCYBVxnyOMxck6D5JW3NOp zzLQ^}i!F@9$m*3ux_9i#<$U9xrEC~e2iP+3G`K<-w~_$XVIm5}Pg2D0dLuH~&=Zg- zOAu@nal2?-Sl%j0oY7w%E#x#-jxK=ZHzwY>Yj_@T+wlj%i<2?BiYj|!NAOAV790sM zqw%KQyXy@WpmBkN_f45)92}8PK3VwlV~VT_PaWg-umhBiDn)guL~T!794sBy0*T@4)%W=^;2Th|FW3vyNlPiKv%AwNdq5{zS;}a3izc4AXOId&HeiPdcSWfV zCV5F1m%-Y^vN=SfNj*XE*8-nn0nD2De5x;nqUh#GsN<;j;dMOX^im1urjzLJ7?aGH zDu()pSuW_g|3>{qtNof7c2L&ep}(Fy>jvGEXW{r-t3|p0J#A|1LRVSXLUx_x66R^LnM!_p>J}HsA6^_PFKwOVDp*{H6?b%quFIumldITL5G-q+ zr5;qU?vo^z(}=Y9Ad+;KQoYnRYOl%=tgbxTtq#Q}miV}Y^5jJ}8>0}$;96)0)6zg*EG!EZ2psuQ zo9zo=anEsIUsx!AE(UC%dtUmcFXS&&I2|COWAY;^Vh)&TgV*HUCjC$4*5IaL4+Pp% z6zK_oY$AE#xC11A{{0#OCrkw5>^hKjV{d~$*O z6We-)G>Xc*<$c2*hR1^*^pOmab||9W-f5Tsj=lv&2GD6 zUV)`JC{@nAKHzSwE=v>@oMqPR)_IIT*V=niM%RY;d-h-+t$gGQg{C(%k=gJ!OOKr0 zlFAxz$dyQBsIXBYsc_LKKxA3i3y@R|W9d|gSxXE{O5iJ`R-zwImUm>tLnKWb5Uz5o89GOdB; zwb1H3c|QmM^8+6-A+14cDEsIE`78Oi@c!4`g<_(wy{)R%7pe*C-AjW-6LzesU*6PM z-t6mE<{=jQkkNZl-8#Qt-PqIDjsE_1`+Hhu=;3wiKIgnECaqdMjX87G-h16$2}aj! z;`;W+j&L`r7eKn##jJuiM+LDDyB#mXkRA~t^B7(^O@i(;B|pM_WzrW6B}0vAD%561 zX&R+zlqNWPOw>QUaEPiH=SN!xZI$)D_sLk=t6*di^lXeLYxDD%6ebj{%f%jJVjneb zpc?qY{-_0GWMDxT2QX&>mI*Bqri!uQ=EqnY3IPyO5EjoG*IC&SJkJa4djG|}RW0)Z z;{xZ*o_D?{=&1^JuQ;p?YK;IwSRAAeujmd|q2uSz?>-0Rn%9!}Yc*h5;0#n$+8b)R z%jYZsPtL}tE(+fqW|7#Ti#7y1Dm%x`TD)XVd3Q~Ny|NqsL}HZIjRC-J|FYIZVdtj1Ra>x;1CUFy?oR0eeqb&+2=e% z$~&q)yU&x+xIagyW8NZLd1w0iEzZ_yoa4bRW|Nh>@_e#OrLeVvlUDzJp`GK)pdB;>@7<$p`HuiC$DPtZWNvO@KGlI(6RZ6DEme z6}VQuV!a4^0I$V$D>>!m6uV?)u5Q4JrB@oW@DT(bq-tbSxcu>02{u0U6G0U?Z+dk0 z7Aq9wB(F8-6GnEv{9p3lX-?24EQSG{8SLumJ`UyqRLh$cqmmiEds=*T<@xB* zVHJ?xp;f`(^Pdl2LyuE#hi(fZ@@u3Z^yHDx$ECtWQ;PW-%7?Ew)AK<*mWg&zAn>&# zp3hvJR~so;NiebjfYJgZ3kyaTV2pQ=X?|^{Ax6G~%2D-FUc$(w<p&={&Y211-(yzcTTRn`)<;I4W|;^f2$aBJ}s1dJd5rt`Qknxu^-C+ z9(q4Lc?uX;1bzrU?iiff$UGAooQj6GSLCmN9<09puDifoFz#n+TbX%j92DwK-1#wM8;kZc8hOXTWOdlrk!v(g2;SK#-^cux!keFA4IM5Sc;|DiJ&Mc}6jWbN6Y^+S9;oR__{BE9E~mL0O5f<*Tuox#%@ zr7@25ogU>&ovbe_mhk0T9_E1gk&^W^o|L?To0L7|qZK6_;V~BcuGxCxX>ty!CxO z5RFNr6Q(Vo7)uyI2+byk4`} zVj6{$eA*oOvW%srAmjK=LgF-BiGv^}^XxTk(ofBo)YkiHV_?8ZBLf=sjg zd>Uh|;;ZU#ZhTc8z8+pXv@M7(>feO&Z3xl_g6JZ&vpcw9Si2~?|HzQ#F??AShgo`* zUoG)oRhAfrd#mR7_wxGouoZ?g_;uk0$|17mLn}ybIft%fKJO_U$gbDRwS*Q`$w}|c zr$9yHBq|YolD(KJ#D3Q0AO}{Cy}<)H`d|8_Sen8?S2m5t(62RvM5Ckq~2E?EaN1Epf{! zbW=IyvY5gAqdUm}}cfVfXIXhj^SM|VEr3QlwhK4oQV<1asbP(k8~-7Cvm)go_7q?N7BqPS)$?!|4HXXLz(F@M zMSJsH3`aR2f>bgIW~Kjhib5Ls2gFHH$qiSGn38jNZW!^ZQpM{~J{r^vBS(snt;Ad? zI^>izQIb;*(NYSNr8ld7o<{8RIsDDh%L2u6!tDmB;y@tn9p)4|V*DCWCS|x#2Z=M6 z$x@n5mRdvynk6PmAmP}4`Z9rg0)ap=NV(l|qFDaj_b(IiQ&#N1F$XwfnG*Q^0p(f0 z&$oq+=-hYZHKhf&ZTjyt8Hvdi^y|ZUj$FCrjxFn{oZky-NFdo8;7(Dv8@Eg0 zEEz8q#6KSW!){H1?qWTFTDGucdDpw5aH&y}FMC1(H3n4ODT;mz=?^Ovp7pGViM<%x zFz}OOyaLgS*IVgul?EH?vTIG4rCY6rN+pS*h3L0_bwm^{H%b$Cb$1l77SlT3Y|_Hb zdxOE*yF9_}x>&e!X7$8zRRxyk?~sg_3u42D_GXc@7-nlsf{}K_TNjqCxWG~toL*HO zt?!9X3cA3GTRw0-j9cSjZAE3oiJo=24njR#<<&nx)lnU4ov=uKXM52*Yt6{u0^sc`Q*f9H zXPt-RSpg=Lk;5~g;N`&Xz}A|*qVRy@?H}C_N(7z8_Di!?ejQ_dY}$91U7k!b3mW>GYNjjw8r7aOGob3_51*en?@!+BA%Wv)m- z4UwpU%8R6RUqA)&S7A!B-AxfWYB9nxQeP#KM&oKE)6HzT4rk@yl7~>IATf%-t89NG z|4gINiNBC^?@B@4IR0lE+s`aItw#RUyQI(k0r-_IstTAU3hRv0d{O8%N^qjtY!>B( zp@q&x7I3d*7A)!KBxA22&Xnir!IAbamYEF;_}{$+Dd>_vvI)%BaRj zd;4%yS0C7zeo1}^d`lKAdC7Qx#zdX5TSNCt^tzWWk`v%AdCz~JKhlv69k>ydeY+s$ z@egSz1Cn+M&}e%e>KRf%vRfT>F)8kI_#)u|K7f=U<$$6i(xk`G0a{^_rn9BZjfZsR zz4)YITRTr@7aVwOtB13XOa}mL3&`(#!ChAdCW9k0@1Bj0Z1lf?;3+#Ur*XLp1HF$IGVpgX!?{~3hfpur|&OJ_kB{+8(>)LPD>DVP3ahB`+kD)PR zJ}5`(GlLnv9!e&YX{1Wa@1PxY=vXr8MZGkAv(pKC(XXI`y+qblR+hmclhNRmZw9?i z<=0>|$q%R*uzp*AiemnX+A%^+C745YOnf3Rye$y*hiw6iAALq~Bn4R_p@0QDC^~B6 z(TFXEflxg(U022U2?%LzD~ET`)PQzcIp$jN#_ijTd}QXfi|5?hU3RNDReGs-W39%_ z>5N?)-%j{$ol|=2tew3rCp;BXnitj1(r6k(9W@iGYCO`Ef|BOi&hiO7+vJ~E(G)5X z>Ex4Lg@>=4a?a#xJ9BCf3{j`RQxR|ofZ~pO0T}ukel^4wH=Uinqols1z`#NI$AD%H zW|zMTeB+Dw96AmF`86~>Xaq-bm4b^wuqD)ZNo?eIuu9Be-jvKxb^+Wh2gkVTOWmfREs<6p@(we=^m8 zsqmQempb|9I-@}^r|?Q#iukf%x0jCe(_phfi%HWA;$JU-ars)#q!+ZdZ{CszrdR)~ zdb<4K!>_Q8W5G+u?iE`;K9?lTOBOM{mv=0Zyt}^4zUs=Gaev)+L zB-xQk=L9LTbBZE6=(lIATIWH(|MLtNc5A@? z5p^Ec8o74zW~;Jgtfl~4&fEZ`&$F+qeZC!g1P6(cpIGis-{*r?4DB5bh2x4G8V_Jz zLN)3Me*hT30Lcj0?E>?WuoD+G)wOnZ)J{&{d74Up?yB$JKB=|JDTYnvU})YNGqlaF z==;IJb9deAk<0G~kk^Qx#q1$aOy!qYT=4JK+-Jc#O>q2yHJh8xu%E495x; zL|>Z~lY&7WFE3Fcmpd4AyF&dTmrQKD!0QSz{c#grWwDsT+Q!6XC0&+@w=bNrE8q&1 z6gYcpI((u_tL62DR>@V>S?x1vfh38vpkaV*<`!bLLHC62Yyb!PUC>tH?P{rS06jp$ zzi9|=n$!i0-L7%~f-ZPTK@h?%iG@C~Ian61XtqkW;@Z+?k2BO&;pd!IVT-!vkH-B3 zi7|7lIE>ksH&TNS+HFJ|h7RlmL*R@t`7cyxjMXN=?a@SI4mI+}TTj;z>*HYaO!;q& zMxaH}3bZC)b!U}JvKH!jt=1*_I%;~I1tlR@VAqU=w@GAhvNl(Q%Yx0KZ((8!guw!Mi7N;|xyxM)yC!W4 zHlT*<@?sSF%vy$)*pbSq7StN6sf($rs5_}gsb3IY6YLp}SIHt6S}lkKM)ZG_MSrRh zFQP8rTUgac2xYu`^LYt6sS1AS zCH)ME_k1`&z%XqQOms>-wvf1_EZkur4vSijfLe}G3wSpbSRy%0p4dVj7_I7W{I0HWjX@fgjS7fsmt##Wj^E){pUy?{bo1~jqeueyZ z`Lio3Cg`kI-GuV}FtooMrPIctuN`xPS5<`MT1|LQ4?%<$pS%sTepn9;&mIjVl44-Bns< zds15@*u~P2yXlf9cPLcU&^00A0tTC&uD?AJxxFq;|731O6KgWDO%)4|Ju1Vj_1;^;2^ebV9-R=m3 zIcJ?U)VM)@Y5i*8UA)-i7HP0pW2hP*1IM(MSZ(>@#g*e@7A=^w1PyCdkGaF`9pS>F z@T93oQGx0H1q?V!@$QB~D(c=_`5ufXT>56Wz`7n~zsSmO+~EPtWX zRUdmVy?%T=?w)Im=t?FnTsJEii3DdILz}4Et)+kQ)}%>qO-?WTbX!w5XR~qLO`AT) zY2Iq(QJN9t&GJ8hY1)Bx^W<+QKRg><9qN9#8{cG(Y>c-Coe^+AzRm~jY`uP>(gI? zZoN)t|Dwz(9}^)c2>-)QuMy>GResD{fL@`=R0&p_Z9`{)^etA4sS=*&rLU>XjM2*2 zBxU(U@OlrnAlPWmfxWQefE)pKK=xu`fW&aeDC5f>Tk+GPhS%(VUaQrZpDC8;IB$8@ zBgt!!x^4A7E%F+zJOpmh{C?OXH4Q%S>kXFQ0{Mr6U@W0$8v^MtlzjoDV1xGo{7>^0 zqcLkJ9Zxa;MyXD+hA-7J#Q=leD{S^f08?|CfPnM_U#O%SDl-Y{*)1SM_~u)=NDTf8 zd?Xh>^8je*>;zuH=k$66P70$^0wD1vf*^RjP9GW}2IVW>klz?zQ&JL~;2fPp@Pa{b z^T{+=r)3$M=5%I;Yn1#SF;BXjouuz!v7CAnHK>;x?@TDeRxiKa%Zig=|OqxZ`@T006KsJsT{LMft~U z6__JC>l7)U2!vf_^WZilWz^0DjSle^NVcG0`i z7x%zRPTqCo$QZsCv#51BFP97$Z3gGI#2-R(5tfcW$k&Y#4@G?$AJ8|d$_bN~Mm^>tw{GPWReo8)X^!-VC*mrFr zI3FYZWg^+g*G#kup*m8&G;r%hk6d)oBk&Qj$?zB{U*OOK_?Y@H|2YuNUYG}5^05&u zh{S!vT(ziQ%jdz^aycqTm-j*)7#xX|a7ccA06vzU(GP0IicjulFJbRN`UH-yY{z{8 z*tsx{Gm4>iSB1%P(Mv>cQ$p{#ghjmpJ5D2MQ6ljWNQR`*{M81KxZ?qw#1Y(uAUe$8 zGng|YUczGE54u{jJsK`543%`oHwrJVY@1Fq*DqbN^CRojiW>O?`Lpt>gy>lsZ~o~0 zw&>CY8k4c2WWgIRtgD(bCt)q{a^fFhe89$;pK#4*E6ROC@~z(-GTDqQ548cCOG_8| z>q|VlkAq!c+-=Qf0Pkz-@>=H1v51By%Z4o#g%?g*lGJE!hCAH>t){w$*ZEzA0WDut zsL=$5MAw@3PV4w;+M==gqk*31&DtAo;QaOU)A!3xPhFv9PsqK=P&Ce6r>%Wy*F#fX zl^%~tUnK??R&`lh2@b6Ct~6w{Z$vsdVYdzuD&kn2gtL=SeF?V@9y77>fksuSE*1)- zkH!QDhaqm*80J%8IbLaN4~>p9SXU8835MNsO3Fcbc-}P4qJ4cdj8{&+_DO4dxZ<`4 zD?;ryW0l|Y;#GoYqfHGfmL$yNU>n~ zf;7#C3z)t>&Twn}YAKo4q1 z%tL_cz%gK`S^d}^h=-Lb8cAYN)Sn2#pwH&BSUso(=|{R9k1XyzwrQsCfvHpy zGye@{$d4Mm?c-;@@mZi1!1|>ZT+j%;@46N)+qkfj<>f^~>64zis0YA&JHNsp8%9%G z6^vSZQS8ux20k7Mg!oylV3aL%Q)@+2NnL>sfK$|Q4PXnRYdZFpFT8Elq|3qG`RzCT zDLZhKj&p!(egP)yDi-uED7a5v-mtB20tDlk>fyFf`cwj@QQa|Wk9};F9)4vu%6IFG zf=<4}sL@(gyg;P1ndPKT2a;wvarc>G+beh~VgMy#Iz;`I%89aqcFrrX!VE8ju3Zw># zA2Oi1lzLCaEQPnau&^HR(=e(^ z+gN5N8lS=u3NqZP3elazYG*fx=UtMlS+Zb4%k0^an{T{+^X8*d*Z2A>SFWA1V|iWO ztiXf=@`pv9wpc9KPEViq2%ymnGhz4c=e=H^AMLRJ{OHg@kH_zyP?BhmEZ=<5i_FfJ z>C@X{qMp0)oDJh>GtC&X{`>@sT#*haUSPB0t zeJ+fqcMN^L8{SBtH}o;Q1G{xAxU=jYGT#>>NpuF%fhejrM&>6*-LlForgUxv%8~?B zwqSLaEG~qJjSvS~V()tF$y$uv7;vCCPreNG!>F}`54;YC*A9+*?RKwYXt1ogX+d){ zGb>R!y?H_Nf#&kEW-zTP0e`$9IkYNy&J^BYG?W zDsO5+^C*_Pz9pO+Cdv;qNEHZz2Z0f{=dcESr;P*gENxUn`)gEYzp&14Z zSmQcXDhvO#Dl7$d^9B)U z#}&}PU+6A^Kx^T39HZwg09c(CD*$$_CJco~5-0Yp1rtRS-kd zg1Ml~67u`pb|Zuwr{|4y;jEb5R%WMxr^qNeW@#YcG&U~-IfjL>q>3$NtPg0-bg@TM zCRBwPBL`@!uIhrzDja$PM9<`Gv;#s5w3|vm`^@xRw4T#KT1V4*8r%c57LL`j9HfOZ zQLBGkXP`NTp#??*W2})jX|*g3fetc^M$iDW0OM9WI$?pu?bLIcYHKTZ3smjs-vCpgN>Y0;{? zaC}Flo-2Zs>Jxcg!!kMXdnsA<=A= zboFPIHnns{$LqshpN|%RU~-w=%o-p8&VY7JwBE?cbAZOevKl>VUmdN%FC5CZicV93 z+gzmc^X2UL^Q_jkySJ4>rgCRhxVcy~fYv#l61#1JUqgEUsI3F^!~)60GYQsHYSYr1 zJtm|;@(mLKXec&S6hm6C1x1qG1IkJmlVETF!NqDECOv=_V9;8$0*6XMbH$9rAPJOV zOb!4HX33;ww2);Pj^=^T>@w(Ei?uXg&^ErKh-$YhZMu-{0x8vb51u#yJgky{SX6Xt@Fn=M`wKqHaRi z^3%F$ey!7NFT!-*YhxYOYwI?>c-F3R8z^#@9qCxHWApl^Hy74SDTUAwM?7x5NsW)kvY0@5ksMt`)l#k00_;^34AB8>^v4`y zbSTXD@GR|6=z!5!f(8mN8{+XG2mE}D#q&GbVWdzPUqwcfR#59<9I;^$1Z68BG{8MZf>nuNIEmc*D>?(4-D$J@ZZ1 ztV_2}+Bv1!^bvgsXszwjcTXz7s}LnKCU-PP%RRcCBlNHmd?ja_vGAH1`or-0n$~5! zaM6d07vHwLLofpNH}Bjx;h#5s(Omq+$J75pp9{cs_ewu{+chcHY?J+eeH0i95)GY& z(K6PFx)+VK0~WqC79OM8ey!AUtbbI|)c|uRM`}H^;(LXeh#`)LEe3>J9>>kn89PcV zREW1Y!ZfR(&ta)3h6x!(j6KKP7;aoNqo&tWSSFedmUonvRJf`eHa*nSk=)oGnzo?% z&{=kG_k_sonzGuW+Q@%D*!hEv6TyZLkL>N8(Rr;r_}oTwx4HvZyaV2=og1rg>YY4q zHoGh{oIbxZQ5j!cRou3*vt>zhP$;nr*3xjqTUqICu3UO)aPszpM?UN}Z+s50*LKe6 z-K*@#gLsGN=M_kIc!k8Wv{4--;wobgi4%PCT0&DC%CmCD;+zhK4gR?~c$EF#r49D5swLbYDMy*C(Ztpb2 zyXMdrtVr1JWLjr1Gk@Xm`>lhIp$GK1Ohu->EjDy*Sy9mad8fQv{*}dUtFT*jTG?H| zYwca^-uQ~XzM)SopaEP;jaYY3G?h`FnrFZ`#dc{TGlK!uVw>IT54lbflMIV~Qw*{9 z4pD@d91=?|vFFl4E>kEISBCws1_=M7VucFR0h?qeeoVv2S?c0aG(f9tZ6x*^$?}<) zAC{^wjTHU4@@s9#m6}-9Uo|o13TeNt{Bu#HwB8J;&UGNUt`ksZx#!aVxb)Kh00X7< z(mnWsOO>)RxU50qiK_~` zfzxc2Hp}9(QT5&RiHS=ml0TH*)D4r}o8$pf8ag2>Jb67sn@CCCl*i*OeNZMCf1tm6 z(2Ah)QMOA2w@u<5NcaN5DhCh z&Mh1yG1e?`3l4^`3n!K{<3Zvh%*F}XJi+i`i6gGV&Zd^!_Rgp8+_ps7fQ^hA2(a7=X5$VsO@1*7Q;8+7|rM`s8!Ay49Z#gb#&Hj{N@{js{8$vy_gbF52b>5 zT*Jc}M@GO%ZAp-0)S*s{l@Li8LwsPzVIqk$pU3K-lwW?l_t&S^9{p_ZK{Q{6mdlq7 z+>R+`x4r{|Ty1?8(%9&GL`m-TT?mwYz@#%D;BL4hnC- z1vp;a&B1Zwif6vD^@fv&B4V*ns$iRODb=Q3u6i&MbG~nsAOEP>mP8(!23(u}1*0=3 z$r%pwVEs^m|D%Qo(g(4^f*Ox0%oRI1yNqT`bkMp`PIGj5i zHVSXp%wp8~=PmuXVj<;1x~Aa&WZ&!P|f)F}$^yO}A}WyEI?uczUqORQNyr0TI; z2+fT&8ucAkLV?J(mJPP0zAWrfvr;xZ(ims z&;`!vy}FsB8B-Y$4R)3_Ypiu9b5X3kw9p7SQLAI2z;gx7M$v4K{>PlC)h+N43G|#r z(1`xB)?jlrgG6%3S#`i0uI1=&5+8e`k+KGN84_vXrDw6Gkf(rQtpS9(o9;I1~?Sx!Q-CPV9OwHpeHnitg+vOrVP*xOk;(P;2%p*dJXR7!dM_Fkacr%KcCk9>!A@(~D33l{qFO=^ zPys_@NV`;2${;yL4xtlRWydNyya$_pXWHyy$Lwtytx+iAEgr%1MCG40ZkSzNeWGvU z3Zx_U%cli>FPfWH`aZaaaDPs7^`V7@;|;}yyZ$-kpKKCb zKK~@I`!=JSW%b5lfz>Zx+f(9yX2r6l?xH7}dv2I4I6gb1Y_93J_R`+g_8m{1vlTGO z2Y)avah+g5y#O|~v~4vCdeosB*TWUdch#e(qcXJh7}3+6<5=UYp7d6?ORROzdAws% zROE{5t2x*7eA!|PrKKdy7f<+Yk*4jzYo3tDq|7D2%%g$QVrN9=+@mi%fAqjF{efS~ zx20cw;(k!VM4xyy{TL{@-@knM!fy^9{Dy6j-9z%(tKJ39XThZ3q|4;LzPkz>83KRt z{6>COS?fcx!%ifpZNO_UG!|7kiYF)^Xe<^WHXi`=am8?&#c8$}#G+L!()$?!X*g(j z!fPV}{*XDGWOsTOE$>~md{(pBvROXzrsQ%-$3XeolBvrVtz0nIx8RUA%ot z$BH=%5|!NKi&rjaiTLa+W6-##)Yl22NawlDB`jwZH9S&}gzDI$6_<3taLdg3^SYWW z7Dp}ToZh`-+cn@P-P>BcwBRYw={}Ob1+Gv5c;~nvYK#@r_ROue24;3uT-pz4NLz~P zr)`~FXpzP>wYAll%sV?d>!fL$HecOQ(Aj;~qPde}CKI#N#XH)fjm6M0^Wr%z9ua*$ z^z~Qpj;5**tU+Rn4aqKlV=3ZEZYA+mM8X1!&pxpEEch>I%P=xAf7?2{K^{tfF?%cX zo58Zo-`3gm%-LIkd*b{Z^1py_$NY(4@+s;Rn2LU`YHy#nV@IBxi4n?b)cBw=X-w^> z3GQN&Dv@c1WK$tBeek;iz2G%t@R=U{u7Iy$GO=3L;cTq=WUS(8%ZfQmaRGBwteDBP z|2qpipcWCdVP;f?kySqRouwTmzbk8|xnho#-$z*+sF2HQQNqqFRvbh79RX@7>|13} z!^RAup%=eLJQ$C@{o-64zIYnO0M(vb_FcRIYIHsDekXl^>f^o)$>cUFh9g0VIEJOM zxC76vR0Ip94l)|i3XoWwkc(nVgXFXMaI}|1pIX}}zxnL#^4GVW_>pDjA;3Sg=bi1) z-FS*JnoBKT$feF8-2*kkg4o36y&XYtzr5ZIepPDu2rPT`u|M1fw6{M2%33dt{qeGA zH|Cme$)G41-hGa{u1nugYic%i^xW~M_fHOcpL>7H zY2<%NJq_P+5Z|Rao!031B(oI-bP((?xg7Eib#ojr7YFw-a<9LP%<6pO8eTynea1~H! zjj@kC>McGZ!4Owez{k<#=D?A@K92Vz@e~N49MF+kIv`<)Uf^LOtS=N_hot2e47n?6B961WqG6M}P#$nCuIyP>bjKY< z%X+F7xqz1us%tw-z)M5gZJ3D#B4VQL{7}iJ63_S> z#>>A6m5p~gu~#T~6AXYiv4<#Q^cC2;6YBSYu|(z&|785JVhvHTA|a(Rm&_0}v;jJo z46AOeNW;t}Rd_qp5K=q_f;7v1(K>h8L-qW;rs^4{xcqWlGq1V2%M`z*$ksADUUB>S z+g$}(Kz=?aJ+U^!~?f*yHcfdzgW&gi>-+S|>w>Q0J`lKf_nVIxXfRKa`dT60{2_PL| zXkr5urKl)T5gT?aD7snuT2L3a;Ln1)xVyHs7a()_-}~N72+00)KmY$fFz?;^%6+$- zbI&>769Z*&=?HR_*glK7a&$buXKoKElE}L~AsJqgKU5P(FP2Kt>A9d{{)Kxr*@7n3 z1v(-?mv&@d2GXwVL+Kuy>A-2c3`wM#O$4gJKqV6TgxlkNDK@RXep=ykg~}XxX_&4J zmnO3Ndc&nvfx^c_v_tLSEk=XU!s8GP6uz4CbxqEk0Ec`A(>nj4L0PM^q(LcaA10Id1)q5Mpm{izktGVY2Q2Q*gQ*eJRBACr@puIbLIEL@7DPWm zjku>lcqhI;$s6>={lta0XyS>feU>+wg*6a=TgdV8SP7NI;H4T8kewi2ZsJsyKaS%; z;sXT7P3s%Lq8I`ZsuTP?D{`?0p>G*Nj%v{AB_o@h2R&;uI_84kDJ2!8iU{(6(UE2|vUSj0y=3{EPz<3MEAZkh4?@ z-}u~5geN5)?UET^(Mg$TyH4l@-XwIC1kaixiL}410I|9?8aO_!p4Hbli-VRA!v8_#;~WRI1yY20!=v6?X8MN?3Zmg^1^!cmM}mWf2H#pUM_M2ST>zjS z{Qe8iCfOTAofg0o0R{?YAoqc#xc_go)X4~&` z0@ru0ER4rW%N@18Hu(Ae>YSeNB8%V0-zi?j;{K{A69Jq2>txg#-bq;I|8C!nK(}n zyH_vOCP*VpL^&`hDAAMswTM3r*c@Tg6sIXcfNg>y-b_4v3)rTZo}wjO+R(#{4@@-T zkCk9<&_7_7z_Wvi8LZV-qkmUxwGzFgXw}MMi5?v*X^zF3!S7}-%aE$MaE}!Oy$jsTzR>bSvL0Td++;NVs(S)dH55%@kQ}9 zC6b&R$u4(6flxDj9-LF@ZezX+W#!?k=jO0_^u44tt1`zGQCZEaA9!H3)uJi}Coj&I zxbW;l5SbHc@Ueci6yXI$l@ljmV`)W|D!_$|qywF&CONJ1(w<8lLHq8d9V3?74ZIy( zxr>}SD=)ocDHw4f|8m$~J-mC-aP*16Za1u4-LYhGJHU&ngO7i-dY!@U;Mdq3YucAA z0S{cr)sQ*rPA~X_C50G888F~QV%`c z_X4;U3_0`YBYm4*z$tX;a-trS+WXMYXC4J|bUL@9A{Q>W|J&~mUQvEK`ti{-ryd5% zs&e#gPDMq|Kz@bbeNX}7W?XcSdJ+1V?M>C9tVx?-FE}x2Q|-X-+XGI(-c6HGR;qRr z<2+wsPl|swDaHH)_h=cuk4~_54+yw9WO?vdflmkUNCHFa?10A9=U@nWiX_|&4LD~oIt&J{VgAvV4G-hI#pqgGW-vSqTyMOA{?^xV zXUBdqu|GIqe8~iC)FR?rh!WUtV)HQ|q)h{PbGihv?SMkuCq{n3h?`nsxpqfR4E>M} zz;zE_X5h_o2?ek;|GJo<5eSx{NlTr$pJ9?9>3G4va`nAm>yuP(DYul~0kR zHfJB@;anW`_dSJ!;OFz(S59T0m2q$4`E(<7gnErSO1)40o%$#BDfK1w72!c$G*Qr3 zL#}}J5lvDT=LRMm4T=UNC5dW?rw78K3Ys^JNNkfO5zqSqM{Ukf*ie#2=^%oV5Sc&( z8#!}AO`8)1T&Mu%5Z5c1EOo&eU^HXmPFf@CED?oO%%#!fg7}F9$}VB%fCx+-s)kWK zG)X2O#i=o)2Gl_2&$M4#E4vOtwpB>|Bxz-yq#st5{-?!Q>L@(G*198G`hylksi z?Nj7RIhZ}X?~uAQPefLxcyR$w0~ljS=AUV)}eG5SO1d|eseqLIbM-1TxU zEtAXmIH%|vWy^KP3rg911?^WpQiR^t08XQjav&F~IC!Z+2b8I`BbAb30E8=xJgy#( zv42x$Op{HbHsNJ0nBEN``ms8qxjEnENpAGphYlatomjdb!WL&kQ`xTNtFvrvb%PDQ z!Yqd~w)SoGIeHuY<4?&@MaQs?LSEhMt8)4Cq#Mfe4(1yDqZ>vhLJ?kV@)lzb!ywOc z&@|(*bIQ$yYK>f(XE8`Q15`0`MnXf4TBDONN>FIZ&v%R*1;XX!VE}HK*mRAlM^*GZN`LxS7LC}Tp=s~i2@Nv2#zU{1ib`}XIQdz67W%>n10p53?ab~WbNn>tsHZds}vbw53O<>=-m>M_qWDs~HH zTzh)(KWA;Bv1KNl)nY4XP~wc{IYP$mdz=kVjZrLZ8@&>|)w9P{TVQPJTs3+~w|2~f zb;>=8z?@)!6oh(m$L6`@j`*Le;qX`uey~;3nhk|#c8*>(d9Wj|Q7AGeeM4961EUp7 z8FTBUiqTItq@OpP)sSx+HfxpWw?o9t7(|VuCQwtT+0;DhO6pFspA#$;T-Aj{WzJAq zLopE~)1ky5Dstj~g3&S2y~JaI$b|$QPf=x)78Epnq*OwXh9x4bIRpYa7MSS}o_5WE z)!|P_ZXqDTi2EW!U1GY82N%!@qU=yfNGE8wBy?;f4`&*6a62#?40*X+Bh%0@!os*| zNsDoVTGt4rv!o#xgn+e~EqXZvBmqTv;S4CRSIDdk18J*+wwBZ?FJl?iTQsK(x?DE1 zngO)OP~_)z@VT0+&-@IZNHsIZXFWdSue0)xp#oTiPTv*}Z`@Jt88!Ty8mU~$I6TbI z2L?~MZnVZ7kb|9lr`4$fPQ?<1Xbon63m|56D;NWKjpn2>gOiQH*=@$F~Vxs zSpv|}e>?!{|1Q6)CtR9JGRevH=e#T5>0Lf3Ma|naxn4qrOT+jvy259Y{ndc_VnKA# z)c>Xc*bb=Da1Wx0H*catFQL-1n;L33o&y$9>je*j4^h9P-l9Ijl-OCI0d7zTYA&+l z*Y6}zYof%~zv&oRLGG+Fo_tUy{=zWL7Ioxp)bf0vzI~=G-RIqy= zz2En$pjwwiNkO%)6!=L2$H|kV!Y86`9h>&OO!iZpg4AdPk$;JN52hUnUjjs5F(AE! zvJpm4EGqEq=kwwW;xr~Opfte-2?)MnL~;t#XUgEXs+P5t_}IFp65ThdwPjP2Z~#{= z2l}VHHTAiTU)9v7nxE{x`)x3!YFw~#O)ELB1v6SlHEn7k2PRxOzisK>q2zc=>R9{o zMSGjuS1h`<@CEeg(t;|dqI3L?F~=TUeynYNW%Dgd@p0(hrE^xaH}74vyuJC>Ma2H< zECq=#aHEL1$eYr}?&8DaXNSE@rsPAvt=Hy<`BRpR-gV!u(e&5XzZB?uUC;!J1zx&7 z`Q5Fzes>O2Bx85v##B7ev7vmRA|FviQcYup2%D&wYDvOmDp?DkPBo>P*wcP@s@75O zNY%Ri1wq(r$}_>glfT!XaQQlzB?e2 zCx#EB!DujhD(FGA)>+X^!jqaqyC((UQoWj`+)}@NNvl6 zR^A2V`@5fg_SsYw>hf1>PpH)=ApRp~ZM7ft1Z%ZVgX{3IS1#|>)&^1c)7n~5rh=pt z3-No)aJvVo0;-Pe)*3xDK{gH2n8J%fj~6pPl-MIVkHHl1L}DdAPs~Gjb)P3dJdfcV zp~KQX4_Ar+INR6REdhJ<2WpniW!WVH;E z8#X_3aO2kfzw?H{C96y8fxI=tYjGKz`w&5A?e|(B?7^Bd`ez|RnS%icMF|7t1Hv3q zh{u(nK0|HEVc<@4&PhSvv_e2(q7t8I@wxMP`T1-iB@%(3>|cz_$3Y+ zZkRIXW;qzY>)5efH~tZREaQh&qrZqB=%?+kZre6v<~BOJXYrEZ?TgW?2bPu>84UOu zl`AbC7A_P&=1qepuDoV;-?5#$j=ggudJY6ufOl~^>Y1@^+pF8R5w!8MV> zh*J`DAVCz@*f^%@O?0CMqKSCyD>#kJ3)}Jz-B2^N$W1fP=^!Wd4ZlW`JfbY-^@DGe z{^J;T-`~nop~Cmj3;f51_OPYcS7a%IyWiC-OscTI%G0Fq{u7j~-TpqBwAr76%EMPBf_D|%LupDifIOO`dql`u{(^jd|*IYIx^%=U!>7yBr-47Ol zc@Jn!Ci>ADbj>qLFvIO&puv=9jiZ;)&On>b;5C`#dU^<0@WPiP(ba}A<8PkSpi%+a zuF+J9eWX?@_Ia|e+i(sog7@IoB19zDpEA&J)RQqF%{UUl?MJ$YnW!*;6O%Vjp1gS@ z{quNek)I`m?`CX zY04@_DTGP(Byqi&6pxsmOXAXZPF}x$GMcnWw5yep={8DLU_QQe0I&AHJg|tf>`8mX zGV>X`S#a*%(a_T{GX}gj;}Ozea?>R861C*4G@- zhW-T8O%{g`xo3(k--|pwtyrawaCHlinyNY~P&b4|2Fu!9_TYU?{>(HYQztLlM zXS)^7Ef4Mk`Lm6@GxyC4;pdyO_@!Q1uE8m_&sNyK2phNMsG?S%)U#IQ1G+-<&|!sK zz~#=71{$lB*%K}h1_9BRE&e7vp@xZHHjd^nj~&9H1fTFQ6ne)3%!tj~?n1{vp#^;k z&fqY}XWmIY?M72w=qnc}go9mRp9|<*cJsh1dyk{KIEaWj&(GgPXKMwPM)$JG*_y&p8DY%xvJzCY}QIyR;rbx zo&}!+Ij4|uDzG5AP9|HIlr_Eex=jAsTQWQ{KmXxNh2qN}lx*MkD%JOWD)(nUYGvGy zpGjoM1Q(*sKXMBFk6^7{F&yQ6FIDj0gLipF7Lt5xG=2+C%T%hA4t|Eu zAI5e8fs~@M{0ThOkRAFeVEW%SNqDs_(u55s)(=!sOsnQjFo#fc;#avQa*2G9EjZ;<2+8&q=@BuQPKx z5AmlgC|eT|E)b+;WD{4y8O1$w4hnwzh&?+X)*(i+2TN=YDquvgzsIkQ516u010XTu zNsgGj$MC<9ful*$5V?wk4f@EKEMbp0!ubw!ugd~p9w<25P^VC9T#@@TaTmLwYe7L`ijHUhI!FC)hA$^^2PjE)Wk8#F5X zI08b260F_26PnnTsJ+w$S6D7>DN-}cW?_ph1H&A4G@>hHXet!F4=&~}=FBWy0N z*o2uY0D@tUr2?Jilz@@j!n5;b8VE;sU$L&^mPlA*ER;Z+b*&k+AK5LJhsV*Yb2_;I z9cCDS>zZ(Tq~^x$m?&;oIA&3)!r}mcI9h02<@gk44GmIt~kvezZgb zd?f|MH5&m|C$yapw>TY*{c20kZQ8#t$bU5|I2n5 z`P}r}VY68|i(i_7EJx380lvoG z7aGu~&9fOLje8d(QOs*WA2vSw{BLN6&*sg$o#Um9gyCe&?epdV9k9)xzmMY?8ed1b z54XwJ=#z|&%)s|A6?B1rYYSkGQuNb}DGh?`2z)v+atYYtufKB^7(D69mYjy+%{4_G z=(>r3U9qynU0Ut_Z7+DY#+>XJvC_`ZPyGp4fKu=281L3x?45F`$Zwo^be>qk3>Z;e z%J8eNz$E*qUb6Yo-qVd~(%(FGHR;K{X2~>oK2^jrpAE zv+>v8!AHQwbwIEX7PO$_d@M?wB*HWq4U&S%*M_TPQpf#DaA)DZzv0vwPz_%)+S_Eyj-?UB` zGhQS69XBN61n5y45|PzRS^;$>6d_(g3jj$m2r0kbIWdt#d`BMGL>Plj2ejajo8PcO z8#fqP-HaJJ)~J8hZWudO9}hylq=bjO;kV3A1yWP$1aT#Kx3F(~wr0{Fg%}A( zdI4z`wG90PWU}A1j?u|XU4V}ezke@ze<1G!a@j?`e}WoD@RNSin^hCrQ9!iciG`_P zzTz=)wBWZ05LI_#zKE$@OepYTS&|w0^^e~rwJD+sTKdEjQW^(r(!Z(k%c|9XyD%Ls zS83o?(4?wKpMO(};41|2mA?B9Um=LE1oCqyrUYv^s@O1^zH4o{32a!$+aH?4qWoq zduTWM>gBF`zZ?R>hkJiG*1K;#V3eV(*(1hwPM`4fU(zytPMp^ylpJ$Ydd!(x2{r%^ zbOAOIl7T>G!x{5#IyQi56rCaMRE)4BA`AUjH~~G19{>IC=_n3;haPPOTD*9DeKlxH z-Nn55d-OO^rS77m-o7`DdB(msysRC zbP4)u1AzWRUH}zq*IrX7R1-<5M=*>1mFQ()_G-vQy@r$r4alafZ_DNya&gaR6 zf`p?Vz=P=B>v1L!m}jD`kiiRgvC;G{9+%Mp^La(DTGB;VesMRWq0bBkkiGAVOC~D! zFPqXj41^v#04#Tc({J3f_R87X8f8OkqO~=aH=?d?=!nI2tM0yM&9&1e)wh(iH<#rO zud5&0v8ZPCeXy_KmDT${1@eF1b;;B5Q0~$@%5Oe$JNn{Ii3NSVdi!+4P<35HJl2@g z*wN9LbM1;%+ovw5t&f%s5)-zaZ+{?SZxXAT1mQo66Ce>RNrWU?DhnUI zAx@ta7ktaIW;_9NCIfu!m#Y7;7j3@(`HuTKoFgOy@x^>#j@0j>6WU8IGv@p9InlG8$3E~Z0(A*-Lpql>2xaE>8+2n zH_w{0aWG1u8UMKPXV4+iJwjhoVm>!awNsO*1=K3)O6n%!ZzJd@o)hqY%+zuC7}O@r z5{{@{6Dvk87EgrY33Ht0h#{ARsP33?7fb|0L~EOLOOlI^5qtrB89Y&@i-qETN{f%8 z?j^2}AXS7~q$^MZjA0njIOaSxczWL3=(c&~&b+!C-`CZp{x;HNFPk>4%*A*3SZVn@ zblcmdb-MR&tjk;dsapLncf;Yb&Z3fuB}JWOha24gQma4p)E}-GSCqFPuV`Gw;d+!) zS4xTpeP#1N7o(k4W;c!W`#N}6nW@YdBsVFodk1s@)z*{fMRWkYcyjC3lb{lGg36PR zU1WgFs+YWV&|4fSyC-jq66ze4C7wgz=0l#+Qpb$$h3H@2gKtUdfpSdVJ!KI%p*?3z zPW!~xI~w%g$mQSY8}0x{K)AnXohT$tYPq9P|FvBHwZ8F=78tCDiZMC&mgbat4!)JT zAI&=CDXDbKUf4auQCjK=dT_?QIb#$M-x{x-1&uuKcKakd(*p1gSF_@q9MhRreZi_ph)aweN8Rc zIeJuQG;o>IxnxXaj)vAX#w>JTR(^v|d!(UO&AKglQq3j9Ee;u)YEOVo1!i**S{ae8 zGIo3nmvtB{?!sj>fX4&zil7C)=TF1~{#bnE1sJaqsu9maM+6LPt+0o=fLcMkdicD= zzXDBGBoZJaL-3?7AhWPWt;Z{)A6bUpwwBFrzN?bS9=*`PSneHh_2I(4=kmwH zsgu2)38`DgKk{NIT-i0Q0!(3`IC2e22S2-b7G}cyxrm>U`g`WoIeo75t5y0#=X+ z4#q(u0VCU9K@qu;n4}O3aRD1ffSn}TyCSd<*<=>LkBMRhCPL`uCBrMD)v=%Qf!)aB zVWKt$n;OGagSCr$z`ysR?{2GYFq&D`Z;X~reKgt9l6>@ed@7Nvg4y!gNqhgg{5GIs z3_Xi|4a3nkWHEW5-LUSv-#xyuvU8X(r+sk&9@yXSRkHznXGWE-j!#pU%rS%wYJSc3 z6@T43aW7s6_33qxAT_5IWfKHigjjA%+(c`gjALL-Q&j|o(#H{aO|yvBly)g2DB9xQ zCOVcO`{@Eu3=vg`jTF-YwbY~nI`!epu0FhFOL0eK#OpRFK|)V6tz$!enNep{XaOd& zDuxW5|nhM~>yJ>Fv| z*P5!8SA*Qj`h+oF-qtj|y__A{pe|7YmIX`xupoDd#*k%nL%`fT$Pg&VVJwoVdK1q= z27vr9t+B-e;gA!W0ECcMJX=j0vKtr~h!+4pLw8kUI`eq}C)|T+tF>^Y)+pr{*O zJQ?61L;8a-I73{*Pf$e&vK-M~F^iycT7gnE!Ny2-Zhd`jHf@cD?fLokaP*5}F$Eqh z36Ydg3Hs3;x)+_i)9mxuimL4$veXdt;R~SkrH4V;F}Uc;Wr{0#1IPW0 zydx3~hoWeTBQM|X$j<{`U6^nmb2B=%x2>6`<%|xlfA4kRz85&|-27>(X4#*{KE5!p z?OWjbcH6e^MEnxTS==4ZV`22CoP|Si+|%r&h`yM#s$z=P`gujIVF{9qQ~bPxs2s;U%19f5Mz- z)_HdYnY*U%33$NDz`*;azCnN1JJmAYgu(%u_DPaH^!f*Y9-<#O}NGCH3wut&Th zi$u;iguFbP%MK-S0l&aUkUm8X@H;{@h#RQE znA$OVVu4?13VUL_(HA3U`og>m_sVcN;-(UGp&lr>*Gl8M_4M_eI3b}@StrgV(#dmS zSbO3`Uk}+K9RMO11UL?$cnDcTFH87SgCd#+dzUhfJ1@Rt&+mPVw;h7w-qXE)6 zvv4||omk8Xv2mt%%QMfQAD@9}&%|{&xMkf$Fb5L2Hxfj9AOv$JLW&f5W{c8vXbj03 zbI7C=tKpCZC!RM}15}Kn{GttP9J5TOsJNAkml`hP94{dl#QwsRkEJdfH>&Cz2*0Ts zHSV&@9$p8(sUC>~<3?701J^waE*nTHr5;{azEZ2!t}I{oFfPJrSC(D&@MUEywcNPN z=o16!Ca#}%)ZuSkO|?+ts2P}hpeSM6SJ>ed1QUrkFcX|Tjevk~j**KJT=j?>@WSSC zT5HyXm(GE)xY&1v`7@MOT@j?}BDPD32#scdgA7I11qbrv2CGVuqxWtYWu>1g_`Z?n zYsVAZRP;9j%PPRBK5=_3ALAR($dxMj1er{3lXuGBS6CFCa=FYdn;^^5s|DbbF7<K-!j}4CKp$084w|1zSKMPRxLLb1-CP z0|^P2;E7SNIl=OrDUt~B0XP-7fqNmkmHp)&5VLUStgmY>-}O}teT+VieYI-nBo3Cjq;4%G}^0bPvlf+D(p$Du&<5-GZhJQswu7fnt*?+8K|w8OLiO)Zd2A+!-~ zOd(ygecNL|1*(Da(6;ud?p&Fm9VP9-6a6~y1H6l(B^OKG5wvgEU=ODLiz?tMm3$5a zGvz8>Nz1U-@<5=xby!OY8hft9D11qL;eNSa8W+JJXz!GzalrcLC7vJ}5kX%jK@cTG z%%C6IjqMM?-k>dLLwG_y#aZCL2)wNr#WVRm7Ow9&fjRbVnD97eky2lLhz-r2JYTo;_z96;Tlf$M|wn2O-sAnL|t3fBrn4uh9Snd<}1^KsqJ zz;yvZ_HR9_l>Afh+h?T81+PQ{Q4lWT>(a$y>LxD0d&bQX7p!LSsMm|ucL`b$`=|XS z@PhLN7ci&S0HZDuH_>y~Ke`_O2S2Xs9KU}3_|A17*A72(&&Z1034tw~QUyI59QF>@{g{P2iBwR@(%Enomm}-b2j?>p~b$e z!sueq1fUe42bV+&v;0dA0sHKoff75E)9{HQvt|uRHEZl8q|IjF^>A-mPD}74aL*Fl ziRt(RvB5VcfDU*#B7WuRf{q?CcV?fh!Of(|#TZ=7r$o#!tSWp2blXPuda@ZB^YKbns?YJMo*kSw%50^}xO<}koBF;&HLLR#f#t8aNgb(9wxYZg zT`sj}gVyq}j1IzEXr~6f++YFb0=3HpnlFpU9D$-;lH=>q`>HIdY;umqs8q|FA8Xg}8fj+kZ8je}!+_S{Jt zxlf<^{i`8^yhS60m>?+(gPHf&OL(36gEGOsUzFn{&$E57Q$9?$5}!5r>j_kzPJnrg zo%bU&tguPw(HXe&ARRn0hC)P=pAsxJSPEgH>D&(!dBKvPBzc-ru&-m9uDktIvb`Hn zq|#YT-O-d#kLs7l3%|Zvx>p1eW@^v$dfY+gy)%NYDpQ-pRdXm6_h$ib!Hws(5tuGZ zk6NQ4;l<2K+KMJY^!)@NFaiI{=OxaF1@arOEkZhvDHt41t~ch-7fiNuo5J}%FXg!NTGNPtw*J3{bLG+ zZnyjy$Uqxpo{{fX-C)Sd%gZvXjo`msdX>C&+_+Y`O1}$erE{m}RafWj(ktbgckI|K zSK>sC?ACqzZk3UOPrvcT)1)BLf)ng!gni6`QmGnh7&VfbPR*y*;K6x;PdMtoJQHk4 z5!EgdADA`}>rOjB2YVom3zEZ#UIchuI3e*w4;vV}Xd*qVWljtJk23W$=6EbV3Q4cG zl$;hM=PW+P=83h*fAG3+Laz^uT{JP31m~pp@T{2CE5K5V{06#9NTaFK6e%YmN8%Ch zEX95$A-H;jgnba`@e!Cj0v{k4L6MEg3Lv<@5hf6#WFfkAGWbH638aN4N@O(BF;V)J z-ZU0@^Q=LZNkBGaJ!7=cGN0ZrV}qNv%zmhQR?MORG{X$Psi6JC#aDNB&d|e=K!J{% zob6FYLwKlUJ!rXhumZPj4(&)S~YpNC3?pI@|IgTOR^!;J};%aL=Ij zHG2WrQ538UjcGEOn-^`o6<$-ES6t8(*MQz+o$1F1eebfGo0BaiKMUPSijUA6*e;W2 z$rCFJ{n}>J(4_D{j+D&$fSpyu%{jq_SHZ%<}*f(6);A8OBE z7^9&`G!ZW;1m0X6iADV-{X%_z#O!0lxfsXd>5$j#4S9otGzCwy#gUkx+FEQjnv9%- z_>1>R0#PE#@^Yg0V|>+;Xv7JGlhGU{P)r#%y9VGp2T6uGA@2MN`{rI4lxD2nh00UqpUOeS7$GU<76S0&p7wwf?~!|P9*{bsX& zE76%G<;b2pV4zS5g40J_PHUD%?Y3xKE|1IUaUF0vbvEK?#G!e#P;IuF4N8;8<|T!BDN>wVpsL17T6dGqbgCUp4q}Cg~+)V!_v(n{q%B3=yKIC!oYQ0WxHtTt< z+TidUb-6TlXDH-!sJEDvPA4fQUGH>iN<$%sQ{6^1h9RLyAwx5e#Dpg#Pd$6!0AlVR zjhkvVX_nFRK^3SRIUOBC?@pf%@<9HY`RE1o!aP!9&TL$w?>J5C3@VjDqf((VNXuD3 zT0zC;1ua%RZyB5A76Vqlm7JV_5uO5y?L(Aq$ur=G7>)BR7K3){Fu#8o`876Z4dLpr z!Qz!bMy^p<)E0w>1a)e&&Z4$*rYd`Ow!JE{J?zd3@g|K&nH9qITYQXz!4IfwbF zZXbFP-HQweNj$b--vje@&6~Fi!0QHgjvu`J?Wa~OUAp2au(f?|OLghgIvMb^CVrMC zT3Zv`&xuy}Q`BR7-|kkG%v{nu2|X5!jt8y(3g;Q*dbQSQ&kH2NzHF^ZqBI%odEwfs z?AAbCq^Kd-YM8lWX6i|(36I;c;hLf#e39IAo)nBZaRS{ZEA1?8E<=x9qiriJL62>L z{xizbwzg8{dweA1xW50}K}?aWF(2x{^mq_+qr<5Q)KThhcm`*I4ER9}m_|{2Gz1c4 zGRE^-z#KD|km)xP5KllnvC$B5>dyH>MqkLs`FOm_Ma>CdP&3{jo)AMECiKk-T+Qgy zMUCRc`i;1BcwsaPb3G>e6A`i(m^ea$q*sW{;LxORazRK5@u;*nDbG_@JdYbxm&W z%cgtV#BR7U>Utz$MlZTc-!V6S7LTAi!PrE}F=K`ML8+91x-$1Ym8pD-$*Qljcn8(p zTvU!ew;FA_I)Is0v%abJree&O{PnN9Z@dwGSr31jwQil)TO9G0gg376`-+QwUs-A| zyUb$^)TD}e@`1>mWtQtujE1{DXvgw9T&89%NKVQ%FEH^6&2%E zv!*lBu@=i2b66(xI^+2s<8+{LfqN`C?s3IrK8;DvO#>R>OkIlaT8i%q??vALP3qDy zKe1?IYZcwCO8E}^zi`=|%0!_*(r-l)?1M7T@)IKmMS#D{_D0_X@wO9!65uyq$spF?VB+!0C$w906K~nN=NB=uI{Ym=g6n{Ur7DJ+0L}Jgfs!Ns9sMfl{wE(PO58ST;#f z)Aq(8GY6GBD)o$N5D%W0vaJekULLC(#!5r^phJbD)LF2uwR)dHxJZYR`Q=4ygUChj zdO$AnfvQ;{6s_mssiABRo=KpB5Bs?#=h4;61I1a6K-9A`#|7pq7~{SEh!Edi5#!Mu ziJZSgDyQMpzX4Vv_kBx0{I&ZMSp?GDXB8@9<$!*C<9MiB8fy#eNo@&&kB~;>l->+3ySI*Lhd4Ghg(0S zYeZ2LGh1C7^aZ-=yx`ER!YpMDxKg9aDwNAN?Xs0>3wP~;m*j^B*T$rqclonMMypU> zL483%J^gS|WOCP{n#8=B722}Fxdt=)Gd!P5S~V!(lbvvlnf7T#omFL0+dSP_!BA6q zokeZdx~=-f*@0}}TeQ`(z9Ys}yB}h#Nfw{_^4KvXaum)Eet< zMQI&)k=(fueZIJ+cJq>CWges8 zW0|Znz(in52pU_Q_@}C7h#QH_<`Z7L%tX~*VygPGr3BUPdUq!PlvZ0YI%_r)l>+(C z56kV+Q8@54AL$rZ75eNsX=!_@bnSC7a0kwT2hrYFOIqgb+Bxr`tkD%(?aOLuyci{rJXL)lb-f-WySMLF=gEtWUdIPWDFbT}Z1w?zcbMIlobVM8373zQZs0^fC zGipKq+a)|fI-w`l1HbxWjQA=;Q$NuQa~|I^>88#irZ@AVJK+xpsuop&hEc!zq7SEE z4tx%O9=EJ!+JY!bqFV9AH#`HhQ_)`Lp03~e;{6!MY_ea@l^~i!#CM@Eh3Z7Kr(cT$ z4;~sG3CCvq3W@{7m+=9S5chH1#M29;E)LT)Fq}F8dW$$YdO^<7i}dO)(Sd^?a0Ia? zO&O>8FI-+#M(>3EZt8fMuK~ zXgU&I1OhokiI6U|lTc3Hs)5>48L=AtPdX^fx}i%~mA#3+1lrfVBWHJ%YL{y_4Y}r# zC$~3VBa^I<$oqaxM+F>R7-`GJKP47n%7)2Ou}&zCxkDuV54~zr%z*7rWS1mX&wR`oJS9FUG zPK!bi^F->${qDhAf&7-iwS1{WsbCeUn=O`*4ah=O%iA#ZKQYrp*U6xwSgBOWMs|`* zf>Pi(x*Cn^*V_{I^?YPck1}bAO^`tYh&-Qo1Ytuw@rs!i+7o{lG7thrN#l{pAJ37? z|0uV~=ceuo#9lv3)g}XQ!dx+J&PS8_UV^o~sa^?n1pPGWqd7S7k8+`GvKCOU$Aq#% z+MJIkpRN_k_NMj7kRXT5PW$NKsLWnFhzpJzOq7pk+7eylL^UHB-ZVEK9ojN=)w;(g z!gUpWPlvXS1PuD&FKeD#TFy0=R%^1=*1G0db0pNHrkZi7tJh38ygoS!HpI{T*s{Ph z_)qBjNq4-loQ;IMf%-`me$9FE(ENThJprLQB4B8W5SK72#31Q5f|trPV6hAGMxui$ zV#jgj967v#75T}E@r z;>&e8g6*ARrdNpMr_1CQwELYVQ<#+bWfdV8*XeGrC4Ldaf3@x1XQ&~iv0=Q!>)?Z( z@IOY9M5yDiTkIyambcm*POFvIs!ce-A*2c+P}?i!I&5O@1qE$ZyQ#Om8}y>u%&(i) zwvHSYbLLsH+~vU=TmEB29P@&_iY0Wo$4I{Wi|=p(wHkFosZ1fUOh}*hx5QD*SgMOqk_5My5p{+o zA>v)RAGAcY5y5L06xE@L6BH3`TOxqE5-F$817<>IIbH`pcdu(|{PPwh?$`MP0H63He zHJ2*rhZePsE&@uEi`igvn4626=vs--nQd3eCw#Nx_ksA7_VvRrcZ`@jF1+Z`uAZ-^ z)Wr69{b0{+0PL9i+U|+L>S;4BU%Dgy>eTj}$}G1zzhZ8aR(HvMhBoIY?D_2UVk0ot zpSKo_6=e2A_b^nF*}n3bFex1p@kk5;@-1HYOoHMnOWMe66zBd#KXkD$%(>`AaO(Gb z=JSVT3@rA?b-=(+3duc#qU~#;cIpggIARAQE2cJ?%R+;OCr8eFVjj&*dT`;>lMIT= zoF(Iz?%6-5`_clb&y?*?l(yu|-!tbtKL#fssF$k(4yaN9~_rE4NKcOZPz%b zRO86DvE@zI74Dq1Vn}iKQ!~JVCl+5~w=8TQ^5C+$_sm~moKilatTAN28h&!V!2_L^ z@roFtQR;lpyMD5rz+^wR*QU#%ar zzWw)^)qij1(ev&IQ2Npt8shr%9!8k|iHZk45$j6}rj7_I7yiyQL=+;?lCcqrVlp3i zIFp$XK>3O7f#460&<$C53dtfq$`T>6jFNtXQwYx{xTlTc(H}~O2;f>Y0#Bot!#>NA zx*?m79NE0|;X9w!mx09~3uR58Yh>9Yn=7jx)W}U5qfh_fq$5BID$yyl9i1B9REPHI zJujL2?m3K30q*dUnO6#`l^_Wo8~vfE80j$p#e|uML9!|9jQa@s`N;KOjjp*7Bsb6A z`67@Wv7kP4iCWUL?x6+jm$tN)vGxHhwFeA!tokLikxo@7?#|~kG zE+*&-{?lPdB@GUT0VWOLASs-p@F8iPEqesm!5CnFL^jt96a(bHPzjP|r_+p*u7U!1 zN!Z~CJ5m!;cO_%PhQ*TN5l-k{1YT}iURk-k4VBLl)`cr@-}@P_3k3vQfD(ti@a-@U zE#g>3Jp=_xFeC7Yf-H}TA(Amb7z0s>68C|SIDb?Cf#CEL=pa0ouun$(sd|4T;)l=q zfz;fWL&Eem!nWF`=M5?XLhO@vou zU6Igfkycz+Lab5z;zoswNkjzrBoUGvj}s$K4u&MYwCgoY%(nLudifI0jKD=bvUBNPRjf)O=l{r52=007PrgGJ=BHl23_GYizoTUnu)jJK* z+pHC*ZvFc$d+>KEMSoZtP%3j9$Byf8YB`Hm!#EnNvTDZ%Xy!_p)B{JvJMQ(ANLx#l z&WD`2@g<`tJ62aYv+wL^+w{ByN(!z|E^3pnu%_kTNda?+Jyzm8ye-9Jm$s%Cy)quw|EUkM>eecFQ4nKX(jrXWtXRD%RHF8@# zGzI?osQR8v`WsAjgrvtp#R;&`oiEWi;F#2{scT2GR-Gi@<;s`n&5}H@74UG{Sk|Ir z3tYWFQ&4-`XdWMB+FRXuEra0DT?O3T3|T?m3erAr`acTTcET=Ds_y zi6i@eXNy+77h9HP$+9F@xyX`igJs#6Vr;;eX1eL7n@)g$=p;ZwPk=zU5K;&!dY-#w-%u2RwxZHj3`~Bkw*6!@=?Ci|!%$qlF-upaI z6WM{D(kdBY5lRFpuAIJ3MICZ4hPU2> zqe)9idMC+ZL5CD*tn_WHwpgmy`6>+o#JW#NvKahEOVT97-3JWxpei4{=Bq-%w2D){ zs?}SXI?gw3+0w)oG;N`uTZnVP2iWebEH19}wHu9JFb|rnN z>*+0tz6)tIHDfJ8dkV1Q|B{>R3U|Ygc3%Yn_zD~VUjYHIhMskNX(Y7t`0=Go>(b-k zb=n=d2XX%tD5D?hia(CKgQ*jbaS%0vnnX2IbE$>Ya#Nd_@&<}LQI7%0zZFWEY39u77f}@L$ zsA3L)?f?>N3TWIS9@tGzlqZG()`D$nzZ%@7#dm*ivhgqLk|S=g5gxxA z9tX|Z?8sO^pI5!|vO-Ni0$068XTxvRx%88O4QZ^#2)tAQmZ>Y@2rx(-Y2m;~xRpht zWLF5jd+7AhM_3?!%(@?BefAl9_LPWOrjG8u2>*z_XJ&Ne7VvfU2;lr-0|SiWOPmPGhk8#Rf!?e~VsM;Fl=FeOt7ufWi<8O-lb zKe74XTrluGLwzMT>o%AQPmdmT9!xrWXXTg$(bI6{fH7blUDnYXOr`Zp$IVy{gYaXe zzNm7z=`5(7ckhNLW3)j`vHu{tznGHi1TQ~iha?B+{D{r=du>>`lZnSOc%h3J8NoRn zPrO5!{3d?d!S$=poc?0Zo-a1sZKkT{p)2EIsT=o8v_m7=;hh5$wE*-mP&)8D-+L~FjIvy&mWTJz&Zyy|C za&jGW=A<)Q*?SIFMTU8crqAXCKKdA%o5yzATa5dk%b{<&?gCg%Kw2TR#R|A9R{eOr zl^o!gR{b;_MhAH1)?seTcMo-BJoMe_nbO}Zm_9fUWWTyMvRk?N#4-94gVkz?I&eZ- zhmX-+lMc;x~%Y-3xxx=lMVHj_j=}v42cqZAt1zP$byS z2!7fO#8aD{_-f0e3Mn5|N|jTUR9~tF(dD6tGLNRlBkDYZnoZ587E#Nnm54%bL=<{E zqS1S){nRn)A{r4`^y4H)pWT41*GxTs0TZA2!!C&ue*oix{mKvD_ZkBKt&9Q|&Kog)MWkAKq7!fTs<;DFA zEJEXNJHdO%?y-iwm2qCojVxv~Cf?t6_;4Eo54YWae;a74$h&qauc9IkJeeD!e+uP- zC-W-67JTn8PS~>GFk908N^V6(E?13@zxfS1#`w@oM87Vh^B6?ExH#Mq-?cwa1kD&9 zkQKZ{P>B#pG0g#=u*nfuWfvasbNc|h=Yx+9k2tVmVe^cI%kLd_;J4@RpL%HoXS0Zv zhThZQ&ucb*z8R#PTYmBI&W)RnjhVi2?L_MgjXq8D$NS4>mluguhU8vPO*jSFQs%|? z-q>~M{lK{88#XQ<7kGaEp_gjQ*;JiDndEDnv-rbJXMuXu)`uV2I%?&#iD9QzuN|zv z|GYETX;A4>`qXs1=1f(^cvP}zj}RwyK@ec#G8HR}m*FgS(2J!O#D^~lM86hv$OTpMcWucX-vORWV(!IBB9z%> zbkZl^6T~L!WR;BN0ejNyV!G#o1JOjqa;6nhNls=3pPD397hsG&v(j75G657+Xw!^N z-qnR`kLxYy;|~*hn<}nGPduQRfUzh5{?j^hl&e^`8@+ZnVls7r!qC`MboYN;Yuzs3 z#5dr_yL2e$8@6t>KXXAg{1 zU@y8r&xaSlRWLr-6#W;1BeCFb1~4b}$-*m9#n%(w1o>AvLW8 zVXd7F+Zif4gWeyBFf8%65&4GRPXZu39a7qSO@z|xSxS?yr73L3i7Lr|kLIEp>K?@D zQydn{^KJq~{p*K-U>y5T56;9y8U}BhYrNRar~yNOVjm5RrYrTodL=M8IUk;8cpdu4 z;W5L8Y5m$^!%+C29&n;xyFaWwFCkUv1C8E#GAwKZg-=@bnh$h|IsNMEKnP$HABg&k zkfH9M{eI={ZTN0OgHG2F0!~n7E|->p9Bdp8FP2Hm&G1e5u@>EI_|;5UvjDjnAAelj zmrEaNDMi_Js3mnO0Afxc(__9M1vico?0_0;XE7)s77U|1#~u@KdoiIEh%LrvF%}V! z7C?Ypjl7q)GIXe^2{%Nz2~adG9ocUZZ{a8P8!07vx-#^~$T@{fqctfqJUXdDCYLFs zI!}heq}9k2oSc!7RN#SKw?+2dwo8)g8R{GJp^<+515MuyTds9Z?>W|7TSi~a2e0!f zA2w8s&Q^oga0r`7g~D_ZON(_htrOF%R>JT+YZsfvdS1@5$&U2ojLjN+=}PXO@&^2X|yUgF$EZj$n3aN#@WYpWD|QxjVLR5Jj}C z4son4*xE%&W2*`m*(f0*P)CB`+tq0kZlz6jFP4M`$X+|{?lGYRV%1G}uL*Im0lVNL zorv2rf&V5MyErPZUib2h-+Zr@4;j+GX`VCX2GzGy3|?24wDMVE4i+A~X-aM?O)VPn zsnx}?uB514-*2HVWg5QuUyIi7xci-J7ZyEbf^RzXTFvhK+zqe1!i9nOmF_Zk@b?*~ zw$$;mFOSTBtN-l!FW05GcXjYlM5K2$}DXvGpBKE zuDSp6#Z@ruGKT~cC)9eiJ`ncRHW6P}71PSo(#oe*6b|t_`~(b3w;g@| z6d?F=(V2_@&3PD@R>aHDjDU9&>@kc;+7x840G$GboRnpvJGI5y=nhT|78o5|zt=?R zMnk%2SBaK(&wzK&7dv!$vbDbxIdapv#c=ct*cMznzdj?Qe*W5E8>A_bgkhtPXtneh zTAN}3$P|sjC*H2c18CxXmepq9y(08u!|?Luwl2^ZA-L~vYvr=7pKm-4 zvY&`hLXX3HKTPW<@I};@5|Rq)M6CJ=pgp+h>s>0{F8F7yu$zOQO56vwYW5ra1 zP!e7gFEkU}c@j0MfY?A@D+DjY%O`gps}SileGTH=*6&(##i`{Qov0%EU{@vB-wl9& zc^J3yhJ;5+a6=O4|H;F^FrewAIz>Ng-MU%&6!poDD+yI1{ejFiRn$Pd=Nwabk5>bO z$Nh`?;V$B*FcEO#@g1)eOJSS&_}5r{tNQKz+d8=#*xp@wrIEU^NvVx)PWU#cv!Jg- zy3D2Xx21RXp(e`)Jzd!NL*y%1sW`q(|{rrM)N0OOGHq<_HX+VC<&8gBCf@Y?Nj$kQ1X zEi&lfAENK92Xof1hkM{JrN_Q#d$?3+a>S6csv$#EFalzU4JMVRrAFrr3Z2#e`8Y1%Xp}t**kD27h|~19-I0lJmRk#gaR}*u3=P(WL(*rt6jd+%6IcDfWSn&|f6{ z=`jW<-}Qa688sx+iW(3_z@JbA+mzVXCjJn94o1wWADt4-IQr?b&41pj62@RCG1b6{ zl0_&E9?`p!+aD%}Mj$91xqKJA9^nxegkmgdAHdTn2DPCmwy!Y|wc$9b`B&Ny z^_hQ*FcEhnLQ|5yM_9dpOO1P9XP;A}E*I|6gf{q(XFq#s$<~|3?7{1|o05UzrM8!L zJ@IyIR8nCK6@aREIJW{E3UdKCgbbO=?C7CEJH|pI--`5aLf<{3r7)eS;s_^BRwcm~KY1Abd6!PL>+4Mif%XZt@Y#-y6P|fnr+Zt-XxuS!qa)mX9zrWR zKFqF;*M*><3#CpVmm&)5@d@0P(d6~TH$m-jFsk^s;pggf@FPizBu^@R5q=b-@&BZZ z!1bb3nuij1gu1Fk&qWo69|<>J6sRDYhn@i0o$Vt;z9_sU^8HQoD)}~8J|ysvoj`CD zUJ)Rcx04OP>>?=%dO_^tNBM--B@ANpKB5yo70*<$UJ`w`$2$>$4YL?e7=yRRm{F>; zJ7X;`3SRHzBR6;TR&)Xhb0+QUibp3Z0f#Lk!Pln78^DUM-T+Z0!~nxyO($^NV~(OC z2fXbq>sR^JD=HRkIeO+y)Q;o0aFL_^xTA<3_U)dM67YM;kzJ2{8+{zz80jdYV(;QG zeXGMeVR&7@8i~`;CXNl010GkWDwjQQ-!-+R%90uy+u7;&2 zW>jxVm1fAS#_S@eQliQk!`qtc%c~p5gaQ*P3R4sxKXnHFJvlYmYNS=(Avs3ou{o#i zYA)Ugk2Jk-eC?o6iFl$?f|B2IcJZQNI2jJ2|P*sh_$s`g;Tu%eO8OJ?Rjei}yK z%55mfkyyqss)pHf<8tX0sO>hP^+XUOmQVsR3DG?#>+FEwj?7535doEh46RpbqecJ z<6oG7(%egKu(o)J7E(rSSYSv~UB}LSM}ozjgDqz$n@f#x1wo93P0%8V&ja?j_6Tus zZiow$IB$FfgEdmIXS|8<_0KUnKOF*13Y|^?kLVPw3LQLxFF+Hyh}!Ck0aZN%i-vfE z&EIcYxlTXio~Q2_qStL0@mX;l9gYF~!~1W3TF5urT3q)-(Ve&XrY)H|u}`L^9R1TY z)fLBeqWOQ2`gy653H8H0Q3V9F3;_$!S6o4c7)DzqG97%x{gvYh+(KeSjW$wE!hChr z^V#bX$rg!1DY<@KqEw(D4)lnL8lH7JhZ#)WDtrJ8JfPQEQY~g@XMLle{qsz^VxD#S zea>M_SLIi%(1=nzcE2-0FIG#L3H>6hlAxy_`-JhXXYbUc0h9>M?>DG+M97H{hz{+$ zuy5Z5Zsh0pM?>fmBcX)=Ci4XA3>xv>eWCk5N8xZ6mM*4aMxy1ycnx;mZm>&mUw7Mm zUWTZ==+Laz+6sRNfEqXr9z_4AftmpPp|urIpbuC9`ao*VB@qQft>M;4D}zs}WHp)fb=XKz!Mc z#EBEi8PWQeH%7wiUf|wQWoD}0;a*tBgg3t2-b#Enf%6#NsS|H5;oUicG~(9prxV^! z{mZg^A^0o}McWuCxHJu6E0kLnOK|lHUdP3XCSJt%YVJgIXesf(Vj-9}8Ztq|+<9Xm ziP0pXu@8B-6VKHWAVkt5l9M!Qm~Tkc>y%b-g9*{b=%3lymI4#(PbWujj z`092|PfYc8st1xfdtA_dOQMF~5Q!h;Zp7@A^QmfT5ETI;pam(wiRgT9&>sv16Tlp> z4Ez^(9b5)i0i+e^^I@bk7r{w0a#-4pJu$moq5ugKr)DA{4OT$#8-X{SkAdsBW80a< zF0|C*gR~U@BjTNnLXNDHIH|_i?Raq!I~EJ;Tazy~?cu#p#Kz&NE(oyr$6Xxo#GXT| zKE0JOVSptUPcW7|tUCk4ECswl23vQT1d%G>4Oj~ml^7@T27#5_AtGWz7+KJz1SaA05QSa*6k-yL1a8WK%4A}Ri+T}x#$hOO;%f1Jp8%JK zeL$kDIKO}ms~3t1J{7yP$vzr1q@YR_^DbSo575I>jK)&MsPw#nn+r1Y+ZQTE3PBJ3 zHpp_Mr2AdP7OrJTeM?K*l)tS?nScAzq4ZB;9S_Ea{RNH2=+NlzOrr`%z6@wiCl)0u zQ+SEYl4@0$EDp0)FXMfUGKoYrm`-a(9$faN@c1B!37qZL975qK)JsjXewhE zn&r8a!h)jA75U}Uciy4TF182d^f2I?+GTk#L@aOgNqL~xnjIFC(r!+XNyQe03H~f;u(Bx@y=|}~S<%O;;FuDxYM@n_ zEi)L^*6XiX8zgp}B_%VpT9NExUUgQfO3N@(uJ7xNa|19vbOIO-+8ID=s#N9@ zZyLw)Qd%V8vfWY?4w37?mnpDM_Q%^7sDhO}dF| zT%PUft6`)gz5aDu)lOcLtTR?|tk;kbZcM3^C>(arT#g%&o)BiMRN}l8M^TPRH*n_6 zJu^R=o7bmzjVN<&`xRN5NmH_*A5G_HCnskW(9FSMMs1o*Dlw*}N~B7?GF2?Mpiic% zp{0F&uAHD<yL>9Tk zqSh)TQj66fW}Zw`SmwNg{LYCenFa`bG*?b@!>@?!n^-ZZ`b*y1I}jxAXXU8p0bEJcG##ti8565H5_ znq5DE2f=N*0tCZ<)kOfQZ)WOfrRRSfBK> z2E*<`hmm0nmfm5I@2_&%!JsbgbM)%N@x{Lm!w=p?SN_vl)0 zrb)?3O}6}!0Yj(FsXR2syLjUCq4mAJX=;X6TZ_E|dkqf^jq4o5{BorcRM1*#2KMGc zb@x<+5goh1H0z2GD}wlTG|zikvRLFh#R*vXhPJWVxXrW9An4o)AlHcNk6*cLqMlfY zY!-Y1zW3RN4WEHx&;W{YC_49Mr00cdwN0%CD`(X@QpplO)iG4CY>t~se?X$wzqFp5 z&%rC_m?oDw5{?6^bFCXbgYWft+wX3H3mqM-hWK4=>QJrEQKngl9^e7@K4n?=t`g#;0+SI*_!1jMp9tJIK z|9>hEjX2W(v+~fLgOybeR74!UV zV&@X~AM4(h>XS|;7syV*Gdi*&RNw&8I;}O)&|Z{OAr7g00~&2!%rM$CeiOV<-ed;V^7P zXLU;pP=~m18*B<(&q8E{zVq6%ah@`!HEh&G+I$9i9g+#!8$$@`*njDjaV4&pdfZ`8|Em0v3jvcMTCAG!Wp92 z2uj6-v2)ZY>cKZqdh82Wc#5S!+&^wR7W$(I!RG@GMJdvQ!Zhwh_yJ15&OsGJbxP}$ z5qV=iEJk&&Rrk7S9Pt{0#9BHGUZ=gQs@Qw59sN*0^Vwrrq1CugLh6cZg8qb}Ggx$l zHJ(tdqg1#ZMRMrZfo`BG2!1JWMEntkz!(e9;vY@UFyM}FU5HF}+-rH3iZo#W6fTrmLR=Js+f_v`6g2=FY!YHiG9yhT0~%1I zib}M#5fQ)26m|kv0sPLm^aImw>~OK0rO@(gsqz=)@F!sFKpndToXNDjU}?&XQ1Mp- z>Y5a#IK-e10c@Ei%n@|22_?#m6$1BDQ38He68ff<)NpDlvAXO8B=mQNjb0;1oTZ>K zX~5tRHm48ceHWAUB6fG>B9_bnV!GxNJZ@t@q#FCprcV6*X(q9B|9+|1q_CP8`PQwB z4467*ep%ON&TYOeS=nF!{mztWb5^XFGi^#iv&FLJ`N_Gtlb>HRjj0(~RT^rjLhK|g z1%DYhu{%Ujaj}!5x6#~_Md>V93)nVL4BsoO>D8iA17KfJ%!?<#G+E4hTjVO57G>5q zEpDpM6tQ>t`*Mu9k0(&Ypmlc*>j2_2-A0 z9)KUd^cej3__RmAV?^C?u$XSV8saUv9<==?{Ah!t%Ye;DaQnKjslqx%M=O?YvLS^o zJfW(Cka`wP2WafX?;SZ3k8HxpV$tlNuEY~S@W_$)op3BJ=I>REX*bqo^-<;22x=~t z#b7BN#*x=_%6~hhzG(T~c|lOd<4M@KOiS2tA&Q0mB9oQndPay^5$&X|V+u-vXO$J1 zG~vS9$?QfqWmYJmfy`ikF-%@H*#Q1Rwht?+^7E_m*&XBW+Pz`-UE}*LoZ8H4>$Gh1 z)P?;zs9VLdA?$r28e+mI%l4nU;E6aHdMOE&_U~Ux0_uF6ePmM2;wrnnYH^Kh+xySG z#M|xsOV7Q(O?J!JL>XruH3;=uHO(8fag~QI7hGy>z(s2kHu1@A5M+FIG^R~fY;mV# z40hDD-5!*L3tv2PVev5Vt(wR&;e8tAExG?O1^JmS1 z^I=By3lO3B* z({2Z<-@mL@TZED@KS-(;8IjO;T`r8v-s?Xr zJA-<=1C4`!r|2V?kt0g|&(HXJ#`FGvzvSnhembJu{&sfu+uOVMr~d!D{v_h^*&Mi4 z9M+YIKa`+5L7`cE7Wyt^w>RceUE>x4sMIFBPef=uDtbWYj{%MeY2ArIcMcg`MaGG?PAv8eV8gY(@c4p0RUSCZdIF!@@*VJ!y87;8^o;sgl!5xb9h{p zt!iA=0awUZi&b$$^i%16zK*LB;%(1tS(K(TP1!#49&w%W_My@G-g7fx*t>7m;G*qQ zOu95KT;++j&}wWR8vXGGb=F(!%SnfnH#Z&ZwWWZch~4Oq@dWe^&+Glm+3iy_qHQyw zGBXFx8PXicr>W|Zv-YKfr>AUZ%j5e%f)20?&7uRT$=HuEhu2qvm?dBrRK`1zrn#89 z63>Yk%zp~-MR-GobQzu_7`-?u2pDG^mYOrfFh>G-dy*k{1si`p=DVUCc!_Bw7W8mz z;mM;FreF;RJ7(?MH)}!ez_I&gdGhGRXaMhN?(Ty}tr=AwvmP`QR)7!=!A~vP z9JRWlNUsG=){JkXOOuSg+B_$%jFJ^8ZMy22Kc}Gv49oGOCFpxwGH|<>7WehI;5*^% zg+9)@q_0c5@4`NfWqtjueVV`Sn-!hfxYaPiM8DO4pfX_hR7np=>x*tsD6l~xHXEGA zqLAc>GQeoAiEDkCRmwA=+F7-;-mJ)(9-(w2WPNk#`+T*l?S=4?C)m$({(Qe&@lap( z0L}K!zDL%B83Z2>^(4^g#IGDUJDC;y5!^x;Xo^wSA}klin8o0R273%O$!jNC6|q$T z9@emk55x5>@QdiD^(~Js0}p0L8>a3SSGLrPTE|C!>kdUK z%`Qf*k$TgZP^1-w#RKx_@Yu`}E+j2VgMF(eps`%2R)F%PRIF5Pc8REx!pPt5KLZb8 zk1r?hZmG8|do;Xx%8(hh`j+dhV9KF2jH1|OwmCfdG?&d~&Q<1?m1L?^t*OolRW`GW zKdkViyg>w50wx~j?TV5oA!MlTQ(@j%wi}_XKHS0$WTc;m3L%(j==#9#8 z%lVbkfUzLGFnQ*_(jv%Jk0^ANOCDUaQ&R3K2r(PXQzSuGeigHrXT?*+#di9+>~zpk zQd^9M>e$8V92m@{K2d=Q)%I%Cl&>7C<~ z9FXF3)K-~n&&*(p3vTd=!UeAANP3K`pekRbh<*a@b$Y8jN;yooEVjb=wk$JPnbW7Z z#{Bi4SReoVa)XcGC#M*2d`6S^NH~**B|xy+wlvRf?hSl9%iO<-q=d zqIyJ|s-84D4Q8=ogS5(nqK`;I9hKs1({n1`L{zCZbVgZ~>8oWexqW3LblWupvVB9v zx&6+c_w);T;H5(Q>RKOjo2laH$qD1&<0I$nL%b5bIL|X{-`Ih<3os#u9b8Qy!+P{! zMImU=n>|&V)#@Cr1%8Ud8CKAw)fZKO8OEgO(!TROS7{TbyU{SMbmrBz|HYpJhSfBT zh3~jLeTz%+te3F`zUQm$#DU?TVJRw^@Q;RDYwi>oIh~Owv2Gd0^-4!4;@HRS^63QN zP#xKn)(My}qjd`Sp;ob3p@V-^=(I{ES)pTC)WInq`TjE-Fmg(I)!HBTWOK4YZwxpV3F?Bhe;w4cegX zG_W_pFx`fQocIPwhNIJPqF6Hg*yl|kOm&kR;diTXfV=ddwK<0+H`KNv=jRDn0q zqyLSvJB6}C4>p49x9F5uR((Z6aT%zbI?59Bve}m!hI(kYyH|ktt|}K(FY^;8!o*h! zNrkC?Ml9qN)a;dj0I&fJ%~fQj4aGq^uF0#jD~WnKmIh*t4zx5U@Wr%`sLj}k^K*J@ zz~v4E+^zt-E-*L{7#wjgII;l!v1=F94_Ub2NTl!4MT?I<`1MhC-OJ;k5(vB*9!TcQ3f_i#Bj4og%zGK;yUjC*XH3SO7>FTFHx#0`&X(D9i+_foj#o z_KT}n+5CB94_sKX=>2;qM0p&IJ_C9!%X-&%?|JDycx`{nl#-Rk+niGt><8leUb+Xx zPhHT0`ponj6nlWsMIF``CSZ-|V9<9d=Kw3f9?5xAO!*zHK4Z$|0jzc8VFW!SD~o6; zRxGjtrZ?OIe*sdk97y557uK(TVLixIu!_t)_o6d3KxVbd(?+KCIRk%A8;OExKsMmr zh3>pelth|Q5VCXnssSyfV;^$5?4g1TdI^xe{0hqHmsef}2iK1uw|@P&@zIA<@-njQ z$u))nBo~F%T73ro-HHMuaejuHWP4UdUW(qT)S6kP!)){>C!4iOYXW{4Px+}J(N>M` z+IxVASJLUOd=kQ%M<%Q!gq>ue85LckqrW(x#{4g>cG*N~qwOZ~@%`gBj32)Nc%>P= z(xk3c>z1aZr1i>>8Z-M0yW4wLq0uNYmK#qk9E6S%qw!Sn_Thap`@aVN{@QCmPOnIW zI%OcvX?*k-eG-=}PRh*CYLmGneO|9zpR)L_f>;KN>Vzy`D^~h)djTzwzlL)I-*(40 z6=V=Epn7Wszjb(#Lo}fgIfywg@8rlOppz99rB;sF@)bP&l!G3+Vptp~Y%5xIHiJBctxaRM$}&^zLJ@ z&#}#`NUEL)LKk=If(z{z6<_h-MP>h9X7C;WTZ7S`>@(=+3!^tS0su}k`ge*JjpSV7 zBHB{s=oQ&9wHzGGc7rc{ed!{QPkTK5{#yOv-asMEXNUkOq=QAUpFIjS%yn0x5+JIQ z%Wm%o)h6I+OQ|GkA>wLxB~U!P@>H@s2(nH+kFl{)`=eTtRY4lrZpDB&1Tq`ZE3#fv zVLm^AF$vK{KJn~_Io*7+E)Ws-ZC30L7!BnLG%y7XkHi_f+ibu*Yfm=2(u+{G6C_JE zZJo%#qx|v>+a}O=HZzuFR?%zVC+pRSArJxefPrs44w7^VG)U+Lhtv8>Wn8s#E^SX? z70G)2ptcPvT7lB3`d7U7q+2d?&flL_B9*bF$`NZmgqPq;@Y08C)_e#uK|hfB;b*s) zVCeN`7cP!{7~NMqch$PFqUbC9yp`+6_I~>~tyL+c=`DwBeNdLws+qLY$|_PbncB}c zs2DkZ?SMY#9tTFXT%?oBTMk%JI<87Fw?v`{)qc88PU9*l27E(az9z9i^xA*MM}gSf zYNXOJIu5`)YfcyXT>cCRFtP#0g=P}9)2O8p#c%>Y?asjXB#5vuxBvKuZtM|lAPek+r{E{iVH=h7{Pmz>spuqr2#+fo_b={kvYTL|+%6g| zteGGdQ3UW9Vu;Qs&70gJD>ekeSQ|vy{$AD*?-FhF`(HbIP>+ z?wui%EmUNGzu3Q?Pp>J19yU0V-^gT5eVJp4w+mA zxGX1z;~xEQ@`6)mQKU|pLVc6MT=(_@qid%F{lV9d-3HG-nyP#f{_e|7xNkhiJOT>Ag9o-WFTG>wfw$f~ux#_P*_-d- zEc14)8Q;D=dwcu%HM{1`Sq{W|egM@cpTj)~EQ?%gg^#VS7+wMKxBSc z!4=raq81Uwjrz!^N51l zY5ismpR?<>cl&y;zd32-qI*_6@0kp)(U-VOcklQkJ*uQ&*Bj%9-~acG!xjU6(UIPd zg63a_!0*w7GZ8E?2PRi7KK>kdYS`p{`H#-u+_7rp_+bM+-E@{7c-L#M#pP^aUhp%5 zaRF|*t7*7tztESsF-_?d*U65hNZ8Gc+5p*zh>(p4&=j@d4NFm|Y67q^Bw+;aXEJ9a zg8oZwF$1T(Wr8| z?tG(PNrp$sBx!Xl?X{Lpgg+KkSF_)OVst8a`hptf(E98_ft7W(?DBMnL8{e{=$$vH z)a%fI3)NgWG@@kb#@UA^j@C(j82earbpe-zA8h}&p!x$aWm?|AeuZ*#RZ8`1M~|Kv z?8*u$67u!unQugW_%@@{)ekW7HdHR^3k<$~1;&hUU&q4Arc{MSMD?ybVMW%r`?6KgBNfSeF6E4vj61P_DGwQMB zTMQ=#mw_?rJBx}_6U}xq5K)a5>^gAt*u8t^F9>GK*ij%6;v{qbIrM7AnBEGUxYfS-fdGdzVfB4gf^$j^HASo`AI(q|V z%FI2x&%eK`%x_Vt(Q3~nYu+)SfAj4Ap?Mpcp59cmecM}Sw)v81vD9ufq!~2KT&p#5 z5oE6N%w2KYhxJ4AJZTb{%&d^`v!;djY+Re7MWj!$?$HPDy+bBi5DbMXT3U9^7-?Bht`i9SKrWV z=TkIl%am#`jNZ~Tc z3kY8x4HPFaK(sOjpeM!%{&JvXL@Je0r3kLw|Jl-IKRk16YPy&eNflh{9Iz1_cn#bu z)9BN^8m+{Tui*@KbFMB2h?HUpC&K!_qFF_rRd7R!)1_4WDRZz+CsVqXZP~HDIatzo z`|@p5iVW$aM26nQy|wV8+%c<9PM`X~q{`%IQ@^U3;Z|j@=DC%Px+V{k+WF|ia* zHxeB%C4|{!nPZhpptDzWhB%Vea z{eY!fZ>qBp9(?PDs_Wh-+=z1_eZtuVapodaxzqPh%nsdT)c>Eg!zgTJ{>m$Yjrpsu z3RdUw>sMZpL~Q?A)7*3G>^iSu+yAb;^k^NGNtIx%Scw3d6lZ)%K=05UblPYKcq&}w$kNg7l9 z=rUg?dh#O5WsYnFk1JhfD4aTkcytuximb5qAznwQqClsdJPv-~Bs(RYA|pR|Z9|Zl zeGUhYfLwS1Ho^-ug)6h`oYta!6tt?M3-BxGyV*kFHpm5!)S-LlcHv~p9u;JoPV}8W zCUcaN=-?0$RF}A=>tkW0rg*WssA&wi0ke??(fd;Ac1vbEu{Whdf>kP&X^Ff71QS(; z;H0&;W?HtBlr(Bv_K)bRZ?|ATNP-0BGKVZ3SBQ?knQ0XO!ccOYrnOa&w~HyRgXk6G zu}lej$vhCbom^aF+8;pN7w7bI8cyRx{{cGlUs{aXXgDb;dT;bzsZyswmo&Pho9Sj- zM-muvlEN+$c|7fz>DTNpiVo>z_Luf3`^)7H zX`*acgG%L#&o_9Zmb4@)kNp-g@r`gitZ=buN}e>;L&HxnP5YHapud(rXm}C1I6NMFGdw5id zp9Sqsw}=xFQ_Mh+4`3w;tm;V%j#I$9-A_Nlsehk0?Qz&%oG#ZhY!c^G+Er$yire+@ zkKjJ=Ex3=aO@Q?j{(uKQ2roaTeY`}<0HsW2~THYO4)HHTz#T=JNy!AVv{SIz@0yT#C$v#RkqBE?TRUx)e>@$^k24s!~ zqJ8VWKQV3EiSNmGl&}={57Yxil$26nDy>0(AQ_M|HsgipKTUpUz>Nm(=t+2qSr$DB zGTFm8Ob>yVaV(J=Hr!|xJ918d&pbCiUCL8X_ zyi+V$yA^&u^7?OnGh(Y5+#wTpu46?4E`yXHYuf>%v!f0yqS`68{F6_jn?Csjl%t7( z0>|iOAPfF6dIvlo@7M8XwNxcFBKAB_Ft-ElfEzp7=FmzvfYp>^pdi==3$39Hb{|@G zVvQYdz>$tQ>Ea*_d_+mlr?I1zTr3?f2eVCHo0dF#c5+&+e4@|hgZpgB;0Z_7fWnO% zn(FjYMGa`(E8=JXPPx7ju`DA`p_lr3j)vcxhMDBbez^E-t9{tQ8F)OCd%sqQ%pUydK`Al+coq zLfxkl8ie1L4o zaoLDri`yRF%pFF9oVM)ckQd*)=GeezuD3?*efiP2YPx%t~4S7i;Y?4`JQfYQ(X0}u+ zO_SvmNhC$r@XJQ6B7M5=4O;XvYL@~meF!pm8wzVW*sToe)Ebc-v3?koD4+zq-S1)Z z(F&?BP>w-4zlRTOfAwdY`SK41z18$eu`M{Hq1tHN zeErP>^jE9Dd3W!~KfL+!jaTL$ZLpd9c;V*2K-ymentt~a7(Ti8`U!(p4=ORM0N{qK zyC>dXiEh1sMxR1asHeqP3fv*F5lJVr~ojb1Wn)lYu5x32`{n6Id7vM*TdY~*mr2D}mQTS08t%N^c zg^P~>VorkE$%g9D7Q@qx;SmJvz^wskh|bY=!0nD67{`oifA$6Te*Ny~cVHZpM;--J znOYQe`N>8rB@1T2BwDhGC> z$;uJFJ`VCGtRzuCy-sS}9lT( zC%4Qt+b}tZD;=C{n60s)d^Bp0lO1DI(;tgn;#Q88YQtr-of$z}hPo-9xmMYvPw~6z z+*!WTn)Kmw_FdRFXLx!|sV~c2=kllMOZ%g*(!W%lVGCwBXP1SwdRcef03MBEJK;%) z@(ZQLHb7ny>Y>!KdPqq$S_0_j*TW&tMAy-qZ>6mgY#9s`@E?GEArb}(F!L6hCzys@ zM&HGaxZyHt5H*STAa;x5_)T~pOORC?O_ohuCjK0(amf7rZ{OAN=SP1$ zvo{EWzx@jsYg)X&eUd3FNoSU8`}fz%iz~E~0JX`KWzv}y+BtKy3bQ$=1<&=GXvoV? zvM|z8YySZ&-(RuoHp^gBDA!oK_rl)!gYP=?*GKn%X?)>J_}g!iU%u_h9d?DL!rTn# zW^*t@VZN&xCcTxe&<4#9zW&<>%oQ4~JO%L-88;~I3fYIBhuBCm>*28~;4)$l2pl$l z!Gbibo|^`UPg2&6x8Hqn5gWnya%2M!ODw*KS5qrvvWmGYtDjl3=9$%37ag?kx;poT zm6QDrxx|t;Y*s^Vir8eCPuWEEUtEXg3UDc~c)!jb6rXXD>r4^&stQkFK&6-oHCzlQk4bJW}a(IJRsmrhQ zW;pVDxs~bpDOMUxZ!qWOx{C7B6?|aK!aF7m-m!jCX>r4>nO;v#PO4O@b@@m6)j9xz zgPln(e?hO*8~=(u8s5~B-CUT55_15pzt&bawGY#y zeg0|d1QKmE|5a#EQHpb2{FM>(l-#B1n?K{J6@2Z(_uTHJyXeCN5yh=oIfCp^+d zLfCIJiav2LI$i4ZaH>wnI7H(|ULQV^$w&qiSv27Tm7D?ByNX?iMx!H!;|jyKEJlOD zXaS{6|HyTQPqHU^+_eAZ1||5Oz!WMTzW?*jV|I4_2BzcCLO zXzp?|9>ft5HEUIMa_wI$u4@Eac|-^CZ3Tn8V2hM0yO@K zwIv#)1Z9({*|T@=p7r27JO_$k!Hw}C1Y5^bH|XDo<{v-(%jx6uL-7Fk)1JM|w!M2I zlfZdUg#Mq89-?lHho|5v^Z;l|<+7!F<9!^)skmPkREe`D0s@JxoPHxs~IdpnC7ERM1wbJtPyQl+-9AV_Ar70GnWV^lS|vXXoTK-^=b}Hp35(to z7jXsCc%?RSACp8b#Y`|Fp_eLh44^n75si)BM^80HH^TP}Ig03=%s?FXJL&|G@t2-CND>*niCpz+$CwJ?)l z8-%BfhS3*RoGa7S>B`QncmYO7Px%oX0$+neKhmvj(F@};XfUz1seTdwx3{&vd~Euf zL!ZuU1fX%|r-#-|Klbwb!ekJ~ZivfIgmspV%0&EtVDoKo_;kb*nZ4^rME$_c6XTQE z6o*!39Qx~_w?{LPNQC(bJ_bf$wcKbETrOrWiP4hnML3Jz`UyIG zF*4YZ85}t>$X*JLq!)z4)QvT3AVxo+gmC0R{KO6FvB%Ju6nA8zJlF~Q_U+SmJvOqN z&Pp1dl|XF6UX%u~wvNfl;(b#bLjw;-yKQn5kHOgtzyXxBhi1afC0oy@XN;D*-N9*% zzFY~LTfcbG?%MqT6!|QJ-h&Nw3x@S7^VGW0FgguOqM8f)ndOUTjLk2 zbCr^0qf}xsr_gg>H^b+NfRo-j|5fzl7qH{i`SV`|9IyiJRagtpz%S3OSaA+mKnbvr z(3xAUe?}Cih=M^;N^zdZBR~A<=>CS}0x6rN-@1JHR(%#LEl4)>AN}cJxkq%Ah*KBz zcoPoIS#b`2+2e(<;8tpAsMl8``u%dOjR&9@BQb{|s~;VKwRgufI8l3|ZZGlxqLYge z8qwtDqy?pEJtzv0RRy*!#Cn28ZdEmx%a&(}nA}pvad%+P9b?b#+%)};KN zWt{D==4vbWHbbt-ISUqL?P+e_Gc)qhtT9`6y}GAk*W#_c&(gp2%a2~pE&)uRT=2Mf z!J13=-7#&`&U54LT$loKNBzdiRW+twH1S&al_9@R(YJc=Xfw{H{k8I~i+8o}d1cSm z#<@GsQayeA4ko_fdieOoC;_~Z7B;&{bddRf)qM$k8^zi8&g`Z8T4`n7vQEo~WJ|K- z+luWti5(}7bH|C}-1iANNr)lj;D!WJAmnO*aJD7Ta1|P$C6pFOxf@!V1m3ok5-60m zkZAMG%*u}Kgwnq6_x^t0msmSHv$M0av(L;t&&=~Y|1|MyL12rBHcM1iGJ#$lG`OL+ z4kDJbKYvRv&p{OL$8LGtwM8MX%SvJvN5bPOFP@mJ2)hzWgIcjz#qjGtyz2ck(z#C` znmhNQPXR+haO+^ExV^VT6F41juX0;VW~ZL)<2CuK1Ac?n7Vs2SJIwVOu7kI$jy?t& zQE~l?m7W;HN~87&pQqW$L_VxTTuV2$k?md0K`ju%2w|vid4NC@T@4})JFs>S>2pX( zqy^b0rw8!Z2criQ1SXHLAN%qlfO=S^1Bh5Ps2u#DXX@0RPH;m_qfWY&*D*A&UJnj5 z+Vt9Zxywew7uoTCMrAVdyx=jandqC=DXm^`KhGm(N?KCXnU@#f)G>cu0rs`Ff!^t% zm1;A$Qu-yWplLPpi_RgL&d$t`tUvA-t>B1;hqOX_y|hcpbuJ@(3Z>UwNVoN-AIasf7?=*A8z}FaxKP@# z61PV39-vIg`@r2@c!eWKTl}GF(mqY565$tQ=$q#4edL7X#g07oGs+KYdq*qUh;4 zJzV-crO4*=Eap)^BK&;L@||$IDeQqOMyzXc;EH(m(Gk;cJ}#@o;ueh)&3rW9g~CA@ z>JOu23Mo@M<;JE-d@6^Dht7z{{2+16M{}|^J6;7(_kJsKF7t?WM9m=W>${N1C09ey z%HlzpQB>QEb;0u1fXY`ItTWo+WxZ$Bxhv8H<4Awq@I)!CrKj#GFggMzi^UXh7z_4H zW8(%ldUOjZ25j`8#Q&pmhn_4$WM{y46tKHIPvqis0&H+jT zeK`W(QuY9wV}WWyJnU4w-%YfmLf$?-Da4!-Yzh)1JrRj^xqiwK^?$ja(s+*qaq+!& zcNlMn4u!F*8{@?tMEdP(D7fayYv$uFgbAKNn*_oIzCgmdYayoLeW&yxm&YGST03`V zUpSq8R^!v$uhDQBbokgltl_H8*R?))G)L|`a^w#_#Be+~BKMQ@jAS%iI(|mwLb9y6 zFVavK@<(EmW>ur!lf3~Ki%RurI1U}PAKQlAxuElPP5(7~Gc}2zE@21{+0S@xj|Xq@ z=U9O-X5}$U0Ez9stcC9P;k^ztKjI#hb9z!oe2M22#uFENN26zI5krW$LbJLm+1%u` zI*s5DqqG)n=Qc=}eUVq(b$iQ!oi@OTy4I3Hi_0zYc|$$^O541N9XlplIDw_rtCy6H z1~jXDa)5DO*3lS$Ij*JwoRyjMa7dRgRqC!_6>U&FJ>+A~cUnNsAZmXcs4o8m`6!lu$p=Ob>CXLBvCyV9!%F#HUikUmcQYAO>bZ4TP<9 zOfvdvSiVA9k@oxgVA9Q)fN;~$X+&&=vPu_0(M))aX2{E~f!qN8iP5^O;qZdR#=y`R z~Cl}lmm+I+Zs+rIF`ROlX%AB}qRy(R7CMIy_qR4VY{ zH$$&@c4;yNR*z)qIR__*9$`K6dY;Rpw^m92xVCugs2BjOM%4z&+d8v{crBm}%4rHA zaJ{GV(L1^hZ7=Ux(C7r#aC~?uzo35F>h3}%q`_CG7oUFNMnNgvF;n_}fUd05@;^m1 z1kn7qi9JizQXPnop)hJHUPi!DFe*7mNZ4l!_E1s++*?&ah99J1sfm70fP$|cy{G1LP{S9D%Rd0UUud_KUPoH1| zX8;ZI)Lu`E<0i-fuZg}_&*)1v>4h+|qdfD0uP_n(#HRD*x8(tq^o_+5^tYP-x?OMa z1xFd5pQCW+0S&B(ge&OjrrQcCAB@&Wv%E!2g}0(0m}0#(k#G`Z*i6Jv<3tiByJigOz~oF zBt@Ss7`B4ZkeP6ArG;TsypA)$CxK?E@p6qxwPEUPpaQS&G@Come-9<81=WU()Wlas z=zpG3YO5=0sUlpI2R5j6*D?!F7W<%={}G)m1I9-mmp*PB-X$${nkTGx7B~-IX$Boi z{&86Oqp9w&(rhqmM1_?;yYeNipvoBjOOQVOlV_yorr&2?(wdbhVGW(+^Q^3tl7`br z=H=-T&Vr(BBcm$jeh&7Om(#@>=_%FR&Sk&^EXy+wOkMaatS)e_pI~-6%~u{aGJLNd z+4mTUU4Xd!7{SZMqp7T3N(KQd$LG{>y;yQerNyur>VYqeVV=Tb*b)l6kzj=v-LP7b zJpAH;R0dXJ>^pD!!=HBS-2TPR?g?JLq3zIzr$EO^Z$o9|SNrzqT=`=+4KLBt>GX&# zla^%1ww)L*z`_?7`F-~2vg$5JOP+TH_`$pT4jkC`?#_Sg@YH3Tf4~31Pd|Nda+@|V zv-PO-+HAmjZ@mAFA9fD)?f*V}=XCXX>8aMWn}R~ut+rHkaGbr^Z5Us*;I<{TZHs#S zW0ASTPDQ9Fnoq|O4<1B)jLW$Tz&IHMCE1&z3E&kkR)drg&lX{kO%ja*0& zN)IPvdExaS?3oG@g&!Oc-6}G54&3fNFE-9~@!?oFXx0>{83k($Y#o1Wq>*J*ngW%@ zkFM~Ut>U#%p*Ls}I)A2kSfprpQO2)JXbn0AycU4Lt6|rOtbS5P;Pj%#B?>kJoGy&^ zkD7R|f3z?i>hsJNmqyfc!gVfIjEZcbpmh7)=ucrTU`23t@H!Zv^r#(HpmxBmkdkr0 zWJM-|J4hUGS#$7UP}Xb8*)z$_BsZH(>R5vU%8n)y@f>(L-M;nhN{3RXGc}l8sruG> zO>pyQXVUpTuP|H9+qP}nwkDp~wrx8T+sP9@v8|nV zYv1>++O68%`{DGdb8mm?TXpa0?thK(sW3*xydMYL%wnEf8l88wnXm4nLs1$VF1F5C=m< z^0OsOTsTCI{6`A{st_D%kTm&^5=GJIW^Y9UkVbiu{i@sYG83~Ws2;<>qZe*P#G8E- znL~<9SX5X;dKeQTtz6N(br))Mh6VdCMgMcO#W zmlgCpAM%=GCZR~HrO(EF7dpp1UIy|O*d`jiF?{_kL z1iLIm-L>4YyV1XBb&_g~0#eCdAnMD8i*VTrp|`PkKI|1gfG%-7F4~ly&yMp6J@*j^ zgf%n|udr@K609@35ia==-(d&*d}L_dE}ZIJ4*uIfC2j>*fw}99)|254Hj4T&b3Rv# z0$21kaI*T-bA#ZnQ`R-QX|8A3&U@YXWKfAy0>@^B*~B#zv2wIgjsurBM#+4jTPdC_ z2>zH!lg84RpfJejhbqpwUihLt$mrnM#k!Zwb9I)v9bL!X8q?eJcfyu>K&S8F+K3wz z&9wRHP<(CyMfQ7L{*N7ws%>_QU${8E9;Y1_51SC~FOwW|5AY0mFUQdvx0B*=RFe@5 z8`tuwWr;T)>lFQ%7KD;nSlchSy0N`u<@yHKTzdR0DGDiyDVD6d(lsUa1z(;68z8@> z3bLPtSQquUnQ!nMxj5FXSXI-#d;V&v^wf&W8PO&0s}Oh?TMy`5Ow!K#9=gNsf>B1mqqc`#*k+b^Ux~g)Sd(nm z$5~c5?)IWe*|rJdwI;g^4V#6z`I*J)kXp@d*1Ee)XS0j_>tP_1(oAz4)XHck^{Fg{ zie54eQLKMM6jii_f()4k++#RJ8v)%kOA4IUmLeUDx@D=_6YtP)UE4eUGU}LmBMu!& zT7r>6(6m8f?%+oSHAYpGAB%lSSNV9)f}ZZhSDM95%IDZIpR4m_F|>g1^ZSC13-!Ta z-q;F6=$JOw-XwGt$9C(v$8^b!qwfRI)A+&i)b!aeI;-lLE~8HoK%MCBvKUR1CY8r( z`m{Fiw=l*xz{E<02Z?w4-{XIyUQC*D)}wPoQ$Go1EL*$TMoB6D5=ANd~KUtR;v!IxSJN+jziV| zmS!+_d%q7SKA*o(Wc3?OsotPuLo|Q3lkd7rk56#)xw<@NuWR=0$Fj*tjV_0DfbnvG zyBwIM=Pwyqi-q7hJm3~_Q3PQPi0d=`%7TrQ<*K}ZdX7op#|xOXc|VtU!aK#*`rgWE zGC$RqZIx3tuxO3II@?ky=`?k#cmQ)xwDVH2P*AW~bkDdjC6o@PHM(I8eC5 z8I&o#Ev{7R3FC&q{x{q#q1_uPteoE)z%kk|3)1)+%QR81$CeQ#vJyHUzr9c(yH*S; zXHLZdSwyZ2FY-5u!p3V)G=fi)m>%RoZb#D%+YQ&%(PgdS4gXT#p({qULZMb`r%^z-PN@ZHb(2E7iv4!K0)6>CNc(zsDhH6!AvTZT6rmJPP_DWbA z<{-5uZf0^$XDPj8qJcJ-r1G=wU7Mmj%QoY9+Cm zchaL}2pl7Ue5Miam&AHWELLunG}Nr4fjwI+!$>&!F36<1!w`^^vBS#M7O*wtpkhb~ zEvWUsQ{$fY?5Z6jlTxrWIZ*40yeg~qvSdZlw3RHZ?DYe#mEFCqeAIk=soNfQ9;c^M zxx={MY5G0Nt;8gaG`^j$24K&1CQYUVIAFsI4tYsRF@FEPdGmIC~zQRn?X4RF=L} zl@4f-N7CE;^LI?Jm*dDB6YfEailXZa(=H}RB7Oo(tBBQu5Q|j`4MiDnWA=4TtMFR} zMt*{0eRU)3hU&l-s(TSv=c|cD)S3>473l@#AB`e`g_X_5Y#im(eBKSc#gnwTp&~ zlF!RU3z|d$#`ZKws~>EdQ0&?#A_%mdDaM355}(EG)PU;IQD=d;9m%u2vb%`y+?bO5_m`8 zIV$y4{W($SWX(qM%LY!3X6gqGKBN#%7!zxm^O`try(?0&7mbvBgjZq2pOqoTcsVT- z&7z#6kAgeLNQ7mu3sVjL(hw&a8f|c6pk0G8A+D9}WR#wrp%BJ4oVNaL50q?waq3Ru zjIZV!x-p53+rR10fh#AXu=$cFzYbzK`KgI{?H3}W4@@;m@x+7P@!|~z!W~E_Aq(sf z+EkvGKl!ZWHH+dca#Faj9VQk6x}J_9hib5d7S58hx&31bZCBjU==_BZ-a9(jqxo?e zp63aJgUoMKgC5w{Uik1&YM(d!xravA`p>3$!Mft4X}qm>=9kA`7KHEje0f9Y41r|` zxjx4SSs1bwYiue4z*ovXTXY$Lp+*zL`iDGXa0ABvah3sSy!4qSvL zi4oE93d9LC*i5>_a_+(tc$zzf@x10>&N0em3BhB#c6tT=^LWnn*6%L>WKwNc)t+rQ zkvX0nkc1p}+fPDKlgnqO9))~2p-lM*`z|BV$i-YEE}aSNO5b-3KN@q}DT4K_e8v@J zcLrrGHc51`i^5~-k|M!FRatDw)EcxQZ_+9#A36He4}Vxf4U7Y~&V>G!-fxDO-rHqT z49hO&!@6W1nW-*_a65r-gHijG7F%WJ&PnDs4N6qIG_BK1dj2Ij$ls2GK=nD86DlE} z)ch#Ma*jpZxhi_$I$FNdDtsm{(_*Kc?$L#rFgvNyqE_m8fvOEKtffn6<|f~ZUFvqm z)b^(V^&w#d3JKzS(pSqET;bRPbt9iW%8Mcp$(^51!Dc4_W$#ZX+`eD*3W!IIiy+2l zD?Td@N0H288#Eot5>7@&Mh!*DRkrcz+R6#ivDOeX$ z)r)yslFRGsKoOETT0CzL#$Jp0YU$Am4w@A6o}`NGmU0W;>aj3~KVNevfj`oz9VcEu zmN1ni_8b=S$d9fU$xOiXxBPV?NrQfa>+JujpvU(BTkFc>9Ve7{^%xEVZFYmkgiY&j zF)B|@7A?`Hw_iK|4j~sqdvFsUeY?8O0~PTv$~ZcgHMsBHX89__fSgS@o_2p`JIv@^ z`K)BP)XgRa|6S1?fC@WRh3PH4+TVd?V~LjU6~amUI6>4ADv_EatsJgD8`DD_XAqUO z%F6$^p%QDu9t|r5+m6z#o3+RuUS|I$>;3Wj7Z@63K<~Sn$mCiBUATtF_1hleo)I?u z2b!c*o0P!UInl@<>?5-xXl44EbtHN8Yj7r+J6whffhCiU9Q1rvT!eE6qqxD&WC{NmYTtXg0En8yr=}tO&trS7RpmF} zm4iOSkheF&p*0^;{Kzkz%|K8Q{Z5Ub0pn818f8dO2Z(;g6L=R>%s*bN?Ecy!x04*X zJ~yLj(YU3t@v#Ih+f8G6|K>o6oThpgg;KcB7u{-|Z!0-I?DD~R=h7DTUM}}~*L?x2 z#~f`_w99r|T!csB9MikdVOx{FE@#Ibd7vzPR;Uc0M@=0Z&#zhLW&yD5f8!s$-yg}D z`15IuLN;VTcpeL^5P&cy)Em1tby%qDy_X$!o4H_6GX?W0sU5{Gp(~6Tgd-2JlHS6z zq0oHM78NAiE$jba(d6!?1zqlIe{F6@c)m?u52=}_ihpo4lLROP&QO;Sy^|q?rb-fC3u?Hum6}s)Tmt{n3h{6Sd{7)xQHHS!S%gy8ZU&)D*t)a|wNOZ$`f=!i|Ni>o z!3?37a%L9klEJSXt3OyDo8)`&^$AeAA6X_>bdmEw?6{i}Yo5Di2$~{3=t~y}yxZp4 zxoj2h!xhm=u&n(4v;?VJRf(n+^c1LimCvDbfEe!M*<4ZLuIQS(aD_^ClPjaT0y2u{p+(<*hh?%h%(_ zK#dOnhyax5Z8}}xp2j=G*;58Nz;x)LbTgGUW>?McY-p>E25LQQBjC%U> zM%^=QTm=pXCbK=zY1vHA*;G3|)tJCu9-V8Dr{89Jn`!D*yp+F`t|$BthDSB>Rs2s+ zZPgOX!V$mKC-+a(zw>0(LJ;D=ruj%HIB|Rsy+T_+hf_6Qjdn-4M(g+BX!QLU&dYob zTY(fG%8A@n(HO;B4(^NR6WB5S^L;1hZ~gO@f7(dGGtW<2Ykj(DLA1sfQ%L&WP`<%{ z0Yc0O)&&#mvRFbG95)zsGQIadoZmYjTYgj_KWb;&l2R{7DSjeQr!0QTl*B?8;c7BP z720x2N={`-XZ_B*VPy(!#u6j8@Cpe)il?1c<5QdFlVbxmm!4whdzVV6-<=bm@JUPv z*na4&(xb8K}*;B3G0 z%6Yo^-@om)2Obx`rMD+hQ@DkCi#iSk>NwusJ*@e>N22Dx zonqnruw*?;pna+wO2w5>%jvD@TavZq^rY-c>HB6k+N8O+$ApOAu5)oZd-O*-2pwt^oc0$s$ehCgF^23VTTP8AltR8*&y@ zX{3Sf@nyAAuLnCzB98C!h)-v0ObGJrxV|e`eXmX}?F@SmP`Pkq)tk}a4{#7otu~VQ+i4YY*KcJ@` zf=7@mnTkFSK1|$ss=)5_=PlK_x8`Huw8yDd!aYt?fK&#)0<(F|iDfE1n>?v01h44d z2Wq#&*Oc4T9$$*Q3xl2jJBJW?`AoP)+xs`TvEV5j`ClET-h+hXJDtW*g>m$_rKTtyg+W9LQRHvN%fB< zwg}ZRZ_z`aN8%2ugfmIWXlrk?}X-m{v@I0SmU z?iT@oLMxczO-(N~wV}#1bz81VH8upLTQ6Ex%2I~l2R1@ozexcHh$M1aACKc?DwbV6 z?puFBKYF`#L7U_f@;ZH~c+gu4LMXE5s+W=Y52u5qh4Uh-5;6tsMM^f=?L6NdpqBO*+v+=?4;;Qq< zO5d?>(xm&yk4(g$neRl&W~{Q=V!I+cu?a`!Z~|M~2Ku1RTp*it${|M_{{1}^6aP|l zqsXiKYe5wp))f_G!x%wU?|-rYF0@+M<qQ{w`ezR;XuXcRGlEj- zJrJhYv9mija`6^MNF&d{{o`tFl^$KT>>nNyfjEyKRK%14g@VrweM}>od3JkU`wdw154l}2Th+A32y-zT&N$i4k5(th4d*~>pKcBZ#rz!x)e$@xayog3zro17Sh z4_m2sCTc}db1WZ}+>C^~bgj^j@#$yP3Z~^!XR%ObVf`HpgoE0R&nHeFd-44E0C)B< zjVM_AP8$n)6f>P&1`?WA(BeGpbf2V74}Y!Uf?|PUQ4lD?oU0NcUpT*pv2jcr5rgVW7ji>ZjPw{= z09}|c@xBHM&xf|1h__r<;lbOq+6kp6z!Rh zak@|q(|V<7k>YuHHcGvBDwHp&CV!jj&QYy!+`+-0x3f`5kH5Jm@?lXu)|*E87xMO% z>FoZr@B^JP8~GuGhZte780f!AgQHB6E|7KC&ecmY$HJ=?OPON5Sa@+OxDNJpI!mhe8s!VE8o>vVW zDLkZzK&(EdtJ0jn5oAfUS{utL;JK0sQ9pnt@r9g)paR(*m;RNw3oHo>scyh;qdi&Ueddl z6GS9FX$2Zt9Q#Ft!&^9nF`~z6N&}1Y7ll7eF@OLJAM;m#1#b5V5wHn!P~I~ zp&O_>{Rt=6$rYknGe4aEnVE3~wisT{wlYUs4@%kAf}h6UL2F>AF>eSn7yL2`k>lP~ z%H?`FodpY9Am%XZ!pTal5IgAe9$SakZJWAS=1>70+bL@;zRTdLKh!h!728;-pHM)K z60cIB$O#o2j?VvrHYY?L*fGV;J-r?TNu-{{A;NM?EXr;Qf(tPM`~g)%tT~3{>%}b= z)?h%!QB*V!WnrT?M6PO=WwHSLR98s(rD%XQ#bUEeT~G4*VNlFa?7$!3O91;&iIkN7 z4S@yKIgtF1iZ#i!8Q}au@sDxy#CzfiWoQ1VQ6D%sT)gYUK2RL1}Qe!8lCUuDg@ z(Dkhz*?kX6*3Sk=%0&W8qjfiitY7# zS|aE%cYJtU`_jp(igde#%Q0SLQgHV6Kgo4@x4)PiBZc>|)gs{YO~G9@{A!&?KkZR!982U0^cF{&Z~jzY+)mifl<-j` z3We66@JaEvr^H1E^Q}NE;&IrVrn;#A(Hev$iT;;B456MqC0l;q(JnHxKqV!o2im)A z2@3>zB-7iKj^xjBf{+1#SYN=i?KcPZ2Ns6FMfH!ee44xf3CeS%(YX(HNWUx{#yYCa zz0rDBbeKho@BIyFSo(sxqv}@??{kUsl5f^7tzPz_U z?(cqu9~GEdb`U4#LBWre^vx_IMB6MX=p1m@ti1h`5b0?Fe^C8^dxa@-eZlGi!!%Wh z>TnMHLOBBY%y-6fA3afIUZ4SAWIm!+-54175ZeevSF_&xQWQo9AMubGn@NY^3m#m$ zM_7UIEgLIF;teZh$-lEdt;wfG-snS0F_*K%JaU=W48o|g5E37Fl zexM%cm+P?W*e@%rt&(-egFq1_9CjEq)o>TL6j#~txmn$UL`Zl#-5UR z*Z~btbX}lpktV87Kn2416yyrcm7^=zmeiI+mQerEZL5}imL!(2AL7;^%Me1%B#m%% z_Vc}PqOqDUu3@tHTtq{Ol!MihHOQ1rnFetv?)h@vlw&9v43&Ix8ndQrASFZYsLvQa=k&x5{9vkjk<6^pWHP87tNU<<#jYv znbf(9aSU~ix?wq%gfg$xG5)z_n3hZzD7^msX3Hfi57UBWBt(qgCYjsFr~$B(UaklT zGvK;~>r*jyCsP=hU>vuZo*4}lZ2tB?E#}T`S?wGLf8*?6&X>;<+dwZBNo|=5OQa&R zqKgRQM7WHziA-WDXc_lfJJdiHfY^0~_ymDBepGuYnQZ$AU;_cmAMqMRnoqn|IN za~5cmttM`bMh{(>n++McGkmb4wQi_r&0YN68-%W1mvG?TRPjH;nShV&IOWU&^E6^i zN9yQlA(pw=hwCN^d^ovaLCC^_V3`F4scH>)@R}j$Krd1guI5t9g8NbUw!nfWY|Giz zU^SSQxYY<*gGv!08%d{c{u0CEmC zqok%mO-#iVmW;4C=~~2oe2uyG*T##|jMb)Jk@DM7S%|93wgz14Twi~sZ8ioGGkWbp z3yORQbnWRE3);vfRE5%n84FjZFsWX_(j~acSh&Lb9Um+ zT(o7eA1e2gH68;%RAKj8K|nw}vrP<54Gj&Ac=`5x#Y}norZph#-64_MjeS>sihqB9 z=LIGGfge6HG&BY|0|7Dp1-ts6eN0|v`}_MRZU}#JVq*uAj0alLfcU^b%>26_t1e@M zCWKV$^}rjGMH`OJ2Cgn8n@k&34ir1CC+LYJfQuyA7b6L#aIyZt{z4om>XYuSQDaf# z+igy&mf^4L>g?QEPMTV@*f)4fqu{ah)-Rb*R5{YA;H^=x4L}?7bWTJM#gafp<|CtL8URQHJHfb(q8bfIkzRjPi8E zbMR8VCO%i53l-dWqL7W)!85X@iGZepxh#AXr{ft}G->vWSuNRN5^Sw(N`&AoGqn9r zW?ij-z1>BhXKWad5}>P%oBA zee$ustjIrTy}3#J#9{C~Y)5W=Y{|Lsq2}=SZQL~v=p;qh+u$8)mV&;8?DObZjaP?d zlSB6~;@#)mi!BFgbrwVU_U8reVvKW{6N?`>pSwu^2S(U{NFC~>B%(N9H}Y74d)g)3 zZJyx0)xE9r9{sy>F>AL-$z3zT{X(7kOKIbUt*QE8b(Ac`mrjq_)4BW?`0gpA#!?^R zkwYi?Y|@*RgA1-ktcN#ujrZ5qnNnSaRw&rL)@L3|>%ge;r`OcE3{eEXz}`L0uWR9$ zs+ecrFX_+T8gJ`TsFpW^kRx`87d^oqHBq`g#R&IletSSyj9WiXNXv@G^Ckpvi9n&I z4$vcKCa%>x*Oa_^sk>$?m=jV1}dKxp*&ViPG*)QjrQ0uzjuF1Jv zXGJC_;B;)tT=x;mtF7=;xK9G%(raUopur&}_j*-Cr>VT}>l7Yvy|L{Je$yw0GAkws z({puNd#LNzjcUrfjpn^`&F~20d+V89lIo*6Yk@bmJ9{8c-w}?4V>K=O$21DbnD_uG zx`U<3DoZZ>w^kZ?h1vH@zsRmWeMk51_3XW$ z{6b#f#CIbAjt z6P>vW21pQAs1%~f%33&g=J&z!b^+caq?CVV3j*9fQAU+`x8@}IG0l)>+R6Fti~k1A0lx}g3RIM5(;_7glACnP7_}~@6adqq0^mZA6_}&IxmpA;=6qmVEhr4nnmS-`F-5tm1q#+j|T$?PMrAf4f?AwxMiXNosq8}vUMXb zO`+a0>pD>$lj&N#?|pz-XI2J@AsF-4AGtIctJG(tjw|X1J|rzDx6bg_HqON@584r< zZc|Lq_EOpBkDkrB*Ct?F95?v3fxF_~cBU9v>67Lk8?xJUOB=z2I$RMtdpWW@?E7s4 zRz7b!7l9HmnI44>nA{#J4u~vU5rpqI)&d{OrzugpP&YRq+=%-DI2Ppa{1HI6NbZOV z7w~^1K$(ciykWeO6D3!?kO0V*xT0^)d!C>bR9=OJ1JZMfd0!X>`KADzz8Szf_T3C~ znXIct;U1pN3BZlOVRmTmN3U+a1V(og!1vEuG_X4~b@D>*III1~NmaGMP};d=`%K4p z_yPRB1M`8-@OGgG!g<>(#&uv95$5idQ|kA=?2g4XXfLnm;xA{ydwjlu2#OnDX@CBm z6P0spi+!#h{kf(v3&y2fMW^`Xc_EpyySuzem+avva!P373*kzO% zl_qADVt-W;Q=It8RE7v|s-@)V&Q^_Q!@4(ySBYEcx6a~{oy=xa2p%K;wjYhRLrr=r z77@>iBZKV3){V2?f=e;$Lo@GGbC8v0RKa-^SP_sOL=)`tW?($rhr}C{%F=MY@l1lx zHMwQV;v%(cmeSo`3ck-X3-R*wmleSZnow{;6?L)nx(bQ>1kkf=1LpV?$&=d&9N#JN zkT#PDdb&ZFdgd2!uipR;g!@BtTbKl&Yq0T2rwVmnRLo$2S7@2RsvD@tE+Kwr2f|e81 zE+oC^^0xGLvMDEMoV3PPxY<;up%>MRqbW0p9*sgXbiaTc%6nWs6u>0DDT?#%zDM^< zh)WBOgN6$R%B>l^?#f*+M$b90FYcN2Lvr5_mcU-jgn7qtHvRI#VQd#aI|3gl6Qly; z=ds|hid)~BrR{SQz<~EW=pexLp5a05jgbFJ^ock~2EP;0Z}f&|#DG67vF97}hW)@h zW2^9wR74!uvp97M*E8dsI;kB;w{2;6uscO&$Bo==Vl=lyuYwL=8lCv-==e5ZFR zy!huiUgZs5Qt=-RU1QtKdIbboKn$bhhxrV3AJTRgj%B^?yMef*`D&QH_A62X}V0M)&MAU{=7&Be%INeD`-&=u28+3{x3agKlm6|5oa`0x?IBu!8}8&wv||)m$zgk@UH3RJ<@01ORv*&UQkbKZ zZfy{tOt4F&Jx3=#pY~UA&gvR}OT30%#Xtzm^tUHcX(ijzM!xP7WCy{w+cyKNn2&qT zcNFx8dVwhWAp8I`>&bKdul$mGigY4>2IPmV;MC7hI5-4DelQSxN>I6fxnfGvt~II< z+GyW)v7Ak@;kwz^R<2@y`;CGj<-SRPrt(_rwGn1Hl`JVH!fg zZp`inHE_ZK2MQC^24OkLV-AbskJp)Xi26(3u#nfWG2BUnzb~fiV$i#^n2v}7beKx+ z1lsxor7CUR((g;o&WoEq=slB!NlQ#ikGxR3$aC@ytiRrm4@;Gf`0*F6 z2Rn6_6BSmEXX&E2NVFqL?KGOhnypc<6EAf|rP`0X;wmy!tPo7orDiHVlDfB8)wZs14g`Y`>YFE8D+t!j+#PKjUg{YS{_IVdIx7*Li&5~fuqR0}m zzAGQmTp66he@C8Tn*nY3D&PF|^*Q6OM^3**Z@4PFG*A}3z6qH=LB+^39&TZ0qt}o< zv;8z6To1+@-PAISDX=w5+oqD&QnP6l3^Ou%8n;{7Qt4ue7$>LxUGW)DOnrV+Q}yu~ zmBml8#~&{K@(ZNfz1w~c8dOxWpM3%^IG728XeIX2dU>7nZYF1`OEnd^%55d~kl?|r zrbMt@<3mVj`9Fske-zcjr4GSpLgNmM)xpM!UhllAr@tXx~~U`uE&^(fCUJ*|D+F>0Vub_ z(MQk#q}yR?!)*ZC?Fh9IxB&5XX!~#-fOaQlMw zLhlAU40!;$ZunmKKS2C{3Ir1lDFDiDSYEh3e)vQ81se=G0NQRKKM?#80|EsG^8m9q zm@hOR@LveufdPYkfZZFy7lu+Kq(6+Y*i*&`_Z9e#KVdb8jqnDPbi*f|AZmwW9Zj~t zIYy=(UABI-4c9o@Y(egZZtlCc^IZkaTm^US+qd&v1^Mjjw{u*DyzgVhnLtl! z3W3R0?}N+l`?m`a1VZf#c`_0NS2@CzIYC<7D)Pc1j{Ulkb9hyV;bA#OM^}k_s)b)6cL5H!@E`bJ1pi*tu)tp4EyIh(2ksaCchL86z+T_2z>9%2G7^eXCUbHL-jP)# zjB2qFPJxp4zZG|gn&MbXlZ{aJl4(nqjo{Ye8cUmv@Ey_31@~sYOF^Cm`DT_&;jRVy zW}ZtSp9TG9j!TjE1*}+=-+xt!Lu4x#z~vVFn+5O%p%#Q(8S#ayETc-T!p%<=xnmH@ zegP%9qvA?UfSTNKab>7LQSRUJr7A#G?pXOU7N9J5^h~J>P`7g4%Ty@`XNgpd&RQkH z_Marcxm?1}d7_BzP(_efj8)>kSunaeb*2m!DBKxIUn&Ds?u?-?qX9~HM%9+u0JS^g zYRhne;+?4oAQcgO!-c<^e;jOAp@-*WH(wHowq-r4&E}|dwA5}^t$+IJb}32PSEayTxbHfb z@3pcNI6&mMj$Kyp&X!uIqLzwul`Ztzutj8D`R?w8!<|6o*d9uyG`zcc6acwajBAYE z;U$>L%BmSps#5EM<@Hlh6oBoq_MJzXmp>dzPu;e9VPITpQ6E)fS5=neh_Mzf|DBY) z#kE&CI#btGv20oVz$`wm-JF)0Z~Cwwy}$HNx6|Z1(m74tM11X7oZ2WjT8lL<#~9R> zSih9ljNH6;XSqOo(dsgAQKi9?&xBt_Ofit%fO6p*q$JkM887nJ=fm-`sDDg`61e8k{}G z`>9v^#``})6gz_nC!#`fF-pL7zinD_@~BO&Hr&-;HY6hwgPf=E>z}Dv{lVdNssh0F zy~uE~+JE(Y7O0nMzVfYJdwB@!iqcsR)DDx}4^K}Te(nE4A-r||;ZsxDLNbQEa+zmm924D!y}qE`j0(cw%8g>VjGXG;^1eHX19qvnK|DWGdK8c;mYF~m^km2)N0G# z+acU}PYg(|{q}wgT&0F;lYKVrSRjl7lNxi@9^vdHWg?@vcaFqzy6{h%&cHL9i4I0^ zunBdDzvHr9I&{JlzVJ_-=$SEYuwxP7yA?vg4<$dSM|^QS>cupPrVuR(napy9y@iF& z*m3l)U$td+VLy|BqiP&^Sr`Z9m_Yn-#`>yUkNa}-cG~HjZ7dSkG6IELDI8(8bQPDi z->SP6)om(@U@EphzTquVyJbk4Yq$<6@~4ehvUCsYYDLX`=Y(f>B2;}2z7bE!i$%n3 zSG^`2y*!wcqk|%&^;%qCdxm+4;CJSFXCtSu;x8C2>3D^aJLB&)eeU{WRiT+Ob&DeR zb*I`{|G{yg)xF5QO+9pX&p~$!%Ki4k`{t-sMGw{RX&VmCDT&xCq{;E~y>p(jCZx9f;keo|<~ zil$7BWv7x}^->yY{Ab&MC zA-*>H_b7*h`X`Tzw!zGC_{SwFmVX8BH?Qx_6Fpe6KXXQc5g>dSC)2|FIpOG_Llzjy zAr$P53h7~iWY=cF1Pr8$`&G+jxo3wPc;~!T87GXG?<5SnD0jz}TahBLT^$)GEXNmS zTvo5fSW%e6bzGAxBRu$loav+!B)xs7kP;2VL6V&p()C6fr8XsJrcP4kRFKHKlD)mH zW36##Qqcxkl!!j_8!gW6t=5$C`OF1)2f#OTy04qFwZB$z2qO;t&twuT~;5c*ENEE=ZfA)zq*8CZ8#0$}| zor^Y6snM;KG=gJrW{*Ad{?(bJZ6$y=Y{*8|KT-!_@pPpp&x8KY|ZxgYgGfzq(Ts9l~Usv*3=Q|~qX4|Ok4XkqnWEbrn~>>AO|v9ZsgUe*QZ5OCj3PM> z-8;ci^6--vmFzz01Gd}o;Wf#`_5Gks8WA$8zsiy7sNra(XlhjC#pzRGe(!U)Y9_ub zE1dDNFqVz9dZ2PJmdb)jKQhtg4oy4Nv7?dQtWt_8Wt61MvvAVlsKnHwpsB!F`N_k0 z@iFJx14n6;v6O!r>mnTlW3Ad`5iGU7pG)U0YM`u37CmX*QjNW-B- z!1H4e7ZZ^~5SNzA!WcIu+NT&}ucK{65&jgGHL9m-$4VtL|5vc?zk|>Q;#x>%Ldg)s1dM-!%YPPQiF<5k9X{l5jPOl+jaRu*E8bLP8QGBqUD665Mi zu%~&7yewF+|5wyQ{C>uAM{Am=%FBZ7y81Y0xw|RTL;ZdxN`;*5w3<9;xwt9QRXu6O SdSQM28?+M|D(2r_;{O0|uQ74} literal 0 HcmV?d00001 diff --git a/FontAwesome/fonts/fontawesome-webfont.woff2 b/FontAwesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 GIT binary patch literal 77160 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 literal 0 HcmV?d00001 diff --git "a/Rust \347\250\213\345\272\217\350\256\276\350\256\241\350\257\255\350\250\200 \347\256\200\344\275\223\344\270\255\346\226\207\347\211\210.pdf" "b/Rust \347\250\213\345\272\217\350\256\276\350\256\241\350\257\255\350\250\200 \347\256\200\344\275\223\344\270\255\346\226\207\347\211\210.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..61ff53a454473e4a60bcb732cedd4e88742da985 GIT binary patch literal 3521817 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

T=bcXQ-fidIeQO$}(b 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⩝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

o3>KjtRN%uHrDL*q6Wk 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 z )E{4UR$RqA-_1-KiqvZ-~9lQDw zj(?!KGden2UpM_{C4^OeLt~Ze=u0gK;nH<4>Ce0RliJb69to}s+b+Jm_PqUS(ov5E@7v%JNsQl~D8y=uijk7#u^KpH?_Uk)GBge?Q|!%qvT}`C z4lN9o+6+NgYF)MPjX22=xO%JdxdajDBmNxM0MSI+=@(h8Knj%U&?4#?RvD~xS z;TSR7Z*f{IbkGU8ry%&=cZL>iy5iQDo1X)nxOkh#0i$2oK-@Dvav+1gY-+!dq!A_} zjKk1$wekiY(v!)(*sa{D4GF(o5!#fEH1M72Sdjb53l)vXG9fE~prnH{ZAcds8>a2xmI2wbhTF@nArG_>mCLakAsG;3oO}Iyo9!{=^+nHx zVd|z};JQjV5f>s|wbM)}R&i8%A0-uUu)u~_iVj^+E*F-Q4nhBgYyc^lS#>mxZi2BZ z2!(#0<)Dj$V7;;yZ^uK3b{-Q?TsxqWE6>V$TzGG2BO?LNp1|4BVNiUM>D>pMVMf2F zfR=!e!EJ^0k(-0i?p&v24xgcxzPKRC2Qen>$Tq!sHMM< z%oU-!BYY07E57brs6qri8?ZB@MjD{1m;PQM@~bd)n^ZSb;Cj0r&P;<+^-g$G5%O3c zlPHl$wN}1@p!XI*aYbcb2p2Yx7OD414q5ah43$@*H1ocYt@WVG0O3O(4%o7!{O%AJ z7Mn-VTQ7<6I1f4yJZ9iU5uRsg4lJ(o^h+Ko& z4{CArr^ya}N^&4Bh7(dTD#NhqsezO3d*J~{zi;vV*MTI`J_#y@^y@HfrHPCFlj|VQ zk?k7G=`s+apW)XHNPvL6&7}$_gKB|a#W#M~jP=?mbONeu0LbhH1yKNltSkLbk!Wo{ ziPfm0O!CHGOqh%t%1epC>1fl8vp=|CkAEghw+hN4bppd~1TgX2o^$ofI{$jr>VT#g zV0J1v%Sf^=$PfzgI-AuRN)ci4?iDb0ytNlb_!4a9ym1A@FUftFG|I&4c7hWiKvnE2 z=K=-FF>22(n>>E@Ykh4k*EZ#if=`MQ5EfA_4b$>Uf6wrCutG@Z$g%}2-~;7RZws`P zFqaTJr#}g2a>E+~^{Bwy*ilm293KMT-)y2tFyiC;;N=s zYSz=>HvuXm2-9ewu1ApM#v(>A&^Ts3CgV<@Ge{U`7pmS#%fz&kYpc*%gu)m)+w((z zu^~_>b{*fmmXue+fvjMr4CaaI*LNQ5lt( z15A3$^EO8&nRV)ZiEZ9lkv#`jpEZP7hk}f} zN}=WI61KCM0C`{y%P{p6)KXW+S5{+fU6NgOBlPo!R&{cIrK)(qKu#XKL6nBwE|{-L z3I%%`5G5Qsn@c~i238gO=UrnSrQ1;?G-xZxDYJY6ydx=fcS5}Uuml#|j)!X)iW`Y` zqd$HmT})=x9v1B4nD73qRq$E3c`kY9(Zj;7T(L8A`Q;m%;a9gWOz8<`uD=DrrmCZZ zZ|h1ejsIka!?wL`cJ{ zliYm)bEmApsODor^RP+E=jrYo3=FdG=jmJDW;0nnqtmW)q&rOT$dIxQ_W_nag`=MI zvxg-rqc}%EAam!S=`&ck=&wUovJ(I|l0>JtE^?StxJ%YAvfKrdS;krAW?4Ksd__%> zXT(N-T_BEiTIa;R2ccAX3nMGVEDjP40DF*=r%k}>+a?Zq5a>zI5H6R>m*@D83Xr=S zr6Z|@jKe0RpYD7%eKX!J*{7RRceXXD5IUYIi+9lttlWAeEb3qONQr)m5mY|AJV>sq zfa79p?e5g(F6%B>LV8boI0)pw-@|xzDIN;AgDBodewfHz!>tS88+F9Bh}p?a^!Bk1 zds-$GnPv=juIf>P^felMlchO!hJVF~EIiC{`-%7qBpO}v;WmrzK?t$Hv!<}<0d>ma zmt}KS`Sk+MrvX7zSHPs+9AT@3Gy8r2{yi&8f<%mKMc>+bcQ{p)O5kkshor(oMLZ6; z0PFzOD?;NjZ2~SBIp2(ge-vaS=5j*IW+@#k4te)VHYbX77;LUbW*_SRKs6Yw6e=Al z87M;>Bn(=aPnI4rfL6WJ{~M^1raGm$P5pB1O8BJ++)Z#u9tYd1D*!kE^6LIr7Q^_J zt=4-N7#c{E$O90*@NJ-}_WQlaA<1Z54tym?X%*OIlcuoyf9Y^GSkWM=dMD1U$%7?p2w zHT91)4os4*ZiX3Whlf9_y4IpYfoNwH0^s~kK72K=BMS%3{22lMP*ugPD!o>(PdAgF zqUB~l4?|FH0gpDln{CsDpPRwI9+$OHasOVJ!cv1m^ zlsVYO|2rbdqF*2S)2>Cu#H?dsU{J*&cfs*8|65_)4gi71Fc6slx@)kT!`Nn23?WY2 zmX(t3*3jb5I6?XAcnbUjwl-MKNrICbIJc_0qS0H#b;afL#r){eid`#v+PWu|E#VKW8lXAOh|m z;Iabz$XoCp>S8hA{tZ>!*EoPHP4}J+U_$?wPtbf`160kDg+b@*zi(TZVIGWb#lN6z z7?qSMI5r@IoAcL%@Y9U=8%y!m3=m`L{R<63|7WEpPm5VCUmg^c#m4z-k}Jv{Y8-?_ zLH6eAVer_uA|il>w$INXQjw;rD%DD1U5^VYTpJM1J=_4E?*4`^ zsYed&Hi%gPzEvThI}p&XWz*=hqoJ!?>}9tb`x#||{a@~;nggZ^^y+_&JXi}AJnWg& z{RDtbyFk*pP^Z2M=q~V&a&vR%seXk{5T258_te;}sAyxxLLM-y_y4sxk(*0{HX9PG z2c+59fJc&>hNhcQGA163HnAB%;XU5R3j1h51+7X;yN?J1H~Wr*>3{yNfKksgY!9HK zFk}YS91giUgtyc3_}2-JEJ^ zU4YQd`cTpp2t0$~g)>-#h)&YrepO`^*VWYpMwMJ5cOht#9!Wq0`C1vSm!`rA*q>Vc z(j`MZ)}qyt!4~=)}mUHnc)EH+#VvLWGxCSipI5tBGMa6Kw zy1RG(-oxUQ#|C5?=@*!u zXivk7n{WALl0PgX6%?EIl>;!QsBEU?6u|GLU0?>6VA{ad?Kyd3zw}}a+k(JCP@ud! z5O*`uk0QI5`~(pADlVDm0 zSta)XtnVWli6AYGYk4cmP9f;$s=0lC31%~~*>XszMsj2%1qF~}UQt+WeOuFRGHynY1TnxbAj-3@k-##163{1QTU?orMmURZ2(^!r z2>^l2Yge$qpPvD{-?CkgAJcb)70*ok85^7$X|Df z%<4-=PaiR270PPpn+AB5J?#qa|ND-`B{t;cb-$wstbP5&iKBT`1aGY$OHe26?9W&f zFHvw}8?bI3Z2($K7c^=YY5`I)C!HV)$q=&AgzATguyW-rxzcEt&Cy3|Ro%X9E*vm8 z=HUPWwlt@@J0KBuT@WbEy$BN9t3q)g$3`n7XgqJu|Am2iSnK=iPc5+;LHWa)$?C= zOv%A=>Iye$b{{~>8RZ6i$`=YiD;_zbc(;uflLI>av&Qa$)%PkB1GCppxg?WsKwQ=e z2&QG~tAK#GFMORu(Zm8RJ}% z=bGGIX%nOl2mpO3M!Quz1ycf#p1?(K`7NH@VZqLOmlTk0efQ)a+ky-jJHt27Q=o@+ z_%T5Wz2f(V1UeD#XOT>WY_JWI1}`3O{=k>3`xVb?XOPhfu$IgG^>uap&>;*(3?@@Q zr=I6hHA4fVhfrLw|INPr!4U^=)F?hz#!97O0;M8%*A9E2bqqLW`V_u_m=2Klv$2|~ zK$5QjSuRtSm?Ce`%8o(TQ--19Gjyh@ryq(mzU$z7FL`-8PGBSROt?DQZPUOmbxS@& zC+_}rvfF4SH@aPvscasgPxhuAvOFLoUW9?9_LsJ#A9ZN{r`k|PmHBU8*T0BR3*+$z zF3L1hum14sX@pEHO@u*Mv}>LrSA(HUF$=Gap6qbI( z9QkKZc&+|V<6!o18@NlWSsE1_b*D=3jXigtVu6n0Zhd_{!8=u_64*Ma`}MC5Hb9TR zUWz^GnN{cPP>N6DT;Z2~+{#*2ldX%E_*2kzZ(a!My9p$vUoQ>$2)?&mMds6?W?+dN z9~P!v0|qGl>*UU#nKr9nTaR1w^BhGl;eY{eST$BpF~$8<1DjlVHb$oI{_bRP$`-rf zM&HeVi9&yw;Nh<#51J6=3_-#Lug)Zhq0Xa!F)4}d1x4}~-t&Xar$XeneMS(#2gsbs z1BCW4y1mS-1(5dz7zPTT9t@G&^K=5&k?R>?3%xz}sj{b`@p|xlCIgDGL^VqIKJ3tl zzitleX*fW#Pol3HkSire3Faqg=J*t*>xdlJn}zuR)GlFr$uuyOn3$Rmy)vYB$|JJE zM~;2&Ym?)1nualkUNjMM@_ua#AOJwm%gIcxa<>-@8%ryzxy)Sk#d=L| zc4qF}-52J7bCo^AV^mejPgEspk#PxQQ(c!9AE>ByTNoW39vWRec)pB*d4kqyFvT6- zTdV8Es2&C&67*mGF{Z93M&p8(+~f0Xn~IEDXC zV-c8sPv}e(IzcaTCw|reHeIhaCS?<#4+a$lATgsLld-9KxShadVN?LD)V^b(tRN?( z&Nv7LPLd0@Lb4zq_HMXzCrToAfANuU!^L{ys8yL?6a+}B#4u_YSSyJ&0A$iK`2%LL zMHqnkZoL53UH)0P^<-BQDC{WzNyN-b&TW`MlfX5w2ITR$(9x&4srrgPp?G~2_)y>Q?zviF{r;%f*mO_!ET;6fYA?e*J+Tfq9luYrG7b7!Q*D5T zeJD9sa8c>82@{0`05@YTcwKBjaQ+}XPL=9*w{4v6(g^*007 z^*ZYz?i<35m6Tp~z~#8H%r*J6;*a-uFtR80)aMFf{j^$0d6^Yf*QVhP^mlgW zLngrU1NQt-f4@ahp#7gPq_0J?_=EfawV%)lXI)cFHkfdYjEv03)9s7vBN*`FE`N{b z2Pi#1Du5F>0@DI3V6n8D1dwM=x0etDzxmfv>Jj7f^1MXe`hb&SAiJj^*<4Aflnh!R zA9Xq}PaO`aP%&i(3gV@muV+`VN~)a~~^3Kj-}NGhc$Dh<*(Dy5(x-5rCZwB#rXNJuD1 zg96g&NT+mfov!`R#1`%UVuY$ajI#|*_c0Qg;I>k-wdL?X6@9qBe?UOH+U)=s$C9m{Z-}Bg z;et^g$YdNr4u@wEpTZxJ27f%gEAG!gI579iV-D`(M%EDRQIP6e0r z$6tW=4e4#;w`8SMIakixgHhbb#3wa^gSfOn$e}69{8J=y0)Uh25T6(r2;6zs&gL5? zE6R$Czb!{<2)pm)?cM{tlFOH#Q~$M<*P{f&^;JMEwKad2yV#qWrdXL%5k?TeT#o{n z%tH7Y3ng@Ea&n!ZUaYK13(nDgGs`}x!?BKBmURc(K>1GK5ia59FDpJ(ao{7hpSwOP z?;R14;hey#ULfqe7}}~Pla+ulQ+)1vOH`yf+Jlk^NohdUn875fVc#P6q2bhcm0PH9 zAbHAXJhLfe=c^Y>U;Ng!Wu@)D2>Ewf{8v_rvoH3>%pR zGa5YgJ|dz}W~OyTCjAi!ND~I8kiC8!QlWlfxF~lwEY4=+nRUD<4ENvw0a;)mp`^q) zcc!)82Mz#5DYk-ZaXYs<%z{WVt-uvYlF>#gP=-sN4=jDz62^27*fPBGF#sF%b*E=! zJd(A5dR`mzt$6Ld{h{cs(zXNyV!C;U8XvMldVcHJ&CYR{_hJjdY1i=STgUAWBR)Bu z7Z$ZW>wCMX>7R{RHLxG`TTCCE)%w0jed0XXTeRYS->u3D?}-1X%)`aI*R_S3Soc0c zk|y8>VYeDGQe2m%Ed5j~TUwo_19kMQc87vJk$^Bop%p=$R9)9Jl8L`Ok-GY;4p9<-P`@42)NkM9u zrZO`K*}u*U7l;p>6zok20=B2RJHPUhc@{kPIL4^?Y)hMY7WBIRdi4e$wyDXeNk1s} zpdFi>nwoTT59T1CrbDH-qyg6DiMU(hLIF_XL95=$$I#D@Yy0u_F8(;DnXi;?0)FkY z^VSd>JsVm&I!2AE=M`GundRQ~7KsTDH;JbsoG}-`N#sqrV@W8M+sm%5eGhJ>PRM?a45GU!f}3 zshAxv`VPtGZT-hDnW=cr7_pTSJ=yFC?pBNANvg6EzEMha;1p~X#vS1)^Alk$HYI9X za_Z&8g1l9_cfXAkEdYaN+4a4rS0}o6ba9|$yrxQgZ*9?w?pZ+F3e%(bGiK)I7VWqf zF8=7!EwTHSGMjqPkfD;fC9UVa?!CNR8W~o30XJ}m)5cBKH9q`tKnjpjrI`K$uhvnT zDzRb`nRez=6ZkN0rKjKQMY`+&g5j~0-)K3f(u_8XT80SFlmJ7Nn(B;N(5ABazOYuu z%IAyxx<5}Pp7_=+h*n3^6D{}+GZ=X0w}v`xxTg!Y9h`Pyj$~>LI@FF}9L7iv5xwv2 zm|(=P4>|SCZP}Vsm#U;1wxOG*ZdH!0A`g_*VlB-qD`U`p@9)k0$oMNeWs=Tu7?txm zh^bT}QtF$5uEkj8F#r{9`Op0%m2%zv46e+Vrlu=skzm|LOm-0bND0{toCL`Or*zYMp(_S5;HUNlHO0YFl|mL1^<)l)VCm zQrXp#fOg^#Rk4UM;!mj1)>RwZ8{55mFfq2QRUk~cS)piWB;TN-bw$h}<*|3!n<4i< zS5LIiyIxj<$?kLOEC={gTc6I(a^?mP7JFjrms)2a9CD0>8^s*Pw`Br&ea}lZ9NDft ze_$=q6Y;$kx;749qmT-l`5(Sp^s^tQqdAxqKt?+>v}gd4rF$m(HpU-tTfi4r$FRp^ zonqt+u4dz}8x4Zr((B=~P=!BgOXa??$3~Om;xym&?Ldl>%WnGd@rxqsk=Tg-D{}2j zPz%={@t9*94l?dIto$An>8*t(apMQ-R06Z%!fec zqWDsC z2do6gXSXB|WW!9BFSz38!2rcVzd?=! zGfPYDN_Q7XGRx!6sol86wlG;Au&rMlm=1SXY`dwWYq_<(adPVFA%&hcSZrN&nL~{c==Y5x>^OXBchgj z*TqAh%pm%AH^_9WUK9#6Mk6~PWh0J-9?|(0-L>w1>%q4g0$n6KQcw^lUiBY&cY(Cc zuWr4PuICH%_qQ(@$E7@tGR(X&FS0oF=&PQ|qC2g;@_+6R4E3Y$Ho$DTOnpn2ojN~K z&xRVwri~4|cNRReFk5mB5bV6TdZ*DMROsADgT+ZqI9nsz(Co&0mPcuH zUxt72Aft;MO)O^z8{8H+^p1|stXL%RFT_M~S!}-eb?wE&!%Tkr-PblIYiLNPuMQ@n4PQ*MYMb zbRvu$1I;}f5#SF_9p8ZVopVf`t5wt?$aL&e2M}dC6(B<2u7*EiW@c_fGsroJNkbRF zG<0HTIYD#R(xvaSxD~W*e?9iM&qY%k$3$){0V!8JzdQHWwtlPa;*OpJk9P1qYiXa=pX&(* z+$kbjkX#0d3|rK>LisSAqOwikeO*&LaM1;o*sxQ=h{z8-$L(tJ%!5{WQ~o+B!AIvrUA0{;M*f<&F*OFP@{B2t9Va zO5C_nNO{{jI`|O1cg-i_kOYKOUl3OPIU@q7qu5xj8c8Ck<9dd8PVIkg3`#81JJLMX3ooxX!vWB)AO<~w~Y-?f66qOhPX+ez7v8rzyPop!Z5b{@2w0V0p~~oKG7GEB=GX z_+{)iyFF*!npV-Wuj+3X)seBf*uq^eSSA<0s1#sea#WcjU3#t@ItBV*@*L{B9cZZN z4=&`w>EGYiC*->i^9hY#Ls3*m1I7Bi@U)(;fr0n-(bwo~Tej&;AcD=VL36s79?;TR zPBTP7g_de8h-p_u%7909`~q^sTO*nFFu#c9+>ChZv<6Sp&h>m<;@9JTUsAC&LiV}l zL;*z!o1a1(kJjwzYf$@!0b~b*L}p5S)JVs%CO(fwn-9X6=v=89RYelA@UfN>MJDWg z(J?rd3_^}mX54&LCkk9g(4y7e#u+R&@`&RfISa4mG}IxHi(i72*5-~b6?}O;czkFbN3q^m-X?H zCqPpCV=(G6NBj3KA`AF3W#8R>;7qqmUXfJe-rn3XJZ&eeK*)Rc#cY_Pb6te&S2 zIS^c%O?S$NlP33lxgHTMC8h3krMu|po+2AP9{i;AnkCO3m6f_FulHVf`pX71r2+(l8!JVq?{>5kDov*W!{SU$?`S4MP9@~J zWoA#I&T(9M(}wLc^6QwIaIDKt=C?-WO~H62!uK&K@J*7j@db;;3$6 zq{K`nr*ga7O6^jiam?xR`{uRZ;{???j(mT%iRG5^jAai2-11RVD_&)SP8J+LRt=E<2x*mz^ElKI9PEw3M<= zH&;zKew8Nsjyk3t>-s_6rr~MA@xy1@?md_~E9^7P4SUlf-th%&-er^5(Zk!&KSL)p zS8_R_v$w&@r>W=SW>)pK`eohahO z(s??1)br3Pn9yv8Z7CFqPs*i7mbneYw^3(+x_O81N4mgZH>bhxCI`!wIaMStff5Ey zcA=QJ!vz*ab~7#NyQVrGNl{#2(__#RdwMoxlfUswg^}Hk-TqkWvgiKEULZE_yM13m zDK6(6#W-DgJcF-jEiCXHUMT}GCj5U?YV%;!_le>X9(1_L4Rp0;|Gr=uYe!b<6PKe zj{=qmb~FduHx`Cxi}}>YH_wI-2hHX-CU;O6NjcvlhI7^U z-}@m`m>fJHI63?Q;G=}Zg``c(d%vH&S1+`T@~6xxTAY_Cjd(gY2=8S6O=f1M$|5IV zNOQO@nCKre1ux!FrKy#wOZ>;iZ|w6fF78lX3JQ!v3G`uOcNgJI5uI)m$&9jb{-6TW z*6h7PH?jaIk|`j9T-2VO4rf{=N5UvIG!6J}@(?&(DWHM}t6#r7gGS5Ql%tkf{BFU`Jc5n>Cw9(@^s08xyaPaAS zOyyHcTYu(bn5`dFJwB@K9{u$ zq@DG7DCOc(6BB-_zI3Hyl$&AFm*7(;suXZUAS6=)iupAP;`C}2o!qlDrhes zWfZ(8WcD`Z&kv6kbyGbl2RpB@@qjywK#@?8y?*_A@|lRhnas-R1j%9Jui=MIYstJ!lf6($r0A6^-gDJGJNb+r57W;G1(`LIKxHqEg0OK} zE0&*>dNMDW-z$45`G<{%8M6F*AuaQg!C%>nG&*ej-5tikXUe2l#*XeJ_7?@I(mGei z<`p99oLzeu54O_eBiG~T9G|%V`|r0`w$fxLg+&)W?#Tt0N+i&2U+Bib-~Z`O5;JJP zedzDsXNvykFK$=D*LJ2#d(w2T0p>a%a>*-sA;?0$ z*A9cQjq%(;+&I6vsE2ihS%r}|h^hcBx$%nO-K19F6f-yXCQ!O0kLnO|aY7~|2}r9X zqXWQ_+<-#`eHlSowIudhShHLY$tIOwb8wjUz`+X<-3XsG@y>tfm3f*W(}TOCZZ`3? z5SiGiqy1L8&hB>|bNaf*XK%_PN&@fVA%Os>pDXH1RN=*_-hC zw;!6JNUOB(;nYW@2yK%D``X6Dhbux#SBEf_`K3z@9WoUXPu zD;CaZQK_*CH-4XzmlIwy92oP+c>sM0h-m(lns0Ib&($Q(4kjit5aP}$bRNv}B}VPN z#q4Mt9RinX38-(5js=1bUc8vkMIBr4M7AW*VciHnA;BKy;y3UfX?Ee*WMcQ3?DjzKk0TeXg|e+}?|B96m&vechD zwl-0_ooWg%5o{&A&c}Sq7^$_;@(su0{~L8>X&cRKfHB@iw))vJvWwM z&NxTyv@dk(<^cky6L|RrE25>LF<6B{9hHD82rBy|TsmYH%j@>?(IFGV9H8NGs|f`k z;v*u8pz%9)vQuQHBUzh?F{$2|8Y8{)6guvBeFsZ}XdqxpHbXVa_Pjd3)v2wu5O$tcIduqA$Yp z=oOqh3b>eyk20j#+8M&pt>eyYjEIAa$b*SV|e@T;iP)ODjKpV z{INd&=PppNz$wPv9G$=*T;^#U#LlsvKWPVCrl&Vy{d_2ojFxmj{Cisc|Hyvz-&KXn zJJL;H6=g;PY+uK-0zk$jT?8&Eq0_|qm&&j~J3ofk;1itaOR7SD&bOds4rD@-= z{>f%lwD9(5k~VXR0kz3+b0+h8ONIqy%G}P0`P}MBWkzjv!pY%kzSfD@Ty^QKh*dt$ zVMyyb#s50Qrq8^ARH?zLckubia6AcPtlZeEA-)zhi~A~G%LuLCFZP6n-P^IH9+fVe z>nyt~>7Q*&wi@1`>o@dzSnzP+;{s0Xkk<3@lnX_B99=CxprwiGaV+`haUdqJoR zHD)86safZX-d&8M(5_0yJ&})%e;*g)*^MRK6>iMNJ+4LSusf$Ty_?mTwisU0jVt!( zT4*Cb_l4(PkAnsT9Xyi*UNvh zTg>LlZu4}IJbi*Hv`;&}y)pOy{z29gmW(u8BKM<5QH#|dktBSSt0j4_oY_ybzR#Vi z$+f?zx~y|;9EBaW|LHdPdAY)@<6GY3=f-MOOuibi;8J6)qPpowUw}jU^f?)JG8I(m z^d6SFYP(7b29bQtjxPNn9^um_yfxcD&+%b!3xyclSSfP5o7L7-u57)-U zp(8!TO2De)QSJKy!%gRSdY;`IDT6i*qpL-6qIQ*APC9@0s=3%d>yOwWo;H6i?PND` zq@?3bW3I@&P~P;QKeclk|NM;$LaBM{1LUIBZs;8sj$w;WPJiAY;!y)`;}uB%ll#0n zC*3-lv>i;HN&~Ln_2)+~nLf}B@zg!1Rk=D@by;)d<|BF~n`h6Y2_tUy(^dYyX=kHs z+W)J_x*sKieZQ!mEBAZFwd6It`+NVn8sOQ33P`Zi7>Qh*0208i2_-hR6I+6;6T#t*iDf z7e<%0@Zg&B@}#_d)7v?jw%dQAk-G`Uf+X0vHAiRa>+MX+qemt9yCpX*%JqgdUmmAi z!<%wz%#1?9#t0mJPd@gNr>ZdLr)AXgetlp1qTI5e&b#nq(_<#?=SWIrL$3%K>$c(0 zx7ZW6B@FS7obD$^Z`Xj!M<;VjN7xUe?;EVOS*j`AOeURlf&xyP)vDmO)tkT8%LO98 zcByX#MeUwO6)_IeY;=EX6s8LPUJ86Ob#(2$kUHiVl`8=*OS*?EJ`;Mm?Y9IrKyiXQX%2-xNb_)jm9)|7a$E z1w=t4`+wb!dp5qz4N@04JG#xZCRp|92#w@e>;-?dNIr_2cT?VrQbNXi&r{1UZg9y4 zMQz@vMg{BL+tlSmbEl2!Ei2pR&uF~U(Be=LzMsor*Mgc)y(lV`P%=quDy*%D%^MfiK(D6(K$(%PZdo?c@i%{+)|kq zaZ8`}VMkdvMGvJ^x(`j1LCn|bUQP9p@>D<+o9UHgN8QQ8C3jt zmOhbyZC9sX@*K6x)Ds2L;wX_U05Ew2a7*#dKO2K71ldmQQT6nYDQzJnfUj{u3+r~; zDp}-`jr*}Z;qNHNXBXAz%gN^DOx5OcROcs9ySpk7-IQVJ1@LZDZP?9!_|Uk~S$xz< zOu&^qs9^up3;HY_lkk(_?3 zAn_R8<%LjW`eI0#FebsqtExq&Un9)bt(p-%@=jb(yK5bRJ!l_b@ivW@ zeC|lQuIyQ_my$BvmAQ!kR<0tka_EV@2ghIk>Zkv#cf}i+Q_&`l6JKLLE?-mIPAHSd zZiS>v#}}BdE*u3EKF&(=%uDHU>&R)w z&C@J8czSzA7l?OrXRo&Z<~J}or~1o1JQyPq;9$weQgz?9Y!~&{i#l=qKfinn6a96m zo3W9g{Wx8Abj~-sLJ8Z=@=9cbHBi_6DXMhBtWt1o;cdhbTXapSt{PDJQdEV zK^Oa_z3{u+??+vB_Pp;OGr{S2xxy?byWB;3UrF7z)m?C@t(_#Hlvgjb`{yh95a)O+ zv+~{FAqm%!*uC{qO=(@eg#GO%bfH{e=z*hBZV)yluzZm^c%~JlQnY|e=@mHtSvO5+ zbaX5NC6;2_-PN^K3?>(x$YDWbyyTVc(}1^2)JGufpVS?!YbAs*w0CmdLN+!Ds%7e4 zM?WFn9Gfcq^I3aU#A0XUU4Crl>)R`LG4UK(e2DvFoMjHV$CuF&vetiM@`W$!HSTU- zfggSO&yRwy@K|>;q{k_?o%b^v*;rVV*ns?6q3v2rAz9|>IwtE>zR7x&H^NA=+RCn& zU+h>$mmNDxHhS!YnG~gzn^Ds)vc9Ee zwn<_LSU*80jlumD+#Z-ky_J`hxde=R_vSRi1K;0Uh&|j1%-ony?u{}Pyt49*H|0PX?@5!qH;bsQ5 z9HB^L8MUB!e1)=IEd{q#Xt!l`J?d`EN^wKsMibgBEiR9_*60P+qURi%5{I57-oUM6 z$tS%QHGH(+EiYsqHCT;2-B0Ck9+2YMv`juU<)>-q7ymuzB}1MIDy*TevZ7T33vE7T z$49SD4EhV@&|1v>BAGSIRkQZrg=je*BT#eJZwDE}qL2pI!AaezBCvL_t>$|Dbia&k z@I<&Cmt6b*P0hkeXIGj!1&NyFcnNq&SKCSp4YBoS%Q{jMn9H^8#1UK9>v|W9h~ilu z;z@s6DcI0573MgRcn*0Ip3Cn+YVx6=02T|G40DJs&T)3_aR*CYEgplCW%87|_cC&_ zjRdha<7kCd^C)nhaDCNS6cz=)U?~kO{e?}g* z542Xg<3zMq|G7y`_VC{Vc9jm0swK_IvRHFA<02Ph>|em{?}z`tp1SbycJTX;scC8V zf+5=Y{Xdb-@+JW42V`wP)&iOc{w;dQp1Qc~gRW63nC=(?u>99M;Px>I6()3;p**%E zk^F+YUyzOloN8)qJp`!Zx_=gQa{zI$%%{*|#dO{QN?B2wE9yK*LV#dxm=@BrvI>-UQgQg})9qS~*b1+x=ji0oWEWOHtN`4h@0V zR40L@tNt%kp@5T&A54FeUzmQcIyBW7JnYll(Q(q9aAGVq1pPOy3k@QN`v27p=f?ow zGUx+pua>?eUUX52>Z%FU##1t`ap4|`0wo}ft7w#b`JD$*Qs8C$kTKK;KoNc zPpZJt!_lBC53Cl7AtNLf+xr54Ip)6kfvy5-e;^0|b(HqLaZ_e)CGH-GsW|n4x(KL2 zwX|yR z>j=6wx1Q|-90i7rKkn)N3*g+7YKjs1^>x43KQ0OhnujUyXBr~(gOb9uUD`qC=CaJG z?IAjNUY!_iM=} zIPV9DmAwKew%nQ5RtUFBaXL} z{&uRNSq%b{P*6%5q?FQJ)2L$O7Zx6F%Z5@GMmS6Z3`W7GX*@a**sMuL`QJAk0GK!T z8zK5<+qEEZMIAf7YXlon(Fncc1+|UNRTS23*s8iIHS~KjWTT*@>IQSbPU%SRlRtn= z!$a&%$kD6PZ3*>uoH*LwY)_9vpmb4Nupdf`iw6=1{)M#@)dz&$-dFmHDijIWQ5|*w z+*{22yTiOj&DhK;b?=M#m2_QD=qkH zZ9M+YC^3oBe`mtnqcCIUO-e(bW<*%JIKkr*lg@&*8n6cNm|;7bYCYj(J|Wp1+HX0e zz$i_m<7Z*H#26J7HERdXoAa=QM4)GCVDMG4{o#LCR$^)C&{E11JH0GRP-rHF`bgOQ zu0ml!hzKmLBVZLQJiTraUr@hRRr;_jn@%6z6;&pv6F^yXlOF)@Xl|sOdob~*lz*dy z;k)zcMk5eW$_b=u|A213pPw*FVaUE+1ROw4R1tg@puM|({VD2rQO{RozYTpp{;PVH zPMN9{D-)C7mM8r>(9P?1uW)Gq2>|!sPj#{+K=K!PDCb9Y+WTy}ply+TxM>NT>R6+% z8aqHp;xw89nT04Q?LcE-3QA#6*L>i`#KW?Tz%BsXC(F|%miYwRtgeB+tOidmMw*n{ zi@5>i&Hmbmw{Zoc?FcgUgj^^dSVTWPbg-KQt3{RESH=IvJRP zqmk{D^*Gka4wI&=Q9Bx%8U##Wmx#7-u7lTA7Tt8{3~1<&az86F%Xc1G z%l-GYb?gW%Kn#lGSb6vT&n$wMqb+52GcpJloLu~<$-OoU zEw~MIv{H2XT)dmy)dN@!S<=l-O?e;eHm08(&#UQqm?$j$H{NPP2sV-$LLAS_!>$tV zkUSCrDL3d7bluk_?O($yShP)=9VEFW^#>owWQlr5{v_ZS3GFxP;}^gtZX;>0jDfC% zZ`cRhnXfv@^M7|4NlG4g&%dyflwE{3irp!ynkNC#>^&uMbQb&4Xoc|gmyWVqfOSfJ zxc&_>l5gZIng8Eo#TI64K)4b=A*AMOTdET=& z&I<~1a>0mch)2-D;zHi_#KJKEG;S9c7m9jWh4M&a(u*-_xK$&1p4FVFDH4P+qlH#l znwmqw62zC1QQ-V>+_Fk2-uj_{TnLn$b5xIv~bnEOxG0LT58^nS;d zdzg-nhWqp)udevoZj0Vrt@=pQMOQS#jAd+wDVj_YvJoyS!NiN$%g zg=h2p{`bH1JP&xzGzSX=Fmbq8B*^Ok^#%stb9Ds;TiC&HA+bV^AoG?j_yUJlx+<6zGqgm)l>{0N8wL;&U z#(1U0!8-!^k$Ue;5hc8;3lJsP5`oYHrrf zo5ILOu+s{>ywRl83kzU?2zt7OcKx_ZEFsd+(P7gXa7to26=du$!9O6W`MQsgce$qt z4Sa{6nlwTV=dtV@9AjuC@lKgcVIOumNIpcoqP{YiD?K~=nRdJiNr#c=?c*OiH*llH z$m+lO{QmJY-WyV1V8Epl^uhaxa}0#+fe{A$G_;ies(W#GUL_qmIQ_l7>8ei(yNrTG z`?N9UIOhmb_`S5vTXQ5crNP?1VN%8~t($==9vd4gfv}j($IGUm;5`dGzy4%vz30!r zXhx}?!1Yv%SD3){{M>GMH#_)vE5H#946pDnRvP%y3@PM!@kTbpV_ok5Ho$d%hu4$*dtRZi^dDl2IHbULg0o(i+KpKCrl1y z*>mCwbuN<@vYwswVI=i^QBe9z8@0^G$DG+v}A#E zSU5VWINE4EBurBhjQE<7u>hL|c)tzqTppGb+S`sqDT>N0&FE~Jq4K-|ocW*m9Xgl3 zW|S!ByzNI9J`Laz7_&`NoRaxLu>O2^=f>e(f^U4rqhrS_&UM?zrCj}mx-@rp=-2#KcN32Ki+ae7cdv^7q z$O`@l0@epTI#a00S^a~2Ynq0f(~Vn<8N>lwOgmrfEsS0*^%bvj2OkvF2i4*gN|PT| zzgM>neoNt2cR1e3N#b!NA=)z~mSC|S*P@N7@chhd9={!Lr#w2x^;9Fl*m6=VyWSxq z^v$j8I2z9l;Q$*mnnr_5=)X%^l7PJ#jZ@rh&H!^Vw|nr%i*As02cp1Y<`!fnyc3lu z*yK;b+G6-IpNH1O?--Tvr5?QTQI2|bk4B&53@`{^o9s10iGpL0N;IL38UlY}ae8n< zzZn#`gRRYlv#1&80S{pkQ#9sDeW{$0&??=|KF&p&%hOtwFO+Q!-0p0@{p`E_AwkU# zi#@_%1DR}~)dW2^dC_e$nRwKR%h7D~>0v%$&(4q_g3H%?aC6u!cXHp;o3PRq7G_=V zD+Q_PC@rU<1@X1}607&8Q=mhgX7)Tr^6h=T=)hhuNVJq6##2uMf0YG%3RZRf)>B+F z8rtc5pxXo%N3i@l7D#h#eI@LkTi{9Kt@62|8+=Q&10IOtTS-CJw&?boDeC-CQG8nHNhcm z%O3rFky2@Gnpb;vQK5C%pG*082Ll5o_IE3X>@4-)>Ib;+-p(*luuxwL_o&dfuS}o6y4S{fQoa_q~^cOCZ8*eCVC& zuI_C4z>;Rp&Q;zW@;voR?*5`dyx{CnZ9sofue)~pi6ye_u@sCx`(o*G{497|_FXNm zFo_d#tO?r`m6qZGkxkY(bbhy_hVzXG*w0Tr^&TmL z)C-WrECHW7l42mkt%{EvhS(pAokN663hgf7Cwh|Lcmzx!uO#;+;5$nsTO#9k*?Y|6 zxPUj9r+@5v78Bp8j&mC%g`7Fx7Bh3#}39!tpbdv41oc3Kh^j0Kl2Cw;k$GDnP2Gu z8KXfO-s8A2!mlSVCkK(HH!)D{^;Piny50ic0g0R?=@~GD0z5%ogq1vl{ySr*nAb%- zX6E}Ggn73Kd+n01_UwG4A?2S-EBjW%-tfj>;FgL~Pl_>~C6_i^sLUnv@wA6uyS&c_ zANV}wTwr;W*l{ZAR4daUz6z~|CD~BQTXW6~ci5R(ZEEKAX-8A%rO&Ed{Pxi&fH~5u zjzalV1kcYqj-rXNhfUi9WiKaA-SJ}1Co_y`HNJG|(t5V^?+`m0!rA*tig$gl$dOQ8 zB^Nmo^f++1b|dBOpb@^YqFuXr-Fp(8$x~46Y)!&>Cb|e$PQAem#qj!{KH6_(&nS8Y z5Drv<3!;Geq1_Pv(y2}V4+$I*Y#0WCar%$8F9jwfZa?Ew;E%Yx6D>Aw`+S14`oa}o zA$IGg`;Qx+iS3>(yy}(l^s)gyX-|Lp+Os;R24|U*y6p#p8y{aA9$cNE#NP~O#JB7P zoJadt2!iCX?ME;XVKBX^aLLH(cQJ|4P1UKb#Kj|_!4l6hql2Nz-z*T-3EVCU%T=1F z%W1dQnoG5yAFr!((&+DbjUQZ<n$JqEAh>5zk%y-^EIq9dx}V^!jJ32Kz7TP2qRp*1f%oar=4YFdnd-r*%+2?T zBs-ytA$wlJln=a}D|onK$g6PjNZ$~1Ays^}SIXK1_Q_{Ms0-b;7fd|EVN^!&Bc91u zzsr3WIqyFN!~VD*0uP_uG_P`v(N9mlVkPA2fY4)~J8rzQB7t4oj}l-Hetba{UyrdO-Q?1jbL^<-UFt(b4VMK|SU;lKu+`(d zz^h+Q*Dl^YHGS!tF8!y0=LeE)0)mexfCSaHJbvWFGNz}sFK5tK`sV73>x{*)z^7P< z5Pr)8;e}^E_ghYo-6rj1ixeQ7CQFT(%bVO7x~0wi@GxD>ptAh9_-~nGFt_n=TnYDMFI2UsI*;b%7qB;<4pwC{@(Az2^y&Tdpl1z8>*0&uwApd zyg{N#x4o7_O&@V=g=qXPm1Y{_%VRoWi{)gmF(Ts;ng0kbalR`U628(Ef0^8{acKZC z3hzY;IcD6a6X>eyfv`1GdT{}!+M(aosFk;;f9+zNO3Zk>P}*~@y->EKlePfbd41QY zX5#JV0?vLjA^kvEDsla_Wr2yy1C`IuB*#${V&JCaHL#%bUQO}OU6^ZhkK6zXnQQ5j z1RIaba`q-poi(2?ymhAR$wkJVI$O>%&`F>DCWzU|&<<;@7AR$S_Ppw8V{CfIGbkOM zel@T zxu55g?|;_*@Uv9dIrfKb3{p_T_Bi{e2|f*#9bdqf&Zdi4kq5oe&>cR{4#-YhqL9Z= zHO2@{<9lrzLLRM(1fU$we@d|;uN>C%DRJG-pzFlGU`tW@U^RC!ooU|a!Ch_T7h9ag z5`LoJH2MFjwjIVlinxJ=+P>0c22q|}Zgf!5jopAm1!4r_EZH5oSanj4l8el|ml3s# zBAN8zj@~{OJdmNJ3-3A<5@$88Ra0lYcYW3WVYQ7cZSC=e48^_X&HWWZk4`E_%WfK%1`(s zSo%c*ZoIw||Gan%4@>GiLKe-9IfuRaLUFT5l=~jPZnRYk^U;HE_P(yugK2tNmZTcW z9uihCtjlLTjj!o#qJYKxRZDvswqjG3W4~syJgfH0>|-RG<#VNzHB)7?bM7mlNF&kk zeZk!W4Q6EgHunsS`}4*amHN^6=2Qxgl#>Vrbw?*CeOT-W@54TPdv4x}(T`6029cxo z!;Qft&8~l|(}-jR4{V-xRKLp(4ix`$A`&nbhU;ZWOaSI!9w;1g%o8rfAb)$J&BpDM z+-(>PS;-(hJ`mzf>`i?=?}u4f=8#y8i&=OBT|C4o0;gN;8cFdi?S1Uy&*ykpEvzygGC=o@%?1*ZqfV)ojDm_Yz@UHq$jaIKDwM$hYG)@MJeM=X;I3m? z+j@G0&PE9C_t?F}Azo5P)Ai#8!O~aTB_**8GlSr?;}e}Dupj#>%Y|<*;<2nDm?8EW z^n=+hes`!6J<;P}q0>Z~CG%U5YCF(Axa$#YeITN$Epd>uFOtA-6u)i1vW-^m5LraF zJltTVI8B+hF76{sq3%pmdZ6I7x56JZuRO(#$ymdGD_dumFAG)|;sw_KAZvfBVbWH; z&4<`ng_)CG6n6J{ad&Gp-t*3n7r-;~H)hRqBkOnV5dauNL+*}N?YA%h6!Ui(J93Dc z&Na|!^H*{!jepOhqrys^eX4me_Sv^nh+oBqG#B|r7yG>)Z)Pt4=)?sFpS{h{n!jTMpbChL!i+6u0Hlqa+Dts7 zbHUHfn(3bowYc3q10~t;2Xh+8t z0Nta%Z~UI!FZU`{H>>-s29Jple+sbL`-);%FhU#-1I(V0VTAiIIbq1BuH$2npP^{v zEwq9GN8qS4kJz1w!BLV+Ru`2DtlP@pd$XXv&GbyW`99y!h<+!MhX?Z!!q9$RN zlJChTGjd@P^T`M4-TIRFjqZ-IsQ>BDC9K@lN>XX62j=W_>? z^w;w)ssutmBp!2r`t-w&A<2M>^()z=FBQHqMBt{@+3Fl>yCo6+6&RL>V zV%N*iN8oroM)1-+R>`^DoO;CN2_i_NX%fJ9S(h585Zi5PtGw=+ZTYWj;*+kA1$Wwt zLe9^Td}CO;)qhh|^I$sOfLr}Z9DVB-w`SD|@k_lgUev$e*56Ubn>RUo*d+35x}=kc zRw(kxm=ry?sb%8?n|I-&VAq?ED?>eV5tquU`69O-k}b~KF}n2iaTPzU!g)p2A3xQ$ z@drbrxj+Ybfms8JHQD4RD|y}=F1I4t=9^m0twfoHt43OO`&IRdemXs%8Z5M;uGBVr z(&)4CCrY|X;#_uVY1z$c<}V(XV|1`vOW-U_LqcE(w{htZL-Zf`rVTc8+Q(M{}GNyf{Z_ zd;Pi3(vq@cKLS-gUr*wZ|6)RV`AeF$0oQZ~5=oi#2*Li2@4O{y>BjVP<+Mi=EAh{5 zKWsgwHFx-~qHwJ`n0JT_@ZYxwc`MQ6h~tf4ix6PeTZ6nqJs;XyX%uOE8M-4H=Tq~O z{{OJ|)=^bmnYd1wBanKkpRdCyud4+qYD?z8WG?|sED#Qo#m=WGnj``v%dVYOmG9tbUB#h)kf6ypfYN zL+!6cF@s(jy?Rm|68pyI%!ltxXa$HHWEm`fUO*1n#kcGQnntsJMCqTbAA6(5bS;ef zR9C63tb7f`I3xzf8G7$`}T87>EB-YZ^jV)EOfH(RR@y!H|KV`pn36+&wa-* zKk2uiJT%0OGqFOjeSBbntYX?^cHTx;qONm-wr0`C{Fx1xp61n-`zw%zP6W9;qFv z1AK?0JmCHUWBl-GoJm)_zwumVM50I>+d>cvcJLQc%tdi;`DUrrI^nw2+Fuv{ zNA#))$`brS3E{syZ3|ARHUq?^q#T8KSE8>x=ui1F8}$p9(w*@FlF6UBF24*>8?Kc< zSj<3a&?I#tfa>n2@!SMFoo6NqnJ5&`yeVo6u5S4U2x+GpJ4u?ig&3MPN!A(Bgc*95 zAt5fAe7|A}*;8#hWBng75W4dhW!alxc@z-fruZquNgJfSdQ%0%gyf1Px# zqWU_BaXUnf}C)vE$S9 zcV$wTx~b@?tk8LAj}^lE>dos@+r~`-d+422Qv4mBVU+9oYUiAp{;hgvqnNcDN}2{vgt~H zHa_No?D8M2R+qUR$#I3J``}(t_UWkl zvW7;XPp;fnK-_fuUTzWp;~yXI-q85Tqw&U#EnGl8}{8@btY{Nv+nAo zM?DYrn8ymjVq#(t8X2L{;m8x@9(v(O$9kJAY3B%o3@6j?t2~xH@#YpWnVMJ2_oB>7xit>A z#2Wtm(j2RGyvSYiZpx6a7M_xNKXvK)RtGkr%dO`#=ieVq<(BTK14MZ}B0n(GVJbOwtAN=^Vj-9R866Jjov zc{hi!igdNxz3ph(dgDf=+_a&+aeS-8uR#r z?!|oAQ?A?lr_z}AgmCHsZ#GAH@K&tMqN-#z;651r1{)ZUk~pi1>x$%v;*Ff_4uy96 z{%Pu>H!QIfeYsn=K3OGu52+sW>wb&VN#IpA^gL1ZT&CO7_ZOt?g730@@dm}FBRA{v z2OZ|8U{W9_u%LCBQgs3Ac|8CUQ?Dh{6(5l_;5Jx&C`023$#1&Z;Cc`Ew# z#*sb}m(exCYKWtrIJg~+l}gpXm-6N{ogW9Li}bl>-S>!zEhj6b6%;-hSR{P$O}-qF zOK1@K<#$7(bty0};j)(qs{dQ)Z~>rjZXBe4RPf;r)Y(DVm*Syy*Al2x+XcR2;5sXKam8$c>dEDETG z59o17IOO1<{rtVi-m(B5=cQotK<*X5ZPDhib}77tVk#t0Z-d_gC=H-|i#Shys{~OE zj*R3eA)WUOJCVSVB_#%;QC$-rK%3GGaExo2&eS@|{^+?VZ`xJA`{`2HmYD_x@3wT4 z>)wzeNCs~J5CGtR&>(aKf+Et_5M>#8MPZo+l_&;@*ROk^=Sq)b1CC1%NDdc!FRfHWAYT0My<>)C?LJ&zYD&gOnQ^ur5j@#J3{=_JZ6^ zJ0=-h!Ik7KJy*+AnW-X>-u3IjJV~`k2Yn#(0v$SItxutw3%(n=^*IW8AY;{}(isE% zTXz@%Cc^W-N!p+>FH;Y#^Afdf9#jJrm3s;b={wNOwj3)?D=O-@m(}_Jhy%q>e}?mj zSvqlI23`jN3`0&M8x(7cR4;TT{(5c7Pyx+9_zHh+y>B~sKGlob>N5d>pTE; zgfXy1QXUJD1pYY^D8?Ojc`dHn{uyQTjTjK|7C8i2f25zQ%m93i)C5QxT!C8*1}bTI zKuj$$STk2wp924jH#|DueEyCx-}sA8ZHJw|rWuGbb8 z-qI%Wc%8_jZs`}yb1d@2>rs#wQd()Z{0FKCKke`aVD11Qky-vk}z>cW%u7r5wu?!AD`%{T4n(zV~T8 zbmoi%1>1f!!1c_?@MM(?BR>-IQ)EIk#njI_fc*uf6UZ2(F%B-j*WL&{|11i+yIK=Z z0HPCtD`5+IU6f8xXX{dR?ML`ELBqQv5efZB1mxaNG;*=dRM6Hpza#v9nE3vR3?>d4 zPi`yVQ9<%GaRM_$K?pEe*%pODU-GAyoYlU2_|_rej-<{CsFW1R0(``Y-{YWz|C^5) zRcscbd3$Z(MB_o?E*r@OYOxPmv1Il>1Cp$?TQHd@hN-{s?a{XWDe=Wir&w0=E>*9P zbG^6mjOLxs0z-Xls^7dPEv7EcxIjlUP7->U&YoHtm~5^X`PFzRf(|7X^}0GPb206B zv3X}eaOxX+Uvt@O3#L@ecL|RMSyOw>?U%ZUsQR6V`f~qFrd~oxQ7)>U4@_(XXug^0R|h1 zG4uw4ceX&9W#O;J1y*{@rMyK~BT}F1v$bPBrlA${)f6khCd<4Z9vIPZ0YNkM^1LGZ zH3eJsg$@0wL1JUsww*#ysICT|b2kf`c*AbGTENq!zOhIq_>X5vC6XYxmWr*QqGA%8 zJ9*|Gu*7(m(Rkp|(Qk7$gPfv>gao=2JOTo0w)49Zf^8)}i6D=|!5$G7_DkvtKfvuX zd>4<@Ubfliw?WObj?K%idm$eAfg@bV$#%JvZfiaEq@WN>g*tJ<(@t%_|uYAl`p@OwgxqwDV0!FV%%ueOQ-n4&b2MAv?pc7ju<7*N{Aj zI0eUy2_8Owb5InyK$m4)Qr44?wt>|gL^ciGQ_+yVm`21{{;4k7n4vHnIZ8W!z)djk zzJ(VOzwKk~;<%L)_#GI}B3bGa888vCyfm#{z&u&qN6GJ7rs~Is=9o_AeK6tdM9t0fu$`b@ z5LF&-LB;CbfA%Um-UxsPas-F404_CY4I#y$T1j27`<0OUW^L~iW5D~ ztGEu86%`$Ke@jy#3!86zZh7-ftsVdi8$ge3;wGPasvS3j_^!NMA-dk}(IyObRoCv_ ziMM?f`$R>td!##aYrSz>CKi@wQ0*qV5oyE=d(;{-H8pN$3^7b}BS;~))&2#Re}EiH z_LXHTIaX%)-VB(NHRa{yD)(88m2Vw6aq z4Z$}7lzi|LEoBT_*#NM0&}i^C&v7vm+WwKPJ)t9VCNs{c+w!}7By$4Oy!fypz{l>H zWGTq6S3l1|g2dx;EW1cq%?R_+eu;V66+N~lwNifhA4dZ)LD*9`jYz<0IbWPV5>rGo zDEXOCa1JL~2UrVR!BC%TtI>bh{i8NVK@B9Az_#2B7Vh5zd-HL=g8z;ZB zftbR_+u1V{s~nc`iT6n%$FM(?L&i?}PR}pSw7zlp<9%+YZ9U&O9f%1ycsbYvVe=bDGivxiU9FgR&#_bIk1=`=hU~J^ix1I{>3pK`u_MGhrAq{WMHUvf+QYaZYe+9c*FvXfm){#R_OM<2{D8kp zk+*h#+_WuYo606158$-Bv6l5A9)QWeL-s(eVY`E7$p;YKP*L^9Y!G8w@Ra{zOwrs? zL%!EZ1rd&JefWn<{)5l^LgcB~C3rzhGY7J|LmnM27}AHxs1J~NGCt*U0gpFL1e#bf z0!nF`!S+x{U6>h#7lI?EQ?QXs+o4MLRZ!GlfOV@*q^+baHJE!p>U0bs@z5_RHywF> z{=J&q^kFzJlxt+R0R=ZN)!wGG4O2!e006aGz$4L*GX9zV4;zKTk}s`}!2)HaX~^e(pL{H07#QV%yNt?u33l;b zv33CX?xn7-t%b}UkvIaabyO4wD$Jv`4QVOC~lq(Yz^g3Ct&Jf=$ ze%QEv1R8G!PNJgiRfWgL&hdtezUq>sACO9_ut@?o9_H|eCWysO%n}8$>FpUd4WC>d zHo5Y0Jgk?MN6XD)@x%(+0N%HKBs2n3qQeJS=%h0N|g6olm{;N>vOPU}?hN)fnQPc9uZ5T>U?egW_i{RaoJ&s+yx2dIG$(b}eAU$h>Er1W%0` z?QOBIu>XLGpuCq$<#?g?2kdeH2>z!F481_GZq!&-ZujMZ{9@HT4v>l&np8-6qZMiD zfwLAQyT_)qeIGOdRSZ}b)Uaihl#B?##6-d?)@aYghr#r06BGd{cK*`^-~cv9FBjlj zRj1x&$3yrpvid!A zLmrqE3#+%6ym|Ac4@|AN>G*bmkJI0TT-4!_$qu0ht}f($p*MhOlQk!!sTsT^SGqnt zICw~gm9-CH988mAU-dBZ&{$J2FY`>-SYhb+h=@&0)RdE3IQ{21$Q9@%OHK>Jqc_Z* zpPCBd1#Pp>@n-GHpH4|4#T4L?hD(DYSHdSw$&|Z+Z32{nr3?sDRTr+K{gdEBst!AW zffrX!BHtNE_Pm{^`{#{WS04Z$dq^E*$9ZM)7f^lw-d3NMQH?prg5rfgF6frsckP1 zkpH%lL4-I1_aRXZa5#Wm0&bx+s41j>fK3Dxg4O`%z16ggVCh{{FpkwrM#z#?R{5U2^I3!cHnOJz zWv;MyxB2)Jg2;IDllQLLL%c5_o;o6O2brc9$&?qp&wWBb?0?%2drb)lB$prg@}Em2 z+Kb$`{lm7uLj|bIn4$}5;hJRBhe~s!0F>!q6S=po4duioCF_DEDA)kv{^$*}PpJ`# zB642i-1{Hbkc7o#kW`9LBY5JOlY-r!QESMEAVK4Sg$C3fyMmAR*G*sV0O@-v16gsw zXaKq@l(}HE_Uc-34}fH4VruH>MXOZ!O)W}Y@)0gzl#o@UAdwg&Gj97;ybfTC2USHS z>KuJ2SOQ|R9eYetWhZ~^LCtln|M$$tOlzkeZ#4Z9o2dPf+B7h;+*_TT@%)X`J}?69nV)nb&Ez%Zm4Eiern+YHWq7PW>+{c_KLK<~^78m~ zH`!z83f7NGRCIS+kaajs*nSh#U2IU^8$_~DJJb{YvjEzLO34mMxAM#qT2JKrsq(b9bj&f=FTw*y=#S4kUQ!IEdxb zbG=Crh+i0nh$}i+o%Y=&{nyyZ_r|W0zWv5#@VX#u295v)+QWTFRn$HJKXb|vsmmz4 zVbBEw1{#GWa1#va`7_-IcQd%4lX8~>FZ#tW<>wag9t|CQc!cd=ZvR;;XxJcz4K&ui z5!gY~Za+ZL(d`6|{u^5kPN#xhfDG#dXsT(G-CQv-G0B<_+hC=lMIgROLWvXR2(yzz zcMOaBEA;BFo77Y{%@SyV2yGy9@ohNsDw%8F0TnIn-g-Y5r^#UEs7%%NAE17?p3qiI z;<|X|rW_mFnIg@;4cKaGYLIK&PZ|iv!mH#;O-@^gEtQZ1=yy4Q#$XDd9Ia{9_W424 zhZHfSguzwT-qlE`0w3)|DAy9<$MaPoCN}m=yq_yaFME_wok1}HCeu*FNhCDtkwP2J~pueIz_IZOba{^mE@QW*1eUF4XH#~}TkLw*+nZbF{1 zC?i9d2sVLJsA31#b3n}rs-w7W#*OdMVKI_@F(f8mR|mDCGjRy{{cgU65B&WejHCzl zk%nB0Kh>NRz>W=9eG5j?zLyr(qnzAa*WXFr$pu0*O>htP`^WholP0Hj%UW%$ubUeg zDV3SX?+(Gzg@r&^$ueF}amfVv+T*EBcg3)-my62iqC+nWs;i-$URGKva8=GCFkRge zA~04~@UUf@Ta=WBFu5XtPqbCZOPs+$E6?l2X@f0J0Rm+5M7&vY)Wh%Z1qX6*aKx%&B_$=HQUeev5owIPqSDgRl9HduS^p7c{j*|Yb8~rL*#|j* z8dQv{B^{rbKqh~L=THWu#%XzC+L2vRp{SZ!Iyx|5b0g$UQYG}rYJ-bi%`~!5GPnoa zAyzad!~ZN_A@4MfJZcy6s0jGRc>hy8F+<71cw+?_Wey6Wvd4@A<0Ux(oc&A8|Gz)E zwhYvB2xK920_BrTc;w}E5A8s03W5`)LO-N_KrmEQRi(`r@~!}iQ|yJEbR$C5;x9L-Ih*?D^v~98z8cXz|W!_`@OJD|1zyQDL6HO>{%lHY*LdylN9F?kxTG&*S5HFLE zd#Vq4Z@S&#miB>iT~bn#CRVnZ{SX(;y>hK>Gx*|AqYjE9A+N&NMOkhAYzX4li$Xmm z&Ue9IKDApFltIuDc$jG9xBRbdn~7Q0?M3+GLYr!3-{%fWn=Aj!|(G?VAlO5zCL=#gdwGy^am z^`auI>WCmZdT(35*mWK}qp~yLMs_;FTg$8e_V1UATHUeSlGgdZ83#7KN$RHOrEib7 z#~Rd__mwIX3s$%wJm9B>1sMRXMAD1E`DJ+^NFo@ z@Jf`40Ti{6LKI-~CK&ky_|mbbXZUYnPO1OtPBa9^=JD}yxn8EKoj)Lm5H>RSb6KxBFQp+zUACQdB zrL+uQzhyeOWGsk`XUhx$a?Kh&rGvY%nZ~2Ip8iux_~clUGX9iV+-3k3G4LF@r=(SF z6xt+;$Mh$91!L#&7SA}!B2E|9XAB%<6#~-+7r5_mY#j+>ksT>7d2;$E)(-BuegAD_ z>JX^8sT47`(`%~XcXQOL*5)Wz)4+jK<=ppdE#`&w9JH7<)z#Mrz61I>F2_((vRhV) zdoew^ZZSd?_QrVw_MWa1s7^bBkjzw9%j!kf^Ip9rWprC=GwsGMKKr@8xJ_Wz?fY*?WN|@7GLFw;6y4^_aySKE(;w=p4l@ z!Q8~;8049l4Y~+DzCyA64zXB~HLz2t3u-D1K+MFcK5`WBOpty&k%;S55{5piuDiec&r$av%tBfVbBvpSXxtQ({q3_W z8OZ?S3w6XSDP7%^dRFVrc!ksorfPYf-iXLZBqe0M6N1Gu5d$xd-t$#;_wDwlWdk)E z)oWn%`m<53P^%F-3AyeE$^&p+AUO4#c(2;A51%Ye!9<%QEP+ls;B=!?`^rwu#%^>@WL zEKh}>WgY_|M&7`*e$*!a+{a-dWo9NX0{zQ{0*lc|$qwJzobkh<%Iz#h7EKFtcG(p9 zT(_f(YJDlUn%48O-}4nbtTdU_)YZKce#FXB3|{1QsfZe2d1^=?3i+ z%RbPDe4oxcdl77Sy{6+op5)x&?>x5T+D)i-RJMDf$4!p(9G9N?v9IDUR=N@R1?;fYV`~+O8V{rekfLuZoCrGyMsO z14z?a*8UYTBVGWRk}6jIGBf)(d+g(xc3G=>(wg=YPbCF;@iG066ShK^Ii_>b#zhi_ zq-{oYPkNG3Gd1@>2xBPu%~GWNkrZvV$WnE+ym(br7CtGy$~q2C{QK0+EP6_{(}13} zoFCzgx|VhOBY{~0ORaJ`_PVPzSem5raoR0vR{K#R=-8Qz{Ym&{Obqo_N#Js68K8^M=5UGi3aUbDu{32 zm|(R>Uzj_J$nNDCl#)8o+=&0PURUe3g6&naSmM5-Qa@h4P$PFZk*HzBO-wxdZJA6E zxhsk?50Rdpi~Tx_)uE5)b#!iANOBf6E#HL;ZNVQ;FGWz@qioiJker9VwP9=$6(pT2@(fVkqx7;AtZLj%vJH zZ<04hCWe^7nTaM>aK}at(xc8Ex&(oVsWw0i+0gP3WCi@Lp;{OE891TrSX3&dQBGe{ z*)pn`rxp>Opb3OQJ@~aso}^YM$@Do&4bM+ds$F&f5iur&w?{ z)WzS%JmxY+L7?>@)8yp*pz`Ww7ko3`i{A%iJZF}4V@F&kV}4b~w%z^*26UObcO|ph zU7kqq{2-_h5muF5%E?Kr5vC6(=q(E2QuTPNnLE)@b&>6mwz63rEi__2MbjW{5PWXt zbig|$UUt=SY)#6Z%uPkXJaZn?gG?WgE1T)Re({tF+xp$XVyP#*>!0@IVQ+Qssh}I1 zh>7)Cw1+It{TIKEg$v%;Z!}!Em*wEDp6~XPJJ96Uj10_du3QB(=$-m&irJkiZMMZN zQi)YMUv3_e%v4(IHei&pFR|_881Gg1S8pe>a#r7kE~U-XcG$k!{xdqdAl6m?Yb-o~ zndxsiUm6>Y+UWdj^iD>@Wxecoje+g5vPX7hCkF0DL1zhw@E0nk{G15)WGS|^cKYcd zItOup%c8R4y+-dvaE|EJ9F5yz7Jmy73r5^!ei`@_$LzS7zbHCn@~niX*TU5_`TR0u zp_{hNqWNc)u{n{c5E)jisJ|F>{3%h#GcB}j_A~1ckB%ns-u#YPb5Q|P#yh{W`(q9L z8Xgzc6TewzGDt6 zlJq_4DLJq2xjwd#?Kp9NO!oSkP-jWKTYs`(`vIF%LO67uvv)q=@cgFZeY0MZS#U*7 zR`$+%1WWI+@8INA4a9wK2=<3YKV~R5eIYk7Sch19RF|FbDa~)Z|n@z)G z&ZRu$R&>_4QP$73M#t;W&bXv=0zP1p)6ab^9Sdyz?Hmo9P&c#%a=G@;;UQ;f!1O@=e+>{q2&7G$i%3TyKTF(T&yC`1`h|7RaJ@C z4T=}Xrl&R1a26|#vOzYtv$|{pqdmFa#OBXq$KY%pphDddLTku^{JfkOCJ|fYCREyV zu$`N|Dweg1gx;)S6F~tOs*Vv( zG>*euG{@9J>j2X#bwg388f^&MVt&|*`jQfI*>cZHr^M-#-Ud_NgAcJn4P(mpyG!t6 z@9yhQ-;S)FV{05DrSwm~3{%wAX9=X$S@vb595ZU}l)L_PjeXI(ud$(g*yiXsMOrXP zx;E@`B=a-NaxaBvpX2A%b11ZO?Aj$4uZkF5jAVT{Sm{FS&t!3zg~&-k zUx7F8i~Gn^2ghzh1K*$h?=3!dtp!f8Qc71NN5P}jbjkBbKQNJw8-KBWTFI$a6K(vv z(=d0v!jJFgJP!K??ImLG^QX9Hp3a`{)AX*IdPAtVn%E2;M5TX^L!WZQMn}@XT!^)! zgNW9x#^G$y;N8azA}0a_AF@D%uJ`lQ8-Ihf_Agn#5ITqA@vhTwFYc-23Qj)y`g+~z z-&h=>%O%~;zO-t)C?c?KfnLy|qUK3g$sDWhRL({3xz+e%bE^aw`>SstzxDHtPV6$* zbB;60v=*G`a!S@o5~BJ>yGD0oPeLd`{xm=^3GgVDJpC*F++-#?Y{}HuCY{&vOf)Mj z;w?pSZvfC&olSAie?Vg)TB!X;uhJWkRt+Ymbx111Idn>(h_QbOqkb%JsG*V@=-cxc z{|i@dwJ_BWu`aX(!?RuCBCfTktqvg!m!q*UQ6Uu%l!Jr@)qJiT%;H!K$%}Mk8SiOI zxvx}-`=W9@&e_=pD&n(0a+M%Y%yU(_zHvt7F{5^nXIiDzV{xJNN!-Ci@uvOyMo0nH zlZ*96bq~8Q4>Y-Eigj1I9GMcRV`~j@XQZOIRxFu;r?PqTd@(_snyiK?M{2Ge7LC7R zBeoOC#ws2A;m&LIQz`NCDX8^zJ(K#M#W0mM0YDpbVz-|7bdKgt|JplzuBpMYeq*hv z-530yuzh(L27B+M{raV%@pje=B5q-NQitdG!S`6GS-pyv)2YFrNo}{ewg&vX3bnu=8Q9fMBFeuBBgGK3rcXNlLicZNdtOhHHe!2^{CtPRm(XHCX|mK62086~NE_ zOnyH${5F28rrc?kWFv`184V;7cij*b+F9!MXRY=g>WN}(u85-1bPfv()61Xg{TOHE zp-wc?YZ;g55}NyZ3DC|fSa;&(vWuuyj)j+BY>Xd{(s6PGSj_9no5lWN7Izp*%EKnj3W0*!xTLkm-We!?F_eh$)ZGHM_InK za`D@Jl9}H7d%rJyklE;$H=_Zs70Yyb8lJf>7;ZQQPL5l3*^4I_>Pxkox_{Fz5vpk~ z*e%gJ&MZ%t-LIB@F<|Jm?CQ`6l0U3zPd?w_v}ea^nI$b=Y}@g_#^xmBMV{?z=pNwW!Zz@C$~LK)j$OQ;AJHU+%T$1o4Is}WC&S04QY!%u^k!+`b(N^2 zJ#%tD&#Wg0dG_xr2f^nDQW~1%hbN5TSKX5PuUQNs1zyGWBC=Gt4Z5O~D)&pBpe()P zPZ?KzV|WA$w$TDCO%9!N7qknlIWV)478VT=^Ab@c0FW-!V%?%|k;pp9>hAA?1RV*F zYvn!s?!iWuRoY4@$@(7~RPeYS7P@Q)(Q}*XDW(rbSXR6fp~G<0>;QcQ7Iqds-vw~EC4L9cDqsJq45iL5$FNdYRSUGo}FTn=wcG%|fhm%v(F`u4S=aLwjVr=+2})Uxjcy#&qC-&$`iP?3!b{M z2Duq|zy^JqQ^f8~63K|q5mu;ni*B{1ROW|*+cU-E%K0Ep=G>D7%aixMHQxt`pj;ix zpg<)mDoi%N_ewol4rNR-b-vg)v>&vD@6{x*3%%>Xzg0$*&zzf`+2pm!0JW{r7E|4& z-b6Cf-JkMQ50S7d3$*(~C@Jy{5@KYSB=r}%!Q2X(7iVrW9ZVaca`>22=$TN<>*iG% zMgcXbG;)F|Ew+j99C7E>dD(CRr-cyVQ~#ahY|o=>6F6-ry*2>UZH2Ck&K60ApX~N` zsxSB&o@OXFyjD4= zq!{YR>P7wLi7X1DFWX2}u)A#k`CAaq@20!Cn9%a&YBKFi#es&xhG{t(IRuMh68mCVBOa?kQ-3qir>?Ck zsH^8~f1w$8Jc*&Nbi;k9T9t2{a6M$7=BVMBJfciwm?^(pj71oqQg;MLbH}sYI8deF zy;O%a(~8R{P+9(cBim{E*fgatn<@9*OP^M5nZ0p^=$c;NGAb2@z!}iIrMSO~%wQ&UrbV+Vi&G!c)M$1o6h*q6USAjr}G`^kR~0yGK#KRgIt7Z@MsbjL9D zE%a>dZ1lCwkv#_xvf8w_^v$T=5($*@>JXgeW)!)I(~`$pe}-_qR5(n8+80e<2=UJ9F*(l-Ze?R_v1pcQU0Z$w>GlazL|N7Qs`LAxx=Wx&d zpWJw_$)6*C`wDqiTEHzyu1e3ZZ6+hkM}B#O!><&LjP3N_SQ^9arOH6Z&ceV#&PdKk z$ME9C3w3xa{DrW#xw$sEDia+O`M>}E{e`5qosIEZw3a+AD zJ6%D=`Pw?)nf9l$(g>lyaO&t}e`B1l>QC}6`Z-(wookD(h|e$Dh)~&iakhIAzaG10 zRd1VR4uEtfI@V!ZoJFZF`q zE8cN7@*1%#I@b{#dTsAqZ%ZNAakndLYuUvIdF_ zivw!YTw50rwQ4^^usKJKD3tYTiw#~_ve_&NP(@=@X@=gugQZNiOT#O3+t9%cBR;ftY6%t@|KGmA)h(tF7%5i83p5?3(?{|ZGAcXsVi*xkw6ys z`03n!YVchs-A8fB5^YS1()XJ5NvnZ=N7FpZelgdPNZqJSNEC6(Y&NR2PHIap506xM z!|erwq>u5;bHbE~1l%(IFA49Z=aa1AiG?!n=}Zm0|NORlba`O%MIiTU{3RjEJ%!Jb zi(c1bir#9WsC_oMcpFekPA47zG$Eur_I^gsReIEZPc%LhEK03TgzZb#TaLSId(AZV zQZIg?5VfK5{Yvf+2oRCp6Zyr6g7<;FGt% z8dK!(Co@!7v7anko*9=`BV6j{?!$9ou7oG)HcuAw_wwEHH;3HNnBxvt<$XRMO}~mA*|<-_ zOZu;h{T92|Iebtguyl1IqOg`eSQjciyV3bwZE#3$sdx|-sbhvY}uSeI}}EZ*AlaOa(KJ)qw&XQO=^5pN$(5& zt$eKRO-t5&R1}~H5iNb{++4#L9wiwkr6xMbHz{TI*x|N|&xc32?NJL7nB+e~-=?C< zP#HfrCR=&2f}0h&`zcqjoV?~sbGxzLbtj^#_qCC(0j|EMpScA3(?(@ZDU0w>^hxzu z^q;1A*@O&;6D6-ouVlM(r&kO-2W%*Uz1A_+ac~sC_W|VDo_t zn*$pId+)~6dryc7h!luPS^gO4NN_%hjP6wH=K5CK;>y-yhV2qy)#b-{Lzgbl$((tZ za#X}f&Y*PWcXmIgZiID|b|dZH@%I(9dhg>a2Gg16l4&%2_A z*yQxr>3`FABpsv5V{gVp#|lP?cC*IDGq153#$1gxjJ0IoHJCPREWB2FOVzCKg~i_} z{WhHv8|Cm^*<2KH*-jC0uSJK>o1G76Tyh@e=qsG$Z79j+x#d33V^gY7#u-%_l_*ly zlC|8aq5U!3s-RcXz8|n|%IQ*rS7Z4n<`3x@@tEzp|N7dxC1)SW`}^A@CM5YUa7oug-pZg!SW#+3Z6rRwVsdxtNe!*7skO_-#zK!{fkVUGtAlF?N`LzQ z{54D75t#j+cgONA6IaGt_xZ7XqW{r}Xp<=C)4eN7=v%1eSM9DAqy9u|!1{Bu7<&$V z2xAJT{3gMbO-%PT2R*}*gQCPwm7m)9ZhF-&9aizrWR%w*32r* zD$nlCqTNooz4K7z;q?&d5YvYRw%wJk79@^Z#Rm&sU!(;4lW~)?lQ)Dp1v`^f)4$3- zky7SebO@ZCmtq;=Z2B)Bv9M4#H)WO8sd3ukU>?(X+QQLRT^uSa9Is2Lww z+t1}a@_r;JqgwoWJ7A%DVT3A)YE7m(Lo%w|YTQfii=4HI?L8`5c5}t?U%Q1X#2E)Y zTXE7H^WzdH(Spx=yP2ZHIoE!h#gEmFUHy4|g=)p+=gf|dQ(0{zwuO*n3nH<3=DP>Q zH3G9+yVub^u6@LLj>a^i&(nd~rjj`H6cbn8=lI8c>+nNm2fh9BKO^i#>@~KZY-Mc@ zmP2+1c5aIAK4uSs|@v5EoCII&wcE-nptLU94^+z#}`YriI`goxs28SAc(j ziH4PfHPa=T;8G}3AR;r!(`!8K=Y-?m?B9?W+`HUssj5|_wesEtYYeM`o{vEPnTe`d zU8SD&W~k3&mk622rDtd6(QC!_of_`p+w$VR%I%?{2?Y=9^XZ4^!oxK#S}tPEJO3`u zEt1f1DVS;eEs}WSP(N8#n|yjEcHXfwQ|+dDw7!+yB~Ox5r(mhhul7*c*4(^roO^9| z7{6dmnOEO!9%J}Z@eO*mp6R#wIyyhfB?l$_B&Wjr!@Fb6SqsKa>&4{k%Q#Y^4(9DtDamZKx^Y)^X9zQ#b!{b1tZf1jpgYCf80~?}2@dghTk| zaiMB)jf>Q2f~@_ty}gU%L4LmQ8vdT!iNT+>(+9iWOBj)#)=#2OIz6uNQoFmJ${tIN z+!P=&;{0t}IBPhOXnK?JW;hE);Lg3PF#?iP-C5o0-cQLaO#fQ4?{*$)I*=7{$+!(} z{a)1_)P3CgDfliKnOS)GeqtL(|4-JM_2G8orv-5_&e`*JgDWKspDvuYu}`}GmY^60 z$L(-B9@h3ArDJK_y*I%edZ6MK>xJiC?ei+!C98nYTz zRxC>~^ zL(AN0tnBYto>Ps8N3C@@Nl8;AA8t$FIF`}hoBVrg8XKp9 z0nKv|_1o34t*yR@*;yP;?P4|*qi)4b`f$FFE+01UhY$9@M%V0UKv}kO*ZQyXCbs`7 zZ(@1Q$jpXJjs7neHCUNgkjMGAsPW?Y3*=A#Md<=w{ST!MReDi=em-qmeLZr>;9kHf z${;f#dRa+rTT|pq?8uk?Q&#k6>gWr;{PgC@@l~G<&2i0fA6D#?`RmPvH#mNqP6P*Y zajieTR&cdSE&PLdv)98wwD&f*UR{yH!^eN~5(Om$HQJwuNI#+Vy-qq|Hf3g2XptxN z@L59L%{4kEsC(BrDn!fgxqE5jMbkW2T1x7tuV31vkx3kpD8h67m?M7&F#CGWoKwQwKd z!|3&Kd)wydO-_D(z3p-kAlVTJ9OGvqUtZn2IpF$6r04R@eFuV}A5h>|*T^M5mH2W# z#t*ecUI$z|MMGdB!4Zu(Qx^~~1E?NtS!2M@bTO~H#$CSgLpi_LO~m&o zK2$P8~2ySYN-;r+&=z$0l28%e~%M1Ce}+K_`0hGU=J zH{`e||Gc}8G+>Gfp^m>X#VFxHaasSn7N#(fL^S#83kve=^d&uRea{w;dNOjfMJ6Ml zjXX@#wHXJim>(p}L{>12a>H}?DQCi4Dhl zS?bdyV{`ez_l~xCK)@uhS0e+3>r@$0%zx;ltU7a;-SAV)ShlW4J1gaL| zR-TZBzMP_BFwyfRIJRjlxknqXesaf6X+lo|as9l0zEo(DE*~B>lbwGp&L{ro{2A_* zgckt?9;q=nE%aF;Oqm)B&RFFcoagnB&_%6e=v7j$RsS;v*HZdbhyYp1arKMlg}3rT zBF7C`WpYfkKAo&w7CWCuBOcr$?o8m4^q=1W!aouFJ(lh}#3SpUx22*9C-F>vSED26 zsoe0rU0mwBN1!C~jQr{efOu1rGym6fOA5CJ;<>G+1n4Z*p#y?9eR+RvgucYO`QO34 z;dos#`hzcsJ_!m+v;8wh+RR2Y{P$jkT8yPM9zIcL`YYveEZZ|>-3;TLG9ZA5@%4v{ zvgucGqvF30%)vY;%rDd8-)rwv8~&hSGxn-LjL_#t>WvL2{-AEKV%_{54Tq}_ynN1l z+QYD@;bUl{I#l@8_?j2AsA@iDr4x7!jf?=)Y91swfz4m#c2bTyC)^{!F1R>g4bEif z%v^3A>J9Gd`JXWno^O51!yi~jb?t;HcR5U;{O9y_8#Wg+rSm63OQ zBYfou8+l0z%r7FdpyUBmx30Poz}!IJ*#;O=dN*E*cI`h|SYDp^31%jHyMBI{;Ur_F z-$R|vaeq=V%i^-c0XQ4j-1W9V&3_2W$9bxNOEOAK2D|_$KDkLtOBc(^^{m$sBnP|= zjpWIu5mEuV(_%J_sub%1u(klu7sGCw&NG9ggMu;ykkLA?uh1r*wLd}1Z&-{8XlP7> z0x1YTeMR7~mn}Sx3>HM(E@xV3b(^YQ87)dF{qSfo^umx~Ka!bpxB0QYwQ{(I;nvsV zf2WxdebV%dKxjygTSwUsUQFnSsub&qT96xK9~Rr0XxBExr42U#dP>eVlqH5zjO`P_myE$ukF5|Ac|lBqM*{o*`#Rswr?Wn}E@0*#&vQR_{KEPf zd*n1>pPxUU)YEZM(rN@v7^y>VhQP~WWv^q2Q2{BtY#ub5 zU5^Rk7e;wB8SjBNL{+*aFqA<}rC)lzWegy@+ecil35t5mXd0)B+R_;r802E!`~0@k z$x;U9VKb~$=cI<6y2%(W9C#dt)h=t!Sk>HpC$D@~&3Lx%Nk` zUF)$85DQN~RSbr<8SZe7Bu>8ToWt*Uv81E5xZ9zK1>T!0cwnAQlgT>>gzKgp3OSXgPd8K7MRBxgR<5E> z(w&YdZPla!7F+zdd`?;bYNYV;QeWS-i$>}WgFs6WO~Y4}x+mDQM&KK^N7dVRGc5}s z>N<*oLFa#xG>s!43_t66XXe#Bb~o;r9)Lc|+E`_{8ylswL^N|)s~baY#8TJ* zkDQ~cP2=1%7KQlHlQEium&9`73ZKp=adK!#H9Qyky2WKXY?w4>v)&IS3# zykHST#p`mVP7(P)427HK{PZaf3y8De??IK&xjNxvwZFOy<5J4RqlM z70LX}VepgwWpQzb)*6HU9LwKZn43HVL{V=0%-sDAFv#^L&(LVAV-m7z7?zc;KzAzH zV7$oh?vtLnW>E4p#Q)s%`6k!jYasIXdt-uyH@T2VnW=M2S>8{aS<*<<9mn8vBY3D3 z?+Xf29&d`3|9jQXU9P7L14HqysfveJzN7U!EkIGO3PEW!?yZ8I$ zYi+-7Fw+-;^xzQ6D`8c|Mvt^{_u4%Dc8$%j4m$rt2m{rqR=(N~+t+-<0~U$u(%+ZS6D_6EL~z7kKX zInT}=p{_StIdPoV)?=m9)^t9@U57mai+Nqr#I@BlHgU(+yY*09`Aai~I&yp`2Cr38 zAT!MSr0pxd+UUwDP&BaYUP`!) zf%C)hnqTrhfd1Doy&vL&)qj1E7`6;FMh=2#;@V*b>ed8{i=|YKWoqXng8?tw&Z-aM zZFuukD*9umPKA|N)b&vAYv`fu}xN_>PTl#JYL_v*?^{mz6%hOp0G5zqoFM z_zIZ0Vl4d?y|(><{!Alge`=~_TX;R;GTyJHosU%$W1wFJT@)F9s#fHoBT@;^6(^pq z=6efrx>3rUnJ$^1SgTwUpK5iLt5lJY2i)BB|HiEK+9!yTz11Q8`TGt zvJK|gFTI^`|M?}s#@dLe7nXTc+Eq|M)oM%O>S~|Y_VU$E5tZ22E!qJ=>5+ zWd;^-Kx9<6(3qw{TAf~IaTEepV{g<#mIlYUgtO46F)lV?wOu>LJM>7-f8)oj^*M!u zJr7KKOldbjSdg5hv^v^BGTnjg?G}Zxd)DJ}Upwg+e?LlXJR6$lzcSr;+e&pmCpKs~ z#dbO@j<Z%xsLCV|`{C<03&q1(wz zi7xWFdm?GDBz|tNEN`7#+4scise?dN(p}cT<=Ir+3Iu5 zF=%93i|obsH)D9uPK)s=L)jv`lBf^754jR$g7F3?Yis77e&rM` zwAAy~XRIK7e9daQGW2TUi$IA01nF|Bb-!b9h*Hj&Pr&|(FMUXo7$sT)k({8f-CKrCPkN%Ky&B>Zy?m0*{r*E? zc92;0xETDal~b0#-~ry>+m|-XcEjpu9PVARbWGrr1|26Uyne?-pU6;FNbJWBr=sQg zPA$CU>L3u}tuVHh3~ry21xVtblqJ5nE{G^4M9>7xov;L^+CW5-Gq3FRU(|h`bo3%D z&1{ggBPG{)G)uppr@_ySIE((;!M4hI>Ork3cYf4D+d-xV4e#P#eLaL|Ndq`+_d1qN`f`x|q8d$3kMc z(*U2oW?J2b3`?}qu_kSz6kMsj3=Wie?v% zYq-$cl%(ITxyD7p#Vtw>Ib~<-XxoI3X>6kb1o(;Y(jfU&9T^0kqdMngtHxqn&yr6CHV4e~#;VhYjYa3I&fCAIBCGaP<{Xn8gRI|*u_l+i&aCL)Yc=lPfzc~UC(OA=(DSUk&Fp+O(=Qi&<7R;6o*c3Pv!?MD7wKANt_$F#03Hy|MQ?=l$Y zaRI*?qWBx4E@*dja^9|H`H2ncVV2^b%6Khyl_2M zoT9rOmu>q>=}U75^NYe4-i4u>Q`x`QP0oXeAyTvhF} z1x5z>XS7Ri{fLhPwTC0eRFUR3M^8!epz%O*B9c?ejM}UGOmd8Nq&4< z#3*GyADukBz8i`>?d@{wacgO%xODs>L^yAst*V}txTS7NhS$vEj34H%D_dOxx--Kc z4oAy$zFEW(f=g@hc zI@2Kc@^Gm_Yj)XFXXgV&t|TE#r-HCmyGq#~ZL>|Oi8#*ViUy3ADf`~fwJXWdr7X9+ zIZEK=+VCvT}0=icK!HEB9BPuZ}wR?Ikq!&@QU=m@_!ON&V3~ zW}5nr&D8zlGofC#Bs%4)#3d428!`#y#iX3d)rL-|A!>_Ol}t?QaVNh)g#47?%@a)$ zBAxV{AH~dnUQ9-mI_4WE;!exBX{FpSGn=<;YYOhs-VW`)Zd%e>jOUvV^l2$_e74SO zUu-%UgALuZe6{aPE$6v7BKeC8bvWDx= z)TJS>;c2SM;D#0N-S~xvb4-p0amYzpCvMA)&>4>SzE%r+0*`?7y>;((r!GR{DS__~ zmm{%+s9IKkq>va*RILy@gOUxy&|uSZgvHFopH>sKGkEFOW_A#qPdjB;+4P?14c?jn z!_!lqn$L})L6gU;V$&p(f_QI{btu}XS|tjbTWD*>z$g0^B5;?>NDHLFo0jPThEmjb z5YcN&Lq0*<1#)dkm9Gra2qN4#%kz4)9z`($1JaA+vXmNCXGsY>9lveH-#GRe-UQV( zySj^4Yh2s)1}*vA7kQ!V?)@X?ik#npe27qptG4^U+wire*zvn+9%Z*mtjy^z&)&~s_MwQ!0Z0i z(mUCWgCCbEQ{^2*6Tmd$R*ICi9vwg1`9fSbI1(fy6PChi#Jp!dcY zo{sXJ?HX673IvI3WU7v#EG60}urBs#Wsb;XdO&B2qkHRWCwC{s1BRCN-z;$+yrx&! zt|s9sj}5@~l8)?vH^7qq&`s3_nic9vlj=%#k+r4bb1F8tet7vPIfD_4H9|lCLkNaP zCD%-BF3+G27PzB)nMHZ68$A!Je-o24N+~)ZxeYb(r*F(*AWqi(+qXZ6{;n7(5O)&1 zTRaz%Oj`wTK9`Z(*Y9lcbhv&bt7OZQucp=fNLb!m^%`e-@Imr}pBh(}`d~mG;Yj^< z#25tZCw`h5ouj00?KTnO;~Sb}Uw3+uFw}b_G!)=9)fkpieU#pEws*b3 z;#pC$xa%6*uzY4;_&#iTp|LT8nyX$GqwS0VgX~TpUR+Y4PUQppa~p~Q?%&9-oDsd< znk^#RMLGNv8lJb~kjd7$k^VCIimWCXJ$Yn6pKvlX#AXs7lJ1i=H{&GC z->h_Br>tf2IPOA#Eak6>J%^T$eQSE&wm1Ispra$4mRu*Q-Lg_s-a#~alcmptx1{yhH_jmftxBOTC&>*2|RQo8!nE)dDh(P*ex3 zzTjFs?&vGI*21lbhgUMkU&eIC`iDlKy6!r4lntHT!C=-P`ga2yq~4Ecg6Qsf!69V4 z!&>r!D*MW>0lE8R+@E*C#&h}e^W1#S9Pd`LA$^coS8aGJCNY8~AoFbMRX!dK{-y+M(t`4?7h|C%k3boC8EYU#=>bc}~J`P^s7 zPfp0Fvx#{cpzA4@Bq1&88k->lXVz>vMzqVsLw5f73d^PkE&MgNKcDd5 zW9yWr{3Um?v!oc@!FA_ExbI>fckb80rg%!x{Eb0_J}kBUO+)*kQkjhsCobLcig>CC zI=jBs%ciNh(x%KD9`Y$X0-E^j)T=L{&dMzqhNVx4#5cwfjw0`_Eb<6!`Nz~2eOZ4J z>6ugJ;^f>c)Jk)$??qP(wzm;U`ozefgeuT2=aJSxCQTe8vZ|O@`y-!gs8Z?5mPgWuS$y!$?@u;$N&o5YL|+fm zB?_o!9gb!Y&u88FN`YS1RzBAGJlM=*BzZV8m~LiQsU_(`n2b?y!HV1kf^G%AJ&BeGxpDVku*=SOwZ1dNIlhG`$<$jO>NReWfZ93(@D5 zqSNFfz>0Ny%gKx0WU(((t3y(A9<%wBk^IokiA_uGOc<>5-4i*;+f9yeg7JN6Ru1At zqmfY3HwkA2EcR<@)N`?>61sv^or$`(f^D^dQ0DK-R5aQiUSYf5MLEk9v9oI&Z!`7m-HTJ`)FIb~CmN_dX`k06Kr9G0;OuuF;pq?W^w7?~|N z?r3cgPRRdyusFDeObFW!%ICv4op)2pZJF**ks`S9yALgD)(&>p7YcSCB2L)3zP%Se zaAa0P$wn|TAcv?#XHht0eXui>45NX`gZ)X%K3UHnr?!6-lXA36rf&rGIhdvOHGMGM z%PA9i_|UiT$p;b2ie_bvM>MNU*SEWh&&CgynsNlt+1Vd*l>69GT9RwBIw(!H)4 zktP}(sw!4}_&V)J*pj%z_-rxQZ@gQTvy zPSrR;ghw5tz$YB9;M?u$RIAG)A7gP`8lVokk$+Lz)_dV4;fciXw5`{8Sgy|D!U%>` z>j^p=E5Cg^Sonm{;%#VQtg?+Pv&+V=M`HuJuX~)x-8~ZFL1$O+?R1RNEJ}bse75nbUg)A=%yh3SRZ#v%b7i7KPvvbyht>Wy7tk?N#3L4gEx*uk;NUkSz1tgRx!=XF;R#2 zIWHgcn4i&G^hm;bSrtL{6|`B~CA>UJY{EMH1xtz^9}~^hCHNN;q+PanG)G$eN*9cT z(=&RZJ27;SPZOrR`e2$LmT&X%L*d?)x7n76qct$4cc<2UO-zee^l}9ZB@L+7HGb#_1JvM`n|?I#LjMs z467S8Q51!?{q?4}lz@D&C?Osqf?UiVFffziv^*(w=aQ0*nlbtbcI~?cHfnxJ?aUC5 zrWoZfa>J1--pBFf%$FU5)x%@4gcyldCYpj`D^8lrbG%KH+lJqE8*0xl0QrrQIdJ%* z7iye^{f%UN%pTVDR?*AsvN62$AVU1ZQ@3V^FKps+mqJCVD-d_kUQbZ$ys9qVp(hGC zv@KHNik;E7y`uXT2dU^=A)aeWrPXx?c`KTI|H4TNi6Nr+LI<+(!gQF(rb~Ejj!_eG z{`UDEZa_6iy12m)9Mea%0nAp&aOV=QELpOxv8~L3bu4fIDb|}DT>LafD*Ge ze5Qefy|(pd>VE=os_?tvnL5o)ty@i{u7ZU+ zZF4h(r`46Nz1q|tPi$*oj!<-Ixo5?Xt4PUxhNj;&=!+O_jdFOg;p=6?r^J!}SOX)te4pLv#al!Xwm}a@oeVJ-~*DlvNZhkkmOK9!kJ0_C^ zT_?7y8A3N*DWxa|r9Z?;hsn*vj=$&Fx{~l@K)a#Q4UtNusan2Wl1aKp$7R^)XM9+$ z`09j(9c{c)aT8qr>S`)G*XO}aTKyCCzW1~DKM{Mvp#5lPr9Qbtv6_}9WCIgJbh4F> z4#VG;ROdS%>hH_D@2d%g+nvfn?WGm`Q#;>x%Tu)Oh(}??>XDACn6&D|Wz`oJ{CZ7q zrX_mFF#+^aJ)SU76Jhs5FiHXU_3Qh`2P^MS@&)$JpgzLPNyu45hyVD}ZAH4lYkOPY zW4SVpd8o!#KGgJe{6U_Opd++>4z)TlF#o_J_w+r`I@`9fY`RaTba(EP>S`h1`NaI} z06qHyK?C{zTw6iw)Z9kigJidnug%_mu_U@C-yLXlQ`Dboo}ZCw4Uxs2FLj+udip59 zU&1 z7bd1RoL;n@e86)@XqO{_{bsmxm)6r>H+$RDDmJwdzwd7_wJxc7v~nDyF&a)k5yN63 z`^IBdyZ#=lb5dT%JL!u@2yxJZEH$_>c=HftpQO-3Weh8K1TLfB`b52SMdIZaN4waG z{iTE-&B0`a$T&U{AJEujE=!BHEQ*W#O;uUi`CtyhSonUnWWsKv-5d{ ztGSosM6wZG{Vq1MQw77L$(eR0{}6Pny~x>DlPa@Foo2g#KE>h_%CheBPiicR8)-{< z#7s~4|MG9+(X?H&I-2zJ-KP8(y{6|Q>+$2|lMWN&3R631!fny-BX$7~kx=&9j%#M7 zBR?qbep?lu8)y!8eCPeZS+r}}+Yl#sR zCq*8T3=Iqr%~1T}!2o1Zlel6=xqrmUY~L6A9vcW=X89?5>TJ!Y_7~vDulNjdP`4*v zvvLw8+)Q6s&VaFa{X`o~eJ#(RS6Al-L7Uy!*YOon>e5p(Pc)a-PP_H*Z?Eh@&oo~< zbAHk6)Lk-Aqe>lYV$smzq|}e-(?pdbSyRYtsqb;SyX1%@I{Xqc#eDc(D%2V)@c~cG zX{|r)U$ZYKJ|vEcP#349?VT?-<}sfH^#qBWj*4*)TCH=t5f4aV?R{{b@jhS66V~v% z#n{1vHhUsl0+Cz$V)=K4^AD$G)$?JFsE@7QdF1wWUXG=|X?WR>ZZ`mxTTLSOu?70Q zv$SB|^sO|iRr7~(8uam0S_ckn%%?V%vd@TIsp!G%dr1D6y{!^ovVRY9n@E;iu7YN=D9E)Dcj!h=~pN#q_yb6lXzE+!pW?`jU!>HsCl+jF<<-T|mYGx-4UE+3#1`dGT_Psiiqy?|KlO0qT}cQeQg6uJUxt<454tjkFtd`3Q%c z*WFyC=w>k7%Uorf?D2BmgZ`rDAygfdg-*N4);L*6EWES zM(dB9ddG2ZN=p3g&zje9qUmB7P7VZ0R`MH6t;C12 zrn-6=`lZrseu>v30Xh`#&|?%{`84+NE0_art?cSuivt8t!2}g0tvwV(Mit zrxtb=U6Yo;s~l+-bb~Fon8FG_NYBFXf7CM2!ur;Z4)sv`Q%e-_CyXln>cU6ecYqHU_ zvnu-$Y)%?p7#)d1BAkRe5xYxFL-)|Nq$S@wemvyO8lR!Mrwql}1@vKlTS8UAo}hlN zI>QAD+{;`t@5iUEqcmkaQ0t;-@p({LpE#vBFVOmGIf}>G!}jTFX@b@QJFjk8D!;0U z@R`*s{nCv7ulZ0xErwm@476XlqOf@LXc_E=e_vCSdg0GjE5M?y z=(a0|v~V$PqNF_bGBomjqd8*T;zI$>8e{o?=c=mQ0JWwF=s{ zO}uEF!P&I8stsLLK?gg>jsG%vOP~ zAB0oGSk4EG$oVqBvTOJPy`v&7^K0G+C{R3usX*(M>C-o!o*6WGf(?aAMjYSBZY`g8 zqPH?xI%n@G|77|5v9?SG(~9C|fvaZJ)SC`f32Q42?jPfZKUGpRM>@p|%o(e9X&$>WEs*G87?XbCt@TfQ z`2q}das)rW`_0mxk`aly=6JiUJaHgAIJV_;d8N1Q>FwqQws+i#bV-!$T)AbNR0*~2 zk8F)TshSM3WHqB&ThtksI`ito>zcYHZuib7`#iYNJM(2PIirG)b@gN@zzSHyu56X^ zXzCNn)jxK zZF;%4$M!aZ4}1Ww!7(q$qHryBXSkU^@5&)K`pZv+kvm`0J;#_PO?fzu)6sQd)F7u( zj=m+_jqV7^7pF?2a3w3hA7!AfezQjTccE%JVl%%5Vn_#qR@daP?@X$_r+_$k^dw%C zJ?cK5oD0qkB|cc9Qu+|fy$q`{NpGXO0iYNuJZIXXeXE9VnAt8n32gqM(nVQJQ=zvj-V;>iyG5jR6>q)LG$Y~2+ zrmllQ<)+THiL-T@fH5$*43-NVyCYB#0elg(x_dwgRbjGSn)3LiLrON$4|xR6>7Jv? z7GW`?34?xk2?nD_dhZ(GC{Iho8XeI!(GUSO&x`HwUW1PvT$lwR@shfB&)?ElZ&+Db zVaVOa>)t?j)n~$Yw)+9xJmeI=J<_f%<#XJGcpD5d_z#C>pgDAbG`sB6RXX~oJXA*j zoLWf+$R|cpT@!Wfv?o}`7D!t(#XLaNHBKWC^g8|GLGw9PwLFD|2bc4Hntgcp=|>0% zL{V61OpSryANXe-WZ2PFfhCwi0WVH`@(!2{0ir|qD~RaJgCi+OA%UUqukHuBCU4*O zMPL~zbWKFEMb3d;8!q$iTrVd%i9v~%lX_%5ibQlSKu8A_36ELBFUTB# z@El;J2BL<24yCcEedC?XBWinAlz__n^z3ZC9xvi;Z!{Ku%ia#`fhLZ!PJ0yTJiEgC zF4>BhZyLR}vNSM2ZgQfx_%A_s_z>?V`RPaF#2*e{sk3|9J!;LtXE+V0T$Q zjA4X0P3P*sVQiyPnJ$pwetrRwyTD%$KsL7Ed|228DFs2Uc%sEXds|xrd0TsX1ooED z3Eg2poZxBZcTe?NCmSI6xCV~vr~CyTpHs5o{nL8CG+ON@{j~!!ZEIuWvp2S2^+LaA zQ!6X<;q%bY(5a4jxE(M;K}b{5=0}YX1>g+*r`r-2X|YiEUr*)a514ujuQDa-Ivp2( zyoSTQd-sYjha+rr)%D8bVtqOPqLo$ZbWQ%?rvJR%n1;bd|4pgw4tQyuYFiU1Kom*? z_$>|DO?@KNn=pL(0_hzb<|ADSU{U4TV`A}cL!lt!J6Q3|Z@v&<^2=$qKAPRtA-WAu zXS0GQq~pb%{lQHtZ~^T~H#2@#iSvYRO5LcaW_AG#(jEs3C?AfeRFm{PL66Z$fgv~% zKdt=_zWdJ=^}`DK?ZN;qXSzTu(<}iW3qTmAiqQyxBhi4+sS9MSbI7DjN#~@C2atbw zz!Nz5y?o$GIea}X0z6t$OktgS8v?p*(35JRzYx8^>OfN;2q4;bycz9qkU0(->FIqN zi6V+7${TI?b7<1hHwZsb*UT1?>0VcsH_BE28XWv3>Mw4cu4!>fB1+alYzlC7#V=sp zR=~pZZef4d1)Ah>$;sUB3_xi4AmBAJ{-2tJG`jTB+I*vJ8#8Zrb2{-W#s{D^{iy@+= zvlN=4uhzud6D8bK17L3CgOX#R9K7mPzX1;04C9QA%Ll8;&1=h()<*u^HXojxwi|@? z-5HAN5wfhSgh!XJkti(>u0m;7eBHr!&2oSV6y9N*8D0jUH|FkFENqa`g}MI1KF}J@ zVaE7EKV01Sgz*;pDR=8Q&g`<6KXl0c(jLSdWF_YQd55Baqt66T^V3lFOE?+mPQjn&oyP`my$A23 z#q{LlYJl02KPQiqu5Xy0juv(c4!jt5Jk)|dX|G;PV!*wFej0RfV}$8HEDrlRkcvH;3qlCLHybl<@c?j|GbYhcN#j9N6%lM)29E=%>bnb zV%Q&klw$Fv|B7Bjb`}YX(LZsE81hI?@&6OCh(tJ&CujbNRm3ny@*(n{DD~%7ZhibG zJ`sONQvU6q$VB|V5R-eo{rK!MNG6tH1`gxV$>4*1NciE6R%QkN2BYOhF-u8yjO6Y@;gCKx^g0r_BLl>vc6AA)$>f%bL3{`iT}ta7lbqkbxUh#RHj( z_*w8Q^0`ijL5fiV%nYt&Mk$wJ$gU}mACHQRJi#oVk(|6)-Mrt~L3B2OuQQ-MJIg~@ ztezYkxa2YO)Mx4Sx&O<@r5;st8LRnXJ_QvabHK_2UUXL0>$FSRWhAhUcQ}bLIjr;? zNOt_^^#Jo}7m5`xIn`*!#NrM>+k+r0xupwaT(2V7Dchl`&;GAV22=u2Y=~ZWUUEQ? zICH}t9G~ij;fOsPIS%^R;2%RY2!_-A^=o5RwQ@)eGUWs7h(=M1qkP9PH7>>&MpM9G zA~5z>RhYtBg<9GnLHC^RFZ}lHR^jz6TW2RHIHQe?jPegsZRxmFp96Kl+jbVAs47Oe6@huB}&H&CvcSv1_&9UOe*I`=mT{_~jOno(wI zrP&KIuyjIDG$Cr|dS6>N1OCdtA`Ffo5RYvc1IzdBF?AeRjsRzfoa{7YNfdFhv%*SG}M6|y7P&gF>2I7$M*P}Tit@gm{us>Olzy9OPZHPRjB6q<*ERzO* za(fp1nK+F5r>BSKO(EZJe#Z7#SqBG3r>55x>A1dRHG~H5eP>>Dy0SI(5Yoy7q+XcR z?N3yVmW9vu^f!bwKUS^?zvL+L<3uq})ZDu+H3Ag53IhlSxgjxMIQW2ihS@ivz!i>- zS)?wR6(meTpelOZH18+qw?U{4+TQ_E(HZ~$-UM_9JemREl~MN$9z`o*q8hZ~Y3J@E z=M``)iu=PIe@g;}+&N^Xs4AKWnHtv}v&96u99q%Dp18 zHN@;6U4m>yaoSM>-YKHQ0$8Ye#n8-nb=Ttk3~`2F!mVLaJQ`$$#aYQ6ph~To;IEbC$+$EdakkY9S%+gZ6v;GI4~_aZ%)ENUjdl*+H|J zJ{=#bC;a%4j7B$Z+)Q#Bc$Jtdgn0$8T`l+aWwBP~jgrv#Kihg{LXUNqzrNOex~)*Z zAnh<4RKT|M(6PpA@1LU4 z;~;BUcuYnaI4aj?IH2vz z#eJaKv+6`)so#r7d;-_me@Lre>DEGHazHzm12&4wfB% zxyfB?##W&i$LmB0(GiyBT}&aV48@q^urd*Q%LH zrJ%dJTl#a~QlEJnyW`NEbSGIfzhrxsqek3gT8&6n>qtxy@y5dgGkcS|Czrq_pg(z&Zg+r>#8bmXg13r)PzJ~o(Xq#zdjPu zdaLC44~3PL{q=UOoSqNB8d6V(7>ws$Rsa}mnT_Vzk6IulY51z9KVr&1ZUm_B>bGDS zvpxn5medG%-!rZ0&{|&YvaE7ReYOh%;;9kPK~-IcB{e}V{sgP}_$7G9-=9?{$(seu zXZDT}Xf%lVUtQ!O0QIm`Iro)a>3E4Y6!Tfn2B7AXQ`Wwz{~P+jrK=Fp@4za1W)AAD zw=|7=|8=^0zBiIQJv}`Q!#^!434QHs{ph0ZZs16+ffJA2cIhvO+&kKet!$o@_XxwH zjcRbtp$G7Ac>}f_Yd0Ps_bX_j)cn5twherf=M3+R*9~Ys<)Acg3aFj%1TcV4>4j5` zRq#Yph_|zyxa&)qL#KpMD7m9NhYSk=Unz$A|N)6ZEimMdUA5 zrJw)`l=rL#6q~@_Ms%w!$-E{2g)C0mqE?QblKAZ&NnDzt5v^92jrAN zZOx9Oga`ToLVlx8T*4*SA3ZN1KA{Lad$0bk55Rd!ZVuW&uV5m_9*}YFhp3pY4A*~z zyF^giS_jBde~K=xK>sZq6+JT~=E6&yc7UZM=olMumR`t$hnCa41@Sm&ViH`ZvBIm+ zM<^&B1;{KsjU_*poDDo$NBwTWLCh7(dRRupuIu;L5S)6h9QgtW$VEb~Eqz!7oV?MD zl5JPG-f~d@S}RCRW+g4j6(AnR8GT{K#Eplih#LPo3SA*^27PtE&(I6=oS2!AJc&Vb zjh7jUg45Dw>?3&oxdMA5&ada>7{L_i*)6{?Vt24z?@P{ybZsRJDj{ksM$HX<^1?#L^Y<_-7DaZ7L#{9Yfj2LC201%(45%i48(mD&UP zG9saY0B|%iH#fg=1Dc%;5S-G>zrBgGB#14YNg6yp0uxEr!YP<$A%pWm0?C*H*S7A8Ja`@sC0>A*QX6k|xNgEvPdx>sK>#?387bmF>vkH|12lj|cK8$>HC z=MVR7$tAz25HmWioAEU&hj@%h#YYm|=%gU1Bb~bd-v_-YuYp&FGe2XpA)%hu1N2d9 z<8x}pFa~#dBJ&%%9wMqY!8eNU(|>1)yuWpafxzm?xeQjt$iubgCj&P#g~lMn%Y7V^ zOifQuci~0cw&VOUyOS!ou{17=ThXGy{!rGN_#$QBb)m5;R(_|Y`Yo7-O#;<4D5yzj z4^GqF7;QI|dv1?-TwwXa&0AMG#Jkb36=pJA(K=L@;QV)gL`zZ1!qxAQ4bf^-`)aMT z!I(~0ROP=jzMrvJO->IQ=^FAY9ydb8JnC^NqPN$S5K?Oi@P*CU+1UDoIXO;p0GV;= z;}76yK`M%|-&2Ryj2CI3j%^6MM3dwU@CWr-0_<+5iH&)ci)dd(ES6)kFO0aEmdD^U zNjFyosDxX-^bI;Yl?BY^mqCb;mMo@v$p2g?zkoo${$n1HqGvC4-!z1wg7DK~xSUNOc(RYX(pMK-FzUI)WqeSv_9G3tFL@I3}Dykk_w=gj(Or@ zTm_B!OXyYy_fyDHWCWiDom9}?eGidI-`R_})5aXrhGu4b3<*~A;BkT$aE3z}&H`(w zQW!e48UP`}_Xw$LqWDql{#ABneiumF?XJ^20K0`7Qq@2=mO)!X^&q|g2QA+xPtHt% ze@gOPgtUtx!Llg;=b3(NX7_n33?|aeR~k5Y_<4Bl3hEgePPa{3aCA}Xd$`5eqd$D= zYJ0@=S^&kZ)|I88fb%B$az$8l9JQ43S=OYY4MRMdHcKZ{=jHdnx19FifB70(dxQP` zFHgaY=iM2NP4eg~lxXpHOHXGtFjvpG)jj)HHJf|B>QzLXQae@SbhfNKY!6->29{N( zm~G_vJ{R}tP_RQV^?9-i-756WMX2T^GutX5sZ^MD*e=!57$=M&)U=>ZDP=0EFE-;R>kDPtoVOzhu+3baqPitYmoYl59$=FTlk}$U%8=uekQlJd|7Ff~;iQb#@ndyXMC}`1+!8jt2 z`!yHqS7>n0b>6*&rA`U9|8<4e1e>P!@N=k?-Ghp#)WAlP3Ym#e00Zg+#@t6ef@sSh3<4g>2?_m!gM7qY$wc)0r0)XS9;k}UatzUAmqBHB0j{<4w64i* zRCga7`8sJ5h4B1HnTs2)MxPV#dk!~Bd0f`#2b`C{k})R|5R;=FJK!>sMthkO`sQPd8npY-=4NaVDy98J zVU|k#_QOzZ*FZ!fP8`tC;~8Co6!s%=e;=7}2J9*&)B3v4PVld&h31`4K^;dy&qjYb z63h6@_YSOJYS2lDoqB}>9=-@X$e9N)$AJEI5LB=-rVen5UA_7svK-KEwete{bXPbi z{WmhhN)P5+iR}$6E9LGPXhAzjxx+B97or&$m(rc{oCbsWpJ8XMjtccbU{W?zbtbhUjcJj zzN9DEYk!79El1#$@yzHBX8~rna2SsL|IyQ8jerbvC)^Bd$~6_wz6LtY^vukT&=zdU zLX-b-8QCeSHh&slXWHA_^`V_CMCV=`7Znb9mI6HOmBq;c=o3UnMkYjowZwolHTX>% z{Jc&_PeWX7ic)D>bVQL4xb5Fyu>>jc$Max!2kzGG%n+*Jy#jZ9_7Hu-WM}NSAxsqW z+h6eT@Wh>g)=x6b>P*4k)dvU71gPRWpj`v>bFeI2f?9kB4CsOTc^gRa09n%V6}b&v z51WL@b&z%-Rb;8X(K3AtJiH-3?YRt>y*rO=1V_}>!n1ZiA@H6&C-SyFoG70m(fT;8 zSP;KSW@(bgi{;Ujf4;D=V3<>H=~Eyyucj_mnqIwp4D>bNO=7-KWtYJq2zn0_&@+>1 zMI^m}*gW|WG;MB05>G?FY%&Wdq$-ENC-cxyC=F6>f31)7{Ng~-5GWXRZV6h6#$sXh zah>r8VHUc7x{P8A$gA(J%U^|P^=&@@W+zn5G}|ve*M~!{Gh)lf$9H0^9j~@((|G^q zH^7}%!(5#E=eah(joq(?2+yf-c#b*z8I+LFY|)`?FZg3=3Lz&ok-%9cEeGe2G11BT z=FlrhwQ#QLVbf(D&*aR5j>CEKP=Md-J{Ua05er}6i@}Huh-lLr>X--pcwacW6Jt8$ zwI!CR?sdNWTX4+iis@3=lQ(ld|0be1?tY@Z@YJ4=n!IUsUM5Q`@2CA?}7cBZ61SJ9GE@C+f+z&sQjEiB0NUSNKhRlDJ0}Y=3&M+_IER%OGAhb)AYDGt zPul^Ck&W@s(5;aXc-J1oC^-*hA|D%#iQq)Q{2SrH`|P|!!QCfK_wG#mp67qlw6N_r zA#c2$Uj2JW*rB~TGwAC+=f>KB^V`sbQL%$o46y}{keK^Z$?mAmuMiuUL+Tc~!?0%X z+-}RET$J_D1c9O=4m|FDj#s;x0FMKHIKy!{+|byVA0*bI-V+fkwKpLCeQu2jeSE=i z*}e_3Yr`}=_p{VZ6tgEmCt#At1yq!pn4JJ;1Se#MXG=jCS* zSo8&#jtsf44|%tj2ZRR=F3UGZ0pAYZ)k^7uKaqw{>oTQBbTHfWYN3&gXAb_B9Vg43?N z{@Z>9980!X zK%s;@O^J@H%5Acge;c0ty#fxB#G2Ci-#2doyi}WxZVBQne*gXsWW9!mS5$0-XqX%K zH%7ApRuM2jUn|>&F+gqgFcisfKH7aEgM+gwz~m&OM2mTEKnql_S+(t>*9p*TlDl2r zoYzu)bU83y%ocX^YF|pwqr406nS=Mf)UU%|bDjSrJ{+Cybr3kL=e8yh^sWhuV*GXV zGyjm=9eIM zigX*;08ConH%U-)TA6xRilsQow3cK6(1M~AO@z^GsXI5ggQV%h+Z}4n?Xve6ahoE%39(I?s*} zs=&9s{+bl=P4@u-vbR^y|EE!j8O)*NO!uLm?rLTZ`Y%b+l;}roKAd3xR2~(!?PwMB zG-y$12)$s4j)Z&4MEQ-CWhk)>!XJRS?&4&#HK_wBzEjA}*Y|t-sI@f(KJ-*;V0<{X z5$fXf?_U``?m1ip=$zsOw>g(|0}fHU0H$eOB|JLMxgK_^0ofQuyS+tVnS1K zv8E)+BoAS(AWPf(>{nccz3P}VG`vU`e4?{b(Ov+$PCsuK79L>#16NVte0upUId93> zJ-e3N&W+$ApUh)C2VIY%fe{Exu(wFsmAp9VZ;GY0a|}iLeY$CV(41z3Fj_4`>Zj!D<~|X+r8gi2 zw0xYEA;F0Rn1lf>uXrqAIt3xJG|`?R%$IpH05Y^Gr(%U;<;13eZ3)Cal2bBa{ugE3KkP;fDpu$D=aj*bYJd0OIoI)|#6-mYP_Zd- z^fnng;{rGxbBm8m!FxYn88m!nRjVvw^IH70h()D!QbgI8$m}S5-v8!5d%KONcwxm> z+HHu!?aAMV#+y?HaE@7}7Z^BGxt&9!vNN1&pDLyy&<35GXICYw+!oY z-MU9nm&+x#ASx=TbgLj8HqrtD(jp<<(qW+@3epXNfRuDdD~dEI9Rf;7gVN0z53aTL z`|dC2(>dq*U)Nb5_N8w4{hqk*dCxiK7-JqUR>gd`Y!9j6GnaLr<2QG@ITD?{<@5C4 zeGEwu;!t~&me^gsT!!$7imw=l2I{W%vrhw4adoZo#%Jg?Ij>XnA8GtGt-z9dP+HCD zXOUQFQN2eEE2*zS>{qV8v&-}3acix%rAuf?fc3(qOW%T{OQ{XHyHA&v#p=?Xf*Z6l zvb5+8Ui_{BII3GF9X%cYV$3>=6dbd7hchH-S68t!+9+LfLz}+qlDUD?e3F3_(L1f` z>a2f9p%jCom&!5vW$3k*xjF8Xix8#PUE>(&N>qn9l^wy(F4`0D6e`T-rX~U-Lq%m) zG#fCvrx68C#$-#@t288L95-tL`NS|SB5#dPMnP~l>f5iC>G}fUQaJnhzmJdT*39mo z{!+XSz3Cgx5@EY=pm>z0Z(Wj(%Wy9xB_*|tK3?LPFr%Ja*kSVV>8S*z*XKPTsHHFw z4$j!U0nN7SH+=Z3N&P1@?qz zM(lWqhe)YFdz}4~caydX{WKua0>uVs4hrt_kP-mJJ5stU%Sha#X8rSOi^f z;3ACAZlRHqa>nBA`KjkT-Pa8Auitr7&cL!IBbBFEMPRD@Sfdh^M#=ow0VAHCqebj+ zYH7R|?bp1~^Q^#p-+NFO60_G**>U$>?1ii4VxGXB=cq4GIXm84;b|nuVT!r)7pytDBHo#dcq{w><-ykDg z16a;Apy@b%mXpN^$I{b?z`)m=#ctfTy*jN(Y}TDy_f$HKd0qIh{8tbO3eEWx0yapm zjyd2~skC)6Jao&SJJYsNTe)+Sk`ZgbLkL;Z^PgLPTv$9{Mly?J^6t*38$0Szh$%U@ z?SvZVJh0>d&7v(ibj!M_QZB;WnIN3Hxw+Z6;m`(rd*qr6(h3{$7O^ryqH9hC?865cD&y9c(_%N)kp*!OU3|Q|-Gf7;koTr)if98egN_5B|v(f+#&544#NSCEb1-ahy2lOFWPq~cpD6S#hNi~Ya zd5P8b_PIr}!K5>XxJCLH$9{}EfaC#-L@*;)6&&iq_`2VUg`o`&zMV}a-gZbHz6e-= zrI3GyOr-FE0|!!W;iMjGi1ko6Zio@<&feH}FCOw7Zy?$hJu*U4yNAoEUB}cDkwte? zsVQI4nyO@s9ImWdpQ`5QHpEpDV!whq6zF!;`_->qdy%|5qZ&AJygKfTS~{36-wyo? z(Nqb=1)HvLncHK=HH^uH^hI6ZV(6!b%#hL2X<9n(Dn{9Q+w#-uj{jRf1Ceb-TezPomnz;~Aax+>*j zLo~ZrxODtw*Ho%p?n)#(z8+?u?vu ztm;Q9V^diZed>#D{BlcmyO9?G_&od^g9F}k6%XP^OdtBGm>rm{%jr#+M|c z4&;L#h2IYyxwn6kW9B$wj4NWM$nsbw_A=5`;cqm<$kgW5UGrsL9Obu;w;k}QMk^18 zSxj2mDG?D@lsW`bkr6U8(maaRF6se*h@44mjEp}6oKSd|EcAMy4sn|KB8s7hJZ^L+ zr@L*L{@i_(vE+%^D#0bkflNf1PFG3VW&PdeeR^H4M}~Y&i&kfs5aH(|8HKLjU_al| zIz4AYnN`8F&3FCEN?Or3$+BP5>yF7e&t9b!Yq!`db(@VXrRq(tvDyxPa}OnmJU;pj zkjMQYU+Ka!57<^-SvlBf7tZ4jJW}UvCv6U&y7>-Si|?C<8wcSzEXwtTauLgnBJl%R*&Pt&+mM)=DXSkoVj9Z4-in^I?gE~J(T80 zwf6dqf}->4z@EVJ6QnG>@*A9&7r{UFxfx8|QL!0B69FcrH-Oe+C(|17!~E80ufM*S z)yuRr^YyjW{Rx%1qg%G^MwWD<|7zhz;COgVNr{1)CxwB0n{Uqp+Tp3y(-l{FAYk0{ zi%Q7hVZuAq8rXWDQ#D0;@=|1KKyE~xPp9h7LdxkeGuF<@peEHnlrVNwKxxr+j|MsY z;kGbUG_Aku*oT#N3vflL)S%#upG5Ph%7l6B#i zoI$_vWqAQY;F(ozxM#Ne*b~Ibi z+k8VAVLX6Qzr-U)+ltm~Y8~}25L`uuo7`g2(h-700ANDj&A2if?SvP`*;8(C3B6*I z79SrU6BCn|C_a_)Ed)KC0~8ddm|U|)>rI9!E#mvLojQjn1N*(g z3vBE1wNiwG3QtwdPxYywz3CrJ;`!2D6Nc8RgMmtY!@Zz`xmB`Vo3(K=*(;^KH0VR zqx<()X`l$zW^)Z)UDzc$_odqdZKOc#DXtCT->&)tZtduKy*#O)sTt`TMs~<8@8RJ; zcpriJw`(-bL5NfL^0Pd}db!luZj9M>-(tlkL( zhy)Cq|0DirA*ZOABS5s&PaJFq--2Be{UWZrAt99Nv49#FoB{Iq>4G?Sl;rR~3`%!j zK(YN_@AOxAXH`*yZ(u+I*u`NL0b6>hc%gTPvJF<~?z_+aX;FQ2KV~8o&VN>S5r+=2 zn%Yp}!IOZZ8rCM;<|`x2bo%rrU((nF<9@+cx60H0x*8#8YzjkAaj%hk_ zeKGQq);Z3&n@m4n?$l+xc)04?qceU{#2(HW}s67m{;fOgBP$MGyS% zk3U>>N#XbBkHMODY8@52*wX>kDWG)u{n(2re!**daZ1Ye6d44fk*BmSWDJS5pyX;J z=3pOO>zZ_7UvR`<=l;~{JHN`T6 zLaQ1d=BV@*IRngELqpHSDk4m+K~{PcoMz%Vg3atsM&^dvW)@O_H6jX_RpP*@{t9!| zs-AAfWDx!2IEoS(BJ3{ozCyJ&^mRDlb;Q&oX~bv;`Uf)##{+$Te5ckvk@$AiE1I?@fBHHtao+rsQd~=YX#A$<#mw_`a|^0K-6QZ4p?+P zRC0)ZsDxxNLBkdO6eg#Y1&eSWj1cIUnN5Vdv43?)?F}99ivU*eTRGx5^6>DOy`(&d z+@JQa?=WIz6B&}eH?~^HnDtiWiomTKO>c54h}~3+5y$xN_mac=9;WdUJn1?Jozv6t zw)Bg(^9}C4ETjSsGw~BTcc1|RbZ-t%qbm%udePEJ!f>k%9%U|pwYHVjEn3+&@G<)% zQ;X(8Y@1Ti^{GsTxI}X)5;b~&s|%D%DYr7dA)(>OEOgw)CGkHW#8f?ESY;1(koAEh zr*A!!jD-Gk?KKSiu1TydqWiLF+6xj?$@=P~l%Mt7m~zqO_AIkSyqha1EiMU}w*%}h zsuthdimXsR9Y{fS55Xl0P(yQCa{id=PJNgEY#+$58EIY7F8BmCkB;(^%O{x5k20k& zjv-a^cm4AjTdKe#Hue1LYb_V=6#)pTB!%%BTO#8aP8>e>^HaViEId3)r2PW}l|74# ziw+88^paQS#zIOy4iuIr>=O3%W4h$de9GTHu~$3xDkkqayOBD z*LBq?fv=&SQHu2KDKlwfdMK@9rtcwM^Oxj7K<6|R*FGEh4y9tI13J1sXVK~WvPotC zKeTRMu-{H{aLBAJb~{cEyDBOvjh1r&AgN>3g`?MCGwAFG(lBU=M- zmRNh?il&Xy8ql!puHkCWQgLx{YmMv3?~GZHviY4M*855kY-kE-0s<4x1uU04hk?_s+Ps=OH+!%mDz+`oM!^dhz6*y)B-S$qFo6ur+&KLT&ktpb1^UQp>% zocqQ6`GL5{aYUauJ z1;pAmUl6odnlaeks3QafHhoJL$$!4)h}-b;VWNDGjy}2iQ?$}=EEa8vm**e!N8(BS z?7D;~SXYH?oPAvo9`h?~N&f!J0j)CWT(Ut6_3JD3VYD(~O?^Rh9;Mb^XE6j~G6%gC zvS5M}gGyeM%Kp-tFbLGSZCI>20b_3e_3dKGGat!h`f0E1^j$BR>o7_oz8_?FTpHFfGqO&rAc`wo(Mx;V843vT_2oMli(I>wb2%1#FG0 zV<-mdx{A&5K4t<4zs{Nw=*#}=tNB_o$;%L@)FtvzWz`8x4teUNbkfdN+`NUc3wphH z%d;OrS#NiPz_A@1n4Z-MThL3rvN%{c*x9+==$4Uvc}bcE0DB6OIQYUJ)pk%B+Ekwl zY|Vn%&$i0Xykeua@AqC=aVk*6UT{EkDzbIoT(wstk_eh3I2$V#ahy z&G@S!U8YaWL~Ni2sJG2XLIm!NkneTlbAKjLZbY0xh%GDfYpDfA*=9Z6GddW@1L9qL zN;8DdCr@-IDkSM#T$-yPV*21;B()L$UMos!6-z4j9NNDuYa6u7WP(n;FK9w_Isv5l z5)a#U&zZEFm|-9^H`d-)U?7%`#^J4l0rBGWRjlr%w1pX>nIiU6{pj;*9mKPpC&*b&xziro*8f&=Zq5w_U7`A_6ujbB)Qw zxy@&F#U~y`gI$5IJwVVg+#QZb&?n4ik4~e%7mt6KY)kJ$0Fqvc5td^S>jYqiVT4b? z(V-S`aYBzj;~@ABq?rfLSw;W-*~Fxv|NoCqJpb!Ce8U#-j0LkZC!Q6;Z=>NNPim1A z;z7L(CMNul3j(sGS0POBGOnqr3jESQBJn#*mfTR8QSp=d{*inANY5`p9Eb%B~2dFI~x#5H|8Pd+!@J?%BG`E6

^Z;;zFf@H-7(1>8rHq0i{Ar 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

>^yK$N>I)y|FQK?Y3Ne0O@4g&mPs{7MIz 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

j-`ED#*DIXkSaRaR>2c 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

h8L1avFi6Jou@Oe%A9w3 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 z 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 z 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

%%S<@woaYQj}Cq~hIFAR^sZBQ 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 S*Mp6R>wZH=2H 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%0D8D5{4(=YBQj5Y!p)mnb*QZS}qq9k#Qh1K> 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 &dPn0IW8DSw9&(bN3r@So?`;+5LvoN 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 z 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 z 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�hb9 zfz;{IIwp@q*S5%28Cmfgpc5frW$&I!d%LM`n`KAEPzigy;UlwTW+!vQ=Os7^l1M&1 z0QA0r-(Jd%3@2M~Hisp(J(CXaXE7wLXIS!i{rtmm*9~&mFs?Ls zDRy9`)_!F4`+~9d(oHB|G=FnNe(ONml2iwP^TxF&f)F-En1^x9 zL!yhD{jO<1Mj!s}1DI(@sBJ7SlpG`?MjNZ6VEcs9qd@L83{e9G3a=qxOf?mlGBLWm z(2_DaT4vidELJW#2Uotzp-u6c)ro_{w4329W;6C)-X)A^eNMjff$E|@-&?IWKT2cn&s-29dV>q{duKmtpWAh z4!(bH7SLXn+eYV1X6p~z`^ksjm!H>*3vsL7O^@~VcbJy{)l})!&=eS4a}~-ohJw~n zaC}G$doKIW>z16<7(PX;I$k+X#eJFI&&<`7eC7o!dLo40MWpr?7vGWmYw z_U;Xe>(E~!-ggsX7QQu#!QxU2--4>e9fd;O1Hqz#^Vp@4@1dDe=Jqj>zfh_=?U;m*_Jqrrt}c!pFr5-7H+Ypux{BmNL&DNsN4$=tY{jjYy_PDv%v$9?yo{ZMsb3({ z0a*-*>89i@oP7-xnPj3Tad5DtM{(cPbxS8SsVQh{Senc#h^?*Lk(tH#CHb; z`Fav>|J+@gQ`SoMgD(7{DDFI*Ne+_k`7v@2p`k$4dr-6*Gpu`+aGSc^YiIVRt0lep z5V+u>KZ(zq``zPhmr9B!*V<-7k3P1=fg7+6RjzIIY0%~Fp%|?(KjbT;CN&P9&xnVP z=;!{~_cA&A+9p$)oCX&uB~KbJs@i)l?6iXdGjCeH0r#>2<|HBr#DNrI!uPAOPgvF9 z&EpWA2l?;oT}X%#+1u9R5kHMNY$86<-lXWzkbwRf$H}F;bnk7QV;f$D-_1Q|uD)-# zA63VIuR1sMrgXMrorAA_Riz_?+p3vxYqleU)kLwzvc3b^+16!Fp?!&WEsx>?EfMSG zYULx>4jO^q7_TH%BS2hN{!@M+UJMN27)Y^rIXVc457h zU}r~V6h$0MZBU%+j?EU=O$(rsxm}UkTTDxZ`Cb}-0V~};5GaWIVGXI6A+l#73S$xc zOyMG{-OeJ*7eehGh^Fb^ZjAf-LblFTVNppg(kjSTYN0#XrjQd8#^HDKR`eYYA-d6wlaxK}gRWHL`Z1jOeqHDY53yn*C)@WOhelw} z3}~+o8=o09O$_$u4CxAW1iQOCn0ZjpO!KFGX@26v5Q&bhJM>BTk+nml8DY&fBD9$VYIfU2B583+j6OKw4m{l z|8$jUdIL@}DLDONl~c>0!BiCnYGWUsaS<;;TTGYlcv-c>I-&rPZZG@7KD5#&^HizY zc_@9*sgj_htj-Soi*_naeI^rlgD<-w{^OT&Rh5{WJ1i`5lbS-mIf$0BM1}khqKbX9 z-NSDy)w@7&!w=SNQNsKeAXM~=c5I}6bA{RI9XDVKznf|gUdQ8mCSTBDec0h=LIa$i zsn#!Wi~{Ygs&XbjNXPY0`iruV8n>o(WCU~r0HEdvzGCzHia?L?`WxzLuvQ&{){C@w zhm3JZL;3-CQ25IPhD&P>vO3`5Ov*yf%kcn3pfPGEmfwZlTY@C5ADJS_0NC9ll4y`b zUiN+OuX41g_y+UIm^fi0+FT?f_aUXk0pjIKYbmFj4J#M* z4Oz`;=eqSD^1uai43?V4;2=r)ilNNfWcgeZ5yCv8;!)*TIQPXwg4R8VIB*7m%munz zhy(tbJFTF71IP)53R&M%kl3P9Y$&)n0bC-uWFxtFaX>Z$rVeU`vyw63>0kvDjo~JZ z-3~LyC=QuGziG5MVgPy>d$d^lop%yOjcDK3|2VVAi*BPb@d;Y#e>(xj7IjVEnawZS zhqxuDK4Us;qB{s3P@=oquH)ulso*DOA1kNT|4Ff4SURHR?gQYU=tRx>13bzaz6 z1!>M?)F**%##qM$K+jw8wThdQ{DEj_dt^%b>S;MssY}=>y(ujWi6j?;rG)X9_;c+* zUY;dQmWDFuzK@f*9u;b9=)$7hdW40C|89;#8T)eet3I)XR|DSvPDq)j3K4uy<3t9B zy-^+I@2R%QIX&x!ES*j`qi{mKMBY17>k6^O5YObX&BFS4MWJUntGaPM47|XE#Wf6o z>=nm&`K^hBC}{_|eJWLs(5XO<@PqGVu+N>)HvZX2xN-S zWDIdhNUhz1=4-^|l{390B!t#iWrwLqc_88<_ZNC~u>(hnC&cq3ZtK43C zlD)+g7Q=O&o?+*mWqCK=9q3Z!sMWJ`U4gB!i zohNDMU}RXBbAl*5)Egr1;H8Uk7*`Jg=Y1i5520QhepS|^f0Z5qzP^oR1_lW+KiWm!Lwha`f93nZLKb^6zsqP{JHSg?08XyR&Vy>u{Wm`{wc&{`_!+MzEA!e_&i zLNna=dU=@5Z8GxgvIEHoSb^hQRa>R=?hMGt$De&e_-X)LCg>2Q&>Lg+^qL-ANRcvC(`XcgE6mr^|ls!HzLAcYn6e#nc?p<^j&WxF_k0GY}$hkF=~ z7v93R8wScm_iZCsTj}^Fx-Pf*z{5Ka#UQ`m@YRwZv?G3~Z|3-zKE^#sv$OEntMe;o z?EZUb$sh+$|2aB~FX(rZ_xHbr*#Bq;`~MMQ|Fg>Ze+;qz^$P!A#vLXGmj47|A8Bhj zVgEJmtkmXhg<~(BVS&3jTeFggc37BcdR3fBFNUt;mcoadQGFEu^x!{3=>rrJ?ifK9$+H9P~V#>dpp*KZth%E;TPS9r-ohTw!nKEWg%-+_TKg?mu zDy#QNZ~gEsWSITe-4lsVU(|mSA^nr6Qt)Ab!?YdmyJ=5|f%d1}G8FzLj8z+fA%g&F zf6M70>Ht?Dlg_sbgB<6k9)Kv*)Z6c_HWD5XH|)(X2ckPj8ez4B#uPg&UsVnRlSvH* zs0{d-X};dw5i_js_L8DVyQrT#LNp4nJ%qDCOmx54=|q@ePp1kx>&XmHmp_srJ5Mp_ z-~{8rHhXLqu_jC~-1Yn7yZ_M)S645TIOj#b%-^X>%5HbE87TAyw}zZp0^H)37$S+!#;gd<~7ciS~e zpQ7cMIKgZ7g84c8UbFd|_`7K1)(NNg!+AYeq-r%h!nfs9qtJ28DZkX>j})GnlpHS@tAO)yJ7tsOPlH#VCd8 zN~MkOt&2#kF+pWNyF7^IX9cDdFkJEnu7!ap2rdR*g#Xm)y(>+cDwENB{{jG{Ri_?Vyw7 z0k(=}9GYm6w6x6ALw~%uwRS5u1vr(0j~Z6BeE2i%l%5 zoa2z$0op?Xas86iaaar8iL@(?=Fb(H2$44W{r;C_;imb(ab?)QwzJ zu+@nZV`68YO&1i;jJ_38O!(Cl7&PsHrbX(+8a!x#DWI&baSZv0OSqVlSwqI_J0(6k z>e6QKe3KKDKwChMEwNI#2Hmf6b@u)H+i3VdxGyXPD!(bG_`-DWx)8V2f19<%T0^q! z&FVgMXI7p3v4dORL(Ds8hww-f|D@wN2YT@be}VeV3Ey8Bx5Y!E_=|8yj?1R;WkvO( zZJZ#yYCT)aDZ1bW$94QBYTi(FG~b_i*gn&Gm5XTx%{4E4#_-}zyD&+gw$BAkn;>eg z&y>%-N_>2sjFSXX+i6SgSi}}^v=Ye~dU=(3P&SErn&9xs+P^`lz`Gpk8AwRB)YS_Q?NeXJ(CLiV9f2KZj zfO+mTroJ!zDyF*sp7>@Zh?QbtUv?ADeWl-BQHIF%V9!-iBGx!$M@_W=|EEL21BCVg zWi2k9OP*2rUYJ!<;VnQq4AjJ?uK{P6`t*s$w;4|=BVqyvA!P)ZugM?TLty0ZO7pOfY`w7|d zpv{I$rfDgxM)!b|po&o}7bLJFHwKR4c&x?p)NwJ)&!`D}i7d&a@gEPgh_u7#esz8s=zKQe8Vx1b>x677ll0ITB9qglxba$c^*Muxm=NOH;jVFpY`EkWt{)GN=1mKYo0 zVI+m=hR*S+R$|~~E(mQo3(9J%&lbw8rS30f_Q!^(5Tx9i( zvFUn^F!N{J;mQebg&lLcj&A{f)+_)d*u8o-++x*7A3h^7tez>U-+}3NMlF+JI=YAI zg$Nm)U3tE6-O7tGQOdRmARUCM8`lxw+&9g;j7mDzs|pCmV2sksyVt*SElMR66i#B*938R;9Pzz3*<{cKYt(P7qGL}8k={0#A`L^$ld7pX^#u%LD+FwkM+IH2U3g;R|!Ho$Euc;b7wtndy`9TYP zK_T*sP>kz@+Md-3b|j~q7+f-Z4vuhb`T?%$t*ifAqV=!6X8+q-2FE{>8~;>B{1s_7b(RF#R?0@t^S)_cBb zWmU5f!?HMzVzgGYKd$*zxy0_$Dns4p=U42`5Qt<{Rle=J`gQ9^>eunMW4E*+&t1mX z{nhrd7pR)_EA__pV*>X|(}F;Zl8VY89B8O=0>0DF&kYpdweTvv*=##U)GKA@r?kVn znY&kHmj`H*3fzhI_PMG{&X71SV(KwLIG##UBmtm8%t<=D#+o@aSMggC{N%LfOm z{!PT)B9erw%_b^TD5xNc@Y6DTg?Us-f~XgHRH8_0&}SH=pOWyziy?swwxUfNEmo@E4nR2J%Hg?T4`2 zY?QNRqZmU)K$vO;a9vSA*-r;tI~<=m<(b`EERrc{OE22o4D6W6`C**ccfa5}_S44n zJ-lKjUWNMP4iKL_z`Nxv@c*@!Q@L;1p1(L@olb5bhPwQ!HK@3V_eF)wq(G8FIf12N z?Lm{ZxN)i-$P_pO{5^Zf_7V#u<7Muk5nh(|%&qI@Xl}P2+kSro?;ANn%aPGneSI9j z%>x5J;I4^sULQi8y%9GJ>w`~+xhiQ$hPJNg#>QwV%<(l$Q-2 z`1re%yXzDHg`1z#^laKML*`FmW!LOGGuv$%g#rGJ@1-^iOO?s_UYHF*R*T%V*Aarh zcb91l9-Tqb;0W&u-3oAY;%gzd%GZ*W-8Htz_gte0_^znmYyHpeE_-=E(P9)+8%}&g zF>&G$&!3Uc=EYZxrd(TAl-+~_Qq|Y3ykq=Vqjo5rl|^mV8)Uf6Fc>ah+Z}ejUg>LKoVhzJe9Vjzj;g zpdI;;v0weNnnPnS;)JneR(*xGUnE0HC~DuE`{&c}W*}iz_o(+N7rV*?ChgkJzoo{Z zWLB{4ZUvbP%m0j79ilWy8BwGz94sA$G2RnPa9zR-^xs1(p&!KiETC5YbxPOh&(hlT zBIq!}Z8}7q0*jGNY9C&s93a7zCACS2`k$bz3YriJV#Mem0wrKQWW6A>7SiQ{UKE%n zA;Tg>Wy)$HW*YLd@Y_h{|_6bBrm(7|lwJv)+kJ zGmuH>1d9r=@0~V@yI9714I)s2Y}hA3>vG312{+l3EN2)=wMgcZ78)r#|D0O=203uk zm_kjcrC>y`@XWkWZgd|g;AkgtVH|C<*|U%CKWs^{3bCRoK?^J?<*+H6pI&3h@ku$9 zqYh(`n%TgyXLuPs%3#l$VO<0(n=5W#obp~LlgJhtJUyMAbfRbh1xk!eoc`Is_`k?| z#~@q2E$z3sciFaW+qP}nwr$(mWowsh+t_8>Rk!}9?|b@o_lfB9cAO74qQ9)jSedyp z=E%7s#++k3&+k`8x;mUCV`on~tM5?4~xAQ&r zp_}X!q0F&(-d4Vx{i;snu!@GZH>g-VLFrd=l4`{|h$uPN%qoQARI<$MFSFA`js_(2 z*X-C{p7dG-q*8wUjE+LyR~poM@$5_Fyu$b=K;Uo1O^^AyYC1e+%RTed6Z*c58dFV3 z40tuK`u^vZuRiu*qkRLG&lT^0SG9?hdpOGkSrhJ~H%zQnfpzO0f_1;(bzZ=-HN$Lk z<*B7Ueh!p#l`2F!r6>W3a*R`x^yHcxJA947FXV$l0WW&c;%NQDsnexamj}tLlWEnK z5Oz-^!lt})G0lJxQu(N6`ZO0+nn(=udpzR>esb#rY=&X0$;HJYIQJwYN@E8j{y<6F zhP*kj3({nn97jW1+7%1Jz^uXbsbnQT06wq*5D_c!Hm@@cf*nzDmx)z9kYO)TY4L)zgbnS}>+ zHmZP@k{2<(9DU`HvpRU^W&-GD30v%GP28z@Em)PrqamIqxUpU5U^ zwKFr14dmM4tWozH*fL#Pbn*AqQjYp!Hni%~cx4ecLQK@`RE2L27&I?Civ4Ns+$2in z%|M2~CnuR`LOlCvbfUY%Kz^gsL%fb8)9w*<$9r4yKzH*>&MxW~ZvO?%U4P82APHQ8 zO;}SV^C%7xg)+c)9k84@)Rk;T{@@uCmtkIk82y^}`-E4R>eIOoQ^iHao4x zD9Ll?#ul-0O<+;N^+>V%vi>%RyD>@Tw7B+-3!J@q-bgfa6itxYe)eaqXAEo3EV?@x z>%~Lrz$l3ZG5AfMyjq-{Z@0h|Fx?9~L(Fgz3y}hZYXU$MPC$vK&fExS>_|mK5KwY0 zg_*V!ok@sxt3{Hnx-x!{axe?YIna1*7d+>0SU7DC0lQO_q-Zz+Kao3Zx-ZtDo1R;| zf1mhggBW~}JS`7GwPsPCR`ejFA&;{vxt%+LTwPyA#`*jNgBb84)-L`# zMKuH4H{X+q`I~&oMo+`U$U?`8$H>4$!@&Fv#{709reS1dq+|KlNvc^G|0ZGnzmQbZ zv;B|UtN%WR?_n`8u>LhHCU%-{#3<7@JNW+}g<9w!iGT>Dig_z7Lq`zwxdAve)%*Ea`9b?cY(Ye{rL~ZNFK*Nz(s`AN@_|6%hI6 zK{N4xU;WLK{x?o9>o+%=RhX4u@S7X`&2469`G&Z%u!wyBhR|PF*YE4T$Mc7v+yAcc z{ZHH%{ykKGpM1>U-tdgyab*496}|tcK>Ft<-`@=+*yw1!Imh4s-0vv|x_07NKM&Aej z2L{geH-Y3|r~cNP{nx?YI!OML@9N(k{$KVjnds>m|Ct7n3oY>)tQPpL=^C`v>jE(w zN8JQd;)XQ_IMINu$y@xCT@Zibo_c@0)b~fP!7VWs&z1SB(Ixy^Q<2TdJ%!4H3W~>l z&5$pi{bz>=)^Aay_k+jX3#`c3{>AoJgZIODh_$c#gUQ{Cx)uBO)@SSLwvC&tvHE`0 zu0@5HVOsq9`f{c%ulFcgf2eDB!CUfX&8g2r|5bB~uC2_s>naMzQ^>2IHL z%`i^zllE`@ksFlP$ZDT8D8m@m)fMu{AKpzbM~A~<&{?xz17R{$i%ZNj+o;XK=WG|n z%A+x9lHJvva87~VSh`WSgVwIPB%T`&*G$NL`SJu=vJG|41hd<&MO@grVU^>2ow3O~ z`)NMM%ETWX(KVlT=Hy3KDXZ;mQV+6a2zLd<*!7?7j~hf4xNqWWk7S4Y`;DbW1CNJw zopJh8zGpPA{vwN#pdoJ|?w6H1G;|+VqKVeetpm`>vk|GF?23{?WbG`g&f~*+);uFZ zp~ae{)&dF6FJ_ZG-geQo6HGWnsv^;DBq4|eE*iZZK7zXIySmfIXX9=J`~+PQoX-x= zuO?=8QQ`umv8F_#qeFq29$UQBDd6ej%av#o6T+Dy47OejsTox1!54iGfxDEc8t(2j zYe(w21ds8Am{u>W_4B#&siif%bEdT&z-j>yt+fZa-*`E5ro^wD{W&qH<%SXP9)|=t?6%4sX0n7&OtR(S}8ah-u!;o1?mL zbq<4+PH4wB6>BEj?2_TsCXu4nnT9dk0IJ(s!LVs)FZef}E86TEZ5o?5P>0nU?~Srd z9rw}J-3Z+q7s*?tlrH(*alkv!)AV#vl;|@4kU;?|fl9x|bpi3CT}|I3Pke=U*@Twj z7Q;Ho(-&8z&Jq<*kqkTPdu!%pgqak4%zK|)Jz;2wJPLNV1y7-;<(G7|*d&FLGfx{O zln&9-%k;OqaCJg;Jd-Pk-!jfWRhStvT?>yI zRD8%Cmd_?4m2jUJnjG|+0uGYt5({@s`@I1q%Q0S(tkJz-aYM=Jnc19MsZ@FH%F>#9 z?p}A4pG!dXW*{@tXo00@ZWJeDq&&87%nZOggq6mO**pzAI6p2Al6z@->5Wo8>5LG1 zR*ybf#h9D!Hj28$MD{~Od_!)?L-yws&#1z47zQ=8jFz=h(peRX8fSg7U7<9g76N@WBV+rwW``MfvDMmtMuGr)49MXK zX88Yj!#r+f|6`pSwU-2z*n<_9)08hom+GBed9wu+Y^nUzE0m6toY|czw{Ksb!C1d5 zCmgp?#$3OvMd&5r2^<^a&0P_32{A>|SZp7eN#zFSAu(`QSw$xxwkSrNt3THeAM^L!x5MYqbN{rk}->RV=tL^@To8<6F&Dsp{Lr~>eG#l-VJ zo(8E$?It^Vl@IR6ku`5cR)KCB%CQ-s7e-1FNwzyUmr0h`k_;(ypkU|4kdM)detI2Y4L|Hzxct_Z%Zx?fzSWZa{4lN4#@dslXj_JfO|lHsww zm8fL_9I?AqGj(z`>Lmn^d>e`dcm^>QXkE(Ryg}(WJ_D&r<65f_LNDt7b?HVx>~{I`R9zP!_%^qV#&!Z`T?IXKiR_A zDIyI-EC_(H#2UiKFT0)}Z>Pv(jvd03sy}I0In*;Of@3SC&~OGhNVP^8>16sO6$A`s zGDXAuX5fHVY<&8dxA)Uw3()j1p)h6zKq{(dWQV%2Dj~@+3dfLKxmSdJWMtT9$;EmC zdm`Qe@_Es`ycQi!#C^vHb$~uA5d3tZJw}$v__~?%L@|g0>4Sc=M8&J5fTPm)W`tzk zM%DPk3UeFB5orSn5p~rr!@ZF@UP{?ROr7tb26(VN1Gr!mqN{1v#~A`adVt{K*AkfQ zyA*QN5h{UKlggL!K%Bne`xC8g836yf=LwJZWvC`e+cKh5>muYa8jo0b!sz^Cs%{iW zJX~@=yD6{mL^qnxGk&8e?h=Qr0unZF-n56+={hGCGgDVtyb&!AunBLn5H*U`w zxHiiE`c>LVlg=@KyadK!$FYlDnq%2fDp(1Dr@j?@Vo%*-D-V6ylqV*%dJ9r6g5&(o z!W@^d&6hGwoyQeF7@E$Ru>(5_MeG+Zr3#B7{!@m*FAzsMh-dFeuuHXR+5_>|j$vTi zK4B2a=9ohdeV9TRQ+Cp#1CaFW>XN~F21dC?*np%EiS%WhHk=@Lk=X4*-9&RFu0SFSg6d_ZwhMyj1XXL?d5M zPH6|oRT97TP~C}F6&!t^bWZ2EoduD~oM}NIqjC1T!YR3J@0mZfKW8vqlzOEhTWw_S z6w-i=vR}NfKdoTRYWulwk!QDpXX4kME<89YV^2)TvWLPjupPLQ0!aA#3oq``6O zc=9;0P5Y$o1KVM;-LCp3rV8OxTam$^!Fqrb7KsK z3mPhZ0OzFj*CW|COA_(M5r{oZcnKB;KP8(`t;t$K!3+BoQQN}_rNjE@HT-l40wgNe zeiTDI=Z!YDMXeP|!F_~8qB5uZuP>MLtUB0W8yk|8%>2rr&?}K@4H8Uv5lQQd$}J7C ze4P`uRvFowNQqzwi3|nnX!g!2@s-pwQ-1hX7K2dK~wXbz(>Tj2<8jnT=5C|2qp z8TaDD5;z}@^9#im6!hHu4KrYw`q=(AjLSp1PZ}mVP9wX!aK4i1(`%N`__xe%6UC%W zO23wm_rc_9ssxXC3(Znx6^X8TmVr~6V9K%7pNT0PQzshKb$_;yr!zB4nC%T;3p%~E z;xS}h8Cl0h@@V$bV(|E#QH4kaTVG%75&yftqT6^!9O-*V)B^$qqaTgu`$NXEh5f3=_NQE+cC&ac z7~HITTs`_nW}?^Ak4y{xu&TCH#}qIX6;4lOs<+fFTUbiktWJ}YuI6dn&Dj7~*MuOq z#oHNMu}T~ZeEc2IApS}Y4-ohps^ZQQh;8lkpvRCGQ1^$9T!}&WbSKLQB;Z1){7T86 z@J$Z^pEf<9g7EF_=&IXa!IAxu(Cb}nUJd^H^XtC*dzN0GO)rm}abLCa>)m?^9a$S) zTX0r)n~SoUsE*GJjbkC7bYfy|ZHL|cRIi^&P7A-oY1S_z)drGYWm_5V7o;)WQWaDQ zGG6bf-jni!JWxGbJ}Q0RjgT{k+3)XA{uJyUSutJR2N`{NO@fPWp~=!-v~_?gT5+!Y$o%1<8J+syX!t%{UFr2NoB}IOZ!`A^cuEoSvFG zt_le5@(dlr$R;_=rW>XJQ0yQQ3$>NPLOlb5UFDfXwff)qcP^Cg-LT6>)`hN}$X6}n z4Ww)IHVJp0azZ;%2&1$6N3}fcSG7yMU}oDnN28iZgZpop)lO-7j{vIQ5NwVMyXmru zpr84sGFh`lLAW)RJR(gMv?o25NY2;Gkrn})S!08oI&U z{<8q;j*{MriC9Q5i3<_}C#m5%Et)rIFjnab)6zvgsP7I}L^KqN^BbEtJMZWOQzk z`IiN@Ttzyw9-(5f=IA=s`x1&z14r;CCCezWR@e78sfp@}GNHKh=6`cQi*2 zrj8B23vP>ZS_;7`ddfvH5_JGltXtMUXN}Qv6?dXrxCKldi_K;)t#juK@~vlHB4aNF z+yZ8q?&tt-M3%qpsNvMec1GRl@pLRI#J^G$SJW%8SX7&l3rQn9h%Z z?;`tH#2QA|C*o}%HDGeQODm&}g{l<)EKh7`us(c~uWYWD?Snac#iWrSJOC ze=RNj>o!l=|3}?gf4l3y?0PV;v;0%CnD1SW*l$1Ezm(_XVS2_S#FvtI;HTDloP2Pg z0yODZ42Uc2YA{@LgI`;?>X_=%^(mK2K(IwNOMM47H`ZS7B_|m>+qvXjQF+PqOO;pK zH9GIAqqw-AcW1Ak{SlSC8($qB_Wesq)!QGnYh9YN&B-Lm@(~eDwaEk#HQSxKA7`1G z0$@Cigp zzdnzw$rvvg86x5pWAmn}6<~DQY1o5&l4irm}e$??bh=3~$^o}G?*lu_4^o4Uz3Z%+SUT%%ubb$)!t z@_->bNsERBJyP11sjc=Mt0Mr~;M(zN7?l!SlaNHQ^KTWVqf*?QfdFn?1V<}jd9Vr~ zF^5Mbu=JL#WvsW!aX1*O5Rp*6n>kCcK`ysmeoTZju5T_dK!Zb&qM#&Ol<;5- zIMCc*%}`lGC^Ylk-HLnokl;%!+QDMwtqLlNk?iY4NLZ$AC)q^YU30F1uBi-2dwtv# zROXjR*Lc!aD9nu5O#2{oLfiOgJO#hRNyt-0fb#5q-98QV!%S-Znkx5kd%l^)<59BPaMaY0QLX~SGn)2h@o4yh1dqKg#Ks1~*=HwZ*aOEWaYNvBgsuZ$aU!d#hF zUkDYX(~uu8qd%cfYdM%EnH#S|7@}hg)lrGeEBxM>il)4fD2VwvgN%~Fn4PaOfD?Ap zYQ+sl=%Zp?7~U}73?x6AUz1Zx6$qcKA~LQNX&R5i+vr5{mM}CAWa`8zX07JS(RU(^OiL`k&S-9QjYvEmH3fkzY7oiKAfXc=i z94mc-lpy9MG%`~`9goJAds`XVh1red1Iq3P0*SM&s7g2j3to6DNr|~cPoun>RPxcSHT=k zpeX8r5%Ej8RuIaEpgq4&l@^&!mY-M7#}t-*{nk53^;Fqo(hxiYqBl<}SybWX4C1=H z!Gc%U^H&5mLftnDRmcgM*6shmiSEi_;5#BBN0h#CgNGl7^(Q#9l)+xMq zI|}VuDA9V=uhg`4#*dU^y%<>SJUZ#m%)JxG1LX4i_F&3JG8Y)(Wk8E{B1=GQ#!}Vu zMG*C4+Wwzpfh}=qSSbn4jtLSaeAMA8xjUA82y*%y7E)SZM}(_2p~Z`}DXP0%K2i}b ziI!saW@J*U!vOY~DCvk61#d0Kly?bp)!@y^KUEUs-cBf(bP3k&RvI=11vJ~SsS6qt zs%L^$onlFadg&YSpm*uYk44m$v*3XVk8g$Fo2#19h zTVigB*Z|Y{`t)PSF6e;0_GJfdf@Qr;uIxafF6@?K6|5|*{JMJE>Z|R6+2BhtLhm^j zbJKp`nNr&sc<+DHjCsES+)$VUX&FcZ1nxWGSoX$B?GI{e?jY~IP*C(RFRLJHZuQ&< z8Aw)~drsr{CB4)`mPG?w_Eu-;S8?bIVPKYgk8Y&WKLC1u^~Na7zk% z|$0^>foaKc>inJ2WEu*jTa;1D}8Bx2DZK$zAmqk6nn zEscU*-fZ4~!OXb>J+EGF9q)E!Kn+e^tXrkly06hKbD9U;!EydSL9~>@2A)6fJBH z1c%y*+c=>P_*MuQM{&&wHNTDsS5mBiDSTX=hd$Il@bC{|VIET5Q{tUm1O+(o^08rM zkc0&(IK#NHT#2cK>32YOd*V9Kk~<|hR0s#`I3}41jzkWXki1FFj1255Dq7%#f5_P? zvCP8Fg~F!va}xk*c8gI0Qe^nsdUn+I5{$zc58+QNdnJaog*=!56_{}|6$O-}i9ADK zGdx3dg^W8#(e}KQny^QcsY88`1yh~g>3&e9|HLL+EjU}{8`nN$6QXy+hYY++9^E{j zA45R1LwBnJgW-~W?tqhA*~&djb8q%KoO%%iTSuj^k_^a8zmKIlQ#jZ16X;08N!}}8 zzvDlG&}?bIKZ?L#P&(J5FY|CFX{DaCO~^(H#d?T?7OWILy^D+yNFh7kAS*7)w>=Dn zT%X3G`IGepVEJqoHyx*lskt~`7y!@t^CHWg`;n|sD znN+UJL97mqQ~k4|VHz@9`y+Y@|BV6H8CO;J-TU=REbCZdTokb zQbw2XItc~qhb)qI20i-DKPX)OZCTcJCIx)9l7Qx4q87w-$Ks4UAu&_AH}<%z=nv>? z@-r4!i6Hbgwzk-21HdLAQW=7|we6Z=A#dxD7h6xuQ=Z;WIaNY-pGh#nFrp9BS?jy?`EF~OV8yb*8)E^$k{Sl~?nb%7&=)k}mf z?V>n!^P9n8*_ZeyuS6eV>a8&90R6j6-|9ti#-*V=SKy}fR4%~uW`dLq{TM1`oB+T~ zZkyC&qB={d^SZY!64B}Y8N65LD(^FyOoia5w_4%5eXS@HvxolY`_uX7id@}e&b{c> z;k3hyZCTm$rQJMHQAfZ zyk#@nMPkkO&0Gn^Hgq}mG*)a8_fc*wy5dc1g*yfh4z>G=xY%WTS$nrbT#>%dmUXc` z@M$oqS2!Pum*GNXw-kdRzM6jFvq34T_`DsTR@t)EpbK!-9#ROvy z4p9|`WX@jhO(v%iYT0*QpwTk&+k_j}rzRQrcWWtc>WS?T=5E;ZL`I>}?bp0Wp%BZQBgo>kpXUoF4A(zsH&UH-eeHEW2iM8Qyf`1nn?hQ> zG5U_oe0giz9zK+LbwgRL$}ag1y8+LwZbts$!s8#c`TPqP9{*g`_CJ+dzZ($#zpJ6Y z%S8S;J^qE(<~K+K-nYAZ@4UxCyNxMyn~IA0Rp=Z@SR2gyx@{pJ67(0V`hA0B*r(0=ZA^V)8EuU%i1y5h3Z z+76=Vc|Q3#y0`dur5sG416x#ZF>Z`pY{F*xe%TMR5Az;h7W^K+tZx79^O<|GnK?O$ zjgSgrZwoXj81Cwd$Sm*x5LMR5Fi3zlsU#23+_ufSoSShr{0Kebe;JEiCzjIx6D#b- zxpfbCsspH2gtf4*#UgULxu^1Is^=NMqZa}*ILe%u*yp8I9%I`wzmKxm_|2e<;oFB+ z=S$dbxN=eY;u9VZwT#At69EY?!$8pU1DJ@}>$4Ue;|%vE3GD=dTN=4a_e2Gkj1b3Rm6dsi7vfy7X zCDcM1>&#2C(YCOJ)MqjzmYxi%{@O z1LB(W6Fm138%|$Z8qHpP>@({r4whNK7;vGmQ+dM4U8y>z(WZq!La=J&h3Muy+9jjP zSSgO($3;jJD7vhUZ9++Xx0RtL@re9b2$ldx(8onV%HqXE^HSeIIEv~$62L=(qBirM z2^jrkD1M&wo3}Cz+A!ev(A2jzkCtpi1_)u(!I90$7m(5iFYrNd+jypp&y_H2FfNvC zoY}df&_s9nAkuivJa>nTkLPE)_OF|sL~fNUS1Qyn`WRp)a2Uee%DdrN9F*WOlfTP< zc`7D=GD}FG^LS=J*47j&T4+;F&#wW?qQh?9fdILMn2V$TY0l#Sh!H<2_Iw9NAu>hr zjv2UaOKK^^d8@hD$Y5hx{dZei62NbK zhZL2R)g79^(*_7lL22fges6vS#esTp_nOi@zIH*^rwMXg$AnwH(EGtD2?-ObJCT6A zb53T!oX3XY=LFk$4E~L675{2Oa3t%VmWq(HHm|YJkJ*W%+H{cysqJe{Xc6`yL4SJ- zk?i_hGZE=jtVZ2OkGM0yKxbfq7Y1#S z<9DwVIv$DFvQ^uo#D(|Iah0As9dz(?eDwQ3>So7-RJG%Jn)GU$Vc&9OG-24?lue`(T3k)eSaZKShg|cacp7FJ!R-QFv0&^j7$co+YpG+IY!_dG zo@+Tp^g)EGDA_H-lJ(}u&8Zjv80CqWhsZ;i8!LF~ev*~meat|)%xjoLy)wX~`G2k!kU;inJWINL*s99Qq41*79I+o$bnVuhpQ+=fxaW>AY5>iBp(e|Ck#GhkuFsiaYx z3goR1(Z_}1W`pYraa#o1^OSZr&c^w0#vJL8F;qwONAwg?2^*#geWBE43_P>Vn+cQs zY=_3~cSTsQXrO_De5P0=yrr>E%0`T_DahWIF}dZ$*a7kpwxsmmJ_L?I@_5*tn)HD* zGn662hdjrLq+GmopK7IFvMj$*oWs4z5HHLksGzdH1eCJ7U|+TO@D74>JG2Y1i~aS| z$1u~2PPF!nIhle41qd!7k>II8=jg<@+m6^9OCTA_9%pX?2Q*paH>W|@D0(V?TNRzJ!NNJ)YsFwk#k`0^JP)XZO4Tc zX5P_a3wy}H$eNx_#cR43UwyAK@H5P}?CFwR7Jwb6KTk>^M6;1c1(A@o4D82U@cZe! zgN8;>A{&#FXqRK*r{cVmp=_d+&-gBDh_>kHpBYNE>v}gT!LsZZDk)DX5G>%NFNtWtqvdY>0uw$NIQTX&WMeX zZ0)`{dL;aL(h{s5(>6!ts-7l_hIABM2b+E)bv%6V4kO0vV$0U$uP@ufe^VSE}zlq)pK!z zO`V(y#D^QGK2D~fv58Iz^L3iqBkJR3pjgZ<3Epi157X4QsBAOsKJ~s0AJm|Rb82UU zPzqz&tqzFOp^jov77!^0#|5!bhTctgcK&2s83+>XZfPoCx@|SP$d*{q7*(zg;uC-ibJly1nq$d}ox_(-y9!zh0`A^Jn4Br)Oh8vU3v2P&{6gLBCR%W0THGvvi zdtB+*f%&5Qsa+1wrfJ4i?^_z|lSK>MVc$o`FBw{w;$hI1>e!<{_u(m|(MKi+Ck=Fj zmn|ZghiJzHep_5J!K6nRUXH}QK#T!ukPozL0EW@Js-PZ3Y2QAUC?n23;lQf-%#I#PP}dv#~dlIN{5{qoes-u5p{oaS}?hlqd!!>Eh}0eqcRxhONV#Yc(+BC zEG^{Epi^?G3_Pyqey3EEtrM@%FO@PJLh`BAE=32(=S-OQ^J+1)3KEJ(SQ!m5wjMxt zu&C4b5IGmnz2L;*8_YcYf539yq%Ql_!1;3GiQle+)i6a!qxXdnYTIq;jSth<1 z6(Um#MW{dFX*45tuM{pdr9WwCUPw@;B0){f!|zBPl|<%3wGXGY-%907%QDi{FInv- zXc0?`uM|zMQ>@s1x*RjQzet1jzYzP@4^8*Js`E5s!xBrC+@n0H}|Gtg!KPSY0-SuB~;u-1b|0xgHO)W{s&1U4SZQWj$ zaI0nV=%+%$irG%pQ?|${H<5XoQyL4`EEvn+j)i2>DIx-Q@jZZ} z9Zp%l66juE-y$|NeoezlbDsA`&j(v#U$^JwuMF5+m!g;ZU7x4Z6y_urS6tV(-`Ln1 z=5rXuWoALv$nqU+Z{|<2M^|9@&xIf9|F20E?dR%-clYl$VEY_=o8-c_WH(RN0pFv2%cp0v z?w|8GhTzX`1eKXwdt_Y?!Mj49Ok3}|eOYm?OGcgs6e2D&w1T4D{IZ^U=i|YX&DWat zdb2;9LR+`v36U+Oo*sq8+Hm`ZjdsGrL}tT-=wd;3%s;wF2McWSP(M}@R>6xRLUU{w zw_Yl`F_0;K05(zAEts+U@2noafVs`x^cbpZfq3Lb>@Tb;EruIW;9#bLclHX^2hHxb z$sE#pe3tl%lVsN)Z`_T2%xoha2F$CdS(9ZR5>S$(Og)m_jO^(CQAaB!T)YiWw%zDu zyi4YM{?XOV`@5ggwbefK_st3GO(6dmfzW=Y5m){z^c_7+ObMLZNTWm(S@t4)7g3k& zJh;T7mJk8$uDcnrp@las?cNd-KVEdSxe>RR0ZgGQ-5QWfk~wp7L~wJ~Akk27sh=!! zXA4Pi4wN;yplbZGT=Jc54`mV*S$x%jmQkl!ylxZGi@C{AI)cAh`_SQLp7Rp+=e>Z1aX-d4^>E1u$XwBG93!Blt{b z{WS}rRZ5xjaICQa5G*+;KXUHMn4uv81HX%ZU?(MUJJg?&MV3O8Wyi&y;Wu_~ZAB^v4x}V;ekK^V zMi$Coc`!D*4`alJXb*rIq48VGj<*Kx*F%i~l)osb{umjXk6UfrI{@$t8ztSUue-O{ zLxSGLncp~<0R;}?Bx`_hz)v&oH!}ysV(=$Fj2NAxm=5Y$vpBk z9%5VAQn$AUo5X?lj&yeZFnjt5ZLrWiu7!DajMIT44?zv*HoW0<{{UaZPEB9SK0^}W z8vHh|sxAk)s4<>?$~Q@ocUe5qsqKM+kvzM)d`d6XER|`tlpgS^afsHgK?5qD$TXEt zt!c%#38X@1{X(S>+qQU=JeM?EOA=zQj;_$`BBG(6(42|}(bMb1TIUI>7}mfTzoE4_ zX0(Qgq&WZ_xakmY{;mctp9BWYDqtHI$GXH~l;yBb&$dzEz|23>wa)dE$kDG?q(Xi>VVuUaxf< z#i7Un!bQ(On@%t)y;AiHX4o1PEczBFAiLbz&;*lVH~5Ge7g{oiQ>I}BMTqxAg<%OaIGo-o;?&NS()*j$s9(CnbCy=LX3P+Huf4&-o}N)vV6=3_paOdEqUS`d zGOxGb4o7X2yWn@SKU=Cq*ciezN*|s^pbz){`#GT6Ph~@q`0$c0*|L7(XzduFH#I17 z#KG4SI>gH@3)-{IQOb-k)oCGi@o3uj*Ix5p*(Go!SM})vS`rbsdhhz~TId}Q_$9Pp zuEK&z?1>gY#~2$O*mw>O=kGfuxy~?M!*&!lj3ond1I-5!T@CT!<>(upk5#wNvd2-3l6cLZ~clGmixg0 zZwOG!f-MeGDlD~#MtS5V)~zbWD^q~R16o;+c*VXEU-SF_$LqB}>V` zjl%N=b}@kJ14t0e_qHuK2dM^!a_JmK-;R}M?bnT!-I1Tot3Oo1grA|zr@+2!|D(Kv_l04)EBcPNf#-{#xaQHVJ^Sf-ml?17(>1HoB#m! zOVjb~J&>Bp1KNdWw}aJnPwq0ESQ%?LX78tXHo%nXO4Bc|qFl#? zv9xjsvMN4}vvq|QAmaGATDiKDiNGa81lpq$D*DA?oR<|Mt-5O>i-X>~wudV`cp%2^ zU6j|N!Vf&rz^0~53sov4cz7`w$|pu>P#MdGRao4%yeJY+4o;Jzt1~5i(JcmJik%9J zS)MGES{B5Vp(Jj^^|N0mWj55+HifYn+H+DH8P=|~yL198JCQW6AYIy$55(-A7xY(R zGFvVbA1s^;Voq~I&?atEZSN+BNl|6Gs}`CVq+$H?-KFpmW&}Ek295-cI+s)UhYn)d zdm9#TNQp;gYJ8~c6T*MtbWI4m=$J}FK!Pp-gxyM(ago%4y#-LjHcYc5Oka$w3HbHR z<)f%oO)M_H??O#bDS>>sgg93_$o0LO0Gb@TOk|&uk<1u#d{rB?GfF>>mvBz+ip*!@ zyQs1A+T5|=Sxy?>zrok%xauT7bcjnYsl()2C~EMePekp;HT6rSr6@cZJm#7{C$AsQ ztEf=;Pwa0x4(_G$OcfPhwVH*6{8`@zK<;0@z$_P(Tx|DZI({+|MxXTI03Vd}ZrJu5qgVHoYEJE}v4Tvy~ZsoGZ`-ER#Hi3xQQ8 z{b^2FUc@fhmzl33;g){EnrOV`m3bWDfD81X>3pk+z&k!PH`XjhM0irFIso#96&r9J z7z9_5i_r#q-RvED&^<7IC8%vT%NI@XaX8kB`4}Z(hVE6G?TyxF17jn5q|Ek` z>}xp+*W!w5!-fSU-35NQrPc`*h{m&0W8c^f@X-Q!{0|pI|457ZFI*7)B^&#{Ul9FA zvDx1%1Z)idoFGfm@h?HvRSnuN3MnKCxx$<30<{H))Nt(I6u=z1!aG>|80Kd2+tVKcuzE&u@T_a5NS3d>^adCF10Xl=ST z&uzn7#o%1m=Cvd{cuw;Y7ob{);&n@Q+X9};Jx-#r4Nhv?0F?n9XagHh7q zazPq{|LVq)xBtuSvImdKIFwSVU*(M`^v#ZkKTGe^sy z^@MTOZUU9^u3U*lU_4_M)y<6S%tv146Ti_NIOcd~NzSo(XcO8MAFn0VJic@ST;gtC zhyfnw$Wad)77Ow#&Q8*W9qo+T{9?}z7#z=65yWTu74kR+H6ebgRxww|hY#7VYG;C_ zHu)Rz3mnN6Q(UCD2+rxohY;DjTJANr2x0N3b>d^p{Y3^Ol9NFbv+>(wNr6g6+FHDj z{^`$kp5K~6bgdrU=A0Kc0({5;HdidXwp*YZJ3C+8loq8KbvCzND(w13Wi$mh?i|-- zO`|S2@Ww_D9ulFtMZ%NVz{6GY@qMQY_P9>ZaBqog!HqJd?L3hpYYLV%^o%O;!~_Nq z%(6HhPNzOX?5*0~`lp33HLm)RcNtLA6TgVQCc3#}w>fwg`pDgprY{w#axF-vd4CG( zm=MvjB~Gcu%qQ5!urR~06&1*{f+H$Cn@C9ahdSl7DH>R4*a}YN1Yc;DGZfsx>3n!w zQLuK(KORmB%a$<=cIZhgb9>Z@y}4{dOZ;fpyty%!B0sHbM@Jv*eqZOs1VXot4`BDu znN&?Vd`|TTn}T6?hFROg&o^|4c?DT+ch$bBZ5%w}Zt_>NitaW;oC*8$f`QJhTR@f` zs##U_E-IoHfk14x7Tm{Cx7=yVd}7UZ+mhX!to6l0a6|s5XZ`U`1C?_B*;S0@Xq?Iv zt8MP3xZi3J(VJKYLmrzLbcHdA+Ve8mk_Ll>aJKl_nxAe*}m79Rm76C-^ zBv7fXo?{9@sK4QKwFuC!wEMcxj?-&xn&I6P6d0KmWrp4Kqu0blf3-b*;!rN7#xTs# ze0>r5W9JpN6lqKhcO(D=e1{B#APbaX*{--1K@maEcP%N_Oz(_7_n0jL(hFdxnZ*p72!uEdW^Eu+*2BPl1V_Rr+PKDS8ettsP}?WTIh- zYx9wElzpSmO$E$IosVjr%|TA+v9#=`@p6qE*h`M*cCbQUiD;6S&*)=w34HOa?A-OmhC<%=5uiIZBCQJye z4shu(A>0gO*uXVK+8_>$j>c(l)RQ60hU6J+B+j0&!kb`f)&fY5BP*-hJp*!qCs4wr z2}xRSg|hx~5nKrbkJIw6_o=;T_ z84xPIo-fY;BU|Hw){cJ9b1~diE(Q{lGGr=%$$WvW(vKR$;!mR=IZz9^zxY$WK`8n{ z%TTCHGUmz1*9c-v_Ipenigih(&k`~!il&>(VGz?VlJsC52HZ-k(dkkyeDOJgK3wu( zY$v`oL!w_+1%cf|3TPy2jHJ6r2h(#B%R1M%Y5vM}>ON!$a! zBtFv~n+h%PJWgyg2b(&i5R_9O3{-B2N^^)aD`(?^F?dS|r6W{QTltV`sR_)9Ly_zXVq-!Za&qUldypO?N zDFf;B+ig8Hdesy-1z(t8lC9-X2HI}?uQfw?PNd;^13009X7U0J+Z2N-nrirBTbaWKJ@A6iYY~PyiMNj9$xBR!t*?eG8oQm;j=w zu0%wo%Ll^s#WRk?ovoX{uo#;ifF|qNO*xt!ranBz+7wIrv^>F(2WAT>QImdkI&}2ptR`B6Ih|EvA zDO-YH#CPF5tC7B-XB{UI1`Oe2kD^X8FA>Vb3xR21rrtAsalcv+qm|wCEAe0wRylPE zogZr{!7P(3brV`*#*R!dKhWoe02HS6gVR zp|4z|ds6p&xjs=c#b{;Wqe!{0iU|gPb%?!Dlyz`riOHgv9cyb%lZ{I-8atldlsPD^ z=HIqd!s4Fi^ihu-iF5X*;8hB`=}Xv63-@rrH*J1HB;7VGCT&h>lxw2VV-4n^(V&1CXfGjSwKZy(XJ<)sCV`oZwWHEVHR z7Fj#I!)hDB?6-!E*t7IUGq<8<&Zv*UtG{Ai3 z=+uQ1xRaE=$$L82n;}~*P6=v@4)>%L#2F4`KwqCwn=dn+l`*Wv5V5j&qznPm&)zwP zN>x*-s#QAGWa-6JO89iEuxwNu9fhC4c-$!t ztV!tfB=Kx$<`5Plu&RVprEDPK2wrd#x8&V&8Muf|8sIZW=*6xP|0J!~5YQCkEpo?u zm*a1IbN%o_Wkq0NYlqj=hG2%{Nea641dSnyp0%=HuY&K~QUgQu*)AU*ZtH|%>p_-FFb}I%&o(u)I>p^N<$Ovb`J4?%c z0U`Nc_P{LQ8a*pgyuDILxqOZqYy+h$Ji3aHwaVeK?Mpn?I^x@Cl?p-y91H~W34rw5 z#_~TDk|2Goiv!|YibogkIu~g4f4!R}7F&?2M?^&>J@sNM5zG$asj}|nq3>Qb2?(?O zTY3HO<~sfd<@G!@t%M{*S!oVE-@e9sJ{Y1MW9-?oM^CCc;2$1}mCf zp<$vxn5;8(D5k;z%5jXdIdib4lK3sbHy7~^jIj^SR9Ip=X$pI$&|mc63=&6XF=g-S zDJU>mN&W2nagpJhI=Aq*^v(Cv_3iX~?x5G}waeXevQ>DalaRf$6W&=VL|Mf$LGzS) zx@mR$qv7SP64Vfm&|0Bl4i3?-0BSK*Ff0!Zg_W55`lA6830S z$zG%{NI*20;XhCpx$Fvi?fVOS36iXc9toc@_fA{jPv?y07Pp@{W#7kDtwNETV@KUR zqn`*Gxb!~T_xO)bYIDT69`8*rPe-HtU_F9q-9CF9d_>MSAFpDRQZ|<;PEkYwC#T zu(n_o@+S!{YrX=L%aU%!3-!CHAiYLYeDDPUcS4nwWDV}rbMFzfwa2dt0O&}o}$Tt?97rF4@}8N+M+AXWO=Tqy``&? z5Qj{=^r%c>=5l6=E-k(sokwd2If6^|->XwI7p{>-ot+TsNwp@Q7zGMJA+QBG;Q$2sP zJr**mOR5F{E(XRuj4CxpVSR5yV~LIlA)A&IzIZM6Eh+tDKkoPlK>j>St!j;@s8@s~ zF8t{`GusVE8JVx}r4t?zpRroE`g7OWyFozm$km8Xd z>{ql&(MjqE_(Lkf4K{Q?HuyB?aLH~37yX+eEZb&djoXoLtXZYKi}as2hZOC(Js z_iu#YKLXnzJv9DNof7~Xs?rujHCud>!mqKC)B@j{zwcrw^5hO-E2h&+l7U@t_H8p8 z>8t=j@R1jB;ZSvWn3cwO#MxTPo-?vHVBc`3cs`?bR)`}IFx4L}Y03C#e_(hLesM6l zI8U3|_C410jK1@X+wbrVzP;hvS)YxLoih4#8ahp5Yf++lj-IFtRA?OpK5>|hv9hwa z#oDY^518G&PwZ z(r+8W(rXVJyPUK8D{get9$OvJOP|xy+v;}kTND5mjCeAU8g;QEOynwnxwso2iHyGS z`cztA8W4S^DU?p=fLS9~L2$|(OJRHwwZ8B=wYw{ZnQIX>9!Fi3d~$*hP}s8N?gd`i zGbaa;SS}HFJ;IFN*t#T4^*sy{phE8l$wH(6elR5J??fS)S|#gAPF#sBmQyQh)HV30 zzdisOT4h(09BsV-e;$(Ma(w**L8$%sF^<${eqm3YPRRXgv!K6QV2yJUEl)Oo8vM+F zlSg8P;qp!)0@mH-gzkMb?%~>!IW;{$ydjT^_4a&~bqC7|g|w=KUNDQ$1x6V?&uN1%PjF88FHjY=DvR5O*7Jfe8Z# zpa=)BSGlGJll-C=h_1?0Hw9`YSet?6_+^H{no&+8D*GEpdz2{-b4yDEM{E6;igRaW z0NO%}5hY>T3?)z;R*Pi1rXd30WqLOa1IVc(#t&E9rr!--acn(o6?A@`i1EC@iV%)k z-V?JW5Pl8{OZP5K{b)~=76NJe`e z%mgB?^aVn~bSlz(;}AErj#;YEc=S}Qw4W3D(%(cCs61_a2guErIQ`>6r==j6?XNAM zr_Hk%_J!659y9fe%X~zC0#eNxAV0eb-4l=I8{{xVU(M%2QZ3oROy5H z#G8Ba0R%${7kOwJY-5?SyMOQn!XiMzPEf^0Ue4%DH&plJW`shQqFH2+ZsHq)mZcnm zG{<~1j>}JPIQOgK<>g~TSo~yK^yOoZE+U1LfB9C@pPkkYbmV-J!)h1{v<^??wCY~^ zzUJ3(R#u^r!mVhk*q;;_Fe*J;H23aC()ev7?&6}iir6!9+i80zRTIOUjbqf~q-(2C zJxjFBco9;!^a?buvYv@kiC^&?e#g!jCmE+(=0q~wqbBcPIsS|RKkRJ<++2&MzPtTp z=;?yPrRFevGWqSViy+C*w%8BCzyW}IR?9C=ws1jX63t`J&`d4t7+XgRSTUyVjF>tV zvZ|dp_M$gKfgm2gE#WfY&P5J&-yNZzkfiR_ZGj+yMdk~Rx5-z)RI`c&1G}{mzsmq2 zX!Fr_x<6QNcw+hS7fvSR{uZoZT$z!Mt?7lh49~T~IkDZ=aCzi`Q^tNTs?5QdHy!?Q z8L8+^Y`!4x$~;)lahToyr*<#Y;pi(Q>nTS+rYVglfsHIABnIE)IsV+x zt9^ncEeSNpWQ%)Fuw`qdi{y?ZoYaTHRQgkOP!PMI%P|298uTi(E15r|xPFBr z-4P9b|2O4yP1+kGAaB87bK8qQQJ|ea3>~(V<%;_VKVcNJ5hq8&=T}{F9C? z^JbKy-3*ZcNbiRn?h6>3(+ooW3_DIL&%XWg>DsC6wYkPZ9f+O zX_u$-Gd+%{CClVac(F{EA$RquB6)SxJyoTPd{lR1bM+ZfH^gmKy8CU7m0yU$_VCT^ zI$-w2%fDDJk}2`@Z$r62BL&hz4!V|3T}arHZIK4wG6b@wY%Z3urmCBqrB(4=ZJ zB2Fd|pn}mjx*QNB6}B)-(Ydb?U#z3f=YgeMWh^O*AQZlc%5{93%0H>|wcvrxEcRWjkIm5l+WoMBNJiu{tKQBCciO9XWG=OEP}Dfd%~|)6A!8h6_-DFlP=u1 zo>=M2^o6=NUTJT=A+)z**R{+FKO=lQl{TX8=DfmW1-;Q1zJN>-Am;w9JNS2tbpM0y z;GctN|7~~hubqMa?G9L&0ROdK@HdefZxsC>YiOYU-yQ$*ze@;mU=sFNL+m60-cXKV zNvnWW5aO3_Z&2IeS<<@RQ7R#yLgeUCVyaVpuJ2-+6EAbZ5iRS!ow6f&vh`W}_*mmP#`7)c zRB%n+Qg&ATnC5%5?b*WL&a=lh-^`plS|91G#CAf-^k+;uEoK$gXH^^rubY0bzI(O2 zd+qrU9aHT5y1>D$`g01;R`A8ywGUyc1Fauz;}U$eMDX+&pgx<8{E>ML59I;_x+p2> z_3U2C+OtwLp!z+A7Ku838Uy20TH9Wf%l{9 z4AQG(9J2aWp!Le-Ywd$W4XS_8SD%V=M9K3zRbl!}uzApws`B9JfUWNGogd0Vnqh!QBiPU=8-r8y_Eq?H%Wh-+ zf+(W>pWE!tXaaaS7NS;s4q8I?z z;vP7>Hx)v|-uNiNxCd>8ef6UqdvrE=Q4YgWCc?;^V7@zhQA@a(9*8`6N8ltv0j)zu z+i_y8C{j)KiOBsyKyXS{Qa?;fH0I|d zVeO8%+e$LCXO%JuUX_6w zmcOKJKu5&nS>~nzm27_<+2n#vCNTOJD>UN$zO%edZIIN*>S(6Yu#j?BcW_b{hDm(v zZ_xRtnR54)F4wnbK}rmIi%A>L8-|_1x4-Ns7Yu|)!*p%cqxI?;%uQgNq5Z@=UfG*H zAkfAbD9QQd5gsgE7!TO1Usxb3#bdYb9KYLFpgy8XGkS?1r=*KR#aW77jzOsHH(Sw{ zsf%&DvSC2|@fVo`IYKFhh92p?+lIZsx@rx{$8X6YP@ljizx;Y6eE|Zh$KnQ@s0}aQ zi}DvKlLu5>g6IbN1}V^39lmK3R*KcgQ)mSdk_z#%^b#{jf5WPqj&eU-D8orAd->ug4bED3 z)If+6IlFkh$HaF10p3xS>25xe}>*@MYyAMUkaQsk-#JUTRLaqjP zV`ruzAAYoqrZ$+9h?O?MX2a_GQ{WD_N|r3YCc^cdolS6Y8iAC?C8-}-v3p8Bz!mlc zF`dQF=fHjM{5;}=_m(PwZ`AW?Em{m%3Jpk#Y9tulBBWwz+(4I9-fthFH?56P0xJ<| zqums=qF62azdaDYabkGXe4YHFV(j%o=F;pM-5*J6DZ7Fkhe>1x{FY9ILf_z9^I=Mg zH0D#Uq!w8s2bd$rsAqk&0tIOjRoZ1rVYM-!2jq)ktS_6|dL5t+qyy<9bmkx79 z6_Tu^Rq79ZB#ON=j{`T5!+_J+Ioz#nR(hbQfk`EUptv1K78f7nb-O%38U`hDsNf-x z#cqo-xL9P1Wv*_hXNx?EgdF_E)K=`Hr~j-9YlS#OB}W-y(MPs zq(x20FnW_*(yNijR6-!C-R_n$DfcgCyVmhVjUV+o0zZK8gC%3i81Nq=Jprc?`S3`7B@V z=506h{>Oc8++))Cbd1b7T{Ss9Tx;#{gDrj0E8AFC)ys*@QmVh9nFKewyJj`$*FyQ0 zlB|l9H4m2BVhGfUka4i%X~!#=o)5~}?@e#!;f%@F;YxhuKt=BNhKkJ_i>O@KJ6(4+ z%D|Uf$xXL?C-_j>!)LtM?;R zreK&|C4nnI;b+x@kg1?ImL+V#Y{7368l`HCcMW;jDz9 z7hd0BxZ-7eT(Pr7?r-98Qc_i#EH|?B<7=C!2M@)M9J<#R3-|e16}wEDOwHmwp?pNF z7!2;$wG<3<-kW_$*Y zk$*H@qsfql>CVBZYiSawt?5OmZ$9fghMxLQV2|E(b`?2JJJfgy+6bZPa9v4N@tT+; z{t;5-ddaV;7dg7c`cff}w9#*(RjWn4c}oYH{4nYg9c6((!sOFjqZlGS5;1vZUyA2A5NQNE7j4S!I! zGcvLcD*MdOV}YyNBoRI%NUQMaa*$5;abUI%7s)wvL!;&1!HA4~7pSTiSC#OTK10Gr z`eZkYoi0^r8a*QYwLzfyaDDiZ*s#c(?`#6hPe2q!TZ&fA5@-^Ic28Q>_@XDdyq2}E z3`2wWTk=ls$q-9Fe!E2?3;GunNNyr~X0u&yGEz`wnza~6b~`&+EUJkqW8wLPbJRd=h3BE@ZT~>sLH(&R=xz>wM8#X>*XLYR2gzf@ z%fsv`Sjo{vb(~2QVk(HVUcHDL4E4?r_-kNG)H7uHZszT*%`n3?nl2sp3F$Jh;;g z)zNvYz4l$T$J3AwDb0lRA|DBnH)P`>q+U2ETy^qrd;M~p4l4S0_KNKvyGZ}HSMeW% z-~WU5>Yp>y|80BquML#{W3Lzi|HW*RW+HkkvJYSHzTePjOF>MHEnujdcC755xVlXvr5)JmAPC#ApER=5x`YT?T$^( z`^pJn&DY)J_KvnbAN<%8vr`s4fXTdCtA5g!_`bFpani3M| zeKsj&W`9;(i<__UU}Z+RDw(lsiElw6&P=p?*e$Xt_(9zfNJ#Q^aXbRHhy&)AVl(R( zPfNneBFer;vA?Xhg`7YjL7t`(hdHnt{K%JVm ziZYS)xKJVCvLkDdOC`9e#(t75mr{sar^*$(H6%=SGXikJn>StTQ<34#X1eEIVNYWc zD&!zRihdMz8*a`hxexf1Hc%P($^SU!)bpZ5D&c+L*&FAL|QT9!}Cj)qw_@*W&`B#X5~Ic&7&26%lp79FmEm5hD=TMV8-MRnUs#c6BbRBr+ltGVVqsEHyc7OVD7HoNl{KkY&wSeRSn|8 zC1@TwTBc5~K1N(^cb@}~rl`8PqjUrhMtO{-Dev8OZMg*Gy!Qj99Aym1^KDQ)-^l%ccFp8r0* zl{lnFGiS1oNtZaZ3!M(I#5XkC>GltXpm6B3ptB@lFGhAX@~bAy3^H&L#+dFa-{ zMh(35OM{7ZqGT1ev>7s%r1VkzW6*naPzCeKv<|s^6~dE=oDzCmEOhMT6DJQ%hd_Q~ zEjFO8DIaJPmk{pUsXc+taZZjy zIA5BnSqqLkJ;cVJuY~evS4Qxa4E>1?o5vWxasgC4zu5D7+r0dJNLH1|K6NM< zhiV;J{*{f%>e>l=V#J@>cwG+^1YW#PEQE_d%;GXgEt29?`gtUA_f*f6dQsr4q|4+E z;z?*6Mu?%#fg4z`0WULJFyyclYP&8a;+@47fnc=*Ac10sU^sfCG{k`jIkZb+F_h z--G86J@IR;D1|7t6Dy({WsWBJ_0LZ06f_pU&96GP5Oe7uL zA=mtob1vCRcIU35c>N$Q3|}JRkz^nz#Tqlp~2m?$v2>tDRpO1mIIh4Aa9J3-{J7ik2Xj)Gvwsd$CRqV@bcyr;I z!A|4Z*+~eSQ+JL}Lk$x%8Qi(TL4;>2HE+??SxsnG_o^|Pe*8>TCq&PtiFirG+7ic_ zDV?rQqBDuE3Du68nneH&JNTnfAgKv1)|DlDH$b3V$t`ehKqd4}vB8&>=O0*8{wnET z)Kir7+pkC|ozNI}C85J6$rtboYoeSK*2ZOc8%3B#26)M?*dxkVML?$3n2qAV#p(h0 zPO5X2a1j8}IDM}oRWPG~-KTy-eYV}2{&}A<0D1}D-iHjil z(JboQV2pxQwt6FkW=q;M37nV z4@8%)QGHnYozTGDszW`&dYoIyh-q!~fhscl5@_7q#yD3$6+{|lvVO0WI%$*ndDxNw z51V8P%4=5{1!co9O&VO9|HKA%%K zLD5n_xGb;dTkivj4P{laY)>f;R^6(TVp{GKk^k!Ay=B=1(|s%|Hx>JKP!U%U|9wRD zs%gq>agCu-g6%!d?+7G;E?>ZuZoTeC20)$!n6$*!OnEffb-nS%P)B2OL51A3@Ff-N zvSkIQyXxVhGz|@~Yd7K>xSWP6uA=dwdk#^v6t|jXLul`6rlcVJ`8!Zi`2atidXb~6 zMN(@d^W1ZA87JT##yIk-K&Wn!eNn9&VRw6@p-BX5#o7p6Ovtqc;k2qZg2<#>GVY3T zGw>rK8d|rC4igdy?@~>k$W02HSH45aK5mXKgy%?_;+@U<8m*w9`Juhk9Y!vtlFpWT zdwPJlC(16>go#$$GuCz7npD?{NcgByO$>pF!);dsf9E~0PP_h|3%g$PkabBis?a0! zaKx>B+2<mJwZCxwB%L2ttYIv_lJXr&sW+Sn4R54Yg8Dr^&#ic8l(>kV{T?} zAIFGRWHAwW!W98$*qH%y=??95NQMpdOhc7Z!D!`>CzFThWWvuKZw{V2Tq%G$w3qED z3JKjbwYik{;f9G*2#Oj9Wo&Js=^kK zW5=(Fc3tB>CVW>ymMivA&yfuqx;HTnt@{ESk!_Dj$ik+QwJA27e#s+-e4r)!S^r1`}E9dhDw-tpD|{&*L%FMBh?Meq?L0QP)T@#Nj=IH1HIL0wWZv7FLX;|q0}J#DTfW*0 z-L*${S?8Nx^EPyAZ(sEQjbgI9GS=2X;iwHNjh9gqA%r|UOe`O8#1+Qqe`|dHbz$j$ z-1z(xtMlJBKL6S@`QOHe3Bbnwk1L6qTR9m!e7{@iI~fZb8`>Hf!|?LLI665P>s!OP zWo>E5#BK^Bbw?~Ubs?BY*Zg~;g_0H+5%(omO@u07Mv}VJKfn=LD zmIA*gj%Z+|28yFi$7ATL?Vhe^e|b(a2@SSj%Jk|5koiC<(*ewwzYop|T9RREnJdwj zx<|{YodB_$RYKLy1iGmb(`D(v8)F=y>33^5@2H=NNX1O&UOMdUPSK=Jr_t9I7SRCh z_K4&>%PzU=hJ}zu#slmy$>o_}W|HLL7FnqlGcBZa;f@Eq>pZt0c2U(WA{( zDZ3-6;`GQNNzRo9& z7m$?ga;tj1GyQGl>!|VL8dxB+9j*Ijkz6((#A1pwp85TY%m!>qU6dZ-oDGP~$6WRwW4vfd+X`9f^j1zr(=V zt4!7}^-Ddn2yi#SsTQS3|$IaV0Ke#N$s}UR`$KOBikqD})rwn>x~sT5TY46qh*? z@bUO`Tj(A*sf_Ksdx?4S4;g~9Wn`&j0n}8C6_Dcs2jjO?;%EeRLu!-6)eVMz;mB#HSIAS6#>e|f~oKwmIwH&=(O{Z5wgy%r2B9I0^g z>|hT!=t7-nCT+~Fl?%zJ*HfHVMj~#kQ^G#(@y}0RE(bnVg>eB?7fn4yOB59_!f=)8 z%ZiVEp?gqZiSRH4y^Tt@t*5j%Rs;46RumaDnWjq|)xuM)t_+$-jHdN_k zlg+Bd*MlZ_?~`K&h=cF^ouaZsDB(WW2iM}_?j1Pb@gdn_`vp6mHn)6vpQ>_Fx93#*}2l0z5L^)oO1Kht;(u#Q2pMEJ=3$#PTOG? zEGJinVLNOAC+sI5N{hB0uLS=2X;v&_Mj*Z2l+m<)_lGlqD+q0EudIOBW-4o=PB?-d zmTq>VPC49nuw+yHki9m;nGA-r-_$L_$!&hW8jJ4C!A9Yid%wuzb>F4w3NR(}E)hZuQP5Y_)4WL`0XcC)?9&H3 zS_g3}<{y)awa-QKF8z|XwNN)MBe8$unDLD{Ad{X){Kf7oN&#`p0^DFbx| z=Fu!h=hu;m#k@3bH(2M8I-JmZR8YzI1;%N|p2B%H+a(HoE&yZNHXzz^Iu4Y+^K?oO z8&%3pPFp5yk@_QGM*q>rIjEy3VYayV`psf>3j*|8N@Q*Ekb!g$9|b-nnh4{ud;JVs zYNN3MMgz-G@Oe%iZ9zDy;6Y7#3`H4?Oy%5qjQOlSZ=PdPy_ug+HuPwL|G6^_U4ceH zvNDvdndfqm6=m#RQPcSBnH^M>CB-;&1TwVckH=&|Yxp6)&Q38mcieDgggECjWq-$d z=oW+^5Vklhj9GpxEV5ud;dJBb?Fq0ysSySTJPK8^@jaSV6`O3RG3sfkw=E!P@`f25 zPB>%9CB_rs;fowki{t&p4MTsHQ7gFS%VE>f*=N%-GxALi8G(gl0n^>B3`VKvD*8oj znH&*}!336G=}9LYICa|^_C)D-v8tjd?EopX2mJzaYNJRIZf)`&BHf_i{6kkc^|eT8 zAe?8`^p6E{Gv!~*KT&yfm0KzOdQi7(i0h(W2`%HvtsC`p`6(C>-I^lJMBhl5Z9`T= zvI;;FJEGtsi$DegxOGAczR>ynNuW!)(m!||iup5xc=~{_R4XF#!Bt$8@Pz_r3+{7- zq#Od1X-6e%u#`n#Kl)fQ5-M)}Ho{$q575C2t1la>Z-~OCl#R4o8Tl@)dKBD1f!w*` zddpmDY;5Lu4=XE!O0;J`fJuaf>dO*b=*E3ULPlL>H%VRBz(gwFb^A-`eH-Wo%>gkMn03X10Hw`1v1KWdGzF{-=tJ z`9FRHh5xq?@UJC>|8peG%*Oa%QD(!Mnzgv!N75^`a<{wWGM#(ZJ$>cC=43ozX22vq zQnzwk;t|Aba$NlLzB{(!^b9nY>i91xc;b~?WPn5V!S>rZo!zV2Ack7=YoGhK68=!WrwT~Xb8 zd%FH$>mf=W{rH7bHNgA@L^5IdX)>e5uMF=1K&>AI%c|E0K@12Q9tFmPjiOf@51SQ$ z`qgLT#hd6mFDK`M#0|0N{&l&c>i;oV7LC-=eZQVf#}iW3u1@0P2NrF z4`gqDlPk_ORyCT9&xU#6lc`(hNCyebZ=tCA*Nc}SAw%QpI69d+o{jqwikq4-z%SIXv;Tj zzfb&D{yD}op2s*$q^#%N)~zS5*yz3N-|g^JKcD4QWHh>rj7HJ*{D%ItU!E=LUb&># zNU}ZIZj_pDw*I`&)=8Tz#*YqwUuABowp1m@^mYZPmU# zx#(EDW2jAuUVWxheP^Wkd6EJ zP32Td+fiyYN5ZWo|0z2tBF@9Ifv5QD$9loV>yIG`LkJ2=ZORRjq$))>7c>wLRky%5 z7L&h34GLkpf?NEX6VZGz}X5mayl`t{H0A; zew(X;t`MXIa?hw?pyb~EV7V!FDr}X>@&SMS3&0NROa6Uh*Ad- ztOB%cVK(Zdm=JVyoqdrKtcJ{FsBg4#Zgg@;atJPx!?6yWN3a86odE|~^;(RQgZB2! zED`DUyutnVVev5~j8yQ_d7yHj#U>4qa(s9~zRvqEfNMPzqq$M-yz^_>*!pOI7$;1W z3c*x}bac&}pys$WdX6Ec7$d)9f+Z{y!7?3}Cdh@mo_&`c#e0rg0srbKxOg86!9FLe z4_A&~#8|W%T06)1&6uGz_3AK~jcS8JL&}BIr?djx^tgdp%kfUK!7(JzutHZ~FG=x3 zj1J>$bl_qSBLmZDMqbb`^waV~deF^qdJy*-JUO_vJZeX}gprlrg7b0gY!SS6Jy1mJ z+#ZS_v6i_OkV;>>)D;^-I3!fzj-5DhE}}mtqGVS;;;N&h@;6h#erg6@pbkA8ZK3tnEqXn)bVDF|r9dRcEetBMi5FvKQt9*6WjxDcK;xtrk4L^xSQ z%`~_N;%Bg;=1eFis7q=+?9~A&>D9*p@@x8jz>EQzU`T;Low#NIz&21!xEF#IE7I(y zC1^gwGmqqqH=mL1qGHYkVXNX=#KmM2Q;$7r;nnkS1qO^oW+iktC((FEf0MbkP{XCy zd)9G6()HDcd^9UjuD`!y@Ea5lcAl+G_|7?h>C*xV>+fA30^<_R8itkikyY>{KO7$< za0$!#9fH7J2m+}atGq;9dl4_d7RoP>p(zFn&i6_sv}98v&ZQ}C1X!+0DE#aqpDh>g z(qp1neI6H${aFHcth8@|1wj^pRz|I_hE8DTTG92kXpVgH$WJ)xG8LPwN=}NKr8C3M z702?sluDG~Jk7BU^}P=*nP0cDk!VI|Y!HAm(8Y!i0-SOE=|qo(CthYQ84qRXsAexm zcAi9$sn{+&ERhYl%q)r*T5g1k@WTQ4=e2B_R8n$epc?*u&=%8(E#RDq>V7$%=uWtu z&{HN)3KFYpE_RSi_Z5fml*mZov#ABCOo+&_P6G3Xb9+(0vGZ);!C$~f{vw#016zSH z+WOi;kBuvTrjUZ9Sk5LuGA9iNDdY~yuxR|rk#Ia8n+JuO(jgE}s;}agd{q1kxrx3V zzR`UE%?-JzrD)~u@bDd&^1W)MYd#@IL7kq+lmw~ZY9s+mw9J=ebK<2r<>H0e zs=&#;ceC7_5?^w3fK5V~y(U|1LWA!T<$)@0g(^)EME9Cb%3l|k)xTRa!a&8fE5NCjhN)2yN1_xApcsODi`lk@XhYMkBcw`@ zoZo-^9>%j0VE8E&fzn(VbEI0Pdv1gOx>UX}1cO1CZyokxq>%le09 zo>c#Uy&1WW=lx$nozlg2XH7y^XUuAoP&P}`2g5U!*{h|H0x&MpTi%K`+s4+|eOr^^ zg`X99n=r0{NS2uJO{vFu<^tf`L5@#^dC z`X%ZF_T}xH%1cMLa!Q2}5$6p@(!@(y$DDVPcF7Pf*7fNblqZPcExgH;rRXI-6KuxQ z!E&*2Bn*l~pG0b^mcZ3fEiP6E@)VU~j-nW;M&` z-12T%l6Z?6MoMp0Xvf-Ioof>DA>R?biGH|xLAd@&r(&x=LCmn!xcLM9{hQ{~YPd=j zaoB8timZg>EK8zewEoAe4@GLIrId74e|0MQ8M_@MUAY6ptZrvKd;j!#q*{+jcsCT`IUoP;_!-%>G2)-8jn`uoBkA?-99@63Sx6hXrXO z+rG-_aWaIVR0zWm4=hu=XBOW5!c1fgNV7i=6p%6KIKL!2;m!T`tw+q-y`AA|0Ey0^ znRVW3T=XX6levR&i&za#f)t7@p_g#@xtL?G=UBT`HnuR0gZc?*+axz3q?al|Ky)ox zindE?hbeG^JdI%VDXOM;;vF9CG+IqTcF{^V7y}~=%&G`GN;jJL$Sc-kWT!tgO5EQ8ZUE6fA%!XX((#Xw-teHg^6voxt-8+TEYV@@hc3sofpPP)x+M! zIZ0bk_rB9EthRmX8O&$L=$*6^Q0b zwJ}>Z9tvof@@qrdFQ%urTYpPZiHA}!4Ea(a9@BTTvDrv4LN| zB}10fsuKPP1^Ge>AUu1#@7DF*JB_Sps|fBxn>jy?x78h5H%KyIHHwo+EcN7m8T+O9 z_-nPy-UZdM(Cp#rO{>)khfRIG78Je4`=(N*c)0bmN`kapA|QlGrl>SQu!(^Ch)A#Je#s+t&ir8Ff3s1cf=|)bVcQub}i;E!3+C!sY-}+JQOQ2r3e6! zsb$EHx97uOk?KddtU+v|W2{zLi8vLCC*U{I2}quawn~!$t{U2(`)PQ{I3s=wn@ zI@`>u1u0QN7^U6mNudw?@QCH*#vsHDE~;h5Het*wz-bh`LkafM>SO~;LbC3Kaz+g- zhe+TiB%vx<#Zp6BXM!LF#APIo+>uWB*OZOg%|-(;v0jFSMKb_RvLXV~-1Cg;^J=N54 zGoEl~L9BMBa>A!Rw6K#o4Kef1a@W^&{?tTFhzSk2s*6!4b9Av#tv@{_E!oHzt zh`@;g8E2UCa#Pd{L+`?1j5T?W;o#$-l%u32Rf!4`hHXX=j;cb@9hfh%YD?Xwf>dPduujXA-U?JBnRHgyb}!dMl`UZe8k_!re*P>>fT ze}1_1G9)vYR$62zJ*Q|O2u2AgeA|d1hAQ!sWnxc?b=S{a3}`+3IM}_tZ%Qx~s?9{u znL0UlkBu=1eWCraz07@yq}q-WbZ(WT8*?Y;syUR70zTAz@NNLZrie2?KaDbEzu`~M zCE=ChZ~>Z2L9*R>vy2PxU=Qra2@z0Pw<9tjdYB)ppS)?GYq({yUo(CB6wwZ%n>Jms zM`{i~_Gle#5AC7QeAucGiBkt3GEcxSA7tj+s zJzawNmWCEr)1F7@i{^avf#Pr!`S3Nx%Cz4G0j}Lphi|?~LuAK>3ae@2#9Tv4Pflj86U5})gIq$zT<7k8$fs%3 zsJ84LU~^KY5_;#YhawMD{;rLJIb7|9N)|{A7Lf7edTb{Ke6|p>6j3B2-mU*)`k6jy ze%!OMJTzN+6BdYeY8LP?bjAYIx-iN4RQF)D5J8veG8n8$7)s^}voKnW^QRh=i7(bA zDac(?wD)$wJU5ysOQzgnb3AE{i>%D%{w7VAfw_!or)IzOiY@+@GSgU;-N;lSs2~k9 z-YKE~Or^nWW0v}NU|OuJg1C8~?Zj_qBZyxEf9xUi^62iV$^jQEB*^EAS!4LYYN(tg zM`ge6vr={75iS20bMF`<3!wLDwr$(CZQHhO+qQigr)}Har)}G|jkA4c=H2AZ+{xU1 z_uXVuA1bM&zEo8zzrUU*x;?cVR(@#NGp2`2S^&?6xKLXfrFgb|WqmjpC8QWOc@tay zSK|7iS%d17Xk4pwinZG3BK6wA_njup=UKk;j~rRMF5tVRWNom|JacRqf1gcPR;cmqxZIQuo23@Co=mC4UdSakT-e{1hqQL>XFq zcCCR$wl>`q4GCLXxhQ7M_eskw?Yc}4%{D*J3jQpQPjw_ zkOrs%1K2_x+dDoH3;cAm$mSB3+-zBFmv%M5G`T0`EYgV?0a26OY?3ZH{`;YQ{QVFFeWl9cJRz4WFc7 zrNv?~TY3FZY2N(d7vr|YF|qCh$8G;FuCIj3m;x06vE-CBA_<*BHr<*CMPk&cV1Kgo zYhUwHm+Fndsg+QPkybo32a%v7H!duut&l}Ua=MCA=m@^zZlXn8WH#Z(&_np-G>D5# zz{0KHT+a`&oW;%fH5o{D6FOK>U-MB(_jpG|y{sWT=O;-Sqe%-Gp8m{rZ#_OBmn^}H zu~n3EUwAYiZmG}sic~Ej+Byu_k-tK^ehrcp1o;^Ysk@?<&5D{ zaNw_zTBBd@9`AiXhVLg2R%9kLOB`QixPNc<3LEaLu>4XtXCtI9pF7RDqgey;<9kAX zY^(p{0IpXYSrAiJQIGq_WE{@1ckBuOHk>T~Uk12;hTHs?2e|)?@`{P!pBFOzBfv2- z{(CpIT0cNbR)l{5Ewcv@kW%crK_kn3!A=k)QtfHLjm8}$ltK@n|K=|9kj6GKZzCiZ zmHlC+j$Pb3|6WYeibb96wNJ!TBWhe;J3pV=zq`@;a(vj>Sz77@Rk^9zro+4O2-VQl zqgP9ZzV!MB%rYg_MJ5<+=_q@MUjGI#;JeQE;hA>5)n@0szjo>9Vdyz2A{xfAly}NF zveh1!VJsGamA}taN@Ou=>^G3im!B%X{l&?~F?3Y!wLWdVK>8OvlgMa{%pWc^d5c3h z18cxE>33~JT`FoSdlThtN`TIiUf5>jfSxfk;89jr(RmbbjRkMno9bHilW^4`P%xxJ z6_T?~Tz6!a+@{it%Z09X7#CIz#Sv2$TWdsr^y=pN!eL{VKUe;_3>CXUoHe#Zb|R9O zlHqE}ScH}9TCqlJm5gk7ibrDZhaLv)vE<#rXQM&Xs*OQgNFeutv8`$g-#$>YR3@w& zGG(#s%Ii=3O$&{YV48{jN@>sw%?t`Ce_x(~%bzvmdfdxC*f(=<6 z_!?(|3Jg7UGFmIx_>kneMa0JR;Kc4?nfn;^D&q!*$ca*t2Q`N+eJ#6`!*#$#M)6PZp*;$r*LK>_8Ow1OqNBRU6g zVUnro55DMTl6bfy1G_K2z3Grtu_ke!O3>0lBo;S+O{RNM3GHbgreg`K%`|}^Y=9qD*2=k!;H!6qnqAvunA-;RnMLW4Crg6)(2E@Vu z5HQ-0HdZO!ZzXhm_xHWkX&a;kd3c|AW!KUl=|y0w8(>g497pAsrQW9bFBgLb;s0nh}Y%Q^=B4qWN}ASuT^m_8dNmkgE(Z05O@ zoR4TRoN+F@=d+{$<+Cgc37`V8`THX2Tw=)M7B3dQTn2H$^|B2HV{gQUv(64bVV)QV zX7ziv+>;-IwXd+cU(+H=Z;WBo70ubIYZ-e>4AiyivWLQrMA_X3=(w6n;5TBn58GZ*rz9| z0<4QGG8$iJ3yMyWag$97q2)oDh*WeK%U`n>akZYc%n+o&k8EB(D9TYBY^ifiuasqg ziUQF^3?R+w5B>Aqy*Qb>G^LS?inqRC#!hfPK~DRwTDZ&1$1H)cf6OjcTqYBJJYr(y zZh%sR4)B^|!6`AMEy*nC4~dMY9GHoOj<#^@ThZqki*lca& zN%hSV6?p{C?#GoGZ2Yt+ zv54Ev^ChFva=P&UII_qnl5A~SX5XI?)f9n^Wje6&Ey{IVUB|l5bMz+=-3>X+mvWAr z&^h9J#5qUZSVJ*y#9u0Wlfy?5lWaMOdMVe*aBMU@Gs0T|d-L;oE`mRJ; zM4Bm}+kD#pven{c)4oRcm3^p05zfyh7_;pnr>2e3A+ae9;y@o`Kw2uzLSXU}_M*Cw zNikwZcgbkDF(@(e5M`z=stZs1Jt)jAIlO|iCH=_}DnzHM*xI_ppzswlwDdv5E{~V6B7yq-6PjwM-V&eNE{Vp7Zi3=PM z5rQ(w!W<*UDr?ikE0!Ru<}gyXia>cG(k)UzrUSffNZRe%USNH zlVK@5pH^o~0akm)_BwbY9U?r;Uu$cisaTwW+fGntaivIZM$;61AjY|($hY3wNTBA*u->fI_u%rBi zUTCr0c^ZLZ4}b^Ng9Nf|G0Jxv3zb_>nG%B$BDZo}z;+j|{ z_LhMQEEr6XYZxT(>pN2LeZz}6b)7(T(!`IfM1{|oWZ{i1a5b@YUzu_)E+mOys_Anr z23o+(VDVRp9+UnvA|xh; zf8LV#kC?>tZ=y$ZB%M*%QGU=P7G+Vv#=j-xy;BQ}ykP=?1EZ+ZW#IZLM*+*C_I}7C zrFzBJrFv$=tEn>mOinOUk006m-;_1{wH|kG z?+fSQ<_ZvsI^Ej8^s7aLO*x&1Ayg@5VAvbl-rL@<=E9ug_!ZL?(i`Yhb4w4bRy!?X9|GlD@PMx?{lY}I_K}CAd*#Xy*r+In1&nGc zK~%+t&Y|Q%Z-y96pc-m=gryYkWPas#hlJdck{Vi!S1JYNpbJ2M($#dEmRwhEVCgOC zlo4LJCESceUuTL2nv3Rmkb;PI!xh3*E9&zOHCQfuio7P_*&BM2Dqyz`-5Q97r!Ky0 z2Sdf9ysWzyl%C&K46JESK*~s#>PYJ8F2__?5}vD1nO~%DVd~T#W$1XXvkG-%_xzJ8 zZd9x8U%f3_P3ZB8PxNt;{bD~+H=UCtq{RSg4xnZkSC23M3ld#H+;_g#Bd}o2lD?YA zNCZ2jkbzx>LQ-RP(h$BJW`iP(ex45&RK^2gdX6c7l3bkmDRmWjI#ByJy$Tt|BdvVO z5Hq%vT^JC}U|gDkCFBpEZjMWH2!yS)gd`V78L;1orj@6XNb&%saadDn95`vf876kv z%Qt#>k2P70Gc|b*7!zUo&HZV}hFBcg1*1l?(o<$xH^5X#8Zg;azKj9NAOz86X0cog zNVbwh3^|**tGlU1Ax<(Ts&#$UVp`6sI;}b9K*m7e31#Vw@fT{Sc?MUoEIH8d#B%V< zT)r&_k%}i9dr>nYxiY?#Ja*F}mh0g4z-dM7h_mJpJ9|PwfMit`sVNFG>QO<*_|J9i z91=e%pg`Xtfucm#3j<_;$b)dT?b19KC%zO()t>k~7E73C__wfP&H~xUKfp5U3cY{U zAf-j`0fJ$JdJ2w5t|MWVixAq+Vrx#dfG3u-;B3|jAzZZ*0AGHSdNu|t8`N^LDA*D) zuWj0NAYz(L4c(fI{s^l12FOwZY|LS1Z#-C2hFZWtohtBLcHk`JBufYTqAgH%uw(R? z6FJnk`A)Hmu-Z8^w)N63gGgzGpU?BX)ricNK|hu>LxZ895{v6>KE`7NhV;$PIm2-B zL=X$pbK1@Hq?&`LXl2oV%^?o>=RoX&jJFGxC@(C8zHC1H z9USaFRTOn+3AV5!LJ709ZO?&cxgIGyVSz%3#0)m#>GFnF`$VnsArfbKFlKoCzUzn^ zXe@&xLN+Bx-62Ztj=|$J9}akEvU9S-olr;z-Tt^eM<5pbaVl<;Os~$qo4^xuxJa8h zB+V-TMXfok*KgYBlM!KrJ{;<0mLKN5vdJY;O)5Ib`(&%5(FR?)kkz`@l@HZyVad-t zalN8%DBjhK)9=y{wlVNX*a#!z z4t5ZC@*FUK11^Q01{bL6Y2D@vqnJkn-w^K}Q`cy0hSusGUQ-5N_7$)WU*^lc_2s2i5a6bg_Il#I-Zc}>WkvKL`&;~~vsX|Uf$a7qf6ItElutcMyJY0CN z=s}v{**Rb&e!?qYBT^E(+23~j9R&?7kEbe8uXn0ENO&%dw} z$olQz__<^&G)_Y(Z9^9d7Q3Pj6NWC7S=B&)D(!=g52sP|%IeN#u`s6?dm+M4bd482 z3Go`TYZX8efaQc&Z<)%5*S($+6j5fc|?5MZ}eG;htmFpnUDQ3HJg6ca_ zx*?cMW4J_U>2-E(f(;Fl>`XY~A7L*=Ht5%Afejr{qiJW84#`-WBx)f)ry^E*?b_lr-k@bpcw;L=gHTX0Gk zPU2O)cpn%xY;M;ZL3v86a$|JTZ&i|MH@P+RIz3meR9I#OUD2O+t66{9ON!#17VGPG zx|;$ycTll@XgU$qk2G;!kEU#l)Mt7V%d)x-d-p*m{VL4pIjTV7W4~K+H&*prUT9Fa zpBurBvg#_6LdTwOWb(s+?IFUhTEBA~r%W8>_L#+ZnAuZcfr)dL1T4)vYM8=NeVfXM zj$>Pp%a&niVkLpBG{fPO`q zLCcZ?zdpF-^CjnM$E;CXm8WjsJHe7B?f}eN+q==SZpnLtr){?Pevi9hrjOk4VFM5; ztd6>jXtw|mUGj>jV5La)VjOafsb)u1XmU?NrdOJS)kK(-Bb6U#DF<78&UJaE;U3G- zDY=8Mg4}YL4XPe|jmuuw%F8QtPR{8q6hYVo!24;{fP9z(CUDUP>SQU55&h8N1gGPN ztlBehlgIYZRT!>ag6!><0?OfAJa^7b60$&w-ZB-_ zN+h(Jozwt_TYKLwy#0NVa}zLLzqgpBT{wLL35Q3nqu`d^l143#st2&v@@os0T_&xt zdfUheRwZO)BncfJR>Y`y)O9++PT~18pWvfRLMYQ|Np>`XO54W^5!C3F|s<{q~PLg%|J1`!w zbG_7#d3X0Z=Fa=3Ac6gQ9dEB&-mhK_NAu0#UN-Qb}0&)JG*12Zdbe;|$|;ZYnWulS&V*jv>|1U_Ps*LkVW0 zZzYY$KFo-|TO~3InRQUi50jMZk{iP+Pp%si4Q-t6JmF-Qb{K8pEE?ap$c*0k7LcvM zRp*-YO59bYxlNc((~rpCPf*D7gVI~~aP`o~kRYAA2Kn+CLkd=3#*p^dM6Rw^!s}}E z=pIDxpc$*DG!w`&ecj|zlo=<4?5Nz$8%nxFioR4?b;|10BZ=ydX!5rHh{@L+P%zWO>v@0iAVBfjpP0Qq7k2vmlKbO5$W9qt8$R(e2pyjC zhdEQ4dA%hp<@h1>-YO5F*q`>MAS#xu`43|zwyJ)m&voIRlQpzu0kE?D1DCzsohj6Y zBO$)hn(S!J}S zsZPBHanFHx3yE~icmw4kyO$<%ovIC=xUoOl{-u%S;%JqXZn-sf5 z-0Tyeh3>ljF3od{QLXPO?{PqGW8^V*fz|mC`e=3M$Y4V5%3iM^v%p+VtN8klb8FDg zA*eAS&$_Gi{qjnG4Lg+ue3SU-TKQz0caof+!RdZi;hFFASXW|%!*k61#tjpjWTqUD zC?^+-chvx#t8jdG(o<<;;S9uI;fpm*rzkg}9K;h(lYqH5d9p$QznSS*IA(q1ja8fXr1b44oO zKgonHV!^X%PLX3p2O-G8NabF$S4$%2SuystH{fOZqAZKJE|@`W19Yw8tUoksv1H;2 z8i#WzfgC#+M0{EvIb^T;kj-O%OLz<^st+=6ye^&;-n9~i z=cx&#dK%1!e{j;w+d47T<+`}aD-C+(LG^g1tjQ#x+W^5QujtFD;(xU9Cv~C~E@AYHdrBa>zSeTnzvjH`7NVI+BVe zuq5D=oFy9$mA;c*hFrS8)!7D(8o5evV*-+V1|nVH*ny@13(m_zksN_3U)*p&u^2md zv%$L?NXA$mp48+RV*mxiCsp9%#*Z-#s(0L`D%7^&u~X|i23P>8ebbil4x7e7Sj3b7 zQ6IVv6TEd!1kX+G5qWwbLaHl-=Zj@L?3U&L5Mnq3xfB2elXQY~{5&q>q~IY! z%AY0~02$|=mp_ZYs26esa2?{|Qy|K@AA%N~3s3xzsGG&9SWjEKuN=DgxRpAr96k^+ZDSJb|pQF}lTf3gXyHw9rxwAkArQ-9o>W%zZ zJEgAuysg{IXQSJO{dv^$4OjX*H4u2=4ckHq6DD*Z-ft(SaomuDKkEKu0;~Ia?4Pm@ zxkn=c77RS4L=rQl`|NkLx}*RcvYOwr#1l>P4;kt{uxzdHP7E>!_#ELy%0Kg4dM&Nv z6P9khC$s1i_?C-sOm9`QQ6P|Gk46wt{qUKCa}= zngb8mEqrdIEAw_Z_Xix;n#uW>QS6^@p8w0E*ndXBiR*s+&mnNl>W zGpmY-v#b=iKD*zZ9&n3M{4~9fuQZ#?*K(K8dsW$YZ0YO)+5`f)uMBHIw{u+?AjJR| ze2mhNqGYIv8etfo-ei40HSq1T*<~Ib{#pitc3sjN5QeRML%>rwCNUPOc2hMaq4HE> zFve+3g+c!X1G6C^C@Dg4c=*xNb*byTt1Cqwi}Dxw6MeN^hiMCPJQQ`q;{$C?Vk*ND zw6k7?f8`7k17K`+?>r{M!CL~Pf-UrHeKvcdGXyFAoq;|J@8sWEM3SmPk-?~;mf~Pn zQbaIrYg*sARSPgRjg(bSP$Mw?hYzIdzTO9vnr%5&f(WI)PKXJZ4PiudHC)+2EaPBO z%Lh)ca(GY12ec}rd6TX`ot^0Pu9}{N27~ci=E(y{*q{KE{S`(=d>rT`GlE(!rx*#; zdvP#AOk*HcRmSvnnT{2m5WibeumDp$K+okJ{S<&Ya&EZ{JOxG^a%sJ76DP9%@H@+I zEs;T$$KZqGyD_WqP{^+7b)Pk>9Y*8Ax@*26PLw;yg%F=!Np|yo{v&{#!{l3+g@f z+pT3>q^2qodYkqU0@=#5iNkUP*M|~(q&rSo#KN*TYZ{@(I1?pbObhZGfawi_Nt@x- zk_x%ZiLf!F<{?H2I*>cV?z_80E=K7$Yb)G{>|}AGqUe491D{KZ;P`Z^tKE!i=NQl| zVpz)^j9N4N?}4|3$^K>wiMj(w5ORf7voZ};=Xwxi)1m_&^}_*WtTMO&bxkxfT2lF- zkszVZ?y_vEbX)uhix_>VifzROMKVllVLSP0lZrxFjD%B`#G8>d2C5;}v;U`14; zC5!YZ)58bmibdP@a2HCYnaiMCd^tf*cM@|Rus8;=z}B`WA*dsRQh9a`Bz>yNeJw9w zWb}}fj#wDVM~pItx;4Dh5dlAq@V5wV)|5in5{3?sWN;XxDr*ExHK1` zuuTX7+Z@u_l|@*tMJH^7wz0&O5dirt24h07PQX1dMddCGA%b$gO3?fj+MmeauOM@= zoZ};^PRS7Os9(A^G)&7LFtjJ>?MWaUXwPxavm^T*8?KF2iJ>tYQ&%QSUezD9HD89F z?iXBRj0Ud#X^KVfc9P*Ikog7u<^Vi}R+M|_NI)Jd5}~2!Xe5VD(rchD?Sd0$r2Mp( z*vUj0fE)B-Qb@_OT61TkE6vWdYl9@4eRB=@hDy;$PN!yU&~5z$n2pz;IYNWjVR?$j zAf}g9eOPp75YskbZ(yCvyKW^OEYu|#gLKyzBJVvttvNr$B*;>|NMg6ZD?=F}{H`>j zwq6jHErWC+OK#ww;~D#zQ_5UH=+i%zbf0u>l6O5yq>iSQMXCe?UNi4BQFtt)oJEIb zv8z<#7^y_M;b}VrHLSH~YpRK&4PYkfj!;BUrE~r9m=t>aNKjDG7XrWolZM=7k$IgR0!K5L$Gdp8V z)FH2E2W+wGekj(N2m`I8^^pAYo@A-3Td~(c_&wO1E~)uK!h+IncZNkeq#9%{jZKe~ zjK`oPx|a%5|ZE%x?E2eMYjiuIB`Z*jV)1r7zu%5dwJCnuWonK}m0I>FY;s`D;=i-TW$FOYz^g zt`QQnusb0DJ=gF%rTgV$orsS zXnhbxtt_-7DWBo2Icf*`H$-?eU??wiM-qlDXp@?O%-ru@h^5}7+SWLXnno!OO}fE& z&gW{Klt}Y==)SD?(OQz=K z>3&ZQ?7(5sTv@b$ePj^jS!|7}35dM4cC9Co5I;aq0pYBN1Do&xb=7o9r<@ZUf;tDD z{Tp+h*K@qKoZDFgmOT5Gul?GMb6(g71IUhJrEbX%;t+7-Q$F)|9jFlm!y`UibCAZc zV3B6i;&kK>Llupa=niY{4cldp*@c6jaG;AJgfBMEOGn(Gex*obuE^5TYka2wo9T3%}Z%kZ(dBdK+f|97oEuW3PCSEg3 z>nB#Wl0 zw9mpUaJ+u9flH|80Tmdjy^FVZA-HU`k<^{o{j z|Mc_!o#5TcuWhVI^8qdSM@}cU0f5Rv#9a0lDupYhH7ON(pZ2D%3X&p46999Trkx#> zt%#k3I+1M~;v>~pRL!GTy|8J_pu)vVbX89C()Kn9*Mi;U%qDGQ|LJwfD&RFbVFT1$ z{l>nyBQ7XV!F#399FlUn-kYJBiLwI1EI0F1wkW?2prFsf+$bCK#$!(*=3RoHuaPoC zj1>4uA`(Ng+Wdmn+eXUz)H#u=Z5Kk{7@6O;=jFXKwLOF{?_PO*6yd5vM4_&m*vEQl z4#l!}vT&*>&$K=^UQ=+e2S9#{GZJ+zSbP7XQhET~IWvvmWVh(yA_v_^%vR}#xZS)> z=fSEg9y~8DDW|nhLM?8J)`v-u$})BMFqyo3lyPFvIgjWINrVb#q=|5WDvoxp0D2MC zeE#(6rVplPZWqEcA3;vm1@ig4C;A6uS%e-V__Mzb3i##LO+O0J6clWdrzoiL>Be6x z$Am3(N>q!Eu>I7f zWAz4m&3{GQr6=>_Xt@$Qk0xIoQ+ETq*Ax#4d}~2@ z;SL}0-gxik4^x+x@e$}~yQ>04R97p?jSkP^9w{3kB>|m3RPfj*by+X3GNh&Xi94oY zW2WG$p;7sr$NeJ<$9g&~CTnoBrgh{X>Z}s_Vu5rQR%?$^6qGZ67VedxVnDPb$a+x# z=zt_<;83bkqC(DzlDnzp#$$K6rqK0?N+mXQvnqpFZVL7S??1^)=(stL&}A-&z-D`& zDSYdj#J`aF0zO}1xzN$8;v%-?yuTZXSrkX*$iFb1Kx*-JMm*ZB&EF5dz&^r|r2f^P z3=_k@DyRRSBSctO=vWwk9{;~Vh%o;*bO^1zlewXtrI(?LrM=z%1|#yX7%Kl|L~AC7 ze~)O*^xwaT{|O`V-{1YeT&Xd$vi)0R>m?n@_|0L|o|jsS69a1=DBUM3_+j8DF9rnS zuoN8}d?HLIgdcGbGy~A#$ceYAPQ|EEGH+HrF2uqmnYH(a)L3<2FTa$J2QBtZ@J`R0 z<-^d+^5^Y0{@=BpH&5ag{$9`4w|yCH%GTO#yXRWAhU_DegX&bTN@3$r)eUui+aBL% zcS4YF6Yt{ZiuFpn+T-KStIAroQgsa-RW$gt6`#}nt0lASMS_Ghy2}O^5lh)ZbHv^K zC)dwU1pb|3a;2w>?@nEsLDRpWAsBcMDk~<)i(0Zq|Jz7^Gke^d`>ez2WKYbE%pYdVP zy=t7ETVx#1!a%IT)PZ<>_VwL%!m0Qs#WO+v;@(0}y}!cj9ysLg?mz6{6MA z_pS9Ejna?z1G80%EyOjc-y0`W$9dVUm{t%Bk=7wXHo6C~)0+PPi6q?#e12B>W?_gX zjM=s1eD)0QTp_GY6=L%lwWeF#443A$vLDRT-;)Q|Q6$&Cc#?DaY_%|hg$Q@zd1!dsi+)lWMih%uKXbLzOM(Z zeoW%3G#+k`an1e-NBH84GV26E2pLGW%2o`>$8mi%X6Epj%@%hb(rqj9PkIHo>Fk{%Q9#;(!o;0O5#lIq#@OY%k=|<5C53vyk>FEtmrP z!|u<{HR2i2(hX{AXtf5XK~} zr+VP|f~0-tGJK|R!7eV>B0(JEeIE-BHCEnbaT2DUIlhNRCe3CInR>r@gc)5BBD@56 z^DlpXc!TgB(!1XajTr;ZDE{6!z3a>JWQL_|~*I z?>anDX`;;L5c$;=4ebX&M}-m)1Y}lb>wO@ON$$OI4A?-{XBdPZ1D*>P^15#l#XLJ} zrzi-zuGL03Ao|sEmlnP?Zbr5k=$!L_#5EC-thcFKxX;lgx+XlCrP?tUoT1#$Sa-+x zk0MbYPA+BS2q45WTjVSpPX8#ckW8E*TtUPzP5u=CXMJ7x8>~B5Jpr(*nbh77PwOBi z3(2U@8`C8mNph=0kCZV8UgX19Xq9vPGiYgUAXQ*7Cazo#CIYk4SyD~qYa_HwBUwnJ zI1RqAA{nu5V*T)j$lt%rxs`aE$?1hh9+}ywreu}T#1&X9`u!Oqs-DaOvss=0r)JW{ z$tXv~NMl-W$Q$B2OmY|4rt<*1Jbyi7*-IAbMFw@ zyymF2NSq78PL^JP_4k{?_wO$ISUY=Wt6KTe{RaOIVX=v|5#v^LCQi@M)h5nzM2-7S z;pe0N9BK^>UlT7hzHyp-qteaWnmnvZKuX9(a~aMr)XvpQxe?VlU25}~TYHK(GXCbE zF=diu)6#rE&&qD0a)fnv{A(1JJPNfW|5?A+5>oXB zDKcjqdk5HgU?w?b&8TVI-LPUKWSy+dm*9pXd`8sJARSZR2Ulg2<0QlzfJ;FTiIs3g zyS4{G4%cq-98k&}$M?cC{^r%Y&H8H+E(f1akr#8{Ejx!r}4Ha)&sIXY(w z#N9*ka}`D7uEx&~gl>`zODoK%j07n`HwyVJfF&0`W>JC|h?~TX;-5!x&kLC#@1Wr+ zaXmv9nwnUJL+2y{_7@uwY_tlT>0upwr4tBeNwVn1Xf{=657S>qlOxD3VxA$Bqw4V1 z{?hwyU+NEVoqP?)in)nDL{gpkwaU8>PAaag42Z}MJs9Z+hW-R@aed)xC%4B%yz!=| z1W?2l4neN8aR)d^HuYJQ@QWZIx3mo8Nz|;pnt6J3t(iF_{I54prZ;sK4u{p%-8NH% zb1bct!ghb1@9>5y%3azg<(`eQ=Xy6C^?^k61 z*KE-d!-i$lo_dXb6%Ng4p?A;I;^G!Rv}uv_j}> zs?2X%OwjGc8Hm&rYCg8rLQ;7qJ+eA~E^YEr{RpEkfOP`Z)X15=lMlwNEq^TZ5s_kNTLSLsGV_3&Gc%MI?31LDFD_qII#IRUs&_$-pDCqC<;kl>?fFUz zP#QttH!U(xm{n7%|LRGA6;TK*dU@has(*Dk@$;0}dp&LdOEd!3 z0JBGJe}_}{ZM)x1fV5L8r}Nf^eJr(PCf@Y9Lsr{ z<{>oi>qJ`aU}znosFMqvJi%SH=G0jq#(-nGuxLUKkm`)MuQF_}!B;#MzaVbtcUX+< z51SG?SbaL&{k@G0UD0$KuQK~AIR^Nf+rzM+W$c0Ll#%>wlj$;a9kD^tL`U}rylpJ{ z)GlGFr=S^Mgoc}wjBrX>kIT$MfxLF103JNL9a=Tj(V1E4K2V%i#SjHcr+<>VN^GP> z40#Rt^m`q1X65{5!huf)-{HP%uHW-C({Jgc!x?pp^HR?XWmi?HEKIPlBLq*`2R~T( ziCAy(NDS^Z8b)A9j$9c{hc`YfL-^F@w065qSDqul=F@VBiM$%PqFmMWLj7CG)HVZa6~rf z6|WXn($6ZmDcFh41ZFY&qDvDbO*?_a1QZg@(?W@WWzx!G3rtPp4?PjA;EZT2VWKoB8}Z(aX zKzAh}Q@BZgIU`KnbuCrzm))!r9F-x=&`+;6>;8u7@aP&oqEkfWF{$(0U!$8FQb%c9 zGmYvtPBmt+zBoJ0ZyXNdBy538h0vI)K@a6dmf09FgB!F~*+d?REf>e;HvOYnVr^tX z7~jeAo#Az4gnz7vzQtS*9+&;~Iz>_pa(AJ=UBcTAZq=2hWzz!F0%G9XY8p|?r9xhN zW>Jj{%Qji}MD2*>C{eObXoBcJ!0y=l)Y-G?KYSx1?QN%DbYJd&r9^Lgn3!Z1Ib7kZ zYd^(}8F5Huzg<&6=o#@Lo(&2G*IuC{SgXbn^pX82vG-_ZST8O~$(s3>g;(lM_Mor% zM-lN>pE};6PT4bb_43kgU3Z&T8K8>g;n-0Y)%Dc22W4hqr(W_9c}Ae1KT$bsnq9%MyPUxo5(t7p ze?4&fl8C_rZ3&VB2<-D}SIIlqrgGObrNf$>A6*iMjBxRzhtjkI{rwX>?zGgl!Fzol z7LKEDs^9ju-2ZO$c=jT0{K$N_eH=@wQ#RD?*+0~=*OWLFJ*|tk&lNNcm!6m8v+emh z(S>&9*=`oQDvx#9Z;sDeH`MiQEDYgEd_884!j2GK{JyisrwMriV$ekYU40AHMMuD()W)xfLGl zktGj&G{{HrW+)S2xcA)@74`lF;qd#_>wzH8y1P=ZO7dw9xj}ao{AtZTj7F z!i_7hh{~zO)On=HVtwOe0!Yb9qTNd_b&nHQ*>8;gV?O2XqkzR;1=Mz8@`!9YkUg=m zn$tRqP@Nk0Eaoes8Y(q~?Y*{f(uGK=Ss_DR7X;GPX`o!)>}_d2x%p-*af|^xuCO^;M~O)(bt2vE4&jpOGIeM#@zQ$}_loUJ zbwU`ofp1g2|Jm&tuGTu{FK0Y5qjkfW)rcx1jDc$h$aDWP&E1+vmTwu~_`7aMhG;+h zsjyn<7zG^Rsg@KWOX}I6eBA8R^KiF&#qU2?zi3_*=RXX>FL$V>Es|0flG6&0ebZH0 z;B8sW#`t$wjeZvSkc>>|2Xn`uLNSv^lu=~KqvlxZD8_IJEiIDZF6VO7yShf(Cj@6B zYkQ>&XQcoW=TgN3t$bK7KzWSsGt_rO%^=Qj#(@zh1>aCkNwi^oc5}E>dK* zKX%&}?7lSJ0sxv!p#n-vYf=(fE1xxtvCc_&WVuQzWl4FhO^wlE)vSJmScO^tO7Ks^ zf}dNURjFvN_#Kg3e6OU~se|=c&OA`HCvl%D6kmrEXh2vTyojL}RlU8xj+Taj0ATtz z&>wMw9UC^pl!Yi{^}B5jtQUL!GnuX8yMXwt#-hZ!H(>zWzB~GHOB9%jqs(@PgmPtb z^=VCCC^*=j->yUMBid-T0>kCQ?4fpQBaowL_b*QMcJIfYYsfkPpA?n28#NVCX)FNV zh`9Y5G^+%UH7Ju47TSGbgY1aXOmzU^Ac6bNx&=6$&`7nzd)~vXQ3^E0MiLE9vQp}^)p`>z zpJx{I9o@3NPnu{=tXgXDugT|o5@|$`oK)9-p5IO&%9NGexfjMLR~H1gAIq+_s!nAD zMD3$iQzvWn(oU%?Qc8}Okg30+@WhVIOCU$1?whn!1pu6*+<&Zvup=6Soz80TK9WI`oy8- z2pEGgaI-L|3P_mv1EgrX8h-=l_bNjMa4@iMHJ6-^OV=rFO=FNXkyp2u^I{xvgnt|$ zMc>CKnp4L#$N^#PIIL9+!4vz{D5;tmW7wsl~d4MJBy>N6N4 zLHm4}k%rJ#UX>9_5y`EPlzn$-09(`T$w#wB_4z8Jnp1TY;Z?4dax{+VC%{;H6sr#X zJ_Jj!Hm7)~Hqd&OSSR?-e0>r}q)N&ccPO>-96N^eLZC%;$6;6#)VC=8(f2@_d?ihZ zOo{_ZekzvE9o!BKof0m1<7h5;VOvwf6w!|uMikY+a-{NZ!iv`6h6!Y;hId^`NnqvH zGaq2lg0K1YjFg11Ghx@k11EbzkR>BYGoYs6!(8e5 z*s?Eg7MEx1B)94=9eQhQign(g=_tPBC_vnqCC|O;}Hx{U24MymNUASJ) z=QGxwTAt{mZF+>6^j;1>5O>YTnqzSvPHhs!?!FG&L{5;~z4q3)ys}O_G;7{@cKWzE z27Nq$leMYWUWAWwDN2QtR-L%sU!~roE35~N;MW3#4e?Jz_&_>s$uqW(i)YyJ-=|T> z37sof;~EoUdPSqGJMBLzj}=JTQ^^FxwdgQ0-;^*>n8v2jAmE3@5i@PPb9$#%BnFy)yD&$^0|=vyZ!k zrG0-eG3*@?-(udlovHUj4C-tJCfIW!@DlmZ*cANw(0b5cCHl2Sr8h1IKUHV~O46nf z4m@P4!4gl$T+N#|rc)odGDMxJtRzY@Y;pqWJ8W!Tem(GuFRh|!qIsf5Asa-G~ zb>X{NcE&9SG_$nJJ7d?|@5gfLTksfP=^@{v(cs=Wa2c-$9KJ|8f2E$`G`?hpuW!Ce#F9fG^NySoPq z!QBZEoZ#;AIyvY3#&6%d-#Gi+yT^EsKdOpZs|)5@tEy{$^IPA{gKq~?OC67OsnJz= z#-G~E&a&9lRd3(U>Zw(rtsBkE`n@hT@USDGr7|uKqiXD+>r{!g7c8*<9wTE!29nXG zcnSc$8F`{yRf8FJU77ea&Z%N3HAyB|DCO7WcddxYmMlS%ik^M-$$K>2qRxO$VHrOn z^Sg}i_9~s;++g<#1U0+<>1#s8@zv2V=Zeq$UD)y?p0*I(_>e4#5&~H=^ogo9!l>T* zY8;3%YMEs?zzM!AfBYV7JX&{>Rh|p}{7%@?laSOUVF0y#_QAMK!gj^v*qvdYr1&!( zUJJ$CxsC~&C`lqeAfFcu(n3hdSH2C(M|22}7lAQ+|INe?JEJA%RUOyvg8SR#u5X&E z7Op4&!NHNwm&+*0qA$96khnUv?~D+?#wsgq+Tz7wBd@YZn|Q48%c0#wQqe^%N8y~AlWH{!qB8VO z=SFh$$JLPu%(2p>UD>OpkJ;tg2$zo@ zw19~`u*|@Df<;yv=7EfCSuRM|>u$GEa5}^7?ZMK)4b$X*n~Nf+>29*qvs1>00=9)U z`l?IGjloTUYQX{Q?StEqxDMCn5;Vo^qN@q6`dZ_Iyn5ZCKW#ezAB#geU2Z#k!_gn^ z>S;DwG@Rp~IbVHC_>qb1p(8HVgh)UV4*t-DOGr#*S5wVQ*c>maUK>d+2!*=JQ>=|Q%@_)QoDDdf6AjZ0Oj4?@r5%d}%By1T z5E2yNej0JOl6bA(OQj)9P>^rgcax0)UCQe?$r#?3<*eds8+mX(C)fQ$UEOw4(BeyT zM*QtFqtwZdg`Yrd4e0cueuX&qB&iX?JCqK}yl=3yTOOaC@bg{2t-^SCM!3asASO1R z9`09z$@AS-)U|7Mbf%fi*m-th6b=3oi}zAMw2GeTMF)=aF$_!C8>X#9Fy~bKxM@pR zRYc+-zd}?^Hac@~X6jPgMRAT(uJw>9Yhe;IoydnF%rEcWNGm9uH$Nz=w-N=gTOnwu zRroEv?4uETur&DD{V>68;5+iB$tC4xA36OkqngEtK|7hIE02z{fvmA!n$l}I#+oAd zeM%Xmz4n!1gCjJy#yW=bXT*8ypi7@PcBp_93LiKGd+v?Df?Gmm(_n05EOTGS5OXfD za94LgtXFii1@>n$CLSA>Ax-!WxDa{9-6et^bdyYz>zIW41*!jd8*ZjX|2~5EnZm71(0N@P~9PR-fR6 zn#f_DBT=cv-j~!~{bSE0(5((a8<0Y)PB<`g!Zki2OqT5gtxp$)i#1)o&Up>Kn$M4T zzi9ZZJjzr2xlL9n3b1!MqsI!*pEcN)wl45f{H=xRAPZVT^HcAd#XD@O<1o6tC~o0Rx;;ddxy(SLjxcB>70bBbYP`;wb>qL5i_!OY~o zOfi7G>dCx&s|FgDW?YuxwqvC0$BQvi z3|fY7+>GP>X|t?STK~jTCDg z9w-g`L}3El!Td7}fb)+MS${W!2=G4=Uj6;4|CZ7Qg4zEXRbE5NnzRWEDo8;{614V# zn?ubFuD&W-RDEBoTGVcEqjI8`1is}t^&V7`BI1E|e#7ocJj%bLvcR?Zvl4AdyGx~b z5X-kOd?=c!*hA2A%?)3ym+$q?D;)Wrj9u@XyBjjB`7D<;$CU#QF1`)lT!@}4#)FJQ zvRzd#H+h(OV%hw-I|^5$9b84h1w4|LJ9Q?h2&(3glpU8XtSu?C z?=^w+?y)^!Iz@GL)FpyGuRtW%9c7sAb89U;3B?0AnZ_$J?M zO}5q3h}DUj*0KxXw0_K^&P16iP8KyH-{_$ndyWz_?KbY{(nQlTjHR`%mzM_UOM7RQ zTh8+2m_>FI)D&D47fY3qgY*vki4@0d5c3!2ruoQn1%e-$PZ+{nJP{L)j8lm%*mB5t z*9uN<3w97*wvBBP4Jr;jvh?w8$)skWT=Vwd%&W1#`p&jI%B7trZ$$T{B*ZU1Dg$%b zfS!4+;b4+tP2wfF3uTPEG+@Od$Xc7u$TnuI#7}k$G|-JnTLuaUrf|J=9nIZ5=iVMbFLalU@>bIY+(vp71GGJif8rgjMAA0ijxf zzZNK&*TDW=#hmx7H1Vclm9Jw?rr3iZ2QB!=V56mdSDEXX=xci1{yN#4GT_i>BtARV9~li#cE z;!k12i!d})ED(?}|8%e=eguuT8mHXwH=na@5C|VX>h4jj*ipW^i+sZ8aKC9-Or5RUz$dH{!o)6pA&HTxY=_z_cl2oU=vh0XT@z=vg6Wq7;L zz?s*XMs=IPt%y`0DIA1?<;UyU5$x-PkF(}(f@;%(>=Pq*!D1jhCO8QV*4e}}^w-mnwg+3FaxzHC9nArE&d10yA} z8C3|27Z)xcZ!m@6XlX#2gsIf4n>BSrk!<-agRiGK^4k{@v9`z>A4 z26;AczBz(OL2|N~^(=Hrwr+y%tFReMch#eGQ`xA`E8;u1SQ>rHK$UxW$dk8(mZl-d z9^N0F!L_gyQ?_<8Y9Jp+T~k=~7-X%ZM#QcobEmQnXYCDv3*znxC%@WqR_=q5@pQpO zqW-A-{O)f5l2}3gCDmNj=bcS9gqqj{I6EK0k0sSznd;&N6eC0YHJJ_UB>>6Ko4}{v z{kP>_#Azbpc{c_q2@-F&Qh~YfyTAH-n_}jMmybRaQjrY_`Jd#Vd5Bd8icLodr)Len z6SP%H3{Ra*#+_%t_f5}5Eo4)WHG`Oj*9=5V+m+xkG5J4E-WpYFZX@$> zQXUGlZgpDaC{D4uhCK}?L*)4lD!)zDB4CSGC_2NfVc&jI85e~g^7H9W+9GD~C#KCq^m!n%3kkl{=41cchM{JY81gT-Dcl8f6a|K>?}Lu}Vqt?)QlDdX-fk zp9Sag)<2UB=h!`S3hZ)^Z4%UJ+mX*RFluQc2 zpAZ1hzQU)}D8K}`mEMG=)1AEPv#7G1+#-@~7htH$b(EJNIKq?+GSHAvql8+O~PY-WV&af`3gW9w_ zj!pS&sr%w`hZTlH+%O?q$K9kBYohtAx!j+wrnZ;h!f4w28}qlL57!E;F=RHGNDLv? zQL{2i5>Df>td}B##dEr~FL8A%)(=nc^2Q(^L?c; zQ@^L{5?_>YoGaiIj8ddZ-U2u1lOkU&$UW?z=-Ks=nwtBL*JigrQwqV*3%Cnet>$yH zsK)D*C?3$QpaabOY`bf_uz*&TOUPko$&(iwc9?#55;9R4ER?=0S3q58l?irR{@T+L zi(~jguEbj}9Vg->K@_Vhdj7+L2TPth*I^*AXm^^ey*XT>NE$Ie9D{ zuD)_~4LX%Z@tADL)C3O@HpVC(WtbKQa8m2dXw2fByF(B$@kj;eAl zdDm(Eu^}o_kB}W9j+@@`%@j>30(~*^vtFGtV^P8b^8GuY4(UUJlJ2NNl&f-({aYyc zZ;hc{yGKKOJi#*~sNs6-KIO*M@EbQyA@j>1{)EYM&(ry#RSxIrZlgJ-Yc>r6C#^qw zSp@?As8sfkx7B}_u;Ktg{+X}>a&fW(z#Je-FtmsrgcA&;1afjitJwiS|EqF#f6P`v zev{_^gKQNL@JEr3zvk8dNrVA80nkJk^cnzmPF84zK4@YN2m!HjadQ2C>J{go4b|Vr znFahcL15rNri?tafZ^|6{;$cn-9J{g-O+ZIaAGlW`~R?Rplp!3Ogz)lM(= z5VlbDC>?Nr4xb9q3ZbJ)@GHam+`AV$f%}bQufh#@ysCI6C&lpko7I$t8&IFx*RBoe zC`#=e?sgBh`XkgI?5;+ithC!!Di7{djv%rlm78wRV&6tjZrwPsy1vuNgJpKUM(P$B zUzXgSjuG@x`FP2x$VGSuoD?HG=H5OT*}8=HiM(i<^gC1EI4KMfaC!BEm^HMTL!^9~ z(ilnS{v_||@yC}He;!SP)~E13Wc4kIzCasxgYn3KM&12VLLQj%RM3bc>J(9t&uloX zie)6WlXXM)XgUBT6x7=8czx%UK~pZXX6q!oc#Uy2#F7rHlEPOC6z z?#MVEQa*vRfjAT2wPrY}icQ~^PF*ZrKNP5IEAQrv*+gdN`x20?ImKdgncO$(rDNj_ z))&sr^mUply~8m<-xshnAGtpB>3g;k{(h88vin+sWgZOqiM zMdZ1qwNEm4kTl)A!kL-xkBQ9dly0BaEdS?~rc=r>(Vsr@2-Z*%%*4;R!0*`fN0p`W zKUUeHV<6WnqWW#TI!6`K$XFZY)22cu0#)Qu@qH5={qa7~9)y|SJJ{pn_3ZZLL2R-3 zIUWNWy2^k0wix z`J{eiECwh`A&VIbyie+Qn`S$)*Q1M@F=U`XA$C`(gZymDYipdjykgL_63!9rc(~B7 zzXJzE&uU%PZVTh93xrA?1M$$01e2B#y3NNh4m0uLt1!xWh9ls8?z1@Y$ICKw1PD6{ z&ECDyD`HJOsb+_9SKA{vK4oGCU~cn$G{i5My3mwHEhIta*0USB1&UmUalkos3n~=lp&?fl;jI&yiLBi>d!=lzssXC!aC|32vw2C z=$R3VOJ3ry9>4xttIP&nY_U03!UCI_ABkI=NkQzs75CorMlWwtb;1EvDUw;9Ww_0H zc9=gG2p$%i%ZDQyk1fbdN^{P%?^XvskUFgmAJ{4QP~?m=eOL&&mUv2P-_Q0p?^HgK zz)n%`(EcoCz(6~GbK2_4Tg_Zu2(!e7`qPQR3au!WH1@EwU1NJb9x~`vP06CZbQk06 zOX8)LQ}Us7Wo2vxNK_+vCx-NVQ!jEXVFNV-HoUQ6;ObyUDt+ekU??+{;3I^q|NU~@ zs8eOx_q95f>h3J8wRMcR1u0ak|5LbChfa`P!4&ZlPdYO465T~{zVF?@$if2J zu#K=fAKN|UHz#Zg{AOOhc+3dx*!L55Rvw9?J9}rh=9(Ca29NM?MPb zc(SxbGl^zjuLxePK8CkHreh9?hv52lZ%@1E zN_<<9#n0C4TsLpLzHt{e-CAXy_2vidD-w3<1nw&rTzF71xlmjZ+%CkAKG1l&r+kTK zl#Wj%cz)Uvs+*E=rMexOu?Z)7FF8t}pe$8vlK0roIx07YVAjggdgjg z*YGQNE!ySoE)~T;@cY{|1Etge3*7;44&*OU)Q9$PUL}I+^WkovRKD-zYXEXG{cKe# zg>>Tas6Grwnqg1%pv;Z?)_DDqVesyo?J^T zw}C22r+*+`%^tmU5*hnAl8xYKu0MaR9lK10{s{5N>TAxaRDQSI+G`|{C(PP-`Qs`^ z7}Dhz;27!z)%DKriug^@&OASpHYc^z!>$T>sr6`{+rN<`dU1ms0KenpI*+Q?n?-)E zFefn7i1DL2P^HqxmouA%aX|jFUvo3Avp^bFswQHA@ul85kW=oM5PZ>k~#`Hk~b%e!6dd5SmNF{u;k?=y3jX;|R3 zW|n})vf8ax#-ugWAX_#MFz7fU8#%o1W+>9=@<2uqa?|>f@05U)Z6R0T@}|s1 z3CWQOOO0$e5qa$+?1})q2{O0rw4kEE$~%YPHiao}VT5JX9y(I&qbP~koQ3LjKqKu6 zrF|kOEC5Zt#Z^)AcmUT##3b-NDR(hC!$znHRZ>MlDb>tctZKUCm;I2g#g1i7qv+}; za7m~flZLUWe>nC%fd*m(^YLp3u^Umane^nL-uo5K!kgkMI*;3*Cl6GKh1K2qj+fV+ zhrGO*uVF3WMVr)t++4HMTcRcJdOSfu%8Od^bY185`Bjb5D~7rUjC42Oj110|C$B({ z9=(AT2o^!SGS;jHul;hg{~2eBaZP<682^Z#K|&GvIPcb-a>1k2JmQ*;9%ETgSAt-h zLyOE)^7B`Cln^Dg$L|V5+sPj7!I;dWNW12!+>&eKW?*kMHKVb`$x1j{phfV?JD!&Hc&Nw>1QkREU^O9}VMfhCx zc}67?hg9?|)0ne#o`bGtqZ_jt59k;t{@IT8wY(XXvSxOS0!k9xid+cRr|GM`X$B6Y z%`jUFwxHGV35Zy~Ipidfw;oNxXO8*#D(UdOyR+0cK6s3&{rF7o{Js47sJ%M9Y?u#o zU}v-yow+S=_2NoIOL4B2;v(OUNDUiFDYOEoV2Z${4ROr5k(6{@tW}3y-K0^~=RE6F zIhziz)PN%YFT!f+XtHtazChk1p$gxK#+i!|e=eSS3XH7e&495@|~ z6Uf}Ur|r*^f7--@@4KxESIX?(lwYAzm2oTcPQOUPD@#rW!Z+QE&}>EmHR!edxQr(~zUz}e{Y zXG45B3Aq`{lSrE5B+((ZQEXpH*e4ys%u;w%HzHC6G+LK!E9PgBg1mWtBpM!uW1*h- z#+~8yA)0qC8@FS^M{ezTiu-;+B}+<2*I_@OgdG|}ykfT{Ajp2t{+`j!I`P}mGff4E zS~j8s$mM!M&V*i3xUfO&fdGIq|G|FJc+bC3EM4w ztGhQCN`>S2{tIh~#fRUzY+0SA5h^jz!nO2gb9U7gT+GAli9d7t*XDoz@%|jqlJ!Ol z4fpF#KIgZ6{)K9_2KTU0JLOJw(CmR^b6K&~Lm%uxS**#O(&2T4H=r0VKkFNC@mg>U zurD#GVPcuWNe5N_2UrEWJ@{k?jP-xXe)T1J>doRQPvsZ8XVMpx>l>%FcVB5kz2j2Z zvk9zZv|SUC8fuN;d}s|wV@G$kR4YQO4BbWrbwv?hTkFMB<+J(h@2XH1L8~Olqc&MA%I_uRZb2FH$(&iJqHnnh(b6x!4M(nSrGJhs2zG% z6ngZl&95IY^b_D;R;UdEwf&=|2!spTP8cEt6czzBJ?3Dj4CSWX#ah}!mRCT|Z*?C&JKQ_00I1A?F)ArPK zcV;Bc-r8Lf?5~|Id8$~Z3#BA~L{PR1E+YP> z$w;)!?@HRM5jP-w>7tKa^by#kj1(tc{sh^LkIWkpG2J5cf9k` zc5=l3`7nt(iO3?acV^oIT>voX5N+u=>CP?!zp zji_Y!(Q2aQ3mMI3bw_n(ioxrP%sB2d>}W{K`@!VOZWzY6oge8D+8dG8L{}J~&BxcI z?FTT@CLz&7>#lFK)o#zU(S?ugR5%wD^?bvNxOZc|r>uF5cF#a{G0nPdt1cWU(uAI$ z-e42G;TCyM|2ACRwV7h>#e(vPOzW+qq8EA8QP(O3qgRD3-3{ye%!f$)zStB%xY~rM zv@uhSyMs0qoeNl7bcR*yAU>gWLqr_}^H6`{N+kk8wP56dxaDZ#ax zAhtaDkixv6BVq3%NyL$HVv!rUfY-(_Z1h9!M=C#mSfUqUAjUSeMRmx1?ooIc%z2)M zxKID|=p|i+d1!D?qEcH#iT`sz)DxU1zmXWL)vTCjBaCl|a6won!woH_jwle!5!8Yr zU*p!bEafRV=N?14LVNrqEMWYc`wGXpPjxFSmyi5oeF3s-^#;}ue$wPa^J;Xp7)2}M zVcWHicjdcq*9&&{O3ZX;Hqtl36mGn9A(1F_tV}(f-Tlsl_uQ?wvAl6Q6D_U!b`%z^ z879=2GVo-UwaXuFsF`m)O)8q{vS=%^q*PQD!|$&0bS9P$4yG8QU*-F`mcA!nU#Hqw z%D!gkXMZ^@RQ8@$IW`n1IK93;=y&bj{P2l$l-~foe3>FyaE36ymgYvs#`I?p(p{n? zUvsd=N4(&xJqwH;rPdzp=H?<=HzLd_UDFB^!|Jz;&Yh+-T&8G&<_wu|4vqCGHM(gI zcHHcCM)t5Kqh9O&?v|U0w)uHN!hBvl`m2O%{Kbr^BZceRnY-Ay9}r9VEsqy{jLi#c zUT8)zqaVfb@q{O3qB|i}y?=+)gPWChOyherL-G!D8(h=n+~T#@#gm^liWjV?$Rw}R zG(~9~vVsslg(~c`eOcW`U&fCpEO2Wvw%#>{iV?klUoRdV zdkHq;%xiFdwf9*^EhdA`z&4Q8f{X#`A(G`;}2g3E^-D>fTn* zqclDW_jv>kpdnW=qBv8S`cOZ@Y19C~Fs-u5i`9ppRYSz`z%u?BZV{ZSEkb5rb_$8Mc!yDFj&r2I1HJqV0L zWxKZWoMQGr1dlqwMqz-K*GBRvx>jX)_p2?1;vS^ju~+hvOrtKW9!K&PJG@GKxnN4S zj^>j(bR8>y>R$GSH>@77IPFkr$;xneqI`u%USRKUJAp%vv1MT;6>Fd(wG@*DI2dVW zRGt0UIe#g+Nh^ydV4jao55U!D#=t~|#72h1fQgu+7#&V{Vm-0Yebhr<{Hvq8Kbm%$tk3^E>JfCR3fH zXDz@=DQi)w%IZb+c#`G?xu~p@vV>Si*iGNu>L9v~?2cyeoDm&C)`IQc4?eRk%v(}L zOZc7ftN6K55?%NisCEci|FI?JIVvy;fyMW!jDei6ghk(a;(YT{D)YzaLxs^x3F zW6dPB&ck;)D04v$E7;oEA^7tlR2r%@w?8TlJVU|xW1(iQ)Eamxs+KPJq+|F|{d1*a zT$ac*S=n7P$!5;9BrXz@N}oD^pbtbFr zw-ciNn%2jEeIxs$w*0@eL%G?(f8~vASYxnyu@`IU>{TKYT@^J#`k`}ymEtN$N$o41 zA)Yf9Bb~8s$$-kj^^v>FGgv~M4w#|@sWk)%9jym0_k34z4S!Eh`g^2+WK6xeUlJb& zPpJ>9Ctto;thBBa9^657Ls!zBrE1-89BMq9vZP*BB>x~yDhmozcxSEsSbHumzO~<^MEWRH$TH#Jme5@YV?z=w z6VL6_szp~8=$DwP@!W}RKfevTV{mVOmFTb{ZF^*=p}c4%Ih13(5_cYMEbUILf|j|z zFjXjrBR_9vhXXo!OZ(<5N@NtT4b$tDavaT7cdMy|4-@#{IPAhlXg-)d@k96c@tZZB zaI|^(#gO0_;;TBwXJ&&-rID!JDR@L%&icywNjpJx*ZoQnDDJ;t2!P2Yv+sk(ccWgp9WdH{r zI|*fbj7xoV?X2$c0t(JG_3>vKGCo3?F6DMDj5Q z%HqGbeUoCkG~<1(-`za5cQlcq$3sGV*%{qt2mz1vH&$5If;w?uT<=ltq@1U`Qc}>* z#^}jO;xp2nTPYrsPar~|$R8|=7_gfpSw9&WRBD=k=6fnd<3=cR`>8pUuT;}_lb-tY zb^=kvSszl$!k_cLJ+5tdc@)9wLynRi&9g_1`9{iAjyPvu_bQm8UeSVV##+Mpl=L<8 zDp2W)zG>FjY!+f`;BIgZT#59YYYiFxo5DN~^Egh#%;$_(>Obs+z$2dmXS)^3jrT3*Ix^qpBp*e5#`E|@ zmBIUBbkBU8+*Ph%US&oYg>v}j8jkT1-n`uhDRa+UrIDE7@au93y*t}{F+A?&T$yR4 zSBVyfdK3XvG!P~>fJzPi-Sm!wz3yADt><^JOvs)s4)N@)*3@Tc;pTR5xlAeR(d*dn z*Gr#^ds3|^m3@s){H8N86FmQYzq!qQ2SF!K@Yu@wvBVbP0^D`Vk_oMoGSv&|X?$jC zl@;fk+cwc~eO5Mu5r?p$7D9ZtU2r^(u=i!lUVpD*p6irjX{N>cQE!UZk)qcujoJcuW~INK?QDF{k0C+RIbVP?*LRa=!l)Ah(920H=y!Y{ zmAj=@ZS)>!To+sVz9?f2H$dsJN+@(@bh#{*hC5fRZt(SI>^#&3OstjA*SfJEt|Dy^6${?>Oa+4xY487WrVwXx-&*Y;f@hH;?z|*ZVMKxv!>~@ZKeY zOBcKJ4ywvD$tZsYj=B{#(so^_2Z<=fCLZE+t4xeUn5QMmb%;z2;5&VPg^X|bLM>Cd zr;e7#8)l=ev}_Pd7~Mmm5@i?esB%D2*q2 z;^QVV0$A?O6n{_Dp;4$c&@4}(qrEv)JS%DK>^^Dcy-01lRr;l*2hB0WS!3=1>$2$G zG;Bk1-G?w+EQ2x0nY}$4vSL0!bX!5{U}3++!?$7X4DS?@Nt^cY?mSy6Y+(+;<98}O zB}=VG$a(xs<2Z5X*KQM(L1kn45$9Pt4JApRNstas7^HUT#|>=QD?*d1(}A4Y<57D?C3X{Fq6{rxv&TpQ z#}vdeym2e+V`Ne63Y=|-a9RE1=h)h8%6)f`yJa$T?=%o5_IJ(=7q5j1%#`c zXy<2i40>4OXbjX#G|ZMd^vn3!sHx|u`aBK%BJf>5S1a$_fxT7TTlCwk=0>jfGm`)^gP*MY z>oR6DWhT=5_V1~JyWo5LL^{{Ho(bh^PDxY_{dfWgtpdKtu3C5hM+U@60^>W=pAqrv zf)IuAAK^blyc9}pj3?f*ouHgVr_tWN3o*XskOz|%4bt)D#!8+-R>=YN?#Ki`Zx8Ax z2}jpA7pgE^iS|VNU2}j@5tns7FQQol*rbiVep0m3gg)6X8cnc5i7MV`X-z<;CNMrK zZXhdm)%eO3w9~cGq}b+as|z?9HH$mRv!;kP3Hx<&H-*7290J+6P06obaaFzVqg4pa zi0!Ksk)%Aj%>oxL)A9J)7YGN$tZE_3L{1(>Vl?y+g6Y&yjBKgKKE%H^Y}5^{CcuOP zZ$pr%T`+UPoU)2z4X}EgWIv=F&c~ayGc<8-_!Rrk^r3_rjk<2k0~6nAQZSo2A|8H3S4!bfV( zz98h*#OG2zEoQB+{xT$YTD(0+A3=NH3}?gye?GNPvmd^r|rb{Qd|>zmTq3 z?k=_AgH{Sv(fy8w1BGltmseH(N#RU5SuC9dTS1quyr_MP!gO*T{#m|(O~M4`fi9tI zVwQ;i#z(UtN)o|4*4E~1dKT7tY?ivFR&2I5`fU0p03ZuHJBzLri>WosM;mK1Lw&nH z*GdFJ5&r)hJ^pJw0D!Qwf*`+;XAX7r9h0a>}(Asl}z zSMRqz#eeA9pREJ>cg#uv2+Rs*|21kLPB1Gpox(v0fN=fG1c7oaxj}#HpmF_DBK=PX z?azpa|IRZYkc*Xr`?tsmbY?;+qtNLB%^>}@K}Al$KKL!XoXdF=e77(;92>{IbuR#NGvI3#%Eq~*51VZQge?Dk`hQj8}Bj=wv_BW<9f8YAQ;4XPXTWfn8eM4JHXtMU#)cR%oJvVGAHK5;{|9JXA z4}PofK)*?UKem5Sfd4sO(1U+WN$CC`enJm^XH0*!`O}Q(9~F@Qg}*@ne@SDvOqogWRI20s4^z8r(z^FT9C&2g*4W`dB$!0fDP`IUMf8)lC33oqR&hdd<7a zNIQlop^=ZQE2s&Vu%0WJR$2<{?#FkI6pn13wOa+>Jnuc94kzF3^R>Coweb$V8Gk%{ zC~sMOPyS0|m#%F#tE#K`Vd>k_)#x%Z)yMZP1LulAizX*|pL9L14i4>JteJT`RZ5>J zul+O)k%;G_e8o0YT_;?fKVAa+@x+ zmNa#xF`zH%^e!s>vTBxH!_4>Hb4_zCy(Axs zKUd%1e<+)|zZbea958la)L$2wXCY$3TS_k&Ila*eeyFML=7x|D(&36yEZ%Xr)K+;9 zc9VR(**aD+@dn&IWu35;dmgnv!H_;8Ry`uf^o>`-a!tdF6y4}v8EyZF$Yj28&FodD zNn>e-UnE7R z2;gQ~9CIP3(|6=xrf(6xiIg*`XUS!yQp0OQuX9>SzJ50*F*c9<={0h+;^fXqTY{ND z3Bm*Zy2hK(xJy50x~*@-=uX6~4bVl(FOq(?rhh}$#NPe<&f+WBx4r)p;&<=Y`EW{G zUJne)xRuBeD?@QyZSABKLJWwaWDhQ{=#i(7yNd0PH7#G}@}X=-v~3L3kxC!!q0vrs z9_3VUtv?hcz)D~+uKuKQUqPOC$!hMfgUnQfrj;7ev=Y@%=RL~$g9i3`-)%&Lk%;Ab zD!~+}aXwPO(-2mvbql||og<$WG)CAXG31B}sYCk-!;2}K%a}}C zA?xSB!Dci>>T(uPgog7nhU~T~np?|^;DfLx{PMU#6gK@RJugEg8=ky=&4VV5VcS}5 zjQlJQ({x?1zqr3WiyU2kGmMuSOM+NU0zOLCbrtGFO35U@Lk~Vzfpt2Y3#5`p$j9^)RsPW#Nwm{Ctrsh3$*RF?R4X*OS!nIoHVO3foC49Z+0cCSKwBQ;{(6 z)t2OqxTUv@v6Q9QDyqd5hqg4Yf#%en`BI)^m_u{873tvW>JKWfl^?_5`_gus)3d4G z(>OL6>uB)@^Uo3%2C=MJ1aEr9r96O;J@;j`0iK1E16hQ*4f&BiOW%*$7~?F`_YpU&aAb)poOWW&D#_I@(i%~lN1c_y%8ZCu+5Uig(Y$H zQVwu~}hY9JNN3oy@e4I;S6%tSt&zs=`I}ccv@`U-S(0 zQ_xHl8VB`by0AHMU214K4QPSKt`OUd^w(EjqKnF5<$LO+=n#_6(C+b?8Hhkq&kHwS zDF$olaqLjc1~*j8&P>!S^^I*@^d|`)j6Wh55k*sIY#U;?4!+&nMx)|H;|viGvjAzN zvr>MOt1bL-e%;~|=vkhn(fbaZ>-s4#U!Fazg0n!UAR6$)XvtQ*S)p8bD!hsz0i@pO z9?KKBbdMwn-ym~5lFF+UmHT4)8m*(+V%bep=L@BaAPcdMd~^%UTLBefF&p`tJ|qLG zLy0)`OdXWCMhhuyFER42Nefdnx(|?7jFNS3g4t$B&V+hiCDS2PX@U$pgr71+dy1Ti zcI=}97T>oWXIJo5`pPKrK93{6F$j)-;0q2G9Nrif#v!{3GOXh!F&X0E!*Nc1X z68tcwil9Q8+a{s^DbY74APHgob-oH0tGrcd9c6Mq4Se~5s)}w;u4}3+89~Sh0cK3s zr_a+In52&G=ARYcT;47LN)M&z3zCkNM3w3LxchuXNA%KZn znKN<>(Q9G9GKn3aIn^!_;3UJm$Q8=@)Ddt-7OfvM>NpeWt?5ve@?wY!WIvhwX>sP2fJ@+{IC6PSo;-qiuy}eI`PD#I3$w85?XHH&Ph}$%*%A*qXp*GlE^prKX zuz^{~$=Ah%t~)|DS~ok*kWh0xHJIJKl&-OSiVHF;@F8c4c#~aGw&GMFYU)M%!@+^v z@>C@IO>GLeTahx6hDV=9eXEiHm{>S`m0;6TYPZd5W6EL5GU$KU>5ImiM(u7QC0 zrMo79A`4TPjWfFg%@XC5Q6vcVeIvOuqQlD~Vx!R_-ammcLn-8~(ag|}*RH2-UtR>I$=g$bn zFCH4PLT7xi{oZxj&*l{8Kz|A?0sr_C`qzM!{|j3Bhh8QKs+$Rh!V&*JDZ>GUl>jWd z`uc_+?M$tVS)fRirLL6$i-oC`A&ah!vAw0Cm7VSX3(^GqpI~hu5C|IKa)H5=99+L* zd@!_IL7Y&~f}0!61+_uJ8V&%E^M8dj{W;jCZ=-8xXv=D9&Bh3gSpJJ-DG>NSfz7x$ z{>iT8UD)Le-!Y7{wJUr2nu>~g1NXT0Z{Y|iXcE2 z)q*&nj{P=4fUE#cZphyUzx_)k4lx(EAe1F6C@26mgP@FIPHqkX zF6dT(3;KU>{__g|j!pbWddT0+Spoi^DEr@p-oKwvzXR=m#o)hZ^)JisS@2(1-~PVv zeLZapSW+V?N zHNm*CpdS0_G4mKN6q~B2(*4Zg>_T?r@$~xY$!eu_vG1UT6CY?J$Q|8Is+T(lsy@RbA(ps|s@9TVLmXpU> zL*LqTe(u+xfeGBWnyw*WN5RVM&pSqUK0B3I@}G|_FXK;ac)cj|2k(cYo4ysQ%e}#A z`U>A_ZwlKWe;6)L7VhK`A=~j%(%CZ-xZFk<@K~N%o)-B%FH5vUHIlmR469!ga-EE_9)_r(s`IOBU#l70zAURdPKFj~*Na)5O zmM8CaE|F*)&34QA?S3V7gF*#caU6H4VuGxZIwnm5#)|LY3dJKVORd8lMXFoK=objz zJtF!OeAOdSL1d00f}NJh?x@F-+m}w_X!_8E9Bfgd$fUzSQA|dlL#u=c67|UKJ}X|G zoO%q=5jBc$)|sp1yh4Hc%P#AF{>A#~-RZ3Vhq-rp4)yJ_wPV}Kif!ArZQFLTV%xTD z+qP}4XvN;?xAv~Dy7#ZD-}`q@i21elLw?oxN7|>yYJi!XVUPA4*j*=q6r7O|>h#$jd(A1-RzAN}1pQ z7*yHZNEWYO!G|unpFh-V4S1sK0Y)$HwT|U>j5hb^ake@rqDas@LC4oMkoW9*^4k3i zI7dy;>E#uoE6%-#o=2}f2{8c4ZCLSS4Y+1~T@KCE-Jk$|0wrD)CCs^C8VGjf_`1ho ztUP=$`kXqFy+o7)F?l`DWi8(r&lM(rBnpXND=>N^^)6&$dfY2LCt%L2rcKhP(9Z*M z2QA`cq|pf+9(d!6Wa3gYtUoNT;XDw*Ht-p+BNDeSIu^+hVHrFTvNtPq6h( z&bwiF+CrZ4jR&?d6EXIhB_#z_%2%Go09=?gIK)Y~q|m^uN#j;{ zM{P*8lK^kMyp{7e3R_VaNEIwn;_)l%Hm8RF*jdrH&8Z(@lzmWZIQvd;OnlDfUKCJF zp-`roQ1t#@8TN1cKlaiMpyP+kiz@Y4+-ef`&E|#D1vbt-efB*S^xz1tIRx^xgpn3RJ2XFYq zytp7H{enfG5_z}%Y3dQX5KXA+6;GZk$VR#YMI4`KH5eVaS(@<=L<11=YE^sT#O?bd z4pZgfK6lP3uLtD{rphL)f4;++c<0Lx4uqa~T*?y4Ez=C_^>%2im{isnmEh(ReRW}O zUn;H;U3euZ$5!2VtPrttjKmGz(|P$EbX_#X{ewi`Y|;J>c)1cZCG}~iwx`KufqQmv z!alUbgG&DXGdE~#zzJPopcu9d{Jsrv7^QWDm~u9=pANU(-Tm%IrEW;Qr-r+lC7TZB z0z4&5G$mY&%dP6E&97Es1k*r9?#MiZuGLy5=b{#~*fni$9GSCi$<$b~1Xuyd+GNibgGWvEAtS)gTzJUDmdbDeo-Z7Z5APGei!)!Xi*oE&`FJ`sT;qC^z7J&>gU; zV1XB?Xy);~BIe*#F6RiiD3W1n_$+6KDA&_R2Z>#btg@4NL(56gdQ9l}EV^8O*pBW~ z=gZ*$PmRShx>$xwGp$egsH%6K*@4>C@?c0O^93`IB?MRx8*6uT~ zTzfOq$XEe#JGAM0!@QO@sEu;`I|f|gY~WaW2MVIO!MOp4btuu_*^%Kdi=AYGsId?-!Oj)H*qJ;cWDX% zN#wJ<8~DtO@q5i6P&sq~m#DxmSJOXVUxK8Z(3mh!wntgGO9OaQ;J4?Yu<=JC&OD9C zQ5$=g-zoHPj5ZoT%BIiA8Nbc39hZ+iSeKL8Ecq8sk~~5X0qm#!&k@)u@*u<#2Qubm zIeUE10=Pk9wNVn$Xd~l6Zh1koF%Ko$W!t>gHa=~GuY_~x;vo(J8<7O33bAzv3N0(h z>C!~OhLr<*4AGqyp(vvb_hfTtffrGb1Kvi986}w7C#tL!)_$u~C{hJi3_`xJg4`%> zA2`t-}Xmf43>tAv{M%W(+L06$YHqbfFnf{`*@ytTElLV}tyD*C zUxYDlBy!LQ7a_{ZE=UM>I9gO4q0-a)Q+G4emL|F={xSlam(N@>y0Ya*ea`2HGF!|~ z;765C3Gd2*q8g4#vSgct;GCBL(5P}W{=@lTK1()A6^N*-A;zJNnH6RX)r3@UF@D?4BTyY?PS=F=5fAk;S+--aJ1-4%L@}DcLv4XIFqTF={7>6ILvtR zvXr;7PI{S9X<8xG>XmIwdDVOh`cgjLTIL)s)rglMj_#h`DpuQ&M+ylZ>_^*y7Hns` zvDXO^#^2qpoj^6T>R&gzG7(iz0p4V;V7@L~uJxOH-dR7dX~3)#OwDT8C|&l6*5Y_; z7V2}drE5J3z|`FJ^#ThuUBOEBGmv@O!Pd^SftXG_pU?|yd@73jc{5=>c%r$Ex^k`! zBBC~R{Q-vRHn`cUuKU&lK9#Mm4^QfLo(0GYA?&G3!!8w&A3|m&^wBk)U4j_L zbglT)s}@30a%!`WiXgDjQwRc^14#|t9?rZVC1wgVtMP*|aQ>7iWr6MP9bP=-kJz0| zgH~)rF(Zw-m4+sIC#i;A4KC~aWU?UpFCuRbnJD{mHm<|W4J4jZ>z;HO@a;J7sOO$E znpUk*OViGYY~8XgALcd_3N}%IW2&@Z2kF(CKwY?>_S#Cs86hA_dFam9x-bAkQPwxI zGo(Yj2tTC1h51F1idQh)c7P}v=qr%Vsz~~Rj8@NUzsD#q*0-9v2Xo`HoSqy&&uoL0 zOw>%NEsx#YbhbBXE+V7Im{$gup#WpW%c=n|8oT!Wca;;@b6$He<|r2YPG|_6ge|(P+#@i6(*^H2)RLJuo2^0-1a*PEEnO=$ zRol$;0FN2r(CE_G)bzoqg5k5eN|U*O|9*%r@1B5_^vmhg`;W6hjS^M5cM@wo^mXdO zS;T^?HPtSZyxUc)9ynw+rN%~zMd>X)9+Z#t}<2}U*Kn=4C`j^a=UXHSsf#%{K02$eb9jH}*t z{|nIbK9x1t9&u4nI9{Yl%NKADs&&rhOApbei?T62)=XRvHU2$naU`Hgm_YZiNkK)p zoi@pUi1O%`{ry1$eVYJ~FW;#jY(x3k%B5#xxTrgOL$^^5gcKFPzk17|m&$nRlDNh{$yIFsq*ndUor9VFJ^s^w$x;04 ztN(l9WTgMM?zmUlTCvMx|GMK+OQ?f|wRXPI){CE3#BmD~i+hX-E8rX61Be6ujr-lJ z*KD`#`o4BL1@k8Y5o>eQb+@9Y!&wEh9qr}WD?D(u;V2pOQFXC)uV?2*kLGwwGIDaO>P0hLGOB8|Ubo)o=X^5)(C-EgB`4Ks4K_2U z$Job8z8bjNxpqotTq1(~yyX69XELk1t@u5Wjq+!n)x!4tR?X+W4M|aW^d?si;evF0O(*_=)VBV#o%5n@ zkCw|Jvzzd4yt$Z10=8s4qjP_w(QC$6->^<-9-*h)YJ{`^3U=F(^^ zthJ30Vz!cK^T0{Rj-DxZe2b!DGA7e7Y*kJG0{Hhw69DpboL1@!oF}>}mnsn=^sWnd z6-Ungf?z9D)|W>0Zz+fNWp$P_u#{ zQqGltF5bx)RptzOV0e*fdn?i3uN3%Lr?IjS-G$;K8$h;B=LR6g(uVpv$Mb%Ua8yC( zCr{I0$ukAKQnj+6z@TyctikgyjM^jc7Tfd;N1aRA(&GD&|byeHf%t`=>c_Z zs7eQtnpY#Mx}_-YG6A!-9K(Y;!tqleivR&?lbz5JAQoWUBsh|l#{3C?o!J3bkTV7H z;~C<8Awdkl#udyxsX`D*L{~2vB8#zZpcsi3S@;WCf-~9#_d&w%ky4!P^N_om2czHE zo`9@{G~8(t55RdrN-z7+j24)ysLOU?>O*14a3V}@LY_A?K!xFuaH|_R; zv}tYtIWMY;oCk8j>NIEi!%x}pjFH^>ABX=vy%zpT;c!IG=-gXiiGb{6HNdw4G#pK6 z;bAPZ{|$X^geOb};Ki|p9wzUxv)0XbY>RCkbAgVjT`sBRx35}SatC9R9L`l^4``A6 z%dR`e1ud={fx?OyN)&(c3ho(3zOyt~Qbw@+4u7AJQJ|bd&DvXy5}MbfIJ$)>ndC|9 z%!N94N--2BANcyBL547@Ji!wtVYYmB={lgZQE~?m{Im{uapdcP#8d&XsvFfHZvj8l z7?T+$M+O!*{pE7*{f}!njSTtkxmF+$xp9*$LzI}Y?e9ASuF~$u0~&y+6?JwY%KYk^ zUCUuxczz~fCqPZroGl}nSFwV*zpnH6<0|xg5wuVsE4elyAkLSwI{{$7}9_qz2zyu)EefUVygGCAKSsl$z9*isxL3 zEEd~Ub;lzk@H@XrQ9>EIboapPB8kjgcVFM3;_nyU*<^I$23QR-G!XJzx8t}h*aeHd zXjd7RCkZz_b)QdOyx~?n={F21jKb-kTAVi~0sD$Y6!|++04AK}Q*v70HqVC}2`#hp z224$Wp2BiVjb;GwPH_6@SlSrAi_8DmzjhU_VdSH9P7&CuULs_dOXTHQC(~XWEJfqS ztpz^!UclL?!9WqFfiy)n3L-yuxSlxQiR$gs!PHM@ap>Km-2*cmAH zJ77rnTU&UIi&_{it4;JVEik{D_00c|VrJNKoG7ZQIw(mA!@LfXB&7WuC2l`XeV@zyceHB8>MD!P7Nn z*Fv|f?aqMF$Y0Ab(OTV#X}I{LQ_FctR(Nx$B*hMA%Ap>id_E@;!%n2xP_&)byMinI z@|2XmM@Dg%d%|Nvw8F-e_5I2T?A2f~=3lUnT@bDjllb(}iHMGy5|%Fo!4U}qKeIn9 z19~wGk`0saPVa9}N78ZKUDDAxTPQJxG`f`cA^1>n4F9?eAW*uf{pm$n`0i?`GA6*O zUdYrG^fl~Mm+hae-e`B_*m|<9g4H#xII1nM-{hb-%+t?Y>F3=p`-vP*AtCc~e1js? zc#P~0UD%Gmm3*dpl<&wSJXawe{8G$L`m-N;w6^7yc4%03F{xVIYCD}(1D231)RXhQ z>Gk`3M-S=wYoT^t4@;0MW3#u(XX{-m66E4-vT{p2&5P|S(`gZ{`jr}cW}2Yyw7|(& zXBTGK={~;TaSiRIX5#`%)smFJ>DTgTBgrVVQDI@sB!eO{*lU!T2Poia9Qy{hmIxY- zzL$mu=ssz5#uwC(Ep3UNut_$mt+vGQx*{=KN8EeN`LqOVjffEby6uJe7n;G#bWN>G zQF~Mh>7)^@oQ1^zt=Ms*btTImK@K+!%CSojXC37&+;;5Ro>2w6 z8aPGmnJ}-CaTWUwB2&7uNj3XdP6mSZY2V${PJ7OvaBh5atw(GniY$o(I}%oGOL(0g zqL$>TqC?>#Tn#{1w@ep#enr-mj2CsawVC`(s#*WV3xQ#e5o(|ll*+sT*59={T&2tK zl%~BKOWbC^&cyG2!Ee|HM_z8ST18#Og@;XVbc{^fTH-A9)4K+1_WeR%|I0kp!&^#0 z7+HlfCakY9#F)Bnp2d@52wx9{PkN!AYVBPuhV@jEUamZf1qzKw)j5IJbu@ui59~hG z`DT;~3(?RR@1f|ZK&IDusx-$mqT+9zYO)#G0oFvICv*@~B@@$4t9YrgO6FQdMTIJc zoWDduAwZV0NdUXSiql>2=l-_A_jjc5{7AD?x?#Fdhgk5#Wi$w{aUGcMrtWZ%irT`& zr&9s*jK|_x3h(%^A%Qw|Qzny%q^Xm866NUEBn$6vzPZ81b9oHX@(=xR8Vhsu2JAII zY5_G(`BY)MB?_tZT$Nl-E8enUkqHMG!%uRS9*4pv+nm`uT=E^LfTUt)*)>zp$#lu!3Wf%>CDk=kTsxC6=; zu7DR%B0bMZzO#V6b$T&53BslPk#f&$BvmUYoP`JMyA7dbHf>@G=G-AZ>}CHJA zwO_P*x*dMlK8qd$fe5qk&N?ybdK#D$EF_+ZJ@eM>FKcy7>?y43yITVj>K!eUm*n~m zpZL}z%)$3J@YJU0sN$}Aq!$0py%zzJ z2cxVA5D`$Ii#CAw7`nyZ)k0|b-8 zCTQ>U!1w!JUmRr#_0QTL}x(Y8lr=&73hy@KWf|8_TfVRR|(7 zo=X%#X2c5 zxe|`ASiZx+dJZOQO;qE3Tq55w^=3uS?8eQZ#?Y8KoU#_7L(m0UB5E$Ib(dh_)032U zG7nRpOX_&oAw_uSzDu5S8M@g^-iw;{a!!Qdls!4@q20< zL*tR!>q%fH4G}3T^_K%B2`ZYo&2?leXGRBsNp$m$dV$|R#)S_Tus39-v%gk&hKI)DIV_JiHr*58(e*w~_ z16Wy}u>6CGM&3BItPV7qA9qnWKd2)l*3lJ^g}oCpd2>XsrlzG`Fnn_Ly#;UVub!-% z$RqcWBnWF~0Xg$67sHsqwFy5NsAB0lsTO`M`bojBk-*D2XxMB>TYrO@?O-+R9m-#i zib^4YS+EPVdrK;Ts7Mw1a45u`Y3_iJy8;GN>jQU6(L&8m+N%p{9PwN-gw;BhA`WwX zt}fsW@z{{Z6Ww`Uz()M$-1Kod=vbb63~w~f{+d4ex_6pS>AKOV@Yfh#Y_!pSZmj5| z5I8@D(a^@VaCaH9H_l`E{MU|Q>T@C}W5_UMRKym8SQ_iyaj$f)h!TFOlDYPEo_O;R zC%qiT*-=#$)h{ji#zc`qYJ?}k#>?GAh<=}DETOcE?J!77?q_FMJ=~gm(5>iJ__Fqm ztdJEguQ?RQ1M$GE?CWtU@Vbe{_SvwjExS!n#TVt>(ztzAxxu^dmS_e3y9erg6FPAz z)pyt-OA)~rHj?$`VlNI`W?U;2-{ZGH&NA1Uy?G41{qHn4o#GQASyj!`5*IA!($hyr ztq>)&;q4up($e({?A5ts1K^s%&&NV4hjc%%n2Sv}DUf`#;mvC2e11(=p&BWi>=ok; zbZmD|!fiATSi;;~jsc`?G&D1~RwA#ECyGuJIgsgkiOU44^Tx@%it%szEALha zu;VHh%a3)S5zJ%(Sv~;at)I~=$RmVL^C)zlEs~oI+|RM^IZuz;`P$P2oH5r@7uAYv zcWk1kuXNsJjo!*3(FMM88W|4*bRl@}%F)e&t-#YW%)*+Su{j~9lf>!R-`SIwj^a8p z`{~uY>+tm}Nd75|E_QO#cjH>}D3!W5Jxm6^^G5bE64S#1iL^kjO!gA&FGdVD;blrL z_CPE_7cE(1#rmBT+ib1Un<2OD6F8bPi@zllJLvCTKGA{Uqaie~ zdp)6z-z2{?+n9(72S*N5zoQz50@DjSc;9v!uRi0dcovG5UqU1(Pp%`?+PTEwIFc7^ z(pSuOF-A3hUtD4+}UUmnMEpyaKU zr>Q#|Ggq?lTbjigktIe7Thi$?bE_4T{MN>FJK7qReho zfw}zZz8>sSm%>r-lkTDoEcTzK3`VB^KY6VG%X|2fvZ4L)LH$4EJ!GW$F%ud8hx5>Y z#?->vZ>;xbkV67)Jbk_fyNMp; zO8ZEv=UHH8E@JP-4TVp1ZUe)r!VQm&?zi&a(oQ_z@*SUzxQoTk&FM)iRRzs%kKT6o z#(W<-8OuTx)a1Hm!U#1xUfZ5;PdSKwzN?rjuD{ph9fjOJTHUX%PLDsOe?V<2a3@0k zZequ<2?KtVs{f&9E01d$L*`{3%G`VHe(bc!k>l-sbpoHvJF){3jf`HeI-Fn?{>>O> zB0we0E4C!H4@tj)FaayHfm{#2_ia-H6t1y6cw=wNz4q;}SkuuW2xk#iW>*nJw%AU0 zEv<+LRSdr%^0la@VTgz!yM`=jN5l_B$vQk36cy)Am2MLg{QJ~DXVONb-McTiOR0+9Wvix)pst(XFcM-!8H^p{N}J@^VRHe6CVOd)*y-~UTj4aJnLJt zbypd8bN#Y;-7dRj{HMvV$Wma-<+&rID$!wQ?5XiO;HCS~{;mVK##_9oy~5MJ(EeHd zS{Hb7wX;_Us;KHKFw*Ys`~Kv;weMCe?$NFd1g97oK*&lIWvI0K&fwnDNEp^TEl!AN zf}>2Po0VW)eKHwxo8E;-y5%ooE~SU~xW9gD&Ku$kaKaOf7X-C=Wnd@H7Fqw```*P$ zujfJR*{0t$Wsoo1>y?=svH?k9d+4)WU}tM-;Ye?UxGY5_Y?Z1VWeo{|TGSlQ7s<>c zT+%j@B?o~jvKch_X7=ow0v4cbx;!8Q{bJ5paYD9+*)isM^PpHlsN!7s8$OQmY=*CR zyMDm59JkH82hCU!7eqy^05ig@Uz%#antvDyKj<~&%7$^X&1@^scY-{WJi3-2@LetK zyhv+Q-I+LG=wQkuRo@Vg)A<`5On4h~big<+DG~M8BYW8$yAOqC-!^`hVF32&1Z!d` z(rHwSPc!}!!BI}3&!IN;#yRxf2*c|n07s}i+f&q$z5BHOf*!cHO!|y2s;S2iO?7sD zZ1{jlU{GP3ebm~*eYwyGUn;#ri$feiGGL9Bz)y9QPo;0=fyryyTEw4}OiYi~G2-HQbi63hF1}SLzK&jk@V9$_h zGgN_V-F=)8ba5ZY@usSR>r3it+}%n=JAc@i)POb@Hbs391zD%Ha*e8KH$H_?1wP`! z(!f|!-VO-Z3#~Irw!(#17^WnosuNM$%D$f&?8VVvAf}O|@noXWD17y8KgQtl+-y<~ zeqmU=zWyMKRrKrA+EUaT!{mw3=P7ikD?Qg}}xV;;B!Z zOw;o6@1;3mJrPpjSg>ZWLCxstbfg(?@QCEv+LV7d$O=*f>%0BIj5?&x;mNd z1sFq<7(wdD^BW6HrH_$2Sew%)i4ZA+I@;t=&}X%qXo#&~Tu zj{}q&TVm$XHMM<)Dh-4cV-ZpdwR_|*W=EEg3s{S)gf8|ZDVoOb)Rj`&(-OgRl;L8P z8P}!S0yc{dF&5naSX6!6J^7nlO>NmM6nMZH)O?xN85^Y*@~i$thu~k`yV3zFSZVHOm$1 zPIfUTJ8ZLHk6_!iGrM&CU0Av!y~{(gTeHr%s26lxD?C!>Gs&`5GB6>W!Z;mqEa zE4&|qnyZ^Z?TFj(6CwmwCHaI?bUdSAAzh@J@mf&eC5KFKEK!oj;=5OAz}xC#B%ir| zI1>;ZH$eiqcvtLvtOg0PTPQ{kK?PiOz zN7-pc=GB;>r4V%(F-RbS*gnU=09ml0l!>) z*Uv5uTd!gd#o{QsEieaTfjZ)+u>f5(MYlqtM}M22ia~5vt)b7x*vkdHx<=2GRHPb? zlJWnzw&yy(py!bKV0QFBADB=S)@N_7BX=VXpVi=O7i&hx>Q}9|E}l{{&`!vVm+8R} z7+Qw{Y|=Do*!I-sb=5!`Q7H4@SByv|fM96=%U3o%OYRth$iuHZo!llYR9~79(Whh7 z(MB+`kqvw3hw8^rw5!r70j;Sf-xXe=Z;E)PvLQ;ewJKH@Vn23$WS~_=kPU>ZSz|(H z;O#q#5wcpy zVO50|3RXrX4wDejD0QeBLF$NEH+&J`$Lv#&-K!b&doO0yNYtlz%uQx3lpIXO)e4VE zuoz0kTjoVzq}Uj42l~lV#-C%fZv*fY}OPKB<+K&uqWFOtk6jcbjcJsrMCqU=C>g%V|hr! z*jnQE3rOs|!MSvnMQ)`@0~MwDpRrW~KIUPOTGZ-w3Z`4tjM5g}669wm>jPsCTfcls zvddM-VJ&GUl5)nMAgVbMJ!KZOB&(h3;f^cNB!Sw;cfOLb+}lp3X_~onE|OE)V)8vF zY+lgS5p}A(NR0G-y3j$T!7r33s@S$FRZC%sbesAb!BZ-ob~>Nts+Xeg+Cv z2R7*I_iuq^2?_pHw7)gmZbxPD?ux%}Zi=OQsd95Cm9B`sPxMI?L;~Z@|?djU~ zG|hB*78L_{s`4l|dhrHT#BN}^vVH%Ggs~-Zy{LrY+S;l=dIs2gsw0%Me)R(Acf)>@ zqjBb1q}YC{#iD-66ZJ6jKDWYJ%n6<@JikjXZ+2cT0{=66dhK#iN5>9SY>=9IbyIg_Ffc(pLmC^6j$g-$DA^UoK2Rg`)iZ^ zgZMsm3MJlIN+ie=z(e7pV*6c?^ZFhB`9AXf)mFJQR}22En4nq{z4sJUM?eMuj7J^l zj%e-VxgAgF@kS)7R{s+{M>NjipO#bhe+n4=4{m4w0z&+^+u48J%KkGA2G!9MVE>IM}CnS3-DA*Xmm5^tE4BRCs<4)vvx1K_gu%fb+ zskPCZBAWGu1#`u*YeS*=MvACk(+Oj{W1ct zddjQn{+(^3geF>CvYY9;Vtm#4BP9Usmfijvi8f!XoVbkRH(s!bx~$$_m^WivnVixG z{*cC(&mi*zSQGVv`!#wYim4uqcTB|Q9j!)^`&yrBx-N#qUREKVuB;B4~vdzi-gJmy=Pm|4vk%fh6JehUFeRV z0_D2YX^<~)3=%K?aS*iwHZ!kjAm2jU@EZD}ct$>6NXbG2KcHKBVdVrsPF@T`!lq%2 zeYZ>Cib_)!hy-*c9Rl#lnvb~=@fm(F_jUfPp9Sih1Oc3@U}=;<`5sK>5UxNUQO9Mq zzA`1=t0Bfd?-0L{@ieuX6KjDN)n+eEICpq_F_mcj_t7L9UBRupnj@87fMQIPeY1q} zP=6MRNT~brSz9u6yiz=JQRwL&QYf|qJH&wAEw{EX7{|bYQH;?ShVmFe24;V|(PD5= z^Bqk*zA#ncjFd9;JjnA|+*;X?YRMeGiq-K>0!7o6M3T{O2nHgK$!qv9)X>=6Lo;Fb z$d?W3qn@lUtV_S;N#egIq;An^mdsGi&C0L^Y8zblDb1Du7XzJ?hvw`%>G8j(rUNtL z-sBxH+ZQm?@ppkuA%Wn5ZYiODEqbHUbA;9uqXbiLiCb$6u96#ux;zrmC(uY z3=+r^^>m+e0z)x?)fs|+NWoRg{$x*7J@kycMGayd{WMNXSSGZUn#I{b&@-^X&Eu`d zuG+q)e@d1m58%L>r45sic&VfCWDcF?Do16iqf1&KOQVSlq41KnXiZ_Jr}(w)SZ5L4 zfZZ4EPc`W^QQ~mbQJie`(cCW_>#_)^Wy$(H+3@UGwkJ_aBkSOMQJ?=E7oPs8ShmSK}p+**hbl1KeMsr zJU8tpzw{#<;wyy}p}9Xg>f$sI$@rX21|19k(!=MXZ3Z<O=L|gFN>~md+_)$KHC^$fjX;JF47a zk8Zo5sNq%@Vd}`j9MKYo*2zax^*cxAL%Y0j`?r-1MM2Z4D!PJ8wd?skmp(J&2X8VO zRpvMEF;P$C!L_a0V9mwlU&rdzCw*TAY6k<|ypwsm*2j0$-xL>*d)(tTzl%G23xy}V zpiA1d2VzZ(E|@*{M@iYByISJp3gK5pvbHG8JK~h~-dDXywJB++l*)E^F44@>B}T2d z3^ySSR3*)vvHQP!l9aD;u9{Cg4w^LyAfBRuJ2F!5iMD%n^1kPQ1X|PXDDQiHqv3t+ z@O8eIs<7zQ?}F;Pk-7lWxbI|4?88@5CA(dgq$p=nYPC8F3LZb;%o>duwXL4IncZuD zA2kGh(ok}ddMWIraxRgsl#H%Ji}^G&VzPdUo**&_XG24eU`AA-V0ux#e9*$7z1I2U z+cfj33(JIGb{b0eeU&yZYp40jOPXn=KG!CHT1pk$bnLO}sV$T2Qgu0*WEv?jwf2uL z^Ve7_yI2&BbZRzCB%C$FRa#PHicX$TKc>*$e+U)l^hoVo8Ie%r_jyDbV4gJtJLAnW;{=pj*2c9;6WOR%vH)7&~kSe+gzUw-7yiBddf|B@*AOPe~v#eJ#g zb|Jc;NK9iFS12D6HlKcYm?nB7W5na4wT7ugr@g&OSs7YC<0j!?9cW$Ya%dtzG^x{3HhGLWp&OU<)@-MESbZAwW+ z{vi|gnDfV7ID(ZcJGLvF(tff8vK-W3AgV<1fT)Be?dj=pknP|*0Xpi~7yg;?nYX_j z$T_hH?TDAq8oHcL2B0_%-N)~xWM!>Bh5izU{x*h=K z9gd&q!NC6*d%rvoXGJGuk}3! z;QlhFgkC$KyktFsGw0^fp+qq*m;dq$;6aA%pQaW@rhhU>|96P9|4UM5`pHNCkm&v& zlGK@KENp%Vk*@zCs+%}E+Bwpg|0Mc<0{uT4`%kjp#?IKq+Q8Am+2fzJcJ_Y)5&jQO zbN_CZ`CrfTUjxfb|2b&=f3$XHmVb-G->tP?gWZbglUtj{?st`mZ`05Q9^t2f2Se;f z(9Pi+cC;p{4;@B~KfZg4l4{!!>eOlXK7nvD^Dt1Y?sB1wO7aZ!{Y88?YQ^D>_wjW_ z*IC=sdNTU_{j&RY6`H;F+x^}4c{%w>@mlY@j;m*9d|@KIUyJHdH?$wB@~QUsy3hOZ zZZN{j*oVxk*0Ei7@ARPC&#ZStTRY!=@gMH-_U8K!o64WY;J6fAOcRSA_qf0=s$b-; z-NA0`-A(6%a7F#@@6#DdjTpW<#6_d8NiL`1GRwSI=^w_ZFGjsFZ-VFnM5jmdoaLEABu3*AM#Ej63sNwq0|;xT7P-F~5qO6< za-Z(19h$tOeJ5sf-4^-JW6C^{OtM-#b6xqA3ka$txQFG3c3^kTGkKeBM2h@aZk&PyugTVI8G5R~k0q`*I8E=u*JoluV|zQ}*&G(iVG zX817Bm}1E_r|58!uFj~YZyYQS>c%Rew_K!>YW-rne1OV)ym(+EZ~Vc6?HyQoe>J~9 zaak`t&&Bi}AYJII$438xQO4K#>hfxCG{iRy|e1d z?CGspZc#a~9F+FbW3k)ycR06llK)3CXs_i%_j)g~- z^kqtHOJa6+4*=@j0dj?>?LEfs?Zv`=T!$YZbfO#{r0*hvKVe9`vy; zn8(Hc;6UI&$SbR8{zQU>rwu-y=*iJ8wj#$D%5$>`*K5t%s_rTrKAVc&3=s%J+V08YJN5)HqUU;IA*U27^Y=DvRsAh2YTtMn}yb5rB?v9l?DvJzOKf&3BmLMz6i- z;~&c-tN|JNP8NR@{N=uQtS~%HSgyOX0N|a336b6S+ky>zaRvprku+B{)Y86|8`{9V zbc%UnU6yi~>(oV=NELEn|2SZ%yHfPeczfsR0{CreW=bY&c2QI&8X9RqhYjFVgUx$@ z8==O8zeqnCxWrGx_*z=t3VCw?X}*zX4hd!PK4z2Suaq+WIsSfUJ%)yEF%=`!<7QKr z5OvB4HX(pR@GCM>kCj6E0@2)I_MjtM2I-|YqK65v{FqekDGq_<{$aDfK_UA9Fa1q3 zqym~QdhRVfP93wKo{PL@(80b^lX&RsmCW3DF7Ok3PByoPg4QXZoTPh9>5X~Fq)zOl zS+JwV#8G821+MnLBshDNm_x{f)ER>uYt?!DBb3J3ClHEraL#JvD4w_CcY zVJ}pA_c^l~fP*C7S{TMR0;oc;O$sy%l&888$mwrE<&~f^Wml{LS=6}=e_3fInoZF$ z=K*B(KT4Ep5sN_yTsQf>PrPORlu@g2aHzWvYO%kw-_^`&g_G3J*g`eqi%!4bX3hN? zDkJ$5(=Kmi29W?t8BA!3&FPeekO9zDdGg^G;maHP%wp+ z)6C&n_{v0b;|?-_o$PivY7peF`2MG zxhZ-HAU@2~X7T=h0Dj5uRfI}nkZEK!PfU8^Q4|rf#>!8&e2>#|W$c~)mTjVUZ|bVn zViyay*8v4oJ!(*SFj=Y4SH;m|6phAm-9n0;_++Fkk|N8q zZ`#alo5EBnS=G^VR#?3wcUQr<1UPao5pm!#Bl0qAHwDqz^URjN&hRQIjHELeBRsb? zYFcOpk=sMB4QOA-RfmsbgX^rDHXqctbn#Dex4rDWU$pHo-%RZcAF&1;oA}@^U4Wnm z>(UL8(Z5`r4@pH$^HIZ)29#a9w`z>@+II1=NHsTIlol1H7N-=)!pAtTDGPp6n;DQj z9%6TSEI%a(_4cTTAuP-Un5teBtCO7>D5W7|U-)MCDJ<=bxu`5WZ5_1DoLJo9Go7wB zWy7{$umWa)6W6kuEcJB+lxhf8ujt4sthS5C?G5k|(c*hip3NN*llh=?OiIJf%mCAy zu)|ZAf;8jFP?`?astha#hbWQp`bucvU+wEV4+**k%8c+RPgOl+19zqc?)QP>T3R2* zJsOyfO3@wSzH0FZwkIzJqA4W}C0d!-H?ni$I+bw#;1LA=M8ux{QCy#WACE?R)_7LK z4n8y+TMHTtV~Nih0T?dw&|VWbL)zNX5~mMrHc}=@&dC}O5uv3L6i1BVAd%HiU?i7x zK`{R5b~pn{6{TI%Uok@MQZlvy#82)i-V4@4f;X_{wx?AtP2w%*Dz=j$Uo+&iXrcuR zJDqSS?FiX5jOQHwQQS*3Yw8jyV7>TOL7-+*+Uc+ck4;3b4ODY?5A;@-es#2heO! zVyG*R*hAuYgQ%2CCh*BkIAp97$Kz3zkfLU=R1EN7ZNXI+^n4yRNlbHf(5&xc+H z?iO)ObnG}xRq*N4C%co8msDsf`F=;#HtNNb_)D8kH_EtQto0AgydB_e(45(?zCud| zAjS%4500Y?8lyFm}Zy4Q1i-1$M#EH!eFM}+p$i|3>z`pt#IJD_uTqm7B8j7`@bUOG_*l3k0gYT_~(UY|zxY%hyCX8<$OiumXgMHdc6Lin&rj&4w=Qy53% zydIuec`xL`E&dHNat)V1u7P^v5{nG0Bg#+G=Q}>X8^xX4w<0KCknV0D}01h_@ zM_s%JYO%x9C%z*W<#EGrSlX)hdR7WuQ|1UaZ2M8R2RBXyP!L$`j==c$iB1)t%v`iF zmdb56QJ=2+oU*ke5>uzJo8fJuw;W@DVgThgEHwY-U*jSQPlyN02>`3%*eE-KMqcLH z&AX{@B?`|-M^d$GF~dUWZVBtt3jON3bC$YDAPoBpjPc5};3znx7NeOuid+fE8KMvw*BJzaGM7>bc?%#5t zdcr&A&z#~a9jYnKOikWX^i84d~ujjp>c?L4PELa26Ev)bFaiMwNMf>)BvP)>+TxrX2UP3SM-Sw zvOGZn0dk%>8`OYA%b@i(PMLmluRr1Y5?ADOkLk1b1uwS(W&* zNo$~5TIpu?QKoXmjS!AEFKWK;$Oc=>TM4Hl?;flxfvFp~Oa-5r1{tgt(pBKUE7w-9 zAOVz;-o!H!!~?Jzw4oZoj~_pBo~Da>7gC&oO1lJ)!q%?-ys+HTLL-4m&py0xQqTy| zpyNSn%8}h8c_^lYPK4hty_5%@4voU^6Po**s55QOCly|e<97 z1E|f&V~Uts(NfN$&bz$B{b_G zlvK@Pdo|0sF859&AD>lNX_NOU3+a{_V8;t4YnH9jQd3AlA+=_i%Z1E1FMYPoP|j4j zL=r?1RUTJPbVLeUE#-UwW}@B;|N?9}r-P z;77DfMvrHltpgEuHLtt_$`VCQMsc?ICL+ADM)x{wlJn?ur5|&^17|d401MyM+0{jY zk_(dJrq~^ciYp|4g*GYu>YBolviP;)8v7#=BLG_9G+DoDX>c=7VMzQ76@@BUAFcl? z`xYmeveKJB`wx{Pux?pwI6|5zE#kuhxJ($|_%HZqh7mqI6}o}U1s{k3;0Am0gQd*c z)V|M;^0>YZMTfObN)MQNX_s+_{uj`YP*x|uj@EbNxO69k0$+&Hrz|$=vKo8CK%w(` zy3Z&s9HRTnjF~PvI|DZS`0}A(KjPUxBCdM>&~Ue=EJr7YP=_%|l_L6L`Jd4TB*b22 z^+R)&Z9*Kl&Ms^{1bgg=#GfmX@6cJL;h3Da)M%eds)?CxmqF%ah{)I5?93Hc8%7q* zHQEq91`qCbrSZ>Oo%VL_6RrJVjfs|yz18xSdJK6;o55u{S+!a5|3#za3{y($TqPBS z;-9s^o0Nj_+qrv)@7rp;^3*X{xx^9y)*f46HIpbpk|6BT*@Eg6t+m);R`^7dphwSGE%I#+7^Q_XNh3VkO)J;|9$X(FJW-!nU_Z zOjS)0+*%FWF9@rLiS!tB&GOh#JoW=Wn&A+f_x@AwYjkX#V-$B6p@2tpR)r z#FB>EV>VxQ>*9wSMcxnSl@UF%hCh?=aB8b}wpfAH^+P+KCBC_p$e^URf_}1C)`EPZ z#yIRMk>bX=CQMIV|C*~eJ12>=7EUnZYZJOioMzbxho5mwsjj7hWba39X=@D%fl_TUR{l#h)?lAo`&)+ZcdrQvl;W<;P&hnK(miuJj&WO*DFV(gNPKt?lu~Nj; zHnB;w+@Do-zg9TV^ox0ey*crA|WgqUd6x&heVYUGip2q1ZjO)9=@sqU62;@W42meH{> z{KgqquHil*g}~p$+F7Pxv_Kt9c53{Myx}^_#=bK-ko{!LN%DP^ zmI7BmnxG^Z+BfIU4bK@V_hS5$v5yWazZlv(%QOppmT0g5@T}U`>iau`9HMF!!2i>f^04DmtmZ*KR?~UoPXwE6&OXAb}Z}}VLp|Z zL7v`MZ@aI$Ne7~#imiBk=!IQ_-!)&VPz>VF2!qG>gKf)VCY%^CFE9u*t>Rjpkyulb z^#5SXXw}fiX?_FLGcF6X-z7&Dv~tNGTHtV?o$vl|G+&oid&?s2d}!h1SDKknrhcB~ z%ct1^+h$rg$$R@+0WaUnv1b0~7eRB7(7NRha`?6dF0?z;vuVq53Ib&v{WH`w1d>lv zJNT@0X6Is;oZmvlP1lD-?z2eg4o-*7D8$j_4QkY{#-{;=dtt#Q9V_5;ofS4IUCHlT zqT@0`5B4{#L17l~tT_6St&MPBT9v77INo5#jdP~)Y?A$J-KPs{4tRYJm6kJpzexD4 zG?QJ_HjaalujSoPBtbfq2;hOG_$fLb?p{4E%F-uutr0#SJas>t`^)w;-v+&+!Ts~2(5{6M+--e`tU~Td?0vKIGax-= z(kKx8#wFPnj*Jp4TjGM_%}KSLkX(`O+<1w@A`L2m5rL9+fT#`Oh;6%o*M-%oDs|b3 zBcLlC+|@%TJHPPS{|BaL??vF7&D+ZD(x{zYL7glXT>S(-!MK*Oa4tkF`R&bpf{eF* z6T80S4rvcu2{H_mfhG8#uyM(6W||~1u&FJ-%=z(1{jD9k(O9^_Ur-^9xT()m4)Sbw zc3J1`?ZxCx!*lX4-@v*>Ni1~h4|}MQ=2gp``@k6Hc4S-75VmKa>{4lBc#SNlKt$6~ zK#Oa3_~&-hGV2y1##Yd^s4d$%prYw!fL!^EsrPMhXAqJyNNj@U&5lZV($a5*jM!VO zzL2HQ``<@9qm8n0L;V!oHYXM*)TC}D#Vu`0e*!%x9&ra&r(U$DIZ3QT>=xyk-Hp+l zcFLt|1i?}mc0-{B7Ny18$_xQN|1s(I%LmUK+eY9A=MBX-;cFP0%Gk>aWcG(TW3{sU z{u4l9Xo3~*n6Y%aWgcseK)Jzi$E;e}d2n@6JvcPwPD6mg>@gTNmOQmn1F?x4{dn=0 za*qfgqTI`{cDw$wW+XFG#16k#^Xf`fy7}Xn{9}&6 zwP9qd>Ml`zv!rjgDN^gmZstYlI?NL$Amzh5njNQhRemjehYMnEySA>-P1)-A6Ti6l zoG@9iu60Gi#=g^UwW_ejJ+p#4yAQ~`mHt3om6%wfGcMzSOvT4X8!t~nn?$_;xJ!Y#?f0BC~ZA=v`x z;RfVymvK!r-|?jrR!5mo(hVc;kZ}SLZ-fI!kd8D2;c*aTaH%K4h*4X zCyyeb#xK#w<7TohxKU#wV@miN^g6tdh^>U0k9HJLKUIH)#X^O^CJU#)tv^4Cjw4SR z4(Zn2oEBO%y=F-z47cAys^rZ%og0EqICZo(*Qh6OUJlm)zb5y<8Xx?Lfs6O-B-7ah z(#Vz7fp!E-#$`13&QDvZ{!G(%w)9twjf9czY8KPJSl=4#ABCrqT6h}2EH7-woHXFMQFCrPI$ z`}oz}=uB-m1p)Y2T zCRd1Ui9?csgzbr@#*ana>&&!#d%18k#1XR-fqQZ2c!cMRQgV%TV)pBnBQbo8XR?9Q*btv17#P*D6N515RlLTBFv~tpF2L zs%{a7J4I+v`S?5&P33BGLY8iY+*PTYv8sw#y73+Mgv?puH0#SmHOot4oIV2S5sROi zXR`3nwhqBjF7DRT-cW_%9{@)u$tXZ=1a6c*h=OzE5);GiujR2x3wjkYIl4N;tq!?X z6IcUAWDH&H)hTGFhX^5^)1$q1z=3GbaN}=rFcvXT2{io9_T~}8QJhiik3&r_f9(3@8_p@xOJ+3R0h>6Jp7iFVo1mf9GohK%>$Dh4nLm0Y)jor&{b zOVZclaNGad2u|<-9gWM;$G8%u2sy?f^I|b3LdqbE#6LeYvNN>168YdSU7>#vBYPzo z&oYe-THsT@Q?KH7s~Fq)DZPE95z1Lx4rCHrT=($UdYjL@;(y!Qs%#~^8amxufAZME z+mE()s5uNWg zsx_!7(35Tq)m`mt@}%V`2`ORfBOQ`Us@$|7n6(bOucgl)Js;r<<(q_=6Wk5F8-^rn zwSRIf4)-FiHixXrgE>e%e`vHdufcwOp1G-xb)iuAe)w{w+D_C}{21OVg@w_QHZD3V+$|x@;pJ&P7@g^1~&5a9B*jpm)BQjCD_ReFSW-LomUAJKs?5r_5-X1XnLHwu>!x#obCVAV9(WEb8fM9MB zn>N7uylEFIIvU#K2_WWx=Kbc=iH`R8lao66r?4?Y(W(%VQp9bWgjeahv!^`X^Mu(K z;hI+6SrIKj3TIAkX>w9hF&7oS)LE!Qn@;mNtf$vF?BQ2RKLo`Bhu4OBKdJX4)6W~4-g;H((ol=_~b+ur%XFYZHLMH!NhhAJEdTJH#UlCY69|fcxPHe0N#x`fG z6BsX5Aw=5o#}yhO1JrJd&zpHEY-%w4JVZk7fq!Bf#yr*VJ!8TBxYIAhdAM1>-$2C3 z%j0sggcsRkX;~G=;)5UthT-fX;dX)G6cK78p4bQrk_!{S!;6!4aiElo7a{SSClhF< zB+qIzs4H=#QO#h!wOIFfOmix2_nv2vz!B2QJkxcB2JL;XS~^dR%x2G<{^NZz>v zS=d!mQ`7Ju8~b-iHzisJL*u{Dm=S^zCaTdZ{T2M>vpt3-9$qjsV*>X+)IIkB|q z*3DbSh8=aOP7qVoB_Iouy~RUoH3f!VZaJ9?cv?lF!Z&lb=FpQ-}!gvnjoTXvj~Gbapa$@zA=~9NDHO5Tr{c!~+d@(IA;Zu42!aQ(5 zozb+1X@#GPo?YNPPQrLp>9@2iSlxi^vZb_MqwUDXkivRo%QNqM=?(doq^gv#&zj)0 zuW<{3zntFajv(?#=Y~xtSSYw-i<)6RIH9)Cvyc6``E|22ssJ90Zlfci>UI{>gDYKH z>%y(!r52i?0JDUbFJ5gTom5Xu9Fzt~+{*$mDN64%#%jG^Q&cDonR>9jg-QGp3~Y*q zXXR3t;3`R-XKv_7qOs(e7yH_@NNd8PZ&<>P>YNWVo1GgssjOIB+$pPjT z8@ZLsaDRuQ5MU!LFjO?KaWf;Uy|ci@yUR$uDrRu3R+CKLb~Ts55evrNdH*q9g+~kQ z;?MTCA+ixei)~P&+iV1mDbUcsW<)>I8X9Y-uQvKTgd=t0GvOig1=`V#*$r0>XS%~f z8MMD?zu-{pS<;D*Pmu2hr^B6geSk?VHr_ECJQ+FVYs6NPq?x+EYuTLNO!uX( zw}t~V`w;pU)W4V@uzsJt!XA-qgQ z$saE|RFInuCuq9-dFL87F({C~h7AF6zhVSCKLd&%Kykiqd`lu8LrONRjYe5eL8o zNifd=ZHu<#DfP|EurR>_dd)Y=16A4$j49<=v5Yp(m#iWk?*q+6Cw|p823eCog`ZBl z%`kvG7Rkt-0c!pt76q^@9B+kl)S+IyE~OIUm61NsX(oIGHlxCF$a_Ssl#C0Cp1MUMWbjm4VOhB{UrNpfL8SDV<$88KINqO8cR6~^3vu(`ZB zW;8WovL?3m&J$rNj=TH?)h18nefG7FPtzH|M>n71R$qK)g_1fW-Rg9h|JX%eGEE0! z4rcg>Dox=vYcFXcovA{VuXDZm!Yu!b)0je*rll#JJKeld`IKQ67Zou8eQTl^{1yK-^0W1G+j@yH=P}?J#bKoAF4F0|{UJsDWm!2BHDjp_5x&>=h@; zJF}}Dg=Q)~YNnhXPXP}<&2$>td&)ajt$2+!FE#1k3i?uv#WNgtwst%LA&Zk@-vZ%L zZ{-$J)~PhsKpi1+wCr2*g3?lmF%RwRXb&%3UX9Q}z*JSw^88T!hdvFQ(u-ki#Rt0E zY^-)Dwn&`qluh!wJvD~_W~Bp)u#+t^Ngo=L-Km@#{-;(>NEjs_W)nl*>M9=QUD@%y z?Zdpo31&^V1{ik?#lsqCLt~l0@4J@{)H;d{Ranw01Ldp;`>b!xgM~4uLf8(fPnHEU z=Qtj1K;)uuyVHABb`E?oQp9i|HYRS(&u!?o<#sH^mek%RJ6%}{o4PGYaHSaiQ>yhC zw1axl%j6!EkX9jxlJo!Aob3<#RWlQDp#IhzPUrno`jU6h7bb5vuEL6Eqw-l5=!qp2 z7}IJ3O&=+=qvF9`U4o=NM(`^E>M;wy$q@7g9!XmgZ_bf%-#zwFgm+pj0ULz~lKmt< zq6onYeDt~~0&;aJCJEH+x&#wOoMagRpPLa^gXwa82LI)hzm5>LC$_?T1quJbWYVGY zcp>5g!joV(p7^d1dn+B{2+=wei5AIT;6L9=%x^V0{=$nFv3d1F#T{Od^`?m7 zIWPjD%<4F|!L%f3?Hxg*07EW`rB#T5E`|<@fl|5c0D(|bH7~Sfm1*pbH^wNf0n;!I z&g%T-91bA`OmA_ri`kP({oUK_YW*%hv{rAxpVAVZUA*H|(kSv71TY#g7JHh@V`I_* z*Wf0sb?&tTyW>|PlFI6kU8Q4qJ0=c@JoIJC8_{;7P;rjN%8m$;boIJ4I4MOsAlbY( zTR;u642DiTtU8XT3|?GEU=!pu`Oy(%E-EB&y&fT^r0AU?tU-N%8X^}v>X-WP!!(|d z0z#huKGwR|XH4vTPy$!OsR{4{UEdpFhAG)!ZoWT8#en;FaFH_|q6Zd68HN`BE}hb& zgG8L9!6K^~sr7jl*M?X@6ZSkBtugMmbiPJPo8NXZ$|L~=&CKqwRUx3XMl+GZ&W3RW5NQ(p@(L0g}lGT3wF4_ zqNu`6g1{PSqNWPCKt;yOggA*B~m%FQ(r?*KiA~Ps0bX?@{Nqbf>h5y${*-_1MR5 zv%FriE7`*u4zT&h(^v;THHFoFP+!c8yTZg|8O(E5LYkJJ=4D%)?3>yTeLl1BVVz?Z zNCti{J&i|ONt7DvGgKas@yDM$Q|@)*Apob~xUi`BKJ)B#p)aZ5jUE!$>y^9XB#gmL z^ZnY6_FAUXt0Iv$PB>Wb!QBvgXWzVaZEVUZ7mP}(SdwTaC0 z!geNxa3g(Gr~pji&6z=>L5H66-xnhoQ2b$Ygp%Sv&d&3&%PsUUZdPTYBjNM5e8AG` zqx|L!N^QYzx4{~VMr451qYakhOUL))d^_@pYDsP?NmQUQM43n3SpY{p@(#{I6vH=@ z3)tCPAEuvuM7}pO*GxxFRq9UpbrehlFB00)sW`;j<_nSrEG7_LmWC0pNK=#fOV|NFLt(nw(ak2Wa_)qp>1BA zPq*r?ZUmt6YY?BHN6I*+ubAfY>nJM2lnu%3RX(2r@lp9Cd0UX5cuwFT4W@Ts;i{_umuu)b6u}0|e!;#+X;v*f2UT| zI^{fwRc?0KH2ymNuKodC!IDn?xB2zoQM>&60M~4Pb?5y&}~6<*8Jo$c?F zmy1^p1o}T*)Q)*IFI{YoraR^Al{15y*qqYZiKT65_-H^dw|b*TpKhL8KEx|(wgNbE z$Q#c21yPP_|BPk+`PgVR5NlQy!bR!&$>ZDfSC0LCFP`I6_Wb@5F|NT`$dh)K@EO)WWZdh&rF~OzNEOeWLCt$Bv@nfOt&PGk? z*~L(}MoGCk)#GH#*zH!%ly8S*vhoQ5!tv@&x zNqbnCj3&(y(pIl-giYd&UcRp7o%;MCS`ZrUfykG~YQsXKNkQG8Wk^NBWr)_{7^HC6 zqYvv>^z@`uLCTl~WE;)~)7LK>0~_quxhu%SEs4=*ARl}D>`c4~BbK6xzQmRe`R(W{ z6YeD&<31|i%N=SWb>>ct)uD_KCA+UAkl<$;T@v$MN^dWv8gMzZ(`LI!q+`_-Yww<* z6-89yF~tn>p}C$m4QuZhSz$zoe)5UPm^fsKb^%vT41uio)*L>Ed1Ve6@ioCySQGJeW-PQFw+2=`>8t2? z7jDgI&E7HS@-D4FNu-h2?|Z)8Am=pFMc6Tdh>~bXoUan6xPq|8G3z`*mTMl{Rv}sF zAf0!V2r=danlZ-M+>bAuPOC218^y6xEXE8ylw23uQH%CYdZOSlO8baUV02@F&Dp~6 zfYgFmGviGxvvNK-7wsgC`{)5ASd!NcQIGMonkh!FXqcy_h|Fj>yUyCHV8}p3`|MD1 zAn?g|^k%4FZ^A{#c8ABhiNpL~hfzgi1Pg`tA|}JYs?`ZlbnKAfjI|F;H!%n*0oyFL zEV+C`k-<*WVPI22&K#}-FYmC#}vSEPUtaE#gp11GP1zhG0g(Z+SCT` zul__nTEVc3=vqgHy0R9AW4{P4*`lZ^>Z;d`?6)ZMC`@B2Zw|91Xt_)#|9KVDLK{ML zXo8J`Sq)DK8(9`4p`?vF%Q{CG$I?pXa^9ilO5IH!_2|laBmQbWL&zfGl8R!L$>(~j z;5Hb*S{)CoG<`xgW;n`b%&|*a3H_xjTjGe(an#4<-yT+ZCTScSO1{Vhy=uuqK_mCyQDZjmi?B$&f6YJ9M1@H_dn4{~t zA}70CeT#58^OI8-cGU$~M#{yRef|0)woA~1P`<1ux}q^#1loHX8;!vh4Vd-7xe4o9 za|!hYe9IP;TwQ|}#MUU{-#-%S6xdQorus*1BJ;K6<8h};EWaBgN~w6MY2aDdv^$}G z9u5XPBSVU?E-tKg4KvK@*t1$xoV9Q9ny>CnS!P=-CTuCMi!lsj-h|9CScKjZysU~4 z?)XD2N-2>y=Lor}Q?s&&YI-|{IHwOhohoXaMb5i>RGgjFr-l-b;k=Vq^xQ&l&f5pU z+kuI@HBTi8(gB(gbn0ffW{|08tL*f0zP^%<_O_qaB)l`Erg?}>F`qyyFsE$f8q;W$ zrguAg(|L6;SS3_2*i8(Uh1tY48I26Izieu<)keY8Z~|Bh3+;+fSg_ZQ&Cn>)%}#_8 zEngGQ4dVtRQN-_}A*H&Cq9=b5W)Dh!#X#|AZ%LpV<%+p|5+MkQl+-m>kaCJiMMSYz zhic1FMWhwtW5kHniDdU-=!sk995Ka{TYb7)OF)~BGXHu!fqJM<3_4d57ma&g_IiR)nb4c10}56;eFW24P^P%OAkH<5X<#IUUwvqM*2n?7;3Sldfo7Q!-CR!^hKwi=K!RMkB;OZPb06LQ+&wz}Hbis4qRX zo=;U9BeR8LXC~w=lk&EbE9ZuEh0t0no8>}k zSX9EQ$LXJuFqf|_2)Ce^3jEKzpthQY2wl|CB*uzk>zg?ldW`E5m#`ViodY~+T#6g5 z>m=I3b{d%jMKww@d&z=la`0*(brXZnu1-e8lOt>7LN?|e@y|kelR_|)0vP>&B3eaa zr9qe2TKhUjl;hD@Fe^-h9_gx)IGi9MhMKkRJ1h(|EM5;#*+b+SNrU1fGvga|vQ0Oy zXb2Gb5Z3s8rqUs&=ZtUjhv~-KjnMS8`-x0@AM`GUx~55K`6$uaQM7;4IziBH5}qal zcjiMy=%*wT@BA>FI$IN`c-UR#ekjpUcclO3OR4Yk!n)Uf9>?_oHWX0Xvl&I zOpnKoW$&yin_?Jiv6q)g{D7PC+PQ?MyR@^IU=lE&Fv^mBe*b=1xAxc_HdeK+e45B_ zxa0+tl{dHt)5w7Wn*f}Y!56Xn%RDGvHB>w;OzpJn_zu0;)lHvBwqHbu+3n^`OWPSC zWpaAL72i7={ajDP)3Vaj5@>Z_v?I=P@hWbS`n0+=J!^UG{A!l=9*pF}k7vFkuDAU# zkb1ZG@atQ`Vd7>o3V7?!o}V1k;->Jdy?cWW7ARsd_p2S+Pst#?pS(_0kgjzzR_qVb z>0N#d3o?~6i=A{?2{^64hvj~B?R+1}KwOGtE@~NdzoMw!e1=?=U3>FF5_T=0#Z@N^XhQqRzr!jCKX&WFxW zkoAZFU>Cpa=5aoAy@#?vIDUt+0Z6>3n(;UnASM>O3l+V6j$D?ek#HZyo!9eC4HfX7 z3{bqQ8yc&@9ujo`bIt4zJ>H9# z&+PA&y9(I@-aXBBr2yy}TKC{EI74EG5XO7u#w=qVa4tbRxy;)Q8)Uzw7ma#&uA0#E zZ+veh$F5BB^v@Fy7*D^Z{FBWopoumVJhP#yn{Itu9N%2rweKM-LdcQW{QK@9G2&*CFb^L-C!lApWjNDyjPme!h9Uz?%Z^7G zCpcnAz=zJG<@j|R9t#O9jGMa=m_1q#Y(ogYl82o>5^Z3$->tl&Uw^9$MUi|#8O#3w zOYRAunQ=Kj`d(Bj1cor-^xhmQTWNGaV=jP>{h0}S^)CDi5_BmpSg3wdK#$jO6F$&a z5wp`k$0&0I&zUMMq$D*gkB;-GSeOYq#ERE!A>4}_-_q9fn?+=pI+sAZTDp>erqO~s zH$^qn7SdV`!Y|Y%Ad@$#l3_9Dgdwf}t_8cLeYkv1&+B2Gs)(WKI;HZT}mfQwKM`|*ww-8vj7Z8v-62Vpg* zZNIEiys9%9kHRokoa5lmEE>oZMD-a^&QAG*7(?DK8VXZSUVA4WH~M>hI$5RI5MiT| zP<7BK%bP6mPAMSz-nSa|a1OoQp{5ZEzIWmv(-O5R#LXOG_6sYi72T(3e1%n%0VKSK zuV==6w{qlMK}*#Hio+2P3gc|W!BqLVGS;tQ`~;&bC90Y~>U}Tb z;e$2e0&qe&OOG3epHUpn9QDxU;oOF!M(tb!D;=$1mC~(O2V{FHRn$#=VX~Iia>>{g zNbK@7I??R!wX7;i)56q_h8O!2rPt=1x1_&thdJ-zxkj__qXgeMR6rS(f_8n*D|W?^ zoP1_DGKdcrpZRD|^E0kx->mF4;ZDwc59_f(ULJ2QM%iTzE6i&N_jR8bb&(dQ?#gCg zrMRr-Dbuw)I#c!MkH_wYoVYZm@kkxec6LWafv%oqkI=u`V^Z9N8ki0Dad;=E(}Eq1 z>oSJS;ViFM`=~a$&CYx}JV%+X(>DT~#vj8DwfyB2>zUXS*w_xeMed*g>w-xHg=T+~= z^kCh~cZke*63aHjhXppCG?~1SGWxsYvw*mOnxC2bM+Lo_)65f&EazU6V3PnX8rSFX z`_z8nZ|-lCdBk|tU+$1V*y2re_1r_^@=6$fYHwcq=gI2mSp{OkK2APwO?}#p!0RhR zJesakWR}yWe7x_T=XPDxwHvfHU-rU^JTd%japIq8bpG9&|7`z9Dq{Z_^*PUQ)T&c;q^a>~()3F7b4W+`KUm73@(nGZkygh6OQ z5C}kHs)@rYPd0HB)X(FOm!JsC(d(^RSVDDWlj_D!k1f5fms0gD-{;W)k1PK+!%jkA z|I5v3+*PEz!YyeK(O zfN#HGO#C~gecgx@Nue4KjV+}|TWjG6mpOZ^!P{4~wgk)cB;oDRR!rrc_T4#wBxzTq zaFRj%lS#z*Fxybafu@6qEF6QX+c57Wvh$naA2T-?F!KI>KFl1RZQ~TGt3_)bn4iFn z5F-fY&t8jRC8mQJ4h{nBmXLc*NHAx-?_0B>Bv`UbRHYf;%L~#9$=7hacCi7 z2Or|tvvJF@nxGA;9|b(uyXxfjaSq3D*sbOzJxg5Y2P$@ESge%UgaHCS{DN^#V#xW6 zr?q_Ek*zU~QV@?86822(GQB$vy1qMa-9Eyn?o>vTFz3aJ5$|WqzAnJL70Y;hIIOWqh;q75a`Wi&RUa30 z?9-gIt0AP60po&JMfnZvZjAV}q-iV1ci(gcVu=2b0QL*>$#|r>*^Ik5wMnF=+n{pf z)IZ6z`X)v!k&tOux|HegY|@uT$j_ct$W3yrLsQi$qI6&5XGtmvEH4|WpB}9wBLuNd zxD*zzS@cAsp+a&nesopXNmT{tuwJsmKs{ zY|S3UBzEa{$E{+`5c_TkF*#Lv_Hy|p?v_{aPqUw)YRYRnoyX_FIh;DzP#@H0;#$XR zmuZToy^vy|fYk+blp_6)c9 zD~s;k+cc(*l9S=^ln;YD3F38(EHj4y$FlwYF3qc+t|_!%n?Ci%h+ni2@%#D&xDfDZ z^!h}`%V|SVYB|GD(0gRHDJBK`SP9&7*79(#DlXO!L?sJ~kW^y73fCa6%^P_JubDN# z(3CK=n$K4wgk>a*spt*Rr<$)rWK45@>>sd33D)dyXOpe`5$Eba^m=c?g2oKv6~ zu$lwXiy0=TLAb&oRWdeA!G1Z$G*7!5n;UqqX2PwF!sX~qD8NIikfvxIi?Hy-{;ps# z(qj7JE0VPDOwBlBZdU0fG3F(use+GL16fZwD8X;_HHvX$a<^IRrg+P<&HG~f-6rU1 z%+TSO7iwyTd(%R}ryO9;gn^TvFr%FPJG@?_#wl?ClfM~ zCw9E)b##%SPDs*Wki!yb0AZ#oii@hhJ4;8mb{lJxnPjKAJgHK*9(&rl#9o@Cq-$pPNn3p*M`X2!BgktUR9>RJJ5Ea{c3r4E-&+WEu;g!T~C zjZa!W)CS{<#IufE7aZl8VoFZ~rN$%-**+nVjC|^?AJ+_4Wq|4!Tr@E zRL-oPt(LYOqE(3T zoK|2ikFo6fxR3ep=rtvvwS6RuZkLqxOU!xO6(HeH6)zX@$+?kt@i+3BJ&61_$^|+H zo@g^bmEvrxlATdRuLRFi<2j}`f^b`pA^H{r!J$%cKJh!kKw1v4?q!*t!Q-wOxZGo( zRtUO#A2f%?KAZB1H(mU8J4{jEQGz-cdo+o*DqU|2pWzL{4+k*4-;Si3dJXv+`?KOD_wLP;F5omch$NgIEpfdy2ONWaJ;=;B#%g&B2IE)cqUl`md z35iCk$(5|;_8G6gFMso%0l}yN`99GJLEkU1U)Wj`Gr6R_0<<^YY;hAT9fJ=`xZ+q+ z&^)3g4_)bMd>$aCRW5^ux{2}@`;T6vrw<~L{gEsV{!=~l3d{Tp`&Qu53Ap7_KLo~c zgrLtZECfqrAn-{Xf?V%RgNWvU>DL}u|Bia6pyM;U9ue1XQ*b$sCC`z?AmktXt_$BS znJuKQLOcr5%V(XbSMPVb7uQe0(r7?_z;}m)6j+6wUjNb#A`} z!&-bz(Y4yU5Ic}nHUrU{%C(i&^M%Y^+drQMoEtQtm(Fd6!P;yA9d*89v>!Hu<7AG% zVEL61n=%c0vfn^9KR%;`;vXT4+lOa1dac5sZSCc*Mf4u|Z3S zTDb0$ZBGYNX~EkNvW6WX2#VjCa-9=qb@1o zjeKvva4mxF)2hsm0*eEVpjeD68L#I6ueBbLVz4N3qE}o+H7m^4Ma^fw0%716Kg7e< zI><+Qf7flmC^i^RiJZw6)E{%r3t~t|w`Ir%e%vZvNYif)zJbw17i&k{iRdorMvvGA z`?4o%OH*Prl?%0Ml0`{Zi=Pp z82_21-7R?LA@)nQt?u-mLsj|)=7B%7L}oYQ!y)Oi6g7Uw^`WLcWW zab_XH_M^Y%*b=Zux(Mj}SWgrw!Q?h|oSnU4j3t8cK)0Vb)Cn4wdWOcm&E|KyvLJ4m z$_DJ~Om!XGO~)h~WtAYTV^cFTb|$Z&g}!05`pO6}4=-E_ely+SvT(t>8+Jo57cb17 zMa%rt-fH@-P|-rxoPa`JX}BuP0L{{~si99Nl!q`EjFLHRc)>03J4&*Uyuaabx8q)?{E$s%?1~yA0ivV@>b86J5g|p^n%b!bw!TU(ER-T>GfAH9 zV$-Q#@K@V{J}GH>WR_VYJ+M_c9hT`QCXCK%7L#)P8{9FswHB(Itgf#>ulSejLFn=M zuhZtAYG2-60bG?l0YxpO#U>E9qamt!63$>nX)~yr^{kyuqX2ldgF6N5uEkv?NJyj- z&*wgCJvw{h8Cz8f>xL!9Mx~6d?>l$_b%+~d&MkLvC3S_b{KA7%a5>tPf`10@_Hjmt zFLK#Wu}83bAK>OukxrauD0i22dWLlUN47#&WOfYv*jDl;43}-GcuWkwjoMcWo`!`4 zH9(VL(A_+eR!EoLC;#j;#kymaZ7w+)2Ao@;+{dn|%tb@nR`DM~pqjQBM5qObDx84C zxqz15`OM05W4MSD!)MK~>wcUM;4L*Lcf}HR79_X6+X%60tK!hdB&e8P@Ug0|J}3_* zsRE|@abgf1cnW_>3D8X;A$^sfIyu_QVtY#lOPv))i*l_tAOLD632~Y8YUc7(?cqo` z4+aT)om(q#wq^g+A0I;9SA_;AFMUhkJ1BM?nxLulDR|PoKnd`(UCsRJ$P}>l+|H)G z(?hcgQ}U-GWDe#gOdU*qmvn_Mcmr&u-Ky11yxJU|MggR5?k1j+RFisH8PVuq0e;I7 z?R*@jC82SQNb}bPPqw$EI!;}vSOX|_96A=X|7&sR3o)M@sv%_fQ8E^v&|bnF$Gf?7 z`Fm%)(u)G6G*a5?=;ZV;HcyYE`(-q%C%o6G2#4uY1Pj&K?-HrC-3*`NpIyG!_Fj1k zTsD3J-RKIIj758dEIdBJNZP{fT}ax_*n}|s?*e_h=?vhW`%cmVwF+;at2JNA%dG02{J?ZAW5qsKG0uvA8qqE*Z1Sz*n;ikTDjC+!gK|WmrY?~OuBwcyG z3!QhD3MX>nzwu}`FeT^<3(tOOTr2a_; zH6)Y#_UKdcx??%|IGp@ca5T+S{w$D3PvrP_MFSSLziS!zUs3BZGjlR~yjpP5i^*`PEcV({s zm0SOZ6aQ~e|-i2oqUw-pV?~uv*(PB znd4u?#A(F?$wz^zs?5&$&FHK27!D+7a*qf_M6d|3Vo`~t@FJu{nc{zu=UC*a6a@A!FlB| zd%2%$`FVPAdAb+}B&<^1)SmOfr=hJ{>-BDZeQ69q1`AlwH}g@uP;1q=+s}Hh#Oz$x zAgW;*3NgzZMRlmk@#X%#=Ko>souX{%)^*LC>CBn7ZQHhO zW2SA}wr$(CZQC|xvhrWM+CFvatcz9E_RVOcMU1$JxEayk{yxul_3@`qXiTPv^GejkrHk-f|_{LzFw(mC{C zl6cia?GG2n_x--IXF`~YAdUM|1j5^y6@qKEE4h-Fq5qMOPX1Q<*c(odaL$3!lA&qJ0>@6Vc!pB#FMIWI%i&qZ*i(rZpn#;Q2$hI1pMGQ>7l7!EQ`p&_4DqsTeBc)0wK%!jBw+(R#d<#H<L{_z83xRF~))3JMHyrh10iEcBPETa{!c;M!U+ zR|dFsDM7OYDe7jTtwZZxkN`;OGp62Z8P9z zP0KzlIfZ7B!d@Cr(>5B{iLlwmvcS!bFq_|4W>`y7BRPw-4`S@B+b?q#5wRv`P>mEz zJgK_j;{@q@F!kt_Lq8T*cTCk;yxtGUa^>qw)H=Osg&e;2CN|;<0vT@YdougT=ivke z2jay__^Da<#x+UKI1ON-qUHA3s{>d{kO;>#fy}A~q3UMz_lwTGY)P;~K}`YQpt0l) ztb?{iz7RNx;|u}K+yi%OJDdKuK(_h0S;rDqJH`x^&^qp43{xtBg>C?N@9@6X__Y^D zQlxxQ`llrUfTt-Ptlravq8RX%AYKUh^WN#bYAyHXBn|{!#cblK>g{Fz zsQ%Sm4hKS6!X#ut@2d)vIHO<)udjVExZ*>O{{rQ<1nOrWq!tJnI%F5!BlV3o%r(+n z(;G#ZOoGNB68jusVQ*@ep|g;al_yKpo^XHH;K97q_;X|h$T&vG5Hw~dp9fwd-2toE zFHhs`QS9LqoTWuf9tdq6npn?p=&w0hOG|}%4*-c7$X!=7wJ|MagBpYd)epIf|6mK# zo6JVPug6uHMpoByXQUGy4IeW)Bu2$7#n&oJLn3$}H%=g4sOrCK;?t(QXNY7$=<|@B zi&auCo7A{>A;9qwC^g;BCAF$ijq=$#K=1ufscP>88Dqg?uH;Pp&S>`se~`JnUW5Ey zkH62-_l7(kx};j4Z(Ricc77!LmPr)pLV?sC(< zL{4u@bGh#CCmFY5hsM?rDGTVQqN)Ir1(N@%v269@@gT*6d=23UR2@DI8Q^_wEKG!e z1@Udbw9U4Lm6Y&sHujHIyjqL96a(|2&77De>&UH55&F3Fq2+sUk_LRGL(QKextw{B zKCXwL@|p;Rvg0gh^j<+Qc|@Q9x3XK z*yF5ah&9KJ+AkT~g@lAe;Ba^`x@&IdG=*y{H_qv&^(+h{mo%RQz&+v1u^y%5%3bhckNl9Ry2z z`x3LYvg144!rApr$djL*|M9g2^RUqQ>HSjA6@-qm-j=VwzuuN;+;6l6;n&}hr61DY zf}6qPFxeav_5PXaZpmF2j7nM%W8}R)a$H{^KV$+>63NK|k<{DO zesjwNQGZYg6B>^v3t?-|TY(aVWbqeP3#-~vOY93XAFwJmib@kxJKgvrxPpqPoOW<# zebmw@n+uAkTqbd=FuJ0i2l1|Nc;k_-u`RDecUmF1?qJ9OR0TGBlWJvVnSExg zL9VwX$b8Al*c5(=pcx)#flH|!i1mubwa9Ttyr5WsyH5editNQSAz&MpLD*neX@kgu zU&PFFo~(hf=gmV@mlE9bh@1g4SR^(Ng)=wypT#T4u1D7r9TXuA=K(~7PAr@muFPw( z_WF{i%Mf?J+``*fV}7=`rSlo~=^`;*TR(m1y8$^e{e2fSbvBI+v=igRqR-H%<4;at zp1>fE;51GWz3O-I*rR_(Ab|O0VC(=a4cCeEB-}k-F6>Lacqij--X7UpfULbOb)mdl z=muegG4tvOB3zoemw9y0cMmA)$Z9n`ifHasl+l5qe3&IXxVXw`2a?92Tu~VaDXC(& zD%u_Z*)aLJ1t;HBx;OUK8Ajic za|pm(DdYe^$iWL85lKHXQX=kn!t@3cqUq`B{)&X1gJT_@U5w^Vg_Dhv0W0iMx0WYq z@0khmuoA+AACHC1NqKEp3TOJx%!!^)wS742CziE!>6Vs8s z#@lE{YjiNfY8O#L-L`hAf!*R2-;Fg4R$%eGfL6;JxRSP*_jK3kt&>{QA2-`pk%KOT z+U;C6;0-snTzGOeb)9F7k{$ClIcgz(uYFM=WO(q*t(-M0e)xXDj&dzhfK?|zaqXU( zsbmT-xkBi!4cWYFGIoe{vY_^wQ<69z@bXNz{2)`K%+G&MYPq6?D_iK3jOagYHcax& zyT$kf~cH9-QqexmSls*8KF^nvN`4x)?& z8ZIfrB&^M#UE=im!$i(|4EA()=?zjKC%5|B!wzK{XKgyR(;sRWVhhgw8R7@cSLHBw z>ZOR<<*2tuv8~+eo0gCJNL_QzkMi$lyEoyIc#iDK6C<}5hzf68`0*_2-wVY`Bo74h z?^^^jn7-N9t10NeZ4Xf$7uR*NksOVfK*PJrTL`yAT#Acg1L`sdMuwlgfZuvHiwOs~a>VG%N3D&i|b_hyYvXh`V9;H8m?)&qM%#&;a zO9IY-W3w4HCcg1y)|P9~w~j>gpa%_>$`Y(N$cOO4!D{Oe#@kEVpVq^}MkE;KySKlh zYZV@3o?Z3t!XrevYhYfJPm#AvIaZmgxvhBT7L*HP-_cA|XGZa)NP=xSh}H(|7uFHR zQPOnqTj1YoFy>V`DuY$X(^R7opqs=-FgTu9ish(HyVSDTSQWFHd2Js8WCX%2rObMCq5NGh&<)d&P<(yJtQVwe1D1^aqD5p(*97GX zARgYUI58AiAkL|gLl@tjjsk@n1GTx@adj^6hLhCSebP-ATJBs_sd~_^$3n}&#p$1U z%4M96+0w5<6gy)v&fAzjDm`X%!`*?%?pX}dwqaSXd1SwJqnP5iDX_!PsNVh;{!mT1 zeron8d~OcWzNRoQ`d+Qd$<^%tmhCp?+ElU&oo>| z+!8t{kBlFmrfd()b_7=BR5smqnP`SI7so3zA?UQ1+@qCP z6SvP3U7^rVVSHfbIvLK=KlE0p!!DeVF0ElXHxlUgf#lab&B&o?v%A+Z{ zf#Zyh8CSDHTY}t`(#*`eNuq!zth`X%Xn`UwkRSmv%5W0g)+LNij3xS3T0Q~VR+e+U zUe@S}=SX>@vt9thThpi`mg+9LS!zQTg~O`3Kdr!X!+0k%?akz`<$k{yVCM+H<*aCJ zj7A2XX$D2up?h(s*>03RZB$^gB}Msy)FauzxgZGUALvYD+-*lDRY z41(!tC`s^N8)Dqq`v3#P=}3p+#zUjD@sOiiyqv%3LaZlKEX2(;j?{-$)m1UJf;ce? z$bpWkDPQMaq0=>{3P_UOsB6k`%G)pbaxh^qFEW3{4%wR2U`UnpPfppeIBpcV>$g2! zH{J{lhEzy{ew;726gFLZ9CliX2@8TM4Ja+$VyjUHzB<24Jw64Q4Ie)K2*=NYmhZ~U zg2&z{E2!7keA+$KuAu z%DG0lskwN2gJpW>4*z#iJKMj@iv9;fmH%G`-G2fgy#J%0$3(~cpG`#nG3ag%BX`f# zmr?AUp-4N;zSa(4dR+n?}3``qg2`Sx^uSODStcsw47puHLLdl;x_K^;*= z?W8nPKZ@Kt&-FA)jSErb)%rMk_@|xc>Vb46-z>U>^R&=|qvPde_X3$T!FRMRmt{d| z6JvZED+k*OA69ahJ{nc6lnBtw(_PKGvy#KhqS|_S@hPjh=9~P93N?7EkCt!#7+Q0B zAe#mQNl(43SYiW>?X&R_+gW>&uB_G0zoi{3)%dGYa9;_(8zYEwBEyo8%<&Dz(wSnMYADY{Xy08CMXz)L?(~SX(_$ zCHHzg7?nZ|zg~w@$-UhFp#E*gUYu9Uu95)SsNf7;6&MImW~V+Y5f&YQCxg**M~XGL zldpkw)>)X-+@125u=;>im2H1L3&=y4@m5v#p-v1!9m1l0#7xO8O7vE9c#S)Jhe2O% z=?NO~4Q0teYk@g|F-Vj{t7E7O@FeENwUVfK2Aa0j>2`HLPPhjE>LLF|gPvvJM@ZZ6 zUz&=td6JHRMU_V}LmI^2eE|RGK^DXF~iaq9|-PXE>gcu8A^ED?xHF*v~#cimKxm_jhbop=;vBM1l$Qe&Ws!v4q$s>DG%N;nNUb;fV6xUa~3`%l;~d56umc26G#Wxz~wm=X$P zp}Mv@pW`zm3apQ}ul>i_FCxsvanKkqhr61H79aszk?%2s*Rw5`8ViR!dkK59Aof}b z@ZVt|JqMJ0NW4N8(!lJQ*tz#v&-3LAWZ!p#k&G383S(!rz{;SO=vjbKn4O5)D(AQ9 zY6xah(Fg@lShQ0iLkSAUo4wQ|;*IV5g(0P>2{0>#)R9mmM&+oZD8Q2!VEk{GR`yC* zIS%R*+VzlCl(8CNmv2LI$?WCHMOAsi_~qKS3bqhVS~?5mSla_}n$`K$Tc|QuMBTd42w}Y(n+3E;4?L3IVGca_<(8q06 z)4_YsZobhCF!#-`ATnVU?7s)Ck}(OJE+O>ed!j0z!}sGmN6VXfh7^`>*RTyaxN0e`XbyQvSoY8bGa?!R* z@a3>kUzRn;bZXWr5U4>`GmM&AqoIt@c0dIg<9~lk8<|XpfZKNsf61VC60*etUzcwG z7X_doj9A0o4h2|pNFyAd3fn!5UyUKP9=VT!J_6jIc&dAoZlW&pQA5t@jTTC69)Hyr zd;~BOsEc|8Xxhxo9zsFSwfXhbj|0bGnM8D72fh7ePV(Ee^ATsoXqPB~)0yjxi58-| zcz+RAJ_Q@acXs++SzII3=BUxwy38Wm{tPVL*<5u4f3tKUSK0&;CHPi%i6@Rz579mV*C!`-)~ElPpDnSo16t>;{2c1W0X2LoOX6yvpiE6G8O zx!diX_{b<}o@c5oS@S{MCDw}!)?un?$@}5!hnk5LLd)kAfz}$_GN?&HC>y0$IJ=a2 z%mAP37u-*_X0nMwsm>tj->D}7Wcek*X*81_zBeqOJ1(8z1L(vhbj1~MSW@7Dt9>P^ z%6Vn38&l*+v7~60qv!EJ(L2jpjcp^m%|fM*fqtH3K4KMT@$sJijG6fs_~7x>yS%=S zN$?90jWnn^gO0|Gn@880`x?|EX-RNau2wlpao9HT3(9x)-&S zFnkq|`#$peQ(0C$noYUtsd3R!DL>vcmwN}Qp>U#y?0422SrFrq1iug4m3{x~lZSo( z-LG#dm9?MuvQjtc?)^g#V2Tea?qAGu`4&EFm+jAJ*W{t1SSMRzug(P9oyQMs>)0hA zIIrsIQ~uJM39X|Xzp^7?;aCfZ0EJx?5QFVq3sTThD#F~bIrFI3L-v?9O<4^xg0;7! z{tAXFycgt<;8uFAnBDu4UWS$fk&QhPMUp%SsOld@bA=^}T>PzA|D9EUol5YKJW#Jn z!a%d^tm5kfP$D}#ujBdF{R|8NR)b!|8SgHNj}<4~#nk9Zp~NtXJiK*p=3p|8iZp{R zN&Gu{VsT(LQ3$#CSrs(nZT0xAVD`^>F+^gac= zF`EH3WREE+*KppjtMI?5a+~Nj%_)iVdEzEv%iX}q_DU|JTt%7dWk8PVmAMES*Xn~! zVyBHK7WF&trxw<5A&pc46X^DZ2v>E%*X%pz7xTf!4Day7*^ulbwgUYrfk}CbYkvEv z0P%@c?{t#iPqDPYE0RVQNlERuS!02ZGQAaQR>UA?F-S5BqXgn7iIZB{RHc2fY4BLl zKSgo2oMMms+MPrX)*9DX;;_lS0EH6@%ONDpY?I7URul{J(TD`C1s zJb1h0V5w!DjI*pSJ|%fCKk-q(hZ!lQkLq!Y6@TQK1CZhwz zFlZ!e$xeVP2l4}%t^kG0YPa(mFT%)lfrAxlmal;X%Wn5@=n~y)SQrS|nNx@j!i)NY z<6XWhlUsst&`>Wi8C?x*=aeV~Bu!{_uiVt2%~UFrpd)tHYc)99W}D1ycxczMxuzOAcp-%+M`t5%a_wV~ z74s8x8H~miB4Qbl8gA3vY|*}NRkmem^JPy_Ql0=D7NOykJ*x@xjBYW>igQwvQ12Wg|7M)g|38dz# zQ9=a&adFZ$(|3Q+!*^0CZqhzUAuXP0s(u2^A%*cY-7}OG^Kz^Pb7DJ5x#{;3_Yv8P`|4-z&B@J@QZsR6~i6k34LT z4KSo&KR3Uy3YIPyyn>N3{l?|xYWnvpHQi!Ag0=AS%gV5vX<0?>HmV;*Q5WK>w4yj^ z{mSEsXa-1R%GOI#Nx6AlDERFc!9kkO4CAT@b497$X8p5KXiZ3sVi0<4{N?sp z8v~JRi3;kPCjuKoS#fK~ybzKJK^>YkFnWweDlcTj-}!~#$Mxw1&o*bmNK%^~d|EBSDPn9vG|3-#Y63?)tGbME2Ge_3g=c|^Nc|Gdp0o8HT=#>$`eInJsi?MaEUbTJ*UtCE{9BFb_ zimTUH-6&s$+xu{RXZ6{BrN_3GPL@s{lh2I};f2WJ&B+w{&(`txsWX`eTFL6iNjM{;RAt_DgLMcmP^v zydh4a%W1^rGcc7e3h~OmgkH+1vW6HwHE=*iO?@jq8h{48sz4kZd!i}G>l1qNybGx_ z1!Vk%vP@nxZd6$)-JrQ5ynbj{noASk++1*LMU~Jx467dTHHt_`VehNGHwxTQD3)!F zS-}jVfNgjiR>tlfH~UfxS_S52g2Q{E!DFWKdyPb(13br_31rr6BZDmYy*w7m9kW}f z1>Hk1)~4}|0!^@fKuVi*CUzRRt3QmojaOvD@Q?{IBYwnj#5AnEbh_6q-{S^2{hT-(jh#VK)uiV3!n(x0opAoE_^*#^#OV<;e%_WZC zmq*vHmZBXB=}IEx6wm!C;bh%D&kxrdAtnOg-lp&4>#Ez`;m^uEZ`R+J7h7lO6eoV; zRrdb~l)aP#G6LQCkR>;bs>77VB!s~DR%&)udUlq3beVVLwpZSBn(O=2o^9yh2Qu`- z%db&Xf84ftq|#_DtqH?1eXyk0xa?SWUob1XU2%b%Vgh5-A|XpRVV#7D;gW8i+bNuT z?+N{(`%4OujYOBO{miW+eYrR;(C7QDIb86@&=NQh9Y#|ot$+*r=bhIaXD|MD;bu!N z2gT$DX!>uixNrGGs|DPI z@6U?Wn-_*J7CYWG8#d;1?_Q)n+I!XYy^{%Di%G-U^m~Q%{t8ups+>-zaB{B9im2(s zb+%h=M!$w+_-+e#v3x!n5fOGINj6ml?vEq7#lFLAkJ@>O9o62x*ul zB+@V5IG=NJn};4(&%!JAAHmV21q=UUvFsGFEuKbq!^WfJ?B5UkVMR zev1RhxmqN?2QUu*wKG(U>*{!07Q?PT;J#APh{A* zT)4pto+0IN^!Rx1WTG^70diAhx|73*6Uaty8ck-$VJ7S=PL^#o3J)kX)JzS0l8VSg z{9mWa7(0{kYkhZ2H_uqk5=M8NL4@U4=#|+w=-5!D^)3Wu66P9BxfT zjVXDWQ#x(=G4kKAJSKhU1z3xc`Is-_9(dUrYA6=!&afagxt~&~exS(3`?e*?59;MY zAS+s>0-WObRl$Ap8gp%&`ZNChT@iB&BbsW7 zNCZ9!7BWcwCR{8YL#I%KKr@YhedB;1t#Vm{zPAdU?TbIZo{ebwcZwa`hOv1PY~C~25JYZ@!{*(K?0euQijw?&GR^;kHtG)Y)CJXJi}bmAtAgWp z-G#QDfhDVvTQ5UX=m-?rXSmCaa^n_YXbcIp32?xN8X#dCeOl$wg|pdc3y4l7$&{Eb z%@)T}$!H65Ngw1-|0c#?lyvCdBUq$cJt7I{2a%nO$1F~LdGl#o3U-p}-cD~kua*Ig z9%LXxu3)Q>kUCOS|M?9J6iFAWG^$7D*lj8wEz@6M9Mmnox&glEj7>9d!VV~$U8soV zhoH+1c~V)HXw6fqeeE{JVuj_7>e2zo`qlZxywD`%p$qNZQvR$*^knb42f!L}aIADT zPC+U)p=jgB(MkW@E9(GW)$#l}g-!#X%|OANFxbIMk`z8@-B*Y(N*nGVqWdahGH9)l zAoS#xjYc06_S9$yG9~_ZT$S=?yKrbKy1lp{l?uTrC_;oi#o1|*)PQGKS>9r;^5!zh zV6w`&j=#*^9fx6)zQGfznhsgrQvpXk5`p`q3qx}Ik+w-eT|0L8u|hFExg7HrA=lm4t2Z@ad1BJBp(qQ9PJ~DspQ& zFguIbNO<+W(N$(Kl+pvNf{aK6V9?DbToho`X5Og2hyr!R zG1>t)e(Of3ewYN%t7#q4L3B~NF5}*$$iODCamL|c{jzF~Xr}XCf5;y!#{@@F3Kw{M z9&)VDe8j^Dg=|_J^&E$1llq4ZPN&_kT+Sa z^&cxncJic7Nt~Dx5BZFO_3(pMd|$dU0K(7B9l7OxzBEaFBvgFrx2=QeN{(o7FF(UK zujF{MJVsfJXtLR0O07;sUL={GRE;u!8FD{U{wrZ}B9Ux+O&_#0rU;6No*LI z;*)8!Ep9Ps!a6K=$}G4R>fy(iJ9h`Nfzb9ZCND2kUnnxew%Zip3vwVn8tDq6+Sh2p zDo^B_CVpL^J(cD760X2Exs)*PGZB(hnDs%Pigq9X*s&%a5%vy;c9}&1GuMf4Y<0!+ zgCump@{bs6+#*#>6>~EV6FP=y?G@w56JpKMQz+iV$I$A4O7|HeFvOYtFB0WhFR7OI?VQi zt`d0mZqh;}Ze~FZvvo}NGPO`{mc~K4s{0Ho6Q5fSrPkWEWKe9k!$*#ZCw!}`Li1htt|q<1ayr#&Kr!hasO3>Xx|lmJT7#e25M4& z%MZc$4$U%(L4s&y*u(rzPwb|NSx@cu(yEKuqT#INgF@ArnCL<=^<^j zG_Au=^BRnuU1^5LbP-gX*VJJ=6`c^eo|QUA)zdIeGb8vLt> zwZz)bXYBSbC_w8|bnq%ev(Tz1qXLY@V5M>e*=b`m8;Gz&!tjTW@oKZYi$1KkKs5|V^Zaz;<~~8!;FJBuq|c$xw}&Fq zz6PD$w5af`Pq2l?2x@QE4^z{P04qDvQq%8DoPduq_FrmLd5MSyCo*|?gRe=CRhXMx zu7_a(7=0te6U#I~8Nj7}Z~Q0=Rgl?nM7yA7JygL**L=O25M6CR*;wfX0mUO|+OSHT z41Xc*gU*dq@5Zw10wrW!rrbpPSxivjH?lPsHz%d_cQ0kKi3GS$rX%;hpz-Uo4*z&HEb+f*Qhp`ejS(kK^+wg^RGd@ zgzGS;E&`F%LZjbnFxiYbu{9R5)%cpf6x29$-Ly`|ZxgPgkx`gfhuy&>Pr!pfwG#Q& zBkmBpnz)7{*;fo9tp1u4wsqoKYiWU&;@q?YtzZ<90nZ#p3u2d#9V-a9Vb`kfY#Src z5>Q&GwcX>=N=N@SELB9NXf9BY8E3!>_BcQN7;C1oQdb)CWGLUX(!DAiI_)wSZSp1psL?+Dffx~b2{Ug^mtZ~_gA4NNYb08Q-A>Hxwr zHgaRHP^yGv&#Ca&1tJ0GS`TuHASosRE9r}+hD)hBlM)Je@oB5}9Ujg2W zQ}RX8pK{pTM~yI_Qs%jh(@}^jxHlZJ)ze8mZjh>9XHz?y2L?x9J+B8AA0HksS1zT` zAz7>6PA+9@D%Ps2Gn^wY!8sp|9_f0)2P#JuT_As?hJiU`qFuTKRbt@vqB#;d1@?(- z#AdQ8v3c2g(O5*ot<435WLTxs*f0p1^S3ZYV$|<9$tu_%fdvkwtW%lb)+ejgtkicM z&0iMdKnR9IH|kA_HCEPF)~%!Msv&SE@1S*5tE|MOAmW0xH1I6&v70tQm=1rnf$s>% zz}fZ>D<5)-49cIGt-Uy~YYbxA##Dh3QRNZU_TIV{Jx39`bPixAN>4q}xw1Pba6sa> zg!o?8LTq)@@bE>94CEbb%|2Ou^7h{{ZT`EG2Lto}PM-W{AqgWJ{r}BVGBdK$u+y{u zP*gwJ2+I#n$&AO$z)r))%)-w2KbDgG7fwmf_ybJ-7f$(uQ2xM_KSZYpE6dM!VHVaO zl=6q``qz4??^a4MaCHoJ3`SZ#DgIzJRF$*vXvj{Nqv;Biw{UBJZ{44?j{|2~X z``^=$|LLfP`9E`9{X{kYBAEVPBJO`({lD_D{~mP3&iD^7Ct_yl_`|`{idgD98VMO0 z+Way4hZl8lv^UbXf^^Ni(zc4(7>56<{tH&Sife2sW zk%tfRWg(e;dFAX~(6mX0&ug2P1mnve+U*#dm}I*di!Z3`?%aUu>L?z0-EO4pSn<4# zr`za!f0kTL+^`zFe@>`o#9SXHo4$WsOnvMgZKilzaTS zbiKej=J+mU<0Qw*I;X%ssfvXNnaMs1c+mW^x|jg8M_`SO8+@t_SiT)GNxXVL?1%dG@^{^FnLOXQHZ5arOYnDj*j)} z#fnp(Wj~pgXGg8aU}Zs5pblkBRmptt8pWX7kziDBsSG$)i5+g=;74^)tL;#+v4Nu9 z262mdh4HM9-h73ZKj<{OR4f?b*%cD?5r)cnIN$wF0Nq$0k5TCzNt38XwB#RIsu1CLR5Ee1d(9{emK!bS zBhFKHo`#x^iYB|=UyrZ1xSp>8U0!aSM~bCfJPP~ngbKSRbwW&xUVYE1()iEc6YeA3 zLbbeRhcK~Hzs?&roU(J3@wYr6_iWZEmqAf&fz31pHNnsmD&Kj ziuS<1g)MchnexGZr0-)bn9!=nP_c~PYo*7qKW(G%WBaYJge1V&mtvY7?ZqVg8#@c# zf`%{OMbs>>j=ew$#SK2fO zPgO9~y%U_pmQGl&!YpD~czVJlxy&jG1YE#E?kgTCZ&Kq8wkjWGG@y%Sa4(egyOESR z*ktY9y4wqK&V)`B#-cd(_Az**X`NY_8*a}^r!on3V?9;fb4)F@x@(k4pNQ^1ZLPsw z3Us1_1t_flRWYB7g(-MjfB!A%aGDssSO@>5tf4q>;6Ok3&~v*&stp1{JqI}}kX2tg zGNLP6yelt*z)^xz@#nUJ8PV>{{H+m>bV2QbZnSLN%x0x5Zn>MsnAwNxi)Zp@cbKYC z1*Ya87`Ny?de>G}x7}GpdMK%LRNR9O>}9?Kyg1Sia)iehqj`X0&^OJO9ZR&R7u}^e zEJ>4!Kud6UNq=pdnaCfod5t|WuRYV$4u(z=B}1(Ka?(ohep?>YFU-tT(5{yDK5>O> zvB7BA0t4E`yD2RsnN9oDk0FUJKDpn1T!c{>Pn-wZ1RM%PTnytE_!d@n@@_G(h0JpE z#A$m@6AtyYFIAPz9H}>M>M!=*>}$>Sq`2?AJpzJ6@~|@XTq$5hC%iz9GZ?S-2WEmK zsqZ)9axnlkz zyI&E8dI0M`5M_Wk3Vnn0%bZMSy0^F}hk&27#akT#9AV*NfAlOT#qh<(>hxZN39M9p z)!0#bXC2UJqo)0U&K9LyV(MOB`PO7G$;uVh9ds#%muA~nU9znCV8KP{ZdOzjpy7Jh?#bwMMg_G*cR(0IljV>9^GpD^4NYg(N z1AQw3w`w;4^fS*`R014$i1P6q_(Xy5LN=L*dL`DeW}la88W5mfg|MfgVr>A!z$rL3 z4}AlGIwcY>K35~l2&}2%PwOH~KcVvB%p`_yEwZ}-n5I?bijLuXa3Exf*{Z06dx(Q~ zr!h2Rom3OEOmT{S$r3Z(`pS{{dR1A4Dd{Spxa{Y7Y)3S;PWo>+9kabmJSiO0enO*( z@$6c6sNc0#)!tJ(xRC_VX{ULZL+Dv$>f?ZZXN|rX69=QmB>EjuX=1fw*$(AjH%>9yy8QF+iSwH2TPZh>VD4lF!Q31FaCq8WSf&2+7CA$&ynE z1EkVLlJ9-`mMIE1y3F}Z9pUpLRYXJ_s}!2M>TDcZ2OY0$QRbQkgyEMc@{J=ruS9ox zzK(^v{+8SWWQ~h=ASWftU{?OT*;D6?E_Ghx7UK){jF8cH)466ZjHp|)Z7(;JSD102 zR4)-6sGAxZm-Je$5PyKiYf8{QbJJ6$vfdQYBBlQkY)I;rRikZEYSTzB)NjT@5TADg zQcAPp#%E0&Q}GJ~Km*UH+B>*hCsa4XJ zBGvQwlo{DRQ$xb4+&W}h|JewBUZ*18Cw^m@GN@E(@gyL!2zPraKh(VONphTcn+x00 zRXDn|kAt>9h+gKUbC>@C_c^V8!SUFVC0OW@Z|7Wbmj1z`C2o-X6xW%G;|fXDZXR8F zOOn@06j2eTbkyFI{*`etx{AnH-Bw0VT|E7no{DL1ikM^8GA2p8nqhCVFv~m4=*7WS z46S370^S>XK&G*Dg6aA+D&;6XY$-t zn|;DVngRNQI&KS=R8!*Ex(K$7;@iC~4cJPDY49e-)3tsmPxc|318#`l6(A*L2b`z@ zQRLP}4gQ|r4w+OAE*+J_`5pj%Q&Z^5IcbQ5FD*ZZgPeqr3aBP>j*=e94X8NYGVd(O zLLPGBw7+7ZivV%AijZxIQi5owH#H<4p)CS6@E`6|KxfZ8^!88>`gcc>Owdkn4#m6$ zu!)m0@Fhqe`>3A_GF9IiBbSbqAku2rZ!VqUXo6_s(S5 z$rpN++1-8()X5+bca};@%rkaUPY-{h`zHTlg&k3*{3=kCE#?<&4ihJ3Gstvwp?~r7hV|CX-b@gssb;CLQGm>%qOMG%5+U7 zbHu~7M0kH9-{FrxD48n0wE;|Pc3yI1{+a=`4y&iB9=Q}v@wTTr9mrP{+xv>e&5)j{ zhl7*|d6IQ5rHV&rVQ3Ca7-_+^K?%ry)o(L%S!(V*P<>YVG!o&2HS*f(*TPp+9z#ao^a9_ zsT+l5gR{%N$-3mxGIOK}p^>jYFd3#%Q3gFjeV3axqLHsrU3j`FId%>tZ66WXf{+s; zSrwf<>NSYQ?e2!-ot*0-MV!e6DuQfBB3)a$`?7q>|5JY~P+RWS>jN4C0t+Iw84!DL(0)W%MTzN=w zA}xJ37L?=UGxfKe)r7lx`I`2%we?eETn@kJj2!G{MD~q)k!PgE5^SZdojHNQqaIFS ztHOM$t^P%Y^1$v5Fd<0V;uD)2Di|@Xu6PSyPbh7aizw}7r9^vR zAsT{@we-0a&5Rp=Bx{JyIQ_Pk*fZa#Wi(X}1v)m^yxN^%Y>Gx!Le>0P>@g3*)bDpL zh3hsS*kw15Ok>+QFW_K@4VowS{;yA&jNl|YEZ!A%_xE`|8TotAnuAjiIe8YDBd8a$ z92K#xusO{%NLrDJj3V)~vyM8Hg1sm7uLK8uM)q$mIQd%ZK97#pCTjI9zW^1p?K@^0 zXx#?MBzdIm!$iRRZSN)3od}5J^sYInwO-Ks&D&Z>PKS!uq@9)i9$)lyL%HgheXU&= zh#X*`Gol{0O9UP>m~ySE5Q-x>4fz)&N0PvweW;dOA57Q2K=@;xmLwTrof~mWJ7p92 z_o}sT5V(@3q<ZRP$^Tr@g85&zkblWTkE}nInqr>ZA;&`p6@$Kw7r^kAybEo#|o%M!g#@ck^@AJ{d)X@a=jRg9# zT2s-NUQpJt(4k`}>mex9M6>pAeS!v#Mtw1}QtMMpHw7 zvwg%(b0>YY`V_3q2Q67`-044x>VX-|vfB=VGoN^gOYhT&#~m@<>UX|zmVR}@jr*;X zbp6)h^{YGyKw=lzXDgg;fuO#U99FM_5L$IP%HQc;4S!#bt@yyFKYV5iZ*IKZx9rI@ zHs*+)tVg=+EigGVe=MXJ$F0ogbauK;Dc=71XChTHjHHT3Tn!)zA2fd^M>=2!39dJJ zS6PGHQv81lVr-EzDA0!zZfjie%5f&Pe*3e|qfea8#_-~}K8uA9^q1qCq%oCo5cEN~ z$)yIfWn<6!*!SSCtFZf>W$oMuVb}G}T<_>-FIYkKk$@J!Zq+0K#m53T&PrjxU+MM6 zlzIWV*ABmOE{ss4DM`f(l?Pn_NjO=K8#))Q$Dys{e%{#y8dX|GKKmzFs4-g8Tt!6=adWi>WKdhnId!_~QgX%b;SHRC*&{9|&3xSml_{xAM1U zL8~RB$ol-5SHV3Mj%x$0nyE^r^&lKE5@}9uusr?3)pL{R|Dx@kf^3VnHQltWm9}lK zbgr~*+csC)wr$(CZQC|(?tSXStzEI>*0~j@UdF?WF&}!&5u?xE+Sk4x>%#4#q*H|G zBk^P>ETFMtH{cC90B4qDm}FX|hrY>4mja4q!7$)=8A1843=7e{Q93o6i`EZXV~e~o zKy2buA$5Q@EYf6r2Yng<{=b`G>(*hI^mV%_p>iw;j5x;~v*Mz+4EI_rWmDHasSeKf zFE8`-e?Hbsb8Nud{-&xM6!gf+jF*wD(*2%+%WOixa2;0v6Yo^IhHDg7Qe@~<1*C_7 zL0zd?r{PmtKz-aMH&$~1qb)sOLN{073kaGeF2DEg2uXv5Bz-1U($At?Mrh^fOvTQB znwP|)32`V*O1{z8icepo2;B`$Q@Z|_K^WMq6x6EXtftN(N1w5T!PT@qKF29j`mQE*}D62#e=f@jP zI?U8Z9i&=}nOm5cinjN7wr~EZI#X*lo?jxz1Qoqgr4qKPpbl+_S>;P)R7fuX#}C^v z;EA+=u`PAD*`f<~tTGIDJ!t*MDi3xZ{gixl7SEiEQW!Wi$Lx!WcDE$Rz!T{YWTX`^ z$qCa?iAPUOTp*tBgzU83i$|mEG{aPJst3smI)F)I6|MNqykd6iwqLBS6gyV}*y$$< zJufPP5Q9{kk-ENk-`k5W8<;{75q1=Au4@ZlQY&0ro*lMqfb zhYTef(ELv>ZjH|IdUgL~TBB$37f&5Q!ydj!LR5@}Y5}S$MbZAtA*Qm{Dn4@CTFrR6 zDaSW*fGkw5Ow%2?TT2_x!S7!p(kOCVM{)P$^$@-8<1yRr6*>XzoAivvie$nNCUPU3 zPc;JHs)*LNQx;rb3j<{fG1FonL)UA!pje>NptxPY$g^8%*qw~8uvtC_5 z07!y^#1$preEw+z394MZO4keZD41ahaG<1TSpp11ypc*}NNxJ!xTPPmc=mdNpb?|rLUAdC1l6`^}$-xqW~ zoG=6!i%~4AIV)D!jveszFJ3o`?KxA5746ZVto)58TRxz@EkQ*!$A@1%d(mT0T2O0} ze@r!kl_c|YQS9Db12A!CLENY+H~tz1@Yc_y+o?rlP`~NQV&|*)+YzD*FGnnZ;sdph zM(l&0ZJ>9+EnrA;D$6Jf&L)uJL~fGzaAr=Y-Z8xC*DstEJ|xb>nd7?oU8fa?IYZcR zF7|e>IZ>_XNIws)N+zNn_-g#pSSR)~a>)3#8xo$h`3PBE3G49wG8fxXnBM`u1^9?$b?=l4j9U(e-n1wC@gGgO4 zYi(C-pXD0CP$9}A$lxd|Pa`4j7Z4@|W1!Jzq+#zn_pBy75{-Ijo5zMdBb8-jD1o@M zpha)MVfl?$inY@MM&cx~8pE6S7Y|4|m*E{@8!PK%R#xfuBxk-JD@os;htV+;MM2I_ zJyt-X5jH*_tjRU5KAIlvprZu{quQD9tap1n%Va?!Qw{*=XR?V%GK$>S!Zbx*%-f27m+N&$q?bhf`)%_|TRU3{FSb+vj@M zQ(~TbTi%f{3!c-JHTatpHvxcNSc-FCxJRL@fN2Opx>?ht!_nF${uK@48yjl;%s0L1#_yGtqN583(1_hz~%ilpPz}{j;2T)qEC2vjZ*TkeVzD$&!~R@00DOPfao@KdT4Jb zXMjOV0EY#jzrTKeT;exB)lLCG{%Cy-7#cLlL~Rr{=%Yzooh5}ux1Izi2?}CX=50B5 z5mE|y0(t-19AnH1c*x|sv==zVc7H7Ed>zwuJI9X@t$X*>s#>z!cNdZ!=kyH?!HXsS zeLM^gUy|JU(4Q!dx0{TZ>c0PTZJ#|=t5dX=5>TEvn#(}ZL97W>u%mR*8@8Isa7Z#x zu5-Os>zJjXCuXVK2eA46F$Gudpi^CFrx`}|!ukg_kL-rp=KTiT$LEZ0U3Sq?{iq#5 z7l<5b^fw+PS(H%!S+f`;!Q$2@7HO(47M|{rVv3=Fv-h50T!{E-g(Tywq; z+Ki=CTqxAG!xHUh!#xg6T*bn5FOYU!v7PmBbb<iem0-`9b+`!EFz z3aVLn4NB4nH_mzrMX?xLfMvUlhPvQjU=E$T>Am)F+?V|G*2P$$%ryq^IXT!u?YtU(5ix+ zFT~j@RzM*J{)zI#+r>iiskR5|MqmmY;IU$vQXb1rfQ4|ooJTV7v0y)YKi@)N9wqMp zeFX1bbSm7>RO)a%e(X<5aJaBl^QZHyWnktAIXiQ08F?PEnhb#!`KL6PUGY^5WiC`| zK9$pZ)Cm=@P|iBiexT1~pfzgVLuagl4ZG#Nl1Z9z>mrR8S}_JZP`Av$Ah~l@DrcV{Ly{2XzE!mK+NcQLz3p)xVf1h#NDh`h)@O)~Mv-(%&(kP2X zE67u0{0P-rSr93-hoSUz5jS8-#S0l4hJ#!mfBn)<_*1Ong4is{1Fbdj^S>><7siJd z9y62O?@KqyQF-hRBr2Bz?EE9;>`@ldw>}k>dE;n^toIdY#+cQ2V(pYNwU|Vqiuk)f zX4N|z9~h=E!bhwoEzMGwcu~NqD=}^}U5r@Xp0KhhA`m@nX-l;x;&+t+>+;iiyHMdV zkw#!Bq1hNNk~>)#w@&ZXvyV_PX1yufSxL}(g+-6r&h7EhM7A+)q!4PxlxCSkDbKb# zrR(kCf!A@hfiIpay~oS-)a|cGJWNY9IyNKmsonZOGzqgzoy$AgW1rDOEp&-cTv_iR zuEH%5&CBP{Th<2sb9?y=MyLJbq`*VK^DFRkO?J!7*fN56y58!z!WQ%%@g`js|4dqk z2}=O1)s%4nRR)^vOR=vZw2y3C!#+6LcQy0%~c(Hzi&wqE8Wn}q3^3eWBeHl3zIevtnj7+pYePpH|!7tm7IrTq2 zV_>0WU}a=t|8MK`YcR9_heGpzb$|YU%|kG<{5$>U|5mZf#`-@Dra#}O{aGFpD?Stb z&(i*BHDzRGr)6ZN|8HE{zdE6RAcY_NfaS*%{SSoU2VM9978rk^1eX69WMKP;IhySs zkOC|Ff85W;^bd65#~A&u$buk0{g3IHkzYvoe|E(F2du#MBaNp2!4z0Ier(kLG(^+? z;0nSVY(G~)e%5~jE&Nlz`u|oK{@bC2e|V<<_o?AO58HpbQ~&w<{;z{3EdQ#j{!eA< z&-~7Rjb6}*-fTkj=I!2V5!T|`BJa?dnQZcSk|*Ye24RQ^uD~+~7n2(RJYy$+yMB+n zN)Qd3n?3SJ303iEAQXl(>3TH|n%fl#`sO)!*+r?&xW9Tiy4=mLj{JJsrPG z!O`({Z}AA7GAeMeDVeU!Y!+c^6SD-{2$|4I3i^i&ME;*H5TCAUAMfpt!11napXSU+ z!_{y9K=dz3UORs!Z9D78DwRN-Ma1K%j=C(4{$QOGI#XL&^pqc2MZXJp;jIe|%BPsw z>PN24T(;c8k2$rmGJ;WH@$x;s%U)f=1-mUFsQK5^Gq!YY|7`I!+^1Ae05M|5tY_cs5+vC2{XD% z%%75Hf88{U-iE45A6L;&)bm_t;l6FU9%Y`IPMY{9w7W@SArVtOpyEi|4^9=!;ik~jl*SQ{v!r;# z1zI`mxlOh@4AW+c>y0FHA~~>teKq19{T*SAZEHs2vV@0~`+E@-!fy~o%tH)jRK0eW z?pWH)8`90U=ZjfrY4vX{egX%48Whe=vcPEagS2YEmsl^|pygL^IOoNg3*R)r-y%&lJBiT&mphk+rR zyYQ7DhXHJj+~SU&;)&`pe$~l#F<*?d04Kij>gD#2hfzwJ{vDY19q-mfBj6l=g#e}g_8 z746Xy##k(T+%z`z!G6mpNW6Se@r`rgn%{{`0%_;1zy5X=u$=yv`maiEnz)z-R%V*T zs*MN)NDVt0w}gm~QnarU8;$2mF?NKAowXS&!~XUSPJ55mO&_hu;&$s(_Kc)Jz1NR5 znwt~sJ?#pSjRXb{9mq#fY7b!Sj2t6E;tIaJ#Cp zvXu&n$sJQ|SKsF)Wl+{Qq)riyxW(9=E$>`5iSIaEzDS1Xv<}EP7l>J8O4cy)NfpwP zS(O3KP<~KWjF7tH{`aS#7|0CnK2zXLL}f=Tzq>2h?xcq|w)K{o`azJ)ojDrLURIxQ znZQzjC+$X|dr!xyv~?e}ZoeC7lo-6(uU*6vx6gEEgvz3BXeEshoRw+XFMNq4=Lhgs z1adR@R&w&hGh|hSY17}{t>!8b73;&zOU^#u92`e{!`AJ0(0d z<5AjA@~0j#MugsCPR*TQ9ccUy<S<*% zDBNihzwHYvv|vayUf0?`l4-a}%#{Qb(=@tQGaVDmMLwsN8hF+fXT%M6iz6B{m)_+~ zrl}|Q7*?T1tP3;is+coqaM}PC>r2_HNpBnB`?e;j-SE#l7)f7Vo;HgF# zMe}a>L`~|c&M8Ymr5d1`JhBHRrhOo%qL;9clIxm~>ClZ5@din6sRzGSu(9>d!SLnr z3f2#M;EA(2-aBOJBXe5gfYu?>%4D$_`WuqNz>D){Xf`etAo#C@(200a;%vdV*;;41 z3wIgW&?}*CpS`1}bfPRd0@e|TjvUECSV*L-gi@aaK%g~{BK;Q(U+60c09ks$X}}g#8D8V;Wzm>B%{5OtdD_&ngq&cqrhUzVXkySr^71~DG93ps zCuqKE`5kQT>h(v}CZbl9{&8r!(MSr6Ik!|%9kiQqn)OmN^c>afI1lb$Dlj}M$G+34 zqJ*Z)^yccv_@f=sN?^Y>TMrnx|8`-MoZ#$ybnNdy?hKNg(j+*|gWvzU$$IoWW%3<&c8GnQ-0_X}nCQ5+lAo?3| z^wKJXUO660honM!t_XiqRSWYzm8IZ|9jL4VOE>&Lh7~XZ{EKcC&;)wka8{WR?s!w0 z>I*w-kA0Pn)99qv%JqU3iUWO6aDG{~*rJu0W<_zOZiDpf)2zM-l$;Z6QvgNNQN5uR zDs&|@@O7;%r90Tggi0A}^{9=veX0>?jI%N;a#nS^}=Q$sF8>dUOPJsz6KbjHI7d#6>}w@9Pa@#lt2KO(upK!vCVR|5u9L}3F*k3zT~>0U)`S)=n$#J|8x@H&c-qpB zgie}Qq~B% z%|vCP2;W&|ah+!@!ro%fO6EB!+X_gKU%gap+p`J1QWnfA)_u$#LAK42W3A7;;Kq!x4_~8!H znl+YZmzV~hxBYI90&y^41s}-OV2ze$FYy-w69V0G$#rA(xMF8tgQk1hT(&G2Fd`Qn z+UaKWgP={>IPI94a6&nGC>)HhIRo8sLYkxzO6(GUY$pZzoE(Iji@Np(LSxz=jSQ8I zoNF>$&%AG~2%(z-L_xccdo~H@p2voA)JGBGpoI>r+|R#8f^x5{TSTM4te6W>5C^(V`bw2C2Ah?HUp2!(_vaL;=n6yJv#6a7hIZj8?U(6EX* zsp_sKd{M@7G{@+)&^?j6ziRtR>Zf>(LRv`+hw#%g+NHz&9BLO;xI zFCnfa`gF3rTwwL*_2zvWRn;dm&@p4=?|9&Rv3PGOXyC{5GTL?1#6s4IN8*ZduAbV; zA6zrI(a#xuUtQbU8l=^WmnfbFKey$B#cG8$p`LuXzib%{Z)(42nroAMZoe7se{dRp zeCW5TyT%hRCJtU&KX#8*tv+$-aTI%##mOdJ-WxS^1MbXFa$KM8?QegS9#-;5bJzu0f30!Pwqns|Nne_dX?sQg5rqlI`Nn{Fk$`moB8 z6(T|iMrtRiqWo~zsJ@p|Y@4@LT;AL~i1r2V*IBB>7#YP%kd z!=0VFOAaOj4@BHQc{D%<>SCec@LYwrn(^c z4QLamzt3MEPJsa^l5Xc9gT#4X!%sAOfe!kvnh0m~eEIl2oJI z#4W}v8Y^G>PlAE`Rw)NtFYnXgb`wxmrl~+h5`)Voh#3)lBDL<3m+!%SMNIVOj?Y`^ zwlAcl$epw6Kys3|Qgc$~pvM%@0>%MSA5W_h(VCqD9lW$obNerM^c@LL_&JhAhT(Os z64yuQ_?Cnpnw-vuJ654`=}1^ut6^Xqy&(L7JlSAQ_TN0%v`o1qanTjLLx1}xsAL48 zOfW2DR{h4&GU52OCm;8Xi`4cd4aYdbJaee(b|)LU8BuY+V&q$pI4=EyvO-%4$dO@f ziqJ9z1T89bh+P-8WS&Kl-+H6~%Y1R$EC-}d)XVcUz`zX+<#(8GC0ZO6 zDxQ6j(*_vGyPry*YvD03W-qfqkERL(h>|@`E?){pVpXOtDHBJv_{j?^r5SAbil2^$ z#z2Wz6hHm0#YGX}MTqC>%EevTWY&v)A`bCRVi{+UHkxL_Ben2$2(-0`H>SS-6Q)!< zeS3ikH0J4GL~Jvc-Y;R#V-{?-=$fDe@62Q{8rfj6=`pqfzh$V1EGu#R)xLyK#Y9`5 z8-gtqzJmdKs`N)D(U?`Gc(;?R_QnA;BqY9@-wjGOHo)rj4PDLts| z^O&+u3@*A^a%jK5zv8oItN%>(kvz0;a6=(}iO z?9a6lj%lEvKU;9$%Sie=aJI1jdBux2P=y^S_52h&mz{GgV=R1JaxX_}sYv722-Edw zs3e>&S7ghvgrByV4N~Hjf$`|R@h`}3wH|VFIqePs$s}3cg`vClPjvpAJx|U*oL|lOwkl zRDx?AJ0^2Esq_FOah#>OTtFDy`yIOj za31kHvwcw+g>rv};w@oJ@<4|ngw&#V#RK*3dlRDvG=TtVx*bmDkA>xzk{V?2hK>{; zGx75}5G65a{%Gx}t{Y{taX{?Z*$wmD9Phr2rhaS*7zO>tVo%s3VZruFDYRBWZC%s} z&+tn1%!b2l7<*FNiu+<;@(Ud|9X zJH&z2aP_t2nFMGU8C}t3S8Jfi7vj4sp!APD%;z53;n%pf zRb^M68u}V)T8J7~jyc2wQqGcWJ1db&gld88HmtlB0GiT2?!-7JAyKr}9Tf}O?B?MI z`5^F*Ln58Rp&-x(?Q(nq76R*2wgdjVx#yn0)aJu;I)v$u+EkFwJzcIdg16rArl+o7Rsy z#>)t~Etok~kJigH^KLn|=cXvgi%R75LYSAfy6hG+?fSD`i@kc!eXJIh4^Z@k#TwK! zdeI=KN>z~J_ox0L4vQz*v^#@uVv5WI^_O>;FW&;d$Yp&@UnbRcOalIfNg{*V@ndO zo=0Q!JC63(Wnh#2NYfc zV-3qY$96NtN_ph+zM1>`wL91Gulc)$6K^@SH10Ll1*l*UdX*Q-R?A1KR;-{4B`BGg+i{HvmSZEw< za-nxwnFz?l}?YAr>b?~eZg!<~LI?64k+m9V5ysA%sEQxV=m=!fZ zOi;?fE>L@O1tfBv>rke)`u9sGMqHq=fbIKdm?E|nZodIS1v%*P4$z;X0bu@I3!Hu*_cBBOh zUqZAJ^kOCGR=%@I$y|}&W*mcpZ*sUsSm45Sv$UIwWJMbH@T;sQ5gB?R7~}D3w`#b3 zPX*!oZ*6lR)j^nBW0LMhix56n37a$3LNT)=mP&Ja#Qj-L#mUNBp=9x*ofw-ob+6wK zhR?T-AM8ko)cTlZOTF?({T7GJaBfv}@A|@nX*>h7A1GUS5Mh0`;iLK1%p(nQDQvh$ z(L^n)O)cfFkxTxOBzdB2BgcrnR;+S~bhU1$f16jUCNOX0HApuwl%Q70gdljVxB$YQ9MWO*+9t)+L6()4S1BFsAR z%mHmH#gUd;r=aG#!5UiGd^gHfXP{&>ay7@l?rj2#=pveanS|>$&h~()1z`u5RCZ3D z3CR*&d8tDtVzuTgpc+7J*IDZfS%2d`)u`%HA$X}-GoX<|NoCQZ{9Ls&@UQ5+-&(b* z4yQ%(Q{jEkzC@^o`_BM1laeIrTp)+7vSswaIX~zGn2)xaN(xxK*voULFj@9Kj(#LQs3S zCclv}g6}PzN6F`hzlQaA^>If1OAp*>mUXI+iz-SN+O5bh*D^?S+T&yIJ1*DW9qzX_ z7G2*r)!)}!pPnSnyxs4oXM?{l3pP5veVp#!#91pdN;(?luN_M&YRsSChRc1pIUopb zWU`_hIm_ndvZIbpUD}s*bUNK5r<4lrbz7$kGqaEm2EVp$Drg-nEx)79RNq%Eu6zMycN zc|L8Ox=h~-PaY^alf7IXv&)}x_(gla>&d0VN?p3{`V$ekOrzQOIW{$r(>b$L-j3n7 zyDL%gfNKuu`!h=#l;t_UDlTdJFdGU*c8;mr+W zHmNkIp%wdvXg{b~8O#Fj5$t|rg{ujCB+?VQ=K5nk!vk_fE`~i+uYY;;dEbOPAE^fslyV71I=a7=SCxZ=(-rOd#Yzn90}`MZH_hP&8$%R+nbq^ z^~%EAZS~Zn2&M4WvV)Uu@Izbz8d;8iy(KC(vMQ*7Ui46MiIgYH=(UAxYaX-aCBHMC zueqQj%%xhhBQZf~PW@|3Ho{HzTy{%cNbV#nxH)nqvC=`1InVWe%#ieg`#VC} z{plBh2#y&xZx4{1Rn_@06*Ti4AmE2A`I*MS7y_Q1(!7K?c$%&SR~V%lsmmjn%&3aY zU~eJVV3(+9+0a=~PvI#n4A7sgvai;5fy37mEqFmz&z0h|)D)|l%ET+fY=DLc;G)9m zC(RPszZAt+ovbQ1Oiv+X3@E36Fi9Iq0hCGr2>4y^dVfx@-}PtCE4kWhX}rSs1qReR zE2m1WkLn0{>l|dw9z&2`LMY5+AoXnf!earvFXcoUpL2cigAtnSvxBKMe ze&jRT+Y2i{+8m<)SRq{|8ty!m*k0E^V_uAO6~+iOf8vjR;S59`(9do+xg#W$7)#s2 zkpXea$qyLs&d#J|?Y6nFt!A{guUV}@wUAGu{or^Bs3w7)5Wo|2OMrs)nskfUGh)5F zoHhMyp_O@Fo&^4WXf|1}ZU^-H>cXfYa0N7A6{IFIqa_0-lxS2|+@;69-f`&=v9?yup1>;fJW zDjEAjMnM~-QR0Pr6#XcSSR~DAU?NB+G}hrW_V=dD&|~>~pG(^Wvci&teM_4olW{ny z#D`No(K?aPD8XpG;p)R0@7{AoD2A#h5MevN)Ugg_)xjKv(=ilSh&mu)MsI0TN--6y z*$cfr2~mvRuZ(;j`@fWC7yP}<6&SE@RSgfx+ps2 zS;++QwT+>gFwK53AGVS8E0z98!dmRnIDzB(SEVUbl4Z?ZMlE~cFbN2mJ3tANj!?3J zaop)UM)+FFqrNaPqS1=b)*&zKIELgSB+Be}qt*zw(78~` z`NO*cqs62{w>e4Md=qfC_pZ%sDfb%u-#*L4@lo46XGM7DmN7>t2pN>sFw^4MOIDg; zQz(hwKl`Ttx?57~Bg?2VKoa5p5{ZUG)XA%-NCU=*8n|~a;yF|d)^jWvM=?DH&+|A? zs~Uqg+pk1>%QiWbpty46DWp&xVet!T@pC5G8-#CN%%n4$;gnow(~>c0Oq#`d2+tY^iFX@sqa-+%QBmh zE?_dkjiS^veO9KH^i$7qc|xwN@e4Af{Xwx0REQ*rS04p+s}ZaF*3@HFoBg~On5KB? z#D)82GD|u6>BWlXs#25Y*Ur@L$?Abj<^glTPtp>8`}1+O&^gApzW@rtdqQ3mwZ#wn zV1=QR8$e6L7RM5Q*XDBL!KFzplI$Gh#B1|@ZNSdh1oka;Y;K{jUw)L+MsougjclJW zz87V0Sp7YYop#Jc*3jW3-`%RU5ff@KB(P3bprf z%yB5^ZJM`~ib3^P@JW}q-LTtIV#-d0fP^O#BPXRR1ZZ#WVcsh?1hFrMv1jpR}1 zh{o<(yYH6|Kb%gZW=khX@W{dhv83($P7|)-Ca>=`MW^f8z3V~C$C2yq+D92tXcE2U z=~WGr=+N8_kTfs70v(?mrQn1Ur(Wl`uVXx40wEEgKhv6@JXZml+kD$eK#pt@<*|PM zGNAx5u5d*LnILI&DO8v~XhFVF`RK?xEWOmc^924_cNg(7zcwN@>%t&&sZlGJOIGjY z8}=%|C|S;6Mf+j{o4LpedFam@u2heT7I&%8qYjd)-f-^qJNBh0i$?zC9t4saff81}+0YIYV@@4TSi z-+>es1xJ*Q;(i}cnS`sbAg~b=J@^P*bLhM?;)*>1j%mDNwhr3#y0Uw?ZCmS;i@?gF z5&&izLzsQ}Tlkxhs-iU&UGpM$LR*>Kl}`su>U*^1ZV!T#`Bl@jbiXq}6x>9ypN}IU<}epjKW0oh?#-$?7eO|{W1-9DS(Rq1o`!*xDVLbobU~$-Su|(miYSul z^z4NkqDhOZ_jL|mfJgapT>ukq&ebXS2-i&+wuq{T7;y5ydxKD{#ysc+q^&tM_FSUK ziTdcm$vrwv-s?WES7El@lbsT$<^@X0Mc(VQ#_-D8mYCp)oilja#s8`VoEkVmfI08) z({TEtg3NK0Xf@k$s0i8Zt=xN@cMl?7HV!ZOx=S47jp-BcGdTJCJLY~p6zQ6C*W&%X z{h5>=bVZh3_|H0`%OP-VDzY{%1G1KP@ui{(qI{y7!T(?;-%VZ3O|72(VpE$On5VHL zDUjn%=qy?`Iay$aM6+J$z^2kH@yBY;YzAcGqz3&2is0<#BZPW0dc8&c{WypAjh%Fs z7{dlN@QaV3R3B>gGpAht)R#qNZMaxAr~sL94ryY_tX9aP;Xzd6rr#Uf>Rc-N8>@E| zfVcKWx`m$q4x4&yodQ(zsKzN_V-lDlvSh_}&cg45@7}2U^l=tat>v_nhch=HRk}9? zBEQRchTRYt2Qylom&%R=DM65(`eCK?>RKa-_L0UCyw52Ge$znCCOT^Ab-xuV8R{La z585i+(Cbq8yqf+d=MC7$HVr9L$yX0jeeV~69x=7)4%%cn+GJwKB|=))E=I2#HmdX_ zGlPlp1%Nu3Tb;c7y)H* zGLw7qm3at(8y-xg9UIxy)( z5k?+03((Dk2S%0{A=xqflSr0#*-wIZ*gY5oIrM&

> z^wM3>V|Z*3+v6iKL2ww@BLLkr(MMff9W6#3S9L-RI=2!HovWI(*#ffdWWakBB0_HT zDh5=jeF;X}>1&Y9r-fo~7HEh%`}z(aGmYoN!J-qk=+}qogl?YCu;g9p0s$m(vGNb= zj30n+up59V@<}<=GRX9!96^LSQVv1r)p+SghUn^} zc`))96mEt{e6Faeec5UhwirHv;agDX_&4dD+ zc~L>3*e=QxlRWSJ2+2MLb95Xpf+XO=iA!L9VZRx4A3+3&sr4b^i}_|m+F%0;;{c|F zhFXVj2Db?Ef{uTg+j71hwm4WkwB~%ig_B=Q?yxD6VipQd+?-5q?&Y z(s?ZY@1>%l*4_0z3!lGf&g=;oKOIvU1|spu)>hZ9nkC2AduC6#fW%GWtA7sPZ^;+|K6x1YOsnfNo*|ib!Nj{#+^rxiqZo-zRnQq(W>+2xNA&R%Q zeeR0VMWwO*teDqQ$Gf@JJ9N}Y-`=J#LxOBuOUfp80Wu(Wg3>|brw7Rb39zoI!&dz~ zc^>?PMbPf{-JV_nK7Iv@FslPYuK!Ll#nC;Rp)-H~aU0_PSH5_zlphKUJ(_5?*HOZA zeaj0=+lPgR@Dc%k!h6O$4kG|vcXPs$GZ1P&wFq4xjJ+G_g@~3mB);=NK$Z3bwWxi_ zL^E+XJJT=khCAy+OvngFx&M)k0max^N+{ypb$xjyj%no#^r%J^M59|S< z_@hYjTr#6y*AVbAM8&>y9#4#mr?Sk??4of;7MDQWZL7ZeIp75?zwS%44)8^Ci~1-i zC=5{6FFrq4KN}lg_B6i0zKXf);(flR-tEHhAj!Nuwl^_qv`}}1!#cnjH5iuFnK~Tb z8sut7zrp4;#&A%A;x`w!fAnp2S@W?j{o<|cY^YKmbFA!Kk-K_*BmDsu#l<~co8>UK zE#!Bp3XR@{*$Ue8`&vH1PeUj!11yJJ*iZ{XN!ou)Qe>`v)@a<@LL)!%bgnyw<67Ts zRdh68q)&FU*?9Q=v~KYdPKVp^blB1oI7k8;44X0#)e1QlXtp?!d1j<%DMNtSgy^;f zXgMznl@R^G-=g6{Fwbv7d|4cNV$xEca#)GXNK$TyGt$vn6#G~?!W&@l69IJelSC#Z z>@(_KI4I&y7scQtfoB!EUlKCrDM@|dwOUaTd|9SQgHu7*5d`Sxrrs9^;&kcco=@G5bbedh&^<(|C)xGfU{oc5So<{97y&ssFP4%H=xjlVv>*870X z^tXERN;wc3-Kl=k*#6FDtlAzLcksczE`tyGV8Vb#cywAz1_I=dl`A5H&!BeAUYtT2~uR_p0Fb#=`4nG+JHYmJf`2rNxS-{_` zR4y@MhaHSwDyCBYV>3bIrqWsYQSe0DgROAl;r;5qrd5%4cT5}nYxh6yU-%q4XBFDm zPXT2iBr5@c*^iyLQZNi5U#he+qSP@Z6K0d~0bk4V;aSwk>QLfR_G-mIRdYEIb}Feu zTlEhR=nT^4TE~P?!>KXyWVH>^AmZZDpuMW9Okai_gfZoO+^eM159eKgwjMQrrakn9 z{&)-h8GQ8YjVt91e`!dd0e_~QWmeY#EX3`@H$q*+4Ffo_}+q(?50>@mBQzS8M1|63*gNxB>Os;_54Uj zy8aBDOc$bo8|qK(v4h@GPA9X4aoQ=5@nqI!{I)CXWH9Iy^=M#CyZzLUZdllwNE0)8 zG@c8vi>Y_FUaqTP{4-lFZ#xq63`l9tYTnQ4gusUnho@;A{aiO#B2nS@k#?7`apF>l zr4;8!MEMt6fa5}9JZ(e|eZK<#a~@eLo6m7F;7KUk#3Kpdv77GbaOWNCYVj0iFQWn7 zXk_WecuL+QDACdn9EwthC`}9ylsgCLgX}y-y%2+BIKR@}=Qm$!=zz@wau`cUO<-CP zjtg7XOO3fY24Vql1*_g2S(crs?t35JF(*uu$S=ZM&Z zLh|TJyY>eHUdXf}w9afwJp>(sH{!e_&2)-gIGMp(3P48_OPG-C$M&@Gz8Iw1!T^|q zqV9<(g6nhnCUr0>5_K>ZqTQB%^g(Y$HUi|a$;Joq_{F4+MaZb_5Y1;hiaBmwA~K-E zO@pbo5$$Oih6@12LyG%5ZF$*%8)$pe5vMCZJlX{^9xB=%O1be^P&>v_Gmam{cGem5 z-3Vin8ox_;KAeBF0@R*actoB-6!=hLzpl$HMCX(ULRaV752av$9&9|%ies5;cTh00 zX57e^f9L57Lm6A#mnZ>QRRxhzl4|Eqkm zuBDXPW4eBeDoMBIRGNFO8I&e1{t1oVaxTV&%|noQG@pwVi~sGGGt-|}iXEuqVO`du z;IH2CS5I5zm7gaeg-A`c`0*E-^8-x4Y+Gtul(dnNbGx`2_$xko_t3&A=Aw*Rzph<| z=}~LdCgRXr3l*}&@vJg;%T5LcG0A6bZ0???b>KA9{f0)9Jkfo_rY4F-%*oY8(x0NC z)$8R?4P==pSSYpg#AScJaeFMf^r*-@<-ynGdG6S_d6elT1W1m;JHgWaUMtn!Ed1e! z3Xr~V@irn5YyGJ8Qr{$EeF$UmXH@V8dBfiI%rM5)`!BO|gk-10uyYgpw_~-=FEuK2cy@I zbmrY=-v5WWw+e1-&9*ho%yy=knVFfHnVFfHnb}S=Gcz+Y+i7NIPIG%#-HPrycSoPo zaqFQY6id?5k`(bv5C52R%<)mIatE4ov96{VqS5bzZ+GPkl&+g0-{SP#H%YRh)4`tmnX4u`X@VsppLr z77~I3U*^6{znUZJ_XvMN z=Eg>%f|%rtd4gI{Ia&Y^tN5M7b~L!Rm`GJt>x`l1M-o(3@EA0fx%f%-)u)?GRH0)n zyoBK*Gfb{44wn8C>#IIz^SaDbmQ z(}qIiuuewC{1$nvriXCD(Gxpbdq)M zhQ#k|A8i;11QI}zZjd{AqO7ukv1*Ph6)3ldxwiPn0$-{KcvFD#{bymOlMR(YhDSv_ z^b_MGU`4~ni>z#f(_mTK2vUMnD+MIIf-{QO^IiM-fkBoeWlpICtr~M1zl#qpT}U(s zEwFJKS2q3DNb2VPa5o>V4cZubHFg>Ja^h{Y>D1Yo^ta~}uv>|#G)={9J=zkKR|v$s z(-q}8V8U_IF-KARkN8RMo8_&`qSKkI)r+KnsM@jU2#RGwfKy1Y_9 zjtnW+a~R&auQmGcpKS87PkL%GP&DK41nA5NqXUf^|4vaQJ31pMj>Bo{*1|q_CT@W6 zIYZ_x%^@uA_${;$Ug14RyMDmKZP1RR|D!BXari4t&sCR-oUzEMCI&T;U0PvTuA`J>u@+k*bPvGo6(1D55l2)F-!*!aIl&wsq@ z|L%+b%K`gM zH@quDCCR{9;KcKg+~5V*S2hAyRyr{m8+KD!(g>`^Tgz9|lBVy>L0~5X%DnblQn&rFIA|0mD-%K7S33YWl^F(N;=B1>OCsjQm5x z>=!~$;O}OE{VQVknaLmR)N29VsQ_@*5Edbj{vJ%LUjYI$QR=*57VF(7F~e(J5L4un z*v{r&k}snHu&~3(5}PC^5_mFUft`RA^~?RCrUUU06C_L&ac2`pC0Io?pvc9K)kX?R zM%*gSiX#3 z2;e}ak>yR+Y_KXNk4HgBvJ|7a+iP!G4yj=##0uBE-YcdK!j0`mI)pk>IR#9p1BW?w zhEMc?h*a*ImU@P?gO)~W*KG>P!FssN8Mk+Le_%SyMJ6D2Vevg(0t+gBMe9> zj&I7ci>iOP%RX07Pt;(N;*)uRWhS#)1EY#0Hz*YE0Nl^NolVz!TzHMRuIPp6iTilN zG{j`6WOYN->xwATBCsRUS9eyBW?|pVRkb(_RIFpXPEn&&-C^5QJL!t5dek@Z8(dQO z7xwbhNqL)*vCE0_%?e4F>bfO{>RnLqRO?cP2efn2m~>Z~f(4DnQ>*Xr4Peu#Tsynt zq;jaqGN5c=3tl(HGu_CdZZ`h{ZSFB+hDOb_{sXc|mhpovM_V!cMrkAk;4Z`pxoC>P z0L!&aQg?Loj-z=oU7fCS=!?X0CKoQpNC+s*dq*C~R3NgZs>oqg#WD8xjnaELX6f8t z!b_m8NYXH=KoQ?9GaX9$6t4Q}?YyM*N#>*0MI(u)pN!OiO^`xrvI?#XflzF_rU>lCr zpE;y=fI+7dY{@hH5&rb%4fVceR=_&Y1o&yT)8{7Rig-6z)pDVtxO?F?LrEcc`eN$c zsupwGGL>`@z2*-|si?G|2rR7@kW{DBB%iQSZhzt4&Q%H3AE2kT9D~K@`t6Z^x1p6J ze>sw{sE0jSacA@XvSqC^J-Sxv=0}KE15F!O2@U-1lKs>v*eiQ~WZkI+93n4`J0(8g z7rEuPZ#Hh_yn>l$Dx9xuXdK*E>8jLB#H@9@9vWh~i-@waUB5iW1?d{!X>-OecCUN;G zNyqahG38(cXxQoqXORK}Bw$J1n~vOM zglU(8e)+CTR%w>t4~QowvDjAt>pfDk4jv#@J(&P*a&Bb83y;!EDmNuR(iXR?Ws7#> zleg+moIHX+g{~d111MKA9E$5bU- zk0XC}oAHe}!Q@AWYX^AJHgFCcs|+)^I+inUAc*oT$ma?-aX3T4OR1^*u)LtkR-eio zP%sixg0TLl?lb6{;Mg+k!@lK)#~U>m7ClHy7+R_)Jl4Zb44_k%H2?StX z1p6s#H1YXcx(RjMiBOQjRIsU}x_5TsLl8LXg#P^f;ZV56Qe?e!;8bjg*z{HKIOj%A zKvV>OWbZ0Qo80TwZ#!AiaSbkgr*f5vh;jqd#+s_*NkqWkW5ldN*T+FaKC}24boVX1 z9_Wc7C=OduL0<`5G=l!aUv7W#9v4C+hg z3xejGHcy3Z^QwJ2F9`B8*_>JKzW}b5y;J{gTgbrjcau^7U8WB^Jq;TR3q2DaD+3b^ zI}_V?YSH%@Ru+0jJXU&E8aj5S|D&WLWd-r?{oi+9@Am^dGBYP9J4X&$T2pf;GiL)D zLtATF2WLkoYAbykQ(6OCTT5C4D_a9vYkhMYT1N*%T0=8>25LGcYA0hyCvzK9Y9}*e zYAbUC2Ym;3M`{yi8$%~^TN`~Vb0>EiYa{aSFZ!nKeBX?1jQ-k*LNPF~{GD6#zgrS| zmVcp|nCO^j=$M)581NYAnEw~PiIJU|<~tXN?my3JqW=f0>HEma`cKZ%zer5qVMff~ zF-A<^;YR<@5F-`=W;Ov~HhvLy=I^i~Rso^!KqF>>zk-X{{{lR*3$xSxT~yKEB|rTK z)x-akuk??9s{-Et`i=f;R1wQxAM?M-iNE;X|06k}wI1^=C%lhUh@@Qzcn=UY2`hw$tCaP zU8Ten7a163WA77a=;w9t1D`h&x!Q9WF>#)4rA4;G+&d?_QoE?o7X52rleWg9sWiWi z0?c^X?L11AWt@}NR=bMP!g~4oCWiu7*^a3*UbZ$f+5dOt90sYa>hPZ9ga{9V3M=k| z^ed&v+9PRk|A_PcRYXk~*J&-zD`Q@F1#T6$DDUQaOND;!QG|qt!X{gd>X%xVxX^%F zqJ{yT#bt$_bUDe|*e!oGuEV?FTbpfcrk2&?dv)bU`|_vgWjKe~v!2<84ryw$m8em- zMuSGn{lRBBmNSRL=9p@kFptDaGcP^NabiY$%ssnP^uyBHgQMId^?CEAo^aP6*BSiJ zwIIZm|mlLu8wp}&*Y<;{h97!lHKhd04X9<@e7ok5rvxw$I z%MK89pG_WH05oAOi=~Z&Ywv4xBj=sfzK1KcsFY!Yg>rTj}`hhCOaZ8&~yyTsZSHT zcU2XEi}ge6jP$+;v60=y-M}UG9otci?{5f}^BEa)lWbr076vsnz2rIuS6Y_>JVXX> zAR|mqioPHZSr4`(a`SJ6SdeBxYw`QB>H+l;XLGAM1D*9cyAJYO*U{>%cnX?H_yAvm z#sAiWhtNjc3dPo0nbNW0Cm^^&J)boIHK|3}$%?=nnr<`#@ixDxh-_7T_MBPS&_WF$ zXb0fd$EQ9(xt`TY*`3=y`k6E2L+%MpkC1ho4agrp8b**8FGcrT1MAT~)SuvIpBuT< zxV2E5(Vbxyr=t4iLWKsVF*D+PyU6kMN`MS~K(MN{Ett8mJ3MS`%j2&z5}94lQ8yO5 zDrj9@fBfcjw!JS*(>P0$bNap6tGV4N*T9q!CxG$y*@=oiL}Tuzfd&cB&-UwVQYE!Y z);M02r{Y%1wYI&>01B{rmbiv4z=k26u&3WszmNJ)J&`@8!aXbu$!rzt<@JGfbM;{l zgPUE;4sebP4s298TgspZl8eo?L7ytRva_wtIjt&p@S9lQfRG>=k#)G-1nN9nBpW}$ zTD`R;vxlC5dAXz9Zz7`j2$<@Iq{iR7M-CuSL7r_K_%0BnE>d!lTQJ!OY@CW46al4f zm8jK5%Rz>e{Gvl=Gf6MQK#1*ohP#BKU7_P*+Rb@ck4_ya9Y0}x&G7vh#MMtq@f?Sn) z^y-@&#ZeQebJxpVEZaeEz#?I*7Bp(n2IELfY+8;p?^OcfcBVP7{GZL2d<~3*(%tuM z6#ysfUfMxYhx){wN!PP z0=GL1zPPNT{kn*OCHM$`9Oyd^#1&9-;f(J+(T^NlnnXb-Y(mUm*KMy=Tr+s>hv(?Y zqAM64m5%o42ldcG3`W+WQ=1Q)+0CUiSb58=8fVrtA}hF7tadVBu#+S?dvYcqT~5JM zRBBo8BhUkdk(<}_4mvag5#o5zqBCX$ry6c0Vd#$!nwT)speP!2a@CS8en#GL@F0vt z)S-<$2sw6shtnos9|jSaBN8VbCpo76nrtnqFbt>*jw{^vp!wa$eH|nxGe<)dRsYn` z)nT8XGStlBy6LUOCteCh%dk7kjRZwvSG#~rMedn9-VYxNd>i&{kkq~whVC%<W)`a!d+6o9?ckcff$QyA(SMOzu^(ldP`o1pYf&t4jbdC z@aNJ1AE7%9jjD7Z-&Ak41c56tEo>)N$55)dKz6x@_A&RCS)LIT6R}2J-*CZ3)Ab4k&&54tAtgx0IFjXFX zIU)=xpL4#cs-lJ8tJz~8J}G7~KyLWtY}vP2`&j^A~LLRH6wNyW}vN;~~0=xLII zI>X%JesYe`1Bd1hO$QKaeLyd|o1NOSjLoDq$SHOc9z=p}i>HfVRJELx{{t|mfpqE(%N zpFq5`7)6V?J1qO?9@n4gD?)l?R_Lo(Uu=5m&i7EnOBcxJCF1YG7J@}1RWd#XftRdVuq(p5 zR`pt9o; z2Ld`C=r9=)bstFrc>VC=!I(1p0v^15eF!kuC{vOZK}psA$eU`WqVp%&Q%uBiz5%Dn z!OVTy#avv4fiD@2U{Ay*x7ws4N8eYqm883Wmn2;)qPLw^o`Mm(CWx9d&t>i50<>AAhA12GV*bp{2{?Du z9YSH?Dihx8>U^Ba>b1kANp_nb)p+l|2v7St^MjVaox?WGuBiUm(CR?yad3&La>KBjmh9by;qF@ zp-GqMpCz$BY8MLTQ9YBKBrQ}w1WOm( zIf2AgrFC~KMH+39;Un?|l3#+7*> z1~@y;&RaY%wz4QAyjq~8&wG_ESs0`WEN`I2$2Y3H>`{cu)@4YwuaLBhM*X7CV$9ah zIZSe9oc=R-18N+RxHHvO;@m`ZfI;KV>Pl#LUJvmibq)e0iy3M?l1_rqF=jT>cL42? zQtx+N?(^ZUtFP2_!eai383U>d%TMg!=)m-w4RhRvoslB;L`9spUQ724ICrfSYPrXm zpC_fM>Mi7&lk|q(Y;q$;6IvkytJIktNOz3dGH;h%12LiUj}Awi8TNr9WA_3~xHsrn z5|krHJkYg7+hEPvd+2@&C;Rz+@`d!l{IrQ+BroZa3#Q41(B7R`lAwtzzjfN4p?$ft zdah6xXp+5>_l5ed0wOc*IM%cR;-`Bhy0AuCQuUliAk$nL!Z+E3F~tSc(emcjHZ>3U zSw<6o9cF#}GPh3=P0R4+Nk{hV;wRrZo+U%P_185A{Rdz;WjCGs_u9|=N>zo>WN`e00YINeD{y1G{6S}P#&-u*w3yu zzN?4ZJyHAP6`g5M7(4nNu0!?~NU+ffMTh6(J(Iwh1;^fFDWcu0bp}(sF@4-fnCd?# z!g&iNW9f&sd&f$FNTC7FsW=oTK0Gxq)(Inl;Y7SSE53afJ@5Gbw0~FiVE^~zmH%|| zF3Vpw&;Reuuzxp){>z8?EzJK%>Q#Fz0kaLU>z=aIPAw(h80LwXs;NZ04x5pOyz&NX zl3mTg%nL1gAc5x7^E)g;0Fe)HX=oXP@r)pHP$7IWl@=L#HD#}dm*KrG0nsvRv)iZR zHTB&{iEt5C_HcL%OyG5h`qCyFO%oV*FF%56rE9nxj>-BA<|P*B&tBAVFCIJ63U8* zqqq>k?fzVZ!mGOV0au)O4L*cm0Q+>}(Y94lXrJ9$(Wlis>~P#lmf7LB{Tfy}+a|Aj zu0xkqFry^nL5Uoj`PJk8dMYCx4ejyE^N07>RjO*V4-zFPa>zL~aVBONSrQs;)swAT zNw46zN1t=|q|s<*ZsTEo z1(E6dvhsj-5j76_!fme(!(scAYj^gClL*t9`;eKl72%k;qrd(yEI#!%EO zQ4HGniZ>_{)TWR{7N_g`@xo0h#iVqDBAY`UZkpMX9O<*$LCer5;SDP5;|jx^0UR0x zXr$xgtr9%g5uFfNJvVCxRBu5apBs;N-N~}O1t>&EnYl8pc|1TCn3)?`xt7=hNw-FF zGxMZb&bIcc0B-x^9I5+EpW*vO>;c+EW=@MZMp|_{AoTEz?iTa0EDMHIkcNw@`g)dej}D5+?ye3-#Td~!m4J}!JD+W{R1R#PRzah# z{5nP9xiTG`0N3t6MwD{Hl%Ru8sy_R%M1I_lwMC}bcd8R2L}L0Zmkmae$s_kzDHAMjoAWl=S_}x>)+^c8Y3!D>KWA!Wglq5~5!-{hXO-D<5F*XXc0@ENY z$O}lXd;jRHW*Sf^SYIj`leS$> ziAjytlnNu3;;KExwMPtV4Ii|Cg~3`s-TA(Bx0q#H&w^L>#2 z)cGw-89v97-G$*e1c^i@oWw9mz0#&pLSKJ!Kire!e=8QRjWfJ2+lnwun0&c!QjM67 z@ila!bVh3P$GHKJ5yugA7LD^{eo;{g} zd&)>oVU^P)F1AJNU7Jtxnm^K1t9P$cGbQkG=B6c_Az0$sZD?fjOinqWN~v!6q#Bdx z_#{^$Y`yK8;!(Rem(w|%tBojfMR>3)m)FRjBO`+{1^H%JY~&@A5>{%=!Y`@dD1%%% zV}3+h|9Gipqy5*@qF;ohhANG5RxQM2z5ZIVaPo^Rp>g#UjPRPe|A)I_&UE7NiqX*h zX=9qBl2~#&n*a5Eo7djd%OK3_Oz8VH5mKg)uUaMI^d|9aaYcb7U!*u)yqM+wSS#T# z$)We(H%3II<<>h>g_eS6uV};!j8oZGH1l3%9PpOJ1kPNNm4Nj|YQRp{ZlaoRCfRb? z0DR=KOclFVQlTUPxJTX@{!ly@X8yTFnGDApHCLa7j*L!uB)+8=-aq49D)4l`x_{dF z(E_QqCj7FS)7lC?v^z|#kcgjQ43TdoN>jGr!ue$fd<a3ksub4iW;AU z3`?t;cDuJmtDaW9kp0Yj`ygJ}e2#)j_rY;Is;UdJ8&tSlvV`@}qYX&2OZ@I(v86%^ zkS#`JNO$`5um+C9+gY@J{FSC8iut2)vg4j{+e&=)4fj2#C({bQ-2f+VuJE^?=fItd z@5jKOWj7i8_Jpk(D%OICoL6GNS<~+>OaNOeLowO9qZSH}Veb^MQ@rl6=fp$dUfxIn zobXBrWAtD_SW;z3lG_N@ukXOp2Cr>{{yS)hUGczr1hmlFU$+8z4^JTm8~CN%pWHn% z=s^JJ1__i)OMQc|I99T&j#|V)G0%S2==k3Rn}~?u3*?KreupjRadt@0CqjH;<=Kvt zD>$glJe^5JdUKM0*z3_UW8xV{U#@5$Cq|^3i)8z3}_rAU1IVh`0sGS z+QYsfp3)zs&wd=P?NzE*AEqnxuhc}vPFdTW@$|PPRp>7k$+=N8X)#HXlOh(p`H2C^ z1?ZSChHrf^=O$C{*FWK#hJbOfC`NjK(Taw-^~nl2N9{r>&!vFv+xw1(neVKXwixBw zGY}zGa%<-!D%JXd^3~T+268&CV)m8^#o`ELS?b{CDuOYr?r(K3u)9KQ z7nr-z>CxWQ6o-P7&T^hy@;65uobzsE+NtvwE6wOLWGrjJjc=u%3Y{kVp&OOWH3smA z$OAWw;V^HcJq!a(JC>s_4m)RR;5iV8?dJ@aVnPeaR`G0* z!Q)y}D|ULob=+{b10I}zj9I&N&~^OWZyaGjpdo`Ic(2t7xt5PrHlz!W$wXMFuI987 zXknBmnH%4z#YcD^pqV~cja|Fhc%A)?+A|b(sf-eW zHZf&?AO}djH^c1{9WQc4ly~iIU4_#l@|mo{2Ezzp77a|uJkIzyUX)3v8Xs{hlHV|W zMplE7j+5p_C%5|e&It33od_^Q)+0SNwl)*Z`N?|)#R9dj*EUFOgLKcW?jdfj@i@~l z^%qy%C^jRh^2Dy<8w#zkVCc)b$4?56%&0`UsIDaHz&e~6y6pK$cd+Swoo>8gH|2<# z@xjpsSF4i(Q`5=u5NfHpgw5VFZVH*l-vwr&DWDvYtp;nKQOg0uoc7b4Dk_>3kn?tm zZ9A(Ni-BmR1}l)*AsFHoclbvOeZRp?S2$W;P7DCytqCJR;6Ezo{YC=RN>&wyy|x_1 znaCj-500%nS2&2>@E0R^9cL@@!O;cGy5ehC73DO9GxVBsS5 zf+F&HbMg@TJvW4uC<29OPLTr+bliR)q&doyW70p6Vjx>LmLG~F*(X|xRjD8|z}ky_ zN(4*-mnYK$8^k*krZU==lGCbHs1}J~k1V>R&gf;_asTQ)_T&<`aI|ue-?ukS@7u1Jgofkowu=5+U|d ziszAqL5V|n>`9!3mWVo|SR0LxMSlG`;_3Y2G!A@P$6Up5)(iCA2#o0u9Zsp#iOvvk zVJxtD`(zGLT6?d-B**6t7l}5g&`#;ikO_?vlAsmp5(#9|BJF2DUa;=F9e!d&@zw{I zp1}ha9E51)EG{&x!rQcjbWc2P#>qTZ#bzXTwF9w+x3fTPI!SpK6KH2N*Homki|IKK zz%gqiZ-p6#<$M@+jXOnp%d`bMi0Zg^{so(|yCMnRezajz6(BMKn4P z8!n834Gg{A@?#3{7XabFb$9b9^^0c@8xOa#RJmFrsVBT5(Os{M76u_V+BUN+rF%_c zbtpdk!`d4P$^i)_3<;vE9}>~mdT)lZiVF#yu@uX8ZZ5KH-<{EYwLNIYwCW)4AB`T zxe~(7U|IHc#sW3Z7md|-9sU9=P9LBAJEhCO@^_uv|E`(+-L3wMl=Dp^Vq*Pf5HT|` z;n6d&{p%d#U+^9VCWil`9>1uqlI=g6{6ct|3=IEBFv9z;qZ)X?r%W=y(r)$IOrD3jT+N;5Vk$LuFvaZc;Kk(GNU%gch0zqI z?4L80vN|?C@9(|rBe>Wzdu}Ns4IJ5zsJzxWUJa|ffOcsBSJHlMD1UCPIN-&n{G!OX zjA4Ws(#xm-t(<){u(y>)R3B-HFk5?Y{GH8Ky?O;2c|!?l?2dlKGq-E}=vLO$T1RTg z<`ldPy@3X^LP1#g9uIV{lgH?>%oVGH@z|5x;UC z3nnUdI*4{}wB6$T*Le;0c0f<&Q*XX@Q|M&?yihKu8sjduDhnu~-DcbI&uEwOe4Q7% zr8D5{=`>hVn-B=76ye&ViDTpvi`tVN*2Dm(8h^xSfTpT`AX1SF&9qicSrsf{^_zWl z*f4}}td&X3D`lwHzy|~ZlE(Y)MvYj*U;?8;vu-h9l?4A`f&nlBM&QF=K~%}^rhF+7 z^yn4r40W%BnuU2gZjEs?;r+rM5N0Q!?5P+IyhGKALQT4Dy#8D)COM&TBkE{H^`7>UJ#j_)d&u>!(K7Ma8Q&LZs2tqN|I zsrsOltW&8!V6ZEyV_fA$w9)7QQ6k!fH!$%fEJr2AHnYNNkfio*U4B-Xs!JOKs*%Mn zOvSIbKWCxM7Lckp=c1n;PonK6nA}Wz8G0(@z70VnPab~=H#2fW_*D3drfc~p%F+mX zRLV<<)l631Vxj+;;14Cnxlx}%kLM;mMENK!Lz)Q}&$Cv*^8Iy9xxqQ28WyTXGU^$B zU#LRJn)K7r$W5X3bEE!l_r8n?6jd_-nkBHfRx^{6AHBG|tA&;WNm(-ev<&|&H`4ah zG?;Gf9_GuWRVP5U({XqT%Qz6fwjoF{L2s>$NwWF#{W*S9batAa-gL`wfOqw{lX-s) z-niHzoSxE*!Q}+SdlCLZ+sbK$14q6u$)C4m+G(+yI-FE?Idrs+cY05fb48G0Pmqx;J5@<#Bhzp7$4Fkn5+0R*^+0PnhRdK`O-{~M> zUt=B}32IQ}=<$0;EG6XFjieCm4BL=ZzYau7(Zd0Y@8;y;phXB3(c<5BqFG9zYpiMD9Z5R@viY5M1Q<8~KUlA(81E5}Nf(wwpLrRQI;rJP_ zugt^gA<4HLEo2*xuR4a0m$CdSkGRL9)qtwr<*u^c9Y};ntIiHwtMz$+f-%rPNT>?t z!qigB`N3T!>qWn~F$F%&1)a4J1+eRMn19tum!4+q09V9fBp!ZQ+2j<+Iv5WZ}{h&{VOouv0f?o12HazU-J&C0< zy+Cip?(;fhD>oqFc?86toiK#WH!Gx+uv0D7BBB!b<2RTN*9*o2E`V7OW9i)!*Q)nA zCPa~;%hEV0bQg`a3uUW>R@R>F>(2y}Fe~U_$U6K~M=q2+ECo-y0$x3HH|Ti<7m%N> zpg%GcO1gyV_J~9|T#H=+q)oP~n;4Rfk(8lE0EYZ1;K>}7_>gDF=sMDM3)nNy9!Ujy z$T6}FGA@lceqh-4jE_|SdI!D6c_+teYHeG?>!uBrNZur@9cV$)ERig|uN~yf?~X`S z;^~JC!=P_kZ=BHFn1&i{Xw)2MNo}e8nblsOy5YH~^RC&V^~jDq3I8TAGLSQcJhQ@L z+50+*9AoR>5UxM$tw|l@ihc;w6KgFFF9-(;+ntwiU+=E^u2;*3GQdR#k;tWuze~#s z0u8HH5UmqOr6!(LZsmeR3DWc@=iyWiboEeI(ANkkv0wo6pVJ%N1Mv^_&c%wt+c?md zorG?3`sNdUuBH{$=Id-%8L&aA==pa%$&+mxy!9QZrco8*HrO9}jYlm9PoA$0xdaVx zz`~c_yA>^Inm157Llrgv4fTH|z%?3R^K>961X@SUqzZ5xu(k9^*!RJd(|C9g2-zzo zC9@g~BP77w#6K}idnqTS#}4XoBIk@{6XXms&hQ929y+cdw4YS! zV_`~~>aPebDIgeLt2M?>>JIFl|NJ_jVewnQTqe6SnMkwy6g-|^fSX+0V$p9vT?c%_ z>m(l-`oX^hQTl{U`UP?47=Et$r{leM=a12yzStM`anK3 zAw0ez**HCSM}gm8a-wzYKagVseSGS>#ty6Olr$G!$4ev-$A*@q{;&3ueuSJNnI8U-=#8l=Wg5m;C2QMC|SY)*X zxEY)gWgoW-$5+^unn2fw#T?PbbYyuf7C+_0LbOGNN~wiV0t~=`fk9!XTp>kKH;nrD z3(IE`u4x&7U~<@wn#%* zHGd7I+TJ|pOvUm7Zp>gdeb^`p!g#D$>)Kcp$@zNLxo0Y}p)b*ga4U?c3>E@)1^YMZ z=sXg)Xp`9Sy#t3-$)Dv4^IZ=tSJEK#JV0pl1~|P7=3f9vZpDz70so?;D>ZHUZ7? zxBLS^0Aka;%>4)z4GG|2Ouu-#HbO8(Wu|xY&zf9uXIg$7zB+h+}f}ig5-o-P{?Y zBn+WMv>jcU`MmJGb!{x?amAgH%cXbMbu)@4KY;ov3^5vCzJ9MU#=o^x58;pSKG$n~ zN%pa326+Nq5SWLd9BTn!+aACK*1oi9Kn40Wb2j_Z*h>wpxC~m&c4f~TEVGzyBve=j ztd>}Y!a}Uf!W`bzrN)L3CwO%Tw5Nj-d1m)^lw1NbFSsAPUs2WO#wS z=n|wJfs=%F`dg0l) z$5bJj9jc^IgqK^ghWvM@T?5=#34>4(ersNWI&_a^J z2`y|Va5oG)3eW=q4z?;cfs%#_#dTZnj=Nc9rR(^+d{4yBcmedb23_{>1rv%X#&t>k zk-H~N(}}w$f@{9RtPvAd>f;7hLhzbwFI!}HtvXznHTpMmr)&EC?YXpfgwVUT>0juc zWUkGhR+rkZ_FW%?1ZJ#dnr_$2KAw#+h~-0XuYZO_>V4jQHnHumA*x%yrH9A_>FsVD zRs2ZEskH7}b3y9Nqfd1rc@ywM?ovUEs!>6XbgI>5YES5ZvS8qY0(J;CNwD%&U4N}} z-inOf!dugJZ=BT!TJMp!hf(RTEoTmno-?dA6!b=pzB$rUcf|!9`>>VL!!~O+uT8Iy z33G3TQOg0M06borx*QWcygn0hBR32PYN)B-IK6#5l3j zZ9OOEP|JQ%L}KWb@Lu}__bKbPQ zZbvb@ZWygCFkWi4(L`B_)j~;awX2I6xlVS2!n1WQuhYbZ-(M9c%5EmBJ<9G&EuO^?z3@U}FAPVSt(CTd%XR z(X-$&e-8n$urf2?F@Ga}*%_GsbESfR(tYU}>HcAR|K|37vwYcE{v!J_ecucH#r6F* zy?;B|zn{~yvi+O&ot2%5T|}6fo&MYO{(anua-T#`LU}j>cVf|}~=o#2)*yx$Ri!IDd z-y;O{4D>AjvBJv#e^!hA?-uJnI6&|}1Mqy;YyMei`hM__tgQb!kNoexkbli1v#|e< z=8>l~J#D`uvA@1}hL)_O+9g&FZnVj0u4EJ{P@EGr_`XI#g%5kFp(Oc!01Eebhi+)o zn5J}gB_@MgU0S@L!5s@b_#|mTzdvh+!`B!ed*7TtyH>1htKZLr`o7zKe7+^C`F?%+ zJibCLD^%O^R5r6xvOhWG-!DsaE$21#mp@Kzo@MA>2P6C;3}uC}W$t{uVX5iX-u7y1 z@8sVr7vTCWc3(Ca+CmLhHpQpGMmLTWIiD`W3c54@#=?!eaNk`MPqFYZ!&ez+{0aJl zUU`J{XBdqcc^0!cr9st-T60PkbiXG12a;v&fCQnT2xTxXuIidz7a(>;qrA89Rf43` zMQR2A_h|0LeI34D9_cMMNa3Zk}qA5XU^S(g=g!&lSE^JSYKi1fQ|_ zXfTR3-p6ewgBVpK8M&Dx9CeQ^^ADO&?Z|Y$fAE>B_UH*QofG|%hr9GcyPW8!VF=GV zzg*-aQ!Zg?2e4ZRt^YJmUQ%6@^h@x`yp1z8lVs6dMo*M#R`}sV=Uz=E=|ARqlO@g@ zLJ#0nuP*yoN1As6x+I+~UL_tP19F;$zg!r$400ksHIFktA$7u}CDl~8BuOC7gDMQ> zBWx)O={S)s>32Fd&weMbIsA#G5voxWT0iCN)mgFLKYOlhlM1=LT>P8WeBDPj<;PP) zw+&i!LKfV#Bw6%P(yYR6NLnVFgmtE6elV3Y*>EAYf2b&D%Xr<5K7R=xDL^zG%c7%2 zGm1)I7}sdvk$?r6R0R#hP-bVl(R(?6-*1_4y#XP8Y+PSF?{i1=OI4LrSe(%xSxCr( zhUS*O=e#JE<@0W)Z~I(fXh%6`DBshdTW(H12{qmvxH*X;&qZ{@^F7GyTqgKD_FGAR z+y|U0uQQo`#?W;OCi5=7mEXDftnofo`uJcy60%wm?SNs8|2cSG4SnMJ!@GFqMpR_4 zqtXu3mvn7Pp{d->RmW2k(MPT#W0~FB3TUL_oyhnG`FqDXt}r9x_W}Uo&!P>8FSZp zJ#GW^0d?r4On-?F`?v`1j_U6TTpKc4rBb2On>w(6Y##1XG-TfX0 zbUft~BVV3w%R&~qq6KbO88F#%8C0j4x=2w6iLhuy2T$^(-w{lq4Qh#?!9?Y ze$hYOA_Q1qx~aSCKJS3e?H+2!F7e%{*7AWbgOV^NTF_1}ejiWmCc!}kGpJ7-DJ6nQ zbWBfkWOqudi?NgAw(m6EK~pUs)Bri@STgT3TI{6i5U%Q)^HD|U?MX(`3B}** zh?a8h%86!B;&+XCfY|%B0Bn!6?72p;UP#ipXMt39Fw0 z)PFLnK=3G82*)F@3g^51+FeB*&f2ny4JA+6&3e zLv&qL5GFDoZQm%b6&8Q1^hmnAiNM-H*fV8v!L3x z4avn=_pK?^9r7j`!!=!jb>uZ0oHjaOzT>NpF;}i`678DdwGIWG`sfP?dDtXc^DnpZ zit$ONN0LY$=WAheE|V8YaU=}y!&A%9s!?xs&d@hV8QPEquXYLA)W2c%7T{&qLh~5pl3CB_NB?ufOm2`O8stco{U#( z;v5RzRhdSW=U49}p9-)zy9!h3>A4|CVRlW&rZ3_zOH}ja>ynQryA!QWBCy4Y1vAv? zp6K?T&R-yIZ#!NjQ1x?@_=~J^MYqVjHfOq7laSIP87o+V-iPnaNp4odK{D(Q>Z$Lo zBtiG9S&(F=aEdGM={%pDSl}L&rDbsk%`7L+fak#305azY^m|-$C9qLd5x2Cbt2i=9 zqjWn=se#(-#Zlf~Ry!3M#wp(Skt54y3zL-TiT?eUFy{IFMM7GQi)QO!ZN>tW-9wvs zhw0ZuFM7dB_n2_;@?;-YsL6tj+T9%Xlqe9NT53 z9YDA|$jx2YHhw^;9H{>W?o_Um|Lh+AFMNrdaBeqa&v`EC9}UkjHccAGJ}7o-rn~j0 zlt_18_M*_JZ7n{tQFQeh>G;xS2&oZ#)2B_zjY#{{;NVB7W{gvb@}{KU91{~d7j^Y5 ztN%x^%ak9Zrve^Q<`^*PaMLllt~ke{tkwo0BNNxfruGB~r#AbEs!NQxW5YeYn# zh_4V3E4KC3%8-8&AZkq8Q=#JNlLq1DDznSU9%$3#2=~n2tRb9svHD+w??7-A2=@RW zSc#KpWCv&JHgrT8>IDc!9kdFlU+MrZF--I>N+N7pFa>24HVNuT@^-BRL)(e(Flwoy zEeB0d=#p-wZ(VjR=IdN!f$JTTD2eHe9jfn`k!i1fqRJ)o+DW7+r2N@v94+o0?h?in@m9PhpJ(yNs z`G9PVpCio~7`8Vf^|YKA;O*)+2@0g42a#E5oL9gB@j!$TcJs-4wLCm4hBIhhg!i-A z{frQ}FAE>MGzrQj&Nawy+1KFHnaiWt?$>wE2XsN&B~Pdu6~7PyHaE4vweJ#Idiw@E zlp_E8FV=O;4F7QR{O?-q|8!Q${@+sn{By7WeNg|AkutITTesSmx>HU+v~%}8Twdmv5%voHYgBn<7kQh6DnIYb`d z!%Wx}7{xM>zkkBZagt5ez1`LU9$<6CKm|F{3=)qqqLf9JdF;}o@)berF&pX;X= z>2qG|lw@3HN_2sfG;$&~+vn(x7 zZ`N!vBi^`Brt0W;iWoZ;CxDBmH@Eli{ipBR4)O%}$FJJzD&~|hc0-~9k*GhmS!yH0 zcEh0!j5bR(tI99caq~N-g5${udQiJ8V2HKqc$;Q~5wn5Vf+V;7-XWF(Qc_cpo;F12$FN}WcWun%@7{tv zva5qDg3*v>-8$jT4943qX#cYn%egwus#0#>(v>_8g(k*u6by5@GS-6>e7vcLzp7is z`=WD#n>ul#;ex3aoc^?ViyY4+k}bqY38%CpCq*f-A=wwc(@Yc--#NOFZwhQkv_yO` z_*Sio9BfBXha$FW$U>@@h6wYKvK-AHJqF)(o7~T))SiXKNorR!PqwMCnA<8~f}mdB za(&1eyf23HN6ve*QC@w*Mw132xqS_q4i;XuAN0VGWcL_9DZ&w9S^)zmXUDzXu9w;MNHbBP~yXWW&wYi8&hOm=>-k%kK z1tugUpJXi4$~kl9|Vq^F$m-cC;NK_q$>l@&Iv zhz1IoNDj4$#LFHFPS`4w>=dr8H^J+%t;fqR6riF8O8fO5h9 zKjE<#`g>A=Sfu^z=cc=g0Nql6apYn}+G_&unxM&+(gam#W$@o4~o`rUVg*r zU?%zDw*owHB`O6^`S6JO22o#b0}Mz7k}8@D7qjhNe3S z9wy-tFo=jBc=istd!PLd{Py!?McjqRIe)2xS9O?gjtox4lrkagNi5dan-&u2(RR>U zUkqS&sIm;_YG?_y3NtTNnXB}`g#8|-8CrYkb}zha%n`V zN(jSVyN)N<@UKwSELN>FE_rcL7$`p(AFF|*ry(xTz1|s@dAT6?Tw0|ND@3^emEC3A z@;z}_SK4?;?*NG~6ew+UJtdwQxAufteZRw|E>savO{myyH&B4Yf`u)pIz|`HxCRu{ zfx%d&(P&&BE~StyfwDCM_|c7_=k;xlJM-C@!I*n-aDR~?(dbei#Gydy5f$#xO_uSg zsD6Fy8weLo%gH50dVYD~)xA+Z-hIf_lBnh%MAM6`Q>JQeE~M@pGM z2xUOQ1Flmw$A~e=^95p;3z_uO)7>rgGJB~aS{BX@C-+iReCR56rc5iH$dSelrSo%^adm!eqNaa0;wW3K^s{M&Pv z4=$Jz+Cv}M<@kWjpllpQuBsG)BGC4P^T(G*q%u1A(G?Wn4i*t7x31F`6zil-Rspq?n|Tzk{`Fnh-S7(V3Z&m>CY>c!Uw{pqQmV4z8^*?lMk zxEnC#JsnVrRKj1g-dyAq|NnRxeM`@1x+w~_<_rk=P z%EsNwL?=tHl@BNBj4cSDQkV3V4_S@IYiC-akC_$H9c)r^qBF~wC9WzEx@=dtO8ewp zHVR?yu~~VZ1a9VSXOl#ENIQr)!U>bJ4@*4P{1Jd5hwNG4HS()d;=%cR0MK%Qr#9=7 zYKk)rV@2w~_k&)v1+)P4{cEIhgjvz*mK+&{xlpcrLoTuo*{e&&1(i8s&ID~B+Dyq9 zDR@`;2z0JlJyS}Qa%xwwXa{tu%b?cVd3-YaOyoXkdY&|uFeS3l>V@E&sCa=}f*X?6 zd0gh2pX6>QI=zgp63ojWw>g!vWiV`L9-Rd2vt(g*gK9d9N&Vn%9q~6KFNdv8>D#W@ z!Y^dElQ<_dcul&<@CMEL!EQw5oqv-cIZ*{o8k8F&%s*MtL zDBchdifV1SB{%8vqyLmSLz|%+IkwHLB~ADMi84k`<`C5-6+*>JgAkx}VA3Fz8#7-u zMT*>RQ^rgZ9&`D)dpd5&JcmhawwmmC=lcRQ#9Q90pTf6o`-Wsr z_mKc2Q*i$SQz;Ge-_GJCPlV5=AYt#Z=dBkRKZ+SyG+;yYQ99U*+5%C_I%-VsPBbAI z3B8N|)j3h-wW{*FGgn4nOS-%z8k@X+Dx&Tyb!k0hFd;3|AvA~6oZUHd-t0z~?KfMp z7q;A}swH}N}kwb$Dfd5zYP!;CDHj#z?~v0C zR?X%TdbDU|mn4p(3l34&>&8|6)Rz?05|O5gZPxTH!VHJjCN#P$Ao(<$Y-Y}Szx5IQ zqCJAe%?v<}VPo&2bI006p6@UNY&$}-$8kiO(k}+Gf?`u7Bq!d#BH<@+1$j?{`zE}K z5+Qa>3v?|-k|$oz$1e>utr2#XcekvS46fU@{XYC8c>P+*ImygX z+S=^GW*8p_Y0H?fR;^CpHF-8Y2?Zz@ISgC{%skQZF9tlraG;>f&A|_DPZk z;WIHFArzl(BGV}*wxqKv+kSrDZzD;+NIYI#C1;0>D+-bq49@rJP1kVeh1EHG%18?N zleW)4BA@(XcmT5<+%SD>erF>8@*8q|S9&YlzB9l7nT8n zW$spTmGm=yNU&LUr*w$UfIUv!vzgohm6AACbT2!p$;;I;X~`c0Qu0#zbH#y2-oj84 zu(}4p@J~j{^Ybx}D|>tBh$YmP9Vw%MVtY1!pD8J zy^#SVzEwj=MQc@0E4kQJRbK&5=MT}czx4PIXXBTU6nLeRbb)`D{6i4tzLtUTh8~?a zUj1t!M?BH!Q+FsMP@a9R7IV3g8sD*B7q!Uy!Mvi4Tdd!OliEb#Iv|b@9p!|pYO|*Y zeuI61O+me@{)+_}6BGM?N4mwt$UyfK4l%P6uragJu`qKo5-_o{{Ks2N>~zfRYz+V3 z#9RLf%4KH$hX+gP{{@uG#QxtgXR-X84JY$|IxiOXf5e7N%xnZ~|KsQNzcMif=AZ14 znSuEyFJxn86Z=PA_(MF4u?hcdv;Aa>Vm~&m|Eo5OMMy;GCn@|#F8I$+h_N#~9aw)N37zTi$^ley5)jvicHNhyM?qJOr=x`SSErLhkWt zF@ATa_h0jM6!)Hfp3%Ro$-RClPc}?m%$VqMNjB5E$n9D6eSZyP3`Mu!D)&U6>af{b zEWCc2=~>(419wCuxN0hGOY*p{@kWP?39y#ZF|CQxsgx2U@5R~f;s5I5|N1QF8xWO# zJ`UBer(1{D2)}CjjsmW7N^mY*bW~l@yK=Odq25nh?0nyu$?KCVFqVP}q_1^X+U+Dd zm6s$vL$*zP3V*ni)6XjBa4h~kB|oA=3c~yzi)Y^Xs_ET#g;4g`-L>V~WeeYsLUvyB z;`Cg*S-FMcaP;l{H(Ev(k!nB55yrCL!`{SZs%-gC?W~QKjho{7|ps{QW2s&sx z5qDd*MML0M0xCO*A=K=PvUs5}dmR?K1t1wQ)BJtzr z42^8Spg`@TYVfkqfj<{Y!k%6jNnz7EAXe8O{SQ1XRJGqAzGWutD#Z}(PFy^qss&-l zl-Q0xZPnNfZjRTgUG)@B)vWSy%OjIAa`bcXan4!^&EtMz+_5)b%WF{86DauUeb=&Q z%yusiKxNF+a3S)La9RnK4W>#V*&J95<0>P(5J)dvdyYm?XhM_~G47fKtJiMh^&i3=HSm`VNG&NQ z!Jj=UkLr;sw}vxsZB&56uB5+@YniV|q8H0Ftx>hMXL`Q#-B0|6#~$=j zPvd?2(@0k=VL@x?7Cr;raGGE_n+2~&+od8U2M(c#_I!U8(?&OEpBl|Rqaj5)te`0q zLvkSuPdUmcv-1|JqE{%XEmh(@!jti7)8#X#}}f&8o$Kd50{s z7G_dEj4l2;g1VUyX7K4I0|V=Uk;=7@fTM6)p&CUeb`6`kaw7U z_j!e?^}p`^gfsCEDEw~G6<@uN6AcK`X5_f@dZrmhxTHsC07=W{Am+>}EKR7_<|k~y zKs-8sGGpMsc%qar{>w3J&!8`52!^Bg)xtuo542l&%j*12jlg3RDyupyvEb6fJylv~ z=0L)iyGd_s1u4BrNn)^g)zB5?z~bAO2%|BPnf(^fb2b~kT$(x=vV0C#-%7~NG_&w= z)XFBK^BC-j;;a~_Kb3cy;nokgtf53r%?i)+Xbr9F1FhC^+w|Ku_SgzDL(?6^Lri^Y zsmg$k1-hjqf4}#b1qw%^kVGit-WSpeb&?AxCh;k)?_7JhhQ&-KrYMAqw$M>%8%DLJ z|2eZ`zhCgPnR$Gy7NRG5a1tTRQ0xJ)w*w0-5oVb41BZ)F?ky91csMlcfTZ<=a=+!I zaA2i|aQB4$S;wHyuq9`}L9T-$6)_J;b9oBUBH?ZgIOb0UYfQV*2BbvHa&8)b)^IS+ zF%TV|v3nW@DFeO>4}HxI@QDtX$c)TDxq6=S;jvs0r6+IdSF620_Z#mnmcuauMnK*U zsHqFiNO;tHqIj@Ds)Oa|J&2g-{vll|Kn^D+!Ko+#zHSqo_x8;+mX7TXAq_CPLmVfx zAvBq5wVvGB0a%n#9{|H;Z;!K;a0jujax79h!m1K%F9lgPdezlIl`L^S`Q^R(61G3O zoz6v6ScmxztpO^DVz3A-TO`Q%Z%S$(YnsTj}-L_u1@o= zn1m4pE}LSK5wHd1x-7&#uvpZ68ydFftkaLYI8;)iqT2ktIMyj(F_J(@;AK1$3G`;Q^|~`$d~h>-GVvh~)b}==pc5 zHpl@za)Elu#fZ~Z_>2v>le+0mivePUX&7Tv@cIz$wwoc!@+odEMGZW+p+U_w{1=Z{ zn8AyDCA5LjvZ-m)67ts}$L;QWW$99!MgYk>=0}Y?h&GcZ-}yaJ;5475xyQ%T;6fHr z)|sZ2a^%mpPX3lyai^GQ$B4JlNL&dr%5lnmTn{v`Oj0$Gf+6||>|n;GHoqYY)0l<_ z?7({n!+1}UyILcj%AEv*A3_9kLm?x>qrMSh&x-)<^RS4M$5k?AU-HQU_JNa(B z8cGaY*oSSzKuFlZ$|!X%uiF`j4q}P4hFc5oXZJ%WI$BVRLCdt%4lM8$yfH4Deqq53 z+|?YX#fRYozwj2Ld2v{nyldDo>M%7sDcWI^V+Jl|iQ*iZ(2yBfLMqyla%3ximOvTz zOxM)NqV(vc?gl!Dk~f5-q6@WsWN_P|GKJ}+h8VR1R{~XpqJJiB7B~P>?k5wNPHPB^ zH@R2YD0urUh5ZVHL!6f|X@Is55lsyT7rhtt04ovz11+fkiQK_Gh^}7oRh0Fv%VS4-Hd^!lL9)#I1upb-xmA=HSoqbE8X;KDUSfKrAOK@l|Hq zKPXWcQ;)_4k+%`u*hQMh zU4>0WS_;E;xu8wQJK61%x3G|E9b@5i?PyW%cYY5~7-h$H1QvUJBgm<}fy9tv&>!&` z2BA?O$0oW`qeudXkwq0l7zUwhm&Hi42JSoo}^ zBwvRVD5wR_(fK@3H5(QZkl;zG9&#b%YIMIcNQ|ZKkX3OeRadI1VDib$F-(c<;g;yVjld*$Nx&>^~Te!n<>a-L7If3^Z)_HGbrUGLGs{ zH~M-V&N@l5!^cvcC9h9xmmH<*hX-_W-2BG&p_&pI%Bxwt@NvujT!yTSGE!Js;faq> zoS*Hw4-Gu{-HL{}!Dq2|0FR;lqgn>MyNN4m9vk1v z8mJ_fY$zo}rt0 z)PN~hX7J=z#5qGp7-vYXwE_}a-1iB;@qU=I2y_^|B;srdAo}>rNa6~WDSZ_?L(CXL zE!yU5!76j6^&xM)1<-cpI~<*$A{N`;T}gYZA>Evom7o;bh^Wr`;J>_j=?T-Qo!t;I zM8d=ThXPEEF=aG}q>CFsTo065R){Ch*RlTnlbd{hnRqs8wB3nZN)HnqU^4jyHB=k- zbz5Spa?N+nj~G_P_;Hf{REcS~{k3?$Q|EfNKJNV|o^#QCUSB`$qmFAWDF^SS!iLVK zgf6r+r?VJ^Xp_xDvDO5lg;uZ zy*w?ta79cBV2nR7v5FY7D35{GO`UffJ*OT$+h^Jb+nj#6OIJ0fTw>b{ex2W7qjTI# zL0G#qQu~yrv^JwmdR;}Y^gwRs^$8goXh}xEf|+X;^@a(%Wt8IGoUkE#t^ttLCg0EQ@r2oPZ)2=$>w5-JCu>FHo zP62xXZX%}S!a7|bi^3S;x&9Z(Zjp2>A1g+QIZm<+51IIhW(%mm67_&*ey_pyb{TIS zR8`8b@CtohHI{zD^*l57G=Pv2hYb^golSW$I+G2IG`hp{m!`AX05y9dULGIK;KX9X z!j<#s8@Je!Wj;B%(s&L%(j?gZ%ow(Lw~-w+n{L=|e+Dux|Do#Rg6?lwQR~U>%7d_9>f7NZju5}3Q1NQcnXnE?3M+SmA zbLlP0jd zkh+*O>2)K=Mo{a4U~lYi3AH=rY2VeU9ed!M%loGVO!9QoMb^|IC8fz8U1L+Mf#4OG zRt%5yeg#hqrc^z#w^0Z04K)B*hEi7fK!tVf6MD@K;v^G;u-08_J@Ugekx6SPiARtW z6gALizR`1as#@*oQ>X$ z$I{koMNX=%(dOA8uG>ZRP1rBPsfF@D@$$UtB|&}2T!Qve;^tgS06hx=@{a3}h!|rZ z|I7vi?=KnaE?U^`!^}W+YFn#};r`%JJ%~1Ln5Dvw)5`&ato7~?U2(yUK@2U#7?|Ru z_i7^`rcz@Ty=f#X^w@!@rwB@0hgHy-6kl~V8_y| z_=KD?X)zPvDsQrJg->#%onTTXeEFSmQL0xajKEM-Gt||0+;YFNx36YXvk|FuI4EhP zhm`jM0VM-4V>>KxT>DR>kYOTdsg+jf>ktG>oSMLPHkFHS;?TZILARv*a{Siu=(}NaYD&XERFSU=?J-eK}tr(_Ds1^ ztEQ1>-2~6C-qB_6A*`npqYmIh6ukD}3;9I|v-xZK5v50BRNo$G=!1xtZWvn`pDO~A zPH_jRGJY`=FCv;vd|WUXDQj1*s?G~tBWCf8N9*q(tneCREd$VmZaL2&o?lCdeZE)tw;Hf|=(Vu?O&#Lw3sb%idgf|FF61-pfAjV?@q zE=dBFD@x&Me_L?LuS|j>2k?`WJkspT7T@~RPRVk@U9ro1Z|U$SO-xJ1p9-^>pAHq) zxr_ypR<#=pPciC_3*2bZIjBS<;M?yiS?tL}TmmU&GG!?nG^ORwDXYJmOC zzygFYF&RsfvE;ON)&ca-G*z``^6VcBq@OEbk0e>dLg?s`$P|KJQQBlpmEkZI_j$wl z?a0eZOGu+$`7d_!+ii_P5X1(N9#W6r&Uo0Mst!-o!je@G5KK#(a`ObwjZ`S49utHr zWZ=LkUd;kx6A(nePAXAtrsVeW$6)-_YL@8?{TBmzXRk|2Z&Xv{+uvQ9uiEx9d&4f@ z`Ky-_ZZnLC)5UX-6vM2y=m#|F&Arw3%ypyQw0qTL_^Lg%(9tydH+I+*!H*m zYR@-;2AcxhA0^||AHK&Am+-%|yaxwtl?6l~W>(5L$)yf{ao9Mb6EWDqjC>W{F;Tq} z4m{0O#6hQ#{o7z7Wxni8V&KH&(xra?`yHrl!fTF(HT~Shg)`AmR#nb1ixkL z@HSG|v-`tC)DrD8u2b#GM1)mtmG%1zGY`Wc;s0V}M!&*`MswvQ z+{MUwD%2swou>%+nD{oC@~hm~Y&V>84sya6^R6QHtfKe|;sy!zzh9#k2I6QNw;$R% zu#+>&*hV9tVU8J`!M)8`wv<8tIR2`mo_XJb<(De7n}B&`%u~d50P{ z5NA55mDa8hEr7KGR58r%o2r=SkrEG0Cb^EBaz``&6CAZRPhoHy2nTieXbtJNL)Q8uD3gv@;5%1p-NY)}mC6^+=gw@iVNWE_in>$gvQh|uYOcg^B1Nqb?hr!|E#qKdO+OjHfM5%i4DbySP=6qm5-0t+0_*{6$ zlMjsrykY{F$ucrf7ps6YNC8WztcZpDo+kt8dvIT7-8^xAYhE<6_1<}UXmI)r*a(t* zka$mMNp7tu?AP=2nJ4XtS>EyAz}H!iHn=P&VfckWOvW5h(0@#PMpYG=m@mhkX^KYo zCwaivp(b}d%X`6jqenl=6$Uf|K5+yM2jGzAW8eZD7cC=r$hkW0JEH(0H96yjfA-Ud zYL5(bKJzU6=9@&|=B=a~qMhl&Q3unAp@%Pb&J+kx!B61Mj-XcKJ079PC1!>61T#Gx zWXv#;DU{kNC`LytVCF3#r_V*q&6$w|-%-i=Sz=`Z(Rq*LPAWpJ7i|qVxvfr5# z-QvkAL&tG;-K*1qdwN`jR!;X3Da$QPMoFdhtJD1OF>%jFlI%30LSei}V~IQNtBF_< zTN1l?jcY&_x2NbPY@y$nyfV_Lmwby;SyO7jmI1_7(kfU!&23ywbv`a6ig*C%Xu0Y`VLL zXnUWoK9BC~fZx?ZnJZaGt6gNAX`9{oZN6SJagVdU^0ScM)m05`WVal{^Am&JQ=x$Vx5G-2)hO!dG+wG?qReO!Xo3v8IlhAe%Ke2DeC%oW= zL&yrt^$ejfEKm!usG*6s{SWdK5^kBluDov53@cxCj(uM1p3Xx9Mk-%(Q6UkVhW7sipv< zv=^UV}wiPWV6uA;@eweFI60_Ru&N)fC1YZL3HHxY<{xFDM zs1kG1dozq6XAXZj#CS@E>8hd>3J~Bp9sZKE{)EROKwV7tG7@AR<9Xoh;xPGF1f|G| zI3URU*qf9m7yL*x7+BESX{lEWJ#boGXOlZ6-Vbgj7kFpzrCKN*EM)6ev_8p}szo=x zD^T{FEv-8ABF{hd0@ZO68K!Nj)P;HwP`K2eWpPE6Vh*Yy-n+}%VDmZGs@n&)C{?9J!&C~$jev#mh=sk7 zBX;gnqoLF(x_yX)$Ky~3eTtgLcvBBR79~l$M!XB!Fz0$GLUNQC)zk}dJQ3!|vKb(O z#4S18)$p6sOtKV?g!4z|uERwNPvMEu4R6kMlnfwMtYW_71<^EU@-pXCd&z3azCFw# zOtJB6NupZh-MJbLkj|YIsSi$8Mn~ov_vJ?WgMG9EI)z;FvTUP7o!MqSRVOv53NuhKMWX28rwrhMolv>rOcMB(>KxVyr_Z4AOLC`?Zn zxoQ&Bzvr4)aQ~5N%uR550tzz)yCTLuXqc|0AJuQB?(X@kp%cuW6tHIyLqv6)p4TdS zIItiFV3nVG8GxgGMbsf^M$ZIguWn%1_0-)~x`}|)Fbs0W9*`xT) z7gKKE9BuqxTs)*fK=OBEuHO_b5tcoB8woLs%Mb3tx(I}#nxc}&G@lOk99#45D3{OF zZ~L(q3#jB%obsaX3ECw*ufJ%GQZDgRO7-j`-e7a&V+Uu;@IwX04}`bAUQMzsG;B>0 zc_@`kPWyC^XgI%O=ZrY4q=*H#!n_V|z&JA|45JTG6;W^;tdc(TsN|PvF==K6M4LqR z+tm065=qgEs`^0(KvZy85L$c}4Uh(5W5R6fJ%!VJou#)evo2iu{XVqjS+UsP&T>gW z1pU=dZly4eY}adGVb?sl>PhF~nOj~+YW4Fh(jbo;clzGZeJZBJOV~WVfvhgMM9r{ z)n4If5AI#6__$Zf#2moT`EV@zX>x3H?_iyy+h8yxr4KV`%}vQ(K{*fb`%-F0Z&FV1 zrFX?G6E)WHc8W+Ft|Mmx_AshgI##DZQKhcZH`5x{K^3q@^S%d~a^&;=bv~}3&$|D` zowl6i=|wAp>$@&Ib1^yij-<6aizV>n0S*Xg&j|HB!GQ;-5ZrHbxoD=}jAIL=3l9xo z)ajYtJ2ghQYY}o4lL3);O<*61f`nxT zhQxO%x+U>D&Z}3wbDg)wElaV+|D7;8G3aE9~>JUFqC|npO0U?(nO`71tt#KqxdhKKYK=BtEC<>$B{pb9><3LiA8It$ovG zs&T!ZY_EN4(=80rGt;7>vi@DmHhx%hl?%h|=O^SE3RtLrd2{}s!;t@Rit?W_*Z)WB z>wmpD|Idcq|9~dh82`<=E!y_$qo{t*wF(MmgP(a`I-(e*sah&LIBG*W;iR(!fGj?^RU#H#ai0@&4s7Z&9h6MJXyK~RyiPifa z>&N@g?XRDW(`Z}1u6K{84^&%@?M^>`x6ileYc0$rjq0`yiDiqDp`%B7bN^Sn35)^w zYy5J5l+VHo{KbV_w%Q*44)2(0(IV$k-&|?#Yy8I@vU*Gh+4PR2(9u6uCQg7d?=Q`t zpR-?ID_sLa-P`_;*|1Aa-yqnI9_!!3pi3NMZF3cysLk=%I_o#X9A>QiJh#_*ed&X} zNhm-+Q%fX6o>3*gQ&bAPjkitwMc>>y(8pP0Aq&@zK3S_Uk4-j@X7kZLN1oU>^aahs z(DA3Ap4at_!{AnT{jR6KJfHmP0J2`c{UE&pld#uUZe#Om#k7C;NJ~%7?e8@vqXBg8 z+qth>x0gMFpSjaa?kkH9B0=o)m=ly3iskIMu|9WgdUp|_mpLFY+;iUBy2xbgEqeN` zc$=cpS6gm(Obf`jb)|N`@cUIK5wPrsJ`9DY1xZ{T@cjJgWV9FV{F}EdyY&%?#!#H}|6cW3YPrQDGbo#(CgV&mI4AN|wW zned|f<40g*P-cSX>cAqFhzJ+6X?QN!x(t9w8)H(`CNYdA!TNDnBQ=@kp15yWHtQr( z$f9}4VsB?9kDw^nmJ(z)idfVMKc!?dgyA6X`UtfrU74I<+nC~p*3Z@4TCWbL`Jb6W z&q)X$gP7aBL&Te&mwh{|&)yue9Jg!#ZoYTXIMLny^6QLl#`@)L1$sNUk7}Zvrw^B& zOjaxkBvh&+UAEyn!V?-1`q;PZGLG%Zwuie45AQ{$>oo*w{zU2ApJ^ezfEfg*?}ZPmwyq1@IO8T1#+yEhBmRB_xpkp zT(4IAFiDYjNaLd&MAAjVY5pCopxF8(f~5le6f+LDQIrdXKF!iUOs-(wnq@JXMk+;$ zAamFsy|jzwOg;s%)>l&l{+H@B6OoxO1=NN=-yW@J%x0U$<|}A!O7$2!u)FuF#SgVH zk1GY~3o+g{+UyeQ2K%S#9Nm&=t5X5&NK7F!OJ73%D(T=g z?o~OTbee|Ls)RKS?EWB9UJ33OEYOhB+SjjlZ#=qJh1=al0yUr3QLwItKHJ3Iz2n>~ zf4_AyCM;^uq<~ojkRb`s_uX8rOML}bjaPZ_h^zx?ARxFzo81_4p@m;4qKgW`3!4-+ z-H8$2vl`0gaM=iRfTgGn98YCrBiJ#-n`CPd!BOXuHQ|r*!)>`D>y*%OO_7x^nw?!GTX8{bbABqz_wx|mER5y>R2CpmBsAMq9d>32U zoP;Dfh*6=L+Kl*TFG;!b?;zY`JD7Wjem|HdCT{zB%02?~F(4N7%xLM9b={cvt0bdm zeE8|h9T*aB3(dL6sP@9|QuM51rre>egL$Hu%{uPd`WhLB1f`$d0Qjvb`GK< zI3VfB*w;AX5*5JxaX8%hRx<3zopVwWx1E_oZncZwff75@K~$ef%I9q z;%q-qpglIZ;khtlS=sL)5*k`e5>F7HCFK5EfnIULRHNq?!y0oy6qb2Km%L?HpB=Jp z6bWZ1lAkNpEzO(=VfnbLE=4GJI8~XI&%%3ALK`;_MV zyx^5Kp&AF8U>54_7p#cP$6uYDfz6T5?Q(r%ysr$6wv3)n!UH*?s#~Y>?u9d8i&{yz z>T_y%X^byFgX3m3u1*9W1w#ptVQH(xL^C-@k$L!o33}7T-*sYz|MV>ZciR=m859j4 zoM?<`$Kwh~?ah=!VXlATfEPomkUl|#zbgU5`8-6EGYb%;S)hnZ zs%WI}tbxaZZ3eMVD2xhtV|}7RpZ=L!~LSD`{-TRE*XPkW%aS>m{h_TihYt3)Ib3RL#zN-!= z%etvAQ>N<;G*V=|_}7p)lJqjS$&l(b$!x;wxPasdysDtlh zN7;{?6QGL>e3yUof}!pxlxCnW8lx7#PlJslD;i+V7wYoVur76!!!4+ei4|pnQn|bWQ;{ z+HN2C^+Yu&OIIP~aCD>_O9fnYm?m|)4h0i`D&$zoI5&I^a7{A>pCLmuFXVdJMo8fOPP|&Mi`=3(`*e17g;oxe z;+Cb{j&;74;PBgv1J~H}W$U~b zWBzRGtRepxQ-QW|JAXRiFXmLq+OGo}kjb%{NWCu_Z-i3eDOY`NGU|}z`aoY|w{lU5 zfx_&qxIVf#!bx0iNE*(NRJFCpD>sgF?k7O$p*0%HNIR7}oN6*RN0MgHa@J&z$#7|B zG~<^tAucR>*}Sqy;hZS?g{v!xGl-qy^GS)(oo#H~M-Snpvb{qAcV}#Hvx1cuFEo>T zxS9%+SCR<4&n-suz(Qd3+rK&>3Y-Cw*<9v%+zjaTZ7N&&kbjr5tJL1N{?*GA>SRuu zWpjv6`g2MnFSy>c`9_$*bO_uB;@VQNgT#z_F zs3BR@I&LnkCLRQP>*))Xs)9K)YG2jCtx4ODpl z6-gR#T28nfAtFm8wwt8!uo)IK(b$ol0R@tJW$KC$v6T$d(KRli8%VnpR$ef%1-Ga8bJ75##?_dR9ue;|B9*f-$X1AA>U!6z1Kjf*@o|ZmNdM`ROmaLt-OY;220G~Tn zQ?=Du}D_l-oy3905rSW$c9 zb?4soRJ;aP731?bu{DKP5fdB3du#7ZfZAb9br_rE)f$>^O(LMXh9z$H+W<2>_?0+R4&2Row9sGB| z$iH0&|7&fU|6K?FU&=Gtnf|3oMQtf3oOalr>00wnOO@GGDd6qS0v8X_IOWF{R25oG zd{tQwr)3uvW1ZV8;K%zQ<3_IzmO_<%=@llP4+02(fEz$#XsT^LJ_0|EkbaJ<3b|jk zn;-MXdRKlgat|kGP!+YgJyn|<@*(OQzPdKHYRfGR1lbH_lm{Vz#FcAXYG2Ru-&vBN z$%M>8>(~m8)4RBZ3%SZOEmB(O!EQ)qe5o#u%(A3J5Oec_G#~1MS-}{}-o=s5*SGx7 z&xX#RhQhb2Q1znmOK^B$KQ8Y(Py}5<&B8N<07(_^YC!`Y_MneA`!MV(6sD4tWbfNG zNsFFZi4ZNx@r{@o2{(}t*9%Aw8kq5u)5i@FDjW-~2b8h5!}gl-Po(*%DPJuYpGWk3 zGAM=8T-7g4pV&YC2%q4{AD&-lIySle6cKZY<@^X5#Q`ztew@g%Wej>M96Pr+L6J5S z7If98VwXaE$G~ji*j56Y0SzQreYbEtkJi*kECvaKAW^fB4jS5m<5hVBAfm5=A*wE_d?XW*eQs1eD@|_N8TR z2p}uD70Q>`L{#z;1H&RCgC1I)JBTx+gN{rBLqFtK3%2dXX{wN9EvtvY+SY#u@KZF? zHFuCtIKLC-6L7b$C+S7MO>rBt7BFI4NKPXC_6-gXY`Xg#dxw~XsHPc3^f|F%ASm=9 zjniO-&sPX6QZo%`lx|y!(}~K3XS9nD^f-%$qrU=*DHJU=?4odf{e-xQHi$yO3tYsn zjVFu{8y`2+JQ_tc#}m`G2?nuy2mHpO;y`L&pPvPb*ud3K5k~MCUvdjuh5tRqGI8W409K9a*h^)p&(i8_Ddp)5B45`)&eSYS4fqFfO2$5KrBTtCWXzGsXz4 zgek&tejB_~wfm=jW|tAF6LQ_y*|E}nw zx-*4l#_c@(xWT|-hQRxPD`CVEZ+ z=2W#TAcWEA3+MvHj3G*Nw~sWc9koz)#YBuD3e}6j7-*(lE703LG`RbE51;dN5&|g5$8U zUM3C4pVeewc!^7jPXXnFdO17kXFFQD3?3_=ob{<~XLOy*Lq&yc*G)0gZUzm}xkBph zg6OGTucaLKboM*tL-~AZcX1)w0wUb7x0)q!Jj8h0S1m(>E^I$*BfXgvngqG_&LL)h z%C>H28=(JwFY1mf863HOu{DA7dc(^5%(BxA#dAv18zWC$4C#GyUzu>mUYZ0W1}50HY+U+-F~T(w6dWNCX5eI$t;@ zEt&9Q(2@2v51Nr4l8C)BI!JcZ;ZKC2A2>0(xJxv+Dj#AvXJbTAY+S+M>%l=PHv%l7 zLI3i1|A2i6tTu0~CReuhuxM4#HIOc1Z@L^m=Z-*wf%2CoS*?Ek6MsMTUH~WmGZ}VJ6 z2(tDu=cLG<$D{>W=7G49icR-3cKn<}cY`H58b6=#-oQv^^%3Ye5f+qN&Sp@Fd_;7b zMStY9!*GBQ7-ecDoL{f;_0QWTZ6l3$^rAw-V)dzA`Y;Qit*yHFC#-asS3k>>Q3jsG zWmL><;?+qOJ+uEicJVGT--rfpTV*IdudW`TO}d)P3Z|1!oP|-FYw_tP%9f(lKKuoy zmr>U&SNw4_bQpN^Fi=X&f=)emVv z%*44v%Qy@ebVb22*@dXxbt4ZrKt0Q+4hAL8BTj(@Q?M41(G_Q|!-zozzBD*(K7z4e zQ(*E#&7;Py$G%L6POyxv<7W7&I2NzWXx+EE5}%s0hF>VUZ^zRGOT4d9Gsq!j^Rr95 z`Zs4d+}!HD%rDXdaLLkRD;u~(TvE2a5k26Tf|1V>Hc}paI*czHt?Yb&DjQHI;wPXy z13I!dX6I(zv7Fs<7$;kx6tZI z>{@{B+Q-XEG;9mDu1ba5#@Z%?`@AF6Qj*akoHJ&}H{ZreLd+)#7)Nq$w@Q-d*g_{* zTkmrFm-IA&h*fXfWKMUUH}oNX_k)}L|G7t&E!qj@$S@Zv?2o#=s!5i_t#P_bBz;$=f`yIuuY@@(+MiSf**i$}C+ zjL2m;P!e?Y*kW`IqTvHzB_@ee0V zefXZV|4IPN?HvXC5eL(bMkGYOY6$Bz-%xcBw^xq-BE+NJ6I=098xr;m9tL8$TCg2W z>DYS+|H3jnCO^5;6vGGic=KHU(b{~{`n$y}?Ja68AZgA<-I9t&cPRAB$2)QTq(G*6 zLM=wrO6xg3BQVm=HF+A?H9KTFVF@(G0kaXk@OfRlMl{KF8fd!Njz|P#8ul*8fY?KB zrU|h4tgaJj#={LM;O-LZ9wh(jYAEpT74Bg`LA9Kg@v0u|%C&|nHM!*4m-#HFEe2H9)>n9cWvNTs z(l##OpGHIPoqW(~!l6llK~);_+2(2DDP{U8>ce;|s@3izzH`}GvGEpt+?StA5rep0 zg$caRDeql&Uuj-hHMc>7gb#mFoz$(EC#Ei2;~+Aj-Nkg5?ha*#6Hzxpa8Gh7fxH+F zBLEZ_8qV7Hw|zOa(0Xd1I3RlJuxhr0AM=DT7ribK3C-P)`C`C`6yYg>aDMeG{& zj>R(W$ObqEQr+Z@lu(>ka!La$@%NMDmY7S38jFpt!s(N-rkXC_hO;3O{MfJ079N4L zOx>TSX@zXF+AJ z*uLo<^c??xO+qS)65r?dH$U_H4FS2iv$MSuCmo%cg|oSfA+3>}4V|NllQWIAfvp*x zp`D!-ouRdzA)SqZg)NB%2wdN#s=VRo~7tq_} z8M=o8qCgl(dEl*x!i?txbuhw62>Vw~w5_HILqwHhs>T)slXY3fHf|hlRF2Q7J6rf1 zz8pi)M_p?@zKt)hVugObZ*gC?dcW4{E;^Tf+4l6HYfZJ%`L3SpTD#BxZs^AxSWtcG zrzdWu+qCZaIvxD>ifiKvcz?f^ofh`I7`*MS96kf(jEf&_%IBuJ>f+0o#Va zl#IsE{vijn_V8Bu^wsL}Ti?@oQGFR|F~a3VG}+1;3~`|m zF~YBtXA_?d*P&u=4QRUB+Hl2D86Pi?8~6wGMLS{_HAK9e5sx+2yPX`tb!*Ty-v!*p zF1t0WCFfU@Qe;Hw`gseFo}SUk_R`pj%sT?$5!;7j7Bci$r`e`Z`q}eWvx3n;TYtYz$q+sXli&b9vIMWV z9^xdvMsp;F(NKYX(f&{;0V1Rx4Gm`mh%XsC$sHo8_dyPGAnJ40Ytft`4&+p}1a0qP#kYwKR@WjKq8C+gFbWg*RiiS_Cl#rJvd4 zvq~T4BGvmc)qjqtbBO`mOW*MFI-`&D{ow%Qhs>F;YT|Gs68@c>dlHd5}hv# zHc=&8(RdHY76`N4B<9eRn&o7qEWrYYSUr3Fo`o^pv+9o{mZ0Tg7er z*G}PHe?SQ0x`^RwNaK36E~V3EmeD3kri+i`8M2bEnde$JC2mMhK*#zk$hJkS+?Z== znVXlxpSXa(dMP5mKjo!>fBXm*S$FHI$E)n7BG{s-bc&yC&kHuNjWsvZ+Hs#%5oCJdV5DzUBtEWluU<;;vK0f~7)aP+%8po$UP zWk3y1vQyh39O|xX!b*l@Kjg$NKRPHo0LdSP6aY3jt7@03`%)~(*M+H?pDIq>RLGJS zl(j`}@BjvZE`kw|c@dO^??D(aJ*TgPI=EQugp>8AE_>ZfEQmDF@Olus{y)=Qq_z3w z$WfJ8gT-z)U1Qt01gIzu@;l=~;fP;=pLayBb0(T|ZX^AM5cegKo_0I-(+_ ztn)gu!WsSw1iN&Ve?`WtIadS@t3Mf*T;0jEnC`umKj;J=38{HZ(L4=LNZVE1?gsu7o&cMQM|i z&J@Y~DL9NIlHL#!J|FMT{Cl1tCgA!|sMt6?L46z1%HFw^0c0+T(~Me;Da+)>g|f|pm2%wW6;)yFxsC!A9Uc?h&cBymUrsEAfP+5&K=p^W7Hw??eAOrtpGSJ!AW{JGNN$Du zIdM>cazd;xCg18GvfcJ{rwWK$0i>q~N}KCd(jTnS{ZuNToTwcizy~BYx?d%xyop?0 z`VJu5k9~#Get0@_!wk`vSym|nIjs#&G}Vu>6Y98d2bw9Q_E zoS($$+tstJO?fAAj!Q!GTeMK}lRH~t8nzvCypO-9V1wuPqY_sC7jKP}flEPz!elsi z9#-smlEa|@0WE5H_%3(@;Q(f9L|7)vdaSt{5Hj8YaKB;sN%5RJAiio=xOMbIb-l$v zs+?LpTFV1Hm^cS*-Ek0}=m)};LPI70eWQzzrGX!|BpVXJ9U6W9=C}=;x5z$LQJos= zCI!BMGOm2k-gfX5!v>B7a$#{Ie&f0iTqy$o|2rt`PMTT`D<(-P*jLplk$QBXIphxcIGY#xM7*JK(NIX5~jlTIROKr~h zG&m(B?utyhJrsHJ5(i2LJ#$#>IC~Mukr1HE5LF9E__GB4B6QE-ga$bS)Tj0{lkVKJ zN{E@YDTrxw3>HdP&Ao^9!LjvnrC#{qI7I3iIz=jBq@QP9#^rrL4C&*ymcf*~k4=wr zdk;KeqB1X%Qv)KQC;*eu^+t@;7lz3)uTURtUNyubzAOksZ!qA&S%OyM#-X!P9++0` zFchu(2i9qXJ8sc3f99B*hxZ9^e)fBLy7H^yxOmu(HMS#%NCb&OWF3i;hk00JgeV|o zI0ftOA`h3r`x}(!Ju$C0775Ztn23lawbu=)CkMv}$hcoNDPehIXECu&1i~9i!OIZD zQH6t6dB=-+W|VGF)-X_*_;|bGa#1q@!hyGj&m`M(&F?E;Y{GHz#!=q!Y^~t2t&^|f z4juvb_`{QAAf9G|s@Je!5?!JLNEXGZ01}@L3xny9!Ai^7xf7$O6cPJm4=eVqOV*`b z`dsVLJ?Xs-H8m&JI%ktFSGSEq77{OD;hn%#CBLxuXbn_KaT(7|xSkK|G$s5<4n?A* zm|P%&_rw5y8sT{3jo-Cbdt7HJbu?^!fvis;7$n{!s>*4S0PI)D9QJrb$oH#)Xl(=P zCIu@|+Ph=0r-bQ-0YVggfl*#4+RrlDR<`e)A)l#*k#?Z{Q}(3djhDqz`$bxH zg*kP|ywN4|dXLclvaRRudz!>6Q&NM45e`jK_sxlXqO*XLcbepLUz~`3ZOGhutoe&u zGIUKAxTGFruVSE{@A$p@F%&cdb2{;DomUG(x2)jN{gnS5%-cTds~gWKVOJ_4%27G0 zO$nmu!zN?tG&An)w=)1jrR3#s>qC{am?})yTmrPcdjY;yI zpDmM|2PqjZFfF}Vf-xH5Hf3yEoL`!mGe)II?4xL2YP~3nWq`OV?n%)* z@VM=;=V^gw>*#eIj%(SPJtUP{=_x#>Q-8-~*C=&_$#5_@P;tWZSK&h(^&~cxv9}wUgeK0sZ!;P{O?7j_PKZ@et!rHkgkokKw4`=50 z+zrQsqz7na3j+#D1M}S7vyB-sqS}zH)T0`2LE0Kh6vVkbR^hmuWRTam)a-@GTHL05 zw$>LOHGQ1r?5V@OkO3FVEW}eYXvfgyxYGz}M;B{~*d&s;)7(w~XxG$mR!l|dh}1B- z5<>Fb^p1KUMbzb^HXYNE6UB{B;&bG4wM-&asCI%qkBTj2%+oua@+OUky=PPng^!Ai zoe+IC3*Deyvq}ULndlGFR+3n1CDvY>m>eHJS3q#4W9t?tZ>k?z@de_VnJCc7HHzY> zNg_Q>6J(btCi#2gL5g`gpjElgjsEPVUPBk>d-2hvab5Mj2M^?^MaV7k?&iDBF~qS+ z^f_s3B+*@JR0bUli{&EDJE8P-U__RT63~l7lwUqXVZ+&@KiE?Er-hHm`a;CJ@lc-kG z-EU1(j->M$^)A4pp0m~UygQXtaHK?vYm|rhv)%TvBz$PR;j#}4p@?>0;@z02DT@NR zsBtK4@ub);Wy<(-zm!3CZwww*Nz5bqeG+M`RlCa2C6R9E*$cqAamzh{+_g)4sEQ0~ zeJfTtXeLELjzH@YfAfUFj;w#(%~Sb{^wYA)=pF?y95p@cFfJX`5B=&f`t68Mf^_v4 ze}nj{L9WM@%UY4?0DZ%?^yj$bby)17v97PWsqF9$A9ZA&XuWufe< z=e%%(Q&OMY@ZJ2r_PUdi{7&7A_7dX6e7G~0zLvK>Ox&EprZ{Fj>guPPbMWI@Si~cN zOe~C(%PAC!TNSWwEu{iuOos+PdV~%BPQ)YhDf1AxnBo%=K~y(H~8> z?#-8Rt}4T?I9k?ehy73A`LJPYOL_FJi*k6soN zIIfD5GxT_3`^_l$JZwU5rRA;*jdVetI}^8GVdcY5$onPo3yjm=252)h(VJ`!KkKMfWB>6Pob$m6z)#^{RW$wG^?um|lHMtm9o zX(!&QsQL|o3vK02Qx@^JGAhy|BBtyko@#yudX(DPRahN_kR?|qDi(b<3k!jFBCFQm zKTJ-3y^4(MD3#>`hyyKJR_;{Ou}GA1GYF78m#zqFbcQYsF*9bEuq!-xH?Z$ET6B4h~tigM3K%IKD*CzergM6xu;O`IP z7dJ3fL?KRC?a~)LcRzD|rh;xQ)uH=<$ZlhM9y}jF9#nkk41)t)MKN}*t^B?_^GBi3 zmI|b;%GxpSu4Akd&X}LFC|m89;h;N^Fea>jEEZ~liS2RFHl{^@4k(Glik$i_*di*z zyViw^XE3)Yc~+ibPkT(h=SI z2G~8aCFPpu_>|LTz0atDw7czdBBuMk$O*a^S@+g?9X~9-@Tpc(7?yvCxKy_1G$)xS zg#FXB5#dyH{!@C6J9Wg2abxAozj5i&(S=ZO9n~17vt? zHE9OSpNaP!vbnyMLx~8DdM8;=+M=F{Lnb*<$_`Y34~&XXaV;L|^sG2v7xeosE3b1k0@+OZFgffD&?y@_ zZ|;;EffM^nCzcUgO_pm7LZr0P(I39MT&2>mhG{7De#{`jNZmxH(*40Ux~8v}2Tuk@ zJ!~q%Aq`lhAgT2vhMI7fIU}j@jOCe9id%u9*9KrD9pjlcbSYr!5k$u>mS%sx-5o|q zeQINp0ZlqPNA^TGezq|?ETj=1w6{_Q!4-s7Z4gHfG*-l0)LQ5@xhzt8UB23*YjLF- z%sheSSo9nE!@=%le{nOXLVZJU_oNvIo$VRO2UR9%cBHDK(Sgy`MxtVaG;DR$y1M4? zf}rd%LByb+BT;Acg3>vRfr@Pr{dkvT9eTx2F+TH7s+m}4FArU58{Ib3cuB`6^P1_* zK{mT4LJFZ@9lS7W`HR1gj^SB(jBeJr;5eQfgC}TC&u&~D ziifopI97zvY<#|st#TKt(;M8z)sM`((Mg!DIVz2D+ldAk4Ti-gDs{RF1VSUSO)67w z;oG6ZLiy<@L7Dt~~?2rrQ702W9fKgsW zAQn3mYxa*ofDxgo6VLnCxRk(YoNFB~P;a<&8j1o9|yT;Sb%$Z|qEAkt-Vh0mbZ%~;h zpVEK&eJNbRf6;WD#n{FV8kAJe{))r*vyG;D*(7{U7M_2joG#NtL5cG-|2pQSOZTQy z@Ro`@bMd1s4)gS+Iyi_?UZOs+kD`ywU-G{V5)lo)k~9JfudS^z=Ij;anc^tlWpSc7 zxF`-T6y;lb=F%?O6*5x59c*)jxYkwn!luWCQrvWx1|1*{<|ijKY3uihE~718R9m3W z3zz-;Q=DQXsfPF#Iel^TwLFDcIkPOol zIP0JxkKU;T9{mVb;n}-hLo7r$7Z4MWHAwC$ctN$(y9;GC&rFC>MG%WP-@ZW7ltFsj za>J2xiDQQ~Zo742{UtjjU!6tktGp~gZyrhM&W@5^KnqDo8jUrPEGi=}b7SL7DB{8W zvvecuu|HIp_>||SuX(O}(@)58%L&VZcgV%teMt9;^2QSzjPYLDPut>jx1G6 zoMDZyJEmWw@-rp8+7Qc$|52Igp|*q+F6~_GI#7V~3=82!pFWGR3lF(I-H8`<&{2Jq z0=Bh`0~Cq}khpS1!igp!%qhU;20*#p#GwC80#PSWSG;n2O~t}{tYh4uYD08`3EzR- z9?}+Pn&qBrVi9qh9PRi-p9?B86#CD8EO4xC@A5S?B8FBIW{?MALOg9it8J@dU|udt z9IO0Wv8WU@zsnBi29rO@H^7VJh(&vh_7mN1_TnS8kvJhiAb4iVbIR;Q2hqShM(21rHH453-L zWb^|j@|i>|Y}$f}7^Bw&ob8#BvvvJx*6dU>O%72JJ5A9eROyXCqX@Yt!C%^hR@o0_h;vW8$c@lm_NZ;YbKX+04IkT=sb zsI$%iRSGv$AeW#Nl*57yaJL=OE{p*Z4sy}RD6eU)2kf(T{?`mVL_RA~>tvf|(U<)2 zXh@s}MHWs?6Y$fSwQce#O_sJFKob)tg#T1({N334w@Zz`>NyqvSJ&;oOO3ymdj3~B zljUD^+ty;&+Aw>bl-S8LZRwS0rojnhxJH1oDn)?z3v^LrBCY9M(T|O7UmxETQmqw; zC=?5vu!wKmsiRQFzV1K39gkDDw{j_bF$A!Us#bcwT<$*nlHXr;w!XG{zS;=CdsF<@ zy#1zIl5MxVm$iSb%=Dy?#wbKaR@cQ4McQq>cf1_AaS1}`HhGzCa9wSRJkjdCH~HKR z9A3h59tBKQJNnRGba|--g$0}Pqe^j`*oG^Qi3+3hw_aVX=Ehx2Z#{0w`yM~}>6isI zbH4)#!r+4;v1}6CuE(uqKr*u0vSz0BKAFx*>ca$tZZI}p=1|7r#BD6N?yh$h3F6-4 zucPmK9LL^>>?XB;O_*$%$F2*qWJ(s8p^=DN&!}7ex{$KZ>$_*kSKcPMQ9yPKv$~Cx zABU_*+1lg$HNt%D>l9+3B`?=48JD8O;IZjkswb0yN4G-%+sxzR$|<-wU*$Grs{6~r z{zT_67&JIruEQ@IGeJ3D6|;fNX5id$B?~jP7E1he)MaQ{Q3(uG$O6N z?+oq!C|I}9$y16P@M~*#-~)9hdB@Eg{zjjz z>6hocIO?{xz0qT#kz@XZuNMRx{;1NRMod9NFk~P5dzb^*>uA{)xZS5!%`Mq<0%%jV zRAcQhbIB4_DQFnv%w>pPMLShhLTIv1jA7)L#6V!o~{Dibs}*$@t^u1)4L zO~ghcWXUA{`6_IQqo`bS`fsTo22$neD5|D1$Fp) zsnNfIM2=K+6FE}5RIa{Jtoh-!kh#G)b%8S#>iO{K>*mVf9_E#h#UqCOgqkG6Dn zfN!Dql&q}9Y(7)v0*a5S4Mt^z?nT5~&8Z8Nt2Vg&8B?`(u#w7-;b-=IAMz1uxnk?j zu;}C9eQ!WS+L9t&R};MbKo27gqv~%y;}hrCqSOyxeGH2lmLTTd5sK4~y6hPsj!T=_ z+McJ&8eob;AFEelbU%KZ^kc&ZixP-+J{^1+gPI*DpHI#2I^OEj*VdBF1wDcVw&U%;$C0r7tiq`k9lz$17ev;nmW<#>QN44rs}-^kMrJ+}rzTo1+E2T`5(Q83_U?>($n^e`Bu7t%k0 zG6R0Ckb*7u5nUchx510d^3^{WW&?NO-ARw&%^z?)2VCE#5QV8loK1l!i#)5#8}Sic zhbYJaqc>s%BM}n6ad=B^nqA6+x7@2xDhk0}dDJOKa~ii9_L*vVqtP&Xj_w`5zhS>K z*#|~SPCU@&0yNanaQ7WB@aw^8{RbEE zYfy8$jB|r3+VU!Bkrs^^{uKrVZYPpcfi?+Z=IlwY&WoXl2RKy7fAIWp`ujEz5gQUl z_cL+0!G#Q&$usQ+s0i2{`w(J^7wg1=Q8{q*nElZei#XP;3O_je@7_r`0f6rf}^vGO*dla66oy1)i4!Lk>cu0Ok4>HPEOsTN+1^Ke@Ohg zu6ta4nkNp^m9`+ct{aUP6hJO^jt*8Z;3@-2P@to1@?Rwfd(l!5kau8 zoipQT=eL=IUwT6v9=ex9^7^q8BdMzb9zqm5AsQlj$wQUQEps;XJciU1-fLRLj;dLn z)oHJ@Ikz78RD1rov%X+-Wf?yS)^IfhWr5A*pA?%P@aTTRf3*(|6r+^R`<2uC!Gfm4 zQ-(A1ZEpX-{)8@gI72l*n0w0Wv-yY@g3)vp%@9jJee)mq@qCs|wYM`^_@e6h{;Q zovI7MS-sc8)EB?aRH-bV7q{W9qnW4j9|6L07KTiIe22e!2#t3mzLA-pQTyY+{c)Cd zZ#vAYqo|Lx4U*LczTO)#X5suz7w=5ckgCZWyS2FUk|Ddbjrq`nrRNTqCFn|_ri-=n zP8XQVck@~g+;`^LshpbGO%|l=S78|?1a|%+X1Z;e97!Qbq^XA}5)Cz+3A{!H2w#xc zBwAv_u(f<7whxR@E0~BdY$IDmQ&JZbu3`rM133`GEQqc$M-Pi0*4h1Wbi3W=po0~b zMFStZoG&z{!ET~~ibzsvct>ovQho=N>uB0&*#X985M@>nT$mXcq{Yt8T}C$Cxl=sK zJEWj;PF4>)UN55v>7~#I^j%8$7jwW{Lx`k^`AM!lB^gpgm&Vb2!6pYk*4`w=Wk00OplEs+ONs`XG77W#ox>)VHfp91CrS%e za$8P9l%ru1d1T6$J;N=fES?W7P5}-RH-!koV-JO;bxf?By=&R5E@PEx{~dXxJlznZW0(-C0H51-xZ58r}DwujkECB&DK_hRTvmBEiBQUQ<)NLrb z)JGVR4V-rW_r{xzz-2?s3uLcOYJ}V&Z-0#|QhHcc(H|#u^(1h&h2OA2asIThIwaNe zysmc{bNrQ(yJZP`3P6{?BPnFw!lMciX(uEnI8-?KFOQT@#uSTPaF>JazFPX{N~iO7 z!#Mr`WZftmK?&$4ADN-6uoS;Pt7~%}G^-(d3^k=jf?=wKfEpN#fA;9cz&Fqs3fXbl1vFD zy`oESVKnLdPG6+eEbI)D(nEb--LV+~K~HC55I z+k9-xQIPiC)8n;Jr@Ir6-s~@GpALObDS8WJH3$rjSK!(vc6xXp#$$-%{)fbXs&R?#@ZrR zQir?t_yQWctbFA(^Z!|%{=IJWzvL-B z!@o4ueW9b}^i5p!-O{ViXt7l)hwyi@&*H@LqA8t!rBIT2o4GKybj#-b@w5EmFTlh0 zrK1EbK%ll{gGo$vu{bRp+|&n%)!HtgCy?@`uT_g+tR~xWa6dP0b-IxPD2gv+s|8y$+~KM&LK|oqi-dif!UgE`8~4 zz1uw8g7s1WaxX(T(O!Sdx{^v%^K0m&o4|;e#B5UoYCCyvc>7xOZe3iGTkd@N!B+{5 zKcds`x^wyN2BHL{I4&}4Cs^t3t!hG|7qy-~OLYYSQh^zUM%drZN5WoWPu`$muWp!! zHL0=3a%E%0QNWg)x_iZdK!n+~0K^<^EUiMWQ31GezgR3xE$JqS`QNf{Wi5QE+Hrx% zGk(VXScd*l+kGt*JIYctoW&pO)m7JSG#){VQXLGX>5&`w_|$W3aT>9|B;kJ!AjYJc z4)Cnv7(PqnK1SP`S7`3*{_dGa9d7F(Y;@tOmWh*WP$B+i1e>c(i^$4gyh54b@H2rl9irKI*Z6+6yiCN7D0g?So zN0f@mP~DEMf~I#qIx`VjlcP5Ej{Q!9zQD&5i^284XPBfYC>ZAT7#c-G?D`bf<3#9R;`6_W zHHb{wH;XBbTju*n&0bgwix^PnL5Ocjs7{b#tM(~cuijP_V>}p+j^*`W$%TL~{;Uc3 zcW?hrVJ5;yS-{RgJgfUITW*581NtE{S_xw+OG>h4ZCa2HVwm0}&U@md)X5A10j@fY zY#nKmPf?enuS5-nk{rw6ND3+&KBoS`k&d#^{JD^zma=q(L7lOEiYuJ@=8@*~3Qck= z$(1kPJlBd2p8Ur#nqfirqX*SKYf>pc@MrW6#ZE_SJa35bv37Gea5Jsf8joI~=hEv+ z!mWXVwW+elRNA%Ut(#o{t(QQVx12m=@)!-}wvuu|p4+&3Tw*4g^>%q97%poIW>3(d9J zL?tufnt}r~2+*txJ-hOW0!8CL_ma{Cqc7q z)|@|{pOD}`Tj*1Z9j-6;N|0r{%@IyE=)t&)Jm(`GMH-AwZrF)iQ}Xmyj!VgG{nLb5 z}Z68eLi2nx4@%B~)%tfSYc2P-o^R!$_nKcWAOLGyY2IoUTHdtN|%$4gCNv-C+?6@xoJ#a*I zml8GWb=u%paaG>y-LSmdbeC+sXDns=>19C$%g)b2*IKc1=(QN4=>*s6Ab!uVmJ4qS zx!%!GqU)p4ulpLAcmF@mmSu`_^Jeo#p_4o#Fmw%GZe8Y2m)x2MidqFN_I$&C?u>#O z>Zj3Q_YxG*b75$I2RvU)k4ZaALglxyiM~Rb1Spd1ILeX`swIVWaKdTIMH)~WN}%NN z8kw{Mn^2BGHnze>U*N@zbgr#B)!Mk4V2>0Bz*$@8kh=F!bhhTAEoK)9ii(1hueNo#16 zijW^_V~c49>V?>|19Ih?^@Z&@quZ9i_%mqiGql{J0eQbxXSR0dQgKiP)7E+f5fl@^ z1!gqvsH45d_BF6(=LK5fdV^De!J};Fjrw+_&oSXzf0yD->`w^pGLu1^6F zVTQ-FZ~RS=(5B3K{_Y_FE*d;;Z?hobg=AN3$KB-Wmqtehj1G1&a3H6M zJ_K1i;c}O_!WrM@iPits^FUh1*w3qXj?MsgwL3^)rws@_@0sqnv<;s4ELD$AS4ON= z)l3o}N%pIkn)CxpgeLVFq0??S_2Nj_hdBsLW*{iH$OalK z%2JuTnJ4GbkxWMdPJ?1m9E}8ycbN;o3(TA)YNNJ~cFdCV!|27Xhu^4!lBjW#i@)82 z`?RtM9MlfYTluGCcg%9sw${vF9Dy%KZNYo|3n&AK!PYRcJ|ALF-mhM-MxT{{OwSij zZ|sf>AYYuFJm4n5*S#thvF+#4RtcA5nO@yZ$biFr=UuZy?RmOL6??)-2a`etM>;&l zm(f7%`hN9>WX8IN2~5sFE?hhg&ajL8lNCYCjGW;o|9t$W$!Q8PRV34eXhkX{ni~Zn zPvWOZQspqll=|>ob;#iwBK7D1qVj|E0VroUdXSbus2&dnHlq>D&J1*{=x~M2l{ru) zdJ%};g;IzW&;4kbCZhNx%Uh|2xzV;={cb*D1b6>?T=m1p0CXJ`4!YEptWX=rpbJLm z&C!>o}1)#t34=PC_BfAQ!OX)i#Q)FXl!{3 zDa~J9eWbiyToaRN{z}FVaI}J-22?aegno80vY4bqL>z}hx-f-$j7|Ep#M<)~Kg&cglQu_+he3;4Q+|FlBNK~!$ zZ(=;FiYHq0D!ul9t5*Iw#s0r;ru~n`=s5q$U;RI7g@udjKg{h(+u?N}_g<(?aYrE6 zaR91bA*@LgO@oaQg_56$1u4SR12`aWKoWeuyQrhSiPq1~@>*87umiszc{?MG@2ViH zDrI>h{QQWz-DQ7$?7F!L=ybofu?cMdz3}VmLd0}@*}Fc8!sO^CUGMR5b9g!q^rWE- zX-j>SgES~n>EaO3`E&3hPEGz*-sR|~vZdmt_Hdck#j&G@x9#6i$%M#$zd6y}wQd~0 z4l{Nip_p1Ku?)pW3$&uW!(K<2wUW1?CjsyMcY|5ln5%n0tT@OZN|YO{CvNkLKyT_7 zO$v>9E&j%&$;E~-ikphY@$qnJF=MANZ3bItw)HA$4qdwP%+ziZFz{lO`A}cc^xUuD z9?UCD>DA%~ZUP1KijLrWh#mJ$6Vbn#z)hIQ{E<~n4fxsKaOi3`Dk<%FHEJbI&1|n@(lx58uY?B0W^TQWwctpDSm2{S{2Ti$+t&0U z;5t}ppG~3ojkP^DJ*Qdqg%^X`jj4GL6vNur%Bp0A)=`*}D|Sf``j~JEeFD*%H}W$y zqoAUp>3nl5L{kRk_TKw8ZmGrL;_4z{k)EMVLGGHbc!OZ&&xT@itbaLqT1c{II^jfayP&C~{`q30dpi#TXl%VQR(J3~< z2C&HEYMWi5wqn>_DN!P%lQ$6ekCZaO`C5Z|`f?^EPBqG}sZqgDqU2}WD5Q*R{bIDJ z>?rW~S|GAcTluAFE(Npg54hPFR4+WEq7w+wYB$7CuA}%~5vKB1P8+i#WZ0w>JPc59 zHA-!A5W>Q@teMw^KulTY&+wq0CCpBj|><3W289R!QvDGr-Q@wzOP_{hco1x zwAZeP2=%4I;gYyP1DxEd2pv2XqFnRt5-1$J8VeXc$1=B9TX9Zqkvem4RKJ9-E?9US zW}IfnmoH(`ra;l8SOJTobwY^5JzV^=cf?3??HI`Ek4Nc4l4Mp}j>ey3U#%PnMzMMU z2KQ&5!%U~IB{J<3#;aXXf3>@%i-qR$*b7fBbyT7ccH<=0!M>j_AjKzfR;`x!&jHc0 zWtDYaUF=0e&Sk!=0C1G3fI@s(m4W5jFynq=qeRUju8U$;+m{wCV+UIFNv5~pbqV7g zAA1e;d7tevv{@ck0PB`%y50U{(jRi{%#ov$))OO!chy6AeutW!>B}^df}n??$&V$y z&j?94V%@VGor%3!>0K$i#s^2O^?=;>^Yqo%GV0HM6*F%ZEIuFai#0 zOx?!f3nP`krp+$d$#VK@6L($N%D(fb1vx^0KK72%bALGY6KSB>_i4nXeZ6;$Gw{|x zi(oc;SNF@*2`SunKtV3(-$@4GW!z}n!H0sWjoiPb+ITu5sG8c&B%S41;;)l@=!q3P zf?n@W`nsQ;eL2enY%qQpdFqkuh2H4l%FOsrc%scmAH5+&rns-+o5=bc-!Zcmq~8iQ z%&5kaJxr-0;?(WHF+P~3x~rtHowz0IO&H>AoqRP}ZL+*^0@P1LH76 z52T?jtdM4;dn?conYI342RP~3;c%9Gl(N^XCre*3xkMZb^SYMqsz`Oua-oOnZ{ssM zOYQsWkUI# zuJT(i!Gv+;*?f)T?vo^yuQV=3-1GUO`LY`O2_x?$`8@RxyN36&ymu+zwrS1rv7OGP zG4E3DX9v85Ab0K>?|Pj0#~skK$T)w_pOn?O4M{svN3qgztGvpgM60YTYWBI8D|%Ua zBRYoNu985q@f!TeCH9t01-d0e>p)_IYxIhHZl!Y58O`22Sv^my`>U4#H6%8wMyt~(>~(kMrXHJIdJ+%N1DuT_?-iOQ*Y&blR0r#_$ehiX zwZR?&!1RNJ0~_7i(2Fm3QL(S)6qJgmxMOz05Y%&{#j|9EsjD(3oYdBd87IuuJBg9! z@ieZtRM{`oummnxJMd?f4MwFm_}a-2ijWa6}?pJ*F!Wu(;CWuM!YI{;LNZ`$?44^f~q0X=Tl=|kB-&adFtXYW$$XHvRA{kP|3BWnS#EN7^}J+p@BUHTr4cU^$*FoiPrkg z1HOtcT#_Eh5E!NkmCGj&(TNO+goxX zsy!2k*o}Wdt-%*V|E(nXXO!-LU6TBdrqMY6iNgGE1BC_f9~vmqc4TeH|Ed!GKpKFh z255MLK2xmf`_#(`ft|)P2UZ8VAhZUUzwG;7%hpn zsyqF;VFdBx{MSHs4WX}&&xhVOPUFw)%|+NOZSU8g+l})LLVfz7_v?l8&n+pu+Qw`y zqhL+iSvU?ypO=esy&Y@LlUMmmJ%hhAFLjoGD|fz{dp{hW_7FlQ!|m+?rz(EE)Rj6V zsUrph?=y5zz!YUjA^30g`fh&xY5aWKxJD(8bNt(fxr{w|z{rW5?Li*Q=E(!?U9gCbBi_2X%2oqGN)U97W(#1755wmj^ICk#l++sCR#G{Hg15m+7 zWA)^K=%!fWcly9_9a|rZRDJ)^IPhyu6EAQ4@^$~O^=kS(ZcCm(CsR1iJoC)6K}61e zcW?X-olhlb6+p3VvK?9MLb4P2TDp|i%-UQL^QB?rh;rVR{rk@(Er#Y6!fG1jfK{RH zjH&@Zfe#U~iylL%2gp>?clVhVJ*IxJm^1P#1J_8IhVIImQd&49iE!&}O$m=YSpQU^ zyRM(`7gG&=8ai_v2zCt;Xo%Ex6f!6yFK9XZjVh+!|klSWKK2UkssyRo`@%4 z2g3WDhCo4FWWf#5WFYACOeVkF`WPT}O8S$%w%_{X;T=mIew28-dyJE(j1?-JxJ5LZ z0QXPr9*Zi)1p6!GMe^u{)4KBC9CPMntXoDQesb*v$RtkkdQPZ2TZCj9s?1Y zKDyHd)#rjXQ9G&>F&LaCk34XVXM{&Pb3!fsJn8tX32_(#k|9i_^)x3V@BaV0&qDT<=j8lJ-Y zM(mF(I-8$H7l1Y`hl_=U5!WAj#1F2hak!ss_nje>`H>03JcVP^;tPtHJ*M&n3=_wtKMft3 zW)_{$aXTD-8{G6HeykQ?2_|xpKup%@`ihp4N-sy*im9Tz3H?ik-}1O z6I1{M*P|DN=i*pi4sc=d#Gy0w?=;5qB_3$92V@&Ab5_lw4~)?(mFUJp+$;oGg$|fp zC^LV*3IQnWS1_n8r$JP*o2~v5F(6nGqMFQT{e}Qcu`Vv^sD|jb02&eiW;sck_f9Y{ z5Wh8E5Z4Ft2nqXmbu6N&o%%V@8j4r3#3ESdzclP!##Sf% z!p~28p-V9d0xwegtuWx5#Jwl9rIW7QaQ`GZoh9zwGEI{A1WeQ_3%o%%=k4TfZ~}`) zi-ZZ5+v+so`8oTx#M`d^d&1p(xOc5K zGg0cwn;cl4G$pRw_0s7W`mD0rB}j)Zd>d{`hEWsAJr#QNEi6_rKekni#-<;OCRikS z^9{C}%9ghm)n0LAiO2V4vx_LnRjYp{LTg#2V$W-2*_wv`Qhti9rlG)E$JmH)o60+0 z>VuJ<$Hr@Mzxe^NOu~-4rcM_1qz=Ms+^h7_vmNA&&s7eDdYOZj4^x zKQfj$gMaXqG!uXnZxC7-_dYZt6lCMaIMC=w!S*%aYIB^3NN~xjDUZAXeCLQHBj@BB zC?HeNBz_h~ykENT8Oz}7$SVBSG*L)_;_(<9@jqjrB{52p(l5`q;PrO9Ymq*yS2?Sn zPNZ!DvvnAfJ-&r;G>z5_o+8KF$oai`dMNOcv1LK& zFlLDmep&J?))5mtpy;cw^ee9ZEeo2fx)~VNG!LL3qK9!`NIe;&TZIXGr;+dWs}<^J zMvQb2$W#I0aESjhyYflI*yW9EO90#8z8LFdONKIG%$PY&ULi82;{yAUij14VIVUfQ z{YZGUiOlsKa;tbS`#H0iZH_x8s_>h(*pW#taV{`pS2Hd=+(Kx$`qcZ zwpOtek4@c37NHzg-yC%n^O6kKbTtHi@*DE?p--_%wnSUZSxtElFtZXC1@Jic5Y~tE zoQk7gGNt)V-wzdvfp$!Y*>bqpnS`bN0k`n6PF6Y8aD8V^@>9h#)2tudnDa8Sj;ZuT z%P_wd_4y-r5Zz>2@2S~B7n$-O)B(}=e(FrW`)6(%dmVk_ARX%rxvh$ zS8Tr*q7{ILW;{5@)rTljO4yMWN9cHWL$X@!7cgu!2j=0Epw!<&rA?do1H?7TEjq}C zn&>^lQGeIw1@bJ6xX5nCamBreU;nmt2qf&tYkI{~wj4YzHqxsA)mEM@lg}H?d>lPg z9WNFbDa_xU$qcbM!aY?qXqSzt-X-DqwkSE$rk-;z!zlpNjRI`NMlC*!#4v z5K>&T2mV`4_Rsv-|GFmo7YOzLy>sCV@k4^XpLAn3qDIPniUi!@fUIcuQL*G}A_dDZ$-Ytc#3CX=0@}4Cj zb&I9vtI_Gcuf`;${V)V^e!QiEkI-`}u3_`)A4f=fxLHMd-C1q+w2jHNQT|`s5wQH{k)0&{Ud<-m#>Wy^&}y z<_-?ejuVYtgVy_}aSmby{=!`nx25klz+&c`@bFgH@_XB(cAbNgnFIK5E4^gR z=ibP1#uYWvrT2%)0)I0XHP26zlZG3PzZ>4CaA4!F0x)MM@&bKTWIx?&B)G&x1}>Wu zkc_+^*?sqdfG%n{+T)A*6F6j-~j^YC21G-r$ zZ_^5p-?BV-PjRYpYw?}qI?B8(Q+#PrxH;v$h5J|mi5`;98ZfBUaNH~B!!$bcQeYKw znd8I}#UeUh$g(J-T9_9TEi_ObvlIRL&}YxxnTJk)v9G$(v1K!{_6)?D=)Ymx>0sax zR%^N5TvWm}RNT@cT);_XoIE&~YZRFw!hKt-K^+1J$qc%v8xN-u<9~p2Boa@ zx@`2mGD8RmDvtHr+bkVgV|t30u6f+Ggo64M8`cKyOj(}LJKd0A2{-4Up7bG6;uetd z{uWNZ8T)?bhNkxLe(BafgiaZYA5WaLk$!LCpe8qX2Zh+2w+AxG$ygzhJ#1PmA{?qW zaTgI_W0cHY7{uVLaG*%BcI^lH3mfO%m%q0NtAT7Lw=fu&eC4rX!;4W>^~|7nY|jNM z7xM`&yprLuEPK zO9UA5=Eqyw))hjV9*C%;Id4q35W`YN3tf&Rs9z(pPU~t$d_7}CPfQS(X zh9_%cve1avOY4M zml+w1(jAOk$&)I)sso>Rz-TwYb7ob;=HvRcTSkyq;&$F#OG)g^qZClraLu3E4)5_1-sO0k7Zcz3@=_~~!|6(#dJbV~ zD_bYoKeiX=B1^leYVgU6!cH>c)#_{t^(wj+#Xqi{mjoTO3&>MCM=As6$*Nm<+5K2b zc;44%bMxeza@QG@rg?o@T`Gcd;bL4OA(&N2;qxAGhWv-5N?|uOeh$S@y1;mS?}BHk zV2?Sv)29T$QDUx%!gNxM4ddQ0oO1SoamEN4Tg@mjQ!_m2lo)~>*f=Pw@772+3?b_} zQ|PC|Y{McM0!H}+umlW(VfXsSfN;SD0_=%a4)JVb$)Sfw-jZlU=SR}UyEPSvg#lb& z6F=SN=gpzlXbrkkzXt5_^NMIUYC2Tvm+iI|t91oi;&K)qnmm8FaFzl=8lVxF2BoS9 zqo4a1mwdv2w;L`!ok^82gCUiR1inJArxr9+vYRyM92dw_?uW=ExzzWH4N?0vXHdfJ z$B)bfEuvAdh^l##XI{Mgl|Q|UA2E+xUtwph(RFq%xJcfOHUzF)PtRXZ76R=U#z%0M zR}G*d4rW)ODEz|PTGVMkt(_WMC?45T|b*jQk0 z5_9^uv0Ia1WCOVZqNp2c)FlBF1jG~q?y_ozic{mR%lfe{^t;AZ8aau@6|ucxULcTNnX}U*EN@ zXG_Cu7143`Yv!UFBAM;OkF4F^QB=?}_0bxRYCgkV1qzJR)lQ)e&-6Em+|cS}t4 zBlFpHTZk{ec`WN~v22-jhnUBiiDd zATNTOY}gFbOF>gGfgzB_Z;^b%8i^?R(fjib^|ZfL4qt`DDPdyPx9|ebQ-{?&5onD! zPf=5yS4n5`TEQ5^Qf{cUiw6yOOAt+w!$J~e$jZ;?Ve0wkCVu7T@)~|6-~azbfAMlF zzo#G@wfn>5N1FIHnGPXY?cG_~-dWzJBEru-8MgOX?5(L-L?>%psBf69F($=a_l=h= zQYZG!WrGcFzL526dKCihEd}}AA2X#x-mrXrR@YFZr3r$HC$0aY1ujzw)7%S_ZL?F@ z`>WU_VUK5@Rr={f6H9BpplW$aKn}f8wrPq10<+Sy>uyM`pq`_3qPZ(%w^^>Z{Ru}+ zhLHZ@fulRK%l;}oQrM!da+tG(;8ozrg*rm6Ln9PGf;hhIiwNQnEoh7;kN}_JC=-OP zO1iF74;`0^8>~`N+9kdd^c#;F(8#k&OLnjT@HE(a34cspcBljJp~4y=Vi&n>HJlzJ zP%b-QVuq15W=~w&-*iLwX$>|B4Z6^nrx4JV$P1NW<8(3q^r3Ba=Mkvor#dWKRGmug zgI;L*C0AFn0<0!lq&#`?0997cd&F>);)?0Lyrz4r{+M~t0^yWn34YSBc}bra)$uFp zNZn4M#d3E|V!!OvSls(BGh-%QOK*uwkwA5W?V}@h?=+)hG!H|95(S;R_#$qAu|Va2uyA0s;SCD*&isNE3QCGybCz1 zpY4Ugm~J$0#5*zm5paU%q?2=yH)l7E%*LM-v)bh-m{MGXGv!xO6;xUSQ?g()COzF; z6XCrwwy}wJ=utQB>3U$61nkM$z+8)#QnUeKMR*ntFE7R}Uk$3Q;pp!k#T|l`SRZbW;9EIB42E}H{Tqvkq9l>%fGUJ z<~RsfcKt=~)qqx=ktCl!3|Az7mupI7neh7obt03U{afYn&n(#gy7KrRZIE&P6a4<) zZV(gOf2cep<2GASdSB||5og1hAIuxuK^yY+`nkHf_`1JwJ%L2I{o};YNE_c}8niC0 zEzL0$YQ?4@c*-K(;(gVpC8<_(&aaQQegQe?<7~I-t(&ei0o>2Y(Y!CqYyKhKFtQ7WWOOE!U7D&tF zf4bLt8U69)Z{8B{dskqlylrCr;iR5(tFdzUMq0e$^|Eojc>E^fOEKXUvwh{e<#Q?< zxx3fbpODA@b?-YHJ4H=h48C9wp`UU**7Q1`aSIWE2OKZkqi(U-=;1!&P?| zeDQ&31+nd5Vgvvwvhm?_Yci*S*so0Q?{YDO63+;1pcDH0agwn>-fp^WU#Ikdj*E!b z&KGU=7sM=!6}NU%Mhhu0z;%06lWCCIAz{O&UdEi7NbHej+03AQ*ahgaVi}^0pAHyN zdY~k20fLMPjTHHa)WuT&HQYqiBmDWy1JQU!+VowTtNW-u)4p3}b&u2#;KXzo7^nQ} zMAfAEBcH4Z1bTtAbOjvAgwu`4P_*{o%5s>D1L>$=4Sfi@0h;G1q{$OJTh#n#NR&`f ze_~8;Eeoj<(@~Acn+88AGENY3&Jt*=88%dRo3=PF_OOD1j@$*o6-htVE33Gz!l7FLNn%g89X#fb;dv?bdYy#4SO3*?lnQ*4h@JfZd~1w5Ob$R8?vcG z1aZUI{2_uKm$m35R)*cahzQSIKDapw{l-(JZkImPsM_;`f7H$k8tT|4Gf(qD2~*_q zdyqJ;Nq@*#&SEb&UN(4PzypnRY9z~DiQOaof#bW^*T-cQDG$x!p;T&o}k`idZ ztG+#S)`cIL5F}+QUs>r zE7pPoTKX3z8w+~y!9!g_VjAhu4!K^V4hIdxosNe#iNUAS0GYX#;iqyYzdF@YY1Sj_ zm(%glbCvdsgcL>aK82s0L;k8VKm|p{r9M*kQS_Y1GO1gouIrO-IiEi4;zVU0IHrlu zU0XPA#C%WLz3rq_f}7ki%58>oU4a0iHyDtvwc>cAbwo8ze<1CoX=~wcAxD@IEPPsh zAxcoYKPH)@grtLOx36s_B@NPR`TL?NLB%I=T5E zj6uBsC4bLeE>2_`v_+#}jl@eiZbnQ~O`t_6lc3;c?&(t;9{Jpv0B>TOkhg$2k} zsU|`!LhPQRHI1w-tx6bK#7Ej*)WOENyU=!h)SX-SSOce6BfuAn4a0|NZjW9smF_pHc&{hTZgO}PlpaW7 zw&HJ0|5ygxx3FzJUJAD*n}P)s$((CG5p^aIE(?Qgx$Dx^1kD5+9+itPOc}e~LqJ_U58juk@r!w>>IMsh1o&3ROO;Xp*MK6X4pZYF8tdF6xf% zZS8?b7Clki>ZTKs_4ibh#W>>b8+a%|4iOR$5Y6CD?C0d?|JIDxW(KeI6^a$5U6lNe ze^Ck-$zH>P2(H1u@NZ8{;f!2VBv;z*{U*I_kAew1UNix>OF=1b?QF|zt?1q0w{yS| z$=S56ybhhXqF~=rkPQ2wOI_lUmtwW0X(($VV2km(vhZyu&9bYuG*R&Pj4_s0`s_V-w%-P(Y_+Y-z36NDe9Xx?|`4|$gmX>fI8r#(RD>J^Nt|NZUu{c(*+UhuX)f~XP~NV zHyw}uRBBB#=%Spk)=J3iJj z5kRmhpTIRCY*sa6Kup9h&!9%AR$!1DPD%~nw@^?@iT?>=ik2QKN)b`+)K1fegId63 z8D?EmQvz(-5vn4dB_q*14i)-5Mtqyxmb$GRpU(-;3fn}Ab%JbL=R|~=!c9H-Yib#( z_5W1CV_!0^st+d))7<$0EaWz<_kxMVHl_g~P4T&nHm->AEKaIWH~Hi%kHqXHvxbt+ zcPFjd)tHRj`e_gm43%7!qf>GY$n^&*?IgD&s_nd$Vkiiqgh#g1u$CSaml*#YnM3Jj?Hi&=PYBALtS} zFSRop0&QohWOJ4zs5Y0uxgSdwp`+F;&G>{fH za7)CKCnPg)oh@;2S^QJYc3LN$C&CW-rV(iE!`hikk+*W2tSAKLV!1czPkWnJW(V@9 z+w@JQj3J{b7{`k@<=7IHPF)xTR=P6AmfhdC3L3LL8iU))I5x6gq_#pbxHZbCCc!YO zA$qLDs3=jRUe5y*09trVxS4M`WSNy{ZncDibC%&eQ%kK7^}8MOQJc*+=Hfa5-?y0jBBR99`KcccU!<>6s^TZjcl4kK{Ocp=xJ|zqhB)-|z&rhT9 z)&jl0eIAZMS~YEqJJz+jwvPoVkm%V9rdEZHyXGJFTgNwjJHSAF&TkP%lqq?of12aI z8hqXsj^D{aDS_Rcp^uezkIJl^Nn!+frXE>B3td$+gg{>RA5`wXD%}10`id$7KXy>m zgHo3;bHm?VJx^fs3+L8(w5DLJr&H@}TJDhp7oO6b!*H$PNKN69|GIZEr`~7*&Qcqi z`xMzKYSS05Z-YQ+jDkuFeO%_KPI%vK;1dIB39H|$8JYV>>e{j@7v4z#`NBmT--}On z+W@En;!kOr_q)NmIv50%fq05ITUeMmT-d3RKWy!fpwbZR8~MU+5C)Ul7}jKV=N%sf zxzD*o09>sQX8${sX!e_F;g(^8d~0WeeDqi&n>}Av!@h%f}p|^go8W!H-@VpBR4YiWFCbMkT)6n%^O6OWyWb2|6KAVDNVD8r@|M5^btnc z_~en63WVb%K#z{3D~NtbSsN-ebWq%!RKBj!ylDjCW;NyTGRPbVTpSAJM2BSkv9BZ{ z$XGb|4D7D_`_pr@)=FZYQWBHUl|eY{V`9hHER!q-4^{(~M1xTjWBD|tbtqEG{9fHw zczo2PaN1EXohO+Cnfa!#IV7YAum3c#YjEBXc0Sn+6^Tb`S_ZG0d1`w*wNj=35ZgE3f*iSJM_4Owyk3A7KV?@UlR)097v zsj-_|_yl6`S8|K=dc2`)Jp6$%cSe4=$O*Gr6?NS@owIy{E)t)bYxAa46uru&WTLfNECnl3W!tu2lE&|&z`%0ZOlFaZNoFaq>*h)p za<<_|By90Y5%J)I6QF3*}Q5IpYQ`L zldH&pTchJZnOPr068J~LDcavfkrwvhA5QeD@>4wf3MzasBQ{%fTjGHgl>#SVx_AP= zkx%N2tof&h`OSXTsy1k1qc-=ebz@c%<|qca1XW}rc65jEX2#DxHD}qU&_l2y)#u|; z8tG5taE*I3T0_t>52F~%`i?ZPK75y~8}XH^*o%8`CLYJAp@mg;$JW+^nNU9RH6-*m#R6mwk z5+r&nO$7^y`43$PFmMvA#}+vx)Ma)02Od#&E@-!6W?nrdb-MA&N39Z*!O_)g0q3CR ziD3k|s&nBW6Gpe0cK86=%cK4uC>XO}0l*+yN;60i8jZ^7Twpa&HHhNq;r%5cJpra@ z;hdS#V-~Y>l2+o;!^odFOvTW@ ziRd073i~Yi?7OxFU#aw+{JIq^Vq#6YPVUL1t6>e5fbm|PzJ*cJyTISZ_<8~=CIkD5 zUQV7w7)j+c(vJqU%35S@t7e`L*$#P8!$CudHW+fNGS!ngS{Bl z_jDzD{Yt=zX|)2?8#mk)5y%(p!e01rw5q6=W9q{?=K+)Ety`%U*6|BG7`Gk`cxJ&f zV<_t(%o)oPp&2T+yj}^>(FCyAz!$;bheDWZnDXOOu39-P14f?^NE>pb(!1rrCdD_g z8;^xW-}tcpNRtD&))SGF;`{hq^EKuwByNs z1O?lEZssR5t}zaIZ**g=>L9LivWKsgde@#e_9n-|SNgGiUl@hq(QtBnLzRPEC*uU? zR727q53^gewI^3Hs?8XaE>0MaF7Y&3d@Q!}b5LM2*T5NKpqt2HrFVjlh7=p55T^Nj z`>40YKwJxS$enJo-k~y$s(Ft~Cp;NfCUH)Zy*0*qMc~$D%H*`G;exy^w@1oevh>&ajb%MPet0lwH%vt7bJeqpdV?4OX-C=P-*GXzh zwO3HkEi*!o)z2pg-}?QP$YUQqNPpX7^U$Z8cO&mwsG}ye-g5snM~u2+mt)x`DraA7 zmBXLDn%gZ*)wF2Dp^Y?N{fxEl*}vu^XREPNrzgQOcfZJg!k#(IEAUAr+R)psl)>c| zxo2H=DEMk;tYKMF+@P7o-H)g}Bi!^tICEJaj1Sge=K#^dyxjAn4YV<54hr$ODoDkH z!iLQubrmIV?HH;xfTBZ<%BeM-xDD6b-_J42OEoh$VGG3s;$9^QV>)ne>^S!_asY$F zZ5}71$ZmuM_p_AtYO^$)h6v5>g z>F5$rVL(Dk(F#kGJXM=X=pB|0Z$`DT8n)lYW0Px-@&#=`M)y2_TlQ<(n^iX`ZXFm=(?W(2s@!AU{FPF{~fC z`rChJ68MZP|3Bv50Z6uO-5M<0wrzWtZQHhO+qPY`%eIYOwzbRFE_I#zZg=#Fccc5h zKkgsh85xmt&CC_Ka;=Qa@y#*5F(~AUf7}i>>9sf~n>j$|j;25Ijz#K@`_nU-X5h$M zz0E3$q{(46Cm|{Q$gsxRH}u8Yzx8JBO`V>31?`n?S$iF%5f=6lTtGV!0j&44URw<) z{0I*9@a>mVLi};b`SRAA@YP4d?+ESAq-njX>D%<>Qg0Rf=DfRL88G+-sERvx@h{7z zzw5mI6hUKP4v4~lWAC+tXfgo5{XR>rG2U!ulew~_L4#s8QkmTgLJ>uWVjBp z!}Htfevf12>-~EE${K~|-u8BXw|Tx3TZ5S6>Du_XsY5O+!!g^|EWpN1KT>6d@4fnb zz07rj`x^Qu1$3~~^-|&Sa(?v)j8YRn5ENrVNBi#H+$~v$2SFX7d7Md6ZNS9|P}ALG zqsP}$+l$MKSV{ftH#*>HwDtjr+^_LVki%+SVmHQiSC=>)dQ;2clh}74Ycwa+72_vL z*Q-extha4(EWSk%9KLg$vzxQ`)x$`rD^Ijl-nFgeG3X|DnmK$U@^wxn&raZ-=e6&e zi%YKEol`-V+UdbnZ>L-LcQ4QT|z8r9JUp2b`=Z|y%uZnXI4R80a`wdme z^c6{pZ*%U9WLa#uLJ&Vs?47Ze*AF%=46SsvEb~7OK9jc{sUNd>c^iy~s{tgKrPWXC z#UqgCaXi&st9eiGu*}2SU5?xp0`@c2DZKius|iz)Q>M@c8H};i)xWT-rw1It?+FS@ zM$|FBgD!bwLDd9gsN(@VM(pEM@;jkI<2cBok&wI&J>+(0l}z81INv86*p6r3%Ms6m={qf2b#$43~P~@V4O0h13buZ-i8o*e7!DG zsR65c6&bdj0mz=XM1wTKbgYZ*GwR7n+;InB-gi&r3pK54m z-wG?abdEO{`U-r81^>A! zsW1`j4S<4|UWlZ+0PxZZI4`V7iApdZ%EB_w-%hS@sP0oHIW6u>?%6uPA75Pp5=G(I zfD;8_Q3)iX&#YbtCNHvc=!#2*OCX5e7r!K3nSXhtKNgsQY;vo}08)yWHiOz1e;7z< zkxjpAuqi5jTL}^hK+w#jYRkX^FVsaJBGf=%8vfuwGHAKjLFF!7ABV(KC?OiCmy~R1 z+({9HE+8<`_+)}e7M&76vGS-AEgy+V68#H+gEUBF17&{_|6r1DU#e=oCxX63%dPfc za`NRa>?tUC91INcS+SZ4HO4ejs{)!}LRc+R6?@|>t|Vj+Tb{B5AzljxnUbpg6IKSNkNaQ>aJw6Z_{vCl64W;+>S~S=r0T?<67FF=r&g_@hF!6HB)C;72=wCsq)Muf%IAD*hf{%H65W<>*!CwRTDY;MvOFNaxB-YNFflJXG&V%mS4QT^DGI@29> z&g!xk0@(_}WL@Qms`9CbiGqHD3T$A0uo?9s7Mte5og(#PPLOjR2;-J~IFqSElMQO; zw|;0HuoMJb`N~q=tap5O84wD%@BX3g+mpih^4RV`jprwPmdh{{0QA`5YXkErfq{AG zMyHNPr!>lIKq+CW6Fek*HdVruD`YBdkB|`b0xWT8md>MsidB}zB~lp=BT@FOAr;e9 zr+g_fd_<29gZl}npEm%iHpJTx0lL%tmc4d@R8HB@*bxu4&7Y!AZOD*8=j6NOJE0M} zgRyfcl+W4CC*o>V=Kqr)h$`GWZ$pwwzAMmWPSq>YMS-c6q>x4I0I5)JIE}iW12ujo zhnwqI+d2eQ>#CI!rD-=cm0(v7AaBA%+?_^*bEI44E|Jl{{jeChW}NXw#a@v-Eb>l? zJf#eHIDg-_OvXc3-NQ6CbY)5-jyvDVyw0i54-{(t(1+6@XWZWDs3x5h%Q_Tt!?Pel z@ks!L{K`tcSQ0AQn5eZ`8x0{9ELaD5Ef=j`S59U!TS;kwyr&B3RZW|jwp$l?TpaT) zSx!s<1Ar*d6B>AGWHo_80X0tcgz+p(S0yQ4M?aq!_lRU{drH!x&_{-TNnQ)VV~R4f zxG=%E=}r$*W%AA+8)WrC@bf5LNc*>&f#JKx0(@~Z+#pr&O zMn=#1lJ+{WBus-(t&5VVB`C9gTmKiP4X@PMhd;&_Z=vv`-|Zc`l=#BgK^H!bnckIqAx zZ-$})0|aI>^D`Pse3DSOR%o@s#>?1#vZY(S#YTr6-9W6Xg5e<<9X8x#C5-B`#<+!Q z7|U)#$s7H(f#PJf(Gj{LRb6T7wkMtQDq*NX8&2x&l0@b*cQfm$nx|aN0&09w#~W%~ zC<-n7NIF*|$9BdToLFQt3^RTbJV+9S^vbI2PEKF3juDWxUzsL`| zCi(M7l9loJQm8qh^2dbVGr}jflN(1C>y3o>HE2gGVm*hsdq?8Jlk4R;8Jd8urVrfM ztG9?kn~6eQs%tQ*+a^5146OetIX%7FRA;;YcxPqqEhUDZAqJMY=;?(75gK#-Y)td-!o}s_TpCZ20 zGTb?VmWPff{g;kDm$iZ1z0}uKdi&Og<*_wjhe>96b1FsRgsgSC9vU=kY_Yg?1Rr3BuIb~UD*_9S*SSM6Yp-(JN0cB5!Hd0g12YxPBC zJ`p5slPV3=;J{#<_n1(gQlnL90Os^Z6B+hr&_KIRiuv~!wN`@N9*FVhLk&9_0~Md7 zy5jU;C*gS*V*}b^_DKTvKsgNAL)}P6zH%qip9!@b)2_Fe^Bq8TfVa+nSpfZAZuXxp zfH?nhto|PtK>yh5zlEzZGc)~re36bu+~x@4x1}_rtUhUAvZ|ZQW5^iv^#$U$!)xIo zDKba`&>DP8fViOlyO*B`94AkvHJq91$p9Ls+V^ecRt0sO6+7nZQ{O(^S~;51R`27^vIx3I;^Y$%g z8S886Q~IrOE6>BvHSVk3<92KK5*ncubAKFqx_Ri?Y$t=H73jdiG!-dognKv%2x95g z#Kl_;*RP_Nv8Ci~=SO`k%?A2v_~44;5V$5O8=1S>W#sk^Se{KZl!TZa9Q`3SOq)K# z@v3Im>uDfvkK524Dz}#39GnH80p?1NgYK{~u-d@}d=gWp;VO=J!^#_eixVC%Q2$J4 z9vxg#3;r3L%2vkH(r_GlEq5S;<|jI-&)acWT1sf;*zzjBZxO13ep$hYJ7#xRK{wDn zStZA&KzBf@h}!hx)mCem4L+uzTb)vJ;cw1 z=AslSUGf=5!;>}SBSCNN_TVk*Vx-xLSqq2eXBo%f>gN{yE?Yd z_i(~|vP_!Thx*eR#$#7a#o`sn5Y;DZ4!5>pu$cF{h@qkAwiQ*eRjqT%NC7yc9akB_c}cTRIE@Bt3S*`+tsA%V;gw3=a2&I24jGi2# z1ZF)yp*Oh3Ak9zN9052D8=lR@Vi&U?!1#+Kj5J|cq0^8O0|kuDUMsn>4JaWMCf?#3 zG{2rhqRGmtPsTKecATqsN&2dCB$w|f*K-RPAw{AYC%B{PZZg(R>(xzWYMu~_pl zn5PE4N{ z)8OSSIB-U@p(Hz?jb9rcTG3E0I!bdu4e)a-?+QD^gfgPF!C&1PiB6T}UgJ`-kV0U2 zHNK|ImT*i%eXffUf>7l{$|80z?n#$o(^vx)S`BKWqY&I zX>F=?eWIq(Bfw&Ls0#UuT<(FtOn{T6+-spvHuE~Hyj-QFK&M@I*Zf?_@+rcYdFalT*A*c>n?&juW(^E_v##k-=+bNhy8t2lG ziKT~AirimXp3c+xY1!)&CT2?+NY;3cJ$}bmgHURPnlTXoH}x!=M08ZNIw1jms=%gS zEpp?{F%JKy?%AIc`Q4-ibWQ#+V72=z^{bP>i69Iu08x1%2jsJs4IXui_X_@x zMyw7!>kIh%zna5&66)o7708D6(h84snV(>|af&F~1cACje0ZgSQmE(_RrXWA|~4>^G3&Y+XA7Qk3%Yw3m>z!Hp& z<14fq7@^i{BRa>SIwyK+N0JZse}ATN^l{_x+>?FKz(W7aq#E6^U+JMVc>MrxFTWUH zkhs85{JX2Q8UES`h2QR~fv9gYV3 zXbst~Z#f{DxT&b3C+;dKr)#6a^klkF0v^38mR#>bD>KJz32Q~_r~U5b(`W(dQEfo>jDK7j$|@xEaH9FaPa{akEEe1q5~ zg;ecu^2ab1u%wu$@J|HC@l)=yj;!U`6ze-E$lpOLnmV~zZkkfq`eFHx^=J?I6q$m% zN1)vrTIvg4K}?kpc?PjoftpPKuvTAqo_39}D`jS9k&F%WxWmgUT3Vqa8b2waFPM^e zX-S|n2u}k3NGmwN+$MK+Gqb2dS6oVbU!Ah%u}z-)-C)!>3+bA2r?O}FMUzpqKZp@~ z@-B&FxPgj(pbC$Nb%W1AAI8)5Q0f&%M8$j}2v!Mi zD@g-DB=nfY^;Qbu;Uw*WhX8NE#V<=c5Gn|8t=w5=4KXF^8A^ULDV~WgVJ~YVKGQvee@hO|vS)92r5_3)cCkholPD^!vReB&nTVFiSxY^3u2~s)Cl4-tEdis1LzaW<4KK+*7I4n;?oLZ^ zjxrHhUkm083tyykpaRt*7>{gT%vvg#&;a%BqNd!L0X~@Aq~|J+!f^6>5^!JvN9|(@PR>#&L;v#1XLtpH()EhC(sz?gfXn#1i$KJos4MtI zgJ763w2U8xaP)4la08OdrOZfS%P|+ZEux0Rk$)OvnMR2t9wABe=+pfos405jya4h~ zM(%KKjkbinReY2EubAv9{#y*@qJ3R|NUz?Xfanu|aUL-=Yi206F_)$)OofS{Z;n>Z z^As#R23bJ`8w1%9cL%8uMU}0lqb;lva6q2zV>IX6my#Tk)q$9U3gy6q1Y0)H+hPf; zf;Lx*I~>Dif+^82;;)xKh0nEYS{BPSA(i^|gYyOyrEMuHVd$ducW771=qy@F=T=LI zjFYS89$b7N$%JEni_SUd7YEjA`ou$4b5C^+ppsgPY8hXW5};AK(g z`Ij389(W=><%zj}Emn1E##mGOmT=(pcG(6l`{xg5Zz+=F7x$ymg>5KH*`jLX6NDs` zc_|pf#!Ov|p$$G(g$MaMBaUY59{$OzBWq;<2#|dqmFx~%=l_*TPDDd8Kt)pFZ>DZ| zhkB`^9*4yB!Pi)s#MIk+uQ)j>@_@nen$weQK_%i3D-i`zIeS1dRiq zDfy-n67|ug7Fyi*dK)WIj1&7Y_Ldgo(e2t+qvSUy*Dh>rlG}0;@L&f)*rA#P;CBQZ z&3$jmRBO~ymjSDX;&m*f-MExYqzyDe7^@B7s#0YgKgFFtY>(+zj9+3qb6g4vJFRc3 z?kqLXfEirX*0HZ?zcd!HvuG*5U3t(noOJb{RBgM@9p1H(>NPvBQx$yXgDcPipQ+b>hw<{YlJi+b=5!-ZJbH7 zM_lv>ouD_UI+yNPu|#Y>ecik$yq%*B>a4=OcuRg2i9byi5Uk+?P$#U=gY0f{bz2g@J84* z+gljyk&3QMKPQtGGIv?_Ht&1g>tv@`2?`xnE)UP+4a?xdws)t`%fayrz^*5lyED+e z=I-EvO4gJDf9&irK& zSw;EJHA8EuoH!~DEWa@rG;0`yMp3IS?_Nf<`_vd|%&NDDhT>=pjWoT$Qyz^`3lBUe z9pi%!R}hSW8;!NPXn@t1yN}WfwUI>#`ItAK&3B`FonZjQJ2`a*3X*(R11iMkkYy0; zX7*+p=Vf#?384h5<_HNcDcnvB}?%tYkLBwZhXzi=Bgd|$H-bR`zC+e z_2Zb$9&@{;WtPMpnn^7A_YgcaJ-PE0=)3vFjNibw9bI?K*#bn|+;_+%-mrUFt_*&Q zQhQk%Th=elBd=YaU+#vua>(VS0Shxu1e!a?QGzp`i?&(QhldwfXMuCy}pubBqEr7NX^dzM|w3`sG-QM`w4X zkdL6>TWc1mIymmWK7c%b0I|a=YR|HwG1#9}>}^d0%;yxaZ1w8&Eg$u1SU|Vp+{QJg zGLxDS{mGJY&m-kEka&`mDbFw;r@?QcGX8}0a~Tne?0}GL4*p05FPL0g1`qKTSLg~- z#Q{vPuixL&RbY_3q&dDactg8?jy&{;J0I)Y+^#VRYgxCTqt2EQ9P=o)Ur14~?M>Op zJ35YfB?BXa!;L!oAd{&kshz4J#-*txs4!azr5ka*1n&o~2HFVJGJxflJg?n@=UxEi zj%w8{!8~PD9_X+#f9eRD(b}2!UL|)?@C>8g4eSU%!w9wHguz#JFZhwy*PV_zrrf!E z0*M7ylROmuZRvY?ni|TkIN9=8IQUe2ha+HRH3y2 z^|J9L$XEp>YaY2CccURY!_1DghRs5}O(61$x1W-niD{CS6+nE*cn*>ej*jR(CyUdu zQ-_fL9o~dv8V|zdZU}_H#2~WB7C74p;_{Uke793u*ASO>a#wof3$8U}Al1#KMG+u+ zq;<~I*V2n$=B?Xsc!Ag^mg+THWwCvE_jXrd+RNZqT2*;UJRuI5&FqP*CHMkDs{@03 zCh7`dOu1ZK-^d5e8WyFOON;14nRS%rF-HAu`n#2+IlO=A)pDYyvB1LAbyrk~oBG5` zGVcKoJxOfJRd%D&K7m8eMihl7zS*z<-nVa%y+4c?MggYSPxIPkMHZU{yg!vFGGQ|f zKgL~pvl)ZS))yx?ofIlY>v5TAv=p#oc-`f9hfytyh}Y+5D7GA1;HVv7Mi=B`W3A10 z`J(tMe>Wm%tWt7}oBP4iQ z5#b$AZDz4Yx&;C?-el@~r`d)4+ zG)btDs0J`0E2{IW@x36Eja8<>Tc|4YcLZ0E3H2h6S1D~3v1VAPM+x;g=Te<;ViB(V z;RJU_J%wsxqnuOspq|rjPqr@)ZP(+mwV@0-r55b$TDzSex|frXA7C4OAM)?+OWL~U zxkz&P+S@!LlLDO!B`Y~C)h=2BKU>$e7pzm1w4AI8r?=%cFrx)Txd?oG3}_Vr zl%o>CXpXDoC6to`?p4t&?(sgfc>B~L(aA%kh6n9I2y`gd@e3|HbuoibFvgr{e+l#p z1PaQgkt&Lf3p2=iM>@{Ll-PMA3}2z*XgYN2ztnjr;SwXn@`noTC8!FrBiz|qOKM>u z*=vUlt~OmEYBd(_ZpfSjOEf|kEsi-^c{Cf%PDZ7@Mt@`cNyZLoT@P z3&bC9JK_7YP&psjV9{IW2=o}8x)x*rmn~{bgJ%}2FwwR><~A5WCZ*nd z>MRMz_e!yIITS^eIw)%{jPKg74Z*>wr9ofE6g`qq^Zwiu4~1cOthjW-==D-5OX9dR z5n}QMSS?hO_b;#w6BFmZa*qK&$wU7(z|O=%$H~G$z|71-$H>6J$V$M@$WF(=$)fYuiv{f*jZGX0wEkMdX86a9C;`h~ zPY4k3@O(dhkNyix2^cwB*xCNqj1mF8ilW4SjlTy36z0y(_D)>%^kx>$<}QYGMs_yz zjxJ8lwAKc;X7q-3c2@L;)^>*UHU<{9^iGaO^hV~4OtcJav~G?T&K9<2w9a<4PR`%Q z;Ye#?>*Q==U`%Ug`qzw|i!+^#G3EC=@$y1_-%V_d|5`GKVrKlieCR)p_x|!w{(r}N z|GYGcI{)`$`=0!}1M~lh`#9MDJ=~`yQH%2rvtx|&T~dMd;r(@gBID(t01$@atRo?k zK{yyKeq%s^PoEw`_BE2Q56=e@ZUKFssfYOKlCjD^mV|lh$e*9ZH>lBAf*6CJkF%Zh zy-rVIt$tt6pO5t1>tA<&rmrTcuT$20UwqxX>y;|f$_P2irnaMlh|8YoeYbt?U!{l! z#HQtP^E`bsUoCoHT)+0KwvIr-R&x5q$c=biZ(dI$B|NF+WAW2XqJ)nw^i|pWMo+3< zKInXVGqx#mMn6t?)a%n;!7=K)QtkGpP#ezzw7&mqfVx}~{L6~Fh`BVqaVnBVMt56@ zxbh-o0pA=6xXMeWFtUBNg_gEs9u zU*%kS5umJfUZp?CK+rl`J7yY@;PYFjMV4Vzjuy7aUFr0@=%H^3tta!uCoSy84`eO* zZB9NbXPJ?3Vs`%~*krgwbH!5?)Y8l)eZ)5fN+l{un@mrQZL?qT-jZwV>ARd!aGLk$ z)v;-I!XwXGj<=OYnYY4ov&zS^%iMbXbHT~_>waN}Ab0udD`Y_J<-P6gSj+muZTDGE z0VL?Bc)0k!$Wa)JxEKta@^8OW`=DjjMuUy%K3bU?ObwI5g zIT94X_Z@~#{CB`qK~ztof4cZqjMh-O^`BsER0#n*yKK8ayo6vBr%7PP&&Kqp=tCon9t7oee07`KXd6j;g9Cbp5BRl0OORAWk zRMCXd&(HuMaw|`l4k$lZ6PS1FJ`rY4r;Bx_dE=6ZqwK+6~~xo z$HhmBgjvmSZWhQ6Xac*bC%uw?$$)Lbe(B6@wDRf*%tV;W;UU-vqY*$1ejo&jHuOi< zsc%Q?bB^#?MAUZ{?N&&_B;c8g{E^%D0V4?p;KC&qk4zb|#oswdVgVxY13#i9Cwgwa zFA9VWy54|+@a;DZun|z`*EB)2Y+$_U&qn;cjNmS4;(XN&GcBW zrW3E`B?D|fJMe=d6QC~P=1?~*`g(z1_;f?)Jtj{Hy1HrJL%k4mfEd*qv-%(+USM>E zatpg8(v1yXU?#wPE=u^0Y2ZnzsR!BC`$O$p4V1(%)(<=&mqe?@w6WrY`%s<7upTP^ z)L|%^H7w$ayvrqt70c+>^zb{^ngW^J=90l%P9o21%h~sm7Z-)QaP?k7pv^*zmnQIT zWyGmf&mBV9ByO;p2AHaqug%Z^?u(O^-I3r^1{nb&Arkm}a<$7ix2N!)QX`oMXsX$( zM;U|GCs6D6t;4A+99Qr?k&FK#L3YkZ+CUfaeexvdu!=BB-kbaZ5z#N50jlv1YFPvz z``OTR?`uPt3id;BS%VP4bGXdGkwN6yIG$Q=HP>0mS)Qy4!U~Nx7~NAw!K^01lsB(~ z3!9zFL5}Ufx=&}y%z(Yg-cnl&f(JQ_fqsLz2YH2)L*ki+8vsh|2dSayIf@2$e(Jz_ z?68Nu$UU8Kl{-pR_|lkds_G41D*dvZ31Q~0%L^kt$Xy>}B@;3TH6QF^(jceiBw}Wr zfo@m2W`j93*?P{MD1}8~J)@eQh^qx2sZD2A%6@EJ3j%04Mq{tQRbo)iJh(jh#;{u( zUQohS-!r)Uj|6YEK8+A+H=%08@s7)K4`6Cqczczxmlz2bc3G^xJK3GdNt|C_6nb+S zzTF|~k)?ZV6!lv@;TrufSKBti+Da*oD&srCMjydUNV$DHZ{gEQvhdqlmVruM5xi!Q zkSe^y0z&XGQYmP93;0%qXqUjMfOx975HT#3ZfmuMK9!}j>fVTSRiI|WLMlBY`uz)9 z2MmE*vK)+*tFT?)!RVsaI}~Iwhyj^Cpx%=ekPfo8{=;mNm0kqd4#VBV@4v(Wx{*->$@bE=G!hWr7uDtb6j~iU z#Db(ugbF)9JSDI;_Z|g3C%t6=zPdQA-e;5U&yWAuWl?KD?l#YdFrI9$>Qm2lxV`H4 za5)?wj4X(&DU8DwlQ=^J8!mTbHX)2xQSz;oHplh958+Y{@ zjemYc_aR>*@T!W*je{kHJBp~MR$U}`2B`{WdAc@z7@Ybozc%>9L!A?&O7654y52J^ zGrq)iWN8c}mo?L7H+fM$+~BRFwY6%tiHoNWif zI~9|LX^{nW6JkfVFB4UuO>(eAM+B6yYRAMzhB6YuN9@#L4rR{*&ZJ$gKZO-nE?R9x zO@Db6*+ImXG9ryH^cSr-1d$4MO7O6(^)Weda(zV@X6B z!5WQQm5aM}ft=?p9?1#abN)@jq^(CdIF#LHaFE)Q?AQi3gLo!;!4cWFA zNC}0_m21XbI@Kb3mWhhS4+5g_4meT%Fv|VjR%$|GYs#TF{Qv_?jOJJk`M#!n0DQP! z)=8`2rc~?TC>hWG-E>3zO1-Q>6}dy@>o_^5o#!QwF7892XP&jyd8@L+A1RPIsidGvDPg zES#Rh?h5watWHkQG&>3Hj^4g6dgGTEqZN$$D<4o)!U8*o?uQo$68}uN+Cx5u?}xx$ z=ns}6_((qfZ7w5ao+>ym`v)j^-H#gbFJjNTfHa4zkZEuh$R0jfe4o}0let{sEK7?E zxJs0U+vTKf#oSZ7gWkN|TSAZX^9Lc9kPn@w-8-N6WckUgM|@)y)scTuKQS}??@g5F z{9npw{KsDZP5#5g!TRsj2-*^HIIXCEtqs%IlZcnTv?0fXpR$TOA`uXTMI#!cta7db zG0l^HZSPd2RFhRzvDjd;fmC#MRE>$<(e7xC;jK%)zh&N_!9*Y!u71au+@JBy_wDQ@0zFz1`MxeW>E$O(p zv2HE#e!0Fq*<~$gA*_Jz&oNHRk#6hgFo|1$9xhH%tdxq+Kq;B{+tt8Nzl|P$_`C%_ z@IU+E)(58zf0j_%JwQUSV9Z^T25emr1aGgk{Obt4-L5C8BtLivyjyKm*5H@!1Z7!?KtPsFDnJ zY(6_*=?p+5K4&HW?A^YFi3*7@WHz0|3R2ot2V)%=*}sdpKv}m41Xq9@p=qL7FK$OS zyxmhgK?{jY;J9Kc|RU zQtL>e1VdUGdF%Q6mTUpqM3^95$mkiGgjVNL6KP%YQjvs$3aX&c1oxs6(AAEx$pN-o z^nsz)Q+-9mmAem#U@j&6vt|=mei!!UHFZ+7bqy@;@W?ChCQ3_m{HH5Qe{$I=aKYz9bq%4a=Y!=^b(}0_jN|>AY zsKZT37FNs`4A5QXStCY@FEZX3A#KLEryuN(ru;5P;E=#X`MI0TDkxPp1vR4)t0I%& zu%n!f9M&r7^)}2->i9(k+wRFCJ#~N<^{Bwl`GE{biLs}1t-CVvOa z^5mu$-LlqQp0cWtb*>KNz-@rcJXnC^0G+4D8w1?(VyBu%$(^I=zTd zYZA)KqOXzChzQP0FE0A6PNT%K`iOS_lSnin3C~G&x}nc>7=aYCvN+aL=THyOfieVm zizqxi8Wo+K-jP)+9K%ZF{IdbJ5(?gE>%=fSg_5mIg8Yh;OQ9zt0j!LMsKfp*9Q#bxQV_0DX6LiLR{!p*|T( zbuf`rbCB|p<5DCAfR`Gr ztb_)B?83Zp^~uPr+GTsMxkD*38 zL_Mg5%|Y}2M#tHpwM;G25yBl&q{2_6N=5PLu~8K*{@@?^239xUCNEl2(Yi9~hUBrL zrF+Nm)9Du$mG|8olaM01AnhWy%xcBsj#*`gOis%!9BCQMJ&`HIbuj7FKgUhPiN}Os zo=7uZ6Q{g;j6FXtU(z z-3S=&{Lqn^OcBLEGAy&kxQ^~2H(vszU&T~Jt+)`V1mM~m+aFjGU$?q}AYy5=W1uS~ z1^y%XVp^w|8@r|LYLkb2jM0`OgzU|GO?m_4s_!BgiGXEKUNcoh}15^eQW%YRnDScxpU!6OP6T=nLir!g_N_ty` z(mC8P{2EYXieM09@D(y`LAfRV$UFv(Q(#l@!^Io^NCL?xxETzlr7COriqI1Q0H~0vht${P;TrOP5Cp_OSeaWHXd-aQ$%g7bAWIG}gvAnknWM zTjgHO1P%#GhKdbP=gaPP#>ikc;QB2m4L-Y7Q&99Cu%@I1B&byT=3nG+fl6MCE2*sc zMMMYDZVG%v=px{q&aPR<>L4)j2ph&Ys&x@KViy7Z-MSE5DINNu(w6@`{?vy2ghYArat<=-!Kv$iqi*ahp$bhf{n6z>b* zDAjE@U4ivZrTp6??C=j%B!aa+^j*W(Ia*ly3R*!XkZOOgM7Lc%eSd7kgEIn17EbvC zL^Hfb?VY9m8fSpnb9?J-##7h8{uGI>jy)51G^F?(#*8;)dtSI(Em>VDvjGqN`j82Q z_-g@k-h@Uw=9txXuMVDQkalcLlE31gJ5REkk9S`{s3f{O5DTbg!c*? zW>|G;#kun4%iJ;tHOtJ^Hgr`tzCs?SOX2cK5z)Oa7oquSDQRdzOo72(h9=XR$fphy zp;0O#xYhMlABxnQ=SJH#gAB1SGH>Mzzsz*_4`qIC)Bb`2ff3fvsF&BZCLcsGw$HO- zG!(I8NtqDKF_ZhU&p_q-+Ez!=%ewL$J4_UK8~w?Ii-dHjMp&V6ZcT$zI= zR~8Wd16n1H5Y4PH^Sma#ko|JCR0^K+Vrz{J7>;(j6#rEc!qjNUHUQreE%IJbdcdWf zm~5?&8`)6i@Px-hwsS361N-^J0V((TRROwFLO~z)ar!W$cPiN6ZtoXbVg}$+(>i6c zbiy0_t_=gaY`C0Gja?$tcen|w|9P{2uHR!4QXV+EVkTqb>On=F#Jg2qR0>--WXqro z3(@X6*SThqR<#k_tN+NPGu}cISKkI@c8AuMr}{GYa*5B(G5gBr5I`vE>Ig%Ld-)`_ zOXEDc1;Tt;pr!hQTms(y<-e#0zSrmfRYUaufKOqjV`gS$VI^Q}XmB zlMTUVr&j)6vCINx<^~P~tXSt#$R7=2zm){OIjEQ-5x@lq<>M`v(50YBb21iMtB@p- z`A~ZXhfW2`Zx*suzZ{M*^z3-@Y8c#%Z|n2c&gI^wtkRBM&y7A-8&O3K-|ccKHdI4* z>033E649(AtEQ&sYDd3KSz@oSvW!Y^VRabS)GoM(T4uXxW?9q{-j5)Ssy)KUK9qjk{w zimdY(Tkn={hwPl1n2`$1gtEKy2sQT6_+*h(K?RkPPk)XjzKT7|4{`YF7Ur8+R?UN> z`x*5IEw*`+>KWXFd~NN? zx7>2e9*X>vkAhR)nvjC$(Cs-DZ@g- zUz(b$%iB{Ty+hU`)-jX%R$l5@<)+-jfR}g^Jb!TfuOafCbohF}fB2)YdI8|@$3`pu zoFu>uNDSuPDvYp*4aK>H9q}q}Omjo0u#sEwtcTm7b_&=g-=JaK0M0|z*|wqO2vFGO zF+*H+0A>fzTUS;!bUCuf@gvp z0#xJpxPD!DJRRrpVpPZBnuVaz?IGI1+^3$lcnf}Es4i`45(x9&_b1?5Yq%;#DToiO53Q%bxHAJXt zSp&(C=)O=hL}e;6p&}waQDPRrE})SDCdh96J}rQ%Z-pmtpu`ecuI!77?d;*xdrvaF z%6g}L<)56*of8iId*{hT2ukEfA)6Qt3Qc1B+52qSTwBRq0#NDXLdMGoO(n zc)HzeTZ@ncGKk8ix9rK%$rN3v?h+g;QU0%ZXx2Mz^AYoQ+hTOH%3js{PRru)H6apV}g6qt~;2p=+zmJRyact@Q1}X+M8@Ihn_{^LZsJ8Ie{Q zr;P97!}2(%>(lDI?z;6QUAgJ|M`tA~GjB4J z`OeHWvz}*+-xxh*)f8LPA2*)$IW!yatKrv7JrC2HhN`sY5)qq$0CqY=yKO3A*rS6I zr0^X34NXe8FG}&L_XxL|!lAEzJQ61MUtljo11`eLD{JHHkYi2{@BBSqdwgXf;ltw? zMQi(o%)0BNxjcT(l4gg?)_(mRNPOeFDlY*w{@F1BtCe$DKExEqmeQFw~EoFd6|(Y5(*^VmX$4IpnD z)<0a1(wEhfZ9F(g?Dkcd-<~kd2p4pbf;zbB(U(||mGz-Oli(^e*3L~h1j zZ{am;q}^b88}@u>e$DY{N|ks4U4yOa@k_-lU7QL|N>sz&F?Q;_n&C;y}hOWcU*V7F9OS z;je3_5#_bAz{16fK^9xbKA6ITYa&bqq-VCSA|0;cccMK5q_vlj@jx9JJZ~yM++bSA z?0+3TL#Y2w+)eHs<^kzWS2(BvagDZuD|e^l@4ZPDD>V;z!cCsc+RCr80&~5y*9v{* zCe`Ocu~fO_1l{&dvC3+{(?nueK57eUj8{v>1I;Oe=>aKYa%UKeyvkg5?i+Q%A#Z$X zm%nu@a!*z#@h){WoDK(;1q_!ow@);zjE_}cWejoN3&{mz%0QRnhMt%}gKn0-iJ*`>x z`nGGtrKjRJOiNbg;hPb+@r1Qno*1mtIyjbSMGP#FY&!(>-u<#4uqrc7-#a%5jVze0 zy>zV@_j!fEBMohVwNg?9-IAPpIg__^sC=^#5Q{42&1E#GK?(+FWI1T6Z!l=x%L7wU z8iD~=*{>g>x)PuYe)lFfFuLy!&Da;6sH9V9{NYVv4_r z0rOamq7i5^yeA}pscP|t)BtAn``5=zn|O!4r_ZuOhwkKZe`~Za*kf7z0r$R@GwW}# zZnIu1M_moBrQ*b)Lit;6A`|fs`xxlv=^=~<+nJ%?Z$?4lB5Nl(qe%eFRo{f778iUp@68@;bCk& zjL$!07URUbzP2hQV4?sgStU*)yMeWbVEH+QqXt*D1SZSltY?WHXwo8y$XqBGud@82 zK_rI+;u45AjM$aM+wzkj_QM7+u{jryx*$>UN)R+$OLGi`b^fr2 zQRy1X&mI1y{<7=lQ3nj6@RlId!-hm9bBenCdbrCFyqz$yOWi_DgJG2cK0lac08;>t z9<36uOQQx-P6?$Ns0>G>>WoZNWV5y)gFurBl@n9Qz$CY*BhOCe7 z!S*C>jVtiWULYONz7R^f)5$5*PiNSf_Wtp{{Q9EkaxZwB5up!b$%bzKwr( zjuK7mk-!GpeN@V>=8!k-Eei$B*&`ehpkd}#E&I3Ng8F>?!>EzE#crAAPfV_KGH2yz zo26*l?~uT!%(cd}16U)Q6Ie?p7#5@otEBxd%L({0p20K1Kd}aUTQei@_EZ(|E1>I1 zAl6RB6-oCmPx@}DBa!WCl;&Zf5H-;JgI`FE$XPymRfuAdc`?)N#L<8ZZqi-X;bKos z?R7d0ACX=pTbebp^FEYb4ddJO1EvuPvJFKSgk=a4S_~0j$_&3O>>6fN$xQ}>3i&at z7rR&F-kcaKngUxDkEDrRi9KosG?m4au^d;HA2wJdV+b|cia^3(;e6ur%#H~0-1;G0 zEJjy=J8_x=WE`aIf`!HwQZz}_@l?bqP3lM*5I8O2as7yilh+iuJQTN~%~2Xv-&BKz zd}fuyMU;z79kgIA)Q`@x5Q~VZWGce#87P(yG_mSS@6L*z3DyuYRyk2kzr2khY)Nq= z*Bk7@2+XBi!Anyms=Y05??-lDgA+L6q_cn&JpiJ7EQ}50hE_Kg;EXn?rzVgfXdzn_ za@u!hZ}fwytWD|{z|-1Mx>q8noooT^gh!L1skNDovJV>=i#X{T1n^;bM_SOpczdw! zvY|HL^G;PBhJPQh=JBARBt(IAcMgV&_WC&}m4q;{d^i zc#5WTls8$AL<5cN%N&ywf`}gciV7%R^PLz2Bw_Gj&ezI$HYP<~usp1dRoChsD9si2 zASE>=ED}?^;8~-a@l~(;c^8t;2cLIeI0xycN(4}Fd};<>rwH_$VC=}EihP{zFyl0x35uhz<&Y_ za4U(?C67rqdFmV|cfC{l<*7cd<)wCaE1QS?&9k2GtsUlBaJO*z6r5-*`O7yZA1NzY z{qu9!P(0eSXO}43Gd4%VDAo{yuJV4+Jft@M?MSmpt#kyGMU(G1r>KrYPuZBo^ANLhL4E&~~GTJ&< zNU6LN{>tr~+MP9d^hcm~Xm$RFFJ-d~;6=kz@B2o)u{99oNGJfhN^~Pw_e!WT2#F%! zd&Acau>S`U7hA-G%esB8ld@nuolp9g`SDY4|L1J%Ygcwk{BbylGxkA1`4j+$?5D`WXl8v>L~w;ubi>A{p-{NQw+c+nfL`5l&1jeu<7iA~|<8Z?RR3 zbG~D)s*H~0hYDvC?dY6TKl-Bs_*VyC3T%+BpP;K*fofOMKzg%7y4p|*s|d6L_Htp|j| zuXxc-Ph6z)Ry7ML$1*d+1ba)oxs-R64V#WQ>S;Zj`y}Kcqz60ddoO$3pVGd^1YeTz zfydEkj(3fu8I11A}#a!|5@LK*RRQGEF2ROBz4-qijIDvetW~NUJm-{jM z2{B2)9TOB=*VxGEKaJexJY^d_sBe^hDW3cQ>}4Np{3}V#%ODoXZ+5dx)pf|B~ zv7wXy=a|mi*~XgK#>Cm&&X~@{*3HqtUeC@^&&1lvHo@2 z`2Pa^{4a0(A4h?Sg_Z8_!TP^(7nqs;)g~wyn3?<|2&7=(XkzP3z{t%0Pc!Hrk7P}Z zEewS0-2aVdV&!C|V`Be%6L7Hng`qe&IsO@)6SlK;{yWc!;IE7H4~po&5u*CHyGe=Q z-+!S09Q@;q{&Vn;CH@yD>ObR2|HFx5V`KX7M6a%NH0^NyI#D}%b*_d(kx342Pq4Ev ztvo=S5&$Dm_xkUI2?p2!HUtU&1b@-*sjUW9^3)_0g!^en(?2y_-R+*ko;9~O@K|By zE{H~vA1ghV-LKmn_&c8uJs&G}Zk9jKPcRNRlI zzK`fT?D%_BrS=Lh?8ah+;$L8@N1ftt(e&mZoRK4<(iPEOI;zw~DMz0Hd7D$t=Mw5Sc zcWeEAHro@Vza5uOe3PYxPEMjw0v@9yeQPHdiY)ajY2+wc?zX3+AdY#H^oZL~q-bQ$ zD00nRLN;%tfw+%?M^$r>KA!Gk64nkV?iaBViWB2b%>>z$OqpB-;r{abI37_a#X-Xm z&J^&ifhy3?1~T2BIeiP3%D;@=E0s`OBY>ZaO9B%R!xg~^ascaVo=uC+)Dc{!KxLzF zkTSCgssZO=X|JUekr)NfQ|LFo*2xcMM5j!ey^aO0UO-%NTGvu0F$wfSc;dvn^fvxA zjV?x-n<6WH8SI>oe1;J+JskQ}2eIyvaD54^6l_!1TIX!RMtuw6sYt0Vk5*o$79y=n z+5u)!TK~i|cMtC$P6gyg?Z*>HO>~_K?yh_hdUG*6-qqx4-5|a*Qe>65|nJX8GsrCybGkke8eYyP>POh@UEsVnKq!IG)!?;F2P&BvliFkNWOckgA zbAb!e@ps*|hGhY5V61_RCDZjXV+xZcBUy(bN+LY*v_IYGP}1Mn=u0y}Vx`{2Tu|;D z2RWTxHgExA6g8B=pyyn;g?c-~p^$dSX^}m9x;b9l;30>1igIGg&iyw`?m5(u9I4WP(<4}7H5--@qod(dFmp#iMs1PnkOLZ2w_#! zHX}(6+UDHO6cT?#CW2^)sIuTBNzPM^d@I4DglEqXsZiFmy}{_r(G9{bKhJpeMI1x! z*nYX0MW+pB6xZ#Ci^)+i9%Eep=2zzG$<~v$Kv&IIY>}WApeism-d&81`(SC7SoTF0 zR20Is;?yU=g!qyD;QZU>R4^}!(r0R_wU$odl2dknRyZ(uKkfwB^3t3MT)J?Sjg%JV zQ^vJx^(0o3S3kQ*T>VNFU|vB|2A+s{lmZOfB!TnSwlUdE^~_;e047@twRRmI9Q;)4 z)Q8PS=3J7&&zHzt#~#YY63}lAf^4Jt0PA29r~aLi{)$#O@@ZRa^*wIBtd~&DvC6e@ zFM!B_@;68|sbQ2~TAbrNds5k=O}&ZPXcHDo*-#(k13ZCRuqh=ArZ?A!Z`^u}V z`42E;=-%qN=0)QJ*HuxY-`ON7Xr5kt$kNcVhZ-5tK^Y2*v2gd4Mecq=mY=yG^M3SU z9!qN_$U}2Rg!qKqMJ_PUiUl_yc7ITgM%-^0w-fK~dBMFT7K!0mH@{v9`f_+4fkC|b zdmU@V10s!Ihez~p7+1Yup85Lq=@BD$oC~_#q)C3@N_U_igDqx8Jdmxr67gA(4lqri zrRS<$$V{vV9@)?jAZ5F8GAnGG%b}N6Yhqg_+QY|vPj|ip;r-4JRlSJ-b7E#2lSAJT zfv9GD)pgFFD0qtj!pZVPwlC6^;*)r_cb)ttG`+Lx)u`Lsg9QiMTuu^1nE?Z!-piU* zf7|qoXr!y=Yy?m&6qsDqcD$J}j{+&qvf(s+@gy!Fz0$wg4}}d(CMEnu3Ye9V#(=J* z?8gewvFKe|#B+@1%Jfs_z@#itK*vsOW|B$({JyXfT#Fw?gP#ReK24~Zpa7$!+S`3k zb$YsiIx#<819}XK0M6rR$*SrBUqr*Q;IAWE)r-{*SAU;MbKwUWB+_`(8+kMHhuzi0 z%%6r+Qt)>T2H21PmSFRqc2&VbXhuM6MmXcE zyW>SfD&v1$>s)dPDm#G1ifnLUqEse3hdN)Pu&8Lg4plwUo(2n)tQ~j?(vhb1ZJo+q z&9c^^dcgPo%ZFxVV6vEXYyG$f^@<&y%`Tr9ljXsOK;gy_4HFTRMJLzwuT~5oS*W_4 zY!s;y2NALJi7HwsZt{@tL>TdI$8-vICkj$Q#~aGMPGp9J?$q}1oA;!(h5|SU=D72R zEuMM_lVp>UPS!QTaWFlBIVUf1&tn*Gk4=pl;GC$d8T)Bgrf?e0I(>#*w?7~Q$K{HEv50aW#WpMb;ENCPsH zal1R&V&^WZ-sMk<+t^+|YN*%Z26AREjRZilTO?7=Ky9_WhI~T^%8!6`bLkiUeJW(T zMa>HE+(@PH(jSVdvwmH9o_MH0DR&{ZAkV86>HAtDT$74|EW~(#qMkg_}ay{SOu$}rqXm*Q|%AQ-lXGDtN zH9zhjqk5Fv`kX29uM3r}WcBB&D=^e?b)UoJtj~>28IZ zyttvhwi*TQ>c-iF@woR@!`*Q{@$3r{$xCW!*9mRNnu%0ymYEg&VKkui9&rSgBNitd zuaS3xH>FpRB}LW=FLJs3+)3~5 zr>vog_ddwposfL%nx9Am!p()hl!;u)MbrZ?MLmB-;G#P(n8X~x5h69d<+wv0dP78y z?7k@oNjti#i21qom3&pQsGSLY|5P;Rp3kHb*CNe?B&ujr6Q4kO04g9LVO*ru0siK^6E3Ea~36L{(>^dF% zEH02UJ~f#!4&bQ+i>z!Hn_jisRvNYBY!e;tP-v znFR_*@vm8)vGLC~m7ok^!iua-dq^LedqFZN=A3Ov3i)7;`Pxh#j|uE{m=q@KkA=TQ z_ig#@pv*6#C+?thUAEne&1l(uYwT4$r$Y708G4xJ;A#(G;K9%S5b9iPs-xo(&S@BF zy21Y1(yeIJqS50}vZgd0N7n>v!vy?|?>M0Cp1ya@CMqFytKz$XXB+!W4X3$u9SzT$ zH zSO7l-$v}12QNY&6i2`-R&QHVbGWJp89llyDEegQrVjN-S<5VbW3Ept5uwdJMge8zz zwM)1@Ze$s4?G{6w(KQKXCL(3h5hy4IT3>1J$cx+LUf9Yf9cN)1yF)jicsb`BRazw& z={v@_;5$MOt3ds?RfqtVnHbgSQb`F+f4L6W(>35Z&=MQEOZ-yU($G|;k@@do&1!?& zS=_Ohotn@-f>#zjCPY;jy7$^eC$%v@<+2_s>ek{*%Wv>tB|vSCT{kBT^_pJDs%<$y zE$(XdQ4l;1V2lY~@Ghyl(H!6~A%c*_t4N7*Tg@B#UKmy+>_LFub#zG;+!~Ihgi9|E zcIqD7GH-a@o2AM*^az@sp_(fOwwehmaO;{|FU^g_Z7a`Jnos}Ea( zJ=rP79dy>$Cbg9KY%eZUfcw_Nr--kt+05?WE|NuP$0~Y)S5>Dmlbw+lE87V}g49eZ zK|E7orEGZGCK?;v26|YbT;oyccuBE3UsY%NB2vvg z%1;f%Xgu*02BdcyqCxU24ExHnCjW@h;R0>u5>tp90!{fA`cWd83-X35x%(SHDO3UPz!zj5W3 zDsXQx;(s9pwsG3W2`33(_9hNY0$6+`_~qU>(3fkFkdB+vGb|=as4Z=*5Ye&&{d|+$ zjaX^A<9{A+(Yx*ZY-Hr({XF$db-=qBKJ0DPxb5Iu5FZ^+eROPPa<4@@7ThjNbRo@|ZAn4|#8&=I+)(vde45+*ae6o&=@`J4sYXf!pK#LU^6+Ww5>>*GkWN=E z5lC7_@k|1!=IN&W@um6s{-qONp8eAEWX$`kS+6(z+fZL|j^+-@$r`i_T%Rrk;#ES~ zmpoq(6v@!9*CEP@!*3P(O`tWT2RJwgMaj0qfg4m?)dRmx=fx|w4UPwWI2=6ZMKvc& z>M36)Uh$xvA78B3gM;Zd*K7%=+?1khdn{wajySzFcenMvfFXlL7N9)ANHrhS0=G`c zJSrAA&%Ck3oZQpha2=X^IjVrF&@%=ikrG()VqCXMcWi3u z;WOut2V*g>5Xy1_Jo>B>lqyE#NOz@(+6_StLKp3!?ceT-^&FmrxaOC5RCByM&O}uX zIv1Gxl61Ejdq|k1@*(#pMs_5{Qu>&GD{LuIC=(Qh0?}!DmZU6Eak}Q9S!r?j!9Cbn zRh(GvhX=sYpE;c(m!;gN7%MA;DR5Y2_4xl%IO$Kgt3yFz$+~OL#_nbKpnVO*`|KwkwMLL^l*NCl_JMl=sdV7$yivUY~yFIeh}G4AB!&( zvyfsTEy9ArNIXRlFlIi}H0N**@R}2i`@6^^{Za60(31ni_AA}ar8S&5xI^BFs7 zxwtiT7$OF#K!Xp3ZSwwRQqM`V3&N!mba<)a^Rw8h0E)NHqu2w|#DIvE5atpn8DpSC z!NWGQh2XWXx<<8odjN8cK$>8PlUP?3mSTtymHOlp%YazgA=J`cJ`Z!FPSs5!o(xkerV83Ga4DyO$v0xN2`GT=JLviptpEU-4JM7ISC^K-w;bpPL99a!iDS4-T^}(Ou4G@k7?#^1_q=j}i zi`b9W-lTC{(zXbotjJ)f59Ls(4sY+TS0e$=c4E?}FS9K!*B$FH|2{FVhef z3yk~1G{HcQdr<)C*9uTDJP5=ZOhmB|=?V*9$M&IgfPEqQF|MfEhq@?PKfc81e{%ZU zrz_K5f4;+f>gIh;URkT)eg*&iPl*o<6*7QFIKqT=>Mys>lg2E_l{67o*h|C7eB*T< zV-#o0)?*SOg3HZDxzNBYSsA@$9@ozk0~x*;`l4r>&XNiNj8o>GjOZ9*$FZCuHt+#U zk@{XW@SV!@VsfeUlK{;^C0o<@#Y~9jr9)w9)jKL88Ej7+a~Z)bsw5j>v}q!ZvG=91 zP>pB817QmD!&4iIem;L6+)tFxEf7V7zQ-_lW{vhR)y+jS)pYr!-ijVSJMVTKdWJE*@cr~&poDil2OQ-yTU+-Fo=V$F))#l_QBt8Q+bKF9dabViA&%5+x=SlSk=! z8i6uR%SF_F#@Cgx1WIX(Srk1niZEz3o~|WD2E|P0R|jktNEBQL*r+ZIxQM&w-a zWw}YT?T;*?M4?yY!^?rv+2X4i?9T&fP8xGL@!@=t+_HfX^`rUVVtiD0fR!|Zz17TF zj+R0D%1@#lxj7Zxc8m-At1TYYGW>u^XnS%NeUq4_0 zP}0T`mURQrLX{vgt#8adNgQ~XL}&J9o;dDYi{wr+8F#gFNY`W#UX~+5broPCbh!kQ znu~~qbd-}fw^@1HY|>1VO@$9veDR50^sFucco*R`MHjeAmRQIB!UOimzyl(rRn$2! zlw(oj3W;1FQU+#uqoS*qR98raCE417y8wFtEiENu-L7Y8j|RfAw~?myirqyM{vp+CChJn zJ}qLSHmrGZe!eXWCOST|}2O0)555Sxry zs&ko)oh#8_bFq@1ka1O10l{LTv~Y5{(ysK%$hCnlIe01_Pc>=Zkfht;on($^_8olETF^aS`N)>^*>^RJIrqt*h<2`$&^$A- z({ILjrAtG7Omt2Lzj)2-{%xIGvk;SlNDmw+M;dwIfoTP01e*>@SLj_FR6wdrb}}K> z6)nnioCTvNw54xLy1NANMQ5HvU$oHq?D1T-KtoA;?mmsxK|$DzV{T53el!4Qy5)rQ zM0f61kC~Mlv=y4OX0aut}sq*UM3*Qa?^I$v++9M5U&=DUP`$ zTZG*Ye#f~IXqVqH!4#$KcI!MbNwl$|McOc$Ec3x#C7h+WzQg~$`wHuBZ*a}M*EQso194bo$!g?~=vRc64rOC9s22N&dEHlwv={2{g2gtIZdf`58|L3ZK^dRCsqeL?2eF( zY6sn}p%lJ4$1>-_{{qJ+bW(hHUyVoZd%*otlQ6vEE{j5sp9{-!zgcVxW{+ z^A@N3iZ{|?!(Qz%x&4K^Nf#LnK4;|IU!B^~!q6)Cm&L~pl}}N`RN&IY;Ik88&PSQohsAQ#bb52=}bv@ z>1+EZ`yKwPd*38zbo_amMrHZILk9%RJ5cfMzf{!!nO6Kij72ar{P$4G z|6GRh-)8++Ma|5@@!wL^+Iq2@&4_+I@^x}CR@xm^J*nJqoq-Vg9r zzU?0$er$F-df`(aEjM)CZTT@tnJfId+Fjjob*acPEo$d6w%F8_>z&_6`}BG{P=vSS zAIwi?OSvw7Z1Ugj9$)AC@2vh6K)1_Gld+)NxmV_KNTBoclN8bvQdU?xCjQVT?0c_- zI6E%#MN;-ZTfo?NOkcesFtKmp*aa3%Nz)k&)P{xZtu65}Rv|5puYK~fdqTjBg~|Ox zGwAEPZG=;?jfz`Ai=e}sPA7g(hv`kcw*%41*`(gtV&aCE-BhDQ9Q`8v4C|8O!Esq>m3EjtpNlax- zW-Q9Fa}BO>}LJ|WF;#0PC{XpT|O>g=bXRutA@ zXRWlgNmwd6L8AVD?0b^U!y1gFYzi0@24;Xri8X$yQV3oiCg0K_6)++oo+<`V7rCOXtOU4U7Yg#k61NCA!>=xrVi=Ar z%)83e?r9T>NLdP$yjV!hDhsk#V^A?zIQSHT)9e?Cv$c@rR!b1ZXkgwjj`fOB^ls>Z zUrK7%-F9(AuiT2yD(@ciN$Z=gm!Lv%@kLG`Oa>Zs!RK0||?@@gACONj&)rLQdARR0j`^X4HjGsvR3{LPDNMoWXK zRZ!RpLV7ozRJe0;L zQiZ{SduwLl-_~*axoqT)a^wowD{KVahOA5LZMW?X%lH;*rd`Je4J$llE8gDE8D=#e z&l&I+tPi+&meI~tnLDH(gicK$@$m_6iqqB4EY;6TYfHX_)z5b$ZR=rtxi&9ruDOG* z)Of=l9&B6WOj|p-vM+1SJ3C2U3;Ojom=g`Wz7k$McBv~^YXg(u&esjDGtF%{0rp!Z^x#@J% z70WnSruS#s(%6P>>VrioS8j2zO0l4b^#vDoQWj^CnxWT~pXJ?-c2CYQyyq~I3wlAV zN!9HT2Z2IuKE-(*b^ClLk4V@M^O)#Pp6sALvX8W?w5Uzi6Si%;YhC+fgh(M8(c-`$ zAw5&y(y4(9m}vlOm;F2;&86u9UzBVl&V76Vb%kbB|1RXXC2AW6v6bx*rfZqaL31R@ z$K59zMYN1qtC_4gAwnmfGM_!+F@TmChQoU)q^xcsr)Xw{t<(a;3f*iYP*OIcBL!ua zK)|Fy4?D4*#}S#_vR8z=AQ7=_5kPG^*S}mc6c*SFBLBTa)# zteqbvON@%o3vf0HY$k*4z-mPN^=uf9Fg{CIPb&m-DiS#P#F3U*uoLl2pfYlr_hDT2 z5SQ#&CiCKDM>WLfzJ^#*nUSwS8C|&c(ngx;Z!uPWiogSls->Yo0OUaP6{J?H*yQ7nw&4~HGn`f} zL!}NitX`sDDF#_EvpgE$3dbFN+%7-s%4h+{U?H^ZSaOdgCnL*yvR9U_{Jn4=xDW)Q0B z%h`KWF0x!Osz2HgtVjq?_U>bY7T*|%kIzC~pOs3$lsO$jX>SW;{e+^Q8f2EY*yaZ2 zvFetZUL=_nukN~lfV7R55FE)K`dapv_8)gM=HLE?7|$I%Xws@znjs?5(wL0tf9umJ#B$Ma5CS+t-9;oA2;1DDi5bZ{bT#nC`1`Hq_C;8~qtzZmhBgwI`P#apR}m z{rB^w3IvUkD|AG~y7}6tOPR)n))Yc;G=eOBs{%8YV9V4tVyEc7Ep7Tl#^eMivflWG z(3d}gV_A)yz7L`r44t4p9=9vg7OsrcqaK_mmzUmU8b`^mdXA3`u*fXgOnt zg-#z^?MvIeE!~l#)!s%@z3l-G5V_5k~?Z`n@+a&OcZL8S9Q8>!nZuEg!Q#5S)c4nx<0 z`Bc40qwo(O6$5tL;vR2NtCv4Z>PCzAwCzK#DA5z)Emk|B^v+$`@~$+bob4@pPOUQo z8@FF_m$gH<%Iu?E#Yu3fXx2V0L8Bgkbleyx=cWzNq5Q80_owiCH*s|NOJJy@*{c*5NrI%NR%{HlW7- zJSg4?QDuBA$8U`0#*oa#T$=bN+n~!^Dd%OJom}eV!r_v=?%B}r>0!4?WbhY#+}Xn1 z?-N%g=Gq(jeYj>^y_*r=19Q%ibKz)};YGivv$cmxB2+2E z0c5KeB{35On)G~(>grd0WM;i$y`6i5RQHtQBRVrX`BP)*rW0k9AIa7nDUbVQd9vU? z@b4<-%Xh*MVUf4ClP02xdydWC7$xj0JNGA0-NS}wz0}R+`+U`p zJdfQwCRO3ln=F#U!>!u^=dcq6%9IXk?ob@+So zVJ+v<`?hj;TPY}X_a9@2XOGNUMyzSCp@Ih^-G%9IgSzcuNDuxDYtPeTPR-0JUF106%hsiQlX7Y-yeNOXOo70TO6*7oVOnTLOdHh z`o09Wu5%rt;|wN-wmUe%TzY*!OY_Hghn0T&0ZMted-<2b?_ZS?`ac*-{by;Mf5zGu+6&guh>5Y-_#7Y&FyyFvHE)H^ALlvdx3|xpD+~qw&zMTJ|0$dePB5v3FV59Lzo+uEeQYhB) zhoY6#*FDX0nX3W0q{O?RR&WHRBQeQL^-aJ?*?j3#pB+JBDGDXzRVMh%O%U{CVm?p$ z#5IrzNbU52DtzAPf`QNTy7T=YEUbZ`rHf?csw4Hz-9I zW|2;|XP*i)i5uRGXq-MAs2q*ihcBv$Eo{LFKu;SR{_Q?nAmu^!3>aSE~GlLM?xrJryS}wTa|Zv=YtjWooW->>-HnP=E{0sk zza;7xArW?G|L$u;hOQ$a9egJaD5WCzB`O}DTG@QX3TZH6r3CR=u)ZjkGWLNnN|g%x zpN%D@#(UJl_)H;*N9RET(rOQtNc18Xms%;l4FA1==^ZpTIF$}}!n=qfC9m$OuFR`@ zq>YqxLgYfMtZ#olz$Jl55c-0cM9K z$!oHSH&(oBS)QMVObtONq(W~~I#l$aoa?LYF#v}LiE59X5JOwwTrWfXr* zy^B2HFnnVD9QqSr_5pSmi;~Dcg4^X&x>3UGK0OP{=O<4&D%*ezlhGhfL$nv6Rtn5AVfSPZCm?M7k~iRcr3S@< zjwS_6r^N4vj3%YD#GbF)y*w&LP=6hjCLC%);6{SD1%%7JvJKck@djSV?zbT&5gOv8 zG=r8==wIIE$d}UxLb4cL;K)}dGcQHc^v0oqM{}#{g8;QJ_YnV}r6GvkxqCKbxgQ)< z1b`%LB-51{+F3fTPs$J8{o_hZ3IX{`LPE7aS)dP`sHg+Yb7mVuB-BU#Ho=FJH`A=k zhjWE1RNPAMHbN=KSchzJRGd5oV92o8;No6AP9NbgUmNcQj_I#LdWOC_E{OH zRB9Z90;i8siF)a(d|45)&Cg1WV;@+%77uaxysLyqe~`kiKf|$>T&Sp;MBvaYtbSG? zTWN(>V=!0?(Kl@G59W!tArrT#mhdm|$LYp_z`zhJZ|bLZ5688Ig;2JRa4%UCt#iTh zW*AA~uQp-PVnl;7ZEftG(VwfW0%RCCO5rN;=bUe10IF$f?lP0kojxix}r1yUk_J$As#VXk7lO!g+oenUczoQ1;$$kgm3YdV?4VJ(nA8Ym$tx-*li|+5@Ix3QzQoA1tSlF}<{9?1Xp= z7%Q?+Ahcre;v*V_(@tjVwK9=gUy7@Id@%81kz-hKArmX4tYfz4M&tiP&I0o4ca~Wb zba>v5niB+cJuqn5Ma;rx-QH+6JuTbCY0Ud&#VUlTpwMxZlz^6m#CeX=t645Fx+rA5 zq&azNI0;wN;dnCUHuq~!s)$5RodoSw?K_n-iu}Bn_P{p{Uk>lc;ld7o|U#n<<)%4aXHholS zE@w==Nb@wV!5vOq(fNBS;apG1*r|m{@3EU8hN9K$kHM&>%Hpqt+U)qWMI0l6f+5Lz zz!(YaflyZQMZ$5Hf?lR%T0`o(_3yerEvt}+c{h%&++yf&L<#}nNzw~|E9EXAe9VB) z4JP2o#XD#SqFDl=iSQmVlbM9Bh}tqp=NM-=(uC1NMt|a(k}YXHf_)12ETeIS(r18!JZbLmfc1|o7G<55%PsBR8=t<NJAb; zt1f7Nm*0D3d`l5zDO9;LEyNVsM8vr_7I~|c>1|hPd|;9I?hc3s561(E5S1Ng4+Mh1 zTVY}bxAiCJ;!8P1P8eqTL`ynhb2zLV+;CF0J0bWoT+2c&;3CT2wcPwt<4lx^Qv0G~ zT!)|o#RESGq$jEgNi%Q>Z{ds7z(wbwh2ca1<@s_X{C`+Gr{LbAt;^@cwr$(CZTw>= zC$??dwv!Xvwrx8(NlvUjx4XZtx?kU_zFl>z_QQVJyVlcMYs@+3Z}d6PtoK9i>1i+@ z$;T_IkZ-LjlXqA2168fonT}N~$F^m0vkaMAA3ibB@~V??$VdxZ4HPN*1UGkdR`dLV zUpj7nxLm~xQTA1F;5OP88Y@I=HU37D`bs4kFA=Em2qr47MyrheDiDzbo9b`n35gFo zm{W%IAiRjSc^#|0CyU~v-oS=)<-Zjf0^kpeP5OzjiBRN`4MS5@yAZJuGN2`Aq9&`E zgLh4k^MFv#zU2nK31naTaIRuRsOVnAeJ{7GVOhfsIwIf_5^(^12WFmaZ(aP@)v>P% z<8@fCG5bnCB(~I>!Y~#y%?KJ-;luXEqhz!L^0fq=YT%648`J`NgnV8&gXl zsB`nS((j?)w}0SJkRKJP4TpvaFl?I-3~13sDu*>r{A_8r%S6KD6u8^~pmI2}@@eof z`xI$~F+Rimu(Y-f-cnf{S%@QRC3p`GWlv3IY`3b~K76;`$zeb=s_%CdWldgW+Gm?M zGFo*`{G&rcpXVkyvQ2_w5NTyr3bC@fl_gJp!*rG9*|t3lUg}+NKmGoNdGclkJEU2z zbqb!h6Du_4k3-99hDD`jAp$DF+)vDYgnF=ESxh&~LQs%kTiNgZaq+X)6^d zxjyM{WEqD=ID&{-xVC@z+j|naQet?^h`oLZnUu>TeX2pPe1lbZI!2Fd`D0eCO}x@j zoX5?$*>iV+r`&Frd@@IO&gch;sWI9nUF#${9G=6F3EhEj9|yvsv|$oHv_1-MDD+*N zTKJg;wdnf;D)FmsWN4xx>GuzncAmPzfk83vO-oV!flrjzPO->9;ImT zoL7NCZJw%sDJuS%WAz{JCjEPmt^Y16{&`XVM^v!?o1$Vm5$A8H*#p%XokRjH1Tgk@ z#UuG7S%xIVXo>cjh&nwNgtl6O_xR>1$O!@vQ#Mv@v4w6mnmOm7P|^ISOVNBxf~M2Q zr_|nFvcZf;tM9|*#jt|-_s5t1w{Gw2uY*ejyPX=nD@(eex5v%plSgUi8d~!i%z~8( zmcbaE-Y=KO*)oV3F8)G36|dB5t!DGjtI@|xjjC-c#5A;n9nj2EWV>1N^I~>j!!uC^ z6Yut-c_c!{mODH@{cc_kX}nw7Rz^eNAq zXw07AzXOdWed+4T2M1{>3op7!&;nF+Sp;w7pLl2+j{-DDUFTf0Y4YPrtuW{jLo0x|^t%Bd+X? zk!$P?9aR&gSy%bA4Q{0B2D-HOv7QICa)kP)xV~Q@8SJ!u-LII8Ywc)c0NgmL;^jCN z5OE!_5n!m_593oi?~IDp%#F1TcOb4-soGCyUEXR#R}nbWW2z+!_5Z3>I_z>bHg zslN9IDz?v5xT_vST(p;@idKudT(d$NP)~rt=F`AQxMgjtWz^}uJsNyRytUea#`#(> zop^s70iFq&3V0nn8VpZzpQlEUG5JjutoZZzoy|rJH~RiEBp}%YKX9VD9fQ5Dfh#b` zA%N}8Jtc++Nx(#NRsZTj3fTI88B1=VN4MPWA1Stf);^*9W z{0+1x^`bSF2%KyMXkX0l-f1dRK6Vb4$rpZHJr_`M!2?hf&}7=Yt#A9{Kngaga%^7o z@x7lB#9s(c&yJ!^`27MUEc^QRKNLgXi`Gp*{n~wGqdsu8yj?iin`b7K!2?~c&4#wN zHM?fn9+asc8QW2567)#&%x>O_fstaR&P#AW518@q$KNJ#gRay|J~8!w}h}p29P4bVs863T4@h$CtEb~o-kz%BAVjy@uQl*^mkiazuX^3 zMNarilO!Uc1R0Ivg9^4&qj(O4t;S~dSHO{z@+m;%_k+=rT_GH-DKIIR#Sof{mDo6h zf_cO0Sn&`VC>k__X(NB@yf7KQEuENfxomd5OYJ8*$y#7~((C)c{B74W_$$D*3-91; zq5O=$)8p7%3-;>pdNS+NGYp?$CjN2N?1N~L&m|1(oi8B4;etYblkWJ_V%+YBn>V{h zRfpjIj1#beQw$>CAjoA|g-HxnZ4lGAxpi*8 zd(w4YkatQ<6@y8&Nj|%{38;;bkz1F^AD1&5+!Im9rJzb`Seb4a&6lusHEhHXRd{(l zcsXL6d0lHOtih+4Tf>{fDE7A?M)rRn%GMdWe7}z zbB$}6SK@vXpT>?`k;9RLcZ=e5?Ms6m60EIobAnaAV9Z1lol0me5({s}!~WWp$-`NMDOFeLy^^LoKo|{K z@gyB}o4726PD6Eq7zTKh`uJw9%CY|z^ZX_0RnQs{!e)1{~{$xjbaK@@kv-f@n8!iSz5aDnv_sKoDOlvDCRt$`?=FZ z23pBB(Pe6yj`dH;2L2t9mQZSTeBLa+ki2jZ{zQC*FsR1CmDhm5Eycad1g(#uq3_3o z2)}F=Stj|PHRQ5RyeX+l51~IeT!S;45JK4;V`URtROW^1ABEQ1cQV2)4ZCyjKxuO( z5SMwTc$T@2!rFDD$A$UlXwyYV@9i}k!z-kYh(h|ps#^1?e&YEV>Q(9M;XeRofrg1S zWZm&v%dO-f`{UOin)!RGN*%KU%wcDBiC;&N#|0uY*IxVI$EEgJz;DZN_pbKv5+czM zzko-*e$F%AxYK~$WmUIm)=}Lx!|plrUX$I_y=9J7b+rXZ`aW*a60+MzF_A1D_` z-xvM=di**>2Lk+Jrw@CdeMXL_2^?ROv*Oq$G$#O=YhJR3R&_AiG8F8tMur|EvAPu* zRo1FsSC-pvG*`kbRP8yKnvb6@`vX0OlWO!cwym|&3wV^OkLR(|;M^iVMR+VwA|R>Fx?c7HFWdIB1ZvcZZ-qvksO}wcT<}ixJ25@ z>0Q+`@Yy$dG^vk=gu++$*t{H>ii|dFvGkQtO3rzW`0d7%u8-;zTy~ky-BExqr#NnT zxOXW|r@d%s zGW!oB36x6A5${CKr=YFNA`>RpL{BJ(@`vtJhU@DBXfJlR-i7rv0vyLzzUAWw4lGtmi;6jwnUl3FtI699#sR0n}e|Lx9R$M=`jbZ5Sg& z4~9Eg?CHQIpEJi?L|t|pc;=75R)5!D#qr8O=nf@A-f~9}ViYCLp|0ZKR`EcjJLd}mu1~GyZ5muJHR)k?idQ?|e z@_w@6`d;{N_2n+DG2@GYl8!+ z?$|pFiuke2-IXt1e}l4P22D}`w*fx7{=E{*%(>qEGuzE7c3u|5)6T_62<~7IQe=0Y z0UU5v=%;1XTCY%W(9ToDvr7<<4I^h^6DRIB>fmYPwJ=rTLK zZwLyu@gT3@zu zOmImt!_@jtE}Rf!inO|ZYvasZBB1AJAKmuhq2;CKa>7%f0z+OMQ$k0Wjarly`91#4 z3x5yfr+(~$oWo#{xitGQCE1DCL-6zsM0KT2{V&DGzaks|2Rj=7ht=}`)zSFpMg7-s z*uR;UHvO0EyEXC;o(dB<@Ng_{N7bA7inN)TdEkqjKM=_HKX@t>{&a*5diS>vY7gXD za*nR15DPQ?hWakvE-p#%(BEH@?ogqXh(?@U@2@viw>h78g96`P?$47s+#mNhpW7N5 z{D^ovANFpZP7*dWb(MR#89@;#D)Iz>U6#*rvji#1FGVLgS#H~1Str}Rcia2Z9ByeG zXFBHGaq@3n%?~HraNy%L{!PAXmRzm)ahr*C^+$>#qc&>3!y z*qCRKRe-1rW1`V0sr@5qja2@^0KUyNe?kHc_mSWT!^PdrTu{lXX(TQ0CVKcbHRi*l zy4LS3(^(_B>C$(lbb0uJ`+SZJxcG5}c=6km2t3 z=jBb<4>rkhzxi5y{*M>-3U#z-^6Pax)#0lcwK)NASot3NB9DPi#^Z8sLB7CYL9?Ny z2x0r#w07k<(RKA7xXduyPoAvSpijys(1r!esx&?=7}qrMs*SUc_gbFgEiCx0jfUNf zo-EX_OlI~hG>*esubNnO4Nh;|440+QqWxK)ygPlG@{NA=DOr^b^A&9~GyS6ND~cHw zZw7>$DQRxUPveteOd(p=8D2`bdM9K7G;qxC)=3O@$hlp8+O z)n+3^gWjaHX)@XJEPfaQtTyWpjGfeMz=71bMu|>51&&W{OgmPLdJJGphC0G$JH!Ly zvHH}(g6C~7MWN^e;h5+pP4o~V3><1SJQ3WUY7r-ptJSo0xvX{Z-y^HRpWWyboWPif zzp2t7avsSYUCnl_b#v#@_89A)Pd_$baVa=WOb59`74K@byxyevVmyOpd-|F&|qWECB?xO{nK^^8m8r(>q%3J9?;DeeXF_;tv& zH2)lB9f!2AmmTNILVD#~Qdq+Zy0aFT_U(F6XU+b>k^Vd9fg$tvZb@2AWA`xeZ6mE% z(8miE9SoR3%nG|N^`h_(4`#U;>sC6@{U=;qS9wFx$W{=`s|3TwSb;Po%KW`LbC4!t ze--@saHeuuWgxY+QltXoa<7q9INkUmvX=El{$ zTivQ)X5|=J`hmXVZS1=eKTvBIDJrQ7hNT=FfGu)h&c2{U2-RDMxzbGIWSm+Q+NUQY z8vJracjy(2`&~*~nIC>Z(7Bt=>FM?N&~hpb~R1hByyRyUL8)Jr7;} zD>;}LDxrn%5T|r-f0U0OiXg&WOFHirk}V#`S)V+216thMSm_={ z68aPE-OwBIe!}XVx8Mfw*aY2t?}y&8$!9GLp@}$1f}C4UNcE))M*uH64fj> zCM-xb3anFXJy>u18UfKpq^lGuBqoFfB-1Bg>rWcP!Wlq5-0)XqCOqR^ke)De#GRu6 zeyzv8njat5LhBG8H@s7}<^8XcQnnJiVmls7t5sn59m#+TGj3dmrNi@JnnNpQCp1Qy zy{GaVp|BO}!2WYs*FHiDsIg|>z&j2p(1TE|V?3ZVQNo$C%&A63ouqu?xtV|>gosI! zn>=|oXiKJD{tO36(jHjUC#` zOeDfS+wFt0pQ+Lp7Gdh(MWu;U$+dU`rdhGp{z7TKl#d|QGPuD$6zwba5wS6R=+lsF z99Aa%-FvZ95jr}Dv5`shtt3zv{eh$zE3NCsD;;79%UGsLpbNYCW6`;1{TVY0$Po%o z({Iel*`M`rQoQM4wJ@FCP0%St7P+INR~IBjwm2o?T}t1Ekq8ICp#ae4@CYobDtYKA zuUU4O&`hP%`ubRoo{j}+b)h5tuj@gz`D2~;P~lP%lVl_yK7+k5V-_fm{EP`9iaNux zNh6BWzK2Qf!dD|xNxCYRCQRf<4^Qly_F_x<4cZfD*2>c#Ctb%FTYf#co(`ABxq5%L z+SNZv`qY;?e^`=MTdnSFju5gV3K}1l(=)X*0K;uWnXghiHk*CMl}L)fbyUqJ0M)~5J!(Xge=Tk#-ICuz_WSuMw*YiQhOy_44L2J&de<~m0||RyiqR_-R{`-urOl!yC?OE#RquIgdll=i zix9MoY@8A@&>Y|_rqH>thMg{=}i61C@ zr9`6~)mEF8O&4EvLyB(qH``tE5$kd>NQvuis`p$=RPDx-%^35qknxeb{OS$&0ywt@-df9uc#g!Jx%=IS;5adX z5gy6V?ZY8fvd?Sp9;rtgFag>+sjA92d#M@nb+PZ_7=O1rCu}l?-}UlH>D;;*8~&{t zt*C4m?$EQrKBqGZftP%RMLM$3+f*-e?!~$yfuXf|fF#9AE1ps-hDQc2x1C3oI5o{c z_!KAyMgO_6%tnJmRBaK-VHGrE>UY^YGs;qSLS)ijM{0Z~>s}6t2DAn@v%i&v+h=PN zk6tC@<76FI0vQxFa&o;D`P)J8?G6F4T)X)7yaS9b?B&rJsIcCYw9<}Wfa>6C4SEBq z)^gf$s85GYuk}|VQosX&Qb9(`_KjF%aHaR5&AaHat^m9v{3G4=kB^lr4uOm5eJqU? ztB!#5Oq0%Tbzj-30!GjuY`x=+I3`iFt+{K|c&=}*MEY9e^hh~;aRuni zzH%*uy_Q)IF)Ohl0zOr4mMpL6$(tRMo%Tyi3Wozd_RU`UFT^2H+JgjXEqfTVF5BkY zqT^#!I8K{@uUmZMIi~E*Hj~T#H0>jo(=Clyfh(^WiF3+>#yrsP@CEOB&S^;~$%(3}Ut?fG^0>nJO z)h~C(wA6pF7Mp90Oe7_)T&sD29fu*(0%{ZEcjID(dgLK`BWGJhOTn=)tNGKwO9HGO z?j81yn>q${`@RJ7hw_*HrSAV{Wa)pr>GUU}g=tXSD)%Engy~MgI-{|?e zxVU?eX;V{B+tn=b;8Fh_Ve9_5xtLYB2|;{Gn&x4Dt0St2T|L9Bc(mFHyHY+OzQ8~=ut8V=RNk*o(l{Tsk`D?S#6Dh18seUD+MR!^WVe?cR}2N+{jGL&9sKW6g?6g2+&(Uk)5{t`mhpk#rx6xw z%D3LfWtYURdw6z%j-E}#Pd44p-uH)>b-mF>DoWkTt`wCoLOkA%AN1C^ANE7&EKzFB z6#?JYeG+w-_!X!5?bYy`j~$LHJV`&FwN^(YuSCiI+8U%Bze(kcsZE<#r7};Ykf}sX z>0W;|sa8-u0;G<^%aX?|Nq{t7&glFK)(2$_D-Fcv&iPeA&?BKKRHU`B4ub)vb$?K$ z98*}Ol`~VVfsubpq@a7VG=6;3hkX~E{zhOJ+ruy_a*0^$6W7-Ku5O=Uhe4Za{|j>pXjr3W75OuM)ymjb@7tRzHjYp~E6 z7iXkmMnp9#tS_;ZtC1JEn8A3lgQUX;aPRPlpzAlMPBjw-)DG7m3PCed5ZNklbju~H z_Kd&+!h;a8NT!&*yb7+9fAxWaR7-*YI7(vB_YgkrwMxA(Gq-}r|KxhFAyN~~ebo18L18owceJ1_21$<3KjbHFvlA8YbHa{Ih9oTy&-_Y{9dZ8JJz-JHnEyfxFlgmna4zf10!+Pt zc$BbYQikT1fK92p9$WCl&&J{yN9!~+N0@ANmNDD}`C?qpzoUaG_x@%4{@0MmzBuMI zEHY+E*G4+Rz64pP#f8(#v?=mZOt09SXtHZOG$xElq9HuXeNYNey{Du)vzzp3_G@BN zP|sXC!b5VH`|26iNPiu_u1n_Flfoseol7|Os0lpCJLh-Mlq#H)(6N`vJzL3$vPZgs zWnuVs9mW-i0}Z|~3;l;77f**0X5dzAPCMqxSHMb@?;m4GLE@k*b`B`0veulfB&g+S zR+UeBv|#|UgKm@Kxl3( z^o90kA{rwZN?X~v=0No!13Womb8>!nQLNc}ffOCWTQ9ex$njodo`(M6$EJvh1f9SI zAl#bu$Ab!MmDS8*C6bXpfhm!V5>TnOoBg5vtqhk!xUfd87n&pi0$~~d9vnWa#Up)G zCxfXLIM|*bcR-ZTU>eVbLhdMXU%7y7I7(;MdHTyG@Cm|qT+GgpzO*8$4HF99a&ai` zXMa2dFg02WX7Lf9G6c13arE&bIME~1+rDW4oavwH8pj}9{8CA zJ5d}eJxWN5uX)+AhuY|XWk9*T)IVJX2*oDBs(3m_$k&6{U=5V1nv=1%FdBoY3|Liu zlQygsNG=k!-4AA}0_rXt@elgRQm}t8l-1WL=A&kaFkhRKpk22K$+Uy6_`7VZh-5s} zAiCH=eB5mZgra;+aGH*1{727A-W zSTN?b$s+gVaGIS+tD@iQL6g-e6Zm&-fN0KoUx%3uK<=GM-ISMJ8`l;9cZg7q)+C-*6XcOOm>V?7;M|1R;FI}; zwqFjQo)MNR_+eVyzvH|r)`+>(V{SZZ$!aK*}MW z&qzYrWLcA2yJlf(<5Jl|*VN`pz@YTe2gN3PXJTfI4oNt-WKnwo>-hAfvqB`8+2OllLq zZ3cPRcmJ98&rvpsZ$s`G84gm1w`*GyFWDoc@XDa6agt4ZH{2Lt!TR&^KRk5D9kh0( z^#kgN3pQ#S@l>(UQ{IVx&)M)L9GYb`?-)=A0{qv-`0l@e9{AKX9S*YnamVdNQHCdU zNA@vW^FPOPBS>$m+e<;rfx*Xj4kUA_zqwV5a2JiZ_q0x@Nj38l)G?|U8+w@O`4*y1 zBb>mInX2ckX(#m>BZ=fQr_`!jq7#xP zBDH@vZDF58wb7KOQ2MYQTyW8^SabKDhcjouP0b&2TS(vP9&?OUunPs8;3C)iPV$C3 zjld45?b;*t@$e#HOd@!>Xwz=aqnx1N=$=(nS06h?e+8|5Aq#6CBV zle-?ULX_Nt)%r3II9Qibbr!x{7ZL5D+Z+Ut%gYPmt^E85(EQ078d&h#QuEL6s+q}v z?*rcxuIDz*x_uJ?39IvCI^Hl=I?Ihh$!I}T4`DA|h~LhGH#!sJ1q0wPnUrcXB9Z%+ ztX(z0VQwyE5xYJ8p}!xWnp#!In>aq{wc9HfU+;;NNz>%Ldc{gf%&GSav|FbVMf^$Y z*+{j&Cqj6n2AFk;X+X7AGGUn9YF)tnS=?lQfh#9x{E3K1AE}0B(mU_vuZ+*unKW zD>|Qz^T?T2&L*(6jjwnF7DFCBXJX`?4OJoaWLPAJkx+l^t~{>l?V0Gjd&I|BF+>Pi z6<%83k){cyB5TPPZ{8WC*gq1%nf-a)BGKoUTMb$1oYsvzh=+HC+S%)H&lRRo&_yf9 zoz%AKgjF=R25Y8(Ma^rNyBq=?kGiuk;i*J_U+@*x5L5TI4T3=vW#_sumau=a#L)@X z=;yynT0|+O;Ehr6zv%0gC|c&NJFp4K{SY=s5C{a(!wMEoka@Jn8dh_qm%jNyp>%sv zoCLb;f;`>^kL!S2M&KdK$ZQOF54R?|BqER>XA)zEAQDpJrJU>7E8s9Oet7ir99|DWseO}FuhNX0PO)}l zwL0MRba1^8w^nN65t!LsyI#wjAq;jigQg7IBAVp5w0|R0*W#)wYKu(bd@8{_!J3)H zsK3dRBCHgRfAL~IFsiHDb7;dbpdBfiY&v&>hx6wx5&B*SR4cpw>Z!ttzfH?Jz&jtr zTiPR396V1Ao(qy&0vOM!EaIzBu@8*jEC|IB>GKo!A;Advg-*)j`X*0W4Ry-`2ZV#m zhqv^=K5pr9@k`K45?tHxJexkxH#j0e`P8VOmE$w}S5t8pAoFV=;}lMqM%rK=)D(sz zm^7#aVU?tCLJ~t-wst<28LL%$ApH$W9-j}>g*>}DaBlcFsEY8FP_n{1 zHmEMFf;!`6Yl%SvymXX71F#Us>ESGPIwHaOLv1X`7nID7IqmDGg62J@=0av@=eHS% zDYD(_->|Ua$!zs(i|aN;*Jayj*?8~7XlbcQu{rrrnEl-b3U6Nv@aTPf+=vM=M|uE$ zd_+eLE>Vy3pXUk7eF1$!EdeF{(ux&$Sp74L&zH{<#(_*dP5hmXpNcTt7TZMImFu*Q ztrIy92rPtuE>oDsL%vPM86CV+ffa5yAz>rA$4Iq;-zbxrXaVMs z)Jl{rR!U#y6%a}6CoNR`F~cg3l5#^i9n|F>?_*v(F|uBTK73+^Eh4{nP74b;d5PNPHW#}hQ=;M;`~qnFi?>_+gsgUMxeL2v z+2jUr4^l~$UGAz6t_Q5Im)PVuMCivq76JIV2uE6R)hx_KWpO?0jr%&y@8T6+q2GVg z(`R%4Rf&b=UnN}q=d2Y>|M>m?JI&_5m014gSN|6!h?$d}?cbvW$vEL~Aoo0IM0dw> zL^d(*#8Cs#l#|(?EK?RNHMpvqkFSWHRwjCisRj56LLY!a`wT*{CFIvllSJSl1d9mt zIXZsSM;`3%V(wI%3<1omI^C);zUMDa-~GM;+di7}7lYgH%TY9XOzPWRx;A#|)i$P- z^#B$vDGAo)!VZttx7F6xWaTbRr{ifgR*iL?<#C1O>C5F~IBtxHnVcsd{7nz1<$l5n zEXHXGajJx|CSvAEAQk=HrCWl_=jV6*^s~25zeTOSztt5`BzSP71lMr3675hV(2^`T zJ#A?^0fDPz^=zbA@v|so3M>}DGH^*swSAq@5a&;}OMw@C3zyc!^rS@Ly-5a|ir<|F z3*V$EYu|Hh=QonOwVwlE{F*j$+dZ8XbJ8k$kGhVAnGl^!@7iaKFHe(|I8D7$L3);q zSKAl8RjofbFdx79Xs~lq4Jz=UQ`8lCtFjrHQOhjUV(b?KXf_mV=bA1xU}fvhm6x2aG8szS zFMhw%TRUtxk1`*vZVTMmDIB);O=!)+^RpN5)hJ-(zH5o+1|pqDn|9I8KK)c-E@CRm zz(O<}z}Fk**bIA8_F%(g>F-S>-B{U_EE;^$tz*78<^OovUPG+~SA{Pf5ao0x%nrBg zPo@X|6hrR8%d}NUhFxk*aNbg3J@_&!e*SKYNzRLmE|e6)%`89nT+r*~iXV7DWigQ! zF{|G{$JL^>F{oqqR>_3CXu5oDndYsaW0F0`N`09gw5%flm{T@HGr}jHO!E32lcV}F z)WlxBy(j&ezx;d2jz8a%d1cDX=!L(l8pOi-?kVFgd^ z6d+hO3`7p{j}&OQ`Oq}NvyY(~5x}^%OlYH?uR&FsU~J7tw-m`nzhVI(6- zSEueohQXsaX%s5lsWOK;0U}{sr-KyFZkEZdos7DfxB7@u_YFm%&e4bHo~(0uV>6Z6 z&&9G~92G_%()%v%ePlN}k}{mHq1_*$E=4X%OWnfuRe{~8C90r_4`2S33|Ytqwpx)7 zu2G$s@pr`P$FGY&IrqSPQs}_@;Z6}FEiChX>^{xo&|1>cm@>tWF#WF|hLE(u(VMkM zm;oFU4`C`Ju6r2F;KDy7=nXvfu>Ae2U?$vfpXo@u?z}HIwYE4q`Xmgu`q#poCFp1= zvH>KGo@>Kp!eXv&0tp0(*uBs)(TXCK`Xj$x_ltnFBWcI6NtN1~OOm4ptrnT)Y4Xge zjT=l&0s?06N&-+bc=)VeX<7IF+9@onJ9Kl?3_H`si;`$1O_c3LK!91$FxwuZgV3p= zEbd^p12YV2N4jM+Te}Mn1`fckySJ7-egTRKj-5eJ*Y>dd2)fE_Rldom!0T*;5ECym zOUEN=+ey?*u;$uNQC@;CHq(!V@%#r|LMii<@*29I5&K!LFs#+A2M zCqH(*d(FL?_wPwl%usa@gGxILh=Dn~LxNkh(?@I>@SqwKN(qsSl^e?IZnYmC|E7am z=Wx69n)siLsOnk&ti;@G!VhLXe}v|CDf##WZqA+%s!OWLSOh%Y?+iKTZIs7H1$qp) zhu3Fz(jrh;or|_OnvBGVy{FgjFoI}+)(yJ=*y)t9oIjq2J&9HagpT06ivYnAuS%EXbHP5CEA5O_l!jmNq&K z%iK^-I>=E|Wm2dGi!F(AR-{zIO4#SPd%_*9Sd$6kCl91>*qWY4f+S^(ENs0BuEnF} zYWebm8Yn3SQ>8^mN?nm?_>)Sp-lz%k3eD50D&h@bEeu2exG)&=y0j!~d@qPVI<$eA zBr~|_gn_hvBM3g6$;Cg*YoFc+sxmXr`g zW*S^M&8RM6nKj|iem9Q|$M3rzQ@4j2#)!}pHHKIapgE@1AF)s|5U=~Qu%ZCymqeYWtOfMh_*0$R~|B4c#4eD zZglMfm&vmB6AH{JwRvVvHS_N_DlQ(0(Pr$@?O$l0&g>AF2*}L+^=Brsqz_dwLcp3w zq_r?U9kwPCt2em{|D@v&Spv^vapioDIU@C^)aS*2@+%Z4Sfg@1DID>dmscF;2(p7d zBGo!cf$=DC>}OM&Z6(LkfTDo|HzPxq_8d%L#L?819Yi!?3PohtGeZkU?L%n}d_o&> zZ;ldLF!5sbR}+*5j&o9)_M3nP&iuW(Vx|*r3V$Bz*B?cVCKB`-jT`^%U9$b2#m(on zcs3=fNISbG-WEksooSD+AZJL@qAJZ`IQcs<^!=M+Mj&}|?Qh3?umj+RNW{-^PySm{ zm3FMg0Wv3hf->-Dq-qC6xK2JEVm;OF4mGznqtD zW?(MgMU$FLI(0oF&>2`ZXKA(E-`D4(>V&rhUT~m;dZ7?a6|=IEG|Y@Qqf*0Po5&36 z%?<+=u0%K24h(&?AysWR{olO4pH!;D9*Q=Y1oLn|;tZeGy(M@8O*^)2a~KC++{=nr zZmV49wm#*ZBd$7kSEir0p%@`uz@RJCKFxctFPC`$*IycL7(AXfp9KC5?`4UjK=ATW zD}K@kw|oSPVF)i%NjyS+<0w8Or$q-&WT`5)9Bnt`*@yPlb3ziTjE;^x9g{g1uYV*s zF}K1^-r7)Hr42_s-3M+CDtS7XuCuEVz`{OdPw>n&)1dfV<)6}%?c|GdLL-R*m{*jacy*$KPXAIB{Hx5@|DY=P z$M66DRlz?m>c0%vEG+-#wC8^zWYS&OrEz&!qwIhi5T`|~a3Fzk_{ow)j{35KRs~IT z?{8I1+#03W*W)r0x)BUDwpp^x5~@cvhK-sH=VKD5UPZoeLT zAHx`EI==4rA1;RBv_YzO{d8=0>hdp3sFJ_J^IN_6ne8I`H)@$I73yOfw$oB)_ZNkg*tiA#0u&On z6;w*JoNOtnfP8?aWQQKHMC%xm)cQ(22v_~4oPD57N>au&JU!if$6A`i+oDz1s{IaC zVz0n;7JrMZwO_hH4iK)IvJdE`Vu<~;)T+#c>lnRlZRkdfUn1k)p|l(auEdF+P=+Xz zf2luUTruJt98LEjzuGx&VbHA7WcL=ZpEn|2cccP6b*2P8rKuF)5yh3S9CE`Lc?Xrs z42slbF`|-tWn+G%a>+FHEFg`L;c#Cddz9msMnp4Y<~i?+q!J2lL9{YvZMv!|3BmPF z1tKzIvW87YJ9ksPvJdJ}y2XI_2@&k1nV5u+*MRnaSV6`(?#e!tVwb`oF!N~B( zUsMt^9b+H@3AGGIWFomj3Ue;g?x!*${P0W^y4DC#H2z#d771Yvmb}hhf>8$odRrr; z38I8fD4ppTYfBb1Vp}1I=fkwR12GolD+}XhW`MLjt0{tY!8~D_<$-ojUCipZZ+}A+2O9*`aIVPTmtm>RG9uyI?H^1x8@y+B@xJ>rViP0NLx=1lkr^4 z{t+;X0Xqhr7e&w8wQ9!m{;5%Htd*^07UlTOkWk^Cq7y+;e-u;j>!DRpAgY~*7;FS<9c z2|ey+lwS=Zv(9n}Q%Slcj7?Vdp~3HRKl0}*b%Y~php{(T{!Ts{G8(`VY%w^08j{&B z5`tyI>-qr$ojax?#Q*R2iIR&peK3ra$I~X;&?<%AZ7eMw4U* zYOv}(V@VFe^=xxUPi=pp_VQ;&w`8IAl}ROz!e>P!O4Su)n|Ew&o7(i>xP(=O3#np-?mlCB7a+u?ZjMuUG+#(MyDd|V z3;}NC7!M?NxY%6{N=(AOc+tR%p3$n}cg*X3pL|*)o!5ycM83Q~d1-vGxYk&c(t8KP zNAv2qMe1QlgRs0~tHp!%v)jj}V$3VY)F&_9Aq^RAe)!$F7{S#3-1ZO@BIoUL21@4Y-i!jCFdB9R2S_x0 zFTdt4@+2v+`4n!Be=_dorIPy;PJ%j*_-p;-T6!hGS3c4wBXX9!mNDzvuQ%Ah^vR{c z5%Zj~L!@F`)2|}RasRfucGSf0-j!GlSUBBm*^^A%R-7xArCXch#}NNA)X9lSo~~Nn zhvyjZw0aAnVy|-VI=u&(i7TS!K`C8)ZDDuGYYEjFZKg@7xnD!CA<4VFUVOQr|8i9# zXBAv4IC>fvHJQC#HC5)C0-Zx=E7&W*)<~^9Gxw1b zS?;2aTjv1Fnjnt#dG>)(@l(cm$iO}SjaTRA9k6k&V+fXeG=_Y~?o`{7sDD^3_^hP0 z>;Itb9bk0n+HKLcZQHhO+qUgqZLhX%+qP}ntGid**6r`#``(j%^Cx$olYNs))y#aW zW~%B<=2PQ&#vH?&ac*A7TS*e%B##qPC`{2-4zL(F{1)bTDtolc`;tLxOvkk0+%p@I zCUtLz93(MXle^df#8u*=J}uOG>_wWgcnj2_qXeje+e$NSyyn-w?>3-#0)iC{N5r@c zuI~-vOm5bT{6V34_*3#4{S1$Ht~&Rh0CQIVyy1JwoXT1nx#nHFxdf8b3^^6Tq}){~ zFc5feRrS_E_A1Wf5oL!CS68;xc}<2K_|CJK@d{@Dth}Pbl__!^-^>7 zswre$Q>mF&2eBR1euz-44tpr0Xd5Z`2edG@o`vmXEC%&bAywy^ofHy(dPa-f#>}K= zI~et~`qSCnduCWsjK$ON9%=&zRYfg0vs3eCd29DHhA|7ov&T*#=`)r=bP=0{ja)hE zrw%Vvt23nM3O9vSpB_yeuV@B$isTJ>K`vaZfSgZm8>;^O<%rUgPx zvW+_Gt%MIrK$S-GON4H4Uz_+^)4}an!I&O;{i5whwgJlZ?Uita_||A&1t&IKHHWL&DOq|L@~{wXTZ|5Gv$iTq?@$f z9VCPpHxXC;M~*ntqhQIZ1Vo7odMLuA$*BKO_4pGp0hKrBQU8kY+IMa6dJLH8_|zSx zyO2-+sSJFLTKv`v0Dzi4ff1Ix7^B6JpD%<)kwWd( zL@Km+P}Q0bOd5TY#nzT5CJ}K3#gBE=!$7~t>8k75L9-1Psw)Vu8{{svh#ve~%#^vA zs3AwDHoJ;ZvlZbRkQG9na~qerIS7zNaBxp1RqVxwDBqMjBORJ0(BcRzTgyO+CVZqM zsbyF%RaC`U_1a^l8oD+%#kM%ZjdBL!&{@Wmm@cWjo(DUhS?}!V_+A&2g<+;5Kup#U z&8mk5Lk<(NfhklSQ2)L$ryRtX?J|L(S$$aNNeKIej0hJ;d2R`5U_M@hrZmEYe9aeb zz9ThqZoTqevL&WF-JrB$qb9;EI)k{)#?5Y&zO#Tq7U96cm%8fq5VqBnK8VM!kk|m7$E8Cv0klfM6kkPkdYXym{iAS^bWJ^9A zU{tt`(N~wwT&;+0bXcn|-OCjd&BJ7gxgf;UCLGkNG<)G1owBvYZvDV~C$AUNi0_yT z@xw}O$L7=BSr^5w4D~8$xriUH>zAH0Hw*m>Clek}B}9Z=F$~dT?}HRrfg)VV)~?j$v8uX$KTYwo;se)=<>n+ zh$Q+Dm%wS|`w)t1L;xw<* z#^aqo2Q-a^kkE5|Cx52H=IFx2U!Yc-PUxaH2)T}mXLk*0$v{VPS=*Zkv9DqJR$u$t zxzV}tk$E@%OWD#nDF*;DEm(9%!bTZh#Q+?sqGj3L)2`oEAmFN5e!H54 zC~{U0lj7>bmtC3-bwRVyFB>)9wj)<)k|;m$pEA$X|1I2O`oUxWtKRZI&9i0vXZZhp zxc6Ug>ObKgBNG$bf2RmEts!l{DTeS<1gaB=Uy9nv1^tMVAz8p9u zgjDEE{do75R`iyT9+&cluyGpKoiRSSovvyl{rH?}BQ;G`lDoVNJ09lm-`W2DEbsQQ zDD!FiTHeDgcs#@=8W{eh`272>_&z_g)3WNv zlDcYeMLp$A!PA@M$sZaXw*kj721q%o^2b099TuVUwxsiWcbnf%Z4KW0`#fFNhLfic z@zAN=I8aCJ7^CVQs(Hhx#uS~oxbIL{6Hu^FVQR^%tIK|=&aS{za@rmZEWuFhXOSvt zd8CaX*WIO#gC@&}n@O6|_d0v%&f*S#nQj}*SRQ0Fa+hZU9R@M{qslzQv zA*C7Cgllw(K<3D%CjA;^NQTL%1;{`WF1FbQ6be@=dbs`>)v(^G1OlDL!YRrP%6JbC zZ?>TB_wdeG@u6uPtl?SyBZja!K2*CBqffqynA_-J1N`ElRtXj2B_y5_1w9k~8Wv7? ziSqQ*idkYGnagV3WC7E}kK(1R&Vck&pSXEX4eBR&G zHhQ!m3Ff7oWJ4E;pbJJ)(S6FvTmdbV$>EdX{uZi4;r7RWu}<Z4B(bk&AIp|!?WF#Av z{GJvan&fqxrWK722h6z@2oojcW2b`s?SP_XICRv>unz?g35d7tfZQ~1LZD^{0zUct zn!pw3EmU4&`<$2%L|kDKwVIJ+E)~zoCSG*gKb7q4PXs;g;NVmEfA7Mk0+Sjk!5?H< zUESUsg&qc*tpkgr(>~LxwAMO=B_T_fI533g3e9psq!-9f+Jqf`I>^2GN8l2v6I%g( zIDj=6C?#_b?4Il9ZMuDt1P9Fq8v;SBK>@r`Z3A}^v*TeBPm$+)*0Wc#jv!uaY07V^5YSh3jfeNKu`lp*dmQ!E_j%qdz8&Hv4G&BV<3 z@62-lCA|F4)Tr!gp8UEEHM!@pV4}t_dJU_>u)_=qYL1Pz7d%OSW zQ6`{QRg(OV_D_R=!otPH!I_Jm-rUl~!qte**xr`j$<^6~*2d7zoZiUZ-kRRX#@>kD z*3i<9-r32R-q?bXnU;Zx*3!k)$!^ppc5cLAgUQ2W)r*?jTD@ayhcFy#jD?L@7DU> zHoFdqXu-nOdga!xQ$wY`Y#wU^^2L|zaj(^~1HRk!Y52U(zT*A-Rr_tX^VNnt9c#aP z$=9hsYuE;!SGAetM1;kl4-*^H1A&O5t0`_2TFepA={jWXa6=E;aeoyrD=tot7p}@X z{;|Y{It}mn_3-_AM?}>kh>gf2AKSZm0}}Zq^RSlfEZoB79(c#}Jn%+MPX7fiv~Ce0 zd0uLN^qJe%VK?qrd!y`XWX+_jpndyAxU~%z8(v+9x;Sxy9hvv?P}$i2(|!)K$G10= z>#XK?a014gXXpFo)usqbFk`rOln6`BqgZK0K8>Gm(iw2Z6+( zp-6%iWXo#8V2&S`t2ZWUVEMQat zfXY29oF*!SF`L+h+@;%$Do&9hpaJi4A@zgA727#^6v(A1UOVW@4tX%ik!!pN&W#VV z-5uQA@d&oT#nyV)zIJl}X-78o^y7JQ@t1B-&JwX)xTmUgwaI*48V=1<6@eUMctUsZ%8!Zg zc@YJMhZx>=(Ntj{)ictsu$FBic&O}8ZXl$ zn{$(Z^EwzSy;|@p)o^Q#;IMKu4s0Vy)kz>$!CT`F=gweO!N>St=^-WYkKync)i-oa za_^M-gI2W9$}h=nyl%o5RO9$$*zOt5tr(C9@+Aq-=wqu~@1;g%DV)OsW0&485m`rs zkPXMZ$#a}m$q*}(i?t-JnRF51WfEN3lYEn)vtXlIa*DrL&opM%Zj7Tl`@>m908f z6pOTgZ4Pw8M+qv^xBHW70xcUDY;Tyx3ksB$A4w+O@r2mCBD2@(-8wg4JA4dD$tA9H&hj%C!4kVfNQD zYx0O^EV#l|kZ?xjQ!lM;*RGr1jve<=pP1D$5fYWPs+HaId5DD!`eYdV@1j%^wZa-o z7Cp9KT}r;<0X3{7i7a>UA5WcH%|TGK`u63xs!S?!w z&lY{)XQ{v*Ax_yFD!b$evKPKGwVx!&mH9!Zvye69Mkvs%&`w+b)ilYceqTNJ3kD?3<;Nw=UK0FnP?{Hant+OxbPW20A5#;o0y=~Gs&-F?TL=r8I z$@dx_SGMG2ib@3_s|b}a?p?DEs73>%xJj-aNU|e2t=;82bx6bwKE_8b6@wm~|~rx0}3qW`}%9pq8If`R?SpuckG1DCdFn#WYCTEC&6S~4>Di<_hK zsd@LuYDO_yMaSVNQGT)USKqI7N$^%#psg+a81@k}hI-+fqhW-7%^TreK`7Lm zuCm^H%W!oovM6~um@K)DtKe`~kfNC)cm<`3Z6LMXX*e#lkLP8XzVyx7=CoaCqc`E@ z_VtI`rN-izMzjV$Yd1^qX3fOdfX^}Z&f+9Laccl*_ zI~z1m`J&JokaiDlOgII=047P1(si))7qb(BuppZVd3B6+;&qFYghebKYJm>Y>(xG= zVVWH7LRIr5L!B^^30}S+O(DKtw)}8vZ7EIX=*MBVO~-Y_CJw0a)O&6#XSm4wI|tx(t-ziKkww=N~OB^?_a(UcF#BZIcg($!}cM zJ3QdbK~;cjvzjao?C?W0oSa*jV&R`IX0sc@WD0xjMXC#7RYh@}BNW!$24o>4V&e6r zU9Ku!5Zqpn)CAv8R4it8ZyBgkx0Y?xi$r?-J>y+|*{M=6&5#B~j?_lwGP~uff&o~f zG})4HqVeThofFu!Ds@CfZn((ndpqapN5He*AS^z4rnQMLbXTJgyL7hDp@o}vI(O_b zXCxON(&=>|80n$#$JR@pA-iunsN+phLeXEv zw_mA8m@1Z_eCuG97rF#3R8p73!SpDuOS0e3AEkv3_v0E4g|d_DbbdO_cq=`O)JaQ) zr}`&4QCNGJ7wS4mX}s=AYhY?=)Xy;4O+0D2;hmaVK}8%7e8bzH4pjdez{<@0@9^sX zAf4p@$cmQnpR4{?((^yz8VkdJ6RzoM#*&C5{+|V& z(a+=gv9tI4!f(B z6eW+#r_^I*xxVe^8Q<6W{`7g~B({rP@J!+f-?N)u@7oT+0#s9Jh@zA7(hjPd8?eyp zo9XL^@au=}V>Fv>?{@|F`K9SQI9$PdM(%9@Rl+ithk8x~*BUS%_g^9s)b6XVJ^Q)6 z5hJ4+tRVK?Esd~iT+OcuE@hv2HcS5cts2inp?pbheKvbO=@3RLoQ|)ig~!AG&%FHv;kbD5E{xDZ9UtRp2E%Ov zcUh^fH2qASY6RRtE^RicRYoMEC;b{Wtcez&pPU=DS0Sx0D?)kOPkXZ9s(jo(0t?G90;c}2om%Zft7d$YtMrpoH|C9)ZV+zi5dog zLo8x;WP6Qsuahvon;!>fR~$Qkd^k|ZMayJYU46|G9uxfbtoVx`9kaWb#*%wC`XQEid2>2S~$bnH1xOBl0s~hrxyAjBP7P_#B{PA2Re#ISRKLbc}`MflWJzn zgiS1}ywJZlHbXE6l!3A$3lN4yENcNnpH9%~R`A2)W8`0@)CetbEx$)N6$M`nuuTP6 z)lmZ1mgy%-lOxGO@Ww-G?((*EdJ3hfP8l1cH8J;`XAh$TQ$`x( zFqTB^upAQ~DZ~6fUf0W8OQ$%{nMEzgiu}Z4mMX z=nYVY|z~(a+;Fu<$U!_4nK+XhYV30lXGo z+ypLUe?EK>c+wAjS0WkWf)|7ivzd7MX8ljE*Wn{xF#Wqs+%6(-J0uu3w&LX8w9YX7!4(Swjo;ccl^E69 z07v^4JoOuB8qNo=g?7gLPe=Q-(>?k&!7Y&Cv*WCSk+Bte*qX48C$SZSZ871WP%8Xq z=QN&*FY}-PAj>%bhVbG9_7pgpuMM{-oKEmEU8)9u*^bi@2ky4kEtrzzID7qF1Qncp%M*9L&Ojc|5|n`5x**`?HBH#G;@52K1_u!DTk1Z0djB03 zn_Mttu97V-M+pFOBhbl_{wYrg5&gY(xe_*DHm!L)z8O9MdQARaFT>GRPT?)3IY5XY zJz(ddhN~GIKqQN!R8d^DP~%3KkOAVfF}k#|rdmf0#eaAd~FnNVQqkK+ybBnTYM>^@?Ez{L6)^4pWS_}J<%Gvk} zjc}66yqFHTVXHr*pFZT&9_b2V?^a7?=(95^YmY!bj9nf%M-tWH=(<9PvCc z52^PW{N4rMvR~a5J9Xb-2r0WY-I5`69O!|!9L~0Y%UBsaGldHI875BZl&Hrk%6E{b$J>U~MsP74Upf*iG$w`B~BE}QSkGi$SFiRi7| zy6@?!^|n0xUUtH5&p(fms+S8Y7?TDz&Lu4l+fJFDUWG_gj2X?sEr2@YAu@lkf0{ng z#AZ&DHlFq^ku8)W|Nejr^_@!|0Sq0ny!)C^;^G}{W!Hc$!raIZWOjBVqEtJxN4VxM zp(!Q)&^yOO@lgHD+)%+qJR%>C!ELAA_X6p>&%PoS-){d!fM`xh9^|h>L%KAR&z76q zkiOJSOy|_W>hMjS+`C<1a}$-YCn={0ba|22(Hy+p#?6{~G7pbFb!KWNb$G9HSrt{~ zg{kB1tZd__+!X61-1S4Tg>T-Yqo_lm*vyZl2PDUiXuYCH?>D;@Yj9;q~>x2~BjWMBg=H`tRBkmP#Ytj!Qx|zSBN`;}$!%Y~o_Y+Hx zm|zM|T=%mBGM)oR=q*0}wObT99GnG+n1mR5bGrf!*N=Po*RC{dsMZfm!o~p^rut>{ z;Kf_;0G-5F@BjvhepK@s`~Xu&GjL^=EqKJ@P^+~kwRuKW%KdqD zOOmX`A;EKIlFk?r$~31cUCh#ptT4nOjIrv0|RPYP5|z*a6O z3TtI@07#A0bdsc6 z-UFlj%eIFxMVUK>x#f{w+C?vpMqTA(i*a%PLlWy_h!7(4wOX6;Y@5 zq5_+i>ah+#L_F8O2z*4F|q%Z1gq zZ3&y(h{(1YnIj#hG*@5wFP4)8Okh;I1X=FFVGfLVIOON^WsE9+LjJccyG-593z4iX z2}jcr)X{v~T_JPm+A!Jo2e1+D07zvuN;6lLlTwDv0V`mvO>^}<4*2QD?Iz$Q95czm zmeypQ6Du>FH<+y1^hHxzf)DZMQB)f#j&8@^^JLa6e9`(_SNE8N(B1KCDxi1<@eH=l zJj7>d%C#Bin+E;adL8>3RyHf*A}$hjNpEZ>@C3J`3g_F{N=SW)fX{){t%Mue5S!se z+g~>A?EU(r$$l5wX!p;xnWs}fO27~W6)-H{?EKj;r?bEn%C?}ngrC!d&8v3=@19UI zj1Nascq~jeLL^RP6D^8uD$Q7Au8hYTWBu%aPB*rAO_AAxRzjj&g+;eY^pWT`dKnw9 z(O)f6-U!j=b$Ec~Rel65XakDoBcsuwu6ng;!4m#$oBq(M^6ri#m>FFzgGZthvtGNg z%6FJmYtlci9|)5GoLgXh(&^>$^$V7DwGTzfs2Iz_y}oZN%0~)$s-{fE$_GWBtTqwI zTzo1`b`3{6Dp^gtc?W-i7)+lB!gL&ij2kY;%FJ^}V)fRAoytF;i1A24dxJV$me`J+ z?G~3>)}X{Sz=WxNDZshzn}Nq{n{U5{DEMn>mg zlPY~ee>067|A_8sVktIG_uSE-B|dqpRMP05F8&JQLxcvSSn#hNu%p%32-#T_2w zVYxjdKR{!{95qj+z?Qj!%@)Y|!?YJI-Iu>Tlk%sQK0VBfMRC*Eq#OdVYH z9qvraPmi7%9RJ-K6g9A^0a>0mnUtbjW~0B2~q6oW>$T z2dQ->pku0_bbBbR6sr21t)NEST^ zTgh&Sfpadtudp3z!4)=Ly`4@lbX|ng@DMRoban}ujbCs3_;9vPm>v9V`#ioIyzOS> z_Yx>s4qMOMM03|^tiR~l(09c6qOL!;1&acR6Gd zSmOUST|ox^J<3_@>7WwQ@K7!0QH??{oROt>VA(%1mCCKA?eYuZBSwtN!uG!9q-61l zwe}J*4vXvGMD`22w0B3cO#eqYVKiH%tyW^ffT*Brp5@0!ceke9)+0Yju%$-z+K zS~Fk?AT*K$uT<@wUZwb2a@x#`!|z8>p&@&Ax21za1Iz`Rc#jB5BC!C`e22DjOA84~ zm?n*KU2Wd87k&onh{c&{)*@>ib;VO!vWbI4yN}T!>|=pU+-Y|@-yum7YXBupQBcyd zONuRC1tMxQ3Q|F=zOr#hQfW~^4kJ_!(JR{yFoXd~E6u_&nMFh{#N=yy0nPmHb|KZK z&{so;n(2V+v9(!)EQAi6GDYf*Y;oefcNlV12I2l_{HY*3&D$V#y3^u^pzI+d8NAyAxNM|SU4p-Vzs@3HL-o;ru8NJ+*x>? z{>cDK(tnx%wh%SKLDsOEheR~Tk)Fvm?y8d5w+VCMV4K+N ziXyexk}oQ!o)^Pn{lrhgNbPDs!m@!)3~@P`B>-D z*|VGA!&mX7^P7m|k*Yl?Qj7F*PyKRgQA5*26n-1CXg2(UWsbzU@&G&{8SnqCs;~$0SriM%&%XYppWvqtm;`y0~^{M87X;g z^#Rh)7*W5tt$lp>f0$$vw!?h$X9dK&YnO5Jpe_Na3ax*9sn4(HeXsd_*_#JD?a;lA zu2=23Gdy-z7i3gImK`_Oy>?cL*(cF~l55E(|(9WbuNPfEAWh*Pv=0V9-zZ zfPH{{Sk<9-rjk6gz{v=~oS<>yOezfp93UZ4=JxyAz^f^sud504hhJ`04q?dz3B7p> z!k{q`c*94mo!b%VKGiy(a?C>_-iRQFZFe6KZIs^zF8xP*yXnJ@DsZ@~PxxV#}V@|=WG0W)vZEFg-#dO~;7gm$k zJme|+?E|srsT^D})45spL_sNA=q}b0SbSb4%~#9FCY5#&Hg^dV8hJ=)Eqmyh!fAf4 zxWn*-#Fn@`*qb!;dzr+;Ibqn^Db9aOl^fz-lJEDH=j(C(JG)KIM?#V0wnru#!K9>a*}92QlJUN8v{AdkG-p8 zJe=z>ObaIzvxJD^?Wxv!W%EKwtrO%L!J(GWNnskoMQU$?QWjn*@~*n9>)jC?J!yj% zZRwfNDz2P9eE%39Q`)!?O4$P4wE)V{#!6g@<~XVHrh2Xgw~$Cq(F?Q34X=|f*FuWm z4s-EakRM;AVBAD1?>f@8EV1{()vRmBLEwFy>90s+0;4mBRbt#e8JXX zRL*~B10?Iw&KRbA4_G5p_Cs*slw~AJyR9~RvIxVOKU#6loUKCv3`HLG->$d5X%0QM za8$vV9r9p1e2yW+kk(&N7jWPKWGfsIy%Uaw6NaB#?hVz=W7r9WetMj{X#RPDOb!)# z!2(KF$(P_0W%%;-x~c@&^(*+ibjuP!KSk-r zY2@5ZcmQ)RHeXFB_A9J83)J?W;~K?)K!A*D<(0t@WMtE)7y$jq`4SuSjCwx==rQ%` z9pucqN;tlmH%9Gj?EnhrB1D{W(?|X`V|Oy_P?ml=a%cCE=d`FVlbWH}SCJ>3Gl#2t zOB8JPkCkk45sj7TMYHSf{7?;h*U&6Wt@fN~(lFk+cO{(a_VuV;5^x`H&R>Z>t9x4 zLWhs$)k>=?oo7FsIh(165j}qQ)T^#u>e+XhQ_2$Yq2FD@jPXq&v#W|2=dLL7M?T!= zr$+WwRktW%nlJgB@1GErr!qxe-fRm<)M$gBwKEwh{36pzO*Q5;M2CV$&Ab@<=VikL zWo)y_INcab=&Ag4(pLFEt}!sfpe3hq(ge*_A)nKMG@Ls>q} z>MJzl8`_-6Z?2z_z-vtpeQr8i`SpCB*N3;IPthvCTi5^kHN}$ul-#Ym@DgpeBZ& z28AP`?b{ULm8f=oI376pfcnO_;nj%;289^|sK~Z^y5F9c-I2v4`oGgrvklI&?Y;S! zjKEKC!2n#C$k=$PdAt4CFzW=9C?ZzGExD13W5wE&*gU_}B&((JVf80rw05y&d*4}h zx+nrXQY3aHs-^477OA$Ay5O)*VX$QNl|mb+5?*{SE;XM7q4#vbMqsfLVk%&wAr`ou zUll(i;PvkecYO|}29f)_Y3hhtMTu#>)s&eg&7^7jJ%_^v{Z9mJ1{U=&R3t@ymH)jh z&{3nrRm!I}&NKP(QAsE<4n}Bw$MAzc<=0tMxn$-|&J_c;{(}~##CT1pkvtNtiC{HYNsnZP#JUEy^2|7V+Uh&J_9WOd2S5Giu>ih z*eRbXG4{YlE_z(jZjnGvg3IL5!P3yq@wnTa#l(-^*FLuEdJ)6nHyy_R2wq@f;iPCnOphhZ>O+| zx)(=ov$CPt!tH=sPlVSKJGG&yO-MCSOzUOx_)Zy5t)NR(|e}+P*fe>SvY|NwL03nvHOeAIWGHmPW*z%ZFv}JSKq)Q z8;Y?ZrrumE>WPG)nW64$*iEeHnt&=Qr{Ns7IZTFS6$^M&1MPz6dANszU4H5azDf}k z&lX_`K@gVZgLT>_*0C1eUF|LDF5)d@mNcCvYu0Ge1qqR(ijfA#^&-`@1}(*kzqC9-mlVpEHd1me$G6Q03s6NMHQY)8 z*}6N+)5M`Y%aT5m@@4}sihDdo1qJH}Y!|R{3u`q-B17zbv%B_dT{fR(={XS#CUO(T z+={-e0D?5f$lV=hffgYMZv&{kSC%fbogRRM&XYyN-ppCB;V`iW31bfIx=5IK5r8EaUR5<=-cR?P z*Z7AKx`)jP6Nm&q$Q?Ui4=Q!%4mP{X?(T@sKLuc17;=2t%B1Pmg+7^;krUN+P$1ASRL;hUe3FF#F#$~5@_ARqOj1^@w6?A1L(X%L!&e}t79zC! z)AMLzHnBgEEYZwc8#zj^mp-lMym@&)BZiN3u92%kC}Q`8YBiE&VG zT_04iZ$)7?G^F{G2&t%IWU>aUwHqfjWM+1v;8~|yq-v8ivf0xRxj@zDjYu^k#G0ZF zPpR^trtimss3KOW#WEnM>yrVh`~>YM&RXdWuQ3db-Ei_N`*zs(w3^@cpm7aqQ1=Bu zy*g3lK~T`@1FIp-*J&K&&^fd@4PE4lXRU&D(oiTK>opY-7_d~AyPzC-?8~A&mCoXR zOBTy0%Inz|&p6A$i6#5vOf(U$Iu1ovhLGv2Ebz7=C1?bGFYCIg89rCmevo<>Z~P`Q z(a|^$;|i`_idy&e19DU^%`_E1Oi~5eAB`Y&er3{QAcw?Cz#(0Zdu)&lcpi!9<6m$=0vC ztXWOXs_f*TB55kN4`Oc<2vI?PyKF)Nt0*5Vi=Gl zz;kZ-5{clvO+&HDDhcx%ciKiksbe7KUyTWZp;#JMP9B>3I{pvfe^g6FY|*R{6lAKl z`9#;;v}&4>nqgaLD>bIhX%Z%upN?9|k4?KGKy;>`ZnYphQV#o*8Hy5ovQR^_(q3ys z2=UWi=|oY{$GuYnBc{{y2T1Y+;Y*7{C6Ke=MC8-4=%#VHdISub;+E-WKy^YpLJZE% zr!_x?x>Ux!(8+-GviYDHn%hsnVKs;^(e-EaKhuKBLWK{VM!M!@m2y%{z5_}R>Y~=@ zo+@Y~yR|DqhV>oolstca2}@s?gm5%t3fy%TZ2 zcNAh`Un8mQ%0M?x{3&QW2cKFgzn^Uo@8OS9ak4(as*2{SlqW1ZcEa*J6CCRF9S27x zH!whlZEDPon3fIfj_wR~M>MwstA^(8y0La+0YzPx4=!w?#ej=nT^V7XgWV4tW*W5U za&*~GR1XT9wooExR7H3-qo7LbX`N&BXqHMQOKBzE)%kQb9F!Z&*tD&`I7T-$jW%Ue zV~1JV8k2#}u#RjnXmrStk*;!_*Ar>4&5ajQtjaZ#)X@k(F}yDIJ7%kFi)j$yXhjh~ z{@IYa`zeGis`@q-)jiaaIJtUi<*FBwARL1aSVVSFtGh@;R`B>57S*h-?DWV}p4;+o zEFkV~WoR_cY@nHTk08ntd(-uAHJZKUchsrbM}R=JkQ#^>t&yq^(6Mn=Jnlb(6AXzQ z;($$bFcl!k{H-KzugMkf6jQg~2g7!-5r;-JtEx23?)^bxbOrrA z%CV2%UfXxZv23j$&f_`$fM%Fs5g-_U_(;6du$th?JAepm1vBWw#DH0|MPz6W1QfMZ zde!{InLvBG9a0K*=~!znt+g^FYEvGGWQluYj2X{@F$43I(r#;4(OST}hs=8zt}gyB z=H4ktv}SA9EU&U{+qP}nwq2`i+qKHJZQHhOyL$bn`^1U;_t(+8Pwb1nnGthFieaXQ6#rL(6O7o8b^HwL_`J{& zn_1HxT&1}2@sgSO5nZmuLDAVHY3Bm3s=2xS)A@Fz=c*|AUIMGeu6<{}6k6f&)N}Q< zF~xUX=48wX$NJpX_%N{K3bscskIGn(R9sq#z&Qq>rh`{LGqZFu@`V#D)6;{^d2w6+ zCI~gR9h37Ih%7*LR9U7fV*8Zhvq8BR@Tl6Pw~u4_w`-fB0O2ea4$J1W8xY6NBJcxC zCh-^zXJg4%-9i}qTIhw0EMTEdWGg2*&$Aq(`rF^rvfFo+*=ULHFB5zX`pNcT;n+LW zndIO{ftru!`&E9dP<|U2lTb?hgoV<%_{E#9!Sf;*j}{Y#xRMR7?kFof`*;|yj-0>BSPXh&ZWr5!V`75q4I=gT14H`17F5SURGgkK(wz*X~K z8cQ#E^Ude6H>-UC22?>_a65J@XJ0-brdm-laK}Mo)_iNd8CRUPRI>w(?j^2G3^mddG z>6MaT!U{DiNnUI|S7o(5q)gY(!k|DK9N5(9q6x*Z$H)4Q47n~UPAaMir0KL8zz%5N zRIJ!DNKZlS$es-!>ze~Kgs57EA(Q$-nm?>mMY2#aqk{p@r&&EdJyn%_ITTnW!#q1B zltkS!DT75NmJy+lzJ$crop$R^-($v6Otvf)SlQZ^~>?bL)A=^5Y`*|&B; zD#i|hQ?9gXP(;G{rFyMaM=E#y$hsg8OZd`V5eLT57COyo7i5zn@aMJobhzRLr82^~ zRJjnu5p^iJCFn6E_QQE3q^yyuM#GP;dM{#-7K1GfS&D2&e|VPDd4LEZWy#tLNGNX{ zpR;lULm%mZj&-nBS@&Ly$%v8ibxHFzi4uII2p^Rt{q6|3F|Zocb-he!dMx?eICdBT z(*M?wr&F86sV9Dx2qV!sero|aHUU6;PP1zy$?jR>7AZ9lAyvW4Xdt5MzXQ~+3@Rb+ zN}ooycgu<>0T?7fRqIcvx~gK=F}U*xIYGs>2OOIcJjIcEo?6*p6}e`o$4dg;uXR2$ z^~Yi>>XHP$jw=#c>O@GQ{IvqObQNHH6=v+s`4yr{_FE9KH%Tr{-}}$&0gH)wuLCi( z(p-v~AFEsHRK_+=vP>941|wwqTKq`$p%fcR>Umtwg(C`F>lo!75%G!<2$YAQ=1he! zL`SzY5w97h|7OSQt|iBUkv?gT0S+=K*@@Qr=JP^u)>@LS7`!Fsq;2|1vQ(L_G9DHD z0Z_WvSi=1cilesOe4K!LBx~G0O-fr^?%dqz-L4+mB>Tc4sok&#BwB_;af6obR6*)q zpz|lKAClUqNB9wtVYLP&7vt(Vt!vNsnLBBjkL0pe#oe? zbGsLtD~=rAkus2Dxx>O!F4R2qID}BRVoMCOTwC{OL?lg8c^X8I>>?dt061W$C+|9` zw%H-7CWfJS8@Vwk(xOwsRX%;@ctN~)oJHxe6mKtXHu90WXH0&vvbnl#ISRiw#)P(5>{tYmty&ZN@ei5;&wSEqt*L zN`Mu{52H%tIzfzrgBDE1hc-k7Pi${R6jR0C*T zlbVSKqFg^HduUQD?n7D@mEqWQrG5@m-Y04lqjg(6tmg>zkaXgI1*_>4uhfvLiJ}Q9 zR7bRb@a#ANm4O5}_;_An5c5b1KvloyE3sNjYUYUClubGlK!q=Q&>Bn2<~P!td08D- zr96`2RPCE4v}zrUK`(a#*;>`CmX+nbgag-|b>Z%Gyloi}6r*}=l(R7j`^J3ok6FlYDmQnWoVNt}J(!jh#XHvp@>JYZp3!e;ijhOek zTcaa>U{D}GHW78q)|2F9EXlo8br5r^(W=SB80!j1o`^csE6Iq*81t;KG8V0;)1?_T zyIfv%iF;roBaqlEPfjpdESyD|o@mt*~RrNC%AvX>4bNMesLUrdT%B2Kv% z(Z#;Sy+!JV7|(3!O85#Ohgf*NkD`YCq6qGiEq-ncw~M;4Ad-pvTlh`G7piien)xg$ zpU)?HC9<&DB0txs7K;Hzb}Vne_4w)$K#!|t zuB=~Qq(SfooA}CA&r88VVY8Hf9Dz-!&*ku?aHDW007So$g28!MA{Hgljt;aKc~g8^ zP}B?sG+Q%PO zLHDj+-@>VB>s0;a9k|AGy_TG&ZzRQr6LTRV*qr&Yn7%H2RxVA{T54lFG3R}OAt7S& z{_$l0uZQUW_{si%3rfuJk5FQEMuvZ<_^(TC%odpezH3J95uy&f1hqyH*`gV{m0${n zJr19p1W|(alV`?OZh>bjJsTQG1ouVts9dck8^;#h_XdM+u0EV$==j;z;clt}4^GdQ zr6m^164&kq4Q*wfo~`31a>=&OtAd}@bEdg&%>91-@)|Wq*O!zKy1HRe8dxb#YdYv6>DgPoljW%h(qk^GP;vB{3RoMA$!Z)xeo2;;9Mo@T1xO zS#jvg{ER`+12Jje>UaPao32xEy?u%I&VcJx4DzCDUc1%`#WsI=+pN8 z2EJwLV@X7z2ZP5UM%|IrA#KvxXja97ON9Pl>DDo_4r|W5hY>Lk52VpfSXw4EZ_ZSP zu!iC-u0))X7%;huPn{S~+>(?u=@NQM7p2Kw5~09@6Ah6Ij2Q2$?6Qly)n*|tH!`i{xqLD&`Lv$vD&WqJfMLNg5`zw z>!c3aCi9k-&XpbQ!gN8zV@m8hcTpwF4VhS21!Fk#_+6GJo%a0$Og0_zl;*}AFJTB) zHPXpj*=PZpFV|0qiWL^vEI42lm2H1$$9X3YF4MTxKnd2BG5vV}A~P{U$0aVhsZTrG zeNj;PF??PB4bw(_^zaXXfsu*vUk&R2&&crq-Ij};k(PsD=+9Oy|Dvc@e=0wZpTDIU*jd5WQ@tP7G;6Wjw&{LTsL0{{yxQ4d!(+4l zxSRTzVrwy+czZtDm|B{Exsk$HR$hc@vuJHQvJmy@#JTv&^n=w)TSCe3EA7Yv2yiN^8E4j4PBDA?dzHh zT956cj}Ke&)qVw0sjsX^NET2^E* z{-!tlvsm?AU$xmiz-AX^r1~%b=L?p=NCilI%# zcTTNH>;1~6SLl*4Lhk8mW9X7A6w0h(7;MwAy_vkiWl?!J-!5ppWBvpgo!-cBtEF6E4TVa>VA z@5YK&K1)SNbmpx7hn|SqQ2w93coX z1wvMLlZ@?-{Fi3rp|Q2_?B#94C*!{Cyg(x$)da&ew)%K2Q3tVG+-9GcBgy>?0l_?h zY>#+YsVd|L_Psg2myhsa!=4_)UXih#7ajf#o933iy#0o-nrCR~^vT8^L<3r?9 ztF%8c_g8J_-NFmMX8k7KRTJNffsZ8y;F3bd8AQ^b26rGPq$dJDfe0#bZa)XoW8*@O8)fUmI4oaS%0y;>H>iBg#89FTF zAuQp`L7O{Ncob&8W2qoMmVUGFv_>pXI7ozte+=UR!4JFvE<7b8c6QM`?OAvO7gorD z#my}zsknUg$cYr>oqBB>Ax0j1;dkkfG(kKqdBoEG8w%1oTvI8wZ2(7fdD$5ys2IaS&pN6*>B0xhOYTHE9mrv4S&* zq$f86v&OiR?nrAIB_Pu-4*d-l$9}RLI8HD^|2n0<9;7ql7=yV772Yy`n zuFtcs@%>%ApesaYMW?FF7?+rDTK$9EfnkF(6&*xSd&`x8R!H~3h;zXMdZTFh$sbT~ zNqhFCCNQC0aqQTz^|`93o37G$0bG}-1HcuQ@%C|Yn7t-|58OlNzM5BV!eTU}GJ!S@ zauwL=etMq=Nk&-Y<6-EwK_`wff+XSmIH~E`1EBF&gQpnkEM!bg(bV1-yRR6ZaNJ_bJ3gZb^$(O}0<0y9OfV zR)+&M!15=gSdYXNvYQ^2}xv)Myd*>OG}0LI1;4Pf^5E z;KK98iK}oSj36esN=Rn=C+F46d$8B^Ey^kjsB8!1;=5&?yw0-60eOxLs(QbtTc5J(K*AStbI3v+ygJ zh5xtdB@gsY`)*_#Km8){bh@L&9DGDtexR>9*SpB3ouOf!hwhfxhWz? zyrfypSGz_$EmSbWsMyw;bud?S)JmFhjt|nXMrbaju0(eQ8F4O8t~rYoB3R9Qg?HHJ zyj5}R5&HYBsSNRp)kaowedTWAnend}Zk{;il-f;_#Jp;)97`SG(9VawZ%T~d-dA-~ z6`BH-4QI#ix}>Pq`Q-q1q=%WoMMkiVhT@QtJ<1UzhqE#|+QqT>Ask^`r|pgwlK>txrwf4rH{>^5?aoN0u%5gUqtUWjZOM z!4b(1vMF=ETvrY4TN@i8h=wCbH}&ID1PiRQAaxLA%s?|}H?v<6TmT8_5W!(75cGOM zCssBU>?NJDr%LtPW0fvdmdVg(giEG_LSP5@&EIA0lic8ZAeG+lh=+rWM2YEZj{#GI zlNnJ>q}mntoVYR!w++d)J#;Syns~1(2H5zOzrvjreS@a^cfR?F~9`@9901#<9wr{NzP9j>(xfH{s@kMuoi3J_i~U~ zFrkpdCzR~U`EU#D#OQY7YRC>P!+^~V8(-=YbeHP<*sDXKwaC}_F9_$xB{5| zDs})&`6y}8;bfAF4EOt<*5v7^=M%NglL_o~e8k@_59>0ghjssBo~}Xs>@Op?n3VDk zxQHZjelo}i<}5CS)Wj!)+V|?$y`oL!#im`ngWE9uNdJ>< z!U^Lt5v~I3B9-`Pmh~$-5dh@RCVK<%Y0{*DqiEaA+mUFAt(Ux+~E>+lpj(f1tO&pe&7u2DWzaSIv>$**U# zUe`aS-%}YTxM#C(rFxX>&F4M{!$4m>l?VglIX^((+bh@qAoH1+|4V-UF9G=?}W)|DfcosJFBOnT9An*`A2h4&vlpLH9$K5fF0ltIo z?ZYEUvPctGFJ7da4Q*Xjf@FyZZ>Jks>XPI0OQ1J$CBOsk^ZR;b%k8J`_+;ki`{(<5 zBIc%N)BA5Tuvr_Lq3?&o%eO1pv>L~BXOrNKi++k$Q_q*nOY9CF`^l}Iv)CGrireDW z-0zQ>uPZ%Q-*(VlNI+ccpf*%@x5hvLdg!3!L2@Z2Ky@{0J zUVL$C`!t{J{NS@dX@VM##X-7Pyx3dNCPA;OT06scZojr<2e_kDA$dRR7r?sN6h~?r z6-wydrQVr1b=|)82OM~!xO8`N7AK+D-Tckv7Q;`bg>+>BJNruXT))y%6F-5H;J~^z zzT93MYRLmeeB+6Fet*A}5OFcqB+JXL^Oz}e+OXeJcRsQD#No7@cbWM}(xQiJ*abMg z3zoW}Va~MrxYrplx>w_X5ix3B-7!W(mEQ}0g`MBQL`|nhirJnZB}HZElM&Q&L2@M& zeq2{hXv5T`H*8~A*J42@LzhPf2pft+VIRLLi zKw%2BQO-mBS{J}5V3KfC{VYk&%sPbBfug`pBm_x{sllQKA+PCmhgXnYzQ6(zjpxMx zQpt_zO2q|!NA2lnkl&Kbe{f$gj@MV@WQV(N^ofT@FA!->L&jAAn)gz$Rm+ZIu&BM} zq1rtcg3dyl6-sxv_|;pO5+N!*o|o^*VhrFI{QJW?hYvCq3s!ZWs`faq7&W zB3W1nR6lu!uW7rG##T`8kO<#=J<>`eL^NJ?3_qjiixyErg2V|4#B};YI3++ zxKFc*uxNpp!iAsBZD<5IAH`BYm^kP7TEC8qh|K#H3>RA6Z})BjclBK;R9x|Y$? zG5$GEAjf2jOl2pUw6JUizZ)!}#X(mv#&AwIHI^PSydvs%Qs!%#)iQ}vt@HF;2Gs^q zFI^ro6Kyd(pu|Zu{UeEsqvxWJ z%p~r(6NpHo$ljI`>?=*@V#heJ!V+2<5H@}3CzO+HB-l>NJlc%X<|6h2oBBv_((i5k zvodYW)>Ix?nR;FAv7lvw-y@lWBtcrOlm#M1qums6iJIXoM|?iy&v>94uKuijt;5P%Dd*w^-z?>a_O~?YYKl|gl{CPc0+|x&Qho6X-zy+9xw2lddHKffCUYK z8APz_Y4F2?J&?Td=Jhf)g3VKCQF2{%$m+yxcFq|xcJwWd86Te1!6oxJi0`?VRJD5c zxA&JIq9XdmkS(j4oIDrmZ=+w=6hDqx-f$MlaVG7+Pgg5US{BKp87hjzhf^{uWOh-! zU?Qz4!G-GhWL9sDhg6M+*yL9Sle^Ex*K0y4 zQd)&Gws};KsL4vaNV|heBMl8`J@6&}j z0^d+>MWq|j|Nf-I74Gx>=Z(@ zW5VM8KDQvLUS=)$lEssO%6Wc+YNL1IZ&hf9_ zkhe$ggfda&KH<3j50q%~M!Na@x{e;Q8V!kr@xJET#lo@I+J0kXsqKLJ9?vK9E)I*G z8Hq47ml8S2ZX@8FxpBMXxsg-BvD7DPLv6ne-MWS^# z6^Ao<=L7=nYM1Fq!QoVX4%JmIHu>H7kWnji$0>_JA+n$TfxJ^}JG-U39>#Cd3CmbK9aJha?uHB+i)XW|9zz%$1|dJ0NN8OdgyC(X zR2)6DNt6hN#y~w_@tt046dkELp&xL0*YtvA2_;_uyoG!g)yLL+$145h54~PYBN@3` zg>9vZLd6(bhk3vYE#$}A&%Uj7`KKnl`tQO}?A61D~pTazDEj#BB*2h*%$G!qtnCI@u7K(E$iwfYtVS7iKgM{8eW5MaBqCM@= zQ<%CTjPrRh`@LdTf114tY?Bu+PZp$vwld(rBu%pFE8d#3P6aN!-+ig)P;*h1?=TI2 z+-_0vuAO;xDt5P!M@>zf$&w(MwmWz ztKkEIGPz@-_HqT@S(6W&D7&H$U6lj-*g-LXLgLbUVvu`l#H5ie^sgk!=~H>yJ(K*6 z9*XI~$a-M{0>Se+{_KVQw&2)#+W2~oL;#}6DRNF35U;}U?fC&4* z{ng3C>g)YoS4KRg(bIR@K?#($Xh$*?vW>ww!$?8un+CsYv72l*Fgp>U#`XhX-kIH~ z`AtgjjS4`Mu9_OuWHL8iAJ22Gnh!Gq*_GW!CJma;)NAYPphRl~+`tI0Dpz|04xfvX z@0$q)=)CUWd?S2*Mm=W^qM`WL;!&9n4$hXpGV@ea%!=0d9Ddm7SegHcyu-x&PZ_@d zoRKl(zsH~XZ`_&xG3tK_lK;t_VWw0NMP436!QSRpZZD*_EMa}x`yj_=FC^-xaDwO+102E`^8rIXFx)fO~m_>&)2d@0F_u&r~E zDTe;V$He=)yxtCLkNsNeM^1AsAl(NXdf3B^^ANDA$50zfJ1$DI5*PQz-MHs5G@oy- z9>0CjEPYksU@DuMgM_wa=-lZtPqyB8y|)8ya^Cc33N^3`MomR_~gP&deZ^JHI@!G z%2=~M6<^e~pQR?qb(0G4i)}K$3*cMQDv(rB345hEKrivh!j0^Fjq22&;NQA6#>!eeX8ZhZB90r-Ce+E@ zk!7-^O5}O38QS>-vb$aY*{nH5i7yNXUZ^j13oC8VC~85TbxmSUGzY`-aTP#`T>38E$Dd*Qqg;KR#|#oiM*-~ zV-OJFx;WbPxefO&etf!Cr!|2OgQR)+rIYM=bztpCMJJ0*%*^ubq&tEbmKbdS8$2CG zxCTgR^@{OC4+)o1Vyk^n!fi)Cm~QZ_pd^%&h;*BSId>h{fPDjt`L_u?+6NH-W^E^j z@ElAEBPE*%F1H2A8m2zMAY&}G94i?MhHE;5{l=&z>GKmJ!r*P|1*3&2be-7)3ycPy z{o0EvDxRWtjMIK{w_l69?ivXSn88&l^h&Q}?Vk)xau9N+!mj82pRS4ui#tAC?vHWl zU4?7hT;$IfMzZwBJVs(LVZAzQnUkLsP6h;X%?=*6S|3GLw`KY%Dq{|yp_`4>s&%X| zrTGp1VM7croW-3v`j$Dh7E^KNpKITa*T#0}?QC4Xrc8fntEo~Zo`pmu7)t*RYGk5! z#c#?phlJ4Uds7`GfOpGn?J)X8y^m5RN`3v^%XF32>QwuR>+3bVMH3VXB6tXo0%*Sb9eMxR3eM z$PKbL@aES5NS9f!yt+ptZLJodQZkyw~G9 zs!E=_S0)CV(K0#m(QHW&S`?~CFSEL5u&%orToNMR2OU6PMark5na;HR52zflwB36FvfR0d- z7co*>1HiNyXe#{%T05M@J{VKXMbBup(5_R!mf zU@4MvX6gJO0SV2>q$#F`CL1Aui<tr;!s2;42x_@ zDp-h8#8L!e(wBX?@!MLFVw%Q706qXru-%Q>j1eDazP2$tuD#@L;$gy<&|d<$bLykR zhLUEW_aYB>#4y6^7<+5*l-tCUMf!&;>RGq8so5B(*y(ImHC4s(?wOeNdLt#*0l$4! zJGp4B;`Q={zsK#ougotW@AcjmG&VTGHYz9vP|T*^(Jt$x@Ya5D^2oMm!tUoo?x`!c?pAz`P? z^h;alQ$pvfFiTK}qq0dPJ}R+MaqBO&$`dpTZSD)qguS9 zGLZHY?_Df;P8dlCNu(*xnqrdv!3p6!TP==oipfY#ydT$L$#^?v*oT_0i~DWAy~<*M zG-WT2G#|hP=2>8HGp0ex(@8>Q4r~qmK$XxO&9P>k=H+=9UoHx9OVox+@0Y!Z1cox- zE3q^7)?uTZcC#hz5ZSc8H7n0IqYLEu7VA)y|za@e-`91_{qz^(4H4cb1T; z*}$sFuig-Y@ILOvfLCMqjnYuuact40{CW|;WqxhPRe|7Xaxyf(R*Aq)v3wL|{c;hS^V@cC!AC>G`K&acB-$1L8)0%MeYnhnG-y#9YMiPLjsJoK#r6$y~_Tlkd`4 z!}vF#v16v?!J6sv#~_+3jGF!!`*=yp9#3q|#y1G7vkyW89J%S-79X4t0(K*P_cvYJ z^yi!C#ZRx$Q9NyzF@aiPl>Q_TUwpm4`%7f@Z(`5+Dp9!nMf^znj7tck2?M4)30alp zS!DGfYlTbpn0He*O1mQNc%Bd`6MN0U%5!|OK6ntK?^Rv5lx)R#q}z$qey75TyKYGc zn;w@$8VfFbaNZ(hsF(zC+;NAl&FZZBiOfVXiJ&_AMOle;U`~i&G~2*cfY<2>+~zH? zZ0rUnJjfI)kOqP++*x$}AqvKgIXcu2S(s-qm|Ob6q0rz{@;HgSLu9>Pj%W*S(;&@W4w;dPGLg^{_enOYik`IM zP#`hafoa023iG-v6ZfS1NwYn23%liyhcY8oMfl{9AJB&UJg4(=j+4hRR4@|IQD2HC zQm{7_4mQuoJ`6uHa(N0qX`0}Z4SXBO?+$^hLu==52)G!Fcp+t5T@0IMlnNu)3WP?k zroqZ0S05i9As|yP7PAPl60O_x7b_el|ir3z$A&$K@bhPwD zmSfX32;_7l>>+bd^F^j>HW;|0*3YyEWLPl)%RK@}i5cJPw1~kmRF&R{R096k$%l@) zuru~jk(buUTlNqSV&s8xM6z&i76hzPI*734L4Nw!X|(%SYAk6d1UT6M5Sehw!7SK? zFH`xmen4bYcPT1dT24bkP`j0hJ)7x7=;_o~`tctA95(S6GVSId-^9iH?rXbHOZ$wa z=|zYHg+X=lqp?EjsZcaCAjIk2D5eBST<#nl+n!tVz}D6mf3d>GOm>N!6FT1G-Odv} zm+`(*w>z9ysmgrYRE$C1DKY){2wxRFMjfffm#f|N@^y1oqE(n5SAfh3IX(bCiG%bu z{5w2~1LoAX5~el_qnDE3&C_5C3dd0$w;+6AB)2qN^RX<2|0|Ln?<2fl( zYm8M3$j#8$b{g?h7evn;bJ)GHQM4Sem#nd`EWAEWe)k?8?RgzDUyS@MQt)dOdCV3r zK)LH%K#+PI?XUBflws{`?g1k!PDiK-EM=2kvO(}GA+-qr_)PHQDmokjbdx+W>lG0^ zKw!Qj0c_c=yl-Uw`2i#!ckzu3_NJ&IH6dJ(9j{mCLlLw?yf8Dph&1|I1euOvO3jGD zi|~4&d+=Ry+~t&17J$s*HSjs9&ObuBZ$MuMcXZR}u z*YV82D`jK7`;wRCKakLbBjF>IF@kWg*;BUmHfOop8?T5!ghqzpjIWN^j?^Fd z`<0EJAG4q9hnP#go{vVaw~Q-_tsajauFkc&?qt$vg@}l*+GxUvo1NdAUsr1|1R%bT z?xrJ5eAz>H)Hy%(z7Ho`Pgnpa5WA`zX;%JtGvgP;EWqXJd8us#iX>R^B7U|rb{hw& z&#z@(f^PsXJ7W5{w4qScgRiSN4uQ<7^5x0aYQdL7xG&F*b1CQ|BTz3OFs?wri2+WZ zueC^sGbBjY@o}AA^voF7;49TXeI`QGEEz3VADQiYL5OTOfW$3dkwQ5KGyso2-m5Tw zV%WleCA)8RZ+tnuYzu*qT=R()=GggqZz!4@fs|-7HIcy>X^I0e4i_n0|KdWdUCkUG zq!NG5WhA0mG1Tthi<#gx0O_f-PGb>1MTQphayrSw!Xy7>8)ZNW`bfA21kPcoP^|j} z@$;KA0eWC~g2q4CUV35Smct-as(%nAPc2HG0^%S9-U~koQxK-Q#=aP}(hXl)u@<*F zxI1l+jiOUG8+4P?K9uWc`^Q0uU28mHm^nc1-Tdu_o(LM9q^#MXM1s*U3AijVrDa3{ zTP=%2{qSs)ywyC&z}gg>dkvYIIH33>E?%9wypA0j>J>8*R9}=vn||6Dnz7ANI;O(4 zbLg$#z{vuu>c9YL1Lh52eI6cK8Q$^Ar)QX@2YrldVqKF}(La4yK`)l@?aX0wQ4cFi z3+CRKJ&JhsB4ckVoA_xmfD&333cTaY9Ti_p2=`XPYWKt*0N|Fahj@|3A(kwpDCN~V z+@-h%UtZ6sZB0bek$((RHVQY+2cj*gClCU&hzzU@uhAEk(r7sQ24fBH<~{{tdegx7 zcXh0s=KPxwInJ-kVrP=?-ts}0O5BhPV{9~0Km@$cOvEZ=gX|1v>h-R_reNESmX4oC zWn*`wce#i)8+Ph4G5X~pnBv~^;<Fed35W?on zrU7@zNwT~o8xjljHpIzi+ZZoFc&QTbn#{sT;z@m1B zWT)Z*+u$Dczn}($Ac#yyZ%YzSVc3yXvBqU{TR@`pr+$n2W1Au0@ZOIB?ZGRv(6 z03*Z(Y0BtL8+PNl3?NaQA!i%QD8>M+JC+pkvDlg;iT3#Yiimk~@-7F_$e zd3N&Zuzzy^$uS~aSSzy4J_9X~-Fn%RTCN9LLvN#z#BrY`ro|%RWrpi_kf7d%3?tM`dT@4E&O_;%-GbSTuIi~d>Qvb;o5&_`&dAUQujlgSOhCLAGs*}$X zVCNRL2$HQnbxSAhby@Dh5H{~Y5?S;i0?Y_YzBbBc2=+OrVndY*>WuE5C149d{47#;?f%6hBV@KWc=p8ELg0&cuXb2&5hQr?U{AYlfkgOV9m}DlPv0Hca!c zRtmb^sL*ioj#|+$$Ugwd;qI06PSq(hAIq%L{G*##7i#toV0D=R7V7kb5!}3wUz275 znbdauLHhIR9qPKu^X_v4t{XT~I%5fQZ-hoA=OL1%iyRS=uHj`CxtpzJ&Y|KBHIuLdWtF>Do7!V+Yv^=ae^RB%I$eUTNu?2Aw&b2k}e!v&yw^ z?_)?AOLOp-S6rOMCBhDf^tO%$*yX)x>s=rALb+C9C4aZr?$<8id@xf6(wP>t2Wepg zXKP+$o*>n;+`AnCGVP-;J_*+rw)7wu@IXM;15X09-6Fu>{lshon0S(CiR zi!J&*-H^WI9DHz~Ge2ky0$YTk5fCeH~X9>B)bR)S4uOlz>5;h%| z(&@$$sa2!QpATKgik-+8U1SL@_Ztz9#(p7pj67jc&KP%TmiA3T_j9I=xaFir&jIo+ zR9JTkKTP)B6823JR=rF6)K*?1-B$nk5o9ZD+X!BUC)iA1O?B3bs~o{4=zAnDzQ4#P*3r0iEwszx1mF28~}aLO_b7@H1o|ck2={czg+86~0Zof`9`k zv$8H|3sQd@#Mr~%#oS&O!cLrd-BqriS~pHhNJ>Nx>Xlv69BttFR2)e!R*ncRSS0Q_ z)6?s!IROXn^n7=`mkju3CnF%_?YqvPRwoDqF0P0EV znhAKBiS#5jy*s7o0At6vjS;?lBXYn!V-|O^!9by~u;@l6`?9U(1|zmqSLxZocyd*uhN2j0z0WWTqHrTP_>(5udpLo~OQ%Eh6V!@c*ReY-X@VVW zQHzXk8gMz7+~8*(jo%(M(mH|uO3EeYCNI_1p`Ec=^y9xl-OLJEi8k^4yKEOeIu{MF?|%53^^uu)S4O^Bc=R$HG%8hvI)<5*T!>ll~9p_*1X=a-|E z2srj}h-CL1zSIc5Ki4j+zBI@_Bu(H#X6$R1^(0eDXQGr{^~sV2YSBgQr|}zMMnH=D zU+2_uG&f^FLDY%cy3|K>wk@y32FA!&*oMo=ET9fa(g4nR6Gk5x;$MBH0GLcbTe*N& zRO}9ebbD>9y$|wzAs2m>N(0DBI*o}H>1~P9o={W;#~DNqvAsrW=T?O~z3DG?dlE$4 zhaT(Ov?#19*i^jxepzOvCK2$;n1SU~0lvjyg?O>TD!7&+l#b4gRcd+rcg1=HHc~9A zM`3Xy$}@}T#D90hqW0(Iv*|fne9_4%_%stRdJ;^P9lb*1ueI^f!w+dy3hRjjE;ilZ zfVAK&TaU13L?g|ZqyJ!AM3kaq?^0^otLked(XFqWdE=-d2gcI~F0>K0(dr4-(NTf= z0DH|;k!L;C7YMSy**Y;xW;R8L9iQf7j0Pur-R}AIo3z~IeEN@r8Rt$6_*jQ_zC4EklN{g<+O!FsccyYis@bHA9kIHp+LuFmIVHlvDT-e zm{v)#3Es9iPFOIm*8ODjHFMySZ&{ZM(S7&3nryw&`)3ai{R zUcdV>_WAI^-=LC(@_Kww7`vxeIPaIezQbWNz`j9kc2HjarPTXJL-oH}qyOVl@Bb=z zmg%44WBya>F>?Ml`?b<>*gq7edvyhfYK>LdsvUR%H6ZZ20WYY=0Js7~5vW5P8{kyu z+deneJm#UZ%&Uxjr7k>)$u&~WpFHNsTalfs%`!0 zFRN$u=l!t9&*v)kXM#JWpE87M&tI?}fmOX7TYY{zeZMuI z!YRe8IxoYVUY;)?U_#MGDbVZIAc7TF*z1}U2uZOzxxPdB!?(`~A>M3Ou&) z=4pIQb60#EJI-F?d!I0V@AaoJ=#BR{J1s=iZnwk}x1yvSZWIqs=tGyUH%k|q`-f5< z$dnwRow~2Sx4Bak()({7Vt${G+bvhFNQ)RI!S@yvE%0-aDa{www~w&xS+%ZMBDgSU zDI~s5lR#eBr5!nAZ?^L;cJ2b@WHtk)JCQ6eUe%(CiXJK}K^4WxPgT{{)uEfArF-Y7 zlxuoPAC15=$!+arC5dZc$95Iudf&M&)%bVAcW4&H$oRU2JXLN^!|s??g~079m>yNk zS?YHoO48;iN<$&Lxm2p75GO&bi&X6oG+3@xPE2Xt83xH@I3dm=7PXO$^(zJ~e

3 zl0riDMb2^@nb_i#dq`jQF2ooKOhJ$=7OnYfYig?)f7F6e>h(Tqp&lGA$2x>9SpGSD zCch?KO%C%jHR_<$*4z{$Dh8r!HkbgK%!>;C-3_}5&tD<9Ek*a)Z;Fmtz^QKx}2 zC5NnHK}itMz*DrvgF--XNz9f?_2+d>!{U__n2*2ill*3sC`G}tgoEB0wF(HB)lk5o zj1mQPm?|&^hQvq!uPOAo;N^&kC9fd{NPrj z4@;BKBVw@{IL4g)79oW!mr@_va024Sj0aVWx|lhixOQ0Xjd~#@DKd~RoslIOW zJ$hA+sXFIlj-g9!IX}Eg7N$z9sI0ON-yA0<(dFnaCodCiYX&Ki%~3s<}EP_j+N-y7s>Un2u5K$;zH`3}^|r3b@=GO?Z;P zMY0EHp2v>9S|yyiesl+bUAd5K=!FGgFF@;JwTw4_$!QrW*@7na4~#k4f>1s&JBT50 z^ORv*j+2WK2wn_)8&gj6JNXZ>2ypa*>Fc-=@0tjH#ewNal`L-AyPJ(OFQw^5w2`l z=Xt8pz#`#geYQYqYyk$=t%RG@TzNk~s3^SbJ}lCCfq)wXq_~OrEoRx1s6|ARe~||# zNqNRiVP0i)i?xa8Y5c`W0e-2B@{tob4*!C;sW|h8LFM$+hG5g>)yiYU(sm14KteQf zKG}b>2KVsQokk;~5D(!ife_0ILjNvoDs-i`jR)M&j}yS8r$%mJwjVgK>_mto64Lms zdqjZ-*bpx8r%I?$%R1>)?UvDrh2Bo5tdwh{I-h>EAc$Uv;G%(uXfV0ukfk!B2(~yU z=#iSVl+uhNWfns+2_BABhm2$?Md`sf6P-zu?8UDr|0f_ZV-t48 zpm~CrS>YS$EO!3{?sSMGz4LL^CZ?*4)U+a{haNzIJgVZkU_M?DlV+a@>|nagVjlb) zz_x3K)B;EM>AyIQ4}FZ@%1@6|d)L5}#ko_`2{OMpPymNVx~ghOMLBZ;J1xq3Ksw7w z*-3jiL-(aV(2PdmlF-UHSXzw59WB;#>MaFs(b@D=dlG9V5}=sYod`}i23e{U#Ojs@ zuO;@v5c2vteJ30yHkeD#IuFGke)t;~T+FD^fCQz(6iO4r@+XuA4HqeaaYubWN42C>!X?VeIg<#LE`75JI6)<>v8iHi z+boH|iS;(H1wb+6Jd3?935S|-wWljNiCOR@gsFg&V#TiO5F4jB2nz9Xvs~E+G9bWg z97*FtkIdV^V6hWZme(E8jX7cNK~S$<@{=>{uOZ1Pb{lVkBgi*Pv=Lx8+7w&SbxX+O zFNp$tfAIH)y56_9P^FK+cQNBLqy5RdW*{nCfi|zq}0W4L9|o9VW5Q zh(5yGV07h07XUQyHu{n7shHF#m)sZS?sHIP3xP~#*Lg{5O=Ss3yUY&T1;>uV+*gRMsvrw~JLmOMuLi2FpU3Eb8ev%OAG z0Vl?EuQ=pk4PbCg!&*=Ic}1Ty0+^puhpUl!PP+o(A*@TnK{Ahf<`JupMJ?sQQmLXf z89CTp*0a2wiL2Md__`)<+lqCt3$}!T3+l;)x~7W_GAtXUQQo00L_#Z*49DVpV1~U< z=2SIPh^GcU)sB*Z7dP0n6g##prSd?MQPT4ErQwh$I^%=Ln3~ux%Nr2bOIFQw0+g-y zN;9aS6B;N-7-(3;GD0AGO<*vYLwWR8Rt;@oM!6S8+vkauWutmJ9jOMH6MqP==5U*g zDIdn6=0B$2+PkI9!DvzN@AbH9N@~cX1hu8QAHO&X8cqo~+3-g=s~!EJPkNu)<#py_#n>aA};j)9a$7AGh$!1R?Ill?lnt_<89h^|o>xgmyC92pHJ&(j>F2yuf0j8=; zk}%H<*6DMRzqBd#1V`J$NLXc3Y=x~x+~2fk@h4=%6UmikaZ!4;FMF`?=i@TE%Pl?F0l3NTXCf5^uJu_#eUGYhvh(NNnGD; zA1ZU3!@l$I(5y8J+8Z=W%^{gjDCL&hB;h0@4CGt>W2?!7OWRxpCNOcYhX#r5@-6kDp=O(awgYw@iz*$1e!td0RXnE}`NsvYQE3^)3GveaI)zBqxmId=V)T;NTB_X zb9W5?HX=swZ(T7#0v?{92|rW*UD*BPh*{eG`u7oK0(x;f6}x|bBSOH##>~dS%*f2Z zB*M(V%)}(Z&ce>b#>mF`^UBO5%ErOY!Y0Bd{QnJsXw3jc}<_P?#de|_VhDzLIM{#1dLiJ6Xpk(KTLy&^EP z{BsZUe_U<<_i|DHUjue*pmfb9B&u%5N5q{}wClQdheUW%M6*=>|0v7{Io! zs%t1QJ}K4B*D>wIE+LGVGs&y(oXJ^YQbx#9v@5ejWba_GTGYE09mcK~#dOBxFI#4OZ zk(;I(%Ck|;Q~-M2eH3~6=yUxj`xHA1-t!_g#8aoSZA9K#`49Y2<|&SHXkA6GrtwCf zq+Te3lrOQrz<^!BqBV zq!-+Eb5^I;@PGzp%2v8u7yjm7D5T_A>R)|zcr7CaCw}CmJZx>`>7!s#1)xfUIamW;wF1pXx1xwEnaQ4UADr*6mYKw4*#qn=MA>FpIQuwGm?Lw z6w7Oks6&#cghvXAp?32M5n*CwsaF@!&PB!(duE~NZf0`U`zqIguq zW+G`2LZ-Hp?mV`ozLs9P?|mbwYL&CV)a5Z+7Dg)4DlM*`AGcr%k}EQ$gQ%OjC5{7|{ad~G1%tUOOV%|mQ2E@^cT`l^60FkjnC}Ad^ z$wHJzZh?lQ0z>_bso0YGB5S#Nvju+v1fw&_!U2L{Tddy8lHwTiMz^cCqU7n5VoxuC zET&$zJXtO~!UuUZNXgM1Q+o8~DYQW(nD3|D)YH|5ac{lnZ>s8niAcRFyd@A1eSpoJ zM@hvUjOMDaMp2>FiHrk!iqAQU+CK%6j(|{_c}-V+>!USc(JIJ+B$GbOibcc$z5daw z;<&K^&%#(m0wM{Bi7R&z8K+vsOr~W!wP7$}aWI%80R9W%#xrLdFg*O7>U0hJJtej7 zX3BBmV2d-oKI6~iDZ6# z$p;kx@Fl{wNFghP80N@or0*ogUtoB=#@dN4UBnIrFVsI=^<&jiW|~AZ=6~%uW+$tM7>GkT47*lbI=ayw z-pBik6=njt4v7zpI0v3stk#_js2kM5*F5X?b9%OwylPmEMcH98bZo2^)|E4Fnq%qN z_bT#TsE~6b9nE~g-;MeBHOEn9Xe3Mo5h+SqqOZWdzqqniQ{P`jQ|+!S5&GkB3D=Y= z7~vkJwwIa`-`@GitW;|3RM{Z0Wo;?0?`y>slpfdOXc7?w2zo5UQYn!-k8J8Zz15tk z^KLdK3{%06LSX4$5b<*5YTWxp_kb-z)MRIV6`dAq27e_sRF(#xWV!xirpR$A;b-G8uF)CBrlxXaX_EH7N2Zkb%16 z%AK|~IDzG4`U9&owjItcy<3D`I*ct3#E6xmQ#|ijA!RdxUB>=+m?O>b2=;!BRWWXI zHX^PI+3MifEjj;g0Fpn3PD%_GmLH>|AHp~lWtp!j-^3{CAU^!n>@SCaEi|l%PG(}E zgYV-b6MAAbb(%evY##a4dkV4^Pp;XL>AvO`7ds!gsk1xB^s6`W9XTe2KF}Ro-x!M7cG;u2ZV!?ciS}d2eO$%sj1k>iXiQtn3>NcN6|V3$H)3&AH*FMU!9L8D@{y8q3tf6Dp(HihN<%GrS3%MY-ERJKykWK5iI z#)SsN27&@!fH#=L!_kN&fia>&v9g*Y19m|&Pzci)L9%e8KTZWn?g80c)Axu}UyrOIo1TtLw7qz;6X+y)WYICD{}Dyy2_X49DBf&dhE8G$d9a&$WwJ3&81YF zm_dsrDRB^e$h`vt{_OBWL-lnu@71fP<(#)dH`G-~QE5iV=;n|>rTGm(t=5V*pWcXQ zRNR)N7ny>_QY)aGGaasZPJ6eEwp{tupDrw1Q?8;FSxsGHC6=d%F~oPqa3;3_c?uYR z*xO3Kv()ONhU zdL~RL%7P>6A}XHR&d%Lgr(C3xD!dFr@KXQ-#5COc1>;-m#}X+nX}^;Wtsdtn1$EJ3 zAv5=?hiBU}fx4c`*rr`rmwfy=EO)HA#b;Oy8O@#hgjDZv)sisW3Za zQlWqo$zO%P#aP9R?CrrQ>CE*E<){EZzlvKD&=sYvCwa$jGcx%za`;xRo#^ z46uQ6#{!(PY&qrf7myXQlibCXr1{ZBG8c3O$ISTvvDPJv7*9Zyq4#4+4ewYd{>qTT z%v!r_qBOlg!?e#Kx}!w*y;Zbjbho6T(qz~^5i+Af_7*V`P830WBx91 zhVKul?+7R9E^7lDMSPmQL8oN>QWOweDX}5;5^0Y}u!OpfM4l~V+Df(g9g+fCw>7a$ zQ5_k-CAs00ym5EJCbC)l(X1L4rp)Ac{SW{~dh}HVI3@X(l9g7h(?X${PZeDIAoS9l z0wy{K=H4|U(0$GMhaiwJ`ycp-(`v}bw`@5%UVV}GpeuYlcyp#Xoe@y=%b0Se5kUgJ zf1s@J?!Rvgn>vU;Vgrej(PEUkhN-1#i8ej$g~LZxnP+$qW;w_1A=^|Zcx?I?|ES2usa(yiF$GDf=LG!hzr62HcJzZVK1kBJbqPYFh&)mr zAZbAY6qO-FL9gTX zY5Xwr3#Ky~SXl}~EJhLcJsiANIQbk4oyq~r2Q1iVqutz!Ct3p|pMrgZaeWeCg0tR|GT_wkMwt;ULXad*X+EFU^b ze};&@wH)!XXlBA@+1EwnIVo)48w?w&dQODx;YTokp0#1QY5uUr*8Fpb=7SEr& zywpLP)ooVmWZ;7q6{r6(=gxPD?g;5G$!OYSi%x5zT%aiD5IdXLf|qBK)~Tw-cZOyF#i%d4^~X-5fI~`m}hnf0|Em_JEKub-Es&6mAA1HA_B~KreG*4w~XRJ{R*P zfBaR5Xq2e1o^=Rsw$xQv(WMRFrC0wIiDl*oTG}*$`!9ATm|6b0&-yIOI$RVg+4pI&V(duIDI^W2lQnlO>tiTf$yu`{@ysr!~cHldmLIp z)%WvxY4rR?*MM&5{p^0bbtTPIN@X^WRp}*-`339k(@rhh{tK>$IV`J-vw2#C z?I_bTR`}(*;PMXu4?}}Brey?kU2whF^+|Z$GS+nsXj3jXv7BEpx%X$i5=V-bWCXsi zCS}YlYx#|YWrv?VjbnF_P{-dOMl^i|SM~0WFx??O?jF8ni|W-rH=A2`aBFU#7gHCT z8~3<2tHUxhe6?>)pI@@!yL)~H<#loVJJ;5K$+Agv$pCiI4?0Y%0gn>;JW_MWAQ~v0}q4D_%w&Y zBmN!2H;4>lpQOB!F{?|P(ppz)W1jOY~dsTP>7)S zS&J#)hAFsY?tkh-Z<1D9a$n<-$w?3dfYH!Ki3xuJ=!G$R73c4k0jvHi6cz#J;g;kt zedh(lhy65e*lso^@C>>n*#N6_;<&0%Sib1k0Jb?0bPTiT3ZImIT3L35hL)wdYcdau($8E)M3)@w$TXAz=o{Kmn54VmABIu!;u+!w)#i zv0ri6@FGn%gJkVl@sM^CphBvJ4q)oaCrt<$!YtjqYv>!X^9(<>Zr(G@!kyYY8HTx; zG=(?@8SBZT#IaB&uR+gdv%TKE5*^Y=4kU7HrNyn%Bf9CU7cnW+qBW2rRsdS1ht5GB z!@OW)CC^hcf+Y#uls|~?V;7CLypQ}f$7pNlp2zbFxx9ilq9mqhj%?gNfITx)B z2_kzo#dE5glw=M9WZmh+;pnM7Wk*%i-X*3dd8zfq<0bx*G)9u3ehFP~#hY~kBgDS| z3A>oL!boY!L3t6Nf`1{+36vW!L(Vlx-a$&F>OGBKvD`Uc(F;O1Gg5o%jer%B>hKrm zF<@H2CB;Bu?XM;raZbGv4cFs)3YsTv|5Jw1Bgeg{^CvA@+1`L{K#mqZ) zH^=X~r&Q%V8j-z;?V#|V4EpSd)Z)5;hd?Ytg`DpI05PDe zj$o9Dkxnqk`g*7=SFsL#q}8r05ml+_5Fk%X(yG#_v-`E8NU8at_C~}>+%1S-)?&H| zslx!d-ic&aS&yU-CsNO{x+W(G$Wk2ds`&jPDsItDi-Jgkvz82QNk5rmQ^8PuQ~vou z-QUK`f7D7e2)lyF?=ftcNR7{+_Q)}ny^D8L>=PaNG4h;d-4;WU8L=R;TUlhU5G9F> z(a88e4)0DjIbGb_1y>csetA4^d-eCF0cY&M0!$}X-xo>%(l6p5@O`H$3FzMbtW^>M{Y!^2WEKTG&l5 zM56m>c`zr^)Tc9KJMH768#>IqmOZ67Wr`BLm+WXP(udCRfxPDQJeJjnS;CTgYuWbm zq54N+x~Q1)YtEHC53SNw@1Ly$BHWnYLyF^9(*@6;312oJ<#NE5SvJ9)d;@; zKqc^IObcCmEBA2I3JD?wgwP^PO?P2S)`{|^sxGn1i zM{VYd@slRPP>0JtNan*x@0|W3O*u`pW2pI}(gsKy!$4_}A1NS}8b`fA z!7bwE>a{!a((bl9ve8F>HoK(n61Oa2!*=2lBMePt{aSFs>{rp0>)Z6|?U#dN7)9Fp z5eT{KL?}s-%fn1OB5{4Fae{sO@-~K0sn9lQBe}kS4*Z!W3`KLgFf#Xqj-QQSc3X#& zlxC#yw`1W5o#+k z+1Bo)&-8y@!NA6&nE%rBd5A_+AysY$Ju2<+C%znzk2nu@# zS(|!Fg!`EJQEcnV`B6q4lz=6SC~3RiRE;{4k;(-pn=M5})5BsK4ST*B2!R&;APIGc z*8R#I5R`a|9+2SWxP2KV^q*856-mmXuNBG@%0;h}DSqRGS?Yy6%;v=O5q<@mM>>=e z#?PniE+lQ!sa{5<7WIe(HfN$_QuE-5S?v{o2~?B}ND(?}cN!MaGSH+3vA-jh81)rJ zsc@B55{U3CivcW>b+L>+o&H)V46_|A%@aaSYH++ej~HDHhq0P@I_Eoqor%hyEMwq0 zq;EB>>Ch&+ftiEStE%fFP){H zmmae2N~9G3nizE-WP%_Z!m;ex_Q@jvQ)|9`Y1=fGQU9ynjb(azt~OahT-Z*q@uBdy^ zsuQBl4CV>?ulLbVePr`Gzo{)8l&X>FsRL_HiW3-1HSu($ z6!TAV)Uoph8WvC423_he?Unfy7pkX+in2Js_)$icTX)h$Rm#nF%GukT!|B3JW4j62 zVl5k4!_h3Gi}oCc3%1J+V60u@<`;s`UBP|id= zo|LOG1tTJQ>@5U@-ilrdIuNvjX+9iSgCxe9{ThzrhrU%k zL$BdW)n9dI=lrSc{Pe!vg!>o-SIuRdsV`5J@LZ4%1S}+;m{^5#k>e*I>5q?>Z`Yr1 z*Jab>K-it%zans_Oz#8H0-4D}7_@581L%(uuV_J;W3_3Y=s(E4J-Xsq;7Acqr^7;2 z9y)+d`4geo@mXXuxfj|tdgg!e;!jj>u(Ojk1zufJo=u;M_2_;yxw|n?2EKoP#C~``e_eWVGf^w%1NI!k^h*p|&Mrt-ePXX(sdY3@xu!*V z8m&`>iCv+eE&IlJb$!)0812%ek%UuAUcg~TV`rl*jA*lKD z>x^D5lWDstOg`$V)LZ1mmcs$2o0y{#pdx?WHf+h{W0`AP9H_<@ zKYe?1TT(7V>&$gwanRUVrX;`-=1a^v;bbVQ3sMGjYTR9ym)6BD)edJ1=LTYXtuwnV zD`2!x5k?}#s~P3;6%*m+T*W=66VKn`t>p{@@Jgftt@#PYQHv)jL$$OpuLx_2gW>EG z=zmexASSdWW4)9d@ET1{esr#4d+5>KLB7gL_{jMBoIv^7r&0H1tn3RAc0&j;DE#R- z$f$5um?z=q8b>soAz?C&44;Arc2+`{kQVCI!?Ssp+}L0uP7bB)>Jl%kbb!jr(#zXX zhm@%{KuJmj#Nx;GK`L6a{dnY?=DOf&Y-6B=I#(<|)Odl(FoIK*Q|t!BB3H~#dO=Gi zyPhb7j@D-%!E1OsIQ?E(GJ?Y#zFNP{zHpPH+quB(}NHI_X1!O{cp+}}t; zda2<(1&GxY6QfGRUUz8xtU#iB&`e?vr!FX{aEmy+S4!H@IL@gF4ww^Yu7S3Il7vaD zo!KrzDq?KuB9vW{=|IagPGdZ})iC72Q)RGBW7vMC8SFgPYHVCq7UQk~+Y3N1%Faeu zBIPk(bAANRp8ozoZd814i}T8ibd zKoRi*2uosB;)d)>K+8j~OFl#E%Qgj$bOP>q47wGr;}F72GLrT~M>GuO-9SPL8#MO00tS&#x!IVHUAMRtshob{QLDxr)#ZD7WLxa ziROV5SOvrvSSQPMolLe0mP_vd_@h*#*Pbe6l-Z?uT}hgA4Hv)dHh{fN0mMc320(z) zUeHhdxu~p8rR9_M6Y9MXNS2gA{XjUPr z4pw|(`cNeXQW@_OqN|y6^NmiZxdnw@bdRki4CHnVsG5iUHJe1jyoN(!%}p`+x>&(# z;c5ZGXDME7IaC%X0f=d*HzEa8NZf!%UR2U2B`vF)$O%1X=7v>7@3;KBS)E9KJL_)TuS&>;K*+h3paVU>?osq^n}y5C9*?aqr}9X!z&Mxl&_+p z6i&g5yh#pZ=HZimr=@4Dq#O)x6?T9Axqv#TD#BrUWYQ7w&W4kX5*sNZv(W5Da$q0O zrvqBFKJ6Jw4aE-b6zH@r7JhZgV((6V4~xsW=Cl16nK}I@g?gC@NA?#*^`jahzvcV( z@71M9%v!DRKYI)sQCFpHZaEHD6F@T7-R~Y4I6=23P5h25JfZBAv0g%$mEPz6w=J$$L8JtXdpb^-VW0Of@_^cjsIt)Pj z4w0{La~iU>36Kai%ANTXSd4tLya9W75#@b9*_WZ^VLELLBlsB&fd)dNlA;Vq!(Gfe zH_5w!PT8a>cd~U8_qem-9$APN1PPJRg5VSCniluz()e-&8qALNuVVwALdyl~yFU&> z0@rc=(O19@OqO)Ppdx>;;^y?YcPb&UOd&PH_Qf<42wCESA-!m_bi)- z(G#|zj>)r!e4&;Vk5(hg!5q8@E{*^(@!W1!WuR+-7%8i$kz>EInQ=~F^@KA6N zFn2tTeD?S%gEtXs;jwt{soRIwG=86@9g%nv&3$c963LuRbjF1W2&3TFsRv{-o@Ojr z>tpd+dR7G-v_BNWz0Sso`1o<#k2w+PpjXLm9cL zBV38km$(plTyA$&Iyhs7w!;J@hnu8+SVEE&^8U?4f%AJ{#)oe(UypT1zib3aov6{v zPC^{Lx~HHWKagoVo^SX!IH;L_xfcFc{>1+|W+(GMkf8tPYvF$eiT-CBfQ_B~$6H7* zW@+R6<9MVOvoUlw6)`ooGco;#+tA6`(bUiu%02tXgqF0?iuz+hBa|(g zuQNUJxyf4T)Af0_v-a)yUioIL+tG=b{u$EuaTCX;WT*G-UGHsA995H3+19FH=TcGA zXz{q+Smy6rgC@L5oKDCrvWo5G%oOMUrRVL};uSEXT6}NNG24;DF22zzX#=*Pv`?oj zocu?{(;0Ac@8#^~>*?mp>oZEF%=df4`H$A*A~?eS2Xo&+aCuJfTj$X$%A2*%`{SAO?7gJJl}hukx3@EXb^f+gL8z};nzz4SY3kr#)!k}JoQ>Fu zh@7?{=@|GuNAyeeb=xl!&!^;UyNv(f_RDniWk>KK1i2b3E8YloY2Z(JNXL~KI{%Vd zK9R*A)qaW0W?%T7`Ekm#Quug5R|t~=vB2GAfJp2!rAGq#b(ia1y;xQ?rNQbg4Q+;V zYV0hgq(Y{F=v=+*AvJqjSHo0YOQUb2VbsZdqbjcZ8ME`nRX`K*HZ7OgI&b6r^7N=U zy)1r2wnR~dx^ngwfshMANiVX>CmT1u@oOXfEOw$7K1J;_w5w^tcXg_~frTXVU|^7k zqbH}#qgk|!I<9qGc8wss90}`;fj6cdG%=-lt5t(f76UF-p36C?Xl+1bdpBfOJ9}NK z+dgK5(?@Urn3oK)(}-!TRGTs;-yDjbR}j_WTW-Uqk^=Yu-B!9%6x9?=rC!%WK%69> zOl_x0mRNQXSk2*S(P-{1B7Xy$K?vY>Isi+FiP?C$Avnwliay{v(8|iTCqGMDr!1s< z_z_H+Hg~TD8R`?ESbtrcFgL(kyEz1o@VF+6mas4ew9|xYf5V66_ z8=4B4S-PdvEJAPQR8J`UM({TN`vUR~%mMIQB37Lc=VRqlNaRo7Wz`){<6_hR~yA8LUAZiAcMvXa5IZU@Pjww z$zZqNs_Rl7S!gT5@bWXv8+@MTMDNeJr^>jb9~MRgH$C}ak{OuNkh4)F>#nBgfe>A7 zHL6sHDW=LVxaC-6tFl&H&gI9|F-xULbPMjeAX3)UjW()(0Rj~SW1QD>r{%T)T`Nbg!Q11--BxP_zt_%7480KmFyt=qg>|__ zU11l2W9T3JukN0%PQxRE#Z83Lg;jq8I*x_^g*d07PZy zB=$30aO;BrXKBz9pK~#+;7&TR@RLzhE(%p5xF?Qea<<~8RuAI7$6m}M477#=e9Y`7 z4(zKf`v&x3KlT;_0y&mmCVZ$gi9r`TivSh~gWKI9;CCe@2tJt*86X5mZV;?tTOh?a z%{qT(fRC^2vIAD)XTz*=){mw$c;-9YwJ?mVxclqi-EXk=`D9JD0}|4nQ3_Ynz6--F z6~HvO3XoPlg}AyQ&Z5_ucdY}fnJqA6ZsS5v5y>P(va0G%Ejbx9T|(_z_)BFSd?W0Z z-*2_b&jbLowbc`ctI9%hm(P5*bM6)FH2Fkf!h}p#F6LG3AfT-nsZtCtDtZKCcV(H z{rG*{bNBB$w|q`@Sg0)Y%Zij2zzYj{?v)4Muw~qRo7(z;w^FkwYR!i4Z;v=spo?RB zw-3A}^@0pxa*=ZcX=P8xi+N|EZbkmblfoPeIEj94r3Sq-0W*&`vt0-LxH_<#2IOXw z@%?IvH3b8Z6wtZ2)+Xi=Km`>K0jWGWSr-5>!tDw5)X70~z!wrw0k~=jav6}zV-DWL z!}?=D-$;0Zv84lrZCRw9F+{Hqo8fLCLBl=NSWlN$$h8OV*F5sOh~F{mbr>`NNDkrBIsUq}3qfB~u3v>nui@IP`)54nf$-B;Uel*D9w6lSCJYhG+!gi8(+NHWyoyzO4<$ zhpt_BZN|h)Y=e;f_UgC~*|-QWF~~6_*-+ z8PCsRXy6kQQAys!Q5Nnhh%g~K^6%sel!eJ8=QaNd79QeWBu*?oRX=pmBF^@7Tu^+# z6a=BFUx*8i6Z@iPR+K8l`6bilJ*b#0<=+|uM_}>}Ve>HjV0`WR_HK&99YV{6WKd~Z zvhb`|A{F7zx4EHp>9{m;IB~`l>VPoKP!uRFjq?%r_8v^5(o|Waklvjf=wb|Y;i6y# z0D@#hZU5Xm5s zcp+lTnbe}=4Gu)H<a7%| zxE4lzX;5f#fIME;>0eyLHj z_yVtRj0La&(^bclbflW{rk$C* zc}bAoJd-{%5a~se774mDR6MB;{;IVl5~$$aG^5bhBO2)y!<3b}0Sj005)n`nKbZt^+KfyjcyYTD#A%s5!10sKg?WAJP9 zkrXrDM>i!Wf{65J9WdOu@o3kESS}2Iol$_vLd=)8WEWYd$`5EJ1%oEWsB2#(vK?~i z@W)3JCCVYHQ_BZWks={zzJk&qoErVYZ3%DEJQX+|%KQjYlqzAlFjB@!-p{b=aq+g_ zoQ(|?S9<+3^ep)fU`#qXt!KdV_w$N+bJneG?c(8jGIGVZVu6GyG;_O^Z=ZEt&WloH_1U^Nbd81as|3_~yG9`ZsAk zNimgALV5RJ7NyL2v>Tm<7?-Mtly9=1(#kL-4kw#plTpt9+=xu*V z971!sBIsPzv?k6q2b)N`Yw%4$CL`8#1@0v4`ATvP<*nm?=l5FtfF|cdpfU)(l6rWcsOhDnR8`}AAG*c zB8pSV3l%#*k50EqYNUp_mDc*Na36FJ5Jj|;MPkS?yC;wbB9~WKYn9*j@bStjhI5KG;@k3szT?#buWyDxR zK#oswRj6L|-#h-=a!HdYwncJkpK=gRNnjH8n*PIygc~LLOSCb{K4R3t;)o@qr{TN(N&2+O#1OcX2@svy=9<=oMOR-ALcb%P7!?lpCiZf_mSgjU8MBp}g5AQ17Un{O4E>7PY2-s65&;Doyy_b5Y zKxVQ~22B;J!M2AfH8%e>QhI~`f@573H-ocaS|h$w^9iKL zc-$9J;qCf|X?LL9Mh>a0^et2;_mh-}!FgTpFK~s|+-2yrFB?8MGGW{Id1(Qn zbbIrZtXhcAUkuj)ELKhA?wjo~)Lr2kEKcCGF^%4YgKY(d(rU@ib*L2G|#6hwpW~^AsFSKe$&K z@y41k=jpYmyo3bXoO**AXsa(vQh7(~Qg+jDC8F^+BoX_E)q=}85^ww*}bcP~CTMdKsYLN#T zD&9#f6BxK3hZ$^+v5y1%DkDbtPGN45lrTTndbl_67(N)Bc8@N|P#q_Iw?;4u>wrtq zGu1o*UFqSb9M^KMf^zRb!IgcxWkRN%PK=txT;1RC0ij_x!D?in&QbQr1U12>hLQ!5 zpRO2UB;iEF&vfPc9@M-?Z7#(HWup0~c9J+^F#Xr?I8jw$uPN%dk^zGZ1*y+X7*$jsy%(@8GoQ$>__o7lyqMp+T>>rf&SQ{OKV&{eJ9<3{cD=ASP%}o;2;TyD`K~2(15tr(He`)m)R4% z25Qs>ipPZtTbDrn39<$;&xu-ayFkUkEzpc|j+d}KLvdkvT5XrY-&vYkngw&2DljPL@zyOTZDxe`9=ioA2B4_`GPj4&jnSm z#&9+2FV7xPbtix@PHC7RD28*o%iYJt=KoArne9u zo9^nvyKDoqK`-iW>AZs%9fJdW+v+ZRqVVnq*pSIM9Rh;0ZF2BnuE(Y>Zh`PEB@ZSj7fQ)C70%s<)z~~RCg$t+*_tzR- zM!L4T)+R1j9GvMVSe?#WwbRmo9;uDm0o>}b>>9Pf1ptNGF1=>cPlVt%|%`hxZe_2RRxeJ53wEx4SOkRmBuL??fK{8 zHdp3BBj37?d$ouF!^wwsQoY1$2SE!Ch3He*NV`l&OdA<_V%<(fk7o_#G>?JCUeudQ=IBZAkUQVp8Tgry?7!)|!a3F5xIAvlJ%o!&lz+MIm`mIM0HC zUF{XxMF?ui(Uli!CaqPjx%C3nqvkGLL_QHsYQ^@2FY=+6rB{%;HvYE07&X_!t42%h znV6w=TMADHM3s{wZoUau$K1k zkzV}C@Ey_1`zfHc3M-FElaEjI@e}lG)MYCfDOQN_d^_U40gdFS5+||YMfS~x2U~wF&Pwke3xsY2AL^=f4Rm{!lh9(DTmLX<3SW(#?S+vUX^p5|$48yjBZGUY z$w;6>RYW)Pu+4Me@p`=55~Dhy=Olkw^t!2!4KuK({lxe|qV0yL1bUi|oVN^H(G&1M zCbDb5Q~F^{X0BR2AKZ@kLem~WKN0xkvuyO+l$BEs?XAOwG(^Dk7j@!?af}gtkU#tg`O$Zx(@_yb6h_VvYACSHUY&~vQ&gi>vem^ta*6r*T#p;h*S}$U z6VqCs27qydFM6T2}8# zcvE%DF~_ggyBQvKA21IeH=)+38j&j`2_FbfeZ`|4DKW5DX8M(bpyn}V`iX0Q{K=Lr z*4J4@k1|({Np9X24FC|-&)d*nkMY2g(npzMb09F!te-yRsT(89nFwou?2KzF4mXr* zCnGPH8{ALH9hv|@O|MOhnevmop=bG>DFl-Y!2nL`!QQiS`J5GDKeTH7=~tBdmI7jm zMpB?3#{*+u-HAEj_T2u2h@2rRR6@X~qm+;q{3PO;LoUQakX!?WHEK+-~dpt_RsQf-7W0bT8CLH@iQIB#lEaBayMPgVoxZS+M z6TEomCjxH#y!r}U_>vfZS^7a*E@k#PCSyO@GiQ5<^;yQGDHHP zk3@_pW>9_*$b#a&qAGrXIGp^ru9IE}0HKc9F9YObmJ=A^EdMZM0K_I#Nr^a*8E!)I zr9Nf^doZFI{-IO%eT0b^WdCn?R2`11@ey3}&M}QjDL?SvT_Jz7#yN(nh;8w8 z8+tY1=hT<1!4t>%OQqU`^2Y0$`oA?^zPV_hnPinXHKCW*=eAL`AMiV|9|l`mzkw~= zjCucMIQr*>p8xo(cK@F$0h#~Vz5GAJ5zD{%s@+!2#t351iqe?*{>aU#$G5NFDyudJ zIo6^UXI2lpnam{`4cocdz?n8wxB#T5I_l%gf|UhgkT zw{X>P45iJUPxt$a-tEtquV1~tcYIdIE<;;;t#iCfTP1C-w{3K{Y?NJ9;)pzIFP6#n zirF_hbJ@S&Ov#Ibe9zn#M+-UeE^kkAKI*#P&yOB)A=txi{x(h(55$W7G6y;LzsoQ; zxk5{J9Y6yoxQMlVs>Oel2l0hg_=`)16jiwV` zi}Ij9bix-2NqS#tdSCH+Pd*3dAN!uop4oaihpE3Vdi${L*Pu0ocF?MsuuACqNeaC? z`!hjfi}(1943>e|{=V(5-bJkT`VYf5ro_(6*;4uC%KSllDA4M6sFQ}Le$g?hg_V|z z_#>uiGLjn9PB|^PKu&lU&FEB}ye+ti}N)Ec$2Azjz*M=5qi?JMm5N zik9WH99$U8d~T(Z@(@@rS9Rh~j#cpMP(x{)ED1ew2VJkpy!ml({8|RRT2wg%Tz47g zmp6Nal1Gvq#xZ%YLh?W$yyS_u6`UVoqb|td2Np9Us=Z!e1jU)TU#9}!D72W3Dj>cq zEMlD_Qvt6L)^iz16EL;gYnz@|38c8bAfQ|o#&VTu7S=}W*ea?7!ht{O3iRbkSBA(tQ?fb#Rd$T5nIUh^3GjdJ~Ac$2ZG|X@sj*l0rx%Yz?OG}P`FNW(p z+#omho5wAz0?GU|5LmhKtKaV@ev(4wIfY}b1+Yd?>9CZAbho3SbD!h-BDksn9d+l>KjhItW5Yi9>?blt^0YOiu#9GU_xJ!WGF=!+ zp%(w*&Bg=TP)6~Ekk(7EZ+IJbv6CIpJZ0{Q9YbElU;9XN+5O(B!`X-vbxWc&uNzFw z3!reELX=2Mc@I4+5?PCLEJjX(uX~uPZ~`JSQj0v_q~yJm8stwi4wi=cUD6e% zp4V}(x7ne&Fm*sI$M@7;UjoYfd)y`#@y|}eVH@h0eqT++w12$xR6z$07KCTdlrZ%R zfdg_Y4n+94Z#@6skns9BE=Y5t3RE=k`1)-nLcwDmREKfL6eNIbUX_T-DW;!GS>ViK z43so+%s0oyY~ezpFeG^PQ1pl4&2Xz3ApzhQCPhvj8>XB`AuhQB>l4OMOC*u?+1jYMnlJjw+)C+rXa8jb}#-+eKq}zT92=EJOlFf+PS^3mU00*9%JcRf~#ekOZ z$nTyTwDt%yS}ec&bxEUTCkv{=HmvCSwa~uyk4gL1t~?b^#7TP=_`=E{sug+`w5Iv8 z>_NjR`NS@1q+xKMSwyfOo%cfVtK}L5_*SLLp7;QK6DC329#KbF6@iwpBkd^#xoOqL zQ@csXGO+>{Fgh&fy}w>E=2<|6QHCPIwI`)QWKO=y#@L z3H0K2--OjLP<8fVT|+@sjK+Di|A%KGJ}a84B*T0&YUFV#At57`0A$B)niV@K<8y@xvw7E{Hgi_yLd7ONG2_L`3L z-d0S8)V?S@U5riN>?HbG z`j-gT@UX_U zxiPP+LAaN#pU>pA-?#NyOZWs?jGx1me_-_8KZfrXwTB=j-0V_8E-fh0rl;o=D&5%Kio zDFiCU79C{Ny3Ew$b2BaZhZ#^!fg$ia6=7YNO$2Y^adoY9xs3X9DS^e^a|hA|lU$DLbtz{{DBLALAE3u-&Z#lh;FR2X3vgwjL3NH+!q zH3kHntIP@j-(R{VQ@?KPmPR$EjLFXM%>=YaW5_oZR4p*cNE(S2g_6n!@*0PV=`OyA z(+UG<3)}Jp_4zN~jw>`=ky7B|a;+*v5ivWFG+?<>z<2ok>O;FVt@)$Ekuu&5aAH`f z)5i|W^V@pt*HI7HBl_uvZQ-&KoAfppfZTi!C0$aA(LSaa_KODS3aD0UYcR?7E#u+q z8++^U%J&a4O@#-HI?#Ua>8TM3E)zNOqz6=em-+C(s~|R%Q5`p#U4PZIwL3yS8?vdj zW2c|@m}uS~sQ>(!M5x?6P-7F^O_(M1?hl-m5Id2a51d`N?aoS7Od%v3YyhhHUl8G* z&qS{?&tUY}N^kUN$9C|EV|otkjKF{XB~Omf30fDyyC6H>k$JrU%o74ub3Ctb#F z&L-jvAOP-sXL}a8EFBXIwoM8TlGkAMb_z zwPT{gY5Q-Va+S8hv*+!ra_K&|`x4vB~%}ZsD+Rff|RMhp< z)bnle`235tw6L6B;AG~_mFXTeI>NPDva;pxfr zZJ>6)A8H`usPN0(K?H6M_oPEOZZdiX;WTE7{UbV2B@yGWp_k)4<@Dc+H}QlqHFh>f zJUM^;^NrX_)A<95t%3@zg&w_6v&Vc=h{D5Oiqm7cUtQEJ$|7V!{cp{x%U~{8mQk^P zCegJh8EOk7K5-YV%r%_Cf$*QN-Vgpk0`jg>W)>X96%ux^yYk37&MU6dAdp}dM!Ta~ z8<5qa(S=qMN#l#IBp$4!yit6h;S<1C2jDd0&mi!xHWXjL#3nnx)W~e?i?=7%dXPJ> zKril$F9o7W4yeBf9y_U4)nXHE5ei_6jU0t^jl=uL4EjuUb#)d7KxJ9G6l6vj^}`?i zaX3CTy|=bLG^-;uTLOt(Zef*6vfi8E-IUdT=?G8$uEw6p;GAH1o<>EtXi^$KA98mw zKdp#joajiKr<@sZ!|kKT>2jC}6fsbNp3FcpIl5`1KdI{6MP$yZ+ax1f3Gl(OHVH*T z-dCtI@OZ=Iv{w%5OE0|D5jwCL)upX8herlb$y+!TrhwqVZ!6pEwAa&QI|OP}+bohp>sU z1>h`>kRQ}U7Bo86i^8s89;c-0s)M5_CjQFT91I~@bZ1W;*Fgf0f20hsjX)pjhlvhV z+ShLBN+a~}M6EM~XbJgP)os`(j8^C~l(#dbfA(pQBgHgLrW`0i-r0j3xAKgynDu(M=GWP*H=b4UN6Vh%kZZ5WGgwOr(3$Bh93?wZmAmOmF|o^>fdpuavI zA0RcdHT9%>G<1{g}{FS)A6eBZ##=Xy3qitb@C=M&0f z1Z;X@E2NdD$f%NwVLI`XTk9DxxlH{65Y=RQOc&{ zE84rm!t2vYk@CkqYIVGqLYbXcCn^c68dU$q@K78^K8xHhp1*zy6Q3s?E!@cbP@)C_~aYxa<6AVmBV1c@VWzq$Ly8l!m7DxG;VO!yen!6K79!zvW@l-%^kF zSXST4J+@9*JM8gqV_+>A69{XQMMUVL9K7`(%9rn%)l8SZ0mNLRpoC6L0Sz;-rW9_J zzG#ewz)VpcZhRgzO4BUI1u0C^#9DNYs!+H9{98>rz|UYu9M19g6H2E+ebg({A({Ah zA#|xs!?+Un-!!hvI|-9nduJ4^&2}++1r5L$mj`Lrcmgs}i`-*{6N!0{FWT4&e?^vO zykdCPj=T1axY1ZNH&vSUsKbf%Bb5#1oZyy$96PvC6mR<~fi#Av2u5J&foh|K_z7@~Te&|_gJ=J|mDHImYxL~aA- zAv5@=T5^ppfI9-vN^C#P1@oSG z0tDm2^x@{=*EfH6%RHB1=Dl2L{Vo|BC(#X1a|F2IAox8{Cx1!j4BHNabV3Y(=)I}0 z18B8Ac*@*&E&71m0r|;%R0BZAB>*;1+TUJBi)^2-GHHdFMOxK9`M7V{KU%y;13JFv z*obo0O$(bRFZeFU={WX;^~VIz+QBggcf-`0LkNX1OM_XX;xo*g=YiM#v!#OrG440Q zgK@0k0A9!5AkFr^S3k+MyF#I=27>1){#CrT{4;vwu)yUXRerY6;fp7e?c~ZBlR?> z#3`1wq0F@00;0`F(A=xs1f~ql>39m;=CW{>0ft@Z{?xYbb@aX~2tP*f1q&Rt~E%R@j@*o-zz|6t$chZ_~( z?UzD&gr$uj6#|j@57gIMsyFA>Cd`64Ha!f9cU$drs0|GCCwb7akbtEL6+7y4Y&)aF z_8N9?lD|JO{yo2_p{60AD~SjR#jp<4?PM^DU0 zs0;v+1}vErMkp47E?Y3KL76HXDxap= zEkg=;kF&MB_y!^_0sf2Fz{Je_uTX>kH)5TWk&c6njgf_bor#5xlZAtT>Bm=R`Jvxg z3D_Cg>3-a`|6j(uilW5-BIbX-5Kx#qIoUaK(bJn*IGH;e(iz#>&^tIgI?-Ai{5GRE zw6(ROH?+1jq_;7!_)YKVU_@_Z&d5y5z(Q+h;$Uj)U}Nyx$b`@F|_Wpa=#Qg8=vQ2Ag#bUSq7ip)xcuRH~^bD;}LlsQ|B6`kJ zzq8Ln0+&@_2jhgCchY<9Iz|}!*Usf{bUYTcg=iN}LTKpm9WLDt^T%iK!6YRg$MM$J zBYh{mFVov`C;nHb@8@~UrLXtr@8?623(lQhuSV{k&D+JvhJMV!CEeG42I6P>pE|PV zzo4@nD3GIHMcpI?WKTd$;HlW_L7VMjvYa&k&A^ICxH`#B0NC1cTei&VhY zZeJKZzR)|@hOnvWSH0whp!E09Y=$)@w(IH8qRD~gW&=-YeoJK1yOb~c{fW>AZ)2+* zOf#}k*))7tF1kqP33rC_q|Kzv70VuWiZtuK8816~#=f9g=l+h=XTdkO0W<1j201V6 zs9Hss7|rBIA0E&5u>z*xwJi5B<-EGl4bq+-jSrRq{Egk~-vPFK>a$sU_s~mzE8M}n zOOlcwZk^dQz??ouO`H`Q=E*=r>H)LKrGSx!Eg%Vdb z8g02gK?AcBw~EIUyyaV7=63-j=<0Kkx14O+=byee2bg@{>)y}2X!pn*FRmXTlPs64 zt0dVuK0RCAtDtxj+Owqi1Y(Zf)7Xd_z5246%ROn8i{8#jYsonR(Y(~^Bvc`$qyt4X zo*{TGtI0bP%dtlhEv*zAm3(V z{K2?mrEyR$Aj~O%x!mybO+^#oQuMXOUEYYB1nUU+TQ*=gXkZNpGwCI#aGTfLey!s7c-to=10GhMLdCB4&JT3fNvdI1OFr`n-Y7 zLcSsl)q@pX(jjb|5>wz5K$|6E4w&E!bpb`@P^XS5t^Qo}5crm`fX{WomAo5EZrS>6 z`6PPvd#n=@wN-0>Z}&GAy_ZnD+C?>}B&~-Z>zALBGga&j7&Hh-1N)uInSwbW=;Gx^ z4w@i_Jc1%GzbJ?Zv8*aq69a-odpT-x%6ThHxS;r4j3a9)3VWc+)?;@qu7QtPlR8}oiG$t01(Q{wS0rGJPpw!z~f;R%^;!$c=(|7o)sCT zw`JOBRwM;Qx-Y8zxb_%SMHNO%v@AzvK_W_g)rqtpfUKv*k|N^NMhC>V%wfOmCEkjs ztlX=Qp`w#TtUj-u2OW;jdk*r4aqw?9zFe+Qe7yy=uwSw!w~g8kR1!RN=wD?lJh)e? zk?&bObhT$3#43FBrOzsyv9{;#UiOXqyV3zgzgjMPBG`RTLay(hz6xo4zCwS$thg8U z>P%I)ZtT#o&@56s1S`{(uNH}NyO40qLF|#xF#PJosEJo|A%urFsS^;4Y1FIAuaTn) z@(g>v>3t!y248$t(3yt||3!2nvJK_{0dP;W#!nWo36K{eYo`K##~|R3wE0 z$Mcew^(j@d2XSbHOO>A;55S9Ai%b=J;4Prdxp0G`20;rc%>q_)&LeQv)nSs|O#|2+ zj%p(>La^(seq{cpEi^kI@uae%Ue`-2Zq z0IvJnU2dDLv2)w?E=TZO_u6gUhh{cNGiO|*bxej{6NVwna$J0UIUJG@BwW|gj(9CN z&96@AHQ6SDs&IOcxI3gtZSHVmfrJ(`hpanx-xK^XS-rO$Ipb#OvPOgl@ z%dX@JtT9y3AY+}|o|~e-JtGddCMg5KK_Uu8mGo_u%ZZ!5roHNeF3$dD$XiNfya#mZ z-g799idKIo!{W8T(%NRknX}{(nY@5ZHN>5o98xF1B;M@9 z_6j)z+B(N!3kp-%3kQ}*VSAnBJU6SSQhvSY>vLKrcG(06mJfr7LrsYNlT{SgI>%qS z!^)GShd+_Taa-C$KD#&;Xb%jDHRyox>w)|riyEAY z*@TxK8#%9UTemrCHGMy8$QdKoSkB#h32i5W)vR^3KYm!oN@b-Mm0`FryyTxga}~x2 z6?}cytAkN+6KC&m|Q2T4j+iqEWFS|o9(_{^sWv}xNW7BE_CmP3G* zU#C_^rwdNKbf&7nFD==-!&4{oT&c@~;;YJakd>j}858lXgTSqmT)*aS@wOavJ? zNuiMze1=4&R1CCVy_i{)4#3BG5V+rr4 z;X?rif?77_KpLm1au$!OA38NdZKg$-K(MrQ^4HjLNqy9=3#@6bK07tqrl-Hq;YPoF zUd4%@czE`!%{c6ymsX!CFZ_yz_t^yJiT0j@M!Ibi~B!ia)n5b!b;6fFb6h+w+A-4S7bOS4JGydaOQIbEK8^h30@%0LKA8h zg)5;6yr-FnH^7!rkFl8`%(r8&X!_=)(B45w&-O?!MQTL0Ci(! z@Tc`~DyofR+e6(0wf0IsXGx~bJhFav;%bpCf4rZ_KFldo7j#2L5iA>h8RYB$#~a}k z5?(>+nM6vsvI1!EG;K0YQhi3Gv`vowMNJ-!M{solmh3ami30haCSGfAy80|DoQPo9AxbLAd#nNs_bIQ z@nEsJXq(=pefb#5L+8h~G>zbOKMlI{TwSNIP_d#Kv+-mD)ZEuq&{s zz}ojDtQbEaDc?n$z@7FR5I&l9NQekVA|5CK&48qX+(5v}HLYl<_rW(2VJdLyv`a~l z^;>MliynV&Y6kOnqs;c&H(}k$ybARnPlx{iRQ~4!wSQ(;{(GRt`EP1} z+T$@l1GVmFH5OPQ1R1Jy%y!@hjBdQ4KpHoFd>UNo^(1&Az{IYX>rbM_<*TY{bd4Yg zi;mJxs@5@ddR^gV`D)UychNmk3{t@`gU_R_v*BOapQnSrzB+yG?MYYgce?btIp#IX z9}hN`p6rXyRCObEvzV-qgA-+I@pr1fz8>KfB|pl}vMXG5x--wV_&)7FUoOvX!e*TF z?@!uhrMPRib5kWW!ayRno)~h{@_e$uG(c#CcR0i+8XB5^w~~jE3Od5_&2lo zFQ1oFXTdTEQR>U_>SBVs5y?J`Ua(R8GN3vQa70;G`5ONQ{lce`PFLl<2rTVpagO_F zJffDYZ%#}ZMw(-F!ib-q|%4(>1d3? z`iVr8=R`g$l!_U4e6)8Ebean8Fqder`A-9x;!S<<(P(+LcL%1gJ;&k3!tzjFudnX= zdT&O?_9gEVGOx(+%4W#v*jy8`$I)?Wqno9oE3VAb+-DC$@&=5OSW!;s zMP+o=E+`W}$7nW1nbx5p6EOY*t3F<=j&C7BBRAVS@hMSaE5_opg~h{9X$b!7E7#06 zOjJ8HOKr&gW!&S-yGe<}Y~pMUqqaFa#neIE)CGxurVNJKIWS@MX2FQI#aTRbe-{u= z(x|qH^GAtRqylRPe5flr^)seV<%O;%&hFUm{$Z#Izz?=NAOIUAz+U=GzO1ZP!ia(yg7Rrh$3l)Jv!*r=;>jQM;uNCrqSyM zD9#19DiF)ezr$!iQCMAA`FYoR_hmJ-fiKH%cKk*YQJB!hen8L}U@=$F;qiD&4f5j@Wf0(TNd*Im?sj>=DlZ%S@{8JlQla2=4TWn2YCJe$TlY3nDjv`@H ze=6FT91JN;RftZiq3aRRFNPv*T5cg+j-bFvN*&X2P$0rtPyLnI^swWpYSY`?o$b$; zPrEh-2I%m@ zfR?hou4Y6+4*grE$};QTCd-(9Do7~?Xu3Aq2U6x0ekPi6b_0FzucUX3NIJRs$vd~( z*32Xm(Sk{ln;Zzp46p*gEWz{!L(di-Kb~Ha@HW`d=-|w~$5^o}*~;?-IG^6ZbU4Yp z0WhT$K_N3-FPN(;QOdtk{tdLkXNg;k1Qwp-z!JbmxSm7itsjVmv$OC%Cgcc4vy9q#LwlS9 znAO*q8mMvXUU1&yKb<@tH*AS`O0lEu$gpEeO%6xv7!6(8bH(+1T8u$=jycoQ@Y$Ji z>a*PW_Kx`-Xu_Wlmr^HW5Ms>&YNAx_?l1Nakorbk(NgeVXt~&|W%uohgO#86r!P+N zgP?=T+`0}E11x}q+J<`|y&@3B;;4-S~gixgsnoPirkTlXf| zu<7deR`#oD2$ z#DB3OEP4)^%F;-6Ns^kr>*92I9J}4-Niv4CuFM8-W_3*rwIM7ELmezVS}k{Vzji&DWeNdWmscf@A|2ULJ$jko zu%hJHDrED&#?%ZK+0$y5r0xcphpW>pEye2gByd)X?wCHAW*+)nUsUh`(m~K7C(f}| z{{D*NSFv`u+zE(h8OX-WOQ9S`eO6Bk&7@4z!%Kun(mV!L+ki^Wsad%^8CwCwgEzXA zX504R4+oy3q zry^uSEmh%3Km4GWK7>=V{*1I@$VNgnyNnt}3H0W-C*(SxZLM1Fz)pK|JCVrUZhZRT z^kNgkLxyF4@7`%SHQQ^~Wv>!eo$~ZeyT-W0AgJ(t2JdtN5%B49U4xbTPh41SdRmJM|Nr1EzQhgLnCvLg(FH^5}k9kmU)C zH3nQE3r~eMssfbc97D)!%OFW=ZQq|4ZS^1O-ZQE|93%P>f*QE>9TyonNewEED|8Io zGi5y#4*EMOQN=%RN2~K7!FQh-0*}Hx4MSu?tU!N-)a}FYyhx^x_oo@G{vXu61#l%> zvLq;#n3+o|m6+*@nVFeYVrFJ$sl?1wVrFJ$W@e@m)9St7e|Gx!o9Uk2o&~dOveY%Z zW*M0$^F+9ZhZl7RF+YS-|DOMzMw=25iVq;IZtc301?!U8-x3(wX&4~>BI;>hw&en$ zGNTD~_v?t?v7t!P0&A@lOSC@~l5fGqP7Sf@yz_sZn{DUiAx4D^~x$dB!taC+BXG^?|rj#h0w? zq=J(2GP@95!y4T^<)LLo+s=tPsa8#4j=07f1$e67;iKDGR$`$DMp+SSnZ1)TYX6fv zMgCu0J3ukb*;J4)kd`4wuT#Ex7!u84`)1woI~MO&$?#MZGaHN!T{Q}pz6F*V9%Ax! z8;o5l{OU6s1${EU?5fC)-{0QmcZtI)mn&? z{Y7o^Ng4f>KI(sgwFA%q08F1&P7F+RG>mj?fAV%rG@ow0j7)} zx_Z`*4%GU(cE;9!N#8L582_r}@t<7;dI0Mm&e)&aB{Mw(4GRMsBLJVCm4Sxt(=wY0 zpP7!4hLwfse+PZ3Z}&NN(w@fD`X8Cd&rtq~iu`AxurdBeB#ih>p8GP(18g+kKnA3eam^0!t0$Bd@yU!ywmQUxg zfAiA(^=kova z;E%=g=fR&dU$p+-Lmlwq-4?}~da9RdsK!Na#|u-gI>pFs z<*byf9Ie!mF?1XPaa%odu z$yalwC{`KO)Rzv;l#Mioe>Nm3(Hg(cOD{EP{=V7mO*(aW6#PNx4>99Xca{%zJ=`yn zCjHBzxxF_d0A@xb6>kSpbe0a5p^S;W5e_E;r{6Xt5)V8~)U{Wx!a?;1D^!$qI=)@L zC&#gVmQljI-8Z*^!Br!56Bj~CDLc)>Ur%{YntXX=H-}idVhz$Rz4f~e{2#5)s3&{L zD$Tnm_e%XrcKz0Iqu(gx5=fe!&XALvwEGs2{lzJ$X6$l$7D$btvA_b~xnx~7KcEva zXW#uNI5a1*1rDShwy5OkOf1O*| z$J(fB{7bD_X>{~rk3VfeDWr)r%yKhF19RJ*y705`lr764TqG~|7k8QiI#A7@@5g>@G|lbZloa3bb89Xwam8yd2Y z)q-(Dms_AhU{&`W-d>6y61ZhhGdMIEgT2^|?BcnW3CJgrKhdVd;>aTk1V_FiG8~cb z(XW~;-n<^T^TFP;a2kQZx0B$izFURUr?YO}PY=mOe2Zk2kEaY*54$7Tts9Aw`SOQNau=u@;7YVabQ%Z&c6Q4%!iu*)E4 zjiqOvFxkw*N`;BFAdu_w~G{ocSx_*Ba>H`Vx$O zO~(A))svj|Y(-hRyK0)_HG0R6+bZB&Xp~5}$qb!BgrAue76-xoGO`TY@MLIE4nSjY zq{0tzegj z4oCMT#FUfhB*pSa3G_>C($^+A9mEKP+E!r=jl1A0_vX7SL`*7Cj?CMkG4TyW{EuY3 z%ES6<3g!=pBmXP%zf7e*x0-(xPW-bC>mM7S08BK@3`~EtME!rE0qQf2qNlbqv@q1Q zH>9?)vo`m;6!ua}G7gF&6Lr}JH&k4Dc2Q^JOk^MZ|&DK*{s`@7(Anaxfl{w=~_YwV8stMXuL``g?5yYTU2CK8o| zVgG%$MQLu2Rg0JvsQdyBWm8Kz_1WWaP@C%)%h!ibN6`jvf_c_U@1S7@^`AUlA;q=O7qhmqc8rI1- zxpYp0Pr{jc7yH4e*>pT@6MkeQp|>h?WgAVH zrV~Tyu)WLp_=_Ph`ua|#K1J9v%(=1mNX%p~?wj`ZUM0MDumNW68!e6Y*6roE4A1Ud zr_Y>sFR_WaDp}hx{@mOA%Xn!dgj(6RZxZEQEz#|=$T4ns)J4hCHRJaslIvf|C^}HK z#{|!L;Aw}>{3N>*mXEG0q#Q;Hlb3QW4CgEz4-D96G#gW(unyx&+VB?1jYw3uo|-u5 z)1;&{z1V6Y<&P#@(WLl?u{VilA0$IixU7>kQ{Yt9S9X-Zkc!*hWEXRPP+`n^Sv5fu zvb!Hn%Ed2=u1ZS^(6Usd|THw0tRRBq6rlTkrPXNNJz#B z)~gVG{#JrAl8A9v12Z!@(bW6HgNl0u@&=+T=SsH_d{C&QlcYn&6Pd)`t$<7-8Ox=9II2em8Ws%{0FrnW9I>bmceTPFze5nq&WLmL+C zWW%W2u?8Rk%!4m7LEItkTz?qSet&C>FyLnucH-a=G(7v;5s>*U%oWKR5T9o%2p9Hm4wDLlC_c&L-0|9n4-D_Hz?okwWlto zf`4$Zdh~GxEQO?>_R=**y?pDf#;uqP0{A;5a z?vZ}MhLuE{A&(P)yQ)C$gT$KoF@LqvwB-^!9du35i!DJRL`7-Qw z;>u5VJ?d#b>r(yM*Ck#!&C8_TXZ5*n*=tLuax_c$RfqvAal0raT`h&-9+!e+837cPy;X}ef zvdaAU#nZ@($WXgnIminH6sr!qK6zF)R-BkU(|n12&R2)<5pv%Em8L2?SMDF>(N(-o z<;>}4vT)Y}M-+N*mMAt~iv!3yf$HagQKbNB?QAZ zM9J=x-((}Usojta6Bvg=oYV?T5cJaI?&TXY!6=4ICV!8dLGdl{!F5;8Otdgo7Jo%` z+6?zGO3d1EdQ4kVEG6N`eWhq6=-cgsCptgb@{LX^55w!qzuN}M(L?MFCJn(G3dQ7F zVw$rpLFbC7vX?kcs0zPc>>d9SG_}aAjc{#EThyF_QWvVfOrxs4+lvMSgW%0px@Ne- zY?ciG>#L>PfmdzqIXH~z+Q8VQ0hieaJ=L7&1WRp!R)x1N2^t33>#Na$$l3wq{XB#5 z88Pic*eHd~wqtJpEd1B?Ld;r5=t_=%C6k~n=SGFd8!mm!nG15Uohv(BL;MzZpgCot z0PRX5-aopB)W{u)-h6kGAmAAB9 z>GgNk8vMW;|G7RM7o&$kH$(wyP;}Z~$S!*PjBfxvfn%B~VHn_m+yFg~Bq(e#O&c|eb!k!+_Af<6s>6-wKl=Voj zisHZsdTNU*&a7hp0Dn|==qQ@DW*=QWAY)7QNE_{i7Ux<@ve|nmn4oRCwtDhcbme7` zS%5j;gT3ZD*buHwF85YWq))6OsVkrXnm58yYrE^51POmDk;V!tj{P^5;a+7F7IBjJ z?Lq}49{zp83KK8}E{nXOID_@#!2W{Mj0qPd?WKBzua;Is+PUwF%cqI`e1T8jLL)%$ z>6W`tEfHbP*#8S~qcSp-7JL5_&;u}yO?67^*!|&>NzxXztqsb=s4Eu$=8AvpvYVdV zFzSuu=PwdatG3&*c271hGP_#Ah$+N@({-pU`+!0{TTU_Pd7Ouc5N~pPMG&Tg0#@6b zwHp&cq8!+tFuvk`1A{rYpvE92z^OGjjmTg~OfIffQpt*C{-Vb**|5BCr8%E}lmv6< zMFg*CPjg_mavjNbVT_NzIE_?2sKxvON#r%rTZ5&-k+-+5JjzXr>J-7qIBP4lcwGWT z(v3)OsG}p&R0}nOMT=ki7WZtR`X)0Nj_(g#bD6C{Bew;#{so#XHQIptMt*vG?P2$9 zvO0$3B#~S4Ab3;i^i)BoL{vW~st*mHnXvVY8-x7m(t63DU_(#aKSO$R5!2nQs<4Gz zSCL5;1V##m^o3=UXtDiq>sRB@?g2Q#R4B{tAe_*bs+etO2#q98JT@%%I{jH>caeg$ zji1U;C@c`Gg(esL$85|vpC$BM^`dO0AQDq^|6?h6K2~9UeWXs63b6?^qOm`u%z^6PgeHZ_k3RsR<3?q0ba}&|2$MI7|PSDhEQHA$UC!W`h?_2U4 z_14+FtjJTH1NXO4XmHqM7ia5^o0p?nOGJg$_KakQ-YJGGFKPRk`}Ib3;-;2A4Eng= zcKjF}L;hE3Sv12s>T(%@#=Qpd{(pQZmE|8RYhhp?3{SmXfZbPgJ+;u&rN|{ct#1+7 zCS!Y3eCj?x7@#x)|GMz|zoL8rFff0D#(zp*=-FuK8JL*y0nBuN11eeQ>1h~P=$Ze` zIOQMWm;Vt^X=i9;XlM8-aiRThRi251rNuwum!Ejy-}esv2Y~s{3f=!cIJQsHfblb4 zHo*T6;sr4My@2N5jn{sXC;wty`^Pf-6P^9z`u{_L`}b%0w*r@i`Cpp1U9Y@qw#tj> zxu|kPpW^`F0J!@jhFBx`qVvBd9^^=wul-Xe|j-M2Bu@P%~l4Xph|K z+q&O`hR|7Lem+~q^l#43;c5wR)xtvepht(suXBxr-1XY<2swsBUZpOdoK?B_0 z<#}{Y4rh(}N0cuo%gPc)&%dGOTEY@DM26ZQH4&+kUCW2$^|uK!)5YrwgdDh4^Zbri zhaMzQE*s<<0!@DG*wdqsLyd5Z(PRNH6{HlY3z&p5%WX}jQPG*)uEyA$^tDM?8lpW`zf`=0qLi$+ zWWAt(5KK-QxWiF{Mn*Y%f<+0tQy|kAXD8+iND#on@Ehfv)%Y*WNxXRuhMBw72^-vd z&y)LJn(1}t9~R#CZA{W?YT)_0y|4z`g^>~>GM4+Te8+RU0 zKbS`fvNkcuIuULR;KD97ncBmfxA9Tx_crm6WE62VSiD+nKS(q|HLC3f4g4aITMt~< zL#DuL&KYpO@r|qt>v0s%w9aZ&u>1w&U8Va`%ct9Nfz}qL$iEM=4ho*V><&}6#6tR> zpsaN<@_K@2uCaM}!rG>`J;j@9Xe;C?GKn(cvi}^HiU(EQi>$`h2W8+J417~Bk!@<{ zE14Cv@MIV0sTD@oS)BE`>v_o9*=ZIm8U<^41KZlMLg*CjSowpv_ruz5=0e=KW6+%g zMD=O$sYe;RgkOvFgw`cc`Q~Q5njH4~D# zK+gDy<}py)IOe_jAOR{Bp} zCkqXLmFW*=l$nv{^FO+OHwpL0=Jr1&6#r7C`A;KZVEUUvm6?h8^N5x1lN)7bqhb1l zXg_0NWTT;@XQcaonC1n1CJX-vHUAr-)_;{kWc=eH`D07^bCvvg@F#`%Uzo#BUGIN? zy8j8jGSdA^o71?aTGUq#G_OmY=}>%@W+=2v80;@x?LaX=TEy1QH@tQU;j#?KagYIz zw;qH0B{ij*=O?L9{Bq8Vdf!%!H%UB3uP#-->PTM?uw6EMh)yP>gtNDG0|wvV^y(f<-#&rGw`WDRelT!P+C=qS+5PHp&z`A`3?M$C$7DAC;iHTk($TRYhhq$#s$fi=CQW?$7jZ zTf*h}edC3ZGcJ{ZxhmqL_d+}c-nk~)&V*XKbue+Qi*34}O7@4Xcu4=}{vEC^homg# zUiNboW+1(Fif_!`s~(bwgf;|Dq3C)VFuWARX|PS+@z5Et22V5_OYza?y~f4j)ogGD z(onBto{yewx=@clX`7@LzdnA~CDyGacRps{+z-FCG6AZKyoJ!3*){(Fe{`$;05pl6 zo_E^ZVrO-J-UbNGH_+!-sK$!xR7|mAVRl?=9?K02R4D(mP4{)yimqS1keAqmO;c}} z7pnS^l0gQkgdG{O#j`WGMk^pzakFCE=H`zzoo(5g^2q zSuh!KVngwg*XQdd6~oDAH2b7%Unt`|9f2-ps+rfb#+jYdGJB0uk4~>nn5Vg$-+{5p z;A!M=CHkVFv1r>=4p+oFZ_+j)HJJfgFwuLX8>bhlK#63PorFy?hD)T(9O= zhuqk(DGJk2jT^YZ#IB1K#?%)V9^Hq>`!!eNHK=nOQ_mpp2A*w;0Q*pciVWRXhdzi! zkttq|fl5A{>|_}DyFlB_BcfjWAc=-Sz|?2EW*7U;6L6iTXk9J^&Sl_Pu(8Q!9z*7R@|wbD4~D*^wm-tp~)p_oXUM?ltA zw{4>%)PfV<;UcUDXRpq!2T@xlV^a?;0+)1;Wr}U(;%eYGnO7yV z)#KRz;Bm%g7Q{JVx1caAkR(=Rg(YYy-|NP}q|&#S5D#C|Ls>9ZC7?2?v<-cu%cwd# zVl~L^`t)(cwOoXE0m1wvYf=$$F{S%_D04-+?wAJ5W~7GY#8^HDwtKR|I`}$(rIR9) z-Us7d>Ym|Mv3l|4=~~8$PEl9;lDFVjU&*>i`R@q&-drVs)^Q$kt1kXT0X20M(|76> z+nFG45>$Ux*QxCZxtKhq34E|3SdKu0wY#FhQwh+p+30fKqg4F0wFS^l#(w>MX$~V$ zj%qwyz#h%?qXH_3#jjCLm5(I){W|z^xWu?}zb@kru9052KQ7EiQKc&y**pq_?>kVzMq07~3LF~5cZpH)x zS_+SeSxs-xI26!aR24I}m>hlV!y0)%i4`j28GnytbWUuWpP9KZ(1iZV^FY|}RhK-+ zvs<;zrYsGdYDI{yNBxQK+!!9AE(Cy^y#+DUPV5yFttKuc4B;w@n7bqcgA*Ez+DQ)ML>CJ}YY>}d0pjLGanm5n3rNV&3!DCbvb3_VN z{~2*+7USZ+G%I}|*8q53CXC1zsI{=p(6NG=0xZHDvvGG)=jm>N%)F#dMi?z;p_p)? zhRi5foNAzAk$ghdU@G#PtFPv}jA*bM$y$%_6n6#(u-X2TW+kD7;uPvQ^4On~o}q-F z+ke3>bZBKk^On$<*9iK}v53O}H%dGW+<+r#PY(qpm%*i*YZ8n>j@)2M;x}qTZmJj3 z2MAJ|dyH!}SNKdfdzdz7w~3@Hvga68yQpPWoV3v`(~a-X;l8Vn;(X_(n$+}>4hVuQ z4y!w&Pc)p1<9v$?OpY(gaJ4>%W)hmHoORlhS3vh0JR4MXCcU>$7mS%o>Op{_iZ%70 zWa?s*vzJih?&R>Ly5=3lnzZL^C|)jem>;C_xh;!ljEU`LLE>|l6+)%hJo-?&jx*3Q z54Sik{QW(hO5el+Ayxwy;@%uSstA^SjW}Uy`@2MTjlr@lA1d3JDk5%4ANx+e!@RP1 zxW{Be(GJIXfzqLr^+h1#L|g&I*tzI)4G|;DE~h6A51WKw|8>V>-Q>zaEkO}xr;%f= z0okWau@G8qBzyf4Qhp`Hj}VqCzP;9s?OhbKdt$-1`pa=(^SYW>(nek3Xo6~GpndTv zJ)!Y^czh!SGz~kUVxj@w#L51rQs5l^ZgAV&NX;LX9+|?Njw6FzNmegi4#3i!u*Ifu z2UdLcj_~^~Ed_>k?E@v2O2ptUb}@! zGT0CRSsVmO-2q560G+8$U3Z)ua>`Zj^i(Drj|Y+ z_#faPp4*8rbcfnDha=`8yv3w24={1M87LRAZ($3gxo<%*hPH-r4Yd})t6fPkJ&7u+ zyZl*Ph~huLHq906XHF86SKr>eXQCU+BCkek(Mq~1USJEp&tRV3vFyQA;+V!O0L<&S z$IPEsXbg?w_hh97FMa`C_e+ZW{Jt1Je8P9D33J0aG@rO!g)lH`A2Sz}H-63{NIk%e zE*Ip&I!B;R7p7i9(}QAmZ@;onF?^Mw)B4FIq^{gRGaDZ~e7{~c&*%}BmS9q;R5g-T zSSc*fG7Iy`HsE{`m}8*SU^*Z%C-Vgjj&(AEGey5hXrXSAt;qVIIBlR5dALf5kw`4U zgS+*ke)XhgA%q54PZTto6@UodFYNPHl2Ot*_>Ga`hMmK!e}^ZQJxqfpCRTp16eDe5 zweereW7CS3E@eWS*v~S4hWSQyE%4-3NminhbnTp+KT@34Zj}ba2iLrtW0QG*7vNMC z-MbElx+bSKMpg8S@P$jw-Bmc!AuFd75mTx|N0Yr)A?izpQK`H+-bx~X!?aTu0t*KV z0l;PnXB(Vb-LNp4_p)|Xq*ACHQg2R&pmMlc1K1Z|tN}du7VLSD*qiucxv3OC4bRse zdvUcwlaHLO1Xcln-&wg5-XdkBJUME__w*``g6wLL#+GBWv+t)HG6;_5@GobP-J~ww zP@T%bP;MZMmpN5Y{Bxg!7z4T1CQ#Y7qx6DGRa5J<2!8~(APMksS7Gkzd3O>V`c34% zG@8ntFH34v6q^GWMYq15$<`)HGnSeWuT6hzE@zz=s`0fe(k?a#=mIYkKd@P6o)Ug4 z8U-FMETM=GRZN|!P+_^Xp+G9Bev4wD=I8pY8fV-~LMPrd*Wdg_h*D`P+_e#_dB@b= zaf1(i;GF<)S6zCpRt^Im(-B{~#2b^rKVw;Q=d7!vV?DtlWkQ<`<|>pGz|)C;NzveH zFGGCh`MW1Exjfh+wJEB4WMiFV^HO9&O#{7{4GMm`RMmL3NuXw6-@bB1nJ)~9^U27k z&ny+2sTnFg?3Dm0wR#9aeIFfN9&WIDO?v3(9$Cqh-o$W0;f978U!~JUjv&BSqk0XU zu(|#KCkxZ9&bB8)dhKId9!F~8aXCnB4}bp4=)}+PR~%P93{$a@1qyo#Iw+QUaS>o5 z91mXeu$7`|ojUI^l(j8?BZgN;frMQw$~!$8IWkCmobwLD4}V??Aoz9mxSwMYiDoob zbk%XmU$Yga_YJj9AjQpZlaxwdXCW1n{;5+3dvx%M`^ocb zckmtRSnlFMZAmg|7Yvr3D^cH!PPuWxWPQ>Xx9nGjrDExUH!G`t`HqnX-`Mkb@RGyk zx%Td*CWHGb#d$h%&oxyjQvc4%{T&YPE;}XeI!AN#Kb;hYi z=~0FEY*DONs)}i^Bk0=1Ueg+C4KM6e)1J+t?Ms{neJ^z0O2$$p>SLz8*vSte_#9)Z zah%!kUlc{@d}w$0qnIjOAIw$R>FWk-(>UA-4#S*}UA(0lzo9n5xw|-%=29=0CPi%a z>Gm$Mm8IO6?w)tV`vJwwUj#b@*E$r+zD5t?z=Lk8-FdJ0E;TK*sz)V&XtjbzP34^1 z!BJ2+;Rg+cL29EwA^HvWQOi#)l<%RDxTTg;4Wp@|OXR#s@X zToM1;CkxPYcpl(_~9z%Lo z%qbz8e`Hn#ls~G98GueyOe$YYnh|ohCHv9M# z3oCVIyO~mcHRAUD+KipVi8`izD9qJSU?k_43ovXk^-MipS;6vVv~RS+7VUU=9W>;0 z$gqXQB{#0DAqWYH6&Y|kQDI*hQe(zBQo`LZE@?cm;04wXkxd}3;AqY0=pg=u(p1v# z89rg{IKQS-K#l0J+RzC<&kt?Y3j5$_AcuZ_6c$OH>IOR7Y#!TblJ`_)*@Q72M&F*B2wL%Ykr>6|f!1 zHH7)I(WbIc`3z6O5)O#n&=QVFbZQA{3lWdlz+c%0c0BXGvT9d$d=x4#_AC7IByTsO zfFHeWBv%(s5%zCGZ=vVoNN;Fhv=(DHLj7~7QLcUKAjKBybThGLFUmCaRdy8CH9dv! zHCP{=B}KhVgCENcXT_6q0Z{>*g1Y>m$igyoKUc%w8X4So7?p`HPEA))zfs~;Y)9t2 zg%f;lClDXLz^8%106{iHCQ4Z;GrDr?Hvl(<@v-Ppl}?59PUwJMLgC>)7W669Nd~B1I!Liw8a*+{Aate#)JSi(kVAl^;By)X z-erukq3?|i`sieRsH5=P5Vd6qF-m9qDB46s#{Oi#hiL&2>}XLbZc>&095Ydy@Rl-s!8 z6Lkn66=~*QHMoVkzO9&4JfZV7eXSi4yx{65^AsiT=Ee5;x9uv1nlW;|be^>s6lNMxoDH#d-n`ftSL73a z4@JI#Sfuz>_1!|NO3qzjbtvI*5#U75&8uyc-2c|rS zlkniJqf9F2`G9BdYMwu@!)s#F{cC$`wp6hK(1J%C^Kp-R=}Bz*hisaX`AQL5!d+r+hU-ttaQQUX4Q(!4(m7b=;ozat5*@s0GWK4@Uif7{r;5B z^in~DCam52%HWRh#=p$4{vHAUcXP;pN{as1GpxTCBK>EE#mvO`uk=K>Ye-lV{n-<3 zg5z5=!rorCgCmQc8DoU}f($xME(agu=LmoQW%`0R>Gj^@j3w<%cTymT?oAPGxH6Nd zv>5sEg=>2Yb$-HCrTw+$>54Yb+wJYpyEKUwN6yprsqM*TE3C-vwQiZqs;ICg*J&WS zB)&3|uEy=v@bZ5;i`u8=7$ zrYdCtql~A)Guo^|#`_Bh$o!sxx%v%cETjwX*L^nkK{g7Sgu}W65$Gt2#t)JPzc=8f z^~Qx}g~#Iq-041KEaesf6m*sqrev5RIt}V0uRae4l-$@35{Ae$ZdoI`>MZ=6D-e}X zJd@vjJs8m@Z-L)59wp|2f^_tCu6W-tv7mc2_-MN7X^%qb56MDov9fN?ZB(~$(o4#f z^CxWJCKhZ4k;sKFVaW=z@w?%H9~C)Utx-iR5F!P28?WXcH?vXSKF*yGfg?XEeKV6l zas{K+t`^-n35Ud5cy)M{q2hkuHi1B!RhAKC$PZ2ACtFjZ&$ku}V8fm}68ng^q-Lal zAM)zV_Ph!gwpDuxfWmx&l75yypJgLRf-{j6_({+I`*W0gT#&~CKxAQ8q5#z&C@AHr zz!GCacSN1V43thpG@ZPw3(*5O>}WI8eB8Q>DB@M2=TLCMoI!jAm;dV*KlfL71${MH zLYaDumTckYsnnWawpct|dpccC>vTusOgjn8^rP{Pcy26D<>vs#9g}B+LSwd|?lkWE zgd5Zxv&xA0Ln5&+86a{edIZatVXmpFKWe|=DR%8Q4hv*4%Epq!KOaj* zPNj?=ZFGGh`tDC;Z4CW9H4u7rN@yi39hCUI^&uWsG&Htcapw`{QEvJ3cgSt)xCSAg zbI8iEVFP`2^lQcrU#)z6{e#2LhO`yauma%UYT@*HFP6ZbA^?(7G%f=wK@4K9E7Rn} zliC_QWYMF@%t9_MAhXze#*R<)KG3v)dH~PraYU%}1e7MN`OTW6c(k5BPIoBQsMy2i zILG}bX*auCnsa$60S0%$2tjdKfEQ>7!v~ z6thpQdmNVCo#v(x5MmCyX&jhp4C?0Icc%^>Az?|Kd8~tk2ZQx`lq6FnciJfikFA5Wh_to~*JDT`$W)|Dsr+eE}L;kgL}K||sD6BVilZd}f^Q;_{y zTNtYhO3}~dTh0kb;|T`LG$fcyLoY~z#^`HoxXalH|Il>98n1=BM>e--_H(H$@)B4# zm{D881>A5jM}Dh=Ku$Rr2utze!}h!-fLCPT49s`Al8AUi@asdYSUa(Hb`l2U?r{a- z9Tr=ed@Ue&dr65EgYm0XzeX|97aH#)tFtpI1*uNg5z6IhN9G!~k~C4Wb{g99`&3md z_un;BG`Yb<;h30X)1x54_*;=z6avf+N4I-Rz|3*h@ns%(>OEt^-(RXM5G|6+XTG>o zG&zv0*`T=WY`6!=WSYG_=>Lqf=#vz4jI7_N+DW%@33K9J5b5KThI&c2%A~g`lUUFm zF`aR^nF4TDa6C$a5YP7Y0XLIK)X%jV<qRmCmT2VY7$LJx)XfwSikwb!?3Bf!mxy`$zqzY8J7pTTQJQUY*kPNLdvThqX_ZU8ifK&)NqWs zu}iDdvV~OhRh4mtLN##S-PR}cRSEd?DmR?t&SwFf%=!pw z97_{mcpSa@u*ZS7Oa)BO^^#HW<{7(NE$BfBr$unZ||Y>W{aRFYpOiV75@zWQqkpqR|Yh3Z|i!f$?MVSW8d7Z1$RpXIcu zoR#9vm(%l!3HMy_?e9zyZ}B%*jw5D);%V@6?@yFa);*0+7g1zjbo@ZOHrD^rl`L#7xk4qTF#3dQM*`>ib% zFYCOCo8KdQ5f^n)7BiD8c4-HbwhJ@oyBM=bCG@Qg?6%qKEUb|vK{A`{Oka7pV_F-! zDplb}g-I;SqT<2L1t!$)?u)ZgO*ThrW0AyEwPSVfGv9uYdeBzEEQnAyoF9@C2k(3K z+%^$Y0Ha(lBWXU}B9}}n|H@??@*!+Z$MDqq0*<}!LWX+YqyN~0Kle;%5cbk5yDN@B zoZgm2->zqCUQ6Lm7k#g8FropodDi371v@)I_IffmvMB?ne*a=2p!0!H{(cDlmnrmL zHDvu8LCQbWi~s8>^xtb9|62;p_%DH!{Ti!3*9MS0vnrEWtI7iPt(@<;WcS9`_a`lI*5YKC4Ez6X0|NcC9{QX?mNnV<9L%q0>ol#k}-t)!wHY({d z0P!*IJY}WUY_f$bt<~FV^WD+jExcPv_v(l1m{83f#LVY zA?`U&^3lBoLG@%?)({2P*Cqk%O%6I|SM$w{J87Y(!y!R!yhnA3JR0BO5do}c4^5D} zwn46%ZWZ%6=nTR#MyVS3-Wz(9@j{BHK)D>C?+xt|H1?yr>LBj3syGKmQ{djDus*j~ z5~!*zv5&W3;P)L1&D{}^Cx2Hg)vEod;JUL4I{*ycd-S~Zp3dZM!wM&4J6s;>dr}%P zpp}-G%=vZIt|%%nn06$alygZMTsiyA=S!k5@17ynL!--+He8&t3HLB-Gm968Xg?UM zC9@3DBheX65rTyI!O9t`tROo?8wt?({>VyGFXg5&pmKIrW1&pTE+jWlWXmJE(B5%Z0*TBNyV#R+vv*u2*DJD9H7=NLPGU}z*16Y9e;NM{z6WOLy%Qa9QwB8G)9^t>_%yVT3(B* z-{s=}P1Rr0$dKD9!8BuZP+bQD^ygsi8IiwAu{WKiqB0YCVs}SmWU-X^FC|HCHq=R^ zAyAtz*OK2ZR?gDHLB|}VU%`*tPuMI(E(6zr4Gq6E;`#VU24w-i@hBKQgzn190L!}< z>61lbJ8)L|k6Rh!^L9s*NU5Cg`6Kc;S7GjBZam&%Iz`Gv7YFehd^-I`pRmqyo*=74 zT(4(>*qRb=Fl9PS_Gpb5bL~4H_GKmuWk9+DFBZOKJE+hjq2>k5&d7G!cya5ox9(Wv z%6Cc9g{1K&@?LxO7#8;)iLNPho6y3B;c`UR$xXNj%~uEV)pSyeo}yY zGCYG$Nz2Zn6fYhpa{OYwGokP+@x3l%xKhS@&DGwpKgsube8xtvw7_}_Vk&DM_SrHW zGCJ^tJ79)jp)Q3N#Zc{42So69_lHys&~Yn+pBWl9VK8@){;!c?Qlce@00{;txz)be zUU#es^R?MlkC}Q$2J~@ACOOrwIaQTHwB1Jv%k}6GU}j&X4kL^6N9!zzX!tPif$w5& zAV`kKK4P5UMR_1n#C?87yNN#~&VnYv4r4oRFQ(Nl<5UmaRr*0q8jNtfSom^d!8|4&;+kO=xZL`N*V)ec`Eo? zg%L4zAI(+_dF9_06sG9fAqBumRKKw8=tuk>V{n}nzGwBo;3&|SI8V8K${9|7+|;Ab zo?b`TqK{`Pbj%lR$1B6JZ&%G;cHm*q8k%2NkxT7matUrr1gYnimNGc4N{64JPmJfE($zVDMJj$NyHug2Be4P2a9Or`YE$Lf~- zN-hA^jShG=Xk>b_6OFKYb*Q#&%^2t_U$@1LEWP_mt-Zizeg+q!Z<(jW_gfK!O(jtS z1p@DqhoA5M0n6SMTk>j0OV~JT)uYJm%8yBL^rxLM@*M-3!Gp&m&bN2%H13caL~{#r ze=}Yx=$>x_F)Y>DvPu(O0T`whetX4SWD{=MGWKfZT9JYNx7SUL)i$w_a?SGk7i;G= zNlMRM-KAE`G)I#JP6^kItr~1fczOv?>6TNlor;GiW9R}m70q8WjN72)w8yn3hKZeG z*H3LN1^O}c!L@7R@3O=zPln41DoHvVCxblEIA-NYWnfHaw$`%|YA}w5J~oW`_YLuR z0Z&ON@X76%qLnZmMW~U>pU+ z^EZC~;5oE`0r|=OR)>XpVI4MIq{n#Pd(fGNKc3<2`N8JQc(IE zB{%Rjf}#&+jN#@`VWw}bbvRc^hYnw0n-KdquL*Q}!@|xvvr8VsyfMfD zg$gkp%o7jU{fiMsq{sZNsV3)k;ogxLAs6Hv`vCa>+V*_}RDpWztV@~>jg&XHi_|9E zAgqRk1PYKSL;Pb;+n@c;W*GCrdf>`elZX{lX~@zw8`u0Gy4Zupy2b#YIW+W>5kT3# zBnF1AFOM|HwVC+2u^L!31^>O<$MA25@2rMTN`W zsZa*TSqgL8xq*9GMU8lxw>GULFA>E5!Q5L1RkoztzPP))74EQbFWlYT-QC>^cXzkK zDcoHO3U_yhLJPg@I^E~I?ziLiekc0ecO&>?#v~xth|HWT=P$o+jO@}@Z-#AEeKlB$ z%SboOlqXg~->v=!wVEB62^|5pffCiT+?`n0#hxV<;KwQsXYSyQU=g(wU+iej_l^;a zs}_uqww#_+!5JyWhvGKER40OW(O!YeN`K4?%d7*CCqO)ANJ~CbZadn8)uf(WTo3vk zd(QZ$Pcjm~^-{M=SkBzZ3sa>Rh$hmb*%B9y_cSL>9Wd#VFz?=#k9><=epV$B)VG;c zWuxMk?ALnx@9cSuHb^mCZuz5(+$3+!Mu`=&gI#fN=n|q|cK>YO%=TyIX8*>0^IvOU z`sc&_KkZgx25|f(^nCuYZzdH(_PMN~6rgR#as-fE&M-1Ii;6;x8g7Mb2k1232f4+Y zi3z6A`nAicx~QqCis>|a8B3+`s`x}sjEsb%B2!qE&pci}1WPp*8A{iAKKtH0b#M6m zdd#(}Y$jxHdwRU@Ke$VwDL8psKX~#L@+!|$xy`XQN&LBzdGhvppvOSixbRrGp6%w= z(7w99-udL_@}ByAofm?=Z)^0BX%V5T{dtmf24>`DgjR_m(B2*gIo6iRos%ZO_0kSS`#k3iSsD-u7@fanmzNt_^dJ-e#@ zhZvi;F|Jwf>4?VMCE8}cetPOe!`h~oH=&xkH6$Y!tOSG6gRt|guvkX@!}Y~X*O~sX zHbBLN^t0>D{DICeQqj%(G8*@Aql$7}H=r%>K{ypo^yuOX;l~%o41S1&f?=R&pLuFQ zcr_eVrXZ;<$MtD!tX^07Cxiv7dv(ubOuAD_>6h_-k+}u15F19kp~eO78k-l5hGV*3 zv|N7tjyDlxs0?r9j+zJqE<>z{_RAIhOBrdMQ3?gan)-{f{%@t-bi(6ukgBhz-oLE6 zUL3BeGxYc{Ht)!nB`i_F@_u+Mrq!x3E9a8Kacy9IB}QH9hfWW2!I1!AD4eo$A0Xau z)q!5eXT;MR?^T0ba0XeY`vFB_pdVxEr;7&bo>krj=}O}JigMlx{9NVp+6U1A^Q-#x z8qB{}KcKu1totb#sT23+I6acWD(RcS&_=SNIEXk`!VeLe>p^2Uj+!W0zVEOBoDcFt z&PLw|x@wUz(W^)}icp&j`QwypTLZEVXX&=t_fc8|t}zR6AQ4d;v6Xp25V5-XvQH|6 z<1jRIwhI$+iKy6GB7(2>w`3Ki@uFFkCF5MFv5f{R3Nw+zzs_(9o+Q=cyxo2w&diGN zXY>*sAedt7r1hGVZh)$!_$ht5>_s_UY9J)BqHnVKT(MhY&C8N9ZutQP z9=+w^kx@O1&s*?ay{+Ps`t3ot?*@_VEd}2^-K2%P0-v=X*8o}!effka>{;Y%l-vq` z`!l{=N6+g}V@cP-)F2<+?G766tt{8eS`@z}G989nm8t-oS4#r2FG0w8PZVaF zH?K3R{8pXpet8G3vmf)5nvVp{xsUjcu_I?3-p-up=@6b4UC3?wvHIS%Y@~j(c~(Qe zX_;{^6yIiC^No!_t=87s5Pv58-o?y5DijR{XLll5hYECy1tu$G)b58j!`e@XR#ACyPnm!G#mq!-Ex7@$#1`ZLIvVci zI$cZ5*F&L2A?H+y_2%Yw>&EB&G~0B0kdhm)JA);v$7ufV--$*bjj;FdGD|a)4U-C^um`Y_L3iz z``R!Ia+W7yh0&GjzXeZ+w(x&@PE^<~)w?~yto<^!J$#Yo`=x>-^^HgGjmLo+q2X@8 zvllve>H$A&Lg{diZEvLva1gS9tU-!wzii=SLO+ZyIfpC2m5+%Sh$>0>N&J2W^2PH+ z0+ve5GlWyR@(kNAgKAVy&p*w^=5x=7G~Q#YdM9;*cNXdwhvIA37n0> zw#Zy|xbGSOOF0vGww@G(G8*Uv*J~_bH_`_iuBO2RTjVNmj6T$ZjjewzerxyZXDsjr zdU9z5!Dxpqe^^e)5zP(hFwi)~_Mj6j>Zw@KbK1H=2(UK2H0iP@YS&b1&Ch*LLC9cl z-pMkU5CM7BNRSdTU)^4fN}oe)7zU55NRTrJTe(3VOr*}4tZx}LH7q)yNW0l3TD&1( zUry^L1oLuEBjI3%N(|l0EQxHChAyO*@!>_X%9n@myE%Cnl@Z5>%CItrz3v$r7Jc6c zVAkF)Da-TwhH#>9j3mwtW9p6?kKxSl4Y@Kyw)wuwm;?+e-%A{27yQIqZei7sNvu~u z>B^ia<{{#wiQiVARu_K;0CDUO6HSACl`u2@`m;PK#A+#PLt$S%N8vb6k_X4A%S4`n zlLCgJ+D$!dJ{_)Dks(osWt^eT7DyP6QbmiO8i4bF1)YPzu$WYzNCpB`RG6ImWib9O z6jwdbrgrV6Rb4jl$XMAj1>CGv_u?g+=mjp8V6+k#-I7D*q8n=jSsqtv`OLm-vDeSS zY`RU`qO(b9GK{{Fe-eaHxZi+m`!lnKYTtGex`ew5Y0!MkN}BF22#H)_b{>{ITQ3rX z$v8ftBv$mut(Nd}lW26oap?2`=l5o0zeihcWq$V}G{RY9T&uZCRw}=lFVRT%xheW} zUm$4olJ%#N>@OUjs15)Ls;;ZJ2`e_D&&OFn^RLBoAlv550u~qR9W})V4+0R!l*siSMM>uA<5@Op zr7BGt^Tx*vr6V2_F;6#0^o^eaBAEoBhE-}2PI!{*G2yKbslTuHAT&oev-85wjeX6v z;HX?(OWb6+{Ay!-FH+q~5Wy9+@T1)#^rvB%eUsBv0nJyPxlQaGi;}`nShlv-3N8JD zN>HElbK?>ig?b57l0#vn09HQeFPx%8IiQY;AS;QCn`rS#UQim2Z}tzfboV18Z;4qaf!U-%i<#u zjc?^gCdstgoOoa|g2jZB+l!@0qB1{!cX2{O_YLpem&X1|lkqZW)AzB_I3ey0Ow>!lc1f8eu`F;&%4DkXYyq5MV%mK)QDjweeH_(zfl4+yjg3)dl{N`q2#mlJ|sRdSOtREP=4m*j#Ouc-iqF2(ny zZ&KbnBD8`SaQLNCFuR5D<%b115gZ^9p(edyBVM0&zb7YS9W#NSVfQ-U$VGeXf}MV3 zJLF#ab8GpwpPV}N8|f_1n`0N7uCje741sz+>NUF~Zy^C2wVKjZ-~#DUWz$Sp2X&`Z z5_DB!pN9jAPD1ihwIq5t0F@ST7H5uF`QnozY2#BKK3}W*foo30eO22%Pe`K~>lOM} z?*yva<#?hR%wrlGBhmV;R`OvF?g9*^!Z_;CUO5rj{+Mj4^zX{m(1g?Kh036W4#5*# zPDs2jwu7x2q{Jhov@(Iz*%2ZU+bs1NoSyMFN{3M1Tivst$I^Y7F&X`4G0~%YEy-1W zxW*I;S4^7JZs@i}cM?zrEx_ zX;DLYu>3NU0d)|s$TiLw@=$BCbC1VAwXes4lHNApgdo@MY8zqk5DP!C#=szonoR?0v0(B^F0L&juU_zuOgFvshbGVAx8D7v{!lgl;h%@OA zYuMqVVT~EvtR&3M8dxMH0Ar9|SH=uaJXXTKBLU7r2KJ_HsXgM{FJV*8@z(Bsg&O<| z*(Gy98Bq*nL0-96ArawFNjYD+n2GBSq`B4^Qfl!E;sAMa3)w7|xw>ZZ1o_ZwbiOmQ z*4N?|$d5^_*g;wf8US6r5mX_ghEE(XFT;k*{C7*_*C~6|w{X9#2=@I zeEY5Z-hljk5ud}jQ8-{_-Y+oxV6L}-`SecHVzpyUhWfOs(t|Ae!|}BPSVl-Y02P23 z;%p`)g?UFfglwe%dCtQN!SuMi#)M2&0&!)-uhs5>;`9aMXjo^d51nrEr?4P~XU_|z zhuGS}kL~aW;&2C6?M=tC{)NHQ)*9K1+}HBekpbL*`XOyepWTwkE^2vKdCosPq$Qx2 z`z+gwtb)QzQ z0H^F0C=xnc_Z%_*f|x84(QZB{5Ax*{SQYnzMr_iBC2zC{cfQ`a=vXC%Wsvi$se!Q$ zcT<7Niejw@72Vn$46&95DCk^Y7L_SYT35Z~tuprKI9zr8G({7RU|?^LoyfuLs=$FG zV_dZ*iyt2B8~h~b6DY~`yIB?u#FB=YjU=1yJM_1!K{O(o{R)-lk*efvKe&rf#dR7v z_K2A-2DJ-E3b=s%Nj>MPR_5o81ybvEA0H@69&^MQhC%9kWkXOPWqb6NGO0g2Jw(x@ zORpF_XQZR_?Qm)oSC!_^Rc*wyp! z?*)oV+@^tPtZc2$!!%*=GiBV%Hh$ zMDgwHB>elVkh-+!8HmE{lJ&Vb820KdkhXlryfRj3O+zHjM3WP_emqyo@!BrQ#<@%K z_UbzoYDL9!iSS3+QPsWD|9E<81{-e%#a3HiJ?D#+h-VQ`{$$g~JVXOWK^Yde|A z(?Mxu5QqWdQHr%kkD>!xxGtq6*&5l)J?^W{nxP}pU?f$wO@!2Hubg453HGFuTb-(SS5-~~5;EowU5mgEDC7$U=;k#n-_AgJ z+`CiY5IXQ;-q(Zi5T-&ghpIV^-v(NVkLx3!?e)E&CX z6~YQAex8gdR}%cH0DcTxZb(y*!Y)^b3ZYZP1#i^!Pyf0N(28+870FZ`U5rlLp8}_& z;C(<-`1D#C{KgP6CugiPEH*wd3tD=jJ6_7F$z)$o#4nydlbVjeQY2h$09uDRQKz5GLEVGkP&HU?lyhpH8$*1o73s%!kq?1&jQoPT zqaNwUU*x@e?xg(7IH@qSM6_S+)oIz&hD%POgR2nGX$tiOXmsL;8J# z*-Gi==d=nk)11QfX!7-;hB}zNc!}mHk&dm{dIpf;7^n83$@{ z;too_?_dN=MhmoHF-=PkK4X08!QC`m*;UbDMV55c%a2{DMZgYxi=i9~J2+D7j=1nL zhEKDeVhSx7ki_IPRoBDz_Th!WLcg-I1Uz|Xevk>BX~h}8<#gbQ+lST%EtGo9&Y5T( zRjmp({0{=0`opYol{z-nj;b2S~XFI^NQ6KucOH9zPa)h&HB~@NsI3DVR{n{8bt4?R9S*Dz9i>;zHt9!Y3hAAp+`UPmbh{fVKNwE3gvL8mx!8UL zByo#%9HIJDpPY$*MbV%+8OwNBsojsG_4`v3fz^N-zle|ybgVrTtJ zH6`boQg&;ia9x)*@>+AzR&Iih8~#>vHFS!%C_T+3VJjjDLOUd~^qsfO54c}dYw$bS zVnD$HI%h7#_w2=eNyAVugS&IF!t~Wckc1qbUGHw~%=FgZ@9Z3&eMJVJSKH@jo6sf( z@5bkU-9ZVhRT%s+pBfwsB>iSR=mER{Lq`=mfP+GRD$h zucdmpxPFyzq|vAN)FAz3WRey<5*1u0XDw?2YnOz_yM4@7v)HQPrkhiUFe>fpRv!*M@iG3L`ZGtu8wn0J}0IisQa%S7T`URLc zRod))^nFTv=fmknGB?>NIKnB^a}k%e(ZN8GvbARk+Z*p8m)kJcmqJsYQX5%sCU^?h zwHPmwBsZm>heSwzYP__CEsNgDU0Y z=o*EWDHNd!;KJa}Kc7!4jiKR6VLTrxDkd>;PG53QJ{U_vTq-bHo!=_}M|=^`%%q25 ziV6?tse^bz;<%cMB0^DUt;ZH`n<(<%gxS5!kZjA6a*}Tm8Y5|W%aL3&v(tze_j9%6 z2>PBeBq|Ua7IiEh8V}B7&CR0G|K&vgh&0*06qQYmdK9Q8S8!B%X-(v86fToj`U2el zI3b7Sc(74X3O$I-Lm=5SZOXCSwC9s_>op55EP|~ppDu1x1`UGwE^3lq*~ZsdA9!+^ zBcSgd2}R}p#x!lxeOa{wKS*3{yrH9U=mA=7-4m`uxw2ucZ&^yEC;#aZ|n+dD^k7%u^LOu3k(~D`RT~*K>T#3e!a!v)pt(ZXTcJ zjIxe%N6+6Tlzyf-ABServBTky-8eKbP(H?Cv0Dj(s6fKi^dZ2| zTK{8Z7W2v7RL&n-K$H(AYtH(H@=ZlfuRoigmLgPwe$73Tg|gbG#1qW1B>m>*I!(X} zR7$q$`c%SWe2kQ#gA_DI!u~9;Ge25IB~%K+-oJHNB?pLbmvp0N-%~sN-n>DvlI{X4 zqUvuQwL5f)!Kq$Vi})f@#jx**aFCIe6pgU@B9Yk)mMnuL8YTkpcySqgq zH@6MD@qTv-U*VN@*Yt)jLXh}Kt~B}W)=AQtI*s^&tHy6({=iBxgMcfaD2PxftJ;feqTrH~yB0ro`cj^l7_As}Zu~^V&QS+yg=%oditnT_~huO;V zv7UT3Hkht0R>Q7&1TIqj~!7B0S-Y`G{Tb4D!m9z4E@ z^J;3}?K@ifa)0q@V>d_G1C=8X*rjsOP}b<0<|H6;a4)&Am|D0@-npPtQa{Mn*~Cg$qDY^+mg1c=d>V{AXz-t*XkVv2kKvNwopajl zJgq<82tpFFzO9?=eC1^k&c^{8MYyoWC2d1{Edw-)DAB#Y3z#Q0{K>cXhwIp%m4yB) zM>l5H5BpKhKLR$`SU5hC%04oph(02(=owjAe&1vK!?2I-|FEMQ^M^g^pAgr7rG<&{ z?WdFB5du)Hkj{lVs00-0G9Rry@lE+xt z*@##;K1{pWeh&&0BR%s+nAiV+9qxZBVX!gzld!Ijarv_?;=fYE^pU9cALhQSe>nNF zak6oInB;xr#r<|bWc`?JA3-?S?H?Qd{+e+w$KR!}eE1Z9EEaYmCg#5@ zVfj$U`Y{Rr4=VxusgQr;zWuNIAO3y-{b76fd-eXl_+#?_zW5!X_Q$V&=hpo5QN};^ zgZ}*}gYz#QW&GiY*o^F(tH-1W*Bg<@7HNj65H(R3)FTi`Ig_~vT+eLW9|vYkM+z19 z^58w#CC=u>0pO-NB37T6|K6ZJtR}|r75vRt%H4{U)#h~dF7u(X#;^8Z___Pt>-8Wt zS^fRzLI25VkT&X9y>1;Fy_ye$3*lK!DbKGyMj+)RjqFvh*0cz2W_q9HaAg!%fHgdfKVJAoGej9sdP1h!uiltC{EjZ-aE4#S z_|=8SuVE2La^S?~;FLOgj#R_(LzPI2l$Odd6SCyLLZI8$x(3Nn8CzWmu4eMC*j`z7 zm&XqX1Cqt_9lEpKoYdXQ%{-M^@RI2W^Oci7B?_|ZY86vgDi3z4lX4v=rC>BBc>v|3`&Q}*KPZ`(XJvh7*RxvbXIaoBJLFZCW1`A6`gHnM;S7Dc znJW$rPi<*-K(ku!{F>bT8r}Wc)l=b~E}BqbPpRaBctZ8b9I=84GXo=+%bvVzs|{25 zDHF#|;t4ED1j4B?l?g+G$!HAIAhVIvzZ|Lvj1x*)ctV;eXaiz~6b=#_+-*KBf(tmV z6oB4J#@0ctLr=cg{|qx_?H z0)F@TFPran{4OQpiXly!Dmd2H9hz~|PhuNHpFiw^8Z?Mln4^?dQK;08x;iLk3KT3C z_$HdRn>VwFEmO>g3_p+DTSMy#09`xfGK8bDuw-I@r<7Gn-U;{!+B!~;$ z=kdaq7rh$T&j|6Ea}|Fi&;f2QbvQ6(2YD3Ka7o7y#OS!`8!!QzR>q{-IGCB_cNS8wu=wo#@YWOY%sgCVgl_)ujNsM{#Vb zjX8M|eM>&wkYCv!T>ZYKddHO5YIT4|ki)gp6)RX6a1a#N{~}3Pt34biK(_P4zziHh z4P!1YgB2zmB!J_HNSRa%BMW?YUXW)L&*;5YjLF)I;|-{XnkP>VGLdnZOx#z+5whdt zaK#Y9vE|xkx30{0j zRQ^zr@CXg*hS2xft`X@PiW-@QfFsrrA#W|xwaydAIZY;=%^+@u;Ipgb0#H*wr0*_f za9DJvqVhGpt+8bbTh!zg{*X*#7|dm3=`IEXfnI3%i+1=oE##sAx<;eQiA}481Wl(D zdHL0p;GKzA6H}Qx)7Z7fOX7k?uaNMW%Jp2e0w&W}hL=Z-n%s|-8VmkfJ9EnaHI(&N zXl=;@O?jS-gW>w6TcsLR*n=Ab6a?ig)VirD2w%i4W3X45mp);yF1D`Lkm9*Nsue-T zq*(Q%*$Oayc3`v;aIrm}D_5l6A|A^n&MLt$hecA}_myraU!L=}@Q(v-4FOlgsA{k} zq?mx8h``A>B67pn9P^N{XD--nTGKs~lkA}{AnXt9Q)Z?_2>S=7>b3#T%V+?^T#UC_ z8#YCeAS}zGjHY)T$<~ivd%I6-r?T@g^1W>Py`Nd`2#y4unTl9Roxg_$^nyVux>5i^ zDVl9T&OQ#Wl?Dn`Yf{@L86>PVyZ=Jab>LWRB+f$vvGLcKvBAvNbpl)?PgwhSghi8u>g+e+dJA0%YK-QkvDE_5w2o=MnO zq`H;WKpGz(-RxSeg|yG?iL)2IIAj6)HakMMH4%&v8M|?m1Ixrj z5m5vTX1IXk2&4mn&)kMwhTml-ixSM4-=fQt;FN|P6&+~d5ZBuqoiXc9uh~5UFCu0> z$ctPSMA{p6A|tI@h+Bk(?qiS5kB z#nkkAw{ljAPosrXl~y~kEC~SYfgrCh9HxhxwxpoTaTVCwN-cg!;-V}%nxc*NI;?>} zYxGH6AxMlD=j~QUnRi+Od^3zm`r%${9Yk7e8ENn@d(oFK8@_c{QSpR3UQI{?f(B9= ztWtNa;NPCe;N$7;S5kzu`qyD2ta?a2?4>T_=S;~Bw6-}xf`eSLlK5D~X}U~0wE~M@{Tvz} zNcNF^-b^{X!9EG{O9gJq6*CF4yc!Cm2cP5EryUO4}yt(5NKu;v|5OrMuq0LB7G(n8CpTKo3ACc)kUrJx1Pt2|hjviQQ! zb+E5&t!(8v0z*2{AXy-Zn!1X@M*6TW3lD?pF640b!0nknK2R^o6|ZjV{$?EJ1)rUD z`CWY&fng-_XjID1u8>czS!p60riP(uv?#`>j}3>@LdGu_NkTEs=t3reO;YhI($$JN z;B2iBU@7K{Hh3MkSCSFu$~3<8mi2gPiG6GK+D=0Lym8jnR;rKdauW0miW`ap&mrq0 z8y%ynMk!Vnnw&jx%Q$}3B~<}`N9u#-<4Ep*@|m!DWAYeO%%nUV`&#l5RVB<&>l11A zHifsZt>6w>nvrZ^>zr7v6DIMTqw@9&t%EMrcQzA>t+6`+Pu=txK-L}$4QBa~j=Mkz ze|e4iMHG@t&gI1qCbQhK5IZl);E+9!WE$%gk>@3Gc+1{+nwcPuA#Rvcz8Dl*(|+U< zJ3J`Eq2QKN7^HZ(R6O@HcJ1Yy@w_i)T8HWo4n*Kusru;4 z^YhWZQvxgEhh&3Wt`*yGZ%WR14)&raGEB3TnwFYomN?8U##y~P#gCeX4T>aMqK8t0 z^|=U{PVQHIP|$rrWOS<8@lvwdHbXxF8gnTu+l9TZz6&#;GP(&^WWqK&nfKsPuqIo` zT22O9eNQ$IWt)3XayGH1N=kg95KZxCSa2N^per(1G#AYyoTXA(&^f*$>08GI;iBl%jcOBM zV#FbO7k(YEu`2BKpUQOl^LH6=z8no*m)07Df??)+(EKP$Gvkw6Il!{@p5Qj%0V-6b zQOj~t+r#pQq-!y;zhzjnj1Qbj_`a6giayFII;zrV@^iT!5XgZDmpTJG>eJ~To@c44 zkxN~GsIe_z*=h=BqZPRUq9IPtp&Iw(%}va1luVm5AxL~#*PoRpL@HMx9Mhu@CgO~x zLy;U)>n>P+?k@=V`Y_CX<(Trmh=AW=X@V)CnEdzL))Ki{yz*Z3mSt_EpF8=&2dzhkmeGkYu8Z^lVQxEKuhOe+MPD0i( zZj6&`>XNHmH_0lm4%&1XNydFc`HrVQhbj0PudYP4q}SQ3v6TIC-(7+1)C1RAeb)nwj6kKP)0LD@^-q3A%pZ3dY~Yi%;o82`cH(CnBgiq*08Rce&E@5BLI zqUTH_9#z}nD5~!hf7%SOixGm=Bm%EddF-|G)Qm~Y_8lbRHF06)2!v)@*;Tg#1ad2b zOod%+t*vM>xU3-5XwYZWU-|CX56i!b(ztF^hrg~BA5u7ejf-(jMOGkvmKZ+CRg#y& z0WLQp(`PGzf2ID^Mh&pJ=NTBV%J)G^Dc#ljRR!_6=7q4N(UA_7GaD{>x~~11CFdrs z&quT5Njl47QX4vvKbmu!1fEGgG-9NnaDXrZ&s8w0h{Albyw#bO(sQghTXBrx3VT>~ zWJw)#6El|9s971A!inxDi#<9?+0eo9en4U{HJ*graMyODGS+*HRWW0z8e}3Ye}+ zw~~ADYriHc; z7U7DKQ1!yDENp@!h(s)cTL+1>bW-U)C`6(VQ&;*9j6$R>`=>yX?H}7({u*FmV*0>A zEbMW{0~JRO+6oomFXktn2F>63Q7NXzWNs>{ny9;`yc^0KXSX+K1T2V|3Ugk zn)KHcu`~WH*aQGzq-SDe2M{qaexN=^=8stiU}mOgW(5HL&4BWM6F>H+xbnY)_x~Rv zK6C+?KJXh8fc>{F*8fX%vHy2aKMNxhJ>v%rXC-20XQ5|f=Kv6~d@M6|X28dIF|&PS z(=fCAyT|KaM(VKtcThhQ$A8Q`zy}=V_~81?0OpT)AeO&H>M;K?Y9FUEO#kM&_pi15 zw?O~LVzEsOasuzbeT5FwDEwuo5h_^2$faU=~SL0!I0y?H4WmpkRDX>3lm z9Y#QDyVdK%*9<%CH{apweYDH08{6lT?+3>ZqVHGtcJIqwPagf>_`9DhZfN6nY)h^XYqV5qTEV6gH-LA!BFnBEtJ6&q{>*C6K_%>&R=P*rpKT&B(~rENX~LoND`0oD55DIj%dn{X zgA#6NuiefzRJ%52SLW%A0mm11^oc?QOU6qz5vVi3YG7)0T1jwGaGCfRU8{_6txITJ zVc$sO_3{(EIFoQTAd*mq)@Y6%&(i`4u$rla@qRCT{N z&{4@Yf>cDORj@{?ynUuz91>)+KsnuQ3kW2uP|iE-V9+1@>}5-65e;hlnU??rE+1Bl zdNP8s#Ih<({ zK>oFa=!OAdE`k#)e0&V2Zjb$gH!O?wp=Oz^r=;`BcepD4qLu4Nea+$ttn+_BArbZ^Eji(HLYu*jDQ(YQua`|LR z+#`jBBpUoP-#H2r5K!%H6HhsWRETcR>FYLGRJD09s}gy1UWFn10dbr+PMyHTRVw6T zkTOHEm2L_GZd-lEoO+R1$iOc<*w6Fo>sTguMj z4)p`@V}<6Y?Pq8opAWAoP@zcay5Kf?iu<%@` zy>s4AVL7$umC+<qJk$l{1C9{#DvmHKcax3CPayQ?u zmsb$)cR%q+U8;PTwbn=(!H@gypU zs2uRjm4j!EmYFaLUbfCtgAtl!dU)-tf~76MUaWyUO7o(a2*9KX&wGt}CV^Kh^huh_ zCHI8k4giwTw3zjx0f7_jCD`)xomnMmtTQnGGq@ zV{60n*AB?c#y)rItqIsV%In8Dnau~GE_U+1L<+khOGOGV3e15_f40O{FA>~`JIQm! z6p{B)!MU$+$vD+a&FGrsVF0(Gh_a0zSp-kFH+M62kv>s&aW^RLV@4+)2#&)Of{M*1 z{|I|Gl4Wwf+?GETv(TtEj)Ki@SJ$=HGCdDjQ(qG2ZeG%E6{<5)A(H zc?TVTRw-qgg=kMBov1k}<;X*M{u2yPRTCR8k2ie;Ba8Vgb&)sH&rh1s23@0BqzteI zrk@QCw{ucpeevAtQ4yXj>DuihG(Rzqv-rde^gBq_AR%Fbo;Iq7G2iF*7&G4195sU4gMvlE>Lw|So0^F$g^Fd; zwR-Q`M;n0pw#1A9EE*7MA6ss*+t7qK#FVZ8;&!g`&E020Yyx~ORVc-ZKoU9ZDk8+8 zKs<0hk~^2ByJgKE1zSq$*vpQj<618vXQoWwJ-_a6SucBRLRF;D|Gdhn>WHNejPR$^ z#(=>Z2ctq5Xv^n8QPtkz08WN*0sV$Y@lHSA1o`wN<|oGfEr`RfYTQ zeorRv#`~L@#tX~*7I@NDX%COXr{)BD)#;}s9>wf0#d^d6z`GJ>;%B%F zU|=L7JM$nQzd;$pt4ZaSK5+rDGYA?bM#u=8mn0!6iFq%MmL(0~6yL^43R$N8JWUE^ zZYWv%y!H84{W^3E1z0wEueVtkupsZ=3d~1EeF7c0;@777s%lR@{kr5l!MbNs3aT&4 zDJXDna(ZpywYrp$B!m)6Lh?M`3=9XFf!AiQq(;>;&3mBUwNa5p{-Jl>(qkb2IG`Y& z?=AAR3zA0436A-SeLrlo96E%cQ?E%zo1-4onMpEDU(#%U{r(yC^Q$~g`D_;Ze9+`0 zCUSdZ)V5DNLpR($u$wt%D2d1jYd|#slQq964__<5hu19SRG%Sz3H8b>_k$bs(4Yx zX&T98yw8%JBAS5_*y#gvdonWeir`Rt4F%>cO;s$K;Kc<7oElP}q)ffqTmWdDVUhE= z{r>ZeLC_5f8=614C$?}9m0*Z8bsUoC$#fBN2u`|ar{e%g6JBG5*Fh6{zVcXgv9QDMSS?)@NHz%N<^C5E z^!iSqG~Y2;Ev8*1NS#lJ3coZ_lpsV;G3Xp# z=7h=Qvlbgj*_i)=n7kvB-#Fl&gqb8-UGshWRu_~v+oLls7}}#Zh@jd|)*sR5AY2zl zks!9DFf7c8^4-X6V=-zF%}gr`)@?l!E?CPwv9~|M$u@5~vO&0AH3K8meY%oZn~c`@ za>I!sM2#aD(At@*0I0HH(WE_#ny4Mck9)i&2yt3)PQg?OGlolZVkB+BNKDYKDx8fA zoq4`%Gelo~?d~Sp(-`p%GddUwJ8Rw|HFaI4AsFhYu|~(Ag(Y99q1u|ysooM5-@hRs z^em31I9}xdVJJ$A{=o+%$BL^$)sq5(6ZAj_Gh4)Qv{4lhdP`OA%3=9t?F|6i{2~FS z*m@Sn6^c$NE0DUY@cH~ZiUBBXXyjdR=Ww{{kYuT$D3t*mc5dA?dh(C%JjQ~%sNsn( z@Qr#%!u_*eXaZKCNl&fa^SEe%$Lj5JCaB6d!mJ+3#)7nLSoqGg{di)u@_rRWij#=G zxaNVhV2y=s&W5wxh8v7(X|dpefqP~pdgvhs?^${?VTx;FQP&(? z7Yl}oUwm#nCz4jD6~Yf5BRU9PVQMWMBN6wzG?KWHPbiP2IYD5}HWke+f@7F-Y2$E+ zOBEW>zbXlB#QDbX_X z5K++4t}&90d8cBeC^7lVCf@ODQJJ=rmI?|eu@(O*f-*{52i~|dbRRJk7%R3cL_FkY zUGC12f%(&)aI@KL)S=*f?o=oyx%rgBnh|?&eP}QWw-y5GLUqd=+wNi1@k5bCC>9;V zCBVxpo1hpZpY!%ar^86Td7G@c#W7Wf3uQ`mx2g9Dc2z3oDPFiN?N(XE8zy>acKeI4 zDIg2JdmF6Q^KUb(tX|Z!>e3&z)$ZeB+^?zJ{@TxoX%u^hDc|37G_0^obX^Xms=u}jD3e4 z=Svr^2NZ$LvH_K}NvYzUG1ZZ0Rw|)lqIX*1$-k6hc;Ej0QZB-cghf{meio6~t&$m= z%DE4j z%Sg}2%*Ouj#$kUza}yg^6UX1!{QpfX{{wjZ&$%XiAlkoTQTxGCetX&e6FK?)*Z=k5 z{zguiSvdY0InmUzBW1<-BZPUpKm4qgm9NVSUF4*)(Hzr)#p6>ISP(>Ts5l((K=&bc zHFc`azAbyYeY}9g;^4l~^BM!&N4epfNQ=8n_Cs%to?pA?bup`6=kv?q-RY&8;p^+^ z^L%9CN425dX4SW58l3#BqmHJcMK0$LpW3dE#-igew~xFB^Oo`L>dgdq12)Y!td@G7R;U|roE5Nq( zRwzLY=ukrTwRX-%A;r36DS|N?W;vV-25x9>u4Fl$qpVjDVLLyaU#w)uCKkWqPc%f5 z?!3>=brP*2=G_3>ckV^?y10189EIP}cw?5pYR%U{*Uk~m@KGaw@A^J?uR%_jIB;UP z;r45le@e!OryD`Bct~7FD5Zq#+;kWIbub}T*u`+4Y9pwi$wHJdMU zOng$YF(Z6|(Fz30f>JN0#SD`73F= z5*DkCRW_lW=Bu;?QeM)NMuU7Wh9`3Xi9>@Vg73pZ>OH&4e0*^vrBmUG_)??|z^uK6($0pGlE=jw5 z%C>F0>XdEUwr!iIY}>YNoU(1(c&odo--({MBj%Zjo*%Fy_THazt(AFYQd8Bq7UM`F zQrc1cF{M#8!MnkJh>xRrH0gzU3Mu1qr6*isc*-sx7Lbe5E?l6|`H2<| zH1bdM^!)21V)de=){RL}F=3l=S#M?xvL22BqKSlVY*X*_5%0=VDUN4w&l{dakzO1l zX#8wmtyUEERkw;~?VgBCp+Y2)cd2bu?ZXNKkrnrr&OZb2N%Gr**uHRRmCCC6FsT59Dc(PWA(ckmINM*KYJ#sEXXg7bbhXy zV1Zmgoo9qr|GHK57k!~z)MUd6!%I@ZwWwK$tAfm3E@5$D_lf{5R74gk!&)ms>RFLY zM@8*F1s1-0D;O9I%8u~e|GE;k*Yw}PkFYkk+3=w5`w*&?DN#E3&c! z0Lmh9hc?6=+jA8u^kf>85Q3*yxg4a?xQ}2@?Qt@sKT29R2F{Xerb%u^=@cFk$SqXC z*@uIb`^~bgfLfk_D?m9r`n>8<=(`94W2?29_)jL(Ypg_3+k<423{3{xS5u8XJ+&YA!w4Q zkg+VtUl2S=dL*6ZZdet#8#ajSq8pN8u=_C1V^{hb$>;|dG{mcW@a)DQ)}7}VIPwgahk!VQ@$2s^5xIujZHTN+@E0b0jyET0&#Ms#+bsyBsxl0MjPzV(q>l0|N}V zWat`#Bsf~A@9gGt>1HDk%BjJQyq+tin7_UDQ<7rm5}Io|smPRwc`lw+*Uo)m6BR|A z9|td$&iEFE5Ug(etVAK`Avv09E?#V z(t5H}yXYbjUr58_Ny#>@h5N4yb@sN_~7U zhxbhg7b!rk%kNlk-%bJ+-C=3!!F0q^Go>ox@jah$hyR<=XxzZ=-cKCD)!ez8 zu40jIUk3P-EIt&K{S!iXn%rsS}kw<&pP}6 z#>(+ydthf}{daE)Gc5=6PmGC~gO=^*#`z!C6nc*T7eP5wb0;%r16o5{YdQyKM<*I9 zeH&9c16x~5Is+?P13GJca~nEG2SYkTGX`cFdL|k}eFsxp8dqBfOGi8XAC?%cwb4JR z^MCsO|Gv-=+rI|F{ZZ%tehvL!)%kyQ4*jP(XJcdgm+qRHnzjecC_jOqyeERHI28i8 z>)<*+Q!ZeqNL278+uP=_F1rXlSAP!}Qv)`>4GB0&NKGv&XA+@n zkQL<_vK@F|Za--t(PmYPn)0r*CkxswRW@7K5iICx$iQC{hBi2zU28`1bFhU)ObygD z@*0Zg>R_#IU6I?ex9^VkLghXi-;IGJofp1*@B@ZlCS#d)1s0e!LP~0WKcPQ>aGUlg z9UY~ge1!QTtGs?mJ$qnrdhfPVwj_b9=%@gMd37-I2-_z9wkefrGpf|U`S;z+ytYyW zrx{VeNZ5;c6B6kS-3YJs0*CzR8B(|LWx$OJEbj}%O5MC($6txvqkS1HF1EtgIM#Ca z*@Oq0^wT#i?R|UVD-A80qJ(kP0k^dgolmPv?%`7(pA8r!78*hfai{x@>#r_PF*U(> z&^zcrq@;?jzh#L@hv(M{p9=EjzGk*sR2B)WYt40@Vu2Pr<|XXaWDMq#C2Xur-H~3S zE)gSf{%cC_V82f=?A(5Vb^iVUhBT0R)ZOSDIzHZnyRLhM+j-fxheE|#f~h!zFJ$Pp zer@$^X+Vv?DSVevcu6-}6P8%w`TamYxmYMT?O;L7x$8a>L%AByC@lJrI3XaFnq6euws9#N zpBhN5bks~VbT_H=FSPaS`6Nd#3> zEy|pMkh{-bXE9UG7rGN14Qj|yAbczn%_Bvx8ect z+-p#|HrI!#^=J?5Z0&9NP4#J6nMoT*;YcnT9;Cu=5V~Sc{ze*#nMtXC zGNtRRw782kwh*bM3kIPk@HAG{pEm^!6;(zToz~Z2N_NjhAMfPq!9|ln)c*AHLj*Nit@mcs?Mc#u%jNeW(tjUl-=;g9tLIx-{qFwOIQ)TKuIkO|T15~>b=a_y^?|#a zrPhvwXc_)>%HL`)I8;cbC!8zw4ho*+`hgPOD)`IXzKk$NA2G;EZzutGqmw|7<^(Qu zK^d^kONdxdzw`zM@k4eZY{_AJZHqM|5X*AvfYUV>;M|-8_~cUDjl1%2uttktzpehBlD6inhMf5H95nr??m@wAdR-ZH^QL z5HZ@}Gi#s`JI&fo>;LP1EOm8PN00k`Q!*It@VI) z72m!+OCB#T%y`-QMkcKJc~0pgEQpK}Pi`CF;JzwrV)n)`FsaQ+=m5P*bR7<;n+Tj{ z^=vdf`N527=^kSr96HZaGfG{!&(B8jWe>qX*#t;a&NyzxZ=jj*j zYPfVET|}+dIB5n+7LOLuh)y0O^scV~Nx8mTdP+Sqhv4&2M@oZ%PSjcMm!&Ygy*s8x ztbDw(n%T12A>PG@F~!nNNT zJUo*HhQO82x<<3|d!(XR;$6X$4mdNu?-^qJlKIth6bH+hk4)mR79W1*Hsk@-EsQZ6 zmE+VHwa8G2w=J&`p*ndZXg+~Kl}UzE6}Vm|{F&o!!ax=+Z2<$U#)yR90RTZi!G);d zU_lTq4dZcT9dOvGY*Ky*8wM65q*d*45b(+^W>J1L&&^m^PBQMq1$hNcpEVD$C}0)5 zAy9GtQ^;MEVf%iW*OZ}IfJ7uNXsG4G1XmWH*h@mLt{+-ypD7r`*q^rx*TW^o?V7246;X$$x4FCtXQ*g*GU4($ zKj=P*EOXWTUfGTZk0=~qG;`03oh$I3KdINtw8Q5!Q4ne1W0%(dRj>dZ3}vjaChYDx zPynVzT5do_vv1-CZd7G~*4>&AIQirXv>n+oEXD2Ybj z91nG=#km z`doOjOP2S|7A+c)xi$LT#x_-i>U$8VXcgjZMYW}TE+dSrVcyM6SPXWoGw)?jk$tr% zrV1O-t4y^a%vb}kd^`bfjJ-j6`oo!z2S?*hSCF0G<}Z|YX@aEVU~t!a$ZKIZ@f}uS zKxc;3O#R7{*fhtDK1hARIWCQXgW6qrONz#W+0sYD#!@wFVF_U1Mnl=UAc3I6ptmM- zU~l@gHPQd5f|&N#!0UNp|E=}z-{tE0jiB3-77Z1$pIBJq#EM4GA#ONd3-FPbXeTbG zhhyFThy*K*jU3WJOb#8LkEaOD)NLU264!I}RugB+Z7WFW*}(H&6Bqh8{l%h!Ket4i zQk=$utT2_v(urR#eP03BVoJDLGaY0u;p*c3>D1kULqJ4Tq_wtSPpI!Z7>1dFU3@0b@sd8CJWmN1)u@`>bL=Zg8fWJ5%0nJr%EDz` zgFQVIouCCm;0zadzT4jKkqtdO-yb=j`zcu)zV08L?@!rJ5|_N(m#{f5<#>lh;L{Wh zZ1U`<4`1`w9lk#I1&N4si`r!!XIB>O72fajU-Qo$^JG%hX=4SFjy74H9qm>KF~El> zlawroNe%tfkiBfnp+}#V_g`(Fk#hr`-&dp)MjT$fA_tNBkwQI#o)odD51adEH+Krz zVrRdJ4nGl|c_m1Q3iAu2+$i4j2*IRRFRA)xl(-8hLgeqjC7eNkY zJ5)Ov7zreHT)uK|O*r81${X)iY;0&-y5boE$bvJnEeA*s$lVEJ6_cNR&#NV zyUCNtRnqHjmjWVtN!n1UVviGSA~&U6wJi)d(lPYJ%?Nn?0w14gZZ{j$0p?Jhk}T7@ z)B!U$rvp`E8_5*C&`;jLuOY(8zeT-2NelV)Ok?{s3|X>&CU@0Ooyy|b-;uc_v0MZ& zUEQLfXGyxIyDFv#bRscQ7+?zoPw0Rartyo!u-_5Wij<|x7Fu2XJ}-tw-L#?Cr9UB= z^>>K|S6#L}8D$dNiWM*rI1kzIRhvx z*U1Om+02@M-1qu(DpOe3rJWT+*6|f=sbM-hrxx!PK)^A{G}+X@iWjy!hODO^{5)v; z3?K%!aU;!(j%}=zEsC2q!+QL>)INre5R4$Zhx28tMhmzhSu)O00lRJbewgF5X?mTS zjJ%*yhzlC`1<2C-c{O<5jXb@{yx6uP9?E8?#M?;-xTNoYc^;co#DgU3DQ(J#C5UQM z4tpIT`K1NGxtaq5LbwjK6@-!i z=mRv_R0wPA+;9XKeB@E?ce~8APXEMbj3<^?P?qVi+vFQfeR|i}Lmjppw0hUmQ4mUa z;_h%Xi31!zx3;MEi6Eurhdc9hk)^?ENqt71zwto)L8?_qFwSGxL z9s{r}Kwn>TAdI>7;E_S+d0MI2wFZt2)Ad}2Jcf8WWXi>yb6G6y($E(p&33S119RXt5dxihz>L=fldpX9mt z5cHSIX}9%G`im-4RG~DtlAgxa2MHubjcDh^;8_ZpCxGBBmw3CF(Kg-ls61cyJbT|3 zk8}yztearEJV`Yhd>S{~XVyb6aSuN1CKd@@zLQePGMbLzq$k>&*%+qasVURrbjT{z zSLG*|8d$rO2a0ebt^uLow7|rG=m8U_1U@+jWe0mmwD7l4KfEhXP(2v|q%B&38i3?~Nz zB&Wok&^VV;G-l^~i_H@3mUhkgOo!c&WO22splv1!#%eu1{B)i&4LkX@{Ij&;Pa>{FiOyZkxY@!W4h=)AqdfSK_FthaBbsA^(c6r0 zEL(}Im5iEC5x8f^4^Q-+(v?r0Idk2!WgjamKkQcr7)T?ZmKhE+e=x9ky4f28zajrO z-D&p;RkUI3=B%P?dvUq?hY4L(;GTww#p=id>fmU8k^4kP1uGB*vLvEvDCffTr%~^q z^W1OUMKRNa{H5W}cpLI0i46qdt98l|M~XTX;VrFFyis;eQ!e<9$sUdl(SrO`Al`#p zSYth88tYP=x++4*qUJ;=7EQ>W%G`|V&()IK(w&uPcT7C;7~F&`v6}4`i*Pj{j1}o$ z_9W;k2`(bBVs9=X!X>O{O`<6I>65KI^HCw!yt*_q#6m(!j}OHKU6>2<9H{+-#Czki zXQv6H2^!(GuT{nm1|NlaqQb$qcv+q4ykEu(ORhzpl%9dsBRAR<7Mmw~0uh8Pn(m^F zNTqU(#qVcoD2EeZ7pd441`2xjse;NCZ^t1dBbpFDtptpvoLhp;q`AjkHM94?y945L9i5M`Kax+V=v0Q}CVA~S?=>@+AW5UQ! zIgbl|;JdjLWmym=`ak6cUO8J&mPzV)aF)Q7nUhhzhcjS#5Vln*?c-()keoP`Nu8K3 z@>=)gisp!R0^{3qjc%xNH2KL6EPwmsirr3W6B48kwYEAsdkl6j)9bOgpan-ihc??m zZP+=z^XJwUr1{B6j13TSoX_j~t)lB%Mym5RB{WvgdP9ZPuE>?!@-@9JDy!b2$%f>< zET&2D1m6R3IhU|dHR+Akt6INm`jH7t1sjZ^oRr{MC^%lL6n*XRU?R?Lb(yeqc|oYT ze;eEb)`3pK67LeV%#tol6WKmUNzNZ$_!EX5igxx6PR(|+1eBZQ&PK2^_rU13{6 z4YDe_7+dB2^)cGXWA?uty!Zw%+I7eHM{WL3ImG`)ZT|0}q5o5yF57>7ssBt2v9SDW zn{_Qo$DfMk?t4`$t#AWPSgy@`nX$?}+LQ{1#piFkrxG~d@0qL15vr#5m#5Fg zXV*@mwJsmmCSPx1ZOWSR9qhEM@FYc&?+Z|~lYp-ws1J?oQT^%uUm zL^3UhSZGQpFmbNUS13(PzqQuo4+|h;WOxr?5w$RsCNZn*@9vZ8T5VTHX$+km3uNbX z8RDyd|7})?3s`o3yUMR=BqX`KYFMcAtfjkmg1~^C_US%@;?`CQ)LP74X;J-d_h5qu zp?F1;Z;UW^$%EX_mj7)gTPyGBc$V;4_M6w|W*g<1xIp>k*Q@R;#SgV_7#J84ut>molfw1mh91Qu6(1j(>!(9!d2}M76^O&) zMzxMVEWvAIc-+V=c#AH`IWUJ%=UPUJ(PBuV8(dU!k?cl2^v3Ul+%1^_@Rj^#?10wx zZmo)N^Pa=BipcLuzl|!-u)KhX)#fDGLpb3Yg#R$=g7aj!L0ycg(u=&Huvd{GQd-9Q zn|`**G0-m{{J?mUz4&XfwX$YNVS8=Jws9K6_H<0H2FUNMVK-9L zTB4<7&%o#7FpopMakT3F!;YN_TSu@rZaxFgSUu!DmMoXxx{?o-ZiMFj_o-^1C zJlHf?XBn)4L~z>r#M#;@`001Xc=VX&o277ka1_@Xs-Wk67ua zaFtLdjEx*`X5Qy>3VDw>B*JiMZMt5Ec@EhRJ=a}?tAP%9NS>A=#OyP$8s_BsJV6#p z6WK|a)2N{almpSk+xoH+QFLc-5eO!y! zq>v%knW&3-ay#m33lZE}M>f~M5ud}7^9OcgRV|Yd4xGAXFB5=j>$YMDqjVYGIn+fB zxbb=pH2V5iI;U}|%%SvL6R-tXBeeO9fFXk?QD)Q!h-e^^j`aC-fuB3=po)HkEXU&m zuy}@g`E_XJU2PfAW91m-7!ABCFi8$g5(0f6^prDTu|qSO1g-UN#}6-V>yOO@$6*R~ zQO{JbTt_ROir(W9t(+<)T6l_7VI*iRoiTQnk;vCE!gXGB`v@c<*Km`m`6CZ=sv`kL zMV3be*%#{@q@7ZXC+58t8!$O`Dxlu9*=h>fuH^Yk(3KB7(nNWKZ0f`tL-GQPx6nbq zOwL&i2I>muI=Eko211-e*pybD@)bp&Tm`f8eo8M2U&@V76-w44U*& z#yNwdWx5w`ul%vqDi;1OJAdknABF};dvK9kSTBIhL9ML;0UzSDx@Ul5p4yP1ql8L_ z#hanR8P4y*5if%;EEg^JPR%E0@i6DQqy$8ndmic>2( z=>iwn7|uk_^xa3k&_DuE{UJ?IW+VB%1xTW z!`t$=*J8_12Dh{9ko=T%OsKcJN2G`g=&d48w0i;7GuqjN z>F?tE)ah;PjKA5zpIXrqMS~`(X@U?=k&dGxz_XkQ1m%kFdEdneGK3*5k|zvF-~y&H zNnMu2WxK-9Z@~GRijJNP-e;mtKl(K?OZEBnJ!`Jv^8)eQQA)q(hwq#N54v`%1i(Id z81T>$jmLdbV-vt@Dlz(E*#(6uB92j(Du&dWO&NOof1>Pyzb62SuIMV3KrfbcLeZWE zaf<~M#TJVafpus%TTCEr?C0)mAst3a78hBGIBQ=3&N;!jdaq}{EQGNhw+tZD2v0N1 zk8r+Y_WLCHY{r(XI#(&6o+ug=t)I=%Mr(H2$i!?*J7s{OM(57FIJ&OGgMNNHEw?Tz zZW?jk*M)J%8;(8(VJ^KjYSh*Q;vF)#*IeFwb#r6<5waCAU>0w~3o+fEM)79Tjb$P- zc8JD#*ws(W!FYs-z7v0vAx5abp378NtK3Bkjd(?S^;k8g=SY|f!wbkUXh9DK4TXP~ z?l}VKI}5FjpUA5Z7j~$SOLN7NPm7%|t>ia4QBzk32m!&o3+}yr;?ztyna(lRrju3{tum{TNPr1ipT|zF;SbzJXke0g<4NFeHp?wNF^4J@ z!p7kuj;1$ulHS<{&t7o$%Cv=rS<(WT?^BIx(C!`wv6n<+GFRoVbShCXr-%T=UD8>H zL1c!64p~Z8L@1u<_(ktEej|oLZ2(<8pa4#y6x^eN#HQfl*v&r4U?i;jgj*<02$o={`K_WH#J$X(b|CJVZt9TLp^Rr@2AYfUxRnJNfV-W zuzzKz;9&kp)gC7I-K8Hz1Gp+>7q8-1E{w0? zi3TGCk}h{FpsV9)-V|MOoLj&?M#b&lGAGR~D1}N8MH{TpFSP1}XQqipQ|Cb!_4$Z& z&#b;Bdb=;D-R(&QP#upX&k^%mI#0@^ zh`Z2Oq$@D2{#m;eX@YVs;L*Mo*9w?^CJRsaV-h?IPf)L}sMOZUuROv$0ED2&zP_9i z-Qa;w!Mhf$?5goQqn&?ZFvhIZ%Fj}%7Hi9Co%#GTU-|F&^(2&<(M zlVVNKX;0dt=`kZGBEdj$sMY-3AE?N9Mgh0vqAM^pJz6(%L$xN$ec6L9wV!WikdYcA#*T$cgURL}Z*gwg)|lP64`Y|rcpCi#FS52j z0f{bJk*fY^gtr2(XaY{%ErmG%0UXH8MVXM3j$Rj^QFoY8?E9|2eShCH0M))8sa;zk zFKRz&K&$tqBrEks0T!ltUp!&O1IUgxZcD6}gs46!6La&Dm2DT>0~i7FYem+8Sr?N< zO~8}b@RJpq-7b7BA0?`v$!HGK0>d3*@0XCc#H>oYErKGwy`iw1CbJ|RAL@LOj0l>e zphJg>W}3|l(1$yHnAZMRVVIWcgK_Q4_ zgVafM2NJZ_{n<&>wztb3tbR!j4z1>$G?eVx^QOm2rJ&-k_JCWScLKrxLsYTKZFEYz zS|*h&mIzdws&XE=>pZ!Ub^l5dVJW26e=b9LHEci6Pke8+$R!4}%CWp#oRrZLIwq^zi9rm-p*@qoev8sQ!}e?jI-Fe?rgvH%_wuPQCa)o@D>)Oa130%SivP z^=vebq3&|RDI1Yn1sbpi=9K7w*Rrq#q*-zghZl<+2Tuhh$K4<&Z@cqzt zenyC%5ZK=eVohP)%90)|WCqed0Z7q63;ru54cW_j{C@PZg5A@o8ic*}sk^L3Jh2Od zjKCBap*FJ@abI=x5!2e*{3qaGLpOBh8WwIjwKQ&y+&O$SPtcIl!uT5=hoejij&*6d z;);}k+*I0Yll9r%SCEkEjG018c7aV{zH({OQWe8iz5){%l@^8V8Nc(WeTMMnMF=dj0*{r+trJz1R-PgkriAu^)4@5Ynq^>BR;n z;{p5fayy91>(ji5Uekhvgy*AE0dtw9%ud{VRR>)x#8xTyoEIK~6dOoNkk^YMEvTXG zv0I#QbCdmM!#5bLK$f=#toWVIeStD|#Yf}Q^^qe!WM`K*EPo<7BBXCw%slgHu3Rl# zfjGvEwnW;KkZWIuy#mRRF?5=c93>=|M>X^ekLEhL<7X7j7 zG~JDx!HOdFZV4hC_bHa4W+|8!F>lK>t400z(&p-*vqzj&pes7`ljrLuCH$6rjLRmi zV2JK-UBZnp;g(LrW;7Bu!Upm4@G{4i@SKMjd(`B^pQ%h$zf@NmAXe^eJBJSQ8HepR zVH4STqK#i)PxsbR_Ny#Jq;D(C--OsY#i5_AoMUWV5~E!PT+F>Gk|N(O0+z7; zskzO>+Y|e7=xJ{GacF7r6zztLyVI4`NEQ~b&*3+m7$h4!7ZxF(`UX3=2{q}Uy9dgr6J__h4FkxUQa?k4}8g*EhB?56R+|4w5{K7fTa|>zhj14j!Pm9 z@m!!jxZ?&6ulz!Lq(S+^@9y0zk`E4<++uF92|~w+Q&O`Mu(Mok@FotP=}V3avePHR zpDU_XsSs2ZKw~?iWfte|F4`AvA88GSZclg;4C^;A0A`Qo*+SK9;hqf}^QmYn2uZe# zF3Yt0tQ~YOuREfGlRaH086M~Ihq|xVF_Axsz6?hFDh*_?a=996t=(Z(Ogsatm*9n} z(D*{vQ0=WL6iXoKo6zZ#2pS}YGT)|;b&^=jLJO?)Qur1EQgQW-ec{%8R?D>%qS<;i zY0&x>Ak&iZ6sL2XEVLat`6L}6NNKdhfT0>QFcq&Sf*geeGE;Ai_k?qGfq!$9m_ty@ zhQvvj15Vgp->iX|?tQH79s(``=eyd~pIZa35(NhJS6iwz)l0ue=2}dp?HtQ@(rsj0Y(4fZtRP( zh2F7L9w-FmWuM~`Lk8ZUu63*K$+NPG!b6)la3&Jfw^`dIoI-JJ#&Idt-1DsDHW_rO zXWXY}>jfSdwph&}A2fx^w(;?)TrGi4y^UuiPVS4Uu*X0o5zD+T2PMgnpLv$w2c&E# z!PUV21(`qVjv5W`-YOtGyxBA);L5hEgLq27QGN(rij&1@N)BmCXkJ>SU8E+)>qSU4>xmu2{by<8g5fC492V zYh?+~q2p^3{Do$Rw^t5`KOQf@rwx~6e~=#C4roM51Yv1o2rI#v&RII=Bb(JM5r8Ts zEuzxiiPHW`v|N2(1P}koWplGsGDQXwn#~=aFM0G$0o0*ExkVws9ti#om)cWWtZDihr3Qz)zqD;eyKvLkAHJ5p}v$- z-I9@C39l)#D-ajC;cRM9szFOzQ`k@Kc-}LcpOWvUS2XxrZ1Gzy%lrvaVHDy5?0(WY z9SPsmtol_tXK@*I#DXBZXeMDEO43^4TZ)6*ezEZAY$X#nMwxVDO3jFfH+%Fn$39J( z6(Bz*`GPx06?n!e@p^l3966cX#7fth=@H?HjC%8^Qb_Q#(bqfo-;pbo4d7$VGd9i4)!5 zDTYD!(uX*NTEM4?qwgs>(-(ebCj*{@CFyT>HtcgwqOu+%T(bhvNeK9~;pGh@tx=MP z)PGVE@Q7^ncj<G57=d9SNx@*aK3zUJkIVBEeR14m?`xx|HojwC~oHa`{;Ws~^g! z^br+8>ga2?2@Q#1YN6l!#h^=e6z(7U2rogHa(G(|Mq?*IQ#16zp^k+zL5qsW7>0{kfd5n!vAV$^Rx{%D)HCf*2rf)^j}m(%XoG@v8o z%DH&;(9m!ieE92rP1F8g8gk57Fa@qCY!8lw1iEWObPo6%)bcB-g(6zX|92{ms z%BI+@=bUxgB}x_aQD7a&+fgpI=9697#So74th>7Hy_6x<5RwmkF^fq+TGCbgdwAv~ z`+g-u(LvCU%vqm>RTP5H$dInUYkg8Q+}RH==S7bH=Dd8z2Og?1*{UfS!J|A7uHvjI}p@&>$5bp_T zo7P{}gcN58^F87ChJ2r#AysLZJcpYL+L*vnf$y1WpZwfK$WhselNekgZwba+qOKCJKetBUo_Jv&^2AajD-2Ce;Ty@k%jr+H)yf{8*1}^ z&no<1!Z`o_)c^Dt{->Rfk)HKm3*$)IVzVK3&(xSRMOrC*uLEC(v%MGB)%q3mw+qNCNQyWx2~el0J; zeYYGPXMBI^bbUAGpUuCYFT$nN8&p^GR8Ci`Y{+vUZfPtf!S=^1FD}+pe0#MJ5PG$C zO*~bvb=X`Vy??8y)~KMV>QzHd21awi8EwTa-ghY=8?hdoV|Cvy|s1g zu=UiQy?!k*N?NV@`V)oZ?4!UC2bj1lE$HM)sG3!%weoG<-H?3!)NqCvh)@NG#!^|| zbi{G~gyk)KPQ>3(aZcNRkp<`Lb(NiVh|oZL#;SV8OuJk^5{8oANM`d?d!z{x!AMac zy!kv%oCz9$6~Cat{Owmz)p@DYEd_Gvgcv`aByu_9d3l|mnz^=EfjS{f^5+c5T#iU$ zT74$xMWIx;`;$uv@oh>+KvXC2D_$Z+Y&wD%vN_PeCqIVf#q&Yj$T^u z?K~i@Nk_yusDAC7aPdC-z&b>{EZFo(W*d+cu8*4KX zOY$Xm^b#MmJlf+u;S^sUvi3iPGAw@&U&pRK(9GBP)FeEm!$B9ni`{UA6@_7FnjPYiU%g0L5D5`1u@Z&^ttv!)hZ8kj{h z)U0#QMKrTqv(=ZslCQ9#A{FDX+PXl(7~7;T3Tcf}2OR8566VOzq#)Rjq(lk&M*y+ z#8aBqR(U^eOdyqH$}ILTT?S5!2;6tdP{e4m za^)FLeTjE+P0PF#1T!e8LI zI~lTWF1lx1LSk5nQxMf?gzUpi#&BsvuoX%jpEGpo>8In&jm_`o!+?UR4?Zbw)-?r< zop*V;BCm&~{lZ`$TokYtXTvtU8;ps4L9YiVyj-cyjRF@RE7@t5Ws0XIZXlni6jkeM z>+L&EYxgX^q93cG&hSLW!%&%;KXTGOqE951qoE^K@B; zE(etVzPk$onZ#dLrJH336SmiP&CSGLcUe+o&0JasTnB$y^i$sEn1{=gaerrVMo+wKecerEtlm_LXCa ziF6(nl(;;U$csR+)2xnbe!8Ic!5Ttw0rAYRb~km5Fks6SYaNZkrFRnEqvP~fT2PWe zE|;?N;!~Fy$FGI8=XhBwN75!w zb~r(F3#lY`Ptg-W1!A@9e_Ng70$j5AJdqmTC(6c ze5ap)4i|S0SHFH@v}oRoj*K0>04SClHFsZM@?YQ`YL33XQN0W_&on_ru094X5;FD> z5s6j>!Y3^DzPK*etdYN(ng!SPxJLJC^*(+i=fdlvp4fP+TuYTb;pxsqEwl=%pDlQ7 z6!fAU)HROw;`+a-pchzz*;o*tIRNZslPnK*U{4c1s1mDt3MIbPT75QpHnKnV-xSJ1 z8+_YxtG{j{aBa_hnZA24Gs*+vSWOC4(-%z3lN~ZyoYk(E0ek^`D;mfCL4y52xc{%n z*GxY-aK?YjfwQtP{#$u1SW!>30nt{%ugjA52%q3 zzK6u!45v^S;r}D=Enq84wk%OIrkR=3%$#P1G&3_ZGcz+YGc%_l&CJZq%xUMpRo(OF zy`CC%{hppte~n~Wp|I{bj_~$5d#$}=El4xuyp!!`yKAj#VRc4aHEIjj(cPPgbXfBm zXy0i}-M%^)qL8w<6>k~F5@Dw5%cYfK zvKH7~7uR#Qk&x)FG&fu4T1#v%=bs-ZD=mCMcN>VgJ4o*pcD>I{6055HvUwT5ONh9r zq!$9cw0snPd@lL;UTxJyIs85io~*<5?M0kFe~5-GD$swLYEj8wTX0ip{KM4!RLmm~ zIN9G|DQxFR(U@jS(|V5Du-KCk9xFGE#ip%ZUIf{8efNV|Z>UPBirio3&1OGn9|bDY zhF5vtYo9p-Y>s8y`cd`K9s)@5jTFj5FymWUT@#cMC59EMZOr}Q=*wda%cL#DTie3b z5j#q26YlPY(V`ZKzHtFU6?3%YoL0@Nz>l0)jp^Z!B)F@x=X%etp9^aqzWS|cBIu2+ zf;w4oMVzS%yIiO42ofypV~MK~@B)<3?+MR*Y9&2#S8W@IOb8R5RPOra60t51ktAMB zf%_9DN$0nusupTr-xDPd0viuq4pt|D(^fvQeed}XyZ5GouhBCgS$~dD7feE^2I{To zb;qZ%)5{K9Sek+?2|ic|*WvFz=xHSV_|%u51_(Ba(o(o(D|-Qt(|Xj)Q2@On-+ z@5zF$Sdxcck7J%S+kw^^fRE~efbNyr1wIBD>i40%vkDVQH2A^hg176=O-V=%5kAA& z5F1qWk|#`aS~$a$nW{LF1{oEWKZOP=x-!5*DaUYY6S&PV>!QjK>qril=nQ8Wzvsgs zfzN3)Qt1<5TUOm_D>v4)`Wcb|AAbor-roP{`uN1N@ak7^x?C|&K@}qEiY7^F%=z@3 zTfr_yBDQR+G0JRRE<=PdW(A%K4zX;8M+X-6)2R?v+yc2+n;S<)TBbfG6-49CXg1&0^15YA+gB0wnA)zRF`F>aAs*6x@objUF`maC8jEv_xO%D3( zW2Hui-_#r=w%ktIX_3Tqk#U+|?cH(ECW_6uW+azng!e^}1?2bhqw9L{A*nx>&w&(6Ca-s*zwD9p^gO>*AYL5=Q z5v(@>Yo}mJ_s)1zf+V&uiWH@*9!(7gD66g8+7LZwaDk1_N}>nC_KkhL*2KFd++E+T z3*Q?9%gS;;bOTEz6FE7DG45y0+XNk}JEiJ4uw3)kn;cJA*4;DWtx2PFmXFp5 zUAY4&2FD3XjvRHK1&H*s18qZ8pMweqvgEi-uA>NmBqjA4#?ADR%=h}B2e)lDw-B#4 zt%|?nMJP>>nNOp@Ut&AyPzhj6&fN+Sj_YeRUNUXK8(N(O_UNo71h!yv{bHdvx@;{! zNP}??^?W#HxHM!A6&q<;(Mf&+A1M$D77|}?8qgUKnrzBiajLWKJOnvX=tuK*k@`|6+7NB*9H3^N13spDTV z0D$K>2O|d|GYd1o1LI$;)d6l803Alw|Kl0JU*$6Yi5bA(m0;xfQ-TrTYw_pS{tv0Z zAD8(b2_}Gl``;m$7B$afP}|Wyw*e|mB48`hyZfCa!V8=8c;IC6DigIdIFxk;Bw*rL zaRn6bH?J}07O9n+ip+k*CmruE8@5j~Dm&Y@(2%v|x4bWx=g*nseCqf2lYF0z-XHcP zEd;v0E8Lu;w6jldlP131`94V~(XA;DDxpI#l`YHH?0no_ltI0*|60Jmvcmsp>-Op4 z)B$ay0zyd9uL0l6zBEce1~)oPSGS-@V2#!>@{2rHy?vp?=WDVRhqL>=2%LH2(B?-t zwCrUxn#E9QVH6X-0s?GmCA?FPD6m_a8+{VF$6$`bgQrfsVI#rvix&qQyVgj*4*62O zLrJ9}5pC72C;gr*wIIvkX0Z^PQMh3?C#phT7RPtx+H5fPgrKag-2$e#SC zzR~q_cwUk%`I~sEqHc z4YSMwFA|D)LGJP6QEnzX%98jDsm;Fb&n4Ea6XDK+r(YHoY*bWBwjDUC9+;bb`;8h) z=ZAJO5Y3W!eeM0{_@cG@m*XXn2jIoHaYvxF82em zdV{h%zjN(jLvWT*uUDV>r`I5_+34B)u}_m&2H1`Cc90{uUMY<0tPa`t8D4fEtXiR! z+fzT3_I^Q?8m@#wi`g`!6Z`h0Z#jwbF{nuULzy=;X8L_Fh*%)jNR~?NmQRV48(j&^ zB_XBtWA=>O;b9VO6wb;Q)dU3DWT{rya+r&cPFwe~n;X3*ot^IJItO??tB4MI%c*?e z3)i+NsPq?u2gqn<>?*}3!_x^B3*`o|ma?f(B80;5i&0e03u@sBU{KR-_1VKTpZE09 z?+CfOx!@~8(@)%I53=9^xnf9yF7y_QX;QWzD4M%=b(P1_$5ZuY9_@r5stgUUdi5$o zeQDCY6bOX$L`*^qqwvEMgHy={^LN%mj03rjvQQr}jLC8DM63%FLHwMK}+wwn_d;N5Bc-qw<5 zE?!`hZ!(g(M6FJl6Xlb>Q4u$nkBSWxd~rzLJ|uU8Fn zo!=*Ki2$MDjaEyBD*eVYM>irY6p6O`BjR`pg~q&zDH=7uWEPnL?r2TBnKFA5E``LU z7t}-WBLCY55dL%mje`!NSu&1WX`iHP#)jkr9KrTd1d5U&bsLSag_x|^UQ)YoetgfX zrWp$pANh6Jtn;EjdlGYTAq-@(Yq9=nPzeiDnCNT2_-ZE!7ZG*D{c?HkS-@E+iv(tY z%XBt2w4_jSu}(e|OndvyH#kB$V;9fv%0M4M)C%Vd=0r*9&@W6feCVQ9JlzJ`eE~os z8W2R9)Cn-TJ6kxjQ-P+#)R=R0L-ct|Ltbv`1_-^=dd?r1F#L>!0J$PG!*r|rK>SC1 z6M}0O3yaC=BeIq-@J{8DBMg3|cU=2}3|n1BjB0u|H0#I^=h_qy0?SJ&+h;V|`xcfn z5U$&NBRx0*1M7z%1bxZl{fuQH4j4-&DTM}m8#V^)opnY>llSD`)kMI<@_x;vYC+#m z7LT9&#pj#G`pG>X%3eG&a1lcI=LT)fj@O-z?W_h&Suok!;)0rKq6BGYkgL*ROJW%& z`p5+Ro zKXJobSx%sf+qm(><1g0oix)bsVbmona2Ja4C5iYjL_j*9`VjLgRc?iO{bg;qq+FF zf#_F{CDq3*HgSR?4MUH-RslHr#;++W`AaM9Y_7-Hx!wfZu4L@g#x&S*KJz+CmC6x` zRg%uy+&YOmQL<9^#N!W3H9;ONf2K7)PX& zGz>}L#SP+ejsvu1wHjO;FS%UGEWY}ST;d)be(fV`XeLXkHHka;*6&85${=3Q@5I6$ zq9Fo{p^4jy*^u0uQASPTzMNMrH(!B@h0gSAXVhsILK<%Ean-&$#GqEnN10>EZVZfR zu^U@-i#j1i&(mTfcBb7)#9F)v_rZ&D@W#TKR}e$uRM4UCzKr;`5RQE5zn&nt}_jc zRiSx!f2SbWfB&g#dcd3O<2D((eZSl3XrXWF^)_IqC!(pBA@HRaSyjzM!_D23n%5Lt zS6g-l%+9E4qO?L z;5%OQ7)Nqz@WOb&?j?B@!E5}>gAVEC=Dy=f7SjUL!nT2D-gi z(cVX^V#oQ`o_m2$xNN6~`<8WFFL9Tk&|TzfwD=3pqvKcGA%X8n3Ym7V9Wk{9ZW6=N zOf_VW(h!xHYM*IHUlshGudqrS*TT`Cpd}raL&epP;Az#I(wTU;f7#gEW*vF6s(rOf zhQP7JByiV6PQ~O>lJDfXi2r`bP+ftZs3Hdr|~ZuIzZS64Q|jNY>JeY+Ig#7aarj%rr60 zK56QMf?Hp@TG+L$v;}hN*|QQRXn(A19`XsSJQn*lN8*^&(X|qiU}*NLFI;*VC9obz zjLXfatZP`c3uv?s<<$j++5}8$?02=I(AtfDKmEvA_W5y`lX~syRnr`52H)Ah2ySio z-B|K!?cG38p3Lega+4$)pL7J?hoR6$k#HrURcQ6cynctc;;SZ^T@w+@cPV{Jj@7X( z(E+;63wFm?m0P~vG%KsWhE@M8iSqX##b3ZG1^}V}80r0&fmN)u#%@l=Hb#G-sy}rn z|59uckoW)dvD3e|entR*VqszeSc(*Zi zX|y_3V{P_t zzWI%^dxYvd<-WYtWjm#d^YL`m`eQv4A=->@V}tG3(z zf8^=R`+n~|RS-%mNkgVus#>y|*K<*a$I?ZWkj^yB6U8h?lDoM?%_s(x$!nUbnKofI zTLaZE`qH_}H|lxaC+L9xd0MzC?(hak1UF=W$IK))=EAK5W!3;xCDQ?v=FXv9)|57! zEvDrZZQ4$NxlPfu+b#qiK_9HZ991bVIq9U!GHIyI1T7>f<)fFu z*sZX?E5GpDm*LUZ=*ut~iDmo~N{k=aD&M_lMq{rt1_VEF7>nmP}YAf4EgaLPgAhb*WGo=0c7xXBCziIjDx{iQ?;@pN zh3{>R`&O?zlx$UqZJ1YS)sXHj8YBN@+pjMkWK@*VB2(R>u|_%SmasiVIj)lKqDvu3 z#T6H7dw~b1c}Y$fRl^WDP@8D@rCy(EbcvL{Tp+O0E~MnJX{%2zUD;B`dd6Loov*Y0 zv!K{?qv<9zYFPdfjVJ?K zFCe}GcGVgO)wbz@*n%h-H`mc$@1!{P>`24o+SbD{93ee?QF89Zof+%V_wHs(?2vjB zVRiJx#+OfioW0Tca6b1@jQikmkWcPz zKBStP!87`kYNB3`6sNxuC1?VKvI29u`$T(b=uvd6EufaEJAQ6VMq6c4yqHI0zpo(` zCWHCLpL~?p7+F{04W`AC49h*>0S)=fp489m8H{%?x+CbO&c= z3La{X1Pbbv2HrtsN$YP3RhKIfLUV|Ml>w-#=RGj6w}#-sFCT*7q8d)U#$@O`6L;yd zbKx100tQ*9ktfMagz%y}$?_nf9&{mU~}cBViC?3viJl z<*&$7_jz8OXUh@nrn5noN8>6^JZi&uD)Ak6h!Yug@0?3EcDA>* zRJwg*CV)#-s~6XO&}!F%=f3F`I;!I4r|L~YfV;Ez<2hX+w}u{OSyA9vhE@)e`8f5L z#`o^hML@%Wr;6RT=Gfc-97^QWT zg#Ds82#QnBd^ksyrR%qiM^=bu+E%Q8Skh4>_I zB%|;tz3}Phu~^7cK+J&C0QBSXee@9l3hA3v6d8~VTZ)|j+N`_0kO<-x`ngqI>}AQc zlXRP)M1732)r8l;8h?I3&R&mea}*fgE;lzgv&-kr!H@e8^Y5!TO!B3p^lk&(9{rRc z}B%lqJ*4|7Ci} z`On4Bzn4?|LwX3vj+j|l0A|?C%ybNl9DmA@1JWbF;C~0@{Qp6aoRyY=f!5Jl-@%F2 z&eq(<$=Kn4B1it0wnzVYnF#0K>wIKl{_`*KZwcx@Km9)t)Xa>mf9t4Ox8}z-)F1$qYX*RwNCe{mwicf(mF;h`#T0s zx+N#0n`QCV8H1Ys;?tmPrfrVbAA005s@Sy_U1zrzIXv3_h1U$dV^D=BvV#>dedad`6&PSd?-ubsf^E|~Wq zr67j9%PB!J8V#d=Jy%Xh&p5p8GSh1BbFjYJ+gu0qJ0%kYuo1iExBhq0aV6M#KneYZ z77`<<)#0=LD;eTR20DtkNTM0CT>pRu+`CX zZCF9kcAsZ$l+Sl#0c#x@j&>Eg7V0Pe^h~Ki;sGyglyH%YhrV z{2rWCefed1Kk1rw^c;5ypqBNqmq3mo%`e^F_m9q_Lx~}Ix>JEL&CTTVP;rWt)kkS% ztvfNRm@qCjmG77aKgR3X4ksb!%xC zgX5PJ*}tP<4nMg7gOVYN>qDZ^NbAkZ+3}&uwGO4U7$YvS+WM)@@ehb}n+j(24`>au zoKYw)xz9Nv+hQ~DaG|ebr3Nxt>cUxt@j1*(qA$q`?7f7E%9ciy9MGtBMf zgoJx;cwOa(I_d;~WIkr0)A1Q-XjtT{8N-`XHg*W33Amb~j3ZkbhKSH%SOtjD@DK*2 ze(K|W-P>Q_CmOU!{WaI9Zr--+ohB9%M@Ow8>_5Ousf{lIb}lSju!p0&GC^iRUZY{5 zo&v~OguIc6YAQLvio|C~{%A1`H4i#7vU#E+*#{s0cA;b|B;jKRLWN8IX+Q zBN!Kz+_0sHWu+(vzu<#dlGo^AW2WodvLKv#C$OIK>e?=R-Z%>`Tso~ffoRqb{Bof} zhRU~J{02-3TA@%#cUDx`yhTSNEhsaWQ`#Y~gB2z3+7Mlg=Y}(mawaI0nF8s{!ZC+8 zzMo7a=ezr0CBfYRN`}jTiB}cRhf-*%PSim21+<SvrB zLGBFMr$SS7N9DOx3jSmrB3ehRR2@v|ok#gzE(^EhsWD=es|1XJQuXq!p+ZpPk<t;NKa@K+tyiLy3XvGhz>e8eB6xTqgqh&-3QX#Cp{X6Em54gS zbNU?3INmGX820cXy&PKFEWd&@O8)E@+07M|WM{52Tt(nX7y=kWAoI=)h)`a-h6(V! zv~b>rjT5t>IN#eI_-fG_1%fT$zAGHJ-D>11BW%dHS_gl8B3{Hnc6j&8fA;bzUfdzfdp7)L?ZW=C zl<{b*G_8}savS5Kx=Xz3^?a;`iAv1q!>a4l0m+D=>goAsAb&$2lx$_y!m0UmseI=i zZG#+;ThXox=;u4ft_bgI?JqJLC)|iw7Dql7V-5+5RN#8;>?zoqB)A#7A}g&^Lc40E7RUn zY=f8Der#kQEsiBOJn&vI#VYc0NJP?7h(CDxy@Ebw@yy{DWqBNt@-Ke5L<)F-p*Pn2 zy2p%Gv0^!RFSHz1WIOXMBg5H8^pyIQk?0C3S>@Nw=h;(Sbbl99Sr_+KYz)?}$P&8J zMWc^l-grYtCwswSs;uM^is|JWwTZ>Y}{3K8b; z(#I_>o82(Z7(HuCU#IUuv`rgFJq;TmU;QCY=Crw#snUo{F7eMzSz0zS&}`!aL(GXQ zoA7V%1;OZ5FL{2nb?4I~PfOkHe)L-|sMRTbT)!|LNJTu;yy%LxA* zyT&iG$nd1!gx$&c=yN|U9PUEf-_zD2gsYLWNb&A}%_cY4U5W!V_9ikl>Tq$iG^&9# z6%|Vek$qz>fDgh{nVZl28k>!|mU)UFXXRU{es%3ZNQUN}Q;JUVo-@9fboAZTTZ12x zW@RXb9IP-A606M~exOB%@rP2bkwY#`Hi0?0Th~Me0&NyS;PB77g(k>-3C?8YbrVaC zZCGTECL%WrbUFr{7Ko+$35IxYTmnLwiaM}V=Dbe_Vo5NTn0qgR)RiVZg|+#;Kx}Uu zT9dqI1!8Z_UJ$n2Fh&v?MY!OnJeP78*Dyt3U?4VQS7~_4<1!d6 z9qlZr8%m(OJ7MDL&FZ`Dc?gdbC-_V+F7|3TwvvNKN7%)_CZXwFL8OHU1MhbJeezg% z-Da@kMWtL!J?GIH(uNVmF)zY((l3SCrg4TJV3 zSP%`NXs;)t5k-nQCiU)V&JEdRmy&|7{$Ae^8+(e{sryE&iWsGls@WcStJ4>iIhzxy z0`GAXwgl=PF(-LbbTeJLGf$dhiRykxAo^D3sq$$=){#T}bP}wc1Ra6qIC+al#A!3F z&;tiuiRd)1C_U4!XZ}qQ97oun)#>1B1~%h!lV1hf+9kw5wr3*Fdp*Y|CHnIi|9!x$ z)Sl3VDSC`R-KAF^k#0O)23Eni56MVLW^Kkq!ql9woOUeMfEmZ&qet3G!ym0d`qt)J`dXw4SJ9^x^ z@T{$J?0zNIvTF+rCjpZEC3Z_(OMK5EHwU)z$Phbs#(f*8yFml)eI(fp{6(Snuu^@< z@*3NHvD=T(A5R1>741@GY)cdo-ov^-uI2Y|uqEOb<&P3u109vCbx-{K5+XaFmFcxDchF#Mtl`A)o^STj z`$(H#rQ8ovIj^LR>v)2MXUoG3&!q_r<9S*fU4ZiMz~aUE5JQI{eOkC9W?o4cqF@wU z*HDLZClt_6W6^z7{eFUdRp?l_}2*XubA9_&o=fS5ahquSuwJ+(gFB(0OS5& zqHha;9vNv3Y~B7RMFr0PNUs_rpdsyFI<;Au*ytDmTJ?XF8CY3a0HB$bkps}f^}lA6 zD`u-?3t*!O3F(Cix!IW6H~_oJ$|TIpz|6=b%*Mnf%Fe+g!p6bQ!Y0fn^#9HXi?DLA zaxjW;2#5%B0LC1gf+DPff`S4foE!|COn|X4;5)k@qaa|OQ-nj17jO?=UKqd^p!)I$ zG=%|R*Z)Z0+CQuwupi7EYz%+U2&{ChfM59k|2y)}1%toGt1z=M&@pmy0{#gAZoqWx zEbN3VfLap+pzOp-$O7o@XX9XDVESJwJN;FRaQqn~OiaRn8v@!0**Mu*0MQ`|h!_Dj zK=}(W%lwaVBf=@bC@2Dm6j4CPun2N+03wK!fkWsYV+8P120_3KrvL}wTK{-m5mo_F z!9T)?QGoF;Bk4aoC@5JPGGwxkz-3^jsb>b zpdmzPAt2^-Kokcdri21H7(S+M82#G0I*`7pj7VeR@kWuLT-8~TYK!&hGjMx|N|1GL z^L}=DG@cvv`TC*z+3o$PKhQ#;)4lHHj;=Y?O0Q%4M9;=8pw7l&*tSN+hiP)~G`K$b ztoy4Mb09QUj1m9PO=(|#`=ibK_7Ol9296KyY|W%0;CXRp7$l%WY=pr!KBSC9<1bJF zTXFP!*(Mlx?sN+s=f2__>VwfZB3KDKW%Hh&%3`d<{pm$!6$!3p-4Bw(d_=~3=A+TG z>cBShfi3gWmy)M{X{A+?zt5I462IqA)FuaRy=KYeVkhazs+kc_*qdYDGklHGg1rAq zVo08t`feTE#sW&>Cir{cJy#c^2DfW&f~%zE#XQM)ZJz!+pR}HOi}HHw%TeIt1Qzc{ z9#`IxsQz+O0y4QRo8*2EdV~!n?SAx^gj$M#adL~^OQ5Wp6@SO^;&qvQN{pPb#^_^A z@(-`Z^sf=BYK+L=?*SB}^?e6nG?2^%y1TKaRk#XS>R8=qZt?{d)^qBct4| zlMVF>ThyH~a!Y{j&!7A5&Y{7RS{h_OA=t*vCbY|g6=!o&0oj)ChZW}r*U=74Ic@km>hC5mF%E`wK z(>xd(%}YhrjvixE^V_x5PjMgJymYHCKQ>9zn#~+aAkK~ACOv#N;ud!A33oAJ#YThV zi_+^b0_s7PdS%4W>^S%%&);J@AjV}$S{IsZ1SQHA$nw%|!QDCvuk}f)7tkCoz&4xN z8AKlHmkEK#RbuA^g?D>20|Y}~z)!AWAz(2+waV-%zo|iwLY@}gH0r-fjknq%NwVnE zmxt#lgGYYphtjA1_Pqp)FGr8Pmli^5-~NC@WAZ0{loN4C01szYpVEt&m?v=iTBv1K zWq;4Y#8|$x9)ChOvPS4GGQ}-bX`xh?N0g$yRqITAsu=zdOH?}w#qodwCvB|z&=eDm z`iUW~YSegf{UH4G3^Ft=DBZWcR#@D@_SzI)O%AIFRASmJ91pitj3HWd>zLUomy-d0 zp)2TH!&F~wp4&q9toJ^3zF|=cJz@dX{D6!dhzE{q;_!M82f{qWJIDTjpLu>9nPJe@ z<2FIyU)V!gnF98k09G!gAH)1o0m5?M_4&-V)B26tj(>j4`40?hAYYu6Ynl2X@Q}MP z%q_e@tYeiWyyQM52kQ6oUxbM`Fzn(xIDnDZW0l7_p`21(bQAs_Pq@GZ;YP>zd%lB!{Up*4iUjliCgc7j?UKUuU4@#4qw^#>KJI(ItR-?_KMX9 zMXARsacPfGK0viXfy+S=MRebd~tZ2oFw05!KCZq3?ez>hq=|+ceddjwp4h^C-l{Eg9r_bU~WY)&_nXn`;_Wc1>Xhs{JqI9VGl{VuWpabc9w`Ibl?llHD9| zNn+7GBWE*m@!&-8d2S|wUE3Cy(k6|*TOwVB+{)};W@!RZH&K<2!jqpdPumZzyA3S$ zCc?8(iw(&;#mVCOwCosFV73zlgT1J=$?Qgc*OCLv3r-fmBQl?#4nSuQUrr*KNc>2R z&0h=-K5NFX>adU$nsRD}4>r!B<`q?uEBeN;U^?Gv)68)8)eSJOD1cT&frN1>;*eH< z?7TZZFczeo*ZVUER(#dE6O3O7_(&llcl8G?{P5HZp;QM8$1S+dXn9c*p@BJ^Vua9_ zsrKkK|7EtqO)s;2x%RR`rg0cgjExU6Ajxf^Ntlh@hKxaaX7b}4!lHC_-T=*!2cc>8E*>xIUS>eUHrE!$!q90~`yT1~C!QL&SdE)z%dUg*b85$rlAL$5xZY z-TlBhPX4bJP@wYMcn%z2F}fD~<6yh3&$sXpbWMcqxx^;%#*cJGVHv(B%Qx%R<)&2|qr5?15cpdzV6}lsr_Alu2Pjz2!VI30v3!Rwzx1VsZSQ4Z<9P*#Eu+ zrmJ1~#?hr~o!+H`k(UrTN1=6uK5~7vG{zJtbYQVaj%0uJEiB={$m{M9VRh%=wYVW=BoR-~ zLVd?wo>xSU-f73Y?hzd(!MT`q=gxWU%{Uqz)JB1G_M4y01mD^rADgqrog9M-g;Y{u zP&np-)PYz1Wbu2tdIPFs?&lcdcsVue{$N647#@_O@t9l@&9a zCUjlK``F0Z67W*$ECs{TR>A;2<50*B;iD zIhV?E6b%a`nRS9t4XTiE5?%J%*D1d(jvA0=rk%crYPM%3k z=2ets4&Z-7ef$()i^NUJF|b~fFsYq$kdBPTozfZ=3Hd@%siP4$08ZlO?X7{~jBkpA z7<2Z#3$Nqxp#n1)5@m;FA4JTl1V^9Ao1V8GQ`SJS~8rns#UX6v= zgK~)*+;foyf01svB9k)nxv0s7g>vcWx#BaK<+84yFBU#nMA*gTgu45`%xgf;m(MJA z#%WL^o#4X6>f&1De^1!g6SL_tGTUa&Ki;90>I8EduVtNKK3 zCLcX0cu9It5Phg96YnSJEWQCtci-zr5xg|srL-14x#QFF@*bF34=rPsihQMh{rnyN zE76kStwwV|J;o`S9F4{Y_9?^-Mg+c6i0(&g2s$(z3$8A|YKg_cYly6{qzpgwmDN=o zIypCqOkz~fk(`INF~+(`83F5KTZ}E(!7|ARWj;Kk1%9z8q;JO!46FlPAd`lS6nFAb z{5f!k)8~_mn#JL0 zg+L>Xm}vHk3@^AB##Gcw4^msgpP9B1M1!1`Atc-}oiA@;#i~drvP1o?rpcY#SMW^Y z^w`6VvYl-Gl6Cp$pbzhi@hVmRC4xc%DGil(7|#5tu>SJuzA8M~9;~`k;+e!$Tl-l4 zh^_u}Hpsh-8xlS|rKvaxeo2>Mr|vuv#D_>5bZeF!Vhn{)kiHPc;K;vsmgRgo*e!`8 z?XaE2${R7_992-|fg$dcQQaF3XNx!~*KzrJuA$lF%5ft__sS`$J+lcm8(RE7)lp;DasRDkF?8f8^SiOSf<#5Bj>MDsInWBc^N{ZIj)(>m zZ0#NUsj4KWX4j85%D}5Aq)R!7@rX@=WE=8PGRF=|)1eLN?c*9&C12SC6KolXgBTfbMit^*dpl177 zHq{v&Enu0et2in-@H-A-tje+Ct3C=2U6})|g8Qm>Et;L=FPm+tm<+y0NBDHej3To( z$*t>GV~)!NI57c4YJ=nxJ{lFbcho_IkOd5$E-n z)sfyhq1dJL+SZAmGgP#|L2m4CaroR30gt0)hnFXNb($@f*;N%9jn)KQkXgcnDM8^g zi8Xc9Q=MB?(=ZBde*GKoSReT6#lF_YX>0K{o;0s+y%- zTJl8VL!5%B(+E04&dSz(nuxDRI7^=fJGAGey9Y)kz>Wu+dM~(nJYvd`MpP3X6$1E+ z!kuluTSYuQyRfd(hSYcxPbSDB90+dApI)DL&>3;HiZRn($X%6wii!6MwMzF)_vzVH z&YjE$FAX<<>eDH(1#&fmVC;nQieaUmwV36F^VVfUK4E^S zCA=7)wLIf~f5^9Fkv{Zc>^W_`%g!!{3hCT#GpMpI>@G>q4IaFa$cjQ*xN(BqU*CKV z89olhm4707&p)|?fkpK9Kil6a6c^NCn_?Z9@2M|IdCYf}l${6h;tME5KL#_9G{Srb z1`}N4`|`Z|EmsY{+oJaj9S3NNmMj7dhav*JO+h`!vVkxdeTiHQN{wEoP7H(@vJJQj zoPOWxS@qk`ugJR9_sTz294#`idlz5ZNYxH*BXrcm#9t$HuzemgiI zy2+r1s~E*bcrgj%Mn)lGjGw-?vk`;43)?Y!Ay!?u8q5ZcHH}_+xgE$BaESC886g8| z@yfTI%VnIac?VuT4v79%^t36FheMi#@9wZohF;oTPvFQA3@`S>r|ldPPo_e?)`I0C zveS3Vn_UAgfs~L|WPBf8yJf8z&y$&A>{!uymu{oubI;~+OtqNW*Fv_!{@}L(M-=yp zQeGHP@2*={*2qoE!^KA#r(n`N_{NNR15XKR(|rMt8V7$Mg6FJ3Q8^}zo5q!NJeSDL z#PO52+!PeWA@oA7?6V7gM>8@6+1N1l1T(6MY!7EYPKhw)L7JSqVl=#caUmf6)oR*6 z=-uiD?I-{PW8L&r1h9f!UCQp^`U6*5rv{i;~+_o*k@0J36;Udl=(gm+$;+W0|S zEtHwmS8<@x(>OFQJ!xtfJVRCpsc>bwZ=bDlxJN)sZfx1^ePy+W=}L^szD!3u%6v68OOSqS|dV=xWV zoGZl+E3M7_8hirIGrqyD%!f{K6?$rWs=U3k{6-CfJ+ZWjBL!ES`bx0Qg2< z_cXA)$Wc(sKXDR#ccy=Rzz0{O;W8^flpt=Th% z-_OLea>>VMx#gYyFf<88m&af>+d9e+dEuEnrX$B?gke%K+WTm0y{m|udv8p|b8WaS zjX<#hOpJOvk2m_mn|F(n1{t@OA9MX)b2TwrZKQP+8IVEd1-g;DCQE(BeWJ@hUv}?Q z>)K>G$@-a*_hq|hj@z<}4(Ml0Y!%Ux7lc~jtX3RmsDxAJYcJ|FL}L7M%K98xyu&z2 z;Y-;26Hi@pqSQy#=>^zfa5c9ht!x}Qr?Fc#!rK5>FP#sDD7cQUNn8yoyf*}PR=9AO z-s0k;!~UWa$Y{5Q$Jmp{3pGr|NuWM#7=h--O>7j6wS>5~{s#Qc++X{|C;DLFD+7mD zq2Hx!^Ei60y6v0DHqHi2hJCqu$uCt zaPEt=jRC(v<-$o%**5ZQ(nk9iC~8pMH||mbYNKT<&B&0Bm%T(E9pp)f!w!Rw1}$X8 zAL|rIkdA@HoyqXyAV>wnIBCnlgH@Gdq)Nb~94Jw=&aZ=#Ar;u6L1Zcf-n$>c^AG-R zoiJ66YV#Xkt~Sg`1qX>#R8V{r*nxVs;Mw`SVaEzw(8V=H*w;AUI-@Q0cUclfX*<)> zPFGHF8#rU&u_hPcn=A@c`JU0PZUJzFj8(HdFy)c%P%M@g-girW8E<9$?c>DS?S8t} z<e zUwygQ zLUn;qE||ikoyflK`o%dF&b7#L&F(kD8VF^2*NjrAQ1WR}X2mo$*eRMQ&7+??k9{K& zi3TTAD|S8m;nKNiRD}QSV8(vuW>6U=daI6DkrENiCK=_99%qe34j@np&SPb zf7jEXR)R|HKw7SmsrjHfT$IUv(9mV&KVkILra?=wS*r@y3#>?ayit8|RrKLW>MH-+ zysm4tW1B0LnyW7Ol>x;mh%jm|2hX46`=<9t+yJG&_&_a^B(_XNz9K9311LiW0TTNy z!~`=YEx|$epsR?|mxEODYG1wrxA< z*tR>iZQHi}#@CweY5pTTl2oTH8gX$_;qL*PDv+M=$Sk z+4E$b${zqukkhTGdYmLVmd)p8h~agh(}!MfQ|Yk6tFP=f_{2ZenE%YO@Nd(YEDZlz zfaD)F=KuSv|8*J6$n-Bk4zIMO6LC3_x?gI|(J?WH&6CT`()%uXpm0(k1EJtqAguc* z46aN@j(dAfl$^VY63$tf0U@h(fQrfvrsVNdCM6AF&v4%!65LL*J@2CzyX`B!?@(5~ zt*&;z!(Q&yqqWE+6)~Y(u$y}QEtarN)vk#CG2w& zt39Zh^C!dfJ5Xv0^nKxb zoC@m!7`NT%;cgC_$mpW0>92MvbMh@I5Gu-|=9+P2`y2>HA&o0%^uv;uVshFwcVc4d zsNaf5CNp3QK^$F-^QkOkS>L!1(VVeT)WFP!>^4V?VHnWctPpn>@cSml?go7ZV8q_A z0|%OR@+q1dNqW@jIQT2|0_I;}G2+k|)AKcrCxF%An0*Z?fCGqh{J8W54K?kQkpC1N z%smMLlgaSVQ-2)=9n%R|vj7Kid&4$(m-@b;&DrNEA2Rr&$3Xm#j?me6PN!EBLJ6-h zPR$^6IpVajgn|^gF$+P=MVTq{c7!BF^@;8b)$_h0owNqVGzxoF!uN_>ou9M|W;EMj zP?2gb`*lKD3P`pHG1dR{ek*3jeXb_Sdqaw1gjPwHS-L|MVnhY2Z4l~z(lsz0mLisbZNYyvB{zYHPzn|m>-^ZS zpJ$rWPC}~1?v|ZnVw{{Xznhzfd3_(pV_ve0r-w#U6y!5hfbsk{dc;XQt?VjCwiyw?e7&Gp+u+D*i_MK34Q6<1^4nds0sR zImYX&*}|Y(I?#y}{95Od@VzA{C;kG)Ilf|OC(bahuyo5OVSI%ePz&Yl&A{G-y&DER zt8WifsPEL=fpT=idO!9n8lfz@dNZRS>dB=eyB?|#wW1hi5qaXd8(loS^x@3t*JKoY zo;B1ZOSS>cbfAIg%ZM#wV0XNcw@>rn*myBQCYE zxkFdwmJx3t$v>Am1}=l!w#w)d{_!_ij}OqDhKq!#^Kip3*Hbr>H$ zr1r|zw`|~yrKY-F8&309$in+2O;<(IA9v=afM_IaqJ9Mp#xvD9X2^-10H@Ldp@W6O z-h#`LpS0Enh3PX>8x)=)a`7!j@^8Mlh&@Ibjvpt->vYw!#N1D~YxzUtS2%mXC}C34 z(8#whO(QT$qT9zm2*cJEZ=)g~>a;O8=1Av*aMDP~ ztqVIGR+*Bh?Kv-$r0QRnTbi^Cv-X^wyMqxEdswvkvq9HCgw~t)+1Ml^N~xsmKIr_k zybwJpDELvg92#lY(unjDppT&?y1dRclLECl6b`|u3A^839^{>5Ch?$+%2nrqTLM>~ zGbG&X(*P&YaUpU-(NU9{vGYj$h$Ba7?EO&68@v{}zr+FZrSozn+23RBCr&kymGarD zflF+GP}s0Q==#xHRwSc-1PO364aCDnak(vj2gN-RXbR0p=m{E_By!SjGux^VE#9f% zkoXANJhwS!fKiem5!zbWWX7!?dJGL2dAgDj@lc)(Xdq)LUB?S`#cy=wE_31xvpFFV zR%YXtS_v<|G#^u^9ymyJb10NVS5J|cKs}s>{HXv__4qAQHE~!MYt^N7)0$S#s90Yr zPqGe|sa$a{=PSNvTL$Z1-g*cHt2dgo%!Yzd_^AF{51)xGLxfc4JvU2yn8Z`(;%1mo zf;b1z+1%uS?drsSQWz$m_$Dg-m`h|s0mfNw@MniR?X`UR{fY1dPD=Bb%GzD?0AFxo znTER%10$i_mkDMf9~X1}r52f#QZ0WXeafgULD{(6oV)aIk_xMz+<9sid?WF~|^`rbn7dLpPjyhkq0lfCFF(q2NxECYn} zRf#v!lw7C01^annbz~_H|1c;1qlrT<6{ZyfNy&Edcm+Vi3lq`BD1oeBL)lFs;#XCS z9mL3w7o|XDOEVh8w4R~d97+0=ARc>=ac6ndpghbS?hco3yhX?w<`Tv?Bi-_IKFf=W z5EfbmIfl%j`N)6oU0yg7xo;RPE8W5HvPsoKS##}NK^&Y*eGg#*SCy?#tAG!R-)wRJ zEvr+u5d+Y08W(wiOz31w*${7y$%tQy24~;<`eB12*0-Wjq{A6=0fFhzR?iS|Aocrq zNnE=;UigdV!Vm*f<$$`h8rSBjN{F$MG}Rs)oV2F29`mRlUI{mIN|z<#0dK7y`)P+> zQ@{AjPc@s&nC^b^#|-V4E;8>Q;w|n2il=bo>?>z@+fHSffDGNZSum%8FYlJW9-~IY zv3XCd6PR~v1rMopYsT-3TX6r{6Uh~HTdgUiJ4?d9mXt`>*t zCF9yW-gk{XQZ+PeyQW+V>1w|oJMQR>UufN)TNUO;NF!{^n%;Juhmo1H(_E#TODv81 zE0aZ|-PiUz{K?3g{Ry^R7qg|#Sf5QK?!TDdSM$}Fjax3XBco|gEvt#?Z*Q+)O`3Yjnt-fLgbz>u#iP{2k`&z5dhHIn zMQL_!D>kXixYD9)=(4M7RcK-6)$b8nZB?i}@oqqFX*5`WX!^$xiG)bPfSCsxZ;F7y za{08;;BeN~@R7dp6GNI6ar>W&qJQQ_{x^!Ee~keDKSj|$!Vdmx@y5i+!SOFG-ZZ6S zH$@Qt_6acvK|}eMRK7>6QoArQBX1I2K?Q(<0z)8+^auOSs6DS5#ctSc06YZ%MxMhp zK8pvH=e4rQ!#k-#!c9enGW8xGwl7Py+h2e7PJAm{@m)LKU!T9OD^b)$mcHx&Utckr z<#{TPIo2kL_v@MGf3~hePwbkOUuWMYPZ~LMuih?oKh?K`Qtfx-T6rxmZC3}-sjs2+|7rwqHD4u;C6_3A7!h78ZNYxb~k*niFr5$k-A@5uM`O z&AR0^42Tl!>_72C@My)H6Rcqb#j%B9gX&({c<>jsvhi82_+6f^s4y3UQyqOT1rNb_ z3Dez=OvuLFl2bJF#ev>TbsB&A63vrIP0yD*mV2}D+&&LUTpqXj7j!DCx=eMm3aeAj zYIq3c$|%UW3Ughc(g3>Aj?Lg?Lj9>a=I8Y2)E>uudz39Y$q`w9em;}!+;)>k)_x`9 zScr1wQ%|(AwQTMeSUI$@11U7@DPp`r6mOAp;c@9BXq8IudrcQ;{!~2D3gCC? zd3qFZsEwJ4#rOFx4v}qx-lwRmZ8C&kw$P`hD@>*L5?iWjJ%ygd&|&I(mR)TdYXrXc zZc}#-TKjR4P%wyU)P2S$r)%09EocJ%6b#n}?GQp8>v0P`H#L0h;pSI3BR7F_$9EFh zhz%)t)Ym_bm7iG!T9t{~OV|Gx_79sLdcFM6xnTm0x-CpQcOJzuMInj< zqsg6RsetL%C@iWfA^31rfb1k^`9^0LD>UD9zWKn4nm>%7vYJ)g@%2<5MK{3|r0hdH z_x0UT;DR8=;lVKfPk1|yOEViXb#nz}+CCWdn2$Fid@>#TBUE1hM#b$$o_9%~cd_n>)>po3xi<<5;jMV`h8f_jdm+3>Tw2nu4 zqgeaSjyh552x%9%-8Pxj&KcJNZQ=ey?}#Y8Vid78x}vDS7Eg7#vkOfQ%<&V>bZ*bz>WiIkvk9q~l?xSh0l5{<;%9 zUkV-bc_Nrm8A3o1uTl$tAR8`gy20BOGN2SU$Rfg>l%L12$Qs~LBX$NE;)fug6wrs^ z;C&!fI2S?qED|25W97{`28drp5tbO;2Ax8gPC;|#hzaed_=SKRc5#0g!+X+ZER(Yj z*%k;mO1e@!0J*EUGB)cj2vSt$pUM{E5}M8Ul*i`h2Wy$&Beas@ z|6r$u<8KHda|=aYqeLn#HeVBP39zmAq3{e>M|sXbW;xjN!83l-L1m{FsbTD}b(Frv zHcHyN)V?25^8r;aVUV6{)+GiX6BRe==is1y@fKNt!j8YWEDfMBNbfE8J0B)k9TU3v z0BbY9G7M_v3%zx2_|u6WxioJsMP=za6zOTr52*kg6-3OhA251SwPSMw4RMvvhK_pvd%;!OZE&KkK;xMrkitxkOZT5+=*UT%!-eLU z9!pNAp1ZRP3g}c(1I@Cn;HT`K0_cRqa&DQVYH+H4^MhW$`!|CEf%O+T%ap4)T33^G z+%gPFGb#B~`Zx1R%}V z^Ae92l_a+4WR7B6L0zO$nF%U`)0+zDW6<`(o(pb|@l6KgaZxkvw#X6*nvj65UQMs6 zW2LJrZ!38LjvpelLjgCAA`nR41|#W3jesvw37k`EH#sS-sKBl(8ExxkIL0!~5vC0| zQQE+Wer*2t%V7&OYv*KI*7bN10x+y`SeFsDV<}1Ca>#5ODn<^bly;*vypdH~+LUKYWY7jJEVS=~&}IJ)82?dlpMG_vT=g(%6GLyI-PCW%DN0oq`yQhJ04H|-7hStUFFToM^7Zo{K<$EF&P@c z!fXPoe0b=LmaWkjRs!({bMGCsNPU08_QS6=C+Xfqzleg^H#UX0Nh7fKrZk#-Hb^>b zr1@xOCKaAd(Q|{H&8_k~%5Dmk>&Y4j9Ey5qBN}%d1co|BfUG7YIVS5U`_-}7(Z3Fc zKncM1>TICmM1oJ6R_MD*o$Ap`9GUNG3?e>kyu$;^&yR9k>gnt2%UlFkjRrufZ3EzM zdyoXv@j!DyE0#;6?e|O^w{S8w?f_BHWJ0)u!Ox~BK&AtW>TMUZPg>Grv**zHYHuyc z8)wImfCeO1pD%4sTHNE-n^EP^9rvLfD^^Yw8|Lt^QV)~byPE*>_u_WS1|54y5UFT-4lo=l{ z&jOp_1KZ#qSS-q?4}VFN8MuNBfIN31NM3qM!wR}QJ0GtJn~ZW56QTWy`sagn zj~KH;C~WWc`fKW>o-)h5sGqC1t0MbLu6*>B`Q>X} z1z79?Sixcdz9$qasc(PSuVO7F@gl!_FGP6LULtej;-X%^6^e_ds-npohq}^Xmb*B4 zDEAY>GDutjbTsXj+(>Tj2e`fTpMd0%7|op+ipZahu5gO?;slN_E5Xo3KLuo68A;9e z?n*0SRgxz#YNuE0`@oa>hVhd;dR=`J;0z#@nM(fn5F(E4>l%4%S|Nz`=Yq9sE0e6C z49jBzvXT+iMRyCCZv*DV6<#lqeTbsO37Ky-R3A^z8B0EpIT!u=CJ{GC9f3Gz#~MsH z@svEGz`XfY2%YOX?twxI%BZl3ZmgN~&h_CjxfPCxTO__P-oP@Pjq>`I84iw1ag6Q& zOJY7uDHr%$akhhy+MWl_LsT95C|=y=RMLdIbMS?(SB_grUx>GG*FGI*$CnT)vC42{ z-mVX^nfTyM1f<_EgxDW8Qs-6hvmN@xp3JCx_tEogLZwf$RX)q>%f}-{e`*~VZ3wyl z23r*#v~6(tqx2)fzU=G7H-WszOD%FdxJBaXeA4BIXjPdzT;CKa0NOyIc2dw14Z&pLw^JsS z*~7E3W)AmNrmIsrSdiJLn57LWWFGyUT9TqldeVSdwMFaP>%xV>Rr^_8yJUi+LWNRB zKc@6!vaV2|-fiRAtNFhwhS(dWwK5~!g88)A-Zxi9`bUT+ZEo^M_^_vo4aK{kurang z;qE?C9|A^N*hboPs8anb+l1* zqu0eq00U#rJt;rz6)^_6rQk0xJ9QGAdid>uW-CcJWr&&Pp9J3qBgR_@mAUXOGug9A ziQoPr>MFc=OLIGo+(Ua)aJSQrsH?#h04)aZhJXSvX6uuHW`D*-794ZgJGuCO7`yFh zD;)A-X>rsTXX)|aOKqBt(#YuX{mg(qX@f;SNhriDo|q2_%b;yak1Tc=HBU#707nU1>bGumg_HHUJP9M>P zR{MKnWz{oRA|oY&^_Z*3o#e|95ZRA~m!m|jp8bMd3CJ33lg>m%iyGBEBbZ8V$S9%F zJleKFgX$%|XS?<&ldVQ4MAy8pnpG6+h~&t?u==h1@J4u#W*r+ju=|j9tj(mw19HulDW1z* zLZm7F8vo?$p# zd_yTBF(*Gj>d%bHoS+6WLNbpfCiz^HrUOmRb?~>;Xq0~+!-_-vLIfMBK=yUS*tp@o+e&8nPS{bLV1GmiWXrp=VaqB?(B1@HudJef{j{6e~0>3 zDoTAEX>T=I9-|Vqw{}U1Yz2B1<2hN*S~mo?%0E7mdw4*BPyWW?s!Cg|;L~F~8AW%{ zJje}iDk+KNQCv(9o|~hs zWV1dk!(OA@Br0J6bBAbV8$NVdL?Y@o?)PJ^@-JI69oQ(FrVeh>40TW1`sB^bB)V@p zHpe&ue8R|zd1G#4MM(Qs?qiLo^x4_N+uW1MX$M?c7h=+Z^-ne7BAQ?G#hycQ#aus(lRgE7w5q7Iswu=|d~KhhjHnKMvQ{Gx+g6-g1<~A4V16LF$-H76-g`u-I)R7MFf5x(F;_8&tEJlU*!PD$?B6#I#tch>hm?Risi9g4 zu@qSE-+r*ttmVYh(V=dK6Vi3J&C^R)X%K4ToU%_w*B*uiE(;!P!S*u=>vR4r!&w=cH~1x@=@C)#$_VLvbf~q#T*G-_Fx@o7S#L;>$1-hu+~z3 zsx=ir6wnj{GYik$v90}zs`Z_=$eRH4o+(M+-Ick$wN>am#V%-#Mh+bc$BLU?GV}Mf6F-cD7ScqDG4$pnmF! z+&Lv|s980`_4ztUIQFCocT~){2MTN$)H_^t`FCP7SHUxn=j@UGsMV%19PC4J`6%~a ziPRbu6doL=c&3`@&c*FI&VbJ`iCqz9)CCk<0k0f0V3v9-w>pJY4(QWswV>mG$<<8~ zJ%wv}R;T9Y-HfizTyO)LT>{JI*#_IDl=aweXAEp=I0Jd_=ts5OQJVj@)YQHOtF=Fy z>ka!kR3DpfdOV21i+e$R?U5u5dfJ7a&wrViF35; zT4Rz<;)-Y0G7axGoKU6D_P;MnDVt^tokzOZ_+<^NBRbYcrPbrq4?~~*2saz)%-B^< zQ1YqBIW%#`OAjP@qE)uTtbgVv%$h4CqvNQ9k)`aS^hHABY`CY8J5!gBAe~xKB!9sp zbA`Q5+fAWlI~w3c#FvXo8XKwoVA9KKEZ|<@Py*E1YFzfq28u)N+7i`YAE5469ofk& zF8brapP*1BG#z`~(P^Xkq?ebL!P#g|1}3Vp9Iny|LuW}tylBOlI{7GfvPtL65;(6D za#UVn;>vpnng5~4`;P7+l+;~IZhhpu`*_H-ob@Ws$onU|AX!)mx>R>$!GBS;|vy~OlW zHYMe%$^SR20U{g`GR>7yV7iH<>E)Hyv&W{3*NW!yPzjFGrFsr)8Sf_B6FOn;&9F zm73MsVtwbgjcd4P-w{y*t2x&mBFuQlj`tqDGOLzKF3YtqUfEOQB9HmDIeeAhnRF^) zJ7nf^Ju>+B8XdmVGsM$U~@_;Ut;D8ImnkpqK3dUZGrl%fxFvq zzB81qyuUZ(a7ha(u2-)sYWSYGe(ECg?J&`e)k{*A9z9I#-^K2JzrVbEr_AJHG<|-4 zcDQX$B)GeOI@a^iwIxRUJxDK8=rRTR=wj(3_3(U1iM-l>7XP&2?r?d;_tnDl)x3;R zuq97A$>Xw9*^bF?9bJUy7!6kW%T?Ts=7tfl9+sbal6Lf_wOj2z`zlpg9=N}P!2Rtp zHAp5#69zaAcB3*4LlDbN`PKDu08`ZJOAr5=#iB1ZN_HOg2XEJXLE{haT}qBA;z3TY zFxZQg?*YD;XZG+cI5DG&m;&;C+c2hSR9}eY9_0*Yr+nco+JFm5J9qnKC0&Cl5rvi! z?eBYL)hwvr({XT5&jT^W(N|_-c^{m<9F|FkS_=ARaBon1_#X8i45`9=>6cl_IEcG` z6~fIlh;?z(mF?N&+zDMiCs0SEGLXJ%ERb;26R^-ib0qkmv=oqubDMa1yC^9yB3jON zLbl+@;4JWGedJE?W;8oKWq6%tJbE_cp9KeSIoQY((_vFT2Q!`L;84te0ODk`yc(5+_V+wV@ds29jTd7IfsLTNM|6-v?0Vm6 zXzs2>ePL?ryHeblI_9`z$^`|58s7%OM1Ze&=G%*>gX2j4_URk_3|H^D}p zqZXEZ`B(*%ar4lzcO;F1Xv%_%*1X=|n)uw~_H*N5-C*R=3OJPh7s4S9A%--gwqX7P zNPk$|3AT|`1V@vQg{DW9A$fa+Xq5iYic{~5S#}E;rg#w4ZN2-Nt9lMz#kkXRjs?7p zmRO&kJS&%%5+hw*I|Xp2Bf@|rDYh$HEo)`XYGW~I6&38L@r6pd9}&r`bqB3NAeKcm zLKcbhjVc}cRaipB$4u1F<%FUr4?8Q-8nc+2_P%AUQgz87icWA(C_VkIk@OV#$$tzC zWGIp>TOcye5rx_jKdyK4tznA-nQ}&+fedEw_~NRU0X4t>f-+CzSiSb3i_v($i2+HM zWnC*D5F>Av(G&3f9?_v>pxdEZ_F<*MHso|3N=z`CGg5|9>L?JwE&kNBdXywO87nv8W?R z-@g1q*rY))#+x^xPVMISt%T|^!GaGu! zYAUWhTvhPBrfzRsaUn|G4zgS?)a=ys{^&o(-h4mbJXIo4xBR(1-#VWNRCnz5`Qy>- z-M#-a$t0RNq_X)w+CZ!(w@1hOWjBN|1mA9^fOq1#YQ3@h)#vMT?EIZGZUWlD4)UaZ zbfZx+Z1L~vkVDACHf-}$OqQuPR}wDXdlAZ(BIrz8`ELUJ^P zc>gk{-%<%akgrszT_RK+RUSh$mBB=LCaW1-7rlV@K@leKgZ2B-*TotV);4BeP-P4i zM&mAqRo^lKS4)eTqsYSfA^AsFsck*o@ByrpQ$w0v;9-;e}cod0OP*C2_-OYWC?oI&LgCNIMdzLs*>={B6lx~7iO*jG-nH53ay`;B#u;~CtOwkEZOgZrIZ*VbucLchkf|94KQ03H~1fqBGiagfEB@*9ob0T+N)pVSua-~$mWbp<_3$iiofW8s0b6@a3Uf!uBG91RSuPOq`wfYtVxyNi?b1Mvk=Dar?g@cZH~&$8|f z<@>6wcgu%+Tc6N3iR+1785!&3_ZdK&M!~4*kMi`(xb58vC1cvi?gHlUU|aPc@n%@2 zNrHLD#`hsOEsV{RdMzOLJ$CvYK`4U|lK&1JL^y#6bgto%+(VPV8%c|S8ot>0HtOeq z^0AbHqAZ(m6=ljjTq#;`$WVbdZjDv|{`LiflLn?N4ARhcBh001{mpl@#dChY+ti9O ze$a-Tq}gS~<*~SO7go%ldEG{$sc=a%+Q5E>4(`#8xG>Q}ZO2q?Dov;ou5}${f*LhXzo^yNFWdL2N z?B%M$8p%4o#td+Z{wVAD?<_0YhzBV#AZqDATgx7hB@9`T@0SXC>;f0Q>TYvo-mbz3 z!&o`M?JxPNuF`#J&vaD1b#iNgK`tutMctAu?VF6KnDiEsRt)5DEDVz?&I^OK%lg`P zE5GhGZ}`4=Fu$SsDcEYwPqYrfE&=pPL<2)PKR4RCWi-?WGxvdCC`8(3^dSNuWz>DAe+IZ zjBi5t3Uvef7>Sc=9d?DBH<84!jT0TCxPw!dQqd(7tokovtn|;&t;k4S2Nh=!)6xmb zOO{q>n{q8XOX2Bn8`!2@EI&S!HpM4GQe@ZHZzUkgd`d28I_26(qLl zA3Mod*S+pL;FDl5=@~Xot%#aj$vRMZ53OtQ5}o8o5WvG6hm7+?8#ShD?P^;K~0#2gj zRzWr#0K$>uAJAoxa<@=FmmLW~!XqC7DjkJDH3{wWJ1L@@=WD80EM$>$WohvZ0A)gV z17z!N9peO@wjI4-SC%w4(g;xs*bYc^KQh&ADsle^c8iU!Sk}XTGt{-VczoET>bUg& zY>2EF=5`WsyUh8u4nD#3elk8==XMwnM$U1HFTmy@I`w;jSJv>r7-o5$)vvca#m#IcSBowJ~~S(ZT|gxtb!ZL4S} zd!}v1>XnHWGirQj9ADQc>Wq zs>w?ByAUl<0drS|5HwqZIuDxsP2reVkY6mBJZ-Wh(PoZXNI&x1AmDbfovZ=OGNn}t z8$LCh%uHuQB>uGwfT+PA3gOC;XcXYbuEk|vH6G-gaiMfMI4>|KX9~wtNS-P{t&C+e z9Bq#2M$RFoM11GA#{q{6raImka`1xj)CIR#e~7D}%X+i_E%G3Td(JrZaSqRNb1b+d zsTnMl!0?W0QtYh>5jr-F_(NLdGmyO;s8Jyx-PW0)XXqVjAnOi1VXR<(rG68AEK z`F0D>gJQ`McJ<5_Ggdx~ZARXtzF1f`@)}jIi;sYzqF%Hf%?LuhHI$!Y#L1TqD@$2~ zWNzZAbV28}JgS!?w(ZaUOaW~$T_JTav_JSK?0rW&tL7VpY`{GbJoUwqOi7um!&&M3 zYUwbAF8U8L58q0C4T;&gRBn|M(+XZaYUu-)KX*AEgBIWsEcnO-mHZqnO=+A0Z}z^E z33^q5zVA~cbha8H%LRoGUE1mKJ)J}FhtS%7WFyON)lVNu)C|i+HtkTaTc*9yGO|!iv}P$j;3%kCp7v?S51(zdRAaBC#VOQ4*VMaUluKrgXeyc*5V2XZ6Kd+ zEnSCYaxCjVLkXxCX;c)_|#s8{;TU>9caGdq58dJTG~R70_VW|zrY#{2{^ zk)T`Tl*5+Aq*0%6Ic3_D#*~Btc(p2Sa#Bo{qmz;LXCPOs?jyB)&BX)>S50!aNrGt^ zn(NlpmD<-R)4f67?5|Oj$MxqJv_X@}dwxz^m{6m#wHus|9%mC3B=`!_|DuB_Pt9j1 zbea8}YH9Rag$xeO27bnf=|Z+jL(?6lZ- z924VU2kTIuVDCUaLb5$hUFzZVV)>)<8zpwyBUe_#J~C|)^S4ffXF|W$Npo477goD8 z4a6U0aDDaS9xrhY&AM#Me?BEGSKRf}$nMdH%DGNRN&OB$2+>0iwMmgZ*veWSYrN;7 zs|?>BvPO(f&!Ky5pTQ(!%fjAul=62fA8h7{AkZstlFz-2h%2X`8+ymrP**IOH->)L z-4MQW-Mytn%aXf8B|mQ7iSj`vZLco5az}K>mL6xrGtKvuh561ZbN%lXbf%S2uM#!hm`sC>m?@R~fx)Y=TQyffZy`BoEAe$sHO6_@a#JT? z@X2wG0f^~sX)G;k>h>|3Vl_X(o1U{;Jb73ZVkG_TR}0_!N+^jYaf=I;g2)|XeOB#- zlW)bcZ0h~kwBO@Z-Q5Smq3q*bVffYK_^!=23jm>=iSNP!(O0Igrb3n9jO?!FOFu}< z?;X8-T3bF?J~Q8LjN`cS_x!F^k3EP}wal;zzXy_72Yl&ge|;bv2EelY6Y0&&@sBo< zf4d0%Pk!$IR)qdf@5(=-gZ^85GBN#2X5lMs4LjU+B%hVqG&qo2RBoGX2m)%X=%T^Q zQsZPy2{K?qh;5!rY;`UAx0kmF?*!TB;`(6F5QZ)0E!hV3&vSj1=GU0Lo0b1ipGR4) z09XF(uFuptey`6HUzZ!c?E0-zSNv(+?eL!`fR7iml^3&48xxJAs6ES4FO#%*z(?-% z9~U3vsJ(&AM)TJ+k83`pIfpT7?4@b=m8C>oID}%w}%i!Pj|x z=^zH0lHvILIh4^KniL(yO;vVIvK`bB>&~rMT!^Zn$5*T|V)K|XfQxuX4gQtrRUJXQ zuUPyU55o;B>sjIpaWB{Bo5q(P==L2LX|n=~SK3GOtOne>!xr?_5vl{QGd-8+1h(Ve zLp-jSovV+dMG?La9{K6!0u+OYK|3VbWnP7kK9Tm@+88wL_%%Hx!f5_mveT_w_E)HWi9!-@Y%mu_1xxd8SSr*KG>`9Oo+!u+ElRGvrgQqbcc z=c(W`XLEo^TYP4q)07(SWrizciV!8wYQ)Q~7JnZJd4-u_@V@ck(a+f;tQF@bEr;Zw zmMDecxV#kfvK&xNG-HjHe^|3P$r>(~M0{NRreWa`o8Q2cFX!T|4#3Q3)LnqQsEx(y z#Zz*=FeUoQfvRu{moX9?I_=8bV?L18Lv64}usrXbNm(So|5Ml^X9g zquFo3Ud}3$BnAsuxsx~p!qwr0_m(`vcT)j)kRDT5y9IzwA-hK4{U40h?@6A|x?$W<&gmn@TjuRR?!u-)uyCJ+oPv;nN zk;3eAa<}&KLQutFS;Sa=lgi z%#al$ZS~sA{5lt5@i)Mr0`9Zc&`u!g>O(;o2C7*8fKPODdSf{H=ipUmZIQ7HX0uUs z>qh8Rhcuz>$`>~Hbw^~?MdA}N`hg2QzxU^!O&Dcj_3=FPqXLvcvZ;dN>pAQfBF?^N z^UUf^@Cf0hy06+g4(5kqUENJ-sm7wT1WPDAbYl%ob~;upkT2-W34{cjS9ED-oQnl@ z6-bg{&Bcj^yi&MSzyaF^Ne`OpY`Yuey)wGEd z(U711lieN+4{GsX%*ezLz^9Pz%LerMzUe-0h`@Jav(ki%3=VzqbH9_RP z0A&bnkzCkfxd-gYs!(4$ESNU4WXAqCG`}q5WMqQ+HKTr<%a&AjX`SYqcKflbn%J25AU{qBaWdofdf5lPgMKGu@hKo_*6(iG*wQyI5YpoX(x z7$hRgGB2bOSu?Gc@Pwm67M*X3OrIDo^{dnodr6mR-b>w=otcalL6M+<4jC?Gy%V*| zbg1*089VQi-7XAYqdgc8FM|8@mRIC8nILzlg@C3oQIj5l_Vf}6mZegXJGJ*zn#j_D zr7ml6RN2s>u!d3yE5L3%KGCq06lm9D3tFbBlw2~<7^QKR5^pUeIsGUdLsx*OmXk|a z0QcdC_%$ZRLOVj?l+j2>oa$I1DJ9gpMv@w#Hp))oAPHS=(mN$k%0M?t0ErHk%)%uY`?i z3Z*s80vBP7hky*1g6H)YKMg^!)3=M;TVr*Ll3rv$DGp+M*!%Or+JIGDB0VJfhWF>6 z-&|_B!MY*!-Z; zSgSE1x>nk>m35ebQW=U)L~a6s6aw<;o%)_nU1RH?fe3nsrnZoku4I`4k2Ghw6V_!e z#HHwznMKs-@~El16xoOpE%a!-hhktJ{K>2<^{u-Q$Ap>_%x4O(C`BgA8P0VjdKzWp1CufJE{BK{OpH^KyE|jKU$KEvkS`R zST{q~eVhkUzf{Z<<`&IxdcoNPepWntN9KYRvL#;fn^Q+AuOGWeJPTb56z=ZV#6im- zmfDJgqG)FD(R!rrHN5pSFC*Jy`xtkF zOJo#9m%#C`%?gpQl&FSskEkh$L-(wJ?om8rS(=nli>A7WIn9m@O;g0WZ=VqLpfc5D zMtP~bFfu1rESS<9bpptAgwUp!x;2;@z^9JB<(w|qu=0APZnXk13f|SwS0}G%$Levw z<}*|XS3p;zwA(y$x7P5L7>r1&)!OuKT#&FUyDXYrp=Pj#u5{KS5lc6je{=y-!enag z-9eN4D`V29YdlpE-paYg1 z#yyxzXE>$SDxHaZr;3f77Fu=SdkCZ72Y^Bkx#5&9Y%w?{6spmTY8M0MVAs3hKnq%4 zQFSlDO|L498!iPTU8N*~TW-f`Zx6tr~YATCJiVdP9;s2rTtzskVvTR*5ri|&)1CiPQBQ!Cp@D-+^1_x7|^Qr$8NbXiEl zk3(RFn(@8lj-G968^g*r;`ruO`uFootoUPHbu-lAhR5OdR+e>|ciFqg5rT?%#*SrJ z3|UHN$#5?|SXD0*JraUczXFUXe9m=SBW*T;S*6+Pwp!;T< zv9f*Roc@2h7mRHG+(Gnj7v_KG+5E4<{6D{*-zc2_IGg`bCjRFEO#fG@Gqe7SO5NJ_ zZ;))Co;^h5YGrb)_yJWul?qOAX&|C1eL_IYL%~Zt@`x3FYcziU&u5+u)%bDktF5fX zV!EJ?#Vef91G}TNT|2RE+No@u9tfm zEB0-kFZ~A3?psTmw@5-+0t_jLN-eHfrN7uS89CN)r-$M}m{EyP>v_VoTN#l&9YVNskBF6h=z7G_O?)+2o_SF^r1lt zD2!?Sl{18S>cVRZ8+q$kjc9=u%=?~B68^duU^$w@E++YEIBe{5#OJwuP% zPiv7?4Z{aS^Fo?ABhjb#5MuQrYoKBLs_(+g#2gQe|1{-u>k?CoK#932u zkTj|ZCKl%eJ!F7xImju8Dr-YefLV1s^6OIq(Jy}TEbIJC|2icZggS}nr1(X*+78s> zl>6}{`mtP4jGG^9sSni&4;x5cB@ccrz@`pqA|3Ff-(yqstBY$zh6JjfZ)PlU$v_@Y zn#^d@LL8u=&&oRtFLpNx-a`QP{h1YgMep#l{m<7t2o&AcTzj&go{d~Sj-{9EwXsqV z;|mQtnu1oI^afUD<4GQ>=*rR_@>;wy{a%&281(i_4R3TU1BjMhf=HbDI1Lrkf&gQa zDH%GAWU_?uBH=w7rtU$DKc&J|X;FkC0iVyi<+UFSx?gF5$psp7f*^@u#85Lse$l|5 zUrSs>)8xagw9d3Eu_rBgUhT%3~E8W0Z!!xA=b1XAd4TpCP9f84C(kEAn*5=Ac87Hr868 zQl|!B>Ied`cdEOfc{C9(9xN!)aW2_I{=zx0%W?31A5_wt%Zp#qTI$;G&=i>%c(UI2 z-R`d=*k7zEv=|g&N;$`r7gm`EoN`s!ORU(bDm8*N7%EKgD{JSQ@6dljLhy27p9By|vFVa7PMO^4hjKWO&O7MYnI{r}82Rs*j z+V1r=qcR2{03IP%{OIbPG(b25edV)u?+gpK%9jY5)V=XdW)kcLyINHg+*oJj?Jh0g zOG+9Xg_!9z!zkO~dh^XQY(=n+H3Nc27_A#a*f{oy{i1`|C0jv$VF9p!-X;*;=ZW}J zX<>1pr2@58n}Fn8_zb@{C1TOetck6bPvAhkR&3 zX4r3a{;QIWt>QaaIZ9CHpN^4yNj;8QTdTY#`%?c7d0}kizhiA?t<}8X-W?WjFG;z0 zTih3|jEQ&YAWTCNQEH*knw`n#(S@U$n&=*lU9F9Q8AlZYPi|z){*J0{x3| zyX{%KS3N8k`((3yC_<5oefd|zn+8L<2TR((}q_Arp<~+WtvDS zduw=WJGwp1^sOSYSj5io?U()sm9}hdk0U0Sa8=cFfo|w*He|*W3zokqD6I-DYeX0u z(8@03(d!GF?T)EdK+IA*NEXb`Tz53MB9~1qcY#@UQ9n8LL2t(-uo!$ipd zoAKx6yMGcbH!|qo;AmBcxJRhEFXEpH%kVn~d#`qn2a6;x3HHEya zj%;k~d3|i`?Tv&F&5iaaf?rtE0j0(-xK&vfiFyG2f}dd|t&L~EHz9EOgBludB3kul zfc$vS(Gakrr*YQ~IH)e7g1OwlOR#PM@_eB78F<6tIR~?;uEJ}3I{9^)aqBvPd{)pc z=w;g{wzEOE;ea}+NO@}Y0;E_xL7f*jEgPFATkilLXNupr&cI4_0<5h!y^erJB}fdC zvJJ|jQ)04kS(;`GuD3x1rj2zxFq7hN^1*`oT*{#*mM?tC85-&VNbvqvopS2}WcTF` z$?t4p!kfH!D)cFshv;BQy&W8OjTEtr{ts(N2OQ!HKY^^lor$5UE^T)5L~#Ao()icV zYpH4}!{}PlWpXj2<4j3hh`5P2OZ;8M%0qq^i032F#Onw9Q=hI#Pv~Jzy zZGei2rEumpbO*o1dr?_~!@-wD{}baYwXlQ54}M7dHnP zmfYJ4nbRvso2@MAQ2Y);LavJAdkB1vc9ZSvnz0(jNI;$RZO7yvK)fn=%RCWq9G)9c z28fG5*wAp=>&wje-Y$P4)yfZj-Q(*K({317{-g2hSWqQ(xl5xnXw9rSM4}1i#|Lc# z>-84tEgjD1z}1*J2^?eoWa+B;Qf45O0$pm8c0;(NvzVePRE&PR<|(A%lVaA zbn19guGMI(u=8y##-GFwFM6D@Y{^p0_{OF4LaZkTV{TLI^R``aEVAmCh%4C3vP#7+3`{ z;3Y%3$KY8#Ulw#KHI8k^A<_GTT%)rh?D7}i2T9#neK}=&ynRx6y}1j}<)nXJ`5=-T zU?pfIQBg4&9YqPOQ=|tlPFV{dj8rp=*5$dUU}f-lt_SsG2|mY4jc(`tyxVS&kEvXC zCrWAakAs^pZ%>bWQ&W&;Kut_K81yev+EVTwLWYwlPhcXpT4=ka46-Ij1YjhAXPr~2 zUj6M@UnMy(clsJm6M&Nn8<+RKRAdu5S$jj&;hy;ni~D|r$`A5Yy^RrZo>eZ3R?6zG zGoFrfTu(k-lXi{8GmfR-{?9=W1HoE95ug%zr)g8z({FzE>E zb&aI~V{5XMhRtm*1xsj%ze9TP7CjA$Bfv+X5s49&Te_H5FDt305HSOz zxp(&?@*01&8_9O5Ed~{f)Mbre$+{?Zf6T;XrN2w5S^N3xJ{nEHBP@d~8cxI|CT}a$ zQ%&8cW3JQebi)mAjgE&VkW>$A`^%1H8(xqx6p3h{cR>F{O6E*hxNB#%Pc$jI1e_92 z14OOO{ISE`8lm;-9n3L|`^IGYnc1B=bwxgWx4e=u7+Cf_n}h8q48ES0w!7x)1{uhO%xsQt0bq?XID3Ma8FT%k@6+!ZYtB;bv-; z^ao)y!U310o97jQ=$lQsmW-s8oHw;Y^z}@(aAAxI)tTZ}gFgy2Ju?7sUbJ(GG&Jq! zu_lfEXcNUtW7d;I%BaH$pLw=5^+93kWTx}m#+rxZZ`UzPeQ%UM*1wLml|CIu0}@8% z(vAR%an;J^LLK$WTmf7|NG+i&>5o6w`fcoTo{^V!xrt(&kId8d-78m7J&u^N5};uE zFSmjTG>8}gk|%1~{Cu5$EVgx5{QzGE@Y%FNd+JVr@A_J}qNlOJHLb5csZGdCHSdbG z*LS?=g~$6DJ&BJ52uM_qoYEClG|M=V11oG3J}_l2WZU+8st#wbaDvk~#|scy zt>S?noJ)*XeSyP~X62KEXV_#K3*gCgH|!ZAL&&-97TTsTvRi-}_0i`N|HpZ>{i(p9 z3BF{dD@;5R^qFC82r&O+Wvc;|Aps?7R9!&V^GxX+)8O;a7O-p-W2_QJ3Ml0}zsOq$ zsA)c*i^yS$AtYLoL0Z2kAy=QVqZCd)Wk2qF>0W&baR1cLw_JQ!4GsnEv?fyCK@f#r zx0p~~Gd2yCX7P5o?i1;9^}!;$Su8VfXQNN5(QKl&t5EN(0m7aW?hVk$tpPz)Ib;5& zui!hJD^Y%Heo4mEqh@ZYq6<`p9g$Fu1H+95_bJAg_B&2&9incuDjAOKG7p+v8}rsrf>W(BP;7S)R}?q-|d6Y{TH}5(>JJ@g@v6(`0p>) zZ-?V=*k%USzrr^&2?z;@e509}_}PS61Q__~zZVIzv42CH=>`4+<@|l+7h-1>X8A^f zGyey~`5WlW%*Ocbs0gqz{q4%m_`OQ_`~Lgg{(djS&;0$&Kj7j21cv?_2Kv9cG5^zb zVPyN~R_}ke(?I{P4N?9+u)hx$`){oPe_#ENWWawK3`}(NO#f0Jy7p=G#xTMsuPnU? zfM~zX$<-N_8s#cGOLQ;@0+ASB=O@B=U0^Q*yrxWS%d~1|h$w5u!Gwf8l^EmCsoK}l z>ivpx5>*?}&kvEkNlSG%-1ou5Q)(X=zI5llE#Ep5#= z-|fv=gC=;?()aOL`HjUh;$W?}&&n^K&0b&KufpZco4!lGoZVJ^dId6lj$FO)BXWzJ zmJ%xnnmr=_G}qhlyHU#GKBK`~F@c#hDzLrS6#VdEEqo!hR(cSWobxG2t7gyBgNk&2 zjqm=LL&=U>&(O&s0s43un zFSj+;F=%nN5Q?0L_mRpr@F#HV-aat(QB6EDxt5uqIUR5TC9_t84Qni++KUbK)C;vvo zIpe}z3*>R+q(w#-CY+$&`cnsO$|GgQrij*WtIt80P6Yu!Gao?AvHgp(O!cMngVwaOHg%ph&M?;H4hK7|R ztux((O4(4{po$VLqkbO}E6_aObHxXk0I-g-sz!D_%^of^EfASYDm2ys;pZqs&3>0as+s`EvKj#f@+5VG?!&*boy>6Xo_IA9F zpC9pv)taD((=#<_NNUNtZqq(*`+zF0 zXpn>AuD(n?2I@q^!kUGVOV+XGl@Wb zhgk_V=uNS(QURinZz)+dYG9TQ%0qYhlLyrSBpw!s{mN3zSP9bj#jSZ6P+WW0fUuF7 ztPU7nsr}mI3o>e}cy9WiO-VH!J3_@qdi>#Th_R$1?JUzcr+W=| z`&UZz>0@=hG+_<{tOx@@4y}qC}VkGcBV?AELjma6Yecru@aWaipO9+k=;< zW>IItXh;d?@eD}DhQXO>dE7W&ypber!64?)<BgXRmD!uQa}g;Sanizl(12g(Zx4i}jr>F5tCsC!|?mBaPI4xr`10P*X#~`j#f=Mh#K(vBO3h zhD+9Az-Swdg4^O?9%f!6rXkZ5CywMnypKVjt`b`Zik7;tGuZSNo@&Ct)-m94qIB}c z?iG3D&DC!UxiI=bV#Z8I9CfD=(^y6+PcKRTE!(6U?nDulF}_By}_q(UUhs zE69F-Jp|F)i^l15hi2Fc&T=l~sO15uL;rJ>C9K8_>~in;4oGA2@dFX6Jo)b#s88EG z0;&~G+?G4*X!o{j1pq95&iIV!mrL{CR6UpHI%NqC#rDyz^y3o!T!f5LW3Xj8!}2HQ zxVHP#&u$~D+}69tmos(zeuV*c7fLGn17SX&Ke_R5`fR=cjRf5m$^f00N5J575xm#1 z_}?^(c3=7y2dH!%u2<3R$~nmPL;xEoD>V-ARNSj=6gbME_1DA8}PomtqK=p95;iu8{}mftLuYM2DmqDt$VeU z;6yIRyTv_w&(&So_N@Fib5JF#D>%@2yHA3V^1XVGm8wy$_7UnBibiF})e)q^4rbwr zE{W7)bvY_BZYAS~`8<2gFheE zmIyco4INkMuH-&_p6sRdvV$$k zK{Lkz!SJhQQro;f40%oY_+45EUk zCOLYM3*|pQ1VQqnpR64GUCj#3dnyciO!!^tHav8P9rjvnXVhWmfXf`-JWwJ5mBod^ za!hX8fq6(YLYLiXTzKV+Z9V6#R>jMGn9Sk~AJQg?Nn>~+$Giz5DTT7HeW~v$M zdls=){W?177}O}SbnFzV`i7r7VDb%yPouhlheK)9+^$DIp<7<=A;K-JOSt@y8TVSc z3L8OMel{e&Bwb%NJZNyLm*9*xuzKRz$^^B9CP7%kP&D>K#P2zc?sS@F*dSrFUjv>$ zyWLezSQ}3UB8M@zAfkgF(tM*M!%>lj9f!{}YaN1exdn%`O@aVC%5^&cASC-V232dA z1x{&K3AXR75W%7b+x^__O~zx@_BmVkdz9CuSLMBz0oy|1`k6wd_@lWT=DQ4$@S3>- zd!Z?PsFQ1!S%knTqgbk=U-?G|MvK{_6y$!BS1!6-!Sc)B!H%^LV%al4)0&2hTfX|E z+$%qmyUEETU+b;tq>+MSvpZCDY?9hj_Oicq4A~P6dF;nZd?y0g=Y5#*+Y}?`I_*Pe z_EQh!2Zy>$s51C`xf-R7$RKbkoPdC95bkI4c*rWm?9crwfjYMQrS=J-YX7ZvDS0UC z_*1*;v{?lI#D+&ou}XIk+HF%e^RlQ-~yG`2BrC|vnCxd z`Ojl7Z#ici#E)dO#HJuEw{$1~scVm~?CPCINc_+r%Y{+MD=pu|{S!Y*x9`2{#;e5* zqslsDlqtqJqNrcF3MF?*m4+Z_2=D=mYTf9c_$!>YZnikF{=HYh)0(0WJ>k#Q{AhZ$ z#=y_sG>bdNZTp$J2xn(^HF4_0*n~z`4pOq~*TwS6axtL>D?DN#cN8_KA$-~rF+$i-2}OV!@7`ms4GRRX&fq+Ie5;Q*OF(vE+wyajvy0BZrw*qjY-`-e+qQ z2y!-W=~fzT(K4Ak`}8|1A+{!;GTe(qK|wLZsWOG3>;Ccsh?if-r1zqwG->JgM4VB& znz~J3ZVfjl3@|8UQ?UTR=)1l6ecA~&aGkCqne~8u4g` zk-m}UO1K8>4%7}R;OkVVWA`F+-6 zhhdFBy35rrN)i)2w8P*T6ew)9 zX}J1$hMHrvpJfJw5`)hO3~X9NMu|uY2pU&^D1~_!1T{oK+AhK%>`gm#QGl~(Hi&S> zvQu=1&m`O3O+PuK7Ukr+si-89eyO2cKo<@_Fp?O>XDNOJB^uzW4Z= z4Z#0}DfI2>{8I}3-)>F(KTX!8|L4fW|Lu8TVPX8&EQxiSpT7~jk5wy?gqj6RHlCpQ z81Yj!@MaSL@PQDI@D=cm`%vLm`C@yf%hFa?+wPrB$wZU+FQ%?8Tx4BU7t0itxh1;| zpWm>5Cn$E>Pjzgr|Do;vEScT*dH(I|YU|so*MYm$-Shm4=aTtHr>mpY)44CEipnyR zUh6W^7KYK`>Fh1C$NOOfeIW2jbQagxSLs8Z_v`IyF^3jMC(jY%WCQE$Ze!}L07ILI z3D`zxkD?9Vp#Td-8(Z0pb057+HgGwM(@_`y>{50cTJZhAjsbsRfi znGIW>qTIP!^|dw_tAFb3k3C_+xj3dHLEj&4lr|g+ND&DUX8FFcCaf~{<@^CzmtHzh z*K-$~-xFY&8XrAqy-ST8xGDfvJmzP|nQ)fA;RZ;Ia@#B7$ zC&Wfxuaswfgk$uiPjG)Q73Q@ZUEA+SqYhr{#yY>do}52ByZ}=xShR|0X$4_Y!Wf24 zxA*Z(Xx0WKm-U2PrS`r`mi9J$$v++Ud3R{$VW6wo2}?8wQ6yk1KGlGvPaebr)P{`j z9}Dp$HL)xM$wfFPvwG6lBf}=CHQnQDFd;A}DdQEq3RX^uRv$a(L2;^V6U?%(#N^2f%(M_|f>a*5d{ z7ujU?9+dlo!^$Gy7l3GK<`Vs?*d*|hZZ0oO;Jz0aD^>7S&qH^za)PjwSwyv=I!UHP`VK41y#ZktL~g4W*olfVb&n zWQq{x3_+V!2dXLY!60btW5I4E5X$b3B4ZD1)t)C(pClVFr8gL@CkUb^SL*bLK-S>} zT{N*Y=kg%T>uf+rTlyUkaWl_`3+3Q(CbNW~sxsz-G0vs)vOGP?ks8|Q0QC}>zy@Vy z#-UG$#le2~YM`n^r^>Y<6l3tbG0svKuhVDe)6E_p-5c;T>D0MkWW)u|>$xA0MNBEb z>v0j*>79}zLONY_3@~4Y1G>D$M!SORG4=9ZC~@d0M1`QC2OCV4uT{nDaM`Cv;L=8r69z;P7XAj^ zpibS@AI^Yiyb$)zCpiEG9GHxd4Idxbqan|t0eI<(Aa+Mb7q3wVlS8jatMOu&q5wIw zSqm{6Eq>Jga3uP@gFNShM*#Y8nJ6J?8-$-%piV%R<~Y}EQVRxt)Pf7I%}A7_%z6kn zan=s|MP zjgsvY{N`@ZD9hHK)%W&Jm?I9nyF&%=GSE!TX*c>^VZToq) zTCTp!FHUo{AKh5v*jsAi%iWOa-63IguS~|=?b+O?M-pS{hh?>AHSZ5Sz*|d8dK88qU`P}V^8Vc&ky7q#?uD5_>vztS8TyXyI1X>ZI!%erNWwR-k4`nh`nn0o?f~dMP80L=V zazI9G+zrVe%n1YYM~=p{2GcINC&zKMnWHE_-#=VPh~X+w?R zQP6O~g^>qX~V3vKy`O&*mz?;RhU!+)A3C}y|dm4#86XI)`c~C+Ft9{Hk^peO#OU%lqorFpS-kC$dWKkmFb{?)&Lvvga|1y zWgsq|7n8uWuf!MI7S%I0UA)TaxkOpm1^6(!r_7#Iv%`+Q?B1Ag=-x;&cl&VpL5rEoAES&&^qcWQK2(Y9nI>%8>7Gr$k z<`k969VB3XwuK6u$JpG@^&kem2kP^2(*du#4Z;@;-r_kL2xkwqT7F}vlt>$ zfQC28&x0;XEL3sb+oF)R<3I@$W7S;t5b8&Kc!jmiVE~2SR-|KP=eo?% zu_jcEij4URXZbtN!96BU&?~zwV^SWKo*htIk$IM$BuJx0}DZG)`|>`NUhkLG-=v-i_?iu`3I+n3{2ZIhn2DEdI$`8s~GJV zBmzb|QcTM5xP^6CsLwUo44oXUfW`UE*5DI@b)M-!v{*T8iw;cPUeY9o<6US4d#Onl z^VzEqRFBaHxz%{P5El3p$8eX(%~^vW7{-QU zlWEdRUV~RHh2&K{=BEUr8RCHmX!_BdKx+ZajVPp(coycFrw~e5Q!;O!P7LGeP)Dl; zLQd@)Qn74b4*I8!is)x!l6M)f-*r2PrmUlHEh>L$)m9{`lqmD2r8N{-CdJQN(>9`Sj6$%BMM@hjB>xXLc~gNMh@2m-RCm zl?-BcsqEQ=Gb`hzpVjL&aX!?RFj*3X+Lab{&%&THkjrsc$%Bf|H0blSIXuEOl8dp8 zhF%3<@G8h8sFrfH^aYgANb+$=)x%q(i4~~?RFzOZWBkcnH+s1krZlpctb-Jb-tm*B zwgx5Qx3VAn1Jm-N((`1^yT%J(OrsuT)x)1gbaUHF36^6mDE%Z>tT9gA+Q!VBTCj#| zYSWC-rBNwCMdeXC7nXaj>C`qUlaH!Y zq-04&G$Z=+N65QC?xKjIK%Ke-?PfYT^;=jx6V1uzsZZdcX$FSI)vuEn?2vagjE46? zCTrt-0^v!W-zBuwM;I|=;R>*xZTk0B*{yly2u4v*t> z+*zRYtafY1ZQ#-x#V#muF!b%+o0CzvNF4LT=R022TvEo9ta7qO0}SkW_MM#>0vA)< z_9PQpw~4wLM3@EUbgE&%stM#_XWMQjD)HsVd2m)=6D68}eoj)-Wsf()!A$N{L=l6n zX<0X-2mnwoTL+~+T(@%Q)}1(H>}0z<>EnN3%3_`D)92JcG_ILRY_P2HS1n1IuZl8J zAqeCH7;hYB)jT&|9j~3i-YW6gtLHFOxA}kfD4ewvSr-zDr{C{Ur8_-RACNORIg4ab zM3@Em{M2MrMIwhRiz`Fp?T{vQZmBVS%;ehKJYOu@8uP3}YA&0qos4n2^H4}bf@gN# zeqgOJRpYKOc^JYnQXt|DKpJM%2nlXdwox_{b``5!Lq|F(2uh*Wv>qIXv2M)RxRU2B zGRC#nG1<)|_ICA*`WW<~GhMtqAASF0?EU#thebQ{9+ zlV&)0jq#!Pbw-P>w%4t#Ww+b=@)xUZPaAxO?N)ck^FcO?f{l*1Po1|jevE>Q(w0UU zD~FPbT9f<3;?Op)2fV$Mfn=kKG%60|o}Gc93Exa4)MwddVc7g)q| z|Hec%i7VtH=A`VO0IIw_WwpRejhP z4S+9iNXSY&9SusdWf?yv_t9)EhH6SNEISaCKLj{C9p0&|ysxhi#8nt#?|FQTR?Px) z1B($KvbQs%dF#8baAskzzP%j;3oMU{al#L^zoSgyeIy2{sAk< z|GvM5_;&eRZhGN+6v}Iy8)8Pbw71YfWAN?)M6m}yNOH>YLl=4%a;A^3;f3{&seJel+l(QWIu>9O>|Ue+M0;PlxG3=A6bXNrtFu&IIP|L;}_i!bb2audi#0WY zLQt*F&B9V+U_xrD@({dFm<9Lx?=dEZQdUvw`O2d1pGd(q(5;EagiHf}YQgq2Vm4`> zIV4dIAs++42qwS-k+zm>K!(u8Q-=Zo#-H!* zre>~Zm=3h1ct_fzJcR);6jb;*@bL__@o$rP7>UgAlPkSdXx&3qKBR+1bZs93@IS|G zXaF`TVd4Y)hV`Ba_=3(=_5{(@jN{}z7PU?UPEJX>w%2z(nuzzK=cq!9BMAqPeK6MC z4q2JmIDnV?buf-Wij3`F9Q}5G9P9v!SzVPNsg+N#g32xqe2EBZBWKPSPko%RrW!Uk zO!|@U<>lZF42@sn#5-fqLS(ahX8ZK4$b2i=k)s!KyfJO$l(uUwYdmflF>aL(SCfAs$btbVIcF|@d0wmYT4`zhWq?DB4y?Va1 z-n`%dj%eo^i2<}83qVeKlY&K=Uu;bQ`x?$B3ZKFj71HRvT$=tAqka~u1(S*+?J?pb zMs=q9^dq(bun_5r4fH!c~k3Omj&L1RwgmGlr70R9zBEldvh~lQGR@x1XLV zcWii|11@7_P^6cYuID9)b?@@xNT^cu3>hdtZP4$2=@hmehI0C>V6ST3ZOrxn7Mu62 zwmGFEDDFI&5gK88w}r;s^r7@3;uylqnon(x6DEz` zH#tIRo}oNA@{ueF{|b|ZI{rWxWUr?evvO&FbZAuyN0Bdqn7hRIc*qlN%y6gB@MI!c z+7jf!kSMm}$yn_B`Ut@ zhD?T{aNFGy8r0%u793mN5DJ1IeK#F_lWLDYm2?~G~*H=LOf9bN1e%`W_8tN%RQPHT}|f!4Q| zFVRz{?{9h|hp8&?Z+fF?(Fui8+{4oz0^tI{_#VL9N#7QT;b5sohHls(v46f+H$LSbUhf`>@T(>OfIcwfj1XuHT9puXh# zEIvEFpu}t@(txIkg+3kgTYjYHv&mT-Nl<-+>HopdtGftDy(JP1=QqJK$7FDOvZ$Pn z_KYH;v(1$M3WEi`DYc-gS2TKV-7$rL{&ff2Kw3I;a0?0;*!T@vM+ zOum0NFZ8WkXoRGJr_NXX2#*RTnM8^h#S{LfM-=r#8X@4a5_Y{k4oTy6UhLp|Tl?o_ zwD)nJBFik_IYrbuxj0i$xQPC)M?7dc#t$Wyrl*Yf>)3K`JX{zACv^AHa4?0==px+T z&PzT2n**?5Z>Gy$WJP}p<6B}vr7PC*p0h*7o58Wca@ z_#KM?jD{N0Ilt(b^!|CWZdj z9M^6GoT|}8IgJ7_MUU|{3E^}Fz@fwU#2bGbY?bmDthGfg8b)8uH3^RRLUCHu*}}m? zs?WQ=x=S{deWvl(OCsB1?8Vg;}?kJnLa4ur`x36@z!)hPY>tghpOR(3|0!~QZC z!DB(P5gja@ocCD-Bn1TN};67WbW3mFDJ+FEG_^IDEhtm%o1!`wy&QoQm%-KKDA z(TkC*mECTEQV|ETJ0K~y@;9Rzlr0h>s&rEgEW<);WV^deeWJOwIxC^)m%*}_{lD@h!bH2Jb7+*BUdPux$zz^k? zQg04Z7`b<$OycnSspqCQ3sN&1o8e+8ABnntH@FQL*hmU%!7029tCL3&1xjn(#Z9bB zo61L?9v{8{#5r6#)|AKwYLBIr4AUJ(aH;}3wVeHyoRCOmYg|4nA#h{3PHO8sZA{%8 z)uWW^ip-v`fz`&+4#2jKXh0$o%ykTdLr@lJrvolHmrSEqa0m(Of305VKN?Yh%LD#X zR8RtV@@>neSldYf-C>fZ^Mg(aG~)QQmE`V2d4CRRltP%mq%EEonmY{F40#U*ORxz5me zkIk*to9*P(cY|q*^|0IIo4N#rp~d2q!&$0g-mMYX^q0jFUe2O5>#cCMl}`HvF9@N za@hk*pOM9lN1Tp3QaQn&Yrc%V$ zk}QmcAGnKr`#>WSEDwNXWnz>=Dy7`p@PGsGtrzpyDf7dz8-ZGv>HSrG*kLF3aqkGi&YgvP1W|nvGf+Nk1w|`h;hzM;E9!!Zn16?v6dR(cG%qoHTEK z=vrvoaRSba2){$B)PMc}EkyWXW0n0H0u)cXtmPmIIOV}Jiwzpqq8RmutajjD10a4Q zduE4ivg5K&fM6=CDhv7ooF+em5OZnaw}uj*sygm>3#@!q8r)iF=w0L$!DS#*gc@Q% z?LJFT;=PGoPQWNZfQq1b6t9+;<0cGeAdOr0!E&vuKKvwsq~dm4v0>bUwrcczOOIvo zd`J69mfaiJ0s@L8V0P;|_SH1;*`v9yu0l&(3bu!7>af_5@uIbq5wUDZt&lqD2iO41 zEx^oPb0&ET!@-;Ar3;cVFm+0ubNodevlQ>9q2Heg>18b9KegfPrLnxTB+Z~g*oieX z4C_Ql(Qmv9abQi}U$F6py;Xl%e*fom|G(Wz_}3=X|Mx_|KgSjRv;0oa%+CHVSqa}H zaV%l@?l)B!JRC})l8RSqVaip@H$Is-6}%g^SYbN}cu2HQZrz6{Q*Q3d%hl0%V4+#5 zn#<}lj~xg8fC~_Cq8rEr_hpVTSp7+houJx0v&CQI-20~Y%%}d*i&C3uO zIsS?h?$s%h!zR|v%k#+?-H*biVZnj10gI4D*ouzVwvG=M$5v1WMgHv09j!<&wU1SN zX4sKC;F3l$qCbgUWPY*BsxKd^K0T+t_>6lWj(jd8<2P_*d!MH6ktWgY0^p4$BqhE) z`2398&XpaI`npPPg-|wzi7ZDKe#hwsbA`Z5)Y;f}L|mG9urnY_RiP%ep|-Ul=ktKH zr0=n+AyIVB;Yr7SkLk=Z00h`@ZqXl*Bs#p6EASF&$ekMRIHq!t^|XMxumVhq>zv*p zc33RMePshas)XhitrN%Td;Gq`+;grF8jMTzSrUxIrNMwW`09b+D^VvfIn=B~V^WNn zk)Y#NDCbbuuBugv2>};u%raHt{y!-9(**HBOXVV);+I0bBhPnC*|I76F(xB&!+@B@ zQ*(J=fniudjG`*=)eBJ!10?ilc-9V#Kl1dpo5_A*f*pK>Is#V!%Pe%$0nocbl67%r z2A7!QG1PXZUX8v>>11^>aLem-fK5+L&QQrmK_iArj3n2%6+l#53!YD;S9YpG9Ia&! z$YceN=uF=wU;V5A@XO3{6L;|dTGlTSK-ho{Gr?2B)t14k#msg5@g&1E#F(;V)S}#7 z{}OJ(c46-LGWEJ&n-SgWpk7mW$ihfcCjg)JGg|k2_{qm3V zQ**!9=hb{sd6Y^~Vlj${z?A4iZ_qJ7H-T;`L4fkwjo>i2s>5UUS%$=A@ZRLJqQ5aF z35@lHvta-8_irwVVi^yJf-ghvb!6b(6Cu@^wC+VCXvl8E=(%3aA z`?#tfV~2G7uJ$Y_cZJ+wNHxu&w8(G2#E#zm5%Mcdzpse(NsD~AgUFH45iE1*B&jF@ zI|OWNZRgaks(q`Shx_`s zHP^#jZT)kMKIYdu^6WFDr8=<-63nckuTCauav7P-m?;NEeE4xsg}wsx*bw;zfvA)n zXmbbu+?i%Ril1KnU%iviy=MZxECxp7n7h{jadXv%Ek&_>@Zt2T{YpU zmw`2ov{aBMZ*%}!(U5frAeLAp7g~!jP{1H$TiuiL70Ja8GWbhqMrq5m zQe>60()nvt6d>C&@8N!|^oL@?oHY5F?QHN9n+s&35EZB*`oJEw#fKvF({@w+jwGS{ z8vrr~qZ|A3bq_X?%d*tT_l;Dv==5%^Da1p}4CU}~3pA*IqvNj`$LJ5B1G+V4fe1%u z?n=*+l4Q!sww}2*FqsRujPESW87dAbYQY=5rm%?YXUl5^K`w_WYdl)(R71o&FF?kZ zq>Qu@7>5GxFiAC2#L0E#d2hEAuAkyBj?&z{@rmA@d+Nck-xHlg;qWK!+gONzaZQgA zqY?}tKVM@38FYN6LNQ;W%SyoR4?SyFk}?hWdGUqJ@|-+2ch9R`?mG?vTb~p9+90Nc zAQVWF`%VZrM{*2ZJD5_#?Fvhrm)NO`!hw~q!~-t$#7<@~B`&3KIbZ-{h`fC=<%$S%LpS> zyVhZn-BD(An!c8Sdi3!1#wc^tdk|w@adyr>b{ESyxvaSBK4HxipVa=v8To^){VTow z|BGAv7uhv*G^}(CKhWa;F4;AV)Q0vpw*L>&HUG-9N>!4Ej-R{cy{{SzFyq{_9y|k)J4^zr#4Q)s^XRRX%yZ{z_e;286oLhcZwtt8wZ7s?H~ z6Bz~6f=od6ao%qIlD`sZS@cdViP-ExPT|dCia}9xQeHO!L1YD>??yGGXn1=Z4kRIZ zX#FH|ao$d3^R%EX&V2HBz|`mhqz^bs1&GKU0u<7JfIl<&pf z)mrSH&`QyLhQ;jK)OuO_1Tw~8|0uem&{6)?3ryzyMR{Gr>o?ov>2rH^furaHURZI? za=XuE*JWNX9ci6NMQCS5$E?>|h1k4_7rw;aV@5Eoc{E*Th9V=d+z`p>VulF+jomiW z30o2R`Ke^&CTXem92ZvwZvL?=4<1b_bt^V^jX*6Bn*)a%Qa_9iFqeVxDnRA@=4g+OEUMtEZ3Dm zdiTB1ZI_^@;m_OB&DOx$t?;EJoL!?sPe;Xw`yuV*$R)$E&=*Bh0mwn0>qw3msWY~sw6 z(+v<5gK|SYQ_+DWXPSeI17KcTyRFR&aL|}O3F_%;l3{cJBAXZv6gx75*wpg^;qRcs zv%muZi)er)(!{96Wj}X$%6tx2fx+!~p!Cb#i^~T%yG&5*t9$Dq-MbqpL~X+rbfJBT zS>|hLaOh}ZL>>9rNWmC`cURuoMf@P9I8-CG%9!dWo%Y>6P{8zczo7xT4|lmBWF%_L z^I_sD`FVc}ZDj}<)DTYcoe-6&7r9{Qx1={w%{sz4a)}7UvK4z=0ImRqf_|};w#Q@n z&tY^06&S-I@Bjrda_ZMH+N1JkEBWI9{qoRLJoh!+U|V1;@gQq*z)15=(C2!Xtkj;R zxHe>OH$_}MEWZ_TuB+BdY28i4zLo`XTf_=ffiraZg8{a8p-3EcTe_ zkQDBA;AzdMk9A=owh5B9p<_TF3@2WMRU-R$wipT?Q5p;WW=$i@y#!^G9FZ5-oZ7CA zXlkh449r9cOc*SzZxszYmKL1bk|NfFQJtFGW-ouaUk^xbcsvMJM648%(2!*dI`_(-fAjx&CY0sGEvrk1Pb>-^; zzT?VAkk@@k9?Cm%Y5qHQr3f31m2@>{1$q@JKh@GV4b#@rC;5a5M19t_EiQp;o=}Q? zj~Qkgb<$GDNYHRsIh_5w>lVRW#y0T|EV;-a?QIr{z0lP+N}7R%afGmd#cg~Dsn6GH zDNVCsN)cn2L)1FDZKh>zT~8E^`m_~-QoN`Mv!pVyJn{Z*S3!GhMLAb6kT{_BE)YgK zO9!yMKaa52bCx{vAbSKoxNZ!}Z53m)aRMM7B;Gp$On}4PYwIw<`jBW9-OSIIP-cr2 zJk>#1jJU@*;zVo(=!qmk&N2Jzm)%)G=DjUDGwAOl5jZ*{@@FNc~fMHmnF81qS z0Yf0!kqt--xvWtpj((jh`79WfDZ90+^@5U9Sd4~H7t7`v z3kNmP`@SH4ZxqAR)(#8vMI5a6sNDw*T|?ggXy&3VQ>Xs7>;tCacEJiEt9;U$y=hMf zNGC=?4rk;YzzdnkA_n2w0$Ew98F30KbjcANg4#xg_UoBu$eKk0;N}6Qd_cAG<6(U5wVedia2Nay1+7{l`{v491Ggn64#nPo={UuPvDhi}e`}+}AIh)kgl`bls zd+sg@54qvm&HV`NNK#>)8g4s{@!=8hx(N1m=zuu{xiFvI6Z;lRHfyEF_D0an^{2t2I zdvrgvdvWo-T$&G9wyIYH;fa0>JsWLVfRD<8YzILk(omf`73zpShC_Q{Zv&(Yx`)$) zdcSsuDs+%Ykz`eI)>b}KjZjctxQcvKDDWXREix0-=dmomHv{znoRWU@k(Z)CZCxVKu9 z(QFUL?wf*Hkz&(W#-R4`57~cTFi|%{?QtbtYr{xpovVoDl*cORQJLn~cMk#ut(GxFp?jHfm3r6JPU z&-?@8X3zye`)gr|%pEsBq!%an@XcjtTE@ZkJ(Mvmx_NQVPbL_y8%ZYrf=mPHMRCR% znbAC2hA55nIgxcWzRdM}_09FXjFD(u-Z{dF1$r`d%9|zHFO4qZjyi_9zFKC6Mw?4rQS#((&0va(I7NL%EjW|2+ zC8y4{Rs(D_kw=G4+Gb865K|XMw9M(aiU7sp>B!Q1fvyVOX;G3l=wAB4+W{i zfDP>Ts;2TRF@d(+H#`%h^fBji^A3&6C6Y2SWu3#Z?c~I2DD67>c8)VzI4a{GmwBCL zc@5jLWDa!rDU@2aun11}Nnk+-kaD6N$*j;TPHO!5#@zD!3?Vu)wH@|@;y-t;6Yt9F zd)1qZEE0!N@?@xGvo%sD80b}{#q3x!WjnxZtmpY{-QEu=C3=(8J4wgIiO0lfOl`t( zWlWzaZaJ=6?7j-ysY^DMTUvwCc1*4e=8ss5gp8uPw!Z4^7*qMf61$h~Los(i^#O+* zM%>PsHJVtgk22P38m$?Ea3Y`-xNRoJJ%HQMkVZmLF5VvP6mp>>P_YYcI6j(0&21G@ zmt{@wY#%23*dqJ@5GP6Wzh;1K2zWvoaGxjIy=d($Fe`SpO0bWf%vO7_t=8N3 zOaG4GzUbs;laFC*f@^nMvQ!2ue{3?r{yBVL+kAeU-|#mstI?$rX-dXgcCB+4JmX{h z1;)?G-F|8i0E4kgg%_9EvPN#JLPM<6?asrpT`t}Zmw{ao!Ez~%02De-O_tJ_^rhBR zd>ir=`LNF7;Ga8&yoPhk;gq*w3-8P&Rx}pHdi9PBi4#HR3%|P8Dz$`E}kuiCT`~zHu0_j?Fm|+Hp0^_`O7}{ z;U$EE9Tu1JE6*+mR~pZ`kix!+Z_(Ms2K6e)kQhk(Iz&MqV-Ca_j?;)T3bUkjC)$|I zk5VBJ%}=u&L7a!>!s49pR&npNo?W>#5CCk_vOtVa1q7n-cjyR}w+qr83YIlAoBA$7 zm!$18jwZzaprqjmiE+64&Se` z%-r9=c*T4p!~VZ8I7B(c=JHgq-+>TyrK!cRkLNYuY6>el>;yi~;J!H$Gzclr1(^yA z%#FZ5OFStr5jIgmBw0DcTG8Lk$`hBzS|hzJ0gsSF7VRpx1t`ub=8Ebvm_nbEl$Tb1 zLt_~VxtxIE{nY(eEX4n zhWu7soCWk?&86V94_V7(2!f3TEis=@H+R~=e@(d7yKjSS1jT3Rzd+jC=$#D|g7DJ0 zsS3a0E3G46%h#%<%dlxfvrj6NfIJzc=7G#$s&GPY&PG@oWe3{*9e4dA?U>E!aeSjk zu;zED-q4fs2ih*?{0pW$V$e!QM-oN6RUur~Ec_Phrs&6yX+Tx_;sIva`LF$tAJaSS zN5o2J`y9AQq%tJwbqy1AI^)doN4?x5>}Kp$_>tYExGj~&O#5|$MV`Dwixw~LN_lIQ zMs0WCYJB~(%BOXEM1F?C17%nH+wo!y1Obr&0YM&wp(qjZY%wc8dse(oqxw*>vwLZu zxXFdFB*vMUT(_Q0p1{gs)@aLAa7ck{8BBwri$L@Oi(Oz`k_cI=KB1Y+9&PKE7F26LdRqMQe_zmNeXvH$O!Z53Rql(aa;zD~c>yQF|q zNu=>}2us*VkvLi&#x`|7`_tS&DJ^fE2t0O@If$BWY8mFHpoH4|L*6tTOnQ0!K)$X= z)h-0nWWGn`9IasJ8ZdZF{P#0QItMc)=i!XdX1L3(i9<@1;bwj==`#%p&Ocrbz`OAD zFa3RRQXFcl)VFDl7)o(cvug0kx)huvcsi_da$u4vzoYpRl-0yELMmFM8J3s|1yjwv zCNPHA!T`58+Sa=ovc#l3W3t_{#5g&ZG2sRb4@Mr>uILpo~!L9n_c$ zgQ8H41t-Sq+8+dJsD$xUF<~^O6u{p)`gi7MbB-iD0rT?e2`ooL#mOlKXb4iVRHuI9 z(lvk6Bwg(r?pE1e`!Y)FlL&pO6sh|JHg2h|kdcy?p$My?xMBQa@=73W{PO z>?|EOl5Z+d4m5OBP82WeJAs2R_!A^P>}b!IL?Cu>WDBZ)s)jK5Y)y_Z$WmI3 z0n^~t#l*i`@W(LYUxHh6V?Fid9wmg`X5U?&2N`57v)EjWS&s~Zg-!%Xm8 z=K0ed6sks)g;3vVQ5{TNf;C@qDgW^;N$oUAz(%|XOp>4D659i|(a~O*|NIRLQX9*X zx-RORA{ID$EpuICWyf91;^D+-^khmL&B|IM>|^bwcmP8pV+tb{f?20MxWqzm1Jhdj ze#PSr$gs{U=-N;ne4&fwwmGE5yg{;grK`@4c{289DwQ*S6FzyT7#p1~+Ik(KNAof; zm{V1o17F`u0jE>$*mUzG^OZX(E#GR0t=Ifq4($f)(tw{vAAyEzQ$gG3qFmLsHu9>< zYtPMak~v+Ag8qEM0c^qVlLP?+`=Hgn|`YXu4_9Nt2@Z<@|RQ~aG90?I1T zFACS4Twr0J-4;dIA(R3u_gKzInj&z3Xj+eB%e_%3K}%yU@%=BC>X+;wNG+e-+wq3=n&SsrC@j-{zUe2Ds{Exp9_Xe#62Ygr{U zrwB^rz?Fb!jBOJ<=alFRWOaoz#kiB7d&%5Io(p0-1z?EK4JK0?puNh_V=){e+w zQ-c%~+*OXks%%G4bGQR0W(i@R&RYa7H$0uDbdX_Xg$lu#cITMw%=**k znAcHBJmhh9DGy4bm=rngxP*k@CwASBXpEgN&V@QN5_ z1jBJd9$(vmY5*N^6%TU!=CJThXE`x{Y+y%Yx>X3m$bEcLp_-4FoO}9|ku;jzmFb3- zIo9LHVsG_<(pfTNn+Y1t(fPFuu2Qt`DW&(ti_GpJq2!4bdMEG0l=@FWfYiW0hlT*R z*z2fkI@c)o&JwGGphD5G9hFc}lQ_zsw9b6Jlo~HH-a5*Bhlga)D@mu?cqN}*=y#Z* z_ys?6F!2LY$CMuRHQhBiE3+Ok>prZN#b3;D(Zzdl4P2hQ%(p*UE8Q_X@ z_*1&Y(&LB5V@A#z4<1e?fmOx|e3#$pzBn7Sm^WIBOFgJmDEJY1T5>L$yoT^Y=4+Jl z$eD0DhSjIeIzbnZ7s_<=mW=yEgv^v1q2@RcGe{J5kjygop?Q9L;3ML@tQFtrE&J=V z3#qsabAZ#0&}Mo2C7XUh_$`oP>lofagZc%9AWA6suJDiBC6}lssc}89$JxlI*%P&6 zLP(o~3FNehOQOQ%J+mf!8maqwJPLAXPWZ7z_DVC%Us$oy$F6AON+T~Dw5qr88!3(O zy_&_3AEA8dWBcCRhXgTQ&blJRQiV9#DT}>|znJp*jS14zEO#MmlDEC{tK=NjU$jmQ zwfU&tj@QODSv*%{b^J|X`@!mH07e^dE0e7|rjMj8KO8*#jgZadG!*#Pl_pBrmy!*q zjE91TovM2jw`ww@a(=o~p;;+n*kq$u)bool)uT~1(3e$0#O-;;B&x~&+!#Xs_WhE^ zP#o&M3<{3ZMdT7`gnE;QpD4r{Lw@7w(@xXXUF5?kmV%76 zFb-A_;vGl%t)0V5O~dZ$5>-olV2Fk`P8EHuhZ>TvV77`%n6?o{b^crsjk+G!R#US> zaabcT(?{5S3Dhk_*(6}DsL)aqdv=QCnzileYxza^6>Ysz2G|=l8@UCL1Nw&>yk&;W0{&*+U5!mO~3g0tJ61;)YrnU6h#E1jpDOE zr>?F{eQpJQoWz#Z6IW29m!p51*EgyWjS%X;YR=jJF?jx;L*f7St8D+*sQdqQV*Ov6 z^Zz_X|BvRJiSFN{;xsj4)?1Lhb98ncBbdzOX-4}gW1*c%o_?9hHE0}ET?r=WH^a6A zaHOSty?ZB8sTIOF-LCvZ+)k|gHM)%rIp$Q6m&Xk2<|XR@DG&mux8(Woe7x+={Jj0j z`QG$=aU^EV;qmNvdy=+ET

J$u?rI#YKe_jeex{DUOT@$>BU?0Wi1UZP`Rw-i>C z18Z{EH0Rsk{whYL-33n?`t}52QXvdC+Ij|J*w5ZQKcy9)!X&6n+SexfI^#Ly=+odm zB0u}e2W9}&Vb#YMFF1=|DF1vfDN&EKF-$%L({oE-q)C31liUW`orJs@^b?reW~*UY zU2~sXn+^5h(e;;oLDJ00uTKg1DEX~bkr#Ud7Pe-&K2h{c4sWsUk;xEBpsyi2vjxUKbKCl?7lB)+0eEC}q<^y zum!{I)sPAwolm+{0OENc{cm5l0CL!(nM2SXXqI?ZK|2L7aaOn%MH;Y579d&2WfWWQ zwF1IxWnugRNVFF?qiD`6(9VrxioCr;? zUgqB0I9*sAgsdN3*iEi>cm)(4Ob0oI&D#ey!+FqZqoR+pD{vT1T_Zvrm160MbhBVZ zA@Nto(shDnU7N+M%Q71GPs?BP8Q#v(2qR$J7{ypqe^@vF3W@6lL6LV)2Px}UbhkC^ zwnj}C-FLN+WLRp+%JW$4Q`TFH3He$}bn?I)O0~6+pw9He^E{&y*(VX|)CvHRHr~Q;}^NhYh+=&T@%$pu{a1n5;>QC zu{dN*>3K&vZ_NdDdjds`ZhVr`TDIEpwYkkENI47Mv9KePGXv3lS&S^4tibSYfMV|6v7pv+vKxOWt>)RBgyCEnkz2d-`Bp~ZK$~{K0 zE2bC7_(EY}J+QJ(eU_`jtv#-w^EC7DJbqYBPoePwdS zqf~1Im6uDkl-Rdgf^%m#ZlX~Q3T4nX5ErhS#Dx%y3dA${Qw%_jal-shs3{}zmLb8&SFjOgbfP2e3JqNxxZ|$rYSSyX*G8vgC z_RA%mwkCo>45fPm8~4=O<9u0e64Ee;HhfOmY0AM`~j_M<#s#FU%b3qwbdl5u;)T$e85}y2Hp{vNv1OjE? z7Box^RBLS4p1cE}de{Q%1@#=|kfT%f&vEDtx(XDD=>Y1GvH=_bM*L7zRkx$U@x2U$ z0$sTb1_ID$%JN!0zGTONwB&}Q3^n!{FchEvWnGh;$btUDU?kB1s(!Z($ zMsJX0SiPsI9w&u8#A`;e$~7jQ8bSpTV-Sl5v(dY$j$RAKh&cG>yLxCv^pAk##`vj;k+;kbyq z$gdmXZjY#~*N8eM8^E@$K~|W4e435;73(kfMIAf5nsPtXXFU_QFKq*(@!_W8pb{5h zNE&(G6E|t<3kSRmmE?(A2z3_{W&I+Rk{C#B2FZrDOlh@}bj{)xq$e#(8=W4_5+Lgw zv`DEmHh?`{+DCTZ-e4O)P&8l$h3>ImQ0Qu{ersG^)QOBI6yQ-BH8@E8n4*@mT);R& z_BaraXNiG-&75tsx1y>!*`5}0C-MxPO45E!mr?)i!u%@@ZuRvVCXXY?7$WNCvUF}z z`9yuqsp8&_>}xwph8m8jER>0y!$<#dyj0?z7(R)&G{`Vd zKn-+_8k#CfvEV7<7+}|j!S13*rV=E-Fo^>5EwGFZ!zwb)Ksj3}!dIjSd1gjRLu1FH zZ^cMfG?|B}4(?DA=n@V@IWL@^1X;=e)6$dr**ovYeZF10ua~XE`hN0n(krXlec!|} zJs@_95Ub|G&AZ^fK58@(%Lvm<8QY0C)Sy`8rfgyYsuk zWY^}`y6v&Gk33B27=QEPX8X2x+xM+ky%Y8$uz(tWdlZtoN1-TvVN7okt@|U*_I30M z=4I?O9F6Q+Fu@IHP{_G)MR58n0XbDMQMv>!)N>-W;fN_eTCUDuoHcwJn>mjzk8GW| z=;;u5E(}h??7(B~c$P=+hVFAetL2~E;FO3w=22F{R4V6@Goyt1geG$SHFt04F@0_Z z=j2_L@n&D26phHYIAVzQpb7qvu_Jq(3BzW&P*USYQ@v?8kG^Jb+r3^2&c@bHOq{U` zXRga+o3bx!b*@f-da0V}+}@4g{YB8=?fMDM2(nD+lxmi^ZoGEal?28$`i59PZLK9T z4lZ;}jN79;`2x26NW8(iP$*3!0dtM;Vp2d!5W4*o2QYF>`%#RaX)vCcA(-JlhmCKN z)5v0)nM-U66;`=12M3aNw`P|1MY1&RcY|^hxX+uD5XU=+_|Cyg+#0A293SI=PNrV< zyE?t#w+z+al0So9d1I3Mv!-#Ic|sP;r)UqG?AUvb6PjCExk^Q{L6E#>+*B9Z%IU6o zmTNp+<|_-9-U{APX1i z7WZPuu!#@q==OE@OZxqS$X)9v7vdMkvk)MM`|v?bO1>U@I=P0TBCo(SFNILHxLAjtz$EAH+M5wj23)GoZ_JRMX1*IcYsdjpTm;0c>_7_o)k?^}705xzB)qTeH(RL5xtaB$N=L(0 z4Fyts=IzPsUG8j)BFL)5rK)_WV_8pXpGNwKE<1)l@DxuHQRIf@4Dk~Jd_F}GAxT5ozfr!JbiidDF=-m|gOt%Iq9 z^9d+;nQjBvj6%O2Y;l(k8#l+zim&Agq0&+v&9Dzat16bpV1GRGmpoyFay2pPouC|V zu#<38sh~viA;y(GbU>x&YCgNR6t`#(;}Gs}KRgvtFA5y4IDK55F$==X!Y1*HfTMm4 zd8%w;Um1WT;02Ww_!hQ8@Fj&2>dRsP1!$t+b8+U={6sm)gA|v{zET}ESo&ysihT*_ zwPf=q1_qtGoWdt~N});ei{EV?Hl`xct^#>wQ2a!Z|H-H*m{U&2OY3)QJeZlw13mxT z^W^r#yh*?x%Bz_@su9l66jN7E`plCn0PnURu>(kP;Q{|&wu}ENjOM>_miv!U@jve} z|1Y(R|9QatALJ7&9qYe!vH6F5!eWN&nyxYRS4BX`r0Av=jyMWqX%?om(`Anp_7g-1 zlcM?X;CY_Ea+Z+^7OMPZ)yCb_Uao1=j#Ulrv(2EbU4O&#a&~oj_FA*_;ru1WYyur_ou%*8AbIm7SX>oFWQ6|PF3>>z(%2H#osm*FKA*UiE zrQ-8!8=n*_>SNQ+yQe`$A>U*ZDe z_v>U#t6G(Bmnq#i##fYIA8YW5qqgZ`*~c{NF#9~S8@fp?o#?u}t#J2Vc2?IPEB@4i zyloKfXY455s=+<1(IY3Pd@bjR+zXY+f0gsYCw>8w`1IU&T+YL#Pt!c|LL^JYB0Hp=co!7f6}dFEG40 zF+jRi)4DVl2_1qI?hWP-efP8~xD-ZE=>Ag{eK_k$BadQV6mzKb2e;F4F?0;A4Jykz zSn51Ta7+?#>=B+kCSG_J2PZI9tPP2bUM9t786xyplfB-K`A9FlHJZ>8o;+PHbGZfxjY>N{V|KGAg~IWR#S?>5%rWAf^D#oTYQ-tOCD z;*xito^iOk6m@5b`1fYE{eyj<8u~OW`bWf3rX$^LL%VJG;A?s4{y}{u0dZxf-kwgp z&)hySXP5&`+FPL7(s&`pU!C%Y8#N{1ApMEJg#g=$Z^er&JL_YOVUB`g|ID=)Mdh~e z!?LP?Xt@u*eljEaniMR}c8Kcvto7KLu89G+B9gJaz*0mLP#MVAN}XAd?{(+g7{(~WUmXeY7gZ6@MBJ#zEIE_c4s zpua^tR)*DyZfwri41;|PBA6v!3T!!;#0_bjI`GW=2!sL#4EUx38WMhUYSbF+&($#n zY-hY^{do;{6_gybu$YoyUqZH@a&zv-Vdf)bpU?*MG|vc220Txd-=Ni2Y+=w9VG03X zSxdtIx;ji?5>d4>!U559EM4F8LoWrYD_)CFqi=!=jfRo2Ty`SZJ;5kbxiCba7R>`B z2PS^*?f;V%NP}wQV&5Y($Qzrl$*qP|4Uz8yR}E9R-pldys01hpJMH936_|HyO(3fn zyY-BDGPQ5}H!IvGrUC8`VHXP<*}}fjhU4%#@ghgJb#=Nq^8kINtT1ep_9R+?;AJE5 z#(^iIkc9a|>T{|}^$?{}$6p4A%pGfpbDRT&y4RUXlIp@EF&9c;Fk>|^Xd7u&gd-cwjUH$qd}| z9LDJA+<24Z|5V0WJ!r1=l`IvDAFNv$41ziCJz8C=w55;$I)2VzKzK$?v?x!KT$-#MtHjJLG< zXkGG-R?eGK|6iQP3``9F>OlTqr>t0*X;|4=f85CaccHA9sO=5@HDks8pKZqfyA^AO ze>axxpF96w8LNM;{-1LCf0QEZ^z{EuDN>}S5wXF7^bh44bd8AG$# z_9yDr%@iSCKAw*?XwGN*TI?_NYWAb`7(s%|71)bNnH;v!6Jso^ajK(nJeY`J^?(E$UW z`Sz2Nkiegg;ax9142Y}& zufNJn)sG@6U5fPbUE~2wLD&6US7RfixJ8~DVzY`=L%9}riR^Qvr){XQSHjPf9VUP7 zVYRb=WYXP33$Z7dqZg2xneE#BO!I*JkGI{CTo(nVm9;&hyVnkc z{yvhqv!|6c3p_wtyNEdkVUeDas_`)+Ck7FK<19p!Q5Xfw zIdS^<;#ZK3NH9%A7|g3-{2SCP6&p1AHgo=pDP?1fat=_ z(H*IgV2}x&p`G46ONN^!YLk-2)anBFf=9O3$0noJ){EZt8Me2WB2i$lsIjU$A^;z1 z;38ss%;d~}_={@7_R$6O?|$aF@eDYTI#}k-O0e$9_0E5m|uu`Me~!dppNNW?m{S3He4k> zYA)!t(|>*wkV2Mg-G0(2UtzNmjW#?fgJfqi4}GS?RcrjbVhwV(Ul{h_S_^y+ltVri z8<*KArIS0G_d!lI3spGFXHcrZzVa8>n2lT8w7iKQQDX3s9E~Gje9gpJ^;-X~M&mOi zzmXfVm>dq>bbY1E?Y=X#;B=@9E)f85wb!XX5^SegStJP!*+n zaIfcFz18ftu2mh8F+|nP_B=hsH!!^C?bA$k-nny%G&vYdOsF*Zgbbk*LSrTJY6 z`58KET@I%*`aG}=e2C$%3lc%5`4T-sO<_!ffzvY(GPsA~4` zN+J0t`XIas_^^yn8J4W$Xmf9~#3VQaEruQ?*l`P)Co>4Oy!4YbOcQipaSItBErhNG z8`qtoSf^MZ@im#GOZs?p2XGL;XDw<5oS}q5QhL=R1b6fd3(7L!Y7~HEi8K+kj@w`|a4<8N6}FyvYbv$0&0MZ)b_!1mUXdCYj8ss;U@onds;xF*zT z!xL{|wBFYv%CAx|E@IY5%PfJ&r_&&7UXIt$q@;Et=0+=Vrt=su@6?_A>$gSQ8tg4r zXAv6G2X;`3jly!cnO@y1?$IXd25qS|8|nE}jfGCcJ@X4}wvjzQDBz19r|M2Xwx?mO zFJOFzd{1+MOxARO?F=d_Dn%%Y$5@$jK8eJY)}OJ^-mo?s;e*)jn2f1gp~2#UJn$)o z#KX0)GE4LyY0%C5`g0Yf!R_;A%w#ri(?;lI&xQbD+zp2@!~hM!H+z# z%)Ji>q$l2}i$K_aQC2as|7Tm)|MnW=|5v^W!+$P({zq-Wz`*$L$s8J!_CJxYUDpbD zJaqO4ktOZNtb=62_M-zFgUH36q4u>0f4yoAHTDK=u5D^pKtMTH0Pw6^FZAP}E&xxm zbFRMHN=o>nhPHJeLUhG~-~{iFE|2bQGC!|Am%Ev4cq|?7cPHB?k6kw4n4h<;tFKub zO77G_jz^eCC`z)Jo^4paJ)R^iqF|j&uBPU)q+FVEzPej|T3b889LVWnXl^yfJ2>0< z35(!k_YtcW+QgloU_dEyp9EVL8Ww3O6hwjiO;$U)F{gTR zTzFeLk&UM+^@;+<8WNMr1n3?pur30Vpfsk9zPIOsLg{9mWrzk^id zsF%Date=E@rSpOSsTX^EM=9+541*TZ{Pk&Ov`YjzW2lX9{ia8#sLR0XdCZcj`*G)Y zOV(sv7dOzAm{3)ED8(`@XNInQ%Qk*@8k0bIy~y}~$e0_@Jb&##eN4cFD)c&3k1a1_ zyn*u?P?n$Xg|>u7?ooPy&j^j(!n(3vfZg0&p&l+1(>RAPxYLk~Q_yY}< z)7G9S4#A;Qs$C|tds^fl#y;9D zYv%19n~|nRd?J-$Zy@<&TafR%$vzfravzvxj;bE@iehyA3%PD(PNQ>;??V*KVko1& zL7rA-mOo>uh+An8tRV1}Ff2;(k z5!otl<^6Wh`8i2C#Y3zt?35B%jZp5BC3%A0h6j8wt2|-Cg4At@$j;^2I`jv@ftfSs zwe!VG9amzMO$|f}ECHjI zMI`8zSwj=;#x1NQn5O#nA9ENQCKSic@{Sh`eULB3OSvd%a`4K86t{2Z#Wd94q(rY= zhCNR}R^UEh^4tBnOrB#pMNynsWpN7*!PK-6dkysje$<)6hO>me6V;MG1~YWE-6jB( zZhl_P1{&QB7k3O$khJ44cu_9}?l-qXe7o zRsZUJf2m6#R`T6I_i^*pzHCJx2SP}ctrcJhAZU!SD&qN@=5vQ;T9rv<6AuHLC7e~w z`~M*CErZ+G)@@N!%*@OXGsq+}vmG-tGcz+gW{R1a8DeIPnK`y&W`dZ={Oekosv*i*bcqvSYFFHhtldTDX}}I5QnH0t-fc+tr8oK0x~T^ z0@d?G?p7cqHPfISRK6McQC{xPK*>)vNB%x=>e*M2$e6&q->0NRrvuVppscUH?_h~a zi^t{e455%Sh@AmjnO4gT(#z~eMj=0UY8aBhb$G90oC@dKjz`?*1K^+>Q61jr3CGf6 z2I`Sg2z$M~2NWe+wNK1Fta zp+i+79U?|>#O&WwwPQTc%ur?LBKMyq!saJCv#<_6gcU>H z;vUreI)>ej(^Ez|xV3jSj(hHq<2m=vwOHsY@3=sM2gx6rXg{-^NvL=zU{s|s-{@y_ zezN!Z*8To$gx#lHxFfPY{G^$~&R5BHI4eLdhY_(1!?sLe*6j2N!si}Zb&o|>Bmws3 zeEM)*os6SzF>H8Nq*xgSg^Y1t1SAjkCu`M`h}h*`-OA}f1u0okQoZY->S2g>G(ziW zq2vk~pqZa@e=;>r-;5Npp%CL&O{`=CR-C|A92u*0prBMot!gw6@V#;2<>%w{uSY#T z;5&c$-n46sQ+aOjq8?fslK_h}t1S%7J!WC$LSoOb7_VIMlUuA8(w9;*f`KQdz`eprdJg{XCOrmSYpo|Kgw%#sHp}wx!vU`T0R+N^f zWb#1Ptl;6QN|GjY{e&#zkKH(hv-5hKUsgm?CN&y5 zGS*Cr9K>3&Q;?v2d`o_%hl>S2q>#RcQ^S+S0z!Wz+_<~Eda5s#>1<3lztk~8I`(g^ zkqq8^rI&TqKt#MreEosckTKhQ;eq_bbX;&dPsFh~&0=?La;C$lPJ!wYPSK!0Y`S_| zofEU^q!BQ#b3>)&+1v$4Z(L3yv% zbAb8ATD^e)^k&4z;yTJ)7L0;$iAPf5pJzz$m4Kf|kw^a(djWWHm1b}o)sYm`;rwdr z;>Dqz0Jxce119l6zrIurL@m`{@jdouSivpVuW)`~fp9TjKN2>ZukLvWd>n;OA4)e5y%H>&Gcp{$ zr^ZIniFrjtcI87F<68t7NmI9a_&FY3A&^uTzMY(I?w!<>Rgt4cTiUOCyDy_661~4~ zly3vekh-p@%?3bc_hjYezIX`H#1jE`6n>wNFsA5LKkZX=dyg_g`L^w*#zG#AN$)(O zbK7JYJ3nmP0!&b)u=ougweK$?cB$N)6ku)ZX~$3V|=qrp_iRNIy0SA2ew z#CnS5hp{c#u~~sE(p3wP#yZA=hyTjSXEY_gtFms znC?k)?S@u#;zOV%ro`0P@%HJ6jwnaY?1;JBd!Yrt>GCB)#D{%qLp%{PG&>GYOVekf zC-}t6YdxoAmPuwNabg?`u9Br$fpl5E_ta*cMtf^>p7uid%#NzYEI0h8FDVMM|2m~( zJuINEi|VYsu;^#ocVoWet@OcrKdc5u_6|lzMHc(t>k-+H>|NZhCYEf|I^pftN4K

>TsZUI)p81qlOCaZ##Dajk=V>?&-*51Fa#O* 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�<;4=cQeQ8} zHA&05kf-rChFqE?9Z~cW#btBPuzjMVYfUv6JO464t1tHIg{qd+r^0JtGDmB zh-jT8=H{@Aw#CiIwM?R+!awGp4Il#gS?5QgL%6HuX<4d5%#ThE{N$>RJ^qMu=$!T@ zs?sWx)YLzSSv!6~hRPW17A-E3c&)7Y?Cn|V8cxB!9X*uKqsX(zs(WTzCSz!{d#JD& zvk?=>*7O{1r*(%2mCyEplTFa$D6b?ch11@U{0VHOLSEB zZ)QxVKeC)yXZ-+;KkKd$5Tk}YnnXpYGCeXle)7A8=V2r{Y?{c7h@U;QEzimXKHHgD z@d6fZ_X;+}31(2(#+m@Z0hPri6JsMH7mcLNh`3Pr$IYfxbp@*rkE1C}Q6M}%=lrXVv9B(^O zahHEqk?rYRFGkg_XTA2?`E}J1XLpA?DelGJRnEz-`Ak0K@(?cX(!(65DRY+ogWbY`kdcuzq(AGLzIgCC zviMtyiqV^qHG?mqck4C=VM&uPs38t>NCYI?LzgR&ag2dE15DazG|!}=GW?(f2*%-d+1vlUb5c}F@z;Rs*2(-uf* zM3P*bH_y%p6b%A4#^uBNit$xIBcad;>>pq6I0^9h3RufmU{W7j>+0*f0BHt4XiDP~ zkQ!Pe!;NwmY7lnW)K!{`@YIk3>9ZN$)YQD$9ed$dd@gls+1Fs&z}N!Q_^^}C$R{(KNOYIpQUp4 zWDvt$gb>Xj&H@91Lpep{M){|b8tL9Aw7Ijj0;?#2H zfdmZ@QrC;obWCp`&jlp3PxEl|GHk;DSD{F0HjNsvXTALEqf;ZtssR=LqIgVbsF6fGn6A5y^2IhPR1=Py4v zs5&6uOQy(FlB1Q9a_b1qyK}v#I29D*mEQhVJJVDv8#$AN`RrdrMTOO9ix5TUQd*>N z91WNmBz$~oe&Ch-jhy7EDe0Kg_QI2)xi7&hRRi)#GsBNP9Q`h_NfRdZ3h~Ei$4|-~ zyz!0(q!{pI3?9@vc>(E;bjS(<9aARdZJD51NUtJYolYcsn5oYK?Q*1`s_?{x^=e9U ziZHouBr2fSRgKaNTa~L;3*z{m<}Cq|y8r^63|}GHu>d6?SzBQB{zz}>#FIg3B1`;g zdx$~D%5D<`+Khpk#&6O?6*2mR!_SE8w3>GnM^N;8=$VnLnPO5g685td|LF15k%gRQ z!{1dB!qQZwQAB{*rV7kiJ^`#tf3($Vyb?B=MI0(nQdr);I4ar`np*d86%$RraFR~v z5k!USPo>M*jj!Ru#n&J4bN+9N52f%&8{z&+F6$QBhM3ZEK7SwoM>m=@EJVvobS1Yz zh*CTu@ZdUMkvm(#bVZ7F!R&S`2YH|&qunAcc<4Thp}UjydY;X>TASc$RN-cvEX;G3 z;!R#6Hu;n=`PgaMff;ZCXG$w#ba7j&-`y~dJJU|y{2lCLJE3^fO}k}GIBdl&&zi!B z+=31F$&&gIB-Yg>;IAShB%)v-kc?PK$nQ$wqlgBgwin2z-Ps=1E*~KSlq$Z!I>cXQ z-NVKMu7zz6{lOHmLxPhkNhcj0`~9d>Es~FT$@tKqbOO`MF49y*tHAZUIpgE!j7&Gx zigwloC1KcHmUE1fNY|n{8sjS_fqzgp=hZrtTryXVw%Bi*q)Y?#Rrdi;Ek_h-x4l^6 zH1HSoZkhCoh%G$N82F7Sf3-_G8jS;fSgB5!TvDnnU^U|g(4}gmBj^x)c=Uh}LSDfd zrzTb;+vD}ZvVsU zZ6tuK6Wcg>0m;7k2m@ZBa?kD*A4vb^ExRW>nn#s&9X_;?;Mv($)E8lfogZOe0r#cOV-&5EsONx&#n3EM_ds}YhpS;WAX$J zwSLocf#4`(`gHU;ll8aaG|A8mqp!lmEx49;r2}ax)l{v!?c+;nUwd&)!{qjkpt7-Rb;)rSn@PEKb2EG2yliU*%GVfWz|G4{zP140Z7=R&vZZN9r-Aw+ynbG6B{$Co zaaR}5_<2xk=rK|I5b;!{fvWScuc|6$vQuKT{Iby*-Kr_-9&Mhy7avmP4M-<1c{akaT0sR(~Wt;LUy5u1gep70nps8?x$s>uvi( zP`fBQ{^BUhiP@f}v%c2(wa=sjgva;wOTn<;NXuQp@cSYcII4ufse~F_1L3LbhWIn% z0}nw!OlfuZjx^Om1h^`aPb2Ljd^uI5#yMsCJD^0uAin3n+n)#YoUe?n(zIXy-7CL7#kYIxni|riK}%Ao zssRz?Buc1g*oH^O@lYIE3zST0w_|5yXx^+ya;M>#8+<>DFAM+ts4aF#Q+$aa5%G64 z9MWa2Z|c^5+)E=xTyB+FwI3`$1oIo7-acYp4=yi8d%a&RA}mM!H&w*UnMl-FKT2N6 zy%#nu-XxIO!~3#5h{};^<%2Ag{P3d$g_-`&qoO4NnVuK8{_BK?`~ErqfUaeNMj}Lg z_Mb$x*GS;=>tSx!u%mZ;*`S!~&mN1hG;;PrTz*4m@e2+qZ*Z;s16+$qL@+cdO2I?B znmXbE<}X|aIQBv!J*_%LMSKWp)@o{9E4bbb?SXf7Y5^>pDM8V|b&p9f>&sCej>^53 zwv|G6j9=E`9>=9%Yq?Cu0Btk3fs!nzqcMc9nf4*+O$*g$lO&LchZye&?`o?A%wY*@ z4)j8eJ7S%HCIMqhh?C;z`@WO;r1{1iu$l-J%j~ac5M=-%CL%ty4NSy|^}~C|4vJ7Q z`8{Lq^a>wXP9TOG_+VxZK(3et49D}u0mNc+X_vKy+zvFXeN6nndF<&hK*f@woh?SK+_Bs!QmS+rFyQQyL*%v0D+yDzt z-&O;^#uSBe!2NB(nsU`+eart7FrB;L-v{3$ta@?`bIq*Ri$Dvi5;~KR0 zf}xafaqPD2^m(r;+8;mBIwfiVR`+D5kGU{jZiqrMv!+fE*=X+aLZM7NQbiaL$63w< z=bgh^2(daCKN`aiiRj!2eM>5!3JnFew``UI`uHo-#TH|RR}6*+J;})d1@vLJc9b=E z&(Zx-4w)$?bYW5>EO3y}^!Fo`6=C<9e|=cB%@g<&VkamAFgzGv00S!Y)Cqy;tfoKb z;>!JyzZLH^uzA78inCx6JRB@}xi^Mw}@;aKbWARqe@7C%};iXA;e-t%=#fXwJ83tD`OZVZ$ z&HA6+ZY)?df+Awv@}&u&)EqS%)(8Ok(Ee&dJe3-vFIV=*GC`WIOMxPgNjI!+W?|u9 zS5fY#W=;6%Yvm}_qp8vD#&F<@7L(=Q^L+_ECH6mUuXqSNw3@}$Spo>ajm7NbY!v8a zrmwY;Oy>LDzFfW$`CxX^H$-5qULU7NQExE2ZP_Fl=q8A;I$7=uYe=!%YyefwL5yeO zm_!e%wx4S8!Ivj%Hy|bs_3SGm<1+*W+gcsK44~Xo7{V>^GCK+Cv&`yH7y*m@#677N1tpSN8v}NJZS5{YE*J) z8B(w8Fn?oz-xytRme*sQD}dzGa5BT z;xx7)=w6>}a=!2T!1O7A;I8MwN4r+D8%XuH2}Ta+tTr;P0rH#uvI>yN6G@g=G8)+J zF~l#@Nj};A<#74=czVS$9Jt@Rkx?t66keEgDu3{U)=e=vuJ%DF(rNb0uwtqS&{Dc< zw8n~p7B{PuRiC1Y105&o;#576ad)VbtajAqC}h5QpDmH1^SQF$?Tw z%*#${nAGOlx_ou!2N6+vd5}a1srcYDc3BMIp7fW*(aeId(|29(^ThQPT}=Ige;~OK z{+Hg!znbm(4`v_!9~cz@(TP7;V8*y zW|d|-*2cRcsao7j4dMvOTvY%Sj~})2V%h*+wh$v1Wo1#_ToFbR@G7ivtBIt!Z^DTj>HwAd;DNXVakb8>B6n?)X*>k@x8XU~ zePh-&Zw>}i9&weSnbRdh<^ZnWlx!D_WWKNa9KWA0CLrDFHwnRuV=xM>EK6}Lp(hyC zv4`9wuZFp@Hl0WP_0lPWGHpWIR8wQ4vNx4u*#LUhSz$({WYkV9X0AT}b0!l}l3=q> z>smT*nQVm0i{cwopIH< z*pZOE-atbMhmP*W$Gh$IB?7iaywRRS#;|GbC?c@T8FNc4Uzpd~)7Cqy#a(dbF2#x-ogt?Dtg&(l_~Y4gj5SS<;x$D!r53wIvti*cxuC zmh(cGQDILwZl;#@nFj7_Ii#O^eBe5p4GQu5T3Hv}YXhTxRQfiAn%PfgMOd_1Y<`{I zeQ%MPdhwuXv+urdf&b#H`XL$ptHbL5i!a5=_>VckpOwF#u|ZB24gw~24mu_#jvoV- zospf6fs^I`2(YE9B>7|g{+Pc%7X%a*E-ntvT=ewjmM#{qMs&vZw)9S}&MvezhIZ!k zM)vmB^hP%JM)bCZmUi^cPR8`c7L4q)3{14f_IAduPEMwF#-6n9KljoaI(ym~)7hF( z{yhA@FB1MUHU2+tXaBp4g#UOO|1Yl8KYQ)}es-9O={+?T1&zRu&W?pD9H2Q%JV*~^tB>WT95 z-ZUJx+IYwJa(T9aMg-J*o= zT3%g$_VRWz_5vZmsd1VE3o-#@9lz4!4Et*qVoX2~IKzUcKw{51VCnbBdathC@jb{q!DZa4)& zkr(=i;rEqBBZ|bOXr_Nih$raLu9Bjl`a`ce5uYiIf2LgARjX$Pt=x+A2bTUi4W7R@ zqP!}QjmV=Q?!~GFne2vrOy4%RnB(kV_9Zz5dQf}aZ;v{EMKFk3j5-9LAGdkHRXCI0 zvgiz2H|Z++*li15chAY@Pp)H1vK*D)#rq=P_HxY1hZz6mY98FDz$0eD1IdQtHr|)3 zM_PPnJz0Y&-pIV__Fou~)VMs7n<#}3W#{D*n|I|65b}c&`un7sVMX_keTn@S&)L&z z!5w?zgo)zBH%TU%4iv6R7B?Qetj%A9XTP1Fp$1eO|79#UF#; z99+LZf?Vn}p58#6*pNmL{NB>ttz2a4n^XXGD0TPLrj#D%<uLL#)`i)L{NZXrxt#P{djGG$P ziuHX)6} z7Cl_jP{#1quwKJ6W_7<1Jos<8!-~SZ`4rs^!lzNV-LY-CQc%RqCR|BBj<&_EWvwCC zhrCrLDw>w2Iwl9}!MxoqVPADuoDc;wGV3mIGXO^>P-O|TXOJH>UN*6hxIo~39FIjh zJORy|GFKKnhrIl$ckxNNXz@-2f3KD#Ev69ZIt^Uvq=sGU@&J%WDthRO?J!5gX1F<7 zOgm`nrEbitn41=pD8#;2@b%WC*#*Sj&YBc=B%a_5I75SDWA1Yi@CS{dVkSh94kf7l zEQG9exV;P01ke$qyn?U8J6t0-`gm@QoDj8cTP~$qZ!NEN`5+)kcHuBkdH5AZ=r(3i1#_EV)isV1xRK zTPIAO0o6gz<;PKAUNRkL<%C0SHraSTUHK&kb1OiOQ0T~LELsO8xy)Z2{hubY%jq|k5o#-zTQTj7etqG z|28$l$tg#}5#Bfh5o9L+2~r4notP!C2fU(f6XfjBr3o7jhh?L!R>maO)l?SH5Ji5{ zaq0#5l};xWyXw0Z>8#qPrWwvF$nEX?doN``t(7YUOaNa~o9$HC;5diN3yWJ4?2!zHx)DO97&);49;p5zRWyY&G3mSd&*rE>5Uw8`brx?pP^ zN41JX9S8?0Lp6J_1K!s}ZMLM`a9MQ1t17mpXQp8m-7weLp%>?5hmPFp8w&Q9+F|Fp zI~>xyuM^$Gy{NGX+9ZlpCbC*cnlEZzg?4mX?dT8!pr_Xd?51%PH9mG4@f!{|iPTeC z@F5+nbgYx!qxoZ>GdgOJQDp7J)^JJ-lQ%_T$r{zox_i|W@8^Sy1?kB6 z-l^Nag0o8YLFPoubg&C{kla77I=WR$*Dj6ur1I~uEW_N@>kdTbPa3m8 z+2%8Fvyy|Cy1B91^fPcjCr=9QuXv?Psp1^0>dd;o^=Pk5r1VRsq$g!){r=QS<30&4 zuO`Kp>gi3l078&wu9Hz*{Ox|a34yDm_FF$>Kif#^@8aDs#Jg%eiEn^V#(>XqwvBBi zg|_J)*o3SZm!6qA|Do+6#kkjZ?G($zlhliM+uU^iVR>7i`$>+cKODtFLIa088g(4P z>glDIjiTpP9NUxHWDHA6n5Sl_buL5%V0qr)f`j{f3UU_QS852b?pcZ3t0?Fm%ARh;8QL`=7&G{}bD*2aFe>~*~nODDGtFD2*%mwUSFBK)g9i@O+md#`! zCbhLtr7mu+#Rm`}a*DJYqxw(rQtml(+xmnLdfMDnWhP^x&JD1G#(PaB>p>v*hp*oC zv{qK%8$XrV23B-H=Tkp@HlySuMsWh+%|GI<+%;%-7R8RTb4l1Cbi(Tdluc9BvWLsM$&!~Z$M>>F)rz%QmrQb^{|J)L|BC4nQq z>VN@+Ak;+69eG{JHtwq}Ggy)E8QYoM%CrWTTc2=Qgf&4bY?Jeu4bT>mbFbwztLYc12bcJ8izuQuW*gb%i&8#@a{v?#W9KZTM{u17wnwbHq^9&6Kp6D#que zs&}%PnIu(xbj-DtO9S&N1s<-f1B*jvQvQ%D_ zxWbNC`uix{bTb5!n;x##Oc9kwzRWENrZK^ageHtrkCwtTqvl+;^U2UjuoI9L%m+pp zzX-#9ZKvNA1CSn?y|}8IoF6_gBtE2``XYq=`~Y4Quhf>ZD}@?Y?Qw;|BlDZz%RGo` zJrh5>p@!M_EKqT?KBZ+NT!y1iqK~@xC66tEu?)$qJlF@&rVi`Ge5)hSrA%JYEl_$0 z+)+D#jy&}D4f2^*joJtHBZ;POXa>6@G_dy&{>e*&(py77)FmpOMa#qe3R=GPLns*_ z4&=>4X?8<|T01ucH~vL)m#NcV#dF9l)}kw=Bi7$is^ zZKLQ;n#ANWb!Qkq6$>Xh1^)8Zo?heXZYW@?t`Nte>f9aV0>muK8P1hsBv z_sHI~^=`Q$Ilh`VYg8T|TVkEo~ZrQT* z_8NqvI-x!h@{jDGsDRZ@t^pvcYh?Sfsc%w4ot=iVB~|WS43|SiklZ|x6c>i_M{z2| z10d_|7>ivR({wO%GoaJ=x~lM%t0blr;CyF5kaRsU#=yS(mywA0WqOvxQ} zitAoyc4XVda^U5iv;?m_Oj^!Kc4sd-xiUJ1OS=!=~&<*d%Ta_<|K{iaj|Qu z=vA+mh<1ry>sW)T^k)QqQ^CD&5nSVGqUh!?hdxXNmm@k6*j-eO54_*%(e*eY4hIMh zmMWw=Pw0c875y=%Jlw=CFBZlt=0C2b|F>r082?$||4$9g zz|QvXXy{8FZF}qvRNvLQIXVS)y)xvx8#oT3%a&+^ccmiVD(!s7gv%iJ04~qdzU#4$ zi0r+1=ElR}E-|ARmZ9^#4xbZ;->WeHwF+lQT37Ar=JP#yw$<12_Ij)Tt-a%?*YJ4q zuCIPwYdQV;_Oy6*=Qh%%6{@OcO}DzBnrYe4`)T_4%Xa zU(?!Vp+kb@zR}iUe{iV^o>Oer&uZ#L37cT8IxY#6{`S`J^`YeVwZXGjX#d=2YYa&H zPOlMO&rGAZ?CKcHMkfFof@wWk>qu%;3}Vb*7)AX(a2xH=Gb}-pYc2Nm{seW86s=#h zjW&xLsj<}8S()b;>lN%q_ra@~MtE`)_N9>S9As|seTJp3^7Nb{ijDO7{&nN-cska6 zN`^TbC?YD>ws<2<;v%nBWZ8ka7*Z2bOG4$3Q|*KVJXd)v*_vwoNBe$)!;E#u=T?60 z&6l)+MhYqbAD+76MknDRt{7=Ls8`BQ{LSmrcs~Uh$Q5ret8qUu`RC(0EZzw8$?MX# zV0d|~-+*oJ8xK^|oV)xyzZIp)n z0nKYK15g&2sTPVL1hJ?99p8SEJhn30z2f3(UK<fszw4`Hq_ zgba^J2ZA*sLl+`D_Ldp?S{;w0X2gqMi zI!s+mf0mD~8}vJgi@0R( z2^n<@B*wxjV#RD;bbmYZ51SR3wv8};?_o4VlO-?@q+KUWy@@umLMTmyDZE)7U1$0ekgI1OYNE2RR~ZDIdP5=oJ9sAcYI zHi1U51OZbTPFab+(|;Z0fyxGu;;3JX9hD4pMis(%a5?OGTYq)o1a2f}h zG5`mhCrgjv$0V-HbPxtJph{{x33KtPHRZ!|dTo)(TDm2H*bbGq?7WU`tztU6K{P;e zKQVM8eI^jFSry8n&`ACGWq0d z>Z}fIZ$xUYYE;e{pVFw7_3U{#K^H=?HcA1z-391@^d14t+xax{!4n+ph?FUupR?bi zFd`9{wG%k(Ns`GD9l;HMHN~+=~R02SA75)X8Vm2ocG2s_3>wJy*{io;H z&rX(CFdVg&zbTV6`f)WnEUVgBiW8qm@>S7tki8LPB(NztvpI3kei}ficy_Fa0hkpdmOzU*5`8hJO*qXmKeS(;PcbYh(Pri9!Tp`>Ba;R&q)mQn@;?x_a8QP&NL>#^N? zWv_WLxPG}4db0@=GS3D$3A3Ug(%9sVIP=14ou5@P;R);ZQ}b4D^0UM9N=mvW8Azb zAt_c!#aEkYqM*Gtdx^e|^EIVU7^S?`Sz!w<_HKrnM)#qeOKYxvmh8%4u|PYaahiMk zr${Lbew`y@L<6Cd=Pyog^q3;EG*B{c3m3oU+!hs!&ZvgW{HT&5a%IO5l*gsNpO02_ z9iU3Q3y8Ffd7RU%q#Y9P@izVw>ZpHwK(biRr+c3Jj3G*Rs4$oXw;|8&P3QS~lQdG; z#oBr>FXpMM&0<++l#qp~CjCb$a${ZM1Q#v#wskLrUin!N)V2yYC2 zU(?DvI&n11&W#IIzS8mooT{ND-$}1a)3jHV)=%q<$s$DenW{~TmjqVt$m~lEWLd1@ ztMsS=3G5#I%>k`6u}mZ|)^?7y+AhCDie{95>aIw|PH2jtLMyBub_@#UOo=a08j#LS zwL^sRB5!9|W1fR{;X0F==)|^Zz{p3Ls!C3 z8V6OyQ5$|u!zKTbzgiTR=`%q&nD3=#Rb9_X+(7LBIsG>eQ|V+8N=QNLB-Zs>tsVQt za5#pNV=_oRwotDLA}MXJbJ~TY?Lt>M2ri7J#A}$%)4?+2pIKsbu zbQbGk=vu0hCC(Fs1ElRx?{IV`4}vC7JV}-N8Wv1c#l=~S-eOvY#36x zS^h`>hl|)}kq8hO7!Kr1Ba=V;TGp+Hfi1JHukI1%!hlkoG6*|@ePzVOUZMcdq*b?;qta&5o{ZjWp(DzGvv~ARl zt1G)9y|_=xKRl=O{<-eS9ennJ+F@KjdPM1E(bbdRgXS5{T9{wCnL_x+?CzkoaH#3x zfIeR1FWhE*=T}8MaQK%(=U)vJ{pWHXO#j|0&425_{Nt|wrM~{B&|zW!_ZSztn?D^G zM4uCNn~#2tROYMNUT~xY-7BV0U=l+j5QssLaFpMk^)Mm}(t3B7oUG5ery04LS4xGl zzyC~LJk)faEmfRdHT;42cuyIQT5Y`HdzsF1N8kCF%)H+DzVFLo$EO=U9?HU}@9ijv zNzPKYr+2HPGf|$17}TbI6bl=Ks$#3#*8RAgc>V*rm`eh3IC?+7do+H1Gk%OxvF-V;pgtdO{Pd6b z>wB!OgCIJm#AQ99iHO}Z&=N!QU!;pG;O{^nbSzwEElTg#Jt6E5JBfSwjqEqg9kS{L&yTjYL6@j1D?YD#g|>A)WSvl=tJ_&oe)`>)kOEL& zaiR*;Bv!N^4r0S#S_iTUa?dA1YR-fbEM5cGX$eR@_GD$fs<0|GGic^( z9e`HOov|m*ljL|p;o;}BjX)5gYd_;`XNg1Y$ZAf6%8<_b7^GaiIO`Yvh%X2bY>j=#{1~HKtf(YTnlK@QV-~K2hA^?H%ZDC0PH6Mufiu{s*31K-{rFABSWLB>zj-9m0|WPiSGrD%m$`^i$b<=8K+d_uI9XnB z8k(?@KV$WM)h#(r|2$x+t0fg~o&?E4B2l2M8%GOCQF#lj1Lly42??M;kjb+|P~}ps zgYhvLF$o(^0-ldIsMJ)6r8cQta#UG~@46@<0kpJAMR%gkx~KpN@Y4Vq3ex2-As}e+ z{vM4vGyu^|Ryki3QY0ggC7+>2K{YA3h$of5C32V>-YRkPr(N-OfkKl&0V^u-tfNG{ zUhrL2D2rBU(W8-z_wwUcq&p&QWEdC=f@)1v;@2N|jYwr5M6U2Lb$+k*AuNs3)`0ny zNSr0Oli$1W=Ws*CSHX#MNoeRWU)D^Ab&^VReMW6bVmw`bm28wVU(1&>WLGEXVX`Ig z9(pEkbQlb(4hAWhuADI$snwd#6i~2tQ>g|A8j7{Zy+`%4vnl6{C~LKIFV71@ zx!i0zi5HHfm}P;8`oighf|f){=h8<6rVZ@D`~~`VqjxK)+85s8^cAx{i-ho!Fx~LVg=c2RYTz*6N+$vi2FObjbt#7pugMB;y|1Y;bw|*ml$=~UK(E(N&j>-v zHG4E6+nwBwM)L}mDx`cy3k{z{T>~DQD3Pjbd*C7fD1p*G*l3~hYwN5Fx?8dOD{Xsn z4R=MClt{gzq+bKQuQy-st4DOA9*m$LBwYhUn8`yB4kq5gp}WvE+ssc{a`xg`gv9va z7r7_hznpe7{l51qYe%bkAslKTxVFS{-0<3?Jcvh*2InnISmwChXZGr=?u#3|v#kz{ zFD{F5;jH&00N@uKS8R<4I8QS5@{my-e-=CRsAaw`HDa9x-t+eLC|nb zbV(CO5gCgGs6J45c+pqm-^l7zKbFJRAPrNac)pm7a(l~9!A0`4Oz7h9D&2A zp~UWl=s*JA7(L;N3_kFfPY>pnR%b?zy}i9t@Q4egfqsC&*Od#>lPRi-_c?Axkj$J^ z{%Lsq0{;our8 zHaXqi{!lW&7033<;`(aS?~gt zPvA;I&@7Vb25pkp_uwqj6uV8 zAYLDywniYy<&qjR?+a^y35EV^Mg;CY$^5D zb8JtewrYkj3s=^9lxg_fSxd&-+ChnijNQ!{LOnm?=o`SEXrd@lt!{q?gjgVI|80%4SAG z%qS%+=3#cD24;ivqA@1&J3y+pywr^daeO< zr-L=vO%@ePS5VHRX$dup_^w&WwIgw|1Qo%ed^JE!{-#*v*;0`PjTiTdtqNlu0Vb}} z7SA2+g4n{Tx-ItKWh}6)5S|FkRFcmJ7dUw_QC&O&p`yxijFfQ@TS7GlTx3VfSMf5* z9p{u2SA!1h+fkUm_)NTjVsb&(c@isq2{b=w0=nt&VW?VGpmQq&?b&SeVCTpM*X|X} z4vkCo0}Pc_==~IUz<)l-~^II{XmeQn>mQwABg| zrhIIYwn+IPR(vjSgD>bJYZT|K9v{3ZJpG^#bjUc`v~b?|XM>_?+B;@C~a{gnWM<%BixE>gQI{u^#{E-IP5hGnQ4>a>)lm0TbrHu z1Fem+PodSk&fI2AXSH*&vOHbO4V|XXhN_=}L!x@4DcBvRF6Q z-ySb~guy7Exe{{#N;lp|VOfaWc_Y})c}h8>8RUV&QSjg1sR3s~6Gg`gtp3{84N`u) zgz3DGY*%GIB}1m{;H+)A@UQhZXBuE-4q+bPHy3)6&IA*X#6qM$)ry% zn}?YVv;47ilB)l}&GOkJB|yk&i!imzrsHc>q;cd}q-w)%x zeG^hh=XOX9-@nFVNV|%&G0qeCxil(83@Y-HJHsAtQwzmWRa+u{$Q_^8kaI^?pV+g* z_Ar9>>FI2>b<4cIxFH<5!O4p8qyonjyYG+=^KGFsyw^9y2)~&_J0SL0OL}Jz!HPO) z-w}lc@$Q(wR_womU4gEIPe1ltw|7lKcn&gn2mX39URVkk=`a-P<}0p6S=x3DArW8#&I`LZkzPCYv-7?4f^ zzq3cf1i~ytUuK~KJBaOEIWCG5I>;kv?vo;}Hm@WYtZ-|u$NCpUXiC$i+Pt7)?ZsL% zvBg4lS!i;Zn)Tff&VKaJoJnI5Z(J7$rJ^H4l*g|G#Zhn>77y##m{rs0@WjM+Ee^EJ z1a{JO|7rqp`ka7v{vk-D6w!<_Y~=xK{ap^C2XvhHwqb1qa5Pizurq>{&Dtq(sVD1# zIH4I40f zYaf~lc&pC>osPi5#b#m0)12!~9tMcUxB@*lrOCOUF3T%;yfwN`Fv?b{E^ zw!g+5rS@+JCj^ZaHjkalOT82@4d%?`{RaKL)ecpw#dWC}T(*2q=y(}J>>0}^%n)%@ zE+Oz+*Jl)2E1yj9ca6u`dVX85=CGER_JEm0XgzpVTo>E+pg2tITvLExuM=d5@WF7U z7#T<|3zkO1WUo*pAU<^~8LvReUB&ZqJ@)T3PHLpb($XTqY3NL|5;*(L z2R6S>;wy;-T!)QuuZo#b_LSp>E6Ww|To z4BKI7t*^kT!E6-141f*MiW1r~D2fHL`v_9omVFh}dplO|2TryHfUk-4Le3Yt1_GfK z8J|$1bOlO;0Mpk74xK9C(dmDAaG4c>$?Qk|?Wg&eQ5;@O&Zx-)ErU6XHeDY@m59xo z36u>xjc!>NqLTeAzxEZ&e&#gwOUz1}1+v$csPI)5jUT$$ZFDc_GQM0m#BGvN1@(qT zb^4%xwNZ0S^Ic=HZAIufoPH?Sbb>_!YvGsmh)+sklnt%o87&{zn3#D!5}0Oz|M}c1 zR>xcXlAH+Yh$1>uAsLWO1^2ld2(#NB24Xv$L9IgCbW}j(Jarmn>hYZ5H+RCEtM$T( zJ3nONQB$_VMUhIFe|#w^KjuP+9Q&W_ai>C%PNMh2#oG9ic?F8;iETR$Eb_5L5>@OS zW43F9$nrmWQ4#P6&R{Up)kk|pW1f@8;m|iBtW{s-&z~kD$W{-tO?A@?N)m47TM@a6 zgctXO9AxK6{8V!=B#Z^3Z=q2VDRaJA7|seFXEPNNAd53AgT7X$QO(y`I$Q0MUS3Q} zTnb$v?`-ok1vIMCHmZOlRooz>8iiA8cs9jLTQBPWk{>lo@B%h4A>iE5BA2Xd-UlC` z)BIo$e+X`zenL4=!}!8iJazHh@qL$V_JS9EB-8qp6uM>?P3teX2@m2aq7WuGJT}~p zp;WAHNk?>z)yrKdPWr!Ld!3IOvM7D@cR3{lEmQiFjCD2YtCMl;L9l&hN@ISz8`WVM zE4Q8MPAO6q50WV-4!e`Ozat`Ggb29(yO+8qr{{fJ!6GE&#mCV=+ghl)bdUU{lz;UYq1-l?!B84Rt9S$JZY z*zzg&TpTvzc$brg+9#6hto75XYVd#sR6PQ9vRqG$wCQc1c%fOPMO}07EwM5lqF%ps znmCX=#k$N^i=j5L+jZX=8iW)7-MW6U55Z3lZF4}*&aZlr#JR;zKJnmLrhUs@Z+FGH zRB|%JmQT`<1Q$&Xw-N(dn|>1LL9Z--fI4kK&6~d)ucnk_tEon!V|xjT-kHY0zYU}n zKMB@Sy{$h4ASLDp(!)$Y$eIze zN}=wPf9*@8lV9A{cT&tsDX&^NS}AYEe(uDeb6X@AdSs_6+7PWjgc{;ZkU-%uOp`XH zGWy+;`Rg9glq-MkouFu?)%I2^+CF#XVpP(=X=5i^kA#NYy6YW967@h|GQ5m!P;qtu z&TAC=RqSV;C$(;~NF`w&o$Q-42w$K)Qqx1+RHIfW+CbHIxqK^knZo0C>sxAk^>A^W z2lyl_%8FyDkx*Vk*wiSaWA(tM<1shp6<|+45_`KWs1@xMhM}d=V50ExRqzK@p*^46 z2b^-HZLE};N<){$Aer-rgQv5gX%y4FCT)Q~jOWEY7wLA|;$#H1Hf<=JJ^2+z#|vu8 zIO3R0ybS1B-tM8kBf?3yU8;wPPr0s*5^cX)4D*+KRBbaW%&ppJe)ab0YIJSo)LxA@ ztpkfX{_)l{`erbzM=R!Qy4!86g_l&3#ht%RQCf$S!zVMt17nTX{z%I?ILM&klNfo@ zo*#Zd>^I+3s2^9tys_>0kVv

@vGUtM9kkY}nPI}*dZUV{mIH)mXb#rQphBw00t4eIn;k1)# zF9bw0>}Og&!9|0@t3Lz}Z)7rYzyni9Zfgv0$~#|}FKT#nhQQLIU)cK9)JZ}jURBBvKh)9WsgAdvwWw9`DWc4C>7<)i#|+%5ZtalG z%!K3TZZ}M#8Az$2V9U{sW{uUT;FepEg`L_nuRE8Q$DMHIu1WQa5>JD??#Wy>LN6n! zr<$-t`N_BYu@!oba}jMheW)k7V-g2?gn-25bwjM|=d=zGAJIAb-(u}QmJk2GbNRoW z8)f(A1|FD+%Kg^9v*lmuY_FSkrn<9+FqR3uB6F{HIKsYk*YjK4|1Ixj+ z1dKXC-k&^l6KQNlsu))mJCFs^vbC;nzjvz*?PG`f`R#IW3{jtSZFs+WKMn9lf1mB$ z{N46`^&Dc;D?jNbqV>OmP z4R0z_wZ0FnQy=_#xI2Z8>1CVP6%U)^nR*LWB&c^YGu1rj^Qa|4 z+FX|a59HQ>{BFO?!^e(3JH5HTod3BgvxJ}p%6Iv@KWI!1SkWs)NxgR!-!fv8k1rVm zRZJqf*PfZ>}6m*euMhHV=2CJ(`1JU=3RCdYY4{h{lyh6ejdHEm;trf(TB(*_lKj zf$0W}C$&Uz8RQ@Vk3-7Yw5r))@lQn9!hm?Dm-1=%l6(j|%R#8G-jGlc9&*7i_F8I- zWTkhQeh)RsfCf_v$;lO}Llj{p^ub7K1vST5V~1jD7G~Pdjbs>+jJo`urWdQR3xzjr z4U|na!3`&Is^Bt?Rv`srs8pG&wBT-~m%Q`sfDQ(Auwff$Bje{egqGnd=0KmjY*ghd z>dK+KO3OnxP0I+v6kiQRrxI#AhSx=i$e!o`G(+WAG+&^i1%f*Pk;KLW!1Wg3H5nOO z$a_0dNOy$iU9&Qn;GDSwUrx`RUEYBEKs+e2OOA3$#6%+RcQDB#6v5*)bv z@zjTei#_kjw_z6>-0ihxt~IyZvcN0jEtiNF*D|BlAgRiY@ax1-QXPS~;{C50Sq%nn zjs89IZTi>dVpo9z(T1{eY$F#b{R1ZeOVRf>m%)NXw)KCeul zXNw@>lWdj`m}0sbaW!|>!8vtPVbq|?WqV-`cW06ovX;fC3G)rU2vLLFk>kziw+A^F z@@?I~FEl8C)9Tqyd&R5jPBE723vz1p*~f4fRE9Rx_%+`iPxWFL0&Il1u*Uip!1S2X z5{K!=tn?%VW%k+Ss{v|gTqo9*&lJ>}TePPb(o3AWiuSVWY_#pO{kfv`BbA9C3xjC+ zgPh;+eULa=iV`%UM7(6A#K~nv&bR{x(wmktyck@woXLi>qz^rJ1n@(l*A(HV>{M6fsML29 zy#kAZ@gLq5D4329A$!N*W)(QBRzTfZ-;Kz;=S{~7uz_TmE0D1ae)GA4I**5>J+~k> z{@~F5s}S?^8ySU^V8e~B3E3s0Ho=&c{3A7?f*T1&oIuebyTVH~TT~k&OM)p**{Dwu zDy-sfY&-~f)J`gk)I*AIa}8B!h^+)1s>|MXS$RwF=P4n!p;KqkP(h-!s5!zkvQVTA zdWE7o3uSvr8D2j9Z)p#L4&LdOFc@g!FU3sN1qxg91!IIN1ThN7BDUcN?~9DreRZ*- zIs`*8td81jJ8U^H_KOObL z;$g4N#Pt-t5%${=Z;0?*!f*63fWC{;1P(AO4Ly!$`{l410a` z&_M%|fGS@bMpus15e8AypN2f;YM=?@f6^M<08x|qKGV<@S6$k zLp}kCtXjmRL1E{U-Iw#85x-UBlaD({SV$Yw%UQ>9wPaH%=)=CedHwP9xV)Y^w`1sz zG)Zz5QWA+JLDCDhIT^(`XQ+>j+N6z{HiqG%3_CpJy>WV8Lj1?#zq?8Xj+4c4KYJ*x z!BlZlx+Op%6BSCdkWUNaG1fSQKW9+Bh?qfo&*YDl{*sYd7l}Z1S1Lj+bzy8=+A82| z>O2YV{cLP5jeAbT5*r2&$Ovy1L+9 z*CY2>FT(DKjX`Es9I&K4Yc4Gr2qLHw86zjzu(XdMPU9c5=+WZHz=QLw*>{8!E)CBJ z)eTR%t3!(g%EuJSdD;?`3MwZ%!!d-WF!sMGSKFCIHvR0Lqb$YvmQIt+2k=1kYyAW} zZZ&s`xyj=F0y^zMp>5^U+Ku>%3|n>C>eu^1OFMaX=`L3S8v8Fe z$WD%Z8e_3&NG$s=r6(J69_9tR_-is(R|Y8ZN<%O)*x{{_n5sPkVEUOxKaJsaVLKR4 z12rlURpHcW6KPc#RNt%KZ~Zj-GvHdpi&u~S$ov6O6#g)z^=YUEi2xB(Xt$zr!>l!)RsXL zZ2gDvF7um$;Ns=;dq~@AdxxUBaY%V&&g%^ z%Ah-`Q&s_KK@u&4G|-(046#U=rs^z7x8}j#l58*D#k86l!Fss7UD8mKct=+Nn1R}m zVaq@@4>XNQP6|Xa-nxiw6r0KOOT6o(Fbn29;pi4c-QQuxPh~cjCNZXsKR^TxN zh9}N_E)N~nQxeuv0{<&6Yc41HM*Z6VSmoB#=P^YIUql0fPFH^;>YXPJI77p6NrtQT z87``s>bFIj0yX%&MEMs`GnULRY-m&DC_3!H(t&$ntB-zbvx3o$Lu*Vou)A`z=au+! z3|bxc5}qMa(bSopnoI=hV+yE)1daMh&C>RC@N3-TzrG&qEOoNXYcH3EBo_ErV-06t z`zs+K#-3y@&OWgl8Bk-)CcE^%P6fZa(~qo%S=YG3lDGJ53m z;e{7lfq~Sd$7(W5M$_juH8TT;aD2PwrX)ur;%QVPFPG?PBx}-413}Yuh?tcI`$^`>=|!-)Xo~luEvj8zB?9XTFH!~0AOx5uhd9l& z$Jk(H;t_iKt+Nhh0*jEVw@3{beU1^;yuWJ)_EQsFMS*|U9MDu*v<=GNpI%&+kM=+A zfZii(px=M364elRx)#qod5$Cjek*yXbGL_t7O;O8?jwt=7}zEHxgwsu0y%8=W4m5v|~S z_3d07gwLO`>@c+%(sz%V8d6mHN~UfTT}3I!8i;Y736d$T-qPt6m=|kmD$?dTeu%O_ zHG}7%1I}Ic_)VujmLZXFJ|q)Sl7wVOFR1w5-}=4z7MOjV#Geh_sAYp8w#5~4#=H?=otMP+-QVod zfZZlx!S{Ik(qH%^nz8kQE!&C>3IZFFg`1_XdL9fOnr)4tBM?)b%pjXMjl(2B;g(4t zHuRnD8rhKyP$*^fJ%8mVeDnGe!hp^P@N7a6v*S$OOn}^=~@__ZRRQ_ z9pqvbd6*)c=hARBx^iQ#4v|fiTRGgQwR7m2Z?^eQJN=yi&XsZ8#AVM^EaG&lr9Nyi z2FE+SLeu(L*)u3&#DiXvwtDQph1P$al>1+Y)_*YZe-EwyO49!qT3MKw+5aOiR!1vt zv*mww?rZ=?t~;PS+{M@h%*;%^JfP2kKs!9jbU1v(ffnzi{`&k8(xFr+DB5bq9TYcZ z;U-o*+-vtf;ZCN32m1S^`+xn|y{R}gy|0a*1n}2|Ul=>TUc|tRoo~ncc`TeFo^E${ zhmQ;ChN`Ucwq`jzm$It5i~G~T6950S1|?1vnH6h21YYMrwYKOv5u1gBZyBFa<`^G``SPW6 zxoaa@e#eArz!KF#14%SD;<=7aC9QCyfp24=JSLLKN})aZ-n6xT!KuNCg$cI2YzQmo zKE|xuVT@qBAiInW5;Fc8h8-O0<-`pu_#s)IB@kX%jhd~dy(0>W-nRnf3k}=WZ3ELs zk|WH85zf7*okcA3_e_fI~hwQyfxOfchQK7=OXpmklE?Dw>e>3OEk??0C z$=zTLM}lQ!*uR`rpZlSkuA07m+Zw&$mJZ(5#YJ7YhX6R5pYPj zzEXOgs|O^lO>sCt1SBN{=E{`n6`B~)d&t*3K4*^`lk z62BCharaIERe8~c8deVIN*<)J0SK{qFScaP&yv@|$Hd9Fi_{4mc z{nHg!69*7oH;+91f>>eTB$kY-3|#Hih0Fw33r{swRLNxQ3Ou3?%F!?6xl|43lv@h0dMsq z&EW})d1etsK$~9NNLpIG6pQCc4^z&o?~5cQ2%0Gtl`>#QaFokfvS+hZwc;*wHO{!I z^BxwR?Raf?w9JP&P6Dj26%&(C|BTtL5p@FM!)0xd8n&uSVq3NyVQ}Ft7{?kvw%&)c zU8fEpC4!H(^I_ z5f!=8L?gP8mENy~vnIIh@~CbL@VOBj?n7l;5+TmXhJvy5HYdQ5!UOA?$(*O5(oye9 zkGI02xiRjWc>1Cv4f{o($*uRCxS;#H`pJ%MKnIMwq>w{erG-JFp<3+E< z%T4nA=)6!?KNie^J2x^6X+N-Z^{>UpUfiONxPU@vA~O!-e#2m+>I0p?(+ij`(vm{h ztU`D~S+t8AsdqcqBMxKfoO6#V+Ok)8rahrg-r%RO}6#TGt1vfiRCe=@N5RbQ-{Vv-tjGjBn{J{a4wm{VE}6!OCP8cd|@Mj zwbK|uY(BK5)dzJ0H)G?0x7zx406aR*1-YV#l4zUCuZIkSiP!c#xP#_1of{fDP&z&bJx2_)gs0CGGNU&xZt`T6 zS0!D28mQz=l7wA+N@GiMf-wZZJB3R>)@^lxf!g0ozAU^!|M@Bp&M{xV<=djU z>uC+E&LoXK`hp#R-V}})WD+^JE0jHQDT<}QaS2T*<_#-^X9RY^Or`E96TD36x_)qq z#d^hfYQLt>q@+fmDT}wMvN^RzDh*X{5wPv|X_^P~)-KPG`l!UL3$tc40_ZR<(2be+ zl6hf^U!{OPZ3s}*fyi-k^HHM8EVpy*@2n&?i+0qkDlQRzCXSF&2dk-%8k7M)ZkQtESvscqCe`Sn*Bpr-w@R$8|^ zZH=B#Xo$cFTcyQ=9H@%)a?>0r&-VB^eO3n^6RTBS-Cv(%e*G+R!zVvlLJ)je}Df-&hp82l}(Z^E^V zwbNxh6>>ypPIir_c8Ms!F#g1bK!VoRCE5+pB*9`q>MT*e)A34mijAU(eXYfD$-BNF z#i_Hx87mE&O{7o|#f-t;NrC*4CLv_0y6Zd*fkHTQPs&vE>*oc6m_Lvt4GxEy5x%J< zYRu}zg)^c0&9dT3T2Vo~aFPGVLsb!VJFTGa3S}fqMV^v+d+lO){)A?ksnuzP_&L@N z^L8%5Yiy-n|6QL~QdX?PwbWgEn6Pkz3xaHwD8W>=I9?tC%;@zD-{fLK+Ft-xvf~TF zD~xV%Ud7&1jteQOl+1=(2?MJh36q)@>4r>qqE?rtlck_mv3bEuPf4(=v zP?OWbftgY+|VoAdVs$DC0EXhi7V2`@Np>3j`SwpYv6*dE_jqKE}+$N77V z8JjICcJrqg<>jvkrm1D^S^ro2a)0rxyM3Cn!WT1xz~gIDT!5pdDC?ZwYLbzq71oJwHLcub?PBDtGy9ewd!7F1;ZSztc{TNITif znl--=IB>r&`z4*Gzlt!Ps6i7w?e8;78vz_eyMH+?{=RL!)E@YF_cBOQi9Hig5rrwD zN=Cn)(*6~gvhii6fK-L61ww$GA?0r00iBDqePPdN|4 zhW0J~;^`utOuXd;ot|D{Vb$$=L73aW*MO3cy98skp+ z!_E%w%4g$ry6SMn%_6hJ{N3~Ro9&Nz5-kt!@Oo9UJq4gR%#iZ~0Dk-#vBrMB&lU4xBHEz2{DPBns-x$McvOLPa1xt^oG%XdoHl(;|^coM6V zOE$(*XT&e07c?r8F53f$UMNT_ozd9cjk(B45B)i<gW(UZ~5rf2Nzu_zzWz#Eb=b?laAJ}eNeS$BJbABcrhG&Qc8J?7P0TjGG3CYLYM`RVRn$8sm#B z6vG85rZRdImBYtB_HU@rHKa3EeDYi7-ti4m@>Lcd>~dK}0I#zZCsIJwtEKvshp35J zD+M_zBf$1VV9R}EfSwX66Yrd?9*@I;#S41VG+l8G3m}S@=4JiUTEXFKnfR?w=NdFZ zpDO)#0@rNhqQm|yRg@HTW1#vmNH*U5z>H~o z$i_3wv=OCdhDHAq0h(PPb^vSDMSaKP?gwMN&ykn*uh`D zmx8JEqcF$Gc5|v!Otd}I_nu6*x{rFm-Ao^==j0@6cwswQhes_cn`)}EY;_`5TkAMO zVv5S%{1M-Wz}ow7IX9H$lrOsk8v0&QFC+9;BS@64-Q;Als21FupN@?+ys<^lLkw8r zX`(Y}7vhc&7;o!O&uLu0_i2S^YfoU3m5V|A*XY3mYIX+eJ2(ETL0db&F<~pK zk3Acgc($hpNvE{q6(Orl?pXg+ejj{2mV+GVEP8}XhW>rR?Z!*whT9K)i7uS@HLu_E zxfyb*?rn;lU1Qoh_m#dgeP?sk!w zrn=3Je=SJ#6aE6iPO^vEMWJY;Q#1VU2*w`p!44=F8?Y6{WB)O$?zX4E)$8Q&4^nsYT81B z7%+6no)flQ-g@1)w*3bw8_+Wxz0d^xu-JdQ<(9QnDiSM>Wd}e8XJ2SjlE-;GlFKDe z32txVg28Lce;S$xI&W@z-dkCB`2PNgEpGhV5d(2IzHJ}p3V7jgc0KLf-R*@n{|LXQ zJ_>}5LskBK_vd58OimEuQ{jVV!)%G~;(5*cduAZ>&$iA^o>R&xkNUNf-N{uWt_}$+ zaD(F!RXbrKYl<$4e`W5@avc9s96!rW{Q1Y1-Nu@D>K8Q4;4LfvKCl9)%wbiznh4G# zU@mUiPx@VI0Qwv3C;blglYV!9*ve*m-4>tHvnb4SZ%IBQJ4BeQO!%7-Ql%(QL#9~J9`$|A->~YczX%!jw$K$eB{J# zXL(uAz_%!?30y%Uf)vpoqU$krXVeomQskb**s899eRVH`c^31<%9}Ks-I&SA)<6Hd zsXI8!Fr;VCSt5K~^GwK7y~5d(L>jdU!qdmon7HdB3tuk=z*Is(qEgbFJgL%ghus7B zEZZ@KMJ<2l0d5%8}XfNBE zWT2j@ui@=h z_aSz&1;28^B29jxF^b8o9Sh@WEpX_lCmUL$@hbuhu^?!QznX>sO!A;)c4#xJur5>o zw22GUT7dn{xOSJNC4fOMU~L>D52CbSVm)B3N)Wm)A9-pfoMExuXoJ zFW<*L_@Cp4K5KBnpCU{Y9wy4cGX(@w=)XHXBaKRe+KfRHg$QDw*9CVEMy6n;vkwvRfxd77fESqqK^j zAkKga`$CxtWh)@((c<+M(I#B`iSP-nD4n>Xr|?==I!T7t4Htm*iiCkD#*ltL#;1S< zTVlG3O9i|pg=cK9q>_9Q&q6O3=9^=!Lu?_VL(IYhMIQiKf2Q7b%QBOJQ^BpGq$j-a zlBd!3LqUD#pP3K>KPJwzHdtA}5W3`KJ?6?x*mEIDgy&8s4f|P&XXNZghyV@xbf4N16PAErpn(g!s`?GuRLD z8NNuz{6X{E^G0G3dK`f-C=iWM*ZKJs2!V|LB&%6r!598|zzibEx)Z}(Q3KP^hs8DB zGYl}^p8;f~j7S5(MVw`_lx_0DgTTF1Ne&<(atI$e3Hk6Cs{~|HaJX(|gcVo#Q{o*7 zRe3VuQWUi)P6o8tglDom7x`mprkwQYV^=wb#8qNEgI75QKvkVYcrQu0dWmmY`e*1B zt3|m@7&=B!Rw$(`pUoXA2CIU^CSn*|k;EOoudcv@|87-XY4_#zTG_7HF*!@PUW+`D znrCy6dJ9nYoTF8*;17J(y$X2-jzB#U5xeO;Dhc(IWs}Y-Qb@~cYafvmYKO|PW@@D6 zZ%X>aLUhha$Ie+Ql4j0w8-9_x$Cig|NXF7WNNu<`-apV;FxuvuXvr|{V#oD`DAteg z9^EItt`U(uZ1`+jZSj$y7_D2aJ_7bY-yR))gkjlxV|z2~(T{U1X`2Q+P-FwKz#&Me zt`N`aN)`Ri$0m$*IYzbp`%r!XI#q4j7dqDIlEk|WR{6W*eEy21azCN&@~z;X3Z~c~ zF*0lzsK#e(K|x1_%n205{&Z6Ia!{y5FW;pb+M^-U7x#kek!vKt)#XJhHc`SH zveK+ZK)hg8GKGwN0C*JURbl_qZ3vL(ywkU`Ui?Xfw-Cy{9(2KiQw6RK$Xv|z;OrPg zBGDj+E{G3ggeGBcXGYN``?Rj%s5F7tl0GA@i~t$O*~I__&%JSQG|++{>uYIub+m4nD1B^3*_(@&@G0ivc7XnhfBxM3Kn=+Et<`MRk9A zEATM7{=(f``0S|xjxZ!#$)x~dK1ox-W7_2d&#XlAx*jcuSZyqrz7WMOHOCbysxL#5 z;dY`f)sRErD6^Wt2dMsBuG(zUX;c1)gi#v0gtRwPUD_jH(>A?Mo;3Ds;UxHgj|&I@ zvC5DTB5h9R63kF6kpM%81FSFOK>Mc&0~lc-+%rNw(bsNkCu5t{BFGp5)IlE?s4*jp z2hJ}yYjT~MFh4hIapZv_cOJMegRJa8qdi95*JdSPm1f66t+9zvQWThWzS7-{Ph+wn z=&+0W#8R!_9$rPjR5moIFoc-$0qK+(tS8OCp|>RnL6LV0#a1F(CdhqXnZ34G+I#;< zxTqpLxiv2i%iMHQh}sIFn#xGkMrH>lEmYEZ?5i7x;}AZRfVsCV(sgefJQ4~n{{c}l ze~!5{6w1B}wJ~`Srt3Kkg;k)zUC!2tA!o~MTs;~%41}g`v~~vxR|w|4!wELfUvkirml$>$ zZn2_^Jt(u_?|#g0=W8c)#XgVAal%2;B=y0eHBI5*D>`r>dV8?XSp(0Gi*a3Lqh}+d z9wrgGL@u-`r_}X=cN{Qd4J;FS%g*J%L-$Ej%^P8n49Lb>IjNo6Zo`9v2lYD{8Fo41 zM3&*AW8Wc5OgI1JITjr_+r?p5%yLhFpfnyyDiRwf!eg}Z-KitmR#g;oC?u_`(F^pn z=rsAY*#TELSD!?j`nf3&I4CiCz-*raC+z7$-WogshDIgCPeC@jw@I&FjV+F_P)^+A z?mFp02RoABt$ef&12UD^*@gCWnzhBOg$rMXV}?+-E0W8;-Fk}T;XuQM8ZNbz zSjWXl2(d|;Sv~>n$%)z9P`!w~e@~XMKCp*Dh%#vya8?X`520t!sTxsygX4$EG$N4# z^kS;leG`<2=4qC4)E)F#1)8O1qLx*unGb4|h(XerwuoJ#^hbyfywP$N@U!8}u`2Zt z%(#q6YZjvL;26R0#V==uVY2d(v>e!6P3#vXE=^-Q?*huNa#UrypB4KCpRwWupx$MD zE-#0QZV~7G2gmfrlxcrfFMPg`RUAnTF7a6gOm{+q_1Vs}Vo_n~mAVT}cTVW@1bN=7g%=x*?h@~^u&i)Ak1qhOHO;Y}-BejJ*Q%MB$*$_uI&%j+GB|-bMxW=>%hxNI zRkjD+LY3?X-rch#N(qFd3JdFQ=Sw9YR~JEIxkcciJaJ)S_abihP4ADb&jZ(ovEpB+ z7Or6?UN=?C&76&uANEm`c4^rdepPoK zwE>r&GUTPg?4bI1s;w?q1zpu%G%G8ciZplEG#w~|cOu8PX5$worVVgQX{&z&tyUOD zy}X-I&21JztXbwaot0k1aYUZ8bzw2sQ@|(VEm?wwg^X(tlEMkaV@K|a^CjO1rV{_HQc>sI ze$OT~QLwd0{j>R=eZyF;Vl`8uzf9g?`g1YbsEFhA-s#-4@51}VP6z#ZS@5G3}i@0HcF zQaK4eBvh$n_PHX~j0Rb7FF%&p7=HR$y12te1^g-oVnTx>KfgyUP5=K!dQZw!hC-2X&en;L z_BwmTT1A`i*&8AG7b5g+{O#ejAvi9z$qX@#tk19P!eJ=kr};&OVZr?!_Z zhnsFOR*)a>iGOrJEhB1-UO$>9qCe$sl3u+(y}!5566fIK)vrAjEVrf83V`E-cL&p=Q3$)O~dKnj7_8aEljs_ zs*$)zrNBzm*9jVkC2^4W^RPQ28Aj7}o56!_cg3uyNhKp)z7?zPDoFx_!h&*pcK7b#A>m-|EgIBs70kQb_wz zG!`<jw zndaqG7!G3-tbj^Ad3t3}BNVP`NW?4)EY^!>4r%KZ5t0AFI%wqp9M_qkSb|Ak_5Z=iM$n+x*a6`d$_W1Ep{&?pIw6uljra4pVJQhD#&+Xax!qV z1S!Go3Y96};0Nn%dM|hco@{%J{xC2pOZaTv|4}2iUuEg0%&>yIn)gc?bc5*ua)hayy5y#OklEh#T#{VE7z!T~HpB4m|=CZjfcD1PHKH26Yp zpz4B+rG8!6UCCNb|3b6Zt26YdNDhdaGHX)+MLkAd!Zp2Sgoh9vc@71s$VC6ULkoOu z#Oq-!3M$n^nOVWJEAk#lYrme)`9<#HbV$Kig4Ws~ zF7>+*;RI&rS})3VOL0(EaLH`4CC|@*4CG0dZ$)dv*bdJK3ue@Ze`>@nVt#*zvd59~ zwNoIceB-E-Zt<5vgedh7GsAIHYt|9SyH3&JN+3Sdm93$FO1A*R5*lN)ym|jxp1o5RV5xFrh6Eh!tnnoXo~lgp30}S98JG2L}8hy*D9dINIR>CnwP**t+=?D&@o9MR?|$&#ZE|q zIuUhXUSA!tfY1^kLA?IhBJ@PGfF8fETl?0^lic}3qCoGQnLH7$TZZ2SQdG0&+yImv zV5Qdya(}mLzqM7+j(E|^PoDBS9CKGkOEKVCBY@S;Kb2A9)P=}EO=0*<{!cO!p;X>u z1!C@K2)R$#;=EU)K3)DC`N`fzxt%Cz!c9PHkMv-1{ghTRRR9a zt70Dkmhug4okQeww1B{RC2mIxK382pKEfG!j!2qJ_11?fWSw z3_{gyHEAy|z!dn$5t3bgAeuA}{jo-N;hVxA(;HIooV(l;=H#O8A1;+AS)$qqq|o7# za$1&GFkQ|4jiX}lA>Lx*Pv>8JEkX%r_I*Jn{Z#E56-GY>c0_3|v~itNKsSxDhdfR& zm5F17E(|)8&OGiCrdzO?e7Lz{B84;Fm?CPB(?j{6(%w=X8)*_Vw_GI3U@H9iMWh{~ z@c6pU+hm^RRMCWRNHts;1|CO~9d>oRV_$qHz7qMXlFDSLsN=RCp&P~lKW zZg1vz^6REf!XS)f?`%rw4_M88fFc_0YLq9#G=}`BDlu#xDUg6N+7P2|V6I>e!=}|W zE_I#uHb;Ksv|;r+2Lmkay4WQ`w%nlhfwyo-($A$CM>`m6-#Y>QF~)G`806?TP>ZHr zU2tHO%~Rm=k)E&i+6Q=p4iS2WeEA^e7Ee|9!_L=n`g#f>7Y+@y z!NBYAQhwCb5-g7+ts>-6Vi^IK)ExEDErg#Sbw?;@hB**Q2Q+^)3Dcm$h4j5MxbXN# zUrA?p8WSj3MUB7su6rc!+|DzO6mt6dCew`OBQ>RSWlv5|6z{qt)5#!Y))Bdh`D)A} zhr-c?LPn@y>1H8}tI@l7{d<1G{>Fh(See*~3EO%`7Z%(|w&VJcof$3kD9)KlvucK$ zw0rQmj;nQ``E#|ds6mLGI);Obta@{wOv-n58S1hmw+KrG9&z^t2G=Vy!X3f&l1a!( z#%CuCAV&TD{=CSX@A8Va(Hd;u9374XzQL#piN1gW{REntNBFSGNA#Z7ioiPfW1|<> zBRO^Tj0#lVa!cjB9ON>h&9%#>7L1HdhP)oRFf1)W*Tx6a#y3B(XYLeU3^(Q7<0>ym z&&%wu4>85@o@_sASCY4T42Rvcqw-9kyGX!{`@F~R4f&5I|3 zb<@7N0|f~*m>J(HLUP@~{yfZYAg(T&*qR@oF*O5KnC*q?Y^bM?u4kmm58Ezwb{&g8 zP#l1<0;^n6s~Vp!1aqF1W&ft9lYJq`xZCa}b+X^7pEZk8fzJX@W;yWIpa=)rixV5? zdMw^5nubb>AP0dWhh^AH$xT^7KJMBcr@!XNl(@JuB=kZ^7I~}Cc6>`S4S%FvoSlEa zmfB}^*77@aJfmIkhm`$UwR8PQ=^+PwpsOk=bF9^lP1OK*Fyid0(s%1ps^qg^hkWs% ziFrkJRJ~=#2U88L{qhhDK`W_Hl-fqFrf=_;oD{K^A*fg#(Bvf>`_`51)bfOV< ziN4M(cQ);pm0l!j19IV<`J6PmXvaze-6Xn;)?O;;)Zg)3Xr}Sgawwd z*dZ13jRX)HI@vUB8*U6ewHhN+Me1MOXL0KwvQyjZnC|<;Xj{L3c6iK_)ZV*84J1q` zX^O+y+0QfyzdW#E;p8*xGzcH)>)TQ5Ey5Qont_*}F@-sBBSZJ>{^B*X&ZDwG-15M6 z2d|nYO0mTJO}W(9h`(nZrlI!nO!-=ctE@Vij?t7{K61V^gI1*^jgjOjwTNd)l}?uf zos{9x6`SEPwbn1RUcvT&_BeWCPM)`>&zt4xMJwUBg8RDW($d#d4>>B_M_c8rlC2s2 z;09hgBRzP3B-}>3>gd|hr{A%uyI^S>rbLELlZ;AoYZq+XWIBno*WA9AgHQk5(6!b> zQ}G8h`7^O&eP>>_=BL7J+d<`ZT<~4@-8b!<7<#*^6XO%5_B{exK1At6FR(sJI#)6I zNyn}0nA+GHXRdN{M16mi@rsN*E5W=mNnBbwS2iuJ8ynXVK_G*7#S=*Fo9XwlcB@r{ z!+w7!*M(ye?dU4)$b8G@Kv>LY&hl4J`F{yd|Jl^{e;l6v|1ybZ{AbMkAMlhBz`*!# z!P767r1inS4i5CN@W~3E?2V^z>Odzt^6xYOxs`?GI>p`*K+1B`y+6JOIolZr?S)aX zN9xdx?AsYlzOw|!q3&#Dk-%w5?s#4;6lKA0y^p2h@qUShFBH*%mv(x*>|bqgE6e|a z=f&RS#Wr9ajlEiw&^*ScR#oDD^LSdz!VQJMTghzUE_*0nt8=}5JlW~nxd4tY>)-1c zWS7Zk=U$s3q=3oa@1>N)moN{QMCx8RjK05KdU=w(4Oe_`|1>4TnyKvqA_~gdMPwBN z{gQ7hJb+Sa?d_0&LK{|R*XY-#-_8b3o{`uYlL5E9YSYE>o)ux{y%T)lLd zs_@|M>@o#4HEhN#R2*%De=vt@qTe}MlL_{k*&&TIDwwIwg8SroqbCf=f8veHMU~QY z-8oFpftvkGFI>h&Z_4q4og=8%Pis5zC$N1YHt?QbHhu@-wL3#YxK8%3l6F}E@Eja@ zwNWDG4K2acb`COiMpCS*@%}`1fi}MI_AW7?8v`S&JpRvRi z>#GCR#4Fp+gFSc=+f2e#`MIWOoTl)9lY9d~w54%f1I%ftDc3T@ z;D6D#B#z;VL5UI;w9+z|r6eeppAZ_mCnM1!tC!GLcSZ*QEB#Qv(09cOemx!7+T3KZ z#^LNCOM@TG_oJ;bgM^tELM_Q9Mv>@Y4t48`CW=eBrQq%`z11pNZDy^s34SKB8%_CteE2q$0_mH&~Jc z>jp2R-v82r&cmOR7BHI2b5nJyyG(G5h+n~J#%o_x_kgGc`J>a}X-j4o7M~-MXOPgw zzaJ5L<5F&<1#R3hw&Ded=fzBSmU$T*uV+QASdbjfXOf^z?n2Z<&;cjvWoFri6Mf~M ziHd=u)YVq?fnhYIc3iDYl(LhC=FD0UH!u!#*FGrJQ1C|$;tqLZASDDLR>8!wslfE# ziMI8tazdEMm-A>_gyxd|^EMGcqZSY8RR%k%rmw}skhFF_))otvOxcEPw7QDwnZDHx3q|9R>PnIp!c+tKpElV_Hg3&9G-kjC5jll79#fA zyez;zZ1nU}ah)OPa!>VgYBd%k$dj&(B%ON@0lS!tBBk+}{Mc}UnFPkS>;`t&Z*=YP zZ#RMS%CN5;=F8iM#)q4Nr_c6lV=iS1)A9wh@qWEaL`{!gWpHZ!5R)TUrT$eMPkJ27 zJBzO^=jtG*@9I6`MsMmZ?O97S;FQn9Q_34|3l&MT6|Be;f40hvCel>UdrdM$Jx2@X zh-9s1r-pQthklek-yUO_J)eAbEymS-9G2IgDU?$GMps8}Qcf`hCQw3Iidz{? zd`(W21#SCS;H)012^Y7nrmGJ=tM2KPZN3OUyl+|Cb|`yfghs6mSMb=Z!MC)AXj!K= zf0b?BBf?v=45h6at^3Vv(|j1HHOM58fYV0o2X|p{qMgQFm+SajMy~ z0`Br0UQwdV8l*4au5P@_iVQW+npN;Etc_gsEYl!tskXbNg*V!}JB>W$G`lXv4%0@0 z6p7!4v8zq%3?Xn~4Okt8D5?Q2*6$@aa>uGGM1+#BT^?AVSj2ewJ-Jo*$udCk<^eib zYg31p24~Pq)%RH{mL(X348-wf-F-bNsm5nPVni*$c;p3`VBdmaR0ywRUI=k98f-WI z2o55m_I8J#cb?kL`p%@}S&$7nIWvjZFAdq=7QccP|0?>#YD{yh-Yd~TO`D=^a?ad; zl^@$ECsW(WWyMO{nY-2U`!*wBZ{c=c^f9*DNYwvAUqj10G{PbzzSAyhO2c5fDou&z zj)FqA)2uux)y95R*^5E<`^OT1B5p`xukk{s>#=V%aRvA-XA_q30 zhV3o8>2~OotqE-I@`@J1t!xB$=g(=X6pY;q1uWCIOZRP5@>Gc9O=M7Ol1yw97JUq5 zI0=*8tZysm=LF^%gjiNRits{JkOew%&N`(%L#IIqu(LW3=SsA=ipwm%8suw}CArn> z8*oBGQpjMTz0Bf)@G?u?>l4Y@1p2f{@06(b?(cD}Q_2pA86Y%h=4l2dSjhXWqm z8rVp+8Q8#!0o)@X32yE>GA>4K8KTqU-!Q(ZkBqu1z!~Ib0Yh9-)WXSE>xRLz^3bd! zFY%9Co(B`ZwbftoF5dY@3mJ%bD1h_K_Oov%j-OlqFQ*>X$eHi@M zcER0=xx;~wGVZH&y-#CgM}hI?yD!B?+z0s)MH^R?e%>o>BQrW&@d_4&|B)pV?}slA z5gXs<@|CXO|n z!Dm-YR!otZ()8lN@H^@P@uK94w@J!z@?Ru-jLeK|U)6&Ds%^w?Wo7N~S7N2$sOR8n zV~9^DWol*qSBJczz5~8GI|D5n3kw4iJ}V;=Ejtq%KI7LffSLZU9tKugdUhtwzXl6f z+ZhpLC*4E~9dKT7tbe6iNR&@4u`gHmx46HQt z02)hcJ3|^HM+ZkcLwj0F1B$OHd3d0{K898Xe+3N1#Qd*f{~weq{wtCG?+Y>i@eJhu zt6k1Nr{Vu7$S~3Wn|3+s(O6A?`GU%7b~m)q3gT`;8_Qju6YxQ!Kd2`Juky>Ii2GQ9 zpnRpgY_l3{f_6c1PWtZP(5A!_F@0m~TkMCsJLSuEZ|}m}6BIq^w^py$hZD+MSns>< zyq`_)Pp3iF-tSLi2W6bAP&J;PeFrD+BJ~B-#*^qdjiZ3R$o0-o*W2@OoI`9nTejI9 za(Gckwv(hS%PsG^7SHHW!(2OSfsCPFUTmp7Kjpa*f}osJ%ya2eOU{6n51w*dKPy~6 z4ZTH%D>px}DX}69AAyl)vfwUtjV^4IM@-g{I)%TLv;6#~Wq(1U6$b4%5IFer9rnHNr^nvKWmU#O*($*kRpz4{`HOomWQ$+AdAJCiI z=WehFZHjWL`_RGv9(>$h0 zbNQWwSv&7ss@eBkftHJKJ+=)LEAJX92&(+GhkJ@8jfIW#E1dg!Jnz*z*458maOUd= z9z531)i-){Oo1$y$ibTmL+P@eehK6#Z*&L~qH=GJbnbE3`Y_0D+n?b(FRwPW9Hy?ZSzOH%pg8UEBaj}i!LS6HwEvn_ruV}HT z1FJW8d#*QfQHuN1Le1dz^n)RWOUG4jhq2gWK=YCe>_Z$!I><1%r z&bc1%9l=pZ;%0aM4DTI05})z(=EZiKz?x&(l_$5tpb!OAh(*RArGMFMdwvnHu%w$P zhr10|xuAAZ9*wN=<~DXEIeu(*rlbjlgoCRT7e@+^O9$cSExn_t9hGzhMQQCgc}Sy) z%TQ&?iQ_lTlQYuVqG1(tn|!*KyqHer-_5C28EJ~g(k5T}$RR8Vg@XH{!gG?*3?K*d z3pC`;@b6rye&Yhp-VtM+_c8re+Y{bzyyPE1f-i&!j2XI3}+&(Qef2o z4ztYaxS`2!wfEsAFZu+uw$yZbK`R9xP+_{3o{ixN!vmp@{NxSF1#t+>MEr*Mgx{{C z)o;iUjFRrTy-Q=(GLXEkr)8zd+ob!}ZrT~#g7{rRg3a0g+K&9tFV}5-Q)`kR3;wZa z0I9OsV6hPDYy*V*29fk)0b5660Oi^C{ZCa2A0c@YAtjWyLeIs(I#bxb8LiAc_JIgL zfNCQjI$g1rdo_YKxK*`3bcys=&98DUA);cY?UXWhM8ri>%(=GFc!=GkSa{A;VFmo^7<-qT88b!Ky6dcsYku0vbB&gW%^o#-!R{s>M@w6V*q=3vYN~RB!8U@}SmbWn z$rK#Zp8800kvV*apLH76-XcG*A$B5<6IO*^HU8W& zKZR@nRvXG8QK1MJTIUxO`j+Br4@?3K{i1Rg)(2)YX4qfN$HwIcg3LhuVzc98VCubk zOWj&#%GXfOd&6JhVY9}tL+B#ee8-ibAm3dhz%OEeB~R($KN@g zfiqt*hA0$zQtOa)pAnH8{jL?wS!kd_G|RDusK|G1p#z3uyV+o$LqnKyrP9SJfG`u4 zl$M*&J%5)%7U?VjDABn`?axT>TWaJc-2z~^pfn5uhJ+$#qR)^b+SPkSJ7_CC6W`XJ z&8&{-G3?|rc>hPd+4#kc3U#L=4mFyD9!B~A#>o?8dVD!irUArUssqqUrF*sqFyAGY zW0M-MN0?!aHBl{p$0$2SUahX$W1CV?9a#U*;QFCUbk!nZxOl~U#m9Ky(CrDpm2G1! zSY}@|V3ADy%87}H9rU2Xh-XSjE&GLex-=rrS|-j7j2C$Rg<_SXg0QSyS2wn|Kt@%$ zWHd3G4-jutS=dwmXd&pI27g2g?l?n7N*nC+s^URbFS`OyS@I;T))s1bc(@?v5)(xK z?Gww(M;z5HgFr(nB(}r$0QvV;%Pxb9*5O8?Q8iF$0pv=g9dYK8pR3v;_OBBu8$evs z8G^g@q!tV7CTzy(oemVWfT?9mIU>!|iiDY9R*eD8@AlnSWuyw8hoTZ9^@|pMCUaDQ zuLI8%!Xju5H!Bn?;cmg-a9CO_ewZq5XW-5*q6)OolIDy;Qj|_xVJmhNJ7;MbhWT75 z;f`;8gF{~@5u-Qk=cC0X47?Yp7E@xR>gK?h7C)foqss=7HmjhF)$%Fs&BjpD`+823 z+)%uiJxvOiQe`0!?REF4PC&Oo__H=O8j50iwz#Jd2Lu`R@bO|~&j<0CwUsT8Du z+_y#M-g?lsKw0Rs!{-0>I#>M$T<=+~)NCjru^^?TcyxJP#^n))rj zIVS@WR+n0INDj%+aG1xJRKnfv-m9IOX=aB?Um1#nFPY=!F>xoU*mW%3oL97SP4-GQd0_xT_w0r{qZU z#>QxL5>B}M?zOBM(2SD(+tp_h3O-5yvMi%Md|r$Ysv(BO?C!f10E~ZkViEs%zdl%m zAx?{=K*R9HfqRZo(yb8--(}DZ)nfCHDMd+WQL-yu7H86|3391Gyzjkd`8|7W; zv}<7HvAX!k51Ck272>)^ftFBcQgLj4%tWK`7bPx}J3^7&UqM-5k? zEj%;>4vKwwCl+xDsZ7VM$-?w4Z>NB1QQhDGqmY|7ikOsQ{Umi~;+_=v=tq^33GjRt z(a_y!Aq$?~QXx&AKh$OHa|EjMdvS>)46j0Q;#TVlMh|GXqGNg~1G~MnQMc5%Q~9Kh zkWX!!3Yf&*Q^Uq1yCdb;Q+voig<8}c0G*yA`|MLg4D1 zddVli;6`NW+Q(4NoG?IBj>Liw*C<-pFzfke9G1C5C}*TBd;3=QaCgh6?!3T?&-goioplIIT%2RjK9!OpDH_ z`7%*sP~4nrX$4MXOFrUZ)dYD{t9SqL>>e*Gy-I!4;S z%@v9TfGt9-N7AomFow)=IIVPJ=F`ChXeqq&>?n5ieGl>_ao{@Pm3zbP)$%gvpDE=|+j4W;QxC&Y2OdK}#8gCo;XILjzFG=D;2a zgXMuxjzJB}3t#1OLCd5gIrd1paG|q0I9$osYYj}38+RDEsFXtau8rQzCpWbw?6OOU zMGIv;;!4W+!GsR&9}kZuZy^89mgKTAf^2OMWGeZ@;T_Qb7UOOZdj`wL9W757uSLhq zx8uTYBDCN9!c@ETHN6qTH^OW2g z3UysE^Jl|^lli*dR#>IPR{KjEie*N;x)Yf^aIZFJ>2V|ab*Im-12D3oxl>18$JfSS z8_Mf|8{~C~5`p@@Z!i^R9i{ikil<4j@^i*z^JLt6+Bwsq zt!c%(a*luzc@j*eO{Nrbo6LdGtIzadcY6sZ4sD^~$sSHEzZ^HJx@HPWp9#*ugJ z7wu71m>7oQzUyiiAA-=3*{3cq)>~JG^wo>4Am^2zpWrq*ruF{j{g-g{_{=!12HnQ|C@+WJQ}M7wezt`mXxngnv;2N7j8N7&MjHt`!&rdfz$Sg zu8~i@=SWvpw32)Uad?7+QJtBFYy1+bh+Oe`0&>;>yI(7OmG?^sg?i z_t(#~=q$SBgWI7kIxmlW*u%8PELy8A?JG~JKFTuYB&=h~iTdUC&+|W7RgHg10&f7$ zGY2kIFESTSy)8FC9j>o%Gs5`}rC)jA&pjT?-B}?ge9R@*4Xr{n$|OV}bxsc9?{|}4 zt{)GuXji>Hn@-C`#~#3bw%`)-UK8L*h_v_^E8+fvz~{|f1Ly7}fd z1MBpOae6=8%IVeqbU9Fj3;9LgGn$%`>GCLct*e!{(G{~+5jM!z)6r?KU+v1lIUS9x zICD8){{Ci|h%Dk%_RwV2Lq<4lT~2BDTO9eM&wc~oYL&mE#90D-$*9CWkq$G(pB#mP z(^9g-BXjWrM&3=io0XD@FhWO3ajFp@!I@I<@@z-PltR@FrnJq2tKnC66%kkx;UE-? zaY^rgSuBcj0Vbc_v&At#mL`ULI`9yXuvkmDlOH9U>V`rJ2$+6%c-2WN&`27c?uWAl5a8e{ll;X@#1UPPHwkVwgB#=e)_VHXJrv6Ltu z1g3l;b1&G8lLFN{VEUc57#?fGKH9r(;J#Ev!}~%~kuSt4pRm!=@zbzHjJQ|`NJ(^k zl|C^9{`(?2p3H|_fUL7|()QfdL;|aMzSvwPnb{z8s-H;JG)YiNeV_RZesYEwG;kAk z5R#xs28APNTBywsk_Q9*MtWjxcIW_TM%EB^6udexZH8hjd*kY0#AY40D42U-vf}6{ z{j0;()2$pEIh&XPHSvuNHq71igw5n|nEnSPQ}HPRCz^s3)K#6&xf@$gp=NpnZdmCu zcU2#(h43I{B?!$XjR0Q(RS&l8t__HE8#+R^HADBa{$BmUre1Ob@Q->!q32-HhRhUK%Vrd7t54CnVUGPbj9dkEi+ z;6{MZj%bh?5vCSF*PD%Bh-g0<-2=D8fNSx04qH55VL6NG_<=0BB_g1QxR; zNoC1jt7_R=w`2PX%+bOHL7GtM)2#4i=_Utdg#(3WPm^zsKs@J9I7SP4;krg+j$iai>nrJ$c^X{Opufe|tZ@!rWnuZdfN60}J93Oduy&pj zqiDd06f^OpF-Zy9U0uZJ6>c*Yr|^UNSJNYQ!_V1rjf4G438^1X;Rt@ThOtcocz#~Z zt=j-$<%`b(Gi?h9l7d(oo8td$*8KsAAnM36%_id4H5EB{1Qllb8_l1Xz7k1q`GLm2 zvg~vDoCdU)zO_a74u59jo8J24Q=9G^;uaQck6Z-1iN!_M<@P1{;N_LE?K^D13Gh<9 z-ksQegNge_=n0=}Y_Sc*-8e*P*VHaix+K?_=-mXvFNo8~nEd@xg&3drFrc>R4g5BOKO9p9gGw+aVPi2i~Q2)NUHaiSCs;GNqp`u77wtf4pFDKkW z_X2bs34`ByaT`Pk-P<9elXre@G2Y07j+hh(?RE^lx_`Fxo5|5w<~uxQWEE%|*6)PK z*j%t<&fY;pb)o^N#DZkN}6yf~n1QGv89EXSDSk<`n+6rs^J ztg9{mI&$2eA-C#RCR@igY{wQio*w6n@31hR3>p-lUS}F`ptKAZ8N|_Oc}HmYdKS|p zxzTVd5w8ptK#0K1ZXjI1$5bvo5WUuU!j2*6aV_V4UJS-ql@5G9&hLPGwaT+7u}r1U zHw6PA1gAfuTdQ~I?8Tp6ghk7nC=ZCo#(UU0NZv%6G&HEsOM6hQi422QGC=~WqRQfC zLXLCqCyha8_g_6&Cs4Kg<_bHGiPOtoU(zt$i2JS?`GEaE)74_B2+PDbchNZmbWzyo zoTJd81$Bbs$59t&bT^5vo;Jhx3B3~8XuKd)JgM5*$0^EtTiNf# z4eLXhq%ZFKcq{}=tLj*JrT|1KW|vKrkIt>!5J?GiyhW80Wn1x32ui=UR^Aa=MI6&3&F+H#Cxk(KgpIKAzn_`!!~yvx?Rc?=k6)&X)Ot}NOSy(lCRy0 zZ0gq}rc63&DFE^Pg2vqhF(*rjFKv#C>NyG+-l`hva4TSJdl1mU0N6>hDkvdqh%H|!N4~c zTd>0d%LqPX>~YLF$x8HB%`V8UG(gz9WQU(RY<9vOwto+lpsTNcM&P2WyO5_!23nZ+ zvk+Y=8Iz}nzr}oW&+ABuEr;AFsav{_Z1UVyOH$SvQh|12$<0pf+|7Lki(wv6n@hdR zBuLBrQs1PPza<0`cNI}Ccx(B2i6nuEJ=0s$0t+^F)EYpw^g^uIj4zJ3DlM@&I#DzX zmvgt6ZwT?bQVL~-IJHCxMuxrtHV^%XU8oxhwX#IUl0p18|3!BqJmobV=hb;*x@>-G zEagBX)%3Ti2B4ey1vgKyJ?vS*sZ~Z^?RUUD0%x|0otAyU_DXib{Pz@2y}9MCex3<~ z;fpaH23{B+V_=I;O7Mf5^YTl=Uxn~?W+XbMm3AMwdt7SMUHOKLL@q1%F=&W%wpCHd zie__<3S@sYZ3R0M)PLC$Bv1i*BvR*S!z>*0v#yM2Vjoa(qQ3}bhU_f;U zykwxYeG!V9e8GoCQ{`-{0^4+{_8S0+88|aZLp#7>Ax!bcOa~ZIkYuA# z*r65z^Of?1n0HL>exmit0*8ilk`iDd5gT{7!&*QV?UDm&8tI+J?#`%3O4++0nv6{e zF@|($V z#KomeQ&bGH#1#EZ+cJN1ymCo|3&#zO^hKeuOS5aHI_%kwLWYyYv1gW$jdDw~Pqrei z@pvv@6An?3X=Vw_C`e;U)yyR%F-PmMyCanffX>~Z5{$x>-E-|*AZkx3NW1x;x{mt( zqI=*n^d1K4J}aKH{O0KaNH_oa*`58HT_)vAfxPHmhJd_ixjs5xE}v!#YTe;NY@aVa z5Zj#XBGue5n&3};wB>w_$TS+1Kt+MqRP#LD;rJ#P8RsD`O*`-IHjX02Dd~wg=Ot%` zW8vqWZGH!bb(zqhUfdX;ec&HSdiR&%5PxC!#?E_}Db{@eQ%OoDPF6{urF(pxr7;HbvJN$LXkB};a$KO%*3{ws+=p&sUjGVcIZ^xO*!u&#DIn;eU zl3S!_RPI{iFwc^?BoB*99;WK3RAMf}rr73}TN^_*}6`P^H|`%6#5#9jy@p z9e(~<*6~`A{hi?>BVyz=P1}fYAr#kno_UjM&fE)hM*fP26!A!h9i&!Cc zJCUaN>F;vU0xN|Ke>Bf?JwByUb^D z&qg#Jt=3)*qV!d7ab#VfTrs9zncJ-%;w`6VXKCZ|%EAGb2s|RH&Eoi=CU}i&kzjLN zbbKm%s&cOcNh7YEiaD!AK>`h+Y{Dp#)I5v}p!Mlf@$5!iTx{>+ZM?jkO#A^rV4 zjX~^!K)Ng{mpZS3L)v_zVCW6p(DKd;nj|5_#fpToO=zo!5HjCcR` zum8NMe{cd>+5UY_VDn$bt~nOa`jO2VnSGqwIP-wUInX1kM*8VsY4v%ET2C?gzvP79 zaV0QA^Tjj=^@rT~^-P6ggZFlvEB9a&(?8yUkMv0B%`+-CJvBUUtt-6RUza}1oU@eM zU*0a}PSVWFflAXJ%O)nE9x7mrf0@T5I!M{ml%_?Ob$NE|rqAKkJ6l}lc8on#N`Go? zw5w`vAlSwdT+|o2l3zbm`b*mZfFg-Hq+k*2^=gNK6t=8SPdz=~=i7m2X5O_WskaRu zeShS7pI0e%r^Ew^l({LnkWf*U`CtrH1bz5>3&Q@2`(BujaCfCkg4&@>{{9!#%{8A* z6x*tFxAdVf>|Qu;6X=Op?6eX^iZG*c@_Y~$qIY?zJ^^1xz44)hZ}n_?nL6?8hS>h- z0zW=%!?QLIV59&CIpp|wb-&VP=EI7jJorjy(VOhA-sp-q8sxb=!db15H$n| z7)c$U= z6`z6(!UU55#APF(r*mn<#AB`iDSyOGI?%&jB zq6S~NPHK7Aq#V0C%+0Qinq*L~xaKy~cWjZmC6j9hL1UZr+r4HaRH8$BTy}cj(dB0@ zL1`s96$YzD{fX@kMHB-;?>U%wCjg^b7$i*vH3kiapb?&D0{9EQ&m#4Z*P<3_iU+VlcY;~u{rJay}i0@$Xwpvqmp8X&b2E{E40y4CHx{4E_R0`)( zi4HO6ugwUkcH~WXb&AV$I=HsSYheo)uq>Rb2qC((c03|5q8vWJ$)aN;iw#ncWagz0 z3?W1gl+=L0xb?^lRG2EM5bVni4b~6B6%qPLYRn%wv9o5Wef`yYJ$;z=PK{t>hW%9( z!u)*C{1>M@8CL4q6+gZsr=oCJf*%EH-KbbqsTQ!*ERpv4El2@Wf`!-vn?X#WB`A3I zTc;N5!t;^@y!5y{Wv|Tn=U77E8>5dGqe#)B_7~kcAfT@JpI-AaKa(L|bb@o8d2k!kJ5OO|LPZum`i{nSeMH3uy{ z4$G0fOO|*z3Hyl|Jm&5r_13&kR}xf=^-5Cw-m}AUBMORwLc$U@QB}kE(LV&S{o+&d zEE}p;P9s+PhJacyDAlgM=R0MnokG=V4b}Bp(S~5P`)cB~58KgavurSs1PXTWDf2i}o4;x88}C zJj#i9PI%wVTNW}75iZ&vcM^M9xy3Tk| z3mK&#Jz3eKMMXyC_oObn4{YVbB;P$1bd+g-lDKs|VJ|a#eQNghb(rIn(w1v?9?|NL z+$Vj^BAueJT|!N*B57_LlUkBEcziP3*K3&na6ZM3LtqRwyLogS1np)dzy>?;CwaYa zEnjM7va>TA@kaA4Epw6~Yc}_OZe(hF=3lT0fQIE4U`pH&GG&?CXc;M<^^_vKZ0fK& zj>g-^Gt}_5Tvh9sj3kFaVj&VUn5ZonyWvV6KJr!#XC_gstI}bENy&v z=D^iJg?N}K06JxZ;WYG!AuBG@vcwjJ*E&?NxQaIv*@<T?M1{}Ob2;t-@|SJQq01U(RjZ6AA8JjTOjG>;|3UqOsa8_9&&N2XYohjz z*mIJ-wpU}w5rDj92;#>U9tbp~lw{=1HItBr4B7q9i}RUZ1==ybIi_R!&S%6W2`b_B z>1i6fPw1bXwHL{F@Wfv(%&eBI7zD&*u@@pGFb}?xxY3bV|nFvbJD;A@Go1e@HK%|aVeusgQfiUGG ztw5UKFPyDGAIqiRjJm~ls{1^lE1VWU9j!Yd9S!|6Pp4=zSub+x*ORsM1WW~~zmypX zY*Y&XrvMlFZM*G&lz5(`6c1;V{hb^F4WWsFC|NMi||C3gs zqse&(4dEsZKLoEI0c(mvrKGr#sb$s6^4+&J6B+xdK$}?&9|@9a0=O*_H(|*#RnX;B z%a+7UlH7<1qT$k7kkBM_F|hKr7n(m`FSdL@cI{w$E75%L&{l=_wa;Uo)vco`r_0h` z!RJFKyO3RDS!CY7F+n@8_T{$U>=j^nJv_9ehQQbXGR`7SBOiD2ql7)huXbLJ$F>7UUSA$?ui2D1y&cavi}z;JR>vUpA94bgL(PiFg=-= z0kn*)eAS?E~+|66QNQENr(ztcU1@YNaF82*9+ z_;f0&YWS@5|Dc&N{hem|HxlVTlQ_TP`e#p(e>1NCR}k#9EKDrS%=k=fEVS&bU(@|x z64yT~cmA7k{Xa4M<8d)FGSadE0F2E4w}kc2LL>iPSpT^an3-wW80cB>85r2U8ej4x z_^eE?{Rtj|JW3NYy3?$_OG75$-?}Xk}=?)@B1GmV-_~RUl$WGwQ%_2Z_|lb=sFk* z8R}ab82-hdws){I)U||iNk7*#wZQmjN^wP_QCfAMB>L0 zfcqNa*ZbgqZdM)eyd-aG&c-$4Hy_?9Y2KeGIX+TvF}}UW?)FeTe!aA}}E%eXwFpNS1`H913zls_$>pUake-pX_g8 zlRP^_=nr6a-;jugKBMxON0tkW*0<<&uQM;v*UTe!f@)5w z1|R)wBQGlk8eR+29ndhY`S5~%3F^)G%KObA`~cg!v-hKFv@{fmAfD4ASaDzx=1lYZ zY4o|#9I>6!g0!lnR#JjMkgTS1(Tax9HVANz-~N#(*2QCc_hPPM#O_Rh;vKI`_%+y4CH^K-@Hkvr_OT5hdtx1x%z)U_)%QMuFe zaqd7#h-E@)uJBp=wXjVh!J#;gs@-wZIg4rGdxI$0Nycb?NB${oQ=auOywvAb~ZQE9tZM&+= zwr#7+w%O&{{jOx6leP2abS{E#R@h-b=@wr4{fnPO-F}-}18BESfk*`kYp$f+-ur z`eUH304+r|r-Vuuc1tbTye_^F*+wAEEurdoZmC^gJ$`NF z0`1nd9E}&I@K$(BL(|LnZd6N)dIo721w=v>DY~ep{)G@}cSlNN3TwY!ih%|d-u8xD zmEcOuQ;>WL!xH;L^<%nH=DTtAJEl;{*d&aS7(kR*WEhf^uc80*drdT`k*P?BvI?Q#|ybOhxPLP2choI)Yl` z`$RB6gX&hW#e^jBfvoooRn7?5Tg| zt2op9YC7An6fhJKtFk`2I^M~0Cus))<%EGSi+~go?5`aU5RVtXK;)3?e zFD%`q-6pDBchT2dM9=V+)Hp6dP&r@nL=jsql-@Ox<9r3Ng&CVqSlen*pAC5jVGG|F zax*f4A4khq2w_#;Ir)-sS`~O0Eyi*)Ot2MV$7MAdEcS1$;i^qBCTAA9 z@4TD{k18vl?oVKk;ifB8+{VbW?#%Q)qyZ0S4k~0jGwPtWQCkfZ`-( zto-c(C^{MVV3zg>jbvNli0oVt7s5@y2`B8R$fjL6g3^ZEqRR#j*9)G^&6yS#`ZEd5 zFb7k`n#ie;=G|xnVfE%;tmZJM<6wf2LBU5WQ>+}NiEf(Dvm{H{1`kpA-Ckrs3nz8S zT=&E4xQw4c&iBJ!Rz8v0#Az`Ug`yO9uQSqp-U@ngR8E=f5PV9s=XnkLc@U=WpQphb z*7H9crd9F-*O5Nx1f$GBgCZsn)*zW*Cr7-w6F5E<&+Jr~hwid8p0N0AM5?|KZ1*y1 zjS528-(=RRxV1%b@ySgdMdn>ieZamfHq+~ACTXU#QAj3gfSRX6eX|B7L^s3SNv`>Q z#>AT&6dRqP5x%ySUWjTO0Zx`k#U!(oHh70~(&ncz7OT2JE6}}4SY_Q!R_RNnviJDIexw>^D+q&c zyf9ur3m*P7tj3KHV@L2^s1Kath0W_*OlOcY2azHbedkxX;7B0u0LbWR6m~S<%vFZE z0Zkz}z8U0Mg}s@!8IQ$rGvcQuAQD_GR%VEp6-3!}E_VR0zkqJP9&U76V$n;ivd7&F zB(1cr)T+Z@0F?ls1nRnxw$wq41+o}d zAw2IM*@zoKPJvJQAd92V2{?e*EmFSTQ&y{MNSNMJTI;GIv8k;m5S}iK+Ef;X|5NT7 zS2vg9qQN?q%B|De=YS`S(ahoQA*iY}l?RR;To|0f>q+iWAP(Uk~ooV8_oCIO}jT(5y?OPDgY3 zzxdGT;kxJovxb?7ol@#A^uIvcTlP!HKOGf#{5{E5F%3)7#98=UP634RkOk5}q-a=t zG|RKwV?ERqxR?%YVffNH;#?&+%d2F_#a+On`QX zT4{)J;wcqveFF*lx`@JuCKkL@k(AV$_${uJvc20x9Z@;-mk>*iHCEBji_DJWR=;KV zL}5_NaMeeYs~}2>IW(e+v-t}co=*cPavI(lGp0CDcDaDr1!y3S!yAP+4=hO}!2`&x z+nS6@$kLD3W(25sZgjRk!XvoJSjPWaR1r1OkQkt9V=+|*09sz_c(-#UYS)-*$R*FF zsI+2!M)O1xsaf;QdG%}j0h(nPjqvOjGA=7{1GG&L{z8{VPxHG$vVp6wk{>u5syJ2s8v!pmD!whu@oBW%sVP2fd@29 zyt<}0py)iI^Er6$&r|iqlm^u#^EqQw#5qe&gB7tj?f2gp;x?O%OMDw&kD)n6X zW5Kv!;3BQu+zl6-K!Zz2c$%w>=xxIn%y(|8SYAv)9++t|pBMv0Mj?H|%BO>x?aAy& z>AWuUhr(7Z&T2~gzno*Svj5vL*8gDC{(n;S|7XS;!OoTfc)eBZL9JDgL#zcMi|+ieoEsf^R<(F+ z(D`*H6xS2+<&Sp+M6KzO?`@bn0e#PB8JocN_d)O93x=V+gU&pL9$yg%Dg^r-{mriK z_>=!uYWu#oUpspfg7}hDX3ou5x!B0hmu3Iu=J9?KwQ4`#4sgM@xpcNXDKp<_m$Cw1 zKz2?mCjwYg=a2>P@P9k_e7N|0w10_Lle+W}k zn}9w-uuWU2SPY%!+lZSpJlT@RxC+QZ5GzxkZ@=n{^4IOUK@^UB5nw(WeJAkebh0>V zPMk>K3y&PLB7j{MO!m6e}uw|X6S)er|-u<=_3wQG)kS>mue z%+D@NQ#3Lc^a8MNm6QuI4i6)8YPLWY4$!y=+Jh>R6Q-8GiD1u8Pi|ozflA5H?27YX zcNR{>ZBvxe;v{0r)TnhoC{nplIblG_1o2m~M5?7t3$Fe7YRLb!iJg@GZ`(+3Bjt(yS7Zbm7K2c2|L6#n4S`J7wETL|B%JW1 z#6G#ThPWSTyUp|#`%L|aCrl;d@74K?!R#4a?9U@`+fghMWdCe(k6f_6yPzFn^Zi0o zli+F;hKucdG198(e?MT-{p)ia?*9#l0E*R@t8v6Y5Qi60z0OrX1MeaJD-Mc4-?0@I zyeJTiE@3lsUlL0N3V$C1h~qWGHFFRKmI4YQoW~2`==3GnWE9FYx$H(*VQJ5rs*3{2 z)<(>2KN6M@Q{>))=BgmK_7+Sw?T{CJ(czYeB7RXYko>YQH=;~bH zH~>r?Le|olcT0oxWG%x(;efsl>cYt6&bo4Q+NT630eu zFqM}p0yEPVmE>HUxg|)e%a6s)Ci%e2#r%1c7GlRd5*yFMCN48fVir8HA1^bqdnYs> z-AGS&?>>+8yHvYryiuP+Uj6W(=z?M^vAYJ{aQrsIXMC-35wg7g*ciAFYhXCyp_ zEZcI&T*7~%t3KztDUoW2jM)ob8=hdQ|K?(mwFvyxjfl;{259~JXj~rA-4^rEgM@-v@ z`+Z9MeoXkS_!~}B{oIRvtnDG4QN|q5;r#3qT}}H>kAtUaSyq@+oYmnT2Lfj3&x2;? zmxm`lM}!FJl8%u-t+M|6DLnu)px}_b$cH``2zXytdeOc|y&{}GJ;x}4h`)O)cYGNf zcb{nbxPdQL8=4j5#2HEm^Zf8Q&xC-=eb2dgsx=@?!k1V(BZu)II5272H(PyZFIUkB zjcCHd=3(NO1L8k3y4YWjT|TFyQ)baR*LrrJ=CA_~gNDx4T&_CT~pmcCN_7B)O9 z_L0_>AQVzng_*w8a7?nFi>;cBnGOu_v+v@9a5b4akh0KU-|6ypR@Rc#Y1={O2iaMN z?~9RmVo$UH$Iv<>AOu3`@JjZ2fKnvc1qpD%D2sLvw-VSdzBv=9!NJsc)Z(PWh;^F8 zaJzihN89Rgl`xaqWhojlTZj}#IN*H7;mw7(Yp%R@;F6FZSur@Z0g4%cAPPiIW|trX z)KQKAYn{m83)e4OpBHc3ytvx0RawcyiUdeEnZE5T2*n(_I>}A**riOZhYF$hSm+qH zWCM&MFJ9-2vPzfB4A^`Bg_aeKJ}a${tw(KBvmyw*=)_`ORn^gS`h!8Dk}kj1QGeUN z%FlD`BsXx575!pLdFf(OJVBRMN_h#2A)GyKF;B(m6%6)2HUg1io>!f6ihAz_r;pU! zt-eEIo>@a@vj*%}*X3$zJU^9Po0m2x8maQUlR~0IRzt+(w-1!{+hY?ytd3<~0E0r^ zE0@eLMAX()c+zinQuFGWg~y~je`~|o^n3aF|5l*0qMmEE_dd!R9E2dq7T{R43K^Q; zY`pv7lyk4H#N8}Lu>&HT3j)aKtptaZ-&8aHh!S*@`Prl>Bh+^NM0;vH`uq52G^JI( zLv7hCpNBpRK&$La*D%ULHlwjWp&&gWS-MANr5_wEXYI9;M6vABnSf=&cVKEK){9?P zhj#dhz>uf1$tPe#9x{%UD2-^R{vK<)IP!Ls2~?E!#e>eEAEKlF{9LbOKzq^ z3lstZ9Z%-7OE5D@dGXCVn0!{K1H2{H&Sd7?8nAh(-8le0P00~Wq0XZJTE>Q4SEOm3 zu=r2Z;^zmuQm*X3q%Slu;*HS3o~U)06ePx10}iteVs1LF6X<5ijx}I%ksEp-NBp|c zK5#75Vw=^Hp|plbvRfJ?108y$oe`G^ktMR;l*b9%fA>JezVY z_$lh$x1ez%Fh(>%XT^Dq2|pkr9)F9G`~ye7q3;({wq&n{l%&@tYgiK=+s+-iexq-Q zujOBqZ5w^fDf8l-9#1+A>-2QGnfdO~pTvpHG@{jL6DL9SXH|n9AF%>9E76knpYwNG ziMO{jnB8+fWdtCOHufjG=G>yWeVH7n4N$Gl=l7b47dU?@A7I{`=c9}I8ZH# zF|sr3kxNmbi2jL(aVxkThatLk?)`oXYTlY)1lEct^f=!6q9cEK&v`QrK=ioa?uDz^ zKrlXkt_Pw}rF7;wx148Sn26 zK!wu4+o#IO_=%7fZ4$59tlsvai+K;L<bK!E)-(N=85}wREb^F>>r(o?cOYr*ysZ)eJ8VM# zLl!O4zW?&0fFMfDyP?Om`(*MJ*43)?M_{jxAvX#Y4$IIbb0NkN*Hks<&st`stR=zd z=5ORUi{KY%@7q6Hx11TypGTMB(C&TiBsY$yfASYsB)VbK?li3(Rrl7i(^$!DD z3@dCCnhc?=kj2V30(+`v|7<*$2@9L`y%mbl<_t3O5X>-0+t}OO=6>MU!knC?|$w6`GD! zUK}yp+i#)zsNzwsAe?w(|8l{+UJYi!q$j)8n?&PyhzY9vRnF)kJ#W}JvCO?T4O==c8R6g!RmsvA?vdM%dr zq*#lJ;p-;^bALat{N(*OSM_aOG53@$RlfJh>nC+{j#^+HlK`G8Lp!i-T~|iQSddar z(_}8x3^h@7EQ8Do-9>)ZtIlT}a`3kAvjDIzTz&)Mky_sU2lBx5MB&}zcb4+o?)?RSvJ{J6%nn%j;+xeS2dfCCinA>Nqdt)RLN^k@ z8IOl`M!j#K{GYQsd2qo`aTY)^@WI`D@2hLAz<1Ga-+GMxUEkL=2>_!Kg8_%`q7Y{i zw9wQ2qUEoj?!q+gslQ!TPT>>(!F6LFp0XS(C<;M%`sW;=1(<5Qw>29gbUITn&iu?WRJLx{w= zXC9pUG(&VM{r`AMPI&nyatY2lXPabVL*hexCojaaF*q+x;-ksQP%R}o>=n)lRgp0}`Ol{gIm02{*N+0a#^PY2WZRh<0y<|j_&ywo%l$pO{rr{A zMzaUMVAq!nbg%g-6pyhQ=RrBamCCZg8XFuTq z%*DFqpOGM@)fZf$lbV9@zbc%jb9|7}dllXiRFp8aDg}mFombgUJu=PtREI3jp|>T{ ziw=lKF!v_7)pwOBu)Esb3J}?(kCX_TRQn3>BdWrKN{Mw4HHBCc9l8hR)r&t^vung; z!)oFeA+kz2EScI3`OL@{%0uWpXPhU(cPD-y@gAsnQAis%NQqc|m8F(UwP7Q5qSNnN6ZS@Q^@MqVqMnI== zR#hBKt+Taf+l$Ryx-~2FP9v21oT)|*pXJ^~mL|{M#qT(l#v>{cYoVA?tPdEr;VMvN zh<7VoaGrPIlGHFUf@>036*-Avz<}hG8PCLzb{jC{sDNQZxEm*WuS=_-Q!j;3(md=x z+>2%ui6~|gq%6x2`Y_^fguJ69)5|4-u-_#k-ecw^1m11G6mU|(dnMc$LUE`WG7&8v zv3jx^r$R1;UNXsK4{#ayRgOT(Hmxe|TYnqo51)G=5EBj)ti!YDsk(=m>i+HmqXt4Y6+Lg& zh|BAK@_YKRb@ja!5Je@vE@z>h_YuVG2zAv}>SKR*l3(xrAvMNbNLzDfp5IKF#r3hZ zpV2-*(&gSLp)a+@mYSGcxG%ofUU(VFeghrZld6BX37ZBfCFYGw)agoKT|QJ%g@C`8 zZ$ZS}a@cyim_znC;)@92!v$a05YEPqr^O9r1kU&SscKo7wtTjcw`@xq%_cKe1Lh+D ztk0R-M`|)Ij;a)VRtE{P#z`k*z<)?r@{Y4!w|j5(Q)@=yBvDf~DS<=920 zDQ{v@T3&;*WJ#K^+v&3rtI&`cc}$*#(=-mZ&$b|3;OvdJ#mX}XbU{J1g0>VgQ>^y! zSA?4W)b4Hyc3{@FLhIuyM-Nv=3#ZbS@8F4v$FE_E-;EZ^PFB6~nogZVtbO=^nzVI@ zbW==*JT1MqM<;QE;!R>2CG)94q8e3!N(5Lm#)%vFUkG_c7@i4c88zS8SjZW2E&9{Y zfMED`eCDEWk-lY&Z*&6E;M5`)Tar!2lr--b<~=qD|2i0sj(QZvXbiIQ0jnSvqX>=u zAJ%*5ojEj^`lV(u*G}Fv56muFBSu^!?ID!|+G^4n?O-egU9h-rtF|VL(gn2!qlg&R za40nq;E6S%&{BGG@t`=C6wErUtn0`q;@PGdbK$&b`Y4f%J8ziOu1f~YoqH^sLrQz- z;)VRlNjW49Z3`yvbTV4uaB7jSgB7RA(0S)zaD<2l4%;C$u%_G|#JZBbmK zWS7z6_la)wH8aOQFsquVXq(Tln6le=59Jci2u;ja_HG)Wrm;jI?fa5^&5t>+&umd3 z7PN0K!1bm_k#l}2p8Nn^2E~NEQM`G2epka~fHQ)>b!O21jqP}F^rZ6=5~&z|aK9VD zfy{NbkzV=036gP%J6p7mk(dy9s~OS&oFNPx{rB#sawwJtT48V0Z8WMe){Rc^2X~BN zSE|mzEL%$7vk8H8!!#g zy*QzHwlFTuPIS|1X zEa|TsE*f!pLfY?pK62x9b64-N+~4iCck6jIv#9ZXAdODde?5*8QL#P;c=h*$hKZm$ zGP32Gz=Ca^xub$i}x#7?G5#*U=VK0`x`v?*D-}T;ONpe;E zNwfxjq}hu5=NlZ8r8R`msYu6h+@ds^1Xo?p@J~|ABxkii8G9wy)2`sYm+ciwZxxIX zl?d3`ONnVZFF)Zv%bpK!q!U2IB6d1pMmcAHL>F`2(Ys5fp|6I~Vak1IZLjkVJx*2a zEiOO>%YpU(|l<%V4Z3RAM1{JCft%eebWjBoV>yH8Zi%kgrE5Wfx=jKL=!W;N@Pv=@=e;hOV z%q6LJBxhH31Lzz;1{3kf;j6D(yNC}vG2ay$c{nFJH-xPAS9Z6M73|KD-J0bcnMY3I zK8j#(@xutAUI{bP)nj;M4z|6BfJUgJIa2y?ICWOiJfAOXMcWI*x{0u4@~1+IZd^(4 zT!xkUZ;E_h)(Is+U~i`sM`IOMwU8$^fIcJM+$P-nj%C)8bG(Ntw?t-^E|QZ~di@+* z@aOW>snBx14tL&cIAFoPZjI*7`idV6SfU3>6qIY>t|wix*2KlCl%=)t>Ap~ivRZhI zU&TkSYrtze`yw7-ux|QN5xjliHY(b2(oDX7uLmsVlcH}N9jvx+tW+Wp#QF2mR@0D@ z6TuT_G{M!Pld56=Bfm#7ddmmgmnH&+iiPu zXl@o;9gbqWk^f4YxCo2G>9zZs{vhlr`9g%6FuTjRH#i(=;zdwAi(w{U&;LMhZiPqu z*Qoe!o7ew?QSl$`@c)0>^}oxC|2OT*%JrX(7;&xbaoX=X{X!Gb?KZ8kW?=I|F9sTt zS%JN-bm36NmVcb1TEZN{F5Ugjity_1gzcMQCZiY>L3B!;`>^Al&f+v0fUkEphXYi| zlP>L^cgMT?Jn`>~XM*p)7j5yAaW{784ElS>2A)rT^&MJ*KTJy;Mgp{`8KPO6y51b` zS~0Y#$a?dy>#xhNRktn{dl_oC>Dkqzv!Tbjp*Ru5^!|`%7B~H19_l_e3~?)@(s#t2h5>CfLTn%LH!Bq$UFTq?<{JUp z_4Z8d1`+a&@@=}WZVv)mJd+oMtXeTex*P{C224H7GCoZ-XJD!%%K5azChUgT%?g=)xV#`u}L{?O9|8LPz^IWSCn=)Z zH^+8{qlg4^l{P!vspsalC@`KfToV?Nj^DDr2{`U4x+3H_s^68#OjociL&M-__7Ien zF@$F^dHq>o#Ww`_y=RT+HsagBD``|6F}B6q6HIvWaMEFv86Ha=ON6athBodFIQluo z;oR?uL^GR10oj-ov=%65x2tD3j3_5+7d8WBosZX?2dx=}-|amSScuWi$i({;1FxOo zD`*#A%yF(i3U>v88fb^e56mUXP6HwEO8nx)hL-VA z*+pDJp<;^(qDsarD$I#=YnT1;>mob}PE|W$hK|t$rVm*Mg~^oMX|sxhTq6xsW`smW zi0~%yNf!YLEt~NE@EGwa_p=C@gM);jC4+hDk7s(-K5GKmWt3*;8&RdY^Cx$AR^1i- zVEiBF!62-9Z)hQIP1%bY?MXS2AW zYj)+Xb4tAB13yu)N+TTD);n}<$CgjlEq)>omW)*Qtj)}=c!RczI2AX~tq0BSFJGNp z|L%849aHep@H6SB4^2oIDlI}Ta#0dbhtw@5^p9Z@4c0Te998trK^$-`EBvbcyjoKH6PJAVBgqXg|_bZ1*C z5&4%{#wuR(#fMCh0uRoeZ%hRX?cq(`yN{ceFQ}4SI+*5)8#!1WKfzWmKit7 z)cP*eBn56Vs6!%cP2dd&g;k-B6 zszjWI*3v85sN~oK95vqyWEfDbXkmJ%QTd@`owBYav@W5a`=S~0%uW(WHCaJR5O7at zK8&zndf9DU3D{$%;PIiA2Fd)O1a>qlz*rr#6OjUt%_m-GC#6_DY&vk%IlngB<`>|0 zxphitYxlGf$H)$qT>$sfjVs5K#&KR&n*v7ob$lMV$gBrZZnhJU+oD(-RR#ET;2t zdj3RGY)Ar4GLRjG9;BIn-DB?l$#tx;44dQ;Z?xLmm<<$}hB30A;#BvsJ?r|G@!f@! z_-=Vq48C-voA*Hr<3K`hx%-QoM9HT+>sAMQC5#`-=eA_Lm4k>4-0|CXJWPWTC^C2e z%Lorwd6vvl_%Zf(;^!s;rBG24@iMGI;FovHg|j%dAdyKpgdP>6L);}})Y(iFvcdeq zV-pfQjHl!s2E_tiJs}ea_*pTZ9;?@A=3$cPEFXAj7qqD&z!Mr4pM?nOAt0Pp6~b&< zU2*dqn5!W@Z$w3>@JFz~XmY4(Jz4NXQSklzHgE8GqMRf&KH{j}7G=VE=HW&jjSLOK zaorR!-hvcym90y5|D0J%)fB%b;v*00$ctX|7jqipr#dO3ax zn<82TMX7VZOS8G$Bs4xtI+i=UY==&yf^gmqpoIh;vm<*_?~k-)fR{m|q7@~IGb7xk z9Li6ZkS-Yb3y8H|i4--g9NmdEya%D(AKw-5Oq=CzeToQn$SF&RRoHV$6oxmJfG-h% zh*_x#zC{lhioCnv@>|Hl|9aIM2qQ>fa$)$3YSMS5of8TGRb^!UsKaGPg-}&qEL;T6 zal%~>#9J&s_n0%meKe7DjmNAA3Y7o2EM~dP_|upJriG>VXj-AsSV+-g*{CDF=Jg;{ zX7NVA=m8{6%PMz3#6OLVo(Xb^pq#|54K7128|-%smrN*kK>3!|h?jt|?Ue&Q+NP$= zj%=+hibL zNkBX-!Pi@nC^~qzLjcypNtW)s%|_t2?fb4@8jOq5Zf2k4c#ApRx*@?a!|FlgS?^xZgvskS9gF1k10#^gk;-|NPm~-!VL4UTEhi zm@Uc4iz{_c_zfEZyieUu1YMK?pby}~-yzT!Akg>c`Xn}4wRd5wHpb`ef$HuaA@}c( z*xkVyZ4Z8*iVlf%eQ;`10IJ2_oqpA}9B?Gi%Y3+b{+M(m`kt#X+i1J0${PKi{c$=y z@B?LZl0?YyI0bR#l!WO{ob5%Ibk{y*V`=xE-f%52#hW*miF&+miyxCSJ9PTc{F=3#gytnS z>ewk8KSD_Y&zb6PtSs40?zQ>op zJE2@5`vrLj@D^`k8SVmssVS=4C#&L57Z(M7a)WqW7R$-$7iXQ0Urie2`T1hDAT_vO zpFJ7-EOu17W>#cbFew%a-bH)wRp}A^AohiAc_Hri`0+~_G`Di%=r;?pp0TwtyMM6Z z#KDw7mr@&#tZm5ADOfYT@# z53sSZN(_G#RQn?jhed9F6>BJt=oxIQl^_-!5PAK3KR9^A{b8wF@8W>O)BRsn)}D@4 zCWppFM#H8VNAJ!Em6@yp*-%I0M~T!#XB|mtzq8Jl z>0_VRm*-h78X71aeFcLOWRqh^01o3p3ar=!GxFf4_|7U9MW9*;dL1-)?sG!Z>*T#KEBvhyj3pb;D|3^sOco z6t0NJA~C|i2*l<2V;$2uQ>fbzSZeXA0bx`z1V-EFyP+pVL1-o9#u(F7c;6MYMK2!TaL$8}lfFB9W{whkp^`GC@+CgnT#H;$Z-d?gq@s@qP|oMuJ=LNB;4)k(if+d2 zrHAu|xnazH$o~8jlf&UA*XTUHNr|4-EryRq`L+O71*gLZwca7T0uD>-jlVyE<7_|W z8#T2>?^D)j>gi#~Z;Y})RMH5gDagbwNzMgc$T6~w`QFm}+z?`>R5Y{2j=a@D6V^g~ zOey>;Or;nNwgLN>Hu~%8 zD2GI-UR;PBzc6YkEgTDstrn19 zGTIa#J-BkM0i8%*@?KJSvuWZl@?ssC4k(no2A}gP)+=Bk`@jwCFR6skT-$p@H)Uew ziiVVAfFjW29%E_&2WjJ6%fyiny4j1OkNhh$R?4F3?bDGs19JH!$>qBddaYWe=si+B zfa{y+{4P`-3#C&RUuZyTVGo@gFyjVoYru+E@mViT0Epx5NuxkICUzx_L}HucTTVd& zpuci$x)ccxXn^|s#W)CQM_j8A9>$>V4QWI@x)vhk?tpmSrnDm?pCfGsnv~gT2v^61 z#?h1!S1j6bqaW{v4|UAnB*0zuhsi`i6S&Ib5!I{y+5s!8CDUrq+bz0UZvSfAEs;;M zY5)`qg|QU$M5s_sRI9Y_O>rU zxknSEk^|EKPcs$GiTzA&YB&~eYem?cFtW z3I>;fO zHy9?OJ{U&RDf6$MbUsmH|8xtX*3eLmfIno>jhmfNDl}Zx=+vqHNTcm=6gLd;3!UY^ zI#3jo#MQ}!uRv})6oERPUdm!1?2PmR3V=9?{h9bexrTG)mL*2qM22Fz6*qaufSZ?Jj$rgL>e2eC@jmBjk~=FnzP z?jC)kAJgGrO$`tp$sxJRv)S^k{EIpRA zFHYM8seo+uUx%LBlf}=KYCa3YL}%_i<84nLr=BKsKdEtAd>jY1hUy}!bHdVn$&Vxv zOzpiTs0kaKuCvHuWn+TaChA}RD0HvfHuy`nv4lXdo&+w7e(fP#tcEjpel0c1>doj9 zfgH-xB0fR3ifDJuPgcnUp(c+uUVA3)G}mqytrweMW2<${i2si+0Mg zdpg*)3$G@e$j%@xYh+T2@k`##d@ticqA{QVfN#ZXcXBZOSp}+Pq4q+F&=l)Hl{>Z+ zv^+23tHQ)9<{W?+W?DQnR6_zLsID|$u!z2ld3;Xx%sberM>*GfBnC%k^k-NU}I+g zk9Nj%H|%iRk$hLxW!!*AW7)e+?(jWwEX1)1Jz0zh5fqV!vBPZ%A>-p_%dc~L z8pe+;#5-xAejYFInP7}pD3?|Iwrxjx`C}b{@n67Emb-wC&pU#3&-de>Z@X>Z9>lEK z8-6{X&a#-~ERGw77JK@`f)tdLR<-jO_!KlX+wBjByOWbvVaSj1=bUx-<(`Y@t**aa zg3|=_cH8;RXlJ|{*AKsEHr#pIByB(!l=i8)kV@E6^s<4}dwZ+(dzWenvRIT{KfgM! zY#7tFAZUkfjWi0+9U{_%UvPxD4ajRkQN4+3T7`EjZ^gr_hn7dX9h|}* zRqyoUX(ELL*c3u*0nBBq35|+4I9n1@U`k{9Ca-nw+*I z$OgYthdABId~i_BEmX4caOHSLe&uz9JxMG=7W9ZY-EQ*As_O97Te~Qtw~~R4U(a;FmaQTimpC8+IE;BO0^L zAY6aWZ<+$$PRs`@=a+HSr6Nfj>izA+FS!aDSWvvgV6d?_;zXaDLC7!qKKD>vl7QgZ z#@htZ82ya`xNkKpA??Q!_ZWYd%L`h58lu*H)lB;M)*t0YtVHLKV+XrcNA?gX-@Jp$ z$#b`MTA5Qvs!i3EeH6vHEuS>KA4$t+9L;j3p#f1bZmh^go5JerVnbilwz#4U?4<0o zVVrAw#%^7}7*9^5$A1xv7IHo#h{DE=hyC7jRiATeD0U2R_E8j4A2YvjVmkG+Ftexh z*6N?&pV9hXtjhn3xOWP&CCs;dYZX@6wr$(CZQHh8t8Cl0ZLYFy+q%_#_lX<5qvM_( zCpzN1%*_1qdzm@&WsLbB6WTK`t)TyDaIw2Vx7jvNFQWsXy1nY#Pp`>ZV(j=vv{td%*ED$R z%2HFMBa4o~=>@OxPk|JGpeuePL%lqV$^5YCU%qp~O8Iqmq|tA?{cmHG$zeXDA!KYY z>OX;?&A%eU4?ymeWN~_#7`4haS_>L44ecrRujg-yjw#!3FIx zUtrn%L{t}@3v6W!A2Za#9wYZFH3*doJOo$NYE6WM5$OqrGu17nZ9?=bn5Duc_`#Ud zz|e|SfhI9So&9q8(CY8`*AFn&>9C*R5Xh29>*WdPw3%2~LQSUS?Ii|J zPGDxy4WUP-3epe|>dlOMI76Y{wiDbj(JQ#XvA!4zCQ_4Q{v8Uh7U(IWW7iIL{1tQ` z6nzu@$D=yOax`b*j0}5`Bzk>5Q(1b(ceZQ8MZMDhTQ+k#4pFUD@eK`BU{0AND&4^6 z`5l9843H?W+CQ0!p5;J{>1DOBqmeWZfR1TxjyzLbMG#qehl%l2g`V%Iqi(oDYMxC< z`Mx>QhmfL+u<)=lW3A8`DF75?|$>i%`70i-Tth-3l<9fEb{BwmA-={rPQ{z8Lf>KJ1zh?P-@C z*^#cQXGuBVnk%tvF+Z+8cbowbF}}!v)H|i2%nfH?uVHfAQsNtrq8@pz-@VRK{_*fw zGDb?K_H0msTe9p#fisWH3w%>A%+i4_AzzMMP*BI>?4D~{N@UThZ0j_a>v5Mk*g<`f5NOkf`BPTd8=+?toHFq zrzabwD~IHx;{ntW#xT<@Pbl0-jR1=;Asr0$m}ur!YP27)g4kQd&p+tFj$+k|+~?Oa zea2`teO}XbS+Xk1Kz^tYM1W0d%N40a48m(O>okJz3Z)@pw54rTjQTrk4K6@Z5ivlI z-1-!|gLGXh3w=FK4NhcHlx^v2O2fh))qNMwEsEWo@L_Uzisch(3?Kq+0#=`;XI-iH zm`yprj)q^eH(?VtuO(3jdVZl2xKlUgU=I>~F=fSa4%b7j!DJ{dQL?xppzx{YFo$n6 ztLrSh7uBn{dvBiK)^dK=uo3(<26n4M2p=suyx!l~41Y?nP~1 zA(2zge3vbEtpq1W8I_T^qV)4Ncvk`yh|W@(1NzklS8pvFNw|pzEWmoLC&jQ zWe)T~Xu=w)&RTk*6Sg+a|5THJ`(c-{tc>>akwg~&wQR z4Vf-9K4HHz&BGXFj=jJol^s>;4uJsW-0v*#FbWcWJ&e@la4Th)5?Lx(N28vsH{=Xk z7h-%gyL;p6Hm)9p<2*zrF|-R8qXGQ@IIWOo+pb7&HMOG+VZl0!!J`+Spn0KC1So7( z5wCVSONg^_jExJjh<;Uy&xx#~>-sOCqYo9PK!S5DY{mu%N1v2b5Vt)Osu*}HpTg%*cqx!Z!Ah&A z6rc1=>Ty!I*BQzvL=zTJm(M^#qEcv#k<@&&Lw?K3vVRm5Fcj|&S}In$amETanN)v> zI$O=+Kcku8-1b%PY@emhbkSD=1!S;o%>5=~3~C?dvAo#?N0T>FHNAZ?d>7bfVzjgR zOmM+_hQmi4>h;d<;M24CF~RIUe+?if?Yrtjww;&MeNJ2SoC5G1qR>X-pJq7Vwwr~K zLunfHTtrmLYjCstR!UA`3sh~(TF8wIpE`uEEWTF{+&q$0!_eSw>5LdSlvbd69+L%Ih^chsz07h=Fh#8zs8`^zwA>Q zx2Ty?@6slKTrHX}wd0RxapIf;9X^(#sLmSru6ibZ95%oXn`YP7Q2wi@AqUjt5z$y9 zmnbL9K`BpHR~odEfY%iS?q(cC6XbC!9W36!k>td?F}K)z(}3gsz8<-!055M`2niAm za31neg6z;$9;<+S4N-S`@xB>=xP)v@v`G%l_0y}6(;(wcdU`Bnhf|G;@g9ysBg0-D z)uRS0EuKS%Db5}lKy@|kFWY|fVBDB$D|+Jy7}QM_dJK{h{8BOvYour9RY2%qF+E1N z&EjrQz$qNeq7A~cwpMSyU*C3UQ^^foBXQKTv~IxRi;<$tq#)j0pkrmY(p{QbdC2lo zbSNud4?-!ySQ+1X1#_OVC$bNU^w1(&la-(sx8YJYpPNXM9Or% z;GbyMD_B*v*zNS(D9GM=@arj&2sKGXM<^||krrOQ0!d*_ih8ornh8F~uUd{hQGg`n zYjEMlUROt+)!PJYUJ_0kbj|VR2XcXM+wuLdMCpX`M82-evEm%7H~Q6w4}9lC<+#VE zOn_iw+^k6ws`Um2WDAffn;lY5pZa6bMezx6gTUmz@*Lbe=a`2 z97zI$O8yR%c%x)E7RGooFPjyU6D-iQbrH_(FljQ6-F>1KaGFn)xNVJ?L5P6O%-G52 zyN}-iQG?OMTl}ML2NOsU4*!woiH7H%btWyj71NHq(tWgyWf{mHJ3;pYa;pS6bf1b+; zW%Q7cwc~`szTm0X(U@+mFZ)$q4Fq66b_-l5#YjWG$=-h?Zs69Q^1v}bXT^Qa6O;9o z1_lH964^uny+#`a_c|bO)JIvzTEBA#e@zno$EE83tby{s#haM^eZ3?b-T#cxpe_DWFNxfJuNr0D8!k|!^^PDWBo@K3 zLP`keHA=)^*gM_F0+*KZ@$R+A-PNPfUP8V)+q=Y6Vp`sw{M_BL90oMv>x<-et3h`i z$lLjTdRF19en0T;`}KTtl|t$Ba=1C8s@s(eiVtJk-P7*rNZhUx&1hTo7Zf}7Pz8JI z!|8E(8<+j~g;Yk>y}f*1Ij8z)b^B*;w})HcH1e!_ZQV>&R!+6c1DwV0{_#mg3BjN4 z#w;y>Wvy+NnwY8cnM+cE$Iq|hg;g`^civj~fstEeRyIftFjMIU%8y*wR#&)5kgF=R zudtllzNF#aA8l#t(>eD$2eWKnbglF$uv^?$bi`#7GkDjI(0IPHhcvBGU~J%TfkXSJ z&iCLKj0fh{hub1=ZO@1(_uX#zb@i9`&$Ps6HlP zAKRc@u-@EDESg0qA;Z^H57(cZ5g!DGY5WS)=d zJz6Zk4^!zp1lYaf{GP)sr69O+gKv|lhG1huwt)4H=(>5A`+*bs94||GvK=H{gA#o* zM#;ro4PaR}lYXgHz?TSC4=P*+L}QoFI<8Vc1qA_`LOoj!(`Y&qM0dRc3H7H%s@jB; zvXMjqM#9Oy?6H|~UN6&hJW26)<-SSp5IMm^QV+}}D4Rs2Z06q)^GkU=W`Y+%wSCSY zO6LMn=szkdNcCoq>LDtr)5_*41gd7z0Q8A#;~i7t(*+{&@Eeb3NgD%*0~mub&`Z$o z#*EkuP%iUP#L(-ZJT{Uv8OZo0pOpy+fFEs0%4-#gQx>G{sgOLCkeaZ1ZvT{+E&k%u ziTzxQ?Shr)Z9&XKzQjOB4waQLvxc`gcbd^ltzSD2k~_Cnv)4My-PCF6ZPuZ`Y@DP* zj4~mia$WIWl^QWfx8HXs0;mok0MMqt$Rcu;o##uB`$b-TZDcg^3;W`^eqP#D8oCzt zBmCVkUjjS{Cf3BS220QkV4T)J5VE+?p6I5l6q)nZgArqJ+<7X0*~n)RK!uX4KK99r zJG%=De;UQ;HZ{KP4ogqn>6YI^s-rvCkiLoWyP$lh(O~n zlL3*XtKsSnvAIZaZ=nr{g8b6OpX-cGo_CA4z;#mIV-*oE;Fg&*3yUqjwdKnM@$DfW8F3I7sr)OIy{_Z z0^ey$=M=iS;Ce6uj1>S>%#MIhmDl)sk|$K`iLC0xENa)h&6)HR>i8bjm9_J+u5`Qb zH#DpzS(ACqsX~ag>e|x^=7_#-Su;TNPkq#9)Bb=d^iQ-Z>072u^eu4r+YD{DxB2~3 z{){wjPimo=o)(@ZxyzREU_=BhT4Kh2ke1|g>Pm@Yp;o)k;B#L5>g%JWiMz+RIS=$~ zdEo4tXM%&)RsOW+I2f7@uiYcr(2N{uH}x+QcXyzP2t5A!Bd8GVha3LYxF^`@P$yYm zUbKddQ7v zL)H!NMzMqVpyd)%9$o3f_ev)jS&nRhy)2JaVwmt#r?#>sYlevNM-N@Yac*-%k8IT< z;0$mkvVom+E5upazj8J5Nq3JXPZBvov3hZt0ORN+AnFCh^}^++&O&{QP@Y}s`aRh9 zNPQw%-!*adRbMxU9>t@T3i#4#EZch(`F1U`4Pr0k(v@HHspARUP!rb(5MCn3riKfJ#5Odr-yPgg*O|q)Qy%j> zpP9K9DJXQuN%Tbqr7Am73N(s0iOR}e)T{H_ltV#(HScml23zD#oXn-m|Z$o>Lq z*irrA0)j~PwmL#1PPJr$$X8rz6v+f2&=hyTnt}YyHEWbZ*T7K1STwD+B>ZFg3r4Lr zvK-dWPK7BHTcqB_GEex1#!$}Cci~z%mN?kD(Zu-hUl*;`PlH33B z7ikp*1OJ&p3RPa?!_kciWoCO916682!t=}j9+c`1$Sa>?&@)&#P(fc08O6RqY2dkp{}rfqsrX?0sx&_Nn8DPAM)#c|Asc^ZJ)}hLA@H7T}hS zxhc{pAMYKhE;8QTy@Iy;CA z-cDcQ1P-iSiP)%~k0h^kD?qANxk*vWrf}lqCbgx8L<$|yYksho7s1%a(Swn!DY%b8+ zx>(B9e69FuDSD-JdM|z zL(k1=x*=Wt?EEA<+K?eF`N#K!)Q!WLomOYWcd;Sw4UTna#UaTwJo6aSgi*i3=z^jb(-6<27E7O&h&gj$I}t{zs81McP?m zEvQ6BjL$eTn*Olf_3Jd00oT2R7Hw>by+)Bd@f#{H!C^^0IaEtD?>V#>8VVVWG623^goz-?lNNHZ}xSwP0BF}80RGL7HFy>Vc;>I!BZuZGC zb_b@P7_vIrNs{I2*D({=pN`4N_D2hn$CMXz&y|%v_8}hjR|}4!1WJ(48~EU5j>rs$ zNuGw@lttc4N~=xRT~ubvc~a`w%eR4Mi$8Bf7xGsUOLmnpfQeh!}GBS1~qrJl6nZ3xfp zx!wUvnhkBmT7+x<$o;)VpiqyHnVTR`tvvPpi6Rb2G?!cUMMhNwhrzVN$rL^d`fAZO?&Y0{!Kx}^1xLAp=}a`1ZyewM!p1#kiZ=@)TSFws#1?dq^8W&y4qHy zFHiSl{k<3UX4^`}c4}^EF=0pRG+Qdi$j=W&uUp~iTcLT3uwOF$ool#;45yE!(fD%?z56WC~z?q1Y9Q&HpBI*zZsl;h{c zvXv!$&4bZqS!|ue^Z{@!t@PLt`*^RkgV4IozW#?kz0D#gzve);mX^YkiH5q;E=F$l3Tva+)Xv;JT) zeqfBkENnk#LM(y|Lc*;4g8YKQOag3dbpQC|=ND!c5d6m$ej$G5pSx^q0zWJKY$7~A zU-G|$UYPz}Ebo8!i0J8={tF^Q&&o_g&(6foh)2&(|If9bGZt1FdPaKo{~W>Q|LQYh zV)@sQ;D6i&`bYQb|310+UvKk2@FV~H%@qE-E%dJyuKzW`z{J2z_dlCp(2P77M)tYZ zogEt>Id?v2*X_R`@+L+@Q0uhCL9DmDfU^=@3W@d2xlX()iZ3rbT}AUm(>RM$YEeAa zDX)3W-o1v!0xfYn%yfN!-oEB}Upuko{n+n$f9Abf`5JlVz2NDH;68qD*}jOjb?u}! zRzHl|wW#qjPL2CnyYBw@1Tuue-O3bpOrBC_HvPP-_*|cHO=&6BBKZe%WJAN zfpABJsxkhYfVEwr0l0Seg9ghNVg&b$Q_JP?tE0?{Z{iA)#9#%jxYQz}RS+9AN`vu; zy)-ZFF9I$I1eg|TRL*I(Az(`C0JCSm^Uw?UGt(7#_`4FQ_r@nfS`b=uHbG3kH!C#> zU2B+oaDzGA@;!pr+5k3vy3NWt$vj)DbDZpu)f6?UpV6!_OkP@SoEUCZU+f5R-D5_ubhiG)9{iu z4iKEZBczv5PETHA11~yMEt-3pgxsRefNtm>h`(xT!?%z2UJ(8p{UsYK0z6Y?h{u%0 zAkUa?ah^Kv*%a#wcve*}0eUw*$AtoCX=f6^s_o-zLc8p%-g@y#VP)_VKh1dfA_jmw z?E#?=MG30rb}9~kIt}*rJs9sSybiSukXn$`YI$Gc$_U(*wWM%SK!*~YiK?~pSPA)) zDi!*TqM*R>f|79Y)7GRxk}K@81Z95*5;*`LOQ0mA3#Q2w-R<6HgS2!qnE&y`uY#@S zNY6c8^KVX0#x=$R_?^8^Rb4K=ty{Sp*WV{Lg|Fhkm3d#6{Zs6@Cp5qz*w!!J8lh4L z(`vx=t)Y?}-b~<2QWbfNb9M{q)xxGJ&j<*lyk-HkCbF0P=`epy?3s-=~{$T z`j*k`!yl;hs>`%_%*5u3%QVKgeTZ9z7r&%{e3f?P1NP0l%}(Khdu@$By;r@7(vjMj zz74xz=w~knhuN%?4!o6~NglLK7X3>7tMW5p!qZK?%~pUhVqw$w6n{BO9V6qCu!iOS zM8y9IHp(%sRzBU&AF85|*N>8~xEmcr_c)2T#m#Ny5@!3E3&wg2g^D|1EQWrTPni%m zkTr0yX=@TXo81x1$e}rB$AMt5!J(iD%Y{>kNrlPZZ#@9<;Z|)WbYP;QoWRn z2U#3AVZYk3)&zu{HZjhufNuYK7lw$=bUhz@7%P_bZJ>L!2<6&uWv?xE*xQq3@h({{ z&*ncCAk1Vp3Q}hjGn9(`n_jk9kiWpaY0N*csH#)NhDz~cN8%wjF`*t^noRo8Ex$xI zAF>ZiBQji_CuA_u={V0sD=eSAAGk`1Crad~U}BNLHKbUniun^6qYSZbjhcUf{6yVr z5M=EP>fEuE8NFi^&L*+}EDpUr6H!tzdlO)vL_0dx<1BG;RNqHzWYhfjb1q7YI(%q0 zW{#*b>8f<;j_^3O6^+?nm6O>*@)&p1;%s0E-~`RB!MUg_d6^)R8#5C_bDN#M@XIIEH3CdOw_nZRR>b>M-h42 z<7(Xr4!ve73qN4K`9~tl6k=IjJ@vcD`E3^{=F9IuU!IX;-45Cw0Yu&Fg|C{9Ze&>8 z>C2vN{)3YUGa9d!cLD|PsmoL)f7fp@(3E{0+IeN9G7&}m1j?iNEK1?T@za%e+cR_=^UMRL_SojB$nRZ#P?nPnFFu!6HmaQp$&fEHDlzZbO!bue=$?_Y%kxy3TsAHE|=o2f#etTJrUdXN5 zvaTaw?ajA)-5J_tc_mk5spZAzd1jLpNWgB~Iaum72DjTAb!*A*HPKF@u6}^R|Ba44 zx|>7rJM73fy08=PQRg2iq4Jy=-kwae?W>~LxJ`jh%(v9ief&`oHhmF%WmOJ`xGad?^tE4yk7p26H&|d*pkUzn&V@nO0h6t5m zl0c7V${#&0PzyWvnl21pMJ^)vghxBI{$ve|b2#wM1@D14XH*)=`!DwC)ngrsRLy(I zke0>Cd8fh=MJVjhtR`{u5oDqpde?*6=A)<0_g1D%qMA<;fGn}+RwXwbWQf{#38eoS z6BR#ij8NAvTE+t5ezQzgt{YGCa|fqy)tuLte{Wpay$ROpAD>H0OQP5rNcAS2_?qzf z8z0sqA=y%Da(p~5{f1Z752a=M@{2_I#O4SZIXp@XD}QF$-BpsYHCHKx z1UF>bIXyKKv(TO@!BP#*BtOQD29ig~Tx!d(qLChS%M z!dkm65-$~hWPU7@k{b!>I!?Xm?U<01Qq4DONT)tfQeRG_BZ+n#g;Ysr3aJix83AKY ze4pNmT$R611E5v`n|?GqI7$ase5|vmfCvI??~vXOG#c`p*@|! zxD?Splm%zo7+a*ZjE>-~0JYr|txje=XCP0hvk4Ybma=fY)Plt?jXWUH&Fz;#@w!WK zqDbjMqJ|5artvtbq_Fuh=G!Ev=?2E3(C>aT@SNM#Xx{bPN^Df}wa4~?-DNj$$JJEY zwOt3pZoM>9qZA#=jEOL)Lt+UjNix>T)^N-b`O{Id*)?wx$aJzhjx^zYwNK|{$WJUP zlfa=@S6v&nVO@vTQRpsssSK&?%gLJA=>y;sb_1-@h$Oevz1ZW_TXqw#X!MrBDBnCm z_sUX=u_!gf*G-mAtuSO%!pT2%1YJkwT#OZs2n^km?j||ZFAX5HwL3F)1R8V5PPIMG zXh|?p2vvs$Lqc)OjJE9(bFtGtooe>N4=r=YYVltnmg(-H^v^zCb?CwW@fO6yGgILn~`mjD+0e;{OT%#?T&JZGuP{F&0q)(){F6{hg>>Q zrmrBGou=*DaRoNc}n-j5Ht zOJS`9tTSh`j1808{QhS6vX)Oz?>^cO?opm?y9ZSkM=jM~WxXvW^9pZsAPPb(f1q{` zE|l?tn6%7X0o(7#+K^vf)W?z4f~_m_$Xu_5A|GwZY*Xsi4d=hOXU{ka?2f?Th(jwXmPwMXn5B%~GOxv3j=Tt30+ z!MN!X04-A3V}wjGfgwanIc@xjwN+9OXXnv7>0E)MHX#pOZr^2n)_O)PWO5Ta8YTuC zIua646!ws&cd&ZYYx+x+nJEgOeP9I#_!H%dRWVC#?-}hub>3Y6vw@%v9$ zWMWu2I|KsqURv`F47CN@i6Lvi%uMyRV+;K7liG6~#qa%-oaL0$$&+^G!XmSRw-(GW zc8!NefAmUxa8cVlV{YS__$;=ZH{>}0sPXSv|EpFosHhCdow{1}?$CoV@CIFfm5~)g zJg5Fw;{o^ln5c(FM%^%z{94k8shEJ+ao}$9VTd7#E8TypUGV&!7KLV$1-b&VRonPB_ebr;tp3ugNMwqzx@<0i#A|Uml%5R zLSEorwJTAhRT4uj&vsud*v{**bww+`e<2s5S^OJYkBQ}9L-GG{KjxoI*ZwzrEKKumify4`BN|*PXy~ z&6|}K3k?72_UpbamdGeo{`ffNP~)4>P>(Y;VZAZp;+g6G6xJr8U&gi;y5vGPz-Rz#v?r(~T`{ql*;YZw#ej0rNt+oo3D5*! zSxQ5uUj+p5o6<#Z*q`)ClU7blZ}2SiNrC6%|S{0=%Rc@`GE;0C44Z$JHz9 zP@#8(*dlWQX`%zGzF5cxU~ZSs5%Ib3J{I&@Z;gF%cGwp~P-M_RO<_5)v{q`MOUe9` zR=6Ot>&coQR2?rXH~!noa~gq;ZnwDz4uBrP#(;)FydqUeh;XiCYRB1&zYjOeb$8Eo zckIwfOq?XEdXcrwEnC<1+=&ADtK9pn8=eKmU932fH$TdFO+ijVRblQiUA!Q3PE>4} z6A#Ety3)e6;|C1F07P!_d&CT#Dya{dC|sFp__v@1ewMOVKjHyt5xamFU_EJsxj)|% z4wzAKrQ!0!Uv}w+)x(OlA%JSbsEo7NA`7g} zgATA8Fm&DX$_E54e-k&0Wx&gK$aZs@TT47H!|9*Y)51U<^|F;1d0_j{aGvo23cxRw zC=}eY~`ZUna@P3!#I0 zVJnzK$pTuYgJ7LTzZpdUgPqnS*Vh+$UEa9L2_M4!oy30TWN%kQ%iih!fFXYJ|tDRF*q_qeu*mGF`eNqp_~AhZ0eclk8@*9`VYct)%oQr+ji zU0pcE3lI8|J!db=>@!nUt!JCGsH50#o#*WBV%93`Drmv=U>X$(fC$r3+{{H%J-z_Z z#v%Az$|K+_M!*{VOUGvK1pQGlahY}HOcwfctV1WC#2KPAq+gXV{RvJO>cP$$ zMD(X5;s!fb`VS(d|fgo7fb{4Z`CkY$!Xh<8=%giOI%=k2tFslJx zm#jI;K-cf9V#8(N15D9<2Z zsG|JV2nK|xTS+41?bq`FzY|SL@?qk`jvm_?-O%|Nwn+&Wo7r-P zfA5hbnr#F`W!WvnE;lkD!Nbq@zk#4Yknx9Ojr2i^6&mfHYiq$RQxxWXWo!BKb`n&Bc)>`1(OAL~GYl4Hoaeox=`q&mCZ-xh=0aY^BO#u~! zNv;GeI(ty}NM<2A1$=xas!)}LGHJSB7FnoliyL{)EpRTgsk~AYu}Fm`mB@M%(1^Ux z7*{>yl2zJPkU-v(9e`j6oIjze<7nQR$zIWPk(0ZEUU6LV$ryvvV#2EZHKUps-IeO_ z?dTw`Dh+>_!_cz$FH57z9Q~AS2rMV#`5%P!&8RCSe+}XKI!06^kU%^hlGZ_3AhD1w zLYm=#>V;!k{Zw9Hwl|vSB!@q(9CjH!N)9XT*#x=OH_sVqmj09`@f~hCVphNM^B^}= zy6&Z)88^4>6*Ag~w&faQfG|;#gQL3)IG=`C#PX-9wKrVQi?Mw=X5Xcy=BcO!5L;LK z*am8#t>(E{i}IIXMAED=qg8pS!lm}VvJFWTt@HduE@RLWVtFaCW5n}j>E>@_H4{GJ z$0n#KD2-DKsw?cxRrQ6wA)ApYa*>(ZRhD%->*#{c*LL-ax7EZH0>^tNIg{BWcs5p| zSG6Jj1aFq;80x#mJ-6O%)h-YBTN>&&R9YJDHr3hDtu@u%tf{$KQ*G#CLcad<;w6lr z;b+Tk>fS$ZdoJV2zXyQE5}FhFoFQ&o<4r9pI(G2L|~h z3bP)HcW_l^S#k~WvCe<*!_V|0zY|vhZZRsT@Jd9gA=Ocz&8V-1t2sm*|9v&UjpZOA zMiwnBJi~&Eoe7zk0yIZf^El8248ZN5ce%olOmiIm>fgSbO4 zE$e@k0sU!Bp-EPte{Xk#^mw7Hjx9}vj)jEIu&dPrDNMuIc_$8$)}SAQrWT_U59KYX zJOG3!P}@DBPvA=ko`IZ7I>a!VCq_!yeP$Qs-=$T3*R6>ALa^^^GGH1g&?z(!A}4oV zvBSgp;`1oCQYw9!gb|lu&b6(-Y+n7k7xvzHcl6w>F4ei<~*`Idw zCHQDx8-RFQu`jk|_v{yXi%`j2$`|Cdw$k87X* zBTy&Pzb5+sm-b<#WB;FNAMu3s;eR9&juPtQ^%h)~Wn0#dzvH#z7E^~R?GlXC&9=Tf%Ymyt9uRn`LH9b2EKBfHK-dUH;u$lZK zIOjADUgEY12X;Ml?_X#K3r09>7=oO+^QP~Ck#ZMjd|R<9~=28A6qm~ly6XQ zYb^i5gXTg1jy}Fiz@1hLtXEUcN_Csq5&}v#FnZG`1?0Tg7#}yYRI0p>Tv=!{8J6%b zDovbINf;t6PHm84qd(o=6|MRc34_=1D}V$7lB!DS78FNJ49`{%_0MYS2cNrzT`@&T zTEcCf_(bO@xNg!`Vq-C&Z-3l)Y-?R=U&vMD zANkU%@drAHa;%w+fwYdO6Ux`$fLG2gDW1rk1~4CJf|t*P$ej#6FmaV+N6Ui-I3CDd zTWv7kQewL};>j^32`FjfLP8CK5HrCIwXavPUBEF8HW|K*|BO;#5Q^EL2}^mggBEG z@&T}4$`805r;me$Hyn`_C zW_iYkz5d|T%mJIlBE?TL!Ibr z#bud2lmGk7f0hDNG;zpBUIp$D=GpYRKmK;&DnAM8vGSx6+*#xg_=Jnuz}Q4rsg8nw zkbBNMv!Df$U2S}0L+D+ZOzSV#) zhruE>@Dg=`{{1vRM34HHR4tQ5>fxs-42A>ln@jZ3e0&(i&>u!hB|LC>dzw|isaR-B zlJo<>q%u3qWxKyoyH_o_s4Ajo5E2Ks1kUWz_7QyAzxPIm!Vz$j&M~N?3ryptDxlWZ zL2>@xsTtFR(LpnXc-$Dj5JES};}XrCm-YAkQXwNwP&##(Y{qufGanv-x2rT$UpIzvISn$3R3SQ0% zFD5rf!9%uv(BI7JV)&He^=k4H>F!?DH44;O)muqevWkje}GJ71CbT$g*bte6;KVH&8zhSt)_EJgm7l^6UDs0 z%SHnpWQ+ZqUa};{n^sGm>>PTykZk{LYkDK0N8m?lKXrn#&EAWI<c#s}az(>jty zy)?L=!lntqeCpO-TyTfW)mE>tRMcnhP~QLt;zP$I&j&xsWG)uaVLsdZJNTyhD&xE( zBR&WZ2I+}ImxoKkxvqFD0_6KE-*c5VoRg&ZdIzHyeaG@(5`TlHzgdo^#d#Lp=)9Xq zkmr_6!Z0S##;(DDI-RQ?xHM3yB^U?x3GwWm8J7^HHwx@wGHp~%j-ps@+`^-IL)4Ml8Qy~j>7<< zE1?Rfs#{uSV-9WSB;GolwN{YeAU`k7G-X%e*&a}lpv7hdj^r;|d@w~r(xX86hS~%^ zC({kvU!3FuB0z3;RCIlSJPaiZVMPF_uI)>d2ClID{-SoK)e1>j2<5Q$oU1K8=QpU& z)~@BldZUy~5jQ5wgD*C8FaqlvJ2;9$xL^#SgvbYQZd+$=2?2P&-!9g@cY>H*KlQyV z!+YSslBHzC7VXf!@KU1q7y#Yjx+`}nesyo1@o;%~uIIY!j+ySRZS;v35TT1k7AC?H zv`jl1rk(jwH4A*vi%eewUW_RcY~h56oZ+qP}nwr$(CciXm&-L~DkZTD{5w!7b+Iq%8M+&jsg zoSfvzs#L8!>z`GrtWW*Es6mTd=B1k*Ct+3hCJ?-Y|Gok+(~|m~A%7*UR046hDcE5~5PZ_F^Rl|}>fwoQf1FB;Kqv*)hu=~MMUOxsW6fj8)YpXu8PN#Dj*u)| zFAw&ablpbB+(ri|N4c*%DWs0XrD0V%9a?9k5+7a-nTRY6kV4$YE6{q8T4GRvn&MW2 zVgodNSw-ohskvW8U{>Uj+6lwZ!O+f!>?Std2)CN=u&d9C($PzeDLhSXYyRGVGa4JV z5$TvxjcgYL0C@pyGkB?62Cc2FxR0M7m?S@Cr1P%|seTv6|%mtZ?BEFHBtdhe7Zp->rV;g@UBPIE_KUfU7 z$L8lp`pXoXxer{WNEnD2kv3kfIH5r8E<&k#T+qZLbUh*;B@ zLQa8hDQa^-R%dl!d}RWfS{X&P+Gm81cFjODYu+AdXnEDB%u%j(x9nH63}e)0({+Pc z<6R=WVHR3RFLsw-IK39TR@xYz3J)#)Wd@oE4gF;Vsw&A-7YKQlPqVk)aM{LG>h=6l zvMTA$J}vUCQdkwxL^30>y(HMKVoL2WK3j%+!_au*<3Ivxxo_qxZ-LEH?yMrDr{BAr zUzSAX*Qzg$z1T-v&oHn1;E-yeq?!9`xfFU?vvgFmNYw{r!DgsAGmrgAmgfCi6ZRXP zP^|rg$q~@V!qriyPL05`wH&zAWxzZL|BPj2?=-Ih^R9y(D6?0a!D8UO{XQ34qx!DV zkRB*rs>rftcq!k7^49OeC$3Tr=-3F99+^9vFfE+jio?x*M->Y<&tHo1;9_nZB6S6o z!q#PT2bwCxaxQl`+Kx{{r}2_@E0%EVhi(a1_}<^TcFdcSaF;-tO%OSEgX8DzNAH8& z&r0hz*_9HxyR((_dcF@xPLbwgBS~iGVFQ9d@&<8TS94I7cgN0)U^=g?IYn-{wBnk* z9xa|zo#07ltkUDtjzI;v| zvDj%2YV+oPIyH{UN@kSK@wadLA4hoWs~^-K_~A77sSClX;6w_4V=j9j=x|fJwU6`x zK?f58|1Ht|tDXCQo#_5yVgLVE7yrMfS^sK$|Gz}X#KHC-PqWsC|2fU#v?s@#S2vB+U}drj09_oICeqK zoXLpp<>sa2nLNK21zXkK;YnwTk;qJnd1mdn<6R9(9MKSS3j}+eUG+ z_391l-70r7_1Bg5nxvFz>!Fi6#%1l{VhBr<8zoRzm0x|r*1Dr?`B`9zL}C<`-E6Ob zNmHprlp&(_LhS_&ED~6VRWMxJEbuI{B!6EJLRF~A#l^?#85KPcaFXf)uT`tzzS_)9 z2<^#Ldtg<|*X_<2Rw0=pIn-CrKQK_C(^=Ye66~4vpnp*i?z0!kZiPZlGf;2-L3U9kvS1?R)<$f#X-377N=P1K~- z0Oe&MABRl_s-R#$p@YM#f7Zk!nkd(#Zw4P@X#-*aDDMfho6=#pX(JiTxqmbSM!3G6Ye*d2I4ko+&B0G zgPdc9&inc7&u#q5be4CSVOEe2Hf@UKokS0KH_&L7LYXjA*o8{4V}QECc9Wg^zHG&* z#e~AsQ$6+eH<0^oRE&vNCZmew=Io-2P#KT896EN$Qt;*J$JS%DqKgn-yD2eZYm{EA zmG!B#*jt#?hA$9}0CEn>phso!yNt%*!Shaxw4A)ITqA&y`liL)P!!T3w5||$@2|%q{TP#W9&e;Q5W#bt^@^>Pe_UW$lykx%){>Lv0x9(oO+n~nY({T+0k>S zg^HHXdHU+#Q%_-+vA};*w{j5$$$?x0q2)ajVN<7{Lv# z`gP$s?~aJl9mMG(q*mP?k3P1=3bqrHu{7hFOLezT#sdK-)fc)9hsRc6fTbhA{^Ue; zDEhSftE^j2cn^)IY|CEI`;Zd$Kl{mrnKOz+r+flX%&8ZIb7_Z{87V@>TqBvkmqP@J z5=^I2*#GMGw@X&|nt2uJ9Sq>b&BG8#GpZb~DG&c3UiFP&e6iv?(I2;&P!#eN`61T{ z{j$iv2D>8Ersly^phw0YOi~9Uv%^-P?4ktmUwJ{FPECq1NAR4^!om-Jg+!Y+XSE0$ zX|2b3Qp+h4=e5V?VAmaye#uTv8__laJ9Y$4PdkM%nUuv1SNQ4izO8&sv1EoQ@VoBB z(sI}EFC?WH%tTRnbkb&Mp*jxaZ31dg87-;IJiycpdlEnSmWU<{u?zvu=@O`6rcHOf zV7(4ZVVrv+H6w0Dt#Oi3Zpf|&?O3~0O3u0dgM z9(2NHRdBvDW-s?htQHvfMgaz1CX-$YZZ3&Tl)G@zOlDj2F$%vm8?7#0y+%M5IO_^L zJ@gc^@$2J^Qd02D{aHl;g8l2_E&mgJMY zAw#ot0^W@8xpX2ig+FJwqvki!2*U7RVv3R^V~G8kF^DFMXN-Z9nlpMf+m_Zn#^B4c z>7Rq_YPqUgX7>qWu<!h3^qMS0C{Y#=(vs&MXVg17 zI{aNX!IHnrVn~VdHs9HN`mb> zDna=#wdgMJq}>fQ8uD@~5E-z=a$65kI)C`%9T|a2;^BO*(c_&Z+7pZ|tBQ-b#*IzN zLs(al&}W9lkQGlb3DZtwKk4K?iDyBeFS23|#A%5yw|@g>jE?W{YEe26UWdA_ytG*W zad70#TP(3_pZyue97+{H@= zeQ4a+3rG9ZQIz=1xNaLdgtS^0ylkmD;Q~y&YG?II=$1bk1LBWxC2DIk9ujs&9~p#W za^9jVGh?=Zc2itObS6eI%7$Zci#R-I+mrDnCHny~mWRZ!=yaXtlOpE30o={CrfloO zkwF?=-(cp8Bn#n&H(coL0xLe~(5zk0^<_f9SQX@*A@R~syEaRH(-Vf^fip}?#4}{P zL9f#u?Wdr~G6=}i3RRgTmm79Wu8=&1SFX$

l8q?yR1q=txwfEhc9inbSfmQnTG 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

9h*r@UN%#1=R#--sLMR;!DHeZ|@QpS1TiR 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�(;+hYbB2efvI=Q|{-% z9|Rh4_`GF_w153R#e(&u4+H>jOZsBG$_>7ft9UC5)3=A`T){VoDxhdpF!$3qq zQ!u*Ak-o&{egb6C!DFRw-!i#!8}2R!3L6geerw1iCf2ct0l5xhE{}-sw~`|TjSM>I z(q-i>E+j06j0`;{>S;XEPKmG1nSS-4A~@M{&*h){A*&%?djIPO8k}VUR+0xE5o03; zT;d{8-nv^6cVA}rr~+n6n$|(M>`$PQiQGyC;ZXsNfGmsNR9i}QhO_h#PZOyHk7G?k ziOpW)tphq+D>4qsHp#F_K|)}+&Au|^H^3Hf@w28;N^ePD_ zs>0WscVE9k!{xLWG!$Z>Rn;2515w}aD(%?p$8obL2GjA{AKI>i21vES>3lM&DFmgiM)7N=b^Z`@+hQT4{`ska*WX zo>ALh1Mwz5>?WgPxDJil5GdvQ=qCZx#%nOcOD>a-H*cJA`pPvRh19~Lk_8nhNt1~O zf58yarLk=wO($~Lz+k6DjWXp;6|Dw}4rXC82x0;q%s>&brc|8P7dTLew&?3QW$2$c6-H z=_9=DWV=BbVy4ndQynSFv!2=uKM-|oRF}AmHQ|(6)YPdiT%yzVjhi5m=rY4x+`hWLy?Z3FwatXupEBiseJ7_N>-o1+zrRac{ufUD{-nkI zp0FvKI@`NCnV340fRl)S!{Xm7{{*Hulj!^xObqt|j$`y=)Z4>@IBI;-{%KvL7Pob?I+xUqA9sNano{=cSM!_ht^#vn-GE zcz=2Bb0B?*)!WGoT+i5!c3!Voe{s0j6Nr8}T@!fe^m>|s(fM_KI~d7))*o>-cVy3O zr*CksM>~pVj;ukyhu<5e+y1h(ZO=^f-o)eLM9rqs$y;ru%=h7L?npq-MnBK#eaULN z;=$}lqXxSL#VzzId~T91PV@I@>9_v2mG;YbUsvvkTkV^UkA6)y)O2g!`Wcel8hmnJ zHH_BC(8*iTGNP~VX~(iJH=j8FMZATN*`#=wqOQE%dxs;v@jK3svtq?> zuZH-06(a5(#H-iQrUOTF9pcZ`zw|bCU$B4T`#iqn+B^FtoY0#FiErpXA8oI6vp8VC zz@h*8vF2{C{b-XBud8jOUXIp7H!j$BKa+YcWHYQ$p}X_;;B$qbiM+SvobUci)z|Ah zQx=AD{4GKifVxC>n@Z)A-7&G6OD!=`{V%AB+JR7d_CZ2SxtgF(;;H?}9ykE5P#KGL z+@tSY#|>6=O0fM@y9G1&hwcLgwTD~(rgeuuek(45C- zr4G;fqM(Zp-gEx_pbo~7y|fGbaARDJZ@71jwyr+WlZ}uYJGB>4&d;anCZ}Uti|oFQ zX2Kzb7u$G2WXn%cJ3Im2WV6J}&HYDjUAOctm|R>jMn2Js;mfi)Iwz;fz?|}Vg)J`r zun>BuMWuc_9((obMZtp7pC{_~Aq6q%OvQ#jDG-^`IOH{RJHi8zR8Am3)(G_s6P5+} z5d{|Qm4PbMh;0ck*+BpqNM#fhH&Bp?EXx~K_?5#9fcuR9j4d!#LvPMv!!D##3>_4Yd@@^yH4DjAbby;B0`V<3}+8G)NkL<=acGW3F;F8WU1_0o0Y@S-B!0-j{;8}x2Wn^fWaf#g?LTrMeAlna(i(SHf zjQ1WS0Wp-jELed{8P#u096R%$bWb4yS7s7|tP)X=%X9j+;x$J>chGRbb}6VZMn#gunMUu| zN4Xe{V3LTT(ag=D&kKzx@f7(#3wIwT+ z!V2mG)r(J1DL3geYamQJPJx5eCyizIm2(^y zb3+Gq-58Q)z*^a#I&UGqwLP_mvA%qn=}K$s9EPp05vrXul=tOzQbsO`g@ms1P0UILg&=ICJ|LHjhTL2K$jxxnBceu2D(0 z5#za6>Px@r3)_`D&HHGZPb@212Q`KJ%jN zA9@qt)A1(XaD9r^x~F+R!d=^026;YQM3SL3jCEq@1L#IUr*+9B8QfIBo)*`IOIjbe zQjr{-5nv_|^iX6d|8Z)gD(KYF{>F`sQjx|L)LX2gdy(Fh=SpokNc6l0@g<2#C&exm zT%3z8o?7c1Rmz?1GA8jSU!e$P?K%ecd4lQVn{;Ro8AwG8F_IYJF+TFE0q5>u+Jc-C z3OKfJQUPP*1ew9)s*;t+l=>g_mX{0%60{|}z45=o4H_cEFKc*AW`@?jA*{SQHmUA{ zHr&2=!$VyW7WpxXOWDGke}Kj?53aC@h7ViE1F;CVrik5AUpWRVyl@ggw1<& z-%n$BXN$^O^!#KOcT!bJt*0eGLe@|%P_=7hGfv%6S!%dZyld?T%2;irC~K`~_q+Ka zh#!uvl9NAC{&yJAmp7n8Dsbi4s^G0BK>AB0DkS|_9#pArFiCw! zU!V3=uDf)moKn6EzpzT*Dup0BrI5!4d_8W~R}Fv3M=6|(tprr!i09n{OrnVXfawlp zZtN|5DxuraAgluM*=svs`q$4m_z4&Dn{G(e>}`Qp)^n0(q6G)J(|Q zX0*&2fBspKEmO|714U|xG#fFXj{rfg6f6@@%53~Ki##zvoe}a{hI@dL-Rq9aa++!v z%u!Q;NR-G>Dm>}H5&pobE51I1@IWMO_<-*`FFJB%v_aYajYT1PoOjhQJOn(!I|F#* zcMxZdRH7msBfQPA$Hnnbi`;x!ON+7OUE_%!W)75g-P&(^raY5xFl#d3UdHq-vlFou z$LB<#^CJ;0&RzA<(Ls4EC`TD%1uW~+bB_58*4p|teO5cRudj~yRb*6d?3aLIWg28A zusM4Ns(a!;Xc+6%IG$$jYDnZy={t(LRK!k@5En#aLw&EILF1>Cl~HMy^3CGZgA+t~ zIr(H2x+)|{1M^MGH7l&$j?Un8(SR|@H1MYx>NE}aH=OCx!Dxz+Pw#oNj>m{5S)FEt z{1Wk9h}ZP7_i7AM)NZwvIR3(=~I<%*@OX z+c7gcW@cu_n3r21f&w#s_nDr;-~YOUuX zEh_g^WB3a9oy++G_1zy~o5daZ5??hga8qCJcB14BSRzMh?`6Db`ow#Bq|9;f&a`k2 zOBh#@JC!E;H(amyG8vNF)ydqb_OxuaGanuqcG%&?OGielS4nFfG$qpAZO5(ghOJO| ze8MLCLX%a@$wf2N>}~CuwNNqW{sw!)d@<{J0L*$dhQtvF?^up9?xTQPs!7;uZk9rl z0)aBrsC6fh?{|itVq+I(BEmhAv5_~HR06k=lzW}85(|(;U=#7uvG%_v6Qp+-Gw}_C zvS0+L@Jlh_ahlrZL}}xPhDppPl8kG_v9E#(<9@(U^}*|Q(D$aIOEOD9pv0q|Ilxh> zn?B-#!psny0)N!u&s3A=x^q*-hGJxm`|RhLL?ldziLrhCSs@m%(+8fyhxCP0OKviP zas%WYHGsemV_O<1VzkFOn6=(wC*Kf-1)I6FB$;|7F*!v(w$v*iO@$tsVGx@coU^`U z1k1Z#QiPo7xJlDNHZsAaL-0;}KSEBaD>aq9Rvd#M%t;|R+)j2iUrmGZoVJuh@dg1EVmgOIKv=B zfkv3DjOP3gHDXCjhYd2v!%q}f1KHb7ycGgmQ=dRZ`atU_27SB2iUGeaCFj1Q7N+!% z>0~bW>LV+5tKgo^pQU%s0MxrD7&n0|hNQGFvvvI46SG>Xin95wvHd7Cnd?3H*^vDK zM&EyzAUj0kVRT-~vKwT?VkD~@4ml4}R5HQ7h!3@Y(5`Pf7U4`r@@`;toln46=LgAc zS8s(4d5#YxT&OanibZ6O9{W7Bd!P2EW1%yI4m=*^LVLFJlhCE%LR`57r1)fSFqSCb z8*y->CK+xzpjiQgbBuY-{2NEX56x>EHJ|g092NiLdtJ(AB_3xf>M;72TMBf}ekcHBRD3)Ts_{o797+F(S?wxUseDeVIBR;)29yGs7c&+ z5%dhh(Re~R2CJpV$EQV_^efEIkEp#tsx8i=&C7>sjP3W~)j!b)n{37R!(w!55YU( zGd$mA6QdO8u(h7K;fj7ulzGZ*(>rC(mE+Mcn?A319oLpLKyVkDbeQex|YI_y3lRF0xa5okDLuxs=J8wQeO2Yn>^<)|M zu&7C}2bmm#JXfZzSk25)fLE{5G+g^&TOz}ePPTe2-*rOax@Fwy$Jmfxb&)T?ej6H= zViR>Tm-1yBr}xBzs^-@|7Sk81LFbL&QmMrDo zxPrtxlh7bby<#+8y^ceo;ANT=m=q(*g_;hTfknnDq5i|XNsjTX)m2#s||z$?vvJQ0@RQry4Le}7XL~s zfW^~m*g0%u=Mdf3mGm|=&jzdC7f{WsF0<%o*9Rae?c&Kb-9ioi{6dxyMon}*8e9)t zq=)Q6K@N|!cjy<&R4+~>v%$$`!K~r09vn%o5#4X$S?8;ucFie<2#drL%Dyx+VBpXv zj+PMQJ~YYuiH~^{i!_bZ9)L@QxJ?tffWM5k_Xu%oK*-P{X3=)_N?IkP&(<_69cPph zgeK^Yyuc$3Bv@)AbmaBhE^~yon$y%0b5LLUr+?$h2sn)hgVp){$)BT>OA_l^ z^#1*&_`c`x0DfdEFi9X7@1sEQ>X%eUsc`8?JC^&ni6EwXY-$OZX0NZk#pKEkNT^|I zql+-5Dd@ZDfp?){(sSOnM6(ED<0Uqs*Pvn1;3<8WE#Q`Ij{}jAW+9zfhCguGbY#6{ zh||s9_uyKAzS&)1W`4YnP{mU%GG?3kqV30TkC43JbD}g863zR0dF^}+KK#LwO6w;J zLKuIKP^-TK*U=JCYjPjb%ZW3SO13sF?&?%7!<9%M+Q_iO)|YVGFk)exhJPR{4_4}k9wrpN%H-J&}|}Rr9OEr z5u40kjxYg)AP&<3(u%aA!U!N0qnquB)db)vmq9bs$U1@0&7Lcgz8z1O(a@=8vbB82 z8=o#&qk?d@iHJYeG?EF_BeF+0w&p|43*cj{1lyndiijf~BX=T!6Jg%51n?YcltM(C znjb(PRiVT#y5aN|KCyY6M`ZVmnHIRMD&Z|F`+2x58#qEYa^NU-LZ$3{O@Owj!8w!; z)V?g3%)KGsrcYfZnUP`|S)*AM(AuC&R`gmoSOz+$pJDqb|EiDG`0~JlHRDgW|HDsO z!`KZC(BRK$lCHJ2=y1L#-&&Nb8IkasxGg6R_b%c#+9OseoP79ZLJ4XG#r-JWjlcCw zY%B|Yi?g-Mvv@AI7S+vQ)E0ajqSoz@Q#^p{l1WA3=%5k4WMm?I0Uw3GmXO+TWdYui zOJR1C;r;9qOPFX1qr2js4}P6Xm_iYWWIR9?h`lwHrz>GarE(V(K;mK8%Y2f&qGQpEjKDiPN znDCxUf8lQ#=5t>Gdu@bQG4d@@)%Jzl&7%+Ewv%Fkr5QHW5Tpu5$RS2d)czMvwsl=0 z{gum9VMNbW9aA86HHaOAt%-Adr~ugxHDi1eKl?@-&~J6{V;X+%qwqtL7ja;8-{n7+A{ExNly8WqfFVUGC7tjSspA|x(%(l)FDpMsM{NOq4 zT&};;InP3N>+_B*z?e{IiiMX0-wWFL52Pvv!Kr?oF-38ZJ0CN!!awY_Ua{8`+y=Z$ zteP4vZ7x`i0uBH6P;KCxi9rp2XmI9TcRf|Jg~&%7pf)>&?fQoA47y%Jh^g(HAu$YX zH!Pa3z{_<7Z4hn0+zUk{qALu~=(g~-9Cq9g#NHLYe`{ZA)H`Nq=~)+?tChMZH2w-# zNT^Q&w-)xKlpS>8{8N7;|CH9M9h)$q|CDyXb+=2&Ud5Gc!NgfNxJZ4Ijr}+-OVkS? zw@+oX7oznHSBD9tJ4lPu*-s7TCa8jDCUsQAjTi%~=M(AV$IFqpDy0`y5v49XORiJr zmnJu)i&ckPq$?TL@Y$>fkSF!AZ1FMjL6C=BWr4o29}DdQW|`|kG({~zep27V3y4Sg zxRY-l47YSufaz%sMAxpfMtkakCQR9$_ZRgvV(L-R!Wpw!z|6ycE051MM1-OVy%g7Z z62*}5n)yEDWmpZ*Gd`4t zpyqS5^_!BA_eAP#9?HPZo~cR)1}gptp+z6P14*ArFN3g&(EuSqNA_)6tg(!H;hFl; zIRTrU%RpKRiw|BRAD57t_lOy<6Ydx*1sMJG93v;vF1IXkjX_oJl2Z3bl(z`Su_hi! zcM|KB^@8|pD6<#tWGQAGPI;=^3UWa0dJ&z^uqIILbvvp;7Iksd0&k5Rp0WsPW`0nT zB97Pc`KHa0?EqAmjS#fvhFmpVA=KM68Z?S_E7h4-+S(J{g(HcDg-E!d^})q`2H1v} ziKXJu2;RRR4pCB{xM{WoY4t)x zb5*dk@Rq+E(TnCbe@v4b$lJ{sVMaAo8$8bkzb;&=EFL2->SzxSm3q8)4OvVyO4VRKvbV#wWpWneP1S3u`OlYltFh+XBUoY)jN2&px3rrC$^&V<&b8>)|+$m}#I4CqOXaBM6 z8>f+w5lt;-+tYjj?PTFGb(k~W-GgF=LUR8eR;%D(}50T#qeHP_0j7fwo-I3>~ z(igoG8Zh#j(0MeyFVluP;c)CwCE(ra-~F1BZWALV;EUUf667r6JAr7X!~KVO0lpbH zu$lV-OyB55nfn`MmFB|@Wm^Z7I~v@KQw}?+aSd-Pi!Tu^;BBVC#lC0itQRC_vq7=< zR+LXf%L~@znrM8lBP+wF+Q0p?XkV8m3|)UVB1Z^)raTb+Hm>?5Z81>ScN3!~t^%!) zR)k}rh%!a;Ke5HCWQRSmWf;XY0nC=*`@cJ55u?9T* zG6T!YFVJYI&gUN~s`gAS2fYb~PR%RNs+u%`Q_Ln6yhPu`rVYj_VQ~?fAlB)Qt4*g- zo`jMi175-CN-3^su|z5F^C?wc(zVvdz^2*U>Pb#*ZP*U2n)@ z!?=n4o_1MYSZprN=*4ePbCCeUVB98ddv@HWwv>i{%?(GbSg*}OFN^tW!=zTk%xsBK zTVqb8=dO#rasopex28h`g7nq^0)~B_5X2*QhqlE&7nb0ah)k4fZ>!c)N|3ek-uDXP zh#X0We3g&Uv_6zPmVM^3(QKHJSj(IGf;|-gn(>JG2Hf8PE1TnWVaht{t{mA9nRJ$K zTYsK9GpP5rKV3y}Rf>-TSAn>>6()3PEd4jP=GGMH^b6 z8*FNUvSic3J38p#I0BozRvx9)?`|y9iPnzR(G}Io2 zy~22#J!P7#uVkX_vK%J}>ZIvj?W562s9i|mqmH+m!UQ2&T{K0+?JpJ*}vM$(l)pj+iLDsSwe)_+ z4PFs;w|#4gkA?kr4o>=HdX*zyHA2+1T0WSy=z=<^x6ms`-DI4*;G6z^wWoAHv_ysQ=wr z0JnluL;yhN=HwIvAT0#h0JH0VN2>qNbLq_NT>l-Y$=@v+Ftrb`GO!S`0PrRN{Q-c7 z{(tB`{CDUkf46AB^T5i;#llX=!o?2oKd}BEx)E$_{}}rG+mon&&Gi01{y+a<3I2LO z|N7z29r|Cf1f2iK@ctW>nURD2U(2Y@VsHnMes}o}lE)G1nI1opFcqI~ZIN*zK(9g* zaPkd^B8sF^4k3jP5aj4iPE6J7vhcX-eS5svnvz|1QdRvZYb$Guxx)JV2nGaII$TGa zp9kfekU2OX2WP(Tw!d#P@Ya3rZqGI$n+>L4K3_1}_wMlco9ikZhU^+uyO<|NKJHZ8 z<$S$|G5Zm0w?*FQ*IgI8&Yt+z`F-2k-Qj;Rf7`&xZ%uZ4vw=W>j{1QU=O$Sdv2iRZ zf~9x%gz<2e@%nIfh(piQ_S-z{i`(jlf7o&NpPVY`PrJ#Py1r-Qa3gQ^pLUZ^j8}*+ zE--lWl9FD}7R9VxfSgKIa{Mr&O2Sn{q5abGf~Kl<#`*0|q@Tt-)#)vpl%uY**3-ln z8VoY0YwZE=lD-c3JG0GcHDfTlN`eL` zbLbRF%7`W_fC(CL(`?{06TDMzz!7^E$sSYOwuT$Ju??H>V`W#ct02CmRmU_^Y^O}& z@r}geMTq#C*(Yz%_|rk8%i-sTOL+?B9OZWzm~BiMnjo-sWgYb*Y29iS`c>kN$XeVJ<%@h z6sz&?YHqsjl%Tr3biH87;CoGaDPR4y(Laz8?IP$mw1QNjHrB`N$do1Z1Q07sclf)5 zVZqKQ(~2Kh_uhL}knZ%!Y_2CknfP&mL84oKg-k1lFE=_VpsW0D$3wYyL9kTr`Sum)zMphla|M5Kg9OgU3KR(b=~M{;eT~TlC{%Y( zObN#xjg~d8jJSe{KT?Asmkb?h4Nj`_$Ce^95AA&)b8TxS!~H4!Vvx>ev3{PaYn(Hy z`tO0}mNCl+M6IKkAkgkcoO@aOrutvAR;CsG5vLkJlrV}k-z5&@&e%|0bb9srX^@!l z?y2a6U?8~>uThuGyJ$tzs3Sa)D@gY86(cXbB1jT(#9fI z0;FuTzV@ndvVsBq>183K?qGaPgF6?^&x!mF;S}IES{z3Xl`#-o$(fv1w(!OnkB5n7 zZ?brj{hcsiwA>kp$U#k&>Ks8FQcR}obSL7c8niG&VgtL5xO}>wgnPMWqAi8@x}t(qYny&;-bB6AEqjSkO9gX5x zm&HEbrUhLYO`9GmIat-0ZDW#eHfcCd!-~3$Sw9%cvb-W1EyL40l&2LvYJ&2MoC?*Z zku~nz>_z5PJdzzc(92iXTM~&NZO=nxPRn&^8IGuR&I%u&q!+yNm&EDpsY5iHO2TNB zOa`j@=w9V#DhAonz%Ow*vj7Nq*8J~5@j5#rQ_yrLoCiu%u>gGiY8LgL!I9V$HR!>v->Z0WWrLdH0tGa$v zlf_b#`?F0?Nj7J^W=`M}nm=E5qNd-P9%=L-QkEPqY$57l7d^%1NsJVsT!38;)>}-N z;K%|xvP`pDGML0xQ({^Wt26>!+fAJ-7vLrTeAH_;7>fdz*5()`<0?VNBrRwm1($E7 z#m$(fpYCJgz9eKVc~}HR0Sfdq4s;;SYUQUmJeB5kki_IbX}*uX}Ek-z-kHJ(WsyQJPCDI@c8eJ?Y?h1XM}Onp!z-fQp5Gw6wwx-X74CnH_cQ zs<0iK`ittzCYF@vQi7fVHnx)A3w?pNkxlHYXd((|$`|ThSJRL)auFZLwlT(yw>O4w ziXG~@RZNYN-$&f1*YQsdy6^KHW188e^M&!xj>%xz@t0;p-em11Fd3Pe@QsLeZmt8Y zH%Q$rHiA&b^CFShI>9eN+$~Ht0wy=Wr;!5F*59rmoSt`9;?%4oVHBzQV5klHjxYNy zV>SBt(M_V333oMMWSRVtO5i0`N|q|CHkp=VAL)Zb`CoX{`=Elm@ z+(41_9i)W@XpllLG5#2%IcTx&|AB3M9_LkqTLzR>%sRG-(NllhJGANt3np%8nMV6e z7;bxS1@6NA3z;jw<4GIaeB_0;Z~E98JW)Ia9D}2d5BQWDQkcDsmHOr<;wm)4nL!|} zb~hMa$;$1)$_vJos5TXucF{>@N7eTw&>cTf5f3`(Er08NC=B*Qx}M47>)GHXq;sWO z0-GfBjTA`PLsHGF4%xvXr&a z{CEu7gw-%SWl=R8*k^uyw5^^!J^Ejq!FILISj=LP-XoG?CwbVq83H%Jw%DZ0WI{RI z@{7e@vLiwTe`G7R8wyvy^0rfVCNm42DSJjW ztM*gF7-ZXPioy_h*aO)m^iQvP^x9GAxwEpEwYAmRyFn^!(U>NsfuN*L%5qJX5HwZ%{zio&EayxjJ>|USLdKB#hlh~pJeYrRJXPf(4A0si zu5fVa|G|!6oWr`I$k9AsP(!pKXTKows4i1Nm+BaPxnj1`!p6T>ps)?*m3BSw0@Im; z8BgvHD&!Ea=HBj4I-MxmilSm^o?H86(vYJIUxz;rV+mf>$dOZ7v3BeIHqJjnNk|5Seeq#ce+*HIr?=m9#Y}05$&9bNQK2P*umA|3&}|+?=+KID}h7 zut`Y1XK5?)0+wJcIQ5i-PehMPE470I_xkOkqgjwx#s=B?pdmHkU^c+DCO@swtWQBu zhhr+(Txb@?M6UE$mX^-@KtRxkKg5b=-iDR{zwXNukhY>n%ade|YwnY0b(_?~R{7<; z-PL#3xGyDjy@tM9K1pjnXx#oyHBTp<3^=IMWUfGoJ@*hr7KVvAUn*O0&x;!)ELK@5 z_K#IRtX!g1%)t%Rxo%5D%4(Rsa%Yzg1`3ErP2lD~>+fIL&N- zW6;DG1gRUAT|A<+iiY}V>Z&yhox=kf?X1q(FB_Bcj%+C44dq4UnRY$bcZs(Cm0kQ8 z6zHD0a)@+jXJXr~c6l|d3SIgIul6EvONmsr8+^U99h#ruOf&qseBW7rI{~@#FvS|WWY`7!)S{(g2XJnz`3}@1%!7foPSA!kvJARS=Bj6e9*O^4WCmW zwV}i+{v`8rMYXm3H2%b|DEI))Wrm+#nRzSli*%kfoK4&R4GJURDfmw_K(2oVW&E#* ztN+t~%EZYDFkUjUu@f?}0|a1y`A?ZR0VY&7fOPWT%&cT&0Wc~7{!;*>l7od^2;jH` z5N-dFVGE#9{xMc^2nY$V{~^%|{&A)Lzn}f5+222dNBo!T|GTwv(z7x#{aHU3fYizO zhdKLy(E8cf{xLiHcSl`Ze}Ogs#8Cg+0V+Vk^*8V)*Pr|Gzb0INUFJVcRIxI#{A&r9 zmSzko2bxcg?kq4;9jUUH7YAH{)6;z}m|tMsS7VZ1n+5?&oJ1MKU)y(h?N#)ut!*ak za^;&R?H7A{jvrH{`2juM+sODGKLN%ugzBvguh%HH?XHjE-|*Ew9Y`Sry57EbCjnm( z@v^(SxOltsZ2tJhlJ5mVhG5F!r?)q}9%f;Qz&=a7lP~Hma-83+vc0|CJ_jccxX4w5 zMgtDGo@BT9)@O-}@M4o_$``~*EwMXCfG~1&hlX>0?LD2~D1LPCHzY*4t#2{It#i$RX;&bSIxD$5>B_OT<4MBiTNEX!doT1V#~O3C zl{y2Kml@W-KHbAYeA2I!&SL-w`8`K{ z2BwhjdFY73zZLsTMqXBKs;{g32=FE2^>#5{!WboOYJ`v<#?a7DGd$fV`fC_9;0wf& zxm4h9>)2d`d4C7Qtk(GG;)gc-rGOaNcgop|M&bj~dAg!`(H`ubqULwesbr{pq@}i+ znqUiOh0!R|1jMLDS_st{T4d*e4*U_0;OTGZ$&4~J#K%Eo8ubD$6AnysdU*p&o0Q9( zc!jid5BBCXMnU~ZBjVkIU8!&Wasnl}hp=XgP#1+Xbh&TfKZU#sa)$;tf3t4!G||NvqjxQJ>?gdHY8 z8;`wVIQ(=sOr|!qw=3L#rK%VYzg;kkd?=FOqpCimldhhxqaB??7wZiU76mitza~Ab zZ3$0~@+ag`)wr=F+eh`Q-{d10EI+**jv6p%9!fvT0yUTo-t$7Brf|XMJGo} z8j@Y6(Hi!mgys%Op@G8Xe64AU_HtGMM`1$oj$Qyb@8Y$q+*z5aUz;s#+is zbq?oUy(7i-j8#J1o9{{~sBf;%#<1H&kR^-WPHY%k+iw14WwMwez{1E~$grI)(lnH_iqmEs%Yr#7uBdh~OYj8;VcGb}>U-Z1 z=atg~YVjpmkA1whE1*f&FWfHhvtKr@^!PX5?lQW>F^Z;jF*dkm*#vwv@mPFdt;-lR zV}c+M5yGqntTVFWUT2woQ0(|^V0)_25WAWOUkkYs6e^CfcQ1iWFZPc3fzvsml3o1| zw4L^7(NLDp2~bDi5C{LOIyQpcxs7%wX<|y`t#Vf*JFw))mm9w7-9$ER$R0#8nm_&|=8mc#P)UGE!Vxsgl#Op8XY;oEST`Yud|4VZTNp#;V-v zvugo$F{BzC;TcaSR0(Oq$Vq@?LS*p+qxWpeSm*7QOibLOm`fp*Zq+r$N=6byffKX{)g z-jJP(mL`TX6e5=xn2v^l-0wxE#VqI}VwEIXz&;GPZsb41z~wVgb93Y93kpFH;V;Hi z(HaP<24$}9jp1L1+QT$z%Z}=A@7IEUGzITToW=BMiQ59EZ}s0P@3A%q?(aEE9G&bN zMa8lr)8Uy2{VGfK$Jed89{ zL5^l}>bkC!VFb3WaN9`Y4ioG30Q9g}ylk#!yTn7@5Go59ey_(>2{UHFWkBOLv69Kk z7kFVHW7Nw_5#Dweg7m5`Bw3v_KvTI%7+zFl>Ep8Lb&u)nu4=5;-pq9;U_5x(RznLi zB&SvE)v<+u`+{|!UGOc|a4TtxB*ssuEuXbXhatB2i{7_(;(%`g{}1O#KJTf??{Fui1&z zcPyl%KZ*wLYKZJhXAq8^lq}STCR>%$$WpRy%j@cG_m-B~z@$I}(4FlnL-p)?w>;Pq z;JDjJfxms<_ttFoN8NYRts0!`55g)kO3`bIC!_ynKJ}HL#pmlXQoxC@YCgnZZ;X*6 zBVL;pMdgakAx|LJ5fTY?+%_mBr=P{pSY@E#P(i$d@9VdqAm$&jH-w>F_BXSF3%ttg zjL|F*)*?t>N}&?z@PKd)CDhkz*z@bU3EEqA`813D1GNPnif8=_O(Ch^SKSd71LH<% zbC{lKu#VwYSNYnyEOvzJTkS95O)sakv)BZjf7lO)Ca@9-dVn1XuaQedjs(OcIxBs> z#!Sjn{+Xkxwq*DYAtv`evGn$J=jB#_9G5?n$h9MzYCMaXQ8({Uxv*7^)CovmmG9eV z2GS{|hrlik)qR-2x-taCm-@0*!o9`{5KFuHvwZbASoy{M6?=8AON&JZo{VE;(E#aM zuwN?FI^jR_beC`w*I0Dqy57w1S7KBR@@?!hGofzQM-g;Q#*fJ3Ej~$r5;)YEUK~1j zb|?{=g%(4}-m*J~`$0CKkgN&?f7R3L4BsVN%o|w0HsP{6jJm5ZTdpRz!TF*IRYk4Y z$S-5Kw}!JjG1h27JLBC@dT7K;HAZerPqP^#=0t(#$&r&cv3fsSz4za*YB#=tCq8Qt z2A55s{(`UHek6-rvZE~28@L(93huQV1=WBt^1J7fSQH_59kK@}mF7#`%AVsjz)&0| z{Ng-82JN&lXRJ(Tu>?w&f+7|rsEfFy9b6aLhIrLZsOBr0np#91R{YaBl0h|;xcZUxHZ~@6Y>bQ6UPq?Tt29@t z{>IZ)A8E>h!FACoE3`FY8e3kvSh`UhXxEOs2ZKI@JS3wYD*Lq&0hStb4;*#0kDx>yfgAfJC7U7g5H?U!oF zweRsIlglr5#iaS#s;f#V@N4A=HvwY!zkISQQzn;j*F5s<`HD*=JHCMb(!2DqBP@+$WxS77;pNvH|g^-}Bljww^T$DL{ zgbm7KUWV>Ui8^7EEMoTIz_i7}yK`4AF?fv7=s3iCh$g>c!2uj!_!b!1B~qkOixOE= zH;vr(tsxQ+Sb>#pR+9vf4+W3mm{wA^MF@RAWu2Hp=(>9=}#ygZ`MTa-B*V>9mK&QrLZ2ZkIR#(nG(yhShU2Pu*^l+j0q93g7osKqC+ z12R_^oQw9Yt}pwzIVN_G+AsNgnGON+UD|B%6*Se3*5XH_y9L|c8Fkdr4miPO4S@yn z7oR#cY&B$(HP1_neCv+wf%~82R3}ACqm74=Xc-CLZ(_e;$o}Y$l@SHMir2nWJZyJc z_zvo>)%E!p2>03%D{tKLy^n6)Wcrkslhn@8=3?EL;;Ylt)Fr`UxT+EIH9pBap2QFo zXz5!ZN+X`EVkO%S@RPM0dwnU5xvG#|(uc?B%_Wk4y99hV@p+1kC-Y^0_zBUsZ;H(3 zUv=je*fM0(hbJ1`E85{I=*Km0-{{moB8K;>y_WI&rPFQ$6Jpu)!jbAcEnXbPE`8z_ zFW`tQZa`buL6%lb?5g7e?~3&_C{Zn07Tk@tbY8DZ3W|T*IN1n!em&;Nj_1|L(>0X! zUa&`)W$TB3*r{fNWy}L7H~Q9i*3vLUuem00O&Cyg<3|VgofjC z=%)gufVF|cyUi_b1Oq`g=AwR^rtFvw{3ik)q{YcUPsje*Oxk~$4gr!N4rX>hI~)fq zAPM6F$kmxS+34B+66OH%DnLxe`tQ!h{^oP}lXtQH`QreW%O9hQC_6K|0Kogi0yxX^ z_Z@R0TmnpjB7iPAQBHxsoK3<2uM;Du&_B4G*f<#l0cW@bI04uC`|AR7Hc>$?0M&s> zfa#y6YX7W*>c85zzuP3hzOiruI65qhf7DrwfKcuKl70JUaom5kZ-2K*e|z2loLPEy zcCJ5ywf_sAH#W9^*2wzr8y)5P*9gFX6!R}M)SrgEKhOVP4SRp}`u#6}sK2iFpW;kr zcE*2=4Xh~@gWHS*7%Igit3ecjo+OT7(5vn3c+?{ThNIgFC=zN2#siD@SA+0>fAbo= zJfZMxD{c%&(4lpCRTojI-KzLmIkcSv%^xQ*nELB+xBu{rpyTc2sQb6;+qHQ?a}GYA zO;;C-X8y%TOvcAY@RYnj`7!TJa>DJ}`o%}cnawfFw(u};V4mTx`R zCTJ@ip`4Cgm52_3w`nXg`2J*&!r@QxEvjszZzIF5FHb4&Z?ztRO}%ed*y=063?Rq|V-TVy)Iy-UYSl;tcMfYe;P#_d=VS0Q|XnneFHc>&# z3)om9S*?_vX4B9zS-V^G^i}PL$qoedr*s=7?Z4=TH-u$fZ=fvU$PAB?MjZUB96V@nO3;oVL2yr__W~{=m?e*KovgrDA(^A=^q$mVAQFsWRqvR(W_Vb;w)jpqbaZhq>;CrK*(hEI;NItdrzee4xZ9 z=8l!(cd&{Y53|ab3BRs>xJv%`=o+!s1N4Kb+qlaBvoXX7gPe_dIo!>bb zSK9`W1neCjXFu`DshaHH^bJGT#-B2lmBQsaUBb#BP7W!pQg6p8LWFff#Ens zqH$Yw;Y z`LXpgQyi6QQFp82uE&#gE)`=8SKlvM0v$ZUc_hNb!O6}7R6;93Ykx#vf{@BX^HKfI z4_Q5F4(k3pLxLMo_w<>jPIMaqOh&Fxeyi1r!G-z8@RkN+B@s2_ZfKRa zrHm)CBbyN|EKe$ow)#L8NP@xyW_lR1+D9s~wO+WuvLeIfWIK~}=l<66;)Z?L^&=H= z?~0g1W%uVImISY_2xBO%`qZ9ln>K(M?7eRdmfHCWU@PN9Bdeznl&!EV;p5|bijUw| z+89JuCXcEt8~zBh=MZ%cnQ8i=pt-};b+JvlLApyB-l8ye>6iH?@=rWV-xfBKpqZ3?Um?R70+NqI(P1uz$CqpgP zf}|T4+mnUj<5@FNI4-HH2uFYJqaPy}bZvRzOLa0!L#rHN1;^_!k`oF1trQRZu+`C>__8Vwq0ONI=Apjz(Y0VPJu% zGV&rC?FZNC?T>}?sxYMuI6{phrkL+V8%~9<^|Cpa({_%*Q^P47QJ1TPg@J_ADV~bH zhvR}UP;$l`m-5C@c)Zoi2>H!0isF8P%#Lpo2D!vf-+qs z#H<)7KZ0fmlfXIAC41wRu^mh4)SG=^Z6(bLMndztt8N^TxbX1&RL{`E8Bwf6-s%FL9s{A$F z?VORk3(c4J_IIT!#-73fvtNTRKIiXC@b@nnKFGh?80eMJ=?Y9ejU~x)Y{hniXLYz} zTe%={p-{!y!{k4T346g2TiT<$M@oAOeHjV4jlAUWe~k*gi+&xbFW>AhuzQW?P{-bz zf*KcD=i5bRSbMC~C0ziDilEXyzzoxC*NZs6WfKsOOmCjQ@z@q$qEthKQGFiL!j~M< zI>K4aw?dM3yN&9uvz3O>1g}zpy*iRS3~Xx_DD{hzzu0K);Fp~;9@dgX4jSlKvlr_k z3AZ(>Rce{{_yhU&w`?NdWryZt7W*tXk~!CB!m2Y>v6@0hoa?ht;8fC zzc0_`lhRO&sgxdrFj!a(j;z zOX3^b=mPDncC)IYkBO;ANkRNz&T5NRvh&k)u}vkm{Af(?h6nHVSh;w=8d)1c{CEa& z9fje~wGnp8{8thZyjpR&l7w<)_h7D}(k2qRE!rFDb{m^_EK+v%tA2lLzJsU&8-GXH z=zF9Lc}3}pC&OC5!~-5%=E>6*{dxQmi1v8!}cb7KNkkO$(FfalDN~&+q;*dCQR7&GM zT#{?iNA2pbP{~dWiA4Ct^SI=SYrlqsq@SL}dEy7#SqOSrzW}Y;4EzLk>{?~6K;{Vb zu61>lUDV@+w!Bh-QU-$><#U$Hjjw)c;d#J-ucuFDsdCQZwv%K+{c+S;ET@hwlQ=vx3zJk)3-6A zGqkdGbawdv&^fcQ|FiA*H8% z5K`Bf>WF7er%uRal@H_|aA6$k@HY_Jju1i}g1WO6ff^k`OGtqq@6TR~UhJzzO1M!7 z0*sgn#OfaLs=E`se_qJ7Gjuf{4kP#iXf+qpJhi`HF5WgVFxI46 zeINQSpDidfDJiIJD;GTRsA($Jx?jzoE{dyz5T8>flhVsAs@hu9kG3y#y*qij1^1}u z-D)-tmxeOR@too_{2Cf&q|8I-(j}*fdj`)ko?oQiy>$8G$}FDz7+s1C&wr#s_|IWA^gHaFHutkUU+3Ut2C)-e5#N(TN{G-uh(Fb9iJ5v33(zF6}nL;rtJ2 zGRlS6Z{D;iC=3R6vy>Ze_@4e|3svNWknCMLEU}d5^}YeF@%&6k*AfmYQLBnSBd}mh zNIij5^%y3;MIci3HgWA&B3H|TC7m+YbV#N&H^~Ir;$@r#h7@TTD7ytUuW&Mp;B_Xl zKYhCjWA^#55nM&;-?etJL-6eS-$1`GuC$__eSVwvNq}*3WKVzLb0?#&_2r`9{C)z= z(rU;F_Q!*t_Swox=w!u$5QxaHgX_)gpP+56R(JDR3RfGm$^s*B4uBA))hiVW^u)u5 zmeu7f`hAs>nt)ctv-jnph#p^+W)NOIeYKEYAdoY&QSbM0n9zpoNG_&o~qfBMJfVxaz}IBc#=J)Q~=? zMqdUkeX;rOZ|lBZrwcNd9v)-yj^|5nwH*p3EF(j*|J&C zuwVFT4nJ5Ai3q*L_a3d+`yH=;^1>y?Df~7mtOeDgJBb){Z`m?veSCj#%s!KmkXu2b zeti1%`7E>QVD2soMiD0In}IP)niFcuMn zHIKm`$Tc=N1U?&G%4jjc5KBLX{5l~urv|r{VmdEW!hm*vjwr^#U@zKWhgmO~#B_ix zsgQE3*LPhgpIA>uNtDtK?w1ij)JD?^?+loIreUn7*EZL3#g-U{%d;<973qN1lSXbSG1rJlW#XLrI7@gn2Rv{wT1CwweVGZi8uC zo0Np<#z{ioGyh|!Ur>3be5Pm|Z3VDmMoQxPK!ZlFM079SY9p%sICU7IAac=_bnBvA zj;}oGJWS3KuhWqj+SQ|()uaN~^h|c?XFdI&&ky|yBQR1D3S=gUn|L7&{o4sjbE(9Z zFH7i3;{7m{)Mc}qb#Z(PMJ{T*YZ>}zwD+W-b8giHcHH92@x3ae7A^aj{j4cae|`fy z_wD1c{8P3-`8q(8FuPl(b0@cTn=Jrm1kqlId{<)kTH4?Pz-(GsJ_0guc zS=qcc2D(K8`w@vNu`&tB^GH2UZb(ZOy`~WfEd{i63%}MHgeQ<ppQPl zM-q?c4DozzZB1YhkvsvPv9FCW`KJ1+;Ic!h!c|i^TIj<_SW2~cCqXt?e=5~&fEWFh z{BpZkjBTN2t^4evd#k?IK?2j|Vi~DL41Qiv&M*;70{KL8JZJF1yWUYZgsURTm&jC* z^@#BtnI}gxGj?qMx1Fpf+?2Nfu`=J#O1KmmTdV5PZIUkt(@$-Y&PAG&fW~B^I?+H7 z29AsbOxuU01Kpqh-Fk^=i2Mw-o%>BA!}8n*`Zn@Iiq2FCstwx&JJ#N^F3O7@MLJe- zIz;qO?^JlI+UF_NR}KkbDzQeb2=zvKPKI_wxfFdyDZUE2Eygh2+A?j(Ty*Mb;6B|D z&FW4%CQ(d0j^qK*n%fFY6Zpo!PxLa@<_r6c&f%a4=nRLWNX8X-@3g?$oFY;!z7S5C-cFsRfPV9KNalUP1ezxcJeuSr)VjQX+ zn+R^U_Zd(74nVCHf~beksgN?B*37MT>^OyVXqZG0lqv?T(?SabV=}M0D!2*`3|^$| z_7#3675;Z|?$2)(?)!j*{L^>tnb$nU;NM&^l|=yY%jd57O%`jq1+l00FG|Sswc~&v zJ{m0=vcq}Iu6F*lD2_uYWbFl*+}U!!!t=bPX%U0fBCj=&md%x}!9kh|SetTDKpO)K zIfn?H(RHqu;KFB{bdja^)Jvxzb;QXK7wfSyG!0XxKNJYkJIx@N*P&JdWT}t>RnAUW zi%8(@Zd7LI#8mKE5ln%w9nwZ6h!nEn8Uqrzj{+|)WFfJ~xf?oQWQ0}3RcFV7R51?f z6@SJAP6fOezh<>_tD_2Nj)0t^1t}!gny@j7i&rmIX0kn_O)d=sxB(Yb>xK{yT?@~* znwnKGIVD>~V^)0B{c3YRNsdTuF7-DVixIZ1c}4K}yCeA4awL zvsT>^m+p4=f+zo2&CqwDE>(&Zv0?F8yHAKK*OA;$`^AWaBB>Xn^WkK|#|4~(K^}XapvT>wGG<1*)ag3I77W>SG7)`**1^-|J{8pQB6iv+J zQk-{WBNc(-2kja8OmL_V-bES|$#LYS9^$DU?nSJzJK}Ks5#!|`42D1K#9){nJSakb znE*OUIw9aGqkzfZk>R_#NTw2{hzL4~_hgoxT*Yg&@Gs@1JJv6@S`$rGYnzJoRz3CX z9K{yqO_inm^R<{^O)DhuonRR2Jb8B7V_O9mTehw-oTL z32P9aIJE=uj5bq9_#0;kEF?^gS-0D-8*NAO#7O}mA<))oKMjF3lPRw+D2f^@U18@@ z^hjDmMvH1(IsuVe!fKjoVCBl}G|s-`2NR1ZZ3$NDB(h7}te*-JlTsT}%a^t3OfPn> z_kXh}UBp3$s9I8ZIx|+Kc7;ozhG%NzH3O|3tEx*I4W!YZcW4IvVlC_Q7KB&R)`e)H zii+>Xd`tp|l3~lOKd6u&ybuOru#+ZFYxx{(hK71#WYTy(QCw{ci&2`LG$*P*O!e(_ zBeU$TwV2g0UndS5An@t0rcNHclLOX{ZkDxPfoh)oux)}_vcbcGv59i*)pCg9ZzpWD z6N+O%Sxn)h^{wL2`9YU;{sLI7a+O0ff^=-qmp&of?tM1|do6u9zSgmXloxDS8I0*r zOOya)qS#MD=*Pb<)a{1a?stk3LT44*E6Q*Oc_eMvt89 zuqO%uU+vk~fQOuo7vIL5g9mVI&Z|ix;Nw~LJMz#~iSfGjSWR?mh1LgWcHZ>U!54ra zm-*!g3-ua(c~+TdmH@V8@?FSJ+2pqeQOjn5hJ`uaoNq!Tt`(E`WcSHJSlc{#lgpX9 z2}pj-gP!=uic-CawCcVj6dTWB{ah)}m>F9M+6MG)=X-}+rWCqcnG8x)z1+s4;FUf@2%-Vc} zdKy=X`DF_%;5tyB9DsZV`sm7O@(*6lsp;5jD;n5W5bFOX&hEkB>E?!~0yE7Cy?cr7y~CGU@zK zdQi{N;y4V+lkRBNyE3#=5$jY&VD`%|Cy{0ks&Bc;pbmDRFN}4K`@AH_B{DK1(^oYT zgBy2*J#9QXx)y#|=UBk2LE})fE4jUQrJfgrk@j{D9kqcciBw&|u3Fz^T2JF+7W%V0 zr&PQ2A0r@t84~`Tdixi@!+%Dw(lOKhTjUJ`BQ-rU6a8Oyk8f)KZ+4gOSKl!>^bG&a zZWnq6+JAGqe6#tCEX?0qp}!n2%>RLl|2tNnpN;jK!{_5;`Cl3Pf56eR(EgX4KmT6# zcPqYqKMZ*EbWGo2FRb5O^Z&J-_%C^Ym}viXQ82Q8OFCGXzXO2izOgc9dd6?L0wW6} zH51);HqL+Zs`$4gB)V^H2jllz_$K+kSH)k?@ALiF3i;kLF$;a0uLS>t+Jl+xTk!EW zN7P@Mk8f4S->(QJ=6@9b^WO%CvC#f4yXHUl0)Y$+HWn7NlB=rCDW3qpya;ZFEYw`T@v(`ujp8lUyA7GI=dI6) zzu{vOu_q;+3L{N+9Ns$C6f(IVJ&6cXdbkYz=htBy@`|+`kzt z{Kch%Q3|@yQp(A}-XJw>K<-q+@%dp2!)f(E2VQ~M`s;j48@=b=dz~t82=JqxEs?Cb zqOM$y??PO9CE9MiFL-H&yE1O70y*J>82EQxyp{HN(v9mOngqPUIx)K6>=-n$n%_(H z^QG?NF|;JKSn~^0bNPtZ+5p4xowDDyBRHq)Z|HZ8AmYr;A9k0!)(4PW&a-zDTg{HC zIOiWRC<9Vx!5%yMe>Bv4%V&s!e;oB-?o2vN@$-3Yw z3P*dwds+PpucQ<9#ioUx43XmlDt7AgQ%B++^0|wDNl2rpr`~Amu&$(vk>^63SysOl zS72oohRDHn+-%%#50(|nOH>&5-vB#n5IS93X8v2yW}jl1N}tn=W>u!vDn53Kr0^9iwO(Fw zsKV~i8tFKhl~)!)mNdEDlg(Ey6Db!$GtT7f{#`2{4o_CWsPflemTf+tC+$l!)~MPP zrC2MSq#+s1fP>h$od-0EsSgE{a30IrHh%VP8@xVd&4a^S$IL;mkT}MK3nE(t)dY>d z%wrmKg{Duwr!9fuQWqo};sg2iS%4SWx6}Q(0V<+^7`p0>66s-vUcNE22P;eI$Jk}6 zi2o%;zVHxV5JanJxOBAV2&ofuSD|poIzRUY2LWCn#pLdu+>oJY`o|?I(!_Xs{SEnX zdAzA)0+1=|s25qG>URi*{hWjOD=HbRij(G;dHeSex5xEecau_pQv2xxCBZmN{K&Y3 ztR(eOoYI<~P=e->jA3!)BeTnK-^1w5{1hpD=X~u8(s0^0l~e|1fAXpWa$tr|Mw9Jg z&spT0KvsY|XVd~@E0rq0xA>Gp%JZ#3JvftPq8y60Mo22C7ZFFqstg`8mDfA_UFR3b zlN1at(`04_PZjr+JIz7nB>6!{vvFlufUqSOoWIDY6C36Zw-ng37h((eYKXlQ6h7Z+ zt^OgPY);rbNf+KMiPecTK&&%4E~j~jChw%9bBR`Pu|M@0W=vHaRVNB5qT( zYz*E{*~j_V-2v{CX}<1>FT0BlS3Y4s6`6UMpHk=GD)e@DcDJ3k4>4z@!L0yK>g+~+ zGU+Vw<-6QjvsI^0Cp*L6P=U+4kJXi@<(_05X=hv7nJvg>fbUL&AOCqo(3e4`_Ng0= z7eCyP1~&mqFYMI|>zc@sD%A$4b}Krn-}|nuH^)eo?*#AD9TW zzup|H8r8of_ky6A_ES2T_Slh*1V6Xwhj@W{H3&&fJ%youR+8a-mLSM4D0HM58rwEQ z@aaavVVFGBGLm4~M*0z1Cz`rIR_uW;o7z*2idU5Ku7NU}*x3Jh__ueL@?v#1^cR{{ zAE=bQ!j-o47rJv*AB^*g_q7|^AInBT^83Q8Jdh-(L-oB*EtNV>J*%9mNw07q+WT`aOdLtV2Yx8p0u`6kVB))ti zXNyiGElb?qm&bLc@M!=K1slRbfot(F_R_X#WofWpysZlM25$W0*Td8lvt3hB4oQl_ z7X0y*>^e)=LG_u#D_a&e*2B_%#B;L~Yc(JzYsTpF3!i=_bx8VK9fZ&i!|9>Aw0`Wd z3fJ)ESCA+E)&cRP_yLM>rG#aCknkC>0c7T|y0Lq_-*gJUci~Y*T1+GWAUruug}Cyb z&^Vq+T`+_dd9LkzgtKkYVO@33;@NR^Mg=sO9T6Ou(B&=Fz|T7ctww<~qZ#c$)v-EU z$PkuBj^t0S6>abJ8F%fX=5uDDQSIVoB=9$$YnhqNTEMkiYV-`^gGQEmi_iR8VD@`x zNQ3>!kwMO22M#QsJ*S9GgV~68-fcq;)O*JON6qISg_32kxzoC)l-%B2BpCf&?8}X( zS4Rr;pKJ0_Uw5ZozzVP>4JPcDjLZ~4?vTA~)!(oqOD{KYAYW#wk}!tMtbw^HPx|5L z&knOr<~VD2cF9BO#-zHxPC-iv-+u=`Qt z5qXWS;+0lk>$;kF7!$Q#r+2LG`i+V!e=enB=5qegCeJ2?uSd#GrbOW0Nmfgt6!J{( zkxXcIYja-?c}*j-adc}eyYKWb3A$^*&6W|ACFa~baK7l49&RHp3tP1eX(gjue4KFb zLw=l6Bbu$gv6Ma4o?B3c-9=rpA7NlddTJbs#{wrK&h>)JrY{onSgn$9g=#V@w;4~H z415K=V6w3rf^Z|0$|!a@O(JAUZaNJ54uN;PX*8LPF^6f#_oS=vHfngylrb78!!)66 zMY_R-;lhD{Op{!zQR(X_{th`t+-RNL;PGhYoEqEo+9xSfL)1K1s$xJ=v&>Z87I`R1bfUM$M}k z1Pu|$bh&nBAf#zpS1}$~&d*Nra8IWCHmbt;qLB=J3|sb$sMm6pU0n+j7s2@^mUJWe!%lAC&HJ#g?P$> zAA^N$SJ*)W%G(}Koz*EaaYH5H@|V_4*$Afa;T7o*vrK~-T>nru>~B6D8UzH2r$-qP zADFV~KSo6mPZZ;Y7Wy?YPof8}fOBNvbzb~LUkeAs;p@+$%Yi>7>HlqIoZZF?Lmx-a zEXqr^>-MP6xpx~p9#>COS>o@6A2FQw80llB`0Z(GA%zu{Rj&S5 zw-t|G$39RKaic*~b0q~Go8eot#XJ=cog>(~;Jz646RZT7i77?qz>f?8MT2|QsY&*T zki+$sV{w2*BmIOQdPfrFZ?C%d86tX$*(nE?0d#g!h>;@8dWT}YzwaXw@AiIaQD8z4 z2Ulh@v%0%LV=g)=e&}*-W8#Y--4QfwY_2 zK3D>m7s$C4;*(-87=;Tv%4%H3&ru_S+`J;33+XD9Z{;^xaH123?`w*k_vG@gFFnZdeu=3 zCf5qp*m+2jDK6fogW;)_QPhCVkS=b1%H?OkcPdWZQ631^up^*E|45jDAqc%)CA*U8 z$CM2GXWKe`>fHAIp>jF<3%eaN%7%;oqArqi9tUT#wBKY(Akh1gXM`c1w zPZY=WP=|rvM7Ce`VN<{5vptOYU2JK*oE>MOW$p_s+rvxbALCB{6(b2F-M_gX7?|0p z85!8S^m`#!SIbrF?_=g|IG-)|5;8F7TW)clZ1tqn)MqmW5i=%`Ua`!Sibwl z#zaj^OH0Sdg!gT}`A%tOpkw|2c;o&nR+9gvOW&QNr)Q?eqob##W@BXgtC|0QXdKgb z$$yU!|2Lvw|D>0Mh4x>)B>!>+{0#;B2VN2u+W$BK{a;ZqdU{5de_!x8Moi`J9yaO|ZFSFLFB9xR%^JNBe&PpS&PYQ9GK zwJ?+GBDgV^i?Ae5FQ(%%DQ!_=LW^6y9L5z>>Gk)3@lLe%2pPp=mi3tU2tl|DsdqSg zNE<7LSR#|RpuLniLb!;_P0K;P;$Y6a(R@7}EAQowC?tH>XV|i1-%^YrO>6YcA6(xP z#FZ=&*|rA-m3MjzN(hkEtW6=y3sVR;b-@hE4iV=GcTbRac{0k&&mj9&z3z=Yekl1Eyp@MuRqx`UlC3eQ zY20Q9&K;eY=@+tSQ^<@ek+}XkILelnizXM1^&_*%%t0f|w;s@(-m%7%HdZ|Q>OJY+ zxzDy;ja*HqWYp(+%0TMo8Dn>foMc#$-}@DRYMEz042n^dD0ROmU;wPCsIb`Xd+Z{@^=N~McvKh~$Ile2{C>Djdze&|Qo&9q zj%WzxRE<9AVHq^%z4-8D(kT(HYJzMRj7`qclGUFi;BDHp@+UjE53dU%921nDAvbi} z#mz0__--_)&K&8xnGavu=lAXyKDrZ|lO_|QZHGaeN!AIjxv=mv1{RS-n?}Aj)}{&? zpSBYn3F4WTasjrI;xt<8PScM$C3YVR^w~kJqJ#BulOpv~`R88iGrMUOa6MUxNU1dF zZAF|$#aPu@g@h#M`((3tF`_rwLYxTAkZ|5fj+q=oPLfLzG;H;vY{xh)eACG4F`o=U zc}%7+jB;Y86AewhUqZcc!_rKRXk#6*CuN^VG|W<1ZB&yxz#$5xqSy4{;#{@fbTX*{ zg#(UVu9HU3A*}-uo&BlC;U1%lfAWRz>(uAi6dinF$-Ss}&?A`YJ+o|0{GX`1g9L|C z8M8#r1{VXr7@8kU_Q>|?6|5GFJoKGQC*>TL1DF6)?#eD}7%1NLu$&9ll&h)@{J*?k z1XuG8|A?s;W!gE{3DoNb9GsPwn1g)kn`aG%0n5BOcEFG|mO;dtY{nx#^%N?P+aa6u zQTvLP#k9|Ikju=V4XPz`H>hB}>?Elqe}yh({Z6kGG{K25`OSiU1esXeYB4EJadfk0 zg8s+;D)cR*dE>lvOH*~M^Gp_Fy8p2%WBgI*x;wLeXh2{Cm)OMJ*~tJ~taLurtyZ4KL9mE;H#ThEA=Kt5N0SXx_`Rb?r^AkrZKw;> zkD8gPjvfZn_5nCg9Sf$*O zHZOpyDLd!~0n_Rk0uTE1F_v#PdQpN@B!Ut>dAiMVjiPj{_&lleYe-o@ky>}~YCX~- z9f1%%(*?3*88+&g1@#N@yEQG-cz7Y&tYXUYb`OJBq=^cv?FJyTdhdPN738IJz$3<* zV8G)W3duXfMT8f-FU^`fUT7q(0jP3+6(RATpad)rYgXD0z>zcTq@Vo`4RkH@f!r$@Kta?9lj8|)7u-pR*WR5uMWV0BT5n1$5ZxJm! z$=5DGOI^>91*vTF^D|Ybf}HnazSAu4*f)eYs^Mn7kStnUc8VExf-Y7Sg}D{OV_LGKS)8=0SQ)k8RwB zK;^>ZV+ek11n@5QG$>^65OxMzDw0^&PAJCHkEh%BEFH@iN1b<2A>)FE@{4uuVx3MH zOn8gah4G&9;$(;y`a_#w3PDKZHm+`%2RM>QtU>VXq$VDy&vNJ{G%O$a&^%_fP1}2D zs3++%D=BCMa3lC;bews}J`2Do0IR^Km2q8Vh+dl@HoI6E%x%X=eDX~P{Nmk;x4p!f z{zXs}`0$8yoL!>cpeKz+jU(O2+l?#=O|G+}XefjRk*k_fq*ZVnhe-~&H{wQC0ZIA8 z&6G_iRzC8DO_Y!1Lql3V1u)P> zg8Z16yJ-3_KGSM11j>oRwLP`Re#>d zNrcLE&y&{bICd5ACRxEc`+*Vf#wD@rll`|95$pI9on^}Iz2)Ul1L_tVp`@C*kM){( z7XL;8p8@M?%ToK$70?*I5xMcFf}H7ROb{m@5=;@upjSISt3v7P8lC{L+hrQ^Hf@=G z!Mw##fCg)*D31}bBb9@cZ8FzxDxfdQ$}giG5>39-srG z=dvHScCNY0LXw@|vp}n`X5OOx&*IvxUk9bALtSNHp7>mTybtxapYh${`!li>*aM%) zeR3&%|L}&3?jLFU|1+Zh@2n1gg*wu)u>2onbzr8l(lfBPaiF#`B>Vn{$IT7#{V=jN z{EG;M_=}GJfA!DnKkI1tTlfDrM*|D(KXx?ylZ5TScZ%bB6SDV~4&8+S0!w9YABS(? zOzKK%@DHk(K^r?93@~ZAe$Z1i($}ju?6^45P<8X6bl}NJA;Qhc$SoHbWOnfPH^`j< z3ycof&+EgD4HX{sySZSW&#UXhWDdLMgNe8H>Z)5_N7skP%lp%)L1k&EP4!tYY*2~{ z_6~QKrw!D<>)^9G)Lt}m>vGTF z{r+N&L#hQYB%_aYG_lcrxrve&s~Ybbb`$Q8*)dZ%nt1T^ozFjsnvdrN>(~?vDW3Pwl03;I*W#h%@*EN|M>~xqL2J_Am6%*jR@E$v-#3v

Z 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

kK%aBiQSmDVIz{JVz8&%IYa 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 J^ouWk`5#|Sd+`7O literal 0 HcmV?d00001 diff --git a/appendix-00.html b/appendix-00.html new file mode 100644 index 000000000..0c243c207 --- /dev/null +++ b/appendix-00.html @@ -0,0 +1,245 @@ + + + + + + 附录 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

附录

+
+

appendix-00.md +
+commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f

+
+

附录部分包含一些在你的 Rust 之旅中可能用到的参考资料。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/appendix-01-keywords.html b/appendix-01-keywords.html new file mode 100644 index 000000000..3672e4b4b --- /dev/null +++ b/appendix-01-keywords.html @@ -0,0 +1,330 @@ + + + + + + A - 关键字 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

附录 A:关键字

+
+

appendix-01-keywords.md +
+commit efbafdba3618487fbc9305318fcab9775132ac15

+
+

下面的列表包含 Rust 中正在使用或者以后会用到的关键字。因此,这些关键字不能被用作标识符(除了 “原始标识符” 部分介绍的原始标识符),这包括函数、变量、参数、结构体字段、模块、crate、常量、宏、静态值、属性、类型、trait 或生命周期 +的名字。

+

目前正在使用的关键字

+

如下关键字目前有对应其描述的功能。

+
    +
  • as - 强制类型转换,消除特定包含项的 trait 的歧义,或者对 use 语句中的项重命名
  • +
  • async - 返回一个 Future 而不是阻塞当前线程
  • +
  • await - 暂停执行直到 Future 的结果就绪
  • +
  • break - 立刻退出循环
  • +
  • const - 定义常量或不变裸指针(constant raw pointer)
  • +
  • continue - 继续进入下一次循环迭代
  • +
  • crate - 在模块路径中,代指 crate root
  • +
  • dyn - 动态分发 trait 对象
  • +
  • else - 作为 ifif let 控制流结构的 fallback
  • +
  • enum - 定义一个枚举
  • +
  • extern - 链接一个外部函数或变量
  • +
  • false - 布尔字面值 false
  • +
  • fn - 定义一个函数或 函数指针类型 (function pointer type)
  • +
  • for - 遍历一个迭代器或实现一个 trait 或者指定一个更高级的生命周期
  • +
  • if - 基于条件表达式的结果分支
  • +
  • impl - 实现自有或 trait 功能
  • +
  • in - for 循环语法的一部分
  • +
  • let - 绑定一个变量
  • +
  • loop - 无条件循环
  • +
  • match - 模式匹配
  • +
  • mod - 定义一个模块
  • +
  • move - 使闭包获取其所捕获项的所有权
  • +
  • mut - 表示引用、裸指针或模式绑定的可变性
  • +
  • pub - 表示结构体字段、impl 块或模块的公有可见性
  • +
  • ref - 通过引用绑定
  • +
  • return - 从函数中返回
  • +
  • Self - 定义或实现 trait 的类型的类型别名
  • +
  • self - 表示方法本身或当前模块
  • +
  • static - 表示全局变量或在整个程序执行期间保持其生命周期
  • +
  • struct - 定义一个结构体
  • +
  • super - 表示当前模块的父模块
  • +
  • trait - 定义一个 trait
  • +
  • true - 布尔字面值 true
  • +
  • type - 定义一个类型别名或关联类型
  • +
  • union - 定义一个 union 并且是 union 声明中唯一用到的关键字
  • +
  • unsafe - 表示不安全的代码、函数、trait 或实现
  • +
  • use - 引入外部空间的符号
  • +
  • where - 表示一个约束类型的从句
  • +
  • while - 基于一个表达式的结果判断是否进行循环
  • +
+

保留做将来使用的关键字

+

如下关键字没有任何功能,不过由 Rust 保留以备将来的应用。

+
    +
  • abstract
  • +
  • become
  • +
  • box
  • +
  • do
  • +
  • final
  • +
  • macro
  • +
  • override
  • +
  • priv
  • +
  • try
  • +
  • typeof
  • +
  • unsized
  • +
  • virtual
  • +
  • yield
  • +
+

原始标识符

+

原始标识符(Raw identifiers)允许你使用通常不能使用的关键字,其带有 r# 前缀。

+

例如,match 是关键字。如果尝试编译如下使用 match 作为名字的函数:

+
fn match(needle: &str, haystack: &str) -> bool {
+    haystack.contains(needle)
+}
+

会得到这个错误:

+
error: expected identifier, found keyword `match`
+ --> src/main.rs:4:4
+  |
+4 | fn match(needle: &str, haystack: &str) -> bool {
+  |    ^^^^^ expected identifier, found keyword
+
+

该错误表示你不能将关键字 match 用作函数标识符。你可以使用原始标识符将 match 作为函数名称使用:

+

文件名:src/main.rs

+
fn r#match(needle: &str, haystack: &str) -> bool {
+    haystack.contains(needle)
+}
+
+fn main() {
+    assert!(r#match("foo", "foobar"));
+}
+

此代码编译没有任何错误。注意 r# 前缀需同时用于函数名定义和 main 函数中的调用。

+

原始标识符允许使用你选择的任何单词作为标识符,即使该单词恰好是保留关键字。这给予了我们更大的自由来选择名字,这样与其他语言交互式就不用考虑到关键字问题,在要交互的语言中这个名字不是关键字。此外,原始标识符允许你使用以不同于你的 crate 使用的 Rust 版本编写的库。比如,try 在 2015 edition 中不是关键字,而在 2018 edition 则是。所以如果用 2015 edition 编写的库中带有 try 函数,在 2018 edition 中调用时就需要使用原始标识符语法,在这里是 r#try。有关版本的更多信息,请参见附录 E

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/appendix-02-operators.html b/appendix-02-operators.html new file mode 100644 index 000000000..a6c555be1 --- /dev/null +++ b/appendix-02-operators.html @@ -0,0 +1,412 @@ + + + + + + B - 运算符与符号 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

附录 B:运算符与符号

+
+

appendix-02-operators.md +
+commit 396fdb69de7fb18f24b15c7ad13491b1c1fa7231

+
+

该附录包含了 Rust 语法的词汇表,包括运算符以及其他的符号,这些符号单独出现或出现在路径、泛型、trait bounds、宏、属性、注释、元组以及大括号上下文中。

+

运算符

+

表 B-1 包含了 Rust 中的运算符、运算符如何出现在上下文中的示例、简短解释以及该运算符是否可重载。如果一个运算符是可重载的,则该运算符上用于重载的相关 trait 也会列出。

+

表 B-1: 运算符

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
运算符示例解释是否可重载
!ident!(...), ident!{...}, ident![...]宏展开
!!expr按位非或逻辑非Not
!=expr != expr不等比较PartialEq
%expr % expr算术取余Rem
%=var %= expr算术取余与赋值RemAssign
&&expr, &mut expr借用
&&type, &mut type, &'a type, &'a mut type借用指针类型
&expr & expr按位与BitAnd
&=var &= expr按位与及赋值BitAndAssign
&&expr && expr短路(Short-circuiting)逻辑与
*expr * expr算术乘法Mul
*=var *= expr算术乘法与赋值MulAssign
**expr解引用Deref
**const type, *mut type裸指针
+trait + trait, 'a + trait复合类型限制
+expr + expr算术加法Add
+=var += expr算术加法与赋值AddAssign
,expr, expr参数以及元素分隔符
-- expr算术取负Neg
-expr - expr算术减法Sub
-=var -= expr算术减法与赋值SubAssign
->fn(...) -> type, |...| -> type函数与闭包,返回类型
.expr.ident成员访问
...., expr.., ..expr, expr..expr右开区间范围PartialOrd
..=..=expr, expr..=expr右闭区间范围模式PartialOrd
....expr结构体更新语法
..variant(x, ..), struct_type { x, .. }“与剩余部分” 的模式绑定
...expr...expr(Deprecated,请使用 ..=)在模式中:闭区间范围模式
/expr / expr算术除法Div
/=var /= expr算术除法与赋值DivAssign
:pat: type, ident: type约束
:ident: expr结构体字段初始化
:'a: loop {...}循环标志
;expr;语句和语句结束符
;[...; len]固定大小数组语法的部分
<<expr << expr左移Shl
<<=var <<= expr左移与赋值ShlAssign
<expr < expr小于比较PartialOrd
<=expr <= expr小于等于比较PartialOrd
=var = expr, ident = type赋值/等值
==expr == expr等于比较PartialEq
=>pat => expr匹配准备语法的部分
>expr > expr大于比较PartialOrd
>=expr >= expr大于等于比较PartialOrd
>>expr >> expr右移Shr
>>=var >>= expr右移与赋值ShrAssign
@ident @ pat模式绑定
^expr ^ expr按位异或BitXor
^=var ^= expr按位异或与赋值BitXorAssign
|pat | pat模式选择
|expr | expr按位或BitOr
|=var |= expr按位或与赋值BitOrAssign
||expr || expr短路(Short-circuiting)逻辑或
?expr?错误传播
+
+

非运算符符号

+

下面的列表中包含了所有和运算符不一样功能的符号;也就是说,它们并不像函数调用或方法调用一样表现。

+

表 B-2 展示了以其自身出现以及出现在合法其他各个地方的符号。

+

表 B-2:独立语法

+
+ + + + + + + + + + + +
符号解释
'ident命名生命周期或循环标签
...u8, ...i32, ...f64, ...usize指定类型的数值常量
"..."字符串常量
r"...", r#"..."#, r##"..."##, etc.原始字符串字面值,未处理的转义字符
b"..."字节字符串字面值; 构造一个字节数组类型而非字符串
br"...", br#"..."#, br##"..."##原始字节字符串字面值,原始和字节字符串字面值的结合
'...'字符字面值
b'...'ASCII 码字节字面值
|...| expr闭包
!离散函数的总是为空的类型
_“忽略” 模式绑定;也用于增强整型字面值的可读性
+
+

表 B-3 展示了出现在从模块结构到项的路径上下文中的符号

+

表 B-3:路径相关语法

+
+ + + + + + + + + +
符号解释
ident::ident命名空间路径
::path与 crate 根相对的路径(如一个显式绝对路径)
self::path与当前模块相对的路径(如一个显式相对路径)
super::path与父模块相对的路径
type::ident, <type as trait>::ident关联常量、函数以及类型
<type>::...不可以被直接命名的关联项类型(如 <&T>::...<[T]>::...,等)
trait::method(...)通过命名定义的 trait 来消除方法调用的二义性
type::method(...)通过命名定义的类型来消除方法调用的二义性
<type as trait>::method(...)通过命名 trait 和类型来消除方法调用的二义性
+
+

表 B-4 展示了出现在泛型类型参数上下文中的符号。

+

表 B-4:泛型

+
+ + + + + + + + +
符号解释
path<...>为一个类型中的泛型指定具体参数(如 Vec<u8>
path::<...>, method::<...>为一个泛型、函数或表达式中的方法指定具体参数,通常指 turbofish(如 "42".parse::<i32>()
fn ident<...> ...泛型函数定义
struct ident<...> ...泛型结构体定义
enum ident<...> ...泛型枚举定义
impl<...> ...定义泛型实现
for<...> type高级生命周期限制
type<ident=type>泛型,其一个或多个相关类型必须被指定为特定类型(如 Iterator<Item=T>
+
+

表 B-5 展示了出现在使用 trait bounds 约束泛型参数上下文中的符号。

+

表 B-5: Trait Bound 约束

+
+ + + + + + +
符号解释
T: U泛型参数 T 约束于实现了 U 的类型
T: 'a泛型 T 的生命周期必须长于 'a(意味着该类型不能传递包含生命周期短于 'a 的任何引用)
T: 'static泛型 T 不包含除 'static 之外的借用引用
'b: 'a泛型 'b 生命周期必须长于泛型 'a
T: ?Sized使用一个不定大小的泛型类型
'a + trait, trait + trait复合类型限制
+
+

表 B-6 展示了在调用或定义宏以及在其上指定属性时的上下文中出现的符号。

+

表 B-6: 宏与属性

+
+ + + + + + +
符号解释
#[meta]外部属性
#![meta]内部属性
$ident宏替换
$ident:kind宏捕获
$(…)…宏重复
ident!(...), ident!{...}, ident![...]宏调用
+
+

表 B-7 展示了写注释的符号。

+

表 B-7: 注释

+
+ + + + + + +
符号注释
//行注释
//!内部行文档注释
///外部行文档注释
/*...*/块注释
/*!...*/内部块文档注释
/**...*/外部块文档注释
+
+

表 B-8 展示了出现在使用元组时上下文中的符号。

+

表 B-8: 元组

+
+ + + + + + + + +
符号解释
()空元组(亦称单元),即是字面值也是类型
(expr)括号表达式
(expr,)单一元素元组表达式
(type,)单一元素元组类型
(expr, ...)元组表达式
(type, ...)元组类型
expr(expr, ...)函数调用表达式;也用于初始化元组结构体 struct 以及元组枚举 enum 变体
expr.0, expr.1, etc.元组索引
+
+

表 B-9 展示了使用大括号的上下文。

+

表 B-9: 大括号

+
+ + +
符号解释
{...}块表达式
Type {...}struct 字面值
+
+

表 B-10 展示了使用方括号的上下文。

+

表 B-10: 方括号

+
+ + + + + +
符号解释
[...]数组
[expr; len]复制了 lenexpr的数组
[type; len]包含 lentype 类型的数组
expr[expr]集合索引。重载(Index, IndexMut
expr[..], expr[a..], expr[..b], expr[a..b]集合索引,使用 RangeRangeFromRangeToRangeFull 作为索引来代替集合 slice
+
+
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/appendix-03-derivable-traits.html b/appendix-03-derivable-traits.html new file mode 100644 index 000000000..4a324accc --- /dev/null +++ b/appendix-03-derivable-traits.html @@ -0,0 +1,290 @@ + + + + + + C - 可派生的 trait - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

附录 C:可派生的 trait

+
+

appendix-03-derivable-traits.md +
+commit c07dddac692848ade6c2112c8e15a7087fbbec45

+
+

在本书的各个部分中,我们讨论了可应用于结构体和枚举定义的 derive 属性。derive 属性会在使用 derive 语法标记的类型上生成对应 trait 的默认实现的代码。

+

在本附录中提供了标准库中所有可以使用 derive 的 trait 的参考。这些部分涉及到:

+
    +
  • 该 trait 将会派生什么样的操作符和方法
  • +
  • derive 提供什么样的 trait 实现
  • +
  • 由什么来实现类型的 trait
  • +
  • 是否允许实现该 trait 的条件
  • +
  • 需要 trait 操作的例子
  • +
+

如果你希望不同于 derive 属性所提供的行为,请查阅 标准库文档 中每个 trait 的细节以了解如何手动实现它们。

+

这里列出的 trait 是仅有的在标准库中定义且能通过 derive 在类型上实现。标准库中定义的其它 trait 不能通过 derive 在类型上实现。这些 trait 不存在有意义的默认行为,所以由你负责以合理的方式实现它们。

+

一个无法被派生的 trait 的例子是为终端用户处理格式化的 Display 。你应该时常考虑使用合适的方法来为终端用户显示一个类型。终端用户应该看到类型的什么部分?他们会找出相关部分吗?对他们来说最相关的数据格式是什么样的?Rust 编译器没有这样的洞察力,因此无法为你提供合适的默认行为。

+

本附录所提供的可派生 trait 列表并不全面:库可以为其自己的 trait 实现 derive,可以使用 derive 的 trait 列表事实上是无限的。实现 derive 涉及到过程宏的应用,这在第二十章的 “宏” 有介绍。

+

用于程序员输出的 Debug

+

Debug trait 用于开启格式化字符串中的调试格式,其通过在 {} 占位符中增加 :? 表明。

+

Debug trait 允许以调试目的来打印一个类型的实例,所以使用该类型的程序员可以在程序执行的特定时间点观察其实例。

+

例如,在使用 assert_eq! 宏时,Debug trait 是必须的。如果等式断言失败,这个宏就把给定实例的值作为参数打印出来,如此程序员可以看到两个实例为什么不相等。

+

等值比较的 PartialEqEq

+

PartialEq trait 可以比较一个类型的实例以检查是否相等,并开启了 ==!= 运算符的功能。

+

派生的 PartialEq 实现了 eq 方法。当 PartialEq 在结构体上派生时,只有所有 的字段都相等时两个实例才相等,同时只要有任何字段不相等则两个实例就不相等。当在枚举上派生时,每一个成员都和其自身相等,且和其他成员都不相等。

+

例如,当使用 assert_eq! 宏时,需要比较一个类型的两个实例是否相等,则 PartialEq trait 是必须的。

+

Eq trait 没有方法。其作用是表明每一个被标记类型的值等于其自身。Eq trait 只能应用于那些实现了 PartialEq 的类型,但并非所有实现了 PartialEq 的类型都可以实现 Eq。浮点类型就是一个例子:浮点数的实现表明两个非数字(NaN,not-a-number)值是互不相等的。

+

例如,对于一个 HashMap<K, V> 中的 key 来说, Eq 是必须的,这样 HashMap<K, V> 就可以知道两个 key 是否一样了。

+

次序比较的 PartialOrdOrd

+

PartialOrd trait 可以基于排序的目的而比较一个类型的实例。实现了 PartialOrd 的类型可以使用 <><=>= 操作符。但只能在同时实现了 PartialEq 的类型上使用 PartialOrd

+

派生 PartialOrd 实现了 partial_cmp 方法,其返回一个 Option<Ordering> ,但当给定值无法产生顺序时将返回 None。尽管大多数类型的值都可以比较,但一个无法产生顺序的例子是:浮点类型的非数字值。当在浮点数上调用 partial_cmp 时,NaN 的浮点数将返回 None

+

当在结构体上派生时,PartialOrd 按照结构体定义中字段出现的顺序,依次比较每个字段的值,以此来比较两个实例。当在枚举上派生时,认为在枚举定义中声明较早的枚举变体小于其后的变体。

+

例如,对于来自于 rand crate 中的 gen_range 方法来说,当在一个范围表达式指定的范围内生成一个随机值时,PartialOrd trait 是必须的。

+

Ord trait 也让你明白在一个带注解类型上的任意两个值存在有效顺序。Ord trait 实现了 cmp 方法,它返回一个 Ordering 而不是 Option<Ordering>,因为总存在一个合法的顺序。只可以在实现了 PartialOrdEqEq 依赖 PartialEq)的类型上使用 Ord trait。当在结构体或枚举上派生时, cmp 和以 PartialOrd 派生实现的 partial_cmp 表现一致。

+

例如,当在 BTreeSet<T>(一种基于有序值存储数据的数据结构)上存值时,Ord 是必须的。

+

复制值的 CloneCopy

+

Clone trait 可以明确地创建一个值的深拷贝(deep copy),复制过程可能包含任意代码的执行以及堆上数据的复制。查阅第四章 “变量与数据交互的方式(二):克隆” 以获取有关 Clone 的更多信息。

+

派生 Clone 实现了 clone 方法,其为整个的类型实现时,在类型的每一部分上调用了 clone 方法。这意味着类型中所有字段或值也必须实现了 Clone,这样才能够派生 Clone

+

例如,当在一个切片(slice)上调用 to_vec 方法时,Clone 是必须的。切片并不拥有其包含的实例,但是从 to_vec 中返回的 vector 需要拥有其实例,因此,to_vec 在每个元素上调用 clone。因此,存储在切片中的类型必须实现 Clone

+

Copy trait 允许你通过只拷贝存储在栈上的位来复制值而不需要额外的代码。查阅第四章 “只在栈上的数据:拷贝” 的部分来获取有关 Copy 的更多信息。

+

Copy trait 并未定义任何方法来阻止编程人员重写这些方法或违反不需要执行额外代码的假设。尽管如此,所有的编程人员可以假设复制(copy)一个值非常快。

+

可以在类型内部全部实现 Copy trait 的任意类型上派生 Copy。一个实现了 Copy 的类型必须也实现了 Clone,因为一个实现了 Copy 的类型也简单地实现了 Clone,其执行和 Copy 相同的任务。

+

Copy trait 很少使用;实现 Copy 的类型是可以优化的,这意味着你无需调用 clone,这让代码更简洁。

+

任何使用 Copy 的代码都可以通过 Clone 实现,但代码可能会稍慢,或者不得不在代码中的许多位置上使用 clone

+

固定大小的值到值映射的 Hash

+

Hash trait 可以实例化一个任意大小的类型,并且能够用哈希(hash)函数将该实例映射到一个固定大小的值上。派生 Hash 实现了 hash 方法。hash 方法的派生实现结合了在类型的每部分调用 hash 的结果,这意味着所有的字段或值也必须实现了 Hash,这样才能够派生 Hash

+

例如,在 HashMap<K, V> 上存储数据,存放 key 的时候,Hash 是必须的。

+

默认值的 Default

+

Default trait 使你创建一个类型的默认值。派生 Default 实现了 default 函数。default 函数的派生实现调用了类型每部分的 default 函数,这意味着类型中所有的字段或值也必须实现了 Default,这样才能够派生 Default

+

Default::default 函数通常结合结构体更新语法一起使用,这在第五章的 “使用结构体更新语法从其他实例中创建实例” 部分有讨论。可以自定义一个结构体的一小部分字段而剩余字段则使用 ..Default::default() 设置为默认值。

+

例如,当你在 Option<T> 实例上使用 unwrap_or_default 方法时,Default trait 是必须的。如果 Option<T>None的话,unwrap_or_default 方法将返回存储在 Option<T>T 类型的 Default::default 的结果。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/appendix-04-useful-development-tools.html b/appendix-04-useful-development-tools.html new file mode 100644 index 000000000..524860011 --- /dev/null +++ b/appendix-04-useful-development-tools.html @@ -0,0 +1,331 @@ + + + + + + D - 实用开发工具 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

附录 D:实用开发工具

+
+

appendix-04-useful-development-tools.md +
+commit 5057f157cd0b35bc7d0dc0af6ef622fa4c480996

+
+

本附录,我们将讨论 Rust 项目提供的用于开发 Rust 代码的工具。

+

通过 rustfmt 自动格式化

+

rustfmt 工具根据社区代码风格格式化代码。很多项目使用 rustfmt 来避免编写 Rust 风格的争论:所有人都用这个工具格式化代码!

+

安装 rustfmt

+
$ rustup component add rustfmt
+
+

这会提供 rustfmtcargo-fmt,类似于 Rust 同时安装 rustccargo。为了格式化整个 Cargo 项目:

+
$ cargo fmt
+
+

运行此命令会格式化当前 crate 中所有的 Rust 代码。这应该只会改变代码风格,而不是代码语义。请查看 该文档 了解 rustfmt 的更多信息。

+

通过 rustfix 修复代码

+

如果你编写过 Rust 代码,那么你可能见过那些有很明显修复方式的编译器警告。例如,考虑如下代码:

+

文件名:src/main.rs

+
fn do_something() {}
+
+fn main() {
+    for i in 0..100 {
+        do_something();
+    }
+}
+

这里调用了 do_something 函数 100 次,不过从未在 for 循环体中使用变量 i。Rust 会警告说:

+
$ cargo build
+   Compiling myprogram v0.1.0 (file:///projects/myprogram)
+warning: unused variable: `i`
+ --> src/main.rs:4:9
+  |
+4 |     for i in 0..100 {
+  |         ^ help: consider using `_i` instead
+  |
+  = note: #[warn(unused_variables)] on by default
+
+    Finished dev [unoptimized + debuginfo] target(s) in 0.50s
+
+

警告中建议使用 _i 名称:下划线表明该变量有意不使用。我们可以通过 cargo fix 命令使用 rustfix 工具来自动采用该建议:

+
$ cargo fix
+    Checking myprogram v0.1.0 (file:///projects/myprogram)
+      Fixing src/main.rs (1 fix)
+    Finished dev [unoptimized + debuginfo] target(s) in 0.59s
+
+

如果再次查看 src/main.rs,会发现 cargo fix 修改了代码:

+

文件名:src/main.rs

+
fn do_something() {}
+
+fn main() {
+    for _i in 0..100 {
+        do_something();
+    }
+}
+

现在 for 循环变量变为 _i,警告也不再出现。

+

cargo fix 命令可以用于在不同 Rust 版本间迁移代码。版本在附录 E 中介绍。

+

通过 clippy 提供更多 lint 功能

+

clippy 工具是一系列 lint 的集合,用于捕捉常见错误和改进 Rust 代码。

+

安装 clippy

+
$ rustup component add clippy
+
+

对任何 Cargo 项目运行 clippy 的 lint:

+
$ cargo clippy
+
+

例如,如果程序使用了如 pi 这样数学常数的近似值,如下:

+

文件名:src/main.rs

+
fn main() {
+    let x = 3.1415;
+    let r = 8.0;
+    println!("the area of the circle is {}", x * r * r);
+}
+

在此项目上运行 cargo clippy 会导致这个错误:

+
error: approximate value of `f{32, 64}::consts::PI` found
+ --> src/main.rs:2:13
+  |
+2 |     let x = 3.1415;
+  |             ^^^^^^
+  |
+  = note: `#[deny(clippy::approx_constant)]` on by default
+  = help: consider using the constant directly
+  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#approx_constant
+
+

这告诉我们 Rust 定义了更为精确的常量,而如果使用了这些常量程序将更加准确。如下代码就不会导致 clippy 产生任何错误或警告:

+

文件名:src/main.rs

+
fn main() {
+    let x = std::f64::consts::PI;
+    let r = 8.0;
+    println!("the area of the circle is {}", x * r * r);
+}
+

请查看 其文档 来了解 clippy 的更多信息。

+

使用 rust-analyzer 的 IDE 集成

+

为了帮助 IDE 集成,Rust 社区建议使用 rust-analyzer。这个工具是一组以编译器为中心的实用程序,它实现了 Language Server Protocol(一个 IDE 与编程语言之间的通信规范)。rust-analyzer 可以用于不同的客户端,比如 Visual Studio Code 的 Rust analyzer 插件

+

访问 rust-analyzer 项目的 主页 来了解如何安装它,然后为你的 IDE 安装 language server 支持。如此你的 IDE 便会获得如自动补全、跳转到定义和 inline error 之类的功能。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/appendix-05-editions.html b/appendix-05-editions.html new file mode 100644 index 000000000..3e05c5d8b --- /dev/null +++ b/appendix-05-editions.html @@ -0,0 +1,259 @@ + + + + + + E - 版本 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

附录 E:版本

+
+

appendix-05-editions.md +
+commit 8cf0496bb8e56b683ea3f015871c8631684decf4

+
+

早在第一章,我们见过 cargo newCargo.toml 中增加了一些有关 edition 的元数据。本附录将解释其意义!

+

Rust 语言和编译器有一个为期 6 周的发布循环。这意味着用户会稳定得到新功能的更新。其他编程语言发布大更新但不甚频繁;Rust 选择更为频繁的发布小更新。一段时间之后,所有这些小更新会日积月累。不过随着小更新逐次的发布,或许很难回过头来感叹:“哇,从 Rust 1.10 到 Rust 1.31,Rust 的变化真大!”

+

每两到三年,Rust 团队会生成一个新的 Rust 版本edition)。每一个版本会结合已经落地的功能,并提供一个清晰的带有完整更新文档和工具的功能包。新版本会作为常规的 6 周发布过程的一部分发布。

+

这为不同的人群提供了不同的功能:

+
    +
  • 对于活跃的 Rust 用户,其将增量的修改与易于理解的功能包相结合。
  • +
  • 对于非用户,它表明发布了一些重大进展,这意味着 Rust 可能变得值得一试。
  • +
  • 对于 Rust 自身开发者,其提供了项目整体的集合点。
  • +
+

在本文档编写时,Rust 有三个可用版本:Rust 2015、Rust 2018 和 Rust 2021。本书基于 Rust 2021 edition 风格编写。

+

Cargo.toml 中的 edition 字段表明代码应该使用哪个版本编译。如果该字段不存在,其默认为 2015 以提供后向兼容性。

+

每个项目都可以选择不同于默认的 2015 edition 的版本。这样,版本可能会包含不兼容的修改,比如新增关键字可能会与代码中的标识符冲突并导致错误。不过除非选择兼容这些修改,(旧)代码仍将能够编译,即便升级了 Rust 编译器的版本。

+

所有 Rust 编译器都支持任何之前存在的编译器版本,并可以链接任何支持版本的 crate。编译器修改只影响最初的解析代码的过程。因此,如果你使用 Rust 2015 而某个依赖使用 Rust 2018,你的项目仍旧能够编译并使用该依赖。反之,若项目使用 Rust 2018 而依赖使用 Rust 2015 亦可工作。

+

有一点需要明确:大部分功能在所有版本中都能使用。开发者使用任何 Rust 版本将能继续接收最新稳定版的改进。然而在一些情况,主要是增加了新关键字的时候,则可能出现了只能用于新版本的功能。只需切换版本即可利用新版本的功能。

+

请查看 Edition Guide 了解更多细节,这是一个完全介绍版本的书籍,包括如何通过 cargo fix 自动将代码迁移到新版本。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/appendix-06-translation.html b/appendix-06-translation.html new file mode 100644 index 000000000..215a14fc9 --- /dev/null +++ b/appendix-06-translation.html @@ -0,0 +1,269 @@ + + + + + + F - 本书译本 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

附录 F:本书译本

+
+

appendix-06-translation.md +
+commit 4c8d13c52c51f1c62a80b52d7fbd7cc0b63ada43

+
+

一些非英语语言的资源。多数仍在翻译中;查阅 翻译标签 来帮助翻译,或者添加译本链接!

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/appendix-07-nightly-rust.html b/appendix-07-nightly-rust.html new file mode 100644 index 000000000..8221b43fa --- /dev/null +++ b/appendix-07-nightly-rust.html @@ -0,0 +1,309 @@ + + + + + + G - Rust 是如何开发的与 “Nightly Rust” - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

附录 G:Rust 是如何开发的与 “Nightly Rust”

+
+

appendix-07-nightly-rust.md +
+commit d44317c3122b44fb713aba66cc295dee3453b24b

+
+

本附录介绍 Rust 是如何开发的以及这如何影响作为 Rust 开发者的你。

+

无停滞稳定

+

作为一个语言,Rust 十分 注重代码的稳定性。我们希望 Rust 成为你代码坚实的基础,假如持续地有东西在变,这个希望就实现不了。但与此同时,如果不能实验新功能的话,在发布之前我们又无法发现其中重大的缺陷,而一旦发布便再也没有修改的机会了。

+

对于这个问题我们的解决方案被称为 “无停滞稳定”(“stability without stagnation”),其指导性原则是:无需担心升级到最新的稳定版 Rust。每次升级应该是无痛的,并应带来新功能,更少的 bug 和更快的编译速度。

+

Choo, Choo! 发布通道和发布时刻表(Riding the Trains)

+

Rust 开发运行于一个 发布时刻表train schedule)之上。也就是说,所有的开发工作都位于 Rust 仓库的 master 分支。发布采用 software release train 模型,其被用于思科 IOS 等其它软件项目。Rust 有三个 发布通道release channel):

+
    +
  • Nightly
  • +
  • Beta
  • +
  • Stable(稳定版)
  • +
+

大部分 Rust 开发者主要采用稳定版通道,不过希望实验新功能的开发者可能会使用 nightly 或 beta 版。

+

如下是一个开发和发布过程如何运转的例子:假设 Rust 团队正在进行 Rust 1.5 的发布工作。该版本发布于 2015 年 12 月,不过这里只是为了提供一个真实的版本。Rust 新增了一项功能:一个 master 分支的新提交。每天晚上,会产生一个新的 nightly 版本。每天都是发布版本的日子,而这些发布由发布基础设施自动完成。所以随着时间推移,发布轨迹看起来像这样,版本一天一发:

+
nightly: * - - * - - *
+
+

每 6 周时间,是准备发布新版本的时候了!Rust 仓库的 beta 分支会从用于 nightly 的 master 分支产生。现在,有了两个发布版本:

+
nightly: * - - * - - *
+                     |
+beta:                *
+
+

大部分 Rust 用户不会主要使用 beta 版本,不过在 CI 系统中对 beta 版本进行测试能够帮助 Rust 发现可能的回归缺陷(regression)。同时,每天仍产生 nightly 发布:

+
nightly: * - - * - - * - - * - - *
+                     |
+beta:                *
+
+

比如我们发现了一个回归缺陷。好消息是在这些缺陷流入稳定发布之前还有一些时间来测试 beta 版本!fix 被合并到 master,为此 nightly 版本得到了修复,接着这些 fix 将 backport 到 beta 分支,一个新的 beta 发布就产生了:

+
nightly: * - - * - - * - - * - - * - - *
+                     |
+beta:                * - - - - - - - - *
+
+

第一个 beta 版的 6 周后,是发布稳定版的时候了!stable 分支从 beta 分支生成:

+
nightly: * - - * - - * - - * - - * - - * - * - *
+                     |
+beta:                * - - - - - - - - *
+                                       |
+stable:                                *
+
+

好的!Rust 1.5 发布了!然而,我们忘了些东西:因为又过了 6 周,我们还需发布 新版 Rust 的 beta 版,Rust 1.6。所以从 beta 生成 stable 分支后,新版的 beta 分支也再次从 nightly 生成:

+
nightly: * - - * - - * - - * - - * - - * - * - *
+                     |                         |
+beta:                * - - - - - - - - *       *
+                                       |
+stable:                                *
+
+

这被称为 “train model”,因为每 6 周,一个版本 “离开车站”(“leaves the station”),不过从 beta 通道到达稳定通道还有一段旅程。

+

Rust 每 6 周发布一个版本,如时钟般准确。如果你知道了某个 Rust 版本的发布时间,就可以知道下个版本的时间:6 周后。每 6 周发布版本的一个好的方面是下一班车会来得更快。如果特定版本碰巧缺失某个功能也无需担心:另一个版本很快就会到来!这有助于减少因临近发版时间而偷偷释出未经完善的功能的压力。

+

多亏了这个过程,你总是可以切换到下一版本的 Rust 并验证是否可以轻易的升级:如果 beta 版不能如期工作,你可以向 Rust 团队报告并在发布稳定版之前得到修复!beta 版造成的破坏是非常少见的,不过 rustc 也不过是一个软件,可能会存在 bug。

+

不稳定功能

+

这个发布模型中另一个值得注意的地方:不稳定功能(unstable features)。Rust 使用一个被称为 “功能标记”(“feature flags”)的技术来确定给定版本的某个功能是否启用。如果新功能正在积极地开发中,其提交到了 master,因此会出现在 nightly 版中,不过会位于一个 功能标记 之后。作为用户,如果你希望尝试这个正在开发的功能,则可以在源码中使用合适的标记来开启,不过必须使用 nightly 版。

+

如果使用的是 beta 或稳定版 Rust,则不能使用任何功能标记。这是在新功能被宣布为永久稳定之前获得实用价值的关键。这既满足了希望使用最尖端技术的同学,那些坚持稳定版的同学也知道其代码不会被破坏。这就是无停滞稳定。

+

本书只包含稳定的功能,因为还在开发中的功能仍可能改变,当其进入稳定版时肯定会与编写本书的时候有所不同。你可以在网上获取 nightly 版的文档。

+

Rustup 和 Rust Nightly 的职责

+

Rustup 使得改变不同发布通道的 Rust 更为简单,其在全局或分项目的层次工作。其默认会安装稳定版 Rust。例如为了安装 nightly:

+
$ rustup toolchain install nightly
+
+

你会发现 rustup 也安装了所有的 工具链toolchains,Rust 和其相关组件)。如下是一位作者的 Windows 计算机上的例子:

+
> rustup toolchain list
+stable-x86_64-pc-windows-msvc (default)
+beta-x86_64-pc-windows-msvc
+nightly-x86_64-pc-windows-msvc
+
+

如你所见,默认是稳定版。大部分 Rust 用户在大部分时间使用稳定版。你可能也会这么做,不过如果你关心最新的功能,可以为特定项目使用 nightly 版。为此,可以在项目目录使用 rustup override 来设置当前目录 rustup 使用 nightly 工具链:

+
$ cd ~/projects/needs-nightly
+$ rustup override set nightly
+
+

现在,每次在 ~/projects/needs-nightly 调用 rustccargorustup 会确保使用 nightly 版 Rust。在你有很多 Rust 项目时大有裨益!

+

RFC 过程和团队

+

那么你如何了解这些新功能呢?Rust 开发模式遵循一个 Request For Comments (RFC) 过程。如果你希望改进 Rust,可以编写一个提议,也就是 RFC。

+

任何人都可以编写 RFC 来改进 Rust,同时这些 RFC 会被 Rust 团队评审和讨论,他们由很多不同分工的子团队组成。这里是 Rust 官网上 所有团队的总列表,其包含了项目中每个领域的团队:语言设计、编译器实现、基础设施、文档等。各个团队会阅读相应的提议和评论,编写回复,并最终达成接受或回绝功能的一致。

+

如果功能被接受了,在 Rust 仓库会打开一个 issue,人们就可以实现它。实现功能的人当然可能不是最初提议功能的人!当实现完成后,其会合并到 master 分支并位于一个功能开关(feature gate)之后,正如 “不稳定功能” 部分所讨论的。

+

在稍后的某个时间,一旦使用 nightly 版的 Rust 团队能够尝试这个功能了,团队成员会讨论这个功能,它如何在 nightly 中工作,并决定是否应该进入稳定版。如果决定继续推进,功能开关会移除,然后这个功能就被认为是稳定的了!乘着“发布的列车”,最终在新的稳定版 Rust 中出现。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ayu-highlight.css b/ayu-highlight.css new file mode 100644 index 000000000..32c943222 --- /dev/null +++ b/ayu-highlight.css @@ -0,0 +1,78 @@ +/* +Based off of the Ayu theme +Original by Dempfi (https://github.com/dempfi/ayu) +*/ + +.hljs { + display: block; + overflow-x: auto; + background: #191f26; + color: #e6e1cf; +} + +.hljs-comment, +.hljs-quote { + color: #5c6773; + font-style: italic; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-regexp, +.hljs-link, +.hljs-selector-id, +.hljs-selector-class { + color: #ff7733; +} + +.hljs-number, +.hljs-meta, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ffee99; +} + +.hljs-string, +.hljs-bullet { + color: #b8cc52; +} + +.hljs-title, +.hljs-built_in, +.hljs-section { + color: #ffb454; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-symbol { + color: #ff7733; +} + +.hljs-name { + color: #36a3d9; +} + +.hljs-tag { + color: #00568d; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #91b362; +} + +.hljs-deletion { + color: #d96c75; +} diff --git a/book.js b/book.js new file mode 100644 index 000000000..aa12e7ecc --- /dev/null +++ b/book.js @@ -0,0 +1,697 @@ +"use strict"; + +// Fix back button cache problem +window.onunload = function () { }; + +// Global variable, shared between modules +function playground_text(playground, hidden = true) { + let code_block = playground.querySelector("code"); + + if (window.ace && code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + return editor.getValue(); + } else if (hidden) { + return code_block.textContent; + } else { + return code_block.innerText; + } +} + +(function codeSnippets() { + function fetch_with_timeout(url, options, timeout = 6000) { + return Promise.race([ + fetch(url, options), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) + ]); + } + + var playgrounds = Array.from(document.querySelectorAll(".playground")); + if (playgrounds.length > 0) { + fetch_with_timeout("https://play.rust-lang.org/meta/crates", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + }) + .then(response => response.json()) + .then(response => { + // get list of crates available in the rust playground + let playground_crates = response.crates.map(item => item["id"]); + playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); + }); + } + + function handle_crate_list_update(playground_block, playground_crates) { + // update the play buttons after receiving the response + update_play_button(playground_block, playground_crates); + + // and install on change listener to dynamically update ACE editors + if (window.ace) { + let code_block = playground_block.querySelector("code"); + if (code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + editor.addEventListener("change", function (e) { + update_play_button(playground_block, playground_crates); + }); + // add Ctrl-Enter command to execute rust code + editor.commands.addCommand({ + name: "run", + bindKey: { + win: "Ctrl-Enter", + mac: "Ctrl-Enter" + }, + exec: _editor => run_rust_code(playground_block) + }); + } + } + } + + // updates the visibility of play button based on `no_run` class and + // used crates vs ones available on https://play.rust-lang.org + function update_play_button(pre_block, playground_crates) { + var play_button = pre_block.querySelector(".play-button"); + + // skip if code is `no_run` + if (pre_block.querySelector('code').classList.contains("no_run")) { + play_button.classList.add("hidden"); + return; + } + + // get list of `extern crate`'s from snippet + var txt = playground_text(pre_block); + var re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; + var snippet_crates = []; + var item; + while (item = re.exec(txt)) { + snippet_crates.push(item[1]); + } + + // check if all used crates are available on play.rust-lang.org + var all_available = snippet_crates.every(function (elem) { + return playground_crates.indexOf(elem) > -1; + }); + + if (all_available) { + play_button.classList.remove("hidden"); + } else { + play_button.classList.add("hidden"); + } + } + + function run_rust_code(code_block) { + var result_block = code_block.querySelector(".result"); + if (!result_block) { + result_block = document.createElement('code'); + result_block.className = 'result hljs language-bash'; + + code_block.append(result_block); + } + + let text = playground_text(code_block); + let classes = code_block.querySelector('code').classList; + let edition = "2015"; + if(classes.contains("edition2018")) { + edition = "2018"; + } else if(classes.contains("edition2021")) { + edition = "2021"; + } + var params = { + version: "stable", + optimize: "0", + code: text, + edition: edition + }; + + if (text.indexOf("#![feature") !== -1) { + params.version = "nightly"; + } + + result_block.innerText = "Running..."; + + fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + body: JSON.stringify(params) + }) + .then(response => response.json()) + .then(response => { + if (response.result.trim() === '') { + result_block.innerText = "No output"; + result_block.classList.add("result-no-output"); + } else { + result_block.innerText = response.result; + result_block.classList.remove("result-no-output"); + } + }) + .catch(error => result_block.innerText = "Playground Communication: " + error.message); + } + + // Syntax highlighting Configuration + hljs.configure({ + tabReplace: ' ', // 4 spaces + languages: [], // Languages used for auto-detection + }); + + let code_nodes = Array + .from(document.querySelectorAll('code')) + // Don't highlight `inline code` blocks in headers. + .filter(function (node) {return !node.parentElement.classList.contains("header"); }); + + if (window.ace) { + // language-rust class needs to be removed for editable + // blocks or highlightjs will capture events + code_nodes + .filter(function (node) {return node.classList.contains("editable"); }) + .forEach(function (block) { block.classList.remove('language-rust'); }); + + code_nodes + .filter(function (node) {return !node.classList.contains("editable"); }) + .forEach(function (block) { hljs.highlightBlock(block); }); + } else { + code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); + } + + // Adding the hljs class gives code blocks the color css + // even if highlighting doesn't apply + code_nodes.forEach(function (block) { block.classList.add('hljs'); }); + + Array.from(document.querySelectorAll("code.hljs")).forEach(function (block) { + + var lines = Array.from(block.querySelectorAll('.boring')); + // If no lines were hidden, return + if (!lines.length) { return; } + block.classList.add("hide-boring"); + + var buttons = document.createElement('div'); + buttons.className = 'buttons'; + buttons.innerHTML = ""; + + // add expand button + var pre_block = block.parentNode; + pre_block.insertBefore(buttons, pre_block.firstChild); + + pre_block.querySelector('.buttons').addEventListener('click', function (e) { + if (e.target.classList.contains('fa-eye')) { + e.target.classList.remove('fa-eye'); + e.target.classList.add('fa-eye-slash'); + e.target.title = 'Hide lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.remove('hide-boring'); + } else if (e.target.classList.contains('fa-eye-slash')) { + e.target.classList.remove('fa-eye-slash'); + e.target.classList.add('fa-eye'); + e.target.title = 'Show hidden lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.add('hide-boring'); + } + }); + }); + + if (window.playground_copyable) { + Array.from(document.querySelectorAll('pre code')).forEach(function (block) { + var pre_block = block.parentNode; + if (!pre_block.classList.contains('playground')) { + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var clipButton = document.createElement('button'); + clipButton.className = 'fa fa-copy clip-button'; + clipButton.title = 'Copy to clipboard'; + clipButton.setAttribute('aria-label', clipButton.title); + clipButton.innerHTML = ''; + + buttons.insertBefore(clipButton, buttons.firstChild); + } + }); + } + + // Process playground code blocks + Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { + // Add play button + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var runCodeButton = document.createElement('button'); + runCodeButton.className = 'fa fa-play play-button'; + runCodeButton.hidden = true; + runCodeButton.title = 'Run this code'; + runCodeButton.setAttribute('aria-label', runCodeButton.title); + + buttons.insertBefore(runCodeButton, buttons.firstChild); + runCodeButton.addEventListener('click', function (e) { + run_rust_code(pre_block); + }); + + if (window.playground_copyable) { + var copyCodeClipboardButton = document.createElement('button'); + copyCodeClipboardButton.className = 'fa fa-copy clip-button'; + copyCodeClipboardButton.innerHTML = ''; + copyCodeClipboardButton.title = 'Copy to clipboard'; + copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); + + buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); + } + + let code_block = pre_block.querySelector("code"); + if (window.ace && code_block.classList.contains("editable")) { + var undoChangesButton = document.createElement('button'); + undoChangesButton.className = 'fa fa-history reset-button'; + undoChangesButton.title = 'Undo changes'; + undoChangesButton.setAttribute('aria-label', undoChangesButton.title); + + buttons.insertBefore(undoChangesButton, buttons.firstChild); + + undoChangesButton.addEventListener('click', function () { + let editor = window.ace.edit(code_block); + editor.setValue(editor.originalCode); + editor.clearSelection(); + }); + } + }); +})(); + +(function themes() { + var html = document.querySelector('html'); + var themeToggleButton = document.getElementById('theme-toggle'); + var themePopup = document.getElementById('theme-list'); + var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); + var stylesheets = { + ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), + tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), + highlight: document.querySelector("[href$='highlight.css']"), + }; + + function showThemes() { + themePopup.style.display = 'block'; + themeToggleButton.setAttribute('aria-expanded', true); + themePopup.querySelector("button#" + get_theme()).focus(); + } + + function updateThemeSelected() { + themePopup.querySelectorAll('.theme-selected').forEach(function (el) { + el.classList.remove('theme-selected'); + }); + themePopup.querySelector("button#" + get_theme()).classList.add('theme-selected'); + } + + function hideThemes() { + themePopup.style.display = 'none'; + themeToggleButton.setAttribute('aria-expanded', false); + themeToggleButton.focus(); + } + + function get_theme() { + var theme; + try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } + if (theme === null || theme === undefined) { + return default_theme; + } else { + return theme; + } + } + + function set_theme(theme, store = true) { + let ace_theme; + + if (theme == 'coal' || theme == 'navy') { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = false; + stylesheets.highlight.disabled = true; + + ace_theme = "ace/theme/tomorrow_night"; + } else if (theme == 'ayu') { + stylesheets.ayuHighlight.disabled = false; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = true; + ace_theme = "ace/theme/tomorrow_night"; + } else { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = false; + ace_theme = "ace/theme/dawn"; + } + + setTimeout(function () { + themeColorMetaTag.content = getComputedStyle(document.documentElement).backgroundColor; + }, 1); + + if (window.ace && window.editors) { + window.editors.forEach(function (editor) { + editor.setTheme(ace_theme); + }); + } + + var previousTheme = get_theme(); + + if (store) { + try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } + } + + html.classList.remove(previousTheme); + html.classList.add(theme); + updateThemeSelected(); + } + + // Set theme + var theme = get_theme(); + + set_theme(theme, false); + + themeToggleButton.addEventListener('click', function () { + if (themePopup.style.display === 'block') { + hideThemes(); + } else { + showThemes(); + } + }); + + themePopup.addEventListener('click', function (e) { + var theme; + if (e.target.className === "theme") { + theme = e.target.id; + } else if (e.target.parentElement.className === "theme") { + theme = e.target.parentElement.id; + } else { + return; + } + set_theme(theme); + }); + + themePopup.addEventListener('focusout', function(e) { + // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) + if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { + hideThemes(); + } + }); + + // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 + document.addEventListener('click', function(e) { + if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { + hideThemes(); + } + }); + + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (!themePopup.contains(e.target)) { return; } + + switch (e.key) { + case 'Escape': + e.preventDefault(); + hideThemes(); + break; + case 'ArrowUp': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.previousElementSibling) { + li.previousElementSibling.querySelector('button').focus(); + } + break; + case 'ArrowDown': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.nextElementSibling) { + li.nextElementSibling.querySelector('button').focus(); + } + break; + case 'Home': + e.preventDefault(); + themePopup.querySelector('li:first-child button').focus(); + break; + case 'End': + e.preventDefault(); + themePopup.querySelector('li:last-child button').focus(); + break; + } + }); +})(); + +(function sidebar() { + var body = document.querySelector("body"); + var sidebar = document.getElementById("sidebar"); + var sidebarLinks = document.querySelectorAll('#sidebar a'); + var sidebarToggleButton = document.getElementById("sidebar-toggle"); + var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); + var firstContact = null; + + function showSidebar() { + body.classList.remove('sidebar-hidden') + body.classList.add('sidebar-visible'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', 0); + }); + sidebarToggleButton.setAttribute('aria-expanded', true); + sidebar.setAttribute('aria-hidden', false); + try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } + } + + + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); + + function hideSidebar() { + body.classList.remove('sidebar-visible') + body.classList.add('sidebar-hidden'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', -1); + }); + sidebarToggleButton.setAttribute('aria-expanded', false); + sidebar.setAttribute('aria-hidden', true); + try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } + } + + // Toggle sidebar + sidebarToggleButton.addEventListener('click', function sidebarToggle() { + if (body.classList.contains("sidebar-hidden")) { + var current_width = parseInt( + document.documentElement.style.getPropertyValue('--sidebar-width'), 10); + if (current_width < 150) { + document.documentElement.style.setProperty('--sidebar-width', '150px'); + } + showSidebar(); + } else if (body.classList.contains("sidebar-visible")) { + hideSidebar(); + } else { + if (getComputedStyle(sidebar)['transform'] === 'none') { + hideSidebar(); + } else { + showSidebar(); + } + } + }); + + sidebarResizeHandle.addEventListener('mousedown', initResize, false); + + function initResize(e) { + window.addEventListener('mousemove', resize, false); + window.addEventListener('mouseup', stopResize, false); + body.classList.add('sidebar-resizing'); + } + function resize(e) { + var pos = (e.clientX - sidebar.offsetLeft); + if (pos < 20) { + hideSidebar(); + } else { + if (body.classList.contains("sidebar-hidden")) { + showSidebar(); + } + pos = Math.min(pos, window.innerWidth - 100); + document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); + } + } + //on mouseup remove windows functions mousemove & mouseup + function stopResize(e) { + body.classList.remove('sidebar-resizing'); + window.removeEventListener('mousemove', resize, false); + window.removeEventListener('mouseup', stopResize, false); + } + + document.addEventListener('touchstart', function (e) { + firstContact = { + x: e.touches[0].clientX, + time: Date.now() + }; + }, { passive: true }); + + document.addEventListener('touchmove', function (e) { + if (!firstContact) + return; + + var curX = e.touches[0].clientX; + var xDiff = curX - firstContact.x, + tDiff = Date.now() - firstContact.time; + + if (tDiff < 250 && Math.abs(xDiff) >= 150) { + if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) + showSidebar(); + else if (xDiff < 0 && curX < 300) + hideSidebar(); + + firstContact = null; + } + }, { passive: true }); +})(); + +(function chapterNavigation() { + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (window.search && window.search.hasFocus()) { return; } + var html = document.querySelector('html'); + + function next() { + var nextButton = document.querySelector('.nav-chapters.next'); + if (nextButton) { + window.location.href = nextButton.href; + } + } + function prev() { + var previousButton = document.querySelector('.nav-chapters.previous'); + if (previousButton) { + window.location.href = previousButton.href; + } + } + switch (e.key) { + case 'ArrowRight': + e.preventDefault(); + if (html.dir == 'rtl') { + prev(); + } else { + next(); + } + break; + case 'ArrowLeft': + e.preventDefault(); + if (html.dir == 'rtl') { + next(); + } else { + prev(); + } + break; + } + }); +})(); + +(function clipboard() { + var clipButtons = document.querySelectorAll('.clip-button'); + + function hideTooltip(elem) { + elem.firstChild.innerText = ""; + elem.className = 'fa fa-copy clip-button'; + } + + function showTooltip(elem, msg) { + elem.firstChild.innerText = msg; + elem.className = 'fa fa-copy tooltipped'; + } + + var clipboardSnippets = new ClipboardJS('.clip-button', { + text: function (trigger) { + hideTooltip(trigger); + let playground = trigger.closest("pre"); + return playground_text(playground, false); + } + }); + + Array.from(clipButtons).forEach(function (clipButton) { + clipButton.addEventListener('mouseout', function (e) { + hideTooltip(e.currentTarget); + }); + }); + + clipboardSnippets.on('success', function (e) { + e.clearSelection(); + showTooltip(e.trigger, "Copied!"); + }); + + clipboardSnippets.on('error', function (e) { + showTooltip(e.trigger, "Clipboard error!"); + }); +})(); + +(function scrollToTop () { + var menuTitle = document.querySelector('.menu-title'); + + menuTitle.addEventListener('click', function () { + document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); + }); +})(); + +(function controllMenu() { + var menu = document.getElementById('menu-bar'); + + (function controllPosition() { + var scrollTop = document.scrollingElement.scrollTop; + var prevScrollTop = scrollTop; + var minMenuY = -menu.clientHeight - 50; + // When the script loads, the page can be at any scroll (e.g. if you reforesh it). + menu.style.top = scrollTop + 'px'; + // Same as parseInt(menu.style.top.slice(0, -2), but faster + var topCache = menu.style.top.slice(0, -2); + menu.classList.remove('sticky'); + var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster + document.addEventListener('scroll', function () { + scrollTop = Math.max(document.scrollingElement.scrollTop, 0); + // `null` means that it doesn't need to be updated + var nextSticky = null; + var nextTop = null; + var scrollDown = scrollTop > prevScrollTop; + var menuPosAbsoluteY = topCache - scrollTop; + if (scrollDown) { + nextSticky = false; + if (menuPosAbsoluteY > 0) { + nextTop = prevScrollTop; + } + } else { + if (menuPosAbsoluteY > 0) { + nextSticky = true; + } else if (menuPosAbsoluteY < minMenuY) { + nextTop = prevScrollTop + minMenuY; + } + } + if (nextSticky === true && stickyCache === false) { + menu.classList.add('sticky'); + stickyCache = true; + } else if (nextSticky === false && stickyCache === true) { + menu.classList.remove('sticky'); + stickyCache = false; + } + if (nextTop !== null) { + menu.style.top = nextTop + 'px'; + topCache = nextTop; + } + prevScrollTop = scrollTop; + }, { passive: true }); + })(); + (function controllBorder() { + function updateBorder() { + if (menu.offsetTop === 0) { + menu.classList.remove('bordered'); + } else { + menu.classList.add('bordered'); + } + } + updateBorder(); + document.addEventListener('scroll', updateBorder, { passive: true }); + })(); +})(); diff --git a/ch00-00-introduction.html b/ch00-00-introduction.html new file mode 100644 index 000000000..9b1eb4eb8 --- /dev/null +++ b/ch00-00-introduction.html @@ -0,0 +1,298 @@ + + + + + + 简介 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

简介

+
+

ch00-00-introduction.md +
+commit 1fb74c3f1d8aeba39373e9f4cdb9a4bdca95604f

+
+
+

注意:此书的英文原版与 No Starch Press 出版的《The Rust Programming Language》纸质版和电子版一致。

+
+

欢迎阅读《Rust 程序设计语言》,这是一本关于 Rust 的入门书籍。Rust 程序设计语言能帮助你编写更快、更可靠的软件。在编程语言设计中,高层的工程学与底层的控制往往是难以兼得的;而 Rust 则试图挑战这一矛盾。通过平衡强大的技术能力与优秀的开发者体验,Rust 为你提供了控制底层细节(如内存使用)的选项,而无需承受通常与此类控制相关的所有繁琐细节。

+

Rust 适合哪些人

+

Rust 因多种原因适合许多人。让我们看看几个最重要的群体。

+

开发者团队

+

Rust 已证明是一个对于具有不同系统编程知识水平的大型开发团队协作而言,非常高效的工具。底层代码容易出现各种微妙的错误,在大多数其他语言中,这些错误只能通过广泛的测试和经验丰富的开发者的仔细审核代码来捕捉。在 Rust 中,编译器充当了守门员的角色,拒绝编译包含这些难以察觉的错误的代码,包括并发错误。通过与编译器合作,团队可以将时间集中在程序逻辑上,而不是追踪 bug。

+

Rust 也为系统编程世界带来了现代化的开发工具:

+
    +
  • Cargo 是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。
  • +
  • Rustfmt 格式化工具确保开发者遵循一致的代码风格。
  • +
  • rust-analyzer 为集成开发环境(IDE)提供了强大的代码补全和内联错误信息功能。
  • +
+

通过使用 Rust 生态系统中丰富的工具,开发者在编写系统级代码时可以更加高效。

+

学生

+

Rust 适合学生群体,也适合有兴趣学习系统概念的人。许多人通过 Rust 学习了操作系统开发等主题。社区对学生问题非常欢迎并乐于回答。通过类似这本书以及其他内容的努力,Rust 团队希望使系统概念能为更多人所易于理解,特别是编程新手。

+

公司

+

数百家大小规模的公司在生产环境中使用 Rust 完成各种任务,包括命令行工具、Web 服务、DevOps 工具、嵌入式设备、音视频分析与转码、加密货币、生物信息学、搜索引擎、物联网(IOT)程序、机器学习,甚至是 Firefox 浏览器的重要部分。

+

开源开发者

+

Rust 适合那些希望构建 Rust 编程语言、社区、开发工具和库的开发者。我们非常欢迎你为 Rust 语言作出贡献。

+

重视速度和稳定性的开发者

+

Rust 适合那些渴望在编程语言中寻求速度与稳定性的开发者。对于速度来说,既是指 Rust 可以运行的多快,也是指编写 Rust 程序的速度。Rust 编译器的检查确保了增加功能和重构代码时的稳定性,这与那些缺乏这些检查的语言中脆弱的祖传代码形成了鲜明对比,开发者往往不敢去修改这些代码。通过追求零成本抽象(zero-cost abstractions)—— 将高级语言特性编译成底层代码,并且与手写的代码运行速度同样快。Rust 努力确保代码又安全又快速。

+

这里提到的只是几个较大的受益群体,Rust 语言也希望能支持更多其他用户。总的来说,Rust 最重要的目标是消除数十年来程序员习以为常的取舍,让安全和高效、速度和易读易用可以兼得。试试看 Rust,说不定它的选择就适合你。

+

本书适合哪些人

+

本书假设你已经有其他编程语言的经验,任何语言均可,我们尽可能让各种语言背景的人都能读懂。本书的重点不是程序设计本身,也不是程序设计思维。如果你完全没学过编程,建议你先阅读专门介绍程序设计的书籍。

+

如何阅读本书

+

本书大体上假设您按从头到尾的顺序阅读。后面的章节建立在前面章节概念的基础上。前面的章节可能不会深入介绍部分主题,而是留待后续章节重新讨论。

+

本书分为两类章节:概念章节和项目章节。在概念章节中,我们学习 Rust 的某个方面。在项目章节中,我们应用目前所学的知识一同构建小型程序。第二、十二和二十章是项目章节;其余都是概念章节。

+

第一章介绍如何安装 Rust,如何编写一个 “Hello, world!” 程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第二章是一个编写 Rust 语言的实战介绍,我们会构建一个猜数字游戏。我们会站在较高的层次介绍一些概念,而后续章节将提供更多细节。如果你希望立刻就动手实践一下,第二章是开始的好地方。第三章介绍 Rust 中类似其他编程语言的特性,第四章会学习 Rust 的所有权系统。如果你是一个特别细致的学习者,喜欢在进入下一环节之前学习每一个细节,你可能会想要跳过第二章,直接阅读第三章,等到你想要通过项目应用所学到的细节时再回到第二章。

+

第五章讨论结构体(struct)和方法,第六章介绍枚举(enum)、match 表达式和 if let 控制流结构。在 Rust 中,创建自定义类型需要用到结构体和枚举。

+

第七章介绍 Rust 的模块(module)系统,其中的私有性规则用来组织代码和公开的 API(应用程序接口)。第八章讨论标准库提供的常见集合数据结构,例如 Vector(向量)、字符串和 Hash Map(散列表)。第九章探索 Rust 的错误处理的理念与技术。

+

第十章深入介绍泛型(generic)、Trait 和生命周期(lifetime),这些功能让你能够定义适用于多种类型的代码。第十一章全面讲述了测试,因为就算 Rust 有安全保证,也需要测试确保程序逻辑正确。第十二章中将会构建我们自己的 grep 命令行工具的功能子集实现,用于在文件中搜索文本。为此会用到之前章节讨论的很多概念。

+

第十三章探索闭包(closure)和迭代器(iterator),这两个 Rust 特性来自函数式编程语言。第十四章会深入探讨 Cargo 并介绍分享代码库的最佳实践。第十五章讨论标准库提供的智能指针以及相关的 Trait。

+

第十六章将引导我们了解不同的并发编程模型,并探讨 Rust 如何帮助你无畏地进行多线程编程。第十七章将在此基础上进一步探索 Rust 的 async 和 await 语法,以及它们所支持的轻量级并发模型。

+

第十八章着眼于 Rust 风格与你可能比较熟悉的 OOP(面向对象编程)原则之间的比较。

+

第十九章介绍模式和模式匹配,它是在 Rust 程序中表达思想的有效方式。第二十章是一个高级主题大杂烩,包括不安全 Rust(unsafe Rust)、宏(macro)和更多关于生命周期、Trait、类型、函数和闭包的内容。

+

第二十一章我们将会完成一个项目,实现一个底层的、多线程的 Web 服务器!

+

最后的附录包含了一些关于该语言的实用信息,其格式更像是参考资料。附录 A 涵盖了 Rust 的关键字,附录 B 涵盖了 Rust 的运算符和符号,附录 C 涵盖了标准库提供的可派生 Trait,附录 D 涵盖了一些有用的开发工具,而附录 E 解释了 Rust 版本。在附录 F 中,你可以找到本书的翻译版本,而在附录 G 中,我们将讨论 Rust 是如何制作的以及什么是 nightly Rust。

+

阅读本书没有错误的方式:如果你想跳过前面的内容,尽管跳过!如果你遇到任何困惑,可能需要回到前面的章节。请采取对你最有效的方式。

+

+

学习 Rust 的一个重要部分是学会如何阅读编译器显示的错误信息:它们会指引你编写出能运行的代码。为此,我们将提供许多不能编译的示例,以及在每种情况下编译器将显示的错误信息。请知悉,如果你输入并运行一个随机示例,它可能无法编译!确保你阅读了示例周围的文本,以判断你尝试运行的示例是否出错。Ferris 也将帮助你区分那些不是意在工作的代码:

+
+ + + +
Ferris含义
Ferris 头上有问号这段代码无法通过编译!
Ferris 举起两只钳子这段代码会 Panic!
Ferris 举起一只钳子并耸肩这段代码的运行结果不符合预期。
+
+

在大部分情况,我们会指导你将无法通过编译的代码修改为正确版本。

+

源代码

+

生成本书的源码可以在 GitHub 上找到。

+
+

译者注:此译本也有 GitHub 仓库,欢迎提交 Issue 和 PR :)

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch01-00-getting-started.html b/ch01-00-getting-started.html new file mode 100644 index 000000000..40e3746c9 --- /dev/null +++ b/ch01-00-getting-started.html @@ -0,0 +1,250 @@ + + + + + + 入门指南 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

入门指南

+
+

ch01-00-getting-started.md +
+commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f

+
+

让我们开始 Rust 之旅!有很多内容需要学习,但每次旅程总有起点。在本章中,我们会讨论:

+
    +
  • 在 Linux、macOS 和 Windows 上安装 Rust
  • +
  • 编写一个打印 Hello, world! 的程序
  • +
  • 使用 Rust 的包管理器和构建系统 cargo
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch01-01-installation.html b/ch01-01-installation.html new file mode 100644 index 000000000..06dbcccfe --- /dev/null +++ b/ch01-01-installation.html @@ -0,0 +1,299 @@ + + + + + + 安装 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

安装

+
+

ch01-01-installation.md
+commit d5eb2f7a8e9c6f51b4478f9cd46f55448e2ca2c1

+
+

第一步是安装 Rust。我们会通过 rustup 下载 Rust,这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要联网。

+
+

注意:如果你出于某些理由倾向于不使用 rustup,请到 Rust 的其他安装方法页面 查看其它安装选项。

+
+

接下来的步骤会安装最新的稳定版 Rust 编译器。Rust 的稳定性确保本书所有示例在最新版本的 Rust 中能够继续编译。不同版本的输出可能略有不同,因为 Rust 经常改进错误信息和警告。也就是说,任何通过这些步骤安装的最新稳定版 Rust,都应该能正常运行本书中的内容。

+
+

命令行标记

+

本章和全书中,我们会展示一些在终端中使用的命令。所有需要输入到终端的行都以 $ 开头。你不需要输入$字符;这里显示的$字符表示命令行提示符,仅用于提示每行命令的起点。不以 $ 起始的行通常展示前一个命令的输出。另外,PowerShell 专用的示例会采用 > 而不是 $

+
+

在 Linux 或 macOS 上安装 rustup

+

如果你使用 Linux 或 macOS,打开终端并输入如下命令:

+
$ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
+
+

此命令下载一个脚本并开始安装 rustup 工具,这会安装最新稳定版 Rust。过程中可能会提示你输入密码。如果安装成功,将会出现如下内容:

+
Rust is installed now. Great!
+
+

另外,你还需要一个 链接器(linker),这是 Rust 用来将其编译的输出连接到一个文件中的程序。很可能你已经有一个了。如果你遇到了链接器错误,请尝试安装一个 C 编译器,它通常包括一个链接器。C 编译器也很有用,因为一些常见的 Rust 包依赖于 C 代码,因此需要安装一个 C 编译器。

+

在 macOS 上,你可以通过运行以下命令获得 C 语言编译器:

+
$ xcode-select --install
+
+

Linux 用户通常需要根据发行版(distribution)文档安装 GCC 或 Clang。比如,如果你使用 Ubuntu,可以安装 build-essential 包。

+

在 Windows 上安装 rustup

+

在 Windows 上,前往 https://www.rust-lang.org/install.html 并按照说明安装 Rust。在安装过程的某个步骤,你会被提示要安装 Visual Studio。它提供了一个链接器和编译程序所需的原生库。如果你在此步骤需要更多帮助,请访问 https://rust-lang.github.io/rustup/installation/windows-msvc.html

+

本书的余下部分会使用能同时运行于 cmd.exe 和 PowerShell 的命令。如果存在特定差异,我们会解释使用哪一个。

+

故障排除(Troubleshooting)

+

要检查是否正确安装了 Rust,打开命令行并输入:

+
$ rustc --version
+
+

你应该可以看到按照以下格式显示的最新稳定版本的版本号、对应的 Commit Hash 和 Commit 日期:

+
rustc x.y.z (abcabcabc yyyy-mm-dd)
+
+

如果看到了这样的信息,就说明 Rust 已经安装成功了!

+
+

译者:恭喜入坑!(此处应该有掌声!)

+
+

如果没看到,请按照下面说明的方法检查 Rust 是否在您的 %PATH% 系统变量中。

+

在 Windows CMD 中,请使用命令:

+
> echo %PATH%
+
+

在 PowerShell 中,请使用命令:

+
> echo $env:Path
+
+

在 Linux 和 macOS 中,请使用命令:

+
$ echo $PATH
+
+

如果一切正确但 Rust 仍不能使用,有许多地方可以求助。您可以在社区页面查看如何与其他 Rustaceans(Rust 用户的称号,有自嘲意味)联系。

+

更新与卸载

+

通过 rustup 安装了 Rust 之后,更新到最新版本就很简单了,只需要在您对应的命令行中运行如下更新脚本:

+
$ rustup update
+
+

若要卸载 Rust 和 rustup,请在命令行中运行如下卸载脚本:

+
$ rustup self uninstall
+
+

本地文档

+

安装程序也自带一份文档的本地拷贝,可以离线阅读。运行 rustup doc 在浏览器中查看本地文档。

+

任何时候,如果你拿不准标准库中的类型或函数的用途和用法,请查阅应用程序接口(application programming interface,API)文档!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch01-02-hello-world.html b/ch01-02-hello-world.html new file mode 100644 index 000000000..32de7451f --- /dev/null +++ b/ch01-02-hello-world.html @@ -0,0 +1,326 @@ + + + + + + Hello, World! - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Hello, World!

+
+

ch01-02-hello-world.md +
+commit 1fb74c3f1d8aeba39373e9f4cdb9a4bdca95604f

+
+

既然安装好了 Rust,是时候来编写第一个 Rust 程序了。当学习一门新语言的时候,使用该语言在屏幕上打印 Hello, world! 是一项传统,我们将沿用这一传统!

+
+

注意:本书假设你熟悉基本的命令行操作。Rust 对于你的编辑器、工具,以及代码位于何处并没有特定的要求,如果你更倾向于使用集成开发环境(IDE),而不是命令行,请尽管使用你喜欢的 IDE。目前很多 IDE 都在一定程度上支持 Rust;查看 IDE 文档以了解更多细节。Rust 团队一直致力于借助 rust-analyzer 提供强大的 IDE 支持。详见附录 D

+
+

创建项目目录

+

首先创建一个存放 Rust 代码的目录。Rust 并不关心代码的存放位置,不过对于本书的练习和项目来说,我们建议你在 home 目录中创建 projects 目录,并将你的所有项目存放在这里。

+

打开终端并输入如下命令创建 projects 目录,并在 projects 目录中为 “Hello, world!” 项目创建一个目录。

+

对于 Linux、macOS 和 Windows PowerShell,输入:

+
$ mkdir ~/projects
+$ cd ~/projects
+$ mkdir hello_world
+$ cd hello_world
+
+

对于 Windows CMD,输入:

+
> mkdir "%USERPROFILE%\projects"
+> cd /d "%USERPROFILE%\projects"
+> mkdir hello_world
+> cd hello_world
+
+

编写并运行 Rust 程序

+

接下来,新建一个源文件,命名为 main.rs。Rust 源文件总是以 .rs 扩展名结尾。如果文件名包含多个单词,那么按照命名习惯,应当使用下划线来分隔单词。例如命名为 hello_world.rs,而不是 helloworld.rs

+

现在打开刚创建的 main.rs 文件,输入示例 1-1 中的代码。

+
+

文件名:main.rs

+
fn main() {
+    println!("Hello, world!");
+}
+
示例 1-1:一个打印 `Hello, world!` 的程序
+
+

保存文件,并回到当前目录为“~/projects/hello_world”的终端窗口。在 Linux 或 macOS 上,输入如下命令,编译并运行文件:

+
$ rustc main.rs
+$ ./main
+Hello, world!
+
+

在 Windows 上,输入命令 .\main.exe,而不是 ./main

+
> rustc main.rs
+> .\main.exe
+Hello, world!
+
+

不管使用何种操作系统,终端应该打印字符串 Hello, world!。如果没有看到这些输出,回到安装部分的 “故障排除” 小节查找有帮助的方法。

+

如果 Hello, world! 出现了,恭喜你!你已经正式编写了一个 Rust 程序。现在你成为一名 Rust 程序员,欢迎!

+

分析这个 Rust 程序

+

现在,让我们回过头来仔细看看这个 “Hello, world!” 程序。这是第一块拼图:

+
fn main() {
+
+}
+

这几行定义了一个名叫 main 的函数。main 函数是一个特殊的函数:在可执行的 Rust 程序中,它总是最先运行的代码。第一行代码声明了一个叫做 main 的函数,它没有参数也没有返回值。如果有参数的话,它们的名称应该出现在小括号 () 中。

+

函数体被包裹在 {} 中。Rust 要求所有函数体都要用花括号包裹起来。一般来说,将左花括号与函数声明置于同一行并以空格分隔,是良好的代码风格。

+
+

注:如果你希望在 Rust 项目中保持一种标准风格,可以使用名为 rustfmt 的自动格式化工具将代码格式化为特定的风格(更多内容详见附录 D 中的 rustfmt)。Rust 团队已经在标准的 Rust 发行版中包含了这个工具,就像 rustc 一样。所以它应该已经安装在你的电脑中了!

+
+

main 函数中有如下代码:

+
#![allow(unused)]
+fn main() {
+    println!("Hello, world!");
+}
+

这行代码完成这个简单程序的所有工作:在屏幕上打印文本。这里有四个重要的细节需要注意。首先 Rust 的缩进风格使用 4 个空格,而不是 1 个制表符(tab)。

+

第二,println! 调用了一个 Rust 宏(macro)。如果是调用函数,则应输入 println(没有!)。我们将在第二十章详细讨论宏。现在你只需记住,当看到符号 ! 的时候,就意味着调用的是宏而不是普通函数,并且宏并不总是遵循与函数相同的规则。

+

第三,"Hello, world!" 是一个字符串。我们把这个字符串作为一个参数传递给 println!,字符串将被打印到屏幕上。

+

第四,该行以分号结尾(;),这代表一个表达式的结束和下一个表达式的开始。大部分 Rust 代码行以分号结尾。

+

编译和运行是彼此独立的步骤

+

你刚刚运行了一个新创建的程序,那么让我们检查此过程中的每一个步骤。

+

在运行 Rust 程序之前,必须先使用 Rust 编译器编译它,即输入 rustc 命令并传入源文件名称,如下:

+
$ rustc main.rs
+
+

如果你有 C 或 C++ 背景,就会发现这与 gccclang 类似。编译成功后,Rust 会输出一个二进制的可执行文件。

+

在 Linux、macOS 或 Windows 的 PowerShell 上,在 shell 中输入 ls 命令可以看见这个可执行文件。

+
$ ls
+main  main.rs
+
+

在 Linux 和 macOS,你会看到两个文件。在 Windows PowerShell 中,你会看到同使用 CMD 相同的三个文件。在 Windows 的 CMD 上,则输入如下内容:

+
> dir /B %= the /B option says to only show the file names =%
+main.exe
+main.pdb
+main.rs
+
+

这展示了扩展名为 .rs 的源文件、可执行文件(在 Windows 下是 main.exe,其它平台是 main),以及当使用 CMD 时会有一个包含调试信息、扩展名为 .pdb 的文件。从这里开始运行 mainmain.exe 文件,如下:

+
$ ./main # Windows 是 .\main.exe
+
+

如果这里的 main.rs 是上文所述的 “Hello, world!” 程序,那么在终端上就会打印出 Hello, world!

+

如果你更熟悉动态语言,如 Ruby、Python 或 JavaScript,则可能不习惯将编译和运行分为两个单独的步骤。Rust 是一种 预编译静态类型ahead-of-time compiled)语言,这意味着你可以编译程序,并将可执行文件送给其他人,他们甚至不需要安装 Rust 就可以运行。如果你给他人一个 .rb.py.js 文件,他们需要先分别安装 Ruby,Python,JavaScript 实现(运行时环境,VM)。不过在这些语言中,只需要一句命令就可以编译和运行程序。这一切都是语言设计上的权衡取舍。

+

仅仅使用 rustc 编译简单程序是没问题的,不过随着项目的增长,你可能需要管理你项目的方方面面,并让代码易于分享。接下来,我们要介绍一个叫做 Cargo 的工具,它会帮助你编写真实世界中的 Rust 程序。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch01-03-hello-cargo.html b/ch01-03-hello-cargo.html new file mode 100644 index 000000000..74a36e15e --- /dev/null +++ b/ch01-03-hello-cargo.html @@ -0,0 +1,347 @@ + + + + + + Hello, Cargo! - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Hello, Cargo!

+
+

ch01-03-hello-cargo.md +
+commit 299fd1f3e11dd61ca136fb51d713f6b0ba7515ff

+
+

Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目,因为它可以为你处理很多任务,比如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 依赖dependencies))。

+

最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。如果使用 Cargo 来构建 “Hello, world!” 项目,将只会用到 Cargo 构建代码的那部分功能。在编写更复杂的 Rust 程序时,你将添加依赖项,如果使用 Cargo 启动项目,则添加依赖项将更容易。

+

由于绝大多数 Rust 项目使用 Cargo,本书接下来的部分假设你也使用 Cargo。如果使用 “安装” 部分介绍的官方安装包的话,则自带了 Cargo。如果通过其他方式安装的话,可以在终端输入如下命令检查是否安装了 Cargo:

+
$ cargo --version
+
+

如果你看到了版本号,说明已安装!如果看到类似 command not found 的错误,你应该查看相应安装文档以确定如何单独安装 Cargo。

+

使用 Cargo 创建项目

+

我们使用 Cargo 创建一个新项目,然后看看与上面的 “Hello, world!” 项目有什么不同。回到 projects 目录(或者你存放代码的目录)。接着,可在任何操作系统下运行以下命令:

+
$ cargo new hello_cargo
+$ cd hello_cargo
+
+

第一行命令新建了名为 hello_cargo 的目录和项目。我们将项目命名为 hello_cargo,同时 Cargo 在一个同名目录中创建项目文件。

+

进入 hello_cargo 目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录:一个 Cargo.toml 文件,一个 src 目录,以及位于 src 目录中的 main.rs 文件。

+

这也会在 hello_cargo 目录初始化了一个 git 仓库,以及一个 .gitignore 文件。如果在一个已经存在的 git 仓库中运行 cargo new,则这些 git 相关文件则不会生成;可以通过运行 cargo new --vcs=git 来覆盖这些行为。

+
+

注意:Git 是一个常用的版本控制系统(version control system,VCS)。可以通过 --vcs 参数使 cargo new 切换到其它版本控制系统(VCS),或者不使用 VCS。运行 cargo new --help 参看可用的选项。

+
+

请自行选用文本编辑器打开 Cargo.toml 文件。它应该看起来如示例 1-2 所示:

+
+

文件名:Cargo.toml

+
[package]
+name = "hello_cargo"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+
+
示例 1-2:*cargo new* 命令生成的 *Cargo.toml* 的内容
+
+

这个文件使用 TOML (Tom's Obvious, Minimal Language) 格式,这是 Cargo 配置文件的格式。

+

第一行,[package],是一个片段(section)标题,表明下面的语句用来配置一个包。随着我们在这个文件增加更多的信息,还将增加其他片段(section)。

+

接下来的三行设置了 Cargo 编译程序所需的配置:项目的名称、项目的版本以及要使用的 Rust 版本。附录 E 会介绍 edition 的值。

+

最后一行,[dependencies],是罗列项目依赖的片段的开始。在 Rust 中,代码包被称为 crates。这个项目并不需要其他的 crate,不过在第二章的第一个项目会用到依赖,那时会用得上这个片段。

+

现在打开 src/main.rs 看看:

+

文件名:src/main.rs

+
fn main() {
+    println!("Hello, world!");
+}
+

Cargo 为你生成了一个 “Hello, world!” 程序,正如我们之前编写的示例 1-1!目前为止,我们的项目与 Cargo 生成项目的区别是 Cargo 将代码放在 src 目录,同时项目根目录包含一个 Cargo.toml 配置文件。

+

Cargo 期望源文件存放在 src 目录中。项目根目录只存放 README、license 信息、配置文件和其他跟代码无关的文件。使用 Cargo 帮助你保持项目干净整洁,一切井井有条。

+

如果没有使用 Cargo 开始项目,比如我们创建的 “Hello, world!” 项目,你可以将其转换为使用 Cargo 的项目。将项目代码移入 src 目录,并创建一个合适的 Cargo.toml 文件。一个简单的创建 Cargo.toml 文件的方法是运行 cargo init,它会自动为你创建该文件。

+

构建并运行 Cargo 项目

+

现在让我们看看通过 Cargo 构建和运行 “Hello, world!” 程序有什么不同!在 hello_cargo 目录下,输入下面的命令来构建项目:

+
$ cargo build
+   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
+    Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs
+
+

这个命令会创建一个可执行文件 target/debug/hello_cargo (在 Windows 上是 target\debug\hello_cargo.exe),而不是放在目前目录下。由于默认的构建方法是调试构建(debug build),Cargo 会将可执行文件放在名为 debug 的目录中。可以通过这个命令运行可执行文件:

+
$ ./target/debug/hello_cargo # 或者在 Windows 下为 .\target\debug\hello_cargo.exe
+Hello, world!
+
+

如果一切顺利,终端上应该会打印出 Hello, world!。首次运行 cargo build 时,也会使 Cargo 在项目根目录创建一个新文件:Cargo.lock。这个文件记录项目依赖的实际版本。这个项目并没有依赖,所以其内容比较少。你自己永远也不需要碰这个文件,让 Cargo 处理它就行了。

+

我们刚刚使用 cargo build 构建了项目,并使用 ./target/debug/hello_cargo 运行了程序,也可以使用 cargo run 在一个命令中同时编译并运行生成的可执行文件:

+
$ cargo run
+    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
+     Running `target/debug/hello_cargo`
+Hello, world!
+
+

比起要记得运行 cargo build 之后再用可执行文件的完整路径来运行程序,使用 cargo run 可以实现完全相同的效果,而且要方便得多,所以大多数开发者会使用 cargo run

+

注意这一次并没有出现表明 Cargo 正在编译 hello_cargo 的输出。Cargo 发现文件并没有被改变,所以它并没有重新编译,而是直接运行了可执行文件。如果修改了源文件的话,Cargo 会在运行之前重新构建项目,并会出现像这样的输出:

+
$ cargo run
+   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
+    Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs
+     Running `target/debug/hello_cargo`
+Hello, world!
+
+

Cargo 还提供了一个叫 cargo check 的命令。该命令快速检查代码确保其可以编译,但并不产生可执行文件:

+
$ cargo check
+   Checking hello_cargo v0.1.0 (file:///projects/hello_cargo)
+    Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs
+
+

为什么你会不需要可执行文件呢?通常 cargo check 要比 cargo build 快得多,因为它省略了生成可执行文件的步骤。如果你在编写代码时持续的进行检查,cargo check 可以让你快速了解现在的代码能不能正常通过编译!为此很多 Rustaceans 编写代码时定期运行 cargo check 确保它们可以编译。当准备好使用可执行文件时才运行 cargo build

+

我们回顾下已学习的 Cargo 内容:

+
    +
  • 可以使用 cargo new 创建项目。
  • +
  • 可以使用 cargo build 构建项目。
  • +
  • 可以使用 cargo run 一步构建并运行项目。
  • +
  • 可以使用 cargo check 在不生成二进制文件的情况下构建项目来检查错误。
  • +
  • 有别于将构建结果放在与源码相同的目录,Cargo 会将其放到 target/debug 目录。
  • +
+

使用 Cargo 的一个额外的优点是,不管你使用什么操作系统,其命令都是一样的。所以从现在开始本书将不再为 Linux 和 macOS 以及 Windows 提供相应的命令。

+

发布(release)构建

+

当项目最终准备好发布时,可以使用 cargo build --release 来优化编译项目。这会在 target/release 而不是 target/debug 下生成可执行文件。这些优化可以让 Rust 代码运行的更快,不过启用这些优化也需要消耗更长的编译时间。这也就是为什么会有两种不同的配置:一种是为了开发,你需要经常快速重新构建;另一种是为用户构建最终程序,它们不会经常重新构建,并且希望程序运行得越快越好。如果你在测试代码的运行时间,请确保运行 cargo build --release 并使用 target/release 下的可执行文件进行测试。

+

把 Cargo 当作习惯

+

对于简单项目,Cargo 并不比 rustc 提供了更多的优势,不过随着开发的深入,终将证明其价值。一旦程序壮大到由多个文件组成,亦或者是需要其他的依赖,让 Cargo 协调构建过程就会简单得多。

+

即便 hello_cargo 项目十分简单,它现在也使用了很多在你之后的 Rust 生涯将会用到的实用工具。其实,要在任何已存在的项目上工作时,可以使用如下命令通过 Git 检出代码,移动到该项目目录并构建:

+
$ git clone example.org/someproject
+$ cd someproject
+$ cargo build
+
+

关于更多 Cargo 的信息,请查阅 其文档

+

总结

+

你已经准备好开启 Rust 之旅了!在本章中,你学习了如何:

+
    +
  • 使用 rustup 安装最新稳定版的 Rust
  • +
  • 更新到新版的 Rust
  • +
  • 打开本地安装的文档
  • +
  • 直接通过 rustc 编写并运行 Hello, world! 程序
  • +
  • 使用 Cargo 创建并运行新项目
  • +
+

是时候通过构建更实质性的程序来熟悉读写 Rust 代码了。所以在第二章我们会构建一个猜猜看游戏程序。如果你更愿意从学习 Rust 常用的编程概念开始,请阅读第三章,接着再回到第二章。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch02-00-guessing-game-tutorial.html b/ch02-00-guessing-game-tutorial.html new file mode 100644 index 000000000..b42cb1406 --- /dev/null +++ b/ch02-00-guessing-game-tutorial.html @@ -0,0 +1,940 @@ + + + + + + 写个猜数字游戏 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

写个猜数字游戏

+
+

ch02-00-guessing-game-tutorial.md +
+commit 11ca3d508b0a28b03f7d9f16c88726088fafd87e

+
+

让我们一起动手完成一个项目来快速上手 Rust!本章将介绍一些 Rust 中常见的概念,并通过真实的程序来展示如何运用它们。你将会学到 letmatch、方法(methods)、关联函数(associated functions)、外部 crate 等知识!后续章节会深入探讨这些概念的细节。在这一章,我们将主要练习基础内容。

+

我们会实现一个经典的新手编程问题:猜数字游戏。游戏的规则如下:程序将会生成一个 1 到 100 之间的随机整数。然后提示玩家输入一个猜测值。输入后,程序会指示该猜测是太低还是太高。如果猜对了,游戏会打印祝贺信息并退出。

+

准备一个新项目

+

要创建一个新项目,进入第一章中创建的 projects 目录,使用 Cargo 新建一个项目,如下:

+
$ cargo new guessing_game
+$ cd guessing_game
+
+

第一个命令,cargo new,它获取项目的名称(guessing_game)作为第一个参数。第二个命令进入到新创建的项目目录。

+

看看生成的 Cargo.toml 文件:

+

文件名:Cargo.toml

+
[package]
+name = "guessing_game"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+
+

正如第一章那样,cargo new 生成了一个 “Hello, world!” 程序。查看 src/main.rs 文件:

+

文件名:src/main.rs

+
fn main() {
+    println!("Hello, world!");
+}
+

现在使用 cargo run 命令,一步完成 “Hello, world!” 程序的编译和运行:

+
$ cargo run
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.50s
+     Running `target/debug/guessing_game`
+Hello, world!
+
+

当你需要在项目中快速迭代时,run 命令就能派上用场,正如我们在这个游戏项目中做的,在下一次迭代之前快速测试每一次迭代。

+

重新打开 src/main.rs 文件。我们将会在这个文件中编写全部的代码。

+

处理一次猜测

+

猜数字程序的第一部分请求和处理用户输入,并检查输入是否符合预期的格式。首先,我们会允许玩家输入一个猜测。在 src/main.rs 中输入示例 2-1 中的代码。

+
+

文件名:src/main.rs

+
use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    println!("You guessed: {}", guess);
+}
+
示例 2-1:获取用户猜测并打印的代码
+
+

这些代码包含很多信息,我们一行一行地过一遍。为了获取用户输入并打印结果作为输出,我们需要将 io 输入/输出库引入当前作用域。io 库来自于标准库,也被称为 std

+
use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    println!("You guessed: {}", guess);
+}
+

默认情况下,Rust 设定了若干个会自动导入到每个程序作用域中的标准库内容,这组内容被称为 预导入(prelude) 内容。你可以在标准库文档中查看预导入的所有内容。

+

如果你需要的类型不在预导入内容中,就必须使用 use 语句显式地将其引入作用域。std::io 库提供很多有用的功能,包括接收用户输入的功能。

+

如第一章所提及,main 函数是程序的入口点:

+
use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    println!("You guessed: {}", guess);
+}
+

fn 语法声明了一个新函数,小括号 () 表明没有参数,大括号 { 作为函数体的开始。

+

第一章也提及了 println! 是一个在屏幕上打印字符串的宏:

+
use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    println!("You guessed: {}", guess);
+}
+

这些代码仅仅打印提示,介绍游戏的内容然后请求用户输入。

+

使用变量储存值

+

接下来,创建一个 变量variable)来储存用户输入,像这样:

+
use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    println!("You guessed: {}", guess);
+}
+

现在程序开始变得有意思了!这一小行代码发生了很多事。我们使用 let 语句来创建变量。这里是另外一个例子:

+
let apples = 5;
+

这行代码新建了一个叫做 apples 的变量并把它绑定到值 5 上。在 Rust 中,变量默认是不可变的,这意味着一旦我们给变量赋值,这个值就不再可以修改了。我们将会在第三章的 “变量与可变性” 部分详细讨论这个概念。下面的例子展示了如何在变量名前使用 mut 来使一个变量可变:

+
let apples = 5; // 不可变
+let mut bananas = 5; // 可变
+
+

注意:// 语法开始一个注释,持续到行尾。Rust 忽略注释中的所有内容,第三章将会详细介绍注释。

+
+

回到猜数字程序中。现在我们知道了 let mut guess 会引入一个叫做 guess 的可变变量。等号(=)告诉 Rust 我们现在想将某个值绑定在变量上。等号的右边是 guess 所绑定的值,它是 String::new 的结果,这个函数会返回一个 String 的新实例。String 是一个标准库提供的字符串类型,它是 UTF-8 编码的可增长文本块。

+

::new 那一行的 :: 语法表明 newString 类型的一个 关联函数associated function)。关联函数是针对某个类型实现的函数,在这个例子中是 String。这个 new 函数创建了一个新的空字符串。你会发现许多类型上都有一个 new 函数,因为这是为某种类型创建新值的常用函数名。

+

总的来说,let mut guess = String::new(); 这一行创建了一个可变变量,当前它绑定到一个新的 String 空实例上。

+

接收用户输入

+

回忆一下,我们在程序的第一行使用 use std::io; 从标准库中引入了输入/输出功能。现在调用 io 库中的函数 stdin,这允许我们处理用户输入:

+
use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    println!("You guessed: {}", guess);
+}
+

如果程序的开头没有使用 use std::io; 引入 io 库,我们仍可以通过把函数调用写成 std::io::stdin 来使用该函数。stdin 函数返回一个 std::io::Stdin 的实例,这是一种代表终端标准输入句柄的类型。

+

接下来,代码中的 .read_line(&mut guess) 调用了标准输入句柄上的 read_line 方法,以获取用户输入。我们还将 &mut guess 作为参数传递给 read_line 函数,让其将用户输入储存到这个字符串中。read_line 的工作是,无论用户在标准输入中键入什么内容,都将其追加(不会覆盖其原有内容)到一个字符串中,因此它需要字符串作为参数。这个字符串参数应该是可变的,以便 read_line 将用户输入附加上去。

+

& 表示这个参数是一个 引用reference),它允许多处代码访问同一处数据,而无需在内存中多次拷贝。引用是一个复杂的特性,Rust 的一个主要优势就是安全而简单的操纵引用。完成当前程序并不需要了解如此多细节。现在,我们只需知道它像变量一样,默认是不可变的。因此,需要写成 &mut guess 来使其可变,而不是 &guess。(第四章会更全面的解释引用。)

+

使用 Result 类型来处理潜在的错误

+

我们还没有完全分析完这行代码。虽然我们已经讲到了第三行代码,但要注意:它仍是逻辑行(虽然换行了但仍是语句)的一部分。后一部分是这个方法(method):

+
use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    println!("You guessed: {}", guess);
+}
+

我们也可以将代码这样写:

+
io::stdin().read_line(&mut guess).expect("Failed to read line");
+

不过,过长的代码行难以阅读,所以最好拆开来写。通常来说,当使用 .method_name() 语法调用方法时引入换行符和空格将长的代码行拆开是明智的。现在来看看这行代码干了什么。

+

之前提到了 read_line 会将用户输入附加到传递给它的字符串中,不过它也会返回一个类型为 Result 的值。 +Result 是一种枚举类型,通常也写作 enum。枚举类型变量的值可以是多种可能状态中的一个。我们把每种可能的状态称为一种 枚举成员(variant)

+

第六章将介绍枚举的更多细节。这里的 Result 类型将用来编码错误处理的信息。

+

Result 的成员是 OkErrOk 成员表示操作成功,内部包含成功时产生的值。Err 成员则意味着操作失败,并且 Err 中包含有关操作失败的原因或方式的信息。

+

这些 Result 类型的作用是编码错误处理信息。Result 类型的值,像其他类型一样,拥有定义于其上的方法。Result 的实例拥有 expect 方法。如果 io::Result 实例的值是 Errexpect 会导致程序崩溃,并显示当做参数传递给 expect 的信息。如果 read_line 方法返回 Err,则可能是来源于底层操作系统错误的结果。如果 Result 实例的值是 Okexpect 会获取 Ok 中的值并原样返回。在本例中,这个值是用户输入到标准输入中的字节数。

+

如果不调用 expect,程序也能编译,不过会出现一个警告:

+
$ cargo build
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+warning: unused `Result` that must be used
+  --> src/main.rs:10:5
+   |
+10 |     io::stdin().read_line(&mut guess);
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: this `Result` may be an `Err` variant, which should be handled
+   = note: `#[warn(unused_must_use)]` on by default
+help: use `let _ = ...` to ignore the resulting value
+   |
+10 |     let _ = io::stdin().read_line(&mut guess);
+   |     +++++++
+
+warning: `guessing_game` (bin "guessing_game") generated 1 warning
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.59s
+
+

Rust 警告我们没有使用 read_line 的返回值 Result,说明有一个可能的错误没有处理。

+

消除警告的正确做法是实际去编写错误处理代码,不过由于我们就是希望程序在出现问题时立即崩溃,所以直接使用 expect第九章 会学习如何从错误中恢复。

+

使用 println! 占位符打印值

+

除了位于结尾的右花括号,目前为止就只有这一行代码值得讨论一下了,就是这一行:

+
use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    println!("You guessed: {}", guess);
+}
+

这行代码现在打印了存储用户输入的字符串。{} 这对大括号是一个占位符:把 {} 想象成小蟹钳,可以夹住合适的值。当打印变量的值时,变量名可以写进大括号中。当打印表达式的执行结果时,格式化字符串(format string)中大括号中留空,格式化字符串后跟逗号分隔的需要打印的表达式列表,其顺序与每一个空大括号占位符的顺序一致。在一个 println! 调用中打印变量和表达式的值看起来像这样:

+
#![allow(unused)]
+fn main() {
+let x = 5;
+let y = 10;
+
+println!("x = {x} and y + 2 = {}", y + 2);
+}
+

这行代码会打印出 x = 5 and y + 2 = 12

+

测试第一部分代码

+

让我们来测试下猜数字游戏的第一部分。使用 cargo run 运行:

+
$ cargo run
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+    Finished dev [unoptimized + debuginfo] target(s) in 6.44s
+     Running `target/debug/guessing_game`
+Guess the number!
+Please input your guess.
+6
+You guessed: 6
+
+

至此为止,游戏的第一部分已经完成:我们从键盘获取输入并打印了出来。

+

生成一个秘密数字

+

接下来,需要生成一个秘密数字,好让用户来猜。秘密数字应该每次都不同,这样重复玩才不会乏味;范围应该在 1 到 100 之间,这样才不会太困难。Rust 标准库中尚未包含随机数功能。然而,Rust 团队还是提供了一个包含上述功能的 rand crate

+

使用 crate 来增加更多功能

+

记住,crate 是一组 Rust 源代码文件。我们正在构建的项目是一个 二进制 crate,它生成一个可执行文件。 rand crate 是一个 库 crate,库 crate 可以包含任意能被其他程序使用的代码,但是无法独立执行。

+

Cargo 对外部 crate 的运用是其真正的亮点所在。在我们使用 rand 编写代码之前,需要修改 Cargo.toml 文件,引入一个 rand 依赖。现在打开这个文件并将下面这一行添加到 [dependencies] 片段标题之下。在当前版本下,请确保按照我们这里的方式指定 rand,否则本教程中的示例代码可能无法工作。

+

文件名:Cargo.toml

+
[dependencies]
+rand = "0.8.5"
+
+

Cargo.toml 文件中,标题以及之后的内容属同一个片段,直到遇到下一个标题才开始新的片段。[dependencies] 片段告诉 Cargo 本项目依赖了哪些外部 crate 及其版本。本例中,我们使用语义化版本 0.8.5 来指定 rand crate。Cargo 理解 语义化版本(Semantic Versioning)(有时也称为 SemVer),这是一种定义版本号的标准。0.8.5 事实上是 ^0.8.5 的简写,它表示任何至少是 0.8.5 但小于 0.9.0 的版本。

+

Cargo 认为这些版本与 0.8.5 版本的公有 API 相兼容,这样的版本指定确保了我们可以获取能使本章代码编译的最新的补丁(patch)版本。任何大于等于 0.9.0 的版本不能保证和接下来的示例采用了相同的 API。

+

现在,不修改任何代码,构建项目,如示例 2-2 所示。

+
+
$ cargo build
+    Updating crates.io index
+  Downloaded rand v0.8.5
+  Downloaded libc v0.2.127
+  Downloaded getrandom v0.2.7
+  Downloaded cfg-if v1.0.0
+  Downloaded ppv-lite86 v0.2.16
+  Downloaded rand_chacha v0.3.1
+  Downloaded rand_core v0.6.3
+   Compiling libc v0.2.127
+   Compiling getrandom v0.2.7
+   Compiling cfg-if v1.0.0
+   Compiling ppv-lite86 v0.2.16
+   Compiling rand_core v0.6.3
+   Compiling rand_chacha v0.3.1
+   Compiling rand v0.8.5
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+    Finished dev [unoptimized + debuginfo] target(s) in 2.53s
+
+
示例 2-2:将 rand crate 添加为依赖之后运行 `cargo build` 的输出
+
+

可能会出现不同的版本号(多亏了语义化版本,它们与代码是兼容的!),并且显示的行数可能会有所不同(取决于操作系统),行的顺序也可能会不同。

+

现在我们有了一个外部依赖,Cargo 从 registry 上获取所有包的最新版本信息,这是一份来自 Crates.io 的数据副本。Crates.io 是 Rust 生态系统中,人们发布其开源 Rust 项目的平台,供他人使用。

+

在更新完 registry 后,Cargo 检查 [dependencies] 片段并下载列表中包含但还未下载的 crates。本例中,虽然只声明了 rand 一个依赖,然而 Cargo 还是额外获取了 rand 所需要的其他 crates,因为 rand 依赖它们来正常工作。下载完成后,Rust 编译依赖,然后使用这些依赖编译项目。

+

如果不做任何修改,立刻再次运行 cargo build,则不会看到任何除了 Finished 行之外的输出。Cargo 知道它已经下载并编译了依赖,同时 Cargo.toml 文件也没有变动。Cargo 还知道代码也没有任何修改,所以它不会重新编译代码。因为无事可做,它会简单地退出。

+

如果打开 src/main.rs 文件,做一些无关紧要的修改,保存并再次构建,则会出现两行输出:

+
$ cargo build
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+    Finished dev [unoptimized + debuginfo] target(s) in 2.53 secs
+
+

这一行表示 Cargo 只针对 src/main.rs 文件的微小修改而更新构建。依赖没有变化,所以 Cargo 知道它可以复用已经为此下载并编译的代码。它只是重新构建了部分(项目)代码。

+

Cargo.lock 文件确保构建是可重现的

+

Cargo 有一个机制,确保无论是你还是其他人在任何时候重新构建代码,都会生成相同的构建产物:Cargo 只会使用你指定的依赖版本,除非你明确指定其他版本。例如,如果下周 rand crate 的 0.8.6 版本出来了,该版本包含了一个重要的 bug 修复,但同时也引入了一个会破坏你代码的回归问题。为了解决这个问题,Rust 在你第一次运行 cargo build 时创建了 Cargo.lock 文件,我们现在可以在 guessing_game 目录找到它。

+

当第一次构建项目时,Cargo 计算出所有符合要求的依赖版本并写入 Cargo.lock 文件。当将来构建项目时,Cargo 会发现 Cargo.lock 已存在并使用其中指定的版本,而不是再次计算所有的版本。这使得你拥有了一个自动化的可重现的构建。换句话说,项目会持续使用 0.8.5 直到你显式升级,多亏有了 Cargo.lock 文件。由于 Cargo.lock 文件对于“可重复构建”非常重要,因此它通常会和项目中的其余代码一样纳入到版本控制系统中。

+

更新 crate 到一个新版本

+

当你 确实 需要升级 crate 时,Cargo 提供了这样一个命令,update,它会忽略 Cargo.lock 文件,并计算出所有符合 Cargo.toml 声明的最新版本。Cargo 接下来会把这些版本写入 Cargo.lock 文件。不过,Cargo 默认只会寻找大于 0.8.5 而小于 0.9.0 的版本。如果 rand crate 发布了两个新版本,0.8.60.9.0,在运行 cargo update 时会出现如下内容:

+
$ cargo update
+    Updating crates.io index
+    Updating rand v0.8.5 -> v0.8.6
+
+

Cargo 忽略了 0.9.0 版本。这时,你也会注意到的 Cargo.lock 文件中的变化无外乎现在使用的 rand crate 版本是0.8.6 。如果想要使用 0.9.0 版本的 rand 或是任何 0.9.x 系列的版本,必须像这样更新 Cargo.toml 文件:

+
[dependencies]
+rand = "0.9.0"
+
+

下一次运行 cargo build 时,Cargo 会更新可用 crate 的 registry,并根据你指定的新版本重新评估 rand 的要求。

+

第十四章会讲到 Cargo 及其生态系统 的更多内容,不过目前你只需要了解这么多。通过 Cargo 复用库文件非常容易,因此 Rustacean 能够编写出由很多包组装而成的更轻巧的项目。

+

生成一个随机数

+

让我们开始使用 rand 来生成一个猜数字随机数。下一步是更新 src/main.rs,如示例 2-3 所示。

+
+

文件名:src/main.rs

+
use std::io;
+use rand::Rng;
+
+fn main() {
+    println!("Guess the number!");
+
+    let secret_number = rand::thread_rng().gen_range(1..=100);
+
+    println!("The secret number is: {secret_number}");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    println!("You guessed: {guess}");
+}
+
示例 2-3:添加生成随机数的代码
+
+

首先,我们新增了一行 use rand::Rng;Rng 是一个 trait,它定义了随机数生成器应实现的方法,想使用这些方法的话,此 trait 必须在作用域中。第十章会详细介绍 trait。

+

接下来,我们在中间还新增加了两行。第一行调用了 rand::thread_rng 函数提供实际使用的随机数生成器:它位于当前执行线程的本地环境中,并从操作系统获取 seed。接着调用随机数生成器的 gen_range 方法。这个方法由 use rand::Rng 语句引入到作用域的 Rng trait 定义。gen_range 方法获取一个范围表达式(range expression)作为参数,并生成一个在此范围之间的随机数。这里使用的这类范围表达式使用了 start..=end 这样的形式,也就是说包含了上下端点,所以需要指定 1..=100 来请求一个 1 和 100 之间的数。

+
+

注意:你不可能凭空就知道应该 use 哪个 trait 以及该从 crate 中调用哪个方法,因此每个 crate 有使用说明文档。Cargo 有一个很棒的功能是:运行 cargo doc --open 命令来构建所有本地依赖提供的文档,并在浏览器中打开。例如,假设你对 rand crate 中的其他功能感兴趣,你可以运行 cargo doc --open 并点击左侧导航栏中的 rand

+
+

新增加的第二行代码打印出了秘密数字。这在开发程序时很有用,因为可以测试它,不过在最终版本中会删掉它。如果游戏一开始就打印出结果就没什么可玩的了!

+

尝试运行程序几次:

+
$ cargo run
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+    Finished dev [unoptimized + debuginfo] target(s) in 2.53s
+     Running `target/debug/guessing_game`
+Guess the number!
+The secret number is: 7
+Please input your guess.
+4
+You guessed: 4
+
+$ cargo run
+    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
+     Running `target/debug/guessing_game`
+Guess the number!
+The secret number is: 83
+Please input your guess.
+5
+You guessed: 5
+
+

你应该能得到不同的随机数,同时它们应该都是在 1 和 100 之间的。干得漂亮!

+

比较猜测的数字和秘密数字

+

现在有了用户输入和一个随机数,我们可以比较它们。这个步骤如示例 2-4 所示。注意这段代码还不能通过编译,我们稍后会解释。

+
+

文件名:src/main.rs

+
use rand::Rng;
+use std::cmp::Ordering;
+use std::io;
+
+fn main() {
+    // --snip--
+    println!("Guess the number!");
+
+    let secret_number = rand::thread_rng().gen_range(1..=100);
+
+    println!("The secret number is: {secret_number}");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    println!("You guessed: {guess}");
+
+    match guess.cmp(&secret_number) {
+        Ordering::Less => println!("Too small!"),
+        Ordering::Greater => println!("Too big!"),
+        Ordering::Equal => println!("You win!"),
+    }
+}
+
示例 2-4:处理比较两个数字可能的返回值
+
+

首先我们增加了另一个 use 声明,从标准库引入了一个叫做 std::cmp::Ordering 的类型到作用域中。 Ordering 也是一个枚举,不过它的成员是 LessGreaterEqual。这是比较两个值时可能出现的三种结果。

+

接着,底部的五行新代码使用了 Ordering 类型,cmp 方法用来比较两个值并可以在任何可比较的值上调用。它获取一个被比较值的引用:这里是把 guesssecret_number 做比较。然后它会返回一个刚才通过 use 引入作用域的 Ordering 枚举的成员。使用一个 match 表达式,根据对 guesssecret_number 调用 cmp 返回的 Ordering 成员来决定接下来做什么。

+

一个 match 表达式由 分支(arms) 构成。一个分支包含一个 模式pattern)和表达式开头的值与分支模式相匹配时应该执行的代码。Rust 获取提供给 match 的值并挨个检查每个分支的模式。match 结构和模式是 Rust 中强大的功能,它体现了代码可能遇到的多种情形,并帮助你确保没有遗漏处理。这些功能将分别在第六章和第十九章详细介绍。

+

让我们看看使用 match 表达式的例子。假设用户猜了 50,这时随机生成的秘密数字是 38。

+

比较 50 与 38 时,因为 50 比 38 要大,cmp 方法会返回 Ordering::GreaterOrdering::Greatermatch 表达式得到的值。它检查第一个分支的模式,Ordering::LessOrdering::Greater并不匹配,所以它忽略了这个分支的代码并来到下一个分支。下一个分支的模式是 Ordering::Greater正确 匹配!这个分支关联的代码被执行,在屏幕打印出 Too big!match 表达式会在第一次成功匹配后终止,因为该场景下没有检查最后一个分支的必要。

+

然而,示例 2-4 的代码目前并不能编译,可以尝试一下:

+
$ cargo build
+ Downloading crates ...
+  Downloaded rand_core v0.6.2
+  Downloaded getrandom v0.2.2
+  Downloaded rand_chacha v0.3.0
+  Downloaded ppv-lite86 v0.2.10
+  Downloaded libc v0.2.86
+   Compiling libc v0.2.86
+   Compiling getrandom v0.2.2
+   Compiling cfg-if v1.0.0
+   Compiling ppv-lite86 v0.2.10
+   Compiling rand_core v0.6.2
+   Compiling rand_chacha v0.3.0
+   Compiling rand v0.8.5
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+error[E0308]: mismatched types
+  --> src/main.rs:22:21
+   |
+22 |     match guess.cmp(&secret_number) {
+   |                 --- ^^^^^^^^^^^^^^ expected `&String`, found `&{integer}`
+   |                 |
+   |                 arguments to this method are incorrect
+   |
+   = note: expected reference `&String`
+              found reference `&{integer}`
+note: method defined here
+  --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/cmp.rs:839:8
+
+For more information about this error, try `rustc --explain E0308`.
+error: could not compile `guessing_game` (bin "guessing_game") due to 1 previous error
+
+

错误的核心表明这里有 不匹配的类型mismatched types)。Rust 有一个静态强类型系统,同时也有类型推断。当我们写出 let guess = String::new() 时,Rust 推断出 guess 应该是 String 类型,并不需要我们写出类型。另一方面,secret_number,是数字类型。几个数字类型拥有 1 到 100 之间的值:32 位数字 i32;32 位无符号数字 u32;64 位数字 i64 等等。Rust 默认使用 i32,所以它是 secret_number 的类型,除非增加类型信息,或任何能让 Rust 推断出不同数值类型的信息。这里错误的原因在于 Rust 不会比较字符串类型和数字类型。

+

所以我们必须把从输入中读取到的 String 转换为一个真正的数字类型,才好与秘密数字进行比较。这可以通过在 main 函数体中增加如下代码来实现:

+

文件名:src/main.rs

+
use rand::Rng;
+use std::cmp::Ordering;
+use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    let secret_number = rand::thread_rng().gen_range(1..=100);
+
+    println!("The secret number is: {secret_number}");
+
+    println!("Please input your guess.");
+
+    // --snip--
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    let guess: u32 = guess.trim().parse().expect("Please type a number!");
+
+    println!("You guessed: {guess}");
+
+    match guess.cmp(&secret_number) {
+        Ordering::Less => println!("Too small!"),
+        Ordering::Greater => println!("Too big!"),
+        Ordering::Equal => println!("You win!"),
+    }
+}
+

这行新代码是:

+
let guess: u32 = guess.trim().parse().expect("Please type a number!");
+

这里创建了一个叫做 guess 的变量。不过等等,不是已经有了一个叫做 guess 的变量了吗?确实如此,不过 Rust 允许用一个新值来 隐藏Shadowingguess 之前的值。这个功能常用在需要转换值类型之类的场景。它允许我们复用 guess 变量的名字,而不是被迫创建两个不同变量,诸如 guess_strguess 之类。第三章会介绍 shadowing 的更多细节,现在只需知道这个功能经常用于将一个类型的值转换为另一个类型的值。

+

我们将这个新变量绑定到 guess.trim().parse() 表达式上。表达式中的 guess 指的是包含输入的字符串类型 guess 变量。String 实例的 trim 方法会去除字符串开头和结尾的空白字符,我们必须执行此方法才能将字符串与 u32 比较,因为 u32 只能包含数值型数据。用户必须输入 enter 键才能让 read_line 返回并输入他们的猜想,这将会在字符串中增加一个换行(newline)符。例如,用户输入 5 并按下 enter(在 Windows 上,按下 enter 键会得到一个回车符和一个换行符,\r\n),guess 看起来像这样:5\n 或者 5\r\n\n 代表 “换行”,回车键;\r 代表 “回车”,回车键。trim 方法会消除 \n 或者 \r\n,只留下 5

+

字符串的 parse 方法 将字符串转换成其他类型。这里用它来把字符串转换为数值。我们需要告诉 Rust 具体的数字类型,这里通过 let guess: u32 指定。guess 后面的冒号(:)告诉 Rust 我们指定了变量的类型。Rust 有一些内建的数字类型;u32 是一个无符号的 32 位整型。对于不大的正整数来说,它是不错的默认类型,第三章还会讲到其他数字类型。

+

另外,程序中的 u32 注解以及与 secret_number 的比较,意味着 Rust 会推断出 secret_number 也是 u32 类型。现在可以使用相同类型比较两个值了!

+

parse 方法只有在字符逻辑上可以转换为数字的时候才能工作所以非常容易出错。例如,字符串中包含 A👍%,就无法将其转换为一个数字。因此,parse 方法返回一个 Result 类型。像之前 “使用 Result 类型来处理潜在的错误” 讨论的 read_line 方法那样,再次按部就班的用 expect 方法处理即可。如果 parse 不能从字符串生成一个数字,返回一个 ResultErr 成员时,expect 会使游戏崩溃并打印附带的信息。如果 parse 成功地将字符串转换为一个数字,它会返回 ResultOk 成员,然后 expect 会返回 Ok 值中的数字。

+

现在让我们运行程序!

+
$ cargo run
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+    Finished dev [unoptimized + debuginfo] target(s) in 0.43s
+     Running `target/debug/guessing_game`
+Guess the number!
+The secret number is: 58
+Please input your guess.
+  76
+You guessed: 76
+Too big!
+
+

漂亮!即便是在猜测之前添加了空格,程序依然能判断出用户猜测了 76。多运行程序几次,输入不同的数字来检验不同的行为:猜一个正确的数字,猜一个过大的数字和猜一个过小的数字。

+

现在游戏已经大体上能玩了,不过用户只能猜一次。增加一个循环来改变它吧!

+

使用循环来允许多次猜测

+

loop 关键字创建了一个无限循环。我们会增加循环来给用户更多机会猜数字:

+

文件名:src/main.rs

+
use rand::Rng;
+use std::cmp::Ordering;
+use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    let secret_number = rand::thread_rng().gen_range(1..=100);
+
+    // --snip--
+
+    println!("The secret number is: {secret_number}");
+
+    loop {
+        println!("Please input your guess.");
+
+        // --snip--
+
+
+        let mut guess = String::new();
+
+        io::stdin()
+            .read_line(&mut guess)
+            .expect("Failed to read line");
+
+        let guess: u32 = guess.trim().parse().expect("Please type a number!");
+
+        println!("You guessed: {guess}");
+
+        match guess.cmp(&secret_number) {
+            Ordering::Less => println!("Too small!"),
+            Ordering::Greater => println!("Too big!"),
+            Ordering::Equal => println!("You win!"),
+        }
+    }
+}
+

如上所示,我们将提示用户猜测之后的所有内容移动到了循环中。确保 loop 循环中的代码多缩进四个空格,再次运行程序。注意这里有一个新问题,因为程序忠实地执行了我们的要求:永远地请求另一个猜测,用户好像无法退出啊!

+

用户总能使用 ctrl-c 终止程序。不过还有另一个方法跳出无限循环,就是 “比较猜测与秘密数字” 部分提到的 parse:如果用户输入的答案不是一个数字,程序会崩溃。我们可以利用这一点来退出,如下所示:

+
$ cargo run
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+    Finished dev [unoptimized + debuginfo] target(s) in 1.50s
+     Running `target/debug/guessing_game`
+Guess the number!
+The secret number is: 59
+Please input your guess.
+45
+You guessed: 45
+Too small!
+Please input your guess.
+60
+You guessed: 60
+Too big!
+Please input your guess.
+59
+You guessed: 59
+You win!
+Please input your guess.
+quit
+thread 'main' panicked at 'Please type a number!: ParseIntError { kind: InvalidDigit }', src/main.rs:28:47
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+

输入 quit 将会退出程序,同时你会注意到其他任何非数字输入也一样。然而,这并不理想,我们想要当猜测正确的数字时游戏停止。

+

猜测正确后退出

+

让我们增加一个 break 语句,在用户猜对时退出游戏:

+

文件名:src/main.rs

+
use rand::Rng;
+use std::cmp::Ordering;
+use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    let secret_number = rand::thread_rng().gen_range(1..=100);
+
+    println!("The secret number is: {secret_number}");
+
+    loop {
+        println!("Please input your guess.");
+
+        let mut guess = String::new();
+
+        io::stdin()
+            .read_line(&mut guess)
+            .expect("Failed to read line");
+
+        let guess: u32 = guess.trim().parse().expect("Please type a number!");
+
+        println!("You guessed: {guess}");
+
+        // --snip--
+
+        match guess.cmp(&secret_number) {
+            Ordering::Less => println!("Too small!"),
+            Ordering::Greater => println!("Too big!"),
+            Ordering::Equal => {
+                println!("You win!");
+                break;
+            }
+        }
+    }
+}
+

通过在 You win! 之后增加一行 break,用户猜对了神秘数字后会退出循环。退出循环也意味着退出程序,因为循环是 main 的最后一部分。

+

处理无效输入

+

为了进一步改善游戏性,不要在用户输入非数字时崩溃,需要忽略非数字,让用户可以继续猜测。可以通过修改 guessString 转化为 u32 那部分代码来实现,如示例 2-5 所示:

+
+

文件名:src/main.rs

+
use rand::Rng;
+use std::cmp::Ordering;
+use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    let secret_number = rand::thread_rng().gen_range(1..=100);
+
+    println!("The secret number is: {secret_number}");
+
+    loop {
+        println!("Please input your guess.");
+
+        let mut guess = String::new();
+
+        // --snip--
+
+        io::stdin()
+            .read_line(&mut guess)
+            .expect("Failed to read line");
+
+        let guess: u32 = match guess.trim().parse() {
+            Ok(num) => num,
+            Err(_) => continue,
+        };
+
+        println!("You guessed: {guess}");
+
+        // --snip--
+
+        match guess.cmp(&secret_number) {
+            Ordering::Less => println!("Too small!"),
+            Ordering::Greater => println!("Too big!"),
+            Ordering::Equal => {
+                println!("You win!");
+                break;
+            }
+        }
+    }
+}
+
示例 2-5:忽略非数字的猜测并重新请求数字而不是让程序崩溃
+
+

我们将 expect 调用换成 match 语句,以从遇到错误就崩溃转换为处理错误。须知 parse 返回一个 Result 类型,而 Result 是一个拥有 OkErr 成员的枚举。这里使用的 match 表达式,和之前处理 cmp 方法返回 Ordering 时用的一样。

+

如果 parse 能够成功的将字符串转换为一个数字,它会返回一个包含结果数字的 Ok。这个 Ok 值与 match 第一个分支的模式相匹配,该分支对应的动作返回 Ok 值中的数字 num,最后如愿变成新创建的 guess 变量。

+

如果 parse 能将字符串转换为一个数字,它会返回一个包含更多错误信息的 ErrErr 值不能匹配第一个 match 分支的 Ok(num) 模式,但是会匹配第二个分支的 Err(_) 模式:_ 是一个通配符值,本例中用来匹配所有 Err 值,不管其中有何种信息。所以程序会执行第二个分支的动作,continue 意味着进入 loop 的下一次循环,请求另一个猜测。这样程序就有效的忽略了 parse 可能遇到的所有错误!

+

现在程序中的一切都应该如预期般工作了。让我们试试吧:

+
$ cargo run
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+    Finished dev [unoptimized + debuginfo] target(s) in 4.45s
+     Running `target/debug/guessing_game`
+Guess the number!
+The secret number is: 61
+Please input your guess.
+10
+You guessed: 10
+Too small!
+Please input your guess.
+99
+You guessed: 99
+Too big!
+Please input your guess.
+foo
+Please input your guess.
+61
+You guessed: 61
+You win!
+
+

太棒了!再有最后一个小的修改,就能完成猜数字游戏了:还记得程序依然会打印出秘密数字。在测试时还好,但正式发布时会毁了游戏。删掉打印秘密数字的 println!。示例 2-6 为最终代码:

+
+

文件名:src/main.rs

+
use rand::Rng;
+use std::cmp::Ordering;
+use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    let secret_number = rand::thread_rng().gen_range(1..=100);
+
+    loop {
+        println!("Please input your guess.");
+
+        let mut guess = String::new();
+
+        io::stdin()
+            .read_line(&mut guess)
+            .expect("Failed to read line");
+
+        let guess: u32 = match guess.trim().parse() {
+            Ok(num) => num,
+            Err(_) => continue,
+        };
+
+        println!("You guessed: {guess}");
+
+        match guess.cmp(&secret_number) {
+            Ordering::Less => println!("Too small!"),
+            Ordering::Greater => println!("Too big!"),
+            Ordering::Equal => {
+                println!("You win!");
+                break;
+            }
+        }
+    }
+}
+
示例 2-6:猜数字游戏的完整代码
+
+

此时此刻,你顺利完成了猜数字游戏。恭喜!

+

总结

+

本项目通过动手实践,向你介绍了 Rust 新概念:letmatch、函数、使用外部 crate 等等,接下来的几章,你会继续深入学习这些概念。第三章介绍大部分编程语言都有的概念,比如变量、数据类型和函数,以及如何在 Rust 中使用它们。第四章探索所有权(ownership),这是一个 Rust 同其他语言大不相同的功能。第五章讨论结构体和方法的语法,而第六章侧重解释枚举。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch03-00-common-programming-concepts.html b/ch03-00-common-programming-concepts.html new file mode 100644 index 000000000..662312694 --- /dev/null +++ b/ch03-00-common-programming-concepts.html @@ -0,0 +1,250 @@ + + + + + + 常见编程概念 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

常见编程概念

+
+

ch03-00-common-programming-concepts.md +
+commit d0acb2595c891de97a133d06635c50ab449dd65c

+
+

本章介绍一些几乎所有编程语言都有的概念,以及它们在 Rust 中是如何工作的。很多编程语言的核心概念都是共通的,本章中展示的概念都不是 Rust 所特有的,不过我们会在 Rust 上下文中讨论它们,并解释使用这些概念的惯例。

+

具体来说,我们将会学习变量、基本类型、函数、注释和控制流。每一个 Rust 程序中都会用到这些基础知识,提早学习这些概念会让你在起步时就打下坚实的基础。

+
+

关键字

+

Rust 语言有一组保留的 关键字keywords),就像大部分语言一样,它们只能由语言本身使用。记住,你不能使用这些关键字作为变量或函数的名称。大部分关键字有特殊的意义,你将在 Rust 程序中使用它们完成各种任务;一些关键字目前没有相应的功能,是为将来可能添加的功能保留的。可以在附录 A 中找到关键字的列表。

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch03-01-variables-and-mutability.html b/ch03-01-variables-and-mutability.html new file mode 100644 index 000000000..06aac29f9 --- /dev/null +++ b/ch03-01-variables-and-mutability.html @@ -0,0 +1,357 @@ + + + + + + 变量与可变性 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

变量和可变性

+
+

ch03-01-variables-and-mutability.md

+

commit 21a2ed14f4480dab62438dcc1130291bebc65379

+
+

正如第二章中“使用变量储存值” 部分提到的那样,变量默认是不可改变的(immutable)。这是 Rust 提供给你的众多优势之一,让你得以充分利用 Rust 提供的安全性和简单并发性来编写代码。不过,你仍然可以使用可变变量。让我们探讨一下 Rust 为何及如何鼓励你利用不可变性,以及何时你会选择不使用不可变性。

+

当变量不可变时,一旦值被绑定一个名称上,你就不能改变这个值。为了对此进行说明,使用 cargo new variables 命令在 projects 目录生成一个叫做 variables 的新项目。

+

接着,在新建的 variables 目录,打开 src/main.rs 并将代码替换为如下代码,这些代码还不能编译,我们会首次检查到不可变错误(immutability error)。

+

文件名:src/main.rs

+
fn main() {
+    let x = 5;
+    println!("The value of x is: {x}");
+    x = 6;
+    println!("The value of x is: {x}");
+}
+

保存并使用 cargo run 运行程序。应该会看到一条与不可变性有关的错误信息,如下输出所示:

+
$ cargo run
+   Compiling variables v0.1.0 (file:///projects/variables)
+error[E0384]: cannot assign twice to immutable variable `x`
+ --> src/main.rs:4:5
+  |
+2 |     let x = 5;
+  |         - first assignment to `x`
+3 |     println!("The value of x is: {x}");
+4 |     x = 6;
+  |     ^^^^^ cannot assign twice to immutable variable
+  |
+help: consider making this binding mutable
+  |
+2 |     let mut x = 5;
+  |         +++
+
+For more information about this error, try `rustc --explain E0384`.
+error: could not compile `variables` (bin "variables") due to 1 previous error
+
+

这个例子展示了编译器如何帮助你找出程序中的错误。虽然编译错误令人沮丧,但那只是表示程序不能安全的完成你想让它完成的工作;并 不能 说明你不是一个好程序员!经验丰富的 Rustacean 们一样会遇到编译错误。

+

错误信息指出错误的原因是 不能对不可变变量 x 二次赋值cannot assign twice to immutable variable `x` ),因为你尝试对不可变变量 x 赋第二个值。

+

在尝试改变预设为不可变的值时,产生编译时错误是很重要的,因为这种情况可能导致 bug。如果一部分代码假设一个值永远也不会改变,而另一部分代码改变了这个值,第一部分代码就有可能以不可预料的方式运行。不得不承认这种 bug 的起因难以跟踪,尤其是第二部分代码只是 有时 会改变值。

+

Rust 编译器保证,如果声明一个值不会变,它就真的不会变,所以你不必自己跟踪它。这意味着你的代码更易于推导。

+

不过可变性也是非常有用的,可以用来更方便地编写代码。尽管变量默认是不可变的,你仍然可以在变量名前添加 mut 来使其可变,正如在第二章所做的那样。mut 也向读者表明了其他代码将会改变这个变量值的意图。

+

例如,让我们将 src/main.rs 修改为如下代码:

+

文件名:src/main.rs

+
fn main() {
+    let mut x = 5;
+    println!("The value of x is: {x}");
+    x = 6;
+    println!("The value of x is: {x}");
+}
+

现在运行这个程序,出现如下内容:

+
$ cargo run
+   Compiling variables v0.1.0 (file:///projects/variables)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s
+     Running `target/debug/variables`
+The value of x is: 5
+The value of x is: 6
+
+

通过 mut,允许把绑定到 x 的值从 5 改成 6。是否让变量可变的最终决定权仍然在你,取决于在某个特定情况下,你是否认为变量可变会让代码更加清晰明了。

+

常量

+

类似于不可变变量,常量 (constants) 是绑定到一个名称的不允许改变的值,不过常量与变量还是有一些区别。

+

首先,不允许对常量使用 mut。常量不光默认不可变,它总是不可变。声明常量使用 const 关键字而不是 let,并且 必须 注明值的类型。在下一部分,“数据类型” 中会介绍类型和类型注解,现在无需关心这些细节,记住总是标注类型即可。

+

常量可以在任何作用域中声明,包括全局作用域,这在一个值需要被很多部分的代码用到时很有用。

+

最后一个区别是,常量只能被设置为常量表达式,而不可以是其他任何只能在运行时计算出的值。

+

下面是一个声明常量的例子:

+
#![allow(unused)]
+fn main() {
+const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
+}
+

常量的名称是 THREE_HOURS_IN_SECONDS,它的值被设置为 60(一分钟内的秒数)乘以 60(一小时内的分钟数)再乘以 3(我们在这个程序中要计算的小时数)的结果。Rust 对常量的命名约定是在单词之间使用全大写加下划线。编译器能够在编译时计算一组有限的操作,这使我们可以选择以更容易理解和验证的方式写出此值,而不是将此常量设置为值 10,800。有关声明常量时可以使用哪些操作的详细信息,请参阅 Rust Reference 的常量求值部分

+

在声明它的作用域之中,常量在整个程序生命周期中都有效,此属性使得常量可以作为多处代码使用的全局范围的值,例如一个游戏中所有玩家可以获取的最高分或者光速。

+

将遍布于应用程序中的硬编码值声明为常量,能帮助后来的代码维护人员了解值的意图。如果将来需要修改硬编码值,也只需修改汇聚于一处的硬编码值。

+

隐藏

+

正如在第二章猜数字游戏中所讲,我们可以定义一个与之前变量同名的新变量。Rustacean 们称之为第一个变量被第二个 隐藏(Shadowing) 了,这意味着当您使用变量的名称时,编译器将看到第二个变量。实际上,第二个变量“遮蔽”了第一个变量,此时任何使用该变量名的行为中都会视为是在使用第二个变量,直到第二个变量自己也被隐藏或第二个变量的作用域结束。可以用相同变量名称来隐藏一个变量,以及重复使用 let 关键字来多次隐藏,如下所示:

+

文件名:src/main.rs

+
fn main() {
+    let x = 5;
+
+    let x = x + 1;
+
+    {
+        let x = x * 2;
+        println!("The value of x in the inner scope is: {x}");
+    }
+
+    println!("The value of x is: {x}");
+}
+

这个程序首先将 x 绑定到值 5 上。接着通过 let x = 创建了一个新变量 x,获取初始值并加 1,这样 x 的值就变成 6 了。然后,在使用花括号创建的内部作用域内,第三个 let 语句也隐藏了 x 并创建了一个新的变量,将之前的值乘以 2x 得到的值是 12。当该作用域结束时,内部 shadowing 的作用域也结束了,x 又返回到 6。运行这个程序,它会有如下输出:

+
$ cargo run
+   Compiling variables v0.1.0 (file:///projects/variables)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
+     Running `target/debug/variables`
+The value of x in the inner scope is: 12
+The value of x is: 6
+
+

隐藏与将变量标记为 mut 是有区别的。当不小心尝试对变量重新赋值时,如果没有使用 let 关键字,就会导致编译时错误。通过使用 let,我们可以用这个值进行一些计算,不过计算完之后变量仍然是不可变的。

+

mut 与隐藏的另一个区别是,当再次使用 let 时,实际上创建了一个新变量,我们可以改变值的类型,并且复用这个名字。例如,假设程序请求用户输入空格字符来说明希望在文本之间显示多少个空格,接下来我们想将输入存储成数字(多少个空格):

+
fn main() {
+    let spaces = "   ";
+    let spaces = spaces.len();
+}
+

第一个 spaces 变量是字符串类型,第二个 spaces 变量是数字类型。隐藏使我们不必使用不同的名字,如 spaces_strspaces_num;相反,我们可以复用 spaces 这个更简单的名字。然而,如果尝试使用 mut,将会得到一个编译时错误,如下所示:

+
fn main() {
+    let mut spaces = "   ";
+    spaces = spaces.len();
+}
+

这个错误说明,我们不能改变变量的类型:

+
$ cargo run
+   Compiling variables v0.1.0 (file:///projects/variables)
+error[E0308]: mismatched types
+ --> src/main.rs:3:14
+  |
+2 |     let mut spaces = "   ";
+  |                      ----- expected due to this value
+3 |     spaces = spaces.len();
+  |              ^^^^^^^^^^^^ expected `&str`, found `usize`
+
+For more information about this error, try `rustc --explain E0308`.
+error: could not compile `variables` (bin "variables") due to 1 previous error
+
+

现在我们已经了解了变量如何工作,让我们看看变量可以拥有的更多数据类型。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch03-02-data-types.html b/ch03-02-data-types.html new file mode 100644 index 000000000..a9261bc27 --- /dev/null +++ b/ch03-02-data-types.html @@ -0,0 +1,457 @@ + + + + + + 数据类型 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

数据类型

+
+

ch03-02-data-types.md +
+commit d0acb2595c891de97a133d06635c50ab449dd65c

+
+

在 Rust 中,每一个值都属于某一个 数据类型data type),这告诉 Rust 它被指定为何种数据,以便明确数据处理方式。我们将看到两类数据类型子集:标量(scalar)和复合(compound)。

+

记住,Rust 是 静态类型statically typed)语言,也就是说在编译时就必须知道所有变量的类型。根据值及其使用方式,编译器通常可以推断出我们想要用的类型。当多种类型均有可能时,比如第二章的 “比较猜测的数字和秘密数字” 使用 parseString 转换为数字时,必须增加类型注解,像这样:

+
#![allow(unused)]
+fn main() {
+let guess: u32 = "42".parse().expect("Not a number!");
+}
+

如果不像上面的代码这样添加类型注解 : u32,Rust 会显示如下错误,这说明编译器需要我们提供更多信息,来了解我们想要的类型:

+
$ cargo build
+   Compiling no_type_annotations v0.1.0 (file:///projects/no_type_annotations)
+error[E0284]: type annotations needed
+ --> src/main.rs:2:9
+  |
+2 |     let guess = "42".parse().expect("Not a number!");
+  |         ^^^^^        ----- type must be known at this point
+  |
+  = note: cannot satisfy `<_ as FromStr>::Err == _`
+help: consider giving `guess` an explicit type
+  |
+2 |     let guess: /* Type */ = "42".parse().expect("Not a number!");
+  |              ++++++++++++
+
+For more information about this error, try `rustc --explain E0284`.
+error: could not compile `no_type_annotations` (bin "no_type_annotations") due to 1 previous error
+
+

你会看到其它数据类型的各种类型注解。

+

标量类型

+

标量scalar)类型代表一个单独的值。Rust 有四种基本的标量类型:整型、浮点型、布尔类型和字符类型。你可能在其他语言中见过它们。让我们深入了解它们在 Rust 中是如何工作的。

+

整型

+

整数 是一个没有小数部分的数字。我们在第二章使用过 u32 整数类型。该类型声明表明,它关联的值应该是一个占据 32 比特位的无符号整数(有符号整数类型以 i 开头而不是 u)。表格 3-1 展示了 Rust 内建的整数类型。我们可以使用其中的任一个来声明一个整数值的类型。

+

表格 3-1: Rust 中的整型

+
+ + + + + + +
长度有符号无符号
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize
+
+

每一个变体都可以是有符号或无符号的,并有一个明确的大小。有符号无符号 代表数字能否为负值,换句话说,这个数字是否有可能是负数(有符号数),或者永远为正而不需要符号(无符号数)。这有点像在纸上书写数字:当需要考虑符号的时候,数字以加号或减号作为前缀;然而,可以安全地假设为正数时,加号前缀通常省略。有符号数以补码形式(two’s complement representation) 存储。

+

每一个有符号的变体可以储存包含从 -(2n - 1) 到 2n - 1 - 1 在内的数字,这里 n 是变体使用的位数。所以 i8 可以储存从 -(27) 到 27 - 1 在内的数字,也就是从 -128 到 127。无符号的变体可以储存从 0 到 2n - 1 的数字,所以 u8 可以储存从 0 到 28 - 1 的数字,也就是从 0 到 255。

+

另外,isizeusize 类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的,32 位架构上它们是 32 位的。

+

可以使用表格 3-2 中的任何一种形式编写数字字面值。请注意可以是多种数字类型的数字字面值允许使用类型后缀,例如 57u8 来指定类型,同时也允许使用 _ 做为分隔符以方便读数,例如1_000,它的值与你指定的 1000 相同。

+

表格 3-2: Rust 中的整型字面值

+
+ + + + + +
数字字面值例子
Decimal (十进制)98_222
Hex (十六进制)0xff
Octal (八进制)0o77
Binary (二进制)0b1111_0000
Byte (单字节字符)(仅限于u8)b'A'
+
+

那么该使用哪种类型的数字呢?如果拿不定主意,Rust 的默认类型通常是个不错的起点,数字类型默认是 i32isizeusize 主要作为某些集合的索引。

+
+
整型溢出
+

比方说有一个 u8 ,它可以存放从零到 255 的值。那么当你将其修改为 256 时会发生什么呢?这被称为 “整型溢出”(“integer overflow” ),这会导致以下两种行为之一的发生。当在 debug 模式编译时,Rust 检查这类问题并使程序 panic,这个术语被 Rust 用来表明程序因错误而退出。第九章 panic! 与不可恢复的错误” 部分会详细介绍 panic。

+

使用 --release flag 在 release 模式中构建时,Rust 不会检测会导致 panic 的整型溢出。相反发生整型溢出时,Rust 会进行一种被称为二进制补码 wrapping(two’s complement wrapping)的操作。简而言之,比此类型能容纳最大值还大的值会回绕到最小值,值 256 变成 0,值 257 变成 1,依此类推。程序不会 panic,不过变量可能也不会是你所期望的值。依赖整型溢出 wrapping 的行为被认为是一种错误。

+

为了显式地处理溢出的可能性,可以使用这几类标准库提供的原始数字类型方法:

+
    +
  • 所有模式下都可以使用 wrapping_* 方法进行 wrapping,如 wrapping_add
  • +
  • 如果 checked_* 方法出现溢出,则返回 None
  • +
  • overflowing_* 方法返回值和一个布尔值,表示是否出现溢出
  • +
  • saturating_* 方法在值的最小值或最大值处进行饱和处理
  • +
+
+

浮点型

+

Rust 也有两个原生的 浮点数floating-point numbers)类型,它们是带小数点的数字。Rust 的浮点数类型是 f32f64,分别占 32 位和 64 位。默认类型是 f64,因为在现代 CPU 中,它与 f32 速度几乎一样,不过精度更高。所有的浮点型都是有符号的。

+

这是一个展示浮点数的实例:

+

文件名:src/main.rs

+
fn main() {
+    let x = 2.0; // f64
+
+    let y: f32 = 3.0; // f32
+}
+

浮点数采用 IEEE-754 标准表示。f32 是单精度浮点数,f64 是双精度浮点数。

+

数值运算

+

Rust 中的所有数字类型都支持基本数学运算:加法、减法、乘法、除法和取余。整数除法会向零舍入到最接近的整数。下面的代码展示了如何在 let 语句中使用它们:

+

文件名:src/main.rs

+
fn main() {
+    // addition
+    let sum = 5 + 10;
+
+    // subtraction
+    let difference = 95.5 - 4.3;
+
+    // multiplication
+    let product = 4 * 30;
+
+    // division
+    let quotient = 56.7 / 32.2;
+    let truncated = -5 / 3; // 结果为 -1
+
+    // remainder
+    let remainder = 43 % 5;
+}
+

这些语句中的每个表达式使用了一个数学运算符并计算出了一个值,然后绑定给一个变量。附录 B 包含 Rust 提供的所有运算符的列表。

+

布尔型

+

正如其他大部分编程语言一样,Rust 中的布尔类型有两个可能的值:truefalse。Rust 中的布尔类型使用 bool 表示。例如:

+

文件名:src/main.rs

+
fn main() {
+    let t = true;
+
+    let f: bool = false; // with explicit type annotation
+}
+

使用布尔值的主要场景是条件表达式,例如 if 表达式。在 “控制流”(“Control Flow”) 部分将介绍 if 表达式在 Rust 中如何工作。

+

字符类型

+

Rust 的 char 类型是语言中最原生的字母类型。下面是一些声明 char 值的例子:

+

文件名:src/main.rs

+
fn main() {
+    let c = 'z';
+    let z: char = 'ℤ'; // with explicit type annotation
+    let heart_eyed_cat = '😻';
+}
+

注意,我们用单引号声明 char 字面量,而与之相反的是,使用双引号声明字符串字面量。Rust 的 char 类型的大小为四个字节 (four bytes),并代表了一个 Unicode 标量值(Unicode Scalar Value),这意味着它可以比 ASCII 表示更多内容。在 Rust 中,带变音符号的字母(Accented letters),中文、日文、韩文等字符,emoji(绘文字)以及零长度的空白字符都是有效的 char 值。Unicode 标量值包含从 U+0000U+D7FFU+E000U+10FFFF 在内的值。不过,“字符” 并不是一个 Unicode 中的概念,所以人直觉上的 “字符” 可能与 Rust 中的 char 并不符合。第八章的 “使用字符串储存 UTF-8 编码的文本” 中将详细讨论这个主题。

+

复合类型

+

复合类型Compound types)可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array)。

+

元组类型

+

元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定:一旦声明,其长度不会增大或缩小。

+

我们使用包含在圆括号中的逗号分隔的值列表来创建一个元组。元组中的每一个位置都有一个类型,而且这些不同值的类型也不必是相同的。这个例子中使用了可选的类型注解:

+

文件名:src/main.rs

+
fn main() {
+    let tup: (i32, f64, u8) = (500, 6.4, 1);
+}
+

tup 变量绑定到整个元组上,因为元组是一个单独的复合元素。为了从元组中获取单个值,可以使用模式匹配(pattern matching)来解构(destructure)元组值,像这样:

+

文件名:src/main.rs

+
fn main() {
+    let tup = (500, 6.4, 1);
+
+    let (x, y, z) = tup;
+
+    println!("The value of y is: {y}");
+}
+

程序首先创建了一个元组并绑定到 tup 变量上。接着使用了 let 和一个模式将 tup 分成了三个不同的变量,xyz。这叫做 解构destructuring),因为它将一个元组拆成了三个部分。最后,程序打印出了 y 的值,也就是 6.4

+

我们也可以使用点号(.)后跟值的索引来直接访问它们。例如:

+

文件名:src/main.rs

+
fn main() {
+    let x: (i32, f64, u8) = (500, 6.4, 1);
+
+    let five_hundred = x.0;
+
+    let six_point_four = x.1;
+
+    let one = x.2;
+}
+

这个程序创建了一个元组,x,然后使用其各自的索引访问元组中的每个元素。跟大多数编程语言一样,元组的第一个索引值是 0。

+

不带任何值的元组有个特殊的名称,叫做 单元(unit) 元组。这种值以及对应的类型都写作 (),表示空值或空的返回类型。如果表达式不返回任何其他值,则会隐式返回单元值。

+

数组类型

+

另一个包含多个值的方式是 数组array)。与元组不同,数组中的每个元素的类型必须相同。Rust 中的数组与一些其他语言中的数组不同,Rust 中的数组长度是固定的。

+

我们将数组的值写成在方括号内,用逗号分隔:

+

文件名:src/main.rs

+
fn main() {
+    let a = [1, 2, 3, 4, 5];
+}
+

当你想要在栈(stack)而不是在堆(heap)上为数据分配空间(第四章将讨论栈与堆的更多内容),或者是想要确保总是有固定数量的元素时,数组非常有用。但是数组并不如 vector 类型灵活。vector 类型是标准库提供的一个 允许 增长和缩小长度的类似数组的集合类型。当不确定是应该使用数组还是 vector 的时候,那么很可能应该使用 vector。第八章会详细讨论 vector。

+

然而,当你确定元素个数不会改变时,数组会更有用。例如,当你在一个程序中使用月份名字时,你更应趋向于使用数组而不是 vector,因为你确定只会有 12 个元素。

+
#![allow(unused)]
+fn main() {
+let months = ["January", "February", "March", "April", "May", "June", "July",
+              "August", "September", "October", "November", "December"];
+}
+

可以像这样编写数组的类型:在方括号中包含每个元素的类型,后跟分号,再后跟数组元素的数量。

+
#![allow(unused)]
+fn main() {
+let a: [i32; 5] = [1, 2, 3, 4, 5];
+}
+

这里,i32 是每个元素的类型。分号之后,数字 5 表明该数组包含五个元素。

+

你还可以通过在方括号中指定初始值加分号再加元素个数的方式来创建一个每个元素都为相同值的数组:

+
#![allow(unused)]
+fn main() {
+let a = [3; 5];
+}
+

变量名为 a 的数组将包含 5 个元素,这些元素的值最初都将被设置为 3。这种写法与 let a = [3, 3, 3, 3, 3]; 效果相同,但更简洁。

+
访问数组元素
+

数组是可以在栈 (stack) 上分配的已知固定大小的单个内存块。可以使用索引来访问数组的元素,像这样:

+

文件名:src/main.rs

+
fn main() {
+    let a = [1, 2, 3, 4, 5];
+
+    let first = a[0];
+    let second = a[1];
+}
+

在这个例子中,叫做 first 的变量的值是 1,因为它是数组索引 [0] 的值。变量 second 将会是数组索引 [1] 的值 2

+
无效的数组元素访问
+

让我们看看如果我们访问数组结尾之后的元素会发生什么呢?比如你执行以下代码,它使用类似于第 2 章中的猜数字游戏的代码从用户那里获取数组索引:

+

文件名:src/main.rs

+
use std::io;
+
+fn main() {
+    let a = [1, 2, 3, 4, 5];
+
+    println!("Please enter an array index.");
+
+    let mut index = String::new();
+
+    io::stdin()
+        .read_line(&mut index)
+        .expect("Failed to read line");
+
+    let index: usize = index
+        .trim()
+        .parse()
+        .expect("Index entered was not a number");
+
+    let element = a[index];
+
+    println!("The value of the element at index {index} is: {element}");
+}
+

此代码编译成功。如果您使用 cargo run 运行此代码并输入 01234,程序将在数组中的索引处打印出相应的值。如果你输入一个超过数组末端的数字,如 10,你会看到这样的输出:

+
thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src/main.rs:19:19
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+

程序在索引操作中使用一个无效的值时导致 运行时 错误。程序带着错误信息退出,并且没有执行最后的 println! 语句。当尝试用索引访问一个元素时,Rust 会检查指定的索引是否小于数组的长度。如果索引超出了数组长度,Rust 会 panic,这是 Rust 术语,它用于程序因为错误而退出的情况。这种检查必须在运行时进行,特别是在这种情况下,因为编译器不可能知道用户在以后运行代码时将输入什么值。

+

这是第一个在实战中遇到的 Rust 安全原则的例子。在很多底层语言中,并没有进行这类检查,这样当提供了一个不正确的索引时,就会访问无效的内存。通过立即退出而不是允许内存访问并继续执行,Rust 让你避开此类错误。第九章会更详细地讨论 Rust 的错误处理机制,以及如何编写可读性强而又安全的代码,使程序既不会 panic 也不会导致非法内存访问。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch03-03-how-functions-work.html b/ch03-03-how-functions-work.html new file mode 100644 index 000000000..28b63694f --- /dev/null +++ b/ch03-03-how-functions-work.html @@ -0,0 +1,429 @@ + + + + + + 函数 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

函数

+
+

ch03-03-how-functions-work.md +
+commit d0acb2595c891de97a133d06635c50ab449dd65c

+
+

函数在 Rust 代码中非常普遍。你已经见过语言中最重要的函数之一:main 函数,它是很多程序的入口点。你也见过 fn 关键字,它用来声明新函数。

+

Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并使用下划线分隔单词。这是一个包含函数定义示例的程序:

+

文件名:src/main.rs

+
fn main() {
+    println!("Hello, world!");
+
+    another_function();
+}
+
+fn another_function() {
+    println!("Another function.");
+}
+

我们在 Rust 中通过输入 fn 后面跟着函数名和一对圆括号来定义函数。大括号告诉编译器哪里是函数体的开始和结尾。

+

可以使用函数名后跟圆括号来调用我们定义过的任意函数。因为程序中已定义 another_function 函数,所以可以在 main 函数中调用它。注意,源码中 another_function 定义在 main 函数 之后;也可以定义在之前。Rust 不关心函数定义所在的位置,只要函数被调用时出现在调用之处可见的作用域内就行。

+

让我们新建一个叫做 functions 的二进制项目来进一步探索函数。将上面的 another_function 例子写入 src/main.rs 中并运行。你应该会看到如下输出:

+
$ cargo run
+   Compiling functions v0.1.0 (file:///projects/functions)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.28s
+     Running `target/debug/functions`
+Hello, world!
+Another function.
+
+

main 函数中的代码会按顺序执行。首先,打印 “Hello, world!” 信息,然后调用 another_function 函数并打印它的信息。

+

参数

+

我们可以定义为拥有 参数parameters)的函数,参数是特殊变量,是函数签名的一部分。当函数拥有参数(形参)时,可以为这些参数提供具体的值(实参)。技术上讲,这些具体值被称为参数(arguments),但是在日常交流中,人们倾向于不区分使用 parameterargument 来表示函数定义中的变量或调用函数时传入的具体值。

+

在这版 another_function 中,我们增加了一个参数:

+

文件名:src/main.rs

+
fn main() {
+    another_function(5);
+}
+
+fn another_function(x: i32) {
+    println!("The value of x is: {x}");
+}
+

尝试运行程序,将会输出如下内容:

+
$ cargo run
+   Compiling functions v0.1.0 (file:///projects/functions)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.21s
+     Running `target/debug/functions`
+The value of x is: 5
+
+

another_function 的声明中有一个命名为 x 的参数。x 的类型被指定为 i32。当我们将 5 传给 another_function 时,println! 宏会把 5 放在格式字符串中包含 x 的那对花括号的位置。

+

在函数签名中,必须 声明每个参数的类型。这是 Rust 设计中一个经过慎重考虑的决定:要求在函数定义中提供类型注解,意味着编译器再也不需要你在代码的其他地方注明类型来指出你的意图。而且,在知道函数需要什么类型后,编译器就能够给出更有用的错误消息。

+

当定义多个参数时,使用逗号分隔,像这样:

+

文件名:src/main.rs

+
fn main() {
+    print_labeled_measurement(5, 'h');
+}
+
+fn print_labeled_measurement(value: i32, unit_label: char) {
+    println!("The measurement is: {value}{unit_label}");
+}
+

这个例子创建了一个名为 print_labeled_measurement 的函数,它有两个参数。第一个参数名为 value,类型是 i32。第二个参数是 unit_label ,类型是 char。然后,该函数打印包含 valueunit_label 的文本。

+

尝试运行代码。使用上面的例子替换当前 functions 项目的 src/main.rs 文件,并用 cargo run 运行它:

+
$ cargo run
+   Compiling functions v0.1.0 (file:///projects/functions)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
+     Running `target/debug/functions`
+The measurement is: 5h
+
+

因为我们使用 5 作为 value 的值,h 作为 unit_label 的值来调用函数,所以程序输出包含这些值。

+

语句和表达式

+

函数体由一系列的语句和一个可选的结尾表达式构成。目前为止,我们提到的函数还不包含结尾表达式,不过你已经见过作为语句一部分的表达式。因为 Rust 是一门基于表达式(expression-based)的语言,这是一个需要理解的(不同于其他语言)重要区别。其他语言并没有这样的区别,所以让我们看看语句与表达式有什么区别以及这些区别是如何影响函数体的。

+

语句Statements)是执行一些操作但不返回值的指令。 +表达式Expressions)计算并产生一个值。让我们看一些例子。

+

实际上,我们已经使用过语句和表达式。使用 let 关键字创建变量并绑定一个值是一个语句。在列表 3-1 中,let y = 6; 是一个语句。

+

文件名:src/main.rs

+
fn main() {
+    let y = 6;
+}
+

列表 3-1:包含一个语句的 main 函数定义

+

函数定义也是语句,上面整个例子本身就是一个语句。

+

语句不返回值。因此,不能把 let 语句赋值给另一个变量,比如下面的例子尝试做的,会产生一个错误:

+

文件名:src/main.rs

+
fn main() {
+    let x = (let y = 6);
+}
+

当运行这个程序时,会得到如下错误:

+
$ cargo run
+   Compiling functions v0.1.0 (file:///projects/functions)
+error: expected expression, found `let` statement
+ --> src/main.rs:2:14
+  |
+2 |     let x = (let y = 6);
+  |              ^^^
+  |
+  = note: only supported directly in conditions of `if` and `while` expressions
+
+warning: unnecessary parentheses around assigned value
+ --> src/main.rs:2:13
+  |
+2 |     let x = (let y = 6);
+  |             ^         ^
+  |
+  = note: `#[warn(unused_parens)]` on by default
+help: remove these parentheses
+  |
+2 -     let x = (let y = 6);
+2 +     let x = let y = 6;
+  |
+
+warning: `functions` (bin "functions") generated 1 warning
+error: could not compile `functions` (bin "functions") due to 1 previous error; 1 warning emitted
+
+

let y = 6 语句并不返回值,所以没有可以绑定到 x 上的值。这与其他语言不同,例如 C 和 Ruby,它们的赋值语句会返回所赋的值。在这些语言中,可以这么写 x = y = 6,这样 xy 的值都是 6;Rust 中不能这样写。

+

表达式会计算出一个值,并且你将编写的大部分 Rust 代码是由表达式组成的。考虑一个数学运算,比如 5 + 6,这是一个表达式并计算出值 11。表达式可以是语句的一部分:在示例 3-1 中,语句 let y = 6; 中的 6 是一个表达式,它计算出的值是 6。函数调用是一个表达式。宏调用是一个表达式。用大括号创建的一个新的块作用域也是一个表达式,例如:

+

文件名:src/main.rs

+
fn main() {
+    let y = {
+        let x = 3;
+        x + 1
+    };
+
+    println!("The value of y is: {y}");
+}
+

这个表达式:

+
{
+    let x = 3;
+    x + 1
+}
+

是一个代码块,它的值是 4。这个值作为 let 语句的一部分被绑定到 y 上。注意 x+1 这一行在结尾没有分号,与你见过的大部分代码行不同。表达式的结尾没有分号。如果在表达式的结尾加上分号,它就变成了语句,而语句不会返回值。在接下来探索具有返回值的函数和表达式时要谨记这一点。

+

具有返回值的函数

+

函数可以向调用它的代码返回值。我们并不对返回值命名,但要在箭头(->)后声明它的类型。在 Rust 中,函数的返回值等同于函数体最后一个表达式的值。使用 return 关键字和指定值,可从函数中提前返回;但大部分函数隐式的返回最后的表达式。这是一个有返回值的函数的例子:

+

文件名:src/main.rs

+
fn five() -> i32 {
+    5
+}
+
+fn main() {
+    let x = five();
+
+    println!("The value of x is: {x}");
+}
+

five 函数中没有函数调用、宏、甚至没有 let 语句 —— 只有数字 5。这在 Rust 中是一个完全有效的函数。注意,也指定了函数返回值的类型,就是 -> i32。尝试运行代码;输出应该看起来像这样:

+
$ cargo run
+   Compiling functions v0.1.0 (file:///projects/functions)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s
+     Running `target/debug/functions`
+The value of x is: 5
+
+

five 函数的返回值是 5,所以返回值类型是 i32。让我们仔细检查一下这段代码。有两个重要的部分:首先,let x = five(); 这一行表明我们使用函数的返回值初始化一个变量。因为 five 函数返回 5,这一行与如下代码相同:

+
#![allow(unused)]
+fn main() {
+let x = 5;
+}
+

其次,five 函数没有参数并定义了返回值类型,不过函数体只有单单一个 5 也没有分号,因为这是一个表达式,我们想要返回它的值。

+

让我们看看另一个例子:

+

文件名:src/main.rs

+
fn main() {
+    let x = plus_one(5);
+
+    println!("The value of x is: {x}");
+}
+
+fn plus_one(x: i32) -> i32 {
+    x + 1
+}
+

运行代码会打印出 The value of x is: 6。但如果在包含 x + 1 的行尾加上一个分号,把它从表达式变成语句,我们将看到一个错误。

+

文件名:src/main.rs

+
fn main() {
+    let x = plus_one(5);
+
+    println!("The value of x is: {x}");
+}
+
+fn plus_one(x: i32) -> i32 {
+    x + 1;
+}
+

运行代码会产生一个错误,如下:

+
$ cargo run
+   Compiling functions v0.1.0 (file:///projects/functions)
+error[E0308]: mismatched types
+ --> src/main.rs:7:24
+  |
+7 | fn plus_one(x: i32) -> i32 {
+  |    --------            ^^^ expected `i32`, found `()`
+  |    |
+  |    implicitly returns `()` as its body has no tail or `return` expression
+8 |     x + 1;
+  |          - help: remove this semicolon to return this value
+
+For more information about this error, try `rustc --explain E0308`.
+error: could not compile `functions` (bin "functions") due to 1 previous error
+
+

主要的错误信息,“mismatched types”(类型不匹配),揭示了代码的核心问题。函数 plus_one 的定义说明它要返回一个 i32 类型的值,不过语句并不会返回值,使用单位类型 () 表示不返回值。因为不返回值与函数定义相矛盾,从而出现一个错误。在输出中,Rust 提供了一条信息,可能有助于纠正这个错误:它建议删除分号,这会修复这个错误。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch03-04-comments.html b/ch03-04-comments.html new file mode 100644 index 000000000..79c196708 --- /dev/null +++ b/ch03-04-comments.html @@ -0,0 +1,269 @@ + + + + + + 注释 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

注释

+
+

ch03-04-comments.md +
+commit d0acb2595c891de97a133d06635c50ab449dd65c

+
+

所有程序员都力求使其代码易于理解,不过有时还需要提供额外的解释。在这种情况下,程序员在源码中留下 注释comments),编译器会忽略它们,不过阅读代码的人可能觉得有用。

+

这是一个简单的注释:

+
#![allow(unused)]
+fn main() {
+// hello, world
+}
+

在 Rust 中,惯用的注释样式是以两个斜杠开始注释,并持续到本行的结尾。对于超过一行的注释,需要在每一行前都加上 //,像这样:

+
#![allow(unused)]
+fn main() {
+// So we’re doing something complicated here, long enough that we need
+// multiple lines of comments to do it! Whew! Hopefully, this comment will
+// explain what’s going on.
+}
+

注释也可以放在包含代码的行的末尾:

+

文件名:src/main.rs

+
fn main() {
+    let lucky_number = 7; // I’m feeling lucky today
+}
+

不过你更经常看到的是以这种格式使用它们,也就是位于它所解释的代码行的上面一行:

+

文件名:src/main.rs

+
fn main() {
+    // I’m feeling lucky today
+    let lucky_number = 7;
+}
+

Rust 还有另一种注释,称为文档注释,我们将在 14 章的 “将 crate 发布到 Crates.io” 部分讨论它。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch03-05-control-flow.html b/ch03-05-control-flow.html new file mode 100644 index 000000000..a359b2542 --- /dev/null +++ b/ch03-05-control-flow.html @@ -0,0 +1,536 @@ + + + + + + 控制流 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

控制流

+
+

ch03-05-control-flow.md +
+commit d0acb2595c891de97a133d06635c50ab449dd65c

+
+

根据条件是否为真来决定是否执行某些代码,以及根据条件是否为真来重复运行一段代码的能力是大部分编程语言的基本组成部分。Rust 代码中最常见的用来控制执行流的结构是 if 表达式和循环。

+

if 表达式

+

if 表达式允许根据条件执行不同的代码分支。你提供一个条件并表示 “如果条件满足,运行这段代码;如果条件不满足,不运行这段代码。

+

projects 目录新建一个叫做 branches 的项目,来学习 if 表达式。在 src/main.rs 文件中,输入如下内容:

+

文件名:src/main.rs

+
fn main() {
+    let number = 3;
+
+    if number < 5 {
+        println!("condition was true");
+    } else {
+        println!("condition was false");
+    }
+}
+

所有的 if 表达式都以 if 关键字开头,其后跟一个条件。在这个例子中,条件检查变量 number 的值是否小于 5。在条件为 true 时希望执行的代码块位于紧跟条件之后的大括号中。if 表达式中与条件关联的代码块有时被叫做 arms,就像第二章 “比较猜测的数字和秘密数字” 部分中讨论到的 match 表达式中的分支一样。

+

也可以包含一个可选的 else 表达式来提供一个在条件为 false 时应当执行的代码块,这里我们就这么做了。如果不提供 else 表达式并且条件为 false 时,程序会直接忽略 if 代码块并继续执行下面的代码。

+

尝试运行代码,应该能看到如下输出:

+
$ cargo run
+   Compiling branches v0.1.0 (file:///projects/branches)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
+     Running `target/debug/branches`
+condition was true
+
+

尝试改变 number 的值使条件为 false 时看看会发生什么:

+
fn main() {
+    let number = 7;
+
+    if number < 5 {
+        println!("condition was true");
+    } else {
+        println!("condition was false");
+    }
+}
+

再次运行程序并查看输出:

+
$ cargo run
+   Compiling branches v0.1.0 (file:///projects/branches)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
+     Running `target/debug/branches`
+condition was false
+
+

另外值得注意的是代码中的条件 必须bool 值。如果条件不是 bool 值,我们将得到一个错误。例如,尝试运行以下代码:

+

文件名:src/main.rs

+
fn main() {
+    let number = 3;
+
+    if number {
+        println!("number was three");
+    }
+}
+

这里 if 条件的值是 3,Rust 抛出了一个错误:

+
$ cargo run
+   Compiling branches v0.1.0 (file:///projects/branches)
+error[E0308]: mismatched types
+ --> src/main.rs:4:8
+  |
+4 |     if number {
+  |        ^^^^^^ expected `bool`, found integer
+
+For more information about this error, try `rustc --explain E0308`.
+error: could not compile `branches` (bin "branches") due to 1 previous error
+
+

这个错误表明 Rust 期望一个 bool 却得到了一个整数。不像 Ruby 或 JavaScript 这样的语言,Rust 并不会尝试自动地将非布尔值转换为布尔值。必须总是显式地使用布尔值作为 if 的条件。例如,如果想要 if 代码块只在一个数字不等于 0 时执行,可以把 if 表达式修改成下面这样:

+

文件名:src/main.rs

+
fn main() {
+    let number = 3;
+
+    if number != 0 {
+        println!("number was something other than zero");
+    }
+}
+

运行代码会打印出 number was something other than zero

+

使用 else if 处理多重条件

+

可以将 else if 表达式与 ifelse 组合来实现多重条件。例如:

+

文件名:src/main.rs

+
fn main() {
+    let number = 6;
+
+    if number % 4 == 0 {
+        println!("number is divisible by 4");
+    } else if number % 3 == 0 {
+        println!("number is divisible by 3");
+    } else if number % 2 == 0 {
+        println!("number is divisible by 2");
+    } else {
+        println!("number is not divisible by 4, 3, or 2");
+    }
+}
+

这个程序有四个可能的执行路径。运行后应该能看到如下输出:

+
$ cargo run
+   Compiling branches v0.1.0 (file:///projects/branches)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
+     Running `target/debug/branches`
+number is divisible by 3
+
+

当执行这个程序时,它按顺序检查每个 if 表达式并执行第一个条件为 true 的代码块。注意即使 6 可以被 2 整除,也不会输出 number is divisible by 2,更不会输出 else 块中的 number is not divisible by 4, 3, or 2。原因是 Rust 只会执行第一个条件为 true 的代码块,并且一旦它找到一个以后,甚至都不会检查剩下的条件了。

+

使用过多的 else if 表达式会使代码显得杂乱无章,所以如果有多于一个 else if 表达式,最好重构代码。为此,第六章会介绍一个强大的 Rust 分支结构(branching construct),叫做 match

+

let 语句中使用 if

+

因为 if 是一个表达式,我们可以在 let 语句的右侧使用它,例如在示例 3-2 中:

+

文件名:src/main.rs

+
fn main() {
+    let condition = true;
+    let number = if condition { 5 } else { 6 };
+
+    println!("The value of number is: {number}");
+}
+

示例 3-2:将 if 表达式的返回值赋给一个变量

+

number 变量将会绑定到表示 if 表达式结果的值上。运行这段代码看看会出现什么:

+
$ cargo run
+   Compiling branches v0.1.0 (file:///projects/branches)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s
+     Running `target/debug/branches`
+The value of number is: 5
+
+

记住,代码块的值是其最后一个表达式的值,而数字本身就是一个表达式。在这个例子中,整个 if 表达式的值取决于哪个代码块被执行。这意味着 if 的每个分支的可能的返回值都必须是相同类型;在示例 3-2 中,if 分支和 else 分支的结果都是 i32 整型。如果它们的类型不匹配,如下面这个例子,则会出现一个错误:

+

文件名:src/main.rs

+
fn main() {
+    let condition = true;
+
+    let number = if condition { 5 } else { "six" };
+
+    println!("The value of number is: {number}");
+}
+

当编译这段代码时,会得到一个错误。ifelse 分支的值类型是不相容的,同时 Rust 也准确地指出在程序中的何处发现的这个问题:

+
$ cargo run
+   Compiling branches v0.1.0 (file:///projects/branches)
+error[E0308]: `if` and `else` have incompatible types
+ --> src/main.rs:4:44
+  |
+4 |     let number = if condition { 5 } else { "six" };
+  |                                 -          ^^^^^ expected integer, found `&str`
+  |                                 |
+  |                                 expected because of this
+
+For more information about this error, try `rustc --explain E0308`.
+error: could not compile `branches` (bin "branches") due to 1 previous error
+
+

if 代码块中的表达式返回一个整数,而 else 代码块中的表达式返回一个字符串。这不可行,因为变量必须只有一个类型。Rust 需要在编译时就确切的知道 number 变量的类型,这样它就可以在编译时验证在每处使用的 number 变量的类型是有效的。如果number的类型仅在运行时确定,则 Rust 无法做到这一点;且编译器必须跟踪每一个变量的多种假设类型,那么它就会变得更加复杂,对代码的保证也会减少。

+

使用循环重复执行

+

多次执行同一段代码是很常用的,Rust 为此提供了多种 循环loops)。一个循环执行循环体中的代码直到结尾并紧接着回到开头继续执行。为了实验一下循环,让我们新建一个叫做 loops 的项目。

+

Rust 有三种循环:loopwhilefor。我们每一个都试试。

+

使用 loop 重复执行代码

+

loop 关键字告诉 Rust 一遍又一遍地执行一段代码直到你明确要求停止。

+

作为一个例子,将 loops 目录中的 src/main.rs 文件修改为如下:

+

文件名:src/main.rs

+
fn main() {
+    loop {
+        println!("again!");
+    }
+}
+

当运行这个程序时,我们会看到连续的反复打印 again!,直到我们手动停止程序。大部分终端都支持一个快捷键,ctrl-c,来终止一个陷入无限循环的程序。尝试一下:

+
$ cargo run
+   Compiling loops v0.1.0 (file:///projects/loops)
+    Finished dev [unoptimized + debuginfo] target(s) in 0.29s
+     Running `target/debug/loops`
+again!
+again!
+again!
+again!
+^Cagain!
+
+

符号 ^C 代表你在这按下了ctrl-c。在 ^C 之后你可能看到也可能看不到 again! ,这取决于在接收到终止信号时代码执行到了循环的何处。

+

幸运的是,Rust 提供了一种从代码中跳出循环的方法。可以使用 break 关键字来告诉程序何时停止循环。回忆一下在第二章猜猜看游戏的 “猜测正确后退出” 部分使用过它来在用户猜对数字赢得游戏后退出程序。

+

我们在猜谜游戏中也使用了 continue。循环中的 continue 关键字告诉程序跳过这个循环迭代中的任何剩余代码,并转到下一个迭代。

+

从循环返回值

+

loop 的一个用例是重试可能会失败的操作,比如检查线程是否完成了任务。然而你可能会需要将操作的结果传递给其它的代码。如果将返回值加入你用来停止循环的 break 表达式,它会被停止的循环返回:

+
fn main() {
+    let mut counter = 0;
+
+    let result = loop {
+        counter += 1;
+
+        if counter == 10 {
+            break counter * 2;
+        }
+    };
+
+    println!("The result is {result}");
+}
+

在循环之前,我们声明了一个名为 counter 的变量并初始化为 0。接着声明了一个名为 result 来存放循环的返回值。在循环的每一次迭代中,我们将 counter 变量加 1,接着检查计数是否等于 10。当相等时,使用 break 关键字返回值 counter * 2。循环之后,我们通过分号结束赋值给 result 的语句。最后打印出 result 的值,也就是 20

+

循环标签:在多个循环之间消除歧义

+

如果存在嵌套循环,breakcontinue 应用于此时最内层的循环。你可以选择在一个循环上指定一个 循环标签loop label),然后将标签与 breakcontinue 一起使用,使这些关键字应用于已标记的循环而不是最内层的循环。下面是一个包含两个嵌套循环的示例

+
fn main() {
+    let mut count = 0;
+    'counting_up: loop {
+        println!("count = {count}");
+        let mut remaining = 10;
+
+        loop {
+            println!("remaining = {remaining}");
+            if remaining == 9 {
+                break;
+            }
+            if count == 2 {
+                break 'counting_up;
+            }
+            remaining -= 1;
+        }
+
+        count += 1;
+    }
+    println!("End count = {count}");
+}
+

外层循环有一个标签 counting_up,它将从 0 数到 2。没有标签的内部循环从 10 向下数到 9。第一个没有指定标签的 break 将只退出内层循环。break 'counting_up; 语句将退出外层循环。这个代码打印:

+
$ cargo run
+   Compiling loops v0.1.0 (file:///projects/loops)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.58s
+     Running `target/debug/loops`
+count = 0
+remaining = 10
+remaining = 9
+count = 1
+remaining = 10
+remaining = 9
+count = 2
+remaining = 10
+End count = 2
+
+

while 条件循环

+

在程序中计算循环的条件也很常见。当条件为 true,执行循环。当条件不再为 true,调用 break 停止循环。这个循环类型可以通过组合 loopifelsebreak 来实现;如果你喜欢的话,现在就可以在程序中试试。

+

然而,这个模式太常用了,Rust 为此内置了一个语言结构,它被称为 while 循环。示例 3-3 使用了 while:程序循环三次,每次数字都减一。接着,在循环结束后,打印出另一个信息并退出。

+

文件名:src/main.rs

+
fn main() {
+    let mut number = 3;
+
+    while number != 0 {
+        println!("{number}!");
+
+        number -= 1;
+    }
+
+    println!("LIFTOFF!!!");
+}
+

示例 3-3: 当条件为真时,使用 while 循环运行代码

+

这种结构消除了很多使用 loopifelsebreak 时所必须的嵌套,这样更加清晰。当条件为 true 就执行,否则退出循环。

+

使用 for 遍历集合

+

可以使用 while 结构来遍历集合中的元素,比如数组。例如,看看示例 3-4。

+

文件名:src/main.rs

+
fn main() {
+    let a = [10, 20, 30, 40, 50];
+    let mut index = 0;
+
+    while index < 5 {
+        println!("the value is: {}", a[index]);
+
+        index += 1;
+    }
+}
+

示例 3-4:使用 while 循环遍历集合中的元素

+

这里,代码对数组中的元素进行计数。它从索引 0 开始,并接着循环直到遇到数组的最后一个索引(这时,index < 5 不再为真)。运行这段代码会打印出数组中的每一个元素:

+
$ cargo run
+   Compiling loops v0.1.0 (file:///projects/loops)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.32s
+     Running `target/debug/loops`
+the value is: 10
+the value is: 20
+the value is: 30
+the value is: 40
+the value is: 50
+
+

数组中的所有五个元素都如期被打印出来。尽管 index 在某一时刻会到达值 5,不过循环在其尝试从数组获取第六个值(会越界)之前就停止了。

+

但这个过程很容易出错;如果索引长度或测试条件不正确会导致程序 panic。例如,如果将 a 数组的定义改为包含 4 个元素而忘记了更新条件 while index < 4,则代码会 panic。这也使程序更慢,因为编译器增加了运行时代码来对每次循环进行条件检查,以确定在循环的每次迭代中索引是否在数组的边界内。

+

作为更简洁的替代方案,可以使用 for 循环来对一个集合的每个元素执行一些代码。for 循环看起来如示例 3-5 所示:

+

文件名:src/main.rs

+
fn main() {
+    let a = [10, 20, 30, 40, 50];
+
+    for element in a {
+        println!("the value is: {element}");
+    }
+}
+

示例 3-5:使用 for 循环遍历集合中的元素

+

当运行这段代码时,将看到与示例 3-4 一样的输出。更为重要的是,我们增强了代码安全性,并消除了可能由于超出数组的结尾或遍历长度不够而缺少一些元素而导致的 bug。

+

例如,在示例 3-4 的代码中,如果你将 a 数组的定义改为有四个元素,但忘记将条件更新为 while index < 4,代码将会 panic。使用 for 循环的话,就不需要惦记着在改变数组元素个数时修改其他的代码了。

+

for 循环的安全性和简洁性使得它成为 Rust 中使用最多的循环结构。即使是在想要循环执行代码特定次数时,例如示例 3-3 中使用 while 循环的倒计时例子,大部分 Rustacean 也会使用 for 循环。这么做的方式是使用 Range,它是标准库提供的类型,用来生成从一个数字开始到另一个数字之前结束的所有数字的序列。

+

下面是一个使用 for 循环来倒计时的例子,它还使用了一个我们还未讲到的方法,rev,用来反转 range。

+

注意:以下代码不会踏足到数字 4,仅从一个数字开始到另一个数字之前。

+

文件名:src/main.rs

+
fn main() {
+    for number in (1..4).rev() {
+        println!("{number}!");
+    }
+    println!("LIFTOFF!!!");
+}
+

这段代码看起来更帅气不是吗?

+

总结

+

你做到了!这是一个大章节:你学习了变量、标量和复合数据类型、函数、注释、 if 表达式和循环!如果你想要实践本章讨论的概念,尝试构建如下程序:

+
    +
  • 相互转换摄氏与华氏温度。
  • +
  • 生成第 n 个斐波那契数。
  • +
  • 打印圣诞颂歌 “The Twelve Days of Christmas” 的歌词,并利用歌曲中的重复部分(编写循环)。
  • +
+

当你准备好继续的时候,让我们讨论一个其他语言中 并不 常见的概念:所有权(ownership)。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch04-00-understanding-ownership.html b/ch04-00-understanding-ownership.html new file mode 100644 index 000000000..6679d38a4 --- /dev/null +++ b/ch04-00-understanding-ownership.html @@ -0,0 +1,245 @@ + + + + + + 认识所有权 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

认识所有权

+
+

ch04-00-understanding-ownership.md +
+commit a5e0c5b2c5f9054be3b961aea2c7edfeea591de8

+
+

所有权(系统)是 Rust 最为与众不同的特性,对语言的其他部分有着深刻含义。它让 Rust 无需垃圾回收(garbage collector)即可保障内存安全,因此理解 Rust 中所有权如何工作是十分重要的。本章,我们将讲到所有权以及相关功能:借用(borrowing)、slice 以及 Rust 如何在内存中布局数据。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch04-01-what-is-ownership.html b/ch04-01-what-is-ownership.html new file mode 100644 index 000000000..5cb7ed551 --- /dev/null +++ b/ch04-01-what-is-ownership.html @@ -0,0 +1,514 @@ + + + + + + 什么是所有权? - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

什么是所有权?

+
+

ch04-01-what-is-ownership.md +
+commit 3d51f70c78162faaebcab0da0de2ddd333e7a8ed

+
+

所有权ownership)是 Rust 用于如何管理内存的一组规则。所有程序都必须管理其运行时使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时有规律地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则,程序都不能编译。在运行时,所有权系统的任何功能都不会减慢程序。

+

因为所有权对很多程序员来说都是一个新概念,需要一些时间来适应。好消息是随着你对 Rust 和所有权系统的规则越来越有经验,你就越能自然地编写出安全和高效的代码。持之以恒!

+

当你理解了所有权,你将有一个坚实的基础来理解那些使 Rust 独特的功能。在本章中,你将通过完成一些示例来学习所有权,这些示例基于一个常用的数据结构:字符串。

+
+

栈(Stack)与堆(Heap)

+

在很多语言中,你并不需要经常考虑到栈与堆。不过在像 Rust 这样的系统编程语言中,值是位于栈上还是堆上在更大程度上影响了语言的行为以及为何必须做出这样的抉择。我们会在本章的稍后部分描述所有权与栈和堆相关的内容,所以这里只是一个用来预热的简要解释。

+

栈和堆都是代码在运行时可供使用的内存,但是它们的结构不同。栈以放入值的顺序存储值并以相反顺序取出值。这也被称作 后进先出last in, first out)。想象一下一叠盘子:当增加更多盘子时,把它们放在盘子堆的顶部,当需要盘子时,也从顶部拿走。不能从中间也不能从底部增加或拿走盘子!增加数据叫做 进栈pushing onto the stack),而移出数据叫做 出栈popping off the stack)。栈中的所有数据都必须占用已知且固定的大小。在编译时大小未知或大小可能变化的数据,要改为存储在堆上。 +堆是缺乏组织的:当向堆放入数据时,你要请求一定大小的空间。内存分配器(memory allocator)在堆的某处找到一块足够大的空位,把它标记为已使用,并返回一个表示该位置地址的 指针pointer)。这个过程称作 在堆上分配内存allocating on the heap),有时简称为 “分配”(allocating)。(将数据推入栈中并不被认为是分配)。因为指向放入堆中数据的指针是已知的并且大小是固定的,你可以将该指针存储在栈上,不过当需要实际数据时,必须访问指针。想象一下去餐馆就座吃饭。当进入时,你说明有几个人,餐馆员工会找到一个够大的空桌子并领你们过去。如果有人来迟了,他们也可以通过询问来找到你们坐在哪。

+

入栈比在堆上分配内存要快,因为(入栈时)分配器无需为存储新数据去搜索内存空间;其位置总是在栈顶。相比之下,在堆上分配内存则需要更多的工作,这是因为分配器必须首先找到一块足够存放数据的内存空间,并接着做一些记录为下一次分配做准备。

+

访问堆上的数据比访问栈上的数据慢,因为必须通过指针来访问。现代处理器在内存中跳转越少就越快(缓存)。继续类比,假设有一个服务员在餐厅里处理多个桌子的点菜。在一个桌子报完所有菜后再移动到下一个桌子是最有效率的。从桌子 A 听一个菜,接着桌子 B 听一个菜,然后再桌子 A,然后再桌子 B 这样的流程会更加缓慢。出于同样原因,处理器在处理的数据彼此较近的时候(比如在栈上)比较远的时候(比如可能在堆上)能更好的工作。

+

当你的代码调用一个函数时,传递给函数的值(包括可能指向堆上数据的指针)和函数的局部变量被压入栈中。当函数结束时,这些值被移出栈。

+

跟踪哪部分代码正在使用堆上的哪些数据,最大限度的减少堆上的重复数据的数量,以及清理堆上不再使用的数据确保不会耗尽空间,这些问题正是所有权系统要处理的。一旦理解了所有权,你就不需要经常考虑栈和堆了,不过明白了所有权的主要目的就是管理堆数据,能够帮助解释为什么所有权要以这种方式工作。

+
+

所有权规则

+

首先,让我们看一下所有权的规则。当我们通过举例说明时,请谨记这些规则:

+
+
    +
  1. Rust 中的每一个值都有一个 所有者owner)。
  2. +
  3. 值在任一时刻有且只有一个所有者。
  4. +
  5. 当所有者(变量)离开作用域,这个值将被丢弃。
  6. +
+
+

变量作用域

+

既然我们已经掌握了基本语法,将不会在之后的例子中包含 fn main() { 代码,所以如果你是一路跟过来的,必须手动将之后例子的代码放入一个 main 函数中。这样,例子将显得更加简明,使我们可以关注实际细节而不是样板代码。

+

在所有权的第一个例子中,我们看看一些变量的 作用域scope)。作用域是一个项(item)在程序中有效的范围。假设有这样一个变量:

+
#![allow(unused)]
+fn main() {
+let s = "hello";
+}
+

变量 s 绑定到了一个字符串字面值,这个字符串值是硬编码进程序代码中的。这个变量从声明的点开始直到当前 作用域 结束时都是有效的。示例 4-1 中的注释标明了变量 s 在何处是有效的。

+
fn main() {
+    {                      // s 在这里无效,它尚未声明
+        let s = "hello";   // 从此处起,s 是有效的
+
+        // 使用 s
+    }                      // 此作用域已结束,s 不再有效
+}
+

示例 4-1:一个变量和其有效的作用域

+

换句话说,这里有两个重要的时间点:

+
    +
  • s 进入作用域 时,它就是有效的。
  • +
  • 这一直持续到它 离开作用域 为止。
  • +
+

目前为止,变量是否有效与作用域的关系跟其他编程语言是类似的。现在我们在此基础上介绍 String 类型。

+

String 类型

+

为了演示所有权的规则,我们需要一个比第三章 “数据类型” 中讲到的都要复杂的数据类型。前面介绍的类型都是已知大小的,可以存储在栈中,并且当离开作用域时被移出栈,如果代码的另一部分需要在不同的作用域中使用相同的值,可以快速简单地复制它们来创建一个新的独立实例。不过我们需要寻找一个存储在堆上的数据来探索 Rust 是如何知道该在何时清理数据的。

+

我们会专注于 String 与所有权相关的部分。这些方面也同样适用于标准库提供的或你自己创建的其他复杂数据类型。在第八章会更深入地讲解 String

+

我们已经见过字符串字面值,即被硬编码进程序里的字符串值。字符串字面值是很方便的,不过它们并不适合使用文本的每一种场景。原因之一就是它们是不可变的。另一个原因是并非所有字符串的值都能在编写代码时就知道:例如,要是想获取用户输入并存储该怎么办呢?为此,Rust 有另一种字符串类型,String。这个类型管理被分配到堆上的数据,所以能够存储在编译时未知大小的文本。可以使用 from 函数基于字符串字面值来创建 String,如下:

+
#![allow(unused)]
+fn main() {
+let s = String::from("hello");
+}
+

这两个冒号 :: 是运算符,允许将特定的 from 函数置于 String 类型的命名空间(namespace)下,而不需要使用类似 string_from 这样的名字。在第五章的 “方法语法”(“Method Syntax”) 部分会着重讲解这个语法,而且在第七章的 “路径用于引用模块树中的项” 中会讲到模块的命名空间。

+

可以 修改此类字符串:

+
fn main() {
+    let mut s = String::from("hello");
+
+    s.push_str(", world!"); // push_str() 在字符串后追加字面值
+
+    println!("{s}"); // 将打印 `hello, world!`
+}
+

那么这里有什么区别呢?为什么 String 可变而字面值却不行呢?区别在于两个类型对内存的处理上。

+

内存与分配

+

就字符串字面值来说,我们在编译时就知道其内容,所以文本被直接硬编码进最终的可执行文件中。这使得字符串字面值快速且高效。不过这些特性都只得益于字符串字面值的不可变性。不幸的是,我们不能为了每一个在编译时大小未知的文本而将一块内存放入二进制文件中,并且它的大小还可能随着程序运行而改变。

+

对于 String 类型,为了支持一个可变,可增长的文本片段,需要在堆上分配一块在编译时未知大小的内存来存放内容。这意味着:

+
    +
  • 必须在运行时向内存分配器(memory allocator)请求内存。
  • +
  • 需要一个当我们处理完 String 时将内存返回给分配器的方法。
  • +
+

第一部分由我们完成:当调用 String::from 时,它的实现 (implementation) 请求其所需的内存。这在编程语言中是非常通用的。

+

然而,第二部分实现起来就各有区别了。在有 垃圾回收garbage collectorGC)的语言中,GC 记录并清除不再使用的内存,而我们并不需要关心它。在大部分没有 GC 的语言中,识别出不再使用的内存并调用代码显式释放就是我们的责任了,跟请求内存的时候一样。从历史的角度上说正确处理内存回收曾经是一个困难的编程问题。如果忘记回收了会浪费内存。如果过早回收了,将会出现无效变量。如果重复回收,这也是个 bug。我们需要精确的为一个 allocate 配对一个 free

+

Rust 采取了一个不同的策略:内存在拥有它的变量离开作用域后就被自动释放。下面是示例 4-1 中作用域例子的一个使用 String 而不是字符串字面值的版本:

+
fn main() {
+    {
+        let s = String::from("hello"); // 从此处起,s 是有效的
+
+        // 使用 s
+    }                                  // 此作用域已结束,
+                                       // s 不再有效
+}
+

这是一个将 String 需要的内存返回给分配器的很自然的位置:当 s 离开作用域的时候。当变量离开作用域,Rust 为我们调用一个特殊的函数。这个函数叫做 drop,在这里 String 的作者可以放置释放内存的代码。Rust 在结尾的 } 处自动调用 drop

+
+

注意:在 C++ 中,这种 item 在生命周期结束时释放资源的模式有时被称作 资源获取即初始化Resource Acquisition Is Initialization (RAII))。如果你使用过 RAII 模式的话应该对 Rust 的 drop 函数并不陌生。

+
+

这个模式对编写 Rust 代码的方式有着深远的影响。现在它看起来很简单,不过在更复杂的场景下代码的行为可能是不可预测的,比如当有多个变量使用在堆上分配的内存时。现在让我们探索一些这样的场景。

+

+

变量与数据交互的方式(一):移动

+

在 Rust 中,多个变量可以采取不同的方式与同一数据进行交互。让我们看看示例 4-2 中一个使用整型的例子。

+
fn main() {
+    let x = 5;
+    let y = x;
+}
+

示例 4-2:将变量 x 的整数值赋给 y

+

我们大致可以猜到这在干什么:“将 5 绑定到 x;接着生成一个值 x 的拷贝并绑定到 y”。现在有了两个变量,xy,都等于 5。这也正是事实上发生了的,因为整数是有已知固定大小的简单值,所以这两个 5 被放入了栈中。

+

现在看看这个 String 版本:

+
fn main() {
+    let s1 = String::from("hello");
+    let s2 = s1;
+}
+

这看起来与上面的代码非常类似,所以我们可能会假设它们的运行方式也是类似的:也就是说,第二行可能会生成一个 s1 的拷贝并绑定到 s2 上。不过,事实上并不完全是这样。

+

看看图 4-1 以了解 String 的底层会发生什么。String 由三部分组成,如图左侧所示:一个指向存放字符串内容内存的指针,一个长度,和一个容量。这一组数据存储在栈上。右侧则是堆上存放内容的内存部分。

+

Two tables: the first table contains the representation of s1 on the
+stack, consisting of its length (5), capacity (5), and a pointer to the first
+value in the second table. The second table contains the representation of the
+string data on the heap, byte by byte.

+

图 4-1:将值 "hello" 绑定给 s1String 在内存中的表现形式

+

长度表示 String 的内容当前使用了多少字节的内存。容量是 String 从分配器总共获取了多少字节的内存。长度与容量的区别是很重要的,不过在当前上下文中并不重要,所以现在可以忽略容量。

+

当我们将 s1 赋值给 s2String 的数据被复制了,这意味着我们从栈上拷贝了它的指针、长度和容量。我们并没有复制指针指向的堆上数据。换句话说,内存中数据的表现如图 4-2 所示。

+

Three tables: tables s1 and s2 representing those strings on the
+stack, respectively, and both pointing to the same string data on the heap.

+

图 4-2:变量 s2 的内存表现,它有一份 s1 指针、长度和容量的拷贝

+

这个表现形式看起来 并不像 图 4-3 中的那样,如果 Rust 也拷贝了堆上的数据,那么内存看起来就是这样的。如果 Rust 这么做了,那么操作 s2 = s1 在堆上数据比较大的时候会对运行时性能造成非常大的影响。

+

Four tables: two tables representing the stack data for s1 and s2,
+and each points to its own copy of string data on the heap.

+

图 4-3:另一个 s2 = s1 时可能的内存表现,如果 Rust 同时也拷贝了堆上的数据的话

+

之前我们提到过当变量离开作用域后,Rust 自动调用 drop 函数并清理变量的堆内存。不过图 4-2 展示了两个数据指针指向了同一位置。这就有了一个问题:当 s2s1 离开作用域,它们都会尝试释放相同的内存。这是一个叫做 二次释放double free)的错误,也是之前提到过的内存安全性 bug 之一。两次释放(相同)内存会导致内存污染,它可能会导致潜在的安全漏洞。

+

为了确保内存安全,在 let s2 = s1; 之后,Rust 认为 s1 不再有效,因此 Rust 不需要在 s1 离开作用域后清理任何东西。看看在 s2 被创建之后尝试使用 s1 会发生什么;这段代码不能运行:

+
fn main() {
+    let s1 = String::from("hello");
+    let s2 = s1;
+
+    println!("{s1}, world!");
+}
+

你会得到一个类似如下的错误,因为 Rust 禁止你使用无效的引用。

+
$ cargo run
+   Compiling ownership v0.1.0 (file:///projects/ownership)
+error[E0382]: borrow of moved value: `s1`
+ --> src/main.rs:5:15
+  |
+2 |     let s1 = String::from("hello");
+  |         -- move occurs because `s1` has type `String`, which does not implement the `Copy` trait
+3 |     let s2 = s1;
+  |              -- value moved here
+4 |
+5 |     println!("{s1}, world!");
+  |               ^^^^ value borrowed here after move
+  |
+  = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider cloning the value if the performance cost is acceptable
+  |
+3 |     let s2 = s1.clone();
+  |                ++++++++
+
+For more information about this error, try `rustc --explain E0382`.
+error: could not compile `ownership` (bin "ownership") due to 1 previous error
+
+

如果你在其他语言中听说过术语 浅拷贝shallow copy)和 深拷贝deep copy),那么拷贝指针、长度和容量而不拷贝数据可能听起来像浅拷贝。不过因为 Rust 同时使第一个变量无效了,这个操作被称为 移动move),而不是叫做浅拷贝。上面的例子可以解读为 s1移动 到了 s2 中。那么具体发生了什么,如图 4-4 所示。

+

Three tables: tables s1 and s2 representing those strings on the
+stack, respectively, and both pointing to the same string data on the heap.
+Table s1 is grayed out be-cause s1 is no longer valid; only s2 can be used to
+access the heap data.

+

图 4-4:s1 无效之后的内存表现

+

这样就解决了我们的问题!因为只有 s2 是有效的,当其离开作用域,它就释放自己的内存,完毕。

+

另外,这里还隐含了一个设计选择:Rust 永远也不会自动创建数据的 “深拷贝”。因此,任何 自动 的复制都可以被认为是对运行时性能影响较小的。

+

+

变量与数据交互的方式(二):克隆

+

如果我们 确实 需要深度复制 String 中堆上的数据,而不仅仅是栈上的数据,可以使用一个叫做 clone 的通用函数。第五章会讨论方法语法,不过因为方法在很多语言中是一个常见功能,所以之前你可能已经见过了。

+

这是一个实际使用 clone 方法的例子:

+
fn main() {
+    let s1 = String::from("hello");
+    let s2 = s1.clone();
+
+    println!("s1 = {s1}, s2 = {s2}");
+}
+

这段代码能正常运行,并且明确产生图 4-3 中行为,这里堆上的数据 确实 被复制了。

+

当出现 clone 调用时,你知道一些特定的代码被执行而且这些代码可能相当消耗资源。你很容易察觉到一些不寻常的事情正在发生。

+

只在栈上的数据:拷贝

+

这里还有一个没有提到的小窍门。这些代码使用了整型并且是有效的,它们是示例 4-2 中的一部分:

+
fn main() {
+    let x = 5;
+    let y = x;
+
+    println!("x = {x}, y = {y}");
+}
+

但这段代码似乎与我们刚刚学到的内容相矛盾:没有调用 clone,不过 x 依然有效且没有被移动到 y 中。

+

原因是像整型这样的在编译时已知大小的类型被整个存储在栈上,所以拷贝其实际的值是快速的。这意味着没有理由在创建变量 y 后使 x 无效。换句话说,这里没有深浅拷贝的区别,所以这里调用 clone 并不会与通常的浅拷贝有什么不同,我们可以不用管它。

+

Rust 有一个叫做 Copy trait 的特殊注解,可以用在类似整型这样的存储在栈上的类型上(第十章将会详细讲解 trait)。如果一个类型实现了 Copy trait,那么一个旧的变量在将其赋值给其他变量后仍然可用。

+

Rust 不允许自身或其任何部分实现了 Drop trait 的类型使用 Copy trait。如果我们对其值离开作用域时需要特殊处理的类型使用 Copy 注解,将会出现一个编译时错误。要学习如何为你的类型添加 Copy 注解以实现该 trait,请阅读附录 C 中的 “可派生的 trait”

+

那么哪些类型实现了 Copy trait 呢?你可以查看给定类型的文档来确认,不过作为一个通用的规则,任何一组简单标量值的组合都可以实现 Copy,任何不需要分配内存或某种形式资源的类型都可以实现 Copy 。如下是一些 Copy 的类型:

+
    +
  • 所有整数类型,比如 u32
  • +
  • 布尔类型,bool,它的值是 truefalse
  • +
  • 所有浮点数类型,比如 f64
  • +
  • 字符类型,char
  • +
  • 元组,当且仅当其包含的类型也都实现 Copy 的时候。比如,(i32, i32) 实现了 Copy,但 (i32, String) 就没有。
  • +
+

所有权与函数

+

将值传递给函数与给变量赋值的原理相似。向函数传递值可能会移动或者复制,就像赋值语句一样。示例 4-3 使用注释展示变量何时进入和离开作用域:

+

文件名:src/main.rs

+
fn main() {
+    let s = String::from("hello");  // s 进入作用域
+
+    takes_ownership(s);             // s 的值移动到函数里 ...
+                                    // ... 所以到这里不再有效
+
+    let x = 5;                      // x 进入作用域
+
+    makes_copy(x);                  // x 应该移动函数里,
+                                    // 但 i32 是 Copy 的,
+                                    // 所以在后面可继续使用 x
+
+} // 这里,x 先移出了作用域,然后是 s。但因为 s 的值已被移走,
+  // 没有特殊之处
+
+fn takes_ownership(some_string: String) { // some_string 进入作用域
+    println!("{some_string}");
+} // 这里,some_string 移出作用域并调用 `drop` 方法。
+  // 占用的内存被释放
+
+fn makes_copy(some_integer: i32) { // some_integer 进入作用域
+    println!("{some_integer}");
+} // 这里,some_integer 移出作用域。没有特殊之处
+

示例 4-3:带有所有权和作用域注释的函数

+

当尝试在调用 takes_ownership 后使用 s 时,Rust 会抛出一个编译时错误。这些静态检查使我们免于犯错。试试在 main 函数中添加使用 sx 的代码来看看哪里能使用它们,以及所有权规则会在哪里阻止我们这么做。

+

返回值与作用域

+

返回值也可以转移所有权。示例 4-4 展示了一个返回了某些值的示例,与示例 4-3 一样带有类似的注释。

+

文件名:src/main.rs

+
fn main() {
+    let s1 = gives_ownership();         // gives_ownership 将返回值
+                                        // 转移给 s1
+
+    let s2 = String::from("hello");     // s2 进入作用域
+
+    let s3 = takes_and_gives_back(s2);  // s2 被移动到
+                                        // takes_and_gives_back 中,
+                                        // 它也将返回值移给 s3
+} // 这里,s3 移出作用域并被丢弃。s2 也移出作用域,但已被移走,
+  // 所以什么也不会发生。s1 离开作用域并被丢弃
+
+fn gives_ownership() -> String {             // gives_ownership 会将
+                                             // 返回值移动给
+                                             // 调用它的函数
+
+    let some_string = String::from("yours"); // some_string 进入作用域。
+
+    some_string                              // 返回 some_string 
+                                             // 并移出给调用的函数
+                                             // 
+}
+
+// takes_and_gives_back 将传入字符串并返回该值
+fn takes_and_gives_back(a_string: String) -> String { // a_string 进入作用域
+                                                      // 
+
+    a_string  // 返回 a_string 并移出给调用的函数
+}
+

示例 4-4: 转移返回值的所有权

+

变量的所有权总是遵循相同的模式:将值赋给另一个变量时移动它。当持有堆中数据值的变量离开作用域时,其值将通过 drop 被清理掉,除非数据被移动为另一个变量所有。

+

虽然这样是可以的,但是在每一个函数中都获取所有权并接着返回所有权有些啰嗦。如果我们想要函数使用一个值但不获取所有权该怎么办呢?如果我们还要接着使用它的话,每次都传进去再返回来就有点烦人了,除此之外,我们也可能想返回函数体中产生的一些数据。

+

我们可以使用元组来返回多个值,如示例 4-5 所示。

+

文件名:src/main.rs

+
fn main() {
+    let s1 = String::from("hello");
+
+    let (s2, len) = calculate_length(s1);
+
+    println!("The length of '{s2}' is {len}.");
+}
+
+fn calculate_length(s: String) -> (String, usize) {
+    let length = s.len(); // len() 返回字符串的长度
+
+    (s, length)
+}
+

示例 4-5: 返回参数的所有权

+

但是这未免有些形式主义,而且这种场景应该很常见。幸运的是,Rust 对此提供了一个不用获取所有权就可以使用值的功能,叫做 引用references)。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch04-02-references-and-borrowing.html b/ch04-02-references-and-borrowing.html new file mode 100644 index 000000000..36d584cab --- /dev/null +++ b/ch04-02-references-and-borrowing.html @@ -0,0 +1,506 @@ + + + + + + 引用与借用 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

引用与借用

+
+

ch04-02-references-and-borrowing.md +
+commit 3d51f70c78162faaebcab0da0de2ddd333e7a8ed

+
+

示例 4-5 中的元组代码有这样一个问题:我们必须将 String 返回给调用函数,以便在调用 calculate_length 后仍能使用 String,因为 String 被移动到了 calculate_length 内。相反我们可以提供一个 String 值的引用(reference)。引用reference)像一个指针,因为它是一个地址,我们可以由此访问储存于该地址的属于其他变量的数据。 +与指针不同,引用确保指向某个特定类型的有效值。

+

下面是如何定义并使用一个(新的)calculate_length 函数,它以一个对象的引用作为参数而不是获取值的所有权:

+

文件名:src/main.rs

+
fn main() {
+    let s1 = String::from("hello");
+
+    let len = calculate_length(&s1);
+
+    println!("The length of '{s1}' is {len}.");
+}
+
+fn calculate_length(s: &String) -> usize {
+    s.len()
+}
+

首先,注意变量声明和函数返回值中的所有元组代码都消失了。其次,注意我们传递 &s1calculate_length,同时在函数定义中,我们获取 &String 而不是 String。这些 & 符号就是 引用,它们允许你使用值但不获取其所有权。图 4-6 展示了一张示意图。

+

Three tables: the table for s contains only a pointer to the table
+for s1. The table for s1 contains the stack data for s1 and points to the
+string data on the heap.

+

图 4-6:&String s 指向 String s1 示意图

+
+

注意:与使用 & 引用相反的操作是 解引用dereferencing),它使用解引用运算符,*。我们将会在第八章遇到一些解引用运算符,并在第十五章详细讨论解引用。

+
+

仔细看看这个函数调用:

+
fn main() {
+    let s1 = String::from("hello");
+
+    let len = calculate_length(&s1);
+
+    println!("The length of '{s1}' is {len}.");
+}
+
+fn calculate_length(s: &String) -> usize {
+    s.len()
+}
+

&s1 语法让我们创建一个 指向s1 的引用,但是并不拥有它。因为并不拥有这个值,所以当引用停止使用时,它所指向的值也不会被丢弃。

+

同理,函数签名使用 & 来表明参数 s 的类型是一个引用。让我们增加一些解释性的注释:

+
fn main() {
+    let s1 = String::from("hello");
+
+    let len = calculate_length(&s1);
+
+    println!("The length of '{s1}' is {len}.");
+}
+
+fn calculate_length(s: &String) -> usize { // s 是 String 的引用
+    s.len()
+} // 这里,s 离开了作用域。但因为它并不拥有引用值的所有权,
+  // 所以什么也不会发生
+

变量 s 有效的作用域与函数参数的作用域一样,不过当 s 停止使用时并不丢弃引用指向的数据,因为 s 并没有所有权。当函数使用引用而不是实际值作为参数,无需返回值来交还所有权,因为就不曾拥有所有权。

+

我们将创建一个引用的行为称为 借用borrowing)。正如现实生活中,如果一个人拥有某样东西,你可以从他那里借来。当你使用完毕,必须还回去。我们并不拥有它。

+

如果我们尝试修改借用的变量呢?尝试示例 4-6 中的代码。剧透:这行不通!

+

文件名:src/main.rs

+
fn main() {
+    let s = String::from("hello");
+
+    change(&s);
+}
+
+fn change(some_string: &String) {
+    some_string.push_str(", world");
+}
+

示例 4-6:尝试修改借用的值

+

这里是错误:

+
$ cargo run
+   Compiling ownership v0.1.0 (file:///projects/ownership)
+error[E0596]: cannot borrow `*some_string` as mutable, as it is behind a `&` reference
+ --> src/main.rs:8:5
+  |
+8 |     some_string.push_str(", world");
+  |     ^^^^^^^^^^^ `some_string` is a `&` reference, so the data it refers to cannot be borrowed as mutable
+  |
+help: consider changing this to be a mutable reference
+  |
+7 | fn change(some_string: &mut String) {
+  |                         +++
+
+For more information about this error, try `rustc --explain E0596`.
+error: could not compile `ownership` (bin "ownership") due to 1 previous error
+
+

正如变量默认是不可变的,引用也一样。(默认)不允许修改引用的值。

+

可变引用

+

我们通过一个小调整就能修复示例 4-6 代码中的错误,允许我们修改一个借用的值,这就是 可变引用mutable reference):

+

文件名:src/main.rs

+
fn main() {
+    let mut s = String::from("hello");
+
+    change(&mut s);
+}
+
+fn change(some_string: &mut String) {
+    some_string.push_str(", world");
+}
+

首先,我们必须将 s 改为 mut。然后在调用 change 函数的地方创建一个可变引用 &mut s,并更新函数签名以接受一个可变引用 some_string: &mut String。这就非常清楚地表明,change 函数将改变它所借用的值。

+

可变引用有一个很大的限制:如果你有一个对该变量的可变引用,你就不能再创建对该变量的引用。这些尝试创建两个 s 的可变引用的代码会失败:

+

文件名:src/main.rs

+
fn main() {
+    let mut s = String::from("hello");
+
+    let r1 = &mut s;
+    let r2 = &mut s;
+
+    println!("{}, {}", r1, r2);
+}
+

错误如下:

+
$ cargo run
+   Compiling ownership v0.1.0 (file:///projects/ownership)
+error[E0499]: cannot borrow `s` as mutable more than once at a time
+ --> src/main.rs:5:14
+  |
+4 |     let r1 = &mut s;
+  |              ------ first mutable borrow occurs here
+5 |     let r2 = &mut s;
+  |              ^^^^^^ second mutable borrow occurs here
+6 |
+7 |     println!("{}, {}", r1, r2);
+  |                        -- first borrow later used here
+
+For more information about this error, try `rustc --explain E0499`.
+error: could not compile `ownership` (bin "ownership") due to 1 previous error
+
+

这个报错说这段代码是无效的,因为我们不能在同一时间多次将 s 作为可变变量借用。第一个可变的借入在 r1 中,并且必须持续到在 println! 中使用它,但是在那个可变引用的创建和它的使用之间,我们又尝试在 r2 中创建另一个可变引用,该引用借用与 r1 相同的数据。

+

这一限制以一种非常小心谨慎的方式允许可变性,防止同一时间对同一数据存在多个可变引用。新 Rustacean 们经常难以适应这一点,因为大部分语言中变量任何时候都是可变的。这个限制的好处是 Rust 可以在编译时就避免数据竞争。数据竞争data race)类似于竞态条件,它可由这三个行为造成:

+
    +
  • 两个或更多指针同时访问同一数据。
  • +
  • 至少有一个指针被用来写入数据。
  • +
  • 没有同步数据访问的机制。
  • +
+

数据竞争会导致未定义行为,难以在运行时追踪,并且难以诊断和修复;Rust 避免了这种情况的发生,因为它甚至不会编译存在数据竞争的代码!

+

一如既往,可以使用大括号来创建一个新的作用域,以允许拥有多个可变引用,只是不能 同时 拥有:

+
fn main() {
+    let mut s = String::from("hello");
+
+    {
+        let r1 = &mut s;
+    } // r1 在这里离开了作用域,所以我们完全可以创建一个新的引用
+
+    let r2 = &mut s;
+}
+

Rust 在同时使用可变与不可变引用时也采用的类似的规则。这些代码会导致一个错误:

+
fn main() {
+    let mut s = String::from("hello");
+
+    let r1 = &s; // 没问题
+    let r2 = &s; // 没问题
+    let r3 = &mut s; // 大问题
+
+    println!("{}, {}, and {}", r1, r2, r3);
+}
+

错误如下:

+
$ cargo run
+   Compiling ownership v0.1.0 (file:///projects/ownership)
+error[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable
+ --> src/main.rs:6:14
+  |
+4 |     let r1 = &s; // no problem
+  |              -- immutable borrow occurs here
+5 |     let r2 = &s; // no problem
+6 |     let r3 = &mut s; // BIG PROBLEM
+  |              ^^^^^^ mutable borrow occurs here
+7 |
+8 |     println!("{}, {}, and {}", r1, r2, r3);
+  |                                -- immutable borrow later used here
+
+For more information about this error, try `rustc --explain E0502`.
+error: could not compile `ownership` (bin "ownership") due to 1 previous error
+
+

哇哦!我们 不能在拥有不可变引用的同时拥有可变引用。

+

不可变引用的用户可不希望在他们的眼皮底下值就被意外的改变了!然而,多个不可变引用是可以的,因为没有哪个只能读取数据的人有能力影响其他人读取到的数据。

+

注意一个引用的作用域从声明的地方开始一直持续到最后一次使用为止。例如,因为最后一次使用不可变引用(println!),发生在声明可变引用之前,所以如下代码是可以编译的:

+
fn main() {
+    let mut s = String::from("hello");
+
+    let r1 = &s; // 没问题
+    let r2 = &s; // 没问题
+    println!("{r1} and {r2}");
+    // 此位置之后 r1 和 r2 不再使用
+
+    let r3 = &mut s; // 没问题
+    println!("{r3}");
+}
+

不可变引用 r1r2 的作用域在 println! 最后一次使用之后结束,这也是创建可变引用 r3 的地方。它们的作用域没有重叠,所以代码是可以编译的。编译器可以在作用域结束之前判断不再使用的引用。

+

尽管这些错误有时使人沮丧,但请牢记这是 Rust 编译器在提前指出一个潜在的 bug(在编译时而不是在运行时)并精准显示问题所在。这样你就不必去跟踪为何数据并不是你想象中的那样。

+

悬垂引用(Dangling References)

+

在具有指针的语言中,很容易通过释放内存时保留指向它的指针而错误地生成一个 悬垂指针dangling pointer),所谓悬垂指针是其指向的内存可能已经被分配给其它持有者。相比之下,在 Rust 中编译器确保引用永远也不会变成悬垂状态:当你拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域。

+

让我们尝试创建一个悬垂引用,Rust 会通过一个编译时错误来避免:

+

文件名:src/main.rs

+
fn main() {
+    let reference_to_nothing = dangle();
+}
+
+fn dangle() -> &String {
+    let s = String::from("hello");
+
+    &s
+}
+

这里是错误:

+
$ cargo run
+   Compiling ownership v0.1.0 (file:///projects/ownership)
+error[E0106]: missing lifetime specifier
+ --> src/main.rs:5:16
+  |
+5 | fn dangle() -> &String {
+  |                ^ expected named lifetime parameter
+  |
+  = help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
+help: consider using the `'static` lifetime, but this is uncommon unless you're returning a borrowed value from a `const` or a `static`
+  |
+5 | fn dangle() -> &'static String {
+  |                 +++++++
+help: instead, you are more likely to want to return an owned value
+  |
+5 - fn dangle() -> &String {
+5 + fn dangle() -> String {
+  |
+
+error[E0515]: cannot return reference to local variable `s`
+ --> src/main.rs:8:5
+  |
+8 |     &s
+  |     ^^ returns a reference to data owned by the current function
+
+Some errors have detailed explanations: E0106, E0515.
+For more information about an error, try `rustc --explain E0106`.
+error: could not compile `ownership` (bin "ownership") due to 2 previous errors
+
+

错误信息引用了一个我们还未介绍的功能:生命周期(lifetimes)。第十章会详细介绍生命周期。不过,如果你不理会生命周期部分,错误信息中确实包含了为什么这段代码有问题的关键信息:

+
this function's return type contains a borrowed value, but there is no value
+for it to be borrowed from
+
+

让我们仔细看看我们的 dangle 代码的每一步到底发生了什么:

+

文件名:src/main.rs

+
fn main() {
+    let reference_to_nothing = dangle();
+}
+
+fn dangle() -> &String { // dangle 返回一个字符串的引用
+
+    let s = String::from("hello"); // s 是一个新字符串
+
+    &s // 返回字符串 s 的引用
+} // 这里 s 离开作用域并被丢弃。其内存被释放。
+  // 危险!
+

因为 s 是在 dangle 函数内创建的,当 dangle 的代码执行完毕后,s 将被释放。不过我们尝试返回它的引用。这意味着这个引用会指向一个无效的 String,这可不对!Rust 不会允许我们这么做。

+

这里的解决方法是直接返回 String

+
fn main() {
+    let string = no_dangle();
+}
+
+fn no_dangle() -> String {
+    let s = String::from("hello");
+
+    s
+}
+

这样就没有任何错误了。所有权被移动出去,所以没有值被释放。

+

引用的规则

+

让我们概括一下之前对引用的讨论:

+
    +
  • 在任意给定时间,要么 只能有一个可变引用,要么 只能有多个不可变引用。
  • +
  • 引用必须总是有效的。
  • +
+

接下来,我们来看看另一种不同类型的引用:slice。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch04-03-slices.html b/ch04-03-slices.html new file mode 100644 index 000000000..94f260852 --- /dev/null +++ b/ch04-03-slices.html @@ -0,0 +1,544 @@ + + + + + + Slice 类型 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Slice 类型

+
+

ch04-03-slices.md +
+commit 3d51f70c78162faaebcab0da0de2ddd333e7a8ed

+
+

slice 允许你引用集合中一段连续的元素序列,而不用引用整个集合。slice 是一种引用,所以它没有所有权。

+

这里有一个编程小习题:编写一个函数,该函数接收一个用空格分隔单词的字符串,并返回在该字符串中找到的第一个单词。如果函数在该字符串中并未找到空格,则整个字符串就是一个单词,所以应该返回整个字符串。

+

让我们推敲下如何不用 slice 编写这个函数的签名,来理解 slice 能解决的问题:

+
fn first_word(s: &String) -> ?
+

first_word 函数有一个参数 &String。因为我们不需要所有权,所以这没有问题。不过应该返回什么呢?我们并没有一个真正获取 部分 字符串的办法。不过,我们可以返回单词结尾的索引,结尾由一个空格表示。试试如示例 4-7 中的代码。

+

文件名:src/main.rs

+
fn first_word(s: &String) -> usize {
+    let bytes = s.as_bytes();
+
+    for (i, &item) in bytes.iter().enumerate() {
+        if item == b' ' {
+            return i;
+        }
+    }
+
+    s.len()
+}
+
+fn main() {}
+

示例 4-7:first_word 函数返回 String 参数的一个字节索引值

+

因为需要逐个元素的检查 String 中的值是否为空格,需要用 as_bytes 方法将 String 转化为字节数组。

+
fn first_word(s: &String) -> usize {
+    let bytes = s.as_bytes();
+
+    for (i, &item) in bytes.iter().enumerate() {
+        if item == b' ' {
+            return i;
+        }
+    }
+
+    s.len()
+}
+
+fn main() {}
+

接下来,使用 iter 方法在字节数组上创建一个迭代器:

+
fn first_word(s: &String) -> usize {
+    let bytes = s.as_bytes();
+
+    for (i, &item) in bytes.iter().enumerate() {
+        if item == b' ' {
+            return i;
+        }
+    }
+
+    s.len()
+}
+
+fn main() {}
+

我们将在第十三章详细讨论迭代器。现在,只需知道 iter 方法返回集合中的每一个元素,而 enumerate 包装了 iter 的结果,将这些元素作为元组的一部分来返回。enumerate 返回的元组中,第一个元素是索引,第二个元素是集合中元素的引用。这比我们自己计算索引要方便一些。

+

因为 enumerate 方法返回一个元组,我们可以使用模式来解构,我们将在第六章中进一步讨论有关模式的问题。所以在 for 循环中,我们指定了一个模式,其中元组中的 i 是索引而元组中的 &item 是单个字节。因为我们从 .iter().enumerate() 中获取了集合元素的引用,所以模式中使用了 &

+

for 循环中,我们通过字节的字面值语法来寻找代表空格的字节。如果找到了一个空格,返回它的位置。否则,使用 s.len() 返回字符串的长度:

+
fn first_word(s: &String) -> usize {
+    let bytes = s.as_bytes();
+
+    for (i, &item) in bytes.iter().enumerate() {
+        if item == b' ' {
+            return i;
+        }
+    }
+
+    s.len()
+}
+
+fn main() {}
+

现在有了一个找到字符串中第一个单词结尾索引的方法,不过这有一个问题。我们返回了一个独立的 usize,不过它只在 &String 的上下文中才是一个有意义的数字。换句话说,因为它是一个与 String 相分离的值,无法保证将来它仍然有效。考虑一下示例 4-8 中使用了示例 4-7 中 first_word 函数的程序。

+

文件名:src/main.rs

+
fn first_word(s: &String) -> usize {
+    let bytes = s.as_bytes();
+
+    for (i, &item) in bytes.iter().enumerate() {
+        if item == b' ' {
+            return i;
+        }
+    }
+
+    s.len()
+}
+
+fn main() {
+    let mut s = String::from("hello world");
+
+    let word = first_word(&s); // word 的值为 5
+
+    s.clear(); // 这清空了字符串,使其等于 ""
+
+    // word 在此处的值仍然是 5,
+    // 但是没有更多的字符串让我们可以有效地应用数值 5。word 的值现在完全无效!
+}
+

示例 4-8:存储 first_word 函数调用的返回值并接着改变 String 的内容

+

这个程序编译时没有任何错误,而且在调用 s.clear() 之后使用 word 也不会出错。因为 words 状态完全没有联系,所以 word 仍然包含值 5。可以尝试用值 5 来提取变量 s 的第一个单词,不过这是有 bug 的,因为在我们将 5 保存到 word 之后 s 的内容已经改变。

+

我们不得不时刻担心 word 的索引与 s 中的数据不再同步,这很啰嗦且易出错!如果编写这么一个 second_word 函数的话,管理索引这件事将更加容易出问题。它的签名看起来像这样:

+
fn second_word(s: &String) -> (usize, usize) {
+

现在我们要跟踪一个开始索引 一个结尾索引,同时有了更多从数据的某个特定状态计算而来的值,但都完全没有与这个状态相关联。现在有三个飘忽不定的不相关变量需要保持同步。

+

幸运的是,Rust 为这个问题提供了一个解决方法:字符串 slice。

+

字符串 slice

+

字符串 slicestring slice)是 String 中一部分值的引用,它看起来像这样:

+
fn main() {
+    let s = String::from("hello world");
+
+    let hello = &s[0..5];
+    let world = &s[6..11];
+}
+

不同于整个 String 的引用,hello 是一个部分 String 的引用,由一个额外的 [0..5] 部分指定。可以使用一个由中括号中的 [starting_index..ending_index] 指定的 range 创建一个 slice,其中 starting_index 是 slice 的第一个位置,ending_index 则是 slice 最后一个位置的后一个值。在其内部,slice 的数据结构存储了 slice 的开始位置和长度,长度对应于 ending_index 减去 starting_index 的值。所以对于 let world = &s[6..11]; 的情况,world 将是一个包含指向 s 索引 6 的指针和长度值 5 的 slice。

+

图 4-7 展示了一个图例。

+

Three tables: a table representing the stack data of s, which points
+to the byte at index 0 in a table of the string data "hello world" on
+the heap. The third table rep-resents the stack data of the slice world, which
+has a length value of 5 and points to byte 6 of the heap data table.

+

图 4-7:引用了部分 String 的字符串 slice

+

对于 Rust 的 .. range 语法,如果想要从索引 0 开始,可以不写两个点号之前的值。换句话说,如下两个语句是相同的:

+
#![allow(unused)]
+fn main() {
+let s = String::from("hello");
+
+let slice = &s[0..2];
+let slice = &s[..2];
+}
+

依此类推,如果 slice 包含 String 的最后一个字节,也可以舍弃尾部的数字。这意味着如下也是相同的:

+
#![allow(unused)]
+fn main() {
+let s = String::from("hello");
+
+let len = s.len();
+
+let slice = &s[3..len];
+let slice = &s[3..];
+}
+

也可以同时舍弃这两个值来获取整个字符串的 slice。所以如下亦是相同的:

+
#![allow(unused)]
+fn main() {
+let s = String::from("hello");
+
+let len = s.len();
+
+let slice = &s[0..len];
+let slice = &s[..];
+}
+
+

注意:字符串 slice range 的索引必须位于有效的 UTF-8 字符边界内,如果尝试从一个多字节字符的中间位置创建字符串 slice,则程序将会因错误而退出。出于介绍字符串 slice 的目的,本部分假设只使用 ASCII 字符集;第八章的 “使用字符串储存 UTF-8 编码的文本” 部分会更加全面的讨论 UTF-8 处理问题。

+
+

在记住所有这些知识后,让我们重写 first_word 来返回一个 slice。“字符串 slice” 的类型声明写作 &str

+

文件名:src/main.rs

+
fn first_word(s: &String) -> &str {
+    let bytes = s.as_bytes();
+
+    for (i, &item) in bytes.iter().enumerate() {
+        if item == b' ' {
+            return &s[0..i];
+        }
+    }
+
+    &s[..]
+}
+
+fn main() {}
+

我们使用跟示例 4-7 相同的方式获取单词结尾的索引,通过寻找第一个出现的空格。当找到一个空格,我们返回一个字符串 slice,它使用字符串的开始和空格的索引作为开始和结束的索引。

+

现在当调用 first_word 时,会返回与底层数据关联的单个值。这个值由一个 slice 开始位置的引用和 slice 中元素的数量组成。

+

second_word 函数也可以改为返回一个 slice:

+
fn second_word(s: &String) -> &str {
+

现在我们有了一个不易混淆且直观的 API 了,因为编译器会确保指向 String 的引用持续有效。还记得示例 4-8 程序中,那个当我们获取第一个单词结尾的索引后,接着就清除了字符串导致索引就无效的 bug 吗?那些代码在逻辑上是不正确的,但却没有显示任何直接的错误。问题会在之后尝试对空字符串使用第一个单词的索引时出现。slice 就不可能出现这种 bug 并让我们更早的知道出问题了。使用 slice 版本的 first_word 会抛出一个编译时错误:

+

文件名:src/main.rs

+
fn first_word(s: &String) -> &str {
+    let bytes = s.as_bytes();
+
+    for (i, &item) in bytes.iter().enumerate() {
+        if item == b' ' {
+            return &s[0..i];
+        }
+    }
+
+    &s[..]
+}
+
+fn main() {
+    let mut s = String::from("hello world");
+
+    let word = first_word(&s);
+
+    s.clear(); // 错误!
+
+    println!("the first word is: {word}");
+}
+

这里是编译错误:

+
$ cargo run
+   Compiling ownership v0.1.0 (file:///projects/ownership)
+error[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable
+  --> src/main.rs:18:5
+   |
+16 |     let word = first_word(&s);
+   |                           -- immutable borrow occurs here
+17 |
+18 |     s.clear(); // error!
+   |     ^^^^^^^^^ mutable borrow occurs here
+19 |
+20 |     println!("the first word is: {word}");
+   |                                  ------ immutable borrow later used here
+
+For more information about this error, try `rustc --explain E0502`.
+error: could not compile `ownership` (bin "ownership") due to 1 previous error
+
+

回忆一下借用规则,当拥有某值的不可变引用时,就不能再获取一个可变引用。因为 clear 需要清空 String,它尝试获取一个可变引用。在调用 clear 之后的 println! 使用了 word 中的引用,所以这个不可变的引用在此时必须仍然有效。Rust 不允许 clear 中的可变引用和 word 中的不可变引用同时存在,因此编译失败。Rust 不仅使得我们的 API 简单易用,也在编译时就消除了一整类的错误!

+

+

字符串字面值就是 slice

+

还记得我们讲到过字符串字面值被储存在二进制文件中吗?现在知道 slice 了,我们就可以正确地理解字符串字面值了:

+
#![allow(unused)]
+fn main() {
+let s = "Hello, world!";
+}
+

这里 s 的类型是 &str:它是一个指向二进制程序特定位置的 slice。这也就是为什么字符串字面值是不可变的;&str 是一个不可变引用。

+

字符串 slice 作为参数

+

在知道了能够获取字面值和 String 的 slice 后,我们对 first_word 做了改进,这是它的签名:

+
fn first_word(s: &String) -> &str {
+

而更有经验的 Rustacean 会编写出示例 4-9 中的签名,因为它使得可以对 &String 值和 &str 值使用相同的函数:

+
fn first_word(s: &str) -> &str {
+    let bytes = s.as_bytes();
+
+    for (i, &item) in bytes.iter().enumerate() {
+        if item == b' ' {
+            return &s[0..i];
+        }
+    }
+
+    &s[..]
+}
+
+fn main() {
+    let my_string = String::from("hello world");
+
+    // `first_word` 适用于 `String`(的 slice),部分或全部
+    let word = first_word(&my_string[0..6]);
+    let word = first_word(&my_string[..]);
+    // `first_word` 也适用于 `String` 的引用,
+    // 这等价于整个 `String` 的 slice
+    let word = first_word(&my_string);
+
+    let my_string_literal = "hello world";
+
+    // `first_word` 适用于字符串字面值,部分或全部
+    let word = first_word(&my_string_literal[0..6]);
+    let word = first_word(&my_string_literal[..]);
+
+    // 因为字符串字面值已经 **是** 字符串 slice 了,
+    // 这也是适用的,无需 slice 语法!
+    let word = first_word(my_string_literal);
+}
+

示例 4-9: 通过将 s 参数的类型改为字符串 slice 来改进 first_word 函数

+

如果有一个字符串 slice,可以直接传递它。如果有一个 String,则可以传递整个 String 的 slice 或对 String 的引用。这种灵活性利用了 deref coercions 的优势,这个特性我们将在“函数和方法的隐式 Deref 强制转换”章节中介绍。定义一个获取字符串 slice 而不是 String 引用的函数使得我们的 API 更加通用并且不会丢失任何功能:

+

文件名:src/main.rs

+
fn first_word(s: &str) -> &str {
+    let bytes = s.as_bytes();
+
+    for (i, &item) in bytes.iter().enumerate() {
+        if item == b' ' {
+            return &s[0..i];
+        }
+    }
+
+    &s[..]
+}
+
+fn main() {
+    let my_string = String::from("hello world");
+
+    // `first_word` 适用于 `String`(的 slice),部分或全部
+    let word = first_word(&my_string[0..6]);
+    let word = first_word(&my_string[..]);
+    // `first_word` 也适用于 `String` 的引用,
+    // 这等价于整个 `String` 的 slice
+    let word = first_word(&my_string);
+
+    let my_string_literal = "hello world";
+
+    // `first_word` 适用于字符串字面值,部分或全部
+    let word = first_word(&my_string_literal[0..6]);
+    let word = first_word(&my_string_literal[..]);
+
+    // 因为字符串字面值已经 **是** 字符串 slice 了,
+    // 这也是适用的,无需 slice 语法!
+    let word = first_word(my_string_literal);
+}
+

其他类型的 slice

+

字符串 slice,正如你想象的那样,是针对字符串的。不过也有更通用的 slice 类型。考虑一下这个数组:

+
#![allow(unused)]
+fn main() {
+let a = [1, 2, 3, 4, 5];
+}
+

就跟我们想要获取字符串的一部分那样,我们也会想要引用数组的一部分。我们可以这样做:

+
#![allow(unused)]
+fn main() {
+let a = [1, 2, 3, 4, 5];
+
+let slice = &a[1..3];
+
+assert_eq!(slice, &[2, 3]);
+}
+

这个 slice 的类型是 &[i32]。它跟字符串 slice 的工作方式一样,通过存储第一个集合元素的引用和一个集合总长度。你可以对其他所有集合使用这类 slice。第八章讲到 vector 时会详细讨论这些集合。

+

总结

+

所有权、借用和 slice 这些概念让 Rust 程序在编译时确保内存安全。Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码。

+

所有权系统影响了 Rust 中很多其他部分的工作方式,所以我们还会继续讲到这些概念,这将贯穿本书的余下内容。让我们开始第五章,来看看如何将多份数据组合进一个 struct 中。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch05-00-structs.html b/ch05-00-structs.html new file mode 100644 index 000000000..517f8eac7 --- /dev/null +++ b/ch05-00-structs.html @@ -0,0 +1,246 @@ + + + + + + 使用结构体组织相关联的数据 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用结构体组织相关联的数据

+
+

ch05-00-structs.md +
+commit 8612c4a5801b61f8d2e952f8bbbb444692ff1ec2

+
+

struct,或者 structure,是一个自定义数据类型,允许你包装和命名多个相关的值,从而形成一个有意义的组合。如果你熟悉一门面向对象语言,struct 就像对象中的数据属性。在本章中,我们会对元组和结构体进行比较和对比。

+

我们还将演示如何定义和实例化结构体,并讨论如何定义关联函数,特别是被称为 方法 的那种关联函数,以指定与结构体类型相关的行为。你可以在程序中基于结构体和枚举(enum)(在第六章介绍)创建新类型,以充分利用 Rust 的编译时类型检查。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch05-01-defining-structs.html b/ch05-01-defining-structs.html new file mode 100644 index 000000000..751ad6a90 --- /dev/null +++ b/ch05-01-defining-structs.html @@ -0,0 +1,480 @@ + + + + + + 结构体的定义和实例化 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

结构体的定义和实例化

+
+

ch05-01-defining-structs.md +
+commit a371f82b0916cf21de2d56bd386ca5d72f7699b0

+
+

结构体和我们在“元组类型”部分论过的元组类似,它们都包含多个相关的值。和元组一样,结构体的每一部分可以是不同类型。但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来指定或访问实例中的值。

+

定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段field)。例如,示例 5-1 展示了一个存储用户账号信息的结构体:

+

文件名:src/main.rs

+
struct User {
+    active: bool,
+    username: String,
+    email: String,
+    sign_in_count: u64,
+}
+
+fn main() {}
+

示例 5-1:User 结构体定义

+

一旦定义了结构体后,为了使用它,通过为每个字段指定具体值来创建这个结构体的 实例。创建一个实例需要以结构体的名字开头,接着在大括号中使用 key: value 键 - 值对的形式提供字段,其中 key 是字段的名字,value 是需要存储在字段中的数据值。实例中字段的顺序不需要和它们在结构体中声明的顺序一致。换句话说,结构体的定义就像一个类型的通用模板,而实例则会在这个模板中放入特定数据来创建这个类型的值。例如,可以像示例 5-2 这样来声明一个特定的用户:

+

文件名:src/main.rs

+
struct User {
+    active: bool,
+    username: String,
+    email: String,
+    sign_in_count: u64,
+}
+
+fn main() {
+    let user1 = User {
+        active: true,
+        username: String::from("someusername123"),
+        email: String::from("someone@example.com"),
+        sign_in_count: 1,
+    };
+}
+

示例 5-2:创建 User 结构体的实例

+

为了从结构体中获取某个特定的值,可以使用点号。举个例子,想要用户的邮箱地址,可以用 user1.email。如果结构体的实例是可变的,我们可以使用点号并为对应的字段赋值。示例 5-3 展示了如何改变一个可变的 User 实例中 email 字段的值:

+

文件名:src/main.rs

+
struct User {
+    active: bool,
+    username: String,
+    email: String,
+    sign_in_count: u64,
+}
+
+fn main() {
+    let mut user1 = User {
+        active: true,
+        username: String::from("someusername123"),
+        email: String::from("someone@example.com"),
+        sign_in_count: 1,
+    };
+
+    user1.email = String::from("anotheremail@example.com");
+}
+

示例 5-3:改变 User 实例 email 字段的值

+

注意整个实例必须是可变的;Rust 并不允许只将某个字段标记为可变。另外需要注意同其他任何表达式一样,我们可以在函数体的最后一个表达式中构造一个结构体的新实例,来隐式地返回这个实例。

+

示例 5-4 显示了一个 build_user 函数,它返回一个带有给定的 email 和用户名的 User 结构体实例。active 字段的值为 true,并且 sign_in_count 的值为 1

+

文件名:src/main.rs

+
struct User {
+    active: bool,
+    username: String,
+    email: String,
+    sign_in_count: u64,
+}
+
+fn build_user(email: String, username: String) -> User {
+    User {
+        active: true,
+        username: username,
+        email: email,
+        sign_in_count: 1,
+    }
+}
+
+fn main() {
+    let user1 = build_user(
+        String::from("someone@example.com"),
+        String::from("someusername123"),
+    );
+}
+

示例 5-4:build_user 函数获取 email 和用户名并返回 User 实例

+

为函数参数起与结构体字段相同的名字是可以理解的,但是不得不重复 emailusername 字段名称与变量有些啰嗦。如果结构体有更多字段,重复每个名称就更加烦人了。幸运的是,有一个方便的简写语法!

+

使用字段初始化简写语法

+

因为示例 5-4 中的参数名与字段名都完全相同,我们可以使用 字段初始化简写语法field init shorthand)来重写 build_user,这样其行为与之前完全相同,不过无需重复 usernameemail 了,如示例 5-5 所示。

+

文件名:src/main.rs

+
struct User {
+    active: bool,
+    username: String,
+    email: String,
+    sign_in_count: u64,
+}
+
+fn build_user(email: String, username: String) -> User {
+    User {
+        active: true,
+        username,
+        email,
+        sign_in_count: 1,
+    }
+}
+
+fn main() {
+    let user1 = build_user(
+        String::from("someone@example.com"),
+        String::from("someusername123"),
+    );
+}
+

示例 5-5:build_user 函数使用了字段初始化简写语法,因为 usernameemail 参数与结构体字段同名

+

这里我们创建了一个新的 User 结构体实例,它有一个叫做 email 的字段。我们想要将 email 字段的值设置为 build_user 函数 email 参数的值。因为 email 字段与 email 参数有着相同的名称,则只需编写 email 而不是 email: email

+

使用结构体更新语法从其他实例创建实例

+

使用旧实例的大部分值但改变其部分值来创建一个新的结构体实例通常是很有用的。这可以通过 结构体更新语法struct update syntax)实现。

+

首先,示例 5-6 展示了不使用更新语法时,如何在 user2 中创建一个新 User 实例。我们为 email 设置了新的值,其他值则使用了实例 5-2 中创建的 user1 中的同名值:

+

文件名:src/main.rs

+
struct User {
+    active: bool,
+    username: String,
+    email: String,
+    sign_in_count: u64,
+}
+
+fn main() {
+    // --snip--
+
+    let user1 = User {
+        email: String::from("someone@example.com"),
+        username: String::from("someusername123"),
+        active: true,
+        sign_in_count: 1,
+    };
+
+    let user2 = User {
+        active: user1.active,
+        username: user1.username,
+        email: String::from("another@example.com"),
+        sign_in_count: user1.sign_in_count,
+    };
+}
+

示例 5-6:使用 user1 中的一个值创建一个新的 User 实例

+

使用结构体更新语法,我们可以通过更少的代码来达到相同的效果,如示例 5-7 所示。.. 语法指定了剩余未显式设置值的字段应有与给定实例对应字段相同的值。

+

文件名:src/main.rs

+
struct User {
+    active: bool,
+    username: String,
+    email: String,
+    sign_in_count: u64,
+}
+
+fn main() {
+    // --snip--
+
+    let user1 = User {
+        email: String::from("someone@example.com"),
+        username: String::from("someusername123"),
+        active: true,
+        sign_in_count: 1,
+    };
+
+    let user2 = User {
+        email: String::from("another@example.com"),
+        ..user1
+    };
+}
+

示例 5-7:使用结构体更新语法为一个 User 实例设置一个新的 email 值,不过其余值来自 user1 变量中实例的字段

+

示例 5-7 中的代码也在 user2 中创建了一个新实例,但该实例中 email 字段的值与 user1 不同,而 usernameactivesign_in_count 字段的值与 user1 相同。..user1 必须放在最后,以指定其余的字段应从 user1 的相应字段中获取其值,但我们可以选择以任何顺序为任意字段指定值,而不用考虑结构体定义中字段的顺序。

+

请注意,结构更新语法就像带有 = 的赋值,因为它移动了数据,就像我们在“变量与数据交互的方式(一):移动”部分讲到的一样。在这个例子中,总体上说我们在创建 user2 后就不能再使用 user1 了,因为 user1username 字段中的 String 被移到 user2 中。如果我们给 user2emailusername 都赋予新的 String 值,从而只使用 user1activesign_in_count 值,那么 user1 在创建 user2 后仍然有效。activesign_in_count 的类型是实现 Copy trait 的类型,所以我们在“变量与数据交互的方式(二):克隆” 部分讨论的行为同样适用。

+

使用没有命名字段的元组结构体来创建不同的类型

+

也可以定义与元组(在第三章讨论过)类似的结构体,称为 元组结构体tuple structs)。元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型。当你想给整个元组取一个名字,并使元组成为与其他元组不同的类型时,元组结构体是很有用的,这时像常规结构体那样为每个字段命名就显得多余和形式化了。

+

要定义元组结构体,以 struct 关键字和结构体名开头并后跟元组中的类型。例如,下面是两个分别叫做 ColorPoint 元组结构体的定义和用法:

+

文件名:src/main.rs

+
struct Color(i32, i32, i32);
+struct Point(i32, i32, i32);
+
+fn main() {
+    let black = Color(0, 0, 0);
+    let origin = Point(0, 0, 0);
+}
+

注意 blackorigin 值的类型不同,因为它们是不同的元组结构体的实例。你定义的每一个结构体有其自己的类型,即使结构体中的字段可能有着相同的类型。例如,一个获取 Color 类型参数的函数不能接受 Point 作为参数,即便这两个类型都由三个 i32 值组成。在其他方面,元组结构体实例类似于元组,你可以将它们解构为单独的部分,也可以使用 . 后跟索引来访问单独的值,等等。

+

没有任何字段的类单元结构体

+

我们也可以定义一个没有任何字段的结构体!它们被称为 类单元结构体unit-like structs)因为它们类似于 (),即“元组类型”一节中提到的 unit 类型。类单元结构体常常在你想要在某个类型上实现 trait 但不需要在类型中存储数据的时候发挥作用。我们将在第十章介绍 trait。下面是一个声明和实例化一个名为 AlwaysEqual 的 unit 结构的例子。

+

文件名:src/main.rs

+
struct AlwaysEqual;
+
+fn main() {
+    let subject = AlwaysEqual;
+}
+

为了定义 AlwaysEqual,我们使用 struct 关键字,接着是我们想要的名称,然后是一个分号。不需要花括号或圆括号!然后,我们可以以类似的方式在 subject 变量中创建 AlwaysEqual 的实例:只需使用我们定义的名称,无需任何花括号或圆括号。设想我们稍后将为这个类型实现某种行为,使得每个 AlwaysEqual 的实例始终等于任何其它类型的实例,也许是为了获得一个已知的结果以便进行测试。我们不需要任何数据来实现这种行为!在第十章中,你会看到如何定义特征并在任何类型上实现它们,包括类单元结构体。

+
+

结构体数据的所有权

+

在示例 5-1 中的 User 结构体的定义中,我们使用了自身拥有所有权的 String 类型而不是 &str 字符串 slice 类型。这是一个有意而为之的选择,因为我们想要这个结构体拥有它所有的数据,为此只要整个结构体是有效的话其数据也是有效的。

+

可以使结构体存储被其他对象拥有的数据的引用,不过这么做的话需要用上 生命周期lifetimes),这是一个第十章会讨论的 Rust 功能。生命周期确保结构体引用的数据有效性跟结构体本身保持一致。如果你尝试在结构体中存储一个引用而不指定生命周期将是无效的,比如这样:

+

文件名:src/main.rs

+
struct User {
+    active: bool,
+    username: &str,
+    email: &str,
+    sign_in_count: u64,
+}
+
+fn main() {
+    let user1 = User {
+        active: true,
+        username: "someusername123",
+        email: "someone@example.com",
+        sign_in_count: 1,
+    };
+}
+

编译器会抱怨它需要生命周期标识符:

+
$ cargo run
+   Compiling structs v0.1.0 (file:///projects/structs)
+error[E0106]: missing lifetime specifier
+ --> src/main.rs:3:15
+  |
+3 |     username: &str,
+  |               ^ expected named lifetime parameter
+  |
+help: consider introducing a named lifetime parameter
+  |
+1 ~ struct User<'a> {
+2 |     active: bool,
+3 ~     username: &'a str,
+  |
+
+error[E0106]: missing lifetime specifier
+ --> src/main.rs:4:12
+  |
+4 |     email: &str,
+  |            ^ expected named lifetime parameter
+  |
+help: consider introducing a named lifetime parameter
+  |
+1 ~ struct User<'a> {
+2 |     active: bool,
+3 |     username: &str,
+4 ~     email: &'a str,
+  |
+
+For more information about this error, try `rustc --explain E0106`.
+error: could not compile `structs` due to 2 previous errors
+
+

第十章会讲到如何修复这个问题以便在结构体中存储引用,不过现在,我们会使用像 String 这类拥有所有权的类型来替代 &str 这样的引用以修正这个错误。

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch05-02-example-structs.html b/ch05-02-example-structs.html new file mode 100644 index 000000000..2b9920a17 --- /dev/null +++ b/ch05-02-example-structs.html @@ -0,0 +1,430 @@ + + + + + + 结构体示例程序 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

结构体示例程序

+
+

ch05-02-example-structs.md +
+commit 8612c4a5801b61f8d2e952f8bbbb444692ff1ec2

+
+

为了理解何时会需要使用结构体,让我们编写一个计算长方形面积的程序。我们会从单独的变量开始,接着重构程序直到使用结构体替代它们为止。

+

使用 Cargo 新建一个叫做 rectangles 的二进制程序,它获取以像素为单位的长方形的宽度和高度,并计算出长方形的面积。示例 5-8 显示了位于项目的 src/main.rs 中的小程序,它刚刚好实现此功能:

+

文件名:src/main.rs

+
fn main() {
+    let width1 = 30;
+    let height1 = 50;
+
+    println!(
+        "The area of the rectangle is {} square pixels.",
+        area(width1, height1)
+    );
+}
+
+fn area(width: u32, height: u32) -> u32 {
+    width * height
+}
+

示例 5-8:通过分别指定长方形的宽和高的变量来计算长方形面积

+

现在使用 cargo run 运行程序:

+
$ cargo run
+   Compiling rectangles v0.1.0 (file:///projects/rectangles)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.42s
+     Running `target/debug/rectangles`
+The area of the rectangle is 1500 square pixels.
+
+

这个示例代码在调用 area 函数时传入每个维度,虽然可以正确计算出长方形的面积,但我们仍然可以修改这段代码来使它的意义更加明确,并且增加可读性。

+

这些代码的问题突显在 area 的签名上:

+
fn main() {
+    let width1 = 30;
+    let height1 = 50;
+
+    println!(
+        "The area of the rectangle is {} square pixels.",
+        area(width1, height1)
+    );
+}
+
+fn area(width: u32, height: u32) -> u32 {
+    width * height
+}
+

函数 area 本应该计算一个长方形的面积,不过函数却有两个参数。这两个参数是相关联的,不过程序本身却没有表现出这一点。将长度和宽度组合在一起将更易懂也更易处理。第三章的 “元组类型” 部分已经讨论过了一种可行的方法:元组。

+

使用元组重构

+

示例 5-9 展示了使用元组的另一个程序版本。

+

文件名:src/main.rs

+
fn main() {
+    let rect1 = (30, 50);
+
+    println!(
+        "The area of the rectangle is {} square pixels.",
+        area(rect1)
+    );
+}
+
+fn area(dimensions: (u32, u32)) -> u32 {
+    dimensions.0 * dimensions.1
+}
+

示例 5-9:使用元组来指定长方形的宽高

+

在某种程度上说,这个程序更好一点了。元组帮助我们增加了一些结构性,并且现在只需传一个参数。不过在另一方面,这个版本却有一点不明确了:元组并没有给出元素的名称,所以计算变得更费解了,因为不得不使用索引来获取元组的每一部分:

+

在计算面积时将宽和高弄混倒无关紧要,不过当在屏幕上绘制长方形时就有问题了!我们必须牢记 width 的元组索引是 0height 的元组索引是 1。如果其他人要使用这些代码,他们必须要搞清楚这一点,并也要牢记于心。很容易忘记或者混淆这些值而造成错误,因为我们没有在代码中传达数据的意图。

+

使用结构体重构:赋予更多意义

+

我们使用结构体为数据命名来为其赋予意义。我们可以将我们正在使用的元组转换成一个有整体名称而且每个部分也有对应名字的结构体,如示例 5-10 所示:

+

文件名:src/main.rs

+
struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+fn main() {
+    let rect1 = Rectangle {
+        width: 30,
+        height: 50,
+    };
+
+    println!(
+        "The area of the rectangle is {} square pixels.",
+        area(&rect1)
+    );
+}
+
+fn area(rectangle: &Rectangle) -> u32 {
+    rectangle.width * rectangle.height
+}
+

示例 5-10:定义 Rectangle 结构体

+

这里我们定义了一个结构体并称其为 Rectangle。在大括号中定义了字段 widthheight,类型都是 u32。接着在 main 中,我们创建了一个具体的 Rectangle 实例,它的宽是 30,高是 50

+

函数 area 现在被定义为接收一个名叫 rectangle 的参数,其类型是一个结构体 Rectangle 实例的不可变借用。第四章讲到过,我们希望借用结构体而不是获取它的所有权,这样 main 函数就可以保持 rect1 的所有权并继续使用它,所以这就是为什么在函数签名和调用的地方会有 &

+

area 函数访问 Rectangle 实例的 widthheight 字段(注意,访问对结构体的引用的字段不会移动字段的所有权,这就是为什么你经常看到对结构体的引用)。area 的函数签名现在明确的阐述了我们的意图:使用 Rectanglewidthheight 字段,计算 Rectangle 的面积。这表明宽高是相互联系的,并为这些值提供了描述性的名称而不是使用元组的索引值 01 。结构体胜在更清晰明了。

+

通过派生 trait 增加实用功能

+

在调试程序时打印出 Rectangle 实例来查看其所有字段的值非常有用。示例 5-11 像前面章节那样尝试使用 println!。但这并不行。

+

文件名:src/main.rs

+
struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+fn main() {
+    let rect1 = Rectangle {
+        width: 30,
+        height: 50,
+    };
+
+    println!("rect1 is {}", rect1);
+}
+

示例 5-11:尝试打印出 Rectangle 实例

+

当我们运行这个代码时,会出现带有如下核心信息的错误:

+
error[E0277]: `Rectangle` doesn't implement `std::fmt::Display`
+
+

println! 宏能处理很多类型的格式,不过,{} 默认告诉 println! 使用被称为 Display 的格式:意在提供给直接终端用户查看的输出。目前为止见过的基本类型都默认实现了 Display,因为它就是向用户展示 1 或其他任何基本类型的唯一方式。不过对于结构体,println! 应该用来输出的格式是不明确的,因为这有更多显示的可能性:是否需要逗号?需要打印出大括号吗?所有字段都应该显示吗?由于这种不确定性,Rust 不会尝试猜测我们的意图,所以结构体并没有提供一个 Display 实现来使用 println!{} 占位符。

+

但是如果我们继续阅读错误,将会发现这个有帮助的信息:

+
   = help: the trait `std::fmt::Display` is not implemented for `Rectangle`
+   = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
+
+

让我们来试试!现在 println! 宏调用看起来像 println!("rect1 is {:?}", rect1); 这样。在 {} 中加入 :? 指示符告诉 println! 我们想要使用叫做 Debug 的输出格式。Debug 是一个 trait,它允许我们以一种对开发者有帮助的方式打印结构体,以便当我们调试代码时能看到它的值。

+

这样调整后再次运行程序。见鬼了!仍然能看到一个错误:

+
error[E0277]: `Rectangle` doesn't implement `Debug`
+
+

不过编译器又一次给出了一个有帮助的信息:

+
   = help: the trait `Debug` is not implemented for `Rectangle`
+   = note: add `#[derive(Debug)]` to `Rectangle` or manually `impl Debug for Rectangle`
+
+

Rust 确实 包含了打印出调试信息的功能,不过我们必须为结构体显式选择这个功能。为此,在结构体定义之前加上外部属性 #[derive(Debug)],如示例 5-12 所示:

+

文件名:src/main.rs

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+fn main() {
+    let rect1 = Rectangle {
+        width: 30,
+        height: 50,
+    };
+
+    println!("rect1 is {rect1:?}");
+}
+

示例 5-12:增加属性来派生 Debug trait,并使用调试格式打印 Rectangle 实例

+

现在我们再运行这个程序时,就不会有任何错误,并会出现如下输出:

+
$ cargo run
+   Compiling rectangles v0.1.0 (file:///projects/rectangles)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s
+     Running `target/debug/rectangles`
+rect1 is Rectangle { width: 30, height: 50 }
+
+

好极了!这并不是最漂亮的输出,不过它显示这个实例的所有字段,毫无疑问这对调试有帮助。当我们有一个更大的结构体时,能有更易读一点的输出就好了,为此可以使用 {:#?} 替换 println! 字符串中的 {:?}。在这个例子中使用 {:#?} 风格将会输出如下:

+
$ cargo run
+   Compiling rectangles v0.1.0 (file:///projects/rectangles)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s
+     Running `target/debug/rectangles`
+rect1 is Rectangle {
+    width: 30,
+    height: 50,
+}
+
+

另一种使用 Debug 格式打印数值的方法是使用 dbg!dbg! 宏接收一个表达式的所有权(与 println! 宏相反,后者接收的是引用),打印出代码中调用 dbg! 宏时所在的文件和行号,以及该表达式的结果值,并返回该值的所有权。

+
+

注意:调用 dbg! 宏会打印到标准错误控制台流(stderr),与 println! 不同,后者会打印到标准输出控制台流(stdout)。我们将在第十二章 “将错误信息写入标准错误而不是标准输出” 一节中更多地讨论 stderrstdout

+
+

下面是一个例子,我们对分配给 width 字段的值以及 rect1 中整个结构的值感兴趣。

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+fn main() {
+    let scale = 2;
+    let rect1 = Rectangle {
+        width: dbg!(30 * scale),
+        height: 50,
+    };
+
+    dbg!(&rect1);
+}
+

我们可以把 dbg! 放在表达式 30 * scale 周围,因为 dbg! 返回表达式的值的所有权,所以 width 字段将获得相同的值,就像我们在那里没有 dbg! 调用一样。我们不希望 dbg! 拥有 rect1 的所有权,所以我们在下一次调用 dbg! 时传递一个引用。下面是这个例子的输出结果:

+
$ cargo run
+   Compiling rectangles v0.1.0 (file:///projects/rectangles)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.61s
+     Running `target/debug/rectangles`
+[src/main.rs:10:16] 30 * scale = 60
+[src/main.rs:14:5] &rect1 = Rectangle {
+    width: 60,
+    height: 50,
+}
+
+

我们可以看到第一点输出来自 src/main.rs 第 10 行,我们正在调试表达式 30 * scale,其结果值是 60(为整数实现的 Debug 格式化是只打印它们的值)。在 src/main.rs 第 14 行 的 dbg! 调用输出 &rect1 的值,即 Rectangle 结构。这个输出使用了更为易读的 Debug 格式。当你试图弄清楚你的代码在做什么时,dbg! 宏可能真的很有帮助!

+

除了 Debug trait,Rust 还为我们提供了很多可以通过 derive 属性来使用的 trait,它们可以为我们的自定义类型增加实用的行为。附录 C 中列出了这些 trait 和行为。第十章会介绍如何通过自定义行为来实现这些 trait,同时还有如何创建你自己的 trait。除了 derive 之外,还有很多属性;更多信息请参见 Rust Reference 的 Attributes 部分。

+

我们的 area 函数是非常特殊的,它只计算长方形的面积。如果这个行为与 Rectangle 结构体再结合得更紧密一些就更好了,因为它不能用于其他类型。现在让我们看看如何继续重构这些代码,来将 area 函数协调进 Rectangle 类型定义的 area 方法 中。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch05-03-method-syntax.html b/ch05-03-method-syntax.html new file mode 100644 index 000000000..57564dc18 --- /dev/null +++ b/ch05-03-method-syntax.html @@ -0,0 +1,458 @@ + + + + + + 方法语法 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

方法语法

+
+

ch05-03-method-syntax.md +
+commit d339373a838fd312a8a9bcc9487e1ffbc9e1582f

+
+

方法(method)与函数类似:它们使用 fn 关键字和名称声明,可以拥有参数和返回值,同时包含在某处调用该方法时会执行的代码。不过方法与函数是不同的,因为它们在结构体的上下文中被定义(或者是枚举或 trait 对象的上下文,将分别在第六章第十八章讲解),并且它们第一个参数总是 self,它代表调用该方法的结构体实例。

+

定义方法

+

让我们把前面实现的获取一个 Rectangle 实例作为参数的 area 函数,改写成一个定义于 Rectangle 结构体上的 area 方法,如示例 5-13 所示:

+

文件名:src/main.rs

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+impl Rectangle {
+    fn area(&self) -> u32 {
+        self.width * self.height
+    }
+}
+
+fn main() {
+    let rect1 = Rectangle {
+        width: 30,
+        height: 50,
+    };
+
+    println!(
+        "The area of the rectangle is {} square pixels.",
+        rect1.area()
+    );
+}
+

示例 5-13:在 Rectangle 结构体上定义 area 方法

+

为了使函数定义于 Rectangle 的上下文中,我们开始了一个 impl 块(implimplementation 的缩写),这个 impl 块中的所有内容都将与 Rectangle 类型相关联。接着将 area 函数移动到 impl 大括号中,并将签名中的第一个(在这里也是唯一一个)参数和函数体中其他地方的对应参数改成 self。然后在 main 中将我们先前调用 area 方法并传递 rect1 作为参数的地方,改成使用 方法语法method syntax)在 Rectangle 实例上调用 area 方法。方法语法获取一个实例并加上一个点号,后跟方法名、圆括号以及任何参数。

+

area 的签名中,使用 &self 来替代 rectangle: &Rectangle&self 实际上是 self: &Self 的缩写。在一个 impl 块中,Self 类型是 impl 块的类型的别名。方法的第一个参数必须有一个名为 selfSelf 类型的参数,所以 Rust 让你在第一个参数位置上只用 self 这个名字来简化。注意,我们仍然需要在 self 前面使用 & 来表示这个方法借用了 Self 实例,就像我们在 rectangle: &Rectangle 中做的那样。方法可以选择获得 self 的所有权,或者像我们这里一样不可变地借用 self,或者可变地借用 self,就跟其他参数一样。

+

这里选择 &self 的理由跟在函数版本中使用 &Rectangle 是相同的:我们并不想获取所有权,只希望能够读取结构体中的数据,而不是写入。如果想要在方法中改变调用方法的实例,需要将第一个参数改为 &mut self。通过仅仅使用 self 作为第一个参数来使方法获取实例的所有权是很少见的;这种技术通常用在当方法将 self 转换成别的实例的时候,这时我们想要防止调用者在转换之后使用原始的实例。

+

使用方法替代函数,除了可使用方法语法和不需要在每个函数签名中重复 self 的类型之外,其主要好处在于组织性。我们将某个类型实例能做的所有事情都一起放入 impl 块中,而不是让将来的用户在我们的库中到处寻找 Rectangle 的功能。

+

请注意,我们可以选择将方法的名称与结构中的一个字段相同。例如,我们可以在 Rectangle 上定义一个方法,并命名为 width

+

文件名:src/main.rs

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+impl Rectangle {
+    fn width(&self) -> bool {
+        self.width > 0
+    }
+}
+
+fn main() {
+    let rect1 = Rectangle {
+        width: 30,
+        height: 50,
+    };
+
+    if rect1.width() {
+        println!("The rectangle has a nonzero width; it is {}", rect1.width);
+    }
+}
+

在这里,我们选择让 width 方法在实例的 width 字段的值大于 0 时返回 true,等于 0 时则返回 false:我们可以出于任何目的,在同名的方法中使用同名的字段。在 main 中,当我们在 rect1.width 后面加上括号时。Rust 知道我们指的是方法 width。当我们不使用圆括号时,Rust 知道我们指的是字段 width

+

通常,但并不总是如此,与字段同名的方法将被定义为只返回字段中的值,而不做其他事情。这样的方法被称为 getters,Rust 并不像其他一些语言那样为结构字段自动实现它们。Getters 很有用,因为你可以把字段变成私有的,但方法是公共的,这样就可以把对字段的只读访问作为该类型公共 API 的一部分。我们将在第七章中讨论什么是公有和私有,以及如何将一个字段或方法指定为公有或私有。

+
+

-> 运算符到哪去了?

+

在 C/C++ 语言中,有两个不同的运算符来调用方法:. 直接在对象上调用方法,而 -> 在一个对象的指针上调用方法,这时需要先解引用(dereference)指针。换句话说,如果 object 是一个指针,那么 object->something() 就像 (*object).something() 一样。

+

Rust 并没有一个与 -> 等效的运算符;相反,Rust 有一个叫 自动引用和解引用automatic referencing and dereferencing)的功能。方法调用是 Rust 中少数几个拥有这种行为的地方。

+

它是这样工作的:当使用 object.something() 调用方法时,Rust 会自动为 object 添加 &&mut* 以便使 object 与方法签名匹配。也就是说,这些代码是等价的:

+
#![allow(unused)]
+fn main() {
+#[derive(Debug,Copy,Clone)]
+struct Point {
+    x: f64,
+    y: f64,
+}
+
+impl Point {
+   fn distance(&self, other: &Point) -> f64 {
+       let x_squared = f64::powi(other.x - self.x, 2);
+       let y_squared = f64::powi(other.y - self.y, 2);
+
+       f64::sqrt(x_squared + y_squared)
+   }
+}
+let p1 = Point { x: 0.0, y: 0.0 };
+let p2 = Point { x: 5.0, y: 6.5 };
+p1.distance(&p2);
+(&p1).distance(&p2);
+}
+

第一行看起来简洁的多。这种自动引用的行为之所以有效,是因为方法有一个明确的接收者———— self 的类型。在给出接收者和方法名的前提下,Rust 可以明确地计算出方法是仅仅读取(&self),做出修改(&mut self)或者是获取所有权(self)。事实上,Rust 对方法接收者的隐式借用让所有权在实践中更友好。

+
+

带有更多参数的方法

+

让我们通过实现 Rectangle 结构体上的另一方法来练习使用方法。这回,我们让一个 Rectangle 的实例获取另一个 Rectangle 实例,如果 self (第一个 Rectangle)能完全包含第二个长方形则返回 true;否则返回 false。一旦我们定义了 can_hold 方法,就可以编写示例 5-14 中的代码。

+

文件名:src/main.rs

+
fn main() {
+    let rect1 = Rectangle {
+        width: 30,
+        height: 50,
+    };
+    let rect2 = Rectangle {
+        width: 10,
+        height: 40,
+    };
+    let rect3 = Rectangle {
+        width: 60,
+        height: 45,
+    };
+
+    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
+    println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));
+}
+

示例 5-14:使用还未实现的 can_hold 方法

+

同时我们希望看到如下输出,因为 rect2 的两个维度都小于 rect1,而 rect3rect1 要宽:

+
Can rect1 hold rect2? true
+Can rect1 hold rect3? false
+
+

因为我们想定义一个方法,所以它应该位于 impl Rectangle 块中。方法名是 can_hold,并且它会获取另一个 Rectangle 的不可变借用作为参数。通过观察调用方法的代码可以看出参数是什么类型的:rect1.can_hold(&rect2) 传入了 &rect2,它是一个 Rectangle 的实例 rect2 的不可变借用。这是可以理解的,因为我们只需要读取 rect2(而不是写入,这意味着我们需要一个不可变借用),而且希望 main 保持 rect2 的所有权,这样就可以在调用这个方法后继续使用它。can_hold 的返回值是一个布尔值,其实现会分别检查 self 的宽高是否都大于另一个 Rectangle。让我们在示例 5-13 的 impl 块中增加这个新的 can_hold 方法,如示例 5-15 所示:

+

文件名:src/main.rs

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+impl Rectangle {
+    fn area(&self) -> u32 {
+        self.width * self.height
+    }
+
+    fn can_hold(&self, other: &Rectangle) -> bool {
+        self.width > other.width && self.height > other.height
+    }
+}
+
+fn main() {
+    let rect1 = Rectangle {
+        width: 30,
+        height: 50,
+    };
+    let rect2 = Rectangle {
+        width: 10,
+        height: 40,
+    };
+    let rect3 = Rectangle {
+        width: 60,
+        height: 45,
+    };
+
+    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
+    println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));
+}
+

示例 5-15:在 Rectangle 上实现 can_hold 方法,它获取另一个 Rectangle 实例作为参数

+

如果结合示例 5-14 的 main 函数来运行,就会看到期望的输出。在方法签名中,可以在 self 后增加多个参数,而且这些参数就像函数中的参数一样工作。

+

关联函数

+

所有在 impl 块中定义的函数被称为 关联函数associated functions),因为它们与 impl 后面命名的类型相关。我们可以定义不以 self 为第一参数的关联函数(因此不是方法),因为它们并不作用于一个结构体的实例。我们已经使用了一个这样的函数:在 String 类型上定义的 String::from 函数。

+

不是方法的关联函数经常被用作返回一个结构体新实例的构造函数。这些函数的名称通常为 new ,但 new 并不是一个关键字。例如我们可以提供一个叫做 square 关联函数,它接受一个维度参数并且同时作为宽和高,这样可以更轻松的创建一个正方形 Rectangle 而不必指定两次同样的值:

+

文件名:src/main.rs

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+impl Rectangle {
+    fn square(size: u32) -> Self {
+        Self {
+            width: size,
+            height: size,
+        }
+    }
+}
+
+fn main() {
+    let sq = Rectangle::square(3);
+}
+

关键字 Self 在函数的返回类型中代指在 impl 关键字后出现的类型,在这里是 Rectangle

+

使用结构体名和 :: 语法来调用这个关联函数:比如 let sq = Rectangle::square(3);。这个函数位于结构体的命名空间中::: 语法用于关联函数和模块创建的命名空间。第七章会讲到模块。

+

多个 impl

+

每个结构体都允许拥有多个 impl 块。例如,示例 5-16 中的代码等同于示例 5-15,但每个方法有其自己的 impl 块。

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+impl Rectangle {
+    fn area(&self) -> u32 {
+        self.width * self.height
+    }
+}
+
+impl Rectangle {
+    fn can_hold(&self, other: &Rectangle) -> bool {
+        self.width > other.width && self.height > other.height
+    }
+}
+
+fn main() {
+    let rect1 = Rectangle {
+        width: 30,
+        height: 50,
+    };
+    let rect2 = Rectangle {
+        width: 10,
+        height: 40,
+    };
+    let rect3 = Rectangle {
+        width: 60,
+        height: 45,
+    };
+
+    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
+    println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));
+}
+

示例 5-16:使用多个 impl 块重写示例 5-15

+

这里没有理由将这些方法分散在多个 impl 块中,不过这是有效的语法。第十章讨论泛型和 trait 时会看到实用的多 impl 块的用例。

+

总结

+

结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,让你指定结构体的实例所具有的行为。

+

但结构体并不是创建自定义类型的唯一方法:让我们转向 Rust 的枚举功能,为你的工具箱再添一个工具。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch06-00-enums.html b/ch06-00-enums.html new file mode 100644 index 000000000..d5157d47a --- /dev/null +++ b/ch06-00-enums.html @@ -0,0 +1,245 @@ + + + + + + 枚举和模式匹配 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

枚举和模式匹配

+
+

ch06-00-enums.md +
+commit bb7e429ad6b59d9a0c37db7434976364cbb9c6da

+
+

本章介绍 枚举enumerations),也被称作 enums。枚举允许你通过列举可能的 成员variants)来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做 Option,它代表一个值要么是某个值要么什么都不是。然后会讲到在 match 表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。最后会介绍 if let,另一个简洁方便处理代码中枚举的结构。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch06-01-defining-an-enum.html b/ch06-01-defining-an-enum.html new file mode 100644 index 000000000..ba33d9778 --- /dev/null +++ b/ch06-01-defining-an-enum.html @@ -0,0 +1,489 @@ + + + + + + 枚举的定义 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

枚举的定义

+
+

ch06-01-defining-an-enum.md +
+commit bb7e429ad6b59d9a0c37db7434976364cbb9c6da

+
+

结构体给予你将字段和数据聚合在一起的方法,像 Rectangle 结构体有 widthheight 两个字段。而枚举给予你一个途径去声明某个值是一个集合中的一员。比如,我们想让 Rectangle 是一些形状的集合,包含 CircleTriangle 。为了做到这个,Rust 提供了枚举类型。

+

让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4(version four)和 IPv6(version six)。这是我们的程序可能会遇到的所有可能的 IP 地址类型:所以可以 枚举 出所有可能的值,这也正是此枚举名字的由来。

+

任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能两者都是。IP 地址的这个特性使得枚举数据结构非常适合这个场景,因为枚举值只可能是其中一个成员。IPv4 和 IPv6 从根本上讲仍是 IP 地址,所以当代码在处理适用于任何类型的 IP 地址的场景时应该把它们当作相同的类型。

+

可以通过在代码中定义一个 IpAddrKind 枚举来表现这个概念并列出可能的 IP 地址类型,V4V6。这被称为枚举的 成员variants):

+
enum IpAddrKind {
+    V4,
+    V6,
+}
+
+fn main() {
+    let four = IpAddrKind::V4;
+    let six = IpAddrKind::V6;
+
+    route(IpAddrKind::V4);
+    route(IpAddrKind::V6);
+}
+
+fn route(ip_kind: IpAddrKind) {}
+

现在 IpAddrKind 就是一个可以在代码中使用的自定义数据类型了。

+

枚举值

+

可以像这样创建 IpAddrKind 两个不同成员的实例:

+
enum IpAddrKind {
+    V4,
+    V6,
+}
+
+fn main() {
+    let four = IpAddrKind::V4;
+    let six = IpAddrKind::V6;
+
+    route(IpAddrKind::V4);
+    route(IpAddrKind::V6);
+}
+
+fn route(ip_kind: IpAddrKind) {}
+

注意枚举的成员位于其标识符的命名空间中,并使用两个冒号分开。这么设计的益处是现在 IpAddrKind::V4IpAddrKind::V6 都是 IpAddrKind 类型的。例如,接着可以定义一个函数来接收任何 IpAddrKind类型的参数:

+
enum IpAddrKind {
+    V4,
+    V6,
+}
+
+fn main() {
+    let four = IpAddrKind::V4;
+    let six = IpAddrKind::V6;
+
+    route(IpAddrKind::V4);
+    route(IpAddrKind::V6);
+}
+
+fn route(ip_kind: IpAddrKind) {}
+

现在可以使用任一成员来调用这个函数:

+
enum IpAddrKind {
+    V4,
+    V6,
+}
+
+fn main() {
+    let four = IpAddrKind::V4;
+    let six = IpAddrKind::V6;
+
+    route(IpAddrKind::V4);
+    route(IpAddrKind::V6);
+}
+
+fn route(ip_kind: IpAddrKind) {}
+

使用枚举甚至还有更多优势。进一步考虑一下我们的 IP 地址类型,目前没有一个存储实际 IP 地址 数据 的方法;只知道它是什么 类型 的。考虑到已经在第五章学习过结构体了,你可能会像示例 6-1 那样处理这个问题:

+
fn main() {
+    enum IpAddrKind {
+        V4,
+        V6,
+    }
+
+    struct IpAddr {
+        kind: IpAddrKind,
+        address: String,
+    }
+
+    let home = IpAddr {
+        kind: IpAddrKind::V4,
+        address: String::from("127.0.0.1"),
+    };
+
+    let loopback = IpAddr {
+        kind: IpAddrKind::V6,
+        address: String::from("::1"),
+    };
+}
+

示例 6-1:将 IP 地址的数据和 IpAddrKind 成员存储在一个 struct

+

这里我们定义了一个有两个字段的结构体 IpAddrIpAddrKind(之前定义的枚举)类型的 kind 字段和 String 类型 address 字段。我们有这个结构体的两个实例。第一个,home,它的 kind 的值是 IpAddrKind::V4 与之相关联的地址数据是 127.0.0.1。第二个实例,loopbackkind 的值是 IpAddrKind 的另一个成员,V6,关联的地址是 ::1。我们使用了一个结构体来将 kindaddress 打包在一起,现在枚举成员就与值相关联了。

+

我们可以使用一种更简洁的方式来表达相同的概念,仅仅使用枚举并将数据直接放进每一个枚举成员而不是将枚举作为结构体的一部分。IpAddr 枚举的新定义表明了 V4V6 成员都关联了 String 值:

+
fn main() {
+    enum IpAddr {
+        V4(String),
+        V6(String),
+    }
+
+    let home = IpAddr::V4(String::from("127.0.0.1"));
+
+    let loopback = IpAddr::V6(String::from("::1"));
+}
+

我们直接将数据附加到枚举的每个成员上,这样就不需要一个额外的结构体了。这里也很容易看出枚举工作的另一个细节:每一个我们定义的枚举成员的名字也变成了一个构建枚举的实例的函数。也就是说,IpAddr::V4() 是一个获取 String 参数并返回 IpAddr 类型实例的函数调用。作为定义枚举的结果,这些构造函数会自动被定义。

+

用枚举替代结构体还有另一个优势:每个成员可以处理不同类型和数量的数据。IPv4 版本的 IP 地址总是含有四个值在 0 和 255 之间的数字部分。如果我们想要将 V4 地址存储为四个 u8 值而 V6 地址仍然表现为一个 String,这就不能使用结构体了。枚举则可以轻易的处理这个情况:

+
fn main() {
+    enum IpAddr {
+        V4(u8, u8, u8, u8),
+        V6(String),
+    }
+
+    let home = IpAddr::V4(127, 0, 0, 1);
+
+    let loopback = IpAddr::V6(String::from("::1"));
+}
+

这些代码展示了使用枚举来存储两种不同 IP 地址的几种可能的选择。然而,事实证明存储和编码 IP 地址实在是太常见了以致标准库提供了一个开箱即用的定义!让我们看看标准库是如何定义 IpAddr 的:它正有着跟我们定义和使用的一样的枚举和成员,不过它将成员中的地址数据嵌入到了两个不同形式的结构体中,它们对不同的成员的定义是不同的:

+
#![allow(unused)]
+fn main() {
+struct Ipv4Addr {
+    // --snip--
+}
+
+struct Ipv6Addr {
+    // --snip--
+}
+
+enum IpAddr {
+    V4(Ipv4Addr),
+    V6(Ipv6Addr),
+}
+}
+

这些代码展示了可以将任意类型的数据放入枚举成员中:例如字符串、数字类型或者结构体。甚至可以包含另一个枚举!另外,标准库中的类型通常并不比你设想出来的要复杂多少。

+

注意虽然标准库中包含一个 IpAddr 的定义,仍然可以创建和使用我们自己的定义而不会有冲突,因为我们并没有将标准库中的定义引入作用域。第七章会讲到如何导入类型。

+

来看看示例 6-2 中的另一个枚举的例子:它的成员中内嵌了多种多样的类型:

+
enum Message {
+    Quit,
+    Move { x: i32, y: i32 },
+    Write(String),
+    ChangeColor(i32, i32, i32),
+}
+
+fn main() {}
+

示例 6-2:一个 Message 枚举,其每个成员都存储了不同数量和类型的值

+

这个枚举有四个含有不同类型的成员:

+
    +
  • Quit 没有关联任何数据。
  • +
  • Move 类似结构体包含命名字段。
  • +
  • Write 包含单独一个 String
  • +
  • ChangeColor 包含三个 i32
  • +
+

定义一个如示例 6-2 中所示那样的有关联值的枚举的方式和定义多个不同类型的结构体的方式很相像,除了枚举不使用 struct 关键字以及其所有成员都被组合在一起位于 Message 类型下。如下这些结构体可以包含与之前枚举成员中相同的数据:

+
struct QuitMessage; // 类单元结构体
+struct MoveMessage {
+    x: i32,
+    y: i32,
+}
+struct WriteMessage(String); // 元组结构体
+struct ChangeColorMessage(i32, i32, i32); // 元组结构体
+
+fn main() {}
+

不过,如果我们使用不同的结构体,由于它们都有不同的类型,我们将不能像使用示例 6-2 中定义的 Message 枚举那样,轻易的定义一个能够处理这些不同类型的结构体的函数,因为枚举是单独一个类型。

+

结构体和枚举还有另一个相似点:就像可以使用 impl 来为结构体定义方法那样,也可以在枚举上定义方法。这是一个定义于我们 Message 枚举上的叫做 call 的方法:

+
fn main() {
+    enum Message {
+        Quit,
+        Move { x: i32, y: i32 },
+        Write(String),
+        ChangeColor(i32, i32, i32),
+    }
+
+    impl Message {
+        fn call(&self) {
+            // 在这里定义方法体
+        }
+    }
+
+    let m = Message::Write(String::from("hello"));
+    m.call();
+}
+

方法体使用了 self 来获取调用方法的值。这个例子中,创建了一个值为 Message::Write(String::from("hello")) 的变量 m,而且这就是当 m.call() 运行时 call 方法中的 self 的值。

+

让我们看看标准库中的另一个非常常见且实用的枚举:Option

+

Option 枚举和其相对于空值的优势

+

这一部分会分析一个 Option 的案例,Option 是标准库定义的另一个枚举。Option 类型应用广泛因为它编码了一个非常普遍的场景,即一个值要么有值要么没值。

+

例如,如果请求一个非空列表的第一项,会得到一个值,如果请求一个空的列表,就什么也不会得到。从类型系统的角度来表达这个概念就意味着编译器需要检查是否处理了所有应该处理的情况,这样就可以避免在其他编程语言中非常常见的 bug。

+

编程语言的设计经常要考虑包含哪些功能,但考虑排除哪些功能也很重要。Rust 并没有很多其他语言中有的空值功能。空值Null )是一个值,它代表没有值。在有空值的语言中,变量总是这两种状态之一:空值和非空值。

+

Tony Hoare,null 的发明者,在他 2009 年的演讲 “Null References: The Billion Dollar Mistake” 中曾经说到:

+
+

I call it my billion-dollar mistake. At that time, I was designing the first +comprehensive type system for references in an object-oriented language. My +goal was to ensure that all use of references should be absolutely safe, with +checking performed automatically by the compiler. But I couldn't resist the +temptation to put in a null reference, simply because it was so easy to +implement. This has led to innumerable errors, vulnerabilities, and system +crashes, which have probably caused a billion dollars of pain and damage in +the last forty years.

+

我称之为我十亿美元的错误。当时,我在为一个面向对象语言设计第一个综合性的面向引用的类型系统。我的目标是通过编译器的自动检查来保证所有引用的使用都应该是绝对安全的。不过我未能抵抗住引入一个空引用的诱惑,仅仅是因为它是这么的容易实现。这引发了无数错误、漏洞和系统崩溃,在之后的四十多年中造成了数十亿美元的苦痛和伤害。

+
+

空值的问题在于当你尝试像一个非空值那样使用一个空值,会出现某种形式的错误。因为空和非空的属性无处不在,非常容易出现这类错误。

+

然而,空值尝试表达的概念仍然是有意义的:空值是一个因为某种原因目前无效或缺失的值。

+

问题不在于概念而在于具体的实现。为此,Rust 并没有空值,不过它确实拥有一个可以编码存在或不存在概念的枚举。这个枚举是 Option<T>,而且它定义于标准库中,如下:

+
#![allow(unused)]
+fn main() {
+enum Option<T> {
+    None,
+    Some(T),
+}
+}
+

Option<T> 枚举是如此有用以至于它甚至被包含在了 prelude 之中,你不需要将其显式引入作用域。另外,它的成员也是如此,可以不需要 Option:: 前缀来直接使用 SomeNone。即便如此 Option<T> 也仍是常规的枚举,Some(T)None 仍是 Option<T> 的成员。

+

<T> 语法是一个我们还未讲到的 Rust 功能。它是一个泛型类型参数,第十章会更详细的讲解泛型。目前,所有你需要知道的就是 <T> 意味着 Option 枚举的 Some 成员可以包含任意类型的数据,同时每一个用于 T 位置的具体类型使得 Option<T> 整体作为不同的类型。这里是一些包含数字类型和字符串类型 Option 值的例子:

+
fn main() {
+    let some_number = Some(5);
+    let some_char = Some('e');
+
+    let absent_number: Option<i32> = None;
+}
+

some_number 的类型是 Option<i32>some_char 的类型是 Option<char>,是不同于some_number的类型。因为我们在 Some 成员中指定了值,Rust 可以推断其类型。对于 absent_number,Rust 需要我们指定 Option 整体的类型,因为编译器只通过 None 值无法推断出 Some 成员保存的值的类型。这里我们告诉 Rust 希望 absent_numberOption<i32> 类型的。

+

当有一个 Some 值时,我们就知道存在一个值,而这个值保存在 Some 中。当有个 None 值时,在某种意义上,它跟空值具有相同的意义:并没有一个有效的值。那么,Option<T> 为什么就比空值要好呢?

+

简而言之,因为 Option<T>T(这里 T 可以是任何类型)是不同的类型,编译器不允许像一个肯定有效的值那样使用 Option<T>。例如,这段代码不能编译,因为它尝试将 Option<i8>i8 相加:

+
fn main() {
+    let x: i8 = 5;
+    let y: Option<i8> = Some(5);
+
+    let sum = x + y;
+}
+

如果运行这些代码,将得到类似这样的错误信息:

+
$ cargo run
+   Compiling enums v0.1.0 (file:///projects/enums)
+error[E0277]: cannot add `Option<i8>` to `i8`
+ --> src/main.rs:5:17
+  |
+5 |     let sum = x + y;
+  |                 ^ no implementation for `i8 + Option<i8>`
+  |
+  = help: the trait `Add<Option<i8>>` is not implemented for `i8`
+  = help: the following other types implement trait `Add<Rhs>`:
+            `&'a i8` implements `Add<i8>`
+            `&i8` implements `Add<&i8>`
+            `i8` implements `Add<&i8>`
+            `i8` implements `Add`
+
+For more information about this error, try `rustc --explain E0277`.
+error: could not compile `enums` (bin "enums") due to 1 previous error
+
+

很好!事实上,错误信息意味着 Rust 不知道该如何将 Option<i8>i8 相加,因为它们的类型不同。当在 Rust 中拥有一个像 i8 这样类型的值时,编译器确保它总是有一个有效的值。我们可以自信使用而无需做空值检查。只有当使用 Option<i8>(或者任何用到的类型)的时候需要担心可能没有值,而编译器会确保我们在使用值之前处理了为空的情况。

+

换句话说,在对 Option<T> 进行运算之前必须将其转换为 T。通常这能帮助我们捕获到空值最常见的问题之一:假设某值不为空但实际上为空的情况。

+

消除了错误地假设一个非空值的风险,会让你对代码更加有信心。为了拥有一个可能为空的值,你必须要显式的将其放入对应类型的 Option<T> 中。接着,当使用这个值时,必须明确的处理值为空的情况。只要一个值不是 Option<T> 类型,你就 可以 安全的认定它的值不为空。这是 Rust 的一个经过深思熟虑的设计决策,来限制空值的泛滥以增加 Rust 代码的安全性。

+

那么当有一个 Option<T> 的值时,如何从 Some 成员中取出 T 的值来使用它呢?Option<T> 枚举拥有大量用于各种情况的方法:你可以查看它的文档。熟悉 Option<T> 的方法将对你的 Rust 之旅非常有用。

+

总的来说,为了使用 Option<T> 值,需要编写处理每个成员的代码。你想要一些代码只当拥有 Some(T) 值时运行,允许这些代码使用其中的 T。也希望一些代码只在值为 None 时运行,这些代码并没有一个可用的 T 值。match 表达式就是这么一个处理枚举的控制流结构:它会根据枚举的成员运行不同的代码,这些代码可以使用匹配到的值中的数据。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch06-02-match.html b/ch06-02-match.html new file mode 100644 index 000000000..fb0ef8d3c --- /dev/null +++ b/ch06-02-match.html @@ -0,0 +1,484 @@ + + + + + + match 控制流结构 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

match 控制流结构

+
+

ch06-02-match.md +
+commit 3962c0224b274e2358e0acf06443af64df115359

+
+

Rust 有一个叫做 match 的极为强大的控制流运算符,它允许我们将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。模式可由字面值、变量、通配符和许多其他内容构成;第十九章会涉及到所有不同种类的模式以及它们的作用。match 的力量来源于模式的表现力以及编译器检查,它确保了所有可能的情况都得到处理。

+

可以把 match 表达式想象成某种硬币分类器:硬币滑入有着不同大小孔洞的轨道,每一个硬币都会掉入符合它大小的孔洞。同样地,值也会通过 match 的每一个模式,并且在遇到第一个 “符合” 的模式时,值会进入相关联的代码块并在执行中被使用。

+

因为刚刚提到了硬币,让我们用它们来作为一个使用 match 的例子!我们可以编写一个函数来获取一个未知的硬币,并以一种类似验钞机的方式,确定它是何种硬币并返回它的美分值,如示例 6-3 中所示。

+
enum Coin {
+    Penny,
+    Nickel,
+    Dime,
+    Quarter,
+}
+
+fn value_in_cents(coin: Coin) -> u8 {
+    match coin {
+        Coin::Penny => 1,
+        Coin::Nickel => 5,
+        Coin::Dime => 10,
+        Coin::Quarter => 25,
+    }
+}
+
+fn main() {}
+

示例 6-3:一个枚举和一个以枚举成员作为模式的 match 表达式

+

拆开 value_in_cents 函数中的 match 来看。首先,我们列出 match 关键字后跟一个表达式,在这个例子中是 coin 的值。这看起来非常像 if 所使用的条件表达式,不过这里有一个非常大的区别:对于 if,表达式必须返回一个布尔值,而这里它可以是任何类型的。例子中的 coin 的类型是示例 6-3 中定义的 Coin 枚举。

+

接下来是 match 的分支。一个分支有两个部分:一个模式和一些代码。第一个分支的模式是值 Coin::Penny 而之后的 => 运算符将模式和将要运行的代码分开。这里的代码就仅仅是值 1。每一个分支之间使用逗号分隔。

+

match 表达式执行时,它将结果值按顺序与每一个分支的模式相比较。如果模式匹配了这个值,这个模式相关联的代码将被执行。如果模式并不匹配这个值,将继续执行下一个分支,非常类似一个硬币分类器。可以拥有任意多的分支:示例 6-3 中的 match 有四个分支。

+

每个分支相关联的代码是一个表达式,而表达式的结果值将作为整个 match 表达式的返回值。

+

如果分支代码较短的话通常不使用大括号,正如示例 6-3 中的每个分支都只是返回一个值。如果想要在分支中运行多行代码,可以使用大括号,而分支后的逗号是可选的。例如,如下代码在每次使用Coin::Penny 调用时都会打印出 “Lucky penny!”,同时仍然返回代码块最后的值,1

+
enum Coin {
+    Penny,
+    Nickel,
+    Dime,
+    Quarter,
+}
+
+fn value_in_cents(coin: Coin) -> u8 {
+    match coin {
+        Coin::Penny => {
+            println!("Lucky penny!");
+            1
+        }
+        Coin::Nickel => 5,
+        Coin::Dime => 10,
+        Coin::Quarter => 25,
+    }
+}
+
+fn main() {}
+

绑定值的模式

+

匹配分支的另一个有用的功能是可以绑定匹配的模式的部分值。这也就是如何从枚举成员中提取值的。

+

作为一个例子,让我们修改枚举的一个成员来存放数据。1999 年到 2008 年间,美国在 25 美分的硬币的一侧为 50 个州的每一个都印刷了不同的设计。其他的硬币都没有这种区分州的设计,所以只有这些 25 美分硬币有特殊的价值。可以将这些信息加入我们的 enum,通过改变 Quarter 成员来包含一个 State 值,示例 6-4 中完成了这些修改:

+
#[derive(Debug)] // 这样可以立刻看到州的名称
+enum UsState {
+    Alabama,
+    Alaska,
+    // --snip--
+}
+
+enum Coin {
+    Penny,
+    Nickel,
+    Dime,
+    Quarter(UsState),
+}
+
+fn main() {}
+

示例 6-4:Quarter 成员也存放了一个 UsState 值的 Coin 枚举

+

想象一下我们的一个朋友尝试收集所有 50 个州的 25 美分硬币。在根据硬币类型分类零钱的同时,也可以报告出每个 25 美分硬币所对应的州名称,这样如果我们的朋友没有的话,他可以将其加入收藏。

+

在这些代码的匹配表达式中,我们在匹配 Coin::Quarter 成员的分支的模式中增加了一个叫做 state 的变量。当匹配到 Coin::Quarter 时,变量 state 将会绑定 25 美分硬币所对应州的值。接着在那个分支的代码中使用 state,如下:

+
#[derive(Debug)]
+enum UsState {
+    Alabama,
+    Alaska,
+    // --snip--
+}
+
+enum Coin {
+    Penny,
+    Nickel,
+    Dime,
+    Quarter(UsState),
+}
+
+fn value_in_cents(coin: Coin) -> u8 {
+    match coin {
+        Coin::Penny => 1,
+        Coin::Nickel => 5,
+        Coin::Dime => 10,
+        Coin::Quarter(state) => {
+            println!("State quarter from {state:?}!");
+            25
+        }
+    }
+}
+
+fn main() {
+    value_in_cents(Coin::Quarter(UsState::Alaska));
+}
+

如果调用 value_in_cents(Coin::Quarter(UsState::Alaska))coin 将是 Coin::Quarter(UsState::Alaska)。当将值与每个分支相比较时,没有分支会匹配,直到遇到 Coin::Quarter(state)。这时,state 绑定的将会是值 UsState::Alaska。接着就可以在 println! 表达式中使用这个绑定了,像这样就可以获取 Coin 枚举的 Quarter 成员中内部的州的值。

+

匹配 Option<T>

+

我们在之前的部分中使用 Option<T> 时,是为了从 Some 中取出其内部的 T 值;我们还可以像处理 Coin 枚举那样使用 match 处理 Option<T>!只不过这回比较的不再是硬币,而是 Option<T> 的成员,但 match 表达式的工作方式保持不变。

+

比如我们想要编写一个函数,它获取一个 Option<i32> ,如果其中含有一个值,将其加一。如果其中没有值,函数应该返回 None 值,而不尝试执行任何操作。

+

得益于 match,编写这个函数非常简单,它将看起来像示例 6-5 中这样:

+
fn main() {
+    fn plus_one(x: Option<i32>) -> Option<i32> {
+        match x {
+            None => None,
+            Some(i) => Some(i + 1),
+        }
+    }
+
+    let five = Some(5);
+    let six = plus_one(five);
+    let none = plus_one(None);
+}
+

示例 6-5:一个在 Option<i32> 上使用 match 表达式的函数

+

匹配 Some(T)

+

让我们更仔细地检查 plus_one 的第一行操作。当调用 plus_one(five) 时,plus_one 函数体中的 x 将会是值 Some(5)。接着将其与每个分支比较。

+
fn main() {
+    fn plus_one(x: Option<i32>) -> Option<i32> {
+        match x {
+            None => None,
+            Some(i) => Some(i + 1),
+        }
+    }
+
+    let five = Some(5);
+    let six = plus_one(five);
+    let none = plus_one(None);
+}
+

Some(5) 并不匹配模式 None,所以继续进行下一个分支。

+
fn main() {
+    fn plus_one(x: Option<i32>) -> Option<i32> {
+        match x {
+            None => None,
+            Some(i) => Some(i + 1),
+        }
+    }
+
+    let five = Some(5);
+    let six = plus_one(five);
+    let none = plus_one(None);
+}
+

Some(5)Some(i) 匹配吗?当然匹配!它们是相同的成员。i 绑定了 Some 中包含的值,所以 i 的值是 5。接着匹配分支的代码被执行,所以我们将 i 的值加一并返回一个含有值 6 的新 Some

+

接着考虑下示例 6-5 中 plus_one 的第二个调用,这里 xNone。我们进入 match 并与第一个分支相比较。

+
fn main() {
+    fn plus_one(x: Option<i32>) -> Option<i32> {
+        match x {
+            None => None,
+            Some(i) => Some(i + 1),
+        }
+    }
+
+    let five = Some(5);
+    let six = plus_one(five);
+    let none = plus_one(None);
+}
+

匹配上了!这里没有值来加一,所以程序结束并返回 => 右侧的值 None,因为第一个分支就匹配到了,其他的分支将不再比较。

+

match 与枚举相结合在很多场景中都是有用的。你会在 Rust 代码中看到很多这样的模式:match 一个枚举,绑定其中的值到一个变量,接着根据其值执行代码。这在一开始有点复杂,不过一旦习惯了,你会希望所有语言都拥有它!这一直是用户的最爱。

+

匹配是穷尽的

+

match 还有另一方面需要讨论:这些分支必须覆盖了所有的可能性。考虑一下 plus_one 函数的这个版本,它有一个 bug 并不能编译:

+
fn main() {
+    fn plus_one(x: Option<i32>) -> Option<i32> {
+        match x {
+            Some(i) => Some(i + 1),
+        }
+    }
+
+    let five = Some(5);
+    let six = plus_one(five);
+    let none = plus_one(None);
+}
+

我们没有处理 None 的情况,所以这些代码会造成一个 bug。幸运的是,这是一个 Rust 知道如何处理的 bug。如果尝试编译这段代码,会得到这个错误:

+
$ cargo run
+   Compiling enums v0.1.0 (file:///projects/enums)
+error[E0004]: non-exhaustive patterns: `None` not covered
+ --> src/main.rs:3:15
+  |
+3 |         match x {
+  |               ^ pattern `None` not covered
+  |
+note: `Option<i32>` defined here
+ --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/option.rs:574:1
+ ::: /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/option.rs:578:5
+  |
+  = note: not covered
+  = note: the matched value is of type `Option<i32>`
+help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
+  |
+4 ~             Some(i) => Some(i + 1),
+5 ~             None => todo!(),
+  |
+
+For more information about this error, try `rustc --explain E0004`.
+error: could not compile `enums` (bin "enums") due to 1 previous error
+
+

Rust 知道我们没有覆盖所有可能的情况甚至知道哪些模式被忘记了!Rust 中的匹配是 穷尽的exhaustive):必须穷举到最后的可能性来使代码有效。特别的在这个 Option<T> 的例子中,Rust 防止我们忘记明确的处理 None 的情况,这让我们免于假设拥有一个实际上为空的值,从而使之前提到的价值亿万的错误不可能发生。

+

通配模式和 _ 占位符

+

让我们看一个例子,我们希望对一些特定的值采取特殊操作,而对其他的值采取默认操作。想象我们正在玩一个游戏,如果你掷出骰子的值为 3,角色不会移动,而是会得到一顶新奇的帽子。如果你掷出了 7,你的角色将失去新奇的帽子。对于其他的数值,你的角色会在棋盘上移动相应的格子。这是一个实现了上述逻辑的 match,骰子的结果是硬编码而不是一个随机值,其他的逻辑部分使用了没有函数体的函数来表示,实现它们超出了本例的范围:

+
fn main() {
+    let dice_roll = 9;
+    match dice_roll {
+        3 => add_fancy_hat(),
+        7 => remove_fancy_hat(),
+        other => move_player(other),
+    }
+
+    fn add_fancy_hat() {}
+    fn remove_fancy_hat() {}
+    fn move_player(num_spaces: u8) {}
+}
+

对于前两个分支,匹配模式是字面值 37,最后一个分支则涵盖了所有其他可能的值,模式是我们命名为 other 的一个变量。other 分支的代码通过将其传递给 move_player 函数来使用这个变量。

+

即使我们没有列出 u8 所有可能的值,这段代码依然能够编译,因为最后一个模式将匹配所有未被特殊列出的值。这种通配模式满足了 match 必须被穷尽的要求。请注意,我们必须将通配分支放在最后,因为模式是按顺序匹配的。如果我们在通配分支后添加其他分支,Rust 将会警告我们,因为此后的分支永远不会被匹配到。

+

Rust 还提供了一个模式,当我们不想使用通配模式获取的值时,请使用 _ ,这是一个特殊的模式,可以匹配任意值而不绑定到该值。这告诉 Rust 我们不会使用这个值,所以 Rust 也不会警告我们存在未使用的变量。

+

让我们改变游戏规则:现在,当你掷出的值不是 3 或 7 的时候,你必须再次掷出。这种情况下我们不需要使用这个值,所以我们改动代码使用 _ 来替代变量 other

+
fn main() {
+    let dice_roll = 9;
+    match dice_roll {
+        3 => add_fancy_hat(),
+        7 => remove_fancy_hat(),
+        _ => reroll(),
+    }
+
+    fn add_fancy_hat() {}
+    fn remove_fancy_hat() {}
+    fn reroll() {}
+}
+

这个例子也满足穷举性要求,因为我们在最后一个分支中明确地忽略了其他的值。我们没有忘记处理任何东西。

+

最后,让我们再次改变游戏规则,如果你掷出 3 或 7 以外的值,你的回合将无事发生。我们可以使用单元值(在“元组类型”一节中提到的空元组)作为 _ 分支的代码:

+
fn main() {
+    let dice_roll = 9;
+    match dice_roll {
+        3 => add_fancy_hat(),
+        7 => remove_fancy_hat(),
+        _ => (),
+    }
+
+    fn add_fancy_hat() {}
+    fn remove_fancy_hat() {}
+}
+

在这里,我们明确告诉 Rust 我们不会使用与前面模式不匹配的值,并且这种情况下我们不想运行任何代码。

+

我们将在第十九章中介绍更多关于模式和匹配的内容。现在,让我们继续讨论 if let 语法,这在 match 表达式有点啰嗦的情况下很有用。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch06-03-if-let.html b/ch06-03-if-let.html new file mode 100644 index 000000000..1fe4937f2 --- /dev/null +++ b/ch06-03-if-let.html @@ -0,0 +1,316 @@ + + + + + + if let 简洁控制流 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

if let 简洁控制流

+
+

ch06-03-if-let.md +
+commit bb7e429ad6b59d9a0c37db7434976364cbb9c6da

+
+

if let 语法让我们以一种不那么冗长的方式结合 iflet,来处理只匹配一个模式的值而忽略其他模式的情况。考虑示例 6-6 中的程序,它匹配一个 config_max 变量中的 Option<u8> 值并只希望当值为 Some 成员时执行代码:

+
fn main() {
+    let config_max = Some(3u8);
+    match config_max {
+        Some(max) => println!("The maximum is configured to be {max}"),
+        _ => (),
+    }
+}
+

示例 6-6:match 只关心当值为 Some 时执行代码

+

如果值是 Some,我们希望打印出 Some 成员中的值,这个值被绑定到模式中的 max 变量里。对于 None 值我们不希望做任何操作。为了满足 match 表达式(穷尽性)的要求,必须在处理完这唯一的成员后加上 _ => (),这样也要增加很多烦人的样板代码。

+

不过我们可以使用 if let 这种更短的方式编写。如下代码与示例 6-6 中的 match 行为一致:

+
fn main() {
+    let config_max = Some(3u8);
+    if let Some(max) = config_max {
+        println!("The maximum is configured to be {max}");
+    }
+}
+

if let 语法获取通过等号分隔的一个模式和一个表达式。它的工作方式与 match 相同,这里的表达式对应 match 而模式则对应第一个分支。在这个例子中,模式是 Some(max)max 绑定为 Some 中的值。接着可以在 if let 代码块中使用 max 了,就跟在对应的 match 分支中一样。模式不匹配时 if let 块中的代码不会执行。

+

使用 if let 意味着编写更少代码,更少的缩进和更少的样板代码。然而,这样会失去 match 强制要求的穷尽性检查。matchif let 之间的选择依赖特定的环境以及增加简洁度和失去穷尽性检查的权衡取舍。

+

换句话说,可以认为 if letmatch 的一个语法糖,它当值匹配某一模式时执行代码而忽略所有其他值。

+

可以在 if let 中包含一个 elseelse 块中的代码与 match 表达式中的 _ 分支块中的代码相同,这样的 match 表达式就等同于 if letelse。回忆一下示例 6-4 中 Coin 枚举的定义,其 Quarter 成员也包含一个 UsState 值。如果想要计数所有不是 25 美分的硬币的同时也报告 25 美分硬币所属的州,可以使用这样一个 match 表达式:

+
#[derive(Debug)]
+enum UsState {
+    Alabama,
+    Alaska,
+    // --snip--
+}
+
+enum Coin {
+    Penny,
+    Nickel,
+    Dime,
+    Quarter(UsState),
+}
+
+fn main() {
+    let coin = Coin::Penny;
+    let mut count = 0;
+    match coin {
+        Coin::Quarter(state) => println!("State quarter from {state:?}!"),
+        _ => count += 1,
+    }
+}
+

或者可以使用这样的 if letelse 表达式:

+
#[derive(Debug)]
+enum UsState {
+    Alabama,
+    Alaska,
+    // --snip--
+}
+
+enum Coin {
+    Penny,
+    Nickel,
+    Dime,
+    Quarter(UsState),
+}
+
+fn main() {
+    let coin = Coin::Penny;
+    let mut count = 0;
+    if let Coin::Quarter(state) = coin {
+        println!("State quarter from {state:?}!");
+    } else {
+        count += 1;
+    }
+}
+

如果你的程序遇到一个使用 match 表达起来过于啰嗦的逻辑,记住 if let 也在你的 Rust 工具箱中。

+

总结

+

现在我们涉及到了如何使用枚举来创建有一系列可列举值的自定义类型。我们也展示了标准库的 Option<T> 类型是如何帮助你利用类型系统来避免出错的。当枚举值包含数据时,你可以根据需要处理多少情况来选择使用 matchif let 来获取并使用这些值。

+

你的 Rust 程序现在能够使用结构体和枚举在自己的作用域内表现其内容了。在你的 API 中使用自定义类型保证了类型安全:编译器会确保你的函数只会得到它期望的类型的值。

+

为了向你的用户提供一个组织良好的 API,它使用起来很直观并且只向用户暴露他们确实需要的部分,那么现在就让我们转向 Rust 的模块系统吧。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch07-00-managing-growing-projects-with-packages-crates-and-modules.html b/ch07-00-managing-growing-projects-with-packages-crates-and-modules.html new file mode 100644 index 000000000..1a3d2f6cd --- /dev/null +++ b/ch07-00-managing-growing-projects-with-packages-crates-and-modules.html @@ -0,0 +1,256 @@ + + + + + + 使用包、Crate 和模块管理不断增长的项目 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用包、Crate 和模块管理不断增长的项目

+
+

ch07-00-managing-growing-projects-with-packages-crates-and-modules.md +
+commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c

+
+

当你编写大型程序时,组织你的代码显得尤为重要。通过对相关功能进行分组和划分不同功能的代码,你可以清楚在哪里可以找到实现了特定功能的代码,以及在哪里可以改变一个功能的工作方式。

+

到目前为止,我们编写的程序都在一个文件的一个模块中。伴随着项目的增长,你应该通过将代码分解为多个模块和多个文件来组织代码。一个包可以包含多个二进制 crate 项和一个可选的 crate 库。伴随着包的增长,你可以将包中的部分代码提取出来,做成独立的 crate,这些 crate 则作为外部依赖项。本章将会涵盖所有这些概念。对于一个由一系列相互关联的包组成的超大型项目,Cargo 提供了 “工作空间” 这一功能,我们将在第十四章的 “Cargo Workspaces” 对此进行讲解。

+

我们也会讨论封装来实现细节,这可以使你更高级地重用代码:你实现了一个操作后,其他的代码可以通过该代码的公共接口来进行调用,而不需要知道它是如何实现的。你在编写代码时可以定义哪些部分是其他代码可以使用的公共部分,以及哪些部分是你有权更改实现细节的私有部分。这是另一种减少你在脑海中记住项目内容数量的方法。

+

这里有一个需要说明的概念 “作用域(scope)”:代码所在的嵌套上下文有一组定义为 “in scope” 的名称。当阅读、编写和编译代码时,程序员和编译器需要知道特定位置的特定名称是否引用了变量、函数、结构体、枚举、模块、常量或者其他有意义的项。你可以创建作用域,以及改变哪些名称在作用域内还是作用域外。同一个作用域内不能拥有两个相同名称的项;可以使用一些工具来解决名称冲突。

+

Rust 有许多功能可以让你管理代码的组织,包括哪些内容可以被公开,哪些内容作为私有部分,以及程序每个作用域中的名字。这些功能,有时被统称为 “模块系统(the module system)”,包括:

+
    +
  • Packages):Cargo 的一个功能,它允许你构建、测试和分享 crate。
  • +
  • Crates :一个模块的树形结构,它形成了库或二进制项目。
  • +
  • 模块Modules)和 use:允许你控制作用域和路径的私有性。
  • +
  • 路径path):一个命名例如结构体、函数或模块等项的方式。
  • +
+

本章将会涵盖所有这些概念,讨论它们如何交互,并说明如何使用它们来管理作用域。到最后,你会对模块系统有深入的了解,并且能够像专业人士一样使用作用域!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch07-01-packages-and-crates.html b/ch07-01-packages-and-crates.html new file mode 100644 index 000000000..4bd6d1d6c --- /dev/null +++ b/ch07-01-packages-and-crates.html @@ -0,0 +1,262 @@ + + + + + + 包和 Crate - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

包和 Crate

+
+

ch07-01-packages-and-crates.md +
+commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c

+
+

模块系统的第一部分,我们将介绍包和 crate。

+

crate 是 Rust 在编译时最小的代码单位。如果你用 rustc 而不是 cargo 来编译一个文件(第一章我们这么做过),编译器还是会将那个文件认作一个 crate。crate 可以包含模块,模块可以定义在其他文件,然后和 crate 一起编译,我们会在接下来的章节中遇到。

+

crate 有两种形式:二进制项和库。二进制项 可以被编译为可执行程序,比如一个命令行程序或者一个 web server。它们必须有一个 main 函数来定义当程序被执行的时候所需要做的事情。目前我们所创建的 crate 都是二进制项。

+

并没有 main 函数,它们也不会编译为可执行程序,它们提供一些诸如函数之类的东西,使其他项目也能使用这些东西。比如 第二章rand crate 就提供了生成随机数的东西。大多数时间 Rustaceans 说的 crate 指的都是库,这与其他编程语言中 library 概念一致。

+

crate root 是一个源文件,Rust 编译器以它为起始点,并构成你的 crate 的根模块(我们将在 “定义模块来控制作用域与私有性” 一节深入解读)。

+

package)是提供一系列功能的一个或者多个 crate。一个包会包含一个 Cargo.toml 文件,阐述如何去构建这些 crate。Cargo 就是一个包含构建你代码的二进制项的包。Cargo 也包含这些二进制项所依赖的库。其他项目也能用 Cargo 库来实现与 Cargo 命令行程序一样的逻辑。

+

包中可以包含至多一个库 crate(library crate)。包中可以包含任意多个二进制 crate(binary crate),但是必须至少包含一个 crate(无论是库的还是二进制的)。

+

让我们来看看创建包的时候会发生什么。首先,我们输入命令 cargo new

+
$ cargo new my-project
+     Created binary (application) `my-project` package
+$ ls my-project
+Cargo.toml
+src
+$ ls my-project/src
+main.rs
+
+

运行了这条命令后,我们先用 ls (译者注:此命令为 Linux 平台的指令,Windows 下可用 dir)来看看 Cargo 给我们创建了什么,Cargo 会给我们的包创建一个 Cargo.toml 文件。查看 Cargo.toml 的内容,会发现并没有提到 src/main.rs,因为 Cargo 遵循的一个约定:src/main.rs 就是一个与包同名的二进制 crate 的 crate 根。同样的,Cargo 知道如果包目录中包含 src/lib.rs,则包带有与其同名的库 crate,且 src/lib.rs 是 crate 根。crate 根文件将由 Cargo 传递给 rustc 来实际构建库或者二进制项目。

+

在此,我们有了一个只包含 src/main.rs 的包,意味着它只含有一个名为 my-project 的二进制 crate。如果一个包同时含有 src/main.rssrc/lib.rs,则它有两个 crate:一个二进制的和一个库的,且名字都与包相同。通过将文件放在 src/bin 目录下,一个包可以拥有多个二进制 crate:每个 src/bin 下的文件都会被编译成一个独立的二进制 crate。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch07-02-defining-modules-to-control-scope-and-privacy.html b/ch07-02-defining-modules-to-control-scope-and-privacy.html new file mode 100644 index 000000000..217293045 --- /dev/null +++ b/ch07-02-defining-modules-to-control-scope-and-privacy.html @@ -0,0 +1,333 @@ + + + + + + 定义模块来控制作用域与私有性 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

定义模块来控制作用域与私有性

+
+

ch07-02-defining-modules-to-control-scope-and-privacy.md +
+commit 310ea6cb0dd855eaf510c9ba05648bc5836ead0c

+
+

在本节,我们将讨论模块和其它一些关于模块系统的部分,如允许你命名项的 路径paths);用来将路径引入作用域的 use 关键字;以及使项变为公有的 pub 关键字。我们还将讨论 as 关键字、外部包和 glob 运算符。现在,让我们把注意力放在模块上!

+

首先,我们将从一系列的规则开始,在你未来组织代码的时候,这些规则可被用作简单的参考。接下来我们将会详细的解释每条规则。

+

模块小抄

+

这里我们提供一个简单的参考,用来解释模块、路径、use关键词和pub关键词如何在编译器中工作,以及大部分开发者如何组织他们的代码。我们将在本章节中举例说明每条规则,不过这是一个解释模块工作方式的良好参考。

+
    +
  • 从 crate 根节点开始: 当编译一个 crate, 编译器首先在 crate 根文件(通常,对于一个库 crate 而言是src/lib.rs,对于一个二进制 crate 而言是src/main.rs)中寻找需要被编译的代码。
  • +
  • 声明模块: 在 crate 根文件中,你可以声明一个新模块;比如,你用mod garden;声明了一个叫做garden的模块。编译器会在下列路径中寻找模块代码: +
      +
    • 内联,在大括号中,当mod garden后方不是一个分号而是一个大括号
    • +
    • 在文件 src/garden.rs
    • +
    • 在文件 src/garden/mod.rs
    • +
    +
  • +
  • 声明子模块: 在除了 crate 根节点以外的其他文件中,你可以定义子模块。比如,你可能在src/garden.rs中定义了mod vegetables;。编译器会在以父模块命名的目录中寻找子模块代码: +
      +
    • 内联,在大括号中,当mod vegetables后方不是一个分号而是一个大括号
    • +
    • 在文件 src/garden/vegetables.rs
    • +
    • 在文件 src/garden/vegetables/mod.rs
    • +
    +
  • +
  • 模块中的代码路径: 一旦一个模块是你 crate 的一部分,你可以在隐私规则允许的前提下,从同一个 crate 内的任意地方,通过代码路径引用该模块的代码。举例而言,一个 garden vegetables 模块下的Asparagus类型可以在crate::garden::vegetables::Asparagus被找到。
  • +
  • 私有 vs 公用: 一个模块里的代码默认对其父模块私有。为了使一个模块公用,应当在声明时使用pub mod替代mod。为了使一个公用模块内部的成员公用,应当在声明前使用pub
  • +
  • use 关键字: 在一个作用域内,use关键字创建了一个成员的快捷方式,用来减少长路径的重复。在任何可以引用crate::garden::vegetables::Asparagus的作用域,你可以通过 use crate::garden::vegetables::Asparagus;创建一个快捷方式,然后你就可以在作用域中只写Asparagus来使用该类型。
  • +
+

这里我们创建一个名为backyard的二进制 crate 来说明这些规则。该 crate 的路径同样命名为backyard,该路径包含了这些文件和目录:

+
backyard
+├── Cargo.lock
+├── Cargo.toml
+└── src
+    ├── garden
+    │   └── vegetables.rs
+    ├── garden.rs
+    └── main.rs
+
+

这个例子中的 crate 根文件是src/main.rs,该文件包括了:

+

文件名:src/main.rs

+
use crate::garden::vegetables::Asparagus;
+
+pub mod garden;
+
+fn main() {
+    let plant = Asparagus {};
+    println!("I'm growing {plant:?}!");
+}
+

pub mod garden;行告诉编译器应该包含在src/garden.rs文件中发现的代码:

+

文件名:src/garden.rs

+
pub mod vegetables;
+

在此处, pub mod vegetables;意味着在src/garden/vegetables.rs中的代码也应该被包括。这些代码是:

+
#[derive(Debug)]
+pub struct Asparagus {}
+

现在让我们深入了解这些规则的细节并在实际中演示它们!

+

在模块中对相关代码进行分组

+

模块 让我们可以将一个 crate 中的代码进行分组,以提高可读性与重用性。因为一个模块中的代码默认是私有的,所以还可以利用模块控制项的 私有性。私有项是不可为外部使用的内在详细实现。我们也可以将模块和它其中的项标记为公开的,这样,外部代码就可以使用并依赖于它们。

+

在餐饮业,餐馆中会有一些地方被称之为 前台front of house),还有另外一些地方被称之为 后台back of house)。前台是招待顾客的地方,在这里,店主可以为顾客安排座位,服务员接受顾客下单和付款,调酒师会制作饮品。后台则是由厨师工作的厨房,洗碗工的工作地点,以及经理做行政工作的地方组成。

+

我们可以将函数放置到嵌套的模块中,来使我们的 crate 结构与实际的餐厅结构相同。通过执行 cargo new --lib restaurant,来创建一个新的名为 restaurant 的库。然后将示例 7-1 中所罗列出来的代码放入 src/lib.rs 中,来定义一些模块和函数。

+

文件名:src/lib.rs

+
mod front_of_house {
+    mod hosting {
+        fn add_to_waitlist() {}
+
+        fn seat_at_table() {}
+    }
+
+    mod serving {
+        fn take_order() {}
+
+        fn serve_order() {}
+
+        fn take_payment() {}
+    }
+}
+

示例 7-1:一个包含了其他内置了函数的模块的 front_of_house 模块

+

我们定义一个模块,是以 mod 关键字为起始,然后指定模块的名字(本例中叫做 front_of_house),并且用花括号包围模块的主体。在模块内,我们还可以定义其他的模块,就像本例中的 hostingserving 模块。模块还可以保存一些定义的其他项,比如结构体、枚举、常量、特性、或者函数。

+

通过使用模块,我们可以将相关的定义分组到一起,并指出它们为什么相关。程序员可以通过使用这段代码,更加容易地找到他们想要的定义,因为他们可以基于分组来对代码进行导航,而不需要阅读所有的定义。程序员向这段代码中添加一个新的功能时,他们也会知道代码应该放置在何处,可以保持程序的组织性。

+

在前面我们提到了,src/main.rssrc/lib.rs 叫做 crate 根。之所以这样叫它们是因为这两个文件的内容都分别在 crate 模块结构的根组成了一个名为 crate 的模块,该结构被称为 模块树module tree)。

+

示例 7-2 展示了示例 7-1 中的模块树的结构。

+
crate
+ └── front_of_house
+     ├── hosting
+     │   ├── add_to_waitlist
+     │   └── seat_at_table
+     └── serving
+         ├── take_order
+         ├── serve_order
+         └── take_payment
+
+

示例 7-2: 示例 7-1 中代码的模块树

+

这个树展示了一些模块是如何被嵌入到另一个模块的(例如,hosting 嵌套在 front_of_house 中)。这个树还展示了一些模块是互为 兄弟siblings)的,这意味着它们定义在同一模块中(hostingserving 被一起定义在 front_of_house 中)。继续沿用家庭关系的比喻,如果一个模块 A 被包含在模块 B 中,我们将模块 A 称为模块 B 的 child),模块 B 则是模块 A 的 parent)。注意,整个模块树都植根于名为 crate 的隐式模块下。

+

这个模块树可能会令你想起电脑上文件系统的目录树;这是一个非常恰当的类比!就像文件系统的目录,你可以使用模块来组织你的代码。并且,就像目录中的文件,我们需要一种方法来找到模块。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html b/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html new file mode 100644 index 000000000..0b0f35982 --- /dev/null +++ b/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html @@ -0,0 +1,454 @@ + + + + + + 引用模块项目的路径 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

引用模块项目的路径

+
+

ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md +
+commit 2b4565662d1a7973d870744a923f58f8f7dcce91

+
+

来看一下 Rust 如何在模块树中找到一个项的位置,我们使用路径的方式,就像在文件系统使用路径一样。为了调用一个函数,我们需要知道它的路径。

+

路径有两种形式:

+
    +
  • 绝对路径absolute path)是以 crate 根(root)开头的全路径;对于外部 crate 的代码,是以 crate 名开头的绝对路径,对于当前 crate 的代码,则以字面值 crate 开头。
  • +
  • 相对路径relative path)从当前模块开始,以 selfsuper 或定义在当前模块中的标识符开头。
  • +
+

绝对路径和相对路径都后跟一个或多个由双冒号(::)分割的标识符。

+

回到示例 7-1,假设我们希望调用 add_to_waitlist 函数。还是同样的问题,add_to_waitlist 函数的路径是什么?在示例 7-3 中删除了一些模块和函数。

+

我们在 crate 根定义了一个新函数 eat_at_restaurant,并在其中展示调用 add_to_waitlist 函数的两种方法。eat_at_restaurant 函数是我们 crate 库的一个公共 API,所以我们使用 pub 关键字来标记它。在 “使用 pub 关键字暴露路径” 一节,我们将详细介绍 pub。注意,这个例子无法编译通过,我们稍后会解释原因。

+

文件名:src/lib.rs

+
mod front_of_house {
+    mod hosting {
+        fn add_to_waitlist() {}
+    }
+}
+
+pub fn eat_at_restaurant() {
+    // 绝对路径
+    crate::front_of_house::hosting::add_to_waitlist();
+
+    // 相对路径
+    front_of_house::hosting::add_to_waitlist();
+}
+

示例 7-3: 使用绝对路径和相对路径来调用 add_to_waitlist 函数

+

第一种方式,我们在 eat_at_restaurant 中调用 add_to_waitlist 函数,使用的是绝对路径。add_to_waitlist 函数与 eat_at_restaurant 被定义在同一 crate 中,这意味着我们可以使用 crate 关键字为起始的绝对路径。

+

crate 后面,我们持续地嵌入模块,直到我们找到 add_to_waitlist。你可以想象出一个相同结构的文件系统,我们通过指定路径 /front_of_house/hosting/add_to_waitlist 来执行 add_to_waitlist 程序。我们使用 crate 从 crate 根开始就类似于在 shell 中使用 / 从文件系统根开始。

+

第二种方式,我们在 eat_at_restaurant 中调用 add_to_waitlist,使用的是相对路径。这个路径以 front_of_house 为起始,这个模块在模块树中,与 eat_at_restaurant 定义在同一层级。与之等价的文件系统路径就是 front_of_house/hosting/add_to_waitlist。以模块名开头意味着该路径是相对路径。

+

选择使用相对路径还是绝对路径,要取决于你的项目,也取决于你是更倾向于将项的定义代码与使用该项的代码分开来移动,还是一起移动。举一个例子,如果我们要将 front_of_house 模块和 eat_at_restaurant 函数一起移动到一个名为 customer_experience 的模块中,我们需要更新 add_to_waitlist 的绝对路径,但是相对路径还是可用的。然而,如果我们要将 eat_at_restaurant 函数单独移到一个名为 dining 的模块中,还是可以使用原本的绝对路径来调用 add_to_waitlist,但是相对路径必须要更新。我们更倾向于使用绝对路径,因为把代码定义和项调用各自独立地移动是更常见的。

+

让我们试着编译一下示例 7-3,并查明为何不能编译!示例 7-4 展示了这个错误。

+
$ cargo build
+   Compiling restaurant v0.1.0 (file:///projects/restaurant)
+error[E0603]: module `hosting` is private
+ --> src/lib.rs:9:28
+  |
+9 |     crate::front_of_house::hosting::add_to_waitlist();
+  |                            ^^^^^^^  --------------- function `add_to_waitlist` is not publicly re-exported
+  |                            |
+  |                            private module
+  |
+note: the module `hosting` is defined here
+ --> src/lib.rs:2:5
+  |
+2 |     mod hosting {
+  |     ^^^^^^^^^^^
+
+error[E0603]: module `hosting` is private
+  --> src/lib.rs:12:21
+   |
+12 |     front_of_house::hosting::add_to_waitlist();
+   |                     ^^^^^^^  --------------- function `add_to_waitlist` is not publicly re-exported
+   |                     |
+   |                     private module
+   |
+note: the module `hosting` is defined here
+  --> src/lib.rs:2:5
+   |
+2  |     mod hosting {
+   |     ^^^^^^^^^^^
+
+For more information about this error, try `rustc --explain E0603`.
+error: could not compile `restaurant` (lib) due to 2 previous errors
+
+

示例 7-4: 构建示例 7-3 出现的编译器错误

+

错误信息说 hosting 模块是私有的。换句话说,我们拥有 hosting 模块和 add_to_waitlist 函数的正确路径,但是 Rust 不让我们使用,因为它不能访问私有片段。在 Rust 中,默认所有项(函数、方法、结构体、枚举、模块和常量)对父模块都是私有的。如果希望创建一个私有函数或结构体,你可以将其放入一个模块。

+

父模块中的项不能使用子模块中的私有项,但是子模块中的项可以使用它们父模块中的项。这是因为子模块封装并隐藏了它们的实现详情,但是子模块可以看到它们定义的上下文。继续拿餐馆作比喻,把私有性规则想象成餐馆的后台办公室:餐馆内的事务对餐厅顾客来说是不可知的,但办公室经理可以洞悉其经营的餐厅并在其中做任何事情。

+

Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你就知道可以更改内部代码的哪些部分而不会破坏外部代码。不过 Rust 也确实提供了通过使用 pub 关键字来创建公共项,使子模块的内部部分暴露给上级模块。

+

使用 pub 关键字暴露路径

+

让我们回头看一下示例 7-4 的错误,它告诉我们 hosting 模块是私有的。我们想让父模块中的 eat_at_restaurant 函数可以访问子模块中的 add_to_waitlist 函数,因此我们使用 pub 关键字来标记 hosting 模块,如示例 7-5 所示。

+

文件名:src/lib.rs

+
mod front_of_house {
+    pub mod hosting {
+        fn add_to_waitlist() {}
+    }
+}
+
+pub fn eat_at_restaurant() {
+    // 绝对路径
+    crate::front_of_house::hosting::add_to_waitlist();
+
+    // 相对路径
+    front_of_house::hosting::add_to_waitlist();
+}
+

示例 7-5: 使用 pub 关键字声明 hosting 模块使其可在 eat_at_restaurant 使用

+

不幸的是,示例 7-5 的代码编译仍然有错误,如示例 7-6 所示。

+
$ cargo build
+   Compiling restaurant v0.1.0 (file:///projects/restaurant)
+error[E0603]: function `add_to_waitlist` is private
+ --> src/lib.rs:9:37
+  |
+9 |     crate::front_of_house::hosting::add_to_waitlist();
+  |                                     ^^^^^^^^^^^^^^^ private function
+  |
+note: the function `add_to_waitlist` is defined here
+ --> src/lib.rs:3:9
+  |
+3 |         fn add_to_waitlist() {}
+  |         ^^^^^^^^^^^^^^^^^^^^
+
+error[E0603]: function `add_to_waitlist` is private
+  --> src/lib.rs:12:30
+   |
+12 |     front_of_house::hosting::add_to_waitlist();
+   |                              ^^^^^^^^^^^^^^^ private function
+   |
+note: the function `add_to_waitlist` is defined here
+  --> src/lib.rs:3:9
+   |
+3  |         fn add_to_waitlist() {}
+   |         ^^^^^^^^^^^^^^^^^^^^
+
+For more information about this error, try `rustc --explain E0603`.
+error: could not compile `restaurant` (lib) due to 2 previous errors
+
+

示例 7-6: 构建示例 7-5 出现的编译器错误

+

发生了什么?在 mod hosting 前添加了 pub 关键字,使其变成公有的。伴随着这种变化,如果我们可以访问 front_of_house,那我们也可以访问 hosting。但是 hosting内容contents)仍然是私有的;这表明使模块公有并不使其内容也是公有的。模块上的 pub 关键字只允许其父模块引用它,而不允许访问内部代码。因为模块是一个容器,只是将模块变为公有能做的其实并不太多;同时需要更深入地选择将一个或多个项变为公有。

+

示例 7-6 中的错误说,add_to_waitlist 函数是私有的。私有性规则不但应用于模块,还应用于结构体、枚举、函数和方法。

+

让我们继续将 pub 关键字放置在 add_to_waitlist 函数的定义之前,使其变成公有。如示例 7-7 所示。

+

文件名:src/lib.rs

+
mod front_of_house {
+    pub mod hosting {
+        pub fn add_to_waitlist() {}
+    }
+}
+
+pub fn eat_at_restaurant() {
+    // 绝对路径
+    crate::front_of_house::hosting::add_to_waitlist();
+
+    // 相对路径
+    front_of_house::hosting::add_to_waitlist();
+}
+

示例 7-7: 为 mod hosting +和 fn add_to_waitlist 添加 pub 关键字使它们可以在 +eat_at_restaurant 函数中被调用

+

现在代码可以编译通过了!为了了解为何增加 pub 关键字使得我们可以在 add_to_waitlist 中调用这些路径与私有性规则有关,让我们看看绝对路径和相对路径。

+

在绝对路径,我们从 crate 也就是 crate 根开始。crate 根中定义了 front_of_house 模块。虽然 front_of_house 模块不是公有的,不过因为 eat_at_restaurant 函数与 front_of_house 定义于同一模块中(即,eat_at_restaurantfront_of_house 是兄弟),我们可以从 eat_at_restaurant 中引用 front_of_house。接下来是使用 pub 标记的 hosting 模块。我们可以访问 hosting 的父模块,所以可以访问 hosting。最后,add_to_waitlist 函数被标记为 pub ,我们可以访问其父模块,所以这个函数调用是有效的!

+

在相对路径,其逻辑与绝对路径相同,除了第一步:不同于从 crate 根开始,路径从 front_of_house 开始。front_of_house 模块与 eat_at_restaurant 定义于同一模块,所以从 eat_at_restaurant 中开始定义的该模块相对路径是有效的。接下来因为 hostingadd_to_waitlist 被标记为 pub,路径其余的部分也是有效的,因此函数调用也是有效的!

+

如果你计划共享你的库 crate 以便其它项目可以使用你的代码,公有 API 将是决定 crate 用户如何与你代码交互的契约。关于管理公有 API 的修改以便被人更容易依赖你的库有着很多考量。这些考量超出了本书的范畴;如果你对这些话题感兴趣,请查阅 The Rust API Guidelines

+
+

二进制和库 crate 包的最佳实践

+

我们提到过包(package)可以同时包含一个 src/main.rs 二进制 crate 根和一个 src/lib.rs 库 crate 根,并且这两个 crate 默认以包名来命名。通常,这种包含二进制 crate 和库 crate 的模式的包,在二进制 crate 中只保留足以生成一个可执行文件的代码,并由可执行文件调用库 crate 的代码。又因为库 crate 可以共享,这使得其它项目从包提供的大部分功能中受益。

+

模块树应该定义在 src/lib.rs 中。这样通过以包名开头的路径,公有项就可以在二进制 crate 中使用。二进制 crate 就变得同其它在该 crate 之外的、使用库 crate 的用户一样:二者都只能使用公有 API。这有助于你设计一个好的 API;你不仅仅是作者,也是用户!

+

第十二章我们会通过一个同时包含二进制 crate 和库 crate 的命令行程序来展示这些包组织上的实践。

+
+

super 开始的相对路径

+

我们可以通过在路径的开头使用 super ,从父模块开始构建相对路径,而不是从当前模块或者 crate 根开始。这类似以 .. 语法开始一个文件系统路径。使用 super 允许我们引用父模块中的已知项,这使得重新组织模块树变得更容易 —— 当模块与父模块关联的很紧密,但某天父模块可能要移动到模块树的其它位置。

+

考虑一下示例 7-8 中的代码,它模拟了厨师更正了一个错误订单,并亲自将其提供给客户的情况。back_of_house 模块中的定义的 fix_incorrect_order 函数通过指定的 super 起始的 deliver_order 路径,来调用父模块中的 deliver_order 函数:

+

文件名:src/lib.rs

+
fn deliver_order() {}
+
+mod back_of_house {
+    fn fix_incorrect_order() {
+        cook_order();
+        super::deliver_order();
+    }
+
+    fn cook_order() {}
+}
+

示例 7-8: 使用以 super 开头的相对路径从父目录开始调用函数

+

fix_incorrect_order 函数在 back_of_house 模块中,所以我们可以使用 super 进入 back_of_house 父模块,也就是本例中的 crate 根。在这里,我们可以找到 deliver_order。成功!我们认为 back_of_house 模块和 deliver_order 函数之间可能具有某种关联关系,并且,如果我们要重新组织这个 crate 的模块树,需要一起移动它们。因此,我们使用 super,这样一来,如果这些代码被移动到了其他模块,我们只需要更新很少的代码。

+

创建公有的结构体和枚举

+

我们还可以使用 pub 来设计公有的结构体和枚举,不过关于在结构体和枚举上使用 pub 还有一些额外的细节需要注意。如果我们在一个结构体定义的前面使用了 pub ,这个结构体会变成公有的,但是这个结构体的字段仍然是私有的。我们可以根据情况决定每个字段是否公有。在示例 7-9 中,我们定义了一个公有结构体 back_of_house:Breakfast,其中有一个公有字段 toast 和私有字段 seasonal_fruit。这个例子模拟的情况是,在一家餐馆中,顾客可以选择随餐附赠的面包类型,但是厨师会根据季节和库存情况来决定随餐搭配的水果。餐馆可用的水果变化是很快的,所以顾客不能选择水果,甚至无法看到他们将会得到什么水果。

+

文件名:src/lib.rs

+
mod back_of_house {
+    pub struct Breakfast {
+        pub toast: String,
+        seasonal_fruit: String,
+    }
+
+    impl Breakfast {
+        pub fn summer(toast: &str) -> Breakfast {
+            Breakfast {
+                toast: String::from(toast),
+                seasonal_fruit: String::from("peaches"),
+            }
+        }
+    }
+}
+
+pub fn eat_at_restaurant() {
+    // 在夏天订购一个黑麦土司作为早餐
+    let mut meal = back_of_house::Breakfast::summer("Rye");
+    // 改变主意更换想要面包的类型
+    meal.toast = String::from("Wheat");
+    println!("I'd like {} toast please", meal.toast);
+
+    // 如果取消下一行的注释代码不能编译;
+    // 不允许查看或修改早餐附带的季节水果
+    // meal.seasonal_fruit = String::from("blueberries");
+}
+

示例 7-9: 带有公有和私有字段的结构体

+

因为 back_of_house::Breakfast 结构体的 toast 字段是公有的,所以我们可以在 eat_at_restaurant 中使用点号来随意的读写 toast 字段。注意,我们不能在 eat_at_restaurant 中使用 seasonal_fruit 字段,因为 seasonal_fruit 是私有的。尝试去除那一行修改 seasonal_fruit 字段值的代码的注释,看看你会得到什么错误!

+

还请注意一点,因为 back_of_house::Breakfast 具有私有字段,所以这个结构体需要提供一个公共的关联函数来构造 Breakfast 的实例 (这里我们命名为 summer)。如果 Breakfast 没有这样的函数,我们将无法在 eat_at_restaurant 中创建 Breakfast 实例,因为我们不能在 eat_at_restaurant 中设置私有字段 seasonal_fruit 的值。

+

与之相反,如果我们将枚举设为公有,则它的所有成员都将变为公有。我们只需要在 enum 关键字前面加上 pub,就像示例 7-10 展示的那样。

+

文件名:src/lib.rs

+
mod back_of_house {
+    pub enum Appetizer {
+        Soup,
+        Salad,
+    }
+}
+
+pub fn eat_at_restaurant() {
+    let order1 = back_of_house::Appetizer::Soup;
+    let order2 = back_of_house::Appetizer::Salad;
+}
+

示例 7-10: 设计公有枚举,使其所有成员公有

+

因为我们创建了名为 Appetizer 的公有枚举,所以我们可以在 eat_at_restaurant 中使用 SoupSalad 成员。

+

如果枚举成员不是公有的,那么枚举会显得用处不大;给枚举的所有成员挨个添加 pub 是很令人恼火的,因此枚举成员默认就是公有的。结构体通常使用时,不必将它们的字段公有化,因此结构体遵循常规,内容全部是私有的,除非使用 pub 关键字。

+

还有一种使用 pub 的场景我们还没有涉及到,那就是我们最后要讲的模块功能:use 关键字。我们将先单独介绍 use,然后展示如何结合使用 pubuse

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch07-04-bringing-paths-into-scope-with-the-use-keyword.html b/ch07-04-bringing-paths-into-scope-with-the-use-keyword.html new file mode 100644 index 000000000..203a7f361 --- /dev/null +++ b/ch07-04-bringing-paths-into-scope-with-the-use-keyword.html @@ -0,0 +1,498 @@ + + + + + + 使用 use 关键字将路径引入作用域 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用 use 关键字将路径引入作用域

+
+

ch07-04-bringing-paths-into-scope-with-the-use-keyword.md +
+commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c

+
+

不得不编写路径来调用函数显得不便且重复。在示例 7-7 中,无论我们选择 add_to_waitlist 函数的绝对路径还是相对路径,每次我们想要调用 add_to_waitlist 时,都必须指定front_of_househosting。幸运的是,有一种方法可以简化这个过程。我们可以使用 use 关键字创建一个短路径,然后就可以在作用域中的任何地方使用这个更短的名字。

+

在示例 7-11 中,我们将 crate::front_of_house::hosting 模块引入了 eat_at_restaurant 函数的作用域,而我们只需要指定 hosting::add_to_waitlist 即可在 eat_at_restaurant 中调用 add_to_waitlist 函数。

+

文件名:src/lib.rs

+
mod front_of_house {
+    pub mod hosting {
+        pub fn add_to_waitlist() {}
+    }
+}
+
+use crate::front_of_house::hosting;
+
+pub fn eat_at_restaurant() {
+    hosting::add_to_waitlist();
+}
+

示例 7-11: 使用 use 将模块引入作用域

+

在作用域中增加 use 和路径类似于在文件系统中创建软连接(符号连接,symbolic link)。通过在 crate 根增加 use crate::front_of_house::hosting,现在 hosting 在作用域中就是有效的名称了,如同 hosting 模块被定义于 crate 根一样。通过 use 引入作用域的路径也会检查私有性,同其它路径一样。

+

注意 use 只能创建 use 所在的特定作用域内的短路径。示例 7-12 将 eat_at_restaurant 函数移动到了一个叫 customer 的子模块,这又是一个不同于 use 语句的作用域,所以函数体不能编译。

+

文件名:src/lib.rs

+
mod front_of_house {
+    pub mod hosting {
+        pub fn add_to_waitlist() {}
+    }
+}
+
+use crate::front_of_house::hosting;
+
+mod customer {
+    pub fn eat_at_restaurant() {
+        hosting::add_to_waitlist();
+    }
+}
+

示例 7-12: use 语句只适用于其所在的作用域

+

编译器错误显示短路径不再适用于 customer 模块中:

+
$ cargo build
+   Compiling restaurant v0.1.0 (file:///projects/restaurant)
+error[E0433]: failed to resolve: use of undeclared crate or module `hosting`
+  --> src/lib.rs:11:9
+   |
+11 |         hosting::add_to_waitlist();
+   |         ^^^^^^^ use of undeclared crate or module `hosting`
+   |
+help: consider importing this module through its public re-export
+   |
+10 +     use crate::hosting;
+   |
+
+warning: unused import: `crate::front_of_house::hosting`
+ --> src/lib.rs:7:5
+  |
+7 | use crate::front_of_house::hosting;
+  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+  |
+  = note: `#[warn(unused_imports)]` on by default
+
+For more information about this error, try `rustc --explain E0433`.
+warning: `restaurant` (lib) generated 1 warning
+error: could not compile `restaurant` (lib) due to 1 previous error; 1 warning emitted
+
+

注意这里还有一个警告说 use 在其作用域内不再被使用!为了修复这个问题,可以将 use 移动到 customer 模块内,或者在子模块 customer 内通过 super::hosting 引用父模块中的这个短路径。

+

创建惯用的 use 路径

+

在示例 7-11 中,你可能会比较疑惑,为什么我们是指定 use crate::front_of_house::hosting ,然后在 eat_at_restaurant 中调用 hosting::add_to_waitlist ,而不是通过指定一直到 add_to_waitlist 函数的 use 路径来得到相同的结果,如示例 7-13 所示。

+

文件名:src/lib.rs

+
mod front_of_house {
+    pub mod hosting {
+        pub fn add_to_waitlist() {}
+    }
+}
+
+use crate::front_of_house::hosting::add_to_waitlist;
+
+pub fn eat_at_restaurant() {
+    add_to_waitlist();
+}
+

示例 7-13: 使用 useadd_to_waitlist 函数引入作用域,这并不符合习惯

+

虽然示例 7-11 和 7-13 都完成了相同的任务,但示例 7-11 是使用 use 将函数引入作用域的习惯用法。要想使用 use 将函数的父模块引入作用域,我们必须在调用函数时指定父模块,这样可以清晰地表明函数不是在本地定义的,同时使完整路径的重复度最小化。示例 7-13 中的代码不清楚 add_to_waitlist 是在哪里被定义的。

+

另一方面,使用 use 引入结构体、枚举和其他项时,习惯是指定它们的完整路径。示例 7-14 展示了将 HashMap 结构体引入二进制 crate 作用域的习惯用法。

+

文件名:src/main.rs

+
use std::collections::HashMap;
+
+fn main() {
+    let mut map = HashMap::new();
+    map.insert(1, 2);
+}
+

示例 7-14: 将 HashMap 引入作用域的习惯用法

+

这种习惯用法背后没有什么硬性要求:它只是一种惯例,人们已经习惯了以这种方式阅读和编写 Rust 代码。

+

这个习惯用法有一个例外,那就是我们想使用 use 语句将两个具有相同名称的项带入作用域,因为 Rust 不允许这样做。示例 7-15 展示了如何将两个具有相同名称但不同父模块的 Result 类型引入作用域,以及如何引用它们。

+

文件名:src/lib.rs

+
use std::fmt;
+use std::io;
+
+fn function1() -> fmt::Result {
+    // --snip--
+    Ok(())
+}
+
+fn function2() -> io::Result<()> {
+    // --snip--
+    Ok(())
+}
+

示例 7-15: 使用父模块将两个具有相同名称的类型引入同一作用域

+

如你所见,使用父模块可以区分这两个 Result 类型。如果我们是指定 use std::fmt::Resultuse std::io::Result,我们将在同一作用域拥有了两个 Result 类型,当我们使用 Result 时,Rust 则不知道我们要用的是哪个。

+

使用 as 关键字提供新的名称

+

使用 use 将两个同名类型引入同一作用域这个问题还有另一个解决办法:在这个类型的路径后面,我们使用 as 指定一个新的本地名称或者别名。示例 7-16 展示了另一个编写示例 7-15 中代码的方法,通过 as 重命名其中一个 Result 类型。

+

文件名:src/lib.rs

+
use std::fmt::Result;
+use std::io::Result as IoResult;
+
+fn function1() -> Result {
+    // --snip--
+    Ok(())
+}
+
+fn function2() -> IoResult<()> {
+    // --snip--
+    Ok(())
+}
+

示例 7-16: 使用 as 关键字重命名引入作用域的类型

+

在第二个 use 语句中,我们选择 IoResult 作为 std::io::Result 的新名称,它与从 std::fmt 引入作用域的 Result 并不冲突。示例 7-15 和示例 7-16 都是惯用的,如何选择都取决于你!

+

使用 pub use 重导出名称

+

使用 use 关键字,将某个名称导入当前作用域后,这个名称在此作用域中就可以使用了,但它对此作用域之外还是私有的。如果想让其他人调用我们的代码时,也能够正常使用这个名称,就好像它本来就在当前作用域一样,那我们可以将 pubuse 合起来使用。这种技术被称为 “重导出re-exporting)”:我们不仅将一个名称导入了当前作用域,还允许别人把它导入他们自己的作用域。

+

示例 7-17 将示例 7-11 根模块中的 use 改为 pub use

+

文件名:src/lib.rs

+
mod front_of_house {
+    pub mod hosting {
+        pub fn add_to_waitlist() {}
+    }
+}
+
+pub use crate::front_of_house::hosting;
+
+pub fn eat_at_restaurant() {
+    hosting::add_to_waitlist();
+}
+

示例 7-17: 通过 pub use 使名称可从新作用域中被导入至任何代码

+

在这个修改之前,外部代码需要使用路径 restaurant::front_of_house::hosting::add_to_waitlist() 来调用 add_to_waitlist 函数。现在这个 pub use 从根模块重导出了 hosting 模块,外部代码现在可以使用路径 restaurant::hosting::add_to_waitlist

+

当你代码的内部结构与调用你代码的程序员所想象的结构不同时,重导出会很有用。例如,在这个餐馆的比喻中,经营餐馆的人会想到“前台”和“后台”。但顾客在光顾一家餐馆时,可能不会以这些术语来考虑餐馆的各个部分。使用 pub use,我们可以使用一种结构编写代码,却将不同的结构形式暴露出来。这样做使我们的库井井有条,也使开发这个库的程序员和调用这个库的程序员都更加方便。在“使用 pub use 导出合适的公有 API”部分让我们再看另一个 pub use 的例子来了解这如何影响 crate 的文档。

+

使用外部包

+

在第二章中我们编写了一个猜猜看游戏。那个项目使用了一个外部包,rand,来生成随机数。为了在项目中使用 rand,在 Cargo.toml 中加入了如下行:

+

文件名:Cargo.toml

+
rand = "0.8.5"
+
+

Cargo.toml 中加入 rand 依赖告诉了 Cargo 要从 crates.io 下载 rand 和其依赖,并使其可在项目代码中使用。

+

接着,为了将 rand 定义引入项目包的作用域,我们加入一行 use 起始的包名,它以 rand 包名开头并列出了需要引入作用域的项。回忆一下第二章的 “生成一个随机数” 部分,我们曾将 Rng trait 引入作用域并调用了 rand::thread_rng 函数:

+
use std::io;
+use rand::Rng;
+
+fn main() {
+    println!("Guess the number!");
+
+    let secret_number = rand::thread_rng().gen_range(1..=100);
+
+    println!("The secret number is: {secret_number}");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    println!("You guessed: {guess}");
+}
+

crates.io 上有很多 Rust 社区成员发布的包,将其引入你自己的项目都需要一道相同的步骤:在 Cargo.toml 列出它们并通过 use 将其中定义的项引入项目包的作用域中。

+

注意 std 标准库对于你的包来说也是外部 crate。因为标准库随 Rust 语言一同分发,无需修改 Cargo.toml 来引入 std,不过需要通过 use 将标准库中定义的项引入项目包的作用域中来引用它们,比如我们使用的 HashMap

+
#![allow(unused)]
+fn main() {
+use std::collections::HashMap;
+}
+

这是一个以标准库 crate 名 std 开头的绝对路径。

+

嵌套路径来消除大量的 use

+

当需要引入很多定义于相同包或相同模块的项时,为每一项单独列出一行会占用源码很大的空间。例如猜猜看章节示例 2-4 中有两行 use 语句都从 std 引入项到作用域:

+

文件名:src/main.rs

+
use rand::Rng;
+// --snip--
+use std::cmp::Ordering;
+use std::io;
+// --snip--
+
+fn main() {
+    println!("Guess the number!");
+
+    let secret_number = rand::thread_rng().gen_range(1..=100);
+
+    println!("The secret number is: {secret_number}");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    println!("You guessed: {guess}");
+
+    match guess.cmp(&secret_number) {
+        Ordering::Less => println!("Too small!"),
+        Ordering::Greater => println!("Too big!"),
+        Ordering::Equal => println!("You win!"),
+    }
+}
+

相反,我们可以使用嵌套路径将相同的项在一行中引入作用域。这么做需要指定路径的相同部分,接着是两个冒号,接着是大括号中的各自不同的路径部分,如示例 7-18 所示。

+

文件名:src/main.rs

+
use rand::Rng;
+// --snip--
+use std::{cmp::Ordering, io};
+// --snip--
+
+fn main() {
+    println!("Guess the number!");
+
+    let secret_number = rand::thread_rng().gen_range(1..=100);
+
+    println!("The secret number is: {secret_number}");
+
+    println!("Please input your guess.");
+
+    let mut guess = String::new();
+
+    io::stdin()
+        .read_line(&mut guess)
+        .expect("Failed to read line");
+
+    let guess: u32 = guess.trim().parse().expect("Please type a number!");
+
+    println!("You guessed: {guess}");
+
+    match guess.cmp(&secret_number) {
+        Ordering::Less => println!("Too small!"),
+        Ordering::Greater => println!("Too big!"),
+        Ordering::Equal => println!("You win!"),
+    }
+}
+

示例 7-18: 指定嵌套的路径在一行中将多个带有相同前缀的项引入作用域

+

在较大的程序中,使用嵌套路径从相同包或模块中引入很多项,可以显著减少所需的独立 use 语句的数量!

+

我们可以在路径的任何层级使用嵌套路径,这在组合两个共享子路径的 use 语句时非常有用。例如,示例 7-19 中展示了两个 use 语句:一个将 std::io 引入作用域,另一个将 std::io::Write 引入作用域:

+

文件名:src/lib.rs

+
use std::io;
+use std::io::Write;
+

示例 7-19: 通过两行 use 语句引入两个路径,其中一个是另一个的子路径

+

两个路径的相同部分是 std::io,这正是第一个路径。为了在一行 use 语句中引入这两个路径,可以在嵌套路径中使用 self,如示例 7-20 所示。

+

文件名:src/lib.rs

+
use std::io::{self, Write};
+

示例 7-20: 将示例 7-19 中部分重复的路径合并为一个 use 语句

+

这一行便将 std::iostd::io::Write 同时引入作用域。

+

通过 glob 运算符将所有的公有定义引入作用域

+

如果希望将一个路径下 所有 公有项引入作用域,可以指定路径后跟 *,glob 运算符:

+
#![allow(unused)]
+fn main() {
+use std::collections::*;
+}
+

这个 use 语句将 std::collections 中定义的所有公有项引入当前作用域。使用 glob 运算符时请多加小心!Glob 会使得我们难以推导作用域中有什么名称和它们是在何处定义的。

+

glob 运算符经常用于测试模块 tests 中,这时会将所有内容引入作用域;我们将在第十一章 “如何编写测试” 部分讲解。glob 运算符有时也用于 prelude 模式;查看 标准库中的文档 了解这个模式的更多细节。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch07-05-separating-modules-into-different-files.html b/ch07-05-separating-modules-into-different-files.html new file mode 100644 index 000000000..eb5909b11 --- /dev/null +++ b/ch07-05-separating-modules-into-different-files.html @@ -0,0 +1,296 @@ + + + + + + 将模块拆分成多个文件 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

将模块拆分成多个文件

+
+

ch07-05-separating-modules-into-different-files.md +
+commit 2b4565662d1a7973d870744a923f58f8f7dcce91

+
+

到目前为止,本章所有的例子都在一个文件中定义多个模块。当模块变得更大时,你可能想要将它们的定义移动到单独的文件中,从而使代码更容易阅读。

+

例如,我们从示例 7-17 中包含多个餐厅模块的代码开始。我们会将模块提取到各自的文件中,而不是将所有模块都定义到 crate 根文件中。在这里,crate 根文件是 src/lib.rs,不过这个过程也适用于 crate 根文件是 src/main.rs 的二进制 crate。

+

首先将 front_of_house 模块提取到其自己的文件中。删除 front_of_house 模块的大括号中的代码,只留下 mod front_of_house; 声明,这样 src/lib.rs 会包含如示例 7-21 所示的代码。注意直到创建示例 7-22 中的 src/front_of_house.rs 文件之前代码都不能编译。

+

文件名:src/lib.rs

+
mod front_of_house;
+
+pub use crate::front_of_house::hosting;
+
+pub fn eat_at_restaurant() {
+    hosting::add_to_waitlist();
+}
+

示例 7-21: 声明 front_of_house 模块,其内容将位于 src/front_of_house.rs

+

接下来将之前大括号内的代码放入一个名叫 src/front_of_house.rs 的新文件中,如示例 7-22 所示。因为编译器找到了 crate 根中名叫 front_of_house 的模块声明,它就知道去搜寻这个文件。

+

文件名:src/front_of_house.rs

+
pub mod hosting {
+    pub fn add_to_waitlist() {}
+}
+

示例 7-22: 在 src/front_of_house.rs 中定义 front_of_house +模块

+

注意你只需在模块树中的某处使用一次 mod 声明就可以加载这个文件。一旦编译器知道了这个文件是项目的一部分(并且通过 mod 语句的位置知道了代码在模块树中的位置),项目中的其他文件应该使用其所声明的位置的路径来引用那个文件的代码,这在“引用模块项目的路径”部分有讲到。换句话说,mod 不是 你可能会在其他编程语言中看到的 "include" 操作。

+

接下来我们同样将 hosting 模块提取到自己的文件中。这个过程会有所不同,因为 hostingfront_of_house 的子模块而不是根模块。我们将 hosting 的文件放在与模块树中它的父级模块同名的目录中,在这里是 src/front_of_house/

+

为了移动 hosting,修改 src/front_of_house.rs 使之仅包含 hosting 模块的声明。

+

文件名:src/front_of_house.rs

+
pub mod hosting;
+

接着我们创建一个 src/front_of_house 目录和一个包含 hosting 模块定义的 hosting.rs 文件:

+

文件名:src/front_of_house/hosting.rs

+
#![allow(unused)]
+fn main() {
+pub fn add_to_waitlist() {}
+}
+

如果将 hosting.rs 放在 src 目录,编译器会认为 hosting 模块中的 hosting.rs 的代码声明于 crate 根,而不是声明为 front_of_house 的子模块。编译器所遵循的哪些文件对应哪些模块的代码的规则,意味着目录和文件更接近于模块树。

+
+

另一种文件路径

+

目前为止我们介绍了 Rust 编译器所最常用的文件路径;不过一种更老的文件路径也仍然是支持的。

+

对于声明于 crate 根的 front_of_house 模块,编译器会在如下位置查找模块代码:

+
    +
  • src/front_of_house.rs(我们所介绍的)
  • +
  • src/front_of_house/mod.rs(老风格,不过仍然支持)
  • +
+

对于 front_of_house 的子模块 hosting,编译器会在如下位置查找模块代码:

+
    +
  • src/front_of_house/hosting.rs(我们所介绍的)
  • +
  • src/front_of_house/hosting/mod.rs(老风格,不过仍然支持)
  • +
+

如果你对同一模块同时使用这两种路径风格,会得到一个编译错误。在同一项目中的不同模块混用不同的路径风格是允许的,不过这会使他人感到疑惑。

+

使用 mod.rs 这一文件名的风格的主要缺点是会导致项目中出现很多 mod.rs 文件,当你在编辑器中同时打开它们时会感到疑惑。

+
+

我们将各个模块的代码移动到独立文件了,同时模块树依旧相同。eat_at_restaurant 中的函数调用也无需修改继续保持有效,即便其定义存在于不同的文件中。这个技巧让你可以在模块代码增长时,将它们移动到新文件中。

+

注意,src/lib.rs 中的 pub use crate::front_of_house::hosting 语句也并未发生改变。use 也不会对哪些文件会被编译为 crate 的一部分有任何影响。mod 关键字声明了模块,而 Rust 会在与模块同名的文件中查找模块的代码。

+

总结

+

Rust 提供了将包分成多个 crate,将 crate 分成模块,以及通过指定绝对或相对路径从一个模块引用另一个模块中定义的项的方式。你可以通过使用 use 语句将路径引入作用域,这样在多次使用时可以使用更短的路径。模块定义的代码默认是私有的,不过可以选择增加 pub 关键字使其定义变为公有。

+

接下来,让我们看看一些标准库提供的集合数据类型,你可以利用它们编写出漂亮整洁的代码。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch08-00-common-collections.html b/ch08-00-common-collections.html new file mode 100644 index 000000000..601bb8761 --- /dev/null +++ b/ch08-00-common-collections.html @@ -0,0 +1,252 @@ + + + + + + 常见集合 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

常见集合

+
+

ch08-00-common-collections.md +
+commit 1fd890031311612e54965f7f800a8c8bd4464663

+
+

Rust 标准库中包含一系列被称为 集合collections)的非常有用的数据结构。大部分其他数据类型都代表一个特定的值,不过集合可以包含多个值。不同于内建的数组和元组类型,这些集合指向的数据是储存在堆上的,这意味着数据的数量不必在编译时就已知,并且还可以随着程序的运行增长或缩小。每种集合都有着不同功能和成本,而根据当前情况选择合适的集合,这是一项应当逐渐掌握的技能。在这一章里,我们将详细的了解三个在 Rust 程序中被广泛使用的集合:

+
    +
  • vector 允许我们一个挨着一个地储存一系列数量可变的值
  • +
  • 字符串string)是字符的集合。我们之前见过 String 类型,不过在本章我们将深入了解。
  • +
  • 哈希 maphash map)允许我们将值与一个特定的键(key)相关联。这是一个叫做 map 的更通用的数据结构的特定实现。
  • +
+

对于标准库提供的其他类型的集合,请查看文档

+

我们将讨论如何创建和更新 vector、字符串和哈希 map,以及它们有什么特别之处。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch08-01-vectors.html b/ch08-01-vectors.html new file mode 100644 index 000000000..de7f82f37 --- /dev/null +++ b/ch08-01-vectors.html @@ -0,0 +1,381 @@ + + + + + + 使用 Vector 储存列表 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用 Vector 储存列表

+
+

ch08-01-vectors.md +
+commit ac16184a7f56d17daa9c4c76901371085dc0ac43

+
+

我们要讲到的第一个类型是 Vec<T>,也被称为 vector。vector 允许我们在一个单独的数据结构中储存多于一个的值,它在内存中彼此相邻地排列所有的值。vector 只能储存相同类型的值。它们在拥有一系列项的场景下非常实用,例如文件中的文本行或是购物车中商品的价格。

+

新建 vector

+

为了创建一个新的空 vector,可以调用 Vec::new 函数,如示例 8-1 所示:

+
fn main() {
+    let v: Vec<i32> = Vec::new();
+}
+

示例 8-1:新建一个空的 vector 来储存 i32 类型的值

+

注意这里我们增加了一个类型注解。因为没有向这个 vector 中插入任何值,Rust 并不知道我们想要储存什么类型的元素。这是一个非常重要的点。vector 是用泛型实现的,第十章会涉及到如何对你自己的类型使用它们。现在,所有你需要知道的就是 Vec<T> 是一个由标准库提供的类型,它可以存放任何类型,而当 Vec 存放某个特定类型时,那个类型位于尖括号中。在示例 8-1 中,我们告诉 Rust v 这个 Vec<T> 将存放 i32 类型的元素。

+

通常,我们会用初始值来创建一个 Vec<T> 而 Rust 会推断出储存值的类型,所以很少会需要这些类型注解。为了方便 Rust 提供了 vec! 宏,这个宏会根据我们提供的值来创建一个新的 vector。示例 8-2 新建一个拥有值 123Vec<i32>。推断为 i32 是因为这是默认整型类型,第三章的 “数据类型” 讨论过:

+
fn main() {
+    let v = vec![1, 2, 3];
+}
+

示例 8-2:新建一个包含初值的 vector

+

因为我们提供了 i32 类型的初始值,Rust 可以推断出 v 的类型是 Vec<i32>,因此类型注解就不是必须的。接下来让我们看看如何修改一个 vector。

+

更新 vector

+

对于新建一个 vector 并向其增加元素,可以使用 push 方法,如示例 8-3 所示:

+
fn main() {
+    let mut v = Vec::new();
+
+    v.push(5);
+    v.push(6);
+    v.push(7);
+    v.push(8);
+}
+

示例 8-3:使用 push 方法向 vector 增加值

+

如第三章中讨论的任何变量一样,如果想要能够改变它的值,必须使用 mut 关键字使其可变。放入其中的所有值都是 i32 类型的,而且 Rust 也根据数据做出如此判断,所以不需要 Vec<i32> 注解。

+

读取 vector 的元素

+

有两种方法引用 vector 中储存的值:通过索引或使用 get 方法。在接下来的示例中,为了更加清楚的说明,我们已经标注了这些函数返回的值的类型。

+

示例 8-4 展示了访问 vector 中一个值的两种方式,索引语法或者 get 方法:

+
fn main() {
+    let v = vec![1, 2, 3, 4, 5];
+
+    let third: &i32 = &v[2];
+    println!("The third element is {third}");
+
+    let third: Option<&i32> = v.get(2);
+    match third {
+        Some(third) => println!("The third element is {third}"),
+        None => println!("There is no third element."),
+    }
+}
+

列表 8-4:使用索引语法或 get 方法来访问 vector 中的项

+

这里有几个细节需要注意。我们使用索引值 2 来获取第三个元素,因为索引是从数字 0 开始的。使用 &[] 会得到一个索引位置元素的引用。当使用索引作为参数调用 get 方法时,会得到一个可以用于 matchOption<&T>

+

Rust 提供了两种引用元素的方法的原因是当尝试使用现有元素范围之外的索引值时可以选择让程序如何运行。举个例子,让我们看看使用这个技术,尝试在当有一个 5 个元素的 vector 接着访问索引 100 位置的元素会发生什么,如示例 8-5 所示:

+
fn main() {
+    let v = vec![1, 2, 3, 4, 5];
+
+    let does_not_exist = &v[100];
+    let does_not_exist = v.get(100);
+}
+

示例 8-5:尝试访问一个包含 5 个元素的 vector 的索引 100 处的元素

+

当运行这段代码,你会发现对于第一个 [] 方法,当引用一个不存在的元素时 Rust 会造成 panic。这个方法更适合当程序认为尝试访问超过 vector 结尾的元素是一个严重错误的情况,这时应该使程序崩溃。

+

get 方法被传递了一个数组外的索引时,它不会 panic 而是返回 None。当偶尔出现超过 vector 范围的访问属于正常情况的时候可以考虑使用它。接着你的代码可以有处理 Some(&element)None 的逻辑,如第六章讨论的那样。例如,索引可能来源于用户输入的数字。如果它们不慎输入了一个过大的数字那么程序就会得到 None 值,你可以告诉用户当前 vector 元素的数量并再请求它们输入一个有效的值。这就比因为输入错误而使程序崩溃要友好的多!

+

一旦程序获取了一个有效的引用,借用检查器将会执行所有权和借用规则(第四章讲到)来确保 vector 内容的这个引用和任何其他引用保持有效。回忆一下不能在相同作用域中同时存在可变和不可变引用的规则。这个规则适用于示例 8-6,当我们获取了 vector 的第一个元素的不可变引用并尝试在 vector 末尾增加一个元素的时候,如果尝试在函数的后面引用这个元素是行不通的:

+
fn main() {
+    let mut v = vec![1, 2, 3, 4, 5];
+
+    let first = &v[0];
+
+    v.push(6);
+
+    println!("The first element is: {first}");
+}
+

示例 8-6:在拥有 vector 中项的引用的同时向其增加一个元素

+

编译会给出这个错误:

+
$ cargo run
+   Compiling collections v0.1.0 (file:///projects/collections)
+error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable
+ --> src/main.rs:6:5
+  |
+4 |     let first = &v[0];
+  |                  - immutable borrow occurs here
+5 |
+6 |     v.push(6);
+  |     ^^^^^^^^^ mutable borrow occurs here
+7 |
+8 |     println!("The first element is: {first}");
+  |                                     ------- immutable borrow later used here
+
+For more information about this error, try `rustc --explain E0502`.
+error: could not compile `collections` (bin "collections") due to 1 previous error
+
+

示例 8-6 中的代码看起来应该能够运行:为什么第一个元素的引用会关心 vector 结尾的变化?不能这么做的原因是由于 vector 的工作方式:在 vector 的结尾增加新元素时,在没有足够空间将所有元素依次相邻存放的情况下,可能会要求分配新内存并将老的元素拷贝到新的空间中。这时,第一个元素的引用就指向了被释放的内存。借用规则阻止程序陷入这种状况。

+
+

注意:关于 Vec<T> 类型的更多实现细节,请查看 “The Rustonomicon”

+
+

遍历 vector 中的元素

+

如果想要依次访问 vector 中的每一个元素,我们可以遍历其所有的元素而无需通过索引一次一个的访问。示例 8-7 展示了如何使用 for 循环来获取 i32 值的 vector 中的每一个元素的不可变引用并将其打印:

+
fn main() {
+    let v = vec![100, 32, 57];
+    for i in &v {
+        println!("{i}");
+    }
+}
+

示例 8-7:通过 for 循环遍历 vector 的元素并打印

+

我们也可以遍历可变 vector 的每一个元素的可变引用以便能改变它们。示例 8-8 中的 for 循环会给每一个元素加 50

+
fn main() {
+    let mut v = vec![100, 32, 57];
+    for i in &mut v {
+        *i += 50;
+    }
+}
+

示例 8-8:遍历 vector 中元素的可变引用

+

为了修改可变引用所指向的值,在使用 += 运算符之前必须使用解引用运算符(*)获取 i 中的值。第十五章的 “通过解引用运算符追踪指针的值” 部分会详细介绍解引用运算符。

+

因为借用检查器的规则,无论可变还是不可变地遍历一个 vector 都是安全的。如果尝试在示例 8-7 和 示例 8-8 的 for 循环体内插入或删除项,都会得到一个类似示例 8-6 代码中类似的编译错误。for 循环中获取的 vector 引用阻止了同时对 vector 整体的修改。

+

使用枚举来储存多种类型

+

vector 只能储存相同类型的值。这是很不方便的;绝对会有需要储存一系列不同类型的值的用例。幸运的是,枚举的成员都被定义为相同的枚举类型,所以当需要在 vector 中储存不同类型值时,我们可以定义并使用一个枚举!

+

例如,假如我们想要从电子表格的一行中获取值,而这一行的有些列包含数字,有些包含浮点值,还有些是字符串。我们可以定义一个枚举,其成员会存放这些不同类型的值,同时所有这些枚举成员都会被当作相同类型:那个枚举的类型。接着可以创建一个储存枚举值的 vector,这样最终就能够储存不同类型的值了。示例 8-9 展示了其用例:

+
fn main() {
+    enum SpreadsheetCell {
+        Int(i32),
+        Float(f64),
+        Text(String),
+    }
+
+    let row = vec![
+        SpreadsheetCell::Int(3),
+        SpreadsheetCell::Text(String::from("blue")),
+        SpreadsheetCell::Float(10.12),
+    ];
+}
+

示例 8-9:定义一个枚举,以便能在 vector 中存放不同类型的数据

+

Rust 在编译时必须确切知道 vector 中的类型,这样它才能确定在堆上需要为每个元素分配多少内存。我们还必须明确这个 vector 中允许的类型。如果 Rust 允许 vector 存储任意类型,那么可能会因为一个或多个类型在对 vector 元素执行操作时导致(类型相关)错误。使用枚举加上 match 表达式意味着 Rust 会在编译时确保每种可能的情况都得到处理,正如第六章讲到的那样。

+

如果在编写程序时不能确切无遗地知道运行时会储存进 vector 的所有类型,枚举技术就行不通了。相反,你可以使用 trait 对象,第十八章会讲到它。

+

现在我们了解了一些使用 vector 的最常见的方式,请一定去看看标准库中 Vec 定义的很多其他实用方法的 API 文档。例如,除了 push 之外还有一个 pop 方法,它会移除并返回 vector 的最后一个元素。

+

丢弃 vector 时也会丢弃其所有元素

+

类似于任何其他的 struct,vector 在其离开作用域时会被释放,如示例 8-4 所标注的:

+
fn main() {
+    {
+        let v = vec![1, 2, 3, 4];
+
+        // do stuff with v
+    } // <- v goes out of scope and is freed here
+}
+

示例 8-10:展示 vector 和其元素于何处被丢弃

+

当 vector 被丢弃时,所有其内容也会被丢弃,这意味着这里它包含的整数将被清理。借用检查器确保了任何 vector 中内容的引用仅在 vector 本身有效时才可用。

+

让我们继续下一个集合类型:String

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch08-02-strings.html b/ch08-02-strings.html new file mode 100644 index 000000000..5cb2ac1b3 --- /dev/null +++ b/ch08-02-strings.html @@ -0,0 +1,470 @@ + + + + + + 使用字符串储存 UTF-8 编码的文本 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用字符串储存 UTF-8 编码的文本

+
+

ch08-02-strings.md +
+commit 668c64760b5c7ea654facb4ba5fe9faddfda27cc

+
+

第四章已经讲过一些字符串的内容,不过现在让我们更深入地了解它。字符串是新晋 Rustacean 们通常会被困住的领域,这是由于三方面理由的结合:Rust 倾向于确保暴露出可能的错误,字符串是比很多程序员所想象的要更为复杂的数据结构,以及 UTF-8。所有这些要素结合起来对于来自其他语言背景的程序员就可能显得很困难了。

+

在集合章节中讨论字符串的原因是,字符串就是作为字节的集合外加一些方法实现的,当这些字节被解释为文本时,这些方法提供了实用的功能。在这一部分,我们会讲到 String 中那些任何集合类型都有的操作,比如创建、更新和读取。也会讨论 String 与其他集合不一样的地方,例如索引 String 是很复杂的,由于人和计算机理解 String 数据方式的不同。

+

什么是字符串?

+

在开始深入这些方面之前,我们需要讨论一下术语 字符串 的具体意义。Rust 的核心语言中只有一种字符串类型:字符串 slice str,它通常以被借用的形式出现,&str。第四章讲到了 字符串 slices:它们是一些对储存在别处的 UTF-8 编码字符串数据的引用。举例来说,由于字符串字面值被储存在程序的二进制输出中,因此字符串字面值也是字符串 slices。

+

字符串(String)类型由 Rust 标准库提供,而不是编入核心语言,它是一种可增长、可变、可拥有、UTF-8 编码的字符串类型。当 Rustaceans 提及 Rust 中的 "字符串 "时,他们可能指的是 String 或 string slice &str 类型,而不仅仅是其中一种类型。虽然本节主要讨论 String,但这两种类型在 Rust 的标准库中都有大量使用,而且 String 和 字符串 slices 都是 UTF-8 编码的。

+

新建字符串

+

很多 Vec 可用的操作在 String 中同样可用,事实上 String 被实现为一个带有一些额外保证、限制和功能的字节 vector 的封装。其中一个同样作用于 Vec<T>String 函数的例子是用来新建一个实例的 new 函数,如示例 8-11 所示。

+
fn main() {
+    let mut s = String::new();
+}
+

示例 8-11:新建一个空的 String

+

这新建了一个叫做 s 的空的字符串,接着我们可以向其中装载数据。通常字符串会有初始数据,因为我们希望一开始就有这个字符串。为此,可以使用 to_string 方法,它能用于任何实现了 Display trait 的类型,比如字符串字面值。示例 8-12 展示了两个例子。

+
fn main() {
+    let data = "initial contents";
+
+    let s = data.to_string();
+
+    // 该方法也可直接用于字符串字面值:
+    let s = "initial contents".to_string();
+}
+

示例 8-12:使用 to_string 方法从字符串字面值创建 String

+

这些代码会创建包含 initial contents 的字符串。

+

也可以使用 String::from 函数来从字符串字面值创建 String。示例 8-13 中的代码等同于使用 to_string

+
fn main() {
+    let s = String::from("initial contents");
+}
+

示例 8-13:使用 String::from 函数从字符串字面值创建 String

+

因为字符串应用广泛,这里有很多不同的用于字符串的通用 API 可供选择。其中一些可能看起来多余,不过都有其用武之地!在这个例子中,String::from.to_string 最终做了完全相同的工作,所以如何选择就是代码风格与可读性的问题了。

+

记住字符串是 UTF-8 编码的,所以可以包含任何可以正确编码的数据,如示例 8-14 所示。

+
fn main() {
+    let hello = String::from("السلام عليكم");
+    let hello = String::from("Dobrý den");
+    let hello = String::from("Hello");
+    let hello = String::from("שלום");
+    let hello = String::from("नमस्ते");
+    let hello = String::from("こんにちは");
+    let hello = String::from("안녕하세요");
+    let hello = String::from("你好");
+    let hello = String::from("Olá");
+    let hello = String::from("Здравствуйте");
+    let hello = String::from("Hola");
+}
+

示例 8-14:在字符串中储存不同语言的问候语

+

所有这些都是有效的 String 值。

+

更新字符串

+

String 的大小可以增加,其内容也可以改变,就像可以放入更多数据来改变 Vec 的内容一样。另外,可以方便的使用 + 运算符或 format! 宏来拼接 String 值。

+

使用 push_strpush 附加字符串

+

可以通过 push_str 方法来附加字符串 slice,从而使 String 变长,如示例 8-15 所示。

+
fn main() {
+    let mut s = String::from("foo");
+    s.push_str("bar");
+}
+

示例 8-15:使用 push_str 方法向 String 附加字符串 slice

+

执行这两行代码之后,s 将会包含 foobarpush_str 方法采用字符串 slice,因为我们并不需要获取参数的所有权。例如,示例 8-16 中我们希望在将 s2 的内容附加到 s1 之后还能使用它。

+
fn main() {
+    let mut s1 = String::from("foo");
+    let s2 = "bar";
+    s1.push_str(s2);
+    println!("s2 is {s2}");
+}
+

示例 8-16:将字符串 slice 的内容附加到 String 后使用它

+

如果 push_str 方法获取了 s2 的所有权,就不能在最后一行打印出其值了。好在代码如我们期望那样工作!

+

push 方法被定义为获取一个单独的字符作为参数,并附加到 String 中。示例 8-17 展示了使用 push 方法将字母 "l" 加入 String 的代码。

+
fn main() {
+    let mut s = String::from("lo");
+    s.push('l');
+}
+

示例 8-17:使用 push 将一个字符加入 String 值中

+

执行这些代码之后,s 将会包含 “lol”。

+

使用 + 运算符或 format! 宏拼接字符串

+

通常你会希望将两个已知的字符串合并在一起。一种办法是像这样使用 + 运算符,如示例 8-18 所示。

+
fn main() {
+    let s1 = String::from("Hello, ");
+    let s2 = String::from("world!");
+    let s3 = s1 + &s2; // 注意 s1 被移动了,不能继续使用
+}
+

示例 8-18:使用 + 运算符将两个 String 值合并到一个新的 String 值中

+

执行完这些代码之后,字符串 s3 将会包含 Hello, world!s1 在相加后不再有效的原因,和使用 s2 的引用的原因,与使用 + 运算符时调用的函数签名有关。+ 运算符使用了 add 函数,这个函数签名看起来像这样:

+
fn add(self, s: &str) -> String {
+

在标准库中你会发现,add 的定义使用了泛型和关联类型。在这里我们替换为了具体类型,这也正是当使用 String 值调用这个方法会发生的。第十章会讨论泛型。这个签名提供了理解 + 运算那微妙部分的线索。

+

首先,s2 使用了 &,意味着我们使用第二个字符串的 引用 与第一个字符串相加。这是因为 add 函数的 s 参数:只能将 &strString 相加,不能将两个 String 值相加。不过等一下 —— &s2 的类型是 &String, 而不是 add 第二个参数所指定的 &str。那么为什么示例 8-18 还能编译呢?

+

之所以能够在 add 调用中使用 &s2 是因为 &String 可以被 强转coerced)成 &str。当add函数被调用时,Rust 使用了一个被称为 Deref 强制转换deref coercion)的技术,你可以将其理解为它把 &s2 变成了 &s2[..]。第十五章会更深入的讨论 Deref 强制转换。因为 add 没有获取参数的所有权,所以 s2 在这个操作后仍然是有效的 String

+

其次,可以发现签名中 add 获取了 self 的所有权,因为 self 没有 使用 &。这意味着示例 8-18 中的 s1 的所有权将被移动到 add 调用中,之后就不再有效。所以虽然 let s3 = s1 + &s2; 看起来就像它会复制两个字符串并创建一个新的字符串,而实际上这个语句会获取 s1 的所有权,附加上从 s2 中拷贝的内容,并返回结果的所有权。换句话说,它看起来好像生成了很多拷贝,不过实际上并没有:这个实现比拷贝要更高效。

+

如果想要级联多个字符串,+ 的行为就显得笨重了:

+
fn main() {
+    let s1 = String::from("tic");
+    let s2 = String::from("tac");
+    let s3 = String::from("toe");
+
+    let s = s1 + "-" + &s2 + "-" + &s3;
+}
+

这时 s 的内容会是 “tic-tac-toe”。在有这么多 +" 字符的情况下,很难理解具体发生了什么。对于更为复杂的字符串链接,可以使用 format! 宏:

+
fn main() {
+    let s1 = String::from("tic");
+    let s2 = String::from("tac");
+    let s3 = String::from("toe");
+
+    let s = format!("{s1}-{s2}-{s3}");
+}
+

这些代码也会将 s 设置为 “tic-tac-toe”。format!println! 的工作原理相同,不过不同于将输出打印到屏幕上,它返回一个带有结果内容的 String。这个版本就好理解的多,宏 format! 生成的代码使用引用所以不会获取任何参数的所有权。

+

索引字符串

+

在很多语言中,通过索引来引用字符串中的单独字符是有效且常见的操作。然而在 Rust 中,如果你尝试使用索引语法访问 String 的一部分,会出现一个错误。考虑一下如示例 8-19 中所示的无效代码。

+
fn main() {
+    let s1 = String::from("hello");
+    let h = s1[0];
+}
+

示例 8-19:尝试对字符串使用索引语法

+

这段代码会导致如下错误:

+
$ cargo run
+   Compiling collections v0.1.0 (file:///projects/collections)
+error[E0277]: the type `str` cannot be indexed by `{integer}`
+ --> src/main.rs:3:16
+  |
+3 |     let h = s1[0];
+  |                ^ string indices are ranges of `usize`
+  |
+  = help: the trait `SliceIndex<str>` is not implemented for `{integer}`, which is required by `String: Index<_>`
+  = note: you can use `.chars().nth()` or `.bytes().nth()`
+          for more information, see chapter 8 in The Book: <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>
+  = help: the trait `SliceIndex<[_]>` is implemented for `usize`
+  = help: for that trait implementation, expected `[_]`, found `str`
+  = note: required for `String` to implement `Index<{integer}>`
+
+For more information about this error, try `rustc --explain E0277`.
+error: could not compile `collections` (bin "collections") due to 1 previous error
+
+

错误和提示说明了全部问题:Rust 的字符串不支持索引。那么接下来的问题是,为什么不支持呢?为了回答这个问题,我们必须先聊一聊 Rust 是如何在内存中储存字符串的。

+

内部表现

+

String 是一个 Vec<u8> 的封装。让我们看看示例 8-14 中一些正确编码的字符串的例子。首先是这一个:

+
fn main() {
+    let hello = String::from("السلام عليكم");
+    let hello = String::from("Dobrý den");
+    let hello = String::from("Hello");
+    let hello = String::from("שלום");
+    let hello = String::from("नमस्ते");
+    let hello = String::from("こんにちは");
+    let hello = String::from("안녕하세요");
+    let hello = String::from("你好");
+    let hello = String::from("Olá");
+    let hello = String::from("Здравствуйте");
+    let hello = String::from("Hola");
+}
+

在这里,len 的值是 4,这意味着储存字符串 “Hola” 的 Vec 的长度是四个字节:这里每一个字母的 UTF-8 编码都占用一个字节。那下面这个例子又如何呢?(注意这个字符串中的首字母是西里尔字母的 Ze 而不是数字 3。)

+
fn main() {
+    let hello = String::from("السلام عليكم");
+    let hello = String::from("Dobrý den");
+    let hello = String::from("Hello");
+    let hello = String::from("שלום");
+    let hello = String::from("नमस्ते");
+    let hello = String::from("こんにちは");
+    let hello = String::from("안녕하세요");
+    let hello = String::from("你好");
+    let hello = String::from("Olá");
+    let hello = String::from("Здравствуйте");
+    let hello = String::from("Hola");
+}
+

当问及这个字符是多长的时候有人可能会说是 12。然而,Rust 的回答是 24。这是使用 UTF-8 编码 “Здравствуйте” 所需要的字节数,这是因为每个 Unicode 标量值需要两个字节存储。因此一个字符串字节值的索引并不总是对应一个有效的 Unicode 标量值。作为演示,考虑如下无效的 Rust 代码:

+
let hello = "Здравствуйте";
+let answer = &hello[0];
+

我们已经知道 answer 不是第一个字符 3。当使用 UTF-8 编码时,(西里尔字母的 Ze)З 的第一个字节是 208,第二个是 151,所以 answer 实际上应该是 208,不过 208 自身并不是一个有效的字母。返回 208 可不是一个请求字符串第一个字母的人所希望看到的,不过它是 Rust 在字节索引 0 位置所能提供的唯一数据。用户通常不会想要一个字节值被返回。即使这个字符串只有拉丁字母,如果 &"hello"[0] 是返回字节值的有效代码,它也会返回 104 而不是 h

+

为了避免返回意外的值并造成不能立刻发现的 bug,Rust 根本不会编译这些代码,并在开发过程中及早杜绝了误会的发生。

+

字节、标量值和字形簇!天呐!

+

这引起了关于 UTF-8 的另外一个问题:从 Rust 的角度来讲,事实上有三种相关方式可以理解字符串:字节、标量值和字形簇(最接近人们眼中 字母 的概念)。

+

比如这个用梵文书写的印度语单词 “नमस्ते”,最终它储存在 vector 中的 u8 值看起来像这样:

+
[224, 164, 168, 224, 164, 174, 224, 164, 184, 224, 165, 141, 224, 164, 164,
+224, 165, 135]
+
+

这里有 18 个字节,也就是计算机最终会储存的数据。如果从 Unicode 标量值的角度理解它们,也就像 Rust 的 char 类型那样,这些字节看起来像这样:

+
['न', 'म', 'स', '्', 'त', 'े']
+
+

这里有六个 char,不过第四个和第六个都不是字母,它们是发音符号本身并没有任何意义。最后,如果以字形簇的角度理解,就会得到人们所说的构成这个单词的四个字母:

+
["न", "म", "स्", "ते"]
+
+

Rust 提供了多种不同的方式来解释计算机储存的原始字符串数据,这样程序就可以选择它需要的表现方式,而无所谓是何种人类语言。

+

最后一个 Rust 不允许使用索引获取 String 字符的原因是,索引操作预期总是需要常数时间(O(1))。但是对于 String 不可能保证这样的性能,因为 Rust 必须从开头到索引位置遍历来确定有多少有效的字符。

+

字符串 slice

+

索引字符串通常是一个坏点子,因为字符串索引应该返回的类型是不明确的:字节值、字符、字形簇或者字符串 slice。因此,如果你真的希望使用索引创建字符串 slice 时,Rust 会要求你更明确一些。为了更明确索引并表明你需要一个字符串 slice,相比使用 [] 和单个值的索引,可以使用 [] 和一个 range 来创建含特定字节的字符串 slice:

+
#![allow(unused)]
+fn main() {
+let hello = "Здравствуйте";
+
+let s = &hello[0..4];
+}
+

这里,s 会是一个 &str,它包含字符串的头四个字节。早些时候,我们提到了这些字母都是两个字节长的,所以这意味着 s 将会是 “Зд”。

+

如果获取 &hello[0..1] 会发生什么呢?答案是:Rust 在运行时会 panic,就跟访问 vector 中的无效索引时一样:

+
$ cargo run
+   Compiling collections v0.1.0 (file:///projects/collections)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s
+     Running `target/debug/collections`
+thread 'main' panicked at src/main.rs:4:19:
+byte index 1 is not a char boundary; it is inside 'З' (bytes 0..2) of `Здравствуйте`
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+

你应该小心谨慎地使用这个操作,因为这么做可能会使你的程序崩溃。

+

遍历字符串的方法

+

操作字符串每一部分的最好的方法是明确表示需要字符还是字节。对于单独的 Unicode 标量值使用 chars 方法。对 “Зд” 调用 chars 方法会将其分开并返回两个 char 类型的值,接着就可以遍历其结果来访问每一个元素了:

+
#![allow(unused)]
+fn main() {
+for c in "Зд".chars() {
+    println!("{c}");
+}
+}
+

这些代码会打印出如下内容:

+
З
+д
+
+

另外 bytes 方法返回每一个原始字节,这可能会适合你的使用场景:

+
#![allow(unused)]
+fn main() {
+for b in "Зд".bytes() {
+    println!("{b}");
+}
+}
+

这些代码会打印出组成 String 的 4 个字节:

+
208
+151
+208
+180
+
+

不过请记住有效的 Unicode 标量值可能会由不止一个字节组成。

+

从字符串中获取如同天城文这样的字形簇是很复杂的,所以标准库并没有提供这个功能。crates.io 上有些提供这样功能的 crate。

+

字符串并不简单

+

总而言之,字符串还是很复杂的。不同的语言选择了不同的向程序员展示其复杂性的方式。Rust 选择了以准确的方式处理 String 数据作为所有 Rust 程序的默认行为,这意味着程序员们必须更多的思考如何预先处理 UTF-8 数据。这种权衡取舍相比其他语言更多的暴露出了字符串的复杂性,不过也使你在开发周期后期免于处理涉及非 ASCII 字符的错误。

+

好消息是标准库提供了很多围绕 String&str 构建的功能,来帮助我们正确处理这些复杂场景。请务必查看这些使用方法的文档,例如 contains 来搜索一个字符串,和 replace 将字符串的一部分替换为另一个字符串。

+

称作 String 的类型是由标准库提供的,而没有写进核心语言部分,它是可增长的、可变的、有所有权的、UTF-8 编码的字符串类型。当 Rustacean 们谈到 Rust 的 “字符串”时,它们通常指的是 String 或字符串 slice &str 类型,而不特指其中某一个。虽然本部分内容大多是关于 String 的,不过这两个类型在 Rust 标准库中都被广泛使用,String 和字符串 slices 都是 UTF-8 编码的。

+

现在让我们转向一些不太复杂的集合:哈希 map!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch08-03-hash-maps.html b/ch08-03-hash-maps.html new file mode 100644 index 000000000..bcb11439e --- /dev/null +++ b/ch08-03-hash-maps.html @@ -0,0 +1,375 @@ + + + + + + 使用 Hash Map 储存键值对 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用 Hash Map 储存键值对

+
+

ch08-03-hash-maps.md +
+commit 50775360ba3904c41e84176337ff47e6e7d6177c

+
+

最后介绍的常用集合类型是 哈希 maphash map)。HashMap<K, V> 类型储存了一个键类型 K 对应一个值类型 V 的映射。它通过一个 哈希函数hashing function)来实现映射,决定如何将键和值放入内存中。很多编程语言支持这种数据结构,不过通常有不同的名字:哈希、map、对象、哈希表或者关联数组,仅举几例。

+

哈希 map 可以用于需要任何类型作为键来寻找数据的情况,而不是像 vector 那样通过索引。例如,在一个游戏中,你可以将每个团队的分数记录到哈希 map 中,其中键是队伍的名字而值是每个队伍的分数。给出一个队名,就能得到他们的得分。

+

本章我们会介绍哈希 map 的基本 API,不过还有更多吸引人的功能隐藏于标准库在 HashMap<K, V> 上定义的函数中。一如既往请查看标准库文档来了解更多信息。

+

新建一个哈希 map

+

可以使用 new 创建一个空的 HashMap,并使用 insert 增加元素。在示例 8-20 中我们记录两支队伍的分数,分别是蓝队和黄队。蓝队开始有 10 分而黄队开始有 50 分:

+
fn main() {
+    use std::collections::HashMap;
+
+    let mut scores = HashMap::new();
+
+    scores.insert(String::from("Blue"), 10);
+    scores.insert(String::from("Yellow"), 50);
+}
+

示例 8-20:新建一个哈希 map 并插入一些键值对

+

注意必须首先 use 标准库中集合部分的 HashMap。在这三个常用集合中,HashMap 是最不常用的,所以并没有被 prelude 自动引用。标准库中对 HashMap 的支持也相对较少,例如,并没有内建的构建宏。

+

像 vector 一样,哈希 map 将它们的数据储存在堆上,这个 HashMap 的键类型是 String 而值类型是 i32。类似于 vector,哈希 map 是同质的:所有的键必须是相同类型,值也必须都是相同类型。

+

访问哈希 map 中的值

+

可以通过 get 方法并提供对应的键来从哈希 map 中获取值,如示例 8-21 所示:

+
fn main() {
+    use std::collections::HashMap;
+
+    let mut scores = HashMap::new();
+
+    scores.insert(String::from("Blue"), 10);
+    scores.insert(String::from("Yellow"), 50);
+
+    let team_name = String::from("Blue");
+    let score = scores.get(&team_name).copied().unwrap_or(0);
+}
+

示例 8-21:访问哈希 map 中储存的蓝队分数

+

这里,score 是与蓝队分数相关的值,应为 10get 方法返回 Option<&V>,如果某个键在哈希 map 中没有对应的值,get 会返回 None。程序中通过调用 copied 方法来获取一个 Option<i32> 而不是 Option<&i32>,接着调用 unwrap_orscores 中没有该键所对应的项时将其设置为零。

+

可以使用与 vector 类似的方式来遍历哈希 map 中的每一个键值对,也就是 for 循环:

+
fn main() {
+    use std::collections::HashMap;
+
+    let mut scores = HashMap::new();
+
+    scores.insert(String::from("Blue"), 10);
+    scores.insert(String::from("Yellow"), 50);
+
+    for (key, value) in &scores {
+        println!("{key}: {value}");
+    }
+}
+

这会以任意顺序打印出每一个键值对:

+
Yellow: 50
+Blue: 10
+
+

哈希 map 和所有权

+

对于像 i32 这样的实现了 Copy trait 的类型,其值可以拷贝进哈希 map。对于像 String 这样拥有所有权的值,其值将被移动而哈希 map 会成为这些值的所有者,如示例 8-22 所示:

+
fn main() {
+    use std::collections::HashMap;
+
+    let field_name = String::from("Favorite color");
+    let field_value = String::from("Blue");
+
+    let mut map = HashMap::new();
+    map.insert(field_name, field_value);
+    // 这里 field_name 和 field_value 不再有效,
+    // 尝试使用它们看看会出现什么编译错误!
+}
+

示例 8-22:展示一旦键值对被插入后就为哈希 map 所拥有

+

insert 调用将 field_namefield_value 移动到哈希 map 中后,将不能使用这两个绑定。

+

如果将值的引用插入哈希 map,这些值本身将不会被移动进哈希 map。但是这些引用指向的值必须至少在哈希 map 有效时也是有效的。第十章 “生命周期确保引用有效” 部分将会更多的讨论这个问题。

+

更新哈希 map

+

尽管键值对的数量是可以增长的,每个唯一的键只能同时关联一个值(反之不一定成立:比如蓝队和黄队的 scores 哈希 map 中都可能存储有 10 这个值)。

+

当我们想要改变哈希 map 中的数据时,必须决定如何处理一个键已经有值了的情况。可以选择完全无视旧值并用新值代替旧值。可以选择保留旧值而忽略新值,并只在键 没有 对应值时增加新值。或者可以结合新旧两值。让我们看看这分别该如何处理!

+

覆盖一个值

+

如果我们插入了一个键值对,接着用相同的键插入一个不同的值,与这个键相关联的旧值将被替换。即便示例 8-23 中的代码调用了两次 insert,哈希 map 也只会包含一个键值对,因为两次都是对蓝队的键插入的值:

+
fn main() {
+    use std::collections::HashMap;
+
+    let mut scores = HashMap::new();
+
+    scores.insert(String::from("Blue"), 10);
+    scores.insert(String::from("Blue"), 25);
+
+    println!("{scores:?}");
+}
+

示例 8-23:替换以特定键储存的值

+

这会打印出 {"Blue": 25}。原始的值 10 则被覆盖了。

+

只在键没有对应值时插入键值对

+

我们经常会检查某个特定的键是否已经存在于哈希 map 中并进行如下操作:如果哈希 map 中键已经存在则不做任何操作。如果不存在则连同值一块插入。

+

为此哈希 map 有一个特有的 API,叫做 entry,它获取我们想要检查的键作为参数。entry 函数的返回值是一个枚举,Entry,它代表了可能存在也可能不存在的值。比如说我们想要检查黄队的键是否关联了一个值。如果没有,就插入值 50,对于蓝队也是如此。使用 entry API 的代码看起来像示例 8-24 这样:

+
fn main() {
+    use std::collections::HashMap;
+
+    let mut scores = HashMap::new();
+    scores.insert(String::from("Blue"), 10);
+
+    scores.entry(String::from("Yellow")).or_insert(50);
+    scores.entry(String::from("Blue")).or_insert(50);
+
+    println!("{scores:?}");
+}
+

示例 8-24:使用 entry 方法只在键没有对应一个值时插入

+

Entryor_insert 方法在键对应的值存在时就返回这个值的可变引用,如果不存在则将参数作为新值插入并返回新值的可变引用。这比编写自己的逻辑要简明的多,另外也与借用检查器结合得更好。

+

运行示例 8-24 的代码会打印出 {"Yellow": 50, "Blue": 10}。第一个 entry 调用会插入黄队的键和值 50,因为黄队并没有一个值。第二个 entry 调用不会改变哈希 map 因为蓝队已经有了值 10

+

根据旧值更新一个值

+

另一个常见的哈希 map 的应用场景是找到一个键对应的值并根据旧的值更新它。例如,示例 8-25 中的代码计数一些文本中每一个单词分别出现了多少次。我们使用哈希 map 以单词作为键并递增其值来记录我们遇到过几次这个单词。如果是第一次看到某个单词,就插入值 0

+
fn main() {
+    use std::collections::HashMap;
+
+    let text = "hello world wonderful world";
+
+    let mut map = HashMap::new();
+
+    for word in text.split_whitespace() {
+        let count = map.entry(word).or_insert(0);
+        *count += 1;
+    }
+
+    println!("{map:?}");
+}
+

示例 8-25:通过哈希 map 储存单词和计数来统计出现次数

+

这会打印出 {"world": 2, "hello": 1, "wonderful": 1}。你可能会看到相同的键值对以不同的顺序打印:回忆一下“访问哈希 map 中的值”部分中遍历哈希 map 会以任意顺序进行。

+

split_whitespace 方法返回一个由空格分隔 text 值子 slice 的迭代器。or_insert 方法返回这个键的值的一个可变引用(&mut V)。这里我们将这个可变引用储存在 count 变量中,所以为了赋值必须首先使用星号(*)解引用 count。这个可变引用在 for 循环的结尾离开作用域,这样所有这些改变都是安全的并符合借用规则。

+

哈希函数

+

HashMap 默认使用一种叫做 SipHash 的哈希函数,它可以抵御涉及哈希表(hash table)1 的拒绝服务(Denial of Service, DoS)攻击。然而这并不是可用的最快的算法,不过为了更高的安全性值得付出一些性能的代价。如果性能监测显示此哈希函数非常慢,以致于你无法接受,你可以指定一个不同的 hasher 来切换为其它函数。hasher 是一个实现了 BuildHasher trait 的类型。第十章会讨论 trait 和如何实现它们。你并不需要从头开始实现你自己的 hasher;crates.io 有其他人分享的实现了许多常用哈希算法的 hasher 的库。

+ +

总结

+

vector、字符串和哈希 map 会在你的程序需要储存、访问和修改数据时帮助你。这里有一些你应该能够解决的练习问题:

+
    +
  • 给定一系列数字,使用 vector 并返回这个列表的中位数(排列数组后位于中间的值)和众数(出现次数最多的值;在这里哈希 map 会很有帮助)。
  • +
  • 将字符串转换为 Pig Latin,也就是每一个单词的第一个辅音字母被移动到单词的结尾并增加 “ay”,所以 “first” 会变成 “irst-fay”。元音字母开头的单词则在结尾增加 “hay”(“apple” 会变成 “apple-hay”)。牢记 UTF-8 编码!
  • +
  • 使用哈希 map 和 vector,创建一个文本接口来允许用户向公司的部门中增加员工的名字。例如,“Add Sally to Engineering” 或 “Add Amir to Sales”。接着让用户获取一个部门的所有员工的列表,或者公司每个部门的所有员工按照字典序排列的列表。
  • +
+

标准库 API 文档中描述的这些类型的方法将有助于你进行这些练习!

+

我们已经开始接触可能会有失败操作的复杂程序了,这也意味着接下来是一个了解错误处理的绝佳时机!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch09-00-error-handling.html b/ch09-00-error-handling.html new file mode 100644 index 000000000..52ca86768 --- /dev/null +++ b/ch09-00-error-handling.html @@ -0,0 +1,247 @@ + + + + + + 错误处理 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

错误处理

+
+

ch09-00-error-handling.md +
+commit 199ca99926f232ee7f581a917eada4b65ff21754

+
+

错误是软件中不可否认的事实,所以 Rust 有一些处理出错情况的特性。在许多情况下,Rust 要求你承认错误的可能性,并在你的代码编译前采取一些行动。这一要求使你的程序更加健壮,因为它可以确保你在将代码部署到生产环境之前就能发现错误并进行适当的处理。

+

Rust 将错误分为两大类:可恢复的recoverable)和 不可恢复的unrecoverable)错误。对于一个可恢复的错误,比如文件未找到的错误,我们很可能只想向用户报告问题并重试操作。不可恢复的错误总是 bug 出现的征兆,比如试图访问一个超过数组末端的位置,因此我们要立即停止程序。

+

大多数语言并不区分这两种错误,并采用类似异常这样方式统一处理它们。Rust 没有异常。相反,它有 Result<T, E> 类型,用于处理可恢复的错误,还有 panic! 宏,在程序遇到不可恢复的错误时停止执行。本章首先介绍 panic! 调用,接着会讲到如何返回 Result<T, E>。此外,我们将探讨在决定是尝试从错误中恢复还是停止执行时的注意事项。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch09-01-unrecoverable-errors-with-panic.html b/ch09-01-unrecoverable-errors-with-panic.html new file mode 100644 index 000000000..47a646f35 --- /dev/null +++ b/ch09-01-unrecoverable-errors-with-panic.html @@ -0,0 +1,315 @@ + + + + + + 用 panic! 处理不可恢复的错误 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

panic! 处理不可恢复的错误

+
+

ch09-01-unrecoverable-errors-with-panic.md +
+commit 2921743516b3e2c0f45a95390e7b536e42f4af7c

+
+

突然有一天,代码出问题了,而你对此束手无策。对于这种情况,Rust 有 panic!宏。在实践中有两种方法造成 panic:执行会造成代码 panic 的操作(比如访问超过数组结尾的内容)或者显式调用 panic! 宏。这两种情况都会使程序 panic。通常情况下这些 panic 会打印出一个错误信息,展开并清理栈数据,然后退出。通过一个环境变量,你也可以让 Rust 在 panic 发生时打印调用堆栈(call stack)以便于定位 panic 的原因。

+
+

对应 panic 时的栈展开或终止

+

当出现 panic 时,程序默认会开始 展开unwinding),这意味着 Rust 会回溯栈并清理它遇到的每一个函数的数据,不过这个回溯并清理的过程有很多工作。另一种选择是直接 终止abort),这会不清理数据就退出程序。

+

那么程序所使用的内存需要由操作系统来清理。如果你需要项目的最终二进制文件越小越好,panic 时通过在 Cargo.toml[profile] 部分增加 panic = 'abort',可以由展开切换为终止。例如,如果你想要在 release 模式中 panic 时直接终止:

+
[profile.release]
+panic = 'abort'
+
+
+

让我们在一个简单的程序中调用 panic!

+

文件名:src/main.rs

+
fn main() {
+    panic!("crash and burn");
+}
+

运行程序将会出现类似这样的输出:

+
$ cargo run
+   Compiling panic v0.1.0 (file:///projects/panic)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.25s
+     Running `target/debug/panic`
+thread 'main' panicked at src/main.rs:2:5:
+crash and burn
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+

最后两行包含 panic! 调用造成的错误信息。第一行显示了 panic 提供的信息并指明了源码中 panic 出现的位置:src/main.rs:2:5 表明这是 src/main.rs 文件的第二行第五个字符。

+

在这个例子中,被指明的那一行是我们代码的一部分,而且查看这一行的话就会发现 panic! 宏的调用。在其他情况下,panic! 可能会出现在我们的代码所调用的代码中。错误信息报告的文件名和行号可能指向别人代码中的 panic! 宏调用,而不是我们代码中最终导致 panic! 的那一行。我们可以使用 panic! 被调用的函数的 backtrace 来寻找代码中出问题的地方。下面我们会详细介绍 backtrace 是什么。

+

使用 panic! 的 backtrace

+

让我们来看看另一个因为我们代码中的 bug 引起的别的库中 panic! 的例子,而不是直接的宏调用。示例 9-1 有一些尝试通过索引访问 vector 中元素的例子:

+

文件名:src/main.rs

+
fn main() {
+    let v = vec![1, 2, 3];
+
+    v[99];
+}
+

示例 9-1:尝试访问超越 vector 结尾的元素,这会造成 panic!

+

这里尝试访问 vector 的第一百个元素(这里的索引是 99 因为索引从 0 开始),不过它只有三个元素。这种情况下 Rust 会 panic。[] 应当返回一个元素,不过如果传递了一个无效索引,就没有可供 Rust 返回的正确的元素。

+

C 语言中,尝试读取数据结构之后的值是未定义行为(undefined behavior)。你会得到任何对应数据结构中这个元素的内存位置的值,甚至是这些内存并不属于这个数据结构的情况。这被称为 缓冲区溢出buffer overread),并可能会导致安全漏洞,比如攻击者可以像这样操作索引来读取储存在数据结构之后不被允许的数据。

+

为了保护程序远离这类漏洞,如果尝试读取一个索引不存在的元素,Rust 会停止执行并拒绝继续。尝试运行上面的程序会出现如下输出:

+
$ cargo run
+   Compiling panic v0.1.0 (file:///projects/panic)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.27s
+     Running `target/debug/panic`
+thread 'main' panicked at src/main.rs:4:6:
+index out of bounds: the len is 3 but the index is 99
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+

错误指向 main.rs 的第 4 行,这里我们尝试访问索引 99。下面的说明(note)行提醒我们可以设置 RUST_BACKTRACE 环境变量来得到一个 backtrace。backtrace 是一个执行到目前位置所有被调用的函数的列表。Rust 的 backtrace 跟其他语言中的一样:阅读 backtrace 的关键是从头开始读直到发现你编写的文件。这就是问题的发源地。这一行往上是你的代码所调用的代码;往下则是调用你的代码的代码。这些行可能包含核心 Rust 代码,标准库代码或用到的 crate 代码。让我们将 RUST_BACKTRACE 环境变量设置为任何不是 0 的值来获取 backtrace 看看。示例 9-2 展示了与你看到类似的输出:

+
$ RUST_BACKTRACE=1 cargo run
+thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 99', src/main.rs:4:5
+stack backtrace:
+   0: rust_begin_unwind
+             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/std/src/panicking.rs:584:5
+   1: core::panicking::panic_fmt
+             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/panicking.rs:142:14
+   2: core::panicking::panic_bounds_check
+             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/panicking.rs:84:5
+   3: <usize as core::slice::index::SliceIndex<[T]>>::index
+             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/slice/index.rs:242:10
+   4: core::slice::index::<impl core::ops::index::Index<I> for [T]>::index
+             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/slice/index.rs:18:9
+   5: <alloc::vec::Vec<T,A> as core::ops::index::Index<I>>::index
+             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/alloc/src/vec/mod.rs:2591:9
+   6: panic::main
+             at ./src/main.rs:4:5
+   7: core::ops::function::FnOnce::call_once
+             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/ops/function.rs:248:5
+note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
+
+

示例 9-2:当设置 RUST_BACKTRACE 环境变量时 panic! 调用所生成的 backtrace 信息

+

这里有大量的输出!你实际看到的输出可能因不同的操作系统和 Rust 版本而有所不同。为了获取带有这些信息的 backtrace,必须启用 debug 标识。当不使用 --release 参数运行 cargo build 或 cargo run 时 debug 标识会默认启用,就像这里一样。

+

示例 9-2 的输出中,backtrace 的 12 行指向了我们项目中造成问题的行:src/main.rs 的第 4 行。如果你不希望程序 panic,第一个提到我们编写的代码行的位置是你应该开始调查的,以便查明是什么值如何在这个地方引起了 panic。在示例 9-1 中,我们故意编写会 panic 的代码来演示如何使用 backtrace,修复这个 panic 的方法就是不要尝试在一个只包含三个项的 vector 中请求索引是 100 的元素。当将来你的代码出现了 panic,你需要搞清楚在这特定的场景下代码中执行了什么操作和什么值导致了 panic,以及应当如何处理才能避免这个问题。

+

本章后面的小节 “要不要 panic!” 会再次回到 panic! 并讲解何时应该、何时不应该使用 panic! 来处理错误情况。接下来,我们来看看如何使用 Result 来从错误中恢复。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch09-02-recoverable-errors-with-result.html b/ch09-02-recoverable-errors-with-result.html new file mode 100644 index 000000000..d9e03494a --- /dev/null +++ b/ch09-02-recoverable-errors-with-result.html @@ -0,0 +1,512 @@ + + + + + + 用 Result 处理可恢复的错误 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Result 处理可恢复的错误

+
+

ch09-02-recoverable-errors-with-result.md +
+commit 699adc6f5cb76f6e9d567ff0a57d8a844ac07a88

+
+

大部分错误并没有严重到需要程序完全停止执行。有时候,一个函数失败,仅仅就是因为一个容易理解和响应的原因。例如,如果因为打开一个并不存在的文件而失败,此时我们可能想要创建这个文件,而不是终止进程。

+

回忆一下第二章 “使用 Result 类型来处理潜在的错误” 部分中的那个 Result 枚举,它定义有如下两个成员,OkErr

+
#![allow(unused)]
+fn main() {
+enum Result<T, E> {
+    Ok(T),
+    Err(E),
+}
+}
+

TE 是泛型类型参数;第十章会详细介绍泛型。现在你需要知道的就是 T 代表成功时返回的 Ok 成员中的数据的类型,而 E 代表失败时返回的 Err 成员中的错误的类型。因为 Result 有这些泛型类型参数,我们可以将 Result 类型和标准库中为其定义的函数用于很多不同的场景,这些情况中需要返回的成功值和失败值可能会各不相同。

+

让我们调用一个返回 Result 的函数,因为它可能会失败:如示例 9-3 所示打开一个文件:

+

文件名:src/main.rs

+
use std::fs::File;
+
+fn main() {
+    let greeting_file_result = File::open("hello.txt");
+}
+

示例 9-3:打开文件

+

File::open 的返回值是 Result<T, E>。泛型参数 T 会被 File::open 的实现放入成功返回值的类型 std::fs::File,这是一个文件句柄。错误返回值使用的 E 的类型是 std::io::Error。这些返回类型意味着 File::open 调用可能成功并返回一个可以读写的文件句柄。这个函数调用也可能会失败:例如,也许文件不存在,或者可能没有权限访问这个文件。File::open 函数需要一个方法在告诉我们成功与否的同时返回文件句柄或者错误信息。这些信息正好是 Result 枚举所代表的。

+

File::open 成功时,greeting_file_result 变量将会是一个包含文件句柄的 Ok 实例。当失败时,greeting_file_result 变量将会是一个包含了更多关于发生了何种错误的信息的 Err 实例。

+

我们需要在示例 9-3 的代码中增加根据 File::open 返回值进行不同处理的逻辑。示例 9-4 展示了一个使用基本工具处理 Result 的例子:第六章学习过的 match 表达式。

+

文件名:src/main.rs

+
use std::fs::File;
+
+fn main() {
+    let greeting_file_result = File::open("hello.txt");
+
+    let greeting_file = match greeting_file_result {
+        Ok(file) => file,
+        Err(error) => panic!("Problem opening the file: {error:?}"),
+    };
+}
+

示例 9-4:使用 match 表达式处理可能会返回的 Result 成员

+

注意与 Option 枚举一样,Result 枚举和其成员也被导入到了 prelude 中,所以就不需要在 match 分支中的 OkErr 之前指定 Result::

+

这里我们告诉 Rust 当结果是 Ok 时,返回 Ok 成员中的 file 值,然后将这个文件句柄赋值给变量 greeting_filematch 之后,我们可以利用这个文件句柄来进行读写。

+

match 的另一个分支处理从 File::open 得到 Err 值的情况。在这种情况下,我们选择调用 panic! 宏。如果当前目录没有一个叫做 hello.txt 的文件,当运行这段代码时会看到如下来自 panic! 宏的输出:

+
$ cargo run
+   Compiling error-handling v0.1.0 (file:///projects/error-handling)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.73s
+     Running `target/debug/error-handling`
+thread 'main' panicked at src/main.rs:8:23:
+Problem opening the file: Os { code: 2, kind: NotFound, message: "No such file or directory" }
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+

一如既往,此输出准确地告诉了我们到底出了什么错。

+

匹配不同的错误

+

示例 9-4 中的代码不管 File::open 是因为什么原因失败都会 panic!。我们真正希望的是对不同的错误原因采取不同的行为:如果 File::open 因为文件不存在而失败,我们希望创建这个文件并返回新文件的句柄。如果 File::open 因为任何其他原因失败,例如没有打开文件的权限,我们仍然希望像示例 9-4 那样 panic!。让我们看看示例 9-5,其中 match 增加了另一个分支:

+

文件名:src/main.rs

+
use std::fs::File;
+use std::io::ErrorKind;
+
+fn main() {
+    let greeting_file_result = File::open("hello.txt");
+
+    let greeting_file = match greeting_file_result {
+        Ok(file) => file,
+        Err(error) => match error.kind() {
+            ErrorKind::NotFound => match File::create("hello.txt") {
+                Ok(fc) => fc,
+                Err(e) => panic!("Problem creating the file: {e:?}"),
+            },
+            other_error => {
+                panic!("Problem opening the file: {other_error:?}");
+            }
+        },
+    };
+}
+

示例 9-5:使用不同的方式处理不同类型的错误

+

File::open 返回的 Err 成员中的值类型 io::Error,它是一个标准库中提供的结构体。这个结构体有一个返回 io::ErrorKind 值的 kind 方法可供调用。io::ErrorKind 是一个标准库提供的枚举,它的成员对应 io 操作可能导致的不同错误类型。我们感兴趣的成员是 ErrorKind::NotFound,它代表尝试打开的文件并不存在。这样,match 就匹配完 greeting_file_result 了,不过对于 error.kind() 还有一个内层 match

+

我们希望在内层 match 中检查的条件是 error.kind() 的返回值是否为 ErrorKindNotFound 成员。如果是,则尝试通过 File::create 创建文件。然而因为 File::create 也可能会失败,还需要增加一个内层 match 语句。当文件不能被创建,会打印出一个不同的错误信息。外层 match 的最后一个分支保持不变,这样对任何除了文件不存在的错误会使程序 panic。

+
+

不同于使用 matchResult<T, E>

+

这里有好多 matchmatch 确实很强大,不过也非常的原始。第十三章我们会介绍闭包(closure),它会和定义在 Result<T, E> 中的很多方法一起使用。在处理代码中的 Result<T, E> 值时,相比于使用 match ,使用这些方法会更加简洁。

+

例如,这是另一个编写与示例 9-5 逻辑相同但是使用闭包和 unwrap_or_else 方法的例子:

+
use std::fs::File;
+use std::io::ErrorKind;
+
+fn main() {
+    let greeting_file = File::open("hello.txt").unwrap_or_else(|error| {
+        if error.kind() == ErrorKind::NotFound {
+            File::create("hello.txt").unwrap_or_else(|error| {
+                panic!("Problem creating the file: {:?}", error);
+            })
+        } else {
+            panic!("Problem opening the file: {:?}", error);
+        }
+    });
+}
+

虽然这段代码有着如示例 9-5 一样的行为,但并没有包含任何 match 表达式且更容易阅读。在阅读完第十三章后再回到这个例子,并查看标准库文档 unwrap_or_else 方法都做了什么操作。在处理错误时,还有很多这类方法可以消除大量嵌套的 match 表达式。

+
+

失败时 panic 的简写:unwrapexpect

+

match 能够胜任它的工作,不过它可能有点冗长并且不总是能很好的表明其意图。Result<T, E> 类型定义了很多辅助方法来处理各种情况。其中之一叫做 unwrap,它的实现就类似于示例 9-4 中的 match 语句。如果 Result 值是成员 Okunwrap 会返回 Ok 中的值。如果 Result 是成员 Errunwrap 会为我们调用 panic!。这里是一个实践 unwrap 的例子:

+

文件名:src/main.rs

+
use std::fs::File;
+
+fn main() {
+    let greeting_file = File::open("hello.txt").unwrap();
+}
+

如果调用这段代码时不存在 hello.txt 文件,我们将会看到一个 unwrap 调用 panic! 时提供的错误信息:

+
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os {
+code: 2, kind: NotFound, message: "No such file or directory" }',
+src/main.rs:4:49
+
+

还有另一个类似于 unwrap 的方法它还允许我们选择 panic! 的错误信息:expect。使用 expect 而不是 unwrap 并提供一个好的错误信息可以表明你的意图并更易于追踪 panic 的根源。expect 的语法看起来像这样:

+

文件名:src/main.rs

+
use std::fs::File;
+
+fn main() {
+    let greeting_file = File::open("hello.txt")
+        .expect("hello.txt should be included in this project");
+}
+

expectunwrap 的使用方式一样:返回文件句柄或调用 panic! 宏。expect 在调用 panic! 时使用的错误信息将是我们传递给 expect 的参数,而不像 unwrap 那样使用默认的 panic! 信息。它看起来像这样:

+
thread 'main' panicked at 'hello.txt should be included in this project: Error
+{ repr: Os { code: 2, message: "No such file or directory" } }',
+src/libcore/result.rs:906:4
+
+

在生产级别的代码中,大部分 Rustaceans 选择 expect 而不是 unwrap 并提供更多关于为何操作期望是一直成功的上下文。如此如果该假设真的被证明是错的,你也有更多的信息来用于调试。

+

传播错误

+

当编写一个其实先会调用一些可能会失败的操作的函数时,除了在这个函数中处理错误外,还可以选择让调用者知道这个错误并决定该如何处理。这被称为 传播propagating)错误,这样能更好的控制代码调用,因为比起你代码所拥有的上下文,调用者可能拥有更多信息或逻辑来决定应该如何处理错误。

+

例如,示例 9-6 展示了一个从文件中读取用户名的函数。如果文件不存在或不能读取,这个函数会将这些错误返回给调用它的代码:

+

文件名:src/main.rs

+
#![allow(unused)]
+fn main() {
+use std::fs::File;
+use std::io::{self, Read};
+
+fn read_username_from_file() -> Result<String, io::Error> {
+    let username_file_result = File::open("hello.txt");
+
+    let mut username_file = match username_file_result {
+        Ok(file) => file,
+        Err(e) => return Err(e),
+    };
+
+    let mut username = String::new();
+
+    match username_file.read_to_string(&mut username) {
+        Ok(_) => Ok(username),
+        Err(e) => Err(e),
+    }
+}
+}
+

示例 9-6:一个函数使用 match 将错误返回给代码调用者

+

这个函数可以编写成更加简短的形式,不过我们以大量手动处理开始以便探索错误处理;在最后我们会展示更短的形式。让我们看看函数的返回值:Result<String, io::Error>。这意味着函数返回一个 Result<T, E> 类型的值,其中泛型参数 T 的具体类型是 String,而 E 的具体类型是 io::Error

+

如果这个函数没有出任何错误成功返回,函数的调用者会收到一个包含 StringOk 值 —— 函数从文件中读取到的用户名。如果函数遇到任何错误,函数的调用者会收到一个 Err 值,它储存了一个包含更多这个问题相关信息的 io::Error 实例。这里选择 io::Error 作为函数的返回值是因为它正好是函数体中那两个可能会失败的操作的错误返回值:File::open 函数和 read_to_string 方法。

+

函数体以调用 File::open 函数开始。接着使用 match 处理返回值 Result,类似示例 9-4,如果 File::open 成功了,模式变量 file 中的文件句柄就变成了可变变量 username_file 中的值,接着函数继续执行。在 Err 的情况下,我们没有调用 panic!,而是使用 return 关键字提前结束整个函数,并将来自 File::open 的错误值(现在在模式变量 e 中)作为函数的错误值传回给调用者。

+

所以,如果在 username_file 中有一个文件句柄,该函数随后会在变量 username 中创建一个新的 String 并调用文件句柄 username_file 上的 read_to_string 方法,以将文件的内容读入 usernameread_to_string 方法也返回一个 Result,因为它可能会失败,哪怕是 File::open 已经成功了。因此,我们需要另一个 match 来处理这个 Result:如果 read_to_string 执行成功,那么这个函数也就成功了,我们将从文件中读取的用户名返回,此时用户名位于被封装进 Okusername 中。如果 read_to_string 执行失败,则像之前处理 File::open 的返回值的 match 那样返回错误值。然而,我们无需显式调用 return 语句,因为这是函数的最后一个表达式。

+

调用这个函数的代码最终会得到一个包含用户名的 Ok 值,或者一个包含 io::ErrorErr 值。我们无从得知调用者会如何处理这些值。例如,如果他们得到了一个 Err 值,他们可能会选择 panic! 并使程序崩溃、使用一个默认的用户名或者从文件之外的地方寻找用户名。我们没有足够的信息知晓调用者具体会如何尝试,所以将所有的成功或失败信息向上传播,让他们选择合适的处理方法。

+

这种传播错误的模式在 Rust 是如此的常见,以至于 Rust 提供了 ? 问号运算符来使其更易于处理。

+

传播错误的简写:? 运算符

+

示例 9-7 展示了一个 read_username_from_file 的实现,它实现了与示例 9-6 中的代码相同的功能,不过这个实现使用了 ? 运算符:

+

文件名:src/main.rs

+
#![allow(unused)]
+fn main() {
+use std::fs::File;
+use std::io::{self, Read};
+
+fn read_username_from_file() -> Result<String, io::Error> {
+    let mut username_file = File::open("hello.txt")?;
+    let mut username = String::new();
+    username_file.read_to_string(&mut username)?;
+    Ok(username)
+}
+}
+

示例 9-7:一个使用 ? 运算符向调用者返回错误的函数

+

Result 值之后的 ? 被定义为与示例 9-6 中定义的处理 Result 值的 match 表达式有着完全相同的工作方式。如果 Result 的值是 Ok,这个表达式将会返回 Ok 中的值而程序将继续执行。如果值是 ErrErr 将作为整个函数的返回值,就好像使用了 return 关键字一样,这样错误值就被传播给了调用者。

+

示例 9-6 中的 match 表达式与 ? 运算符所做的有一点不同:? 运算符所使用的错误值被传递给了 from 函数,它定义于标准库的 From trait 中,其用来将错误从一种类型转换为另一种类型。当 ? 运算符调用 from 函数时,收到的错误类型被转换为由当前函数返回类型所指定的错误类型。这在当函数返回单个错误类型来代表所有可能失败的方式时很有用,即使其可能会因很多种原因失败。

+

例如,我们可以将示例 9-7 中的 read_username_from_file 函数修改为返回一个自定义的 OurError 错误类型。如果我们也定义了 impl From<io::Error> for OurError 来从 io::Error 构造一个 OurError 实例,那么 read_username_from_file 函数体中的 ? 运算符调用会调用 from 并转换错误而无需在函数中增加任何额外的代码。

+

在示例 9-7 的上下文中,File::open 调用结尾的 ? 会将 Ok 中的值返回给变量 username_file。如果发生了错误,? 运算符会使整个函数提前返回并将任何 Err 值返回给调用代码。同理也适用于 read_to_string 调用结尾的 ?

+

? 运算符消除了大量样板代码并使得函数的实现更简单。我们甚至可以在 ? 之后直接使用链式方法调用来进一步缩短代码,如示例 9-8 所示:

+

文件名:src/main.rs

+
#![allow(unused)]
+fn main() {
+use std::fs::File;
+use std::io::{self, Read};
+
+fn read_username_from_file() -> Result<String, io::Error> {
+    let mut username = String::new();
+
+    File::open("hello.txt")?.read_to_string(&mut username)?;
+
+    Ok(username)
+}
+}
+

示例 9-8:问号运算符之后的链式方法调用

+

username 中创建新的 String 被放到了函数开头;这一部分没有变化。我们对 File::open("hello.txt")? 的结果直接链式调用了 read_to_string,而不再创建变量 username_file。仍然需要 read_to_string 调用结尾的 ?,而且当 File::openread_to_string 都成功没有失败时返回包含用户名 usernameOk 值。其功能再一次与示例 9-6 和示例 9-7 保持一致,不过这是一个与众不同且更符合工程学(ergonomic)的写法。

+

示例 9-9 展示了一个使用 fs::read_to_string 的更为简短的写法:

+

文件名:src/main.rs

+
#![allow(unused)]
+fn main() {
+use std::fs;
+use std::io;
+
+fn read_username_from_file() -> Result<String, io::Error> {
+    fs::read_to_string("hello.txt")
+}
+}
+

示例 9-9: 使用 fs::read_to_string 而不是打开后读取文件

+

将文件读取到一个字符串是相当常见的操作,所以 Rust 提供了名为 fs::read_to_string 的函数,它会打开文件、新建一个 String、读取文件的内容,并将内容放入 String,接着返回它。当然,这样做就没有展示所有这些错误处理的机会了,所以我们最初就选择了艰苦的道路。

+

哪里可以使用 ? 运算符

+

? 运算符只能被用于返回值与 ? 作用的值相兼容的函数。因为 ? 运算符被定义为从函数中提早返回一个值,这与示例 9-6 中的 match 表达式有着完全相同的工作方式。示例 9-6 中 match 作用于一个 Result 值,提早返回的分支返回了一个 Err(e) 值。函数的返回值必须是 Result 才能与这个 return 相兼容。

+

在示例 9-10 中,让我们看看在返回值不兼容的 main 函数中使用 ? 运算符会得到什么错误:

+

文件名:src/main.rs

+
use std::fs::File;
+
+fn main() {
+    let greeting_file = File::open("hello.txt")?;
+}
+

示例 9-10: 尝试在返回 ()main 函数中使用 ? 的代码不能编译

+

这段代码打开一个文件,这可能会失败。? 运算符作用于 File::open 返回的 Result 值,不过 main 函数的返回类型是 () 而不是 Result。当编译这些代码,会得到如下错误信息:

+
$ cargo run
+   Compiling error-handling v0.1.0 (file:///projects/error-handling)
+error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`)
+ --> src/main.rs:4:48
+  |
+3 | fn main() {
+  | --------- this function should return `Result` or `Option` to accept `?`
+4 |     let greeting_file = File::open("hello.txt")?;
+  |                                                ^ cannot use the `?` operator in a function that returns `()`
+  |
+  = help: the trait `FromResidual<Result<Infallible, std::io::Error>>` is not implemented for `()`
+help: consider adding return type
+  |
+3 ~ fn main() -> Result<(), Box<dyn std::error::Error>> {
+4 |     let greeting_file = File::open("hello.txt")?;
+5 + 
+6 +     Ok(())
+7 + }
+  |
+
+For more information about this error, try `rustc --explain E0277`.
+error: could not compile `error-handling` (bin "error-handling") due to 1 previous error
+
+

这个错误指出只能在返回 Result 或者其它实现了 FromResidual 的类型的函数中使用 ? 运算符。

+

为了修复这个错误,有两个选择。一个是,如果没有限制的话将函数的返回值改为 Result<T, E>。另一个是使用 matchResult<T, E> 的方法中合适的一个来处理 Result<T, E>

+

错误信息也提到 ? 也可用于 Option<T> 值。如同对 Result 使用 ? 一样,只能在返回 Option 的函数中对 Option 使用 ?。在 Option<T> 上调用 ? 运算符的行为与 Result<T, E> 类似:如果值是 None,此时 None 会从函数中提前返回。如果值是 SomeSome 中的值作为表达式的返回值同时函数继续。示例 9-11 中有一个从给定文本中返回第一行最后一个字符的函数的例子:

+
fn last_char_of_first_line(text: &str) -> Option<char> {
+    text.lines().next()?.chars().last()
+}
+
+fn main() {
+    assert_eq!(
+        last_char_of_first_line("Hello, world\nHow are you today?"),
+        Some('d')
+    );
+
+    assert_eq!(last_char_of_first_line(""), None);
+    assert_eq!(last_char_of_first_line("\nhi"), None);
+}
+

示例 9-11: 在 Option<T> 值上使用 ? 运算符

+

这个函数返回 Option<char> 因为它可能会在这个位置找到一个字符,也可能没有字符。这段代码获取 text 字符串 slice 作为参数并调用其 lines 方法,这会返回一个字符串中每一行的迭代器。因为函数希望检查第一行,所以调用了迭代器 next 来获取迭代器中第一个值。如果 text 是空字符串,next 调用会返回 None,此时我们可以使用 ? 来停止并从 last_char_of_first_line 返回 None。如果 text 不是空字符串,next 会返回一个包含 text 中第一行的字符串 slice 的 Some 值。

+

? 会提取这个字符串 slice,然后可以在字符串 slice 上调用 chars 来获取字符的迭代器。我们感兴趣的是第一行的最后一个字符,所以可以调用 last 来返回迭代器的最后一项。这是一个 Option,因为有可能第一行是一个空字符串,例如 text 以一个空行开头而后面的行有文本,像是 "\nhi"。不过,如果第一行有最后一个字符,它会返回在一个 Some 成员中。? 运算符作用于其中给了我们一个简洁的表达这种逻辑的方式。如果我们不能在 Option 上使用 ? 运算符,则不得不使用更多的方法调用或者 match 表达式来实现这些逻辑。

+

注意你可以在返回 Result 的函数中对 Result 使用 ? 运算符,可以在返回 Option 的函数中对 Option 使用 ? 运算符,但是不可以混合搭配。? 运算符不会自动将 Result 转化为 Option,反之亦然;在这些情况下,可以使用类似 Resultok 方法或者 Optionok_or 方法来显式转换。

+

目前为止,我们所使用的所有 main 函数都返回 ()main 函数是特殊的因为它是可执行程序的入口点和退出点,为了使程序能正常工作,其可以返回的类型是有限制的。

+

幸运的是 main 函数也可以返回 Result<(), E>,示例 9-12 中的代码来自示例 9-10 不过修改了 main 的返回值为 Result<(), Box<dyn Error>> 并在结尾增加了一个 Ok(()) 作为返回值。这段代码可以编译:

+
use std::error::Error;
+use std::fs::File;
+
+fn main() -> Result<(), Box<dyn Error>> {
+    let greeting_file = File::open("hello.txt")?;
+
+    Ok(())
+}
+

示例 9-12: 修改 main 返回 Result<(), E> 允许对 Result 值使用 ? 运算符

+

Box<dyn Error> 类型是一个 trait 对象trait object)第十八章 顾及不同类型值的 trait 对象” 部分会做介绍。目前可以将 Box<dyn Error> 理解为 “任何类型的错误”。在返回 Box<dyn Error> 错误类型 main 函数中对 Result 使用 ? 是允许的,因为它允许任何 Err 值提前返回。即便 main 函数体从来只会返回 std::io::Error 错误类型,通过指定 Box<dyn Error>,这个签名也仍是正确的,甚至当 main 函数体中增加更多返回其他错误类型的代码时也是如此。

+

main 函数返回 Result<(), E>,如果 main 返回 Ok(()) 可执行程序会以 0 值退出,而如果 main 返回 Err 值则会以非零值退出;成功退出的程序会返回整数 0,运行错误的程序会返回非 0 的整数。Rust 也会从二进制程序中返回与这个惯例相兼容的整数。

+

main 函数也可以返回任何实现了 std::process::Termination trait 的类型,它包含了一个返回 ExitCodereport 函数。请查阅标准库文档了解更多为自定义类型实现 Termination trait 的细节。

+

现在我们讨论过了调用 panic! 或返回 Result 的细节,是时候回到它们各自适合哪些场景的话题了。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch09-03-to-panic-or-not-to-panic.html b/ch09-03-to-panic-or-not-to-panic.html new file mode 100644 index 000000000..726e6e8a5 --- /dev/null +++ b/ch09-03-to-panic-or-not-to-panic.html @@ -0,0 +1,348 @@ + + + + + + 要不要 panic! - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

要不要 panic!

+
+

ch09-03-to-panic-or-not-to-panic.md +
+commit dd8f47a74b67178cea8c832e3b4eaf3bb515bd72

+
+

那么,该如何决定何时应该 panic! 以及何时应该返回 Result 呢?如果代码 panic,就没有恢复的可能。你可以选择对任何错误场景都调用 panic!,不管是否有可能恢复,不过这样就是你代替调用者决定了这是不可恢复的。选择返回 Result 值的话,就将选择权交给了调用者,而不是代替他们做出决定。调用者可能会选择以符合他们场景的方式尝试恢复,或者也可能干脆就认为 Err 是不可恢复的,所以他们也可能会调用 panic! 并将可恢复的错误变成了不可恢复的错误。因此返回 Result 是定义可能会失败的函数的一个好的默认选择。

+

在一些类似示例、原型代码(prototype code)和测试中,panic 比返回 Result 更为合适,下文中会讨论合适的原因,紧接着讨论另外一种特殊情况,即有些场景编译器无法认识这个分支代码是不可能走到的,但是程序员可以判断出来的,这种场景也可以用 panic!。另外章节最后会总结一些在库代码中如何决定是否要 panic 的通用指导原则。

+

示例、代码原型和测试都非常适合 panic

+

当你编写一个示例来展示一些概念时,在拥有健壮的错误处理代码的同时也会使得例子不那么明确。例如,调用一个类似 unwrap 这样可能 panic! 的方法可以被理解为一个你实际希望程序处理错误方式的占位符,它根据其余代码运行方式可能会各不相同。

+

类似地,在我们准备好决定如何处理错误之前,unwrapexpect方法在原型设计时非常方便。当我们准备好让程序更加健壮时,它们会在代码中留下清晰的标记。

+

如果方法调用在测试中失败了,我们希望这个测试都失败,即便这个方法并不是需要测试的功能。因为 panic! 会将测试标记为失败,此时调用 unwrapexpect 是恰当的。

+

当我们比编译器知道更多的情况

+

当你有一些其他的逻辑来确保 Result 会是 Ok 值时,调用 unwrap 或者 expect 也是合适的,虽然编译器无法理解这种逻辑。你仍然需要处理一个 Result 值:即使在你的特定情况下逻辑上是不可能的,你所调用的任何操作仍然有可能失败。如果通过人工检查代码来确保永远也不会出现 Err 值,那么调用 unwrap 也是完全可以接受的,这里是一个例子:

+
fn main() {
+    use std::net::IpAddr;
+
+    let home: IpAddr = "127.0.0.1"
+        .parse()
+        .expect("Hardcoded IP address should be valid");
+}
+

我们通过解析一个硬编码的字符来创建一个 IpAddr 实例。可以看出 127.0.0.1 是一个有效的 IP 地址,所以这里使用 expect 是可以接受的。然而,拥有一个硬编码的有效的字符串也不能改变 parse 方法的返回值类型:它仍然是一个 Result 值,而编译器仍然会要求我们处理这个 Result,好像还是有可能出现 Err 成员那样。这是因为编译器还没有智能到可以识别出这个字符串总是一个有效的 IP 地址。如果 IP 地址字符串来源于用户而不是硬编码进程序中的话,那么就 确实 有失败的可能性,这时就绝对需要我们以一种更健壮的方式处理 Result 了。提及这个 IP 地址是硬编码的假设会促使我们将来把 expect 替换为更好的错误处理,我们应该从其它代码获取 IP 地址。

+

错误处理指导原则

+

在当有可能会导致有害状态的情况下建议使用 panic! —— 在这里,有害状态是指当一些假设、保证、协议或不可变性被打破的状态,例如无效的值、自相矛盾的值或者被传递了不存在的值 —— 外加如下几种情况:

+
    +
  • 有害状态是非预期的行为,与偶尔会发生的行为相对,比如用户输入了错误格式的数据。
  • +
  • 在此之后代码的运行依赖于不处于这种有害状态,而不是在每一步都检查是否有问题。
  • +
  • 没有可行的手段来将有害状态信息编码进所使用的类型中的情况。我们会在第十八章 “将状态和行为编码为类型” 部分通过一个例子来说明我们的意思。
  • +
+

如果别人调用你的代码并传递了一个没有意义的值,尽最大可能返回一个错误,如此库的用户就可以决定在这种情况下该如何处理。然而在继续执行代码是不安全或有害的情况下,最好的选择可能是调用 panic! 并警告库的用户他们的代码中有 bug,这样他们就会在开发时进行修复。类似的,如果你正在调用不受你控制的外部代码,并且它返回了一个你无法修复的无效状态,那么 panic! 往往是合适的。

+

然而当错误预期会出现时,返回 Result 仍要比调用 panic! 更为合适。这样的例子包括解析器接收到格式错误的数据,或者 HTTP 请求返回了一个表明触发了限流的状态。在这些例子中,应该通过返回 Result 来表明失败预期是可能的,这样将有害状态向上传播,调用者就可以决定该如何处理这个问题。使用 panic! 来处理这些情况就不是最好的选择。

+

当你的代码在进行一个使用无效值进行调用时可能将用户置于风险中的操作时,代码应该首先验证值是有效的,并在其无效时 panic!。这主要是出于安全的原因:尝试操作无效数据会暴露代码漏洞,这就是标准库在尝试越界访问数组时会 panic! 的主要原因:尝试访问不属于当前数据结构的内存是一个常见的安全隐患。函数通常都遵循 契约contracts):它们的行为只有在输入满足特定条件时才能得到保证。当违反契约时 panic 是有道理的,因为这通常代表调用方的 bug,而且这也不是那种你希望所调用的代码必须处理的错误。事实上所调用的代码也没有合理的方式来恢复,而是需要调用方的 程序员 修复其代码。函数的契约,尤其是当违反它会造成 panic 的契约,应该在函数的 API 文档中得到解释。

+

虽然在所有函数中都拥有许多错误检查是冗长而烦人的。幸运的是,可以利用 Rust 的类型系统(以及编译器的类型检查)为你进行很多检查。如果函数有一个特定类型的参数,可以在知晓编译器已经确保其拥有一个有效值的前提下进行你的代码逻辑。例如,如果你使用了一个并不是 Option 的类型,则程序期望它是 有值 的并且不是 空值。你的代码无需处理 SomeNone 这两种情况,它只会有一种情况就是绝对会有一个值。尝试向函数传递空值的代码甚至根本不能编译,所以你的函数在运行时没有必要判空。另外一个例子是使用像 u32 这样的无符号整型,也会确保它永远不为负。

+

创建自定义类型进行有效性验证

+

让我们使用 Rust 类型系统的思想来进一步确保值的有效性,并尝试创建一个自定义类型以进行验证。回忆一下第二章的猜猜看游戏,我们的代码要求用户猜测一个 1 到 100 之间的数字,在将其与秘密数字做比较之前我们从未验证用户的猜测是位于这两个数字之间的,我们只验证它是否为正。在这种情况下,其影响并不是很严重:“Too high” 或 “Too low” 的输出仍然是正确的。但是这是一个很好的引导用户得出有效猜测的辅助,例如当用户猜测一个超出范围的数字或者输入字母时采取不同的行为。

+

一种实现方式是将猜测解析成 i32 而不仅仅是 u32,来默许输入负数,接着检查数字是否在范围内:

+

文件名:src/main.rs

+
use rand::Rng;
+use std::cmp::Ordering;
+use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    let secret_number = rand::thread_rng().gen_range(1..=100);
+
+    loop {
+        // --snip--
+
+        println!("Please input your guess.");
+
+        let mut guess = String::new();
+
+        io::stdin()
+            .read_line(&mut guess)
+            .expect("Failed to read line");
+
+        let guess: i32 = match guess.trim().parse() {
+            Ok(num) => num,
+            Err(_) => continue,
+        };
+
+        if guess < 1 || guess > 100 {
+            println!("The secret number will be between 1 and 100.");
+            continue;
+        }
+
+        match guess.cmp(&secret_number) {
+            // --snip--
+            Ordering::Less => println!("Too small!"),
+            Ordering::Greater => println!("Too big!"),
+            Ordering::Equal => {
+                println!("You win!");
+                break;
+            }
+        }
+    }
+}
+

if 表达式检查了值是否超出范围,告诉用户出了什么问题,并调用 continue 开始下一次循环,请求另一个猜测。if 表达式之后,就可以在知道 guess 在 1 到 100 之间的情况下与秘密数字作比较了。

+

然而,这并不是一个理想的解决方案:如果让程序仅仅处理 1 到 100 之间的值是一个绝对需要满足的要求,而且程序中的很多函数都有这样的要求,在每个函数中都有这样的检查将是非常冗余的(并可能潜在的影响性能)。

+

相反我们可以创建一个新类型来将验证放入创建其实例的函数中,而不是到处重复这些检查。这样就可以安全地在函数签名中使用新类型并相信它们接收到的值。示例 9-13 中展示了一个定义 Guess 类型的方法,只有在 new 函数接收到 1 到 100 之间的值时才会创建 Guess 的实例:

+

文件名:src/lib.rs

+
#![allow(unused)]
+fn main() {
+pub struct Guess {
+    value: i32,
+}
+
+impl Guess {
+    pub fn new(value: i32) -> Guess {
+        if value < 1 || value > 100 {
+            panic!("Guess value must be between 1 and 100, got {value}.");
+        }
+
+        Guess { value }
+    }
+
+    pub fn value(&self) -> i32 {
+        self.value
+    }
+}
+}
+

示例 9-13:一个 Guess 类型,它只在值位于 1 和 100 之间时才继续

+

首先,我们定义了一个包含 i32 类型字段 value 的结构体 Guess。这里是储存猜测值的地方。

+

接着在 Guess 上实现了一个叫做 new 的关联函数来创建 Guess 的实例。new 定义为接收一个 i32 类型的参数 value 并返回一个 Guessnew 函数中代码的测试确保了其值是在 1 到 100 之间的。如果 value 没有通过测试则调用 panic!,这会警告调用这个函数的程序员有一个需要修改的 bug,因为创建一个 value 超出范围的 Guess 将会违反 Guess::new 所遵循的契约。Guess::new 会出现 panic 的条件应该在其公有 API 文档中被提及;第十四章会涉及到在 API 文档中表明 panic! 可能性的相关规则。如果 value 通过了测试,我们新建一个 Guess,其字段 value 将被设置为参数 value 的值,接着返回这个 Guess

+

接着,我们实现了一个借用了 self 的方法 value,它没有任何其他参数并返回一个 i32。这类方法有时被称为 getter,因为它的目的就是返回对应字段的数据。这样的公有方法是必要的,因为 Guess 结构体的 value 字段是私有的。私有的字段 value 是很重要的,这样使用 Guess 结构体的代码将不允许直接设置 value 的值:调用者 必须 使用 Guess::new 方法来创建一个 Guess 的实例,这就确保了不会存在一个 value 没有通过 Guess::new 函数的条件检查的 Guess

+

于是,一个接收(或返回)1 到 100 之间数字的函数就可以声明为接收(或返回) Guess的实例,而不是 i32,同时其函数体中也无需进行任何额外的检查。

+

总结

+

Rust 的错误处理功能被设计为帮助你编写更加健壮的代码。panic! 宏代表一个程序无法处理的状态,并停止执行而不是使用无效或不正确的值继续处理。Rust 类型系统的 Result 枚举代表操作可能会在一种可以恢复的情况下失败。可以使用 Result 来告诉代码调用者他需要处理潜在的成功或失败。在适当的场景使用 panic!Result 将会使你的代码在面对不可避免的错误时显得更加可靠。

+

现在我们已经见识过了标准库中 OptionResult 泛型枚举的能力了,在下一章让我们聊聊泛型是如何工作的,以及如何在你的代码中使用它们。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch10-00-generics.html b/ch10-00-generics.html new file mode 100644 index 000000000..90e4fa2ab --- /dev/null +++ b/ch10-00-generics.html @@ -0,0 +1,336 @@ + + + + + + 泛型、Trait 和生命周期 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

泛型、Trait 和生命周期

+
+

ch10-00-generics.md +
+commit 4aa96a3d20570f868bd20e8e3e865b047284be30

+
+

每一个编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是 泛型generics)。泛型是具体类型或其他属性的抽象替代。我们可以表达泛型的属性,比如它们的行为或如何与其他泛型相关联,而不需要在编写和编译代码时知道它们在这里实际上代表什么。

+

函数可以获取一些不同于 i32String 这样具体类型的泛型参数,就像一个获取未知类型值的函数可以对多种具体类型的值运行同一段代码一样。事实上我们已经使用过第六章的 Option<T>,第八章的 Vec<T>HashMap<K, V>,以及第九章的 Result<T, E> 这些泛型了。本章会探索如何使用泛型定义我们自己的类型、函数和方法!

+

首先,我们将回顾一下提取函数以减少代码重复的机制。接下来,我们将使用相同的技术,从两个仅参数类型不同的函数中创建一个泛型函数。我们也会讲到结构体和枚举定义中的泛型。

+

之后,我们讨论 trait,这是一个定义泛型行为的方法。trait 可以与泛型结合来将泛型限制为只接受拥有特定行为的类型,而不是任意类型。

+

最后介绍 生命周期lifetimes),它是一类允许我们向编译器提供引用如何相互关联的泛型。Rust 的生命周期功能允许在很多场景下借用值的同时仍然使编译器能够检查这些引用的有效性。

+

提取函数来减少重复

+

泛型允许我们使用一个可以代表多种类型的占位符来替换特定类型,以此来减少代码冗余。在深入了解泛型的语法之前,我们首先来看一种没有使用泛型的减少冗余的方法,即提取一个函数。在这个函数中,我们用一个可以代表多种值的占位符来替换具体的值。接着我们使用相同的技术来提取一个泛型函数!!通过学习如何识别并提取可以整合进一个函数的重复代码,你也会开始识别出可以使用泛型的重复代码。

+

让我们从下面这个寻找列表中最大值的小程序开始,如示例 10-1 所示:

+

文件名:src/main.rs

+
fn main() {
+    let number_list = vec![34, 50, 25, 100, 65];
+
+    let mut largest = &number_list[0];
+
+    for number in &number_list {
+        if number > largest {
+            largest = number;
+        }
+    }
+
+    println!("The largest number is {largest}");
+    assert_eq!(*largest, 100);
+}
+

示例 10-1:在一个数字列表中寻找最大值的函数

+

这段代码获取一个整型列表,存放在变量 number_list 中。它将列表的第一个数字的引用放入了变量 largest 中。接着遍历了列表中的所有数字,如果当前值大于 largest 中储存的值,将 largest 替换为这个值。如果当前值小于或者等于目前为止的最大值,largest 保持不变。当列表中所有值都被考虑到之后,largest 将会指向最大值,在这里也就是 100。

+

我们的任务是在两个不同的数字列表中寻找最大值。为此我们可以选择重复示例 10-1 中的代码在程序的两个不同位置使用相同的逻辑,如示例 10-2 所示:

+

文件名:src/main.rs

+
fn main() {
+    let number_list = vec![34, 50, 25, 100, 65];
+
+    let mut largest = &number_list[0];
+
+    for number in &number_list {
+        if number > largest {
+            largest = number;
+        }
+    }
+
+    println!("The largest number is {largest}");
+
+    let number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8];
+
+    let mut largest = &number_list[0];
+
+    for number in &number_list {
+        if number > largest {
+            largest = number;
+        }
+    }
+
+    println!("The largest number is {largest}");
+}
+

示例 10-2:寻找 两个 数字列表最大值的代码

+

虽然代码能够执行,但是重复的代码是冗余且容易出错的,更新逻辑时我们不得不记住需要修改多处地方的代码。

+

为了消除重复,我们要创建一层抽象,定义一个处理任意整型列表作为参数的函数。这个方案使得代码更简洁,并且表现了寻找任意列表中最大值这一概念。

+

在示例 10-3 的程序中将寻找最大值的代码提取到了一个叫做 largest 的函数中。接着我们调用该函数来寻找示例 10-2 中两个列表中的最大值。之后也可以将该函数用于任何可能的 i32 值的列表。

+

文件名:src/main.rs

+
fn largest(list: &[i32]) -> &i32 {
+    let mut largest = &list[0];
+
+    for item in list {
+        if item > largest {
+            largest = item;
+        }
+    }
+
+    largest
+}
+
+fn main() {
+    let number_list = vec![34, 50, 25, 100, 65];
+
+    let result = largest(&number_list);
+    println!("The largest number is {result}");
+    assert_eq!(*result, 100);
+
+    let number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8];
+
+    let result = largest(&number_list);
+    println!("The largest number is {result}");
+    assert_eq!(*result, 6000);
+}
+

示例 10-3:抽象后的寻找两个数字列表最大值的代码

+

largest 函数有一个参数 list,它代表会传递给函数的任何具体的 i32值的 slice。函数定义中的 list 代表任何 &[i32]。当调用 largest 函数时,其代码实际上运行于我们传递的特定值上。

+

总的来说,从示例 10-2 到示例 10-3 中涉及的机制经历了如下几步:

+
    +
  1. 找出重复代码。
  2. +
  3. 将重复代码提取到了一个函数中,并在函数签名中指定了代码中的输入和返回值。
  4. +
  5. 将重复代码的两个实例,改为调用函数。
  6. +
+

接下来我们会使用相同的步骤通过泛型来减少重复。与函数体可以处理任意的 list 而不是具体的值一样,泛型也允许代码处理任意类型。

+

如果我们有两个函数,一个寻找一个 i32 值的 slice 中的最大项而另一个寻找 char 值的 slice 中的最大项该怎么办?该如何消除重复呢?让我们拭目以待!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch10-01-syntax.html b/ch10-01-syntax.html new file mode 100644 index 000000000..2a2221759 --- /dev/null +++ b/ch10-01-syntax.html @@ -0,0 +1,512 @@ + + + + + + 泛型数据类型 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

泛型数据类型

+
+

ch10-01-syntax.md +
+commit f2a78f64b668f63f581203c6bac509903f7c00ee

+
+

我们可以使用泛型为像函数签名或结构体这样的项创建定义,这样它们就可以用于多种不同的具体数据类型。让我们看看如何使用泛型定义函数、结构体、枚举和方法,然后我们将讨论泛型如何影响代码性能。

+

在函数定义中使用泛型

+

当使用泛型定义函数时,本来在函数签名中指定参数和返回值的类型的地方,会改用泛型来表示。采用这种技术,使得代码适应性更强,从而为函数的调用者提供更多的功能,同时也避免了代码的重复。

+

回到 largest 函数,示例 10-4 中展示了两个函数,它们的功能都是寻找 slice 中最大值。接着我们使用泛型将其合并为一个函数。

+

文件名:src/main.rs

+
fn largest_i32(list: &[i32]) -> &i32 {
+    let mut largest = &list[0];
+
+    for item in list {
+        if item > largest {
+            largest = item;
+        }
+    }
+
+    largest
+}
+
+fn largest_char(list: &[char]) -> &char {
+    let mut largest = &list[0];
+
+    for item in list {
+        if item > largest {
+            largest = item;
+        }
+    }
+
+    largest
+}
+
+fn main() {
+    let number_list = vec![34, 50, 25, 100, 65];
+
+    let result = largest_i32(&number_list);
+    println!("The largest number is {result}");
+    assert_eq!(*result, 100);
+
+    let char_list = vec!['y', 'm', 'a', 'q'];
+
+    let result = largest_char(&char_list);
+    println!("The largest char is {result}");
+    assert_eq!(*result, 'y');
+}
+

示例 10-4:两个函数,不同点只是名称和签名类型

+

largest_i32 函数是从示例 10-3 中摘出来的,它用来寻找 slice 中最大的 i32largest_char 函数寻找 slice 中最大的 char。因为两者函数体的代码是一样的,我们可以定义一个函数,再引进泛型参数来消除这种重复。

+

为了参数化这个新函数中的这些类型,我们需要为类型参数命名,道理和给函数的形参起名一样。任何标识符都可以作为类型参数的名字。这里选用 T,因为传统上来说,Rust 的类型参数名字都比较短,通常仅为一个字母,同时,Rust 类型名的命名规范是首字母大写驼峰式命名法(UpperCamelCase)。T 作为 “type” 的缩写是大部分 Rust 程序员的首选。

+

如果要在函数体中使用参数,就必须在函数签名中声明它的名字,好让编译器知道这个名字指代的是什么。同理,当在函数签名中使用一个类型参数时,必须在使用它之前就声明它。为了定义泛型版本的 largest 函数,类型参数声明位于函数名称与参数列表中间的尖括号 <> 中,像这样:

+
fn largest<T>(list: &[T]) -> &T {
+

可以这样理解这个定义:函数 largest 有泛型类型 T。它有个参数 list,其类型是元素为 T 的 slice。largest 函数会返回一个与 T 相同类型的引用。

+

示例 10-5 中的 largest 函数在它的签名中使用了泛型,统一了两个实现。该示例也展示了如何调用 largest 函数,把 i32 值的 slice 或 char 值的 slice 传给它。请注意这些代码还不能编译,不过稍后在本章会解决这个问题。

+

文件名:src/main.rs

+
fn largest<T>(list: &[T]) -> &T {
+    let mut largest = &list[0];
+
+    for item in list {
+        if item > largest {
+            largest = item;
+        }
+    }
+
+    largest
+}
+
+fn main() {
+    let number_list = vec![34, 50, 25, 100, 65];
+
+    let result = largest(&number_list);
+    println!("The largest number is {result}");
+
+    let char_list = vec!['y', 'm', 'a', 'q'];
+
+    let result = largest(&char_list);
+    println!("The largest char is {result}");
+}
+

示例 10-5:一个使用泛型参数的 largest 函数定义,尚不能编译

+

如果现在就编译这个代码,会出现如下错误:

+
$ cargo run
+   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
+error[E0369]: binary operation `>` cannot be applied to type `&T`
+ --> src/main.rs:5:17
+  |
+5 |         if item > largest {
+  |            ---- ^ ------- &T
+  |            |
+  |            &T
+  |
+help: consider restricting type parameter `T`
+  |
+1 | fn largest<T: std::cmp::PartialOrd>(list: &[T]) -> &T {
+  |             ++++++++++++++++++++++
+
+For more information about this error, try `rustc --explain E0369`.
+error: could not compile `chapter10` (bin "chapter10") due to 1 previous error
+
+

帮助说明中提到了 std::cmp::PartialOrd,这是一个 trait。下一部分会讲到 trait。不过简单来说,这个错误表明 largest 的函数体不能适用于 T 的所有可能的类型。因为在函数体需要比较 T 类型的值,不过它只能用于我们知道如何排序的类型。为了开启比较功能,标准库中定义的 std::cmp::PartialOrd trait 可以实现类型的比较功能(查看附录 C 获取该 trait 的更多信息)。依照帮助说明中的建议,我们限制 T 只对实现了 PartialOrd 的类型有效后代码就可以编译了,因为标准库为 i32char 实现了 PartialOrd

+

结构体定义中的泛型

+

同样也可以用 <> 语法来定义结构体,它包含一个或多个泛型参数类型字段。示例 10-6 定义了一个可以存放任何类型的 xy 坐标值的结构体 Point

+

文件名:src/main.rs

+
struct Point<T> {
+    x: T,
+    y: T,
+}
+
+fn main() {
+    let integer = Point { x: 5, y: 10 };
+    let float = Point { x: 1.0, y: 4.0 };
+}
+

示例 10-6:Point 结构体存放了两个 T 类型的值 xy

+

其语法类似于函数定义中使用泛型。首先,必须在结构体名称后面的尖括号中声明泛型参数的名称。接着在结构体定义中可以指定具体数据类型的位置使用泛型类型。

+

注意 Point<T> 的定义中只使用了一个泛型类型,这个定义表明结构体 Point<T> 对于一些类型 T 是泛型的,而且字段 xy 都是 相同类型的,无论它具体是何类型。如果尝试创建一个有不同类型值的 Point<T> 的实例,像示例 10-7 中的代码就不能编译:

+

文件名:src/main.rs

+
struct Point<T> {
+    x: T,
+    y: T,
+}
+
+fn main() {
+    let wont_work = Point { x: 5, y: 4.0 };
+}
+

示例 10-7:字段 xy 的类型必须相同,因为它们都有相同的泛型类型 T

+

在这个例子中,当把整型值 5 赋值给 x 时,就告诉了编译器这个 Point<T> 实例中的泛型 T 全是整型。接着指定 y 为浮点值 4.0,因为它y被定义为与 x 相同类型,所以将会得到一个像这样的类型不匹配错误:

+
$ cargo run
+   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
+error[E0308]: mismatched types
+ --> src/main.rs:7:38
+  |
+7 |     let wont_work = Point { x: 5, y: 4.0 };
+  |                                      ^^^ expected integer, found floating-point number
+
+For more information about this error, try `rustc --explain E0308`.
+error: could not compile `chapter10` (bin "chapter10") due to 1 previous error
+
+

如果想要定义一个 xy 可以有不同类型且仍然是泛型的 Point 结构体,我们可以使用多个泛型类型参数。在示例 10-8 中,我们修改 Point 的定义为拥有两个泛型类型 TU。其中字段 xT 类型的,而字段 yU 类型的:

+

文件名:src/main.rs

+
struct Point<T, U> {
+    x: T,
+    y: U,
+}
+
+fn main() {
+    let both_integer = Point { x: 5, y: 10 };
+    let both_float = Point { x: 1.0, y: 4.0 };
+    let integer_and_float = Point { x: 5, y: 4.0 };
+}
+

示例 10-8:使用两个泛型的 Point,这样 xy 可能是不同类型

+

现在所有这些 Point 实例都合法了!你可以在定义中使用任意多的泛型类型参数,不过太多的话,代码将难以阅读和理解。当你发现代码中需要很多泛型时,这可能表明你的代码需要重构分解成更小的结构。

+

枚举定义中的泛型

+

和结构体类似,枚举也可以在成员中存放泛型数据类型。第六章我们曾用过标准库提供的 Option<T> 枚举,这里再回顾一下:

+
#![allow(unused)]
+fn main() {
+enum Option<T> {
+    Some(T),
+    None,
+}
+}
+

现在这个定义应该更容易理解了。如你所见 Option<T> 是一个拥有泛型 T 的枚举,它有两个成员:Some,它存放了一个类型 T 的值,和不存在任何值的None。通过 Option<T> 枚举可以表达有一个可能的值的抽象概念,同时因为 Option<T> 是泛型的,无论这个可能的值是什么类型都可以使用这个抽象。

+

枚举也可以拥有多个泛型类型。第九章使用过的 Result 枚举定义就是一个这样的例子:

+
#![allow(unused)]
+fn main() {
+enum Result<T, E> {
+    Ok(T),
+    Err(E),
+}
+}
+

Result 枚举有两个泛型类型,TEResult 有两个成员:Ok,它存放一个类型 T 的值,而 Err 则存放一个类型 E 的值。这个定义使得 Result 枚举能很方便的表达任何可能成功(返回 T 类型的值)也可能失败(返回 E 类型的值)的操作。实际上,这就是我们在示例 9-3 用来打开文件的方式:当成功打开文件的时候,T 对应的是 std::fs::File 类型;而当打开文件出现问题时,E 的值则是 std::io::Error 类型。

+

当你意识到代码中定义了多个结构体或枚举,它们不一样的地方只是其中的值的类型的时候,不妨通过泛型类型来避免重复。

+

方法定义中的泛型

+

在为结构体和枚举实现方法时(像第五章那样),一样也可以用泛型。示例 10-9 中展示了示例 10-6 中定义的结构体 Point<T>,和在其上实现的名为 x 的方法。

+

文件名:src/main.rs

+
struct Point<T> {
+    x: T,
+    y: T,
+}
+
+impl<T> Point<T> {
+    fn x(&self) -> &T {
+        &self.x
+    }
+}
+
+fn main() {
+    let p = Point { x: 5, y: 10 };
+
+    println!("p.x = {}", p.x());
+}
+

示例 10-9:在 Point<T> 结构体上实现方法 x,它返回 T 类型的字段 x 的引用

+

这里在 Point<T> 上定义了一个叫做 x 的方法来返回字段 x 中数据的引用:

+

注意必须在 impl 后面声明 T,这样就可以在 Point<T> 上实现的方法中使用 T 了。通过在 impl 之后声明泛型 T,Rust 就知道 Point 的尖括号中的类型是泛型而不是具体类型。我们可以为泛型参数选择一个与结构体定义中声明的泛型参数所不同的名称,不过依照惯例使用了相同的名称。在声明泛型类型参数的 impl 中编写的方法将会定义在该类型的任何实例上,无论最终替换泛型类型参数的是何具体类型。(译者注:以示例 10-9 为例,impl 中声明了泛型类型参数 Tx 是编写在 impl 中的方法,x 方法将会定义在 Point<T> 的任何实例上,无论最终替换泛型类型参数 T 的是何具体类型)。

+

定义方法时也可以为泛型指定限制(constraint)。例如,可以选择为 Point<f32> 实例实现方法,而不是为泛型 Point 实例。示例 10-10 展示了一个没有在 impl 之后(的尖括号)声明泛型的例子,这里使用了一个具体类型,f32

+

文件名:src/main.rs

+
struct Point<T> {
+    x: T,
+    y: T,
+}
+
+impl<T> Point<T> {
+    fn x(&self) -> &T {
+        &self.x
+    }
+}
+
+impl Point<f32> {
+    fn distance_from_origin(&self) -> f32 {
+        (self.x.powi(2) + self.y.powi(2)).sqrt()
+    }
+}
+
+fn main() {
+    let p = Point { x: 5, y: 10 };
+
+    println!("p.x = {}", p.x());
+}
+

示例 10-10:构建一个只用于拥有泛型参数 T 的结构体的具体类型的 impl

+

这段代码意味着 Point<f32> 类型会有一个方法 distance_from_origin,而其他 T 不是 f32 类型的 Point<T> 实例则没有定义此方法。这个方法计算点实例与坐标 (0.0, 0.0) 之间的距离,并使用了只能用于浮点型的数学运算符。

+

结构体定义中的泛型类型参数并不总是与结构体方法签名中使用的泛型是同一类型。示例 10-11 中为 Point 结构体使用了泛型类型 X1Y1,为 mixup 方法签名使用了 X2Y2 来使得示例更加清楚。这个方法用 selfPoint 类型的 x 值(类型 X1)和参数的 Point 类型的 y 值(类型 Y2)来创建一个新 Point 类型的实例:

+

文件名:src/main.rs

+
struct Point<X1, Y1> {
+    x: X1,
+    y: Y1,
+}
+
+impl<X1, Y1> Point<X1, Y1> {
+    fn mixup<X2, Y2>(self, other: Point<X2, Y2>) -> Point<X1, Y2> {
+        Point {
+            x: self.x,
+            y: other.y,
+        }
+    }
+}
+
+fn main() {
+    let p1 = Point { x: 5, y: 10.4 };
+    let p2 = Point { x: "Hello", y: 'c' };
+
+    let p3 = p1.mixup(p2);
+
+    println!("p3.x = {}, p3.y = {}", p3.x, p3.y);
+}
+

示例 10-11:方法使用了与结构体定义中不同类型的泛型

+

main 函数中,定义了一个有 i32 类型的 x(其值为 5)和 f64y(其值为 10.4)的 Pointp2 则是一个有着字符串 slice 类型的 x(其值为 "Hello")和 char 类型的 y(其值为c)的 Point。在 p1 上以 p2 作为参数调用 mixup 会返回一个 p3,它会有一个 i32 类型的 x,因为 x 来自 p1,并拥有一个 char 类型的 y,因为 y 来自 p2println! 会打印出 p3.x = 5, p3.y = c

+

这个例子的目的是展示一些泛型通过 impl 声明而另一些通过方法定义声明的情况。这里泛型参数 X1Y1 声明于 impl 之后,因为它们与结构体定义相对应。而泛型参数 X2Y2 声明于 fn mixup 之后,因为它们只是相对于方法本身的。

+

泛型代码的性能

+

在阅读本部分内容的同时,你可能会好奇使用泛型类型参数是否会有运行时消耗。好消息是泛型并不会使程序比具体类型运行得慢。

+

Rust 通过在编译时进行泛型代码的 单态化monomorphization)来保证效率。单态化是一个通过填充编译时使用的具体类型,将通用代码转换为特定代码的过程。

+

在这个过程中,编译器所做的工作正好与示例 10-5 中我们创建泛型函数的步骤相反。编译器寻找所有泛型代码被调用的位置并使用泛型代码针对具体类型生成代码。

+

让我们看看这如何用于标准库中的 Option 枚举:

+
#![allow(unused)]
+fn main() {
+let integer = Some(5);
+let float = Some(5.0);
+}
+

当 Rust 编译这些代码的时候,它会进行单态化。编译器会读取传递给 Option<T> 的值并发现有两种 Option<T>:一个对应 i32 另一个对应 f64。为此,它会将泛型定义 Option<T> 展开为两个针对 i32f64 的定义,接着将泛型定义替换为这两个具体的定义。

+

编译器生成的单态化版本的代码看起来像这样(编译器会使用不同于如下假想的名字):

+

文件名:src/main.rs

+
enum Option_i32 {
+    Some(i32),
+    None,
+}
+
+enum Option_f64 {
+    Some(f64),
+    None,
+}
+
+fn main() {
+    let integer = Option_i32::Some(5);
+    let float = Option_f64::Some(5.0);
+}
+

泛型 Option<T> 被编译器替换为了具体的定义。因为 Rust 会将每种情况下的泛型代码编译为具体类型,使用泛型没有运行时开销。当代码运行时,它的执行效率就跟好像手写每个具体定义的重复代码一样。这个单态化过程正是 Rust 泛型在运行时极其高效的原因。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch10-02-traits.html b/ch10-02-traits.html new file mode 100644 index 000000000..44e023064 --- /dev/null +++ b/ch10-02-traits.html @@ -0,0 +1,623 @@ + + + + + + Trait:定义共同行为 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Trait:定义共同行为

+
+

ch10-02-traits.md +
+commit 92bfbfacf88ee9a814cea0a58e9c019c529ef4ae

+
+

trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 trait 以一种抽象的方式定义共同行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。

+
+

注意:trait 类似于其他语言中的常被称为 接口interfaces)的功能,虽然有一些不同。

+
+

定义 trait

+

一个类型的行为由其可供调用的方法构成。如果可以对不同类型调用相同的方法的话,这些类型就可以共享相同的行为了。trait 定义是一种将方法签名组合起来的方法,目的是定义一个实现某些目的所必需的行为的集合。

+

例如,这里有多个存放了不同类型和属性文本的结构体:结构体 NewsArticle 用于存放发生于世界各地的新闻故事,而结构体 Tweet 最多只能存放 280 个字符的内容,以及像是否转推或是否是对推友的回复这样的元数据。

+

我们想要创建一个名为 aggregator 的多媒体聚合库用来显示可能储存在 NewsArticleTweet 实例中的数据摘要。为了实现功能,每个结构体都要能够获取摘要,这样的话就可以调用实例的 summarize 方法来请求摘要。示例 10-12 中展示了一个表现这个概念的公有 Summary trait 的定义:

+

文件名:src/lib.rs

+
pub trait Summary {
+    fn summarize(&self) -> String;
+}
+

示例 10-12:Summary trait 定义,它包含由 summarize 方法提供的行为

+

这里使用 trait 关键字来声明一个 trait,后面是 trait 的名字,在这个例子中是 Summary。我们也声明 traitpub 以便依赖这个 crate 的 crate 也可以使用这个 trait,正如我们见过的一些示例一样。在大括号中声明描述实现这个 trait 的类型所需要的行为的方法签名,在这个例子中是 fn summarize(&self) -> String

+

在方法签名后跟分号,而不是在大括号中提供其实现。接着每一个实现这个 trait 的类型都需要提供其自定义行为的方法体,编译器也会确保任何实现 Summary trait 的类型都拥有与这个签名的定义完全一致的 summarize 方法。

+

trait 体中可以有多个方法:一行一个方法签名且都以分号结尾。

+

为类型实现 trait

+

现在我们定义了 Summary trait 的签名,接着就可以在多媒体聚合库中实现这个类型了。示例 10-13 中展示了 NewsArticle 结构体上 Summary trait 的一个实现,它使用标题、作者和创建的位置作为 summarize 的返回值。对于 Tweet 结构体,我们选择将 summarize 定义为用户名后跟推文的全部文本作为返回值,并假设推文内容已经被限制为 280 字符以内。

+

文件名:src/lib.rs

+
pub trait Summary {
+    fn summarize(&self) -> String;
+}
+
+pub struct NewsArticle {
+    pub headline: String,
+    pub location: String,
+    pub author: String,
+    pub content: String,
+}
+
+impl Summary for NewsArticle {
+    fn summarize(&self) -> String {
+        format!("{}, by {} ({})", self.headline, self.author, self.location)
+    }
+}
+
+pub struct Tweet {
+    pub username: String,
+    pub content: String,
+    pub reply: bool,
+    pub retweet: bool,
+}
+
+impl Summary for Tweet {
+    fn summarize(&self) -> String {
+        format!("{}: {}", self.username, self.content)
+    }
+}
+

示例 10-13:在 NewsArticleTweet 类型上实现 Summary trait

+

在类型上实现 trait 类似于实现常规方法。区别在于 impl 关键字之后,我们提供需要实现 trait 的名称,接着是 for 和需要实现 trait 的类型的名称。在 impl 块中,使用 trait 定义中的方法签名,不过不再后跟分号,而是需要在大括号中编写函数体来为特定类型实现 trait 方法所拥有的行为。

+

现在库在 NewsArticleTweet 上实现了Summary trait,crate 的用户可以像调用常规方法一样调用 NewsArticleTweet 实例的 trait 方法了。唯一的区别是 trait 必须和类型一起引入作用域以便使用额外的 trait 方法。这是一个二进制 crate 如何利用 aggregator 库 crate 的例子:

+
use aggregator::{Summary, Tweet};
+
+fn main() {
+    let tweet = Tweet {
+        username: String::from("horse_ebooks"),
+        content: String::from(
+            "of course, as you probably already know, people",
+        ),
+        reply: false,
+        retweet: false,
+    };
+
+    println!("1 new tweet: {}", tweet.summarize());
+}
+

这会打印出 1 new tweet: horse_ebooks: of course, as you probably already know, people

+

其他依赖 aggregator crate 的 crate 也可以将 Summary 引入作用域以便为其自己的类型实现该 trait。需要注意的限制是,只有在 trait 或类型至少有一个属于当前 crate 时,我们才能对类型实现该 trait。例如,可以为 aggregator crate 的自定义类型 Tweet 实现如标准库中的 Display trait,这是因为 Tweet 类型位于 aggregator crate 本地的作用域中。类似地,也可以在 aggregator crate 中为 Vec<T> 实现 Summary,这是因为 Summary trait 位于 aggregator crate 本地作用域中。

+

但是不能为外部类型实现外部 trait。例如,不能在 aggregator crate 中为 Vec<T> 实现 Display trait。这是因为 DisplayVec<T> 都定义于标准库中,它们并不位于 aggregator crate 本地作用域中。这个限制是被称为 相干性coherence)的程序属性的一部分,或者更具体的说是 孤儿规则orphan rule),其得名于不存在父类型。这条规则确保了其他人编写的代码不会破坏你代码,反之亦然。没有这条规则的话,两个 crate 可以分别对相同类型实现相同的 trait,而 Rust 将无从得知应该使用哪一个实现。

+

默认实现

+

有时为 trait 中的某些或全部方法提供默认的行为,而不是在每个类型的每个实现中都定义自己的行为是很有用的。这样当为某个特定类型实现 trait 时,可以选择保留或重载每个方法的默认行为。

+

示例 10-14 中我们为 Summary trait 的 summarize 方法指定一个默认的字符串值,而不是像示例 10-12 中那样只是定义方法签名:

+

文件名:src/lib.rs

+
pub trait Summary {
+    fn summarize(&self) -> String {
+        String::from("(Read more...)")
+    }
+}
+
+pub struct NewsArticle {
+    pub headline: String,
+    pub location: String,
+    pub author: String,
+    pub content: String,
+}
+
+impl Summary for NewsArticle {}
+
+pub struct Tweet {
+    pub username: String,
+    pub content: String,
+    pub reply: bool,
+    pub retweet: bool,
+}
+
+impl Summary for Tweet {
+    fn summarize(&self) -> String {
+        format!("{}: {}", self.username, self.content)
+    }
+}
+

示例 10-14:Summary trait 的定义,带有一个 summarize 方法的默认实现

+

如果想要对 NewsArticle 实例使用这个默认实现,可以通过 impl Summary for NewsArticle {} 指定一个空的 impl 块。

+

虽然我们不再直接为 NewsArticle 定义 summarize 方法了,但是我们提供了一个默认实现并且指定 NewsArticle 实现 Summary trait。因此,我们仍然可以对 NewsArticle 实例调用 summarize 方法,如下所示:

+
use aggregator::{self, NewsArticle, Summary};
+
+fn main() {
+    let article = NewsArticle {
+        headline: String::from("Penguins win the Stanley Cup Championship!"),
+        location: String::from("Pittsburgh, PA, USA"),
+        author: String::from("Iceburgh"),
+        content: String::from(
+            "The Pittsburgh Penguins once again are the best \
+             hockey team in the NHL.",
+        ),
+    };
+
+    println!("New article available! {}", article.summarize());
+}
+

这段代码会打印 New article available! (Read more...)

+

summarize 创建默认实现并不要求对示例 10-13 中 Tweet 上的 Summary 实现做任何改变。其原因是重载一个默认实现的语法与实现没有默认实现的 trait 方法的语法一样。

+

默认实现允许调用相同 trait 中的其他方法,哪怕这些方法没有默认实现。如此,trait 可以提供很多有用的功能而只需要实现指定一小部分内容。例如,我们可以定义 Summary trait,使其具有一个需要实现的 summarize_author 方法,然后定义一个 summarize 方法,此方法的默认实现调用 summarize_author 方法:

+
pub trait Summary {
+    fn summarize_author(&self) -> String;
+
+    fn summarize(&self) -> String {
+        format!("(Read more from {}...)", self.summarize_author())
+    }
+}
+
+pub struct Tweet {
+    pub username: String,
+    pub content: String,
+    pub reply: bool,
+    pub retweet: bool,
+}
+
+impl Summary for Tweet {
+    fn summarize_author(&self) -> String {
+        format!("@{}", self.username)
+    }
+}
+

为了使用这个版本的 Summary,只需在实现 trait 时定义 summarize_author 即可:

+
pub trait Summary {
+    fn summarize_author(&self) -> String;
+
+    fn summarize(&self) -> String {
+        format!("(Read more from {}...)", self.summarize_author())
+    }
+}
+
+pub struct Tweet {
+    pub username: String,
+    pub content: String,
+    pub reply: bool,
+    pub retweet: bool,
+}
+
+impl Summary for Tweet {
+    fn summarize_author(&self) -> String {
+        format!("@{}", self.username)
+    }
+}
+

一旦定义了 summarize_author,我们就可以对 Tweet 结构体的实例调用 summarize 了,而 summarize 的默认实现会调用我们提供的 summarize_author 定义。因为实现了 summarize_authorSummary trait 就提供了 summarize 方法的功能,且无需编写更多的代码。

+
use aggregator::{self, Summary, Tweet};
+
+fn main() {
+    let tweet = Tweet {
+        username: String::from("horse_ebooks"),
+        content: String::from(
+            "of course, as you probably already know, people",
+        ),
+        reply: false,
+        retweet: false,
+    };
+
+    println!("1 new tweet: {}", tweet.summarize());
+}
+

这会打印出 1 new tweet: (Read more from @horse_ebooks...)

+

注意无法从相同方法的重载实现中调用默认方法。

+

trait 作为参数

+

知道了如何定义 trait 和在类型上实现这些 trait 之后,我们可以探索一下如何使用 trait 来接受多种不同类型的参数。示例 10-13 中为 NewsArticleTweet 类型实现了 Summary trait,用其来定义了一个函数 notify 来调用其参数 item 上的 summarize 方法,该参数是实现了 Summary trait 的某种类型。为此可以使用 impl Trait 语法,像这样:

+
pub trait Summary {
+    fn summarize(&self) -> String;
+}
+
+pub struct NewsArticle {
+    pub headline: String,
+    pub location: String,
+    pub author: String,
+    pub content: String,
+}
+
+impl Summary for NewsArticle {
+    fn summarize(&self) -> String {
+        format!("{}, by {} ({})", self.headline, self.author, self.location)
+    }
+}
+
+pub struct Tweet {
+    pub username: String,
+    pub content: String,
+    pub reply: bool,
+    pub retweet: bool,
+}
+
+impl Summary for Tweet {
+    fn summarize(&self) -> String {
+        format!("{}: {}", self.username, self.content)
+    }
+}
+
+pub fn notify(item: &impl Summary) {
+    println!("Breaking news! {}", item.summarize());
+}
+

对于 item 参数,我们指定了 impl 关键字和 trait 名称,而不是具体的类型。该参数支持任何实现了指定 trait 的类型。在 notify 函数体中,可以调用任何来自 Summary trait 的方法,比如 summarize。我们可以传递任何 NewsArticleTweet 的实例来调用 notify。任何用其它如 Stringi32 的类型调用该函数的代码都不能编译,因为它们没有实现 Summary

+

Trait Bound 语法

+

impl Trait 语法更直观,但它实际上是更长形式的 trait bound 语法的语法糖。它看起来像:

+
pub fn notify<T: Summary>(item: &T) {
+    println!("Breaking news! {}", item.summarize());
+}
+

这与之前的例子相同,不过稍微冗长了一些。trait bound 与泛型参数声明在一起,位于尖括号中的冒号后面。

+

impl Trait 很方便,适用于短小的例子。更长的 trait bound 则适用于更复杂的场景。例如,可以获取两个实现了 Summary 的参数。使用 impl Trait 的语法看起来像这样:

+
pub fn notify(item1: &impl Summary, item2: &impl Summary) {
+

这适用于 item1item2 允许是不同类型的情况(只要它们都实现了 Summary)。不过如果你希望强制它们都是相同类型呢?这只有在使用 trait bound 时才有可能:

+
pub fn notify<T: Summary>(item1: &T, item2: &T) {
+

泛型 T 被指定为 item1item2 的参数限制,如此传递给参数 item1item2 值的具体类型必须一致。

+

通过 + 指定多个 trait bound

+

如果 notify 需要显示 item 的格式化形式,同时也要使用 summarize 方法,那么 item 就需要同时实现两个不同的 trait:DisplaySummary。这可以通过 + 语法实现:

+
pub fn notify(item: &(impl Summary + Display)) {
+

+ 语法也适用于泛型的 trait bound:

+
pub fn notify<T: Summary + Display>(item: &T) {
+

通过指定这两个 trait bound,notify 的函数体可以调用 summarize 并使用 {} 来格式化 item

+

通过 where 简化 trait bound

+

然而,使用过多的 trait bound 也有缺点。每个泛型有其自己的 trait bound,所以有多个泛型参数的函数在名称和参数列表之间会有很长的 trait bound 信息,这使得函数签名难以阅读。为此,Rust 有另一个在函数签名之后的 where 从句中指定 trait bound 的语法。所以除了这么写:

+
fn some_function<T: Display + Clone, U: Clone + Debug>(t: &T, u: &U) -> i32 {
+

还可以像这样使用 where 从句:

+
fn some_function<T, U>(t: &T, u: &U) -> i32
+where
+    T: Display + Clone,
+    U: Clone + Debug,
+{
+    unimplemented!()
+}
+

这个函数签名就显得不那么杂乱,函数名、参数列表和返回值类型都离得很近,看起来跟没有那么多 trait bounds 的函数很像。

+

返回实现了 trait 的类型

+

也可以在返回值中使用 impl Trait 语法,来返回实现了某个 trait 的类型:

+
pub trait Summary {
+    fn summarize(&self) -> String;
+}
+
+pub struct NewsArticle {
+    pub headline: String,
+    pub location: String,
+    pub author: String,
+    pub content: String,
+}
+
+impl Summary for NewsArticle {
+    fn summarize(&self) -> String {
+        format!("{}, by {} ({})", self.headline, self.author, self.location)
+    }
+}
+
+pub struct Tweet {
+    pub username: String,
+    pub content: String,
+    pub reply: bool,
+    pub retweet: bool,
+}
+
+impl Summary for Tweet {
+    fn summarize(&self) -> String {
+        format!("{}: {}", self.username, self.content)
+    }
+}
+
+fn returns_summarizable() -> impl Summary {
+    Tweet {
+        username: String::from("horse_ebooks"),
+        content: String::from(
+            "of course, as you probably already know, people",
+        ),
+        reply: false,
+        retweet: false,
+    }
+}
+

通过使用 impl Summary 作为返回值类型,我们指定了 returns_summarizable 函数返回某个实现了 Summary trait 的类型,但是不确定其具体的类型。在这个例子中 returns_summarizable 返回了一个 Tweet,不过调用方并不知情。

+

返回一个只是指定了需要实现的 trait 的类型的能力在闭包和迭代器场景十分的有用,第十三章会介绍它们。闭包和迭代器创建只有编译器知道的类型,或者是非常非常长的类型。impl Trait 允许你简单的指定函数返回一个 Iterator 而无需写出实际的冗长的类型。

+

不过这只适用于返回单一类型的情况。例如,这段代码的返回值类型指定为返回 impl Summary,但是返回了 NewsArticleTweet 就行不通:

+
pub trait Summary {
+    fn summarize(&self) -> String;
+}
+
+pub struct NewsArticle {
+    pub headline: String,
+    pub location: String,
+    pub author: String,
+    pub content: String,
+}
+
+impl Summary for NewsArticle {
+    fn summarize(&self) -> String {
+        format!("{}, by {} ({})", self.headline, self.author, self.location)
+    }
+}
+
+pub struct Tweet {
+    pub username: String,
+    pub content: String,
+    pub reply: bool,
+    pub retweet: bool,
+}
+
+impl Summary for Tweet {
+    fn summarize(&self) -> String {
+        format!("{}: {}", self.username, self.content)
+    }
+}
+
+fn returns_summarizable(switch: bool) -> impl Summary {
+    if switch {
+        NewsArticle {
+            headline: String::from(
+                "Penguins win the Stanley Cup Championship!",
+            ),
+            location: String::from("Pittsburgh, PA, USA"),
+            author: String::from("Iceburgh"),
+            content: String::from(
+                "The Pittsburgh Penguins once again are the best \
+                 hockey team in the NHL.",
+            ),
+        }
+    } else {
+        Tweet {
+            username: String::from("horse_ebooks"),
+            content: String::from(
+                "of course, as you probably already know, people",
+            ),
+            reply: false,
+            retweet: false,
+        }
+    }
+}
+

这里尝试返回 NewsArticleTweet。这不能编译,因为 impl Trait 工作方式的限制。第十八章的 “顾及不同类型值的 trait 对象” 部分会介绍如何编写这样一个函数。

+

使用 trait bound 有条件地实现方法

+

通过使用带有 trait bound 的泛型参数的 impl 块,可以有条件地只为那些实现了特定 trait 的类型实现方法。例如,示例 10-15 中的类型 Pair<T> 总是实现了 new 方法并返回一个 Pair<T> 的实例(回忆一下第五章的 “定义方法” 部分,Self 是一个 impl 块类型的类型别名(type alias),在这里是 Pair<T>)。不过在下一个 impl 块中,只有那些为 T 类型实现了 PartialOrd trait(来允许比较) Display trait(来启用打印)的 Pair<T> 才会实现 cmp_display 方法:

+
use std::fmt::Display;
+
+struct Pair<T> {
+    x: T,
+    y: T,
+}
+
+impl<T> Pair<T> {
+    fn new(x: T, y: T) -> Self {
+        Self { x, y }
+    }
+}
+
+impl<T: Display + PartialOrd> Pair<T> {
+    fn cmp_display(&self) {
+        if self.x >= self.y {
+            println!("The largest member is x = {}", self.x);
+        } else {
+            println!("The largest member is y = {}", self.y);
+        }
+    }
+}
+

示例 10-15:根据 trait bound 在泛型上有条件的实现方法

+

也可以对任何实现了特定 trait 的类型有条件地实现 trait。对任何满足特定 trait bound 的类型实现 trait 被称为 blanket implementations,它们被广泛的用于 Rust 标准库中。例如,标准库为任何实现了 Display trait 的类型实现了 ToString trait。这个 impl 块看起来像这样:

+
impl<T: Display> ToString for T {
+    // --snip--
+}
+

因为标准库有了这些 blanket implementation,我们可以对任何实现了 Display trait 的类型调用由 ToString 定义的 to_string 方法。例如,可以将整型转换为对应的 String 值,因为整型实现了 Display

+
#![allow(unused)]
+fn main() {
+let s = 3.to_string();
+}
+

blanket implementation 会出现在 trait 文档的 “Implementers” 部分。

+

trait 和 trait bound 让我们能够使用泛型类型参数来减少重复,而且能够向编译器明确指定泛型类型需要拥有哪些行为。然后编译器可以利用 trait bound 信息检查代码中所用到的具体类型是否提供了正确的行为。在动态类型语言中,如果我们调用了一个未定义的方法,会在运行时出现错误。Rust 将这些错误移动到了编译时,甚至在代码能够运行之前就强迫我们修复问题。另外,我们也无需编写运行时检查行为的代码,因为在编译时就已经检查过了。这样既提升了性能又不必放弃泛型的灵活性。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch10-03-lifetime-syntax.html b/ch10-03-lifetime-syntax.html new file mode 100644 index 000000000..73cd6b638 --- /dev/null +++ b/ch10-03-lifetime-syntax.html @@ -0,0 +1,672 @@ + + + + + + 生命周期确保引用有效 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

生命周期确保引用有效

+
+

ch10-03-lifetime-syntax.md +
+commit 5f67eee42345ba44f6f08a22c2192165f4b0e930

+
+

生命周期是另一类我们已经使用过的泛型。不同于确保类型有期望的行为,生命周期确保引用如预期一直有效。

+

当在第四章讨论 “引用和借用” 部分时,我们遗漏了一个重要的细节:Rust 中的每一个引用都有其 生命周期lifetime),也就是引用保持有效的作用域。大部分时候生命周期是隐含并可以推断的,正如大部分时候类型也是可以推断的一样。类似于当因为有多种可能类型的时候必须注明类型,也会出现引用的生命周期以一些不同方式相关联的情况,所以 Rust 需要我们使用泛型生命周期参数来注明它们的关系,这样就能确保运行时实际使用的引用绝对是有效的。

+

生命周期注解甚至不是一个大部分语言都有的概念,所以这可能感觉起来有些陌生。虽然本章不可能涉及到它全部的内容,我们会讲到一些通常你可能会遇到的生命周期语法以便你熟悉这个概念。

+

生命周期避免了悬垂引用

+

生命周期的主要目标是避免悬垂引用dangling references),后者会导致程序引用了非预期引用的数据。考虑一下示例 10-16 中的程序,它有一个外部作用域和一个内部作用域。

+
fn main() {
+    let r;
+
+    {
+        let x = 5;
+        r = &x;
+    }
+
+    println!("r: {r}");
+}
+

示例 10-16:尝试使用离开作用域的值的引用

+
+

注意:示例 10-16、10-17 和 10-23 中声明了没有初始值的变量,所以这些变量存在于外部作用域。这乍看之下好像和 Rust 不允许存在空值相冲突。然而如果尝试在给它一个值之前使用这个变量,会出现一个编译时错误,这就说明了 Rust 确实不允许空值。

+
+

外部作用域声明了一个没有初值的变量 r,而内部作用域声明了一个初值为 5 的变量x。在内部作用域中,我们尝试将 r 的值设置为一个 x 的引用。接着在内部作用域结束后,尝试打印出 r 的值。这段代码不能编译因为 r 引用的值在尝试使用之前就离开了作用域。如下是错误信息:

+
$ cargo run
+   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
+error[E0597]: `x` does not live long enough
+ --> src/main.rs:6:13
+  |
+5 |         let x = 5;
+  |             - binding `x` declared here
+6 |         r = &x;
+  |             ^^ borrowed value does not live long enough
+7 |     }
+  |     - `x` dropped here while still borrowed
+8 |
+9 |     println!("r: {r}");
+  |                  --- borrow later used here
+
+For more information about this error, try `rustc --explain E0597`.
+error: could not compile `chapter10` (bin "chapter10") due to 1 previous error
+
+

变量 x 并没有 “存在的足够久”。其原因是 x 在到达第 7 行内部作用域结束时就离开了作用域。不过 r 在外部作用域仍是有效的;作用域越大我们就说它 “存在的越久”。如果 Rust 允许这段代码工作,r 将会引用在 x 离开作用域时被释放的内存,这时尝试对 r 做任何操作都不能正常工作。那么 Rust 是如何决定这段代码是不被允许的呢?这得益于借用检查器。

+

借用检查器

+

Rust 编译器有一个 借用检查器borrow checker),它比较作用域来确保所有的借用都是有效的。示例 10-17 展示了与示例 10-16 相同的例子不过带有变量生命周期的注释:

+
fn main() {
+    let r;                // ---------+-- 'a
+                          //          |
+    {                     //          |
+        let x = 5;        // -+-- 'b  |
+        r = &x;           //  |       |
+    }                     // -+       |
+                          //          |
+    println!("r: {r}");   //          |
+}                         // ---------+
+

示例 10-17:rx 的生命周期注解,分别叫做 'a'b

+

这里将 r 的生命周期标记为 'a 并将 x 的生命周期标记为 'b。如你所见,内部的 'b 块要比外部的生命周期 'a 小得多。在编译时,Rust 比较这两个生命周期的大小,并发现 r 拥有生命周期 'a,不过它引用了一个拥有生命周期 'b 的对象。程序被拒绝编译,因为生命周期 'b 比生命周期 'a 要小:被引用的对象比它的引用者存在的时间更短。

+

让我们看看示例 10-18 中这个并没有产生悬垂引用且可以正确编译的例子:

+
fn main() {
+    let x = 5;            // ----------+-- 'b
+                          //           |
+    let r = &x;           // --+-- 'a  |
+                          //   |       |
+    println!("r: {r}");   //   |       |
+                          // --+       |
+}                         // ----------+
+

示例 10-18:一个有效的引用,因为数据比引用有着更长的生命周期

+

这里 x 拥有生命周期 'b,比 'a 要大。这就意味着 r 可以引用 x:Rust 知道 r 中的引用在 x 有效的时候也总是有效的。

+

现在我们已经在一个具体的例子中展示了引用的生命周期位于何处,并讨论了 Rust 如何分析生命周期来保证引用总是有效的,接下来让我们聊聊在函数的上下文中参数和返回值的泛型生命周期。

+

函数中的泛型生命周期

+

让我们来编写一个返回两个字符串 slice 中较长者的函数。这个函数获取两个字符串 slice 并返回一个字符串 slice。一旦我们实现了 longest 函数,示例 10-19 中的代码应该会打印出 The longest string is abcd

+

文件名:src/main.rs

+
fn main() {
+    let string1 = String::from("abcd");
+    let string2 = "xyz";
+
+    let result = longest(string1.as_str(), string2);
+    println!("The longest string is {result}");
+}
+

示例 10-19:main 函数调用 longest 函数来寻找两个字符串 slice 中较长的一个

+

注意这个函数获取作为引用的字符串 slice,而不是字符串,因为我们不希望 longest 函数获取参数的所有权。参考之前第四章中的 “字符串 slice 作为参数” 部分中更多关于为什么示例 10-19 的参数正符合我们期望的讨论。

+

如果尝试像示例 10-20 中那样实现 longest 函数,它并不能编译:

+

文件名:src/main.rs

+
fn main() {
+    let string1 = String::from("abcd");
+    let string2 = "xyz";
+
+    let result = longest(string1.as_str(), string2);
+    println!("The longest string is {result}");
+}
+
+fn longest(x: &str, y: &str) -> &str {
+    if x.len() > y.len() {
+        x
+    } else {
+        y
+    }
+}
+

示例 10-20:一个 longest 函数的实现,它返回两个字符串 slice 中较长者,现在还不能编译

+

相应地会出现如下有关生命周期的错误:

+
$ cargo run
+   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
+error[E0106]: missing lifetime specifier
+ --> src/main.rs:9:33
+  |
+9 | fn longest(x: &str, y: &str) -> &str {
+  |               ----     ----     ^ expected named lifetime parameter
+  |
+  = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `x` or `y`
+help: consider introducing a named lifetime parameter
+  |
+9 | fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
+  |           ++++     ++          ++          ++
+
+For more information about this error, try `rustc --explain E0106`.
+error: could not compile `chapter10` (bin "chapter10") due to 1 previous error
+
+

提示文本揭示了返回值需要一个泛型生命周期参数,因为 Rust 并不知道将要返回的引用是指向 xy。事实上我们也不知道,因为函数体中 if 块返回一个 x 的引用而 else 块返回一个 y 的引用!

+

当我们定义这个函数的时候,并不知道传递给函数的具体值,所以也不知道到底是 if 还是 else 会被执行。我们也不知道传入的引用的具体生命周期,所以也就不能像示例 10-17 和 10-18 那样通过观察作用域来确定返回的引用是否总是有效。借用检查器自身同样也无法确定,因为它不知道 xy 的生命周期是如何与返回值的生命周期相关联的。为了修复这个错误,我们将增加泛型生命周期参数来定义引用间的关系以便借用检查器可以进行分析。

+

生命周期注解语法

+

生命周期注解并不改变任何引用的生命周期的长短。相反它们描述了多个引用生命周期相互的关系,而不影响其生命周期。与当函数签名中指定了泛型类型参数后就可以接受任何类型一样,当指定了泛型生命周期后函数也能接受任何生命周期的引用。

+

生命周期注解有着一个不太常见的语法:生命周期参数名称必须以撇号(')开头,其名称通常全是小写,类似于泛型其名称非常短。大多数人使用 'a 作为第一个生命周期注解。生命周期参数注解位于引用的 & 之后,并有一个空格来将引用类型与生命周期注解分隔开。

+

这里有一些例子:我们有一个没有生命周期参数的 i32 的引用,一个有叫做 'a 的生命周期参数的 i32 的引用,和一个生命周期也是 'ai32 的可变引用:

+
&i32        // 引用
+&'a i32     // 带有显式生命周期的引用
+&'a mut i32 // 带有显式生命周期的可变引用
+

单个的生命周期注解本身没有多少意义,因为生命周期注解告诉 Rust 多个引用的泛型生命周期参数如何相互联系的。让我们在 longest 函数的上下文中理解生命周期注解如何相互联系。

+

例如如果函数有一个生命周期 'ai32 的引用的参数 first。还有另一个同样是生命周期 'ai32 的引用的参数 second。这两个生命周期注解意味着引用 firstsecond 必须与这泛型生命周期存在得一样久。

+

函数签名中的生命周期注解

+

为了在函数签名中使用生命周期注解,需要在函数名和参数列表间的尖括号中声明泛型生命周期(lifetime)参数,就像泛型类型(type)参数一样。

+

我们希望函数签名表达如下限制:也就是这两个参数和返回的引用存活的一样久。(两个)参数和返回的引用的生命周期是相关的。就像示例 10-21 中在每个引用中都加上了 'a 那样。

+

文件名:src/main.rs

+
fn main() {
+    let string1 = String::from("abcd");
+    let string2 = "xyz";
+
+    let result = longest(string1.as_str(), string2);
+    println!("The longest string is {result}");
+}
+
+fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
+    if x.len() > y.len() {
+        x
+    } else {
+        y
+    }
+}
+

示例 10-21:longest 函数定义指定了签名中所有的引用必须有相同的生命周期 'a

+

这段代码能够编译并会产生我们希望得到的示例 10-19 中的 main 函数的结果。

+

现在函数签名表明对于某些生命周期 'a,函数会获取两个参数,它们都是与生命周期 'a 存在的至少一样长的字符串 slice。函数会返回一个同样也与生命周期 'a 存在的至少一样长的字符串 slice。它的实际含义是 longest 函数返回的引用的生命周期与函数参数所引用的值的生命周期的较小者一致。这些关系就是我们希望 Rust 分析代码时所使用的。

+

记住通过在函数签名中指定生命周期参数时,我们并没有改变任何传入值或返回值的生命周期,而是指出任何不满足这个约束条件的值都将被借用检查器拒绝。注意 longest 函数并不需要知道 xy 具体会存在多久,而只需要知道有某个可以被 'a 替代的作用域将会满足这个签名。

+

当在函数中使用生命周期注解时,这些注解出现在函数签名中,而不存在于函数体中的任何代码中。生命周期注解成为了函数约定的一部分,非常像签名中的类型。让函数签名包含生命周期约定意味着 Rust 编译器的工作变得更简单了。如果函数注解有误或者调用方法不对,编译器错误可以更准确地指出代码和限制的部分。如果不这么做的话,Rust 编译会对我们期望的生命周期关系做更多的推断,这样编译器可能只能指出离出问题地方很多步之外的代码。

+

当具体的引用被传递给 longest 时,被 'a 所替代的具体生命周期是 x 的作用域与 y 的作用域相重叠的那一部分。换一种说法就是泛型生命周期 'a 的具体生命周期等同于 xy 的生命周期中较小的那一个。因为我们用相同的生命周期参数 'a 标注了返回的引用值,所以返回的引用值就能保证在 xy 中较短的那个生命周期结束之前保持有效。

+

让我们看看如何通过传递拥有不同具体生命周期的引用来限制 longest 函数的使用。示例 10-22 是一个很直观的例子。

+

文件名:src/main.rs

+
fn main() {
+    let string1 = String::from("long string is long");
+
+    {
+        let string2 = String::from("xyz");
+        let result = longest(string1.as_str(), string2.as_str());
+        println!("The longest string is {result}");
+    }
+}
+
+fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
+    if x.len() > y.len() {
+        x
+    } else {
+        y
+    }
+}
+

示例 10-22:通过拥有不同的具体生命周期的 String 值调用 longest 函数

+

在这个例子中,string1 直到外部作用域结束都是有效的,string2 则在内部作用域中是有效的,而 result 则引用了一些直到内部作用域结束都是有效的值。借用检查器认可这些代码;它能够编译和运行,并打印出 The longest string is long string is long

+

接下来,让我们尝试另外一个例子,该例子揭示了 result 的引用的生命周期必须是两个参数中较短的那个。以下代码将 result 变量的声明移动出内部作用域,但是将 resultstring2 变量的赋值语句一同留在内部作用域中。接着,使用了变量 resultprintln! 也被移动到内部作用域之外。注意示例 10-23 中的代码不能通过编译:

+

文件名:src/main.rs

+
fn main() {
+    let string1 = String::from("long string is long");
+    let result;
+    {
+        let string2 = String::from("xyz");
+        result = longest(string1.as_str(), string2.as_str());
+    }
+    println!("The longest string is {result}");
+}
+
+fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
+    if x.len() > y.len() {
+        x
+    } else {
+        y
+    }
+}
+

示例 10-23:尝试在 string2 离开作用域之后使用 result

+

如果尝试编译会出现如下错误:

+
$ cargo run
+   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
+error[E0597]: `string2` does not live long enough
+ --> src/main.rs:6:44
+  |
+5 |         let string2 = String::from("xyz");
+  |             ------- binding `string2` declared here
+6 |         result = longest(string1.as_str(), string2.as_str());
+  |                                            ^^^^^^^ borrowed value does not live long enough
+7 |     }
+  |     - `string2` dropped here while still borrowed
+8 |     println!("The longest string is {result}");
+  |                                     -------- borrow later used here
+
+For more information about this error, try `rustc --explain E0597`.
+error: could not compile `chapter10` (bin "chapter10") due to 1 previous error
+
+

错误表明为了保证 println! 中的 result 是有效的,string2 需要直到外部作用域结束都是有效的。Rust 知道这些是因为(longest)函数的参数和返回值都使用了相同的生命周期参数 'a

+

如果从人的角度读上述代码,我们可能会觉得这个代码是正确的。 string1 更长,因此 result 会包含指向 string1 的引用。因为 string1 尚未离开作用域,对于 println! 来说 string1 的引用仍然是有效的。然而,我们通过生命周期参数告诉 Rust 的是: longest 函数返回的引用的生命周期应该与传入参数的生命周期中较短那个保持一致。因此,借用检查器不允许示例 10-23 中的代码,因为它可能会存在无效的引用。

+

请尝试更多采用不同的值和不同生命周期的引用作为 longest 函数的参数和返回值的实验。并在开始编译前猜想你的实验能否通过借用检查器,接着编译一下看看你的理解是否正确!

+

深入理解生命周期

+

指定生命周期参数的正确方式依赖函数实现的具体功能。例如,如果将 longest 函数的实现修改为总是返回第一个参数而不是最长的字符串 slice,就不需要为参数 y 指定一个生命周期。如下代码将能够编译:

+

文件名:src/main.rs

+
fn main() {
+    let string1 = String::from("abcd");
+    let string2 = "efghijklmnopqrstuvwxyz";
+
+    let result = longest(string1.as_str(), string2);
+    println!("The longest string is {result}");
+}
+
+fn longest<'a>(x: &'a str, y: &str) -> &'a str {
+    x
+}
+

我们为参数 x 和返回值指定了生命周期参数 'a,不过没有为参数 y 指定,因为 y 的生命周期与参数 x 和返回值的生命周期没有任何关系。

+

当从函数返回一个引用,返回值的生命周期参数需要与一个参数的生命周期参数相匹配。如果返回的引用 没有 指向任何一个参数,那么唯一的可能就是它指向一个函数内部创建的值。然而它将会是一个悬垂引用,因为它将会在函数结束时离开作用域。尝试考虑这个并不能编译的 longest 函数实现:

+

文件名:src/main.rs

+
fn main() {
+    let string1 = String::from("abcd");
+    let string2 = "xyz";
+
+    let result = longest(string1.as_str(), string2);
+    println!("The longest string is {result}");
+}
+
+fn longest<'a>(x: &str, y: &str) -> &'a str {
+    let result = String::from("really long string");
+    result.as_str()
+}
+

即便我们为返回值指定了生命周期参数 'a,这个实现却编译失败了,因为返回值的生命周期与参数完全没有关联。这里是会出现的错误信息:

+
$ cargo run
+   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
+error[E0515]: cannot return value referencing local variable `result`
+  --> src/main.rs:11:5
+   |
+11 |     result.as_str()
+   |     ------^^^^^^^^^
+   |     |
+   |     returns a value referencing data owned by the current function
+   |     `result` is borrowed here
+
+For more information about this error, try `rustc --explain E0515`.
+error: could not compile `chapter10` (bin "chapter10") due to 1 previous error
+
+

出现的问题是 resultlongest 函数的结尾将离开作用域并被清理,而我们尝试从函数返回一个 result 的引用。无法指定生命周期参数来改变悬垂引用,而且 Rust 也不允许我们创建一个悬垂引用。在这种情况,最好的解决方案是返回一个有所有权的数据类型而不是一个引用,这样函数调用者就需要负责清理这个值了。

+

综上,生命周期语法是用于将函数的多个参数与其返回值的生命周期进行关联的。一旦它们形成了某种关联,Rust 就有了足够的信息来允许内存安全的操作并阻止会产生悬垂指针亦或是违反内存安全的行为。

+

结构体定义中的生命周期注解

+

目前为止,我们定义的结构体全都包含拥有所有权的类型。也可以定义包含引用的结构体,不过这需要为结构体定义中的每一个引用添加生命周期注解。示例 10-24 中有一个存放了一个字符串 slice 的结构体 ImportantExcerpt

+

文件名:src/main.rs

+
struct ImportantExcerpt<'a> {
+    part: &'a str,
+}
+
+fn main() {
+    let novel = String::from("Call me Ishmael. Some years ago...");
+    let first_sentence = novel.split('.').next().unwrap();
+    let i = ImportantExcerpt {
+        part: first_sentence,
+    };
+}
+

示例 10-24:一个存放引用的结构体,所以其定义需要生命周期注解

+

这个结构体有唯一一个字段 part,它存放了一个字符串 slice,这是一个引用。类似于泛型参数类型,必须在结构体名称后面的尖括号中声明泛型生命周期参数,以便在结构体定义中使用生命周期参数。这个注解意味着 ImportantExcerpt 的实例不能比其 part 字段中的引用存在的更久。

+

这里的 main 函数创建了一个 ImportantExcerpt 的实例,它存放了变量 novel 所拥有的 String 的第一个句子的引用。novel 的数据在 ImportantExcerpt 实例创建之前就存在。另外,直到 ImportantExcerpt 离开作用域之后 novel 都不会离开作用域,所以 ImportantExcerpt 实例中的引用是有效的。

+

生命周期省略(Lifetime Elision)

+

现在我们已经知道了每一个引用都有一个生命周期,而且我们需要为那些使用了引用的函数或结构体指定生命周期。然而,第四章的示例 4-9 中有一个函数,如示例 10-25 所示,它没有生命周期注解却能编译成功:

+

文件名:src/lib.rs

+
fn first_word(s: &str) -> &str {
+    let bytes = s.as_bytes();
+
+    for (i, &item) in bytes.iter().enumerate() {
+        if item == b' ' {
+            return &s[0..i];
+        }
+    }
+
+    &s[..]
+}
+
+fn main() {
+    let my_string = String::from("hello world");
+
+    // first_word works on slices of `String`s
+    let word = first_word(&my_string[..]);
+
+    let my_string_literal = "hello world";
+
+    // first_word works on slices of string literals
+    let word = first_word(&my_string_literal[..]);
+
+    // Because string literals *are* string slices already,
+    // this works too, without the slice syntax!
+    let word = first_word(my_string_literal);
+}
+

示例 10-25:示例 4-9 定义了一个没有使用生命周期注解的函数,即便其参数和返回值都是引用

+

这个函数没有生命周期注解却能编译是由于一些历史原因:在早期版本(pre-1.0)的 Rust 中,这的确是不能编译的。每一个引用都必须有明确的生命周期。那时的函数签名将会写成这样:

+
fn first_word<'a>(s: &'a str) -> &'a str {
+

在编写了很多 Rust 代码后,Rust 团队发现在特定情况下 Rust 程序员们总是重复地编写一模一样的生命周期注解。这些场景是可预测的并且遵循几个明确的模式。接着 Rust 团队就把这些模式编码进了 Rust 编译器中,如此借用检查器在这些情况下就能推断出生命周期而不再强制程序员显式的增加注解。

+

这里我们提到一些 Rust 的历史是因为更多的明确的模式被合并和添加到编译器中是完全可能的。未来只会需要更少的生命周期注解。

+

被编码进 Rust 引用分析的模式被称为 生命周期省略规则lifetime elision rules)。这并不是需要程序员遵守的规则;这些规则是一系列特定的场景,此时编译器会考虑,如果代码符合这些场景,就无需明确指定生命周期。

+

省略规则并不提供完整的推断:如果 Rust 在明确遵守这些规则的前提下变量的生命周期仍然是模棱两可的话,它不会猜测剩余引用的生命周期应该是什么。编译器会在可以通过增加生命周期注解来解决错误问题的地方给出一个错误提示,而不是进行推断或猜测。

+

函数或方法的参数的生命周期被称为 输入生命周期input lifetimes),而返回值的生命周期被称为 输出生命周期output lifetimes)。

+

编译器采用三条规则来判断引用何时不需要明确的注解。第一条规则适用于输入生命周期,后两条规则适用于输出生命周期。如果编译器检查完这三条规则后仍然存在没有计算出生命周期的引用,编译器将会停止并生成错误。这些规则适用于 fn 定义,以及 impl 块。

+

第一条规则是编译器为每一个引用参数都分配一个生命周期参数。换句话说就是,函数有一个引用参数的就有一个生命周期参数:fn foo<'a>(x: &'a i32),有两个引用参数的函数就有两个不同的生命周期参数,fn foo<'a, 'b>(x: &'a i32, y: &'b i32),依此类推。

+

第二条规则是如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数:fn foo<'a>(x: &'a i32) -> &'a i32

+

第三条规则是如果方法有多个输入生命周期参数并且其中一个参数是 &self&mut self,说明是个对象的方法 (method)(译者注:这里涉及 rust 的面向对象参见 17 章),那么所有输出生命周期参数被赋予 self 的生命周期。第三条规则使得方法更容易读写,因为只需更少的符号。

+

假设我们自己就是编译器。并应用这些规则来计算示例 10-25 中 first_word 函数签名中的引用的生命周期。开始时签名中的引用并没有关联任何生命周期:

+
fn first_word(s: &str) -> &str {
+

接着编译器应用第一条规则,也就是每个引用参数都有其自己的生命周期。我们像往常一样称之为 'a,所以现在签名看起来像这样:

+
fn first_word<'a>(s: &'a str) -> &str {
+

对于第二条规则,因为这里正好只有一个输入生命周期参数所以是适用的。第二条规则表明输入参数的生命周期将被赋予输出生命周期参数,所以现在签名看起来像这样:

+
fn first_word<'a>(s: &'a str) -> &'a str {
+

现在这个函数签名中的所有引用都有了生命周期,如此编译器可以继续它的分析而无须程序员标记这个函数签名中的生命周期。

+

让我们再看看另一个例子,这次我们从示例 10-20 中没有生命周期参数的 longest 函数开始:

+
fn longest(x: &str, y: &str) -> &str {
+

再次假设我们自己就是编译器并应用第一条规则:每个引用参数都有其自己的生命周期。这次有两个参数,所以就有两个(不同的)生命周期:

+
fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &str {
+

再来应用第二条规则,因为函数存在多个输入生命周期,它并不适用于这种情况。再来看第三条规则,它同样也不适用,这是因为没有 self 参数。应用了三个规则之后编译器还没有计算出返回值类型的生命周期。这就是在编译示例 10-20 的代码时会出现错误的原因:编译器使用所有已知的生命周期省略规则,仍不能计算出签名中所有引用的生命周期。

+

因为第三条规则真正能够适用的就只有方法签名,现在就让我们看看那种情况中的生命周期,并看看为什么这条规则意味着我们经常不需要在方法签名中标注生命周期。

+

方法定义中的生命周期注解

+

当为带有生命周期的结构体实现方法时,其语法依然类似示例 10-11 中展示的泛型类型参数的语法。我们在哪里声明和使用生命周期参数,取决于它们是与结构体字段相关还是与方法参数和返回值相关。

+

(实现方法时)结构体字段的生命周期必须总是在 impl 关键字之后声明并在结构体名称之后被使用,因为这些生命周期是结构体类型的一部分。

+

impl 块里的方法签名中,引用可能与结构体字段中的引用相关联,也可能是独立的。另外,生命周期省略规则也经常让我们无需在方法签名中使用生命周期注解。让我们看看一些使用示例 10-24 中定义的结构体 ImportantExcerpt 的例子。

+

首先,这里有一个方法 level。其唯一的参数是 self 的引用,而且返回值只是一个 i32,并不引用任何值:

+
struct ImportantExcerpt<'a> {
+    part: &'a str,
+}
+
+impl<'a> ImportantExcerpt<'a> {
+    fn level(&self) -> i32 {
+        3
+    }
+}
+
+impl<'a> ImportantExcerpt<'a> {
+    fn announce_and_return_part(&self, announcement: &str) -> &str {
+        println!("Attention please: {announcement}");
+        self.part
+    }
+}
+
+fn main() {
+    let novel = String::from("Call me Ishmael. Some years ago...");
+    let first_sentence = novel.split('.').next().unwrap();
+    let i = ImportantExcerpt {
+        part: first_sentence,
+    };
+}
+

impl 之后和类型名称之后的生命周期参数是必要的,不过因为第一条生命周期规则我们并不必须标注 self 引用的生命周期。

+

这里是一个适用于第三条生命周期省略规则的例子:

+
struct ImportantExcerpt<'a> {
+    part: &'a str,
+}
+
+impl<'a> ImportantExcerpt<'a> {
+    fn level(&self) -> i32 {
+        3
+    }
+}
+
+impl<'a> ImportantExcerpt<'a> {
+    fn announce_and_return_part(&self, announcement: &str) -> &str {
+        println!("Attention please: {announcement}");
+        self.part
+    }
+}
+
+fn main() {
+    let novel = String::from("Call me Ishmael. Some years ago...");
+    let first_sentence = novel.split('.').next().unwrap();
+    let i = ImportantExcerpt {
+        part: first_sentence,
+    };
+}
+

这里有两个输入生命周期,所以 Rust 应用第一条生命周期省略规则并给予 &selfannouncement 它们各自的生命周期。接着,因为其中一个参数是 &self,返回值类型被赋予了 &self 的生命周期,这样所有的生命周期都被计算出来了。

+

静态生命周期

+

这里有一种特殊的生命周期值得讨论:'static,其生命周期能够存活于整个程序期间。所有的字符串字面值都拥有 'static 生命周期,我们也可以选择像下面这样标注出来:

+
#![allow(unused)]
+fn main() {
+let s: &'static str = "I have a static lifetime.";
+}
+

这个字符串的文本被直接储存在程序的二进制文件中而这个文件总是可用的。因此所有的字符串字面值都是 'static 的。

+

你可能在错误信息的帮助文本中见过使用 'static 生命周期的建议,不过将引用指定为 'static 之前,思考一下这个引用是否真的在整个程序的生命周期里都有效,以及你是否希望它存在得这么久。大部分情况中,推荐 'static 生命周期的错误信息都是尝试创建一个悬垂引用或者可用的生命周期不匹配的结果。在这种情况下的解决方案是修复这些问题而不是指定一个 'static 的生命周期。

+

结合泛型类型参数、trait bounds 和生命周期

+

让我们简要的看一下在同一函数中指定泛型类型参数、trait bounds 和生命周期的语法!

+
fn main() {
+    let string1 = String::from("abcd");
+    let string2 = "xyz";
+
+    let result = longest_with_an_announcement(
+        string1.as_str(),
+        string2,
+        "Today is someone's birthday!",
+    );
+    println!("The longest string is {result}");
+}
+
+use std::fmt::Display;
+
+fn longest_with_an_announcement<'a, T>(
+    x: &'a str,
+    y: &'a str,
+    ann: T,
+) -> &'a str
+where
+    T: Display,
+{
+    println!("Announcement! {ann}");
+    if x.len() > y.len() {
+        x
+    } else {
+        y
+    }
+}
+

这个是示例 10-21 中那个返回两个字符串 slice 中较长者的 longest 函数,不过带有一个额外的参数 annann 的类型是泛型 T,它可以被放入任何实现了 where 从句中指定的 Display trait 的类型。这个额外的参数会使用 {} 打印,这也就是为什么 Display trait bound 是必须的。因为生命周期也是泛型,所以生命周期参数 'a 和泛型类型参数 T 都位于函数名后的同一尖括号列表中。

+

总结

+

这一章介绍了很多的内容!现在你知道了泛型类型参数、trait 和 trait bounds 以及泛型生命周期类型,你已经准备好编写既不重复又能适用于多种场景的代码了。泛型类型参数意味着代码可以适用于不同的类型。trait 和 trait bounds 保证了即使类型是泛型的,这些类型也会拥有所需要的行为。由生命周期注解所指定的引用生命周期之间的关系保证了这些灵活多变的代码不会出现悬垂引用。而所有的这一切发生在编译时所以不会影响运行时效率!

+

你可能不会相信,这个话题还有更多需要学习的内容:第十八章会讨论 trait 对象,这是另一种使用 trait 的方式。还有更多更复杂的涉及生命周期注解的场景,只有在非常高级的情况下才会需要它们;对于这些内容,请阅读 Rust Reference。不过接下来,让我们聊聊如何在 Rust 中编写测试,来确保代码的所有功能能像我们希望的那样工作!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch11-00-testing.html b/ch11-00-testing.html new file mode 100644 index 000000000..0e3425627 --- /dev/null +++ b/ch11-00-testing.html @@ -0,0 +1,249 @@ + + + + + + 编写自动化测试 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

编写自动化测试

+
+

ch11-00-testing.md +
+commit 765318b844569a642ceef7bf1adab9639cbf6af3

+
+

Edsger W. Dijkstra 在其 1972 年的文章【谦卑的程序员】(“The Humble Programmer”)中说到 “软件测试是证明 bug 存在的有效方法,而证明其不存在时则显得令人绝望的不足。”(“Program testing can be a very effective way to show the presence of bugs, but it is hopelessly inadequate for showing their absence.”)这并不意味着我们不该尽可能地测试软件!

+

程序的正确性意味着代码如我们期望的那样运行。Rust 是一个相当注重正确性的编程语言,不过正确性是一个难以证明的复杂主题。Rust 的类型系统在此问题上下了很大的功夫,不过类型系统不可能捕获所有问题。为此,Rust 包含了编写自动化软件测试的功能支持。

+

假设我们可以编写一个叫做 add_two 的将传递给它的值加二的函数。它的签名有一个整型参数并返回一个整型值。当实现和编译这个函数时,Rust 会进行所有目前我们已经见过的类型检查和借用检查,例如,这些检查会确保我们不会传递 String 或无效的引用给这个函数。Rust 所 不能 检查的是这个函数是否会准确的完成我们期望的工作:返回参数加二后的值,而不是比如说参数加 10 或减 50 的值!这也就是测试出场的地方。

+

我们可以编写测试断言,比如说,当传递 3add_two 函数时,返回值是 5。无论何时对代码进行修改,都可以运行测试来确保任何现存的正确行为没有被改变。

+

测试是一项复杂的技能:虽然不能在一个章节的篇幅中介绍如何编写好的测试的每个细节,但我们还是会讨论 Rust 测试功能的机制。我们会讲到编写测试时会用到的注解和宏,运行测试的默认行为和选项,以及如何将测试组织成单元测试和集成测试。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch11-01-writing-tests.html b/ch11-01-writing-tests.html new file mode 100644 index 000000000..10905a252 --- /dev/null +++ b/ch11-01-writing-tests.html @@ -0,0 +1,994 @@ + + + + + + 如何编写测试 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

如何编写测试

+
+

ch11-01-writing-tests.md +
+commit 6e2fe7c0f085989cc498cec139e717e2af172cb7

+
+

Rust 中的测试函数是用来验证非测试代码是否是按照期望的方式运行的。测试函数体通常执行如下三种操作:

+
    +
  1. 设置任何所需的数据或状态
  2. +
  3. 运行需要测试的代码
  4. +
  5. 断言其结果是我们所期望的
  6. +
+

让我们看看 Rust 提供的专门用来编写测试的功能:test 属性、一些宏和 should_panic 属性。

+

测试函数剖析

+

作为最简单例子,Rust 中的测试就是一个带有 test 属性注解的函数。属性(attribute)是关于 Rust 代码片段的元数据;第五章中结构体中用到的 derive 属性就是一个例子。为了将一个函数变成测试函数,需要在 fn 行之前加上 #[test]。当使用 cargo test 命令运行测试时,Rust 会构建一个测试执行程序用来调用被标注的函数,并报告每一个测试是通过还是失败。

+

每次使用 Cargo 新建一个库项目时,它会自动为我们生成一个测试模块和一个测试函数。这个模块提供了一个编写测试的模板,为此每次开始新项目时不必去查找测试函数的具体结构和语法了。当然你也可以额外增加任意多的测试函数以及测试模块!

+

在实际编写测试代码之前,让我们先通过尝试那些自动生成的测试模版来探索测试是如何工作的。接着,我们会写一些真正的测试,调用我们编写的代码并断言它们的行为的正确性。

+

让我们创建一个新的库项目 adder,它会将两个数字相加:

+
$ cargo new adder --lib
+     Created library `adder` project
+$ cd adder
+
+

adder 库中 src/lib.rs 的内容应该看起来如示例 11-1 所示:

+

文件名:src/lib.rs

+
pub fn add(left: usize, right: usize) -> usize {
+    left + right
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn it_works() {
+        let result = add(2, 2);
+        assert_eq!(result, 4);
+    }
+}
+

示例 11-1:由 cargo new 自动生成的测试模块和函数

+

现在让我们暂时忽略 tests 模块和 #[cfg(test)] 注解并只关注函数本身。注意 fn 行之前的 #[test]:这个属性表明这是一个测试函数,这样测试执行者就知道将其作为测试处理。tests 模块中也可以有非测试的函数来帮助我们建立通用场景或进行常见操作,必须每次都标明哪些函数是测试。

+

示例函数体通过使用 assert_eq! 宏来断言 2 加 2 等于 4。一个典型的测试的格式,就是像这个例子中的断言一样。接下来运行就可以看到测试通过。

+

cargo test 命令会运行项目中所有的测试,如示例 11-2 所示:

+
$ cargo test
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.57s
+     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
+
+running 1 test
+test tests::it_works ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests adder
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

示例 11-2:运行自动生成测试的输出

+

Cargo 编译并运行了测试。可以看到 running 1 test 这一行。下一行显示了生成的测试函数的名称,它是 it_works,以及测试的运行结果,ok。接着可以看到全体测试运行结果的摘要:test result: ok. 意味着所有测试都通过了。1 passed; 0 failed 表示通过或失败的测试数量。

+

可以将一个测试标记为忽略这样在特定情况下它就不会运行;本章之后的“除非特别指定否则忽略某些测试”部分会介绍它。因为之前我们并没有将任何测试标记为忽略,所以摘要中会显示 0 ignored。我们也没有过滤需要运行的测试,所以摘要中会显示0 filtered out。在下一部分 “控制测试如何运行” 会讨论忽略和过滤测试。

+

0 measured 统计是针对性能测试的。性能测试(benchmark tests)在编写本书时,仍只能用于 Rust 开发版(nightly Rust)。请查看 性能测试的文档 了解更多。

+

测试输出中的以 Doc-tests adder 开头的这一部分是所有文档测试的结果。我们现在并没有任何文档测试,不过 Rust 会编译任何在 API 文档中的代码示例。这个功能帮助我们使文档和代码保持同步!在第十四章的 “文档注释作为测试” 部分会讲到如何编写文档测试。现在我们将忽略 Doc-tests 部分的输出。

+

让我们开始自定义测试来满足我们的需求。首先给 it_works 函数起个不同的名字,比如 exploration,像这样:

+

文件名:src/lib.rs

+
pub fn add(left: usize, right: usize) -> usize {
+    left + right
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn exploration() {
+        let result = add(2, 2);
+        assert_eq!(result, 4);
+    }
+}
+

并再次运行 cargo test。现在输出中将出现 exploration 而不是 it_works

+
$ cargo test
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.59s
+     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
+
+running 1 test
+test tests::exploration ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests adder
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

现在让我们增加另一个测试,不过这一次是一个会失败的测试!当测试函数中出现 panic 时测试就失败了。每一个测试都在一个新线程中运行,当主线程发现测试线程异常了,就将对应测试标记为失败。第九章讲到了最简单的造成 panic 的方法:调用 panic! 宏。写入新测试 another 后, src/lib.rs 现在看起来如示例 11-3 所示:

+

文件名:src/lib.rs

+
pub fn add(left: usize, right: usize) -> usize {
+    left + right
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn exploration() {
+        let result = add(2, 2);
+        assert_eq!(result, 4);
+    }
+
+    #[test]
+    fn another() {
+        panic!("Make this test fail");
+    }
+}
+

示例 11-3:增加第二个因调用了 panic! 而失败的测试

+

再次 cargo test 运行测试。输出应该看起来像示例 11-4,它表明 exploration 测试通过了而 another 失败了:

+
$ cargo test
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.72s
+     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
+
+running 2 tests
+test tests::another ... FAILED
+test tests::exploration ... ok
+
+failures:
+
+---- tests::another stdout ----
+thread 'tests::another' panicked at src/lib.rs:17:9:
+Make this test fail
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+
+failures:
+    tests::another
+
+test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+error: test failed, to rerun pass `--lib`
+
+

示例 11-4:一个测试通过和一个测试失败的测试结果

+

test tests::another 这一行是 FAILED 而不是 ok 了。在单独测试结果和摘要之间多了两个新的部分:第一个部分显示了测试失败的详细原因。在这个例子中,我们看到 another 因为在 src/lib.rs 的第 10 行 panicked at 'Make this test fail' 而失败的详细信息。下一部分列出了所有失败的测试,这在有很多测试和很多失败测试的详细输出时很有帮助。我们可以通过使用失败测试的名称来只运行这个测试,以便调试;下一部分 “控制测试如何运行” 会讲到更多运行测试的方法。

+

最后是摘要行:总体上讲,测试结果是 FAILED。有一个测试通过和一个测试失败。

+

现在我们见过不同场景中测试结果是什么样子的了,再来看看除 panic! 之外的一些在测试中有帮助的宏吧。

+

使用 assert! 宏来检查结果

+

assert! 宏由标准库提供,在希望确保测试中一些条件为 true 时非常有用。需要向 assert! 宏提供一个求值为布尔值的参数。如果值是 trueassert! 什么也不做,同时测试会通过。如果值为 falseassert! 调用 panic! 宏,这会导致测试失败。assert! 宏帮助我们检查代码是否以期望的方式运行。

+

回忆一下第五章中,示例 5-15 中有一个 Rectangle 结构体和一个 can_hold 方法,在示例 11-5 中再次使用它们。将它们放进 src/lib.rs 并使用 assert! 宏编写一些测试。

+

文件名:src/lib.rs

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+impl Rectangle {
+    fn can_hold(&self, other: &Rectangle) -> bool {
+        self.width > other.width && self.height > other.height
+    }
+}
+

示例 11-5:第五章中 Rectangle 结构体和其 can_hold 方法

+

can_hold 方法返回一个布尔值,这意味着它完美符合 assert! 宏的使用场景。在示例 11-6 中,让我们编写一个 can_hold 方法的测试来作为练习,这里创建一个长为 8 宽为 7 的 Rectangle 实例,并假设它可以放得下另一个长为 5 宽为 1 的 Rectangle 实例:

+

文件名:src/lib.rs

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+impl Rectangle {
+    fn can_hold(&self, other: &Rectangle) -> bool {
+        self.width > other.width && self.height > other.height
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn larger_can_hold_smaller() {
+        let larger = Rectangle {
+            width: 8,
+            height: 7,
+        };
+        let smaller = Rectangle {
+            width: 5,
+            height: 1,
+        };
+
+        assert!(larger.can_hold(&smaller));
+    }
+}
+

示例 11-6:一个 can_hold 的测试,检查一个较大的矩形确实能放得下一个较小的矩形

+

注意在 tests 模块中新增加了一行:use super::*;tests 是一个普通的模块,它遵循第七章 “路径用于引用模块树中的项” 部分介绍的可见性规则。因为这是一个内部模块,要测试外部模块中的代码,需要将其引入到内部模块的作用域中。这里选择使用 glob 全局导入,以便在 tests 模块中使用所有在外部模块定义的内容。

+

我们将测试命名为 larger_can_hold_smaller,并创建所需的两个 Rectangle 实例。接着调用 assert! 宏并传递 larger.can_hold(&smaller) 调用的结果作为参数。这个表达式预期会返回 true,所以测试应该通过。让我们拭目以待!

+
$ cargo test
+   Compiling rectangle v0.1.0 (file:///projects/rectangle)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s
+     Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e)
+
+running 1 test
+test tests::larger_can_hold_smaller ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests rectangle
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

它确实通过了!再来增加另一个测试,这一回断言一个更小的矩形不能放下一个更大的矩形:

+

文件名:src/lib.rs

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+impl Rectangle {
+    fn can_hold(&self, other: &Rectangle) -> bool {
+        self.width > other.width && self.height > other.height
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn larger_can_hold_smaller() {
+        // --snip--
+        let larger = Rectangle {
+            width: 8,
+            height: 7,
+        };
+        let smaller = Rectangle {
+            width: 5,
+            height: 1,
+        };
+
+        assert!(larger.can_hold(&smaller));
+    }
+
+    #[test]
+    fn smaller_cannot_hold_larger() {
+        let larger = Rectangle {
+            width: 8,
+            height: 7,
+        };
+        let smaller = Rectangle {
+            width: 5,
+            height: 1,
+        };
+
+        assert!(!smaller.can_hold(&larger));
+    }
+}
+

因为这里 can_hold 函数的正确结果是 false ,我们需要将这个结果取反后传递给 assert! 宏。因此 can_hold 返回 false 时测试就会通过:

+
$ cargo test
+   Compiling rectangle v0.1.0 (file:///projects/rectangle)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s
+     Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e)
+
+running 2 tests
+test tests::larger_can_hold_smaller ... ok
+test tests::smaller_cannot_hold_larger ... ok
+
+test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests rectangle
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

两个通过的测试!现在让我们看看如果引入一个 bug 的话测试结果会发生什么。将 can_hold 方法中比较长度时本应使用大于号的地方改成小于号:

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+// --snip--
+impl Rectangle {
+    fn can_hold(&self, other: &Rectangle) -> bool {
+        self.width < other.width && self.height > other.height
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn larger_can_hold_smaller() {
+        let larger = Rectangle {
+            width: 8,
+            height: 7,
+        };
+        let smaller = Rectangle {
+            width: 5,
+            height: 1,
+        };
+
+        assert!(larger.can_hold(&smaller));
+    }
+
+    #[test]
+    fn smaller_cannot_hold_larger() {
+        let larger = Rectangle {
+            width: 8,
+            height: 7,
+        };
+        let smaller = Rectangle {
+            width: 5,
+            height: 1,
+        };
+
+        assert!(!smaller.can_hold(&larger));
+    }
+}
+

现在运行测试会产生:

+
$ cargo test
+   Compiling rectangle v0.1.0 (file:///projects/rectangle)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s
+     Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e)
+
+running 2 tests
+test tests::larger_can_hold_smaller ... FAILED
+test tests::smaller_cannot_hold_larger ... ok
+
+failures:
+
+---- tests::larger_can_hold_smaller stdout ----
+thread 'tests::larger_can_hold_smaller' panicked at src/lib.rs:28:9:
+assertion failed: larger.can_hold(&smaller)
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+
+failures:
+    tests::larger_can_hold_smaller
+
+test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+error: test failed, to rerun pass `--lib`
+
+

我们的测试捕获了 bug!因为 larger.length 是 8 而 smaller.length 是 5,can_hold 中的长度比较现在因为 8 不小于 5 而返回 false

+

使用 assert_eq!assert_ne! 宏来测试相等

+

测试功能的一个常用方法是将需要测试代码的值与期望值做比较,并检查是否相等。可以通过向 assert! 宏传递一个使用 == 运算符的表达式来做到。不过这个操作实在是太常见了,以至于标准库提供了一对宏来更方便的处理这些操作 —— assert_eq!assert_ne!。这两个宏分别比较两个值是相等还是不相等。当断言失败时它们也会打印出这两个值具体是什么,以便于观察测试 为什么 失败,而 assert! 只会打印出它从 == 表达式中得到了 false 值,而不是打印导致 false 的两个值。

+

示例 11-7 中,让我们编写一个对其参数加二并返回结果的函数 add_two。接着使用 assert_eq! 宏测试这个函数。

+

文件名:src/lib.rs

+
pub fn add_two(a: usize) -> usize {
+    a + 2
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn it_adds_two() {
+        let result = add_two(2);
+        assert_eq!(result, 4);
+    }
+}
+

示例 11-7:使用 assert_eq! 宏测试 add_two 函数

+

测试通过了!

+
$ cargo test
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s
+     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
+
+running 1 test
+test tests::it_adds_two ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests adder
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

我们传递给 assert_eq! 宏的第一个参数 4 ,它等于调用 add_two(2) 的结果。测试中的这一行 test tests::it_adds_two ... okok 表明测试通过!

+

在代码中引入一个 bug 来看看使用 assert_eq! 的测试失败是什么样的。修改 add_two 函数的实现使其加 3

+
pub fn add_two(a: usize) -> usize {
+    a + 3
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn it_adds_two() {
+        let result = add_two(2);
+        assert_eq!(result, 4);
+    }
+}
+

再次运行测试:

+
$ cargo test
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.61s
+     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
+
+running 1 test
+test tests::it_adds_two ... FAILED
+
+failures:
+
+---- tests::it_adds_two stdout ----
+thread 'tests::it_adds_two' panicked at src/lib.rs:12:9:
+assertion `left == right` failed
+  left: 5
+ right: 4
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+
+failures:
+    tests::it_adds_two
+
+test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+error: test failed, to rerun pass `--lib`
+
+

测试捕获到了 bug!it_adds_two 测试失败,错误信息告诉我们断言失败了,它告诉我们 assertion failed: `(left == right)` 以及 leftright 的值是什么。这个错误信息有助于我们开始调试:它说 assert_eq!left 参数是 4,而 right 参数,也就是 add_two(2) 的结果,是 5。可以想象当有很多测试在运行时这些信息是多么的有用。

+

需要注意的是,在一些语言和测试框架中,断言两个值相等的函数的参数被称为 expectedactual,而且指定参数的顺序非常重要。然而在 Rust 中,它们则叫做 leftright,同时指定期望的值和被测试代码产生的值的顺序并不重要。这个测试中的断言也可以写成 assert_eq!(add_two(2), 4),这时失败信息仍同样是 assertion failed: `(left == right)`

+

assert_ne! 宏在传递给它的两个值不相等时通过,而在相等时失败。在代码按预期运行,我们不确定值 是什么,不过能确定值绝对 不会 是什么的时候,这个宏最有用处。例如,如果一个函数保证会以某种方式改变其输出,不过这种改变方式是由运行测试时是星期几来决定的,这时最好的断言可能就是函数的输出不等于其输入。

+

assert_eq!assert_ne! 宏在底层分别使用了 ==!=。当断言失败时,这些宏会使用调试格式打印出其参数,这意味着被比较的值必须实现了 PartialEqDebug trait。所有的基本类型和大部分标准库类型都实现了这些 trait。对于自定义的结构体和枚举,需要实现 PartialEq 才能断言它们的值是否相等。需要实现 Debug 才能在断言失败时打印它们的值。因为这两个 trait 都是派生 trait,如第五章示例 5-12 所提到的,通常可以直接在结构体或枚举上添加 #[derive(PartialEq, Debug)] 注解。附录 C “可派生 trait” 中有更多关于这些和其他派生 trait 的详细信息。

+

自定义失败信息

+

你也可以向 assert!assert_eq!assert_ne! 宏传递一个可选的失败信息参数,可以在测试失败时将自定义失败信息一同打印出来。任何在 assert! 的一个必需参数和 assert_eq!assert_ne! 的两个必需参数之后指定的参数都会传递给 format! 宏(在第八章的 “使用 + 运算符或 format! 宏拼接字符串” 部分讨论过),所以可以传递一个包含 {} 占位符的格式字符串和需要放入占位符的值。自定义信息有助于记录断言的意义;当测试失败时就能更好的理解代码出了什么问题。

+

例如,比如说有一个根据人名进行问候的函数,而我们希望测试将传递给函数的人名显示在输出中:

+

文件名:src/lib.rs

+
pub fn greeting(name: &str) -> String {
+    format!("Hello {name}!")
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn greeting_contains_name() {
+        let result = greeting("Carol");
+        assert!(result.contains("Carol"));
+    }
+}
+

这个程序的需求还没有被确定,因此问候文本开头的 Hello 文本很可能会改变。然而我们并不想在需求改变时不得不更新测试,所以相比检查 greeting 函数返回的确切值,我们将仅仅断言输出的文本中包含输入参数。

+

让我们通过将 greeting 改为不包含 name 在代码中引入一个 bug 来测试失败时是怎样的:

+
pub fn greeting(name: &str) -> String {
+    String::from("Hello!")
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn greeting_contains_name() {
+        let result = greeting("Carol");
+        assert!(result.contains("Carol"));
+    }
+}
+

运行测试会产生:

+
$ cargo test
+   Compiling greeter v0.1.0 (file:///projects/greeter)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.91s
+     Running unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a)
+
+running 1 test
+test tests::greeting_contains_name ... FAILED
+
+failures:
+
+---- tests::greeting_contains_name stdout ----
+thread 'tests::greeting_contains_name' panicked at src/lib.rs:12:9:
+assertion failed: result.contains("Carol")
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+
+failures:
+    tests::greeting_contains_name
+
+test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+error: test failed, to rerun pass `--lib`
+
+

结果仅仅告诉了我们断言失败了和失败的行号。一个更有用的失败信息应该打印出 greeting 函数的值。让我们为测试函数增加一个自定义失败信息参数:带占位符的格式字符串,以及 greeting 函数的值:

+
pub fn greeting(name: &str) -> String {
+    String::from("Hello!")
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn greeting_contains_name() {
+        let result = greeting("Carol");
+        assert!(
+            result.contains("Carol"),
+            "Greeting did not contain name, value was `{result}`"
+        );
+    }
+}
+

现在如果再次运行测试,将会看到更有价值的信息:

+
$ cargo test
+   Compiling greeter v0.1.0 (file:///projects/greeter)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.93s
+     Running unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a)
+
+running 1 test
+test tests::greeting_contains_name ... FAILED
+
+failures:
+
+---- tests::greeting_contains_name stdout ----
+thread 'tests::greeting_contains_name' panicked at src/lib.rs:12:9:
+Greeting did not contain name, value was `Hello!`
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+
+failures:
+    tests::greeting_contains_name
+
+test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+error: test failed, to rerun pass `--lib`
+
+

可以在测试输出中看到所取得的确切的值,这会帮助我们理解真正发生了什么,而不是期望发生什么。

+

使用 should_panic 检查 panic

+

除了检查返回值之外,检查代码是否按照期望处理错误也是很重要的。例如,考虑第九章示例 9-10 创建的 Guess 类型。其他使用 Guess 的代码都是基于 Guess 实例仅有的值范围在 1 到 100 的前提。可以编写一个测试来确保创建一个超出范围的值的 Guess 实例会 panic。

+

可以通过对函数增加另一个属性 should_panic 来实现这些。这个属性在函数中的代码 panic 时会通过,而在其中的代码没有 panic 时失败。

+

示例 11-8 展示了一个检查 Guess::new 是否按照我们的期望出错的测试:

+

文件名:src/lib.rs

+
pub struct Guess {
+    value: i32,
+}
+
+impl Guess {
+    pub fn new(value: i32) -> Guess {
+        if value < 1 || value > 100 {
+            panic!("Guess value must be between 1 and 100, got {value}.");
+        }
+
+        Guess { value }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    #[should_panic]
+    fn greater_than_100() {
+        Guess::new(200);
+    }
+}
+

示例 11-8:测试会造成 panic! 的条件

+

#[should_panic] 属性位于 #[test] 之后,对应的测试函数之前。让我们看看测试通过时它是什么样子:

+
$ cargo test
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s
+     Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d)
+
+running 1 test
+test tests::greater_than_100 - should panic ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests guessing_game
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

看起来不错!现在在代码中引入 bug,移除 new 函数在值大于 100 时会 panic 的条件:

+
pub struct Guess {
+    value: i32,
+}
+
+// --snip--
+impl Guess {
+    pub fn new(value: i32) -> Guess {
+        if value < 1 {
+            panic!("Guess value must be between 1 and 100, got {value}.");
+        }
+
+        Guess { value }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    #[should_panic]
+    fn greater_than_100() {
+        Guess::new(200);
+    }
+}
+

如果运行示例 11-8 的测试,它会失败:

+
$ cargo test
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.62s
+     Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d)
+
+running 1 test
+test tests::greater_than_100 - should panic ... FAILED
+
+failures:
+
+---- tests::greater_than_100 stdout ----
+note: test did not panic as expected
+
+failures:
+    tests::greater_than_100
+
+test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+error: test failed, to rerun pass `--lib`
+
+

这回并没有得到非常有用的信息,不过一旦我们观察测试函数,会发现它标注了 #[should_panic]。这个错误意味着代码中测试函数 Guess::new(200) 并没有产生 panic。

+

然而 should_panic 测试结果可能会非常含糊不清。should_panic 甚至在一些不是我们期望的原因而导致 panic 时也会通过。为了使 should_panic 测试结果更精确,我们可以给 should_panic 属性增加一个可选的 expected 参数。测试工具会确保错误信息中包含其提供的文本。例如,考虑示例 11-9 中修改过的 Guess,这里 new 函数根据其值是过大还或者过小而提供不同的 panic 信息:

+

文件名:src/lib.rs

+
pub struct Guess {
+    value: i32,
+}
+
+// --snip--
+
+impl Guess {
+    pub fn new(value: i32) -> Guess {
+        if value < 1 {
+            panic!(
+                "Guess value must be greater than or equal to 1, got {value}."
+            );
+        } else if value > 100 {
+            panic!(
+                "Guess value must be less than or equal to 100, got {value}."
+            );
+        }
+
+        Guess { value }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    #[should_panic(expected = "less than or equal to 100")]
+    fn greater_than_100() {
+        Guess::new(200);
+    }
+}
+

示例 11-9:一个会带有特定错误信息的 panic! 条件的测试

+

这个测试会通过,因为 should_panic 属性中 expected 参数提供的值是 Guess::new 函数 panic 信息的子串。我们可以指定期望的整个 panic 信息,在这个例子中是 Guess value must be less than or equal to 100, got 200.expected 信息的选择取决于 panic 信息有多独特或动态,和你希望测试有多准确。在这个例子中,错误信息的子字符串足以确保函数在 else if value > 100 的情况下运行。

+

为了观察带有 expected 信息的 should_panic 测试失败时会发生什么,让我们再次引入一个 bug,将 if value < 1else if value > 100 的代码块对换:

+
pub struct Guess {
+    value: i32,
+}
+
+impl Guess {
+    pub fn new(value: i32) -> Guess {
+        if value < 1 {
+            panic!(
+                "Guess value must be less than or equal to 100, got {value}."
+            );
+        } else if value > 100 {
+            panic!(
+                "Guess value must be greater than or equal to 1, got {value}."
+            );
+        }
+
+        Guess { value }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    #[should_panic(expected = "less than or equal to 100")]
+    fn greater_than_100() {
+        Guess::new(200);
+    }
+}
+

这一次运行 should_panic 测试,它会失败:

+
$ cargo test
+   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s
+     Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d)
+
+running 1 test
+test tests::greater_than_100 - should panic ... FAILED
+
+failures:
+
+---- tests::greater_than_100 stdout ----
+thread 'tests::greater_than_100' panicked at src/lib.rs:12:13:
+Guess value must be greater than or equal to 1, got 200.
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+note: panic did not contain expected string
+      panic message: `"Guess value must be greater than or equal to 1, got 200."`,
+ expected substring: `"less than or equal to 100"`
+
+failures:
+    tests::greater_than_100
+
+test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+error: test failed, to rerun pass `--lib`
+
+

失败信息表明测试确实如期望 panic 了,不过 panic 信息中并没有包含 expected 信息 'Guess value must be less than or equal to 100'。而我们得到的 panic 信息是 'Guess value must be greater than or equal to 1, got 200.'。这样就可以开始寻找 bug 在哪了!

+

Result<T, E> 用于测试

+

目前为止,我们编写的测试在失败时都会 panic。我们也可以使用 Result<T, E> 编写测试!这是一个延伸自示例 11-1 的测试,使用 Result<T, E> 重写,并在失败时返回 Err 而非 panic:

+
pub fn add(left: usize, right: usize) -> usize {
+    left + right
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    // ANCHOR: here
+    #[test]
+    fn it_works() -> Result<(), String> {
+        let result = add(2, 2);
+
+        if result == 4 {
+            Ok(())
+        } else {
+            Err(String::from("two plus two does not equal four"))
+        }
+    }
+    // ANCHOR_END: here
+}
+

现在 it_works 函数的返回值类型为 Result<(), String>。在函数体中,不同于调用 assert_eq! 宏,而是在测试通过时返回 Ok(()),在测试失败时返回带有 StringErr

+

这样编写测试来返回 Result<T, E> 就可以在函数体中使用问号运算符,如此可以方便的编写任何运算符会返回 Err 成员的测试。

+

不能对这些使用 Result<T, E> 的测试使用 #[should_panic] 注解。为了断言一个操作返回 Err 成员,不要使用对 Result<T, E> 值使用问号表达式(?)。而是使用 assert!(value.is_err())

+

现在你知道了几种编写测试的方法,让我们看看运行测试时会发生什么,以及可以用于 cargo test 的不同选项。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch11-02-running-tests.html b/ch11-02-running-tests.html new file mode 100644 index 000000000..2db2bc48f --- /dev/null +++ b/ch11-02-running-tests.html @@ -0,0 +1,492 @@ + + + + + + 控制测试如何运行 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

控制测试如何运行

+
+

ch11-02-running-tests.md +
+commit 34314c10f699cc882d4e0b06f2a24bd37a5435f2

+
+

就像 cargo run 会编译代码并运行生成的二进制文件一样,cargo test 在测试模式下编译代码并运行生成的测试二进制文件。cargo test 产生的二进制文件的默认行为是并发运行所有的测试,并截获测试运行过程中产生的输出,阻止它们被显示出来,使得阅读测试结果相关的内容变得更容易。不过可以指定命令行参数来改变 cargo test 的默认行为。

+

可以将一部分命令行参数传递给 cargo test,而将另外一部分传递给生成的测试二进制文件。为了分隔这两种参数,需要先列出传递给 cargo test 的参数,接着是分隔符 --,再之后是传递给测试二进制文件的参数。运行 cargo test --help 会提示 cargo test 的有关参数,而运行 cargo test -- --help 可以提示在分隔符之后使用的有关参数。

+

并行或连续的运行测试

+

当运行多个测试时,Rust 默认使用线程来并行运行。这意味着测试会更快地运行完毕,所以你可以更快的得到代码能否工作的反馈。因为测试是在同时运行的,你应该确保测试不能相互依赖,或依赖任何共享的状态,包括依赖共享的环境,比如当前工作目录或者环境变量。

+

举个例子,每一个测试都运行一些代码,假设这些代码都在硬盘上创建一个 test-output.txt 文件并写入一些数据。接着每一个测试都读取文件中的数据并断言这个文件包含特定的值,而这个值在每个测试中都是不同的。因为所有测试都是同时运行的,一个测试可能会在另一个测试读写文件过程中修改了文件。那么第二个测试就会失败,并不是因为代码不正确,而是因为测试并行运行时相互干扰。一个解决方案是使每一个测试读写不同的文件;另一个解决方案是一次运行一个测试。

+

如果你不希望测试并行运行,或者想要更加精确的控制线程的数量,可以传递 --test-threads 参数和希望使用线程的数量给测试二进制文件。例如:

+
$ cargo test -- --test-threads=1
+
+

这里将测试线程设置为 1,告诉程序不要使用任何并行机制。这也会比并行运行花费更多时间,不过在有共享的状态时,测试就不会潜在的相互干扰了。

+

显示函数输出

+

默认情况下,当测试通过时,Rust 的测试库会截获打印到标准输出的所有内容。比如在测试中调用了 println! 而测试通过了,我们将不会在终端看到 println! 的输出:只会看到说明测试通过的提示行。如果测试失败了,则会看到所有标准输出和其他错误信息。

+

例如,示例 11-10 有一个无意义的函数,它打印出其参数的值并接着返回 10。接着还有一个会通过的测试和一个会失败的测试:

+

文件名:src/lib.rs

+
fn prints_and_returns_10(a: i32) -> i32 {
+    println!("I got the value {a}");
+    10
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn this_test_will_pass() {
+        let value = prints_and_returns_10(4);
+        assert_eq!(value, 10);
+    }
+
+    #[test]
+    fn this_test_will_fail() {
+        let value = prints_and_returns_10(8);
+        assert_eq!(value, 5);
+    }
+}
+

示例 11-10:一个调用了 println! 的函数的测试

+

运行 cargo test 将会看到这些测试的输出:

+
$ cargo test
+   Compiling silly-function v0.1.0 (file:///projects/silly-function)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s
+     Running unittests src/lib.rs (target/debug/deps/silly_function-160869f38cff9166)
+
+running 2 tests
+test tests::this_test_will_fail ... FAILED
+test tests::this_test_will_pass ... ok
+
+failures:
+
+---- tests::this_test_will_fail stdout ----
+I got the value 8
+thread 'tests::this_test_will_fail' panicked at src/lib.rs:19:9:
+assertion `left == right` failed
+  left: 10
+ right: 5
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+
+failures:
+    tests::this_test_will_fail
+
+test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+error: test failed, to rerun pass `--lib`
+
+

注意输出中不会出现测试通过时打印的内容,即 I got the value 4。因为当测试通过时,这些输出会被截获。失败测试的输出 I got the value 8 ,则出现在输出的测试摘要部分,同时也显示了测试失败的原因。

+

如果你希望也能看到通过的测试中打印的值,也可以在结尾加上 --show-output 告诉 Rust 显示成功测试的输出。

+
$ cargo test -- --show-output
+
+

使用 --show-output 参数再次运行示例 11-10 中的测试会显示如下输出:

+
$ cargo test -- --show-output
+   Compiling silly-function v0.1.0 (file:///projects/silly-function)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.60s
+     Running unittests src/lib.rs (target/debug/deps/silly_function-160869f38cff9166)
+
+running 2 tests
+test tests::this_test_will_fail ... FAILED
+test tests::this_test_will_pass ... ok
+
+successes:
+
+---- tests::this_test_will_pass stdout ----
+I got the value 4
+
+
+successes:
+    tests::this_test_will_pass
+
+failures:
+
+---- tests::this_test_will_fail stdout ----
+I got the value 8
+thread 'tests::this_test_will_fail' panicked at src/lib.rs:19:9:
+assertion `left == right` failed
+  left: 10
+ right: 5
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+
+failures:
+    tests::this_test_will_fail
+
+test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+error: test failed, to rerun pass `--lib`
+
+

通过指定名字来运行部分测试

+

有时运行整个测试集会耗费很长时间。如果你负责特定位置的代码,你可能会希望只运行与这些代码相关的测试。你可以向 cargo test 传递所希望运行的测试名称的参数来选择运行哪些测试。

+

为了展示如何运行部分测试,示例 11-11 为 add_two 函数创建了三个测试,我们可以选择具体运行哪一个:

+

文件名:src/lib.rs

+
pub fn add_two(a: usize) -> usize {
+    a + 2
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn add_two_and_two() {
+        let result = add_two(2);
+        assert_eq!(result, 4);
+    }
+
+    #[test]
+    fn add_three_and_two() {
+        let result = add_two(3);
+        assert_eq!(result, 5);
+    }
+
+    #[test]
+    fn one_hundred() {
+        let result = add_two(100);
+        assert_eq!(result, 102);
+    }
+}
+

示例 11-11:不同名称的三个测试

+

如果没有传递任何参数就运行测试,如你所见,所有测试都会并行运行:

+
$ cargo test
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.62s
+     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
+
+running 3 tests
+test tests::add_three_and_two ... ok
+test tests::add_two_and_two ... ok
+test tests::one_hundred ... ok
+
+test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests adder
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

运行单个测试

+

可以向 cargo test 传递任意测试的名称来只运行这个测试:

+
$ cargo test one_hundred
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.69s
+     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
+
+running 1 test
+test tests::one_hundred ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s
+
+
+

只有名称为 one_hundred 的测试被运行了;因为其余两个测试并不匹配这个名称。测试输出在摘要行的结尾显示了 2 filtered out 表明还存在比本次所运行的测试更多的测试没有被运行。

+

不能像这样指定多个测试名称;只有传递给 cargo test 的第一个值才会被使用。不过有运行多个测试的方法。

+

过滤运行多个测试

+

我们可以指定部分测试的名称,任何名称匹配这个名称的测试会被运行。例如,因为头两个测试的名称包含 add,可以通过 cargo test add 来运行这两个测试:

+
$ cargo test add
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.61s
+     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
+
+running 2 tests
+test tests::add_three_and_two ... ok
+test tests::add_two_and_two ... ok
+
+test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s
+
+
+

这运行了所有名字中带有 add 的测试,也过滤掉了名为 one_hundred 的测试。同时注意测试所在的模块也是测试名称的一部分,所以可以通过模块名来运行一个模块中的所有测试。

+

除非特别指定否则忽略某些测试

+

有时一些特定的测试执行起来是非常耗费时间的,所以在大多数运行 cargo test 的时候希望能排除它们。虽然可以通过参数列举出所有希望运行的测试来做到,也可以使用 ignore 属性来标记耗时的测试并排除它们,如下所示:

+

文件名:src/lib.rs

+
pub fn add(left: usize, right: usize) -> usize {
+    left + right
+}
+
+// ANCHOR: here
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn it_works() {
+        let result = add(2, 2);
+        assert_eq!(result, 4);
+    }
+
+    #[test]
+    #[ignore]
+    fn expensive_test() {
+        // 需要运行一个小时的代码
+    }
+}
+// ANCHOR_END: here
+

对于想要排除的测试,我们在 #[test] 之后增加了 #[ignore] 行。现在如果运行测试,就会发现 it_works 运行了,而 expensive_test 没有运行:

+
$ cargo test
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.60s
+     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
+
+running 2 tests
+test tests::expensive_test ... ignored
+test tests::it_works ... ok
+
+test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests adder
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

expensive_test 被列为 ignored,如果我们只希望运行被忽略的测试,可以使用 cargo test -- --ignored

+
$ cargo test -- --ignored
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.61s
+     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
+
+running 1 test
+test expensive_test ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s
+
+   Doc-tests adder
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

通过控制运行哪些测试,你可以确保能够快速地运行 cargo test 。当你需要运行 ignored 的测试时,可以执行 cargo test -- --ignored。如果你希望不管是否忽略都要运行全部测试,可以运行 cargo test -- --include-ignored

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch11-03-test-organization.html b/ch11-03-test-organization.html new file mode 100644 index 000000000..a25278aa6 --- /dev/null +++ b/ch11-03-test-organization.html @@ -0,0 +1,426 @@ + + + + + + 测试的组织结构 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

测试的组织结构

+
+

ch11-03-test-organization.md +
+commit 654d8902d380dbb8dd94ed2e548dfc0aa80c07cb

+
+

本章一开始就提到,测试是一个复杂的概念,而且不同的开发者也采用不同的技术和组织。Rust 社区倾向于根据测试的两个主要分类来考虑问题:单元测试unit tests)与 集成测试integration tests)。单元测试倾向于更小而更集中,在隔离的环境中一次测试一个模块,或者是测试私有接口。而集成测试对于你的库来说则完全是外部的。它们与其他外部代码一样,通过相同的方式使用你的代码,只测试公有接口而且每个测试都有可能会测试多个模块。

+

为了保证你的库能够按照你的预期运行,从独立和整体的角度编写这两类测试都是非常重要的。

+

单元测试

+

单元测试的目的是在与其他部分隔离的环境中测试每一个单元的代码,以便于快速而准确地验证某个单元的代码功能是否符合预期。单元测试与它们要测试的代码共同存放在位于 src 目录下相同的文件中。规范是在每个文件中创建包含测试函数的 tests 模块,并使用 cfg(test) 标注模块。

+

测试模块和 #[cfg(test)]

+

测试模块的 #[cfg(test)] 注解告诉 Rust 只在执行 cargo test 时才编译和运行测试代码,而在运行 cargo build 时不这么做。这在只希望构建库的时候可以节省编译时间,并且因为它们并没有包含测试,所以能减少编译产生的文件的大小。与之对应的集成测试因为位于另一个文件夹,所以它们并不需要 #[cfg(test)] 注解。然而单元测试位于与源码相同的文件中,所以你需要使用 #[cfg(test)] 来指定它们不应该被包含进编译结果中。

+

回忆本章第一部分新建的 adder 项目,Cargo 为我们生成了如下代码:

+

文件名:src/lib.rs

+
pub fn add(left: usize, right: usize) -> usize {
+    left + right
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn it_works() {
+        let result = add(2, 2);
+        assert_eq!(result, 4);
+    }
+}
+

上述代码就是自动生成的测试模块。cfg 属性代表配置configuration) ,它告诉 Rust,接下来的项,只有在给定特定配置选项时,才会被包含。在这种情况下,配置选项是 test,即 Rust 所提供的用于编译和运行测试的配置选项。通过使用 cfg 属性,Cargo 只会在我们主动使用 cargo test 运行测试时才编译测试代码。这包括测试模块中可能存在的帮助函数,以及标注为 #[test] 的函数。

+

测试私有函数

+

测试社区中一直存在关于是否应该对私有函数直接进行测试的论战,而在其他语言中想要测试私有函数是一件困难的,甚至是不可能的事。不过无论你坚持哪种测试意识形态,Rust 的私有性规则确实允许你测试私有函数。考虑示例 11-12 中带有私有函数 internal_adder 的代码:

+

文件名:src/lib.rs

+
pub fn add_two(a: usize) -> usize {
+    internal_adder(a, 2)
+}
+
+fn internal_adder(left: usize, right: usize) -> usize {
+    left + right
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn internal() {
+        let result = internal_adder(2, 2);
+        assert_eq!(result, 4);
+    }
+}
+

示例 11-12:测试私有函数

+

注意 internal_adder 函数并没有标记为 pub。测试也不过是 Rust 代码,同时 tests 也仅仅是另一个模块。正如 “路径用于引用模块树中的项” 部分所说,子模块的项可以使用其上级模块的项。在测试中,我们通过 use super::*test 模块的父模块的所有项引入了作用域,接着测试调用了 internal_adder。如果你并不认为应该测试私有函数,Rust 也不会强迫你这么做。

+

集成测试

+

在 Rust 中,集成测试对于你需要测试的库来说完全是外部的。同其他使用库的代码一样使用库文件,也就是说它们只能调用一部分库中的公有 API。集成测试的目的是测试库的多个部分能否一起正常工作。一些单独能正确运行的代码单元集成在一起也可能会出现问题,所以集成测试的覆盖率也是很重要的。为了创建集成测试,你需要先创建一个 tests 目录。

+

tests 目录

+

为了编写集成测试,需要在项目根目录创建一个 tests 目录,与 src 同级。Cargo 知道如何去寻找这个目录中的集成测试文件。接着可以随意在这个目录中创建任意多的测试文件,Cargo 会将每一个文件当作单独的 crate 来编译。

+

让我们来创建一个集成测试。保留示例 11-12 中 src/lib.rs 的代码。创建一个 tests 目录,新建一个文件 tests/integration_test.rs。目录结构应该看起来像这样:

+
adder
+├── Cargo.lock
+├── Cargo.toml
+├── src
+│   └── lib.rs
+└── tests
+    └── integration_test.rs
+
+

将示例 11-13 中的代码输入到 tests/integration_test.rs 文件中。

+

文件名:tests/integration_test.rs

+
use adder::add_two;
+
+#[test]
+fn it_adds_two() {
+    let result = add_two(2);
+    assert_eq!(result, 4);
+}
+

示例 11-13:一个 adder crate 中函数的集成测试

+

因为每一个 tests 目录中的测试文件都是完全独立的 crate,所以需要在每一个文件中导入库。为此与单元测试不同,我们需要在文件顶部添加 use adder

+

并不需要将 tests/integration_test.rs 中的任何代码标注为 #[cfg(test)]tests 文件夹在 Cargo 中是一个特殊的文件夹,Cargo 只会在运行 cargo test 时编译这个目录中的文件。现在就运行 cargo test 试试:

+
$ cargo test
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.31s
+     Running unittests src/lib.rs (target/debug/deps/adder-1082c4b063a8fbe6)
+
+running 1 test
+test tests::internal ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+     Running tests/integration_test.rs (target/debug/deps/integration_test-1082c4b063a8fbe6)
+
+running 1 test
+test it_adds_two ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests adder
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

现在有了三个部分的输出:单元测试、集成测试和文档测试。注意如果一个部分的任何测试失败,之后的部分都不会运行。例如如果一个单元测试失败,则不会有任何集成测试和文档测试的输出,因为这些测试只会在所有单元测试都通过后才会执行。

+

第一部分单元测试与我们之前见过的一样:每个单元测试一行(示例 11-12 中有一个叫做 internal 的测试),接着是一个单元测试的摘要行。

+

集成测试部分以行 Running tests/integration_test.rs开头。接下来每一行是一个集成测试中的测试函数,以及一个位于 Doc-tests adder 部分之前的集成测试的摘要行。

+

每一个集成测试文件有对应的测试结果部分,所以如果在 tests 目录中增加更多文件,测试结果中就会有更多集成测试结果部分。

+

我们仍然可以通过指定测试函数的名称作为 cargo test 的参数来运行特定集成测试。也可以使用 cargo test--test 后跟文件的名称来运行某个特定集成测试文件中的所有测试:

+
$ cargo test --test integration_test
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.64s
+     Running tests/integration_test.rs (target/debug/deps/integration_test-82e7799c1bc62298)
+
+running 1 test
+test it_adds_two ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

这个命令只运行了 tests 目录中我们指定的文件 integration_test.rs 中的测试。

+

集成测试中的子模块

+

随着集成测试的增加,你可能希望在 tests 目录创建更多文件以便更好地组织它们,例如根据测试的功能来将测试分组。如前所述,tests 目录中的每一个文件都被编译成一个单独的 crate,这有助于创建独立的作用域,以便更接近于最终用户使用你的 crate 的方式。但这意味着,tests 目录中的文件的行为,和你在第七章中学习如何将代码分为模块和文件时,学到的 src 中的文件的行为不一样。

+

当你有一些在多个集成测试文件都会用到的帮助函数,而你尝试按照第七章 “将模块移动到其他文件” 部分的步骤将它们提取到一个通用的模块中时, tests 目录中文件行为的不同就会凸显出来。例如,如果我们可以创建 一个tests/common.rs 文件并创建一个名叫 setup 的函数,我们希望这个函数能被多个测试文件的测试函数调用:

+

文件名:tests/common.rs

+
pub fn setup() {
+    // setup code specific to your library's tests would go here
+}
+

如果再次运行测试,将会在测试结果中看到一个新的对应 common.rs 文件的测试结果部分,即便这个文件并没有包含任何测试函数,也没有任何地方调用了 setup 函数:

+
$ cargo test
+   Compiling adder v0.1.0 (file:///projects/adder)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.89s
+     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
+
+running 1 test
+test tests::internal ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+     Running tests/common.rs (target/debug/deps/common-92948b65e88960b4)
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+     Running tests/integration_test.rs (target/debug/deps/integration_test-92948b65e88960b4)
+
+running 1 test
+test it_adds_two ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests adder
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

我们并不想要common 出现在测试结果中显示 running 0 tests 。我们只是希望其能被其他多个集成测试文件中调用罢了。

+

为了不让 common 出现在测试输出中,我们将创建 tests/common/mod.rs ,而不是创建 tests/common.rs 。现在项目目录结构看起来像这样:

+
├── Cargo.lock
+├── Cargo.toml
+├── src
+│   └── lib.rs
+└── tests
+    ├── common
+    │   └── mod.rs
+    └── integration_test.rs
+
+

这是一种老的命名规范,正如第七章 “另一种文件路径” 中提到的 Rust 仍然理解它们。这样命名告诉 Rust 不要将 common 看作一个集成测试文件。将 setup 函数代码移动到 tests/common/mod.rs 并删除 tests/common.rs 文件之后,测试输出中将不会出现这一部分。tests 目录中的子目录不会被作为单独的 crate 编译或作为一个测试结果部分出现在测试输出中。

+

一旦拥有了 tests/common/mod.rs,就可以将其作为模块以便在任何集成测试文件中使用。这里是一个 tests/integration_test.rs 中调用 setup 函数的 it_adds_two 测试的例子:

+

文件名:tests/integration_test.rs

+
use adder::add_two;
+
+mod common;
+
+#[test]
+fn it_adds_two() {
+    common::setup();
+
+    let result = add_two(2);
+    assert_eq!(result, 4);
+}
+

注意 mod common; 声明与示例 7-21 中展示的模块声明相同。接着在测试函数中就可以调用 common::setup() 了。

+

二进制 crate 的集成测试

+

如果项目是二进制 crate 并且只包含 src/main.rs 而没有 src/lib.rs,这样就不可能在 tests 目录创建集成测试并使用 extern crate 导入 src/main.rs 中定义的函数。只有库 crate 才会向其他 crate 暴露了可供调用和使用的函数;二进制 crate 只意在单独运行。

+

这就是许多 Rust 二进制项目使用一个简单的 src/main.rs 调用 src/lib.rs 中的逻辑的原因之一。因为通过这种结构,集成测试 就可以 通过 extern crate 测试库 crate 中的主要功能了,而如果这些重要的功能没有问题的话,src/main.rs 中的少量代码也就会正常工作且不需要测试。

+

总结

+

Rust 的测试功能提供了一个确保即使你改变了函数的实现方式,也能继续以期望的方式运行的途径。单元测试独立地验证库的不同部分,也能够测试私有函数实现细节。集成测试则检查多个部分是否能结合起来正确地工作,并像其他外部代码那样测试库的公有 API。即使 Rust 的类型系统和所有权规则可以帮助避免一些 bug,不过测试对于减少代码中不符合期望行为的逻辑 bug 仍然是很重要的。

+

让我们将本章和其他之前章节所学的知识组合起来,在下一章一起编写一个项目!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch12-00-an-io-project.html b/ch12-00-an-io-project.html new file mode 100644 index 000000000..0fa8bbdac --- /dev/null +++ b/ch12-00-an-io-project.html @@ -0,0 +1,257 @@ + + + + + + 一个 I/O 项目:构建命令行程序 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

一个 I/O 项目:构建一个命令行程序

+
+

ch12-00-an-io-project.md +
+commit 02a168ed346042f07010f8b65b4eeed623dd31d1

+
+

本章既是一个目前所学的很多技能的概括,也是一个更多标准库功能的探索。我们将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 技能。

+

Rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择,所以我们的项目将创建一个我们自己版本的经典命令行搜索工具:grep。grep 是 “Globally search a Regular Expression and Print.” 的首字母缩写。grep 最简单的使用场景是在特定文件中搜索指定字符串。为此,grep 获取一个文件路径和一个字符串作为参数,接着读取文件并找到其中包含字符串参数的行,然后打印出这些行。

+

在这个过程中,我们会展示如何让我们的命令行工具利用很多命令行工具中用到的终端功能。读取环境变量来使得用户可以配置工具的行为。打印到标准错误控制流(stderr)而不是标准输出(stdout),例如这样用户可以选择将成功输出重定向到文件中的同时仍然在屏幕上显示错误信息。

+

一位 Rust 社区的成员,Andrew Gallant,已经创建了一个功能完整且非常快速的 grep 版本,叫做 ripgrep。相比之下,我们的版本将非常简单,本章将教会你一些帮助理解像 ripgrep 这样真实项目的背景知识。

+

我们的 grep 项目将会结合之前所学的一些内容:

+ +

另外还会简要的讲到闭包、迭代器和 trait 对象,它们分别会在 第十三章第十八章 中详细介绍。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch12-01-accepting-command-line-arguments.html b/ch12-01-accepting-command-line-arguments.html new file mode 100644 index 000000000..a0f3d33ba --- /dev/null +++ b/ch12-01-accepting-command-line-arguments.html @@ -0,0 +1,315 @@ + + + + + + 接受命令行参数 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

接受命令行参数

+
+

ch12-01-accepting-command-line-arguments.md +
+commit 02a168ed346042f07010f8b65b4eeed623dd31d1

+
+

一如既往使用 cargo new 新建一个项目,我们称之为 minigrep 以便与可能已经安装在系统上的 grep 工具相区别:

+
$ cargo new minigrep
+     Created binary (application) `minigrep` project
+$ cd minigrep
+
+

第一个任务是让 minigrep 能够接受两个命令行参数:文件路径和要搜索的字符串。也就是说我们希望能够使用 cargo run、要搜索的字符串和被搜索的文件的路径来运行程序,像这样:

+
$ cargo run -- searchstring example-filename.txt
+
+

现在 cargo new 生成的程序忽略任何传递给它的参数。Crates.io 上有一些现成的库可以帮助我们接受命令行参数,不过我们正在学习这些内容,让我们自己来实现一个。

+

读取参数值

+

为了确保 minigrep 能够获取传递给它的命令行参数的值,我们需要一个 Rust 标准库提供的函数 std::env::args。这个函数返回一个传递给程序的命令行参数的 迭代器iterator)。我们会在 第十三章 全面的介绍它们。但是现在只需理解迭代器的两个细节:迭代器生成一系列的值,可以在迭代器上调用 collect 方法将其转换为一个集合,比如包含所有迭代器产生元素的 vector。

+

示例 12-1 中允许 minigrep 程序读取任何传递给它的命令行参数并将其收集到一个 vector 中。

+

文件名:src/main.rs

+
use std::env;
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+    dbg!(args);
+}
+

示例 12-1:将命令行参数收集到一个 vector 中并打印出来

+

首先使用 use 语句来将 std::env 模块引入作用域以便可以使用它的 args 函数。注意 std::env::args 函数被嵌套进了两层模块中。正如 第七章 讲到的,当所需函数嵌套了多于一层模块时,通常将父模块引入作用域,而不是其自身。这便于我们利用 std::env 中的其他函数。这比增加了 use std::env::args; 后仅仅使用 args 调用函数要更明确一些,因为 args 容易被错认成一个定义于当前模块的函数。

+
+

args 函数和无效的 Unicode

+

注意 std::env::args 在其任何参数包含无效 Unicode 字符时会 panic。如果你需要接受包含无效 Unicode 字符的参数,使用 std::env::args_os 代替。这个函数返回 OsString 值而不是 String 值。这里出于简单考虑使用了 std::env::args,因为 OsString 值每个平台都不一样而且比 String 值处理起来更为复杂。

+
+

main 函数的第一行,我们调用了 env::args,并立即使用 collect 来创建了一个包含迭代器所有值的 vector。collect 可以被用来创建很多类型的集合,所以这里显式注明 args 的类型来指定我们需要一个字符串 vector。虽然在 Rust 中我们很少会需要注明类型,然而 collect 是一个经常需要注明类型的函数,因为 Rust 不能推断出你想要什么类型的集合。

+

最后,我们使用调试宏打印出 vector。让我们尝试分别用两种方式(不包含参数和包含参数)运行代码:

+
$ cargo run
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.61s
+     Running `target/debug/minigrep`
+[src/main.rs:5:5] args = [
+    "target/debug/minigrep",
+]
+
+
$ cargo run -- needle haystack
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.57s
+     Running `target/debug/minigrep needle haystack`
+[src/main.rs:5:5] args = [
+    "target/debug/minigrep",
+    "needle",
+    "haystack",
+]
+
+

注意 vector 的第一个值是 "target/debug/minigrep",它是我们二进制文件的名称。这与 C 中的参数列表的行为相匹配,让程序使用在执行时调用它们的名称。如果要在消息中打印它或者根据用于调用程序的命令行别名更改程序的行为,通常可以方便地访问程序名称,不过考虑到本章的目的,我们将忽略它并只保存所需的两个参数。

+

将参数值保存进变量

+

目前程序可以访问指定为命令行参数的值。现在需要将这两个参数的值保存进变量这样就可以在程序的余下部分使用这些值了。让我们如示例 12-2 这样做:

+

文件名:src/main.rs

+
use std::env;
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+
+    let query = &args[1];
+    let file_path = &args[2];
+
+    println!("Searching for {query}");
+    println!("In file {file_path}");
+}
+

示例 12-2:创建变量来存放查询参数和文件路径参数

+

正如之前打印出 vector 时所所看到的,程序的名称占据了 vector 的第一个值 args[0],所以我们从索引为 1 的参数开始。minigrep 获取的第一个参数是需要搜索的字符串,所以将其将第一个参数的引用存放在变量 query 中。第二个参数将是文件路径,所以将第二个参数的引用放入变量 file_path 中。

+

我们将临时打印出这些变量的值来证明代码如我们期望的那样工作。使用参数 testsample.txt 再次运行这个程序:

+
$ cargo run -- test sample.txt
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
+     Running `target/debug/minigrep test sample.txt`
+Searching for test
+In file sample.txt
+
+

好的,它可以工作!我们将所需的参数值保存进了对应的变量中。之后会增加一些错误处理来应对类似用户没有提供参数的情况,不过现在我们将忽略它们并开始增加读取文件功能。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch12-02-reading-a-file.html b/ch12-02-reading-a-file.html new file mode 100644 index 000000000..25ffdabe1 --- /dev/null +++ b/ch12-02-reading-a-file.html @@ -0,0 +1,301 @@ + + + + + + 读取文件 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

读取文件

+
+

ch12-02-reading-a-file.md +
+commit 02a168ed346042f07010f8b65b4eeed623dd31d1

+
+

现在我们要增加读取由 file_path 命令行参数指定的文件的功能。首先,需要一个用来测试的示例文件:我们会用一个拥有多行少量文本且有一些重复单词的文件。示例 12-3 是一首艾米莉·狄金森(Emily Dickinson)的诗,它正适合这个工作!在项目根目录创建一个文件 poem.txt,并输入诗 "I'm nobody! Who are you?":

+

文件名:poem.txt

+
I'm nobody! Who are you?
+Are you nobody, too?
+Then there's a pair of us - don't tell!
+They'd banish us, you know.
+
+How dreary to be somebody!
+How public, like a frog
+To tell your name the livelong day
+To an admiring bog!
+
+

示例 12-3:艾米莉·狄金森的诗 “I’m nobody! Who are you?”,一个好的测试用例

+

创建完这个文件之后,修改 src/main.rs 并增加如示例 12-4 所示的打开文件的代码:

+

文件名:src/main.rs

+
use std::env;
+use std::fs;
+
+fn main() {
+    // --snip--
+    let args: Vec<String> = env::args().collect();
+
+    let query = &args[1];
+    let file_path = &args[2];
+
+    println!("Searching for {query}");
+    println!("In file {file_path}");
+
+    let contents = fs::read_to_string(file_path)
+        .expect("Should have been able to read the file");
+
+    println!("With text:\n{contents}");
+}
+

示例 12-4:读取第二个参数所指定的文件内容

+

首先,我们增加了一个 use 语句来引入标准库中的相关部分:我们需要 std::fs 来处理文件。

+

main 中新增了一行语句:fs::read_to_string 接受 file_path,打开文件,接着返回包含其内容的 std::io::Result<String>

+

在这些代码之后,我们再次增加了临时的 println! 打印出读取文件之后 contents 的值,这样就可以检查目前为止的程序能否工作。

+

尝试运行这些代码,随意指定一个字符串作为第一个命令行参数(因为还未实现搜索功能的部分)而将 poem.txt 文件将作为第二个参数:

+
$ cargo run -- the poem.txt
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
+     Running `target/debug/minigrep the poem.txt`
+Searching for the
+In file poem.txt
+With text:
+I'm nobody! Who are you?
+Are you nobody, too?
+Then there's a pair of us - don't tell!
+They'd banish us, you know.
+
+How dreary to be somebody!
+How public, like a frog
+To tell your name the livelong day
+To an admiring bog!
+
+
+

好的!代码读取并打印出了文件的内容。虽然它还有一些瑕疵:此时 main 函数有着多个职能,通常函数只负责一个功能的话会更简洁并易于维护。另一个问题是没有尽可能的处理错误。虽然我们的程序还很小,这些瑕疵并不是什么大问题,不过随着程序功能的丰富,将会越来越难以用简单的方法修复它们。在开发程序时,及早开始重构是一个最佳实践,因为重构少量代码时要容易的多,所以让我们现在就开始吧。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch12-03-improving-error-handling-and-modularity.html b/ch12-03-improving-error-handling-and-modularity.html new file mode 100644 index 000000000..66dac9cff --- /dev/null +++ b/ch12-03-improving-error-handling-and-modularity.html @@ -0,0 +1,807 @@ + + + + + + 重构以改进模块化与错误处理 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

重构改进模块性和错误处理

+
+

ch12-03-improving-error-handling-and-modularity.md +
+commit 83788ff212a3281328e2f8f223ce9e0f69220b97

+
+

为了改善我们的程序这里有四个问题需要修复,而且它们都与程序的组织方式和如何处理潜在错误有关。第一,main 现在进行了两个任务:它解析了参数并打开了文件。对于一个这样的小函数,这并不是一个大问题。然而如果 main 中的功能持续增加,main 函数处理的独立任务也会增加。当函数承担了更多责任,它就更难以推导,更难以测试,并且更难以在不破坏其他部分的情况下做出修改。最好能分离出功能以便每个函数就负责一个任务。

+

这同时也关系到第二个问题:queryfile_path 是程序中的配置变量,而像 contents 则用来执行程序逻辑。随着 main 函数的增长,就需要引入更多的变量到作用域中,而当作用域中有更多的变量时,将更难以追踪每个变量的目的。最好能将配置变量组织进一个结构,这样就能使它们的目的更明确了。

+

第三个问题是如果打开文件失败我们使用 expect 来打印出错误信息,不过这个错误信息只是说 Should have been able to read the file。读取文件失败的原因有多种:例如文件不存在,或者没有打开此文件的权限。目前,无论处于何种情况,我们只是打印出“文件读取出现错误”的信息,这并没有给予使用者具体的信息!

+

第四,我们不停地使用 expect 来处理不同的错误,如果用户没有指定足够的参数来运行程序,他们会从 Rust 得到 index out of bounds 错误,而这并不能明确地解释问题。如果所有的错误处理都位于一处,这样将来的维护者在需要修改错误处理逻辑时就只需要考虑这一处代码。将所有的错误处理都放在一处也有助于确保我们打印的错误信息对终端用户来说是有意义的。

+

让我们通过重构项目来解决这些问题。

+

二进制项目的关注分离

+

main 函数负责多个任务的组织问题在许多二进制项目中很常见。所以 Rust 社区开发出一类在 main 函数开始变得庞大时进行二进制程序的关注分离的指导。这些过程有如下步骤:

+
    +
  • 将程序拆分成 main.rslib.rs 并将程序的逻辑放入 lib.rs 中。
  • +
  • 当命令行解析逻辑比较小时,可以保留在 main.rs 中。
  • +
  • 当命令行解析开始变得复杂时,也同样将其从 main.rs 提取到 lib.rs 中。
  • +
+

经过这些过程之后保留在 main 函数中的责任应该被限制为:

+
    +
  • 使用参数值调用命令行解析逻辑
  • +
  • 设置任何其他的配置
  • +
  • 调用 lib.rs 中的 run 函数
  • +
  • 如果 run 返回错误,则处理这个错误
  • +
+

这个模式的一切就是为了关注分离:main.rs 处理程序运行,而 lib.rs 处理所有的真正的任务逻辑。因为不能直接测试 main 函数,这个结构通过将所有的程序逻辑移动到 lib.rs 的函数中使得我们可以测试它们。仅仅保留在 main.rs 中的代码将足够小以便阅读就可以验证其正确性。让我们遵循这些步骤来重构程序。

+

提取参数解析器

+

首先,我们将解析参数的功能提取到一个 main 将会调用的函数中,为将命令行解析逻辑移动到 src/lib.rs 中做准备。示例 12-5 中展示了新 main 函数的开头,它调用了新函数 parse_config。目前它仍将定义在 src/main.rs 中:

+

文件名:src/main.rs

+
use std::env;
+use std::fs;
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+
+    let (query, file_path) = parse_config(&args);
+
+    // --snip--
+
+    println!("Searching for {query}");
+    println!("In file {file_path}");
+
+    let contents = fs::read_to_string(file_path)
+        .expect("Should have been able to read the file");
+
+    println!("With text:\n{contents}");
+}
+
+fn parse_config(args: &[String]) -> (&str, &str) {
+    let query = &args[1];
+    let file_path = &args[2];
+
+    (query, file_path)
+}
+

示例 12-5:从 main 中提取出 parse_config 函数

+

我们仍然将命令行参数收集进一个 vector,不过不同于在 main 函数中将索引 1 的参数值赋值给变量 query 和将索引 2 的值赋值给变量 file_path,我们将整个 vector 传递给 parse_config 函数。接着 parse_config 函数将包含决定哪个参数该放入哪个变量的逻辑,并将这些值返回到 main。仍然在 main 中创建变量 queryfile_path,不过 main 不再负责处理命令行参数与变量如何对应。

+

这对重构我们这小程序可能有点大材小用,不过我们将采用小的、增量的步骤进行重构。在做出这些改变之后,再次运行程序并验证参数解析是否仍然正常。经常验证你的进展是一个好习惯,这样在遇到问题时能帮助你定位问题的成因。

+

组合配置值

+

我们可以采取另一个小的步骤来进一步改善这个函数。现在函数返回一个元组,不过立刻又将元组拆成了独立的部分。这是一个我们可能没有进行正确抽象的信号。

+

另一个表明还有改进空间的迹象是 parse_config 名称的 config 部分,它暗示了我们返回的两个值是相关的并都是一个配置值的一部分。目前除了将这两个值组合进元组之外并没有表达这个数据结构的意义:我们可以将这两个值放入一个结构体并给每个字段一个有意义的名字。这会让未来的维护者更容易理解不同的值如何相互关联以及它们的目的。

+
+

注意:一些同学将这种在复杂类型更为合适的场景下使用基本类型的反模式称为 基本类型偏执primitive obsession)。

+
+

示例 12-6 展示了 parse_config 函数的改进。

+

文件名:src/main.rs

+
use std::env;
+use std::fs;
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+
+    let config = parse_config(&args);
+
+    println!("Searching for {}", config.query);
+    println!("In file {}", config.file_path);
+
+    let contents = fs::read_to_string(config.file_path)
+        .expect("Should have been able to read the file");
+
+    // --snip--
+
+    println!("With text:\n{contents}");
+}
+
+struct Config {
+    query: String,
+    file_path: String,
+}
+
+fn parse_config(args: &[String]) -> Config {
+    let query = args[1].clone();
+    let file_path = args[2].clone();
+
+    Config { query, file_path }
+}
+

示例 12-6:重构 parse_config 返回一个 Config 结构体实例

+

新定义的结构体 Config 中包含字段 queryfile_path。 +parse_config 的签名表明它现在返回一个 Config 值。在之前的 parse_config 函数体中,我们返回了引用 argsString 值的字符串 slice,现在我们定义 Config 来包含拥有所有权的 String 值。main 中的 args 变量是参数值的所有者并只允许 parse_config 函数借用它们,这意味着如果 Config 尝试获取 args 中值的所有权将违反 Rust 的借用规则。

+

还有许多不同的方式可以处理 String 的数据,而最简单但有些不太高效的方式是调用这些值的 clone 方法。这会生成 Config 实例可以拥有的数据的完整拷贝,不过会比储存字符串数据的引用消耗更多的时间和内存。不过拷贝数据使得代码显得更加直白因为无需管理引用的生命周期,所以在这种情况下牺牲一小部分性能来换取简洁性的取舍是值得的。

+
+

使用 clone 的权衡取舍

+

由于其运行时消耗,许多 Rustacean 之间有一个趋势是倾向于避免使用 clone 来解决所有权问题。在关于迭代器的第十三章中,我们将会学习如何更有效率的处理这种情况,不过现在,复制一些字符串来取得进展是没有问题的,因为只会进行一次这样的拷贝,而且文件路径和要搜索的字符串都比较短。在第一轮编写时拥有一个可以工作但有点低效的程序要比尝试过度优化代码更好一些。随着你对 Rust 更加熟练,将能更轻松的直奔合适的方法,不过现在调用 clone 是完全可以接受的。

+
+

我们更新 mainparse_config 返回的 Config 实例放入变量 config 中,并将之前分别使用 queryfile_path 变量的代码更新为现在的使用 Config 结构体的字段的代码。

+

现在代码更明确的表现了我们的意图,queryfile_path 是相关联的并且它们的目的是配置程序如何工作。任何使用这些值的代码就知道在 config 实例中对应目的的字段名中寻找它们。

+

创建一个 Config 的构造函数

+

目前为止,我们将负责解析命令行参数的逻辑从 main 提取到了 parse_config 函数中,这有助于我们看清值 queryfile_path 是相互关联的并应该在代码中表现这种关系。接着我们增加了 Config 结构体来描述 queryfile_path 的相关性,并能够从 parse_config 函数中将这些值的名称作为结构体字段名称返回。

+

所以现在 parse_config 函数的目的是创建一个 Config 实例,我们可以将 parse_config 从一个普通函数变为一个叫做 new 的与结构体关联的函数。做出这个改变使得代码更符合习惯:可以像标准库中的 String 调用 String::new 来创建一个该类型的实例那样,将 parse_config 变为一个与 Config 关联的 new 函数。示例 12-7 展示了需要做出的修改:

+

文件名:src/main.rs

+
use std::env;
+use std::fs;
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+
+    let config = Config::new(&args);
+
+    println!("Searching for {}", config.query);
+    println!("In file {}", config.file_path);
+
+    let contents = fs::read_to_string(config.file_path)
+        .expect("Should have been able to read the file");
+
+    println!("With text:\n{contents}");
+
+    // --snip--
+}
+
+// --snip--
+
+struct Config {
+    query: String,
+    file_path: String,
+}
+
+impl Config {
+    fn new(args: &[String]) -> Config {
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Config { query, file_path }
+    }
+}
+

示例 12-7:将 parse_config 变为 Config::new

+

这里将 main 中调用 parse_config 的地方更新为调用 Config::new。我们将 parse_config 的名字改为 new 并将其移动到 impl 块中,这使得 new 函数与 Config 相关联。再次尝试编译并确保它可以工作。

+

修复错误处理

+

现在我们开始修复错误处理。回忆一下之前提到过如果 args vector 包含少于 3 个项并尝试访问 vector 中索引 1 或索引 2 的值会造成程序 panic。尝试不带任何参数运行程序;这将看起来像这样:

+
$ cargo run
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
+     Running `target/debug/minigrep`
+thread 'main' panicked at src/main.rs:27:21:
+index out of bounds: the len is 1 but the index is 1
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+

index out of bounds: the len is 1 but the index is 1 是一个针对程序员的错误信息,然而这并不能真正帮助终端用户理解发生了什么和他们应该做什么。现在就让我们修复它吧。

+

改善错误信息

+

在示例 12-8 中,在 new 函数中增加了一个检查在访问索引 12 之前检查 slice 是否足够长。如果 slice 不够长,程序会打印一个更好的错误信息并 panic:

+

文件名:src/main.rs

+
use std::env;
+use std::fs;
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+
+    let config = Config::new(&args);
+
+    println!("Searching for {}", config.query);
+    println!("In file {}", config.file_path);
+
+    let contents = fs::read_to_string(config.file_path)
+        .expect("Should have been able to read the file");
+
+    println!("With text:\n{contents}");
+}
+
+struct Config {
+    query: String,
+    file_path: String,
+}
+
+impl Config {
+    // --snip--
+    fn new(args: &[String]) -> Config {
+        if args.len() < 3 {
+            panic!("not enough arguments");
+        }
+        // --snip--
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Config { query, file_path }
+    }
+}
+

示例 12-8:增加一个参数数量检查

+

这类似于 示例 9-13 中的 Guess::new 函数,那里如果 value 参数超出了有效值的范围就调用 panic!。不同于检查值的范围,这里检查 args 的长度至少是 3,而函数的剩余部分则可以在假设这个条件成立的基础上运行。如果 args 少于 3 个项,则这个条件将为真,并调用 panic! 立即终止程序。

+

有了 new 中这几行额外的代码,再次不带任何参数运行程序并看看现在错误看起来像什么:

+
$ cargo run
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
+     Running `target/debug/minigrep`
+thread 'main' panicked at src/main.rs:26:13:
+not enough arguments
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+

这个输出就好多了,现在有了一个合理的错误信息。然而,还是有一堆额外的信息我们不希望提供给用户。所以在这里使用示例 9-9 中的技术可能不是最好的;正如 第九章 所讲到的一样,panic! 的调用更趋向于程序上的问题而不是使用上的问题。相反我们可以使用第九章学习的另一个技术 —— 返回一个可以表明成功或错误的 Result

+

new 中返回 Result 而不是调用 panic!

+

我们可以选择返回一个 Result 值,它在成功时会包含一个 Config 的实例,而在错误时会描述问题。我们还将把函数名从new改为build,因为许多程序员希望 new 函数永远不会失败。当 Config::newmain 交流时,可以使用 Result 类型来表明这里存在问题。接着修改 mainErr 成员转换为对用户更友好的错误,而不是 panic! 调用产生的关于 thread 'main'RUST_BACKTRACE 的文本。

+

示例 12-9 展示了为了返回 ResultConfig::new 的返回值和函数体中所需的改变。注意这还不能编译,直到下一个示例同时也更新了 main 之后。

+

文件名:src/main.rs

+
use std::env;
+use std::fs;
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+
+    let config = Config::new(&args);
+
+    println!("Searching for {}", config.query);
+    println!("In file {}", config.file_path);
+
+    let contents = fs::read_to_string(config.file_path)
+        .expect("Should have been able to read the file");
+
+    println!("With text:\n{contents}");
+}
+
+struct Config {
+    query: String,
+    file_path: String,
+}
+
+impl Config {
+    fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+

示例 12-9:从 Config::build 中返回 Result

+

现在 build 函数返回一个 Result,在成功时带有一个 Config 实例而在出现错误时带有一个 &'static str。回忆一下第十章 “静态生命周期” 中讲到 &'static str 是字符串字面值的类型,也是目前的错误信息。

+

build 函数体中有两处修改:当没有足够参数时不再调用 panic!,而是返回 Err 值。同时我们将 Config 返回值包装进 Ok 成员中。这些修改使得函数符合其新的类型签名。

+

通过让 Config::build 返回一个 Err 值,这就允许 main 函数处理 build 函数返回的 Result 值并在出现错误的情况更明确的结束进程。

+

调用 Config::build 并处理错误

+

为了处理错误情况并打印一个对用户友好的信息,我们需要像示例 12-10 那样更新 main 函数来处理现在 Config::build 返回的 Result。另外还需要手动实现原先由 panic!负责的工作,即以非零错误码退出命令行工具的工作。非零的退出状态是一个惯例信号,用来告诉调用程序的进程:该程序以错误状态退出了。

+

文件名:src/main.rs

+
use std::env;
+use std::fs;
+use std::process;
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+
+    let config = Config::build(&args).unwrap_or_else(|err| {
+        println!("Problem parsing arguments: {err}");
+        process::exit(1);
+    });
+
+    // --snip--
+
+    println!("Searching for {}", config.query);
+    println!("In file {}", config.file_path);
+
+    let contents = fs::read_to_string(config.file_path)
+        .expect("Should have been able to read the file");
+
+    println!("With text:\n{contents}");
+}
+
+struct Config {
+    query: String,
+    file_path: String,
+}
+
+impl Config {
+    fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+

示例 12-10:如果新建 Config 失败则使用错误码退出

+

在上面的示例中,使用了一个之前没有详细说明的方法:unwrap_or_else,它定义于标准库的 Result<T, E> 上。使用 unwrap_or_else 可以进行一些自定义的非 panic! 的错误处理。当 ResultOk 时,这个方法的行为类似于 unwrap:它返回 Ok 内部封装的值。然而,当其值是 Err 时,该方法会调用一个 闭包closure),也就是一个我们定义的作为参数传递给 unwrap_or_else 的匿名函数。第十三章 会更详细的介绍闭包。现在你需要理解的是 unwrap_or_else 会将 Err 的内部值,也就是示例 12-9 中增加的 not enough arguments 静态字符串的情况,传递给闭包中位于两道竖线间的参数 err。闭包中的代码在其运行时可以使用这个 err 值。

+

我们新增了一个 use 行来从标准库中导入 process。在错误的情况闭包中将被运行的代码只有两行:我们打印出了 err 值,接着调用了 std::process::exitprocess::exit 会立即停止程序并将传递给它的数字作为退出状态码。这类似于示例 12-8 中使用的基于 panic! 的错误处理,除了不会再得到所有的额外输出了。让我们试试:

+
$ cargo run
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s
+     Running `target/debug/minigrep`
+Problem parsing arguments: not enough arguments
+
+

非常好!现在输出对于用户来说就友好多了。

+

main 提取逻辑

+

现在我们完成了配置解析的重构:让我们转向程序的逻辑。正如 “二进制项目的关注分离” 部分所展开的讨论,我们将提取一个叫做 run 的函数来存放目前 main 函数中不属于设置配置或处理错误的所有逻辑。一旦完成这些,main 函数将简明得足以通过观察来验证,而我们将能够为所有其他逻辑编写测试。

+

示例 12-11 展示了提取出来的 run 函数。目前我们只进行小的增量式的提取函数的改进。我们仍将在 src/main.rs 中定义这个函数:

+

文件名:src/main.rs

+
use std::env;
+use std::fs;
+use std::process;
+
+fn main() {
+    // --snip--
+
+    let args: Vec<String> = env::args().collect();
+
+    let config = Config::build(&args).unwrap_or_else(|err| {
+        println!("Problem parsing arguments: {err}");
+        process::exit(1);
+    });
+
+    println!("Searching for {}", config.query);
+    println!("In file {}", config.file_path);
+
+    run(config);
+}
+
+fn run(config: Config) {
+    let contents = fs::read_to_string(config.file_path)
+        .expect("Should have been able to read the file");
+
+    println!("With text:\n{contents}");
+}
+
+// --snip--
+
+struct Config {
+    query: String,
+    file_path: String,
+}
+
+impl Config {
+    fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+

示例 12-11:提取 run 函数来包含剩余的程序逻辑

+

现在 run 函数包含了 main 中从读取文件开始的剩余的所有逻辑。run 函数获取一个 Config 实例作为参数。

+

run 函数中返回错误

+

通过将剩余的逻辑分离进 run 函数而不是留在 main 中,就可以像示例 12-9 中的 Config::build 那样改进错误处理。不再通过 expect 允许程序 panic,run 函数将会在出错时返回一个 Result<T, E>。这让我们进一步以一种对用户友好的方式统一 main 中的错误处理。示例 12-12 展示了 run 签名和函数体中的改变:

+

文件名:src/main.rs

+
use std::env;
+use std::fs;
+use std::process;
+use std::error::Error;
+
+// --snip--
+
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+
+    let config = Config::build(&args).unwrap_or_else(|err| {
+        println!("Problem parsing arguments: {err}");
+        process::exit(1);
+    });
+
+    println!("Searching for {}", config.query);
+    println!("In file {}", config.file_path);
+
+    run(config);
+}
+
+fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    println!("With text:\n{contents}");
+
+    Ok(())
+}
+
+struct Config {
+    query: String,
+    file_path: String,
+}
+
+impl Config {
+    fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+

示例 12-12:修改 run 函数返回 Result

+

这里我们做出了三个明显的修改。首先,将 run 函数的返回类型变为 Result<(), Box<dyn Error>>。之前这个函数返回 unit 类型 (),现在它仍然保持作为 Ok 时的返回值。

+

对于错误类型,使用了 trait 对象 Box<dyn Error>(在开头使用了 use 语句将 std::error::Error 引入作用域)。第十八章 会涉及 trait 对象。目前只需知道 Box<dyn Error> 意味着函数会返回实现了 Error trait 的类型,不过无需指定具体将会返回的值的类型。这提供了在不同的错误场景可能有不同类型的错误返回值的灵活性。这也就是 dyn,它是 “动态的”(“dynamic”)的缩写。

+

第二个改变是去掉了 expect 调用并替换为 第九章 讲到的 ?。不同于遇到错误就 panic!? 会从函数中返回错误值并让调用者来处理它。

+

第三个修改是现在成功时这个函数会返回一个 Ok 值。因为 run 函数签名中声明成功类型返回值是 (),这意味着需要将 unit 类型值包装进 Ok 值中。Ok(()) 一开始看起来有点奇怪,不过这样使用 () 是惯用的做法,表明调用 run 函数只是为了它的副作用;函数并没有返回什么有意义的值。

+

上述代码能够编译,不过会有一个警告:

+
$ cargo run -- the poem.txt
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+warning: unused `Result` that must be used
+  --> src/main.rs:19:5
+   |
+19 |     run(config);
+   |     ^^^^^^^^^^^
+   |
+   = note: this `Result` may be an `Err` variant, which should be handled
+   = note: `#[warn(unused_must_use)]` on by default
+help: use `let _ = ...` to ignore the resulting value
+   |
+19 |     let _ = run(config);
+   |     +++++++
+
+warning: `minigrep` (bin "minigrep") generated 1 warning
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.71s
+     Running `target/debug/minigrep the poem.txt`
+Searching for the
+In file poem.txt
+With text:
+I'm nobody! Who are you?
+Are you nobody, too?
+Then there's a pair of us - don't tell!
+They'd banish us, you know.
+
+How dreary to be somebody!
+How public, like a frog
+To tell your name the livelong day
+To an admiring bog!
+
+
+

Rust 提示我们的代码忽略了 Result 值,它可能表明这里存在一个错误。但我们却没有检查这里是否有一个错误,而编译器提醒我们这里应该有一些错误处理代码!现在就让我们修正这个问题。

+

处理 mainrun 返回的错误

+

我们将检查错误并使用类似示例 12-10 中 Config::build 处理错误的技术来处理它们,不过有一些细微的不同:

+

文件名:src/main.rs

+
use std::env;
+use std::error::Error;
+use std::fs;
+use std::process;
+
+fn main() {
+    // --snip--
+
+    let args: Vec<String> = env::args().collect();
+
+    let config = Config::build(&args).unwrap_or_else(|err| {
+        println!("Problem parsing arguments: {err}");
+        process::exit(1);
+    });
+
+    println!("Searching for {}", config.query);
+    println!("In file {}", config.file_path);
+
+    if let Err(e) = run(config) {
+        println!("Application error: {e}");
+        process::exit(1);
+    }
+}
+
+fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    println!("With text:\n{contents}");
+
+    Ok(())
+}
+
+struct Config {
+    query: String,
+    file_path: String,
+}
+
+impl Config {
+    fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+

我们使用 if let 来检查 run 是否返回一个 Err 值,不同于 unwrap_or_else,并在出错时调用 process::exit(1)run 并不返回像 Config::build 返回的 Config 实例那样需要 unwrap 的值。因为 run 在成功时返回 (),而我们只关心检测错误,所以并不需要 unwrap_or_else 来返回未封装的值,因为它只会是 ()

+

不过两个例子中 if letunwrap_or_else 的函数体都一样:打印出错误并退出。

+

将代码拆分到库 crate

+

现在我们的 minigrep 项目看起来好多了!现在我们将要拆分 src/main.rs 并将一些代码放入 src/lib.rs,这样就能测试它们并拥有一个含有更少功能的 main 函数。

+

让我们将所有不是 main 函数的代码从 src/main.rs 移动到新文件 src/lib.rs 中:

+
    +
  • run 函数定义
  • +
  • 相关的 use 语句
  • +
  • Config 的定义
  • +
  • Config::build 函数定义
  • +
+

现在 src/lib.rs 的内容应该看起来像示例 12-13(为了简洁省略了函数体)。注意直到下一个示例修改完 src/main.rs 之后,代码还不能编译:

+

文件名:src/lib.rs

+
use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        // --snip--
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    // --snip--
+    let contents = fs::read_to_string(config.file_path)?;
+
+    println!("With text:\n{contents}");
+
+    Ok(())
+}
+

示例 12-13:将 Configrun 移动到 src/lib.rs

+

这里使用了公有的 pub 关键字:在 Config、其字段和其 build 方法,以及 run 函数上。现在我们有了一个拥有可以测试的公有 API 的库 crate 了。

+

现在需要在 src/main.rs 中将移动到 src/lib.rs 的代码引入二进制 crate 的作用域中,如示例 12-14 所示:

+

文件名:src/main.rs

+
use std::env;
+use std::process;
+
+use minigrep::Config;
+
+fn main() {
+    // --snip--
+    let args: Vec<String> = env::args().collect();
+
+    let config = Config::build(&args).unwrap_or_else(|err| {
+        println!("Problem parsing arguments: {err}");
+        process::exit(1);
+    });
+
+    println!("Searching for {}", config.query);
+    println!("In file {}", config.file_path);
+
+    if let Err(e) = minigrep::run(config) {
+        // --snip--
+        println!("Application error: {e}");
+        process::exit(1);
+    }
+}
+

示例 12-14:将 minigrep crate 引入 src/main.rs 的作用域中

+

我们添加了一行 use minigrep::Config,它将 Config 类型引入作用域,并使用 crate 名称作为 run 函数的前缀。通过这些重构,所有功能应该能够联系在一起并运行了。运行 cargo run 来确保一切都正确的衔接在一起。

+

哇哦!我们做了大量的工作,不过我们为将来的成功打下了基础。现在处理错误将更容易,同时代码也更加模块化。从现在开始几乎所有的工作都将在 src/lib.rs 中进行。

+

让我们利用这些新创建的模块的优势来进行一些在旧代码中难以展开的工作,这些工作在新代码中非常容易实现,那就是:编写测试!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch12-04-testing-the-librarys-functionality.html b/ch12-04-testing-the-librarys-functionality.html new file mode 100644 index 000000000..e995cc855 --- /dev/null +++ b/ch12-04-testing-the-librarys-functionality.html @@ -0,0 +1,686 @@ + + + + + + 采用测试驱动开发完善库的功能 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

采用测试驱动开发完善库的功能

+
+

ch12-04-testing-the-librarys-functionality.md +
+commit 8fd2327e4135876b368cc2793eb4a7e455b691f0

+
+

现在我们将逻辑提取到了 src/lib.rs 并将所有的参数解析和错误处理留在了 src/main.rs 中,为代码的核心功能编写测试将更加容易。我们可以直接使用多种参数调用函数并检查返回值而无需从命令行运行二进制文件了。

+

在这一部分,我们将遵循测试驱动开发(Test Driven Development, TDD)的模式来逐步增加 minigrep 的搜索逻辑。它遵循如下步骤:

+
    +
  1. 编写一个失败的测试,并运行它以确保它失败的原因是你所期望的。
  2. +
  3. 编写或修改足够的代码来使新的测试通过。
  4. +
  5. 重构刚刚增加或修改的代码,并确保测试仍然能通过。
  6. +
  7. 从步骤 1 开始重复!
  8. +
+

虽然这只是众多编写软件的方法之一,不过 TDD 有助于驱动代码的设计。在编写能使测试通过的代码之前编写测试有助于在开发过程中保持高测试覆盖率。

+

我们将测试驱动实现实际在文件内容中搜索查询字符串并返回匹配的行示例的功能。我们将在一个叫做 search 的函数中增加这些功能。

+

编写失败测试

+

去掉 src/lib.rssrc/main.rs 中用于检查程序行为的 println! 语句,因为不再真正需要它们了。接着我们会像 第十一章 那样增加一个 test 模块和一个测试函数。测试函数指定了 search 函数期望拥有的行为:它会获取一个需要查询的字符串和用来查询的文本,并只会返回包含请求的文本行。示例 12-15 展示了这个测试,它还不能编译:

+

文件名:src/lib.rs

+
use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    Ok(())
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn one_result() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+}
+

示例 12-15:创建一个我们期望的 search 函数的失败测试

+

这里选择使用 "duct" 作为这个测试中需要搜索的字符串。用来搜索的文本有三行,其中只有一行包含 "duct"。(注意双引号之后的反斜杠,这告诉 Rust 不要在字符串字面值内容的开头加入换行符)我们断言 search 函数的返回值只包含期望的那一行。

+

我们还不能运行这个测试并看到它失败,因为它甚至都还不能编译:search 函数还不存在呢!根据 TDD 的原则,我们将增加足够的代码来使其能够编译:一个总是会返回空 vector 的 search 函数定义,如示例 12-16 所示。然后这个测试应该能够编译并因为空 vector 并不匹配一个包含一行 "safe, fast, productive." 的 vector 而失败。

+

文件名:src/lib.rs

+
use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    vec![]
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn one_result() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+}
+

示例 12-16:刚好足够使测试通过编译的 search 函数定义

+

注意需要在 search 的签名中定义一个显式生命周期 'a 并用于 contents 参数和返回值。回忆一下 第十章 中讲到生命周期参数指定哪个参数的生命周期与返回值的生命周期相关联。在这个例子中,我们表明返回的 vector 中应该包含引用参数 contents(而不是参数query)slice 的字符串 slice。

+

换句话说,我们告诉 Rust 函数 search 返回的数据将与 search 函数中的参数 contents 的数据存在的一样久。这是非常重要的!为了使这个引用有效那么 slice 引用的数据也需要保持有效;如果编译器认为我们是在创建 query 而不是 contents 的字符串 slice,那么安全检查将是不正确的。

+

如果尝试不用生命周期编译的话,我们将得到如下错误:

+
$ cargo build
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+error[E0106]: missing lifetime specifier
+  --> src/lib.rs:28:51
+   |
+28 | pub fn search(query: &str, contents: &str) -> Vec<&str> {
+   |                      ----            ----         ^ expected named lifetime parameter
+   |
+   = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `query` or `contents`
+help: consider introducing a named lifetime parameter
+   |
+28 | pub fn search<'a>(query: &'a str, contents: &'a str) -> Vec<&'a str> {
+   |              ++++         ++                 ++              ++
+
+For more information about this error, try `rustc --explain E0106`.
+error: could not compile `minigrep` (lib) due to 1 previous error
+
+

Rust 不可能知道我们需要的是哪一个参数,所以需要告诉它。因为参数 contents 包含了所有的文本而且我们希望返回匹配的那部分文本,所以我们知道 contents 是应该要使用生命周期语法来与返回值相关联的参数。

+

其他语言中并不需要你在函数签名中将参数与返回值相关联。所以这么做可能仍然感觉有些陌生,随着时间的推移这将会变得越来越容易。你可能想要将这个例子与第十章中 “生命周期确保引用有效” 部分做对比。

+

现在运行测试:

+
$ cargo test
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.97s
+     Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94)
+
+running 1 test
+test tests::one_result ... FAILED
+
+failures:
+
+---- tests::one_result stdout ----
+thread 'tests::one_result' panicked at src/lib.rs:44:9:
+assertion `left == right` failed
+  left: ["safe, fast, productive."]
+ right: []
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+
+failures:
+    tests::one_result
+
+test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+error: test failed, to rerun pass `--lib`
+
+

好的,测试失败了,这正是我们所期望的。修改代码来让测试通过吧!

+

编写使测试通过的代码

+

目前测试之所以会失败是因为我们总是返回一个空的 vector。为了修复并实现 search,我们的程序需要遵循如下步骤:

+
    +
  • 遍历内容的每一行文本。
  • +
  • 查看这一行是否包含要搜索的字符串。
  • +
  • 如果有,将这一行加入列表返回值中。
  • +
  • 如果没有,什么也不做。
  • +
  • 返回匹配到的结果列表
  • +
+

让我们一步一步的来,从遍历每行开始。

+

使用 lines 方法遍历每一行

+

Rust 有一个有助于一行一行遍历字符串的方法,出于方便它被命名为 lines,它如示例 12-17 这样工作。注意这还不能编译:

+

文件名:src/lib.rs

+
use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    for line in contents.lines() {
+        // do something with line
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn one_result() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+}
+

示例 12-17:遍历 contents 的每一行

+

lines 方法返回一个迭代器。第十三章 会深入了解迭代器,不过我们已经在 示例 3-5 中见过使用迭代器的方法了,在那里使用了一个 for 循环和迭代器在一个集合的每一项上运行了一些代码。

+

用查询字符串搜索每一行

+

接下来将会增加检查当前行是否包含查询字符串的功能。幸运的是,字符串类型为此也有一个叫做 contains 的实用方法!如示例 12-18 所示在 search 函数中加入 contains 方法调用。注意这仍然不能编译:

+

文件名:src/lib.rs

+
use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    for line in contents.lines() {
+        if line.contains(query) {
+            // 对文本行进行操作
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn one_result() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+}
+

示例 12-18:增加检查文本行是否包含 query 中字符串的功能

+

存储匹配的行

+

为了完成这个函数,我们还需要一个方法来存储包含查询字符串的行。为此可以在 for 循环之前创建一个可变的 vector 并调用 push 方法在 vector 中存放一个 line。在 for 循环之后,返回这个 vector,如示例 12-19 所示:

+

文件名:src/lib.rs

+
use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.contains(query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn one_result() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+}
+

示例 12-19:储存匹配的行以便可以返回它们

+

现在 search 函数应该返回只包含 query 的那些行,而测试应该会通过。让我们运行测试:

+
$ cargo test
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.22s
+     Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94)
+
+running 1 test
+test tests::one_result ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+     Running unittests src/main.rs (target/debug/deps/minigrep-9cd200e5fac0fc94)
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests minigrep
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

测试通过了,它可以工作了!

+

现在正是可以考虑重构的时机,在保证测试通过,保持功能不变的前提下重构 search 函数。search 函数中的代码并不坏,不过并没有利用迭代器的一些实用功能。第十三章将回到这个例子并深入探索迭代器并看看如何改进代码。

+

run 函数中使用 search 函数

+

现在 search 函数是可以工作并测试通过了的,我们需要实际在 run 函数中调用 search。需要将 config.query 值和 run 从文件中读取的 contents 传递给 search 函数。接着 run 会打印出 search 返回的每一行:

+

文件名:src/lib.rs

+
use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    for line in search(&config.query, &contents) {
+        println!("{line}");
+    }
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.contains(query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn one_result() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+}
+

这里仍然使用了 for 循环获取了 search 返回的每一行并打印出来。

+

现在整个程序应该可以工作了!让我们试一试,首先使用一个只会在艾米莉·狄金森的诗中返回一行的单词 “frog”:

+
$ cargo run -- frog poem.txt
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.38s
+     Running `target/debug/minigrep frog poem.txt`
+How public, like a frog
+
+

好的!现在试试一个会匹配多行的单词,比如 “body”:

+
$ cargo run -- body poem.txt
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
+     Running `target/debug/minigrep body poem.txt`
+I'm nobody! Who are you?
+Are you nobody, too?
+How dreary to be somebody!
+
+

最后,让我们确保搜索一个在诗中哪里都没有的单词时不会得到任何行,比如 "monomorphization":

+
$ cargo run -- monomorphization poem.txt
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
+     Running `target/debug/minigrep monomorphization poem.txt`
+
+

非常好!我们创建了一个属于自己的迷你版经典工具,并学习了很多如何组织程序的知识。我们还学习了一些文件输入输出、生命周期、测试和命令行解析的内容。

+

为了使这个项目更丰满,我们将简要的展示如何处理环境变量和打印到标准错误,这两者在编写命令行程序时都很有用。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch12-05-working-with-environment-variables.html b/ch12-05-working-with-environment-variables.html new file mode 100644 index 000000000..21ae840d8 --- /dev/null +++ b/ch12-05-working-with-environment-variables.html @@ -0,0 +1,784 @@ + + + + + + 处理环境变量 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

处理环境变量

+
+

ch12-05-working-with-environment-variables.md +
+commit 9c0fa2714859738ff73cbbb829592e4c037d7e46

+
+

我们将增加一个额外的功能来改进 minigrep:用户可以通过设置环境变量来设置搜索是否是大小写敏感的。当然,我们也可以将其设计为一个命令行参数并要求用户每次需要时都加上它,不过在这里我们将使用环境变量。这允许用户设置环境变量一次之后在整个终端会话中所有的搜索都将是大小写不敏感的。

+

编写一个大小写不敏感 search 函数的失败测试

+

首先我们希望增加一个新函数 search_case_insensitive,并将会在环境变量有值时调用它。这里将继续遵循 TDD 过程,其第一步是再次编写一个失败测试。我们将为新的大小写不敏感搜索函数新增一个测试函数,并将老的测试函数从 one_result 改名为 case_sensitive 来更清楚的表明这两个测试的区别,如示例 12-20 所示:

+

文件名:src/lib.rs

+
use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    for line in search(&config.query, &contents) {
+        println!("{line}");
+    }
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.contains(query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn case_sensitive() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Duct tape.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+
+    #[test]
+    fn case_insensitive() {
+        let query = "rUsT";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Trust me.";
+
+        assert_eq!(
+            vec!["Rust:", "Trust me."],
+            search_case_insensitive(query, contents)
+        );
+    }
+}
+

示例 12-20:为准备添加的大小写不敏感函数新增失败测试

+

注意我们也改变了老测试中 contents 的值。还新增了一个含有文本 "Duct tape." 的行,它有一个大写的 D,这在大小写敏感搜索时不应该匹配 "duct"。我们修改这个测试以确保不会意外破坏已经实现的大小写敏感搜索功能;这个测试现在应该能通过并在处理大小写不敏感搜索时应该能一直通过。

+

大小写 不敏感 搜索的新测试使用 "rUsT" 作为其查询字符串。在我们将要增加的 search_case_insensitive 函数中,"rUsT" 查询应该包含带有一个大写 R 的 "Rust:" 还有 "Trust me." 这两行,即便它们与查询的大小写都不同。这个测试现在不能编译,因为还没有定义 search_case_insensitive 函数。请随意增加一个总是返回空 vector 的骨架实现,正如示例 12-16 中 search 函数为了使测试通过编译并失败时所做的那样。

+

实现 search_case_insensitive 函数

+

search_case_insensitive 函数,如示例 12-21 所示,将与 search 函数基本相同。唯一的区别是它会将 query 变量和每一 line 都变为小写,这样不管输入参数是大写还是小写,在检查该行是否包含查询字符串时都会是小写。

+

文件名:src/lib.rs

+
use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    for line in search(&config.query, &contents) {
+        println!("{line}");
+    }
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.contains(query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+pub fn search_case_insensitive<'a>(
+    query: &str,
+    contents: &'a str,
+) -> Vec<&'a str> {
+    let query = query.to_lowercase();
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.to_lowercase().contains(&query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn case_sensitive() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Duct tape.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+
+    #[test]
+    fn case_insensitive() {
+        let query = "rUsT";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Trust me.";
+
+        assert_eq!(
+            vec!["Rust:", "Trust me."],
+            search_case_insensitive(query, contents)
+        );
+    }
+}
+

示例 12-21:定义 search_case_insensitive 函数,它在比较查询和每一行之前将它们都转换为小写

+

首先我们将 query 字符串转换为小写,并将其覆盖到同名的变量中。对查询字符串调用 to_lowercase 是必需的,这样不管用户的查询是 "rust""RUST""Rust" 或者 "rUsT",我们都将其当作 "rust" 处理并对大小写不敏感。虽然 to_lowercase 可以处理基本的 Unicode,但它不是 100% 准确。如果编写真实的程序的话,我们还需多做一些工作,不过这一部分是关于环境变量而不是 Unicode 的,所以这样就够了。

+

注意 query 现在是一个 String 而不是字符串 slice,因为调用 to_lowercase 是在创建新数据,而不是引用现有数据。如果查询字符串是 "rUsT",这个字符串 slice 并不包含可供我们使用的小写的 ut,所以必需分配一个包含 "rust" 的新 String。现在当我们将 query 作为一个参数传递给 contains 方法时,需要增加一个 & 因为 contains 的签名被定义为获取一个字符串 slice。

+

接下来我们对每一 line 都调用 to_lowercase 将其转为小写。现在我们将 linequery 都转换成了小写,这样就可以不管查询的大小写进行匹配了。

+

让我们看看这个实现能否通过测试:

+
$ cargo test
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.33s
+     Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94)
+
+running 2 tests
+test tests::case_insensitive ... ok
+test tests::case_sensitive ... ok
+
+test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+     Running unittests src/main.rs (target/debug/deps/minigrep-9cd200e5fac0fc94)
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests minigrep
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+

好的!现在,让我们在 run 函数中实际调用新 search_case_insensitive 函数。首先,我们将在 Config 结构体中增加一个配置项来切换大小写敏感和大小写不敏感搜索。增加这些字段会导致编译错误,因为我们还没有在任何地方初始化这些字段:

+

文件名:src/lib.rs

+
use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+    pub ignore_case: bool,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    let results = if config.ignore_case {
+        search_case_insensitive(&config.query, &contents)
+    } else {
+        search(&config.query, &contents)
+    };
+
+    for line in results {
+        println!("{line}");
+    }
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.contains(query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+pub fn search_case_insensitive<'a>(
+    query: &str,
+    contents: &'a str,
+) -> Vec<&'a str> {
+    let query = query.to_lowercase();
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.to_lowercase().contains(&query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn case_sensitive() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Duct tape.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+
+    #[test]
+    fn case_insensitive() {
+        let query = "rUsT";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Trust me.";
+
+        assert_eq!(
+            vec!["Rust:", "Trust me."],
+            search_case_insensitive(query, contents)
+        );
+    }
+}
+

这里增加了 ignore_case 字符来存放一个布尔值。接着我们需要 run 函数检查 case_sensitive 字段的值并使用它来决定是否调用 search 函数或 search_case_insensitive 函数,如示例 12-22 所示。注意这还不能编译:

+

文件名:src/lib.rs

+
use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+    pub ignore_case: bool,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    let results = if config.ignore_case {
+        search_case_insensitive(&config.query, &contents)
+    } else {
+        search(&config.query, &contents)
+    };
+
+    for line in results {
+        println!("{line}");
+    }
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.contains(query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+pub fn search_case_insensitive<'a>(
+    query: &str,
+    contents: &'a str,
+) -> Vec<&'a str> {
+    let query = query.to_lowercase();
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.to_lowercase().contains(&query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn case_sensitive() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Duct tape.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+
+    #[test]
+    fn case_insensitive() {
+        let query = "rUsT";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Trust me.";
+
+        assert_eq!(
+            vec!["Rust:", "Trust me."],
+            search_case_insensitive(query, contents)
+        );
+    }
+}
+

示例 12-22:根据 config.ignore_case 的值调用 searchsearch_case_insensitive

+

最后需要实际检查环境变量。处理环境变量的函数位于标准库的 env 模块中,所以我们需要在 src/lib.rs 的开头将这个模块引入作用域中。接着使用 env 模块的 var 方法来检查一个叫做 IGNORE_CASE 的环境变量,如示例 12-23 所示:

+

文件名:src/lib.rs

+
use std::env;
+// --snip--
+
+use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+    pub ignore_case: bool,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        let ignore_case = env::var("IGNORE_CASE").is_ok();
+
+        Ok(Config {
+            query,
+            file_path,
+            ignore_case,
+        })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    let results = if config.ignore_case {
+        search_case_insensitive(&config.query, &contents)
+    } else {
+        search(&config.query, &contents)
+    };
+
+    for line in results {
+        println!("{line}");
+    }
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.contains(query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+pub fn search_case_insensitive<'a>(
+    query: &str,
+    contents: &'a str,
+) -> Vec<&'a str> {
+    let query = query.to_lowercase();
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.to_lowercase().contains(&query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn case_sensitive() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Duct tape.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+
+    #[test]
+    fn case_insensitive() {
+        let query = "rUsT";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Trust me.";
+
+        assert_eq!(
+            vec!["Rust:", "Trust me."],
+            search_case_insensitive(query, contents)
+        );
+    }
+}
+

示例 12-23:检查叫做 IGNORE_CASE 的环境变量

+

这里创建了一个新变量 ignore_case。为了设置它的值,需要调用 env::var 函数并传递我们需要寻找的环境变量名称,IGNORE_CASEenv::var 返回一个 Result,它在环境变量被设置时返回包含其值的 Ok 成员,并在环境变量未被设置时返回 Err 成员。

+

我们使用 Resultis_ok 方法来检查环境变量是否被设置,这也就意味着我们 需要 进行一个大小写不敏感的搜索。如果IGNORE_CASE 环境变量没有被设置为任何值,is_ok 会返回 false 并将进行大小写敏感的搜索。我们并不关心环境变量所设置的 ,只关心它是否被设置了,所以检查 is_ok 而不是 unwrapexpect 或任何我们已经见过的 Result 的方法。

+

我们将变量 ignore_case 的值传递给 Config 实例,这样 run 函数可以读取其值并决定是否调用 search 或者示例 12-22 中实现的 search_case_insensitive

+

让我们试一试吧!首先不设置环境变量并使用查询 to 运行程序,这应该会匹配任何全小写的单词 “to” 的行:

+
$ cargo run -- to poem.txt
+   Compiling minigrep v0.1.0 (file:///projects/minigrep)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
+     Running `target/debug/minigrep to poem.txt`
+Are you nobody, too?
+How dreary to be somebody!
+
+

看起来程序仍然能够工作!现在将 IGNORE_CASE 设置为 1 并仍使用相同的查询 to

+
$ IGNORE_CASE=1 cargo run to poem.txt
+
+

如果你使用 PowerShell,则需要用两个命令来分别设置环境变量并运行程序:

+
PS> $Env:IGNORE_CASE=1; cargo run to poem.txt
+
+

而这会让 IGNORE_CASE 的效果在当前 shell 会话中持续生效。可以通过 Remove-Item 命令来取消设置:

+
PS> Remove-Item Env:IGNORE_CASE
+
+

这回应该得到包含可能有大写字母的 “to” 的行:

+
Are you nobody, too?
+How dreary to be somebody!
+To tell your name the livelong day
+To an admiring bog!
+
+

好极了,我们也得到了包含 “To” 的行!现在 minigrep 程序可以通过环境变量控制进行大小写不敏感搜索了。现在你知道了如何管理由命令行参数或环境变量设置的选项了!

+

一些程序允许对相同配置同时使用参数 环境变量。在这种情况下,程序来决定参数和环境变量的优先级。作为一个留给你的测试,尝试通过一个命令行参数或一个环境变量来控制大小写敏感搜索。并在运行程序时遇到矛盾值时决定命令行参数和环境变量的优先级。

+

std::env 模块还包含了更多处理环境变量的实用功能;请查看官方文档来了解其可用的功能。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch12-06-writing-to-stderr-instead-of-stdout.html b/ch12-06-writing-to-stderr-instead-of-stdout.html new file mode 100644 index 000000000..f59846f12 --- /dev/null +++ b/ch12-06-writing-to-stderr-instead-of-stdout.html @@ -0,0 +1,295 @@ + + + + + + 将错误信息输出到标准错误而不是标准输出 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

将错误信息输出到标准错误而不是标准输出

+
+

ch12-06-writing-to-stderr-instead-of-stdout.md +
+commit 02a168ed346042f07010f8b65b4eeed623dd31d1

+
+

目前为止,我们将所有的输出都通过 println! 写到了终端。大部分终端都提供了两种输出:标准输出standard outputstdout)对应一般信息,标准错误standard errorstderr)则用于错误信息。这种区别允许用户选择将程序正常输出定向到一个文件中并仍将错误信息打印到屏幕上。

+

但是 println! 宏只能够打印到标准输出,所以我们必须使用其他方法来打印到标准错误。

+

检查错误应该写入何处

+

首先,让我们观察一下目前 minigrep 打印的所有内容是如何被写入标准输出的,包括那些应该被写入标准错误的错误信息。可以通过将标准输出流重定向到一个文件同时有意产生一个错误来做到这一点。我们没有重定向标准错误流,所以任何发送到标准错误的内容将会继续显示在屏幕上。

+

命令行程序被期望将错误信息发送到标准错误流,这样即便选择将标准输出流重定向到文件中时仍然能看到错误信息。目前我们的程序并不符合期望;相反我们将看到它将错误信息输出保存到了文件中!

+

我们通过 > 和文件路径 output.txt 来运行程序,我们期望重定向标准输出流到该文件中。在这里,我们没有传递任何参数,所以会产生一个错误:

+
$ cargo run > output.txt
+
+

> 语法告诉 shell 将标准输出的内容写入到 output.txt 文件中而不是屏幕上。我们并没有看到期望的错误信息打印到屏幕上,所以这意味着它一定被写入了文件中。如下是 output.txt 所包含的:

+
Problem parsing arguments: not enough arguments
+
+

是的,错误信息被打印到了标准输出中。像这样的错误信息被打印到标准错误中将会有用得多,将使得只有成功运行所产生的输出才会写入文件。我们接下来就修改。

+

将错误打印到标准错误

+

让我们如示例 12-24 所示的代码改变错误信息是如何被打印的。得益于本章早些时候的重构,所有打印错误信息的代码都位于 main 一个函数中。标准库提供了 eprintln! 宏来打印到标准错误流,所以将两个调用 println! 打印错误信息的位置替换为 eprintln!

+

文件名:src/main.rs

+
use std::env;
+use std::process;
+
+use minigrep::Config;
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+
+    let config = Config::build(&args).unwrap_or_else(|err| {
+        eprintln!("Problem parsing arguments: {err}");
+        process::exit(1);
+    });
+
+    if let Err(e) = minigrep::run(config) {
+        eprintln!("Application error: {e}");
+        process::exit(1);
+    }
+}
+

示例 12-24:使用 eprintln! 将错误信息写入标准错误而不是标准输出

+

现在我们再次尝试用同样的方式运行程序,不使用任何参数并通过 > 重定向标准输出:

+
$ cargo run > output.txt
+Problem parsing arguments: not enough arguments
+
+

现在我们看到了屏幕上的错误信息,同时 output.txt 里什么也没有,这正是命令行程序所期望的行为。

+

如果使用不会造成错误的参数再次运行程序,不过仍然将标准输出重定向到一个文件,像这样:

+
$ cargo run -- to poem.txt > output.txt
+
+

我们并不会在终端看到任何输出,同时 output.txt 将会包含其结果:

+

文件名:output.txt

+
Are you nobody, too?
+How dreary to be somebody!
+
+

这一部分展示了现在我们适当的使用了成功时产生的标准输出和错误时产生的标准错误。

+

总结

+

在这一章中,我们回顾了目前为止的一些主要章节并涉及了如何在 Rust 环境中进行常规的 I/O 操作。通过使用命令行参数、文件、环境变量和打印错误的 eprintln! 宏,现在你已经准备好编写命令行程序了。通过结合前几章的知识,你的代码将会是组织良好的,并能有效的将数据存储到合适的数据结构中、更好的处理错误,并且还是经过良好测试的。

+

接下来,让我们探索一些 Rust 中受函数式编程语言影响的功能:闭包和迭代器。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch13-00-functional-features.html b/ch13-00-functional-features.html new file mode 100644 index 000000000..8966be607 --- /dev/null +++ b/ch13-00-functional-features.html @@ -0,0 +1,254 @@ + + + + + + Rust 中的函数式语言功能:迭代器与闭包 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Rust 中的函数式语言功能:迭代器与闭包

+
+

ch13-00-functional-features.md +
+commit daa268a0cd04ef76a8067a26ed7d28ec2a9336d3

+
+

Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是 函数式编程functional programming)。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。

+

本章我们不会讨论函数式编程是或不是什么的问题,而是展示 Rust 的一些在功能上与其他被认为是函数式语言类似的特性。

+

更具体的,我们将要涉及:

+
    +
  • 闭包Closures),一个可以储存在变量里的类似函数的结构
  • +
  • 迭代器Iterators),一种处理元素序列的方式
  • +
  • 如何使用闭包和迭代器来改进第十二章的 I/O 项目。
  • +
  • 闭包和迭代器的性能。(剧透警告: 它们的速度超乎你的想象!)
  • +
+

我们已经介绍了其它受函数式风格影响的 Rust 功能,比如模式匹配和枚举,这些已经在其他章节中讲到过了。因为掌握闭包和迭代器是编写符合语言风格的高性能 Rust 代码的重要一环,所以我们将专门用一整章来讲解它们。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch13-01-closures.html b/ch13-01-closures.html new file mode 100644 index 000000000..76761f3e9 --- /dev/null +++ b/ch13-01-closures.html @@ -0,0 +1,601 @@ + + + + + + 闭包:可以捕获其环境的匿名函数 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

闭包:可以捕获环境的匿名函数

+
+

ch13-01-closures.md +
+commit a2cb72d3ad7584cc1ae3b85f715c877872f5e3ab

+
+

Rust 的 闭包closures)是可以保存在变量中或作为参数传递给其他函数的匿名函数。你可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获其被定义时所在作用域中的值。我们将展示这些闭包特性如何支持代码复用和行为定制。

+

闭包会捕获其环境

+

我们首先了解如何通过闭包捕获定义它的环境中的值以便之后使用。考虑如下场景:我们的 T 恤公司偶尔会向邮件列表中的某位成员赠送一件限量版的独家 T 恤作为促销。邮件列表中的成员可以选择将他们的喜爱的颜色添加到个人信息中。如果被选中的成员设置了喜爱的颜色,他们将获得那个颜色的 T 恤。如果他没有设置喜爱的颜色,他们会获赠公司当前库存最多的颜色的款式。

+

有很多种方式来实现这一点。例如,使用有 RedBlue 两个成员的 ShirtColor 枚举(出于简单考虑限定为两种颜色)。我们使用 Inventory 结构体来代表公司的库存,它有一个类型为 Vec<ShirtColor>shirts 字段表示库存中的衬衫的颜色。Inventory 上定义的 giveaway 方法获取免费衬衫得主所喜爱的颜色(如有),并返回其获得的衬衫的颜色。初始代码如示例 13-1 所示:

+

文件名:src/main.rs

+
#[derive(Debug, PartialEq, Copy, Clone)]
+enum ShirtColor {
+    Red,
+    Blue,
+}
+
+struct Inventory {
+    shirts: Vec<ShirtColor>,
+}
+
+impl Inventory {
+    fn giveaway(&self, user_preference: Option<ShirtColor>) -> ShirtColor {
+        user_preference.unwrap_or_else(|| self.most_stocked())
+    }
+
+    fn most_stocked(&self) -> ShirtColor {
+        let mut num_red = 0;
+        let mut num_blue = 0;
+
+        for color in &self.shirts {
+            match color {
+                ShirtColor::Red => num_red += 1,
+                ShirtColor::Blue => num_blue += 1,
+            }
+        }
+        if num_red > num_blue {
+            ShirtColor::Red
+        } else {
+            ShirtColor::Blue
+        }
+    }
+}
+
+fn main() {
+    let store = Inventory {
+        shirts: vec![ShirtColor::Blue, ShirtColor::Red, ShirtColor::Blue],
+    };
+
+    let user_pref1 = Some(ShirtColor::Red);
+    let giveaway1 = store.giveaway(user_pref1);
+    println!(
+        "The user with preference {:?} gets {:?}",
+        user_pref1, giveaway1
+    );
+
+    let user_pref2 = None;
+    let giveaway2 = store.giveaway(user_pref2);
+    println!(
+        "The user with preference {:?} gets {:?}",
+        user_pref2, giveaway2
+    );
+}
+

示例 13-1:衬衫公司赠送场景

+

main 函数中定义的 store 还剩下两件蓝衬衫和一件红衬衫,可以在限量版促销活动中赠送。我们通过调用 giveaway 方法,为一个期望红衬衫的用户和一个没有特定偏好的用户进行赠送。

+

再次强调,这段代码有多种实现方式。这里为了专注于闭包,我们继续使用已经学习过的概念,除了 giveaway 方法体中使用了闭包。在 giveaway 方法中,我们将用户偏好作为 Option<ShirtColor> 类型的参数获取,并在 user_preference 上调用 unwrap_or_else 方法。Option<T> 上的 unwrap_or_else 方法 由标准库定义。它接受一个无参闭包作为参数,该闭包返回一个 T 类型的值(与 Option<T>Some 变体中存储的值类型相同,这里是 ShirtColor)。如果 Option<T>Some 成员,则 unwrap_or_else 返回 Some 中的值。如果 Option<T>None 成员,则 unwrap_or_else 调用闭包并返回闭包的返回值。

+

我们将闭包表达式 || self.most_stocked() 作为 unwrap_or_else 的参数。这是一个本身不获取参数的闭包(如果闭包有参数,它们会出现在两道竖杠之间)。闭包体调用了 self.most_stocked()。我们在这里定义了闭包,而 unwrap_or_else 的实现会在之后需要其结果的时候执行闭包。

+

运行代码会打印出:

+
$ cargo run
+   Compiling shirt-company v0.1.0 (file:///projects/shirt-company)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.27s
+     Running `target/debug/shirt-company`
+The user with preference Some(Red) gets Red
+The user with preference None gets Blue
+
+

这里有一个有趣的地方是,我们传递了一个闭包,该闭包会在当前的 Inventory 实例上调用 self.most_stocked() 方法。标准库不需要了解我们定义的 InventoryShirtColor 类型,也不需要了解我们在这个场景中要使用的逻辑。闭包捕获了对 self(即 Inventory 实例)的不可变引用,并将其与我们指定的代码一起传递给 unwrap_or_else 方法。相比之下,函数无法以这种方式捕获其环境。

+

闭包类型推断和注解

+

函数与闭包还有更多区别。闭包通常不要求像 fn 函数那样对参数和返回值进行类型注解。函数需要类型注解是因为这些类型是暴露给用户的显式接口的一部分。严格定义这些接口对于确保所有人对函数使用和返回值的类型达成一致理解非常重要。与此相比,闭包并不用于这样暴露在外的接口:它们储存在变量中并被使用,不用命名它们或暴露给库的用户调用。

+

闭包通常较短,并且只与特定的上下文相关,而不是适用于任意情境。在这些有限的上下文中,编译器可以推断参数和返回值的类型,类似于它推断大多数变量类型的方式(尽管在某些罕见的情况下,编译器也需要闭包的类型注解)。

+

类似于变量,如果我们希望增加代码的明确性和清晰度,可以添加类型注解,但代价是是会使代码变得比严格必要的更冗长。为示例 13-1 中定义的闭包标注类型看起来如示例 13-2 中的定义一样。这个例子中,我们定义了一个闭包并将它保存在变量中,而不是像示例 13-1 那样在传参的地方定义它。

+

文件名:src/main.rs

+
use std::thread;
+use std::time::Duration;
+
+fn generate_workout(intensity: u32, random_number: u32) {
+    let expensive_closure = |num: u32| -> u32 {
+        println!("calculating slowly...");
+        thread::sleep(Duration::from_secs(2));
+        num
+    };
+
+    if intensity < 25 {
+        println!("Today, do {} pushups!", expensive_closure(intensity));
+        println!("Next, do {} situps!", expensive_closure(intensity));
+    } else {
+        if random_number == 3 {
+            println!("Take a break today! Remember to stay hydrated!");
+        } else {
+            println!(
+                "Today, run for {} minutes!",
+                expensive_closure(intensity)
+            );
+        }
+    }
+}
+
+fn main() {
+    let simulated_user_specified_value = 10;
+    let simulated_random_number = 7;
+
+    generate_workout(simulated_user_specified_value, simulated_random_number);
+}
+

示例 13-2:为闭包的参数和返回值增加可选的类型注解

+

有了类型注解,闭包的语法看起来就更像函数的语法了。如下是一个对其参数加一的函数的定义与拥有相同行为闭包语法的纵向对比。这里增加了一些空格来对齐相应部分。这展示了除了使用竖线以及一些可选语法外,闭包语法与函数语法有多么地相似:

+
fn  add_one_v1   (x: u32) -> u32 { x + 1 }
+let add_one_v2 = |x: u32| -> u32 { x + 1 };
+let add_one_v3 = |x|             { x + 1 };
+let add_one_v4 = |x|               x + 1  ;
+

第一行展示了一个函数定义,第二行展示了一个完整标注的闭包定义。第三行闭包定义中省略了类型注解,而第四行去掉了可选的大括号,因为闭包体只有一个表达式,所以大括号是可选的。这些都是有效的闭包定义,并在调用时产生相同的行为。调用闭包是 add_one_v3add_one_v4 能够编译的必要条件,因为类型将从其用法中推断出来。这类似于 let v = Vec::new();,Rust 需要类型注解或是某种类型的值被插入到 Vec 中,才能推断其类型。

+

对于闭包定义,编译器会为每个参数和返回值推断出一个具体类型。例如,示例 13-3 展示了一个简短的闭包定义,该闭包仅仅返回作为参数接收到的值。除了作为示例用途外,这个闭包并不是很实用。注意这个定义没有增加任何类型注解。因为没有类型注解,我们可以使用任意类型来调用这个闭包,我们在这里第一次调用时使用了 String 类型。但是如果我们接着尝试使用整数来调用 example_closure,就会得到一个错误。

+

文件名:src/main.rs

+
fn main() {
+    let example_closure = |x| x;
+
+    let s = example_closure(String::from("hello"));
+    let n = example_closure(5);
+}
+

示例 13-3:尝试调用一个被推断为两个不同类型的闭包

+

编译器给出如下错误:

+
$ cargo run
+   Compiling closure-example v0.1.0 (file:///projects/closure-example)
+error[E0308]: mismatched types
+ --> src/main.rs:5:29
+  |
+5 |     let n = example_closure(5);
+  |             --------------- ^- help: try using a conversion method: `.to_string()`
+  |             |               |
+  |             |               expected `String`, found integer
+  |             arguments to this function are incorrect
+  |
+note: expected because the closure was earlier called with an argument of type `String`
+ --> src/main.rs:4:29
+  |
+4 |     let s = example_closure(String::from("hello"));
+  |             --------------- ^^^^^^^^^^^^^^^^^^^^^ expected because this argument is of type `String`
+  |             |
+  |             in this closure call
+note: closure parameter defined here
+ --> src/main.rs:2:28
+  |
+2 |     let example_closure = |x| x;
+  |                            ^
+
+For more information about this error, try `rustc --explain E0308`.
+error: could not compile `closure-example` (bin "closure-example") due to 1 previous error
+
+

第一次使用 String 值调用 example_closure 时,编译器推断出 x 的类型以及闭包的返回类型为 String。接着这些类型被锁定进闭包 example_closure 中,如果尝试对同一闭包使用不同类型则就会得到类型错误。

+

捕获引用或者移动所有权

+

闭包可以通过三种方式捕获其环境中的值,它们直接对应到函数获取参数的三种方式:不可变借用、可变借用和获取所有权。闭包将根据函数体中对捕获值的操作来决定使用哪种方式。

+

在示例 13-4 中定义了一个捕获名为 list 的 vector 的不可变引用的闭包,因为只需不可变引用就能打印其值:

+

文件名:src/main.rs

+
fn main() {
+    let list = vec![1, 2, 3];
+    println!("Before defining closure: {list:?}");
+
+    let only_borrows = || println!("From closure: {list:?}");
+
+    println!("Before calling closure: {list:?}");
+    only_borrows();
+    println!("After calling closure: {list:?}");
+}
+

示例 13-4:定义并调用一个捕获不可变引用的闭包

+

这个示例也展示了变量可以绑定一个闭包定义,并且我们可以像使用函数名一样,使用变量名和括号来调用该闭包。

+

因为同时可以有多个 list 的不可变引用,所以在闭包定义之前,闭包定义之后调用之前,闭包调用之后代码仍然可以访问 list。该代码可以编译、运行并输出:

+
$ cargo run
+     Locking 1 package to latest compatible version
+      Adding closure-example v0.1.0 (/Users/chris/dev/rust-lang/book/tmp/listings/ch13-functional-features/listing-13-04)
+   Compiling closure-example v0.1.0 (file:///projects/closure-example)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s
+     Running `target/debug/closure-example`
+Before defining closure: [1, 2, 3]
+Before calling closure: [1, 2, 3]
+From closure: [1, 2, 3]
+After calling closure: [1, 2, 3]
+
+

接下来在示例 13-5 中,我们修改闭包体让它向 list vector 增加一个元素。闭包现在捕获一个可变引用:

+

文件名:src/main.rs

+
fn main() {
+    let mut list = vec![1, 2, 3];
+    println!("Before defining closure: {list:?}");
+
+    let mut borrows_mutably = || list.push(7);
+
+    borrows_mutably();
+    println!("After calling closure: {list:?}");
+}
+

示例 13-5:定义并调用一个捕获可变引用的闭包

+

代码可以编译、运行并打印:

+
$ cargo run
+     Locking 1 package to latest compatible version
+      Adding closure-example v0.1.0 (/Users/chris/dev/rust-lang/book/tmp/listings/ch13-functional-features/listing-13-05)
+   Compiling closure-example v0.1.0 (file:///projects/closure-example)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s
+     Running `target/debug/closure-example`
+Before defining closure: [1, 2, 3]
+After calling closure: [1, 2, 3, 7]
+
+

注意在 borrows_mutably 闭包的定义和调用之间不再有 println!,这是因为当 borrows_mutably 被定义时,它捕获了对 list 的可变引用。闭包在被调用后就不再被使用,这时可变借用结束。因为当可变借用存在时不允许有其它的借用,所以在闭包定义和调用之间不能有不可变引用来进行打印。可以尝试在这里添加 println! 看看你会得到什么报错信息!

+

即使闭包体不严格需要所有权,如果希望强制闭包获取它在环境中所使用的值的所有权,可以在参数列表前使用 move 关键字。

+

当将闭包传递到一个新的线程时,这个技巧特别有用,因为它将数据的所有权移动到新线程中。我们将在第十六章讨论并发时详细讨论线程以及为什么你可能需要使用它们。不过现在,我们先简要探索一下如何使用需要 move 关键字的闭包来生成一个新线程。示例 13-6 展示了如何修改示例 13-4,以便在一个新线程中而不是在主线程中打印 vector:

+

文件名:src/main.rs

+
use std::thread;
+
+fn main() {
+    let list = vec![1, 2, 3];
+    println!("Before defining closure: {list:?}");
+
+    thread::spawn(move || println!("From thread: {list:?}"))
+        .join()
+        .unwrap();
+}
+

示例 13-6:使用 move 来强制闭包为线程获取 list 的所有权

+

我们生成了一个新的线程,并给这个线程传递一个闭包作为参数来运行,闭包体打印出列表。在示例 13-4 中,闭包仅通过不可变引用捕获了 list,因为这是打印列表所需的最少的访问权限。这个例子中,尽管闭包体依然只需要不可变引用,我们还是在闭包定义前写上 move 关键字,以确保 list 被移动到闭包中。新线程可能在主线程剩余部分执行完前执行完,也可能在主线程执行完之后执行完。如果主线程维护了 list 的所有权但却在新线程之前结束并且丢弃了 list,则在线程中的不可变引用将失效。因此,编译器要求 list 被移动到在新线程中运行的闭包中,这样引用就是有效的。试着移除 move 关键字,或者在闭包定义后在主线程中使用 list,看看你会得到什么编译器报错!

+

+ +

+

将被捕获的值移出闭包和 Fn trait

+

一旦闭包捕获了定义它的环境中的某个值的引用或所有权(也就影响了什么会被移 闭包,如有),闭包体中的代码则决定了在稍后执行闭包时,这些引用或值将如何处理(也就影响了什么会被移 闭包,如有)。闭包体可以执行以下任一操作:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获任何值。

+

闭包捕获和处理环境中的值的方式会影响闭包实现哪些 trait,而 trait 是函数和结构体指定它们可以使用哪些类型闭包的方式。根据闭包体如何处理这些值,闭包会自动、渐进地实现一个、两个或全部三个 Fn trait。

+
    +
  1. FnOnce 适用于只能被调用一次的闭包。所有闭包至少都实现了这个 trait,因为所有闭包都能被调用。一个会将捕获的值从闭包体中移出的闭包只会实现 FnOnce trait,而不会实现其他 Fn 相关的 trait,因为它只能被调用一次。
  2. +
  3. FnMut 适用于不会将捕获的值移出闭包体,但可能会修改捕获值的闭包。这类闭包可以被调用多次。
  4. +
  5. Fn 适用于既不将捕获的值移出闭包体,也不修改捕获值的闭包,同时也包括不从环境中捕获任何值的闭包。这类闭包可以被多次调用而不会改变其环境,这在会多次并发调用闭包的场景中十分重要。
  6. +
+

让我们来看示例 13-1 中使用的在 Option<T> 上的 unwrap_or_else 方法的定义:

+
impl<T> Option<T> {
+    pub fn unwrap_or_else<F>(self, f: F) -> T
+    where
+        F: FnOnce() -> T
+    {
+        match self {
+            Some(x) => x,
+            None => f(),
+        }
+    }
+}
+

回忆一下,T 是表示 OptionSome 成员中的值的类型的泛型。类型 T 也是 unwrap_or_else 函数的返回值类型:举例来说,在 Option<String> 上调用 unwrap_or_else 会得到一个 String

+

接着注意到 unwrap_or_else 函数有额外的泛型参数 FF 是参数 f 的类型,f 是调用 unwrap_or_else 时提供的闭包。

+

泛型 F 的 trait bound 是 FnOnce() -> T,这意味着 F 必须能够被调用一次,没有参数并返回一个 T。在 trait bound 中使用 FnOnce 表示 unwrap_or_else 最多只会调用 f 一次。在 unwrap_or_else 的函数体中可以看到,如果 OptionSomef 不会被调用。如果 OptionNonef 将会被调用一次。由于所有的闭包都实现了 FnOnceunwrap_or_else 接受所有三种类型的闭包,十分灵活。

+
+

注意:函数也可以实现所有的三种 Fn traits。如果我们要做的事情不需要从环境中捕获值,则可以在需要某种实现了 Fn trait 的东西时使用函数而不是闭包。举个例子,可以在 Option<Vec<T>> 的值上调用 unwrap_or_else(Vec::new),以便在值为 None 时获取一个新的空的 vector。

+
+

现在让我们来看定义在 slice 上的标准库方法 sort_by_key,看看它与 unwrap_or_else 的区别,以及为什么 sort_by_key 使用 FnMut 而不是 FnOnce 作为 trait bound。这个闭包以一个 slice 中当前被考虑的元素的引用作为参数,并返回一个可以排序的 K 类型的值。当你想按照 slice 中每个元素的某个属性进行排序时,这个函数非常有用。在示例 13-7 中,我们有一个 Rectangle 实例的列表,并使用 sort_by_keyRectanglewidth 属性对它们从低到高排序:

+

文件名:src/main.rs

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+fn main() {
+    let mut list = [
+        Rectangle { width: 10, height: 1 },
+        Rectangle { width: 3, height: 5 },
+        Rectangle { width: 7, height: 12 },
+    ];
+
+    list.sort_by_key(|r| r.width);
+    println!("{list:#?}");
+}
+

示例 13-7:使用 sort_by_key 对长方形按宽度排序

+

代码输出:

+
$ cargo run
+   Compiling rectangles v0.1.0 (file:///projects/rectangles)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.41s
+     Running `target/debug/rectangles`
+[
+    Rectangle {
+        width: 3,
+        height: 5,
+    },
+    Rectangle {
+        width: 7,
+        height: 12,
+    },
+    Rectangle {
+        width: 10,
+        height: 1,
+    },
+]
+
+

sort_by_key 被定义为接收一个 FnMut 闭包的原因是它会多次调用这个闭包:对 slice 中的每个元素调用一次。闭包 |r| r.width 不捕获、修改或将任何东西移出它的环境,所以它满足 trait bound 的要求。

+

相比之下,示例 13-8 展示了一个只实现了 FnOnce trait 的闭包的例子,因为它从环境中移出了一个值。编译器不允许我们在 sort_by_key 中使用这个闭包:

+

文件名:src/main.rs

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+fn main() {
+    let mut list = [
+        Rectangle { width: 10, height: 1 },
+        Rectangle { width: 3, height: 5 },
+        Rectangle { width: 7, height: 12 },
+    ];
+
+    let mut sort_operations = vec![];
+    let value = String::from("closure called");
+
+    list.sort_by_key(|r| {
+        sort_operations.push(value);
+        r.width
+    });
+    println!("{list:#?}");
+}
+

示例 13-8:尝试在 sort_by_key 上使用一个 FnOnce 闭包

+

这是一个刻意构造的、复杂且无效的方式,试图统计在对 list 进行排序时 sort_by_key 调用闭包的次数。该代码试图通过将闭包环境中的 value(一个 String)插入 sort_operations vector 来实现计数。闭包捕获了 value,然后通过将 value 的所有权转移给 sort_operations vector 的方式将其移出闭包。这个闭包只能被调用一次;尝试第二次调用它将无法工作,因为这时 value 已经不在闭包的环境中,无法被再次插入 sort_operations 中!因而,这个闭包只实现了 FnOnce。当我们尝试编译此代码时,会出现错误提示:value 不能从闭包中移出,因为闭包必须实现 FnMut

+
$ cargo run
+   Compiling rectangles v0.1.0 (file:///projects/rectangles)
+error[E0507]: cannot move out of `value`, a captured variable in an `FnMut` closure
+  --> src/main.rs:18:30
+   |
+15 |     let value = String::from("closure called");
+   |         ----- captured outer variable
+16 |
+17 |     list.sort_by_key(|r| {
+   |                      --- captured by this `FnMut` closure
+18 |         sort_operations.push(value);
+   |                              ^^^^^ move occurs because `value` has type `String`, which does not implement the `Copy` trait
+   |
+help: consider cloning the value if the performance cost is acceptable
+   |
+18 |         sort_operations.push(value.clone());
+   |                                   ++++++++
+
+For more information about this error, try `rustc --explain E0507`.
+error: could not compile `rectangles` (bin "rectangles") due to 1 previous error
+
+

报错指向了闭包体中将 value 移出环境的那一行。要修复此问题,我们需要修改闭包体,使其不会将值移出环境。在环境中维护一个计数器,并在闭包体中递增其值,是计算闭包被调用次数的一个更简单直接的方法。示例 13-9 中的闭包可以在 sort_by_key 中使用,因为它只捕获了 num_sort_operations 计数器的可变引用,因此可以被多次调用:

+

文件名:src/main.rs

+
#[derive(Debug)]
+struct Rectangle {
+    width: u32,
+    height: u32,
+}
+
+fn main() {
+    let mut list = [
+        Rectangle { width: 10, height: 1 },
+        Rectangle { width: 3, height: 5 },
+        Rectangle { width: 7, height: 12 },
+    ];
+
+    let mut num_sort_operations = 0;
+    list.sort_by_key(|r| {
+        num_sort_operations += 1;
+        r.width
+    });
+    println!("{list:#?}, sorted in {num_sort_operations} operations");
+}
+

示例 13-9:允许在 sort_by_key 上使用一个 FnMut 闭包

+

当定义或使用涉及闭包的函数或类型时,Fn traits 十分重要。在下个小节中,我们将讨论迭代器。许多迭代器方法都接收闭包参数,因此在继续前,请记住这些闭包的细节!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch13-02-iterators.html b/ch13-02-iterators.html new file mode 100644 index 000000000..6d5a720ef --- /dev/null +++ b/ch13-02-iterators.html @@ -0,0 +1,420 @@ + + + + + + 使用迭代器处理元素序列 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用迭代器处理元素序列

+
+

ch13-02-iterators.md +
+commit eabaaaa90ee6937db3690dc56f739116be55ecb2

+
+

迭代器模式允许你依次对一个序列中的项执行某些操作。迭代器iterator)负责遍历序列中的每一项并确定序列何时结束的逻辑。使用迭代器时,你无需自己重新实现这些逻辑。

+

在 Rust 中,迭代器是 惰性的lazy),这意味着在调用消费迭代器的方法之前不会执行任何操作。例如,示例 13-10 中的代码通过调用定义于 Vec<T> 上的 iter 方法在一个 vector v1 上创建了一个迭代器。这段代码本身并没有执行任何有用的操作。

+
fn main() {
+    let v1 = vec![1, 2, 3];
+
+    let v1_iter = v1.iter();
+}
+

示例 13-10:创建一个迭代器

+

迭代器被储存在 v1_iter 变量中。一旦创建迭代器之后,可以选择用多种方式利用它。在第三章的示例 3-5 中,我们使用 for 循环来遍历一个数组并在每一个项上执行了一些代码。在底层它隐式地创建并接着消费了一个迭代器,不过直到现在我们都一笔带过了它具体是如何工作的。

+

示例 13-11 中的例子将迭代器的创建和 for 循环中的使用分开。当 for 循环使用 v1_iter 中的迭代器时,迭代器中的每一个元素都会用于循环的一次迭代,并打印出每个值。

+
fn main() {
+    let v1 = vec![1, 2, 3];
+
+    let v1_iter = v1.iter();
+
+    for val in v1_iter {
+        println!("Got: {val}");
+    }
+}
+

示例 13-11:在一个 for 循环中使用迭代器

+

在标准库中没有提供迭代器的语言中,我们可能会使用一个从 0 开始的索引变量,使用这个变量索引 vector 中的值,并循环增加其值直到达到 vector 中的元素总量。

+

迭代器为我们处理了所有这些逻辑,这减少了重复代码并消除了潜在的混乱。另外,迭代器的实现方式提供了对多种不同的序列使用相同逻辑的灵活性,而不仅仅是像 vector 这样可索引的数据结构。让我们看看迭代器是如何做到这些的。

+

Iterator trait 和 next 方法

+

迭代器都实现了一个叫做 Iterator 的定义于标准库的 trait。这个 trait 的定义看起来像这样:

+
#![allow(unused)]
+fn main() {
+pub trait Iterator {
+    type Item;
+
+    fn next(&mut self) -> Option<Self::Item>;
+
+    // 此处省略了方法的默认实现
+}
+}
+

注意这里有一个我们还未讲到的新语法:type ItemSelf::Item,它们定义了 trait 的 关联类型associated type)。第二十章会深入讲解关联类型,不过现在只需知道这段代码表明实现 Iterator trait 要求同时定义一个 Item 类型,这个 Item 类型被用作 next 方法的返回值类型。换句话说,Item 类型将是迭代器返回元素的类型。

+

nextIterator 实现者被要求定义的唯一方法:next 方法,该方法每次返回迭代器中的一个项,封装在 Some 中,并且当迭代完成时,返回 None

+

可以直接调用迭代器的 next 方法;示例 13-12 展示了对由 vector 创建的迭代器重复调用 next 方法时返回的值。

+

文件名:src/lib.rs

+
#[cfg(test)]
+mod tests {
+    #[test]
+    fn iterator_demonstration() {
+        let v1 = vec![1, 2, 3];
+
+        let mut v1_iter = v1.iter();
+
+        assert_eq!(v1_iter.next(), Some(&1));
+        assert_eq!(v1_iter.next(), Some(&2));
+        assert_eq!(v1_iter.next(), Some(&3));
+        assert_eq!(v1_iter.next(), None);
+    }
+}
+

示例 13-12:在迭代器上(直接)调用 next 方法

+

注意我们需要将 v1_iter 声明为可变的:在迭代器上调用 next 方法会改变迭代器内部的状态,该状态用于跟踪迭代器在序列中的位置。换句话说,代码 消费(consume)了,或者说用尽了迭代器。每一次 next 调用都会从迭代器中消费一个项。使用 for 循环时无需使 v1_iter 可变因为 for 循环会获取 v1_iter 的所有权并在后台使 v1_iter 可变。

+

还需要注意的是,从 next 调用中获取的值是对 vector 中值的不可变引用。iter 方法生成一个不可变引用的迭代器。如果我们需要一个获取 v1 所有权并返回拥有所有权的迭代器,则可以调用 into_iter 而不是 iter。类似地,如果我们希望迭代可变引用,可以调用 iter_mut 而不是 iter

+

消费迭代器的方法

+

Iterator trait 有一系列不同的由标准库提供默认实现的方法;你可以在 Iterator trait 的标准库 API 文档中找到所有这些方法。一些方法在其定义中调用了 next 方法,这也就是为什么在实现 Iterator trait 时要求实现 next 方法的原因。

+

这些调用 next 方法的方法被称为 消费适配器consuming adaptors),因为调用它们会消耗迭代器。一个消费适配器的例子是 sum 方法。这个方法获取迭代器的所有权并反复调用 next 来遍历迭代器,因而会消费迭代器。在遍历过程中,它将每个项累加到一个总和中,并在迭代完成时返回这个总和。示例 13-13 有一个展示 sum 方法使用的测试:

+

文件名:src/lib.rs

+
#[cfg(test)]
+mod tests {
+    #[test]
+    fn iterator_sum() {
+        let v1 = vec![1, 2, 3];
+
+        let v1_iter = v1.iter();
+
+        let total: i32 = v1_iter.sum();
+
+        assert_eq!(total, 6);
+    }
+}
+

示例 13-13:调用 sum 方法获取迭代器所有项的总和

+

调用 sum 之后不再允许使用 v1_iter 因为调用 sum 时它会获取迭代器的所有权。

+

产生其他迭代器的方法

+

Iterator trait 中定义了另一类方法,被称为 迭代器适配器iterator adaptors),它们不会消耗当前的迭代器,而是通过改变原始迭代器的某些方面来生成不同的迭代器。

+

示例 13-14 展示了一个调用迭代器适配器方法 map 的例子,该方法使用一个闭包对每个元素进行操作。map 方法返回一个新的迭代器,该迭代器生成经过修改的元素。这里的闭包创建了一个新的迭代器,其中 vector 中的每个元素都被加 1。

+

文件名:src/main.rs

+
fn main() {
+    let v1: Vec<i32> = vec![1, 2, 3];
+
+    v1.iter().map(|x| x + 1);
+}
+

示例 13-14:调用迭代器适配器 map 来创建一个新迭代器

+

不过这些代码会产生一个警告:

+
$ cargo run
+   Compiling iterators v0.1.0 (file:///projects/iterators)
+warning: unused `Map` that must be used
+ --> src/main.rs:4:5
+  |
+4 |     v1.iter().map(|x| x + 1);
+  |     ^^^^^^^^^^^^^^^^^^^^^^^^
+  |
+  = note: iterators are lazy and do nothing unless consumed
+  = note: `#[warn(unused_must_use)]` on by default
+help: use `let _ = ...` to ignore the resulting value
+  |
+4 |     let _ = v1.iter().map(|x| x + 1);
+  |     +++++++
+
+warning: `iterators` (bin "iterators") generated 1 warning
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.47s
+     Running `target/debug/iterators`
+
+

示例 13-14 中的代码实际上并没有做任何事;所指定的闭包从未被调用过。警告提醒了我们原因所在:迭代器适配器是惰性的,因此我们需要在此处消费迭代器。

+

为了修复这个警告并消费迭代器,我们将使用第十二章示例 12-1 结合 env::args 使用的 collect 方法。这个方法消费迭代器并将结果收集到一个集合数据类型中。

+

在示例 13-15 中,我们将遍历由 map 调用生成的迭代器结果收集到一个 vector 中。这个 vector 将包含原始 vector 中每个元素加 1 的结果。

+

文件名:src/main.rs

+
fn main() {
+    let v1: Vec<i32> = vec![1, 2, 3];
+
+    let v2: Vec<_> = v1.iter().map(|x| x + 1).collect();
+
+    assert_eq!(v2, vec![2, 3, 4]);
+}
+

示例 13-15:调用 map 方法创建一个新迭代器,接着调用 collect 方法消费新迭代器并创建一个 vector

+

由于 map 接受一个闭包,因此我们可以指定希望在每个元素上执行的任何操作。这是一个很好的例子,展示了如何通过闭包来自定义某些行为,同时复用 Iterator trait 提供的迭代行为。

+

可以链式调用多个迭代器适配器来以一种可读的方式进行复杂的操作。不过因为所有的迭代器都是惰性的,你必须调用一个消费适配器方法,才能从这些迭代器适配器的调用中获取结果。

+

使用捕获其环境的闭包

+

很多迭代器适配器接受闭包作为参数,而我们通常会指定捕获其环境的闭包作为迭代器适配器的参数。

+

作为一个例子,我们使用 filter 方法来获取一个闭包。该闭包从迭代器中获取一项并返回一个 bool。如果闭包返回 true,其值将会包含在 filter 提供的新迭代器中。如果闭包返回 false,其值不会被包含。

+

示例 13-16 中使用 filter 和一个捕获环境中变量 shoe_size 的闭包来遍历一个 Shoe 结构体集合。它只会返回指定鞋码的鞋子。

+

文件名:src/lib.rs

+
#[derive(PartialEq, Debug)]
+struct Shoe {
+    size: u32,
+    style: String,
+}
+
+fn shoes_in_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> {
+    shoes.into_iter().filter(|s| s.size == shoe_size).collect()
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn filters_by_size() {
+        let shoes = vec![
+            Shoe {
+                size: 10,
+                style: String::from("sneaker"),
+            },
+            Shoe {
+                size: 13,
+                style: String::from("sandal"),
+            },
+            Shoe {
+                size: 10,
+                style: String::from("boot"),
+            },
+        ];
+
+        let in_my_size = shoes_in_size(shoes, 10);
+
+        assert_eq!(
+            in_my_size,
+            vec![
+                Shoe {
+                    size: 10,
+                    style: String::from("sneaker")
+                },
+                Shoe {
+                    size: 10,
+                    style: String::from("boot")
+                },
+            ]
+        );
+    }
+}
+

示例 13-16:使用 filter 方法和一个捕获 shoe_size 的闭包

+

shoes_in_size 函数获取一个鞋子 vector 的所有权和一个鞋码作为参数。它返回一个只包含指定鞋码的鞋子的 vector。

+

shoes_in_size 函数体中调用了 into_iter 来创建一个获取 vector 所有权的迭代器。接着调用 filter 将这个迭代器适配成一个只含有那些闭包返回 true 的元素的新迭代器。

+

闭包从环境中捕获了 shoe_size 变量并使用其值与每一只鞋的大小作比较,只保留指定鞋码的鞋子。最终,调用 collect 将迭代器适配器返回的值收集进一个 vector 并返回。

+

这个测试展示当调用 shoes_in_size 时,返回的只会是与我们指定的鞋码相同的鞋子。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch13-03-improving-our-io-project.html b/ch13-03-improving-our-io-project.html new file mode 100644 index 000000000..dac0d420e --- /dev/null +++ b/ch13-03-improving-our-io-project.html @@ -0,0 +1,802 @@ + + + + + + 改进之前的 I/O 项目 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

改进 I/O 项目

+
+

ch13-03-improving-our-io-project.md +
+commit 2cd1b5593d26dc6a03c20f8619187ad4b2485552

+
+

掌握了这些关于迭代器的新知识后,我们可以使用迭代器来改进第十二章中 I/O 项目的实现来使得代码更简洁明了。接下来,让我们看看迭代器如何改进 Config::build 函数和 search 函数的实现。

+

使用迭代器去除 clone

+

在示例 12-6 中,我们增加了一些代码获取一个 String 类型的 slice 并创建一个 Config 结构体的实例,它们索引 slice 中的值并克隆这些值以便 Config 结构体可以拥有这些值。在示例 13-17 中重现了第十二章结尾示例 12-23 中 Config::build 函数的实现:

+

文件名:src/lib.rs

+
use std::env;
+use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+    pub ignore_case: bool,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        let ignore_case = env::var("IGNORE_CASE").is_ok();
+
+        Ok(Config {
+            query,
+            file_path,
+            ignore_case,
+        })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    let results = if config.ignore_case {
+        search_case_insensitive(&config.query, &contents)
+    } else {
+        search(&config.query, &contents)
+    };
+
+    for line in results {
+        println!("{line}");
+    }
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.contains(query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+pub fn search_case_insensitive<'a>(
+    query: &str,
+    contents: &'a str,
+) -> Vec<&'a str> {
+    let query = query.to_lowercase();
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.to_lowercase().contains(&query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn case_sensitive() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Duct tape.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+
+    #[test]
+    fn case_insensitive() {
+        let query = "rUsT";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Trust me.";
+
+        assert_eq!(
+            vec!["Rust:", "Trust me."],
+            search_case_insensitive(query, contents)
+        );
+    }
+}
+

示例 13-17:重现示例 12-23 的 Config::build 函数

+

当时我们说过不必担心低效的 clone 调用,因为我们以后会将其移除。好吧,就是现在!

+

起初这里需要 clone 的原因是参数 args 中有一个 String 元素的 slice,而 build 函数并不拥有 args。为了能够返回 Config 实例的所有权,我们需要克隆 Config 中字段 queryfile_path 的值,这样 Config 实例就能拥有这些值。

+

在学习了迭代器之后,我们可以将 build 函数改为获取一个有所有权的迭代器作为参数,而不是借用 slice。我们将使用迭代器功能代替之前检查 slice 长度和索引特定位置的代码。这样可以更清晰地表达 Config::build 函数的操作,因为迭代器会负责访问这些值。

+

一旦 Config::build 获取了迭代器的所有权并不再使用借用的索引操作,就可以将迭代器中的 String 值移动到 Config 中,而不是调用 clone 分配新的空间。

+

直接使用返回的迭代器

+

打开 I/O 项目的 src/main.rs 文件,它看起来应该像这样:

+

文件名:src/main.rs

+
use std::env;
+use std::process;
+
+use minigrep::Config;
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+
+    let config = Config::build(&args).unwrap_or_else(|err| {
+        eprintln!("Problem parsing arguments: {err}");
+        process::exit(1);
+    });
+
+    // --snip--
+
+    if let Err(e) = minigrep::run(config) {
+        eprintln!("Application error: {e}");
+        process::exit(1);
+    }
+}
+

首先我们修改第十二章结尾示例 12-24 中的 main 函数的开头为示例 13-18 中的代码。在更新 Config::build 之前这些代码还不能编译:

+

文件名:src/main.rs

+
use std::env;
+use std::process;
+
+use minigrep::Config;
+
+fn main() {
+    let config = Config::build(env::args()).unwrap_or_else(|err| {
+        eprintln!("Problem parsing arguments: {err}");
+        process::exit(1);
+    });
+
+    // --snip--
+
+    if let Err(e) = minigrep::run(config) {
+        eprintln!("Application error: {e}");
+        process::exit(1);
+    }
+}
+

示例 13-25:将 env::args 的返回值传递给 Config::build

+

env::args 函数返回一个迭代器!不同于将迭代器的值收集到一个 vector 中接着传递一个 slice 给 Config::build,现在我们直接将 env::args 返回的迭代器的所有权传递给 Config::build

+

接下来需要更新 Config::build 的定义。在 I/O 项目的 src/lib.rs 中,将 Config::build 的签名改为如示例 13-19 所示。这仍然不能编译因为我们还需更新函数体。

+

文件名:src/lib.rs

+
use std::env;
+use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+    pub ignore_case: bool,
+}
+
+impl Config {
+    pub fn build(
+        mut args: impl Iterator<Item = String>,
+    ) -> Result<Config, &'static str> {
+        // --snip--
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        let ignore_case = env::var("IGNORE_CASE").is_ok();
+
+        Ok(Config {
+            query,
+            file_path,
+            ignore_case,
+        })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    let results = if config.ignore_case {
+        search_case_insensitive(&config.query, &contents)
+    } else {
+        search(&config.query, &contents)
+    };
+
+    for line in results {
+        println!("{line}");
+    }
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.contains(query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+pub fn search_case_insensitive<'a>(
+    query: &str,
+    contents: &'a str,
+) -> Vec<&'a str> {
+    let query = query.to_lowercase();
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.to_lowercase().contains(&query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn case_sensitive() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Duct tape.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+
+    #[test]
+    fn case_insensitive() {
+        let query = "rUsT";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Trust me.";
+
+        assert_eq!(
+            vec!["Rust:", "Trust me."],
+            search_case_insensitive(query, contents)
+        );
+    }
+}
+

示例 13-19:以迭代器作为参数更新 Config::build 的签名

+

env::args 函数的标准库文档显示,它返回的迭代器的类型为 std::env::Args,并且这个类型实现了 Iterator trait 并返回 String 值。

+

我们已经更新了 Config::build 函数的签名,因此参数 args 有一个带有 trait bounds impl Iterator<Item = String> 的泛型类型,而不是 &[String]。这里用到了第十章 “trait 作为参数” 部分讨论过的 impl Trait 语法,这意味着 args 可以是任何实现了 Iterator trait 并返回 String 项(item)的类型。

+

由于我们获取了 args 的所有权,并且将通过迭代来修改 args,因此我们可以在 args 参数的声明中添加 mut 关键字,使其可变。

+

使用 Iterator trait 代替索引

+

接下来,我们将修改 Config::build 的函数体。因为 args 实现了 Iterator trait,因此我们知道可以对其调用 next 方法!示例 13-20 更新了示例 12-23 中的代码,以使用 next 方法:

+

文件名:src/lib.rs

+
use std::env;
+use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+    pub ignore_case: bool,
+}
+
+impl Config {
+    pub fn build(
+        mut args: impl Iterator<Item = String>,
+    ) -> Result<Config, &'static str> {
+        args.next();
+
+        let query = match args.next() {
+            Some(arg) => arg,
+            None => return Err("Didn't get a query string"),
+        };
+
+        let file_path = match args.next() {
+            Some(arg) => arg,
+            None => return Err("Didn't get a file path"),
+        };
+
+        let ignore_case = env::var("IGNORE_CASE").is_ok();
+
+        Ok(Config {
+            query,
+            file_path,
+            ignore_case,
+        })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    let results = if config.ignore_case {
+        search_case_insensitive(&config.query, &contents)
+    } else {
+        search(&config.query, &contents)
+    };
+
+    for line in results {
+        println!("{line}");
+    }
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.contains(query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+pub fn search_case_insensitive<'a>(
+    query: &str,
+    contents: &'a str,
+) -> Vec<&'a str> {
+    let query = query.to_lowercase();
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.to_lowercase().contains(&query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn case_sensitive() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Duct tape.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+
+    #[test]
+    fn case_insensitive() {
+        let query = "rUsT";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Trust me.";
+
+        assert_eq!(
+            vec!["Rust:", "Trust me."],
+            search_case_insensitive(query, contents)
+        );
+    }
+}
+

示例 13-20:修改 Config::build 的函数体来使用迭代器方法

+

请记住 env::args 返回值的第一个值是程序的名称。我们希望忽略它并获取下一个值,所以首先调用 next 且不对其返回值做任何操作。然后,我们再次调用 next 来获取要放入 Config 结构体的 query 字段的值。如果 next 返回 Some,使用 match 来提取其值。如果它返回 None,则意味着没有提供足够的参数并通过 Err 值提早返回。我们对对 file_path 的值也进行同样的操作。

+

使用迭代器适配器来使代码更简明

+

I/O 项目中其他可以利用迭代器的地方是 search 函数,示例 13-21 中重现了第十二章结尾示例 12-19 中此函数的定义:

+

文件名:src/lib.rs

+
use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+}
+
+impl Config {
+    pub fn build(args: &[String]) -> Result<Config, &'static str> {
+        if args.len() < 3 {
+            return Err("not enough arguments");
+        }
+
+        let query = args[1].clone();
+        let file_path = args[2].clone();
+
+        Ok(Config { query, file_path })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.contains(query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn one_result() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+}
+

示例 13-21:示例 12-19 中 search 函数的定义

+

可以通过使用迭代器适配器方法来编写更简明的代码。这样做还可以避免使用一个可变的中间 results vector。函数式编程风格倾向于最小化可变状态的数量来使代码更简洁。去除可变状态可能会使未来的并行搜索优化变得更容易,因为我们不必管理对 results vector 的并发访问。示例 13-22 展示了这一变化:

+

文件名:src/lib.rs

+
use std::env;
+use std::error::Error;
+use std::fs;
+
+pub struct Config {
+    pub query: String,
+    pub file_path: String,
+    pub ignore_case: bool,
+}
+
+impl Config {
+    pub fn build(
+        mut args: impl Iterator<Item = String>,
+    ) -> Result<Config, &'static str> {
+        args.next();
+
+        let query = match args.next() {
+            Some(arg) => arg,
+            None => return Err("Didn't get a query string"),
+        };
+
+        let file_path = match args.next() {
+            Some(arg) => arg,
+            None => return Err("Didn't get a file path"),
+        };
+
+        let ignore_case = env::var("IGNORE_CASE").is_ok();
+
+        Ok(Config {
+            query,
+            file_path,
+            ignore_case,
+        })
+    }
+}
+
+pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
+    let contents = fs::read_to_string(config.file_path)?;
+
+    let results = if config.ignore_case {
+        search_case_insensitive(&config.query, &contents)
+    } else {
+        search(&config.query, &contents)
+    };
+
+    for line in results {
+        println!("{line}");
+    }
+
+    Ok(())
+}
+
+pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    contents
+        .lines()
+        .filter(|line| line.contains(query))
+        .collect()
+}
+
+pub fn search_case_insensitive<'a>(
+    query: &str,
+    contents: &'a str,
+) -> Vec<&'a str> {
+    let query = query.to_lowercase();
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.to_lowercase().contains(&query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn case_sensitive() {
+        let query = "duct";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Duct tape.";
+
+        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
+    }
+
+    #[test]
+    fn case_insensitive() {
+        let query = "rUsT";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Trust me.";
+
+        assert_eq!(
+            vec!["Rust:", "Trust me."],
+            search_case_insensitive(query, contents)
+        );
+    }
+}
+

示例 13-22:在 search 函数实现中使用迭代器适配器

+

回忆一下,search 函数的目的是返回所有 contents 中包含 query 的行。类似于示例 13-16 中的 filter 例子,这段代码使用 filter 适配器来保留 line.contains(query) 返回 true 的行。接着使用 collect 将匹配行收集到另一个 vector 中。这样就容易多了!尝试对 search_case_insensitive 函数做出同样的使用迭代器方法的修改吧。

+

选择循环或迭代器

+

接下来的逻辑问题就是在代码中应该选择哪种风格,以及原因:是使用示例 13-21 中的原始实现还是使用示例 13-22 中使用迭代器的版本?大部分 Rust 程序员倾向于使用迭代器风格。开始这有点难以掌握,不过一旦你对不同迭代器的工作方式有了感觉之后,迭代器反而更容易理解。相比摆弄不同的循环并创建新 vector,(迭代器)代码则更关注循环的高层次目的。这抽象掉那些老生常谈的代码,这样就更容易看清代码所特有的概念,比如迭代器中每个元素必须满足的过滤条件。

+

不过这两种实现真的完全等价吗?直觉上的假设是更底层的循环会更快一些。让我们聊聊性能吧。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch13-04-performance.html b/ch13-04-performance.html new file mode 100644 index 000000000..4e399adc1 --- /dev/null +++ b/ch13-04-performance.html @@ -0,0 +1,280 @@ + + + + + + 性能比较:循环对迭代器 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

性能对比:循环 VS 迭代器

+
+

ch13-04-performance.md +
+commit 009fffa4580ffb175f1b8470b5b12e4a63d670e4

+
+

为了决定是否使用循环或迭代器,你需要了解哪个实现更快:使用显式 for 循环的 search 函数版本,还是使用迭代器的版本。

+

我们进行了一个基准测试,将阿瑟·柯南·道尔的《福尔摩斯探案集》的全部内容加载到一个 String 中,并在内容中查找单词 “the”。以下是使用 for 循环版本和使用迭代器版本的 search 函数的基准测试结果:

+
test bench_search_for  ... bench:  19,620,300 ns/iter (+/- 915,700)
+test bench_search_iter ... bench:  19,234,900 ns/iter (+/- 657,200)
+
+

结果迭代器版本还要稍微快一点!这里我们不会解释性能测试的代码,我们的目的并不是为了证明它们是完全等同的,而是得出一个怎样比较这两种实现方式性能的基本思路。

+

对于一个更全面的性能测试,你应该使用不同大小的文本作为 contents,不同的单词以及长度各异的单词作为 query,以及各种其他变化进行检查。关键在于:迭代器,作为一个高级的抽象,被编译成了与手写的底层代码大体一致性能的代码。迭代器是 Rust 的 零成本抽象zero-cost abstractions)之一,它意味着抽象并不会引入额外的运行时开销,它与本贾尼·斯特劳斯特卢普(C++ 的设计和实现者)在 “Foundations of C++”(2012)中所定义的 零开销zero-overhead)如出一辙:

+
+

In general, C++ implementations obey the zero-overhead principle: What you don't use, you don't pay for. And further: What you do use, you couldn't hand code any better.

+
    +
  • Bjarne Stroustrup "Foundations of C++"
  • +
+

从整体来说,C++ 的实现遵循了零开销原则:你不需要的,无需为它买单。更有甚者的是:你需要的时候,也无法通过手写代码做得更好。

+
    +
  • 本贾尼·斯特劳斯特卢普 "Foundations of C++"
  • +
+
+

作为另一个例子,以下代码取自一个音频解码器。解码算法使用线性预测数学运算(linear prediction mathematical operation)来根据之前样本的线性函数预测将来的值。这些代码使用迭代器链对作用域中的三个变量进行某种数学计算:一个叫 buffer 的数据 slice、一个有 12 个元素的数组 coefficients、和一个代表位数据位移量的 qlp_shift。我们在这个例子中声明了这些变量,但没有为它们赋值;虽然这些代码在其上下文之外没有太多意义,不过仍是一个简明的现实例子,来展示 Rust 如何将高级概念转换为底层代码。

+
let buffer: &mut [i32];
+let coefficients: [i64; 12];
+let qlp_shift: i16;
+
+for i in 12..buffer.len() {
+    let prediction = coefficients.iter()
+                                 .zip(&buffer[i - 12..i])
+                                 .map(|(&c, &s)| c * s as i64)
+                                 .sum::<i64>() >> qlp_shift;
+    let delta = buffer[i];
+    buffer[i] = prediction as i32 + delta;
+}
+

为了计算 prediction 的值,这段代码遍历了 coefficients 中的 12 个值,使用 zip 方法将系数与 buffer 的前 12 个值组合在一起。接着将每一对值相乘,再将所有结果相加,然后将总和右移 qlp_shift 位。

+

像音频解码器这样的程序通常最看重计算的性能。这里,我们创建了一个迭代器,使用了两个适配器,接着消费了其值。那么这段 Rust 代码将会被编译为什么样的汇编代码呢?好吧,在编写本书的这个时候,它被编译成与手写的相同的汇编代码。遍历 coefficients 的值完全用不到循环:Rust 知道这里会迭代 12 次,所以它“展开”(unroll)了循环。展开是一种将循环迭代转换为重复代码,并移除循环控制代码开销的代码优化技术。

+

所有的系数都被储存在了寄存器中,这意味着访问它们非常快。这里也没有运行时数组访问边界检查。所有这些 Rust 能够提供的优化使得结果代码极为高效。现在你知道了这些,请放心大胆的使用迭代器和闭包吧!它们使得代码看起来更高级,但并不为此引入运行时性能损失。

+

总结

+

闭包和迭代器是 Rust 受函数式编程语言观念所启发的功能。它们对 Rust 以高性能来明确的表达高级概念的能力有很大贡献。闭包和迭代器的实现达到了不影响运行时性能的程度。这正是 Rust 致力于提供零成本抽象的目标的一部分。

+

现在我们改进了 I/O 项目的(代码)表现力,那么让我们来看看 cargo 的更多功能,这些功能将帮助我们将项目分享给全世界。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch14-00-more-about-cargo.html b/ch14-00-more-about-cargo.html new file mode 100644 index 000000000..8df0b0ca1 --- /dev/null +++ b/ch14-00-more-about-cargo.html @@ -0,0 +1,253 @@ + + + + + + 更多关于 Cargo 和 Crates.io 的内容 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

进一步认识 Cargo 和 Crates.io

+
+

ch14-00-more-about-cargo.md +
+commit 44e31f9f304e0cd9ace01045d17a2aa01a449528

+
+

目前为止我们只使用过 Cargo 构建、运行和测试代码这些最基本的功能,不过它还可以做到更多。本章会讨论 Cargo 其他一些更为高级的功能,我们将展示如何:

+
    +
  • 使用发布配置来自定义构建
  • +
  • 将库发布到 crates.io
  • +
  • 使用工作空间来组织更大的项目
  • +
  • crates.io 安装二进制文件
  • +
  • 使用自定义的命令来扩展 Cargo
  • +
+

Cargo 的功能不止本章所介绍的,关于其全部功能的详尽解释,请查看 文档

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch14-01-release-profiles.html b/ch14-01-release-profiles.html new file mode 100644 index 000000000..8ff892114 --- /dev/null +++ b/ch14-01-release-profiles.html @@ -0,0 +1,269 @@ + + + + + + 采用发布配置自定义构建 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

采用发布配置自定义构建

+
+

ch14-01-release-profiles.md +
+commit 44e31f9f304e0cd9ace01045d17a2aa01a449528

+
+

在 Rust 中 发布配置release profiles)文件是预定义和可定制的,它们包含不同的配置,允许程序员更灵活地控制代码编译的多种选项。每一个配置都相互独立。

+

Cargo 有两个主要的配置:运行 cargo build 时采用的 dev 配置和运行 cargo build --releaserelease 配置。dev 配置为开发定义了良好的默认配置,release 配置则为发布构建定义了良好的默认配置。

+

这些配置名称可能很眼熟,因为它们出现在构建的输出中:

+
$ cargo build
+    Finished dev [unoptimized + debuginfo] target(s) in 0.0s
+$ cargo build --release
+    Finished release [optimized] target(s) in 0.0s
+
+

构建输出中的 devrelease 表明编译器在使用不同的配置。

+

当项目的 Cargo.toml 文件中没有显式增加任何 [profile.*] 部分的时候,Cargo 会对每一个配置都采用默认设置。通过增加任何希望定制的配置对应的 [profile.*] 部分,我们可以选择覆盖任意默认设置的子集。例如,如下是 devrelease 配置的 opt-level 设置的默认值:

+

文件名:Cargo.toml

+
[profile.dev]
+opt-level = 0
+
+[profile.release]
+opt-level = 3
+
+

opt-level 设置控制 Rust 会对代码进行何种程度的优化。这个配置的值从 0 到 3。越高的优化级别需要更多的时间编译,所以如果你在进行开发并经常编译,可能会希望在牺牲一些代码性能的情况下减少优化以便编译得快一些。因此 devopt-level 默认为 0。当你准备发布时,花费更多时间在编译上则更好。只需要在发布模式编译一次,而编译出来的程序则会运行很多次,所以发布模式用更长的编译时间换取运行更快的代码。这正是为什么 release 配置的 opt-level 默认为 3

+

我们可以选择通过在 Cargo.toml 增加不同的值来覆盖任何默认设置。比如,如果我们想要在开发配置中使用级别 1 的优化,则可以在 Cargo.toml 中增加这两行:

+

文件名:Cargo.toml

+
[profile.dev]
+opt-level = 1
+
+

这会覆盖默认的设置 0。现在运行 cargo build 时,Cargo 将会使用 dev 的默认配置加上定制的 opt-level。因为 opt-level 设置为 1,Cargo 会比默认进行更多的优化,但是没有发布构建那么多。

+

对于每个配置的设置和其默认值的完整列表,请查看 Cargo 的文档

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch14-02-publishing-to-crates-io.html b/ch14-02-publishing-to-crates-io.html new file mode 100644 index 000000000..ac1785552 --- /dev/null +++ b/ch14-02-publishing-to-crates-io.html @@ -0,0 +1,495 @@ + + + + + + 将 crate 发布到 Crates.io - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

将 crate 发布到 Crates.io

+
+

ch14-02-publishing-to-crates-io.md
+commit 3f2a6ef48943ade3e9c0eb23d69e2b8b41f057f1

+
+

我们曾经在项目中使用 crates.io 上的包作为依赖,不过你也可以通过发布自己的包来向他人分享代码。crates.io 用来分发包的源代码,所以它主要托管开源代码。

+

Rust 和 Cargo 有一些帮助他人更方便地找到和使用你发布的包的功能。我们将介绍一些这样的功能,接着讲到如何发布一个包。

+

编写有用的文档注释

+

准确的包文档有助于其他用户理解如何以及何时使用它们,所以花一些时间编写文档是值得的。第三章中我们讨论了如何使用双斜杠 // 注释 Rust 代码。Rust 也有特定的用于文档的注释类型,通常被称为 文档注释documentation comments),它们会生成 HTML 文档。这些 HTML 展示公有 API 文档注释的内容,它们意在让对库感兴趣的程序员理解如何 使用 这个 crate,而不是它是如何被 实现 的。

+

文档注释使用三斜杠 /// 而不是双斜杠以支持 Markdown 注解来格式化文本。文档注释就位于需要文档的项的之前。示例 14-1 展示了一个 my_crate crate 中 add_one 函数的文档注释,

+

文件名:src/lib.rs

+
/// Adds one to the number given.
+///
+/// # Examples
+///
+/// ```
+/// let arg = 5;
+/// let answer = my_crate::add_one(arg);
+///
+/// assert_eq!(6, answer);
+/// ```
+pub fn add_one(x: i32) -> i32 {
+    x + 1
+}
+

示例 14-1:一个函数的文档注释

+

这里,我们提供了一个 add_one 函数工作的描述,接着开始了一个标题为 Examples 的部分,和展示如何使用 add_one 函数的代码。可以运行 cargo doc 来生成这个文档注释的 HTML 文档。这个命令运行由 Rust 分发的工具 rustdoc 并将生成的 HTML 文档放入 target/doc 目录。

+

为了方便起见,运行 cargo doc --open 会构建当前 crate 文档(同时还有所有 crate 依赖的文档)的 HTML 并在浏览器中打开。导航到 add_one 函数将会发现文档注释的文本是如何渲染的,如图 14-1 所示:

+`my_crate` 的 `add_one` 函数所渲染的文档注释 HTML +

图 14-1:add_one 函数的文档注释 HTML

+

常用(文档注释)部分

+

示例 14-1 中使用了 # Examples Markdown 标题在 HTML 中创建了一个以 “Examples” 为标题的部分。其他一些 crate 作者经常在文档注释中使用的部分有:

+
    +
  • Panics:这个函数可能会 panic! 的场景。并不希望程序崩溃的函数调用者应该确保他们不会在这些情况下调用此函数。
  • +
  • Errors:如果这个函数返回 Result,此部分描述可能会出现何种错误以及什么情况会造成这些错误,这有助于调用者编写代码来采用不同的方式处理不同的错误。
  • +
  • Safety:如果这个函数使用 unsafe 代码(这会在第二十章讨论),这一部分应该会涉及到期望函数调用者支持的确保 unsafe 块中代码正常工作的不变条件(invariants)。
  • +
+

大部分文档注释不需要所有这些部分,不过这是一个提醒你检查调用你代码的用户有兴趣了解的内容的列表。

+

文档注释作为测试

+

在文档注释中增加示例代码块是一个清楚的表明如何使用库的方法,这么做还有一个额外的好处:cargo test 也会像测试那样运行文档中的示例代码!没有什么比有例子的文档更好的了,但最糟糕的莫过于写完文档后改动了代码,而导致例子不能正常工作。尝试 cargo test 运行像示例 14-1 中 add_one 函数的文档;应该在测试结果中看到像这样的部分:

+
   Doc-tests my_crate
+
+running 1 test
+test src/lib.rs - add_one (line 5) ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.27s
+
+

现在尝试改变函数或例子来使例子中的 assert_eq! 产生 panic。再次运行 cargo test,你将会看到文档测试捕获到了例子与代码不再同步!

+

注释包含项的结构

+

文档注释风格 //! 为包含注释的项,而不是位于注释之后的项增加文档。这通常用于 crate 根文件(通常是 src/lib.rs)或模块的根文件为 crate 或模块整体提供文档。

+

作为一个例子,为了增加描述包含 add_one 函数的 my_crate crate 目的的文档,可以在 src/lib.rs 开头增加以 //! 开头的注释,如示例 14-2 所示:

+

文件名:src/lib.rs

+
//! # My Crate
+//!
+//! `my_crate` is a collection of utilities to make performing certain
+//! calculations more convenient.
+
+/// Adds one to the number given.
+// --snip--
+///
+/// # Examples
+///
+/// ```
+/// let arg = 5;
+/// let answer = my_crate::add_one(arg);
+///
+/// assert_eq!(6, answer);
+/// ```
+pub fn add_one(x: i32) -> i32 {
+    x + 1
+}
+

示例 14-2:my_crate crate 整体的文档

+

注意 //! 的最后一行之后没有任何代码。因为它们以 //! 开头而不是 ///,这是属于包含此注释的项而不是注释之后项的文档。在这个情况下时 src/lib.rs 文件,也就是 crate 根文件。这些注释描述了整个 crate。

+

如果运行 cargo doc --open,将会发现这些注释显示在 my_crate 文档的首页,位于 crate 中公有项列表之上,如图 14-2 所示:

+crate 整体注释所渲染的 HTML 文档 +

图 14-2:包含 my_crate 整体描述的注释所渲染的文档

+

位于项之中的文档注释对于描述 crate 和模块特别有用。使用它们描述其容器整体的目的来帮助 crate 用户理解你的代码组织。

+

使用 pub use 导出合适的公有 API

+

公有 API 的结构是你发布 crate 时主要需要考虑的。crate 用户没有你那么熟悉其结构,并且如果模块层级过大他们可能会难以找到所需的部分。

+

第七章介绍了如何使用 mod 关键字来将代码组织进模块中,如何使用 pub 关键字将项变为公有,和如何使用 use 关键字将项引入作用域。然而你开发时候使用的文件架构可能并不方便用户。你的结构可能是一个包含多个层级的分层结构,不过这对于用户来说并不方便。这是因为想要使用被定义在很深层级中的类型的人可能很难发现这些类型的存在。他们也可能会厌烦要使用 use my_crate::some_module::another_module::UsefulType; 而不是 use my_crate::UsefulType; 来使用类型。

+

好消息是,即使文件结构对于用户来说 不是 很方便,你也无需重新安排内部组织:你可以选择使用 pub use 重导出(re-export)项来使公有结构不同于私有结构。重导出获取位于一个位置的公有项并将其公开到另一个位置,好像它就定义在这个新位置一样。

+

例如,假设我们创建了一个描述美术信息的库 art。这个库中包含了一个有两个枚举 PrimaryColorSecondaryColor 的模块 kinds,以及一个包含函数 mix 的模块 utils,如示例 14-3 所示:

+

文件名:src/lib.rs

+
//! # Art
+//!
+//! A library for modeling artistic concepts.
+
+pub mod kinds {
+    /// The primary colors according to the RYB color model.
+    pub enum PrimaryColor {
+        Red,
+        Yellow,
+        Blue,
+    }
+
+    /// The secondary colors according to the RYB color model.
+    pub enum SecondaryColor {
+        Orange,
+        Green,
+        Purple,
+    }
+}
+
+pub mod utils {
+    use crate::kinds::*;
+
+    /// Combines two primary colors in equal amounts to create
+    /// a secondary color.
+    pub fn mix(c1: PrimaryColor, c2: PrimaryColor) -> SecondaryColor {
+        // --snip--
+        unimplemented!();
+    }
+}
+

示例 14-3:一个库 art 其组织包含 kindsutils 模块

+

cargo doc 所生成的 crate 文档首页如图 14-3 所示:

+包含 `kinds` 和 `utils` 模块的 `art` +

图 14-3:包含 kindsutils 模块的库 art 的文档首页

+

注意 PrimaryColorSecondaryColor 类型、以及 mix 函数都没有在首页中列出。我们必须点击 kindsutils 才能看到它们。

+

另一个依赖这个库的 crate 需要 use 语句来导入 art 中的项,这包含指定其当前定义的模块结构。示例 14-4 展示了一个使用 art crate 中 PrimaryColormix 项的 crate 的例子:

+

文件名:src/main.rs

+
use art::kinds::PrimaryColor;
+use art::utils::mix;
+
+fn main() {
+    let red = PrimaryColor::Red;
+    let yellow = PrimaryColor::Yellow;
+    mix(red, yellow);
+}
+

示例 14-4:一个通过导出内部结构使用 art crate 中项的 crate

+

示例 14-4 中使用 art crate 代码的作者不得不搞清楚 PrimaryColor 位于 kinds 模块而 mix 位于 utils 模块。art crate 的模块结构相比使用它的开发者来说对编写它的开发者更有意义。其内部结构并没有对尝试理解如何使用 art crate 的人提供任何有价值的信息,相反因为不得不搞清楚所需的内容在何处和必须在 use 语句中指定模块名称而显得混乱。

+

为了从公有 API 中去掉 crate 的内部组织,我们可以采用示例 14-3 中的 art crate 并增加 pub use 语句来重导出项到顶层结构,如示例 14-5 所示:

+

文件名:src/lib.rs

+
//! # Art
+//!
+//! A library for modeling artistic concepts.
+
+pub use self::kinds::PrimaryColor;
+pub use self::kinds::SecondaryColor;
+pub use self::utils::mix;
+
+pub mod kinds {
+    // --snip--
+    /// The primary colors according to the RYB color model.
+    pub enum PrimaryColor {
+        Red,
+        Yellow,
+        Blue,
+    }
+
+    /// The secondary colors according to the RYB color model.
+    pub enum SecondaryColor {
+        Orange,
+        Green,
+        Purple,
+    }
+}
+
+pub mod utils {
+    // --snip--
+    use crate::kinds::*;
+
+    /// Combines two primary colors in equal amounts to create
+    /// a secondary color.
+    pub fn mix(c1: PrimaryColor, c2: PrimaryColor) -> SecondaryColor {
+        SecondaryColor::Orange
+    }
+}
+

示例 14-5:增加 pub use 语句重导出项

+

现在此 crate 由 cargo doc 生成的 API 文档会在首页列出重导出的项以及其链接,如图 14-4 所示,这使得 PrimaryColorSecondaryColor 类型和 mix 函数更易于查找。

+Rendered documentation for the `art` crate with the re-exports on the front page +

图 14-10:art 文档的首页,这里列出了重导出的项

+

art crate 的用户仍然可以看见和选择使用示例 14-4 中的内部结构,或者可以使用示例 14-5 中更为方便的结构,如示例 14-6 所示:

+

文件名:src/main.rs

+
use art::mix;
+use art::PrimaryColor;
+
+fn main() {
+    // --snip--
+    let red = PrimaryColor::Red;
+    let yellow = PrimaryColor::Yellow;
+    mix(red, yellow);
+}
+

示例 14-6:一个使用 art crate 中重导出项的程序

+

对于有很多嵌套模块的情况,使用 pub use 将类型重导出到顶级结构对于使用 crate 的人来说将会是大为不同的体验。pub use 的另一个常见用法是重导出当前 crate 的依赖的定义使其 crate 定义变成你 crate 公有 API 的一部分。

+

创建一个有用的公有 API 结构更像是一门艺术而非科学,你可以反复检视它们来找出最适合用户的 API。pub use 提供了解耦组织 crate 内部结构和与终端用户体现的灵活性。观察一些你所安装的 crate 的代码来看看其内部结构是否不同于公有 API。

+

创建 Crates.io 账号

+

在你可以发布任何 crate 之前,需要在 crates.io 上注册账号并获取一个 API token。为此,访问位于 crates.io 的首页并使用 GitHub 账号登录。(目前 GitHub 账号是必须的,不过将来该网站可能会支持其他创建账号的方法)一旦登录之后,查看位于 https://crates.io/me/ 的账户设置页面并获取 API token。接着使用该 API token 运行 cargo login 命令,像这样:

+
$ cargo login abcdefghijklmnopqrstuvwxyz012345
+
+

这个命令会通知 Cargo 你的 API token 并将其储存在本地的 ~/.cargo/credentials 文件中。注意这个 token 是一个 秘密secret)且不应该与其他人共享。如果因为任何原因与他人共享了这个信息,应该立即到 crates.io 撤销并重新生成一个 token。

+

向新 crate 添加元信息

+

比如说你已经有一个希望发布的 crate。在发布之前,你需要在 crate 的 Cargo.toml 文件的 [package] 部分增加一些本 crate 的元信息(metadata)。

+

首先 crate 需要一个唯一的名称。虽然在本地开发 crate 时,可以使用任何你喜欢的名称。不过 crates.io 上的 crate 名称遵守先到先得的分配原则。一旦某个 crate 名称被使用,其他人就不能再发布这个名称的 crate 了。请搜索你希望使用的名称来找出它是否已被使用。如果没有,修改 Cargo.toml[package] 里的名称为你希望用于发布的名称,像这样:

+

文件名:Cargo.toml

+
[package]
+name = "guessing_game"
+
+

即使你选择了一个唯一的名称,如果此时尝试运行 cargo publish 发布该 crate 的话,会得到一个警告接着是一个错误:

+
$ cargo publish
+    Updating crates.io index
+warning: manifest has no description, license, license-file, documentation, homepage or repository.
+See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info.
+--snip--
+error: failed to publish to registry at https://crates.io
+
+Caused by:
+  the remote server responded with an error: missing or empty metadata fields: description, license. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for how to upload metadata
+
+

这个错误是因为我们缺少一些关键信息:关于该 crate 用途的描述和用户可能在何种条款下使用该 crate 的 license。在 Cargo.toml 中添加通常是一两句话的描述,因为它将在搜索结果中和你的 crate 一起显示。对于 license 字段,你需要一个 license 标识符值license identifier value)。Linux 基金会的 Software Package Data Exchange (SPDX) 列出了可以使用的标识符。例如,为了指定 crate 使用 MIT License,增加 MIT 标识符:

+

文件名:Cargo.toml

+
[package]
+name = "guessing_game"
+license = "MIT"
+
+

如果你希望使用不存在于 SPDX 的 license,则需要将 license 文本放入一个文件,将该文件包含进项目中,接着使用 license-file 来指定文件名而不是使用 license 字段。

+

关于项目所适用的 license 指导超出了本书的范畴。很多 Rust 社区成员选择与 Rust 自身相同的 license,这是一个双许可的 MIT OR Apache-2.0。这个实践展示了也可以通过 OR 分隔为项目指定多个 license 标识符。

+

那么,有了唯一的名称、版本号、由 cargo new 新建项目时增加的作者信息、描述和所选择的 license,已经准备好发布的项目的 Cargo.toml 文件可能看起来像这样:

+

文件名:Cargo.toml

+
[package]
+name = "guessing_game"
+version = "0.1.0"
+edition = "2021"
+description = "A fun game where you guess what number the computer has chosen."
+license = "MIT OR Apache-2.0"
+
+[dependencies]
+
+

Cargo 的文档 描述了其他可以指定的元信息,它们可以帮助你的 crate 更容易被发现和使用!

+

发布到 Crates.io

+

现在我们创建了一个账号,保存了 API token,为 crate 选择了一个名字,并指定了所需的元数据,你已经准备好发布了!发布 crate 会上传特定版本的 crate 到 crates.io 以供他人使用。

+

发布 crate 时请多加小心,因为发布是 永久性的permanent)。对应版本不可能被覆盖,其代码也不可能被删除。crates.io 的一个主要目标是作为一个存储代码的永久文档服务器,这样所有依赖 crates.io 中的 crate 的项目都能一直正常工作。而允许删除版本没办法达成这个目标。然而,可以被发布的版本号却没有限制。

+

再次运行 cargo publish 命令。这次它应该会成功:

+
$ cargo publish
+    Updating crates.io index
+   Packaging guessing_game v0.1.0 (file:///projects/guessing_game)
+   Verifying guessing_game v0.1.0 (file:///projects/guessing_game)
+   Compiling guessing_game v0.1.0
+(file:///projects/guessing_game/target/package/guessing_game-0.1.0)
+    Finished dev [unoptimized + debuginfo] target(s) in 0.19s
+   Uploading guessing_game v0.1.0 (file:///projects/guessing_game)
+
+

恭喜!你现在向 Rust 社区分享了代码,而且任何人都可以轻松的将你的 crate 加入他们项目的依赖。

+

发布现存 crate 的新版本

+

当你修改了 crate 并准备好发布新版本时,改变 Cargo.tomlversion 所指定的值。请使用 语义化版本规则 来根据修改的类型决定下一个版本号。接着运行 cargo publish 来上传新版本。

+

使用 cargo yank 从 Crates.io 弃用版本

+

虽然你不能删除之前版本的 crate,但是可以阻止任何将来的项目将它们加入到依赖中。这在某个版本因为这样或那样的原因被破坏的情况很有用。对于这种情况,Cargo 支持 撤回yanking)某个版本。

+

撤回某个版本会阻止新项目依赖此版本,不过所有现存此依赖的项目仍然能够下载和依赖这个版本。从本质上说,撤回意味着所有带有 Cargo.lock 的项目的依赖不会被破坏,同时任何新生成的 Cargo.lock 将不能使用被撤回的版本。

+

为了撤回一个版本的 crate,在之前发布 crate 的目录运行 cargo yank 并指定希望撤回的版本。例如,如果我们发布了一个名为 guessing_game 的 crate 的 1.0.1 版本并希望撤回它,在 guessing_game 项目目录运行:

+
$ cargo yank --vers 1.0.1
+    Updating crates.io index
+        Yank guessing_game@1.0.1
+
+

也可以撤销撤回操作,并允许项目可以再次开始依赖某个版本,通过在命令上增加 --undo

+
$ cargo yank --vers 1.0.1 --undo
+    Updating crates.io index
+      Unyank guessing_game@1.0.1
+
+

撤回 并没有 删除任何代码。举例来说,撤回功能并不能删除不小心上传的秘密信息。如果出现了这种情况,请立即重新设置这些秘密信息。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch14-03-cargo-workspaces.html b/ch14-03-cargo-workspaces.html new file mode 100644 index 000000000..712bc570f --- /dev/null +++ b/ch14-03-cargo-workspaces.html @@ -0,0 +1,429 @@ + + + + + + Cargo 工作空间 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Cargo 工作空间

+
+

ch14-03-cargo-workspaces.md +
+commit 704c51eec2f26a0133ae17a2c01986590c05a045

+
+

第十二章中,我们构建一个包含二进制 crate 和库 crate 的包。你可能会发现,随着项目开发的深入,库 crate 持续增大,而你希望将其进一步拆分成多个库 crate。Cargo 提供了一个叫 工作空间workspaces)的功能,它可以帮助我们管理多个相关的协同开发的包。

+

创建工作空间

+

工作空间 是一系列共享同样的 Cargo.lock 和输出目录的包。让我们使用工作空间创建一个项目 —— 这里采用常见的代码以便可以关注工作空间的结构。有多种组织工作空间的方式,所以我们只展示一个常用方法。我们的工作空间有一个二进制项目和两个库。二进制项目会提供主要功能,并会依赖另两个库。一个库会提供 add_one 方法而第二个会提供 add_two 方法。这三个 crate 将会是相同工作空间的一部分。让我们以新建工作空间目录开始:

+
$ mkdir add
+$ cd add
+
+

接着在 add 目录中,创建 Cargo.toml 文件。这个 Cargo.toml 文件配置了整个工作空间。它不会包含 [package] 部分。相反,它以 [workspace] 部分作为开始,并通过指定 adder 的路径来为工作空间增加成员,如下会加入二进制 crate:

+

文件名:Cargo.toml

+
[workspace]
+
+members = [
+    "adder",
+]
+
+

接下来,在 add 目录运行 cargo new 新建 adder 二进制 crate:

+
$ cargo new adder
+     Created binary (application) `adder` package
+
+

到此为止,可以运行 cargo build 来构建工作空间。add 目录中的文件应该看起来像这样:

+
├── Cargo.lock
+├── Cargo.toml
+├── adder
+│   ├── Cargo.toml
+│   └── src
+│       └── main.rs
+└── target
+
+

工作空间在顶级目录有一个 target 目录;adder 并没有自己的 target 目录。即使进入 adder 目录运行 cargo build,构建结果也位于 add/target 而不是 add/adder/target。工作空间中的 crate 之间相互依赖。如果每个 crate 有其自己的 target 目录,为了在自己的 target 目录中生成构建结果,工作空间中的每一个 crate 都不得不相互重新编译其他 crate。通过共享一个 target 目录,工作空间可以避免其他 crate 重复构建。

+

在工作空间中创建第二个包

+

接下来,让我们在工作空间中指定另一个成员 crate。这个 crate 位于 add_one 目录中,所以修改顶级 Cargo.toml 为也包含 add_one 路径:

+

文件名:Cargo.toml

+
[workspace]
+
+members = [
+    "adder",
+    "add_one",
+]
+
+

接着新生成一个叫做 add_one 的库:

+
$ cargo new add_one --lib
+     Created library `add_one` package
+
+

现在 add 目录应该有如下目录和文件:

+
├── Cargo.lock
+├── Cargo.toml
+├── add_one
+│   ├── Cargo.toml
+│   └── src
+│       └── lib.rs
+├── adder
+│   ├── Cargo.toml
+│   └── src
+│       └── main.rs
+└── target
+
+

add_one/src/lib.rs 文件中,增加一个 add_one 函数:

+

文件名:add_one/src/lib.rs

+
pub fn add_one(x: i32) -> i32 {
+    x + 1
+}
+

现在我们有了二进制 adder 依赖库 crate add_one。首先需要在 adder/Cargo.toml 文件中增加 add_one 作为路径依赖:

+

文件名:adder/Cargo.toml

+
[dependencies]
+add_one = { path = "../add_one" }
+
+

cargo 并不假定工作空间中的 Crates 会相互依赖,所以需要明确表明工作空间中 crate 的依赖关系。

+

接下来,在 adder crate 中使用( add_one crate 中的)函数 add_one。打开 adder/src/main.rs 在顶部增加一行 use 将新 add_one 库 crate 引入作用域。接着修改 main 函数来调用 add_one 函数,如示例 14-7 所示。

+

文件名:adder/src/main.rs

+
use add_one;
+
+fn main() {
+    let num = 10;
+    println!("Hello, world! {num} plus one is {}!", add_one::add_one(num));
+}
+

示例 14-7:在 adder crate 中使用 add_one 库 crate

+

add 目录中运行 cargo build 来构建工作空间!

+
$ cargo build
+   Compiling add_one v0.1.0 (file:///projects/add/add_one)
+   Compiling adder v0.1.0 (file:///projects/add/adder)
+    Finished dev [unoptimized + debuginfo] target(s) in 0.68s
+
+

为了在顶层 add 目录运行二进制 crate,可以通过 -p 参数和包名称来运行 cargo run 指定工作空间中我们希望使用的包:

+
$ cargo run -p adder
+    Finished dev [unoptimized + debuginfo] target(s) in 0.0s
+     Running `target/debug/adder`
+Hello, world! 10 plus one is 11!
+
+

这会运行 adder/src/main.rs 中的代码,其依赖 add_one crate

+

在工作空间中依赖外部包

+

还需注意的是工作空间只在根目录有一个 Cargo.lock,而不是在每一个 crate 目录都有 Cargo.lock。这确保了所有的 crate 都使用完全相同版本的依赖。如果在 Cargo.tomladd_one/Cargo.toml 中都增加 rand crate,则 Cargo 会将其都解析为同一版本并记录到唯一的 Cargo.lock 中。使得工作空间中的所有 crate 都使用相同的依赖意味着其中的 crate 都是相互兼容的。让我们在 add_one/Cargo.toml 中的 [dependencies] 部分增加 rand crate 以便能够在 add_one crate 中使用 rand crate:

+

文件名:add_one/Cargo.toml

+
[dependencies]
+rand = "0.8.5"
+
+

现在就可以在 add_one/src/lib.rs 中增加 use rand; 了,接着在 add 目录运行 cargo build 构建整个工作空间就会引入并编译 rand crate:

+
$ cargo build
+    Updating crates.io index
+  Downloaded rand v0.8.5
+   --snip--
+   Compiling rand v0.8.5
+   Compiling add_one v0.1.0 (file:///projects/add/add_one)
+warning: unused import: `rand`
+ --> add_one/src/lib.rs:1:5
+  |
+1 | use rand;
+  |     ^^^^
+  |
+  = note: `#[warn(unused_imports)]` on by default
+
+warning: `add_one` (lib) generated 1 warning
+   Compiling adder v0.1.0 (file:///projects/add/adder)
+    Finished dev [unoptimized + debuginfo] target(s) in 10.18s
+
+

现在顶级的 Cargo.lock 包含了 add_onerand 依赖的信息。然而,即使 rand 被用于工作空间的某处,也不能在其他 crate 中使用它,除非也在它们的 Cargo.toml 中加入 rand。例如,如果在顶级的 adder crate 的 adder/src/main.rs 中增加 use rand;,会得到一个错误:

+
$ cargo build
+  --snip--
+   Compiling adder v0.1.0 (file:///projects/add/adder)
+error[E0432]: unresolved import `rand`
+ --> adder/src/main.rs:2:5
+  |
+2 | use rand;
+  |     ^^^^ no external crate `rand`
+
+

为了修复这个错误,修改顶级 adder crate 的 Cargo.toml 来表明 rand 也是这个 crate 的依赖。构建 adder crate 会将 rand 加入到 Cargo.lockadder 的依赖列表中,但是这并不会下载 rand 的额外拷贝。Cargo 确保了工作空间中任何使用 rand 的 crate 都采用相同的版本,这节省了空间并确保了工作空间中的 crate 将是相互兼容的。

+

为工作空间增加测试

+

作为另一个提升,让我们为 add_one crate 中的 add_one::add_one 函数增加一个测试:

+

文件名:add_one/src/lib.rs

+
pub fn add_one(x: i32) -> i32 {
+    x + 1
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn it_works() {
+        assert_eq!(3, add_one(2));
+    }
+}
+

在顶级 add 目录运行 cargo test。在像这样的工作空间结构中运行 cargo test 会运行工作空间中所有 crate 的测试。:

+
$ cargo test
+   Compiling add_one v0.1.0 (file:///projects/add/add_one)
+   Compiling adder v0.1.0 (file:///projects/add/adder)
+    Finished test [unoptimized + debuginfo] target(s) in 0.27s
+     Running unittests src/lib.rs (target/debug/deps/add_one-f0253159197f7841)
+
+running 1 test
+test tests::it_works ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+     Running unittests src/main.rs (target/debug/deps/adder-49979ff40686fa8e)
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests add_one
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+

输出的第一部分显示 add_one crate 的 it_works 测试通过了。下一个部分显示 adder crate 中找到了 0 个测试,最后一部分显示 add_one crate 中有 0 个文档测试。

+

也可以选择运行工作空间中特定 crate 的测试,通过在根目录使用 -p 参数并指定希望测试的 crate 名称:

+
$ cargo test -p add_one
+    Finished test [unoptimized + debuginfo] target(s) in 0.00s
+     Running unittests src/lib.rs (target/debug/deps/add_one-b3235fea9a156f74)
+
+running 1 test
+test tests::it_works ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+   Doc-tests add_one
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+

输出显示了 cargo test 只运行了 add_one crate 的测试而没有运行 adder crate 的测试。

+

如果你选择向 crates.io发布工作空间中的 crate,每一个工作空间中的 crate 需要单独发布。就像 cargo test 一样,可以通过 -p 参数并指定期望发布的 crate 名来发布工作空间中的某个特定的 crate。

+

现在尝试以类似 add_one crate 的方式向工作空间增加 add_two crate 来作为更多的练习!

+

随着项目增长,考虑使用工作空间:每一个更小的组件比一大块代码要容易理解。如果它们经常需要同时被修改的话,将 crate 保持在工作空间中更易于协调 crate 的改变。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch14-04-installing-binaries.html b/ch14-04-installing-binaries.html new file mode 100644 index 000000000..98cb601a1 --- /dev/null +++ b/ch14-04-installing-binaries.html @@ -0,0 +1,259 @@ + + + + + + 使用 cargo install 安装二进制文件 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用 cargo install 安装二进制文件

+
+

ch14-04-installing-binaries.md +
+commit 704c51eec2f26a0133ae17a2c01986590c05a045

+
+

cargo install 命令用于在本地安装和使用二进制 crate。它并不打算替换系统中的包;它意在作为一个方便 Rust 开发者们安装其他人已经在 crates.io 上共享的工具的手段。只有拥有二进制目标文件的包能够被安装。二进制目标 文件是在 crate 有 src/main.rs 或者其他指定为二进制文件时所创建的可执行程序,这不同于自身不能执行但适合包含在其他程序中的库目标文件。通常 crate 的 README 文件中有该 crate 是库、二进制目标还是两者兼有的信息。

+

所有来自 cargo install 的二进制文件都安装到 Rust 安装根目录的 bin 文件夹中。如果你是使用 rustup.rs 来安装 Rust 且没有自定义任何配置,这个目录将是 $HOME/.cargo/bin。确保将这个目录添加到 $PATH 环境变量中就能够运行通过 cargo install 安装的程序了。

+

例如,第十二章提到的叫做 ripgrep 的用于搜索文件的 grep 的 Rust 实现。为了安装 ripgrep 运行如下:

+
$ cargo install ripgrep
+    Updating crates.io index
+  Downloaded ripgrep v13.0.0
+  Downloaded 1 crate (243.3 KB) in 0.88s
+  Installing ripgrep v13.0.0
+--snip--
+   Compiling ripgrep v13.0.0
+    Finished release [optimized + debuginfo] target(s) in 3m 10s
+  Installing ~/.cargo/bin/rg
+   Installed package `ripgrep v13.0.0` (executable `rg`)
+
+

最后一行输出展示了安装的二进制文件的位置和名称,在这里 ripgrep 被命名为 rg。只要你像上面提到的那样将安装目录加入 $PATH,就可以运行 rg --help 并开始使用一个更快更 Rust 的工具来搜索文件了!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch14-05-extending-cargo.html b/ch14-05-extending-cargo.html new file mode 100644 index 000000000..010b4607e --- /dev/null +++ b/ch14-05-extending-cargo.html @@ -0,0 +1,247 @@ + + + + + + Cargo 自定义扩展命令 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Cargo 自定义扩展命令

+
+

ch14-05-extending-cargo.md +
+commit c084bdd9ee328e7e774df19882ccc139532e53d8

+
+

Cargo 的设计使得开发者可以通过新的子命令来对 Cargo 进行扩展,而无需修改 Cargo 本身。如果 $PATH 中有类似 cargo-something 的二进制文件,就可以通过 cargo something 来像 Cargo 子命令一样运行它。像这样的自定义命令也可以运行 cargo --list 来展示出来。能够通过 cargo install 向 Cargo 安装扩展并可以如内建 Cargo 工具那样运行它们是 Cargo 设计上的一个非常方便的优点!

+

总结

+

通过 Cargo 和 crates.io 来分享代码是使得 Rust 生态环境可以用于许多不同的任务的重要组成部分。Rust 的标准库是小而稳定的,不过 crate 易于分享和使用,并采用一个不同语言自身的时间线来提供改进。不要羞于在 crates.io 上共享对你有用的代码,因为它很有可能对别人也很有用!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch15-00-smart-pointers.html b/ch15-00-smart-pointers.html new file mode 100644 index 000000000..62bf46ad1 --- /dev/null +++ b/ch15-00-smart-pointers.html @@ -0,0 +1,256 @@ + + + + + + 智能指针 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

智能指针

+
+

ch15-00-smart-pointers.md +
+commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e

+
+

指针pointer)是一个包含内存地址的变量的通用概念。这个地址引用,或 “指向”(points at)一些其他数据。Rust 中最常见的指针是第四章介绍的 引用reference)。引用以 & 符号为标志并借用了它们所指向的值。除了引用数据没有任何其他特殊功能,也没有额外开销。

+

另一方面,智能指针smart pointers)是一类数据结构,它们的表现类似指针,但是也拥有额外的元数据和功能。智能指针的概念并不为 Rust 所独有;其起源于 C++ 并存在于其他语言中。Rust 标准库中定义了多种不同的智能指针,它们提供了多于引用的额外功能。为了探索其基本概念,我们来看看一些智能指针的例子,这包括 引用计数reference counting)智能指针类型。这种指针允许数据有多个所有者,它会记录所有者的数量,当没有所有者时清理数据。在 Rust 中因为引用和借用,普通引用和智能指针的一个额外的区别是引用是一类只借用数据的指针;相反,在大部分情况下,智能指针 拥有 它们指向的数据。

+

实际上本书中已经出现过一些智能指针,比如第八章的 StringVec<T>,虽然当时并没有这样称呼它们。这些类型都属于智能指针,因为它们拥有一些数据,并允许你修改这些数据。它们也拥有元数据和额外的功能或保证。例如 String 存储了其容量作为元数据,并拥有额外的能力来确保其数据总是有效的 UTF-8 编码。

+

智能指针通常使用结构体实现。智能指针不同于结构体的地方在于其实现了 DerefDrop trait。Deref trait 允许智能指针结构体实例表现的像引用一样,这样就可以编写既用于引用、又用于智能指针的代码。Drop trait 允许我们自定义当智能指针离开作用域时运行的代码。本章会讨论这些 trait 以及为什么对于智能指针来说它们很重要。

+

考虑到智能指针是一个在 Rust 经常被使用的通用设计模式,本章并不会覆盖所有现存的智能指针。很多库都有自己的智能指针而你也可以编写属于你自己的智能指针。这里将会讲到的是来自标准库中最常用的一些:

+
    +
  • Box<T>,用于在堆上分配值
  • +
  • Rc<T>,一个引用计数类型,其数据可以有多个所有者
  • +
  • Ref<T>RefMut<T>,通过 RefCell<T> 访问。( RefCell<T> 是一个在运行时而不是在编译时执行借用规则的类型)。
  • +
+

另外我们会涉及 内部可变性interior mutability)模式,这是不可变类型暴露出改变其内部值的 API。我们也会讨论 引用循环reference cycles)会如何泄漏内存,以及如何避免。

+

让我们开始吧!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch15-01-box.html b/ch15-01-box.html new file mode 100644 index 000000000..795037c3b --- /dev/null +++ b/ch15-01-box.html @@ -0,0 +1,372 @@ + + + + + + 使用 Box<T> 指向堆上数据 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用Box<T>指向堆上的数据

+
+

ch15-01-box.md +
+commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e

+
+

最简单直接的智能指针是 box,其类型是 Box<T>。box 允许你将一个值放在堆上而不是栈上。留在栈上的则是指向堆数据的指针。如果你想回顾一下栈与堆的区别请参考第四章。

+

除了数据被储存在堆上而不是栈上之外,box 没有性能损失。不过也没有很多额外的功能。它们多用于如下场景:

+
    +
  • 当有一个在编译时未知大小的类型,而又想要在需要确切大小的上下文中使用这个类型值的时候
  • +
  • 当有大量数据并希望在确保数据不被拷贝的情况下转移所有权的时候
  • +
  • 当希望拥有一个值并只关心它的类型是否实现了特定 trait 而不是其具体类型的时候
  • +
+

我们会在 “box 允许创建递归类型” 部分展示第一种场景。在第二种情况中,转移大量数据的所有权可能会花费很长的时间,因为数据在栈上进行了拷贝。为了改善这种情况下的性能,可以通过 box 将这些数据储存在堆上。接着,只有少量的指针数据在栈上被拷贝。第三种情况被称为 trait 对象trait object),第十八章刚好有一整个部分 “顾及不同类型值的 trait 对象” 专门讲解这个主题。所以这里所学的内容会在第十八章再次用上!

+

使用 Box<T> 在堆上储存数据

+

在讨论 Box<T> 的堆存储用例之前,让我们熟悉一下语法以及如何与储存在 Box<T> 中的值进行交互。

+

示例 15-1 展示了如何使用 box 在堆上储存一个 i32

+

文件名:src/main.rs

+
fn main() {
+    let b = Box::new(5);
+    println!("b = {b}");
+}
+

示例 15-1:使用 box 在堆上储存一个 i32

+

这里定义了变量 b,其值是一个指向被分配在堆上的值 5Box。这个程序会打印出 b = 5;在这个例子中,我们可以像数据是储存在栈上的那样访问 box 中的数据。正如任何拥有数据所有权的值那样,当像 b 这样的 box 在 main 的末尾离开作用域时,它将被释放。这个释放过程作用于 box 本身(位于栈上)和它所指向的数据(位于堆上)。

+

将一个单独的值存放在堆上并不是很有意义,所以像示例 15-1 这样单独使用 box 并不常见。将像单个 i32 这样的值储存在栈上,也就是其默认存放的地方在大部分使用场景中更为合适。让我们看看一个不使用 box 时无法定义的类型的例子。

+

Box 允许创建递归类型

+

递归类型recursive type)的值可以拥有另一个同类型的值作为其自身的一部分。但是这会产生一个问题,因为 Rust 需要在编译时知道类型占用多少空间。递归类型的值嵌套理论上可以无限地进行下去,所以 Rust 不知道递归类型需要多少空间。因为 box 有一个已知的大小,所以通过在循环类型定义中插入 box,就可以创建递归类型了。

+

作为一个递归类型的例子,让我们探索一下 cons list。这是一个函数式编程语言中常见的数据类型,来展示这个(递归类型)概念。除了递归之外,我们将要定义的 cons list 类型是很直白的,所以这个例子中的概念,在任何遇到更为复杂的涉及到递归类型的场景时都很实用。

+

cons list 的更多内容

+

cons list 是一个来源于 Lisp 编程语言及其方言的数据结构,它由嵌套的列表组成。它的名字来源于 Lisp 中的 cons 函数(“construct function" 的缩写),它利用两个参数来构造一个新的列表。通过对一个包含值的列表和另一个值调用 cons,可以构建由递归列表组成的 cons list。

+

例如这里有一个包含列表 1,2,3 的 cons list 的伪代码表示,其每一个列表在一个括号中:

+
(1, (2, (3, Nil)))
+
+

cons list 的每一项都包含两个元素:当前项的值和下一项。其最后一项值包含一个叫做 Nil 的值且没有下一项。cons list 通过递归调用 cons 函数产生。代表递归的终止条件(base case)的规范名称是 Nil,它宣布列表的终止。注意这不同于第六章中的 “null” 或 “nil” 的概念,它们代表无效或缺失的值。

+

cons list 并不是一个 Rust 中常见的类型。大部分在 Rust 中需要列表的时候,Vec<T> 是一个更好的选择。其他更为复杂的递归数据类型 确实 在 Rust 的很多场景中很有用,不过通过以 cons list 作为开始,我们可以探索如何使用 box 毫不费力的定义一个递归数据类型。

+

示例 15-2 包含一个 cons list 的枚举定义。注意这还不能编译因为这个类型没有已知的大小,之后我们会展示:

+

文件名:src/main.rs

+
enum List {
+    Cons(i32, List),
+    Nil,
+}
+
+fn main() {}
+

示例 15-2:第一次尝试定义一个代表 i32 值的 cons list 数据结构的枚举

+
+

注意:出于示例的需要我们选择实现一个只存放 i32 值的 cons list。也可以用泛型,正如第十章讲到的,来定义一个可以存放任何类型值的 cons list 类型。

+
+

使用这个 cons list 来储存列表 1, 2, 3 将看起来如示例 15-3 所示:

+

文件名:src/main.rs

+
enum List {
+    Cons(i32, List),
+    Nil,
+}
+
+use crate::List::{Cons, Nil};
+
+fn main() {
+    let list = Cons(1, Cons(2, Cons(3, Nil)));
+}
+

示例 15-3:使用 List 枚举储存列表 1, 2, 3

+

第一个 Cons 储存了 1 和另一个 List 值。这个 List 是另一个包含 2Cons 值和下一个 List 值。接着又有另一个存放了 3Cons 值和最后一个值为 NilList,非递归成员代表了列表的结尾。

+

如果尝试编译示例 15-3 的代码,会得到如示例 15-4 所示的错误:

+
$ cargo run
+   Compiling cons-list v0.1.0 (file:///projects/cons-list)
+error[E0072]: recursive type `List` has infinite size
+ --> src/main.rs:1:1
+  |
+1 | enum List {
+  | ^^^^^^^^^
+2 |     Cons(i32, List),
+  |               ---- recursive without indirection
+  |
+help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle
+  |
+2 |     Cons(i32, Box<List>),
+  |               ++++    +
+
+error[E0391]: cycle detected when computing when `List` needs drop
+ --> src/main.rs:1:1
+  |
+1 | enum List {
+  | ^^^^^^^^^
+  |
+  = note: ...which immediately requires computing when `List` needs drop again
+  = note: cycle used when computing whether `List` needs drop
+  = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
+
+Some errors have detailed explanations: E0072, E0391.
+For more information about an error, try `rustc --explain E0072`.
+error: could not compile `cons-list` (bin "cons-list") due to 2 previous errors
+
+

示例 15-4:尝试定义一个递归枚举时得到的错误

+

这个错误表明这个类型 “有无限的大小”。其原因是 List 的一个成员被定义为是递归的:它直接存放了另一个相同类型的值。这意味着 Rust 无法计算为了存放 List 值到底需要多少空间。让我们拆开来看为何会得到这个错误。首先了解一下 Rust 如何决定需要多少空间来存放一个非递归类型。

+

计算非递归类型的大小

+

回忆一下第六章讨论枚举定义时示例 6-2 中定义的 Message 枚举:

+
enum Message {
+    Quit,
+    Move { x: i32, y: i32 },
+    Write(String),
+    ChangeColor(i32, i32, i32),
+}
+
+fn main() {}
+

当 Rust 需要知道要为 Message 值分配多少空间时,它可以检查每一个成员并发现 Message::Quit 并不需要任何空间,Message::Move 需要足够储存两个 i32 值的空间,依此类推。因为 enum 实际上只会使用其中的一个成员,所以 Message 值所需的空间等于储存其最大成员的空间大小。

+

与此相对当 Rust 编译器检查像示例 15-2 中的 List 这样的递归类型时会发生什么呢。编译器尝试计算出储存一个 List 枚举需要多少内存,并开始检查 Cons 成员,那么 Cons 需要的空间等于 i32 的大小加上 List 的大小。为了计算 List 需要多少内存,它检查其成员,从 Cons 成员开始。Cons成员储存了一个 i32 值和一个List值,这样的计算将无限进行下去,如图 15-1 所示:

+An infinite Cons list +

图 15-1:一个包含无限个 Cons 成员的无限 List

+

使用 Box<T> 给递归类型一个已知的大小

+

因为 Rust 无法计算出要为定义为递归的类型分配多少空间,所以编译器给出了一个包括了有用建议的错误:

+
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `List` representable
+  |
+2 |     Cons(i32, Box<List>),
+  |               ++++    +
+
+

在建议中,“indirection” 意味着不同于直接储存一个值,应该间接的储存一个指向值的指针。

+

因为 Box<T> 是一个指针,我们总是知道它需要多少空间:指针的大小并不会根据其指向的数据量而改变。这意味着可以将 Box 放入 Cons 成员中而不是直接存放另一个 List 值。Box 会指向另一个位于堆上的 List 值,而不是存放在 Cons 成员中。从概念上讲,我们仍然有一个通过在其中 “存放” 其他列表创建的列表,不过现在实现这个概念的方式更像是一个项挨着另一项,而不是一项包含另一项。

+

我们可以修改示例 15-2 中 List 枚举的定义和示例 15-3 中对 List 的应用,如示例 15-65 所示,这是可以编译的:

+

文件名:src/main.rs

+
enum List {
+    Cons(i32, Box<List>),
+    Nil,
+}
+
+use crate::List::{Cons, Nil};
+
+fn main() {
+    let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));
+}
+

示例 15-5:为了拥有已知大小而使用 Box<T>List 定义

+

Cons 成员将会需要一个 i32 的大小加上储存 box 指针数据的空间。Nil 成员不储存值,所以它比 Cons 成员需要更少的空间。现在我们知道了任何 List 值最多需要一个 i32 加上 box 指针数据的大小。通过使用 box,打破了这无限递归的连锁,这样编译器就能够计算出储存 List 值需要的大小了。图 15-2 展示了现在 Cons 成员看起来像什么:

+A finite Cons list +

图 15-2:因为 Cons 存放一个 Box 所以 List 不是无限大小的了

+

box 只提供了间接存储和堆分配;它们并没有任何其他特殊的功能,比如我们将会见到的其他智能指针。它们也没有这些特殊功能带来的性能损失,所以它们可以用于像 cons list 这样间接存储是唯一所需功能的场景。我们还将在第十八章看到 box 的更多应用场景。

+

Box<T> 类型是一个智能指针,因为它实现了 Deref trait,它允许 Box<T> 值被当作引用对待。当 Box<T> 值离开作用域时,由于 Box<T> 类型 Drop trait 的实现,box 所指向的堆数据也会被清除。这两个 trait 对于在本章余下讨论的其他智能指针所提供的功能中,将会更为重要。让我们更详细的探索一下这两个 trait。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch15-02-deref.html b/ch15-02-deref.html new file mode 100644 index 000000000..15acc5406 --- /dev/null +++ b/ch15-02-deref.html @@ -0,0 +1,454 @@ + + + + + + 使用 Deref Trait 将智能指针当作常规引用处理 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

通过 Deref trait 将智能指针当作常规引用处理

+
+

ch15-02-deref.md +
+commit 0514b1cf34c2eaab8285f43305c10a87f4ce34a0

+
+

实现 Deref trait 允许我们重载 解引用运算符dereference operator*(不要与乘法运算符或通配符相混淆)。通过这种方式实现 Deref trait 的智能指针可以被当作常规引用来对待,可以编写操作引用的代码并用于智能指针。

+

让我们首先看看解引用运算符如何处理常规引用,接着尝试定义我们自己的类似 Box<T> 的类型并看看为何解引用运算符不能像引用一样工作。我们会探索如何实现 Deref trait 使得智能指针以类似引用的方式工作变为可能。最后,我们会讨论 Rust 的 Deref 强制转换deref coercions)功能以及它是如何处理引用或智能指针的。

+
+

我们将要构建的 MyBox<T> 类型与真正的 Box<T> 有一个很大的区别:我们的版本不会在堆上储存数据。这个例子重点关注 Deref,所以其数据实际存放在何处,相比其类似指针的行为来说不算重要。

+
+

追踪指针的值

+

常规引用是一个指针类型,一种理解指针的方式是将其看成指向储存在其他某处值的箭头。在示例 15-6 中,创建了一个 i32 值的引用,接着使用解引用运算符来跟踪所引用的值:

+

文件名:src/main.rs

+
fn main() {
+    let x = 5;
+    let y = &x;
+
+    assert_eq!(5, x);
+    assert_eq!(5, *y);
+}
+

示例 15-6:使用解引用运算符来跟踪 i32 值的引用

+

变量 x 存放了一个 i325y 等于 x 的一个引用。可以断言 x 等于 5。然而,如果希望对 y 的值做出断言,必须使用 *y 来追踪引用所指向的值(也就是 解引用),这样编译器就可以比较实际的值了。一旦解引用了 y,就可以访问 y 所指向的整型值并可以与 5 做比较。

+

相反如果尝试编写 assert_eq!(5, y);,则会得到如下编译错误:

+
$ cargo run
+   Compiling deref-example v0.1.0 (file:///projects/deref-example)
+error[E0277]: can't compare `{integer}` with `&{integer}`
+ --> src/main.rs:6:5
+  |
+6 |     assert_eq!(5, y);
+  |     ^^^^^^^^^^^^^^^^ no implementation for `{integer} == &{integer}`
+  |
+  = help: the trait `PartialEq<&{integer}>` is not implemented for `{integer}`
+  = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+For more information about this error, try `rustc --explain E0277`.
+error: could not compile `deref-example` (bin "deref-example") due to 1 previous error
+
+

不允许比较数字的引用与数字,因为它们是不同的类型。必须使用解引用运算符追踪引用所指向的值。

+

像引用一样使用 Box<T>

+

可以使用 Box<T> 代替引用来重写示例 15-6 中的代码,示例 15-7 中 Box<T> 上使用的解引用运算符与示例 15-6 中引用上使用的解引用运算符有着一样的功能:

+

文件名:src/main.rs

+
fn main() {
+    let x = 5;
+    let y = Box::new(x);
+
+    assert_eq!(5, x);
+    assert_eq!(5, *y);
+}
+

示例 15-7:在 Box<i32> 上使用解引用运算符

+

示例 15-7 相比示例 15-6 主要不同的地方就是将 y 设置为一个指向 x 值拷贝的 Box<T> 实例,而不是指向 x 值的引用。在最后的断言中,可以使用解引用运算符以 y 为引用时相同的方式追踪 Box<T> 的指针。接下来让我们通过实现自己的类型来探索 Box<T> 能这么做有何特殊之处。

+

自定义智能指针

+

为了体会默认情况下智能指针与引用的不同,让我们创建一个类似于标准库提供的 Box<T> 类型的智能指针。接着学习如何增加使用解引用运算符的功能。

+

从根本上说,Box<T> 被定义为包含一个元素的元组结构体,所以示例 15-8 以相同的方式定义了 MyBox<T> 类型。我们还定义了 new 函数来对应定义于 Box<T>new 函数:

+

文件名:src/main.rs

+
struct MyBox<T>(T);
+
+impl<T> MyBox<T> {
+    fn new(x: T) -> MyBox<T> {
+        MyBox(x)
+    }
+}
+
+fn main() {}
+

示例 15-8:定义 MyBox<T> 类型

+

这里定义了一个结构体 MyBox 并声明了一个泛型参数 T,因为我们希望其可以存放任何类型的值。MyBox 是一个包含 T 类型元素的元组结构体。MyBox::new 函数获取一个 T 类型的参数并返回一个存放传入值的 MyBox 实例。

+

尝试将示例 15-7 中的代码加入示例 15-8 中并修改 main 使用我们定义的 MyBox<T> 类型代替 Box<T>。示例 15-9 中的代码不能编译,因为 Rust 不知道如何解引用 MyBox

+

文件名:src/main.rs

+
struct MyBox<T>(T);
+
+impl<T> MyBox<T> {
+    fn new(x: T) -> MyBox<T> {
+        MyBox(x)
+    }
+}
+
+fn main() {
+    let x = 5;
+    let y = MyBox::new(x);
+
+    assert_eq!(5, x);
+    assert_eq!(5, *y);
+}
+

示例 15-9:尝试以使用引用和 Box<T> 相同的方式使用 MyBox<T>

+

得到的编译错误是:

+
$ cargo run
+   Compiling deref-example v0.1.0 (file:///projects/deref-example)
+error[E0614]: type `MyBox<{integer}>` cannot be dereferenced
+  --> src/main.rs:14:19
+   |
+14 |     assert_eq!(5, *y);
+   |                   ^^
+
+For more information about this error, try `rustc --explain E0614`.
+error: could not compile `deref-example` (bin "deref-example") due to 1 previous error
+
+

MyBox<T> 类型不能解引用,因为我们尚未在该类型实现这个功能。为了启用 * 运算符的解引用功能,需要实现 Deref trait。

+

通过实现 Deref trait 将某类型像引用一样处理

+

如第十章 “为类型实现 trait” 部分所讨论的,为了实现 trait,需要提供 trait 所需的方法实现。Deref trait,由标准库提供,要求实现名为 deref 的方法,其借用 self 并返回一个内部数据的引用。示例 15-10 包含定义于 MyBox 之上的 Deref 实现:

+

文件名:src/main.rs

+
use std::ops::Deref;
+
+impl<T> Deref for MyBox<T> {
+    type Target = T;
+
+    fn deref(&self) -> &Self::Target {
+        &self.0
+    }
+}
+
+struct MyBox<T>(T);
+
+impl<T> MyBox<T> {
+    fn new(x: T) -> MyBox<T> {
+        MyBox(x)
+    }
+}
+
+fn main() {
+    let x = 5;
+    let y = MyBox::new(x);
+
+    assert_eq!(5, x);
+    assert_eq!(5, *y);
+}
+

示例 15-10:MyBox<T> 上的 Deref 实现

+

type Target = T; 语法定义了用于此 trait 的关联类型。关联类型是一个稍有不同的定义泛型参数的方式,现在还无需过多的担心它;第二十章会详细介绍。

+

deref 方法体中写入了 &self.0,这样 deref 返回了我希望通过 * 运算符访问的值的引用。回忆一下第五章 “使用没有命名字段的元组结构体来创建不同的类型” 部分 .0 用来访问元组结构体的第一个元素。示例 15-9 中的 main 函数中对 MyBox<T> 值的 * 调用现在可以编译并能通过断言了!

+

没有 Deref trait 的话,编译器只会解引用 & 引用类型。deref 方法向编译器提供了获取任何实现了 Deref trait 的类型的值,并且调用这个类型的 deref 方法来获取一个它知道如何解引用的 & 引用的能力。

+

当我们在示例 15-9 中输入 *y 时,Rust 事实上在底层运行了如下代码:

+
*(y.deref())
+

Rust 将 * 运算符替换为先调用 deref 方法再进行普通解引用的操作,如此我们便不用担心是否还需手动调用 deref 方法了。Rust 的这个特性可以让我们写出行为一致的代码,无论是面对的是常规引用还是实现了 Deref 的类型。

+

deref 方法返回值的引用,以及 *(y.deref()) 括号外边的普通解引用仍为必须的原因在于所有权。如果 deref 方法直接返回值而不是值的引用,其值(的所有权)将被移出 self。在这里以及大部分使用解引用运算符的情况下我们并不希望获取 MyBox<T> 内部值的所有权。

+

注意,每次当我们在代码中使用 * 时, * 运算符都被替换成了先调用 deref 方法再接着使用 * 解引用的操作,且只会发生一次,不会对 * 操作符无限递归替换,解引用出上面 i32 类型的值就停止了,这个值与示例 15-9 中 assert_eq!5 相匹配。

+

函数和方法的隐式 Deref 强制转换

+

Deref 强制转换deref coercions)将实现了 Deref trait 的类型的引用转换为另一种类型的引用。例如,Deref 强制转换可以将 &String 转换为 &str,因为 String 实现了 Deref trait 因此可以返回 &str。Deref 强制转换是 Rust 在函数或方法传参上的一种便利操作,并且只能作用于实现了 Deref trait 的类型。当这种特定类型的引用作为实参传递给和形参类型不同的函数或方法时将自动进行。这时会有一系列的 deref 方法被调用,把我们提供的类型转换成了参数所需的类型。

+

Deref 强制转换的加入使得 Rust 程序员编写函数和方法调用时无需增加过多显式使用 &* 的引用和解引用。这个功能也使得我们可以编写更多同时作用于引用或智能指针的代码。

+

作为展示 Deref 强制转换的实例,让我们使用示例 15-8 中定义的 MyBox<T>,以及示例 15-10 中增加的 Deref 实现。示例 15-11 展示了一个有着字符串 slice 参数的函数定义:

+

文件名:src/main.rs

+
fn hello(name: &str) {
+    println!("Hello, {name}!");
+}
+
+fn main() {}
+

示例 15-11:hello 函数有着 &str 类型的参数 name

+

可以使用字符串 slice 作为参数调用 hello 函数,比如 hello("Rust");。Deref 强制转换使得用 MyBox<String> 类型值的引用调用 hello 成为可能,如示例 15-12 所示:

+

文件名:src/main.rs

+
use std::ops::Deref;
+
+impl<T> Deref for MyBox<T> {
+    type Target = T;
+
+    fn deref(&self) -> &T {
+        &self.0
+    }
+}
+
+struct MyBox<T>(T);
+
+impl<T> MyBox<T> {
+    fn new(x: T) -> MyBox<T> {
+        MyBox(x)
+    }
+}
+
+fn hello(name: &str) {
+    println!("Hello, {name}!");
+}
+
+fn main() {
+    let m = MyBox::new(String::from("Rust"));
+    hello(&m);
+}
+

示例 15-12:因为 Deref 强制转换,使用 MyBox<String> 的引用调用 hello 是可行的

+

这里使用 &m 调用 hello 函数,其为 MyBox<String> 值的引用。因为示例 15-10 中在 MyBox<T> 上实现了 Deref trait,Rust 可以通过 deref 调用将 &MyBox<String> 变为 &String。标准库中提供了 String 上的 Deref 实现,其会返回字符串 slice,这可以在 Deref 的 API 文档中看到。Rust 再次调用 deref&String 变为 &str,这就符合 hello 函数的定义了。

+

如果 Rust 没有实现 Deref 强制转换,为了使用 &MyBox<String> 类型的值调用 hello,则不得不编写示例 15-13 中的代码来代替示例 15-12:

+

文件名:src/main.rs

+
use std::ops::Deref;
+
+impl<T> Deref for MyBox<T> {
+    type Target = T;
+
+    fn deref(&self) -> &T {
+        &self.0
+    }
+}
+
+struct MyBox<T>(T);
+
+impl<T> MyBox<T> {
+    fn new(x: T) -> MyBox<T> {
+        MyBox(x)
+    }
+}
+
+fn hello(name: &str) {
+    println!("Hello, {name}!");
+}
+
+fn main() {
+    let m = MyBox::new(String::from("Rust"));
+    hello(&(*m)[..]);
+}
+

示例 15-13:如果 Rust 没有 Deref 强制转换则必须编写的代码

+

(*m)MyBox<String> 解引用为 String。接着 &[..] 获取了整个 String 的字符串 slice 来匹配 hello 的签名。没有 Deref 强制转换所有这些符号混在一起将更难以读写和理解。Deref 强制转换使得 Rust 自动的帮我们处理这些转换。

+

当所涉及到的类型定义了 Deref trait,Rust 会分析这些类型并使用任意多次 Deref::deref 调用以获得匹配参数的类型。这些解析都发生在编译时,所以利用 Deref 强制转换并没有运行时损耗!

+

Deref 强制转换如何与可变性交互

+

类似于如何使用 Deref trait 重载不可变引用的 * 运算符,Rust 提供了 DerefMut trait 用于重载可变引用的 * 运算符。

+

Rust 在发现类型和 trait 实现满足三种情况时会进行 Deref 强制转换:

+
    +
  • T: Deref<Target=U> 时从 &T&U
  • +
  • T: DerefMut<Target=U> 时从 &mut T&mut U
  • +
  • T: Deref<Target=U> 时从 &mut T&U
  • +
+

头两个情况除了第二种实现了可变性之外是相同的:第一种情况表明如果有一个 &T,而 T 实现了返回 U 类型的 Deref,则可以直接得到 &U。第二种情况表明对于可变引用也有着相同的行为。

+

第三个情况有些微妙:Rust 也会将可变引用强转为不可变引用。但是反之是 不可能 的:不可变引用永远也不能强转为可变引用。因为根据借用规则,如果有一个可变引用,其必须是这些数据的唯一引用(否则程序将无法编译)。将一个可变引用转换为不可变引用永远也不会打破借用规则。将不可变引用转换为可变引用则需要初始的不可变引用是数据唯一的不可变引用,而借用规则无法保证这一点。因此,Rust 无法假设将不可变引用转换为可变引用是可能的。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch15-03-drop.html b/ch15-03-drop.html new file mode 100644 index 000000000..5247c18cf --- /dev/null +++ b/ch15-03-drop.html @@ -0,0 +1,359 @@ + + + + + + 使用 Drop Trait 运行清理代码 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用 Drop Trait 运行清理代码

+
+

ch15-03-drop.md +
+commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e

+
+

对于智能指针模式来说第二个重要的 trait 是 Drop,其允许我们在值要离开作用域时执行一些代码。可以为任何类型提供 Drop trait 的实现,同时所指定的代码被用于释放类似于文件或网络连接的资源。

+

我们在智能指针上下文中讨论 Drop 是因为其功能几乎总是用于实现智能指针。例如,当 Box<T> 被丢弃时会释放 box 指向的堆空间。

+

在其他一些语言中的某些类型,我们不得不记住在每次使用完那些类型的智能指针实例后调用清理内存或资源的代码。如果忘记的话,运行代码的系统可能会因为负荷过重而崩溃。在 Rust 中,可以指定每当值离开作用域时被执行的代码,编译器会自动插入这些代码。于是我们就不需要在程序中到处编写在实例结束时清理这些变量的代码 —— 而且还不会泄漏资源。

+

指定在值离开作用域时应该执行的代码的方式是实现 Drop trait。Drop trait 要求实现一个叫做 drop 的方法,它获取一个 self 的可变引用。为了能够看出 Rust 何时调用 drop,让我们暂时使用 println! 语句实现 drop

+

示例 15-14 展示了唯一定制功能就是当其实例离开作用域时,打印出 Dropping CustomSmartPointer! 的结构体 CustomSmartPointer,这会演示 Rust 何时运行 drop 函数:

+

文件名:src/main.rs

+
struct CustomSmartPointer {
+    data: String,
+}
+
+impl Drop for CustomSmartPointer {
+    fn drop(&mut self) {
+        println!("Dropping CustomSmartPointer with data `{}`!", self.data);
+    }
+}
+
+fn main() {
+    let c = CustomSmartPointer {
+        data: String::from("my stuff"),
+    };
+    let d = CustomSmartPointer {
+        data: String::from("other stuff"),
+    };
+    println!("CustomSmartPointers created.");
+}
+

示例 15-14:结构体 CustomSmartPointer,其实现了放置清理代码的 Drop trait

+

Drop trait 包含在 prelude 中,所以无需导入它。我们在 CustomSmartPointer 上实现了 Drop trait,并提供了一个调用 println!drop 方法实现。drop 函数体是放置任何当类型实例离开作用域时期望运行的逻辑的地方。这里选择打印一些文本以可视化地展示 Rust 何时调用 drop

+

main 中,我们新建了两个 CustomSmartPointer 实例并打印出了 CustomSmartPointer created.。在 main 的结尾,CustomSmartPointer 的实例会离开作用域,而 Rust 会调用放置于 drop 方法中的代码,打印出最后的信息。注意无需显式调用 drop 方法:

+

当运行这个程序,会出现如下输出:

+
$ cargo run
+   Compiling drop-example v0.1.0 (file:///projects/drop-example)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.60s
+     Running `target/debug/drop-example`
+CustomSmartPointers created.
+Dropping CustomSmartPointer with data `other stuff`!
+Dropping CustomSmartPointer with data `my stuff`!
+
+

当实例离开作用域 Rust 会自动调用 drop,并调用我们指定的代码。变量以被创建时相反的顺序被丢弃,所以 dc 之前被丢弃。这个例子的作用是给了我们一个 drop 方法如何工作的可视化指导,不过通常需要指定类型所需执行的清理代码而不是打印信息。

+

通过 std::mem::drop 提早丢弃值

+

不幸的是,我们并不能直截了当的禁用 drop 这个功能。通常也不需要禁用 drop ;整个 Drop trait 存在的意义在于其是自动处理的。然而,有时你可能需要提早清理某个值。一个例子是当使用智能指针管理锁时;你可能希望强制运行 drop 方法来释放锁以便作用域中的其他代码可以获取锁。Rust 并不允许我们主动调用 Drop trait 的 drop 方法;当我们希望在作用域结束之前就强制释放变量的话,我们应该使用的是由标准库提供的 std::mem::drop

+

如果我们像是示例 15-14 那样尝试调用 Drop trait 的 drop 方法,就会得到像示例 15-15 那样的编译错误:

+

文件名:src/main.rs

+
struct CustomSmartPointer {
+    data: String,
+}
+
+impl Drop for CustomSmartPointer {
+    fn drop(&mut self) {
+        println!("Dropping CustomSmartPointer with data `{}`!", self.data);
+    }
+}
+
+fn main() {
+    let c = CustomSmartPointer {
+        data: String::from("some data"),
+    };
+    println!("CustomSmartPointer created.");
+    c.drop();
+    println!("CustomSmartPointer dropped before the end of main.");
+}
+

示例 15-15:尝试手动调用 Drop trait 的 drop 方法提早清理

+

如果尝试编译代码会得到如下错误:

+
$ cargo run
+   Compiling drop-example v0.1.0 (file:///projects/drop-example)
+error[E0040]: explicit use of destructor method
+  --> src/main.rs:16:7
+   |
+16 |     c.drop();
+   |       ^^^^ explicit destructor calls not allowed
+   |
+help: consider using `drop` function
+   |
+16 |     drop(c);
+   |     +++++ ~
+
+For more information about this error, try `rustc --explain E0040`.
+error: could not compile `drop-example` (bin "drop-example") due to 1 previous error
+
+

错误信息表明不允许显式调用 drop。错误信息使用了术语 析构函数destructor),这是一个清理实例的函数的通用编程概念。析构函数 对应创建实例的 构造函数。Rust 中的 drop 函数就是这么一个析构函数。

+

Rust 不允许我们显式调用 drop 因为 Rust 仍然会在 main 的结尾对值自动调用 drop,这会导致一个 double free 错误,因为 Rust 会尝试清理相同的值两次。

+

因为不能禁用当值离开作用域时自动插入的 drop,并且不能显式调用 drop,如果我们需要强制提早清理值,可以使用 std::mem::drop 函数。

+

std::mem::drop 函数不同于 Drop trait 中的 drop 方法。可以通过传递希望强制丢弃的值作为参数。std::mem::drop 位于 prelude,所以我们可以修改示例 15-15 中的 main 来调用 drop 函数。如示例 15-16 所示:

+

文件名:src/main.rs

+
struct CustomSmartPointer {
+    data: String,
+}
+
+impl Drop for CustomSmartPointer {
+    fn drop(&mut self) {
+        println!("Dropping CustomSmartPointer with data `{}`!", self.data);
+    }
+}
+
+fn main() {
+    let c = CustomSmartPointer {
+        data: String::from("some data"),
+    };
+    println!("CustomSmartPointer created.");
+    drop(c);
+    println!("CustomSmartPointer dropped before the end of main.");
+}
+

示例 15-16: 在值离开作用域之前调用 std::mem::drop 显式清理

+

运行这段代码会打印出如下:

+
$ cargo run
+   Compiling drop-example v0.1.0 (file:///projects/drop-example)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.73s
+     Running `target/debug/drop-example`
+CustomSmartPointer created.
+Dropping CustomSmartPointer with data `some data`!
+CustomSmartPointer dropped before the end of main.
+
+

Dropping CustomSmartPointer with data `some data`! 出现在 CustomSmartPointer created.CustomSmartPointer dropped before the end of main. 之间,表明了 drop 方法被调用了并在此丢弃了 c

+

Drop trait 实现中指定的代码可以用于许多方面,来使得清理变得方便和安全:比如可以用其创建我们自己的内存分配器!通过 Drop trait 和 Rust 所有权系统,你无需担心之后的代码清理,Rust 会自动考虑这些问题。

+

我们也无需担心意外的清理掉仍在使用的值,这会造成编译器错误:所有权系统确保引用总是有效的,也会确保 drop 只会在值不再被使用时被调用一次。

+

现在我们学习了 Box<T> 和一些智能指针的特性,让我们聊聊标准库中定义的其他几种智能指针。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch15-04-rc.html b/ch15-04-rc.html new file mode 100644 index 000000000..e8417f8bb --- /dev/null +++ b/ch15-04-rc.html @@ -0,0 +1,343 @@ + + + + + + Rc<T> 引用计数智能指针 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Rc<T> 引用计数智能指针

+
+

ch15-04-rc.md +
+commit 52fafaaa8e432e84beaaf4ea80ccba880624effd

+
+

大部分情况下所有权是非常明确的:可以准确地知道哪个变量拥有某个值。然而,有些情况单个值可能会有多个所有者。例如,在图数据结构中,多个边可能指向相同的节点,而这个节点从概念上讲为所有指向它的边所拥有。节点在没有任何边指向它从而没有任何所有者之前,都不应该被清理掉。

+

为了启用多所有权需要显式地使用 Rust 类型 Rc<T>,其为 引用计数reference counting)的缩写。引用计数意味着记录一个值的引用数量来知晓这个值是否仍在被使用。如果某个值有零个引用,就代表没有任何有效引用并可以被清理。

+

可以将其想象为客厅中的电视。当一个人进来看电视时,他打开电视。其他人也可以进来看电视。当最后一个人离开房间时,他关掉电视因为它不再被使用了。如果某人在其他人还在看的时候就关掉了电视,正在看电视的人肯定会抓狂的!

+

Rc<T> 用于当我们希望在堆上分配一些内存供程序的多个部分读取,而且无法在编译时确定程序的哪一部分会最后结束使用它的时候。如果确实知道哪部分是最后一个结束使用的话,就可以令其成为数据的所有者,正常的所有权规则就可以在编译时生效。

+

注意 Rc<T> 只能用于单线程场景;第十六章并发会涉及到如何在多线程程序中进行引用计数。

+

使用 Rc<T> 共享数据

+

让我们回到示例 15-5 中使用 Box<T> 定义 cons list 的例子。这一次,我们希望创建两个共享第三个列表所有权的列表,其概念将会看起来如图 15-3 所示:

+Two lists that share ownership of a third list +

图 15-3: 两个列表,bc, 共享第三个列表 a 的所有权

+

列表 a 包含 5 之后是 10,之后是另两个列表:b 从 3 开始而 c 从 4 开始。bc 会接上包含 5 和 10 的列表 a。换句话说,这两个列表会尝试共享第一个列表所包含的 5 和 10。

+

尝试使用 Box<T> 定义的 List 实现并不能工作,如示例 15-17 所示:

+

文件名:src/main.rs

+
enum List {
+    Cons(i32, Box<List>),
+    Nil,
+}
+
+use crate::List::{Cons, Nil};
+
+fn main() {
+    let a = Cons(5, Box::new(Cons(10, Box::new(Nil))));
+    let b = Cons(3, Box::new(a));
+    let c = Cons(4, Box::new(a));
+}
+

示例 15-17: 展示不能用两个 Box<T> 的列表尝试共享第三个列表的所有权

+

编译会得出如下错误:

+
$ cargo run
+   Compiling cons-list v0.1.0 (file:///projects/cons-list)
+error[E0382]: use of moved value: `a`
+  --> src/main.rs:11:30
+   |
+9  |     let a = Cons(5, Box::new(Cons(10, Box::new(Nil))));
+   |         - move occurs because `a` has type `List`, which does not implement the `Copy` trait
+10 |     let b = Cons(3, Box::new(a));
+   |                              - value moved here
+11 |     let c = Cons(4, Box::new(a));
+   |                              ^ value used here after move
+
+For more information about this error, try `rustc --explain E0382`.
+error: could not compile `cons-list` (bin "cons-list") due to 1 previous error
+
+

Cons 成员拥有其储存的数据,所以当创建 b 列表时,a 被移动进了 b 这样 b 就拥有了 a。接着当再次尝试使用 a 创建 c 时,这不被允许,因为 a 的所有权已经被移动。

+

可以改变 Cons 的定义来存放一个引用,不过接着必须指定生命周期参数。通过指定生命周期参数,表明列表中的每一个元素都至少与列表本身存在的一样久。这是示例 15-17 中元素与列表的情况,但并不是所有情况都如此。

+

相反,我们修改 List 的定义为使用 Rc<T> 代替 Box<T>,如列表 15-18 所示。现在每一个 Cons 变量都包含一个值和一个指向 ListRc<T>。当创建 b 时,不同于获取 a 的所有权,这里会克隆 a 所包含的 Rc<List>,这会将引用计数从 1 增加到 2 并允许 ab 共享 Rc<List> 中数据的所有权。创建 c 时也会克隆 a,这会将引用计数从 2 增加为 3。每次调用 Rc::cloneRc<List> 中数据的引用计数都会增加,直到有零个引用之前其数据都不会被清理。

+

文件名:src/main.rs

+
enum List {
+    Cons(i32, Rc<List>),
+    Nil,
+}
+
+use crate::List::{Cons, Nil};
+use std::rc::Rc;
+
+fn main() {
+    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
+    let b = Cons(3, Rc::clone(&a));
+    let c = Cons(4, Rc::clone(&a));
+}
+

示例 15-18: 使用 Rc<T> 定义的 List

+

需要使用 use 语句将 Rc<T> 引入作用域,因为它不在 prelude 中。在 main 中创建了存放 5 和 10 的列表并将其存放在 a 的新的 Rc<List> 中。接着当创建 bc 时,调用 Rc::clone 函数并传递 aRc<List> 的引用作为参数。

+

也可以调用 a.clone() 而不是 Rc::clone(&a),不过在这里 Rust 的习惯是使用 Rc::cloneRc::clone 的实现并不像大部分类型的 clone 实现那样对所有数据进行深拷贝。Rc::clone 只会增加引用计数,这并不会花费多少时间。深拷贝可能会花费很长时间。通过使用 Rc::clone 进行引用计数,可以明显的区别深拷贝类的克隆和增加引用计数类的克隆。当查找代码中的性能问题时,只需考虑深拷贝类的克隆而无需考虑 Rc::clone 调用。

+

克隆 Rc<T> 会增加引用计数

+

让我们修改示例 15-18 的代码以便观察创建和丢弃 aRc<List> 的引用时引用计数的变化。

+

在示例 15-19 中,修改了 main 以便将列表 c 置于内部作用域中,这样就可以观察当 c 离开作用域时引用计数如何变化。

+

文件名:src/main.rs

+
enum List {
+    Cons(i32, Rc<List>),
+    Nil,
+}
+
+use crate::List::{Cons, Nil};
+use std::rc::Rc;
+
+fn main() {
+    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
+    println!("count after creating a = {}", Rc::strong_count(&a));
+    let b = Cons(3, Rc::clone(&a));
+    println!("count after creating b = {}", Rc::strong_count(&a));
+    {
+        let c = Cons(4, Rc::clone(&a));
+        println!("count after creating c = {}", Rc::strong_count(&a));
+    }
+    println!("count after c goes out of scope = {}", Rc::strong_count(&a));
+}
+

示例 15-19:打印出引用计数

+

在程序中每个引用计数变化的点,会打印出引用计数,其值可以通过调用 Rc::strong_count 函数获得。这个函数叫做 strong_count 而不是 count 是因为 Rc<T> 也有 weak_count;在 “避免引用循环:将 Rc<T> 变为 Weak<T> 部分会讲解 weak_count 的用途。

+

这段代码会打印出:

+
$ cargo run
+   Compiling cons-list v0.1.0 (file:///projects/cons-list)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.45s
+     Running `target/debug/cons-list`
+count after creating a = 1
+count after creating b = 2
+count after creating c = 3
+count after c goes out of scope = 2
+
+

我们能够看到 aRc<List> 的初始引用计数为 1,接着每次调用 clone,计数会增加 1。当 c 离开作用域时,计数减 1。不必像调用 Rc::clone 增加引用计数那样调用一个函数来减少计数;Drop trait 的实现当 Rc<T> 值离开作用域时自动减少引用计数。

+

从这个例子我们所不能看到的是,在 main 的结尾当 b 然后是 a 离开作用域时,此处计数会是 0,同时 Rc<List> 被完全清理。使用 Rc<T> 允许一个值有多个所有者,引用计数则确保只要任何所有者依然存在其值也保持有效。

+

通过不可变引用, Rc<T> 允许在程序的多个部分之间只读地共享数据。如果 Rc<T> 也允许多个可变引用,则会违反第四章讨论的借用规则之一:相同位置的多个可变借用可能造成数据竞争和不一致。不过可以修改数据是非常有用的!在下一部分,我们将讨论内部可变性模式和 RefCell<T> 类型,它可以与 Rc<T> 结合使用来处理不可变性的限制。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch15-05-interior-mutability.html b/ch15-05-interior-mutability.html new file mode 100644 index 000000000..5a6da2735 --- /dev/null +++ b/ch15-05-interior-mutability.html @@ -0,0 +1,664 @@ + + + + + + RefCell<T> 与内部可变性模式 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

RefCell<T> 和内部可变性模式

+
+

ch15-05-interior-mutability.md +
+commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e

+
+

内部可变性Interior mutability)是 Rust 中的一个设计模式,它允许你即使在有不可变引用时也可以改变数据,这通常是借用规则所不允许的。为了改变数据,该模式在数据结构中使用 unsafe 代码来模糊 Rust 通常的可变性和借用规则。不安全代码表明我们在手动检查这些规则而不是让编译器替我们检查。第二十章会更详细地介绍不安全代码。

+

当可以确保代码在运行时会遵守借用规则,即使编译器不能保证的情况,可以选择使用那些运用内部可变性模式的类型。所涉及的 unsafe 代码将被封装进安全的 API 中,而外部类型仍然是不可变的。

+

让我们通过遵循内部可变性模式的 RefCell<T> 类型来开始探索。

+

通过 RefCell<T> 在运行时检查借用规则

+

不同于 Rc<T>RefCell<T> 代表其数据的唯一的所有权。那么是什么让 RefCell<T> 不同于像 Box<T> 这样的类型呢?回忆一下第四章所学的借用规则:

+
    +
  1. 在任意给定时刻,只能拥有一个可变引用或任意数量的不可变引用 之一(而不是两者)。
  2. +
  3. 引用必须总是有效的。
  4. +
+

对于引用和 Box<T>,借用规则的不可变性作用于编译时。对于 RefCell<T>,这些不可变性作用于 运行时。对于引用,如果违反这些规则,会得到一个编译错误。而对于 RefCell<T>,如果违反这些规则程序会 panic 并退出。

+

在编译时检查借用规则的优势是这些错误将在开发过程的早期被捕获,同时对运行时没有性能影响,因为所有的分析都提前完成了。为此,在编译时检查借用规则是大部分情况的最佳选择,这也正是其为何是 Rust 的默认行为。

+

相反在运行时检查借用规则的好处则是允许出现特定内存安全的场景,而它们在编译时检查中是不允许的。静态分析,正如 Rust 编译器,是天生保守的。但代码的一些属性不可能通过分析代码发现:其中最著名的就是 停机问题(Halting Problem),这超出了本书的范畴,不过如果你感兴趣的话这是一个值得研究的有趣主题。

+

因为一些分析是不可能的,如果 Rust 编译器不能通过所有权规则编译,它可能会拒绝一个正确的程序;从这种角度考虑它是保守的。如果 Rust 接受不正确的程序,那么用户也就不会相信 Rust 所做的保证了。然而,如果 Rust 拒绝正确的程序,虽然会给程序员带来不便,但不会带来灾难。RefCell<T> 正是用于当你确信代码遵守借用规则,而编译器不能理解和确定的时候。

+

类似于 Rc<T>RefCell<T> 只能用于单线程场景。如果尝试在多线程上下文中使用RefCell<T>,会得到一个编译错误。第十六章会介绍如何在多线程程序中使用 RefCell<T> 的功能。

+

如下为选择 Box<T>Rc<T>RefCell<T> 的理由:

+
    +
  • Rc<T> 允许相同数据有多个所有者;Box<T>RefCell<T> 有单一所有者。
  • +
  • Box<T> 允许在编译时执行不可变或可变借用检查;Rc<T>仅允许在编译时执行不可变借用检查;RefCell<T> 允许在运行时执行不可变或可变借用检查。
  • +
  • 因为 RefCell<T> 允许在运行时执行可变借用检查,所以我们可以在即便 RefCell<T> 自身是不可变的情况下修改其内部的值。
  • +
+

在不可变值内部改变值就是 内部可变性 模式。让我们看看何时内部可变性是有用的,并讨论这是如何成为可能的。

+

内部可变性:不可变值的可变借用

+

借用规则的一个推论是当有一个不可变值时,不能可变地借用它。例如,如下代码不能编译:

+
fn main() {
+    let x = 5;
+    let y = &mut x;
+}
+

如果尝试编译,会得到如下错误:

+
$ cargo run
+   Compiling borrowing v0.1.0 (file:///projects/borrowing)
+error[E0596]: cannot borrow `x` as mutable, as it is not declared as mutable
+ --> src/main.rs:3:13
+  |
+3 |     let y = &mut x;
+  |             ^^^^^^ cannot borrow as mutable
+  |
+help: consider changing this to be mutable
+  |
+2 |     let mut x = 5;
+  |         +++
+
+For more information about this error, try `rustc --explain E0596`.
+error: could not compile `borrowing` (bin "borrowing") due to 1 previous error
+
+

然而,特定情况下,令一个值在其方法内部能够修改自身,而在其他代码中仍视为不可变,是很有用的。值方法外部的代码就不能修改其值了。RefCell<T> 是一个获得内部可变性的方法。RefCell<T> 并没有完全绕开借用规则,编译器中的借用检查器允许内部可变性并相应地在运行时检查借用规则。如果违反了这些规则,会出现 panic 而不是编译错误。

+

让我们通过一个实际的例子来探索何处可以使用 RefCell<T> 来修改不可变值并看看为何这么做是有意义的。

+

内部可变性的用例:mock 对象

+

有时在测试中程序员会用某个类型替换另一个类型,以便观察特定的行为并断言它是被正确实现的。这个占位符类型被称为 测试替身(test double)。就像电影制作中的替身演员 (stunt double) 一样,替代演员完成高难度的场景。测试替身在运行测试时替代某个类型。mock 对象 是特定类型的测试替身,它们记录测试过程中发生了什么以便可以断言操作是正确的。

+

虽然 Rust 中的对象与其他语言中的对象并不是一回事,Rust 也没有像其他语言那样在标准库中内建 mock 对象功能,不过我们确实可以创建一个与 mock 对象有着相同功能的结构体。

+

如下是一个我们想要测试的场景:我们在编写一个记录某个值与最大值的差距的库,并根据当前值与最大值的差距来发送消息。例如,这个库可以用于记录用户所允许的 API 调用数量限额。

+

该库只提供记录与最大值的差距,以及何种情况发送什么消息的功能。使用此库的程序则期望提供实际发送消息的机制:程序可以选择记录一条消息、发送 email、发送短信等等。库本身无需知道这些细节;只需实现其提供的 Messenger trait 即可。示例 15-20 展示了库代码:

+

文件名:src/lib.rs

+
pub trait Messenger {
+    fn send(&self, msg: &str);
+}
+
+pub struct LimitTracker<'a, T: Messenger> {
+    messenger: &'a T,
+    value: usize,
+    max: usize,
+}
+
+impl<'a, T> LimitTracker<'a, T>
+where
+    T: Messenger,
+{
+    pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {
+        LimitTracker {
+            messenger,
+            value: 0,
+            max,
+        }
+    }
+
+    pub fn set_value(&mut self, value: usize) {
+        self.value = value;
+
+        let percentage_of_max = self.value as f64 / self.max as f64;
+
+        if percentage_of_max >= 1.0 {
+            self.messenger.send("Error: You are over your quota!");
+        } else if percentage_of_max >= 0.9 {
+            self.messenger
+                .send("Urgent warning: You've used up over 90% of your quota!");
+        } else if percentage_of_max >= 0.75 {
+            self.messenger
+                .send("Warning: You've used up over 75% of your quota!");
+        }
+    }
+}
+

示例 15-20:一个记录某个值与最大值差距的库,并根据此值的特定级别发出警告

+

这些代码中一个重要部分是拥有一个方法 sendMessenger trait,其获取一个 self 的不可变引用和文本信息。这个 trait 是 mock 对象所需要实现的接口库,这样 mock 就能像一个真正的对象那样使用了。另一个重要的部分是我们需要测试 LimitTrackerset_value 方法的行为。可以改变传递的 value 参数的值,不过 set_value 并没有返回任何可供断言的值。我们希望能够说,如果我们创建一个实现了 Messenger trait 和具有特定 max 值的 LimitTracker 时,当传递不同 value 值时,消息发送者应被告知发送合适的消息。

+

我们所需的 mock 对象是,调用 send 并不实际发送 email 或消息,而是只记录信息被通知要发送了。可以新建一个 mock 对象实例,用其创建 LimitTracker,调用 LimitTrackerset_value 方法,然后检查 mock 对象是否有我们期望的消息。示例 15-21 展示了一个如此尝试的 mock 对象实现,不过借用检查器并不允许:

+

文件名:src/lib.rs

+
pub trait Messenger {
+    fn send(&self, msg: &str);
+}
+
+pub struct LimitTracker<'a, T: Messenger> {
+    messenger: &'a T,
+    value: usize,
+    max: usize,
+}
+
+impl<'a, T> LimitTracker<'a, T>
+where
+    T: Messenger,
+{
+    pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {
+        LimitTracker {
+            messenger,
+            value: 0,
+            max,
+        }
+    }
+
+    pub fn set_value(&mut self, value: usize) {
+        self.value = value;
+
+        let percentage_of_max = self.value as f64 / self.max as f64;
+
+        if percentage_of_max >= 1.0 {
+            self.messenger.send("Error: You are over your quota!");
+        } else if percentage_of_max >= 0.9 {
+            self.messenger
+                .send("Urgent warning: You've used up over 90% of your quota!");
+        } else if percentage_of_max >= 0.75 {
+            self.messenger
+                .send("Warning: You've used up over 75% of your quota!");
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    struct MockMessenger {
+        sent_messages: Vec<String>,
+    }
+
+    impl MockMessenger {
+        fn new() -> MockMessenger {
+            MockMessenger {
+                sent_messages: vec![],
+            }
+        }
+    }
+
+    impl Messenger for MockMessenger {
+        fn send(&self, message: &str) {
+            self.sent_messages.push(String::from(message));
+        }
+    }
+
+    #[test]
+    fn it_sends_an_over_75_percent_warning_message() {
+        let mock_messenger = MockMessenger::new();
+        let mut limit_tracker = LimitTracker::new(&mock_messenger, 100);
+
+        limit_tracker.set_value(80);
+
+        assert_eq!(mock_messenger.sent_messages.len(), 1);
+    }
+}
+

示例 15-21:尝试实现 MockMessenger,借用检查器不允许这么做

+

测试代码定义了一个 MockMessenger 结构体,其 sent_messages 字段为一个 String 值的 Vec 用来记录被告知发送的消息。我们还定义了一个关联函数 new 以便于新建从空消息列表开始的 MockMessenger 值。接着为 MockMessenger 实现 Messenger trait 这样就可以为 LimitTracker 提供一个 MockMessenger。在 send 方法的定义中,获取传入的消息作为参数并储存在 MockMessengersent_messages 列表中。

+

在测试中,我们测试了当 LimitTracker 被告知将 value 设置为超过 max 值 75% 的某个值。首先新建一个 MockMessenger,其从空消息列表开始。接着新建一个 LimitTracker 并传递新建 MockMessenger 的引用和 max 值 100。我们使用值 80 调用 LimitTrackerset_value 方法,这超过了 100 的 75%。接着断言 MockMessenger 中记录的消息列表应该有一条消息。

+

然而,这个测试是有问题的:

+
$ cargo test
+   Compiling limit-tracker v0.1.0 (file:///projects/limit-tracker)
+error[E0596]: cannot borrow `self.sent_messages` as mutable, as it is behind a `&` reference
+  --> src/lib.rs:58:13
+   |
+58 |             self.sent_messages.push(String::from(message));
+   |             ^^^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable
+   |
+help: consider changing this to be a mutable reference in the `impl` method and the `trait` definition
+   |
+2  ~     fn send(&mut self, msg: &str);
+3  | }
+...
+56 |     impl Messenger for MockMessenger {
+57 ~         fn send(&mut self, message: &str) {
+   |
+
+For more information about this error, try `rustc --explain E0596`.
+error: could not compile `limit-tracker` (lib test) due to 1 previous error
+
+

不能修改 MockMessenger 来记录消息,因为 send 方法获取了 self 的不可变引用。我们也不能参考错误文本的建议使用 &mut self 替代,因为这样 send 的签名就不符合 Messenger trait 定义中的签名了(可以试着这么改,看看会出现什么错误信息)。

+

这正是内部可变性的用武之地!我们将通过 RefCell 来储存 sent_messages,然后 send 将能够修改 sent_messages 并储存消息。示例 15-22 展示了代码:

+

文件名:src/lib.rs

+
pub trait Messenger {
+    fn send(&self, msg: &str);
+}
+
+pub struct LimitTracker<'a, T: Messenger> {
+    messenger: &'a T,
+    value: usize,
+    max: usize,
+}
+
+impl<'a, T> LimitTracker<'a, T>
+where
+    T: Messenger,
+{
+    pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {
+        LimitTracker {
+            messenger,
+            value: 0,
+            max,
+        }
+    }
+
+    pub fn set_value(&mut self, value: usize) {
+        self.value = value;
+
+        let percentage_of_max = self.value as f64 / self.max as f64;
+
+        if percentage_of_max >= 1.0 {
+            self.messenger.send("Error: You are over your quota!");
+        } else if percentage_of_max >= 0.9 {
+            self.messenger
+                .send("Urgent warning: You've used up over 90% of your quota!");
+        } else if percentage_of_max >= 0.75 {
+            self.messenger
+                .send("Warning: You've used up over 75% of your quota!");
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use std::cell::RefCell;
+
+    struct MockMessenger {
+        sent_messages: RefCell<Vec<String>>,
+    }
+
+    impl MockMessenger {
+        fn new() -> MockMessenger {
+            MockMessenger {
+                sent_messages: RefCell::new(vec![]),
+            }
+        }
+    }
+
+    impl Messenger for MockMessenger {
+        fn send(&self, message: &str) {
+            self.sent_messages.borrow_mut().push(String::from(message));
+        }
+    }
+
+    #[test]
+    fn it_sends_an_over_75_percent_warning_message() {
+        // --snip--
+        let mock_messenger = MockMessenger::new();
+        let mut limit_tracker = LimitTracker::new(&mock_messenger, 100);
+
+        limit_tracker.set_value(80);
+
+        assert_eq!(mock_messenger.sent_messages.borrow().len(), 1);
+    }
+}
+

示例 15-22:使用 RefCell<T> 能够在外部值被认为是不可变的情况下修改内部值

+

现在 sent_messages 字段的类型是 RefCell<Vec<String>> 而不是 Vec<String>。在 new 函数中新建了一个 RefCell<Vec<String>> 实例替代空 vector。

+

对于 send 方法的实现,第一个参数仍为 self 的不可变借用,这是符合方法定义的。我们调用 self.sent_messagesRefCellborrow_mut 方法来获取 RefCell 中值的可变引用,这是一个 vector。接着可以对 vector 的可变引用调用 push 以便记录测试过程中看到的消息。

+

最后必须做出的修改位于断言中:为了看到其内部 vector 中有多少个项,需要调用 RefCellborrow 以获取 vector 的不可变引用。

+

现在我们见识了如何使用 RefCell<T>,让我们研究一下它怎样工作的!

+

RefCell<T> 在运行时记录借用

+

当创建不可变和可变引用时,我们分别使用 &&mut 语法。对于 RefCell<T> 来说,则是 borrowborrow_mut 方法,这属于 RefCell<T> 安全 API 的一部分。borrow 方法返回 Ref<T> 类型的智能指针,borrow_mut 方法返回 RefMut<T> 类型的智能指针。这两个类型都实现了 Deref,所以可以当作常规引用对待。

+

RefCell<T> 记录当前有多少个活动的 Ref<T>RefMut<T> 智能指针。每次调用 borrowRefCell<T> 将活动的不可变借用计数加一。当 Ref<T> 值离开作用域时,不可变借用计数减一。就像编译时借用规则一样,RefCell<T> 在任何时候只允许有多个不可变借用或一个可变借用。

+

如果我们尝试违反这些规则,相比引用时的编译时错误,RefCell<T> 的实现会在运行时出现 panic。示例 15-23 展示了对示例 15-22 中 send 实现的修改,这里我们故意尝试在相同作用域创建两个可变借用以便演示 RefCell<T> 不允许我们在运行时这么做:

+

文件名:src/lib.rs

+
pub trait Messenger {
+    fn send(&self, msg: &str);
+}
+
+pub struct LimitTracker<'a, T: Messenger> {
+    messenger: &'a T,
+    value: usize,
+    max: usize,
+}
+
+impl<'a, T> LimitTracker<'a, T>
+where
+    T: Messenger,
+{
+    pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {
+        LimitTracker {
+            messenger,
+            value: 0,
+            max,
+        }
+    }
+
+    pub fn set_value(&mut self, value: usize) {
+        self.value = value;
+
+        let percentage_of_max = self.value as f64 / self.max as f64;
+
+        if percentage_of_max >= 1.0 {
+            self.messenger.send("Error: You are over your quota!");
+        } else if percentage_of_max >= 0.9 {
+            self.messenger
+                .send("Urgent warning: You've used up over 90% of your quota!");
+        } else if percentage_of_max >= 0.75 {
+            self.messenger
+                .send("Warning: You've used up over 75% of your quota!");
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use std::cell::RefCell;
+
+    struct MockMessenger {
+        sent_messages: RefCell<Vec<String>>,
+    }
+
+    impl MockMessenger {
+        fn new() -> MockMessenger {
+            MockMessenger {
+                sent_messages: RefCell::new(vec![]),
+            }
+        }
+    }
+
+    impl Messenger for MockMessenger {
+        fn send(&self, message: &str) {
+            let mut one_borrow = self.sent_messages.borrow_mut();
+            let mut two_borrow = self.sent_messages.borrow_mut();
+
+            one_borrow.push(String::from(message));
+            two_borrow.push(String::from(message));
+        }
+    }
+
+    #[test]
+    fn it_sends_an_over_75_percent_warning_message() {
+        let mock_messenger = MockMessenger::new();
+        let mut limit_tracker = LimitTracker::new(&mock_messenger, 100);
+
+        limit_tracker.set_value(80);
+
+        assert_eq!(mock_messenger.sent_messages.borrow().len(), 1);
+    }
+}
+

示例 15-23:在同一作用域中创建两个可变引用并观察 RefCell<T> panic

+

这里为 borrow_mut 返回的 RefMut 智能指针创建了 one_borrow 变量。接着用相同的方式在变量 two_borrow 创建了另一个可变借用。这会在相同作用域中创建两个可变引用,这是不允许的。当运行库的测试时,示例 15-23 编译时不会有任何错误,不过测试会失败:

+
$ cargo test
+   Compiling limit-tracker v0.1.0 (file:///projects/limit-tracker)
+    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.91s
+     Running unittests src/lib.rs (target/debug/deps/limit_tracker-e599811fa246dbde)
+
+running 1 test
+test tests::it_sends_an_over_75_percent_warning_message ... FAILED
+
+failures:
+
+---- tests::it_sends_an_over_75_percent_warning_message stdout ----
+thread 'tests::it_sends_an_over_75_percent_warning_message' panicked at src/lib.rs:60:53:
+already borrowed: BorrowMutError
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+
+failures:
+    tests::it_sends_an_over_75_percent_warning_message
+
+test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+error: test failed, to rerun pass `--lib`
+
+

注意代码 panic 和信息 already borrowed: BorrowMutError。这也就是 RefCell<T> 如何在运行时处理违反借用规则的情况。

+

像我们这里这样选择在运行时捕获借用错误而不是编译时意味着会发现在开发过程的后期才会发现的潜在错误,甚至有可能发布到生产环境才会发现。还会因为在运行时而不是编译时记录借用而导致少量的运行时性能惩罚。然而,使用 RefCell 使得在只允许不可变值的上下文中编写修改自身以记录消息的 mock 对象成为可能。虽然有取舍,但是我们可以选择使用 RefCell<T> 来获得比常规引用所能提供的更多的功能。

+

结合 Rc<T>RefCell<T> 来拥有多个可变数据所有者

+

RefCell<T> 的一个常见用法是与 Rc<T> 结合。回忆一下 Rc<T> 允许对相同数据有多个所有者,不过只能提供数据的不可变访问。如果有一个储存了 RefCell<T>Rc<T> 的话,就可以得到有多个所有者 并且 可以修改的值了!

+

例如,回忆示例 15-18 的 cons list 的例子中使用 Rc<T> 使得多个列表共享另一个列表的所有权。因为 Rc<T> 只存放不可变值,所以一旦创建了这些列表值后就不能修改。让我们加入 RefCell<T> 来获得修改列表中值的能力。示例 15-24 展示了通过在 Cons 定义中使用 RefCell<T>,我们就允许修改所有列表中的值了:

+

文件名:src/main.rs

+
#[derive(Debug)]
+enum List {
+    Cons(Rc<RefCell<i32>>, Rc<List>),
+    Nil,
+}
+
+use crate::List::{Cons, Nil};
+use std::cell::RefCell;
+use std::rc::Rc;
+
+fn main() {
+    let value = Rc::new(RefCell::new(5));
+
+    let a = Rc::new(Cons(Rc::clone(&value), Rc::new(Nil)));
+
+    let b = Cons(Rc::new(RefCell::new(3)), Rc::clone(&a));
+    let c = Cons(Rc::new(RefCell::new(4)), Rc::clone(&a));
+
+    *value.borrow_mut() += 10;
+
+    println!("a after = {a:?}");
+    println!("b after = {b:?}");
+    println!("c after = {c:?}");
+}
+

示例 15-24:使用 Rc<RefCell<i32>> 创建可以修改的 List

+

这里创建了一个 Rc<RefCell<i32>> 实例并储存在变量 value 中以便之后直接访问。接着在 a 中用包含 valueCons 成员创建了一个 List。需要克隆 value 以便 avalue 都能拥有其内部值 5 的所有权,而不是将所有权从 value 移动到 a 或者让 a 借用 value

+

我们将列表 a 封装进了 Rc<T> 这样当创建列表 bc 时,它们都可以引用 a,正如示例 15-18 一样。

+

一旦创建了列表 abc,我们将 value 的值加 10。为此对 value 调用了 borrow_mut,这里使用了第五章讨论的自动解引用功能(-> 运算符到哪去了?” 部分)来解引用 Rc<T> 以获取其内部的 RefCell<T> 值。borrow_mut 方法返回 RefMut<T> 智能指针,可以对其使用解引用运算符并修改其内部值。

+

当我们打印出 abc 时,可以看到它们都拥有修改后的值 15 而不是 5:

+
$ cargo run
+   Compiling cons-list v0.1.0 (file:///projects/cons-list)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.63s
+     Running `target/debug/cons-list`
+a after = Cons(RefCell { value: 15 }, Nil)
+b after = Cons(RefCell { value: 3 }, Cons(RefCell { value: 15 }, Nil))
+c after = Cons(RefCell { value: 4 }, Cons(RefCell { value: 15 }, Nil))
+
+

这是非常巧妙的!通过使用 RefCell<T>,我们可以拥有一个表面上不可变的 List,不过可以使用 RefCell<T> 中提供内部可变性的方法来在需要时修改数据。RefCell<T> 的运行时借用规则检查也确实保护我们免于出现数据竞争——有时为了数据结构的灵活性而付出一些性能是值得的。注意 RefCell<T> 不能用于多线程代码!Mutex<T> 是一个线程安全版本的 RefCell<T> ,我们会在第十六章讨论 Mutex<T>

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch15-06-reference-cycles.html b/ch15-06-reference-cycles.html new file mode 100644 index 000000000..24a814e00 --- /dev/null +++ b/ch15-06-reference-cycles.html @@ -0,0 +1,533 @@ + + + + + + 引用循环会导致内存泄漏 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

引用循环与内存泄漏

+
+

ch15-06-reference-cycles.md +
+commit c06006157b14b3d47b5c716fc392b77f3b2e21ce

+
+

Rust 的内存安全性保证使其难以意外地制造永远也不会被清理的内存(被称为 内存泄漏memory leak)),但并不是不可能。Rust 并不保证完全防止内存泄漏,这意味着内存泄漏在 Rust 中被认为是内存安全的。这一点可以通过 Rc<T>RefCell<T> 看出:创建引用循环的可能性是存在的。这会造成内存泄漏,因为每一项的引用计数永远也到不了 0,持有的数据也就永远不会被释放。

+

制造引用循环

+

让我们看看引用循环是如何发生的以及如何避免它。以示例 15-25 中的 List 枚举和 tail 方法的定义开始:

+

文件名:src/main.rs

+
use crate::List::{Cons, Nil};
+use std::cell::RefCell;
+use std::rc::Rc;
+
+#[derive(Debug)]
+enum List {
+    Cons(i32, RefCell<Rc<List>>),
+    Nil,
+}
+
+impl List {
+    fn tail(&self) -> Option<&RefCell<Rc<List>>> {
+        match self {
+            Cons(_, item) => Some(item),
+            Nil => None,
+        }
+    }
+}
+
+fn main() {}
+

示例 15-25: 一个存放 RefCell 的 cons list 定义,这样可以修改 Cons 成员所引用的数据

+

这里采用了示例 15-5 中 List 定义的另一种变体。现在 Cons 成员的第二个元素是 RefCell<Rc<List>>,这意味着不同于像示例 15-24 那样能够修改 i32 的值,我们希望能够修改 Cons 成员所指向的 List。这里还增加了一个 tail 方法来方便我们在有 Cons 成员的时候访问其第二项。

+

在示例 15-26 中增加了一个 main 函数,其使用了示例 15-25 中的定义。这些代码在 a 中创建了一个列表,一个指向 a 中列表的 b 列表,接着修改 a 中的列表指向 b 中的列表,这会创建一个引用循环。在这个过程的多个位置有 println! 语句展示引用计数。

+

文件:src/main.rs

+
use crate::List::{Cons, Nil};
+use std::cell::RefCell;
+use std::rc::Rc;
+
+#[derive(Debug)]
+enum List {
+    Cons(i32, RefCell<Rc<List>>),
+    Nil,
+}
+
+impl List {
+    fn tail(&self) -> Option<&RefCell<Rc<List>>> {
+        match self {
+            Cons(_, item) => Some(item),
+            Nil => None,
+        }
+    }
+}
+
+fn main() {
+    let a = Rc::new(Cons(5, RefCell::new(Rc::new(Nil))));
+
+    println!("a initial rc count = {}", Rc::strong_count(&a));
+    println!("a next item = {:?}", a.tail());
+
+    let b = Rc::new(Cons(10, RefCell::new(Rc::clone(&a))));
+
+    println!("a rc count after b creation = {}", Rc::strong_count(&a));
+    println!("b initial rc count = {}", Rc::strong_count(&b));
+    println!("b next item = {:?}", b.tail());
+
+    if let Some(link) = a.tail() {
+        *link.borrow_mut() = Rc::clone(&b);
+    }
+
+    println!("b rc count after changing a = {}", Rc::strong_count(&b));
+    println!("a rc count after changing a = {}", Rc::strong_count(&a));
+
+    // Uncomment the next line to see that we have a cycle;
+    // it will overflow the stack
+    // println!("a next item = {:?}", a.tail());
+}
+

示例 15-26:创建一个引用循环:两个 List 值互相指向彼此

+

这里在变量 a 中创建了一个 Rc<List> 实例来存放初值为 5, NilList 值。接着在变量 b 中创建了存放包含值 10 和指向列表 aList 的另一个 Rc<List> 实例。

+

最后,修改 a 使其指向 b 而不是 Nil,这就创建了一个循环。为此需要使用 tail 方法获取 aRefCell<Rc<List>> 的引用,并放入变量 link 中。接着使用 RefCell<Rc<List>>borrow_mut 方法将其值从存放 NilRc<List> 修改为 b 中的 Rc<List>

+

如果保持最后的 println! 行注释并运行代码,会得到如下输出:

+
$ cargo run
+   Compiling cons-list v0.1.0 (file:///projects/cons-list)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.53s
+     Running `target/debug/cons-list`
+a initial rc count = 1
+a next item = Some(RefCell { value: Nil })
+a rc count after b creation = 2
+b initial rc count = 1
+b next item = Some(RefCell { value: Cons(5, RefCell { value: Nil }) })
+b rc count after changing a = 2
+a rc count after changing a = 2
+
+

可以看到将列表 a 修改为指向 b 之后, ab 中的 Rc<List> 实例的引用计数都是 2。在 main 的结尾,Rust 丢弃 b,这会使 b Rc<List> 实例的引用计数从 2 减为 1。然而,b Rc<List> 不能被回收,因为其引用计数是 1 而不是 0。接下来 Rust 会丢弃 aa Rc<List> 实例的引用计数从 2 减为 1。这个实例也不能被回收,因为 b Rc<List> 实例依然引用它,所以其引用计数是 1。这些列表的内存将永远保持未被回收的状态。为了更形象的展示,我们创建了一个如图 15-4 所示的引用循环:

+Reference cycle of lists +

图 15-4: 列表 ab 彼此互相指向形成引用循环

+

如果取消最后 println! 的注释并运行程序,Rust 会尝试打印出 a 指向 b 指向 a 这样的循环直到栈溢出。

+

相比真实世界的程序,这个例子中创建引用循环的结果并不可怕。创建了引用循环之后程序立刻就结束了。如果在更为复杂的程序中并在循环里分配了很多内存并占有很长时间,这个程序会使用多于它所需要的内存,并有可能压垮系统并造成没有内存可供使用。

+

创建引用循环并不容易,但也不是不可能。如果你有包含 Rc<T>RefCell<T> 值或类似的嵌套结合了内部可变性和引用计数的类型,请务必小心确保你没有形成一个引用循环;你无法指望 Rust 帮你捕获它们。创建引用循环是一个程序上的逻辑 bug,你应该使用自动化测试、代码评审和其他软件开发最佳实践来使其最小化。

+

另一个解决方案是重新组织数据结构,使得一部分引用拥有所有权而另一部分没有。换句话说,循环将由一些拥有所有权的关系和一些无所有权的关系组成,只有所有权关系才能影响值是否可以被丢弃。在示例 15-25 中,我们总是希望 Cons 成员拥有其列表,所以重新组织数据结构是不可能的。让我们看看一个由父节点和子节点构成的图的例子,观察何时是使用无所有权的关系来避免引用循环的合适时机。

+

避免引用循环:将 Rc<T> 变为 Weak<T>

+

到目前为止,我们已经展示了调用 Rc::clone 会增加 Rc<T> 实例的 strong_count,和只在其 strong_count 为 0 时才会被清理的 Rc<T> 实例。你也可以通过调用 Rc::downgrade 并传递 Rc<T> 实例的引用来创建其值的 弱引用weak reference)。强引用代表如何共享 Rc<T> 实例的所有权。弱引用并不属于所有权关系,当 Rc<T> 实例被清理时其计数没有影响。它们不会造成引用循环,因为任何涉及弱引用的循环会在其相关的值的强引用计数为 0 时被打断。

+

调用 Rc::downgrade 时会得到 Weak<T> 类型的智能指针。不同于将 Rc<T> 实例的 strong_count 加 1,调用 Rc::downgrade 会将 weak_count 加 1。Rc<T> 类型使用 weak_count 来记录其存在多少个 Weak<T> 引用,类似于 strong_count。其区别在于 weak_count 无需计数为 0 就能使 Rc<T> 实例被清理。

+

强引用代表如何共享 Rc<T> 实例的所有权,但弱引用并不属于所有权关系。它们不会造成引用循环,因为任何弱引用的循环会在其相关的强引用计数为 0 时被打断。

+

因为 Weak<T> 引用的值可能已经被丢弃了,为了使用 Weak<T> 所指向的值,我们必须确保其值仍然有效。为此可以调用 Weak<T> 实例的 upgrade 方法,这会返回 Option<Rc<T>>。如果 Rc<T> 值还未被丢弃,则结果是 Some;如果 Rc<T> 已被丢弃,则结果是 None。因为 upgrade 返回一个 Option<Rc<T>>,Rust 会确保处理 SomeNone 的情况,所以它不会返回非法指针。

+

我们会创建一个某项知道其子项和父项的树形结构的例子,而不是只知道其下一项的列表。

+

创建树形数据结构:带有子节点的 Node

+

在最开始,我们将会构建一个带有子节点的树。让我们创建一个用于存放其拥有所有权的 i32 值和其子节点引用的 Node

+

文件名:src/main.rs

+
use std::cell::RefCell;
+use std::rc::Rc;
+
+#[derive(Debug)]
+struct Node {
+    value: i32,
+    children: RefCell<Vec<Rc<Node>>>,
+}
+
+fn main() {
+    let leaf = Rc::new(Node {
+        value: 3,
+        children: RefCell::new(vec![]),
+    });
+
+    let branch = Rc::new(Node {
+        value: 5,
+        children: RefCell::new(vec![Rc::clone(&leaf)]),
+    });
+}
+

我们希望 Node 能够拥有其子节点,同时也希望能将所有权共享给变量,以便可以直接访问树中的每一个 Node,为此 Vec<T> 的项的类型被定义为 Rc<Node>。我们还希望能修改其他节点的子节点,所以 childrenVec<Rc<Node>> 被放进了 RefCell<T>

+

接下来,使用此结构体定义来创建一个叫做 leaf 的带有值 3 且没有子节点的 Node 实例,和另一个带有值 5 并以 leaf 作为子节点的实例 branch,如示例 15-27 所示:

+

文件名:src/main.rs

+
use std::cell::RefCell;
+use std::rc::Rc;
+
+#[derive(Debug)]
+struct Node {
+    value: i32,
+    children: RefCell<Vec<Rc<Node>>>,
+}
+
+fn main() {
+    let leaf = Rc::new(Node {
+        value: 3,
+        children: RefCell::new(vec![]),
+    });
+
+    let branch = Rc::new(Node {
+        value: 5,
+        children: RefCell::new(vec![Rc::clone(&leaf)]),
+    });
+}
+

示例 15-27:创建没有子节点的 leaf 节点和以 leaf 作为子节点的 branch 节点

+

这里克隆了 leaf 中的 Rc<Node> 并储存在 branch 中,这意味着 leaf 中的 Node 现在有两个所有者:leafbranch。可以通过 branch.childrenbranch 中获得 leaf,不过无法从 leafbranchleaf 没有到 branch 的引用且并不知道它们相互关联。我们希望 leaf 知道 branch 是其父节点。稍后我们会这么做。

+

增加从子到父的引用

+

为了使子节点知道其父节点,需要在 Node 结构体定义中增加一个 parent 字段。问题是 parent 的类型应该是什么。我们知道其不能包含 Rc<T>,因为这样 leaf.parent 将会指向 branchbranch.children 会包含 leaf 的指针,这会形成引用循环,会造成其 strong_count 永远也不会为 0。

+

现在换一种方式思考这个关系,父节点应该拥有其子节点:如果父节点被丢弃了,其子节点也应该被丢弃。然而子节点不应该拥有其父节点:如果丢弃子节点,其父节点应该依然存在。这正是弱引用的例子!

+

所以 parent 使用 Weak<T> 类型而不是 Rc<T>,具体来说是 RefCell<Weak<Node>>。现在 Node 结构体定义看起来像这样:

+

文件名:src/main.rs

+
use std::cell::RefCell;
+use std::rc::{Rc, Weak};
+
+#[derive(Debug)]
+struct Node {
+    value: i32,
+    parent: RefCell<Weak<Node>>,
+    children: RefCell<Vec<Rc<Node>>>,
+}
+
+fn main() {
+    let leaf = Rc::new(Node {
+        value: 3,
+        parent: RefCell::new(Weak::new()),
+        children: RefCell::new(vec![]),
+    });
+
+    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
+
+    let branch = Rc::new(Node {
+        value: 5,
+        parent: RefCell::new(Weak::new()),
+        children: RefCell::new(vec![Rc::clone(&leaf)]),
+    });
+
+    *leaf.parent.borrow_mut() = Rc::downgrade(&branch);
+
+    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
+}
+

这样,一个节点就能够引用其父节点,但不拥有其父节点。在示例 15-28 中,我们更新 main 来使用新定义以便 leaf 节点可以通过 branch 引用其父节点:

+

文件名:src/main.rs

+
use std::cell::RefCell;
+use std::rc::{Rc, Weak};
+
+#[derive(Debug)]
+struct Node {
+    value: i32,
+    parent: RefCell<Weak<Node>>,
+    children: RefCell<Vec<Rc<Node>>>,
+}
+
+fn main() {
+    let leaf = Rc::new(Node {
+        value: 3,
+        parent: RefCell::new(Weak::new()),
+        children: RefCell::new(vec![]),
+    });
+
+    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
+
+    let branch = Rc::new(Node {
+        value: 5,
+        parent: RefCell::new(Weak::new()),
+        children: RefCell::new(vec![Rc::clone(&leaf)]),
+    });
+
+    *leaf.parent.borrow_mut() = Rc::downgrade(&branch);
+
+    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
+}
+

示例 15-28:一个 leaf 节点,其拥有指向其父节点 branchWeak 引用

+

创建 leaf 节点类似于示例 15-27,除了 parent 字段有所不同:leaf 开始时没有父节点,所以我们新建了一个空的 Weak 引用实例。

+

此时,当尝试使用 upgrade 方法获取 leaf 的父节点引用时,会得到一个 None 值。如第一个 println! 输出所示:

+
leaf parent = None
+
+

当创建 branch 节点时,其也会新建一个 Weak<Node> 引用,因为 branch 并没有父节点。leaf 仍然作为 branch 的一个子节点。一旦在 branch 中有了 Node 实例,就可以修改 leaf 使其拥有指向父节点的 Weak<Node> 引用。这里使用了 leafparent 字段里的 RefCell<Weak<Node>>borrow_mut 方法,接着使用了 Rc::downgrade 函数来从 branch 中的 Rc<Node> 值创建了一个指向 branchWeak<Node> 引用。

+

当再次打印出 leaf 的父节点时,这一次将会得到存放了 branchSome 值:现在 leaf 可以访问其父节点了!当打印出 leaf 时,我们也避免了如示例 15-26 中最终会导致栈溢出的循环:Weak<Node> 引用被打印为 (Weak)

+
leaf parent = Some(Node { value: 5, parent: RefCell { value: (Weak) },
+children: RefCell { value: [Node { value: 3, parent: RefCell { value: (Weak) },
+children: RefCell { value: [] } }] } })
+
+

没有无限的输出表明这段代码并没有造成引用循环。这一点也可以从观察 Rc::strong_countRc::weak_count 调用的结果看出。

+

可视化 strong_countweak_count 的改变

+

让我们通过创建了一个新的内部作用域并将 branch 的创建放入其中,来观察 Rc<Node> 实例的 strong_countweak_count 值的变化。这会展示当 branch 创建和离开作用域被丢弃时会发生什么。这些修改如示例 15-29 所示:

+

文件名:src/main.rs

+
use std::cell::RefCell;
+use std::rc::{Rc, Weak};
+
+#[derive(Debug)]
+struct Node {
+    value: i32,
+    parent: RefCell<Weak<Node>>,
+    children: RefCell<Vec<Rc<Node>>>,
+}
+
+fn main() {
+    let leaf = Rc::new(Node {
+        value: 3,
+        parent: RefCell::new(Weak::new()),
+        children: RefCell::new(vec![]),
+    });
+
+    println!(
+        "leaf strong = {}, weak = {}",
+        Rc::strong_count(&leaf),
+        Rc::weak_count(&leaf),
+    );
+
+    {
+        let branch = Rc::new(Node {
+            value: 5,
+            parent: RefCell::new(Weak::new()),
+            children: RefCell::new(vec![Rc::clone(&leaf)]),
+        });
+
+        *leaf.parent.borrow_mut() = Rc::downgrade(&branch);
+
+        println!(
+            "branch strong = {}, weak = {}",
+            Rc::strong_count(&branch),
+            Rc::weak_count(&branch),
+        );
+
+        println!(
+            "leaf strong = {}, weak = {}",
+            Rc::strong_count(&leaf),
+            Rc::weak_count(&leaf),
+        );
+    }
+
+    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
+    println!(
+        "leaf strong = {}, weak = {}",
+        Rc::strong_count(&leaf),
+        Rc::weak_count(&leaf),
+    );
+}
+

示例 15-29:在内部作用域创建 branch 并检查其强弱引用计数

+

一旦创建了 leaf,其 Rc<Node> 的强引用计数为 1,弱引用计数为 0。在内部作用域中创建了 branch 并与 leaf 相关联,此时 branchRc<Node> 的强引用计数为 1,弱引用计数为 1(因为 leaf.parent 通过 Weak<Node> 指向 branch)。这里 leaf 的强引用计数为 2,因为现在 branchbranch.children 中储存了 leafRc<Node> 的拷贝,不过弱引用计数仍然为 0。

+

当内部作用域结束时,branch 离开作用域,Rc<Node> 的强引用计数减少为 0,所以其 Node 被丢弃。来自 leaf.parent 的弱引用计数 1 与 Node 是否被丢弃无关,所以并没有产生任何内存泄漏!

+

如果在内部作用域结束后尝试访问 leaf 的父节点,会再次得到 None。在程序的结尾,leafRc<Node> 的强引用计数为 1,弱引用计数为 0,因为现在 leaf 又是 Rc<Node> 唯一的引用了。

+

所有这些管理计数和值的逻辑都内建于 Rc<T>Weak<T> 以及它们的 Drop trait 实现中。通过在 Node 定义中指定从子节点到父节点的关系为一个Weak<T>引用,就能够拥有父节点和子节点之间的双向引用而不会造成引用循环和内存泄漏。

+

总结

+

这一章涵盖了如何使用智能指针来做出不同于 Rust 常规引用默认所提供的保证与取舍。Box<T> 有一个已知的大小并指向分配在堆上的数据。Rc<T> 记录了堆上数据的引用数量以便可以拥有多个所有者。RefCell<T> 和其内部可变性提供了一个可以用于当需要不可变类型但是需要改变其内部值能力的类型,并在运行时而不是编译时检查借用规则。

+

我们还介绍了提供了很多智能指针功能的 trait DerefDrop。同时探索了会造成内存泄漏的引用循环,以及如何使用 Weak<T> 来避免它们。

+

如果本章内容引起了你的兴趣并希望现在就实现你自己的智能指针的话,请阅读 “The Rustonomicon” 来获取更多有用的信息。

+

接下来,让我们谈谈 Rust 的并发。届时甚至还会学习到一些新的对并发有帮助的智能指针。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch16-00-concurrency.html b/ch16-00-concurrency.html new file mode 100644 index 000000000..bdc2a681d --- /dev/null +++ b/ch16-00-concurrency.html @@ -0,0 +1,257 @@ + + + + + + 无畏并发 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

无畏并发

+
+

ch16-00-concurrency.md +
+commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f

+
+

安全且高效地处理并发编程是 Rust 的另一个主要目标。并发编程Concurrent programming),代表程序的不同部分相互独立地执行,而 并行编程parallel programming)代表程序不同部分同时执行,这两个概念随着计算机越来越多的利用多处理器的优势而显得愈发重要。由于历史原因,在此类上下文中编程一直是困难且容易出错的:Rust 希望能改变这一点。

+

起初,Rust 团队认为确保内存安全和防止并发问题是两个分别需要不同方法应对的挑战。随着时间的推移,团队发现所有权和类型系统是一系列解决内存安全 并发问题的强有力的工具!通过利用所有权和类型检查,在 Rust 中很多并发错误都是 编译时 错误,而非运行时错误。因此,相比花费大量时间尝试重现运行时并发 bug 出现的特定情况,Rust 会拒绝编译不正确的代码并提供解释问题的错误信息。因此,你可以在开发时修复代码,而不是在部署到生产环境后修复代码。我们给 Rust 的这一部分起了一个绰号 无畏并发fearless concurrency)。无畏并发令你的代码免于出现诡异的 bug 并可以轻松重构且无需担心会引入新的 bug。

+
+

注意:出于简洁的考虑,我们将很多问题归类为 并发,而不是更准确的区分 并发和(或)并行。如果这是一本专注于并发和/或并行的书,我们肯定会更加精确的。对于本章,当我们谈到 并发 时,请自行脑内替换为 并发和(或)并行

+
+

很多语言所提供的处理并发问题的解决方法都非常有特色。例如,Erlang 有着优雅的消息传递并发功能,但只有模糊不清的在线程间共享状态的方法。对于高级语言来说,只实现可能解决方案的子集是一个合理的策略,因为高级语言所许诺的价值来源于牺牲一些控制来换取抽象。然而对于底层语言则期望提供在任何给定的情况下有着最高的性能且对硬件有更少的抽象。因此,Rust 提供了多种工具,以符合实际情况和需求的方式来为问题建模。

+

如下是本章将要涉及到的内容:

+
    +
  • 如何创建线程来同时运行多段代码。
  • +
  • 消息传递Message passing)并发,其中信道(channel)被用来在线程间传递消息。
  • +
  • 共享状态Shared state)并发,其中多个线程可以访问同一片数据。
  • +
  • SyncSend trait,将 Rust 的并发保证扩展到用户定义的以及标准库提供的类型中。
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch16-01-threads.html b/ch16-01-threads.html new file mode 100644 index 000000000..e6bc37dc8 --- /dev/null +++ b/ch16-01-threads.html @@ -0,0 +1,465 @@ + + + + + + 使用线程同时地运行代码 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用线程同时运行代码

+
+

ch16-01-threads.md +
+commit 8aecae3efe5ca8f79f055b70f05d9a3f990bce7b

+
+

在大部分现代操作系统中,已执行程序的代码在一个 进程process)中运行,操作系统则会负责管理多个进程。在程序内部,也可以拥有多个同时运行的独立部分。这些运行这些独立部分的功能被称为 线程threads)。例如,web 服务器可以有多个线程以便可以同时响应多个请求。

+

将程序中的计算拆分进多个线程可以改善性能,因为程序可以同时进行多个任务,不过这也会增加复杂性。因为线程是同时运行的,所以无法预先保证不同线程中的代码的执行顺序。这会导致诸如此类的问题:

+
    +
  • 竞态条件(Race conditions),多个线程以不一致的顺序访问数据或资源
  • +
  • 死锁(Deadlocks),两个线程相互等待对方,这会阻止两者继续运行
  • +
  • 只会发生在特定情况且难以稳定重现和修复的 bug
  • +
+

Rust 尝试减轻使用线程的负面影响。不过在多线程上下文中编程仍需格外小心,同时其所要求的代码结构也不同于运行于单线程的程序。

+

编程语言有一些不同的方法来实现线程,而且很多操作系统提供了创建新线程的 API。Rust 标准库使用 1:1 线程实现,这代表程序的每一个语言级线程使用一个系统线程。有一些 crate 实现了其他有着不同于 1:1 模型取舍的线程模型。

+

使用 spawn 创建新线程

+

为了创建一个新线程,需要调用 thread::spawn 函数并传递一个闭包(第十三章学习了闭包),并在其中包含希望在新线程运行的代码。示例 16-1 中的例子在主线程打印了一些文本而另一些文本则由新线程打印:

+

文件名:src/main.rs

+
use std::thread;
+use std::time::Duration;
+
+fn main() {
+    thread::spawn(|| {
+        for i in 1..10 {
+            println!("hi number {i} from the spawned thread!");
+            thread::sleep(Duration::from_millis(1));
+        }
+    });
+
+    for i in 1..5 {
+        println!("hi number {i} from the main thread!");
+        thread::sleep(Duration::from_millis(1));
+    }
+}
+

示例 16-1: 创建一个打印某些内容的新线程,但是主线程打印其它内容

+

注意当 Rust 程序的主线程结束时,新线程也会结束,而不管其是否执行完毕。这个程序的输出可能每次都略有不同,不过它大体上看起来像这样:

+
hi number 1 from the main thread!
+hi number 1 from the spawned thread!
+hi number 2 from the main thread!
+hi number 2 from the spawned thread!
+hi number 3 from the main thread!
+hi number 3 from the spawned thread!
+hi number 4 from the main thread!
+hi number 4 from the spawned thread!
+hi number 5 from the spawned thread!
+
+

thread::sleep 调用强制线程停止执行一小段时间,这会允许其他不同的线程运行。这些线程可能会轮流运行,不过并不保证如此:这依赖操作系统如何调度线程。在这里,主线程首先打印,即便新创建线程的打印语句位于程序的开头,甚至即便我们告诉新建的线程打印直到 i 等于 9,它在主线程结束之前也只打印到了 5。

+

如果运行代码只看到了主线程的输出,或没有出现重叠打印的现象,尝试增大区间 (变量 i 的范围) 来增加操作系统切换线程的机会。

+

使用 join 等待所有线程结束

+

由于主线程结束,示例 16-1 中的代码大部分时候不光会提早结束新建线程,因为无法保证线程运行的顺序,我们甚至不能实际保证新建线程会被执行!

+

可以通过将 thread::spawn 的返回值储存在变量中来修复新建线程部分没有执行或者完全没有执行的问题。thread::spawn 的返回值类型是 JoinHandleJoinHandle 是一个拥有所有权的值,当对其调用 join 方法时,它会等待其线程结束。示例 16-2 展示了如何使用示例 16-1 中创建的线程的 JoinHandle 并调用 join 来确保新建线程在 main 退出前结束运行:

+

文件名:src/main.rs

+
use std::thread;
+use std::time::Duration;
+
+fn main() {
+    let handle = thread::spawn(|| {
+        for i in 1..10 {
+            println!("hi number {i} from the spawned thread!");
+            thread::sleep(Duration::from_millis(1));
+        }
+    });
+
+    for i in 1..5 {
+        println!("hi number {i} from the main thread!");
+        thread::sleep(Duration::from_millis(1));
+    }
+
+    handle.join().unwrap();
+}
+

示例 16-2: 从 thread::spawn 保存一个 JoinHandle 以确保该线程能够运行至结束

+

通过调用 handle 的 join 会阻塞当前线程直到 handle 所代表的线程结束。阻塞Blocking)线程意味着阻止该线程执行工作或退出。因为我们将 join 调用放在了主线程的 for 循环之后,运行示例 16-2 应该会产生类似这样的输出:

+
hi number 1 from the main thread!
+hi number 2 from the main thread!
+hi number 1 from the spawned thread!
+hi number 3 from the main thread!
+hi number 2 from the spawned thread!
+hi number 4 from the main thread!
+hi number 3 from the spawned thread!
+hi number 4 from the spawned thread!
+hi number 5 from the spawned thread!
+hi number 6 from the spawned thread!
+hi number 7 from the spawned thread!
+hi number 8 from the spawned thread!
+hi number 9 from the spawned thread!
+
+

这两个线程仍然会交替执行,不过主线程会由于 handle.join() 调用会等待直到新建线程执行完毕。

+

不过让我们看看将 handle.join() 移动到 mainfor 循环之前会发生什么,如下:

+

文件名:src/main.rs

+
use std::thread;
+use std::time::Duration;
+
+fn main() {
+    let handle = thread::spawn(|| {
+        for i in 1..10 {
+            println!("hi number {i} from the spawned thread!");
+            thread::sleep(Duration::from_millis(1));
+        }
+    });
+
+    handle.join().unwrap();
+
+    for i in 1..5 {
+        println!("hi number {i} from the main thread!");
+        thread::sleep(Duration::from_millis(1));
+    }
+}
+

主线程会等待直到新建线程执行完毕之后才开始执行 for 循环,所以输出将不会交替出现,如下所示:

+
hi number 1 from the spawned thread!
+hi number 2 from the spawned thread!
+hi number 3 from the spawned thread!
+hi number 4 from the spawned thread!
+hi number 5 from the spawned thread!
+hi number 6 from the spawned thread!
+hi number 7 from the spawned thread!
+hi number 8 from the spawned thread!
+hi number 9 from the spawned thread!
+hi number 1 from the main thread!
+hi number 2 from the main thread!
+hi number 3 from the main thread!
+hi number 4 from the main thread!
+
+

诸如将 join 放置于何处这样的小细节,会影响线程是否同时运行。

+

move 闭包与线程一同使用

+

move 关键字经常用于传递给 thread::spawn 的闭包,因为闭包会获取从环境中取得的值的所有权,因此会将这些值的所有权从一个线程传送到另一个线程。在第十三章 “闭包会捕获其环境” 部分讨论了闭包上下文中的 move。现在我们会更专注于 movethread::spawn 之间的交互。

+

在第十三章中,我们讲到可以在参数列表前使用 move 关键字强制闭包获取其使用的环境值的所有权。这个技巧在创建新线程将值的所有权从一个线程移动到另一个线程时最为实用。

+

注意示例 16-1 中传递给 thread::spawn 的闭包并没有任何参数:并没有在新建线程代码中使用任何主线程的数据。为了在新建线程中使用来自于主线程的数据,需要新建线程的闭包获取它需要的值。示例 16-3 展示了一个尝试在主线程中创建一个 vector 并用于新建线程的例子,不过这么写还不能工作,如下所示:

+

文件名:src/main.rs

+
use std::thread;
+
+fn main() {
+    let v = vec![1, 2, 3];
+
+    let handle = thread::spawn(|| {
+        println!("Here's a vector: {v:?}");
+    });
+
+    handle.join().unwrap();
+}
+

示例 16-3: 尝试在另一个线程使用主线程创建的 vector

+

闭包使用了 v,所以闭包会捕获 v 并使其成为闭包环境的一部分。因为 thread::spawn 在一个新线程中运行这个闭包,所以可以在新线程中访问 v。然而当编译这个例子时,会得到如下错误:

+
$ cargo run
+   Compiling threads v0.1.0 (file:///projects/threads)
+error[E0373]: closure may outlive the current function, but it borrows `v`, which is owned by the current function
+ --> src/main.rs:6:32
+  |
+6 |     let handle = thread::spawn(|| {
+  |                                ^^ may outlive borrowed value `v`
+7 |         println!("Here's a vector: {v:?}");
+  |                                     - `v` is borrowed here
+  |
+note: function requires argument type to outlive `'static`
+ --> src/main.rs:6:18
+  |
+6 |       let handle = thread::spawn(|| {
+  |  __________________^
+7 | |         println!("Here's a vector: {v:?}");
+8 | |     });
+  | |______^
+help: to force the closure to take ownership of `v` (and any other referenced variables), use the `move` keyword
+  |
+6 |     let handle = thread::spawn(move || {
+  |                                ++++
+
+For more information about this error, try `rustc --explain E0373`.
+error: could not compile `threads` (bin "threads") due to 1 previous error
+
+

Rust 会 推断 如何捕获 v,因为 println! 只需要 v 的引用,闭包尝试借用 v。然而这有一个问题:Rust 不知道这个新建线程会执行多久,所以无法知晓对 v 的引用是否一直有效。

+

示例 16-4 展示了一个 v 的引用很有可能不再有效的场景:

+

文件名:src/main.rs

+
use std::thread;
+
+fn main() {
+    let v = vec![1, 2, 3];
+
+    let handle = thread::spawn(|| {
+        println!("Here's a vector: {v:?}");
+    });
+
+    drop(v); // oh no!
+
+    handle.join().unwrap();
+}
+

示例 16-4: 一个具有闭包的线程,尝试使用一个在主线程中被回收的引用 v

+

如果 Rust 允许这段代码运行,则新建线程则可能会立刻被转移到后台并完全没有机会运行。新建线程内部有一个 v 的引用,不过主线程立刻就使用第十五章讨论的 drop 丢弃了 v。接着当新建线程开始执行,v 已不再有效,所以其引用也是无效的。噢,这太糟了!

+

为了修复示例 16-3 的编译错误,我们可以听取错误信息的建议:

+
help: to force the closure to take ownership of `v` (and any other referenced variables), use the `move` keyword
+  |
+6 |     let handle = thread::spawn(move || {
+  |                                ++++
+
+

通过在闭包之前增加 move 关键字,我们强制闭包获取其使用的值的所有权,而不是任由 Rust 推断它应该借用值。示例 16-5 中展示的对示例 16-3 代码的修改,可以按照我们的预期编译并运行:

+

文件名:src/main.rs

+
use std::thread;
+
+fn main() {
+    let v = vec![1, 2, 3];
+
+    let handle = thread::spawn(move || {
+        println!("Here's a vector: {v:?}");
+    });
+
+    handle.join().unwrap();
+}
+

示例 16-5: 使用 move 关键字强制获取它使用的值的所有权

+

我们可能希望尝试同样的方法来修复示例 16-4 中的代码,其主线程使用 move 闭包调用了 drop。然而这个修复行不通,因为示例 16-4 所尝试的操作由于一个不同的原因而不被允许。如果为闭包增加 move,将会把 v 移动进闭包的环境中,如此将不能在主线程中对其调用 drop 了。我们会得到如下不同的编译错误:

+
$ cargo run
+   Compiling threads v0.1.0 (file:///projects/threads)
+error[E0382]: use of moved value: `v`
+  --> src/main.rs:10:10
+   |
+4  |     let v = vec![1, 2, 3];
+   |         - move occurs because `v` has type `Vec<i32>`, which does not implement the `Copy` trait
+5  |
+6  |     let handle = thread::spawn(move || {
+   |                                ------- value moved into closure here
+7  |         println!("Here's a vector: {v:?}");
+   |                                     - variable moved due to use in closure
+...
+10 |     drop(v); // oh no!
+   |          ^ value used here after move
+
+For more information about this error, try `rustc --explain E0382`.
+error: could not compile `threads` (bin "threads") due to 1 previous error
+
+

Rust 的所有权规则又一次帮助了我们!示例 16-3 中的错误是因为 Rust 是保守的并只会为线程借用 v,这意味着主线程理论上可能使新建线程的引用无效。通过告诉 Rust 将 v 的所有权移动到新建线程,我们向 Rust 保证主线程不会再使用 v。如果对示例 16-4 也做出如此修改,那么当在主线程中使用 v 时就会违反所有权规则。 move 关键字覆盖了 Rust 默认保守的借用,但它不允许我们违反所有权规则。

+

现在我们对线程和线程 API 有了基本的了解,让我们讨论一下使用线程实际可以 什么吧。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch16-02-message-passing.html b/ch16-02-message-passing.html new file mode 100644 index 000000000..253a8ba4e --- /dev/null +++ b/ch16-02-message-passing.html @@ -0,0 +1,435 @@ + + + + + + 使用消息传递在线程间通信 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用消息传递在线程间传送数据

+
+

ch16-02-message-passing.md +
+commit 36383b4da21dbd0a0781473bc8ad7ef0ed1b6751

+
+

一个日益流行的确保安全并发的方式是 消息传递message passing),这里线程或 actor 通过发送包含数据的消息来相互沟通。这个思想来源于 Go 编程语言文档中 的口号:“不要通过共享内存来通讯;而是通过通讯来共享内存。”(“Do not communicate by sharing memory; instead, share memory by communicating.”)

+

为了实现消息传递并发,Rust 标准库提供了一个 信道channel)实现。信道是一个通用编程概念,表示数据从一个线程发送到另一个线程。

+

你可以将编程中的信道想象为一个水流的渠道,比如河流或小溪。如果你将诸如橡皮鸭或小船之类的东西放入其中,它们会顺流而下到达下游。

+

编程中的信息渠道(信道)有两部分组成,一个发送者(transmitter)和一个接收者(receiver)。发送者位于上游位置,在这里可以将橡皮鸭放入河中,接收者则位于下游,橡皮鸭最终会漂流至此。代码中的一部分调用发送者的方法以及希望发送的数据,另一部分则检查接收端收到的消息。当发送者或接收者任一被丢弃时可以认为信道被 关闭closed)了。

+

这里,我们将开发一个程序,它会在一个线程生成值向信道发送,而在另一个线程会接收值并打印出来。这里会通过信道在线程间发送简单值来演示这个功能。一旦你熟悉了这项技术,你就可以将信道用于任何相互通信的任何线程,例如一个聊天系统,或利用很多线程进行分布式计算并将部分计算结果发送给一个线程进行聚合。

+

首先,在示例 16-6 中,创建了一个信道但没有做任何事。注意这还不能编译,因为 Rust 不知道我们想要在信道中发送什么类型:

+

文件名:src/main.rs

+
use std::sync::mpsc;
+
+fn main() {
+    let (tx, rx) = mpsc::channel();
+}
+

示例 16-6: 创建一个信道,并将其两端赋值给 txrx

+

这里使用 mpsc::channel 函数创建一个新的信道;mpsc多个生产者,单个消费者multiple producer, single consumer)的缩写。简而言之,Rust 标准库实现信道的方式意味着一个信道可以有多个产生值的 发送sending)端,但只能有一个消费这些值的 接收receiving)端。想象一下多条小河小溪最终汇聚成大河:所有通过这些小河发出的东西最后都会来到下游的大河。目前我们以单个生产者开始,但是当示例可以工作后会增加多个生产者。

+

mpsc::channel 函数返回一个元组:第一个元素是发送端 -- 发送者,而第二个元素是接收端 -- 接收者。由于历史原因,txrx 通常作为 发送者transmitter)和 接收者receiver)的缩写,所以这就是我们将用来绑定这两端变量的名字。这里使用了一个 let 语句和模式来解构了此元组;第十九章会讨论 let 语句中的模式和解构。现在只需知道使用 let 语句是一个方便提取 mpsc::channel 返回的元组中一部分的手段。

+

让我们将发送端移动到一个新建线程中并发送一个字符串,这样新建线程就可以和主线程通讯了,如示例 16-7 所示。这类似于在河的上游扔下一只橡皮鸭或从一个线程向另一个线程发送聊天信息:

+

文件名:src/main.rs

+
use std::sync::mpsc;
+use std::thread;
+
+fn main() {
+    let (tx, rx) = mpsc::channel();
+
+    thread::spawn(move || {
+        let val = String::from("hi");
+        tx.send(val).unwrap();
+    });
+}
+

示例 16-7: 将 tx 移动到一个新建的线程中并发送 “hi”

+

这里再次使用 thread::spawn 来创建一个新线程并使用 movetx 移动到闭包中这样新建线程就拥有 tx 了。新建线程需要拥有信道的发送端以便能向信道发送消息。信道的发送端有一个 send 方法用来获取需要放入信道的值。send 方法返回一个 Result<T, E> 类型,所以如果接收端已经被丢弃了,将没有发送值的目标,所以发送操作会返回错误。在这个例子中,出错的时候调用 unwrap 产生 panic。不过对于一个真实程序,需要合理地处理它:回到第九章复习正确处理错误的策略。

+

在示例 16-8 中,我们在主线程中从信道的接收者获取值。这类似于在河的下游捞起橡皮鸭或接收聊天信息:

+

文件名:src/main.rs

+
use std::sync::mpsc;
+use std::thread;
+
+fn main() {
+    let (tx, rx) = mpsc::channel();
+
+    thread::spawn(move || {
+        let val = String::from("hi");
+        tx.send(val).unwrap();
+    });
+
+    let received = rx.recv().unwrap();
+    println!("Got: {received}");
+}
+

示例 16-8: 在主线程中接收并打印内容 “hi”

+

信道的接收者有两个有用的方法:recvtry_recv。这里,我们使用了 recv,它是 receive 的缩写。这个方法会阻塞主线程执行直到从信道中接收一个值。一旦发送了一个值,recv 会在一个 Result<T, E> 中返回它。当信道发送端关闭,recv 会返回一个错误表明不会再有新的值到来了。

+

try_recv 不会阻塞,相反它立刻返回一个 Result<T, E>Ok 值包含可用的信息,而 Err 值代表此时没有任何消息。如果线程在等待消息过程中还有其他工作时使用 try_recv 很有用:可以编写一个循环来频繁调用 try_recv,在有可用消息时进行处理,其余时候则处理一会其他工作直到再次检查。

+

出于简单的考虑,这个例子使用了 recv;主线程中除了等待消息之外没有任何其他工作,所以阻塞主线程是合适的。

+

如果运行示例 16-8 中的代码,我们将会看到主线程打印出这个值:

+
Got: hi
+
+

完美!

+

信道与所有权转移

+

所有权规则在消息传递中扮演了重要角色,其有助于我们编写安全的并发代码。防止并发编程中的错误是在 Rust 程序中考虑所有权的一大优势。现在让我们做一个试验来看看信道与所有权如何一同协作以避免产生问题:我们将尝试在新建线程中的信道中发送完 val之后 再使用它。尝试编译示例 16-9 中的代码并看看为何这是不允许的:

+

文件名:src/main.rs

+
use std::sync::mpsc;
+use std::thread;
+
+fn main() {
+    let (tx, rx) = mpsc::channel();
+
+    thread::spawn(move || {
+        let val = String::from("hi");
+        tx.send(val).unwrap();
+        println!("val is {val}");
+    });
+
+    let received = rx.recv().unwrap();
+    println!("Got: {received}");
+}
+

示例 16-9: 在我们已经发送到信道中后,尝试使用 val 引用

+

这里尝试在通过 tx.send 发送 val 到信道中之后将其打印出来。允许这么做是一个坏主意:一旦将值发送到另一个线程后,那个线程可能会在我们再次使用它之前就将其修改或者丢弃。其他线程对值可能的修改会由于不一致或不存在的数据而导致错误或意外的结果。然而,尝试编译示例 16-9 的代码时,Rust 会给出一个错误:

+
$ cargo run
+   Compiling message-passing v0.1.0 (file:///projects/message-passing)
+error[E0382]: borrow of moved value: `val`
+  --> src/main.rs:10:26
+   |
+8  |         let val = String::from("hi");
+   |             --- move occurs because `val` has type `String`, which does not implement the `Copy` trait
+9  |         tx.send(val).unwrap();
+   |                 --- value moved here
+10 |         println!("val is {val}");
+   |                          ^^^^^ value borrowed here after move
+   |
+   = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+For more information about this error, try `rustc --explain E0382`.
+error: could not compile `message-passing` (bin "message-passing") due to 1 previous error
+
+

我们的并发错误会造成一个编译时错误。send 函数获取其参数的所有权并移动这个值归接收者所有。这可以防止在发送后再次意外地使用这个值;所有权系统检查一切是否合乎规则。

+

发送多个值并观察接收者的等待

+

示例 16-8 中的代码可以编译和运行,不过它并没有明确的告诉我们两个独立的线程通过信道相互通讯。示例 16-10 则有一些改进会证明示例 16-8 中的代码是并发执行的:新建线程现在会发送多个消息并在每个消息之间暂停一秒钟。

+

文件名:src/main.rs

+
use std::sync::mpsc;
+use std::thread;
+use std::time::Duration;
+
+fn main() {
+    let (tx, rx) = mpsc::channel();
+
+    thread::spawn(move || {
+        let vals = vec![
+            String::from("hi"),
+            String::from("from"),
+            String::from("the"),
+            String::from("thread"),
+        ];
+
+        for val in vals {
+            tx.send(val).unwrap();
+            thread::sleep(Duration::from_secs(1));
+        }
+    });
+
+    for received in rx {
+        println!("Got: {received}");
+    }
+}
+

示例 16-10: 发送多个消息,并在每次发送后暂停一段时间

+

这一次,在新建线程中有一个字符串 vector 希望发送到主线程。我们遍历它们,单独的发送每一个字符串并通过一个 Duration 值调用 thread::sleep 函数来暂停一秒。

+

在主线程中,不再显式调用 recv 函数:而是将 rx 当作一个迭代器。对于每一个接收到的值,我们将其打印出来。当信道被关闭时,迭代器也将结束。

+

当运行示例 16-10 中的代码时,将看到如下输出,每一行都会暂停一秒:

+
Got: hi
+Got: from
+Got: the
+Got: thread
+
+

因为主线程中的 for 循环里并没有任何暂停或等待的代码,所以可以说主线程是在等待从新建线程中接收值。

+

通过克隆发送者来创建多个生产者

+

之前我们提到了mpscmultiple producer, single consumer 的缩写。可以运用 mpsc 来扩展示例 16-10 中的代码来创建向同一接收者发送值的多个线程。这可以通过克隆发送者来做到,如示例 16-11 所示:

+

文件名:src/main.rs

+
use std::sync::mpsc;
+use std::thread;
+use std::time::Duration;
+
+fn main() {
+    // --snip--
+
+    let (tx, rx) = mpsc::channel();
+
+    let tx1 = tx.clone();
+    thread::spawn(move || {
+        let vals = vec![
+            String::from("hi"),
+            String::from("from"),
+            String::from("the"),
+            String::from("thread"),
+        ];
+
+        for val in vals {
+            tx1.send(val).unwrap();
+            thread::sleep(Duration::from_secs(1));
+        }
+    });
+
+    thread::spawn(move || {
+        let vals = vec![
+            String::from("more"),
+            String::from("messages"),
+            String::from("for"),
+            String::from("you"),
+        ];
+
+        for val in vals {
+            tx.send(val).unwrap();
+            thread::sleep(Duration::from_secs(1));
+        }
+    });
+
+    for received in rx {
+        println!("Got: {received}");
+    }
+
+    // --snip--
+}
+

示例 16-11: 从多个生产者发送多个消息

+

这一次,在创建新线程之前,我们对发送者调用了 clone 方法。这会给我们一个可以传递给第一个新建线程的发送端句柄。我们会将原始的信道发送端传递给第二个新建线程。这样就会有两个线程,每个线程将向信道的接收端发送不同的消息。

+

如果运行这些代码,你 可能 会看到这样的输出:

+
Got: hi
+Got: more
+Got: from
+Got: messages
+Got: for
+Got: the
+Got: thread
+Got: you
+
+

虽然你可能会看到这些值以不同的顺序出现;这依赖于你的系统。这也就是并发既有趣又困难的原因。如果通过 thread::sleep 做实验,在不同的线程中提供不同的值,就会发现它们的运行更加不确定,且每次都会产生不同的输出。

+

现在我们见识过了信道如何工作,再看看另一种不同的并发方式吧。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch16-03-shared-state.html b/ch16-03-shared-state.html new file mode 100644 index 000000000..3b3cbaaea --- /dev/null +++ b/ch16-03-shared-state.html @@ -0,0 +1,432 @@ + + + + + + 共享状态并发 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

共享状态的并发

+
+

ch16-03-shared-state.md +
+commit 856d89c53a6d69470bb5669c773fdfe6aab6fcc9

+
+

消息传递是一个很好的处理并发的方式,但并不是唯一一个。另一种方式是让多个线程访问同一块内存中的数据(共享状态)。再考虑一下 Go 语言文档中的这句口号:“不要通过共享内存来通讯”(“do not communicate by sharing memory.”

+

通过共享内存进行通信,会是什么样的代码?此外,为什么喜欢消息传递的人会警告:谨慎使用内存共享?

+

在某种程度上,任何编程语言中的信道都类似于单所有权,因为一旦将一个值传送到信道中,将无法再使用这个值。共享内存类似于多所有权:多个线程可以同时访问相同的内存位置。在 15 章中,我们介绍了智能指针可以实现多所有权,然而这会增加额外的复杂性,因为需要管理多个所有者。Rust 的类型系统和所有权规则在正确管理这些问题上提供了极大的帮助:举个例子,让我们来看看 互斥器,一个较常见的共享内存并发原语。

+

使用互斥器,实现同一时刻只允许一个线程访问数据

+

互斥器mutex)是 互相排斥(mutual exclusion)的缩写。在同一时刻,其只允许一个线程对数据拥有访问权。为了访问互斥器中的数据,线程首先需要通过获取互斥器的 lock)来表明其希望访问数据。锁是一个数据结构,作为互斥器的一部分,它记录谁有数据的专属访问权。因此我们讲,互斥器通过锁系统 保护guarding)其数据。

+

互斥器以难以使用著称(译注:原文指互斥器在其他编程语言中难以使用),因为你必须记住:

+
    +
  1. 在使用数据之前,必须获取锁。
  2. +
  3. 使用完被互斥器所保护的数据之后,必须解锁数据,这样其他线程才能够获取锁。
  4. +
+

作为一个现实中互斥器的例子,想象一下在某个会议的一次小组座谈会中,只有一个麦克风。如果一位成员要发言,他必须请求或表示希望使用麦克风。得到了麦克风后,他可以畅所欲言,讲完后再将麦克风交给下一位希望讲话的成员。如果一位成员结束发言后忘记将麦克风交还,其他人将无法发言。如果对共享麦克风的管理出现了问题,座谈会将无法正常进行!

+

正确的管理互斥器异常复杂,这也是许多人之所以热衷于信道的原因。然而,在 Rust 中,得益于类型系统和所有权,我们不会在锁和解锁上出错。

+

Mutex<T>的 API

+

我们先从在单线程环境中使用互斥器开始,作为展示其用法的一个例子,如示例 16-12 所示:

+

文件名:src/main.rs

+
use std::sync::Mutex;
+
+fn main() {
+    let m = Mutex::new(5);
+
+    {
+        let mut num = m.lock().unwrap();
+        *num = 6;
+    }
+
+    println!("m = {m:?}");
+}
+

示例 16-12: 出于简单的考虑,在一个单线程上下文中探索 Mutex<T> 的 API

+

像很多类型一样,我们使用关联函数 new 来创建一个 Mutex<T>。使用 lock 方法来获取锁,从而可以访问互斥器中的数据。这个调用会阻塞当前线程,直到我们拥有锁为止。

+

如果另一个线程拥有锁,并且那个线程 panic 了,则 lock 调用会失败。在这种情况下,没人能够再获取锁,所以我们调用 unwrap,使当前线程 panic。

+

一旦获取了锁,就可以将返回值(命名为 num)视为一个其内部数据(i32)的可变引用了。类型系统确保了我们在使用 m 中的值之前获取锁。m 的类型是 Mutex<i32> 而不是 i32,所以 必须 获取锁才能使用这个 i32 值。我们是不会忘记这么做的,因为如果没有获取锁,类型系统就不允许访问内部的 i32 值。

+

正如你所猜想的,Mutex<T> 是一个智能指针。更准确的说,lock 调用 返回 一个叫做 MutexGuard 的智能指针。这个智能指针实现了 Deref 来指向其内部数据;它也实现了 Drop,当 MutexGuard 离开作用域时,自动释放锁(发生在示例 16-12 内部作用域的结尾)。有了这个特性,就不会有忘记释放锁的潜在风险(忘记释放锁会使互斥器无法再被其它线程使用),因为锁的释放是自动发生的。

+

释放锁之后,我们可以打印出互斥器内部的 i32 值,并发现我们刚刚已经将其值改为 6。

+

在线程间共享 Mutex<T>

+

现在让我们尝试使用 Mutex<T> 在多个线程间共享同一个值。我们将启动 10 个线程,并在各个线程中对同一个计数器值加 1,这样计数器将从 0 变为 10。示例 16-13 中的例子会出现编译错误,而我们将通过这些错误来学习如何使用 Mutex<T>,以及 Rust 又是如何帮助我们正确使用的。

+

文件名:src/main.rs

+
use std::sync::Mutex;
+use std::thread;
+
+fn main() {
+    let counter = Mutex::new(0);
+    let mut handles = vec![];
+
+    for _ in 0..10 {
+        let handle = thread::spawn(move || {
+            let mut num = counter.lock().unwrap();
+
+            *num += 1;
+        });
+        handles.push(handle);
+    }
+
+    for handle in handles {
+        handle.join().unwrap();
+    }
+
+    println!("Result: {}", *counter.lock().unwrap());
+}
+

示例 16-13: 程序启动了 10 个线程,每个线程都通过 Mutex<T> 来增加计数器的值

+

这里创建了一个 counter 变量来存放内含 i32Mutex<T>,类似示例 16-12 那样。接下来我们遍历整数区间,创建了 10 个线程。我们使用了 thread::spawn,并为所有线程传入了相同的闭包:它们每一个都将调用 lock 方法来获取 Mutex<T> 上的锁,接着将互斥器中的值加一。当一个线程结束执行,num 会离开闭包作用域并释放锁,这样另一个线程就可以获取它了。

+

在主线程中,我们像示例 16-2 那样收集了所有的 JoinHandle,并调用它们的 join 方法来等待所有线程结束。然后,主线程会获取锁,并打印出程序的结果。

+

之前提示过,这个例子不能编译,让我们看看为什么!

+
$ cargo run
+   Compiling shared-state v0.1.0 (file:///projects/shared-state)
+error[E0382]: borrow of moved value: `counter`
+  --> src/main.rs:21:29
+   |
+5  |     let counter = Mutex::new(0);
+   |         ------- move occurs because `counter` has type `Mutex<i32>`, which does not implement the `Copy` trait
+...
+8  |     for _ in 0..10 {
+   |     -------------- inside of this loop
+9  |         let handle = thread::spawn(move || {
+   |                                    ------- value moved into closure here, in previous iteration of loop
+...
+21 |     println!("Result: {}", *counter.lock().unwrap());
+   |                             ^^^^^^^ value borrowed here after move
+   |
+help: consider moving the expression out of the loop so it is only moved once
+   |
+8  ~     let mut value = counter.lock();
+9  ~     for _ in 0..10 {
+10 |         let handle = thread::spawn(move || {
+11 ~             let mut num = value.unwrap();
+   |
+
+For more information about this error, try `rustc --explain E0382`.
+error: could not compile `shared-state` (bin "shared-state") due to 1 previous error
+
+

错误信息表明 counter 值在上一次循环中被移动了。所以 Rust 告诉我们,不能将 counter 锁的所有权移动到多个线程中。让我们通过一个第 15 章讨论过的多所有权手段,来修复这个编译错误。

+

多线程和多所有权

+

在第 15 章中,我们用智能指针 Rc<T> 来创建引用计数,使得一个值有了多个所有者。让我们做同样的事,看看会发生什么。将示例 16-14 中的 Mutex<T> 封装进 Rc<T> 中,并在将所有权移入线程之前克隆(clone) Rc<T>

+

文件名:src/main.rs

+
use std::rc::Rc;
+use std::sync::Mutex;
+use std::thread;
+
+fn main() {
+    let counter = Rc::new(Mutex::new(0));
+    let mut handles = vec![];
+
+    for _ in 0..10 {
+        let counter = Rc::clone(&counter);
+        let handle = thread::spawn(move || {
+            let mut num = counter.lock().unwrap();
+
+            *num += 1;
+        });
+        handles.push(handle);
+    }
+
+    for handle in handles {
+        handle.join().unwrap();
+    }
+
+    println!("Result: {}", *counter.lock().unwrap());
+}
+

示例 16-14: 尝试使用 Rc<T> 来允许多个线程拥有 Mutex<T>

+

再一次编译并...出现了不同的错误!编译器真是教会了我们很多!

+
$ cargo run
+   Compiling shared-state v0.1.0 (file:///projects/shared-state)
+error[E0277]: `Rc<Mutex<i32>>` cannot be sent between threads safely
+  --> src/main.rs:11:36
+   |
+11 |           let handle = thread::spawn(move || {
+   |                        ------------- ^------
+   |                        |             |
+   |  ______________________|_____________within this `{closure@src/main.rs:11:36: 11:43}`
+   | |                      |
+   | |                      required by a bound introduced by this call
+12 | |             let mut num = counter.lock().unwrap();
+13 | |
+14 | |             *num += 1;
+15 | |         });
+   | |_________^ `Rc<Mutex<i32>>` cannot be sent between threads safely
+   |
+   = help: within `{closure@src/main.rs:11:36: 11:43}`, the trait `Send` is not implemented for `Rc<Mutex<i32>>`, which is required by `{closure@src/main.rs:11:36: 11:43}: Send`
+note: required because it's used within this closure
+  --> src/main.rs:11:36
+   |
+11 |         let handle = thread::spawn(move || {
+   |                                    ^^^^^^^
+note: required by a bound in `spawn`
+  --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/thread/mod.rs:688:1
+
+For more information about this error, try `rustc --explain E0277`.
+error: could not compile `shared-state` (bin "shared-state") due to 1 previous error
+
+

哇哦,错误信息太长不看!划重点:第一行错误表明 Rc<Mutex<i32>> 不能在线程间安全传递(`Rc<Mutex<i32>>` cannot be sent between threads safely);编译器也指出了原因:Rc<Mutex<i32>> 没有实现 Send trait(the trait `Send` is not implemented for `Rc<Mutex<i32>>`)。下一节我们会讲到 Send:这是一个确保所使用的类型可以用于并发环境的 trait。

+

不幸的是,Rc<T> 并不能安全的在线程间共享。当 Rc<T> 管理引用计数时,它必须在每一个 clone 调用时增加计数,并在每一个克隆体被丢弃时减少计数。Rc<T> 并没有使用任何并发原语,无法确保改变计数的操作不会被其他线程打断。这可能使计数出错,并导致诡异的 bug,比如可能会造成内存泄漏,或在使用结束之前就丢弃一个值。我们所需要的是一个与 Rc<T> 完全一致,又以线程安全的方式改变引用计数的类型。

+

原子引用计数 Arc<T>

+

所幸 Arc<T> 正是这么一个类似 Rc<T> 并可以安全的用于并发环境的类型。字母 “a” 代表 原子性atomic),所以这是一个 原子引用计数atomically reference counted)类型。原子类型 (Atomics) 是另一类这里还未涉及到的并发原语:请查看标准库中 std::sync::atomic 的文档来获取更多细节。目前我们只需要知道:原子类型就像基本类型一样,可以安全的在线程间共享。

+

你可能会好奇,为什么不是所有的基本类型都是原子性的?为什么标准库中的类型没有全部默认使用 Arc<T> 实现?原因在于,线程安全会造成性能损失,我们希望只在必要时才为此买单。如果只是在单线程中对值进行操作,原子性提供的保证并无必要,而不加入原子性可以使代码运行得更快。

+

回到之前的例子:Arc<T>Rc<T> 有着相同的 API,所以我们只需修改程序中的 use 行、new 调用和 clone 调用。示例 16-15 中的代码最终可以编译和运行:

+

文件名:src/main.rs

+
use std::sync::{Arc, Mutex};
+use std::thread;
+
+fn main() {
+    let counter = Arc::new(Mutex::new(0));
+    let mut handles = vec![];
+
+    for _ in 0..10 {
+        let counter = Arc::clone(&counter);
+        let handle = thread::spawn(move || {
+            let mut num = counter.lock().unwrap();
+
+            *num += 1;
+        });
+        handles.push(handle);
+    }
+
+    for handle in handles {
+        handle.join().unwrap();
+    }
+
+    println!("Result: {}", *counter.lock().unwrap());
+}
+

示例 16-15: 使用 Arc<T> 包装一个 Mutex<T> 能够实现在多线程之间共享所有权

+

这会打印出:

+
Result: 10
+
+

成功了!我们从 0 数到了 10,这好像没啥大不了的,不过一路上我们确实学习了很多关于 Mutex<T> 和线程安全的内容!这个例子中构建的结构可以用于比增加计数更为复杂的操作。使用这个策略,我们可将计算任务分成独立的部分,并分散到多个线程中,接着使用 Mutex<T> 使用各自的运算结果来更新最终的结果。

+

注意,对于简单的数值运算,标准库中 std::sync::atomic 模块 提供了比 Mutex<T> 更简单的类型。针对基本类型,这些类型提供了安全、并发、原子的操作。在上面的例子中,为了专注于讲明白 Mutex<T> 的用法,我们才选择在基本类型上使用 Mutex<T>。(译注:对于上面例子中出现的 i32 加法操作,更好的做法是使用 AtomicI32 类型来完成。具体参考文档。)

+

RefCell<T>/Rc<T>Mutex<T>/Arc<T> 的相似性

+

你可能注意到了,尽管 counter 是不可变的,我们仍然可以获取其内部值的可变引用;这意味着 Mutex<T> 提供了内部可变性,就像 Cell 系列类型那样。使用 RefCell<T> 可以改变 Rc<T> 中内容(在 15 章中讲到过),同样地,使用 Mutex<T> 我们也可以改变 Arc<T> 中的内容。

+

另一个值得注意的细节是,Rust 不能完全避免使用 Mutex<T> 所带来的逻辑错误。回忆一下,第 15 章中讲过,使用 Rc<T> 就有造成引用循环的风险:两个 Rc<T> 值相互引用,造成内存泄漏。同理,Mutex<T> 也有造成 死锁deadlock)的风险:当某个操作需要锁住两个资源,而两个线程分别持有两个资源的其中一个锁时,它们会永远相互等待。如果你对这个话题感兴趣,尝试编写一个带有死锁的 Rust 程序,接着研究别的语言中使用互斥器的死锁规避策略,并尝试在 Rust 中实现它们。标准库中 Mutex<T>MutexGuard 的 API 文档会提供有用的信息。

+

接下来,为了丰富本章的内容,让我们讨论一下 SendSync trait,以及如何对自定义类型使用它们。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch16-04-extensible-concurrency-sync-and-send.html b/ch16-04-extensible-concurrency-sync-and-send.html new file mode 100644 index 000000000..07aa82432 --- /dev/null +++ b/ch16-04-extensible-concurrency-sync-and-send.html @@ -0,0 +1,261 @@ + + + + + + 使用 Sync 与 Send Traits 的可扩展并发 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用 SyncSend trait 的可扩展并发

+
+

ch16-04-extensible-concurrency-sync-and-send.md +
+commit 7c7740a5ddef1458d74f1daf85fd49e03aaa97cf

+
+

Rust 的并发模型中一个有趣的方面是:语言本身对并发知之 甚少。我们之前讨论的几乎所有内容,都属于标准库,而不是语言本身的内容。由于不需要语言提供并发相关的基础设施,并发方案不受标准库或语言所限:我们可以编写自己的或使用别人编写的并发功能。

+

然而有两个并发概念是内嵌于语言中的:std::marker 中的 SyncSend trait。

+

通过 Send 允许在线程间转移所有权

+

Send 标记 trait 表明实现了 Send 的类型值的所有权可以在线程间传送。几乎所有的 Rust 类型都是Send 的,不过有一些例外,包括 Rc<T>:这是不能 Send 的,因为如果克隆了 Rc<T> 的值并尝试将克隆的所有权转移到另一个线程,这两个线程都可能同时更新引用计数。为此,Rc<T> 被实现为用于单线程场景,这时不需要为拥有线程安全的引用计数而付出性能代价。

+

因此,Rust 类型系统和 trait bound 确保永远也不会意外的将不安全的 Rc<T> 在线程间发送。当尝试在示例 16-14 中这么做的时候,会得到错误 the trait Send is not implemented for Rc<Mutex<i32>>。而使用标记为 SendArc<T> 时,就没有问题了。

+

任何完全由 Send 的类型组成的类型也会自动被标记为 Send。几乎所有基本类型都是 Send 的,除了第二十章将会讨论的裸指针(raw pointer)。

+

Sync 允许多线程访问

+

Sync 标记 trait 表明一个实现了 Sync 的类型可以安全的在多个线程中拥有其值的引用。换一种方式来说,对于任意类型 T,如果 &TT 的不可变引用)是 Send 的话 T 就是 Sync 的,这意味着其引用就可以安全的发送到另一个线程。类似于 Send 的情况,基本类型是 Sync 的,完全由 Sync 的类型组成的类型也是 Sync 的。

+

智能指针 Rc<T> 也不是 Sync 的,出于其不是 Send 相同的原因。RefCell<T>(第十五章讨论过)和 Cell<T> 系列类型不是 Sync 的。RefCell<T> 在运行时所进行的借用检查也不是线程安全的。Mutex<T>Sync 的,正如 “在线程间共享 Mutex<T> 部分所讲的它可以被用来在多线程中共享访问。

+

手动实现 SendSync 是不安全的

+

通常并不需要手动实现 SendSync trait,因为由 SendSync 的类型组成的类型,自动就是 SendSync 的。因为它们是标记 trait,甚至都不需要实现任何方法。它们只是用来加强并发相关的不可变性的。

+

手动实现这些标记 trait 涉及到编写不安全的 Rust 代码,第十九章将会讲述具体的方法;当前重要的是,在创建新的由不是 SendSync 的部分构成的并发类型时需要多加小心,以确保维持其安全保证。“The Rustonomicon” 中有更多关于这些保证以及如何维持它们的信息。

+

总结

+

这不会是本书最后一个出现并发的章节:第二十一章的项目会在更现实的场景中使用这些概念,而不像本章中讨论的这些小例子。

+

正如之前提到的,因为 Rust 本身很少有处理并发的部分内容,有很多的并发方案都由 crate 实现。它们比标准库要发展的更快;请在网上搜索当前最新的用于多线程场景的 crate。

+

Rust 提供了用于消息传递的信道,和像 Mutex<T>Arc<T> 这样可以安全的用于并发上下文的智能指针。类型系统和借用检查器会确保这些场景中的代码,不会出现数据竞争和无效的引用。一旦代码可以编译了,我们就可以坚信这些代码可以正确的运行于多线程环境,而不会出现其他语言中经常出现的那些难以追踪的 bug。并发编程不再是什么可怕的概念:无所畏惧地并发吧!

+

接下来,让我们讨论一下当 Rust 程序变得更大时,有哪些符合语言习惯的问题建模方法和结构化解决方案,以及 Rust 的风格是如何与面向对象编程(Object Oriented Programming)中那些你所熟悉的概念相联系的。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch17-00-async-await.html b/ch17-00-async-await.html new file mode 100644 index 000000000..f25288683 --- /dev/null +++ b/ch17-00-async-await.html @@ -0,0 +1,287 @@ + + + + + + Async 和 await - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Async 和 await

+
+

ch17-00-async-await.md +
+commit 3111eda07a4a4692bf69e3aaad999d840ac9c138

+
+

很多我们要求计算机处理的操作都需要一定的时间才能完成。例如,如果你使用视频编辑器来创建一个家庭聚会的视频,导出视频可能会花费几分钟到几小时不等。同样,从家庭成员那里下载共享的视频也可能需要很长时间。如果我们能在等待这些长时间运行的操作完成期间做点其他事情,那就太好了。

+

视频导出会尽可能使用所有的 CPU 和 GPU。如果你只有一个 CPU 核,同时操作系统在导出完成前也不会暂停,那么在其运行期间你无法使用计算机进行任何其他操作。这会是一个非常糟糕的体验。相反计算机的操作系统可以(也确实可以)隐式地中断导出过程,频率足够高,使你能够在导出进行的同时完成其他任务。

+

下载文件则有所不同。它不占用大量的 CPU 时间。相反 CPU 需要等待来自于网络的数据。虽然可以在部分数据就绪时就开始读取,但等待剩余数据可能还需要一段时间。即便数据全部就绪了,视频文件也可能非常大,因此加载所有数据也会花费一些时间。虽然这可能只需要一两秒,不过这对于一个现代处理器来说已经是非常长的时间了,因为它每秒可以执行数十亿次操作。因此,如果能让 CPU 在等待网络调用完成的同时去处理别的工作就再好不过了。所以同上操作系统会隐式地中断你的程序以便其它工作可以在网络操作进行的同时继续进行。

+
+

注意:视频导出这类操作通常被称为 “CPU 密集型”(“CPU-bound”)或者 “计算密集型”(“compute-bound”)操作。其受限于计算机 CPUGPU 处理数据的速度,以及它所能利用的计算能力。而下载视频这类操作通常被称为 “IO 密集型”(“IO-bound”)操作,因为其受限于计算机的 输入输出 速度。下载的速度最多只能与通过网络传输数据的速度一致。

+
+

在上述两个例子中,操作系统的隐式中断提供了一种形式的并发。不过这种并发仅限于整个程序的级别:操作系统中断一个程序并让其它程序得以执行。在很多场景中,由于我们能比操作系统在更细粒度上理解我们的程序,因此我们可以观察到很多操作系统无法察觉的并发机会。

+

例如,如果我们在构建一个管理文件下载的工具,我们应当以一种不会因开始一个下载任务而锁定 UI 的方式来编写程序,并且用户应该能够同时开始多个下载任务。不过很多操作系统与网络交互的 API 都是 阻塞 的(blocking)。也就是说这些 API 会阻塞程序的进程,直到它们处理的数据完全就绪。

+
+

注意:如果你仔细思索一下,会发现这是 大部分 函数调用的工作方式!不过我们通常将 “阻塞” 这个术语保留给那些与文件、网络或其它计算机资源交互的函数调用,因为这些地方是单个程序可以从 阻塞操作中获益的地方。

+
+

我们可以新建专用的线程来下载每个文件以免阻塞主线程。然而,我们最终会发现这些线程的开销会成为一个问题。如果这些调用在一开始就是非阻塞的话那就更理想了。最后,如果我们能够像在阻塞代码中一样,以直接的风格编写非阻塞代码,那就更好了。比如这样:

+
let data = fetch_data_from(url).await;
+println!("{data}");
+

这正是 Rust 的 async 抽象所提供的。不过在讲解它们在实践中如何工作之前,让我们稍微绕个远路来了解一下并行(parallelism)和并发(concurrency)的区别。

+

并行与并发

+

在上一章中,我们大致将并行和并发视为可以互换的概念。但现在我们需要更加精确地区分它们,因为它们的区别将在实际工作中显现出来。

+

思考一下不同的团队分割方法来开发一个软件项目。我们可以分配给一个个人多个任务,也可以每个团队成员各自负责一个任务,或者可以采用这两种方法的组合。

+

当一个个人在任何一个任务完成前同时处理多个任务,这就是 并发。你可能在计算机上同时运行两个项目,当你对其中一个项目感到厌倦或遇到困难时,可以切换到另一个项目。因为你是单独一个人,所以无法真正同时推进两个任务,但是你可以多任务处理,在不同任务之间切换以取得进展。

+
+并发工作流 +
图 17-1:一个并发工作流,在任务 A 和任务 B 之间切换
+
+

当你同意将一组任务在组员中分配,每一个组员分配一个任务并单独处理它,这就是 并行。每个组员可以真正同时进行工作。

+
+并发工作流 +
图 17-2:一个并行流,其中任务 A 和任务 B 的工作同时独立进行
+
+

在这两种场景中,你可能需要协调不同的任务。也许你 认为 某个人负责的任务与其他人的工作完全不相关,但实际上它确实依赖于团队中另一位成员的工作完成。一些工作可以并行进行,不过一些工作事实上是 串行 的:它们只能串行地发生,一个接着一个,如图 17-3 所示。

+
+并发工作流 +
图 17-3:一个部分并行的工作流,其中任务 A 和任务 B 的工作相互独立,直到任务 A3 阻塞在等待任务 B3 的结果
+
+

同理,你可能会意识到你自己的一个任务依赖另一个任务。现在并发任务也变成串行的了。

+

并行与并发也可能相互交叉(阻塞)。如果你得知某个同事卡在等待你的一个任务完成,你可能会集中所有精力在这个任务上来 “解锁” 你的同事。你和你的同事则不再能并行地工作了,同时你也不能够并发地处理自己的任务。

+

同样的基础动态也作用于软件与硬件。在一个单核的机器上,CPU 一次只能执行一个操作,不过它仍然可以并发工作。借助像线程、进程和异步(async)等工具,计算机可以暂停一个活动,并在最终切换回第一个活动之前切换到其它活动。在一个有多个 CPU 核心的机器上,它也可以并行工作。一个核心可以做一件工作的同时另一个核心可以做一些完全不相关的工作,而且这些工作实际上是同时发生的。

+

当使用 Rust 中的 async 时,我们总是在处理并发。取决于硬件、操作系统和所使用的异步运行时(async runtime)-- 稍后会介绍更多的异步运行时!并发也可能在底层使用了并行。

+

现在让我们深入理解 Rust 的异步编程实际上是如何工作的!在接下来的章节中,我们将:

+
    +
  • 学习如何使用 Rust 的 asyncawait 语法
  • +
  • 探索如何使用异步模型来解决第十六章中遇到的一些挑战
  • +
  • 了解多线程和异步如何互补,在很多场景中你甚至可以同时使用两者
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch17-01-futures-and-syntax.html b/ch17-01-futures-and-syntax.html new file mode 100644 index 000000000..aeadb9602 --- /dev/null +++ b/ch17-01-futures-and-syntax.html @@ -0,0 +1,478 @@ + + + + + + Futures 和 async 语法 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Futures 和 async 语法

+
+

ch17-01-futures-and-syntax.md +
+commit e95efa05706c5c4309df9ed47d5e91d8ed342b7d

+
+

Rust 异步编程的关键元素是 futures 和 Rust 的 asyncawait 关键字。

+

future 是一个现在可能还没有准备好但将在未来某个时刻准备好的值。(相同的概念也出现在很多语言中,有时被称为 “task” 或者 “promise”。)Rust 提供了 Future trait 作为基础组件,这样不同的异步操作就可以在不同的数据结构上实现。在 Rust 中,我们称实现了 Future trait 的类型为 futures。每一个实现了 Future 的类型会维护自己的进度状态信息和 “ready” 的定义。

+

async 关键字可以用于代码块和函数,表明它们可以被中断并恢复。在一个 async 块或 async 函数中,可以使用 await 关键字来等待一个 future 准备就绪,这一过程称为 等待一个 future。async 块或 async 函数中每一个等待 future 的地方都可能是一个 async 块或 async 函数中断并随后恢复的点。检查一个 future 并查看其值是否已经准备就绪的过程被称为 轮询(polling)。

+

其它一些语言也使用 asyncawait 关键字进行异步编程。如果你熟悉这些语言,则可能会注意到它们与 Rust 的处理方式有显著不同,包括语法上的差异。我们将看到,这样做是有充分理由的!

+

在大多数情况下,编写异步 Rust 代码时,我们使用 asyncawait 关键字。Rust 将其编译为等同于使用 Future trait 的代码,这非常类似于将 for 循环编译为等同于使用 Iterator trait 的代码。不过,由于 Rust 提供了 Future trait,你也可以在需要时为你自己的数据类型实现它。在整个章节中你会看到很多函数的返回值类型都有其自己的 Future 实现。我们会在本章结尾回到这个 trait 的定义,并深入了解它的工作原理,但现在这些细节已经足够让我们继续前进了。

+

这些内容可能有点抽象。让我们来编写第一个异步程序:一个小型网络爬虫。我们会从命令行传递两个 URL,并发地解析它们,并返回第一个完成解析的结果。这个示例会引入不少的新语法,不过不用担心。我们会逐步解释所有你需要了解的内容。

+

第一个异步程序

+

为了保持本章的内容专注于学习 async,而不是处理生态系统的部分组件,我们已经创建了一个 trpl crate(trpl 是 “The Rust Programming Language” 的缩写)。它重导出了你需要的所有类型、traits 和函数,它们主要来自于 futurestokio crates。

+
    +
  • futures crate 是一个 Rust 异步代码实验的官方仓库,也正是 Future 最初设计的地方。
  • +
  • Tokio 是目前 Rust 中应用最广泛的异步运行时(async runtime),特别是(但不仅是!)web 应用。这里还有其他优秀的运行时,它们可能更适合你的需求。我们在 trpl 的底层使用 Tokio 是因为它经过了充分测试且广泛使用。
  • +
+

在一些场景中,trpl 也会重命名或者封装原始 API 以便我们专注于与本章相关的细节。如果你想了解该 crate 的具体功能,我们鼓励你查看其源码。你可以看到每个重导出的内容来自哪个 crate,我们留下了大量注释来解释这个 crate 的用途。

+

创建一个名为 hello-async 的二进制项目并将 trpl crate 作为一个依赖添加:

+
$ cargo new hello-async
+$ cd hello-async
+$ cargo add trpl
+
+

现在我们可以利用 trpl 提供的多种组件来编写第一个异步程序。我们构建了一个小的命令行工具来抓取两个网页,拉取各自的 <title> 元素,并打印出第一个完成全部过程的标题。

+

让我们开始编写一个函数,它获取一个网页 URL 作为参数,请求该 URL 并返回标题元素的文本:

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+fn main() {
+    // TODO: we'll add this next!
+}
+
+use trpl::Html;
+
+async fn page_title(url: &str) -> Option<String> {
+    let response = trpl::get(url).await;
+    let response_text = response.text().await;
+    Html::parse(&response_text)
+        .select_first("title")
+        .map(|title_element| title_element.inner_html())
+}
+
示例 17-1:定义一个 async 函数来获取一个 HTML 页面的标题元素
+
+

在示例 17-1 中,我们定义了一个名为 page_title 的函数,并使用了 async 关键字标记。接着我们使用 trpl::get 函数来获取传入的任意 URL,然后使用 await 关键字来等待响应。接着我们调用其 text 方法来获取响应的文本,这里再一次使用 await 关键字等待。这两个步骤都是异步的。对于 get 来说,我们需要等待服务器发送回其响应的第一部分,这会包含 HTTP 头(headers)、cookies 等。这部分响应可以独立于响应体发送。特别是在响应体非常大时候,接收完整响应可能会花费一些时间。因此我们不得不等待响应 整体 返回,所以 text 方法也是异步。

+

我们必须显示地等待这两个 futures,因为 Rust 中的 futures 是 惰性lazy)的:在你使用 await 请求之前它们不会执行任何操作。(事实上,如果你不使用一个 futures,Rust 会显示一个编译警告)这应该会让你想起之前第十三章关于迭代器的讨论。直到你调用迭代器的 next 方法(直接调用或者使用 for 循环或者类似 map 这类在底层使用 next 的方法)之前它们什么也不会做。对于 futures 来说,同样的基本理念也是适用的:除非你显式地请求,否则它们不会执行。惰性使得 Rust 可以避免提前运行异步代码,直到真正需要时才执行。

+
+

注意:这不同于上一章节中 thread::spawn 的行为,当时传递给另一个线程的闭包会立即开始运行。这也与许多其他语言处理异步的方式不同!但对于 Rust 而言,这一点非常重要。稍后我们会解释原因。

+
+

当我们有了 response_text 函数,就可以使用 Html::parse 将其解析为一个 Html 类型的实例。不同于原始字符串,现在我们有了一个可以将 HTML 作为更丰富数据结构来操作的数据类型。特别是我们可以使用 select_first 方法来找出给定 CSS 选择器(selector)中第一个匹配元素。通过传递字符串 "title",我们会得到文档中的第一个 <title> 元素,如果它存在的话。由于可能没有任何匹配的元素,select_first 返回一个 Option<ElementRef>。最后我们使用 Option::map 方法,它允许我们在 Option 中有元素时对其进行处理,而在没有时则什么也不做。(这里也可以使用一个 match 表达式,但 map 更符合惯用的写法。)在传递给 map 的函数体中,我们调用了 title_element 上的 inner_html 来获取其内容,这是一个 String。当上面所讲的都完成后,我们会得到一个 Option<String>

+

注意 Rust 的 await 关键字出现在需要等待的表达式之后而不是之前。也就是说,这是一个 后缀关键字postfix keyword)。如果你在其它语言中使用过 async 的话,这可能与你所熟悉的有所不同。Rust 如此选择是因为这使得方法的链式调用更加简洁。因此,我们可以修改 page_url_for 的函数体来链式调用 trpl::gettext 并在其之间使用 await,如示例 17-2 所示:

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use trpl::Html;
+
+fn main() {
+    // TODO: we'll add this next!
+}
+
+async fn page_title(url: &str) -> Option<String> {
+    let response_text = trpl::get(url).await.text().await;
+    Html::parse(&response_text)
+        .select_first("title")
+        .map(|title_element| title_element.inner_html())
+}
+
示例 17-2:使用 `await` 关键字的链式调用
+
+

这样我们就成功编写了第一个异步函数!在我们向 main 加入一些代码调用它之前,让我们再多了解下我们写了什么以及它的意义。

+

当 Rust 遇到一个 async 关键字标记的代码块时,会将其编译为一个实现了 Future trait 的唯一的、匿名的数据类型。当 Rust 遇到一个被标记为 async 的函数时,会将其编译进一个拥有异步代码块的非异步函数。异步函数的返回值类型是编译器为异步代码块所创建的匿名数据类型。

+

因此,编写 async fn 就等同于编写一个返回类型的 future 的函数。当编译器遇到类似示例 17-1 中 async fn page_title 的函数定义时,它等价于以下定义的非异步函数:

+
#![allow(unused)]
+fn main() {
+extern crate trpl; // required for mdbook test
+use std::future::Future;
+use trpl::Html;
+
+fn page_title(url: &str) -> impl Future<Output = Option<String>> + '_ {
+    async move {
+        let text = trpl::get(url).await.text().await;
+        Html::parse(&text)
+            .select_first("title")
+            .map(|title| title.inner_html())
+    }
+}
+}
+

让我们挨个看一下转换后版本的每一个部分:

+
    +
  • 它使用了之前第十章 “trait 作为参数” 部分讨论过的 impl Trait 语法
  • +
  • 它返回的 trait 是一个 Future,它有一个关联类型 Output。注意 Output 的类型是 Option<String>,这与 async fn 版本的 page_title 的原始返回值类型相同。
  • +
  • 所有原始函数中被调用的代码被封装进一个 async move 块。回忆一下,代码块是表达式。这整个块就是函数所返回的表达式
  • +
  • 如上所述,这个异步代码块产生一个 Option<String> 类型的值。这个值与返回类型中的 Output 类型一致。这正类似于你已经见过的其它代码块。
  • +
  • 新版函数的函数体是一个 async move 代码块,因为它如何使用 url 参数决定了这一点。(本章后续部分将更详细地讨论 asyncasync move 之间的区别。)
  • +
  • 新版本的函数在返回类型中使用了一种我们之前未见过的生命周期标记:'_。因为函数返回的 Future 指向一个引用(在这个例子中是指向 url 参数的引用)我们需要告诉 Rust 引用的生命周期。这里无需命名该生命周期,因为 Rust 足够智能到能理解这里只涉及到唯一一个引用,不过我们 必须 明确指出返回的 Future 受该生命周期的约束。
  • +
+

现在我们可以在 main 中调用 page_title。首先,我们只会获取一个页面的标题。在示例 17-3 中,我们沿用了第十二章中获取命令行参数的相同模式。接着我们传递第一个 URL 给 page_title,并等待结果。因为 future 产生的值是一个 Option<String>,我们使用 match 表达式来根据页面是否有 <title> 来打印不同的信息。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use trpl::Html;
+
+async fn main() {
+    let args: Vec<String> = std::env::args().collect();
+    let url = &args[1];
+    match page_title(url).await {
+        Some(title) => println!("The title for {url} was {title}"),
+        None => println!("{url} had no title"),
+    }
+}
+
+async fn page_title(url: &str) -> Option<String> {
+    let response_text = trpl::get(url).await.text().await;
+    Html::parse(&response_text)
+        .select_first("title")
+        .map(|title_element| title_element.inner_html())
+}
+
示例 17-3:在 `main` 中通过一个用户提供的参数调用 `page_title` 函数
+
+

很不幸的是这还不能编译。唯一可以使用 await 关键字的地方是异步函数或者代码块中,同时 Rust 不允许将特殊的 main 函数标记为 async

+ +
error[E0752]: `main` function is not allowed to be `async`
+ --> src/main.rs:6:1
+  |
+6 | async fn main() {
+  | ^^^^^^^^^^^^^^^ `main` function is not allowed to be `async`
+
+

main 不能标记为 async 的原因是异步代码需要一个 运行时:即一个管理执行异步代码细节的 Rust crate。一个程序的 main 函数可以 初始化 一个运行时,但是其 自身 并不是一个运行时。(稍后我们会进一步解释原因。)每一个执行异步代码的 Rust 程序必须至少有一个设置运行时并执行 futures 的地方。

+

大部分支持异步的语言会打包一个运行时在语言中。Rust 则不是,相这里有很多不同的异步运行时,每一个都有适合其目标的权衡取舍。例如,一个拥有很多核心和大量内存的高吞吐 web server 与一个单核、少量内存并且没有堆分配能力的微控制器相比有着截然不同的需求。提供这些运行时的 crate 通常也提供了例如文件或者网络 IO 这类常用功能的异步版本。

+

从这里到本章余下部分,我们会使用 trpl crate 的 run 函数,它获取一个 future 作为参数并运行到结束。在内部,调用 run 会设置一个运行时来运行传递的 future。一旦 future 完成,run 返回 future 返回的任何值。

+

我们可以将 page_title 返回的 future 直接传递给 run。一旦其完成,我们能够匹配返回的 Option<String>,正如示例 17-3 我们尝试的那样。然而,在本章的大部分示例中(以及大多数实际应用中的异步代码中!),我们会执行不止一次异步函数调用,所以相反我们会传递一个 async 块并显式地等待 page_title 调用的结果,如示例 17-4 所示。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use trpl::Html;
+
+fn main() {
+    let args: Vec<String> = std::env::args().collect();
+
+    trpl::run(async {
+        let url = &args[1];
+        match page_title(url).await {
+            Some(title) => println!("The title for {url} was {title}"),
+            None => println!("{url} had no title"),
+        }
+    })
+}
+
+async fn page_title(url: &str) -> Option<String> {
+    let response_text = trpl::get(url).await.text().await;
+    Html::parse(&response_text)
+        .select_first("title")
+        .map(|title_element| title_element.inner_html())
+}
+
示例 17-4:等待一个使用异步代码块的 `trpl::run`
+
+

当我们运行代码,我们会得到最初预想的行为:

+
$ cargo run "http://www.rust-lang.org"
+The title for http://www.rust-lang.org was
+            Rust Programming Language
+
+

我们终于有了一些可以正常工作的异步代码!现在它们可以成功编译并运行。在我们添加代码让两个网址进行竞争之前,让我们简要地回顾一下 future 是如何工作的。

+

每一个 await point,也就是代码使用 await 关键字的地方,代表将控制权交还给运行时的地方。为此 Rust 需要记录异步代码块中涉及的状态,这样运行时可以去执行其他工作,并在准备好时回来继续推进当前的任务。这就像你通过编写一个枚举来保存每一个 await point 的状态一样:

+
#![allow(unused)]
+fn main() {
+extern crate trpl; // required for mdbook test
+
+enum PageTitleFuture<'a> {
+    Initial { url: &'a str },
+    GetAwaitPoint { url: &'a str },
+    TextAwaitPoint { response: trpl::Response },
+}
+}
+

编写代码来手动控制不同状态之间的转换是非常乏味且容易出错的,特别是之后增加了更多功能和状态的时候。相反,Rust 编译器自动创建并管理异步代码的状态机数据结构。如果你感兴趣的话:是的,正常的借用和所有权也全部适用于这些数据结构。幸运的是,编译器也会为我们处理这些检查,并提供友好的错误信息。本章稍后会讲解一些相关内容!

+

最终需要某个组件来执行状态机。这就是运行时。(这也是为什么在了解运行时的时候,你可能会看到 executors 这个词:executor 是运行时中负责执行异步代码的部分。)

+

现在我们能够理解了之前示例 17-3 中为何编译器阻止我们将 main 本身标记为异步函数了。如果 main 是一个异步函数,需要有其它组件来管理 main futrue 返回的状态机,但是 main 是程序的入口点!为此我们在 main 函数中调用 trpl::run,它设置了一个运行时并运行 async 块返回的 future 并等待它返回 Ready

+
+

注意:一些运行时提供了相关的宏所以你 可以 编写一个异步 main 函数。这些宏将 async fn main() { ... } 重写为正常的 fn main,执行的逻辑与我们在示例 17-5 中手动实现的一样:像 trpl::run 一样调用一个函数运行 future 直到结束。

+
+

让我们将这些代码片段整理一下来看看如何编写并发代码,这里通过两个来自命令行的不同 URL 来调用 page_title 并使其相互竞争。

+
+

文件名:src/main.rs

+ +
extern crate trpl; // required for mdbook test
+
+use trpl::{Either, Html};
+
+fn main() {
+    let args: Vec<String> = std::env::args().collect();
+
+    trpl::run(async {
+        let title_fut_1 = page_title(&args[1]);
+        let title_fut_2 = page_title(&args[2]);
+
+        let (url, maybe_title) =
+            match trpl::race(title_fut_1, title_fut_2).await {
+                Either::Left(left) => left,
+                Either::Right(right) => right,
+            };
+
+        println!("{url} returned first");
+        match maybe_title {
+            Some(title) => println!("Its page title is: '{title}'"),
+            None => println!("Its title could not be parsed."),
+        }
+    })
+}
+
+async fn page_title(url: &str) -> (&str, Option<String>) {
+    let text = trpl::get(url).await.text().await;
+    let title = Html::parse(&text)
+        .select_first("title")
+        .map(|title| title.inner_html());
+    (url, title)
+}
+
示例 17-5
+
+

示例 17-5 中以分别由用户提供的 URL 调用 page_title 开始。我们将调用 page_title 产生的 future 分别保存为 title_fut_1title_fut_2。请记住,它们还没有进行任何工作,因为 future 是惰性的,并且我们还没有 await 它们。接着我们将 futures 传递给 trpl::race,它返回一个值表明哪个传递的 future 最先返回。

+
+

注意:在内部 race 构建在一个更通用的函数 select 之上,你会在真实的 Rust 代码中更常遇到它。select 函数可以做很多 trpl::race 函数做不了的事,不过它也有一些额外的复杂性,所以目前我们先略过介绍。

+
+

由于任何一个 future 都可以合理地 “获胜”,所以返回 Result 没有意义。相反 race 返回了一个我们之前没有见过的类型 trpl::EitherEither 类型有点类似于 Result,它也有两个成员。但是不同于 EitherEither 没有内置成功或者失败的概念。相反它使用 LeftRight 来表示 “一个或另一个”。

+
#![allow(unused)]
+fn main() {
+enum Either<A, B> {
+    Left(A),
+    Right(B),
+}
+}
+

race 函数返回 Left,如果第一个参数先完成,并包含该 future 的输出,如果 第二个 future 先完成,则返回 Right 和第二个 future 的输出。这匹配调用函数时参数出现的顺序:第一个参数在第二个参数的左边。

+

我们还更新了 page_title 来返回与传递时相同的 URL。如此如果首先返回的页面没有可以解析的 <title>,仍然可以打印出有意义的信息。有了这些信息,我们对 println! 的输出进行了封装和更新,以表明哪个 URL 最先完成,并在页面有 <title> 时打印出它的内容。

+

现在我们完成一个小型网页爬虫的构建了!挑选一对 URL 并运行命令行工具。你会发现某些网站稳定地快于其它网站,而有些情况哪些网站会 则每次都不同。更重要的是,你已经掌握了处理 futures 的基础知识,因此我们现在可以进一步探索更多异步操作的可能性了。

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch17-02-concurrency-with-async.html b/ch17-02-concurrency-with-async.html new file mode 100644 index 000000000..77c03b926 --- /dev/null +++ b/ch17-02-concurrency-with-async.html @@ -0,0 +1,604 @@ + + + + + + 并发与 async - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

并发与 async

+
+

ch17-02-concurrency-with-async.md +
+commit 62d441060d66f9a1c3d3cdfffa8eed40f817d1aa

+
+

在这一部分,我们将使用异步来应对一些与第十六章中通过线程解决的相同的并发问题。因为之前我们已经讨论了很多关键理念了,这一部分我们会专注于线程与 future 的区别。

+

在很多情况下,使用异步处理并发的 API 与使用线程的非常相似。在其它的一些情况,它们则非常不同。即便线程与异步的的 API 看起来 很类似,通常它们有着不同的行为,同时它们几乎总是有着不同的性能特点。

+

计数

+

第十六章中我们应付的第一个任务是在两个不同的线程中计数。让我们用异步来完成相同的任务。trpl crate 提供了一个 spawn_task 函数,它看起来非常像 thread::spawn API,和一个 sleep 函数,这是 thread::sleep API 的异步版本。我们可以将它们结合使用,实现与线程示例相同的计数功能,如示例 17-6 所示。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::Duration;
+
+fn main() {
+    trpl::run(async {
+        trpl::spawn_task(async {
+            for i in 1..10 {
+                println!("hi number {i} from the first task!");
+                trpl::sleep(Duration::from_millis(500)).await;
+            }
+        });
+
+        for i in 1..5 {
+            println!("hi number {i} from the second task!");
+            trpl::sleep(Duration::from_millis(500)).await;
+        }
+    });
+}
+
示例 17-6:使用 `spawn_task` 启动两个计数任务
+
+

作为开始,我们在 main 函数中使用 trpl::run,这样我们的顶层函数可以是异步的。

+
+

注意:本章从现在开始,每一个示例的 main 中都会包含几乎相同的 trpl::run 封装代码,所以我们经常会连同 main 一同省略。别忘了在你的代码中加入它们!

+
+

接着我们在代码块中编写了两个循环,每个其中都有一个 trpl::sleep 调用,每一个都在发送下一个信息之前等待半秒(500 毫秒)。我们将一个循环放到 trpl::spawn_task 中并将另一个放在顶层的 for 循环中。我们也在 sleep 调用之后加入了一个 await

+

这个实现与基于线程的版本类似,包括在运行时,你可能会在终端中看到消息以不同顺序出现的情况。

+ +
hi number 1 from the second task!
+hi number 1 from the first task!
+hi number 2 from the first task!
+hi number 2 from the second task!
+hi number 3 from the first task!
+hi number 3 from the second task!
+hi number 4 from the first task!
+hi number 4 from the second task!
+hi number 5 from the first task!
+
+

这个版本在 main 中的异步代码块中 for 循环结束后就停止了,因为当 main 函数结束时 spawn_task 产生的任务就会关闭。如果运行该任务直到结束,你需要使用一个 join 句柄(join handle)来等待第一个任务完成。对于线程来说,可以使用 join 方法来 “阻塞” 直到线程结束运行。在示例 17-7 中,我们可以使用 await 来实现相同的效果,因为任务句柄本身是一个 future。它的 Output 类型是一个 Result,所以我们还需要 unwrap 来 await 它。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::Duration;
+
+fn main() {
+    trpl::run(async {
+        let handle = trpl::spawn_task(async {
+            for i in 1..10 {
+                println!("hi number {i} from the first task!");
+                trpl::sleep(Duration::from_millis(500)).await;
+            }
+        });
+
+        for i in 1..5 {
+            println!("hi number {i} from the second task!");
+            trpl::sleep(Duration::from_millis(500)).await;
+        }
+
+        handle.await.unwrap();
+    });
+}
+
示例 17-7:在一个 join 句柄上使用 `await` 使得任务运行直到结束
+
+

更新后的版本会运行 两个 循环直到结束。

+ +
hi number 1 from the second task!
+hi number 1 from the first task!
+hi number 2 from the first task!
+hi number 2 from the second task!
+hi number 3 from the first task!
+hi number 3 from the second task!
+hi number 4 from the first task!
+hi number 4 from the second task!
+hi number 5 from the first task!
+hi number 6 from the first task!
+hi number 7 from the first task!
+hi number 8 from the first task!
+hi number 9 from the first task!
+
+

目前为止,看起来异步和线程版本给出了基本一样的输出,它们只是使用了不同的语法:在 join 句柄上使用 await 而不是调用 join,和 await sleep 调用。

+

最大的区别在于无需再产生另一个操作系统线程来进行工作。事实上,我们甚至不需要产生一个任务。因为异步代码块会编译为匿名 future,我们可以将每一个循环放进一个异步代码块并使用 trpl::join 方法来让运行时将它们两个都运行至完成。

+

在第十六章中,我们展示了如何在 std::thread::spawn 调用返回的 JoinHandle 类型上调用 join 方法。trpl::join 函数也类似,不过它作用于 future。当你传递两个 future,它会产生单独一个 future 但它的输出是一个元组,当 两者 都完成时其中有每一个传递给它的 future 的输出。因此,在示例 17-8 中,我们使用 trpl::join 来等待 fut1fut2 都结束。我们 没有 await fut1fut2,而是等待 trpl::join 新产生的 future。我们忽略其输出,因为它只是一个包含两个单元值(unit value)的元组。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::Duration;
+
+fn main() {
+    trpl::run(async {
+        let fut1 = async {
+            for i in 1..10 {
+                println!("hi number {i} from the first task!");
+                trpl::sleep(Duration::from_millis(500)).await;
+            }
+        };
+
+        let fut2 = async {
+            for i in 1..5 {
+                println!("hi number {i} from the second task!");
+                trpl::sleep(Duration::from_millis(500)).await;
+            }
+        };
+
+        trpl::join(fut1, fut2).await;
+    });
+}
+
示例 17-8:使用 `trpl::join` 来 await 两个匿名 future
+
+

当运行代码我们会看到两个 future 会运行至结束:

+ +
hi number 1 from the first task!
+hi number 1 from the second task!
+hi number 2 from the first task!
+hi number 2 from the second task!
+hi number 3 from the first task!
+hi number 3 from the second task!
+hi number 4 from the first task!
+hi number 4 from the second task!
+hi number 5 from the first task!
+hi number 6 from the first task!
+hi number 7 from the first task!
+hi number 8 from the first task!
+hi number 9 from the first task!
+
+

这里,你每次都会看到完全相同的顺序,这与我们在线程中看到的情况非常不同。这是因为 trpl::join 函数是 公平的fair),这意味着它以相同的频率检查每一个 future,使它们交替执行,绝不会让一个任务在另一个任务准备好时抢先执行。对于线程来说,操作系统会决定该检查哪个线程和会让它运行多长时间。对于异步 Rust 来说,运行时决定检查哪一个任务。(在实践中,细节会更为复杂,因为异步运行时可能在底层使用操作系统线程来作为其并发管理的一部分,因此要保证公平性可能会增加运行时的工作量,但这仍然是可行的!)运行时无需为任何操作保证公平性,同时运行时也经常提供不同的 API 来让你选择是否需要公平性。

+

尝试这些不同的 await future 的变体来观察它们的效果:

+
    +
  • 去掉一个或者两个循环外的异步代码块。
  • +
  • 在定义两个异步代码块后立刻 await 它们。
  • +
  • 直将第一个循环封装进异步代码块,并在第二个循环体之后 await 作为结果的 future。
  • +
+

作为额外的挑战,看看你能否在运行代码 之前 想出每个情况下的输出!

+

消息传递

+

在 future 之间共享数据也与线程类似:我们会再次使用消息传递,不过这次使用的是异步版本的类型和函数。我们会采用与之前第十六章中使用的稍微不同的方法,来展示一些基于线程的并发与基于 future 的并发之间的关键差异。在示例 17-9 中,我们会从仅有一个异步代码块开始,不像 之前产生独立线程那样产生一个独立的任务。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+fn main() {
+    trpl::run(async {
+        let (tx, mut rx) = trpl::channel();
+
+        let val = String::from("hi");
+        tx.send(val).unwrap();
+
+        let received = rx.recv().await.unwrap();
+        println!("Got: {received}");
+    });
+}
+
示例 17-9:创建一个异步信道(async channel)并赋值其两端为 `tx` 和 `rx`
+
+

这里我们使用了 trpl::channel,一个第十六章用于线程的多生产者、单消费者信道 API 的异步版本。异步版本的 API 与基于线程的版本只有一点微小的区别:它使用一个可变的而不是不可变的 rx,并且它的 recv 方法产生一个需要 await 的 future 而不是直接返回值。现在我们可以发送端向接收端发送消息了。注意我们无需产生一个独立的线程或者任务;只需等待(await) rx.recv 调用。

+

std::mpsc::channel 中的同步 Receiver::recv 方法阻塞执行直到它接收一个消息。trpl::Receiver::recv 则不会阻塞,因为它是异步的。不同于阻塞,它将控制权交还给运行时,直到接收到一个消息或者信道的发送端关闭。相比之下,我们不用 await send,因为它不会阻塞。也无需阻塞,因为信道的发送端的数量是没有限制的。

+
+

注意:因为所有这些异步代码都运行在一个 trpl::run 调用的异步代码块中,其中的所有代码可以避免阻塞。然而,外面 的代码会阻塞到 run 函数返回。这正是 trpl::run 函数的全部意义:它允许你 选择 在何处阻塞一部分异步代码,也就是在何处进行同步和异步代码的转换。这正是在大部分运行时中 run 实际上被命名为 block_on 的原因。

+
+

请注意这个示例中的两个地方:首先,消息立刻就会到达!其次,虽然我们使用了 future,但是这里还没有并发。示例中的所有事情都是顺序发生的,就像没涉及到 future 时一样。

+

让我们通过发送一系列消息并在之间休眠来解决第一个问题,如示例 17-10 所示:

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::Duration;
+
+fn main() {
+    trpl::run(async {
+        let (tx, mut rx) = trpl::channel();
+
+        let vals = vec![
+            String::from("hi"),
+            String::from("from"),
+            String::from("the"),
+            String::from("future"),
+        ];
+
+        for val in vals {
+            tx.send(val).unwrap();
+            trpl::sleep(Duration::from_millis(500)).await;
+        }
+
+        while let Some(value) = rx.recv().await {
+            println!("received '{value}'");
+        }
+    });
+}
+
示例 17-10:通过异步信道发送和接收多个消息并在每个消息之间通过 `await` 休眠
+
+

除了发送消息之外,我们还需要接收它们。在这个例子中我们可以手动接收,就是调用四次 rx.recv().await,因为我们知道进来了多少条消息。然而,在现实世界中,我们通常会等待 未知 数量的消息。这时我们需要一直等待直到可以确认没有更多消息了为止。

+

在示例 16-10 中,我们使用了 for 循坏来处理从异步信道接收的所有消息。然而,Rust 目前还没有在 异步 序列上编写 for 循环的方法。取而代之的是,我们需要一个我们还没有见过的新循环类型,即 while let 条件循环。while let 循环是我们在第六章中见过的 if let 结构的循环版本。只要其指定的模式持续匹配循环就会一直执行。

+

rx.recv 调用产生一个 Future,我们会 await 它。运行时会暂停 Future 直到它就绪。一旦消息到达,future 会解析为 Some(message),每次消息到达时都会如此。。当信道关闭时,不管是否有 任何 消息到达,future 都会解析为 None 来表明没有更多的值了,我们也就应该停止轮询,也就是停止等待。

+

while let 循环将上述逻辑整合在一起。如果 rx.recv().await 调用的结果是 Some(message),我们会得到消息并可以在循环体中使用它,就像使用 if let 一样。如果结果是 None,则循环停止。每次循环执行完毕,它会再次触发 await point,如此运行时会再次暂停直到另一条消息到达。

+

现在代码可以成功发送和接收所有的消息了。不幸的是,这里还有一些问题。首先,消息并不是按照半秒的间隔到达的。它们在程序启动后两秒(2000 毫秒)后立刻一起到达。其次,程序永远也不会退出!相反它会永远等待新消息。你会需要使用 ctrl-c 来关闭它。

+

让我们开始理解为何消息在全部延迟后立刻一起到达,而不是逐个在延迟后到达。在一个给定的异步代码块,await 关键字在代码中出现的顺序也就是程序执行时其发生的顺序。

+

示例 17-10 中只有一个异步代码块,所以所有的代码线性地执行。这里仍然没有并发。所有 tx.send 调用与 trpl::sleep 调用及其相关的 await point 是依次进行的。只有在此之后 while let 循环才开始执行 recv 调用上的 await point。

+

为了得到我们需要的行为,在接收每条消息之间引入休眠延迟,我们需要将 txrx 操作放置于它们各自的异步代码块中。这样运行时就可以使用 trpl::join 来分别执行它们,就像在计数示例中一样。我们再一次 await trpl::join 调用的结果,而不是它们各自的 future。如果我们顺序地 await 单个 future,则就又回到了一个顺序流,这正是我们 希望做的。

+ +
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::Duration;
+
+fn main() {
+    trpl::run(async {
+        let (tx, mut rx) = trpl::channel();
+
+        let tx_fut = async {
+            let vals = vec![
+                String::from("hi"),
+                String::from("from"),
+                String::from("the"),
+                String::from("future"),
+            ];
+
+            for val in vals {
+                tx.send(val).unwrap();
+                trpl::sleep(Duration::from_millis(500)).await;
+            }
+        };
+
+        let rx_fut = async {
+            while let Some(value) = rx.recv().await {
+                println!("received '{value}'");
+            }
+        };
+
+        trpl::join(tx_fut, rx_fut).await;
+    });
+}
+
示例 17-11:将 `send` 和 `recv` 分隔到其各自的 `async` 代码块中并 await 这些代码块的 future
+
+

采用示例 17-11 中的更新后的代码,消息会以 500 毫秒的间隔打印,而不是在两秒后就全部一起打印。

+

但是程序仍然永远也不会退出,这是由于 while let 循环与 trpl::join 的交互方式所致:

+
    +
  • trpl::join 返回的 future 只会完成一次,即传递的 两个 future 都完成的时候。
  • +
  • tx future 在发送 vals 中最后一条消息之后的休眠结束后立刻完成。
  • +
  • rx future 直到 while let 循环结束之前都不会完成。
  • +
  • 当信道的另一端关闭后 await rx.recv 将只会返回 None
  • +
  • 信道只有在调用 rx.close 或者发送端 tx 被丢弃时才会关闭。
  • +
  • 我们没有在任何地方调用 rx.close,并且 tx 直到传递给 trpl::run 的最外层异步代码块结束前都不会被丢弃。
  • +
  • 代码块不能结束是因为它阻塞在了等待 trpl::join 完成,这就又回到了列表的开头!
  • +
+

我们可以在代码的某处调用 rx.close 来手动关闭 rx,不过这并没有太多意义。在处理了任意数量的消息后停止可以使程序停止,但是可能会丢失消息。我们需要其它的手段来确保 tx 在函数的结尾 之前 被丢弃。

+

目前发送消息的异步代码块只是借用了 tx,因为发送消息并不需要其所有权,但是如果我们可以将 tx 移动(move)进异步代码快,它会在代码块结束后立刻被丢弃。在第十三章中我们学习了如何在闭包上使用 move 关键字,在第十六章中,我们知道了使用线程时经常需要移动数据进闭包。同样的基本原理也适用于异步代码块,因此 move 关键字也能像闭包那样作用于异步代码块。

+

在示例 17-12 中,我们将发送消息的异步代码块从普通的 async 代码块修改为 async move 代码块。当运行 这个 版本的代码时,它会在发送和接收完最后一条消息后优雅地关闭。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::Duration;
+
+fn main() {
+    trpl::run(async {
+        let (tx, mut rx) = trpl::channel();
+
+        let tx_fut = async move {
+            let vals = vec![
+                String::from("hi"),
+                String::from("from"),
+                String::from("the"),
+                String::from("future"),
+            ];
+
+            for val in vals {
+                tx.send(val).unwrap();
+                trpl::sleep(Duration::from_millis(500)).await;
+            }
+        };
+
+        let rx_fut = async {
+            while let Some(value) = rx.recv().await {
+                eprintln!("received '{value}'");
+            }
+        };
+
+        trpl::join(tx_fut, rx_fut).await;
+    });
+}
+
示例 17-12:一个可以工作的在 future 之间接收和发送消息的示例,其在结束后会正确地关闭
+
+

这个异步信道也是一个多生产者信道,所以如果希望从多个 future 发送消息可以调用 tx 上的 clone 方法。在示例 17-13 中,我们克隆了 tx,在第一个异步代码块外面创建 tx1。我们像第一个 tx 一样将 tx1 移动进代码块。接下来,将原始的 tx 移动进一个 新的 异步代码块,其中会用一个稍微更长的延迟发送更多的消息。我们碰巧将新代码块放在接收消息的异步代码块之后,不过也可以放在之前。关键在于 future 被 await 的顺序,而不是它们创建的顺序。

+

两个发送消息的异步代码块需要是 async move 代码块,如此 txtx1 都会在代码块结束后被丢弃。否则我们就会陷入到开始时同样的无限循环。最后,我们从 trpl::join 切换到 trpl::join3 来处理额外的 future。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::Duration;
+
+fn main() {
+    trpl::run(async {
+        let (tx, mut rx) = trpl::channel();
+
+        let tx1 = tx.clone();
+        let tx1_fut = async move {
+            let vals = vec![
+                String::from("hi"),
+                String::from("from"),
+                String::from("the"),
+                String::from("future"),
+            ];
+
+            for val in vals {
+                tx1.send(val).unwrap();
+                trpl::sleep(Duration::from_millis(500)).await;
+            }
+        };
+
+        let rx_fut = async {
+            while let Some(value) = rx.recv().await {
+                println!("received '{value}'");
+            }
+        };
+
+        let tx_fut = async move {
+            let vals = vec![
+                String::from("more"),
+                String::from("messages"),
+                String::from("for"),
+                String::from("you"),
+            ];
+
+            for val in vals {
+                tx.send(val).unwrap();
+                trpl::sleep(Duration::from_millis(1500)).await;
+            }
+        };
+
+        trpl::join3(tx1_fut, tx_fut, rx_fut).await;
+    });
+}
+
示例 17-13:通过多个异步代码块使用多个发送者
+
+

现在我们会看到所有来在两个发送 future 的消息。因为发送 future 采用了稍微不同的发送延迟,消息也会以这些不同的延迟接收。

+ +
received 'hi'
+received 'more'
+received 'from'
+received 'the'
+received 'messages'
+received 'future'
+received 'for'
+received 'you'
+
+

这是一个良好的开始,不过它将我们限制到少数几个 future:join 两个,或者 join3 三个。让我们看下如何处理更多的 future。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch17-03-more-futures.html b/ch17-03-more-futures.html new file mode 100644 index 000000000..a410d6a59 --- /dev/null +++ b/ch17-03-more-futures.html @@ -0,0 +1,1094 @@ + + + + + + 使用任意数量的 futures - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

使用任意数量的 futures

+
+

ch17-03-more-futures.md +
+commit 9e85fcc9938e8f8c935d0ad8b4db7f45caaa2ca4

+
+

当我们在上一部分从使用两个 future 到三个 future 的时候,我们也必须从使用 join 切换到 join3。每次我们想要改变 join 的 future 数量时都不得不调用一个不同的函数是很烦人的。令人高兴的是,我们有一个宏版本的 join 可以传递任意数量的参数。它还会自行处理 await 这些 future。因此,我们可以重写示例 17-13 中的代码来使用 join! 而不是 join3,如示例 17-14 所示:

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::Duration;
+
+fn main() {
+    trpl::run(async {
+        let (tx, mut rx) = trpl::channel();
+
+        let tx1 = tx.clone();
+        let tx1_fut = async move {
+            let vals = vec![
+                String::from("hi"),
+                String::from("from"),
+                String::from("the"),
+                String::from("future"),
+            ];
+
+            for val in vals {
+                tx1.send(val).unwrap();
+                trpl::sleep(Duration::from_secs(1)).await;
+            }
+        };
+
+        let rx_fut = async {
+            while let Some(value) = rx.recv().await {
+                println!("received '{value}'");
+            }
+        };
+
+        let tx_fut = async move {
+            let vals = vec![
+                String::from("more"),
+                String::from("messages"),
+                String::from("for"),
+                String::from("you"),
+            ];
+
+            for val in vals {
+                tx.send(val).unwrap();
+                trpl::sleep(Duration::from_secs(1)).await;
+            }
+        };
+
+        trpl::join!(tx1_fut, tx_fut, rx_fut);
+    });
+}
+
示例 17-14:使用 `join!` 来等待多个 future
+
+

相比于需要在 joinjoin3join4 等等之间切换来说这绝对是一个进步!然而,即便是这个宏形式也只能用于我们提前知道 future 的数量的情况。不过,在现实世界的 Rust 中,将 futures 放进一个集合并接着等待集合中的一些或者全部 future 完成是一个常见的模式。

+

为了检查一些集合中的所有 future,我们需要遍历并 join 全部 的 future。trpl::join_all 函数接受任何实现了 Iterator trait 的类型,我们在之前的第十三章中学习过它们,所以这正是我们需要的。让我们将 futures 放进一个向量,并将 join! 替换为 join_all

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::Duration;
+
+fn main() {
+    trpl::run(async {
+        let (tx, mut rx) = trpl::channel();
+
+        let tx1 = tx.clone();
+        let tx1_fut = async move {
+            let vals = vec![
+                String::from("hi"),
+                String::from("from"),
+                String::from("the"),
+                String::from("future"),
+            ];
+
+            for val in vals {
+                tx1.send(val).unwrap();
+                trpl::sleep(Duration::from_secs(1)).await;
+            }
+        };
+
+        let rx_fut = async {
+            while let Some(value) = rx.recv().await {
+                println!("received '{value}'");
+            }
+        };
+
+        let tx_fut = async move {
+            let vals = vec![
+                String::from("more"),
+                String::from("messages"),
+                String::from("for"),
+                String::from("you"),
+            ];
+
+            for val in vals {
+                tx.send(val).unwrap();
+                trpl::sleep(Duration::from_secs(1)).await;
+            }
+        };
+
+        let futures = vec![tx1_fut, rx_fut, tx_fut];
+
+        trpl::join_all(futures).await;
+    });
+}
+
示例 17-15:将匿名 futures 储存在一个向量中并调用 `join_all`
+
+

不幸的是这还不能编译。相反我们会得到这个错误:

+ +
error[E0308]: mismatched types
+  --> src/main.rs:43:37
+   |
+8  |           let tx1_fut = async move {
+   |  _______________________-
+9  | |             let vals = vec![
+10 | |                 String::from("hi"),
+11 | |                 String::from("from"),
+...  |
+19 | |             }
+20 | |         };
+   | |_________- the expected `async` block
+21 |
+22 |           let rx_fut = async {
+   |  ______________________-
+23 | |             while let Some(value) = rx.recv().await {
+24 | |                 println!("received '{value}'");
+25 | |             }
+26 | |         };
+   | |_________- the found `async` block
+...
+43 |           let futures = vec![tx1_fut, rx_fut, tx_fut];
+   |                                       ^^^^^^ expected `async` block, found a different `async` block
+   |
+   = note: expected `async` block `{async block@src/main.rs:8:23: 20:10}`
+              found `async` block `{async block@src/main.rs:22:22: 26:10}`
+   = note: no two async blocks, even if identical, have the same type
+   = help: consider pinning your async block and and casting it to a trait object
+
+

这可能有点令人惊讶。毕竟没有一个 future 返回了任何值,所以每个代码块都会产生一个 Future<Output = ()>。然而,Future 是一个 trait,而不是一个具体类型。其具体类型是编译器为各个异步代码块生成的(不同的)数据结构。你不能将两个不同的手写的 struct 放进同一个 Vec,同样的原理也适用于编译器生成的不同 struct。

+

为了使代码能够正常工作,我们需要使用 trait objects,正如我们在第十二章的 “从 run 函数中返回错误” 中做的那样。(第十八章会详细介绍 trait objects。)使用 trait objects 允许我们将这些类型所产生的不同的匿名 future 视为相同的类型,因为它们都实现了 Future trait。

+
+

注意:在第八章中,我们讨论过另一种将多种类型包含进一个 Vec 的方式:使用一个枚举来代表每个可以出现在向量中的不同类型。不过这里我们不能这么做。一方面,没有方法来命名这些不同的类型,因为它们是匿名的。另一方面,我们最开始采用向量和 join_all 的原因是为了处理一个直到运行时之前都不知道是什么的 future 的动态集合。

+
+

我们以将 vec! 中的每个 future 用 Box::new 封装来作为开始,如示例 17-16 所示。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::Duration;
+
+fn main() {
+    trpl::run(async {
+        let (tx, mut rx) = trpl::channel();
+
+        let tx1 = tx.clone();
+        let tx1_fut = async move {
+            let vals = vec![
+                String::from("hi"),
+                String::from("from"),
+                String::from("the"),
+                String::from("future"),
+            ];
+
+            for val in vals {
+                tx1.send(val).unwrap();
+                trpl::sleep(Duration::from_secs(1)).await;
+            }
+        };
+
+        let rx_fut = async {
+            while let Some(value) = rx.recv().await {
+                println!("received '{value}'");
+            }
+        };
+
+        let tx_fut = async move {
+            let vals = vec![
+                String::from("more"),
+                String::from("messages"),
+                String::from("for"),
+                String::from("you"),
+            ];
+
+            for val in vals {
+                tx.send(val).unwrap();
+                trpl::sleep(Duration::from_secs(1)).await;
+            }
+        };
+
+        let futures =
+            vec![Box::new(tx1_fut), Box::new(rx_fut), Box::new(tx_fut)];
+
+        trpl::join_all(futures).await;
+    });
+}
+
示例 17-16:尝试用 `Box::new` 来对齐 `Vec` 中 future 的类型
+
+

不幸的是,代码仍然不能编译。事实上,我们遇到了与之前相同的基本错误,不过这次我们会在第二个和第三个 Box::new 调用处各得到一个错误,同时还会得到一个提及 Unpin trait 的新错误。我们一会再回到 Unpin 错误上。首先,让我们通过显式标注 futures 的类型来修复 Box::new 调用的类型错误:

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::{future::Future, time::Duration};
+
+fn main() {
+    trpl::run(async {
+        let (tx, mut rx) = trpl::channel();
+
+        let tx1 = tx.clone();
+        let tx1_fut = async move {
+            let vals = vec![
+                String::from("hi"),
+                String::from("from"),
+                String::from("the"),
+                String::from("future"),
+            ];
+
+            for val in vals {
+                tx1.send(val).unwrap();
+                trpl::sleep(Duration::from_secs(1)).await;
+            }
+        };
+
+        let rx_fut = async {
+            while let Some(value) = rx.recv().await {
+                println!("received '{value}'");
+            }
+        };
+
+        let tx_fut = async move {
+            let vals = vec![
+                String::from("more"),
+                String::from("messages"),
+                String::from("for"),
+                String::from("you"),
+            ];
+
+            for val in vals {
+                tx.send(val).unwrap();
+                trpl::sleep(Duration::from_secs(1)).await;
+            }
+        };
+
+        let futures: Vec<Box<dyn Future<Output = ()>>> =
+            vec![Box::new(tx1_fut), Box::new(rx_fut), Box::new(tx_fut)];
+
+        trpl::join_all(futures).await;
+    });
+}
+
示例 17-17:通过使用一个显式类型声明来修复余下的类型不匹配错误
+
+

这里必须编写的类型有一点复杂,让我们逐步过一遍:

+
    +
  • 最内层的类型是 future 本身。我们显式地指出 future 的输出类型是单元类型 (),其编写为 Future<Output = ()>
  • +
  • 接着使用 dyn 将 trait 标记为动态的。
  • +
  • 整个 trait 引用被封装进一个 Box
  • +
  • 最后,我们显式表明 futures 是一个包含这些项的 Vec
  • +
+

这已经有了很大的区别。现在当我们运行编译器时,就只会有提到 Unpin 的错误了。虽然这里有三个错误,但请注意它们每个的内容都非常相似。

+ +
error[E0277]: `{async block@src/main.rs:8:23: 20:10}` cannot be unpinned
+   --> src/main.rs:46:24
+    |
+46  |         trpl::join_all(futures).await;
+    |         -------------- ^^^^^^^ the trait `Unpin` is not implemented for `{async block@src/main.rs:8:23: 20:10}`, which is required by `Box<{async block@src/main.rs:8:23: 20:10}>: std::future::Future`
+    |         |
+    |         required by a bound introduced by this call
+    |
+    = note: consider using the `pin!` macro
+            consider using `Box::pin` if you need to access the pinned value outside of the current scope
+    = note: required for `Box<{async block@src/main.rs:8:23: 20:10}>` to implement `std::future::Future`
+note: required by a bound in `join_all`
+   --> /Users/chris/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.30/src/future/join_all.rs:105:14
+    |
+102 | pub fn join_all<I>(iter: I) -> JoinAll<I::Item>
+    |        -------- required by a bound in this function
+...
+105 |     I::Item: Future,
+    |              ^^^^^^ required by this bound in `join_all`
+
+error[E0277]: `{async block@src/main.rs:8:23: 20:10}` cannot be unpinned
+  --> src/main.rs:46:9
+   |
+46 |         trpl::join_all(futures).await;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^ the trait `Unpin` is not implemented for `{async block@src/main.rs:8:23: 20:10}`, which is required by `Box<{async block@src/main.rs:8:23: 20:10}>: std::future::Future`
+   |
+   = note: consider using the `pin!` macro
+           consider using `Box::pin` if you need to access the pinned value outside of the current scope
+   = note: required for `Box<{async block@src/main.rs:8:23: 20:10}>` to implement `std::future::Future`
+note: required by a bound in `JoinAll`
+  --> /Users/chris/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.30/src/future/join_all.rs:29:8
+   |
+27 | pub struct JoinAll<F>
+   |            ------- required by a bound in this struct
+28 | where
+29 |     F: Future,
+   |        ^^^^^^ required by this bound in `JoinAll`
+
+error[E0277]: `{async block@src/main.rs:8:23: 20:10}` cannot be unpinned
+  --> src/main.rs:46:33
+   |
+46 |         trpl::join_all(futures).await;
+   |                                 ^^^^^ the trait `Unpin` is not implemented for `{async block@src/main.rs:8:23: 20:10}`, which is required by `Box<{async block@src/main.rs:8:23: 20:10}>: std::future::Future`
+   |
+   = note: consider using the `pin!` macro
+           consider using `Box::pin` if you need to access the pinned value outside of the current scope
+   = note: required for `Box<{async block@src/main.rs:8:23: 20:10}>` to implement `std::future::Future`
+note: required by a bound in `JoinAll`
+  --> /Users/chris/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.30/src/future/join_all.rs:29:8
+   |
+27 | pub struct JoinAll<F>
+   |            ------- required by a bound in this struct
+28 | where
+29 |     F: Future,
+   |        ^^^^^^ required by this bound in `JoinAll`
+
+Some errors have detailed explanations: E0277, E0308.
+For more information about an error, try `rustc --explain E0277`.
+
+

这里有 很多 内容需要分析,所以让我们拆开来看。信息的第一部分告诉我们第一个异步代码块(src/main.rs:8:23: 20:10)没有实现 Unpin trait,并建议使用 pin!Box::pin 来修复,在本章的稍后部分我们会深入 PinUnpin 的一些更多细节。不过现在我们可以仅仅遵循编译器的建议来解困!在示例 17-18 中,我们以更新 futures 的类型声明作为开始,用 Pin 来封装每个 Box。其次,我们使用 Box::pin 来 pin 住 futures 自身。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::{
+    future::Future,
+    pin::{pin, Pin},
+    time::Duration,
+};
+
+fn main() {
+    trpl::run(async {
+        let (tx, mut rx) = trpl::channel();
+
+        let tx1 = tx.clone();
+        let tx1_fut = pin!(async move {
+            let vals = vec![
+                String::from("hi"),
+                String::from("from"),
+                String::from("the"),
+                String::from("future"),
+            ];
+
+            for val in vals {
+                tx1.send(val).unwrap();
+                trpl::sleep(Duration::from_secs(1)).await;
+            }
+        });
+
+        let rx_fut = pin!(async {
+            while let Some(value) = rx.recv().await {
+                println!("received '{value}'");
+            }
+        });
+
+        let tx_fut = pin!(async move {
+            let vals = vec![
+                String::from("more"),
+                String::from("messages"),
+                String::from("for"),
+                String::from("you"),
+            ];
+
+            for val in vals {
+                tx.send(val).unwrap();
+                trpl::sleep(Duration::from_secs(1)).await;
+            }
+        });
+
+        let futures: Vec<Pin<Box<dyn Future<Output = ()>>>> =
+            vec![Box::pin(tx1_fut), Box::pin(rx_fut), Box::pin(tx_fut)];
+
+        trpl::join_all(futures).await;
+    });
+}
+
示例 17-18:使用 `Pin` 和 `Box::pin` 来约束 `Vec` 的类型
+
+

如果编译并运行代码,我们终于会得到我们期望的输出:

+ +
received 'hi'
+received 'more'
+received 'from'
+received 'messages'
+received 'the'
+received 'for'
+received 'future'
+received 'you'
+
+

(长舒一口气!)

+

这里还有一些我们可以进一步探索的内容。首先,因为通过 Box 来将这些 futures 放到堆上,使用 Pin<Box<T>> 会带来少量的额外开销,而我们这么做仅仅是为了使类型对齐。毕竟这里实际上并不 需要 堆分配:这些 futures 对于这个特定的函数来说是本地的。如上所述,Pin 本身是一个封装类型,因此我们可以在 Vec 中拥有单一类型的好处(也就是使用 Box 的初始原因)而不用堆分配。我们可以通过 std::pin::pin 宏来直接对每个 future 使用 Pin

+

然而,我们仍然必须现实地知道被 pin 的引用的类型:否则 Rust 仍然不知道如何将它们解释为动态 trait objects,这是将它们放进 Vec 所需的。因此我们在定义每个 future 的时候使用 pin!,并将 futures 定义为一个包含被 pin 的动态 Future 类型的可变引用的 Vec,如示例 17-19 所示。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::{
+    future::Future,
+    pin::{pin, Pin},
+    time::Duration,
+};
+
+fn main() {
+    trpl::run(async {
+        let (tx, mut rx) = trpl::channel();
+
+        let tx1 = tx.clone();
+        let tx1_fut = pin!(async move {
+            // --snip--
+            let vals = vec![
+                String::from("hi"),
+                String::from("from"),
+                String::from("the"),
+                String::from("future"),
+            ];
+
+            for val in vals {
+                tx1.send(val).unwrap();
+                trpl::sleep(Duration::from_secs(1)).await;
+            }
+        });
+
+        let rx_fut = pin!(async {
+            // --snip--
+            while let Some(value) = rx.recv().await {
+                println!("received '{value}'");
+            }
+        });
+
+        let tx_fut = pin!(async move {
+            // --snip--
+            let vals = vec![
+                String::from("more"),
+                String::from("messages"),
+                String::from("for"),
+                String::from("you"),
+            ];
+
+            for val in vals {
+                tx.send(val).unwrap();
+                trpl::sleep(Duration::from_secs(1)).await;
+            }
+        });
+
+        let futures: Vec<Pin<&mut dyn Future<Output = ()>>> =
+            vec![tx1_fut, rx_fut, tx_fut];
+
+        trpl::join_all(futures).await;
+    });
+}
+
示例 17-19:通过 `pin!` 宏来直接使用 `Pin` 以避免不必要的堆分配
+
+

目前为止我们一直忽略了可能有不同 Output 类型的事实。例如,在示例 17-20 中,匿名 future a 实现了 Future<Output = u32>,匿名 future b 实现了 Future<Output = &str>,而匿名 future c 实现了 Future<Output = bool>

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+fn main() {
+    trpl::run(async {
+        let a = async { 1u32 };
+        let b = async { "Hello!" };
+        let c = async { true };
+
+        let (a_result, b_result, c_result) = trpl::join!(a, b, c);
+        println!("{a_result}, {b_result}, {c_result}");
+    });
+}
+
示例 17-20:三个不同类型的 futures
+
+

我们可以使用 trpl::join! 来 await 它们,因为它允许你传递多个 future 类型并产生一个这些类型的元组。我们 不能 使用 trpl::join_all,因为它要求传递的 future 都拥有相同的类型。请记住,那个错误正是我们开启 Pin 探索之旅的原因!

+

这是一个基础的权衡取舍:要么我们可以使用 join_all 处理动态数量的 future,只要它们都有相同的类型;要么我们可以使用 join 函数或者 join! 宏来处理固定数量的 future,哪怕它们有着不同的类型。不过这与 Rust 处理任何其它类型是一样的。Future 并不特殊,即便我们采用了一些友好的语法来处理它们,而这其实是好事。

+

future 竞争

+

当我们使用 join 系列函数和宏来 “join” future 时,我们要求它们 全部 结束才能继续。虽然有时我们只需要 部分 future 结束就能继续,这有点像一个 future 与另一个 future 竞争。

+

在示例 17-21 中,我们再次使用 trpl::race 来运行 slowfast 两个 future 并相互竞争。它们每一个都会在开始运行时打印一条消息,通过调用并 await sleep 暂停一段时间,接着在其结束时打印另一条消息。然后我们将它们传递给 trpl::race 并等待其中一个结束。(结果不会令人意外:fast 会赢!)不同于我们在第一个异步程序中使用 race 的时候,这里忽略了其返回的 Either 实例,因为所有有趣的行为都发生在异步代码块中。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::Duration;
+
+fn main() {
+    trpl::run(async {
+        let slow = async {
+            println!("'slow' started.");
+            trpl::sleep(Duration::from_millis(100)).await;
+            println!("'slow' finished.");
+        };
+
+        let fast = async {
+            println!("'fast' started.");
+            trpl::sleep(Duration::from_millis(50)).await;
+            println!("'fast' finished.");
+        };
+
+        trpl::race(slow, fast).await;
+    });
+}
+
示例 17-21:使用 `race` 来获取哪个 future 最先结束的结果
+
+

请注意如果你反转 race 参数的顺序,“started” 消息的顺序会改变,即使 fast future 总是第一个结束。这是因为这个特定的 race 函数实现并不是公平的。它总是以传递的参数的顺序来运行传递的 futures。其它的实现 公平的,并且会随机选择首先轮询的 future。不过无论我们使用的 race 实现是否公平,其中 一个 future 会在另一个任务开始之前一直运行到异步代码块中第一个 await 为止。

+

回忆一下第一个异步程序中提到在每一个 await point,如果被 await 的 future 还没有就绪,Rust 会给运行时一个机会来暂停该任务并切换到另一个任务。反过来也是正确的:Rust 只会 在一个 await point 暂停异步代码块并将控制权交还给运行时。await points 之间的一切都是同步。

+

这意味着如果你在异步代码块中做了一堆工作而没有一个 await point,则那个 future 会阻塞其它任何 future 继续进行。有时你可能会听说这称为一个 future starving 其它 future。在一些情况中,这可能不是什么大问题。不过,如果你在进行某种昂贵的设置或者长时间运行的任务,亦或有一个 future 会无限持续运行某些特定任务的话,你会需要思考在何时何地将控制权交还运行时。

+

同样地,如果你有长时间运行的阻塞操作,异步可能是一个提供了将程序的不同部分相互关联起来的实用工具。

+

不过在这种情况下 如何 将控制权交还运行时呢?

+

Yielding

+

让我们模拟一个长时间运行的操作。示例 17-22 引入了一个 slow 函数。它使用 std::thread::sleep 而不是 trpl::sleep 因此 slow 调用会阻塞当前线程若干毫秒。我们可以用 slow 来代表现实世界中的长时间运行并且会阻塞的操作。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::{thread, time::Duration};
+
+fn main() {
+    trpl::run(async {
+        // We will call `slow` here later
+    });
+}
+
+fn slow(name: &str, ms: u64) {
+    thread::sleep(Duration::from_millis(ms));
+    println!("'{name}' ran for {ms}ms");
+}
+
示例 17-22:使用 `thread::sleep` 来模拟缓慢的操作
+
+

在示例 17-22 中,我们使用 slow 在几个 future 中模拟这类 CPU 密集型工作。首先,每个 future 只会在进行了一系列缓慢操作 之后 才将控制权交还给运行时。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::{thread, time::Duration};
+
+fn main() {
+    trpl::run(async {
+        let a = async {
+            println!("'a' started.");
+            slow("a", 30);
+            slow("a", 10);
+            slow("a", 20);
+            trpl::sleep(Duration::from_millis(50)).await;
+            println!("'a' finished.");
+        };
+
+        let b = async {
+            println!("'b' started.");
+            slow("b", 75);
+            slow("b", 10);
+            slow("b", 15);
+            slow("b", 350);
+            trpl::sleep(Duration::from_millis(50)).await;
+            println!("'b' finished.");
+        };
+
+        trpl::race(a, b).await;
+    });
+}
+
+fn slow(name: &str, ms: u64) {
+    thread::sleep(Duration::from_millis(ms));
+    println!("'{name}' ran for {ms}ms");
+}
+
示例 17-23:使用 `thread::sleep` 来模拟缓慢的操作
+
+

如果运行代码,你会看到这些输出:

+ +
'a' started.
+'a' ran for 30ms
+'a' ran for 10ms
+'a' ran for 20ms
+'b' started.
+'b' ran for 75ms
+'b' ran for 10ms
+'b' ran for 15ms
+'b' ran for 350ms
+'a' finished.
+
+

与上一个示例一样,race 仍然在 a 完成后就立刻结束了。两个 future 之间没有交替运行。a future 一直进行其工作直到 trpl::sleep 调用被 await,然后 b future 一直进行其工作直到它自己的 trpl::sleep 调用被 await,再然后 a future 才完成。为了使两个 future 在各自缓慢任务之间都能有所进展,我们需要 await point 才能将控制权交还给运行时。这意味着我们需要一些可以 await 的东西!

+

我们已经在示例 17-23 中见过这类交接发生:如果去掉 a future 结尾的 trpl::sleep,那么当它完成时 b future 完全 不会运行。也许我们可以使用 sleep 函数来作为开始呢?

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::{thread, time::Duration};
+
+fn main() {
+    trpl::run(async {
+        let one_ms = Duration::from_millis(1);
+
+        let a = async {
+            println!("'a' started.");
+            slow("a", 30);
+            trpl::sleep(one_ms).await;
+            slow("a", 10);
+            trpl::sleep(one_ms).await;
+            slow("a", 20);
+            trpl::sleep(one_ms).await;
+            println!("'a' finished.");
+        };
+
+        let b = async {
+            println!("'b' started.");
+            slow("b", 75);
+            trpl::sleep(one_ms).await;
+            slow("b", 10);
+            trpl::sleep(one_ms).await;
+            slow("b", 15);
+            trpl::sleep(one_ms).await;
+            slow("b", 35);
+            trpl::sleep(one_ms).await;
+            println!("'b' finished.");
+        };
+
+        trpl::race(a, b).await;
+    });
+}
+
+fn slow(name: &str, ms: u64) {
+    thread::sleep(Duration::from_millis(ms));
+    println!("'{name}' ran for {ms}ms");
+}
+
示例 17-24:使用 `sleep` 让操作切换以继续进行
+
+

在示例 17-24 中,我们在 slow 调用之间增加了 trpl::sleep 调用和 await points。现在两个 future 的工作会相互交替运行:

+ +
'a' started.
+'a' ran for 30ms
+'b' started.
+'b' ran for 75ms
+'a' ran for 10ms
+'b' ran for 10ms
+'a' ran for 20ms
+'b' ran for 15ms
+'a' finished.
+
+

a future 仍然会在交还控制权给 b 之前运行一会儿,因为它在调用 trpl::sleep 之前就调用了 slow,不过在这之后两个 future 会在触发 await point 时来回切换。在这个例子中,我们在 slow 之后这么做,不过我们可以在任何合适的地方拆分任务。

+

不过我们并不是真的想在这里 休眠:我们希望尽可能快地取得进展。我们仅仅是需要交还控制权给运行时。我们可以使用 yield_now 函数来直接这么做。在示例 17-25 中,我们将所有的 sleep 调用替换为 yield_now

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::{thread, time::Duration};
+
+fn main() {
+    trpl::run(async {
+        let a = async {
+            println!("'a' started.");
+            slow("a", 30);
+            trpl::yield_now().await;
+            slow("a", 10);
+            trpl::yield_now().await;
+            slow("a", 20);
+            trpl::yield_now().await;
+            println!("'a' finished.");
+        };
+
+        let b = async {
+            println!("'b' started.");
+            slow("b", 75);
+            trpl::yield_now().await;
+            slow("b", 10);
+            trpl::yield_now().await;
+            slow("b", 15);
+            trpl::yield_now().await;
+            slow("b", 35);
+            trpl::yield_now().await;
+            println!("'b' finished.");
+        };
+
+        trpl::race(a, b).await;
+    });
+}
+
+fn slow(name: &str, ms: u64) {
+    thread::sleep(Duration::from_millis(ms));
+    println!("'{name}' ran for {ms}ms");
+}
+
示例 17-25:使用 `yield_now` 让操作切换以继续进行
+
+

这不仅更为清楚地表明了实际的意图而且更显著地快于使用 sleep,因为像这样使用 sleep 的定时器通常受限于其控制粒度。例如我们使用的 sleep 版本,会至少休眠一毫秒,哪怕我们传递一纳秒的 Duration。而且,现代计算机非常 快速:它们可以在一毫秒内完成很多工作!

+

你可以自行设置一些基准测试来验证这一点,例如示例 17-26 中的这个。(这并不是一个特别严谨的进行性能测试的方法,不过用来展示这里的区别是足够的。)这里,我们省略了所有的状态打印,传递一纳秒的 Durationtrpl::sleep,并让每一个 future 各自运行,不在 future 之间切换。接着我们运行 1000 次迭代并对比下使用 trpl::sleep 的 future 和使用 trpl::yield_now 的 future 的运行时间。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::{Duration, Instant};
+
+fn main() {
+    trpl::run(async {
+        let one_ns = Duration::from_nanos(1);
+        let start = Instant::now();
+        async {
+            for _ in 1..1000 {
+                trpl::sleep(one_ns).await;
+            }
+        }
+        .await;
+        let time = Instant::now() - start;
+        println!(
+            "'sleep' version finished after {} seconds.",
+            time.as_secs_f32()
+        );
+
+        let start = Instant::now();
+        async {
+            for _ in 1..1000 {
+                trpl::yield_now().await;
+            }
+        }
+        .await;
+        let time = Instant::now() - start;
+        println!(
+            "'yield' version finished after {} seconds.",
+            time.as_secs_f32()
+        );
+    });
+}
+
示例 17-26:对比 `sleep` 和 `yield_now` 的性能
+
+

使用 yield_now 的版本要 快得多

+

这意味着取决于程序所作的其它工作,异步操作甚至在计算密集型任务中也有用处,因为它提供了一个结构化程序中不同部分之间关系的实用工具。这是一种形式的 协同多任务处理cooperative multitasking),每个 futrue 有权通过 await point 来决定何时交还控制权。因此每个 future 也有责任避免长时间阻塞。在一些基于 Rust 的嵌入式系统中,这是 唯一 的多任务处理类型!

+

当然,在真实代码中,你通常不会在每一行上都交替使用 await 点来调用函数。虽然这样控制 yielding 相对来说更为廉价,但也不是毫无代价的!在很多情况下,尝试将计算密集型任务拆分可能会显著降低其速度,所以有时为了 整体 性能简单地让一个操作阻塞是更好的选择。你应该总是通过测量来观察代码真正的性能瓶颈是什么。不过其底层的考量在于重要的是要牢记你是否 确实 观察到了很多期望并发进行的工作在串行地进行。

+

构建我们自己的异步抽象

+

我们也可以将 futures 组合起来形成一个新模式。例如,我们可以使用已有的异步代码块构建一个 timeout 函数。当我们完成时,其结果将是另一个可以用来构建进一步异步抽象的代码块。

+

示例 17-27 展示了我们预期 timeout 如何处理一个缓慢运行的 future。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::time::Duration;
+
+fn main() {
+    trpl::run(async {
+        let slow = async {
+            trpl::sleep(Duration::from_millis(100)).await;
+            "I finished!"
+        };
+
+        match timeout(slow, Duration::from_millis(10)).await {
+            Ok(message) => println!("Succeeded with '{message}'"),
+            Err(duration) => {
+                println!("Failed after {} seconds", duration.as_secs())
+            }
+        }
+    });
+}
+
示例 17-27:使用假想的 `timeout` 来运行一个缓慢运行的操作并设置一个时限
+
+

让我们来实现它!首先,让我们考虑一下 timeout 的 API:

+
    +
  • 它需要是一个 async 函数以便可以 await。
  • +
  • 它的第一个参数应该是需要运行的 future。我们可以使用泛型以便可以处理任意 future。
  • +
  • 它的第二个参数将是需要等待的最大时间。如果我们使用 Duration 的话,将会使得将其直接传递给 trpl::sleep 变得简单。
  • +
  • 它应该返回一个 Result。如果 future 成功完成,Result 将会是包含 future 所产生的值的 Ok。如果超时先发生,Result 将会是包含超时等待的持续时间的 Err
  • +
+

示例 17-28 展示了这个抽象。

+ +
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::{future::Future, time::Duration};
+
+fn main() {
+    trpl::run(async {
+        let slow = async {
+            trpl::sleep(Duration::from_secs(5)).await;
+            "Finally finished"
+        };
+
+        match timeout(slow, Duration::from_millis(10)).await {
+            Ok(message) => println!("Succeeded with '{message}'"),
+            Err(duration) => {
+                println!("Failed after {} seconds", duration.as_secs())
+            }
+        }
+    });
+}
+
+async fn timeout<F: Future>(
+    future_to_try: F,
+    max_time: Duration,
+) -> Result<F::Output, Duration> {
+    // Here is where our implementation will go!
+}
+
示例 17-28:定义 `timeout` 的签名
+
+

这满足了我们对类型的目标。现在让我们思考下所需的 行为:我们需要传递进来的 future 在持续时间内相互竞争。我们可以使用 trpl::sleep 和 duration 来创建一个定时器 future,并使用 trpl::race 来运行定时器 future 和调用者传递进来的 future。

+

我们还知道 race 是不公平的,并按照传递的顺序轮询参数。因此,我们首先传递 future_to_tryrace 以便哪怕 max_time 是一个非常短的持续时间它也能有机会完成。如果 future_to_try 首先完成,race 会返回 Leftfuture 的输出。如果 timer 首先完成,race 会返回 Right 和定时器的输出 ()

+

在示例 17-29 中,我们匹配 await trpl::race 的结果。如果 future_to_try 成功并得到一个 Left(output),我们返回 Ok(output)。相反如果休眠定时器超时了并得到一个 Right(()),则我们通过 _ 忽略 () 并返回 Err(max_time)

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use std::{future::Future, time::Duration};
+
+use trpl::Either;
+
+// --snip--
+
+fn main() {
+    trpl::run(async {
+        let slow = async {
+            trpl::sleep(Duration::from_secs(5)).await;
+            "Finally finished"
+        };
+
+        match timeout(slow, Duration::from_secs(2)).await {
+            Ok(message) => println!("Succeeded with '{message}'"),
+            Err(duration) => {
+                println!("Failed after {} seconds", duration.as_secs())
+            }
+        }
+    });
+}
+
+async fn timeout<F: Future>(
+    future_to_try: F,
+    max_time: Duration,
+) -> Result<F::Output, Duration> {
+    match trpl::race(future_to_try, trpl::sleep(max_time)).await {
+        Either::Left(output) => Ok(output),
+        Either::Right(_) => Err(max_time),
+    }
+}
+
示例 17-29:使用 `race` 和 `sleep` 来定义 `timeout`
+
+

于是我们有了一个由另外两个帮助函数构成的可以工作的 timeout。如果我们运行代码,它会在超时之后打印失败模式:

+
Failed after 2 seconds
+
+

由于 future 可以和其他 future 组合,你可以使用更小的异步代码块来构建非常强力的工具。例如,可以使用相同的方式来组合超时和重试,并转而将其用于类似网络调用的工作,这正是本章开头的一个示例!

+

在实践中,你会直接处理 asyncawait,其次才是类似 joinjoin_allrace 等函数和宏,在使用这些 API 时你只会偶尔遇到 pin

+

现在我们见过了一系列同时处理多个 future 的方法了。接下来,我们来看看如何通过(streams 处理一个时间序列的多个 future。不过,在此之前,这里有几个你可能想要先考虑的问题:

+
    +
  • 我们在 Vec 上使用了 join_all 来等待一组中的所有 future 完成。相反该如何使用 Vec 来依次处理一个序列的 future 呢?这么做有哪些权衡取舍呢?
  • +
  • 仔细观察 futures crate 中的 futures::stream::FuturesUnordered 类型。使用它与使用 Vec 又有什么区别呢?(不用担心它来自与 crate 的 stream 部分的事实;它刚好能处理任何 future 的集合。)
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch17-04-streams.html b/ch17-04-streams.html new file mode 100644 index 000000000..6b0ceaa30 --- /dev/null +++ b/ch17-04-streams.html @@ -0,0 +1,373 @@ + + + + + + 流(Streams) - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

流(Streams)

+
+

ch17-04-streams.md +
+commit f04d20fe8d1a49c3bffa10a3086c58e527ff0a90

+
+

到本章的目前为止,我们大部分时间停留在独立的 future 上。一个重要的例外就是我们用过的异步信道。回忆一下在本章之前的 “消息传递” 中我们如何使用异步信道接收端的。异步 recv 方法随着时间的推移产生一个序列的项。这是一个通用的多的模式的实例,通常被称为 stream)。

+

一个序列的项是我们之前是见过的,回忆一下第十三章的 Iterator trait,不过迭代器和异步信道接收端有两个区别。第一个区别是时间的维度:迭代器是同步的,而信道接收端是异步的。第二个区别是 API。当直接处理 Iterator 时,我们会调用其同步 next 方法。对于这个特定的 trpl::Receiver 流,我们调用一个异步的 recv 方法。不过这两个 API 看起来非常相似。

+

这种相似性并非巧合。流类似于一种异步形式的迭代器。不过鉴于 trpl::Receiver 专门等待接收消息,多用途的流 API 则更为通用:它像 Iterator 一样提供了下一个项,不过是异步版本的。Rust 中迭代器和流的相似性意味着我们实际上可以从任何迭代器上创建流。就迭代器而言,可以通过调用其 next 方法并 await 输出来使用流,如示例 17-30 所示。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+fn main() {
+    trpl::run(async {
+        let values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+        let iter = values.iter().map(|n| n * 2);
+        let mut stream = trpl::stream_from_iter(iter);
+
+        while let Some(value) = stream.next().await {
+            println!("The value was: {value}");
+        }
+    });
+}
+
示例 17-30:从迭代器创建流并打印其值
+
+

我们以一组数字作为开始,将其转换为一个迭代器并接着调用 map 将其所有值翻倍。然后使用 trpl::stream_from_iter 函数将迭代器转换为流。再然后在 while let 循环中到达时循环处理流中的项。

+

不幸的是当我们尝试运行代码时,代码无法编译。相反如果我们观察其输出,它会报告没有可用的 next 方法。

+ +
error[E0599]: no method named `next` found for struct `Iter` in the current scope
+  --> src/main.rs:10:40
+   |
+10 |         while let Some(value) = stream.next().await {
+   |                                        ^^^^
+   |
+   = note: the full type name has been written to 'file:///projects/async_await/target/debug/deps/async_await-9de943556a6001b8.long-type-1281356139287206597.txt'
+   = note: consider using `--verbose` to print the full type name to the console
+   = help: items from traits can only be used if the trait is in scope
+help: the following traits which provide `next` are implemented but not in scope; perhaps you want to import one of them
+   |
+1  + use crate::trpl::StreamExt;
+   |
+1  + use futures_util::stream::stream::StreamExt;
+   |
+1  + use std::iter::Iterator;
+   |
+1  + use std::str::pattern::Searcher;
+   |
+help: there is a method `try_next` with a similar name
+   |
+10 |         while let Some(value) = stream.try_next().await {
+   |                                        ~~~~~~~~
+
+

正如输出中所建议的,编译器错误的原因是我们需要在作用域中有正确的 trait 以便能够使用 next 方法。鉴于目前为止的讨论,你可能会合理地推测是 Stream,不过这里需要的 trait 实际上是 StreamExt。这里的 Ext 是 “extension”:在 Rust 社区中这是用另一个 trait 扩展 trait 的常见模式。

+

为什么我们需要 StreamExt 而不是 Stream,而 Stream trait 本身又是做什么的呢?简单来说,答案是贯穿整个 Rust 生态系统,Stream trait 定义了一个底层接口用于有效地组合 IteratorFuture trait。StreamExt trait 在 Stream 之上提供了一组高层 API,这包括 next 和其它类似于 Iterator trait 提供的工具方法。在本章的最后我们会回到 StreamStreamExt 并介绍更多细节。现在这已经足够我们继续了。

+

对编译器错误的修复是增加一个 trpl::StreamExtuse 语句,如示例 17-31 所示。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use trpl::StreamExt;
+
+fn main() {
+    trpl::run(async {
+        let values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+        let iter = values.iter().map(|n| n * 2);
+        let mut stream = trpl::stream_from_iter(iter);
+
+        while let Some(value) = stream.next().await {
+            println!("The value was: {value}");
+        }
+    });
+}
+
示例 17-31:成功使用迭代器作为流的基础
+
+

将所有这些代码片段拼凑在一起,这段代码如我们预期般运行!更重要的是,现在我们在作用域中拥有 StreamExt,就可以使用所有其工具方法。例如在示例 17-32 中,我们使用 filter 方法来过滤掉所有不是 3 或者 5 的倍数的项。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use trpl::StreamExt;
+
+fn main() {
+    trpl::run(async {
+        let values = 1..101;
+        let iter = values.map(|n| n * 2);
+        let stream = trpl::stream_from_iter(iter);
+
+        let mut filtered =
+            stream.filter(|value| value % 3 == 0 || value % 5 == 0);
+
+        while let Some(value) = filtered.next().await {
+            println!("The value was: {value}");
+        }
+    });
+}
+
示例 17-32:使用 `StreamExt::filter` 方法来过滤 `Stream`
+
+

当然这并不是非常的有趣。我们完全可以使用普通的迭代器而不用任何异步操作来做到这些。所以让我们看看一些其它的只能用流的内容。

+

组合流

+

很多概念天然地可以用流来代表:队列中可用的项;或者处理超过计算机内存的数据,一次只能从文件系统拉取一个块;或者通过网络随着时间推移到达的数据。因为流是 future,我们也可以将其用于任何其它类型的 future,并且我们可以用一种非常有趣的方式来组合它们。例如,我们可以批量处理事件来避免触发过多的网络调用,为一系列的长时间运行的任务设置超时,或者对用户接口事件限速来避免进行无尽的工作。

+

让我们构建一个小的消息流作为开始,将其作为一个可能从 WebSocket 或者其它现实世界中的通信协议中遇到的数据流的替代。在示例 17-33 中,我们创建了一个返回 impl Stream<Item = String>get_messages 函数。作为其实现,我们创建了一个异步信道,循环英文字母表的前是个字符,并通过信道发送它们。

+

我们还使用了一个新类型:ReceiverStream,它将 trpl::channelrx 接收端转换为一个带有带有 next 方法的 Stream。回到 main,我们使用了一个 while let 循环来打印来自流中的所有消息。

+
+

文件名:src/main.rs

+
extern crate trpl; // required for mdbook test
+
+use trpl::{ReceiverStream, Stream, StreamExt};
+
+fn main() {
+    trpl::run(async {
+        let mut messages = get_messages();
+
+        while let Some(message) = messages.next().await {
+            println!("{message}");
+        }
+    });
+}
+
+fn get_messages() -> impl Stream<Item = String> {
+    let (tx, rx) = trpl::channel();
+
+    let messages = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"];
+    for message in messages {
+        tx.send(format!("Message: '{message}'")).unwrap();
+    }
+
+    ReceiverStream::new(rx)
+}
+
示例 17-33:使用 `rx` 接收端作为一个 `ReceiverStream`
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch17-05-traits-for-async.html b/ch17-05-traits-for-async.html new file mode 100644 index 000000000..10be0894c --- /dev/null +++ b/ch17-05-traits-for-async.html @@ -0,0 +1,239 @@ + + + + + + 深入理解 async 相关的 traits - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch17-06-futures-tasks-threads.html b/ch17-06-futures-tasks-threads.html new file mode 100644 index 000000000..3e94f2f9a --- /dev/null +++ b/ch17-06-futures-tasks-threads.html @@ -0,0 +1,239 @@ + + + + + + Futures,任务(tasks)和线程(threads) - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch18-00-oop.html b/ch18-00-oop.html new file mode 100644 index 000000000..aa46144b0 --- /dev/null +++ b/ch18-00-oop.html @@ -0,0 +1,245 @@ + + + + + + Rust 的面向对象编程特性 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Rust 的面向对象特性

+
+

ch18-00-oop.md +
+commit 398d6f48d2e6b7b15efd51c4541d446e89de3892

+
+

面向对象编程(Object-Oriented Programming,OOP)是一种对程序进行建模方式。对象(Object)作为一个编程概念来源于 20 世纪 60 年代的 Simula 编程语言。这些对象影响了 Alan Kay 的编程架构,该架构中对象之间互相传递消息。他在 1967 年创造了 面向对象编程object-oriented programming)这个术语。关于 OOP 是什么有很多相互矛盾的定义;在一些定义下,Rust 是面向对象的;在其他定义下,Rust 不是。在本章节中,我们会探索一些被普遍认为是面向对象的特性和这些特性是如何体现在 Rust 语言习惯中的。接着会展示如何在 Rust 中实现面向对象设计模式,并讨论这么做与利用 Rust 自身的一些优势实现的方案相比有什么取舍。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch18-01-what-is-oo.html b/ch18-01-what-is-oo.html new file mode 100644 index 000000000..4a312e259 --- /dev/null +++ b/ch18-01-what-is-oo.html @@ -0,0 +1,314 @@ + + + + + + 面向对象语言的特点 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

面向对象语言的特征

+
+

ch18-01-what-is-oo.md +
+commit 398d6f48d2e6b7b15efd51c4541d446e89de3892

+
+

关于一门语言必须具备哪些特征才能被视为面向对象,目前在编程社区中并没有共识。Rust 受到了许多编程范式的影响,包括面向对象编程(OOP);例如,在第 13 章中,我们探讨了来自函数式编程的特性。可以说,面向对象的语言共有一些共同的特征,即对象、封装和继承。我们将会讨论这些特征分别是什么,以及 Rust 是否支持它们。

+

对象包含数据和行为

+

由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(Addison-Wesley Professional, 1994)编写的书 Design Patterns: Elements of Reusable Object-Oriented Software ,通称 The Gang of Four (“四人帮”),是一本面向对象设计模式的目录。它这样定义面向对象编程:

+
+

Object-oriented programs are made up of objects. An object packages both +data and the procedures that operate on that data. The procedures are +typically called methods or operations.

+

面向对象的程序由对象组成。一个 对象 包含数据和操作这些数据的过程。这些过程通常被称为 方法操作

+
+

在这个定义下,Rust 是面向对象的:结构体和枚举包含数据而 impl 块提供了在结构体和枚举之上的方法。虽然带有方法的结构体和枚举并不被 称为 对象,但是它们提供了与对象相同的功能,参考 The Gang of Four 中对象的定义。

+

封装隐藏了实现细节

+

另一个通常与面向对象编程关联的概念是 封装encapsulation):一个对象的实现细节对使用该对象的代码不可访问。因此,对象交互的唯一方式是通过其公共 API;使用对象的代码不应能直接触及对象的内部并改变数据或行为。这使得程序员能够更改和重构一个对象的内部实现,而无需改变使用该对象的代码。

+

我们在第 7 章讨论了如何控制封装:我们可以使用 pub 关键字来决定代码中的哪些模块、类型、函数和方法是公有的,而默认情况下其他所有内容都是私有的。例如,我们可以定义一个 AveragedCollection 结构体,其中有一个存有 Vec<i32> 的字段。该结构体还可以有一个字段存储其平均值,以便需要时取用。示例 17-1 给出了 AveragedCollection 结构体的定义:

+

文件名:src/lib.rs

+
pub struct AveragedCollection {
+    list: Vec<i32>,
+    average: f64,
+}
+

示例 17-1: AveragedCollection 结构体维护了一个整型列表及其所有元素的平均值。

+

该结构体被标记为 pub,这样其他代码就可以使用它,但结构体内的字段保持私有。这在这种情况下很重要,因为我们想确保每当列表中添加或删除值时,平均值也会更新。我们通过实现结构体上的 addremoveaverage 方法来做到这一点,如示例 17-2 所示:

+

文件名:src/lib.rs

+
pub struct AveragedCollection {
+    list: Vec<i32>,
+    average: f64,
+}
+
+impl AveragedCollection {
+    pub fn add(&mut self, value: i32) {
+        self.list.push(value);
+        self.update_average();
+    }
+
+    pub fn remove(&mut self) -> Option<i32> {
+        let result = self.list.pop();
+        match result {
+            Some(value) => {
+                self.update_average();
+                Some(value)
+            }
+            None => None,
+        }
+    }
+
+    pub fn average(&self) -> f64 {
+        self.average
+    }
+
+    fn update_average(&mut self) {
+        let total: i32 = self.list.iter().sum();
+        self.average = total as f64 / self.list.len() as f64;
+    }
+}
+

示例 17-2: 在 AveragedCollection 结构体上实现了 addremoveaverage 公有方法

+

公有方法 addremoveaverage 是修改 AveragedCollection 实例的唯一方式。当使用 add 方法把一个元素加入到 list 或者使用 remove 方法来删除时,这些方法的实现同时会调用私有的 update_average 方法来更新 average 字段。

+

listaverage 是私有的,所以没有其他方式来使得外部的代码直接向 list 增加或者删除元素,否则 list 改变时可能会导致 average 字段不同步。average 方法返回 average 字段的值,这使得外部的代码只能读取 average 而不能修改它。

+

因为我们已经封装了 AveragedCollection 的实现细节,改动数据结构等内部实现非常简单。例如,可以使用 HashSet<i32> 代替 Vec<i32> 作为 list 字段的类型。只要 addremoveaverage 这些公有方法的签名保持不变,使用 AveragedCollection 的代码就无需改变。如果我们将 list 设为公有,情况就未必如此: HashSet<i32>Vec<i32> 使用不同的方法增加或移除项,所以如果外部代码直接修改 list ,很可能需要进行更改。

+

如果封装被认为是面向对象语言所必要的特征,那么 Rust 满足这个要求。在代码中不同的部分控制 pub 的使用来封装实现细节。

+

继承,作为类型系统与代码共享

+

继承Inheritance)是一种机制:一个对象可以从另一个对象的定义中继承元素,从而获得父对象的数据和行为,无需再次定义。

+

如果一种语言必须具有继承才能被认为是面向对象语言,那么 Rust 不是其中之一。Rust 不支持定义一个结构体时继承父结构体的字段和方法,除非使用宏。

+

然而,如果您习惯于在编程过程中使用继承,那么根据运用继承的原因,Rust 提供了其他解决方案。

+

选择继承有两个主要的原因。其一是代码复用:您可以为一种类型实现特定的行为,继承可将其复用到不同的类型上。在 Rust 代码中可以使用默认 trait 方法实现来进行有限的代码复用,就像示例 10-14 中在 Summary trait 上增加的 summarize 方法的默认实现。任何实现了 Summary trait 的类型都可以使用 summarize 方法而无须进一步实现。这类似于父类有一个方法的实现,继承的子类也拥有这个方法的实现。当实现 Summary trait 时也可以选择覆盖 summarize 的默认实现,这类似于子类覆盖从父类继承方法的实现。

+

其二与类型系统有关:子类型可以用于父类型被使用的地方。这也被称为 多态polymorphism):如果多个对象共享某些特征,可以在运行时将它们互相替代。

+
+

多态(Polymorphism)

+

对很多人来说,多态性与继承同义。但它实际上是一个更广义的概念,指的是可以处理多种类型数据的代码。对继承而言,这些类型通常是子类。 +Rust 使用泛型来抽象不同可能的类型,并通过 trait bounds 来约束这些类型所必须提供的内容。这有时被称为 bounded parametric polymorphism

+
+

作为一种语言设计的解决方案,继承在许多新的编程语言中逐渐不被青睐,因为它经常有分享过多代码的风险。子类不应总是共享父类的所有特征,但是继承始终如此。它还引入了在子类上调用方法的可能性,这些方法可能没有意义,或因为方法不适用于子类而导致错误。此外,一些语言只允许单一继承(意味着子类只能从一个类继承),进一步限制了程序设计的灵活性。

+

出于这些原因,Rust 使用 trait 对象而非继承。接下来我们会讨论 Rust 如何使用 trait 对象实现多态性。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch18-02-trait-objects.html b/ch18-02-trait-objects.html new file mode 100644 index 000000000..da43b4652 --- /dev/null +++ b/ch18-02-trait-objects.html @@ -0,0 +1,433 @@ + + + + + + 顾及不同类型值的 trait 对象 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

顾及不同类型值的 trait 对象

+
+

ch18-02-trait-objects.md +
+commit 96d4b0ec1c5e019b85604c33ceee68b3e2669d40

+
+

在第八章中,我们谈到了 vector 只能存储同种类型元素的局限。示例 8-9 中提供了一个替代方案,通过定义 SpreadsheetCell 枚举,来储存整型、浮点型或文本类型的成员。这意味着,我们可以在每个单元中储存不同类型的数据,并仍能拥有一个代表一排单元的 vector。只要我们需存储的值由一组固定的类型组成,并且在代码编译时就知道具体会有哪些类型,那么这种使用枚举的办法是完全可行的。

+

然而有时我们希望库用户在特定情况下能够扩展有效的类型集合。为了展示如何实现这一点,这里将创建一个图形用户接口(Graphical User Interface,GUI)工具的例子,它通过遍历列表并调用每一个项目的 draw 方法来将其绘制到屏幕上 —— 此乃一个 GUI 工具的常见技术。我们将要创建一个叫做 gui 的库 crate,它含一个 GUI 库的结构。这个 GUI 库包含一些可供开发者使用的类型,比如 ButtonTextField。在此之上,gui 的用户希望创建自定义的可以绘制于屏幕上的类型:比如,一个程序员可能会增加 Image,另一个可能会增加 SelectBox

+

这个例子中并不会实现一个功能完善的 GUI 库,不过会展示其中各个部分是如何结合在一起的。编写库的时候,我们不可能知晓并定义所有其他程序员希望创建的类型。我们所知晓的是 gui 需要记录一系列不同类型的值,并需要能够对其中每一个值调用 draw 方法。这里无需知道调用 draw 方法时具体会发生什么,只要该值会有那个方法可供我们调用。

+

在拥有继承的语言中,可以定义一个名为 Component 的类,该类上有一个 draw 方法。其他的类比如 ButtonImageSelectBox 会从 Component 派生并因此继承 draw 方法。它们各自都可以覆盖 draw 方法来定义自己的行为,但是框架会把所有这些类型当作是 Component 的实例,并在其上调用 draw。不过 Rust 并没有继承,我们得另寻出路。

+

定义通用行为的 trait

+

为了实现 gui 所期望的行为,让我们定义一个 Draw trait,其中包含名为 draw 的方法。接着可以定义一个存放 trait 对象trait object)的 vector。trait 对象指向一个实现了我们指定 trait 的类型的实例,以及一个用于在运行时查找该类型的 trait 方法的表。我们通过指定某种指针来创建 trait 对象,例如 & 引用或 Box<T> 智能指针,还有 dyn keyword,以及指定相关的 trait(第二十章 “动态大小类型和 Sized trait” 部分会介绍 trait 对象必须使用指针的原因)。我们可以使用 trait 对象代替泛型或具体类型。任何使用 trait 对象的位置,Rust 的类型系统会在编译时确保任何在此上下文中使用的值会实现其 trait 对象的 trait。如此便无需在编译时就知晓所有可能的类型。

+

之前提到过,Rust 刻意不将结构体与枚举称为 “对象”,以便与其他语言中的对象相区别。在结构体或枚举中,结构体字段中的数据和 impl 块中的行为是分开的,不同于其他语言中将数据和行为组合进一个称为对象的概念中。trait 对象将数据和行为两者相结合,从这种意义上说 其更类似其他语言中的对象。不过 trait 对象不同于传统的对象,因为不能向 trait 对象增加数据。trait 对象并不像其他语言中的对象那么通用:其(trait 对象)具体的作用是允许对通用行为进行抽象。

+

示例 17-3 展示了如何定义一个带有 draw 方法的 trait Draw

+

文件名:src/lib.rs

+
pub trait Draw {
+    fn draw(&self);
+}
+

示例 17-3:Draw trait 的定义

+

因为第十章已经讨论过如何定义 trait,其语法看起来应该比较眼熟。接下来就是新内容了:示例 17-4 定义了一个存放了名叫 components 的 vector 的结构体 Screen。这个 vector 的类型是 Box<dyn Draw>,此为一个 trait 对象:它是 Box 中任何实现了 Draw trait 的类型的替身。

+

文件名:src/lib.rs

+
pub trait Draw {
+    fn draw(&self);
+}
+
+pub struct Screen {
+    pub components: Vec<Box<dyn Draw>>,
+}
+

示例 17-4: 一个 Screen 结构体的定义,它带有一个字段 components,其包含实现了 Draw trait 的 trait 对象的 vector

+

Screen 结构体上,我们将定义一个 run 方法,该方法会对其 components 上的每一个组件调用 draw 方法,如示例 17-5 所示:

+

文件名:src/lib.rs

+
pub trait Draw {
+    fn draw(&self);
+}
+
+pub struct Screen {
+    pub components: Vec<Box<dyn Draw>>,
+}
+
+impl Screen {
+    pub fn run(&self) {
+        for component in self.components.iter() {
+            component.draw();
+        }
+    }
+}
+

示例 17-5:在 Screen 上实现一个 run 方法,该方法在每个 component 上调用 draw 方法

+

这与定义使用了带有 trait bound 的泛型类型参数的结构体不同。泛型类型参数一次只能替代一个具体类型,而 trait 对象则允许在运行时替代多种具体类型。例如,可以定义 Screen 结构体来使用泛型和 trait bound,如示例 17-6 所示:

+

文件名:src/lib.rs

+
pub trait Draw {
+    fn draw(&self);
+}
+
+pub struct Screen<T: Draw> {
+    pub components: Vec<T>,
+}
+
+impl<T> Screen<T>
+where
+    T: Draw,
+{
+    pub fn run(&self) {
+        for component in self.components.iter() {
+            component.draw();
+        }
+    }
+}
+

示例 17-6: 一种 Screen 结构体的替代实现,其 run 方法使用泛型和 trait bound

+

这限制了 Screen 实例必须拥有一个全是 Button 类型或者全是 TextField 类型的组件列表。如果只需要同质(相同类型)集合,则倾向于使用泛型和 trait bound,因为其定义会在编译时采用具体类型进行单态化。

+

另一方面,通过使用 trait 对象的方法,一个 Screen 实例可以存放一个既能包含 Box<Button>,也能包含 Box<TextField>Vec<T>。让我们看看它是如何工作的,接着会讲到其运行时性能影响。

+

实现 trait

+

现在来增加一些实现了 Draw trait 的类型。我们将提供 Button 类型。再一次重申,真正实现 GUI 库超出了本书的范畴,所以 draw 方法体中不会有任何有意义的实现。为了想象一下这个实现看起来像什么,一个 Button 结构体可能会拥有 widthheightlabel 字段,如示例 17-7 所示:

+

文件名:src/lib.rs

+
pub trait Draw {
+    fn draw(&self);
+}
+
+pub struct Screen {
+    pub components: Vec<Box<dyn Draw>>,
+}
+
+impl Screen {
+    pub fn run(&self) {
+        for component in self.components.iter() {
+            component.draw();
+        }
+    }
+}
+
+pub struct Button {
+    pub width: u32,
+    pub height: u32,
+    pub label: String,
+}
+
+impl Draw for Button {
+    fn draw(&self) {
+        // code to actually draw a button
+    }
+}
+

示例 17-7: 一个实现了 Draw trait 的 Button 结构体

+

Button 上的 widthheightlabel 字段会和其他组件不同,比如 TextField 可能有 widthheightlabel 以及 placeholder 字段。每一个我们希望能在屏幕上绘制的类型都会使用不同的代码来实现 Draw trait 的 draw 方法来定义如何绘制特定的类型,像这里的 Button 类型(如上提到的并不包含任何实际的 GUI 代码)。除了实现 Draw trait 之外,比如 Button 还可能有另一个包含按钮点击如何响应的方法的 impl 块。这类方法并不适用于像 TextField 这样的类型。

+

如果一些库的使用者决定实现一个包含 widthheightoptions 字段的结构体 SelectBox,并且也为其实现了 Draw trait,如示例 17-8 所示:

+

文件名:src/main.rs

+
use gui::Draw;
+
+struct SelectBox {
+    width: u32,
+    height: u32,
+    options: Vec<String>,
+}
+
+impl Draw for SelectBox {
+    fn draw(&self) {
+        // code to actually draw a select box
+    }
+}
+
+fn main() {}
+

示例 17-8: 另一个使用 gui 的 crate 中,在 SelectBox 结构体上实现 Draw trait

+

库使用者现在可以在他们的 main 函数中创建一个 Screen 实例。至此可以通过将 SelectBoxButton 放入 Box<T> 转变为 trait 对象再放入 Screen 实例中。接着可以调用 Screenrun 方法,它会调用每个组件的 draw 方法。示例 17-9 展示了这个实现:

+

文件名:src/main.rs

+
use gui::Draw;
+
+struct SelectBox {
+    width: u32,
+    height: u32,
+    options: Vec<String>,
+}
+
+impl Draw for SelectBox {
+    fn draw(&self) {
+        // code to actually draw a select box
+    }
+}
+
+use gui::{Button, Screen};
+
+fn main() {
+    let screen = Screen {
+        components: vec![
+            Box::new(SelectBox {
+                width: 75,
+                height: 10,
+                options: vec![
+                    String::from("Yes"),
+                    String::from("Maybe"),
+                    String::from("No"),
+                ],
+            }),
+            Box::new(Button {
+                width: 50,
+                height: 10,
+                label: String::from("OK"),
+            }),
+        ],
+    };
+
+    screen.run();
+}
+

示例 17-9: 使用 trait 对象来存储实现了相同 trait 的不同类型的值

+

当编写库的时候,我们不知道何人会在何时增加 SelectBox 类型,不过 Screen 的实现能够操作并绘制这个新类型,因为 SelectBox 实现了 Draw trait,这意味着它实现了 draw 方法。

+

这个概念 —— 只关心值所反映的信息而不是其具体类型 —— 类似于动态类型语言中称为 鸭子类型duck typing)的概念:如果它走起来像一只鸭子,叫起来像一只鸭子,那么它就是一只鸭子!在示例 17-5 中 Screen 上的 run 实现中,run 并不需要知道各个组件的具体类型是什么。它并不检查组件是 Button 或者 SelectBox 的实例。通过指定 Box<dyn Draw> 作为 components vector 中值的类型,我们就定义了 Screen 为需要可以在其上调用 draw 方法的值。

+

使用 trait 对象和 Rust 类型系统来进行类似鸭子类型操作的优势是无需在运行时检查一个值是否实现了特定方法或者担心在调用时因为值没有实现方法而产生错误。如果值没有实现 trait 对象所需的 trait 则 Rust 不会编译这些代码。

+

例如,示例 17-10 展示了当创建一个使用 String 做为其组件的 Screen 时发生的情况:

+

文件名:src/main.rs

+
use gui::Screen;
+
+fn main() {
+    let screen = Screen {
+        components: vec![Box::new(String::from("Hi"))],
+    };
+
+    screen.run();
+}
+

示例 17-10: 尝试使用一种没有实现 trait 对象的 trait 的类型

+

我们会遇到这个错误,因为 String 没有实现 rust_gui::Draw trait:

+
$ cargo run
+   Compiling gui v0.1.0 (file:///projects/gui)
+error[E0277]: the trait bound `String: Draw` is not satisfied
+ --> src/main.rs:5:26
+  |
+5 |         components: vec![Box::new(String::from("Hi"))],
+  |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Draw` is not implemented for `String`
+  |
+  = help: the trait `Draw` is implemented for `Button`
+  = note: required for the cast from `Box<String>` to `Box<dyn Draw>`
+
+For more information about this error, try `rustc --explain E0277`.
+error: could not compile `gui` (bin "gui") due to 1 previous error
+
+

这告诉了我们,要么是我们传递了并不希望传递给 Screen 的类型并应该提供其他类型,要么应该在 String 上实现 Draw 以便 Screen 可以调用其上的 draw

+

trait 对象执行动态分发

+

回忆一下第十章 “泛型代码的性能” 部分讨论过的,当对泛型使用 trait bound 时编译器所执行的单态化处理:编译器为每一个被泛型类型参数代替的具体类型生成了函数和方法的非泛型实现。单态化产生的代码在执行 静态分发static dispatch)。静态分发发生于编译器在编译时就知晓调用了什么方法的时候。这与 动态分发dynamic dispatch)相对,这时编译器在编译时无法知晓调用了什么方法。在动态分发的场景下,编译器会生成负责在运行时确定该调用什么方法的代码。

+

当使用 trait 对象时,Rust 必须使用动态分发。编译器无法知晓所有可能用于 trait 对象代码的类型,所以它也不知道应该调用哪个类型的哪个方法实现。为此,Rust 在运行时使用 trait 对象中的指针来知晓需要调用哪个方法。动态分发也阻止编译器有选择的内联方法代码,这会相应的禁用一些优化。尽管在编写示例 17-5 和可以支持示例 17-9 中的代码的过程中确实获得了额外的灵活性,但仍然需要权衡取舍。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch18-03-oo-design-patterns.html b/ch18-03-oo-design-patterns.html new file mode 100644 index 000000000..8204a7d8b --- /dev/null +++ b/ch18-03-oo-design-patterns.html @@ -0,0 +1,818 @@ + + + + + + 面向对象设计模式的实现 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

面向对象设计模式的实现

+
+

ch18-03-oo-design-patterns.md +
+commit 937784b8708c24314707378ad42faeb12a334bbd

+
+

状态模式state pattern)是一个面向对象设计模式。该模式的关键在于定义一系列值的内含状态。这些状态体现为一系列的 状态对象,同时值的行为随着其内部状态而改变。我们将编写一个博客发布结构体的例子,它拥有一个包含其状态的字段,这是一个有着 "draft"、"review" 或 "published" 的状态对象

+

状态对象共享功能:当然,在 Rust 中使用结构体和 trait 而不是对象和继承。每一个状态对象负责其自身的行为,以及该状态何时应当转移至另一个状态。持有一个状态对象的值对于不同状态的行为以及何时状态转移毫不知情。

+

使用状态模式的优点在于,程序的业务需求改变时,无需改变值持有状态或者使用值的代码。我们只需更新某个状态对象中的代码来改变其规则,或者是增加更多的状态对象。

+

首先我们将以一种更加传统的面向对象的方式实现状态模式,接着使用一种更 Rust 一点的方式。让我们使用状态模式增量式地实现一个发布博文的工作流以探索这个概念。

+

这个博客的最终功能看起来像这样:

+
    +
  1. 博文从空白的草案开始。
  2. +
  3. 一旦草案完成,请求审核博文。
  4. +
  5. 一旦博文过审,它将被发表。
  6. +
  7. 只有被发表的博文的内容会被打印,这样就不会意外打印出没有被审核的博文的文本。
  8. +
+

任何其他对博文的修改尝试都是没有作用的。例如,如果尝试在请求审核之前通过一个草案博文,博文应该保持未发布的状态。

+

示例 17-11 展示这个工作流的代码形式:这是一个我们将要在一个叫做 blog 的库 crate 中实现的 API 的示例。这段代码还不能编译,因为还未实现 blog

+

文件名:src/main.rs

+
use blog::Post;
+
+fn main() {
+    let mut post = Post::new();
+
+    post.add_text("I ate a salad for lunch today");
+    assert_eq!("", post.content());
+
+    post.request_review();
+    assert_eq!("", post.content());
+
+    post.approve();
+    assert_eq!("I ate a salad for lunch today", post.content());
+}
+

示例 17-11: 展示了 blog crate 期望行为的代码

+

我们希望允许用户使用 Post::new 创建一个新的博文草案。也希望能在草案阶段为博文编写一些文本。如果在审批之前尝试立刻获取博文的内容,不应该获取到任何文本因为博文仍然是草案。一个好的单元测试将是断言草案博文的 content 方法返回空字符串,不过我们并不准备为这个例子编写单元测试。

+

接下来,我们希望能够请求审核博文,而在等待审核的阶段 content 应该仍然返回空字符串。最后当博文审核通过,它应该被发表,这意味着当调用 content 时博文的文本将被返回。

+

注意我们与 crate 交互的唯一的类型是 Post。这个类型会使用状态模式并会存放处于三种博文所可能的状态之一的值 —— 草案,等待审核和发布。状态上的改变由 Post 类型内部进行管理。状态依库用户对 Post 实例调用的方法而改变,但是不能直接管理状态变化。这也意味着用户不会在状态上犯错,比如在过审前发布博文。

+

定义 Post 并新建一个草案状态的实例

+

让我们开始实现这个库吧!我们知道需要一个公有 Post 结构体来存放一些文本,所以让我们从结构体的定义和一个创建 Post 实例的公有关联函数 new 开始,如示例 17-12 所示。还需定义一个私有 trait State

+

Post 将在私有字段 state 中存放一个 Option<T> 类型的 trait 对象 Box<dyn State>。稍后将会看到为何 Option<T> 是必须的。

+

文件名:src/lib.rs

+
pub struct Post {
+    state: Option<Box<dyn State>>,
+    content: String,
+}
+
+impl Post {
+    pub fn new() -> Post {
+        Post {
+            state: Some(Box::new(Draft {})),
+            content: String::new(),
+        }
+    }
+}
+
+trait State {}
+
+struct Draft {}
+
+impl State for Draft {}
+

示例 17-12: Post 结构体的定义和新建 Post 实例的 new 函数,State trait 和结构体 Draft

+

State trait 定义了所有不同状态的博文所共享的行为,这个状态对象是 DraftPendingReviewPublished,它们都会实现 State 状态。现在这个 trait 并没有任何方法,同时开始将只定义 Draft 状态因为这是我们希望博文的初始状态。

+

当创建新的 Post 时,我们将其 state 字段设置为一个存放了 BoxSome 值。这个 Box 指向一个 Draft 结构体新实例。这确保了无论何时新建一个 Post 实例,它都会从草案开始。因为 Poststate 字段是私有的,也就无法创建任何其他状态的 Post 了!。Post::new 函数中将 content 设置为新建的空 String

+

存放博文内容的文本

+

在示例 17-11 中,展示了我们希望能够调用一个叫做 add_text 的方法并向其传递一个 &str 来将文本增加到博文的内容中。选择实现为一个方法而不是将 content 字段暴露为 pub 。这意味着之后可以实现一个方法来控制 content 字段如何被读取。add_text 方法是非常直观的,让我们在示例 17-13 的 impl Post 块中增加一个实现:

+

文件名:src/lib.rs

+
pub struct Post {
+    state: Option<Box<dyn State>>,
+    content: String,
+}
+
+impl Post {
+    // --snip--
+    pub fn new() -> Post {
+        Post {
+            state: Some(Box::new(Draft {})),
+            content: String::new(),
+        }
+    }
+
+    pub fn add_text(&mut self, text: &str) {
+        self.content.push_str(text);
+    }
+}
+
+trait State {}
+
+struct Draft {}
+
+impl State for Draft {}
+

示例 17-13: 实现方法 add_text 来向博文的 content 增加文本

+

add_text 获取一个 self 的可变引用,因为需要改变调用 add_textPost 实例。接着调用 content 中的 Stringpush_str 并传递 text 参数来保存到 content 中。这不是状态模式的一部分,因为它的行为并不依赖博文所处的状态。add_text 方法完全不与 state 状态交互,不过这是我们希望支持的行为的一部分。

+

确保博文草案的内容是空的

+

即使调用 add_text 并向博文增加一些内容之后,我们仍然希望 content 方法返回一个空字符串 slice,因为博文仍然处于草案状态,如示例 17-11 的第 8 行所示。现在让我们使用能满足要求的最简单的方式来实现 content 方法:总是返回一个空字符串 slice。当实现了将博文状态改为发布的能力之后将改变这一做法。但是目前博文只能是草案状态,这意味着其内容应该总是空的。示例 17-14 展示了这个占位符实现:

+

文件名:src/lib.rs

+
pub struct Post {
+    state: Option<Box<dyn State>>,
+    content: String,
+}
+
+impl Post {
+    // --snip--
+    pub fn new() -> Post {
+        Post {
+            state: Some(Box::new(Draft {})),
+            content: String::new(),
+        }
+    }
+
+    pub fn add_text(&mut self, text: &str) {
+        self.content.push_str(text);
+    }
+
+    pub fn content(&self) -> &str {
+        ""
+    }
+}
+
+trait State {}
+
+struct Draft {}
+
+impl State for Draft {}
+

列表 17-14: 增加一个 Postcontent 方法的占位实现,它总是返回一个空字符串 slice

+

通过增加这个 content 方法,示例 17-11 中直到第 8 行的代码能如期运行。

+

请求审核博文来改变其状态

+

接下来需要增加请求审核博文的功能,这应当将其状态由 Draft 改为 PendingReview。示例 17-15 展示了这个代码:

+

文件名:src/lib.rs

+
pub struct Post {
+    state: Option<Box<dyn State>>,
+    content: String,
+}
+
+impl Post {
+    // --snip--
+    pub fn new() -> Post {
+        Post {
+            state: Some(Box::new(Draft {})),
+            content: String::new(),
+        }
+    }
+
+    pub fn add_text(&mut self, text: &str) {
+        self.content.push_str(text);
+    }
+
+    pub fn content(&self) -> &str {
+        ""
+    }
+
+    pub fn request_review(&mut self) {
+        if let Some(s) = self.state.take() {
+            self.state = Some(s.request_review())
+        }
+    }
+}
+
+trait State {
+    fn request_review(self: Box<Self>) -> Box<dyn State>;
+}
+
+struct Draft {}
+
+impl State for Draft {
+    fn request_review(self: Box<Self>) -> Box<dyn State> {
+        Box::new(PendingReview {})
+    }
+}
+
+struct PendingReview {}
+
+impl State for PendingReview {
+    fn request_review(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+}
+

示例 17-15: 实现 PostState trait 的 request_review 方法

+

这里为 Post 增加一个获取 self 可变引用的公有方法 request_review。接着在 Post 的当前状态下调用内部的 request_review 方法,并且第二个 request_review 方法会消费当前的状态并返回一个新状态。

+

这里给 State trait 增加了 request_review 方法;所有实现了这个 trait 的类型现在都需要实现 request_review 方法。注意不同于使用 self&self 或者 &mut self 作为方法的第一个参数,这里使用了 self: Box<Self>。这个语法意味着该方法只可在持有这个类型的 Box 上被调用。这个语法获取了 Box<Self> 的所有权使老状态无效化,以便 Post 的状态值可转换为一个新状态。

+

为了消费老状态,request_review 方法需要获取状态值的所有权。这就是 Poststate 字段中 Option 的来历:调用 take 方法将 state 字段中的 Some 值取出并留下一个 None,因为 Rust 不允许结构体实例中存在值为空的字段。这使得我们将 state 的值移出 Post 而不是借用它。接着我们将博文的 state 值设置为这个操作的结果。

+

我们需要将 state 临时设置为 None 来获取 state 值,即老状态的所有权,而不是使用 self.state = self.state.request_review(); 这样的代码直接更新状态值。这确保了当 Post 被转换为新状态后不能再使用老 state 值。

+

Draftrequest_review 方法需要返回一个新的,装箱的 PendingReview 结构体的实例,其用来代表博文处于等待审核状态。结构体 PendingReview 同样也实现了 request_review 方法,不过它不进行任何状态转换。相反它返回自身,因为当我们请求审核一个已经处于 PendingReview 状态的博文,它应该继续保持 PendingReview 状态。

+

现在我们能看出状态模式的优势了:无论 state 是何值,Postrequest_review 方法都是一样的。每个状态只负责它自己的规则。

+

我们将继续保持 Postcontent 方法实现不变,返回一个空字符串 slice。现在我们可以拥有 PendingReview 状态和 Draft 状态的 Post 了,不过我们希望在 PendingReview 状态下 Post 也有相同的行为。现在示例 17-11 中直到 10 行的代码是可以执行的!

+

增加改变 content 行为的 approve 方法

+

approve 方法将与 request_review 方法类似:它会将 state 设置为审核通过时应处于的状态,如示例 17-16 所示。

+

文件名:src/lib.rs

+
pub struct Post {
+    state: Option<Box<dyn State>>,
+    content: String,
+}
+
+impl Post {
+    // --snip--
+    pub fn new() -> Post {
+        Post {
+            state: Some(Box::new(Draft {})),
+            content: String::new(),
+        }
+    }
+
+    pub fn add_text(&mut self, text: &str) {
+        self.content.push_str(text);
+    }
+
+    pub fn content(&self) -> &str {
+        ""
+    }
+
+    pub fn request_review(&mut self) {
+        if let Some(s) = self.state.take() {
+            self.state = Some(s.request_review())
+        }
+    }
+
+    pub fn approve(&mut self) {
+        if let Some(s) = self.state.take() {
+            self.state = Some(s.approve())
+        }
+    }
+}
+
+trait State {
+    fn request_review(self: Box<Self>) -> Box<dyn State>;
+    fn approve(self: Box<Self>) -> Box<dyn State>;
+}
+
+struct Draft {}
+
+impl State for Draft {
+    // --snip--
+    fn request_review(self: Box<Self>) -> Box<dyn State> {
+        Box::new(PendingReview {})
+    }
+
+    fn approve(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+}
+
+struct PendingReview {}
+
+impl State for PendingReview {
+    // --snip--
+    fn request_review(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+
+    fn approve(self: Box<Self>) -> Box<dyn State> {
+        Box::new(Published {})
+    }
+}
+
+struct Published {}
+
+impl State for Published {
+    fn request_review(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+
+    fn approve(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+}
+

示例 17-16: 为 PostState trait 实现 approve 方法

+

这里为 State trait 增加了 approve 方法,并新增了一个实现了 State 的结构体,Published 状态。

+

类似于 PendingReviewrequest_review 的工作方式,如果对 Draft 调用 approve 方法,并没有任何效果,因为它会返回 self。当对 PendingReview 调用 approve 时,它返回一个新的、装箱的 Published 结构体的实例。Published 结构体实现了 State trait,同时对于 request_reviewapprove 两方法来说,它返回自身,因为在这两种情况博文应该保持 Published 状态。

+

现在需要更新 Postcontent 方法。我们希望 content 根据 Post 的当前状态返回值,所以需要 Post 代理一个定义于 state 上的 content 方法,如实例 17-17 所示:

+

文件名:src/lib.rs

+
pub struct Post {
+    state: Option<Box<dyn State>>,
+    content: String,
+}
+
+impl Post {
+    // --snip--
+    pub fn new() -> Post {
+        Post {
+            state: Some(Box::new(Draft {})),
+            content: String::new(),
+        }
+    }
+
+    pub fn add_text(&mut self, text: &str) {
+        self.content.push_str(text);
+    }
+
+    pub fn content(&self) -> &str {
+        self.state.as_ref().unwrap().content(self)
+    }
+    // --snip--
+
+    pub fn request_review(&mut self) {
+        if let Some(s) = self.state.take() {
+            self.state = Some(s.request_review())
+        }
+    }
+
+    pub fn approve(&mut self) {
+        if let Some(s) = self.state.take() {
+            self.state = Some(s.approve())
+        }
+    }
+}
+
+trait State {
+    fn request_review(self: Box<Self>) -> Box<dyn State>;
+    fn approve(self: Box<Self>) -> Box<dyn State>;
+}
+
+struct Draft {}
+
+impl State for Draft {
+    fn request_review(self: Box<Self>) -> Box<dyn State> {
+        Box::new(PendingReview {})
+    }
+
+    fn approve(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+}
+
+struct PendingReview {}
+
+impl State for PendingReview {
+    fn request_review(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+
+    fn approve(self: Box<Self>) -> Box<dyn State> {
+        Box::new(Published {})
+    }
+}
+
+struct Published {}
+
+impl State for Published {
+    fn request_review(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+
+    fn approve(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+}
+

示例 17-17: 更新 Postcontent 方法来委托调用 Statecontent 方法

+

因为目标是将所有像这样的规则保持在实现了 State 的结构体中,我们将调用 state 中的值的 content 方法并传递博文实例(也就是 self)作为参数。接着返回 state 值的 content 方法的返回值。

+

这里调用 Optionas_ref 方法是因为需要 Option 中值的引用而不是获取其所有权。因为 state 是一个 Option<Box<dyn State>>,调用 as_ref 会返回一个 Option<&Box<dyn State>>。如果不调用 as_ref,将会得到一个错误,因为不能将 state 移动出借用的 &self 函数参数。

+

接着调用 unwrap 方法,这里我们知道它永远也不会 panic,因为 Post 的所有方法都确保在它们返回时 state 会有一个 Some 值。这就是一个第十二章 “当我们比编译器知道更多的情况” 部分讨论过的我们知道 None 是不可能的而编译器却不能理解的情况。

+

接着我们就有了一个 &Box<dyn State>,当调用其 content 时,Deref 强制转换会作用于 &Box ,这样最终会调用实现了 State trait 的类型的 content 方法。这意味着需要为 State trait 定义增加 content,这也是放置根据所处状态返回什么内容的逻辑的地方,如示例 17-18 所示:

+

文件名:src/lib.rs

+
pub struct Post {
+    state: Option<Box<dyn State>>,
+    content: String,
+}
+
+impl Post {
+    pub fn new() -> Post {
+        Post {
+            state: Some(Box::new(Draft {})),
+            content: String::new(),
+        }
+    }
+
+    pub fn add_text(&mut self, text: &str) {
+        self.content.push_str(text);
+    }
+
+    pub fn content(&self) -> &str {
+        self.state.as_ref().unwrap().content(self)
+    }
+
+    pub fn request_review(&mut self) {
+        if let Some(s) = self.state.take() {
+            self.state = Some(s.request_review())
+        }
+    }
+
+    pub fn approve(&mut self) {
+        if let Some(s) = self.state.take() {
+            self.state = Some(s.approve())
+        }
+    }
+}
+
+trait State {
+    // --snip--
+    fn request_review(self: Box<Self>) -> Box<dyn State>;
+    fn approve(self: Box<Self>) -> Box<dyn State>;
+
+    fn content<'a>(&self, post: &'a Post) -> &'a str {
+        ""
+    }
+}
+
+// --snip--
+
+struct Draft {}
+
+impl State for Draft {
+    fn request_review(self: Box<Self>) -> Box<dyn State> {
+        Box::new(PendingReview {})
+    }
+
+    fn approve(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+}
+
+struct PendingReview {}
+
+impl State for PendingReview {
+    fn request_review(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+
+    fn approve(self: Box<Self>) -> Box<dyn State> {
+        Box::new(Published {})
+    }
+}
+
+struct Published {}
+
+impl State for Published {
+    // --snip--
+    fn request_review(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+
+    fn approve(self: Box<Self>) -> Box<dyn State> {
+        self
+    }
+
+    fn content<'a>(&self, post: &'a Post) -> &'a str {
+        &post.content
+    }
+}
+

示例 17-18: 为 State trait 增加 content 方法

+

这里增加了一个 content 方法的默认实现来返回一个空字符串 slice。这意味着无需为 DraftPendingReview 结构体实现 content 了。Published 结构体会覆盖 content 方法并会返回 post.content 的值。

+

注意这个方法需要生命周期注解,如第十章所讨论的。这里获取 post 的引用作为参数,并返回 post 一部分的引用,所以返回的引用的生命周期与 post 参数相关。

+

现在示例完成了 —— 现在示例 17-11 中所有的代码都能工作!我们通过发布博文工作流的规则实现了状态模式。围绕这些规则的逻辑都存在于状态对象中而不是分散在 Post 之中。

+
+

为什么不用枚举?

+

你可能会好奇为什么不用包含不同可能的博文状态的 enum 作为变量。这确实是一个可能的方案,尝试实现并对比最终结果来看看哪一种更适合你!使用枚举的一个缺点是每一个检查枚举值的地方都需要一个 match 表达式或类似的代码来处理所有可能的成员。这相比 trait 对象模式可能显得更重复。

+
+

状态模式的权衡取舍

+

我们展示了 Rust 是能够实现面向对象的状态模式的,以便能根据博文所处的状态来封装不同类型的行为。Post 的方法并不知道这些不同类型的行为。通过这种组织代码的方式,要找到所有已发布博文的不同行为只需查看一处代码:PublishedState trait 的实现。

+

如果要创建一个不使用状态模式的替代实现,则可能会在 Post 的方法中,或者甚至于在 main 代码中用到 match 语句,来检查博文状态并在这里改变其行为。这意味着需要查看很多位置来理解处于发布状态的博文的所有逻辑!这在增加更多状态时会变得更糟:每一个 match 语句都会需要另一个分支。

+

对于状态模式来说,Post 的方法和使用 Post 的位置无需 match 语句,同时增加新状态只涉及到增加一个新 struct 和为其实现 trait 的方法。

+

这个实现易于扩展增加更多功能。为了体会使用此模式维护代码的简洁性,请尝试如下一些建议:

+
    +
  • 增加 reject 方法将博文的状态从 PendingReview 变回 Draft
  • +
  • 在将状态变为 Published 之前需要两次 approve 调用
  • +
  • 只允许博文处于 Draft 状态时增加文本内容。提示:让状态对象负责内容可能发生什么改变,但不负责修改 Post
  • +
+

状态模式的一个缺点是因为状态实现了状态之间的转换,一些状态会相互联系。如果在 PendingReviewPublished 之间增加另一个状态,比如 Scheduled,则不得不修改 PendingReview 中的代码来转移到 Scheduled。如果 PendingReview 无需因为新增的状态而改变就更好了,不过这意味着切换到另一种设计模式。

+

另一个缺点是我们会发现一些重复的逻辑。为了消除它们,可以尝试为 State trait 中返回 selfrequest_reviewapprove 方法增加默认实现,不过这会违反对象安全性,因为 trait 不知道 self 具体是什么。我们希望能够将 State 作为一个 trait 对象,所以需要其方法是对象安全的。

+

另一个重复是 Postrequest_reviewapprove 这两个类似的实现。它们都委托调用了 state 字段中 Option 值的同一方法,并在结果中为 state 字段设置了新值。如果 Post 中的很多方法都遵循这个模式,我们可能会考虑定义一个宏来消除重复(查看第二十章的 “宏” 部分)。

+

完全按照面向对象语言的定义实现这个模式并没有尽可能地利用 Rust 的优势。让我们看看一些代码中可以做出的修改,来将无效的状态和状态转移变为编译时错误。

+

将状态和行为编码为类型

+

我们将展示如何稍微反思状态模式来进行一系列不同的权衡取舍。不同于完全封装状态和状态转移使得外部代码对其毫不知情,我们将状态编码进不同的类型。如此,Rust 的类型检查就会将任何在只能使用发布博文的地方使用草案博文的尝试变为编译时错误。

+

让我们考虑一下示例 17-11 中 main 的第一部分:

+

文件名:src/main.rs

+
use blog::Post;
+
+fn main() {
+    let mut post = Post::new();
+
+    post.add_text("I ate a salad for lunch today");
+    assert_eq!("", post.content());
+
+    post.request_review();
+    assert_eq!("", post.content());
+
+    post.approve();
+    assert_eq!("I ate a salad for lunch today", post.content());
+}
+

我们仍然希望能够使用 Post::new 创建一个新的草案博文,并能够增加博文的内容。不过不同于存在一个草案博文时返回空字符串的 content 方法,我们将使草案博文完全没有 content 方法。这样如果尝试获取草案博文的内容,将会得到一个方法不存在的编译错误。这使得我们不可能在生产环境意外显示出草案博文的内容,因为这样的代码甚至就不能编译。示例 17-19 展示了 Post 结构体、DraftPost 结构体以及各自的方法的定义:

+

文件名:src/lib.rs

+
pub struct Post {
+    content: String,
+}
+
+pub struct DraftPost {
+    content: String,
+}
+
+impl Post {
+    pub fn new() -> DraftPost {
+        DraftPost {
+            content: String::new(),
+        }
+    }
+
+    pub fn content(&self) -> &str {
+        &self.content
+    }
+}
+
+impl DraftPost {
+    pub fn add_text(&mut self, text: &str) {
+        self.content.push_str(text);
+    }
+}
+

示例 17-19: 带有 content 方法的 Post 和没有 content 方法的 DraftPost

+

PostDraftPost 结构体都有一个私有的 content 字段来储存博文的文本。这些结构体不再有 state 字段因为我们将状态编码改为结构体类型。Post 将代表发布的博文,它有一个返回 contentcontent 方法。

+

仍然有一个 Post::new 函数,不过不同于返回 Post 实例,它返回 DraftPost 的实例。现在不可能创建一个 Post 实例,因为 content 是私有的同时没有任何函数返回 Post

+

DraftPost 上定义了一个 add_text 方法,这样就可以像之前那样向 content 增加文本,不过注意 DraftPost 并没有定义 content 方法!如此现在程序确保了所有博文都从草案开始,同时草案博文没有任何可供展示的内容。任何绕过这些限制的尝试都会产生编译错误。

+

实现状态转移为不同类型的转换

+

那么如何得到发布的博文呢?我们希望强制执行的规则是草案博文在可以发布之前必须被审核通过。等待审核状态的博文应该仍然不会显示任何内容。让我们通过增加另一个结构体 PendingReviewPost 来实现这个限制,在 DraftPost 上定义 request_review 方法来返回 PendingReviewPost,并在 PendingReviewPost 上定义 approve 方法来返回 Post,如示例 17-20 所示:

+

文件名:src/lib.rs

+
pub struct Post {
+    content: String,
+}
+
+pub struct DraftPost {
+    content: String,
+}
+
+impl Post {
+    pub fn new() -> DraftPost {
+        DraftPost {
+            content: String::new(),
+        }
+    }
+
+    pub fn content(&self) -> &str {
+        &self.content
+    }
+}
+
+impl DraftPost {
+    // --snip--
+    pub fn add_text(&mut self, text: &str) {
+        self.content.push_str(text);
+    }
+
+    pub fn request_review(self) -> PendingReviewPost {
+        PendingReviewPost {
+            content: self.content,
+        }
+    }
+}
+
+pub struct PendingReviewPost {
+    content: String,
+}
+
+impl PendingReviewPost {
+    pub fn approve(self) -> Post {
+        Post {
+            content: self.content,
+        }
+    }
+}
+

列表 17-20: PendingReviewPost 通过调用 DraftPostrequest_review 创建,approve 方法将 PendingReviewPost 变为发布的 Post

+

request_reviewapprove 方法获取 self 的所有权,因此会消费 DraftPostPendingReviewPost 实例,并分别转换为 PendingReviewPost 和发布的 Post。这样在调用 request_review 之后就不会遗留任何 DraftPost 实例,后者同理。PendingReviewPost 并没有定义 content 方法,所以尝试读取其内容会导致编译错误,DraftPost 同理。因为唯一得到定义了 content 方法的 Post 实例的途径是调用 PendingReviewPostapprove 方法,而得到 PendingReviewPost 的唯一办法是调用 DraftPostrequest_review 方法,现在我们就将发博文的工作流编码进了类型系统。

+

这也意味着不得不对 main 做出一些小的修改。因为 request_reviewapprove 返回新实例而不是修改被调用的结构体,所以我们需要增加更多的 let post = 覆盖赋值来保存返回的实例。也不再能断言草案和等待审核的博文的内容为空字符串了,我们也不再需要它们:不能编译尝试使用这些状态下博文内容的代码。更新后的 main 的代码如示例 17-21 所示:

+

文件名:src/main.rs

+
use blog::Post;
+
+fn main() {
+    let mut post = Post::new();
+
+    post.add_text("I ate a salad for lunch today");
+
+    let post = post.request_review();
+
+    let post = post.approve();
+
+    assert_eq!("I ate a salad for lunch today", post.content());
+}
+

示例 17-21: main 中使用新的博文工作流实现的修改

+

不得不修改 main 来重新赋值 post 使得这个实现不再完全遵守面向对象的状态模式:状态间的转换不再完全封装在 Post 实现中。然而,得益于类型系统和编译时类型检查,我们得到了的是无效状态是不可能的!这确保了某些特定的 bug,比如显示未发布博文的内容,将在部署到生产环境之前被发现。

+

尝试为示例 17-21 之后的 blog crate 实现这一部分开始所建议的任务来体会使用这个版本的代码是何感觉。注意在这个设计中一些需求可能已经完成了。

+

即便 Rust 能够实现面向对象设计模式,也有其他像将状态编码进类型这样的模式存在。这些模式有着不同的权衡取舍。虽然你可能非常熟悉面向对象模式,重新思考这些问题来利用 Rust 提供的像在编译时避免一些 bug 这样有益功能。在 Rust 中面向对象模式并不总是最好的解决方案,因为 Rust 拥有像所有权这样的面向对象语言所没有的功能。

+

总结

+

阅读本章后,不管你是否认为 Rust 是一个面向对象语言,现在你都见识了 trait 对象是一个 Rust 中获取部分面向对象功能的方法。动态分发可以通过牺牲少量运行时性能来为你的代码提供一些灵活性。这些灵活性可以用来实现有助于代码可维护性的面向对象模式。Rust 也有像所有权这样不同于面向对象语言的功能。面向对象模式并不总是利用 Rust 优势的最好方式,但也是可用的选项。

+

接下来,让我们看看另一个提供了多样灵活性的 Rust 功能:模式。贯穿全书的模式,我们已经和它们打过照面了,但并没有见识过它们的全部本领。让我们开始探索吧!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch19-00-patterns.html b/ch19-00-patterns.html new file mode 100644 index 000000000..54bfb17a3 --- /dev/null +++ b/ch19-00-patterns.html @@ -0,0 +1,255 @@ + + + + + + 模式与模式匹配 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

模式与模式匹配

+
+

ch19-00-patterns.md +
+commit 6fce661a0938aa0da06526e7b8f98fd7e67a222f

+
+

模式Patterns)是 Rust 中特殊的语法,它用来匹配类型中的结构,无论类型是简单还是复杂。结合使用模式和 match 表达式以及其他结构可以提供更多对程序控制流的支配权。模式由如下一些内容组合而成:

+
    +
  • 字面值
  • +
  • 解构的数组、枚举、结构体或者元组
  • +
  • 变量
  • +
  • 通配符
  • +
  • 占位符
  • +
+

一些模式的例子包括x, (a, 3)Some(Color::Red)。在模式为有效的上下文中,这些部分描述了数据的形状。接着可以用其匹配值来决定程序是否拥有正确的数据来运行特定部分的代码。

+

我们通过将一些值与模式相比较来使用它。如果模式匹配这些值,我们对值部分进行相应处理。回忆一下第六章讨论 match 表达式时像硬币分类器那样使用模式。如果数据符合这个形状,就可以使用这些命名的片段。如果不符合,与该模式相关的代码则不会运行。

+

本章是所有模式相关内容的参考。我们将涉及到使用模式的有效位置,refutableirrefutable 模式的区别,和你可能会见到的不同类型的模式语法。在最后,你将会看到如何使用模式创建强大而简洁的代码。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch19-01-all-the-places-for-patterns.html b/ch19-01-all-the-places-for-patterns.html new file mode 100644 index 000000000..cb98ac31e --- /dev/null +++ b/ch19-01-all-the-places-for-patterns.html @@ -0,0 +1,387 @@ + + + + + + 所有可能会用到模式的位置 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

所有可能会用到模式的位置

+
+

ch19-01-all-the-places-for-patterns.md +
+commit 0c2d41e2afce734825c3a12087d423e8c2f0ae53

+
+

模式出现在 Rust 的很多地方。你已经在不经意间使用了很多模式!本部分是一个所有有效模式位置的参考。

+

match 分支

+

如第六章所讨论的,一个模式常用的位置是 match 表达式的分支。在形式上 match 表达式由 match 关键字、用于匹配的值和一个或多个分支构成,这些分支包含一个模式和在值匹配分支的模式时运行的表达式:

+
match VALUE {
+    PATTERN => EXPRESSION,
+    PATTERN => EXPRESSION,
+    PATTERN => EXPRESSION,
+}
+
+

例如这是一个来自示例 6-5 中匹配变量 xOption<i32> 值的 match 表达式:

+
match x {
+    None => None,
+    Some(i) => Some(i + 1),
+}
+

这个 match 表达式中的模式为每个箭头左边的 NoneSome(i)

+

match 表达式必须是 穷尽exhaustive)的,意为 match 表达式所有可能的值都必须被考虑到。一个确保覆盖每个可能值的方法是在最后一个分支使用捕获所有的模式:比如,一个匹配任何值的名称永远也不会失败,因此可以覆盖所有匹配剩下的情况。

+

有一个特定的模式 _ 可以匹配所有情况,不过它从不绑定任何变量。这在例如希望忽略任何未指定值的情况很有用。本章之后的 “忽略模式中的值” 部分会详细介绍 _ 模式的更多细节。

+

if let 条件表达式

+

第六章讨论过了 if let 表达式,以及它是如何主要用于编写等同于只关心一个情况的 match 语句简写的。if let 可以对应一个可选的带有代码的 elseif let 中的模式不匹配时运行。

+

示例 19-1 展示了也可以组合并匹配 if letelse ifelse if let 表达式。这相比 match 表达式一次只能将一个值与模式比较提供了更多灵活性。并且 Rust 并不要求一系列 if letelse ifelse if let 分支的条件相互关联。

+

示例 19-1 中的代码展示了一系列针对不同条件的检查来决定背景颜色应该是什么。为了达到这个例子的目的,我们创建了硬编码值的变量,在真实程序中则可能由询问用户获得。

+

文件名:src/main.rs

+
fn main() {
+    let favorite_color: Option<&str> = None;
+    let is_tuesday = false;
+    let age: Result<u8, _> = "34".parse();
+
+    if let Some(color) = favorite_color {
+        println!("Using your favorite color, {color}, as the background");
+    } else if is_tuesday {
+        println!("Tuesday is green day!");
+    } else if let Ok(age) = age {
+        if age > 30 {
+            println!("Using purple as the background color");
+        } else {
+            println!("Using orange as the background color");
+        }
+    } else {
+        println!("Using blue as the background color");
+    }
+}
+

示例 19-1: 结合 if letelse ifelse if let 以及 else

+

如果用户指定了中意的颜色,将使用其作为背景颜色。如果没有指定中意的颜色且今天是星期二,背景颜色将是绿色。如果用户指定了他们的年龄字符串并能够成功将其解析为数字的话,我们将根据这个数字使用紫色或者橙色。最后,如果没有一个条件符合,背景颜色将是蓝色。

+

这个条件结构允许我们支持复杂的需求。使用这里硬编码的值,例子会打印出 Using purple as the background color

+

注意 if let 也可以像 match 分支那样引入覆盖变量:if let Ok(age) = age 引入了一个新的覆盖变量 age,它包含 Ok 成员中的值。这意味着 if age > 30 条件需要位于这个代码块内部;不能将两个条件组合为 if let Ok(age) = age && age > 30,因为我们希望与 30 进行比较的被覆盖的 age 直到大括号开始的新作用域才是有效的。

+

if let 表达式的缺点在于其穷尽性没有为编译器所检查,而 match 表达式则检查了。如果去掉最后的 else 块而遗漏处理一些情况,编译器也不会警告这类可能的逻辑错误。

+

while let 条件循环

+

一个与 if let 结构类似的是 while let 条件循环,它允许只要模式匹配就一直进行 while 循环。我们在第十七章第一次见到 while let 循环,当时我们使用它在流还在产生新值的时候保持循环。同理在示例 19-2 展示了一个 while let 循环等待跨线程发送的消息,不过在这个示例中它检查一个 Result 而不是 Option

+
fn main() {
+    let (tx, rx) = std::sync::mpsc::channel();
+    std::thread::spawn(move || {
+        for val in [1, 2, 3] {
+            tx.send(val).unwrap();
+        }
+    });
+
+    while let Ok(value) = rx.recv() {
+        println!("{value}");
+    }
+}
+

示例 19-2: 使用 while let 循环只要 rx.recv() 返回 Ok 就打印出其值

+

这个例子会打印出 1、2 和 3。当在第十六章遇到 recv 时,我们直接 unwrap 了错误,或者使用 for 循环将其视为迭代器处理。不过如示例 19-2 所示,我们也可以使用 while let,因为 recv 方法只要发送端持续产生消息它就一直返回 Ok,并在发送端断开连接后产生一个 Err

+

for 循环

+

for 循环中,模式是 for 关键字直接跟随的值,正如 for x in y 中的 x。示例 19-3 中展示了如何使用 for 循环来解构,或拆开一个元组作为 for 循环的一部分:

+
fn main() {
+    let v = vec!['a', 'b', 'c'];
+
+    for (index, value) in v.iter().enumerate() {
+        println!("{value} is at index {index}");
+    }
+}
+

列表 19-3: 在 for 循环中使用模式来解构元组

+

示例 19-3 的代码会打印出:

+
$ cargo run
+   Compiling patterns v0.1.0 (file:///projects/patterns)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.52s
+     Running `target/debug/patterns`
+a is at index 0
+b is at index 1
+c is at index 2
+
+

这里使用 enumerate 方法适配一个迭代器来产生一个值和其在迭代器中的索引,它们位于一个元组中。第一个产生的值是元组 (0, 'a')。当这个值匹配模式 (index, value)index 将会是 0 而 value 将会是 'a',并打印出第一行输出。

+

let 语句

+

在本章之前,我们只明确的讨论过通过 matchif let 使用模式,不过事实上也在别的地方使用过模式,包括 let 语句。例如,考虑一下这个直白的 let 变量赋值:

+
#![allow(unused)]
+fn main() {
+let x = 5;
+}
+

不过你可能没有发觉,每一次像这样使用 let 语句就是在使用模式!let 语句更为正式的样子如下:

+
let PATTERN = EXPRESSION;
+
+

let x = 5; 这样的语句中变量名位于 PATTERN 位置,变量名不过是形式特别朴素的模式。我们将表达式与模式比较,并为任何找到的名称赋值。所以例如 let x = 5; 的情况,x 是一个代表 “将匹配到的值绑定到变量 x” 的模式。同时因为名称 x 是整个模式,这个模式实际上等于 “将任何值绑定到变量 x,不管值是什么”。

+

为了更清楚的理解 let 的模式匹配方面的内容,考虑示例 19-4 中使用 let 和模式解构一个元组:

+
fn main() {
+    let (x, y, z) = (1, 2, 3);
+}
+

示例 19-4: 使用模式解构元组并一次创建三个变量

+

这里将一个元组与模式匹配。Rust 会比较值 (1, 2, 3) 与模式 (x, y, z) 并发现此值匹配这个模式。在这个例子中,将会把 1 绑定到 x2 绑定到 y 并将 3 绑定到 z。你可以将这个元组模式看作是将三个独立的变量模式结合在一起。

+

如果模式中元素的数量不匹配元组中元素的数量,则整个类型不匹配,并会得到一个编译时错误。例如,示例 19-5 展示了尝试用两个变量解构三个元素的元组,这是不行的:

+
fn main() {
+    let (x, y) = (1, 2, 3);
+}
+

示例 19-5: 一个错误的模式结构,其中变量的数量不符合元组中元素的数量

+

尝试编译这段代码会给出如下类型错误:

+
$ cargo run
+   Compiling patterns v0.1.0 (file:///projects/patterns)
+error[E0308]: mismatched types
+ --> src/main.rs:2:9
+  |
+2 |     let (x, y) = (1, 2, 3);
+  |         ^^^^^^   --------- this expression has type `({integer}, {integer}, {integer})`
+  |         |
+  |         expected a tuple with 3 elements, found one with 2 elements
+  |
+  = note: expected tuple `({integer}, {integer}, {integer})`
+             found tuple `(_, _)`
+
+For more information about this error, try `rustc --explain E0308`.
+error: could not compile `patterns` (bin "patterns") due to 1 previous error
+
+

为了修复这个错误,可以使用 _.. 来忽略元组中一个或多个值,如 “忽略模式中的值” 部分所示。如果问题是模式中有太多的变量,则解决方法是通过去掉变量使得变量数与元组中元素数相等。

+

函数参数

+

函数参数也可以是模式。列表 19-6 中的代码声明了一个叫做 foo 的函数,它获取一个 i32 类型的参数 x,现在这看起来应该很熟悉:

+
fn foo(x: i32) {
+    // code goes here
+}
+
+fn main() {}
+

列表 19-6: 在参数中使用模式的函数签名

+

x 部分就是一个模式!类似于之前对 let 所做的,可以在函数参数中匹配元组。列表 19-7 将传递给函数的元组拆分为值:

+

文件名:src/main.rs

+
fn print_coordinates(&(x, y): &(i32, i32)) {
+    println!("Current location: ({x}, {y})");
+}
+
+fn main() {
+    let point = (3, 5);
+    print_coordinates(&point);
+}
+

列表 19-7: 一个在参数中解构元组的函数

+

这会打印出 Current location: (3, 5)。值 &(3, 5) 会匹配模式 &(x, y),如此 x 得到了值 3,而 y得到了值 5

+

因为如第十三章所讲闭包类似于函数,也可以在闭包参数列表中使用模式。

+

现在我们见过了很多使用模式的方式了,不过模式在每个使用它的地方并不以相同的方式工作;在一些地方,模式必须是 irrefutable 的,意味着它们必须匹配所提供的任何值。在另一些情况,它们则可以是 refutable 的。接下来让我们讨论这两个概念。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch19-02-refutability.html b/ch19-02-refutability.html new file mode 100644 index 000000000..ccad8a894 --- /dev/null +++ b/ch19-02-refutability.html @@ -0,0 +1,309 @@ + + + + + + Refutability(可反驳性): 模式是否会匹配失效 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Refutability(可反驳性): 模式是否会匹配失效

+
+

ch19-02-refutability.md +
+commit 0c2d41e2afce734825c3a12087d423e8c2f0ae53

+
+

模式有两种形式:refutable(可反驳的)和 irrefutable(不可反驳的)。能匹配任何传递的可能值的模式被称为是 不可反驳的irrefutable)。一个例子就是 let x = 5; 语句中的 x,因为 x 可以匹配任何值所以不可能会失败。对某些可能的值进行匹配会失败的模式被称为是 可反驳的refutable)。一个这样的例子便是 if let Some(x) = a_value 表达式中的 Some(x);如果变量 a_value 中的值是 None 而不是 Some,那么 Some(x) 模式不能匹配。

+

函数参数、let 语句和 for 循环只能接受不可反驳的模式,因为当值不匹配时,程序无法进行有意义的操作。if letwhile let 表达式可以接受可反驳和不可反驳的模式,但编译器会对不可反驳的模式发出警告,因为根据定义它们旨在处理可能的失败:条件表达式的功能在于它能够根据成功或失败来执行不同的操作。

+

通常我们无需担心可反驳和不可反驳模式的区别,不过确实需要熟悉可反驳性的概念,这样当在错误信息中看到时就知道如何应对。遇到这些情况,根据代码行为的意图,需要修改模式或者使用模式的结构。

+

让我们看看一个尝试在 Rust 要求不可反驳模式的地方使用可反驳模式以及相反情况的例子。在示例 18-8 中,有一个 let 语句,不过模式被指定为可反驳模式 Some(x)。如你所见,这不能编译:

+
fn main() {
+    let some_option_value: Option<i32> = None;
+    let Some(x) = some_option_value;
+}
+

示例 18-8: 尝试在 let 中使用可反驳模式

+

如果 some_option_value 的值是 None,其不会成功匹配模式 Some(x),表明这个模式是可反驳的。然而,因为 let 对于 None 匹配不能产生任何合法的代码,所以 let 语句只能接受不可反驳模式。Rust 会在编译时抱怨我们尝试在要求不可反驳模式的地方使用可反驳模式:

+
$ cargo run
+   Compiling patterns v0.1.0 (file:///projects/patterns)
+error[E0005]: refutable pattern in local binding
+ --> src/main.rs:3:9
+  |
+3 |     let Some(x) = some_option_value;
+  |         ^^^^^^^ pattern `None` not covered
+  |
+  = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
+  = note: for more information, visit https://doc.rust-lang.org/book/ch19-02-refutability.html
+  = note: the matched value is of type `Option<i32>`
+help: you might want to use `let else` to handle the variant that isn't matched
+  |
+3 |     let Some(x) = some_option_value else { todo!() };
+  |                                     ++++++++++++++++
+
+For more information about this error, try `rustc --explain E0005`.
+error: could not compile `patterns` (bin "patterns") due to 1 previous error
+
+

因为我们没有覆盖(也不可能覆盖!)到模式 Some(x) 的每一个可能的值,所以 Rust 会合理地抗议。

+

为了修复在需要不可反驳模式的地方使用可反驳模式的情况,可以修改使用模式的代码:不同于使用 let,可以使用 if let。如此,如果模式不匹配,大括号中的代码将被忽略,其余代码保持有效。示例 18-9 展示了如何修复示例 18-8 中的代码。

+
fn main() {
+    let some_option_value: Option<i32> = None;
+    if let Some(x) = some_option_value {
+        println!("{x}");
+    }
+}
+

示例 18-9: 使用 if let 和一个带有可反驳模式的代码块来代替 let

+

我们给了代码一个得以继续的出路!虽然我们没办法在避免产生错误的情况下使用不可反驳模式,但这段使用可反驳模式的代码是完全有效的。如果为 if let 提供了一个总是会匹配的模式,比如示例 18-10 中的 x,编译器会给出一个警告:

+
fn main() {
+    if let x = 5 {
+        println!("{x}");
+    };
+}
+

示例 18-10: 尝试把不可反驳模式用到 if let

+

Rust 会抱怨将不可反驳模式用于 if let 是没有意义的:

+
$ cargo run
+   Compiling patterns v0.1.0 (file:///projects/patterns)
+warning: irrefutable `if let` pattern
+ --> src/main.rs:2:8
+  |
+2 |     if let x = 5 {
+  |        ^^^^^^^^^
+  |
+  = note: this pattern will always match, so the `if let` is useless
+  = help: consider replacing the `if let` with a `let`
+  = note: `#[warn(irrefutable_let_patterns)]` on by default
+
+warning: `patterns` (bin "patterns") generated 1 warning
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.39s
+     Running `target/debug/patterns`
+5
+
+

基于此,match匹配分支必须使用可反驳模式,除了最后一个分支需要使用能匹配任何剩余值的不可反驳模式。Rust 允许我们在只有一个匹配分支的match中使用不可反驳模式,不过这么做不是特别有用,并可以被更简单的 let 语句替代。

+

目前我们已经讨论了所有可以使用模式的地方,以及可反驳模式与不可反驳模式的区别,下面让我们一起去把可以用来创建模式的语法过目一遍吧。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch19-03-pattern-syntax.html b/ch19-03-pattern-syntax.html new file mode 100644 index 000000000..2205d952d --- /dev/null +++ b/ch19-03-pattern-syntax.html @@ -0,0 +1,659 @@ + + + + + + 模式语法 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

所有的模式语法

+
+

ch19-03-pattern-syntax.md +
+commit 6fce661a0938aa0da06526e7b8f98fd7e67a222f

+
+

在本节中,我们收集了模式中所有有效的语法,并讨论为什么以及何时你可能要使用这些语法。

+

匹配字面值

+

如第六章所示,可以直接匹配字面值模式。如下代码给出了一些例子:

+
fn main() {
+    let x = 1;
+
+    match x {
+        1 => println!("one"),
+        2 => println!("two"),
+        3 => println!("three"),
+        _ => println!("anything"),
+    }
+}
+

这段代码会打印 one 因为 x 的值是 1。如果希望代码获得特定的具体值,则该语法很有用。

+

匹配命名变量

+

命名变量是匹配任何值的不可反驳模式,这在之前已经使用过数次。然而当其用于 match 表达式时情况会有些复杂。因为 match 会开始一个新作用域,match 表达式中作为模式的一部分声明的变量会覆盖 match 结构之外的同名变量,与所有变量一样。在示例 18-11 中,声明了一个值为 Some(5) 的变量 x 和一个值为 10 的变量 y。接着在值 x 上创建了一个 match 表达式。观察匹配分支中的模式和结尾的 println!,并在运行此代码或进一步阅读之前推断这段代码会打印什么。

+

文件名:src/main.rs

+
fn main() {
+    let x = Some(5);
+    let y = 10;
+
+    match x {
+        Some(50) => println!("Got 50"),
+        Some(y) => println!("Matched, y = {y}"),
+        _ => println!("Default case, x = {x:?}"),
+    }
+
+    println!("at the end: x = {x:?}, y = {y}");
+}
+

示例 18-11: 一个 match 语句其中一个分支引入了覆盖变量 y

+

让我们看看当 match 语句运行的时候发生了什么。第一个匹配分支的模式并不匹配 x 中定义的值,所以代码继续执行。

+

第二个匹配分支中的模式引入了一个新变量 y,它会匹配任何 Some 中的值。因为我们在 match 表达式的新作用域中,这是一个新变量,而不是开头声明为值 10 的那个 y。这个新的 y 绑定会匹配任何 Some 中的值,在这里是 x 中的值。因此这个 y 绑定了 xSome 内部的值。这个值是 5,所以这个分支的表达式将会执行并打印出 Matched, y = 5

+

如果 x 的值是 None 而不是 Some(5),头两个分支的模式不会匹配,所以会匹配下划线。这个分支的模式中没有引入变量 x,所以此时表达式中的 x 会是外部没有被覆盖的 x。在这个假想的例子中,match 将会打印 Default case, x = None

+

一旦 match 表达式执行完毕,其作用域也就结束了,同理内部 y 的作用域也结束了。最后的 println! 会打印 at the end: x = Some(5), y = 10

+

为了创建能够比较外部 xy 的值,而不引入覆盖变量的 match 表达式,我们需要相应地使用带有条件的匹配守卫(match guard)。我们稍后将在 “匹配守卫提供的额外条件” 这一小节讨论匹配守卫。

+

多个模式

+

match 表达式中,可以使用 | 语法匹配多个模式,它代表 or)运算符模式。例如,如下代码将 x 的值与匹配分支相比较,第一个分支有 选项,意味着如果 x 的值匹配此分支的任一个值,它就会运行:

+
fn main() {
+    let x = 1;
+
+    match x {
+        1 | 2 => println!("one or two"),
+        3 => println!("three"),
+        _ => println!("anything"),
+    }
+}
+

上面的代码会打印 one or two

+

通过 ..= 匹配值的范围

+

..= 语法允许你匹配一个闭区间范围内的值。在如下代码中,当模式匹配任何在给定范围内的值时,该分支会执行:

+
fn main() {
+    let x = 5;
+
+    match x {
+        1..=5 => println!("one through five"),
+        _ => println!("something else"),
+    }
+}
+

如果 x 是 1、2、3、4 或 5,第一个分支就会匹配。这个语法在匹配多个值时相比使用 | 运算符来表达相同的意思更为方便;如果使用 | 则不得不指定 1 | 2 | 3 | 4 | 5。相反指定范围就简短的多,特别是在希望匹配比如从 1 到 1000 的数字的时候!

+

编译器会在编译时检查范围不为空,而 char 和数字值是 Rust 仅有的可以判断范围是否为空的类型,所以范围只允许用于数字或 char 值。

+

如下是一个使用 char 类型值范围的例子:

+
fn main() {
+    let x = 'c';
+
+    match x {
+        'a'..='j' => println!("early ASCII letter"),
+        'k'..='z' => println!("late ASCII letter"),
+        _ => println!("something else"),
+    }
+}
+

Rust 知道 'c' 位于第一个模式的范围内,并会打印出 early ASCII letter

+

解构并分解值

+

也可以使用模式来解构结构体、枚举和元组,以便使用这些值的不同部分。让我们来分别看一看。

+

解构结构体

+

示例 18-12 展示带有两个字段 xy 的结构体 Point,可以通过带有模式的 let 语句将其分解:

+

文件名:src/main.rs

+
struct Point {
+    x: i32,
+    y: i32,
+}
+
+fn main() {
+    let p = Point { x: 0, y: 7 };
+
+    let Point { x: a, y: b } = p;
+    assert_eq!(0, a);
+    assert_eq!(7, b);
+}
+

示例 18-12: 解构一个结构体的字段为单独的变量

+

这段代码创建了变量 ab 来匹配结构体 p 中的 xy 字段。这个例子展示了模式中的变量名不必与结构体中的字段名一致。不过通常希望变量名与字段名一致以便于理解变量来自于哪些字段。因为变量名匹配字段名是常见的,同时因为 let Point { x: x, y: y } = p; 包含了很多重复,所以对于匹配结构体字段的模式存在简写:只需列出结构体字段的名称,则模式创建的变量会有相同的名称。示例 18-13 展示了与示例 18-12 有着相同行为的代码,不过 let 模式创建的变量为 xy 而不是 ab

+

文件名:src/main.rs

+
struct Point {
+    x: i32,
+    y: i32,
+}
+
+fn main() {
+    let p = Point { x: 0, y: 7 };
+
+    let Point { x, y } = p;
+    assert_eq!(0, x);
+    assert_eq!(7, y);
+}
+

示例 18-13: 使用结构体字段简写来解构结构体字段

+

这段代码创建了变量 xy,与变量 p 中的 xy 相匹配。其结果是变量 xy 包含结构体 p 中的值。

+

也可以使用字面值作为结构体模式的一部分进行解构,而不是为所有的字段创建变量。这允许我们测试一些字段为特定值的同时创建其他字段的变量。

+

示例 18-14 展示了一个 match 语句将 Point 值分成了三种情况:直接位于 x 轴上(此时 y = 0 为真)、位于 y 轴上(x = 0)或不在任何轴上的点。

+

文件名:src/main.rs

+
struct Point {
+    x: i32,
+    y: i32,
+}
+
+fn main() {
+    let p = Point { x: 0, y: 7 };
+
+    match p {
+        Point { x, y: 0 } => println!("On the x axis at {x}"),
+        Point { x: 0, y } => println!("On the y axis at {y}"),
+        Point { x, y } => {
+            println!("On neither axis: ({x}, {y})");
+        }
+    }
+}
+

示例 18-14: 解构和匹配模式中的字面值

+

第一个分支通过指定字段 y 匹配字面值 0 来匹配任何位于 x 轴上的点。此模式仍然创建了变量 x 以便在分支的代码中使用。

+

类似的,第二个分支通过指定字段 x 匹配字面值 0 来匹配任何位于 y 轴上的点,并为字段 y 创建了变量 y。第三个分支没有指定任何字面值,所以其会匹配任何其他的 Point 并为 xy 两个字段创建变量。

+

在这个例子中,值 p 因为其 x 包含 0 而匹配第二个分支,因此会打印出 On the y axis at 7

+

记住 match 表达式一旦找到一个匹配的模式就会停止检查其它分支,所以即使 Point { x: 0, y: 0}x 轴上也在 y 轴上,这些代码也只会打印 On the x axis at 0

+

解构枚举

+

本书之前曾经解构过枚举(例如第六章示例 6-5),不过当时没有明确提到解构枚举的模式需要对应枚举所定义的储存数据的方式。让我们以示例 6-2 中的 Message 枚举为例,编写一个 match 使用模式解构每一个内部值,如示例 18-15 所示:

+

文件名:src/main.rs

+
enum Message {
+    Quit,
+    Move { x: i32, y: i32 },
+    Write(String),
+    ChangeColor(i32, i32, i32),
+}
+
+fn main() {
+    let msg = Message::ChangeColor(0, 160, 255);
+
+    match msg {
+        Message::Quit => {
+            println!("The Quit variant has no data to destructure.");
+        }
+        Message::Move { x, y } => {
+            println!("Move in the x direction {x} and in the y direction {y}");
+        }
+        Message::Write(text) => {
+            println!("Text message: {text}");
+        }
+        Message::ChangeColor(r, g, b) => {
+            println!("Change the color to red {r}, green {g}, and blue {b}")
+        }
+    }
+}
+

示例 18-15: 解构包含不同类型值成员的枚举

+

这段代码会打印出 Change the color to red 0, green 160, and blue 255。尝试改变 msg 的值来观察其他分支代码的运行。

+

对于像 Message::Quit 这样没有任何数据的枚举成员,不能进一步解构其值。只能匹配其字面值 Message::Quit,因此模式中没有任何变量。

+

对于像 Message::Move 这样的类结构体枚举成员,可以采用类似于匹配结构体的模式。在成员名称后,使用大括号并列出字段变量以便将其分解以供此分支的代码使用。这里使用了示例 18-13 所展示的简写。

+

对于像 Message::Write 这样的包含一个元素,以及像 Message::ChangeColor 这样包含三个元素的类元组枚举成员,其模式则类似于用于解构元组的模式。模式中变量的数量必须与成员中元素的数量一致。

+

解构嵌套的结构体和枚举

+

目前为止,所有的例子都只匹配了深度为一级的结构体或枚举,不过当然也可以匹配嵌套的项!例如,我们可以重构列表 18-15 的代码在 ChangeColor 消息中同时支持 RGB 和 HSV 色彩模式,如示例 18-16 所示:

+
enum Color {
+    Rgb(i32, i32, i32),
+    Hsv(i32, i32, i32),
+}
+
+enum Message {
+    Quit,
+    Move { x: i32, y: i32 },
+    Write(String),
+    ChangeColor(Color),
+}
+
+fn main() {
+    let msg = Message::ChangeColor(Color::Hsv(0, 160, 255));
+
+    match msg {
+        Message::ChangeColor(Color::Rgb(r, g, b)) => {
+            println!("Change color to red {r}, green {g}, and blue {b}");
+        }
+        Message::ChangeColor(Color::Hsv(h, s, v)) => {
+            println!("Change color to hue {h}, saturation {s}, value {v}")
+        }
+        _ => (),
+    }
+}
+

示例 18-16: 匹配嵌套的枚举

+

match 表达式第一个分支的模式匹配一个包含 Color::Rgb 枚举成员的 Message::ChangeColor 枚举成员,然后模式绑定了 3 个内部的 i32 值。第二个分支的模式也匹配一个 Message::ChangeColor 枚举成员,但是其内部的枚举会匹配 Color::Hsv 枚举成员。我们可以在一个 match 表达式中指定这些复杂条件,即使会涉及到两个枚举。

+

解构结构体和元组

+

甚至可以用复杂的方式来混合、匹配和嵌套解构模式。如下是一个复杂结构体的例子,其中结构体和元组嵌套在元组中,并将所有的原始类型解构出来:

+
fn main() {
+    struct Point {
+        x: i32,
+        y: i32,
+    }
+
+    let ((feet, inches), Point { x, y }) = ((3, 10), Point { x: 3, y: -10 });
+}
+

这将复杂的类型分解成部分组件以便可以单独使用我们感兴趣的值。

+

通过模式解构是一个方便利用部分值片段的手段,比如结构体中每个单独字段的值。

+

忽略模式中的值

+

有时忽略模式中的一些值是有用的,比如 match 中最后捕获全部情况的分支实际上没有做任何事,但是它确实对所有剩余情况负责。有一些简单的方法可以忽略模式中全部或部分值:使用 _ 模式(我们已经见过了),在另一个模式中使用 _ 模式,使用一个以下划线开始的名称,或者使用 .. 忽略所剩部分的值。让我们来分别探索如何以及为什么要这么做。

+

使用 _ 忽略整个值

+

我们已经使用过下划线作为匹配但不绑定任何值的通配符模式了。虽然这作为 match 表达式最后的分支特别有用,也可以将其用于任意模式,包括函数参数中,如示例 18-17 所示:

+

文件名:src/main.rs

+
fn foo(_: i32, y: i32) {
+    println!("This code only uses the y parameter: {y}");
+}
+
+fn main() {
+    foo(3, 4);
+}
+

示例 18-17: 在函数签名中使用 _

+

这段代码会完全忽略作为第一个参数传递的值 3,并会打印出 This code only uses the y parameter: 4

+

大部分情况当你不再需要特定函数参数时,最好修改签名不再包含无用的参数。在一些情况下忽略函数参数会变得特别有用,比如实现 trait 时,当你需要特定类型签名但是函数实现并不需要某个参数时。这样可以避免一个存在未使用的函数参数的编译警告,就跟使用命名参数一样。

+

使用嵌套的 _ 忽略部分值

+

也可以在一个模式内部使用_ 忽略部分值,例如,当只需要测试部分值但在期望运行的代码中没有用到其他部分时。示例 18-18 展示了负责管理设置值的代码。业务需求是用户不允许覆盖现有的自定义设置,但是可以取消设置,也可以在当前未设置时为其提供设置。

+
fn main() {
+    let mut setting_value = Some(5);
+    let new_setting_value = Some(10);
+
+    match (setting_value, new_setting_value) {
+        (Some(_), Some(_)) => {
+            println!("Can't overwrite an existing customized value");
+        }
+        _ => {
+            setting_value = new_setting_value;
+        }
+    }
+
+    println!("setting is {setting_value:?}");
+}
+

示例 18-18: 当不需要 Some 中的值时在模式内使用下划线来匹配 Some 成员

+

这段代码会打印出 Can't overwrite an existing customized value 接着是 setting is Some(5)。在第一个匹配分支,我们不需要匹配或使用任一个 Some 成员中的值;重要的部分是需要测试 setting_valuenew_setting_value 都为 Some 成员的情况。在这种情况,我们打印出为何不改变 setting_value,并且不会改变它。

+

对于所有其他情况(setting_valuenew_setting_value 任一为 None),这由第二个分支的 _ 模式体现,这时确实希望允许 new_setting_value 变为 setting_value

+

也可以在一个模式中的多处使用下划线来忽略特定值,如示例 18-19 所示,这里忽略了一个五元元组中的第二和第四个值:

+
fn main() {
+    let numbers = (2, 4, 8, 16, 32);
+
+    match numbers {
+        (first, _, third, _, fifth) => {
+            println!("Some numbers: {first}, {third}, {fifth}")
+        }
+    }
+}
+

示例 18-19: 忽略元组的多个部分

+

这会打印出 Some numbers: 2, 8, 32,值 4 和 16 会被忽略。

+

通过在名字前以一个 _ 开头来忽略未使用的变量

+

如果你创建了一个变量却不在任何地方使用它,Rust 通常会给你一个警告,因为未使用的变量可能会是个 bug。但是有时创建一个还未使用的变量是有用的,比如你正在设计原型或刚刚开始一个项目。这时你希望告诉 Rust 不要警告未使用的变量,为此可以用下划线作为变量名的开头。示例 18-20 中创建了两个未使用变量,不过当编译代码时只会得到其中一个的警告:

+

文件名:src/main.rs

+
fn main() {
+    let _x = 5;
+    let y = 10;
+}
+

示例 18-20: 以下划线开始变量名以便去掉未使用变量警告

+

这里得到了警告说未使用变量 y,不过没有警告说使用 _x

+

注意,只使用 _ 和使用以下划线开头的名称有些微妙的不同:比如 _x 仍会将值绑定到变量,而 _ 则完全不会绑定。为了展示这个区别的意义,示例 18-21 会产生一个错误。

+
fn main() {
+    let s = Some(String::from("Hello!"));
+
+    if let Some(_s) = s {
+        println!("found a string");
+    }
+
+    println!("{s:?}");
+}
+

示例 18-21: 以下划线开头的未使用变量仍然会绑定值,它可能会获取值的所有权

+

我们会得到一个错误,因为 s 的值仍然会移动进 _s,并阻止我们再次使用 s。然而只使用下划线本身,并不会绑定值。示例 18-22 能够无错编译,因为 s 没有被移动进 _

+
fn main() {
+    let s = Some(String::from("Hello!"));
+
+    if let Some(_) = s {
+        println!("found a string");
+    }
+
+    println!("{s:?}");
+}
+

示例 18-22: 单独使用下划线不会绑定值

+

上面的代码能很好的运行;因为没有把 s 绑定到任何变量;它没有被移动。

+

.. 忽略剩余值

+

对于有多个部分的值,可以使用 .. 语法来只使用特定部分并忽略其它值,同时避免不得不每一个忽略值列出下划线。.. 模式会忽略模式中剩余的任何没有显式匹配的值部分。在示例 18-23 中,有一个 Point 结构体存放了三维空间中的坐标。在 match 表达式中,我们希望只操作 x 坐标并忽略 yz 字段的值:

+
fn main() {
+    struct Point {
+        x: i32,
+        y: i32,
+        z: i32,
+    }
+
+    let origin = Point { x: 0, y: 0, z: 0 };
+
+    match origin {
+        Point { x, .. } => println!("x is {x}"),
+    }
+}
+

示例 18-23: 通过使用 .. 来忽略 Point 中除 x 以外的字段

+

这里列出了 x 值,接着仅仅包含了 .. 模式。这比不得不列出 y: _z: _ 要来得简单,特别是在处理有很多字段的结构体,但只涉及一到两个字段时的情形。

+

.. 会扩展为所需要的值的数量。示例 18-24 展示了元组中 .. 的应用:

+

文件名:src/main.rs

+
fn main() {
+    let numbers = (2, 4, 8, 16, 32);
+
+    match numbers {
+        (first, .., last) => {
+            println!("Some numbers: {first}, {last}");
+        }
+    }
+}
+

示例 18-24: 只匹配元组中的第一个和最后一个值并忽略掉所有其它值

+

这里用 firstlast 来匹配第一个和最后一个值。.. 将匹配并忽略中间的所有值。

+

然而使用 .. 必须是无歧义的。如果期望匹配和忽略的值是不明确的,Rust 会报错。示例 18-25 展示了一个带有歧义的 .. 例子,因此其不能编译:

+

文件名:src/main.rs

+
fn main() {
+    let numbers = (2, 4, 8, 16, 32);
+
+    match numbers {
+        (.., second, ..) => {
+            println!("Some numbers: {second}")
+        },
+    }
+}
+

示例 18-25: 尝试以有歧义的方式运用 ..

+

如果编译上面的例子,会得到下面的错误:

+
$ cargo run
+   Compiling patterns v0.1.0 (file:///projects/patterns)
+error: `..` can only be used once per tuple pattern
+ --> src/main.rs:5:22
+  |
+5 |         (.., second, ..) => {
+  |          --          ^^ can only be used once per tuple pattern
+  |          |
+  |          previously used here
+
+error: could not compile `patterns` (bin "patterns") due to 1 previous error
+
+

Rust 不可能决定在元组中匹配 second 值之前应该忽略多少个值,以及在之后忽略多少个值。这段代码可能表明我们意在忽略 2,绑定 second4,接着忽略 81632;抑或是意在忽略 24,绑定 second8,接着忽略 1632,以此类推。变量名 second 对于 Rust 来说并没有任何特殊意义,所以会得到编译错误,因为在这两个地方使用 .. 是有歧义的。

+

匹配守卫提供的额外条件

+

匹配守卫match guard)是一个指定于 match 分支模式之后的额外 if 条件,它也必须被满足才能选择此分支。匹配守卫用于表达比单独的模式所能允许的更为复杂的情况。

+

这个条件可以使用模式中创建的变量。示例 18-26 展示了一个 match,其中第一个分支有模式 Some(x) 还有匹配守卫 if x % 2 == 0 (当 x 是偶数的时候为真):

+
fn main() {
+    let num = Some(4);
+
+    match num {
+        Some(x) if x % 2 == 0 => println!("The number {x} is even"),
+        Some(x) => println!("The number {x} is odd"),
+        None => (),
+    }
+}
+

示例 18-26: 在模式中加入匹配守卫

+

上例会打印出 The number 4 is even。当 num 与模式中第一个分支比较时,因为 Some(4) 匹配 Some(x) 所以可以匹配。接着匹配守卫检查 x 除以 2 的余数是否等于 0,因为它等于 0,所以第一个分支被选择。

+

相反如果 numSome(5),因为 5 除以 2 的余数是 1 不等于 0 所以第一个分支的匹配守卫为假。接着 Rust 会前往第二个分支,这次匹配因为它没有匹配守卫所以会匹配任何 Some 成员。

+

无法在模式中表达类似 if x % 2 == 0 的条件,所以通过匹配守卫提供了表达类似逻辑的能力。这种替代表达方式的缺点是,编译器不会尝试为包含匹配守卫的模式检查穷尽性。

+

在示例 18-11 中,我们提到可以使用匹配守卫来解决模式中变量覆盖的问题,那里 match 表达式的模式中新建了一个变量而不是使用 match 之外的同名变量。新变量意味着不能够测试外部变量的值。示例 18-27 展示了如何使用匹配守卫修复这个问题。

+

文件名:src/main.rs

+
fn main() {
+    let x = Some(5);
+    let y = 10;
+
+    match x {
+        Some(50) => println!("Got 50"),
+        Some(n) if n == y => println!("Matched, n = {n}"),
+        _ => println!("Default case, x = {x:?}"),
+    }
+
+    println!("at the end: x = {x:?}, y = {y}");
+}
+

示例 18-27: 使用匹配守卫来测试与外部变量的相等性

+

现在这会打印出 Default case, x = Some(5)。现在第二个匹配分支中的模式不会引入一个覆盖外部 y 的新变量 y,这意味着可以在匹配守卫中使用外部的 y。相比指定会覆盖外部 y 的模式 Some(y),这里指定为 Some(n)。此新建的变量 n 并没有覆盖任何值,因为 match 外部没有变量 n

+

匹配守卫 if n == y 并不是一个模式所以没有引入新变量。这个 y 正是 外部的 y 而不是新的覆盖变量 y,这样就可以通过比较 ny 来表达寻找一个与外部 y 相同的值的概念了。

+

也可以在匹配守卫中使用 运算符 | 来指定多个模式,同时匹配守卫的条件会作用于所有的模式。示例 18-28 展示了结合匹配守卫与使用了 | 的模式的优先级。这个例子中重要的部分是匹配守卫 if y 作用于 45 6,即使这看起来好像 if y 只作用于 6

+
fn main() {
+    let x = 4;
+    let y = false;
+
+    match x {
+        4 | 5 | 6 if y => println!("yes"),
+        _ => println!("no"),
+    }
+}
+

示例 18-28: 结合多个模式与匹配守卫

+

这个匹配条件表明此分支值匹配 x 值为 456 同时 ytrue 的情况。运行这段代码时会发生的是第一个分支的模式因 x4 而匹配,不过匹配守卫 if y 为假,所以第一个分支不会被选择。代码移动到第二个分支,这会匹配,此程序会打印出 no。这是因为 if 条件作用于整个 4 | 5 | 6 模式,而不仅是最后的值 6。换句话说,匹配守卫与模式的优先级关系看起来像这样:

+
(4 | 5 | 6) if y => ...
+
+

而不是:

+
4 | 5 | (6 if y) => ...
+
+

可以通过运行代码时的情况看出这一点:如果匹配守卫只作用于由 | 运算符指定的值列表的最后一个值,这个分支就会匹配且程序会打印出 yes

+

@ 绑定

+

at 运算符(@)允许我们在创建一个存放值的变量的同时测试其值是否匹配模式。示例 18-29 展示了一个例子,这里我们希望测试 Message::Helloid 字段是否位于 3..=7 范围内,同时也希望能将其值绑定到 id_variable 变量中以便此分支相关联的代码可以使用它。可以将 id_variable 命名为 id,与字段同名,不过出于示例的目的这里选择了不同的名称。

+
fn main() {
+    enum Message {
+        Hello { id: i32 },
+    }
+
+    let msg = Message::Hello { id: 5 };
+
+    match msg {
+        Message::Hello {
+            id: id_variable @ 3..=7,
+        } => println!("Found an id in range: {id_variable}"),
+        Message::Hello { id: 10..=12 } => {
+            println!("Found an id in another range")
+        }
+        Message::Hello { id } => println!("Found some other id: {id}"),
+    }
+}
+

示例 18-29: 使用 @ 在模式中绑定值的同时测试它

+

上例会打印出 Found an id in range: 5。通过在 3..=7 之前指定 id_variable @,我们捕获了任何匹配此范围的值并同时测试其值匹配这个范围模式。

+

第二个分支只在模式中指定了一个范围,分支相关代码没有一个包含 id 字段实际值的变量。id 字段的值可以是 10、11 或 12,不过这个模式的代码并不知情也不能使用 id 字段中的值,因为没有将 id 值保存进一个变量。

+

最后一个分支指定了一个没有范围的变量,此时确实拥有可以用于分支代码的变量 id,因为这里使用了结构体字段简写语法。不过此分支中没有像头两个分支那样对 id 字段的值进行测试:任何值都会匹配此分支。

+

使用 @ 可以在一个模式中同时测试和保存变量值。

+

总结

+

模式是 Rust 中一个很有用的功能,它有助于我们区分不同类型的数据。当用于 match 语句时,Rust 确保模式会包含每一个可能的值,否则程序将不能编译。let 语句和函数参数的模式使得这些结构更强大,可以在将值解构为更小部分的同时为变量赋值。可以创建简单或复杂的模式来满足我们的要求。

+

接下来,在本书倒数第二章中,我们将介绍一些 Rust 众多功能中较为高级的部分。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch20-00-advanced-features.html b/ch20-00-advanced-features.html new file mode 100644 index 000000000..39de68320 --- /dev/null +++ b/ch20-00-advanced-features.html @@ -0,0 +1,254 @@ + + + + + + 高级特征 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

高级特征

+
+

ch20-00-advanced-features.md +
+commit a8536189d5f1ba2f0b1187bfae787c0d89e2871c

+
+

现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十一章开始另一个新项目之前,让我们聊聊一些总有一天你会遇上的部分内容。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下很有用处。虽然很少会碰到它们,我们希望确保你了解 Rust 提供的所有功能。

+

本章将涉及如下内容:

+
    +
  • 不安全 Rust:用于当需要舍弃 Rust 的某些保证并负责手动维持这些保证
  • +
  • 高级 trait:与 trait 相关的关联类型,默认类型参数,完全限定语法(fully qualified syntax),超(父)trait(supertraits)和 newtype 模式
  • +
  • 高级类型:关于 newtype 模式的更多内容,类型别名,never 类型和动态大小类型
  • +
  • 高级函数和闭包:函数指针和返回闭包
  • +
  • 宏:定义在编译时定义更多代码的方式
  • +
+

对所有人而言,这都是一个介绍 Rust 迷人特性的宝典!让我们翻开它吧!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch20-01-unsafe-rust.html b/ch20-01-unsafe-rust.html new file mode 100644 index 000000000..044a13b64 --- /dev/null +++ b/ch20-01-unsafe-rust.html @@ -0,0 +1,495 @@ + + + + + + 不安全的 Rust - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

不安全 Rust

+
+

ch20-01-unsafe-rust.md +
+commit 057b0d338229b87d06be772346ea0b643bdecdc5

+
+

目前为止讨论过的代码都有 Rust 在编译时会强制执行的内存安全保证。然而,Rust 还隐藏有第二种语言,它不会强制执行这类内存安全保证:这被称为 不安全 Rustunsafe Rust)。它与常规 Rust 代码无异,但是会提供额外的超能力。

+

尽管代码可能没问题,但如果 Rust 编译器没有足够的信息可以确定,它将拒绝代码。

+

不安全 Rust 之所以存在,是因为静态分析本质上是保守的。当编译器尝试确定一段代码是否支持某个保证时,拒绝一些合法的程序比接受无效的程序要好一些。这必然意味着有时代码 可能 是合法的,但如果 Rust 编译器没有足够的信息来确定,它将拒绝该代码。在这种情况下,可以使用不安全代码告诉编译器,“相信我,我知道我在干什么。” 不过千万注意,使用不安全 Rust 风险自担:如果不安全代码出错了,比如解引用空指针,可能会导致不安全的内存使用。

+

另一个 Rust 存在不安全一面的原因是:底层计算机硬件固有的不安全性。如果 Rust 不允许进行不安全操作,那么有些任务则根本完成不了。Rust 需要能够进行像直接与操作系统交互,甚至于编写你自己的操作系统这样的底层系统编程!这也是 Rust 语言的目标之一。让我们看看不安全 Rust 能做什么,和怎么做。

+

不安全的超能力

+

可以通过 unsafe 关键字来切换到不安全 Rust,接着可以开启一个新的存放不安全代码的块。这里有五类可以在不安全 Rust 中进行而不能用于安全 Rust 的操作,它们称之为 “不安全的超能力。(unsafe superpowers)” 这些超能力是:

+
    +
  • 解引用裸指针
  • +
  • 调用不安全的函数或方法
  • +
  • 访问或修改可变静态变量
  • +
  • 实现不安全 trait
  • +
  • 访问 union 的字段
  • +
+

有一点很重要,unsafe 并不会关闭借用检查器或禁用任何其他 Rust 安全检查:如果在不安全代码中使用引用,它仍会被检查。unsafe 关键字只是提供了那五个不会被编译器检查内存安全的功能。你仍然能在不安全块中获得某种程度的安全。

+

再者,unsafe 不意味着块中的代码就一定是危险的或者必然导致内存安全问题:其意图在于作为程序员你将会确保 unsafe 块中的代码以有效的方式访问内存。

+

人是会犯错误的,错误总会发生,不过通过要求这五类操作必须位于标记为 unsafe 的块中,就能够知道任何与内存安全相关的错误必定位于 unsafe 块内。保持 unsafe 块尽可能小,如此当之后调查内存 bug 时就会感谢你自己了。

+

为了尽可能隔离不安全代码,将不安全代码封装进一个安全的抽象并提供安全 API 是一个好主意,当我们学习不安全函数和方法时会讨论到。标准库的一部分被实现为在被评审过的不安全代码之上的安全抽象。这个技术防止了 unsafe 泄露到所有你或者用户希望使用由 unsafe 代码实现的功能的地方,因为使用其安全抽象是安全的。

+

让我们按顺序依次介绍上述五个超能力,同时我们会看到一些提供不安全代码的安全接口的抽象。

+

解引用裸指针

+

回到第四章的 “悬垂引用” 部分,那里提到了编译器会确保引用总是有效的。不安全 Rust 有两个被称为 裸指针raw pointers)的类似于引用的新类型。和引用一样,裸指针是不可变或可变的,分别写作 *const T*mut T。这里的星号不是解引用运算符;它是类型名称的一部分。在裸指针的上下文中,不可变 意味着指针解引用之后不能直接赋值。

+

裸指针与引用和智能指针的区别在于

+
    +
  • 允许忽略借用规则,可以同时拥有不可变和可变的指针,或多个指向相同位置的可变指针
  • +
  • 不保证指向有效的内存
  • +
  • 允许为空
  • +
  • 不能实现任何自动清理功能
  • +
+

通过去掉 Rust 强加的保证,你可以放弃安全保证以换取性能或使用另一个语言或硬件接口的能力,此时 Rust 的保证并不适用。

+

示例 19-1 展示了如何从引用同时创建不可变和可变裸指针。

+
fn main() {
+    let mut num = 5;
+
+    let r1 = &num as *const i32;
+    let r2 = &mut num as *mut i32;
+}
+

示例 19-1: 通过引用创建裸指针

+

注意这里没有引入 unsafe 关键字。可以在安全代码中 创建 裸指针,只是不能在不安全块之外 解引用 裸指针,稍后便会看到。

+

这里使用 as 将不可变和可变引用强转为对应的裸指针类型。因为直接从保证安全的引用来创建它们,可以知道这些特定的裸指针是有效,但是不能对任何裸指针做出如此假设。

+

作为展示接下来会创建一个不能确定其有效性的裸指针,示例 19-2 展示了如何创建一个指向任意内存地址的裸指针。尝试使用任意内存是未定义行为:此地址可能有数据也可能没有,编译器可能会优化掉这个内存访问,或者程序可能会出现段错误(segmentation fault)。通常没有好的理由编写这样的代码,不过却是可行的:

+
fn main() {
+    let address = 0x012345usize;
+    let r = address as *const i32;
+}
+

示例 19-2: 创建指向任意内存地址的裸指针

+

记得我们说过可以在安全代码中创建裸指针,不过不能 解引用 裸指针和读取其指向的数据。现在我们要做的就是对裸指针使用解引用运算符 *,这需要一个 unsafe 块,如示例 19-3 所示:

+
fn main() {
+    let mut num = 5;
+
+    let r1 = &num as *const i32;
+    let r2 = &mut num as *mut i32;
+
+    unsafe {
+        println!("r1 is: {}", *r1);
+        println!("r2 is: {}", *r2);
+    }
+}
+

示例 19-3: 在 unsafe 块中解引用裸指针

+

创建一个指针不会造成任何危险;只有当访问其指向的值时才有可能遇到无效的值。

+

还需注意示例 19-1 和 19-3 中创建了同时指向相同内存位置 num 的裸指针 *const i32*mut i32。相反如果尝试同时创建 num 的不可变和可变引用,将无法通过编译,因为 Rust 的所有权规则不允许在拥有任何不可变引用的同时再创建一个可变引用。通过裸指针,就能够同时创建同一地址的可变指针和不可变指针,若通过可变指针修改数据,则可能潜在造成数据竞争。请多加小心!

+

既然存在这么多的危险,为何还要使用裸指针呢?一个主要的应用场景便是调用 C 代码接口,这在下一部分 “调用不安全函数或方法” 中会讲到。另一个场景是构建借用检查器无法理解的安全抽象。让我们先介绍不安全函数,接着看一看使用不安全代码的安全抽象的例子。

+

调用不安全函数或方法

+

第二类可以在不安全块中进行的操作是调用不安全函数。不安全函数和方法与常规函数方法十分类似,除了其开头有一个额外的 unsafe。在此上下文中,关键字unsafe表示该函数具有调用时需要满足的要求,而 Rust 不会保证满足这些要求。通过在 unsafe 块中调用不安全函数,表明我们已经阅读过此函数的文档并对其是否满足函数自身的契约负责。

+

如下是一个没有做任何操作的不安全函数 dangerous 的例子:

+
fn main() {
+    unsafe fn dangerous() {}
+
+    unsafe {
+        dangerous();
+    }
+}
+

必须在一个单独的 unsafe 块中调用 dangerous 函数。如果尝试不使用 unsafe 块调用 dangerous,则会得到一个错误:

+
$ cargo run
+   Compiling unsafe-example v0.1.0 (file:///projects/unsafe-example)
+error[E0133]: call to unsafe function `dangerous` is unsafe and requires unsafe function or block
+ --> src/main.rs:4:5
+  |
+4 |     dangerous();
+  |     ^^^^^^^^^^^ call to unsafe function
+  |
+  = note: consult the function's documentation for information on how to avoid undefined behavior
+
+For more information about this error, try `rustc --explain E0133`.
+error: could not compile `unsafe-example` (bin "unsafe-example") due to 1 previous error
+
+

通过 unsafe 块,我们向 Rust 保证了我们已经阅读过函数的文档,理解如何正确使用,并验证过其满足函数的契约。

+

不安全函数体也是有效的 unsafe 块,所以在不安全函数中进行另一个不安全操作时无需新增额外的 unsafe 块。

+

创建不安全代码的安全抽象

+

仅仅因为函数包含不安全代码并不意味着整个函数都需要标记为不安全的。事实上,将不安全代码封装进安全函数是一个常见的抽象。作为一个例子,了解一下标准库中的函数 split_at_mut,它需要一些不安全代码,让我们探索如何可以实现它。这个安全函数定义于可变 slice 之上:它获取一个 slice 并从给定的索引参数开始将其分为两个 slice。split_at_mut 的用法如示例 19-4 所示:

+
fn main() {
+    let mut v = vec![1, 2, 3, 4, 5, 6];
+
+    let r = &mut v[..];
+
+    let (a, b) = r.split_at_mut(3);
+
+    assert_eq!(a, &mut [1, 2, 3]);
+    assert_eq!(b, &mut [4, 5, 6]);
+}
+

示例 19-4: 使用安全的 split_at_mut 函数

+

这个函数无法只通过安全 Rust 实现。一个尝试可能看起来像示例 19-5,它不能编译。出于简单考虑,我们将 split_at_mut 实现为函数而不是方法,并只处理 i32 值而非泛型 T 的 slice。

+
fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) {
+    let len = values.len();
+
+    assert!(mid <= len);
+
+    (&mut values[..mid], &mut values[mid..])
+}
+
+fn main() {
+    let mut vector = vec![1, 2, 3, 4, 5, 6];
+    let (left, right) = split_at_mut(&mut vector, 3);
+}
+

示例 19-5: 尝试只使用安全 Rust 来实现 split_at_mut

+

此函数首先获取 slice 的长度,然后通过检查参数是否小于或等于这个长度来断言参数所给定的索引位于 slice 当中。该断言意味着如果传入的索引比要分割的 slice 的索引更大,此函数在尝试使用这个索引前 panic。

+

之后我们在一个元组中返回两个可变的 slice:一个从原始 slice 的开头直到 mid 索引,另一个从 mid 直到原 slice 的结尾。

+

如果尝试编译示例 19-5 的代码,会得到一个错误:

+
$ cargo run
+   Compiling unsafe-example v0.1.0 (file:///projects/unsafe-example)
+error[E0499]: cannot borrow `*values` as mutable more than once at a time
+ --> src/main.rs:6:31
+  |
+1 | fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) {
+  |                         - let's call the lifetime of this reference `'1`
+...
+6 |     (&mut values[..mid], &mut values[mid..])
+  |     --------------------------^^^^^^--------
+  |     |     |                   |
+  |     |     |                   second mutable borrow occurs here
+  |     |     first mutable borrow occurs here
+  |     returning this value requires that `*values` is borrowed for `'1`
+  |
+  = help: use `.split_at_mut(position)` to obtain two mutable non-overlapping sub-slices
+
+For more information about this error, try `rustc --explain E0499`.
+error: could not compile `unsafe-example` (bin "unsafe-example") due to 1 previous error
+
+

Rust 的借用检查器不能理解我们要借用这个 slice 的两个不同部分:它只知道我们借用了同一个 slice 两次。本质上借用 slice 的不同部分是可以的,因为结果两个 slice 不会重叠,不过 Rust 还没有智能到能够理解这些。当我们知道某些事是可以的而 Rust 不知道的时候,就是触及不安全代码的时候了

+

示例 19-6 展示了如何使用 unsafe 块,裸指针和一些不安全函数调用来实现 split_at_mut

+
use std::slice;
+
+fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) {
+    let len = values.len();
+    let ptr = values.as_mut_ptr();
+
+    assert!(mid <= len);
+
+    unsafe {
+        (
+            slice::from_raw_parts_mut(ptr, mid),
+            slice::from_raw_parts_mut(ptr.add(mid), len - mid),
+        )
+    }
+}
+
+fn main() {
+    let mut vector = vec![1, 2, 3, 4, 5, 6];
+    let (left, right) = split_at_mut(&mut vector, 3);
+}
+

示例 19-6: 在 split_at_mut 函数的实现中使用不安全代码

+

回忆第四章的 “Slice 类型” 部分,slice 是一个指向一些数据的指针,并带有该 slice 的长度。可以使用 len 方法获取 slice 的长度,使用 as_mut_ptr 方法访问 slice 的裸指针。在这个例子中,因为有一个 i32 值的可变 slice,as_mut_ptr 返回一个 *mut i32 类型的裸指针,储存在 ptr 变量中。

+

我们保持索引 mid 位于 slice 中的断言。接着是不安全代码:slice::from_raw_parts_mut 函数获取一个裸指针和一个长度来创建一个 slice。这里使用此函数从 ptr 中创建了一个有 mid 个项的 slice。之后在 ptr 上调用 add 方法并使用 mid 作为参数来获取一个从 mid 开始的裸指针,使用这个裸指针并以 mid 之后项的数量为长度创建一个 slice。

+

slice::from_raw_parts_mut 函数是不安全的因为它获取一个裸指针,并必须确信这个指针是有效的。裸指针上的 add 方法也是不安全的,因为其必须确信此地址偏移量也是有效的指针。因此必须将 slice::from_raw_parts_mutadd 放入 unsafe 块中以便能调用它们。通过观察代码,和增加 mid 必然小于等于 len 的断言,我们可以说 unsafe 块中所有的裸指针将是有效的 slice 中数据的指针。这是一个可以接受的 unsafe 的恰当用法。

+

注意无需将 split_at_mut 函数的结果标记为 unsafe,并可以在安全 Rust 中调用此函数。我们创建了一个不安全代码的安全抽象,其代码以一种安全的方式使用了 unsafe 代码,因为其只从这个函数访问的数据中创建了有效的指针。

+

与此相对,示例 19-7 中的 slice::from_raw_parts_mut 在使用 slice 时很有可能会崩溃。这段代码获取任意内存地址并创建了一个长为一万的 slice:

+
fn main() {
+    use std::slice;
+
+    let address = 0x01234usize;
+    let r = address as *mut i32;
+
+    let values: &[i32] = unsafe { slice::from_raw_parts_mut(r, 10000) };
+}
+

示例 19-7: 通过任意内存地址创建 slice

+

我们并不拥有这个任意地址的内存,也不能保证这段代码创建的 slice 包含有效的 i32 值。试图使用臆测为有效的 values 会导致未定义的行为。

+

使用 extern 函数调用外部代码

+

有时你的 Rust 代码可能需要与其他语言编写的代码交互。为此 Rust 有一个关键字,extern,有助于创建和使用 外部函数接口Foreign Function Interface,FFI)。外部函数接口是一个编程语言用以定义函数的方式,其允许不同(外部)编程语言调用这些函数。

+

示例 19-8 展示了如何集成 C 标准库中的 abs 函数。extern 块中声明的函数在 Rust 代码中总是不安全的。因为其他语言不会强制执行 Rust 的规则且 Rust 无法检查它们,所以确保其安全是程序员的责任:

+

文件名:src/main.rs

+
extern "C" {
+    fn abs(input: i32) -> i32;
+}
+
+fn main() {
+    unsafe {
+        println!("Absolute value of -3 according to C: {}", abs(-3));
+    }
+}
+

示例 19-8: 声明并调用另一个语言中定义的 extern 函数

+

extern "C" 块中,列出了我们希望能够调用的另一个语言中的外部函数的签名和名称。"C" 部分定义了外部函数所使用的 应用二进制接口application binary interface,ABI) —— ABI 定义了如何在汇编语言层面调用此函数。"C" ABI 是最常见的,并遵循 C 编程语言的 ABI。

+
+

从其它语言调用 Rust 函数

+

也可以使用 extern 来创建一个允许其他语言调用 Rust 函数的接口。不同于创建整个 extern 块,就在 fn 关键字之前增加 extern 关键字并为相关函数指定所用到的 ABI。还需增加 #[no_mangle] 注解来告诉 Rust 编译器不要 mangle 此函数的名称。Mangling 发生于当编译器将我们指定的函数名修改为不同的名称时,这会增加用于其他编译过程的额外信息,不过会使其名称更难以阅读。每一个编程语言的编译器都会以稍微不同的方式 mangle 函数名,所以为了使 Rust 函数能在其他语言中指定,必须禁用 Rust 编译器的 name mangling。

+

在如下的例子中,一旦其编译为动态库并从 C 语言中链接,call_from_c 函数就能够在 C 代码中访问:

+
#![allow(unused)]
+fn main() {
+#[no_mangle]
+pub extern "C" fn call_from_c() {
+    println!("Just called a Rust function from C!");
+}
+}
+

extern 的使用无需 unsafe

+
+

访问或修改可变静态变量

+

目前为止全书都尽量避免讨论 全局变量global variables),Rust 确实支持它们,不过这对于 Rust 的所有权规则来说是有问题的。如果有两个线程访问相同的可变全局变量,则可能会造成数据竞争。

+

全局变量在 Rust 中被称为 静态static)变量。示例 19-9 展示了一个拥有字符串 slice 值的静态变量的声明和应用:

+

文件名:src/main.rs

+
static HELLO_WORLD: &str = "Hello, world!";
+
+fn main() {
+    println!("name is: {HELLO_WORLD}");
+}
+

示例 19-9: 定义和使用一个不可变静态变量

+

静态(static)变量类似于第三章 “变量和常量的区别” 部分讨论的常量。通常静态变量的名称采用 SCREAMING_SNAKE_CASE 写法。静态变量只能储存拥有 'static 生命周期的引用,这意味着 Rust 编译器可以自己计算出其生命周期而无需显式标注。访问不可变静态变量是安全的。

+

常量与不可变静态变量的一个微妙的区别是静态变量中的值有一个固定的内存地址。使用这个值总是会访问相同的地址。另一方面,常量则允许在任何被用到的时候复制其数据。另一个区别在于静态变量可以是可变的。访问和修改可变静态变量都是 不安全 的。示例 19-10 展示了如何声明、访问和修改名为 COUNTER 的可变静态变量:

+

文件名:src/main.rs

+
static mut COUNTER: u32 = 0;
+
+fn add_to_count(inc: u32) {
+    unsafe {
+        COUNTER += inc;
+    }
+}
+
+fn main() {
+    add_to_count(3);
+
+    unsafe {
+        println!("COUNTER: {COUNTER}");
+    }
+}
+

示例 19-10: 读取或修改一个可变静态变量是不安全的

+

就像常规变量一样,我们使用 mut 关键来指定可变性。任何读写 COUNTER 的代码都必须位于 unsafe 块中。这段代码可以编译并如期打印出 COUNTER: 3,因为这是单线程的。拥有多个线程访问 COUNTER 则可能导致数据竞争。

+

拥有可以全局访问的可变数据,难以保证不存在数据竞争,这就是为何 Rust 认为可变静态变量是不安全的。任何可能的情况,请优先使用第十六章讨论的并发技术和线程安全智能指针,这样编译器就能检测不同线程间的数据访问是否是安全的。

+

实现不安全 trait

+

unsafe 的另一个操作用例是实现不安全 trait。当 trait 中至少有一个方法中包含编译器无法验证的不变式(invariant)时 trait 是不安全的。可以在 trait 之前增加 unsafe 关键字将 trait 声明为 unsafe,同时 trait 的实现也必须标记为 unsafe,如示例 19-11 所示:

+
unsafe trait Foo {
+    // methods go here
+}
+
+unsafe impl Foo for i32 {
+    // method implementations go here
+}
+
+fn main() {}
+

示例 19-11: 定义并实现不安全 trait

+

通过 unsafe impl,我们承诺将保证编译器所不能验证的不变量。

+

作为一个例子,回忆第十六章 “使用 SyncSend trait 的可扩展并发” 部分中的 SyncSend 标记 trait,编译器会自动为完全由 SendSync 类型组成的类型自动实现它们。如果实现了一个包含一些不是 SendSync 的类型,比如裸指针,并希望将此类型标记为 SendSync,则必须使用 unsafe。Rust 不能验证我们的类型保证可以安全的跨线程发送或在多线程间访问,所以需要我们自己进行检查并通过 unsafe 表明。

+

访问联合体中的字段

+

仅适用于 unsafe 的最后一个操作是访问 联合体 中的字段,unionstruct 类似,但是在一个实例中同时只能使用一个声明的字段。联合体主要用于和 C 代码中的联合体交互。访问联合体的字段是不安全的,因为 Rust 无法保证当前存储在联合体实例中数据的类型。可以查看 参考 Rust 文档 了解有关联合体的更多信息。

+

何时使用不安全代码

+

使用 unsafe 来进行这五个操作(超能力)之一是没有问题的,甚至是不需要深思熟虑的,不过使得 unsafe 代码正确也实属不易,因为编译器不能帮助保证内存安全。当有理由使用 unsafe 代码时,是可以这么做的,通过使用显式的 unsafe 标注可以更容易地在错误发生时追踪问题的源头。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch20-03-advanced-traits.html b/ch20-03-advanced-traits.html new file mode 100644 index 000000000..156157407 --- /dev/null +++ b/ch20-03-advanced-traits.html @@ -0,0 +1,731 @@ + + + + + + 高级 trait - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

高级 trait

+
+

ch20-03-advanced-traits.md +
+commit 95e931170404cb98d476b19017cbbdbc00d0834d

+
+

第十章 “trait:定义共同行为” 部分,我们第一次涉及到了 trait,不过我们并没有覆盖一些较为高级的细节。现在我们更加了解 Rust 了,可以深入理解其本质了。

+

关联类型在 trait 定义中指定占位符类型

+

关联类型associated types)让我们可以在 trait 里面增加一个待定义的类型(类型占位符),将类型占位符与 trait 相关联,这样 trait 的方法签名中就可以使用这些占位符类型。trait 的实现者在实现这个 trait 的时候,会指定一个具体类型,来替换掉这个占位符。这样,我们可以在一个 trait 中通过占位符使用不同类型,在实现此 trait 时才需要指定这些类型具体是什么。

+

我们之前提到,本章所描述的大部分内容都较少使用。关联类型则比较适中;它们比本书其他的内容要少见,不过比本章中的很多内容要更常见。

+

一个带有关联类型的 trait 的例子是标准库提供的 Iterator trait。它有一个叫做 Item 的关联类型来替代遍历的值的类型。Iterator trait 的定义如示例 19-12 所示:

+
pub trait Iterator {
+    type Item;
+
+    fn next(&mut self) -> Option<Self::Item>;
+}
+

示例 19-12: Iterator trait 的定义中带有关联类型 Item

+

Item 是一个占位符类型,同时 next 方法的定义表明它返回 Option<Self::Item> 类型的值。这个 trait 的实现者会指定 Item 的具体类型,无论实现者指定何种类型,next 方法都会返回一个包含了此具体类型值的 Option

+

关联类型看起来有点像泛型:后者允许定义一个函数时,暂不指定其可以处理的类型。为了体现这两者的区别,请看下面的例子。 +这个例子为 Counter 结构体实现了 Iterator trait,其中指定 Item 的类型为 u32

+

文件名:src/lib.rs

+
struct Counter {
+    count: u32,
+}
+
+impl Counter {
+    fn new() -> Counter {
+        Counter { count: 0 }
+    }
+}
+
+impl Iterator for Counter {
+    type Item = u32;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        // --snip--
+        if self.count < 5 {
+            self.count += 1;
+            Some(self.count)
+        } else {
+            None
+        }
+    }
+}
+

这个语法类似于泛型。那么为什么 Iterator trait 不像下面示例 19-13 那样,使用泛型来定义呢?

+
pub trait Iterator<T> {
+    fn next(&mut self) -> Option<T>;
+}
+

示例 19-13: 一个使用泛型的 Iterator trait 假想定义

+

区别在于当如示例 19-13 那样使用泛型时,则不得不在每一个实现中标注类型。这是因为我们也可以实现为 Iterator<String> for Counter,或任何其他类型,这样就可以有多个 CounterIterator 的实现。换句话说,当 trait 有泛型参数时,可以多次实现这个 trait,每次需改变泛型参数的具体类型。接着当使用 Counternext 方法时,必须提供类型注解来表明希望使用 Iterator 的哪一个实现。

+

有了关联类型,在实现时就无需标注类型,因为不能多次实现这个 trait。对于示例 19-12 使用关联类型的定义,我们只能选择一次 Item 会是什么类型,因为只能有一个 impl Iterator for Counter。当调用 Counternext 时不必每次指定我们需要 u32 值的迭代器。

+

关联类型也会成为 trait 契约的一部分:trait 的实现必须提供一个类型来替代关联类型占位符。关联类型通常以它的用途来命名,并且我们最好在 API 文档中为关联类型编写文档。

+

默认泛型类型参数和运算符重载

+

当使用泛型类型参数时,可以为泛型指定一个默认的具体类型。如果默认类型就足够的话,这消除了为具体类型实现 trait 的需要。为泛型类型指定默认类型的语法是在声明泛型类型时使用 <PlaceholderType=ConcreteType>

+

这种情况的一个非常好的例子是使用 运算符重载Operator overloading),这是指在特定情况下自定义运算符(比如 +)行为的操作。

+

Rust 并不允许创建自定义运算符或重载任意运算符,不过 std::ops 中所列出的运算符和相应的 trait 可以通过实现运算符相关 trait 来重载。例如,示例 19-14 中展示了如何在 Point 结构体上实现 Add trait 来重载 + 运算符,这样就可以将两个 Point 实例相加了:

+

文件名:src/main.rs

+
use std::ops::Add;
+
+#[derive(Debug, Copy, Clone, PartialEq)]
+struct Point {
+    x: i32,
+    y: i32,
+}
+
+impl Add for Point {
+    type Output = Point;
+
+    fn add(self, other: Point) -> Point {
+        Point {
+            x: self.x + other.x,
+            y: self.y + other.y,
+        }
+    }
+}
+
+fn main() {
+    assert_eq!(
+        Point { x: 1, y: 0 } + Point { x: 2, y: 3 },
+        Point { x: 3, y: 3 }
+    );
+}
+

示例 19-14: 实现 Add trait 重载 Point 实例的 + 运算符

+

add 方法将两个 Point 实例的 x 值和 y 值分别相加来创建一个新的 PointAdd trait 有一个叫做 Output 的关联类型,它用来决定 add 方法的返回值类型。

+

这里默认泛型类型位于 Add trait 中。这里是其定义:

+
#![allow(unused)]
+fn main() {
+trait Add<Rhs=Self> {
+    type Output;
+
+    fn add(self, rhs: Rhs) -> Self::Output;
+}
+}
+

这些代码看来应该很熟悉,这是一个带有一个方法和一个关联类型的 trait。比较陌生的部分是尖括号中的 Rhs=Self:这个语法叫做 默认类型参数default type parameters)。Rhs 是一个泛型类型参数(“right hand side” 的缩写),它用于定义 add 方法中的 rhs 参数。如果实现 Add trait 时不指定 Rhs 的具体类型,Rhs 的类型将是默认的 Self 类型,也就是在其上实现 Add 的类型。

+

当为 Point 实现 Add 时,使用了默认的 Rhs,因为我们希望将两个 Point 实例相加。让我们看看一个实现 Add trait 时希望自定义 Rhs 类型而不是使用默认类型的例子。

+

这里有两个存放不同单元值的结构体,MillimetersMeters。(这种将现有类型简单封装进另一个结构体的方式被称为 newtype 模式newtype pattern,之后的 “为了类型安全和抽象而使用 newtype 模式” 部分会详细介绍。)我们希望能够将毫米值与米值相加,并让 Add 的实现正确处理转换。可以为 Millimeters 实现 Add 并以 Meters 作为 Rhs,如示例 19-15 所示。

+

文件名:src/lib.rs

+
use std::ops::Add;
+
+struct Millimeters(u32);
+struct Meters(u32);
+
+impl Add<Meters> for Millimeters {
+    type Output = Millimeters;
+
+    fn add(self, other: Meters) -> Millimeters {
+        Millimeters(self.0 + (other.0 * 1000))
+    }
+}
+

示例 19-15: 在 Millimeters 上实现 Add,以便能够将 MillimetersMeters 相加

+

为了使 MillimetersMeters 能够相加,我们指定 impl Add<Meters> 来设定 Rhs 类型参数的值而不是使用默认的 Self

+

默认参数类型主要用于如下两个方面:

+
    +
  • 扩展类型而不破坏现有代码。
  • +
  • 在大部分用户都不需要的特定情况进行自定义。
  • +
+

标准库的 Add trait 就是一个第二个目的例子:大部分时候你会将两个相似的类型相加,不过它提供了自定义额外行为的能力。在 Add trait 定义中使用默认类型参数意味着大部分时候无需指定额外的参数。换句话说,一小部分实现的样板代码是不必要的,这样使用 trait 就更容易了。

+

第一个目的是相似的,但过程是反过来的:如果需要为现有 trait 增加类型参数,为其提供一个默认类型将允许我们在不破坏现有实现代码的基础上扩展 trait 的功能。

+

完全限定语法与消歧义:调用相同名称的方法

+

Rust 既不能避免一个 trait 与另一个 trait 拥有相同名称的方法,也不能阻止为同一类型同时实现这两个 trait。甚至直接在类型上实现开始已经有的同名方法也是可能的!

+

不过,当调用这些同名方法时,需要告诉 Rust 我们希望使用哪一个。考虑一下示例 19-16 中的代码,这里定义了 trait PilotWizard 都拥有方法 fly。接着在一个本身已经实现了名为 fly 方法的类型 Human 上实现这两个 trait。每一个 fly 方法都进行了不同的操作:

+

文件名:src/main.rs

+
trait Pilot {
+    fn fly(&self);
+}
+
+trait Wizard {
+    fn fly(&self);
+}
+
+struct Human;
+
+impl Pilot for Human {
+    fn fly(&self) {
+        println!("This is your captain speaking.");
+    }
+}
+
+impl Wizard for Human {
+    fn fly(&self) {
+        println!("Up!");
+    }
+}
+
+impl Human {
+    fn fly(&self) {
+        println!("*waving arms furiously*");
+    }
+}
+
+fn main() {}
+

示例 19-16: 两个 trait 定义为拥有 fly 方法,并在直接定义有 fly 方法的 Human 类型上实现这两个 trait

+

当调用 Human 实例的 fly 时,编译器默认调用直接实现在类型上的方法,如示例 19-17 所示。

+

文件名:src/main.rs

+
trait Pilot {
+    fn fly(&self);
+}
+
+trait Wizard {
+    fn fly(&self);
+}
+
+struct Human;
+
+impl Pilot for Human {
+    fn fly(&self) {
+        println!("This is your captain speaking.");
+    }
+}
+
+impl Wizard for Human {
+    fn fly(&self) {
+        println!("Up!");
+    }
+}
+
+impl Human {
+    fn fly(&self) {
+        println!("*waving arms furiously*");
+    }
+}
+
+fn main() {
+    let person = Human;
+    person.fly();
+}
+

示例 19-17: 调用 Human 实例的 fly

+

运行这段代码会打印出 *waving arms furiously*,这表明 Rust 调用了直接实现在 Human 上的 fly 方法。

+

为了能够调用 Pilot trait 或 Wizard trait 的 fly 方法,我们需要使用更明显的语法以便能指定我们指的是哪个 fly 方法。这个语法展示在示例 19-18 中:

+

文件名:src/main.rs

+
trait Pilot {
+    fn fly(&self);
+}
+
+trait Wizard {
+    fn fly(&self);
+}
+
+struct Human;
+
+impl Pilot for Human {
+    fn fly(&self) {
+        println!("This is your captain speaking.");
+    }
+}
+
+impl Wizard for Human {
+    fn fly(&self) {
+        println!("Up!");
+    }
+}
+
+impl Human {
+    fn fly(&self) {
+        println!("*waving arms furiously*");
+    }
+}
+
+fn main() {
+    let person = Human;
+    Pilot::fly(&person);
+    Wizard::fly(&person);
+    person.fly();
+}
+

示例 19-18: 指定我们希望调用哪一个 trait 的 fly 方法

+

在方法名前指定 trait 名向 Rust 澄清了我们希望调用哪个 fly 实现。也可以选择写成 Human::fly(&person),这等同于示例 19-18 中的 person.fly(),不过如果无需消歧义的话这么写就有点长了。

+

运行这段代码会打印出:

+
$ cargo run
+   Compiling traits-example v0.1.0 (file:///projects/traits-example)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.46s
+     Running `target/debug/traits-example`
+This is your captain speaking.
+Up!
+*waving arms furiously*
+
+

因为 fly 方法获取一个 self 参数,如果有两个 类型 都实现了同一 trait,Rust 可以根据 self 的类型计算出应该使用哪一个 trait 实现。

+

然而,不是方法的关联函数没有 self 参数。当存在多个类型或者 trait 定义了相同函数名的非方法函数时,Rust 就不总是能计算出我们期望的是哪一个类型,除非使用 完全限定语法fully qualified syntax)。例如示例 19-19 中的创建了一个希望将所有小狗叫做 Spot 的动物收容所的 trait。Animal trait 有一个关联非方法函数 baby_name。结构体 Dog 实现了 Animal,同时又直接提供了关联非方法函数 baby_name

+

文件名:src/main.rs

+
trait Animal {
+    fn baby_name() -> String;
+}
+
+struct Dog;
+
+impl Dog {
+    fn baby_name() -> String {
+        String::from("Spot")
+    }
+}
+
+impl Animal for Dog {
+    fn baby_name() -> String {
+        String::from("puppy")
+    }
+}
+
+fn main() {
+    println!("A baby dog is called a {}", Dog::baby_name());
+}
+

示例 19-19: 一个带有关联函数的 trait 和一个带有同名关联函数并实现了此 trait 的类型

+

Dog 上定义的关联函数 baby_name 的实现代码将所有的小狗起名为 Spot。Dog 类型还实现了 Animal trait,它描述了所有动物的共有的特征。小狗被称为 puppy,这表现为 DogAnimal trait 实现中与 Animal trait 相关联的函数 baby_name

+

main 调用了 Dog::baby_name 函数,它直接调用了定义于 Dog 之上的关联函数。这段代码会打印出:

+
$ cargo run
+   Compiling traits-example v0.1.0 (file:///projects/traits-example)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.54s
+     Running `target/debug/traits-example`
+A baby dog is called a Spot
+
+

这并不是我们需要的。我们希望调用的是 DogAnimal trait 实现那部分的 baby_name 函数,这样能够打印出 A baby dog is called a puppy。示例 19-18 中用到的技术在这并不管用;如果将 main 改为示例 19-20 中的代码,则会得到一个编译错误:

+

文件名:src/main.rs

+
trait Animal {
+    fn baby_name() -> String;
+}
+
+struct Dog;
+
+impl Dog {
+    fn baby_name() -> String {
+        String::from("Spot")
+    }
+}
+
+impl Animal for Dog {
+    fn baby_name() -> String {
+        String::from("puppy")
+    }
+}
+
+fn main() {
+    println!("A baby dog is called a {}", Animal::baby_name());
+}
+

示例 19-20: 尝试调用 Animal trait 的 baby_name 函数,不过 Rust 并不知道该使用哪一个实现

+

因为 Animal::baby_name 没有 self 参数,同时这可能会有其它类型实现了 Animal trait,Rust 无法计算出所需的是哪一个 Animal::baby_name 实现。我们会得到这个编译错误:

+
$ cargo run
+   Compiling traits-example v0.1.0 (file:///projects/traits-example)
+error[E0790]: cannot call associated function on trait without specifying the corresponding `impl` type
+  --> src/main.rs:20:43
+   |
+2  |     fn baby_name() -> String;
+   |     ------------------------- `Animal::baby_name` defined here
+...
+20 |     println!("A baby dog is called a {}", Animal::baby_name());
+   |                                           ^^^^^^^^^^^^^^^^^^^ cannot call associated function of trait
+   |
+help: use the fully-qualified path to the only available implementation
+   |
+20 |     println!("A baby dog is called a {}", <Dog as Animal>::baby_name());
+   |                                           +++++++       +
+
+For more information about this error, try `rustc --explain E0790`.
+error: could not compile `traits-example` (bin "traits-example") due to 1 previous error
+
+

为了消歧义并告诉 Rust 我们希望使用的是 DogAnimal 实现而不是其它类型的 Animal 实现,需要使用 完全限定语法,这是调用函数时最为明确的方式。示例 19-21 展示了如何使用完全限定语法:

+

文件名:src/main.rs

+
trait Animal {
+    fn baby_name() -> String;
+}
+
+struct Dog;
+
+impl Dog {
+    fn baby_name() -> String {
+        String::from("Spot")
+    }
+}
+
+impl Animal for Dog {
+    fn baby_name() -> String {
+        String::from("puppy")
+    }
+}
+
+fn main() {
+    println!("A baby dog is called a {}", <Dog as Animal>::baby_name());
+}
+

示例 19-21: 使用完全限定语法来指定我们希望调用的是 DogAnimal trait 实现中的 baby_name 函数

+

我们在尖括号中向 Rust 提供了类型注解,并通过在此函数调用中将 Dog 类型当作 Animal 对待,来指定希望调用的是 DogAnimal trait 实现中的 baby_name 函数。现在这段代码会打印出我们期望的数据:

+
$ cargo run
+   Compiling traits-example v0.1.0 (file:///projects/traits-example)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s
+     Running `target/debug/traits-example`
+A baby dog is called a puppy
+
+

通常,完全限定语法定义为:

+
<Type as Trait>::function(receiver_if_method, next_arg, ...);
+

对于不是方法的关联函数,其没有一个 receiver,故只会有其他参数的列表。可以选择在任何函数或方法调用处使用完全限定语法。然而,允许省略任何 Rust 能够从程序中的其他信息中计算出的部分。只有当存在多个同名实现而 Rust 需要帮助以便知道我们希望调用哪个实现时,才需要使用这个较为冗长的语法。

+

父 trait 用于在另一个 trait 中使用某 trait 的功能

+

有时我们可能会需要编写一个依赖另一个 trait 的 trait 定义:对于一个实现了第一个 trait 的类型,你希望要求这个类型也实现了第二个 trait。如此就可使 trait 定义使用第二个 trait 的关联项。这个所需的 trait 是我们实现的 trait 的 父(超)traitsupertrait)。

+

例如我们希望创建一个带有 outline_print 方法的 trait OutlinePrint,它会将给定的值格式化为带有星号框。也就是说,给定一个实现了标准库 Display trait 的并返回 (x, y)Point,当调用以 1 作为 x3 作为 yPoint 实例的 outline_print 会显示如下:

+
**********
+*        *
+* (1, 3) *
+*        *
+**********
+
+

outline_print 的实现中,因为希望能够使用 Display trait 的功能,则需要说明 OutlinePrint 只能用于同时也实现了 Display 并提供了 OutlinePrint 需要的功能的类型。可以通过在 trait 定义中指定 OutlinePrint: Display 来做到这一点。这类似于为 trait 增加 trait bound。示例 19-22 展示了一个 OutlinePrint trait 的实现:

+

文件名:src/main.rs

+
use std::fmt;
+
+trait OutlinePrint: fmt::Display {
+    fn outline_print(&self) {
+        let output = self.to_string();
+        let len = output.len();
+        println!("{}", "*".repeat(len + 4));
+        println!("*{}*", " ".repeat(len + 2));
+        println!("* {output} *");
+        println!("*{}*", " ".repeat(len + 2));
+        println!("{}", "*".repeat(len + 4));
+    }
+}
+
+fn main() {}
+

示例 19-22: 实现 OutlinePrint trait,它要求来自 Display 的功能

+

因为指定了 OutlinePrint 需要 Display trait,则可以在 outline_print 中使用 to_string,其会为任何实现 Display 的类型自动实现。如果不在 trait 名后增加 : Display 并尝试在 outline_print 中使用 to_string,则会得到一个错误说在当前作用域中没有找到用于 &Self 类型的方法 to_string

+

让我们看看如果尝试在一个没有实现 Display 的类型上实现 OutlinePrint 会发生什么,比如 Point 结构体:

+

文件名:src/main.rs

+
use std::fmt;
+
+trait OutlinePrint: fmt::Display {
+    fn outline_print(&self) {
+        let output = self.to_string();
+        let len = output.len();
+        println!("{}", "*".repeat(len + 4));
+        println!("*{}*", " ".repeat(len + 2));
+        println!("* {output} *");
+        println!("*{}*", " ".repeat(len + 2));
+        println!("{}", "*".repeat(len + 4));
+    }
+}
+
+struct Point {
+    x: i32,
+    y: i32,
+}
+
+impl OutlinePrint for Point {}
+
+fn main() {
+    let p = Point { x: 1, y: 3 };
+    p.outline_print();
+}
+

这样会得到一个错误说 Display 是必须的而未被实现:

+
$ cargo run
+   Compiling traits-example v0.1.0 (file:///projects/traits-example)
+error[E0277]: `Point` doesn't implement `std::fmt::Display`
+  --> src/main.rs:20:23
+   |
+20 | impl OutlinePrint for Point {}
+   |                       ^^^^^ `Point` cannot be formatted with the default formatter
+   |
+   = help: the trait `std::fmt::Display` is not implemented for `Point`
+   = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
+note: required by a bound in `OutlinePrint`
+  --> src/main.rs:3:21
+   |
+3  | trait OutlinePrint: fmt::Display {
+   |                     ^^^^^^^^^^^^ required by this bound in `OutlinePrint`
+
+error[E0277]: `Point` doesn't implement `std::fmt::Display`
+  --> src/main.rs:24:7
+   |
+24 |     p.outline_print();
+   |       ^^^^^^^^^^^^^ `Point` cannot be formatted with the default formatter
+   |
+   = help: the trait `std::fmt::Display` is not implemented for `Point`
+   = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
+note: required by a bound in `OutlinePrint::outline_print`
+  --> src/main.rs:3:21
+   |
+3  | trait OutlinePrint: fmt::Display {
+   |                     ^^^^^^^^^^^^ required by this bound in `OutlinePrint::outline_print`
+4  |     fn outline_print(&self) {
+   |        ------------- required by a bound in this associated function
+
+For more information about this error, try `rustc --explain E0277`.
+error: could not compile `traits-example` (bin "traits-example") due to 2 previous errors
+
+

一旦在 Point 上实现 Display 并满足 OutlinePrint 要求的限制,比如这样:

+

文件名:src/main.rs

+
trait OutlinePrint: fmt::Display {
+    fn outline_print(&self) {
+        let output = self.to_string();
+        let len = output.len();
+        println!("{}", "*".repeat(len + 4));
+        println!("*{}*", " ".repeat(len + 2));
+        println!("* {output} *");
+        println!("*{}*", " ".repeat(len + 2));
+        println!("{}", "*".repeat(len + 4));
+    }
+}
+
+struct Point {
+    x: i32,
+    y: i32,
+}
+
+impl OutlinePrint for Point {}
+
+use std::fmt;
+
+impl fmt::Display for Point {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "({}, {})", self.x, self.y)
+    }
+}
+
+fn main() {
+    let p = Point { x: 1, y: 3 };
+    p.outline_print();
+}
+

那么在 Point 上实现 OutlinePrint trait 将能成功编译,并可以在 Point 实例上调用 outline_print 来显示位于星号框中的点的值。

+

newtype 模式用以在外部类型上实现外部 trait

+

在第十章的 “为类型实现 trait” 部分,我们提到了孤儿规则(orphan rule),它说明只要 trait 或类型对于当前 crate 是本地的话就可以在此类型上实现该 trait。一个绕开这个限制的方法是使用 newtype 模式newtype pattern),它涉及到在一个元组结构体(第五章 “用没有命名字段的元组结构体来创建不同的类型” 部分介绍了元组结构体)中创建一个新类型。这个元组结构体带有一个字段作为希望实现 trait 的类型的简单封装。接着这个封装类型对于 crate 是本地的,这样就可以在这个封装上实现 trait。Newtype 是一个源自 Haskell 编程语言的概念。使用这个模式没有运行时性能惩罚,这个封装类型在编译时就被省略了。

+

例如,如果想要在 Vec<T> 上实现 Display,而孤儿规则阻止我们直接这么做,因为 Display trait 和 Vec<T> 都定义于我们的 crate 之外。可以创建一个包含 Vec<T> 实例的 Wrapper 结构体,接着可以如列表 19-23 那样在 Wrapper 上实现 Display 并使用 Vec<T> 的值:

+

文件名:src/main.rs

+
use std::fmt;
+
+struct Wrapper(Vec<String>);
+
+impl fmt::Display for Wrapper {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "[{}]", self.0.join(", "))
+    }
+}
+
+fn main() {
+    let w = Wrapper(vec![String::from("hello"), String::from("world")]);
+    println!("w = {w}");
+}
+

示例 19-23: 创建 Wrapper 类型封装 Vec<String> 以便能够实现 Display

+

Display 的实现使用 self.0 来访问其内部的 Vec<T>,因为 Wrapper 是元组结构体而 Vec<T> 是结构体总位于索引 0 的项。接着就可以使用 WrapperDisplay 的功能了。

+

此方法的缺点是,因为 Wrapper 是一个新类型,它没有定义于其值之上的方法;必须直接在 Wrapper 上实现 Vec<T> 的所有方法,这样就可以代理到self.0 上 —— 这就允许我们完全像 Vec<T> 那样对待 Wrapper。如果希望新类型拥有其内部类型的每一个方法,为封装类型实现 Deref trait(第十五章 “通过 Deref trait 将智能指针当作常规引用处理” 部分讨论过)并返回其内部类型是一种解决方案。如果不希望封装类型拥有所有内部类型的方法 —— 比如为了限制封装类型的行为 —— 则必须只自行实现所需的方法。

+

甚至当不涉及 trait 时 newtype 模式也很有用。现在让我们将话题的焦点转移到一些与 Rust 类型系统交互的高级方法上来吧。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch20-04-advanced-types.html b/ch20-04-advanced-types.html new file mode 100644 index 000000000..3cc8dcda5 --- /dev/null +++ b/ch20-04-advanced-types.html @@ -0,0 +1,453 @@ + + + + + + 高级类型 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

高级类型

+
+

ch20-04-advanced-types.md +
+commit 95e931170404cb98d476b19017cbbdbc00d0834d

+
+

Rust 的类型系统有一些我们曾经提到但没有讨论过的功能。首先我们从一个关于为什么 newtype 与类型一样有用的更宽泛的讨论开始。接着会转向类型别名(type aliases),一个类似于 newtype 但有着稍微不同的语义的功能。我们还会讨论 ! 类型和动态大小类型。

+
+

这一部分假设你已经阅读了之前的 “newtype 模式用于在外部类型上实现外部 trait” 部分。

+
+

为了类型安全和抽象而使用 newtype 模式

+

newtype 模式也可以用于一些其他我们还未讨论的功能,包括静态的确保某值不被混淆,和用来表示一个值的单位。实际上示例 19-15 中已经有一个这样的例子:MillimetersMeters 结构体都在 newtype 中封装了 u32 值。如果编写了一个有 Millimeters 类型参数的函数,不小心使用 Meters 或普通的 u32 值来调用该函数的程序是不能编译的。

+

newtype 模式也可以用于抽象掉一些类型的实现细节:例如,封装类型可以暴露出与直接使用其内部私有类型时所不同的公有 API。

+

newtype 也可以隐藏其内部的泛型类型。例如,可以提供一个封装了 HashMap<i32, String>People 类型,用来储存人名以及相应的 ID。使用 People 的代码只需与提供的公有 API 交互即可,比如向 People 集合增加名字字符串的方法,这样这些代码就无需知道在内部我们将一个 i32 ID 赋予了这个名字了。newtype 模式是一种实现第十八章 “封装隐藏了实现细节” 部分所讨论的隐藏实现细节的封装的轻量级方法。

+

类型别名用来创建类型同义词

+

Rust 提供了声明 类型别名type alias)的能力,使用 type 关键字来给予现有类型另一个名字。例如,可以像这样创建 i32 的别名 Kilometers

+
fn main() {
+    type Kilometers = i32;
+
+    let x: i32 = 5;
+    let y: Kilometers = 5;
+
+    println!("x + y = {}", x + y);
+}
+

这意味着 Kilometersi32同义词synonym);不同于示例 19-15 中创建的 MillimetersMeters 类型。Kilometers 不是一个新的、单独的类型。Kilometers 类型的值将被完全当作 i32 类型值来对待:

+
fn main() {
+    type Kilometers = i32;
+
+    let x: i32 = 5;
+    let y: Kilometers = 5;
+
+    println!("x + y = {}", x + y);
+}
+

因为 Kilometersi32 的别名,它们是同一类型,可以将 i32Kilometers 相加,也可以将 Kilometers 传递给获取 i32 参数的函数。但通过这种手段无法获得上一部分讨论的 newtype 模式所提供的类型检查的好处。换句话说,如果在哪里混用 Kilometersi32 的值,编译器也不会给出一个错误。

+

类型别名的主要用途是减少重复。例如,可能会有这样很长的类型:

+
Box<dyn Fn() + Send + 'static>
+

在函数签名或类型注解中每次都书写这个类型将是枯燥且易于出错的。想象一下如示例 19-24 这样全是如此代码的项目:

+
fn main() {
+    let f: Box<dyn Fn() + Send + 'static> = Box::new(|| println!("hi"));
+
+    fn takes_long_type(f: Box<dyn Fn() + Send + 'static>) {
+        // --snip--
+    }
+
+    fn returns_long_type() -> Box<dyn Fn() + Send + 'static> {
+        // --snip--
+        Box::new(|| ())
+    }
+}
+

示例 19-24: 在很多地方使用名称很长的类型

+

类型别名通过减少项目中重复代码的数量来使其更加易于控制。这里我们为这个冗长的类型引入了一个叫做 Thunk 的别名,这样就可以如示例 19-25 所示将所有使用这个类型的地方替换为更短的 Thunk

+
fn main() {
+    type Thunk = Box<dyn Fn() + Send + 'static>;
+
+    let f: Thunk = Box::new(|| println!("hi"));
+
+    fn takes_long_type(f: Thunk) {
+        // --snip--
+    }
+
+    fn returns_long_type() -> Thunk {
+        // --snip--
+        Box::new(|| ())
+    }
+}
+

示例 19-25: 引入类型别名 Thunk 来减少重复

+

这样读写起来就容易多了!为类型别名选择一个好名字也可以帮助你表达意图(单词 thunk 表示会在之后被计算的代码,所以这是一个存放闭包的合适的名字)。

+

类型别名也经常与 Result<T, E> 结合使用来减少重复。考虑一下标准库中的 std::io 模块。I/O 操作通常会返回一个 Result<T, E>,因为这些操作可能会失败。标准库中的 std::io::Error 结构体代表了所有可能的 I/O 错误。std::io 中大部分函数会返回 Result<T, E>,其中 Estd::io::Error,比如 Write trait 中的这些函数:

+
use std::fmt;
+use std::io::Error;
+
+pub trait Write {
+    fn write(&mut self, buf: &[u8]) -> Result<usize, Error>;
+    fn flush(&mut self) -> Result<(), Error>;
+
+    fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>;
+    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Error>;
+}
+

这里出现了很多的 Result<..., Error>。为此,std::io 有这个类型别名声明:

+
use std::fmt;
+
+type Result<T> = std::result::Result<T, std::io::Error>;
+
+pub trait Write {
+    fn write(&mut self, buf: &[u8]) -> Result<usize>;
+    fn flush(&mut self) -> Result<()>;
+
+    fn write_all(&mut self, buf: &[u8]) -> Result<()>;
+    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<()>;
+}
+

因为这位于 std::io 中,可用的完全限定的别名是 std::io::Result<T>;也就是说,Result<T, E>E 放入了 std::io::ErrorWrite trait 中的函数最终看起来像这样:

+
use std::fmt;
+
+type Result<T> = std::result::Result<T, std::io::Error>;
+
+pub trait Write {
+    fn write(&mut self, buf: &[u8]) -> Result<usize>;
+    fn flush(&mut self) -> Result<()>;
+
+    fn write_all(&mut self, buf: &[u8]) -> Result<()>;
+    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<()>;
+}
+

类型别名在两个方面有帮助:易于编写 在整个 std::io 中提供了一致的接口。因为这是一个别名,它只是另一个 Result<T, E>,这意味着可以在其上使用 Result<T, E> 的任何方法,以及像 ? 这样的特殊语法。

+

从不返回的 never type

+

Rust 有一个叫做 ! 的特殊类型。在类型理论术语中,它被称为 empty type,因为它没有值。我们更倾向于称之为 never type。这个名字描述了它的作用:在函数从不返回的时候充当返回值。例如:

+
fn bar() -> ! {
+    // --snip--
+    panic!();
+}
+

这读 “函数 bar 从不返回”,而从不返回的函数被称为 发散函数diverging functions)。不能创建 ! 类型的值,所以 bar 也不可能返回值。

+

不过一个不能创建值的类型有什么用呢?如果你回想一下示例 2-5 中的代码,曾经有一些看起来像这样的代码,如示例 19-26 所重现的:

+
use rand::Rng;
+use std::cmp::Ordering;
+use std::io;
+
+fn main() {
+    println!("Guess the number!");
+
+    let secret_number = rand::thread_rng().gen_range(1..=100);
+
+    println!("The secret number is: {secret_number}");
+
+    loop {
+        println!("Please input your guess.");
+
+        let mut guess = String::new();
+
+        // --snip--
+
+        io::stdin()
+            .read_line(&mut guess)
+            .expect("Failed to read line");
+
+        let guess: u32 = match guess.trim().parse() {
+            Ok(num) => num,
+            Err(_) => continue,
+        };
+
+        println!("You guessed: {guess}");
+
+        // --snip--
+
+        match guess.cmp(&secret_number) {
+            Ordering::Less => println!("Too small!"),
+            Ordering::Greater => println!("Too big!"),
+            Ordering::Equal => {
+                println!("You win!");
+                break;
+            }
+        }
+    }
+}
+

示例 19-26: match 语句和一个以 continue 结束的分支

+

当时我们忽略了代码中的一些细节。在第六章 match 控制流运算符” 部分,我们学习了 match 的分支必须返回相同的类型。如下代码不能工作:

+
fn main() {
+    let guess = "3";
+    let guess = match guess.trim().parse() {
+        Ok(_) => 5,
+        Err(_) => "hello",
+    };
+}
+

这里的 guess 必须既是整型 也是 字符串,而 Rust 要求 guess 只能是一个类型。那么 continue 返回了什么呢?为什么示例 19-26 中会允许一个分支返回 u32 而另一个分支却以 continue 结束呢?

+

正如你可能猜到的,continue 的值是 !。也就是说,当 Rust 要计算 guess 的类型时,它查看这两个分支。前者是 u32 值,而后者是 ! 值。因为 ! 并没有一个值,Rust 决定 guess 的类型是 u32

+

描述 ! 的行为的正式方式是 never type 可以强转为任何其他类型。允许 match 的分支以 continue 结束是因为 continue 并不真正返回一个值;相反它把控制权交回上层循环,所以在 Err 的情况,事实上并未对 guess 赋值。

+

never type 的另一个用途是 panic!。还记得 Option<T> 上的 unwrap 函数吗?它产生一个值或 panic。这里是它的定义:

+
enum Option<T> {
+    Some(T),
+    None,
+}
+
+use crate::Option::*;
+
+impl<T> Option<T> {
+    pub fn unwrap(self) -> T {
+        match self {
+            Some(val) => val,
+            None => panic!("called `Option::unwrap()` on a `None` value"),
+        }
+    }
+}
+

这里与示例 19-34 中的 match 发生了相同的情况:Rust 知道 valT 类型,panic!! 类型,所以整个 match 表达式的结果是 T 类型。这能工作是因为 panic! 并不产生一个值;它会终止程序。对于 None 的情况,unwrap 并不返回一个值,所以这些代码是有效的。

+

最后一个有着 ! 类型的表达式是 loop

+
fn main() {
+    print!("forever ");
+
+    loop {
+        print!("and ever ");
+    }
+}
+

这里,循环永远也不结束,所以此表达式的值是 !。但是如果引入 break 这就不为真了,因为循环在执行到 break 后就会终止。

+

动态大小类型和 Sized trait

+

Rust 需要知道有关类型的某些细节,例如为特定类型的值需要分配多少空间。这便是起初留下的一个类型系统中令人迷惑的角落:即 动态大小类型dynamically sized types)。这有时被称为 “DST” 或 “unsized types”,这些类型允许我们处理只有在运行时才知道大小的类型。

+

让我们深入研究一个贯穿本书都在使用的动态大小类型的细节:str。没错,不是 &str,而是 str 本身。str 是一个 DST;直到运行时我们都不知道字符串有多长。因为直到运行时都不能知道其大小,也就意味着不能创建 str 类型的变量,也不能获取 str 类型的参数。考虑一下这些代码,它们不能工作:

+
fn main() {
+    let s1: str = "Hello there!";
+    let s2: str = "How's it going?";
+}
+

Rust 需要知道应该为特定类型的值分配多少内存,同时所有同一类型的值必须使用相同数量的内存。如果允许编写这样的代码,也就意味着这两个 str 需要占用完全相同大小的空间,不过它们有着不同的长度。这也就是为什么不可能创建一个存放动态大小类型的变量的原因。

+

那么该怎么办呢?你已经知道了这种问题的答案:s1s2 的类型是 &str 而不是 str。如果你回想第四章 “字符串 slice” 部分,slice 数据结构仅仅储存了开始位置和 slice 的长度。所以虽然 &T 是一个储存了 T 所在的内存位置的单个值,&str 则是 两个 值:str 的地址和其长度。这样,&str 就有了一个在编译时可以知道的大小:它是 usize 长度的两倍。也就是说,我们总是知道 &str 的大小,而无论其引用的字符串是多长。这里是 Rust 中动态大小类型的常规用法:它们有一些额外的元信息来储存动态信息的大小。这引出了动态大小类型的黄金规则:必须将动态大小类型的值置于某种指针之后。

+

可以将 str 与所有类型的指针结合:比如 Box<str>Rc<str>。事实上,之前我们已经见过了,不过是另一个动态大小类型:trait。每一个 trait 都是一个可以通过 trait 名称来引用的动态大小类型。在第十八章 顾及不同类型值的 trait 对象” 部分,我们提到了为了将 trait 用于 trait 对象,必须将它们放入指针之后,比如 &dyn TraitBox<dyn Trait>Rc<dyn Trait> 也可以)。

+

为了处理 DST,Rust 提供了 Sized trait 来决定一个类型的大小是否在编译时可知。这个 trait 自动为编译器在编译时就知道大小的类型实现。另外,Rust 隐式的为每一个泛型函数增加了 Sized bound。也就是说,对于如下泛型函数定义:

+
fn generic<T>(t: T) {
+    // --snip--
+}
+

实际上被当作如下处理:

+
fn generic<T: Sized>(t: T) {
+    // --snip--
+}
+

泛型函数默认只能用于在编译时已知大小的类型。然而可以使用如下特殊语法来放宽这个限制:

+
fn generic<T: ?Sized>(t: &T) {
+    // --snip--
+}
+

?Sized 上的 trait bound 意味着 “T 可能是也可能不是 Sized” 同时这个注解会覆盖泛型类型必须在编译时拥有固定大小的默认规则。这种意义的 ?Trait 语法只能用于 Sized ,而不能用于任何其他 trait。

+

另外注意我们将 t 参数的类型从 T 变为了 &T:因为其类型可能不是 Sized 的,所以需要将其置于某种指针之后。在这个例子中选择了引用。

+

接下来,让我们讨论一下函数和闭包!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch20-05-advanced-functions-and-closures.html b/ch20-05-advanced-functions-and-closures.html new file mode 100644 index 000000000..6776d4708 --- /dev/null +++ b/ch20-05-advanced-functions-and-closures.html @@ -0,0 +1,324 @@ + + + + + + 高级函数与闭包 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

高级函数与闭包

+
+

ch20-05-advanced-functions-and-closures.md +
+commit 21cf840842bdf768a798869f06373c96c1cc5122

+
+

本部分将探索一些有关函数和闭包的高级功能,这包括函数指针以及返回值闭包。

+

函数指针

+

我们讨论过了如何向函数传递闭包;也可以向函数传递常规函数!这个技术在我们希望传递已经定义的函数而不是重新定义闭包作为参数时很有用。函数满足类型 fn(小写的 f),不要与闭包 trait 的 Fn 相混淆。fn 被称为 函数指针function pointer)。通过函数指针允许我们使用函数作为另一个函数的参数。

+

指定参数为函数指针的语法类似于闭包,如示例 19-27 所示,这里定义了一个 add_one 函数将其参数加一。do_twice 函数获取两个参数:一个指向任何获取一个 i32 参数并返回一个 i32 的函数指针,和一个 i32 值。do_twice 函数传递 arg 参数调用 f 函数两次,接着将两次函数调用的结果相加。main 函数使用 add_one5 作为参数调用 do_twice

+

文件名:src/main.rs

+
fn add_one(x: i32) -> i32 {
+    x + 1
+}
+
+fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 {
+    f(arg) + f(arg)
+}
+
+fn main() {
+    let answer = do_twice(add_one, 5);
+
+    println!("The answer is: {answer}");
+}
+

示例 19-27: 使用 fn 类型接受函数指针作为参数

+

这会打印出 The answer is: 12do_twice 中的 f 被指定为一个接受一个 i32 参数并返回 i32fn。接着就可以在 do_twice 函数体中调用 f。在 main 中,可以将函数名 add_one 作为第一个参数传递给 do_twice

+

不同于闭包,fn 是一个类型而不是一个 trait,所以直接指定 fn 作为参数而不是声明一个带有 Fn 作为 trait bound 的泛型参数。

+

函数指针实现了所有三个闭包 trait(FnFnMutFnOnce),所以总是可以在调用期望闭包的函数时传递函数指针作为参数。倾向于编写使用泛型和闭包 trait 的函数,这样它就能接受函数或闭包作为参数。

+

一个只期望接受 fn 而不接受闭包的情况的例子是与不存在闭包的外部代码交互时:C 语言的函数可以接受函数作为参数,但 C 语言没有闭包。

+

作为一个既可以使用内联定义的闭包又可以使用命名函数的例子,让我们看看一个 map 的应用。使用 map 函数将一个数字 vector 转换为一个字符串 vector,就可以使用闭包,比如这样:

+
fn main() {
+    let list_of_numbers = vec![1, 2, 3];
+    let list_of_strings: Vec<String> =
+        list_of_numbers.iter().map(|i| i.to_string()).collect();
+}
+

或者可以将函数作为 map 的参数来代替闭包,像是这样:

+
fn main() {
+    let list_of_numbers = vec![1, 2, 3];
+    let list_of_strings: Vec<String> =
+        list_of_numbers.iter().map(ToString::to_string).collect();
+}
+

注意这里必须使用 “高级 trait” 部分讲到的完全限定语法,因为存在多个叫做 to_string 的函数;这里使用了定义于 ToString trait 的 to_string 函数,标准库为所有实现了 Display 的类型实现了这个 trait。

+

回忆一下第六章 “枚举值” 部分中定义的每一个枚举成员也变成了一个构造函数。我们可以使用这些构造函数作为实现了闭包 trait 的函数指针,这意味着可以指定构造函数作为接受闭包的方法的参数,如下:

+
fn main() {
+    enum Status {
+        Value(u32),
+        Stop,
+    }
+
+    let list_of_statuses: Vec<Status> = (0u32..20).map(Status::Value).collect();
+}
+

这里创建了 Status::Value 实例,它通过 map 用范围的每一个 u32 值调用 Status::Value 的初始化函数。一些人倾向于函数风格,一些人喜欢闭包。这两种形式最终都会产生同样的代码,所以请使用对你来说更明白的形式吧。

+

返回闭包

+

闭包表现为 trait,这意味着不能直接返回闭包。对于大部分需要返回 trait 的情况,可以使用实现了期望返回的 trait 的具体类型来替代函数的返回值。但是这不能用于闭包,因为它们没有一个可返回的具体类型;例如不允许使用函数指针 fn 作为返回值类型。

+

这段代码尝试直接返回闭包,它并不能编译:

+
fn returns_closure() -> dyn Fn(i32) -> i32 {
+    |x| x + 1
+}
+

编译器给出的错误是:

+
$ cargo build
+   Compiling functions-example v0.1.0 (file:///projects/functions-example)
+error[E0746]: return type cannot have an unboxed trait object
+ --> src/lib.rs:1:25
+  |
+1 | fn returns_closure() -> dyn Fn(i32) -> i32 {
+  |                         ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+  |
+help: consider returning an `impl Trait` instead of a `dyn Trait`
+  |
+1 | fn returns_closure() -> impl Fn(i32) -> i32 {
+  |                         ~~~~
+help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
+  |
+1 ~ fn returns_closure() -> Box<dyn Fn(i32) -> i32> {
+2 ~     Box::new(|x| x + 1)
+  |
+
+For more information about this error, try `rustc --explain E0746`.
+error: could not compile `functions-example` (lib) due to 1 previous error
+
+

错误又一次指向了 Sized trait!Rust 并不知道需要多少空间来储存闭包。不过我们在上一部分见过这种情况的解决办法:可以使用 trait 对象:

+
fn returns_closure() -> Box<dyn Fn(i32) -> i32> {
+    Box::new(|x| x + 1)
+}
+

这段代码正好可以编译。关于 trait 对象的更多内容,请回顾第十八章的 顾及不同类型值的 trait 对象” 部分。

+

接下来让我们学习宏!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch20-06-macros.html b/ch20-06-macros.html new file mode 100644 index 000000000..1474e901c --- /dev/null +++ b/ch20-06-macros.html @@ -0,0 +1,460 @@ + + + + + + 宏 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

+
+

ch20-06-macros.md +
+commit 95e931170404cb98d476b19017cbbdbc00d0834d

+
+

我们已经在本书中使用过像 println! 这样的宏了,不过还没完全探索什么是宏以及它是如何工作的。Macro)指的是 Rust 中一系列的功能:使用 macro_rules!声明Declarative)宏,和三种 过程Procedural)宏:

+
    +
  • 自定义 #[derive] 宏在结构体和枚举上指定通过 derive 属性添加的代码
  • +
  • 类属性(Attribute-like)宏定义可用于任意项的自定义属性
  • +
  • 类函数宏看起来像函数不过作用于作为参数传递的 token
  • +
+

我们会依次讨论每一种宏,不过首要的是,为什么已经有了函数还需要宏呢?

+

宏和函数的区别

+

从根本上来说,宏是一种为写其他代码而写代码的方式,即所谓的 元编程metaprogramming)。在附录 C 中会探讨 derive 属性,其生成各种 trait 的实现。我们也在本书中使用过 println! 宏和 vec! 宏。所有的这些宏以 展开 的方式来生成比你所手写出的更多的代码。

+

元编程对于减少大量编写和维护的代码是非常有用的,它也扮演了函数扮演的角色。但宏有一些函数所没有的附加能力。

+

一个函数签名必须声明函数参数个数和类型。相比之下,宏能够接收不同数量的参数:用一个参数调用 println!("hello") 或用两个参数调用 println!("hello {}", name) 。而且,宏可以在编译器翻译代码前展开,例如,宏可以在一个给定类型上实现 trait。而函数则不行,因为函数是在运行时被调用,同时 trait 需要在编译时实现。

+

实现宏不如实现函数的一面是宏定义要比函数定义更复杂,因为你正在编写生成 Rust 代码的 Rust 代码。由于这样的间接性,宏定义通常要比函数定义更难阅读、理解以及维护。

+

宏和函数的最后一个重要的区别是:在一个文件里调用宏 之前 必须定义它,或将其引入作用域,而函数则可以在任何地方定义和调用。

+

使用 macro_rules! 的声明宏用于通用元编程

+

Rust 最常用的宏形式是 声明宏declarative macros)。它们有时也被称为 “macros by example”、“macro_rules! 宏” 或者就是 “macros”。其核心概念是,声明宏允许我们编写一些类似 Rust match 表达式的代码。正如在第六章讨论的那样,match 表达式是控制结构,其接收一个表达式,与表达式的结果进行模式匹配,然后根据模式匹配执行相关代码。宏也将一个值和包含相关代码的模式进行比较;此种情况下,该值是传递给宏的 Rust 源代码字面值,模式用于和前面提到的源代码字面值进行比较,每个模式的相关代码会替换传递给宏的代码。所有这一切都发生于编译时。

+

可以使用 macro_rules! 来定义宏。让我们通过查看 vec! 宏定义来探索如何使用 macro_rules! 结构。第八章讲述了如何使用 vec! 宏来生成一个给定值的 vector。例如,下面的宏用三个整数创建一个 vector:

+
#![allow(unused)]
+fn main() {
+let v: Vec<u32> = vec![1, 2, 3];
+}
+

也可以使用 vec! 宏来构造两个整数的 vector 或五个字符串 slice 的 vector。但却无法使用函数做相同的事情,因为我们无法预先知道参数值的数量和类型。

+

在示例 19-28 中展示了一个 vec! 稍微简化的定义。

+

文件名:src/lib.rs

+
#[macro_export]
+macro_rules! vec {
+    ( $( $x:expr ),* ) => {
+        {
+            let mut temp_vec = Vec::new();
+            $(
+                temp_vec.push($x);
+            )*
+            temp_vec
+        }
+    };
+}
+

示例 19-28: 一个 vec! 宏定义的简化版本

+
+

注意:标准库中实际定义的 vec! 包括预分配适当量的内存的代码。这部分为代码优化,为了让示例简化,此处并没有包含在内。

+
+

#[macro_export] 注解表明只要导入了定义这个宏的 crate,该宏就应该是可用的。如果没有该注解,这个宏不能被引入作用域。

+

接着使用 macro_rules! 和宏名称开始宏定义,且所定义的宏并 不带 感叹号。名字后跟大括号表示宏定义体,在该例中宏名称是 vec

+

vec! 宏的结构和 match 表达式的结构类似。此处有一个分支模式 ( $( $x:expr ),* ) ,后跟 => 以及和模式相关的代码块。如果模式匹配,该相关代码块将被执行。这里这个宏只有一个模式,那就只有一个有效匹配方向,其他任何模式方向(译者注:不匹配这个模式)都会导致错误。更复杂的宏会有多个分支模式。

+

宏定义中有效模式语法和在第十九章提及的模式语法是不同的,因为宏模式所匹配的是 Rust 代码结构而不是值。回过头来检查下示例 19-28 中模式片段什么意思。对于全部的宏模式语法,请查阅 Rust 参考

+

首先,一对括号包含了整个模式。我们使用美元符号($)在宏系统中声明一个变量来包含匹配该模式的 Rust 代码。美元符号明确表明这是一个宏变量而不是普通 Rust 变量。之后是一对括号,其捕获了符合括号内模式的值用以在替代代码中使用。$() 内则是 $x:expr ,其匹配 Rust 的任意表达式,并将该表达式命名为 $x

+

$() 之后的逗号说明一个可有可无的逗号分隔符可以出现在 $() 所匹配的代码之后。紧随逗号之后的 * 说明该模式匹配零个或更多个 * 之前的任何模式。

+

当以 vec![1, 2, 3]; 调用宏时,$x 模式与三个表达式 123 进行了三次匹配。

+

现在让我们来看看与此分支模式相关联的代码块中的模式:匹配到模式中的$()的每一部分,都会在(=>右侧)$()* 里生成temp_vec.push($x),生成零次还是多次取决于模式匹配到多少次。$x 由每个与之相匹配的表达式所替换。当以 vec![1, 2, 3]; 调用该宏时,替换该宏调用所生成的代码会是下面这样:

+
{
+    let mut temp_vec = Vec::new();
+    temp_vec.push(1);
+    temp_vec.push(2);
+    temp_vec.push(3);
+    temp_vec
+}
+

我们已经定义了一个宏,其可以接收任意数量和类型的参数,同时可以生成能够创建包含指定元素的 vector 的代码。

+

请查阅在线文档或其他资源,如 “The Little Book of Rust Macros” 来更多地了解如何写宏,该书由 Daniel Keep 开始编写并由 Lukas Wirth 继续维护。

+

用于从属性生成代码的过程宏

+

第二种形式的宏被称为 过程宏procedural macros),因为它们更像函数(一种过程类型)。过程宏接收 Rust 代码作为输入,在这些代码上进行操作,然后产生另一些代码作为输出,而非像声明式宏那样匹配对应模式然后以另一部分代码替换当前代码。有三种类型的过程宏(自定义派生(derive),类属性和类函数),不过它们的工作方式都类似。

+

创建过程宏时,其定义必须驻留在它们自己的具有特殊 crate 类型的 crate 中。这么做出于复杂的技术原因,将来我们希望能够消除这些限制。在示例 19-29 中展示了如何定义过程宏,其中 some_attribute 是一个使用特定宏变体的占位符。

+

文件名:src/lib.rs

+
use proc_macro;
+
+#[some_attribute]
+pub fn some_name(input: TokenStream) -> TokenStream {
+}
+

示例 19-29: 一个定义过程宏的例子

+

定义过程宏的函数接收一个 TokenStream 作为输入并生成 TokenStream 作为输出。TokenStream 是定义于proc_macro crate 里代表一系列 token 的类型,Rust 默认携带了proc_macro crate。这就是宏的核心:宏所处理的源代码组成了输入 TokenStream,宏生成的代码是输出 TokenStream。函数上还有一个属性;这个属性指明了我们创建的过程宏的类型。在同一 crate 中可以有多种的过程宏。

+

让我们看看不同种类的程序宏。我们将从一个自定义的派生宏开始,然后解释使其他形式不同的小差异。

+

如何编写自定义 derive

+

让我们创建一个 hello_macro crate,其包含名为 HelloMacro 的 trait 和关联函数 hello_macro。不同于让用户为其每一个类型实现 HelloMacro trait,我们将会提供一个过程式宏以便用户可以使用 #[derive(HelloMacro)] 注解它们的类型来得到 hello_macro 函数的默认实现。该默认实现会打印 Hello, Macro! My name is TypeName!,其中 TypeName 为定义了 trait 的类型名。换言之,我们会创建一个 crate,使程序员能够写类似示例 19-30 中的代码。

+

文件名:src/main.rs

+
use hello_macro::HelloMacro;
+use hello_macro_derive::HelloMacro;
+
+#[derive(HelloMacro)]
+struct Pancakes;
+
+fn main() {
+    Pancakes::hello_macro();
+}
+

示例 19-30: crate 用户所写的能够使用过程式宏的代码

+

运行该代码将会打印 Hello, Macro! My name is Pancakes! 第一步是像下面这样新建一个库 crate:

+
$ cargo new hello_macro --lib
+
+

接下来,会定义 HelloMacro trait 以及其关联函数:

+

文件名:src/lib.rs

+
pub trait HelloMacro {
+    fn hello_macro();
+}
+

现在有了一个包含函数的 trait。此时,crate 用户可以实现该 trait 以达到其期望的功能,像这样:

+
use hello_macro::HelloMacro;
+
+struct Pancakes;
+
+impl HelloMacro for Pancakes {
+    fn hello_macro() {
+        println!("Hello, Macro! My name is Pancakes!");
+    }
+}
+
+fn main() {
+    Pancakes::hello_macro();
+}
+

然而,他们需要为每一个他们想使用 hello_macro 的类型编写实现的代码块。我们希望为其节约这些工作。

+

另外,我们也无法为 hello_macro 函数提供一个能够打印实现了该 trait 的类型的名字的默认实现:Rust 没有反射的能力,因此其无法在运行时获取类型名。我们需要一个在编译时生成代码的宏。

+

下一步是定义过程式宏。在编写本部分时,过程式宏必须在其自己的 crate 内。该限制最终可能被取消。构造 crate 和其中宏的惯例如下:对于一个 foo 的包来说,一个自定义的派生过程宏的包被称为 foo_derive 。在 hello_macro 项目中新建名为 hello_macro_derive 的包。

+
$ cargo new hello_macro_derive --lib
+
+

由于两个 crate 紧密相关,因此在 hello_macro 包的目录下创建过程式宏的 crate。如果改变在 hello_macro 中定义的 trait,同时也必须改变在 hello_macro_derive 中实现的过程式宏。这两个包需要分别发布,编程人员如果使用这些包,则需要同时添加这两个依赖并将其引入作用域。我们也可以只用 hello_macro 包而将 hello_macro_derive 作为一个依赖,并重新导出过程式宏的代码。但现在我们组织项目的方式使编程人员在无需 derive 功能时也能够单独使用 hello_macro

+

我们需要声明 hello_macro_derive crate 是过程宏 (proc-macro) crate。我们还需要 synquote crate 中的功能,正如你即将看到的,需要将它们加到依赖中。将下面的代码加入到 hello_macro_deriveCargo.toml 文件中。

+

文件名:hello_macro_derive/Cargo.toml

+
[lib]
+proc-macro = true
+
+[dependencies]
+syn = "2.0"
+quote = "1.0"
+
+

为定义一个过程式宏,请将示例 19-31 中的代码放在 hello_macro_derive crate 的 src/lib.rs 文件里面。注意这段代码在我们添加 impl_hello_macro 函数的定义之前是无法编译的。

+

文件名:hello_macro_derive/src/lib.rs

+
use proc_macro::TokenStream;
+use quote::quote;
+
+#[proc_macro_derive(HelloMacro)]
+pub fn hello_macro_derive(input: TokenStream) -> TokenStream {
+    // Construct a representation of Rust code as a syntax tree
+    // that we can manipulate
+    let ast = syn::parse(input).unwrap();
+
+    // Build the trait implementation
+    impl_hello_macro(&ast)
+}
+

示例 19-31: 大多数过程式宏处理 Rust 代码时所需的代码

+

注意我们将代码分成了hello_macro_deriveimpl_hello_macro 两个函数,前者负责解析 TokenStream,后者负责转换语法树:这使得编写过程宏更方便。几乎你看到或者创建的每一个过程宏的外部函数(这里是hello_macro_derive)中的代码都跟这里是一样的。你放入内部函数(这里是impl_hello_macro)中的代码根据你的过程宏的设计目的会有所不同。

+

现在,我们已经引入了三个新的 crate:proc_macrosynquote 。Rust 自带 proc_macro crate,因此无需将其加到 Cargo.toml 文件的依赖中。proc_macro crate 是编译器用来读取和操作我们 Rust 代码的 API。

+

syn crate 将字符串中的 Rust 代码解析成为一个可以操作的数据结构。quote 则将 syn 解析的数据结构转换回 Rust 代码。这些 crate 让解析任何我们所要处理的 Rust 代码变得更简单:为 Rust 编写整个的解析器并不是一件简单的工作。

+

当用户在一个类型上指定 #[derive(HelloMacro)] 时,hello_macro_derive 函数将会被调用。因为我们已经使用 proc_macro_derive 及其指定名称HelloMacrohello_macro_derive 函数进行了注解,指定名称HelloMacro就是 trait 名,这是大多数过程宏遵循的习惯。

+

该函数首先将来自 TokenStreaminput 转换为一个我们可以解释和操作的数据结构。这正是 syn 派上用场的地方。syn 中的 parse 函数获取一个 TokenStream 并返回一个表示解析出 Rust 代码的 DeriveInput 结构体。示例 19-32 展示了从字符串 struct Pancakes; 中解析出来的 DeriveInput 结构体的相关部分:

+
DeriveInput {
+    // --snip--
+
+    ident: Ident {
+        ident: "Pancakes",
+        span: #0 bytes(95..103)
+    },
+    data: Struct(
+        DataStruct {
+            struct_token: Struct,
+            fields: Unit,
+            semi_token: Some(
+                Semi
+            )
+        }
+    )
+}
+

示例 19-32: 解析示例 19-30 中带有宏属性的代码时得到的 DeriveInput 实例

+

该结构体的字段展示了我们解析的 Rust 代码是一个类单元结构体,其 ident(identifier,表示名字)为 Pancakes。该结构体里面有更多字段描述了所有类型的 Rust 代码,查阅 synDeriveInput 的文档 以获取更多信息。

+

很快我们将定义 impl_hello_macro 函数,其用于构建所要包含在内的 Rust 新代码。但在此之前,注意其输出也是 TokenStream。所返回的 TokenStream 会被加到我们的 crate 用户所写的代码中,因此,当用户编译他们的 crate 时,他们会通过修改后的 TokenStream 获取到我们所提供的额外功能。

+

你可能也注意到了,当调用 syn::parse 函数失败时,我们用 unwrap 来使 hello_macro_derive 函数 panic。在错误时 panic 对过程宏来说是必须的,因为 proc_macro_derive 函数必须返回 TokenStream 而不是 Result,以此来符合过程宏的 API。这里选择用 unwrap 来简化了这个例子;在生产代码中,则应该通过 panic!expect 来提供关于发生何种错误的更加明确的错误信息。

+

现在我们有了将注解的 Rust 代码从 TokenStream 转换为 DeriveInput 实例的代码,让我们来创建在注解类型上实现 HelloMacro trait 的代码,如示例 19-33 所示。

+

文件名:hello_macro_derive/src/lib.rs

+
use proc_macro::TokenStream;
+use quote::quote;
+
+#[proc_macro_derive(HelloMacro)]
+pub fn hello_macro_derive(input: TokenStream) -> TokenStream {
+    // Construct a representation of Rust code as a syntax tree
+    // that we can manipulate
+    let ast = syn::parse(input).unwrap();
+
+    // Build the trait implementation
+    impl_hello_macro(&ast)
+}
+
+fn impl_hello_macro(ast: &syn::DeriveInput) -> TokenStream {
+    let name = &ast.ident;
+    let gen = quote! {
+        impl HelloMacro for #name {
+            fn hello_macro() {
+                println!("Hello, Macro! My name is {}!", stringify!(#name));
+            }
+        }
+    };
+    gen.into()
+}
+

示例 19-33: 使用解析过的 Rust 代码实现 HelloMacro trait

+

我们得到一个包含以 ast.ident 作为注解类型名字(标识符)的 Ident 结构体实例。示例 19-32 中的结构体表明当 impl_hello_macro 函数运行于示例 19-30 中的代码上时 ident 字段的值是 "Pancakes"。因此,示例 19-33 中 name 变量会包含一个 Ident 结构体的实例,当打印时,会是字符串 "Pancakes",也就是示例 19-30 中结构体的名称。

+

quote! 宏能让我们编写希望返回的 Rust 代码。quote! 宏执行的直接结果并不是编译器所期望的所以需要转换为 TokenStream。为此需要调用 into 方法,它会消费这个中间表示(intermediate representation,IR)并返回所需的 TokenStream 类型值。

+

这个宏也提供了一些非常酷的模板机制;我们可以写 #name ,然后 quote! 会以名为 name 的变量值来替换它。你甚至可以做一些类似常用宏那样的重复代码的工作。查阅 quote crate 的文档 来获取详尽的介绍。

+

我们期望我们的过程式宏能够为通过 #name 获取到的用户注解类型生成 HelloMacro trait 的实现。该 trait 的实现有一个函数 hello_macro ,其函数体包括了我们期望提供的功能:打印 Hello, Macro! My name is 和注解的类型名。

+

此处所使用的 stringify! 为 Rust 内置宏。其接收一个 Rust 表达式,如 1 + 2 ,然后在编译时将表达式转换为一个字符串常量,如 "1 + 2" 。这与 format!println! 是不同的,它计算表达式并将结果转换为 String 。有一种可能的情况是,所输入的 #name 可能是一个需要打印的表达式,因此我们用 stringify!stringify! 也能通过在编译时将 #name 转换为字符串来节省内存分配。

+

此时,cargo build 应该都能成功编译 hello_macrohello_macro_derive 。我们将这些 crate 连接到示例 19-30 的代码中来看看过程宏的行为!在 projects 目录下用 cargo new pancakes 命令新建一个二进制项目。需要将 hello_macrohello_macro_derive 作为依赖加到 pancakes 包的 Cargo.toml 文件中去。如果你正将 hello_macrohello_macro_derive 的版本发布到 crates.io 上,其应为常规依赖;如果不是,则可以像下面这样将其指定为 path 依赖:

+
hello_macro = { path = "../hello_macro" }
+hello_macro_derive = { path = "../hello_macro/hello_macro_derive" }
+
+

把示例 19-30 中的代码放在 src/main.rs ,然后执行 cargo run:其应该打印 Hello, Macro! My name is Pancakes!。其包含了该过程宏中 HelloMacro trait 的实现,而无需 pancakes crate 实现它;#[derive(HelloMacro)] 增加了该 trait 实现。

+

接下来,让我们探索一下其他类型的过程宏与自定义派生宏有何区别。

+

类属性宏

+

类属性宏与自定义派生宏相似,不同的是 derive 属性生成代码,它们(类属性宏)能让你创建新的属性。它们也更为灵活;derive 只能用于结构体和枚举;属性还可以用于其它的项,比如函数。作为一个使用类属性宏的例子,可以创建一个名为 route 的属性用于注解 web 应用程序框架(web application framework)的函数:

+
#[route(GET, "/")]
+fn index() {
+

#[route] 属性将由框架本身定义为一个过程宏。其宏定义的函数签名看起来像这样:

+
#[proc_macro_attribute]
+pub fn route(attr: TokenStream, item: TokenStream) -> TokenStream {
+

这里有两个 TokenStream 类型的参数;第一个用于属性内容本身,也就是 GET, "/" 部分。第二个是属性所标记的项:在本例中,是 fn index() {} 和剩下的函数体。

+

除此之外,类属性宏与自定义派生宏工作方式一致:创建 proc-macro crate 类型的 crate 并实现希望生成代码的函数!

+

类函数宏

+

类函数(Function-like)宏的定义看起来像函数调用的宏。类似于 macro_rules!,它们比函数更灵活;例如,可以接受未知数量的参数。然而 macro_rules! 宏只能使用之前 “使用 macro_rules! 的声明宏用于通用元编程” 介绍的类匹配的语法定义。类函数宏获取 TokenStream 参数,其定义使用 Rust 代码操纵 TokenStream,就像另两种过程宏一样。一个类函数宏例子是可以像这样被调用的 sql! 宏:

+
let sql = sql!(SELECT * FROM posts WHERE id=1);
+

这个宏会解析其中的 SQL 语句并检查其是否是句法正确的,这是比 macro_rules! 可以做到的更为复杂的处理。sql! 宏应该被定义为如此:

+
#[proc_macro]
+pub fn sql(input: TokenStream) -> TokenStream {
+

这类似于自定义派生宏的签名:获取括号中的 token,并返回希望生成的代码。

+

总结

+

好的!现在我们学习了 Rust 并不常用但在特定情况下你可能用得着的功能。我们介绍了很多复杂的主题,这样若你在错误信息提示或阅读他人代码时遇到它们,至少可以说之前已经见过这些概念和语法了。你可以使用本章作为一个解决方案的参考。

+

接下来,我们将再开始一个项目,将本书所学的所有内容付与实践!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch21-00-final-project-a-web-server.html b/ch21-00-final-project-a-web-server.html new file mode 100644 index 000000000..c5013ecc9 --- /dev/null +++ b/ch21-00-final-project-a-web-server.html @@ -0,0 +1,257 @@ + + + + + + 最后的项目:构建多线程 web server - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

最后的项目:构建多线程 web server

+
+

ch21-00-final-project-a-web-server.md +
+commit 5df6909c57b3ba55f156a4122a42b805436de90c

+
+

这是一次漫长的旅途,不过我们到达了本书的结束。在本章中,我们将一同构建另一个项目,来展示最后几章所学,同时复习更早的章节。

+

作为最后的项目,我们将要实现一个返回 “hello” 的 web server,它在浏览器中看起来就如图例 20-1 所示:

+

hello from rust

+

图例 20-1: 我们最后将一起分享的项目

+

如下是构建 web server 的计划:

+
    +
  1. 学习一些 TCP 与 HTTP 知识
  2. +
  3. 在套接字(socket)上监听 TCP 请求
  4. +
  5. 解析少量的 HTTP 请求
  6. +
  7. 创建一个合适的 HTTP 响应
  8. +
  9. 通过线程池改善 server 的吞吐量
  10. +
+

不过在开始之前,需要提到一点细节:这里使用的方法并不是使用 Rust 构建 web server 最好的方法。crates.io 上有很多可用于生产环境的 crate,它们提供了比我们所要编写的更为完整的 web server 和线程池实现。然而,本章的目的在于学习,而不是走捷径。因为 Rust 是一个系统编程语言,我们能够选择处理什么层次的抽象,并能够选择比其他语言可能或可用的层次更低的层次。因此我们将自己编写一个基础的 HTTP server 和线程池,以便学习将来可能用到的 crate 背后的通用理念和技术。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch21-01-single-threaded.html b/ch21-01-single-threaded.html new file mode 100644 index 000000000..7db8d3450 --- /dev/null +++ b/ch21-01-single-threaded.html @@ -0,0 +1,600 @@ + + + + + + 建立单线程 web server - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

构建单线程 web server

+
+

ch21-01-single-threaded.md +
+commit 5df6909c57b3ba55f156a4122a42b805436de90c

+
+

首先让我们创建一个可运行的单线程 web server,不过在开始之前,我们将快速了解一下构建 web server 所涉及到的协议。这些协议的细节超出了本书的范畴,不过一个简单的概括会提供我们所需的信息。

+

web server 中涉及到的两个主要协议是 超文本传输协议Hypertext Transfer ProtocolHTTP)和 传输控制协议Transmission Control ProtocolTCP)。这两者都是 请求 - 响应request-response)协议,也就是说,有 客户端client)来初始化请求,并有 服务端server)监听请求并向客户端提供响应。请求与响应的内容由协议本身定义。

+

TCP 是一个底层协议,它描述了信息如何从一个 server 到另一个的细节,不过其并不指定信息是什么。HTTP 构建于 TCP 之上,它定义了请求和响应的内容。为此,技术上讲可将 HTTP 用于其他协议之上,不过对于绝大部分情况,HTTP 通过 TCP 传输。我们将要做的就是处理 TCP 和 HTTP 请求与响应的原始字节数据。

+

监听 TCP 连接

+

我们的 web server 所需做的第一件事,是监听 TCP 连接。标准库提供了 std::net 模块处理这些功能。让我们一如既往新建一个项目:

+
$ cargo new hello
+     Created binary (application) `hello` project
+$ cd hello
+
+

现在,在 src/main.rs 输入示例 20-1 中的代码,作为一个开始。这段代码会在地址 127.0.0.1:7878 上监听传入的 TCP 流。当获取到传入的流,它会打印出 Connection established!

+

文件名:src/main.rs

+
use std::net::TcpListener;
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+
+    for stream in listener.incoming() {
+        let stream = stream.unwrap();
+
+        println!("Connection established!");
+    }
+}
+

示例 20-1: 监听传入的流并在接收到流时打印信息

+

TcpListener 用于监听 TCP 连接。我们选择监听本地地址 127.0.0.1:7878。将这个地址拆开来看,冒号之前的部分是一个代表本机的 IP 地址(在每台计算机上,这个地址都指本机,并不特指作者的计算机),而 7878 是端口。选择这个端口出于两个原因:通常 HTTP 服务器不在这个端口上接受请求,所以它不太可能与你机器上运行的其它 web server 的端口冲突;而且 7878 在电话上打出来就是 "rust"(译者注:九宫格键盘上的英文)。

+

在这个场景中 bind 函数类似于 new 函数,在这里它返回一个新的 TcpListener 实例。这个函数叫做 bind 是因为,在网络领域,连接到要监听的端口称为“绑定到端口”(“binding to a port”)

+

bind 函数返回 Result<T, E>,这表明绑定可能会失败。例如,监听 80 端口需要管理员权限(非管理员用户只能监听大于 1023 的端口),所以如果尝试监听 80 端口而没有管理员权限,则会绑定失败。再比如,如果我们运行这个程序的两个实例,并因此有两个实例监听同一个端口,那么绑定也将失败。我们是出于学习目的来编写一个基础的服务器,不用关心处理这类错误,而仅仅使用 unwrap 在出现这些情况时直接停止程序。

+

TcpListenerincoming 方法返回一个迭代器,它提供了一系列的流(更准确的说是 TcpStream 类型的流)。stream)代表一个客户端和服务端之间打开的连接。连接connection)代表客户端连接服务端、服务端生成响应以及服务端关闭连接的全部请求 / 响应过程。为此,我们会从 TcpStream 读取客户端发送了什么并接着向流发送响应以向客户端发回数据。总体来说,这个 for 循环会依次处理每个连接并产生一系列的流供我们处理。

+

目前,处理流的代码中也有一个 unwrap 调用,如果 stream 出现任何错误会终止程序;如果没有任何错误,则打印出信息。下一个例子中,我们将为成功的情况增加更多功能。当客户端连接到服务端时,incoming 方法是可能返回错误的,因为我们实际上不是在遍历连接,而是遍历 连接尝试connection attempts)。连接的尝试可能会因为多种原因不能成功,大部分是操作系统相关的。例如,很多系统限制同时打开的连接数,超出数量限制的新连接尝试会产生错误,直到一些现有的连接关闭为止。

+

让我们试试这段代码!首先在终端执行 cargo run,接着在浏览器中打开 127.0.0.1:7878。浏览器会显示出看起来类似于“连接重置”(“Connection reset”)的错误信息,因为 server 目前并没响应任何数据。如果我们观察终端,会发现当浏览器连接我们的服务端时,会打印出一系列的信息!

+
     Running `target/debug/hello`
+Connection established!
+Connection established!
+Connection established!
+
+

有时,对于一次浏览器请求,可能会打印出多条信息;这可能是因为,浏览器在请求页面的同时,还请求了其他资源,比如出现在浏览器标签页开头的图标(favicon.ico)。

+

这也可能是因为浏览器尝试多次连接服务端,因为服务端没有响应任何数据。作为 drop 实现的一部分,当 stream 在循环的结尾离开作用域并被丢弃,其连接将被关闭。浏览器有时通过重连来处理关闭的连接,因为对于一般网站而言,这些问题可能是暂时的。这些都不重要;现在重要的是,我们成功的处理了 TCP 连接!

+

记得当运行完特定版本的代码后,使用 ctrl-C 来停止程序。并通过执行 cargo run 命令在做出最新的代码修改之后重启服务。

+

读取请求

+

让我们实现读取来自浏览器请求的功能!为了分离“获取连接”以及“接下来对连接的操作”,我们将开始写一个新函数来处理连接。在这个新的 handle_connection 函数中,我们从 TCP 流中读取数据,并打印出来,以便观察浏览器发送过来的数据。将代码修改为如示例 20-2 所示:

+

文件名:src/main.rs

+
use std::{
+    io::{prelude::*, BufReader},
+    net::{TcpListener, TcpStream},
+};
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+
+    for stream in listener.incoming() {
+        let stream = stream.unwrap();
+
+        handle_connection(stream);
+    }
+}
+
+fn handle_connection(mut stream: TcpStream) {
+    let buf_reader = BufReader::new(&stream);
+    let http_request: Vec<_> = buf_reader
+        .lines()
+        .map(|result| result.unwrap())
+        .take_while(|line| !line.is_empty())
+        .collect();
+
+    println!("Request: {http_request:#?}");
+}
+

示例 20-2: 读取 TcpStream 并打印数据

+

这里将 std::io::preludestd::io::BufReader 引入作用域,来获取读写流所需的特定 trait。在 main 函数的 for 循环中,相比获取到连接时打印信息,现在调用新的 handle_connection 函数并向其传递 stream

+

handle_connection 中,我们新建了一个 BufReader 实例来封装一个 stream 的可变引用。BufReader 增加了缓存来替我们管理 std::io::Read trait 方法的调用。

+

我们创建了一个 http_request 变量来收集浏览器发送给服务端的请求行。这里增加了 Vec<_> 类型注解表明希望将这些行收集到一个 vector 中。

+

BufReader 实现了 std::io::BufRead trait,它提供了 lines 方法。lines 方法通过遇到换行符(newline)字节就切分数据流的方式返回一个 Result<String, std::io::Error> 的迭代器。为了获取每一个 String,通过 map 并 unwrap 每一个 Result。如果数据不是有效的 UTF-8 编码或者读取流遇到问题时,Result 可能是一个错误。一如既往生产环境的程序应该更优雅地处理这些错误,不过出于简单的目的我们选择在错误情况下停止程序。

+

浏览器通过连续发送两个换行符来代表一个 HTTP 请求的结束,所以为了从流中获取一个请求,我们获取行直到它们不为空。一旦将这些行收集进 vector,就可以使用友好的 debug 格式化打印它们,以便看看 web 浏览器发送给服务端的指令。

+

让我们试一试!启动程序并再次在浏览器中发起请求。注意浏览器中仍然会出现错误页面,不过终端中程序的输出现在看起来像这样:

+
$ cargo run
+   Compiling hello v0.1.0 (file:///projects/hello)
+    Finished dev [unoptimized + debuginfo] target(s) in 0.42s
+     Running `target/debug/hello`
+Request: [
+    "GET / HTTP/1.1",
+    "Host: 127.0.0.1:7878",
+    "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:99.0) Gecko/20100101 Firefox/99.0",
+    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
+    "Accept-Language: en-US,en;q=0.5",
+    "Accept-Encoding: gzip, deflate, br",
+    "DNT: 1",
+    "Connection: keep-alive",
+    "Upgrade-Insecure-Requests: 1",
+    "Sec-Fetch-Dest: document",
+    "Sec-Fetch-Mode: navigate",
+    "Sec-Fetch-Site: none",
+    "Sec-Fetch-User: ?1",
+    "Cache-Control: max-age=0",
+]
+
+

根据使用的浏览器不同可能会出现稍微不同的数据。现在我们打印出了请求数据,可以通过观察第一行 GET 之后的路径来解释为何会从浏览器得到多个连接。如果重复的连接都是请求 /,就知道了浏览器尝试重复获取 / 因为它没有从程序得到响应。

+

让我们拆开请求数据来理解浏览器向程序请求了什么。

+

仔细观察 HTTP 请求

+

HTTP 是一个基于文本的协议,同时一个请求有如下格式:

+
Method Request-URI HTTP-Version CRLF
+headers CRLF
+message-body
+
+

第一行叫做 请求行request line),它存放了客户端请求了什么的信息。请求行的第一部分是所使用的 method,比如 GETPOST,这描述了客户端如何进行请求。这里客户端使用了 GET 请求,表明它在请求信息。

+

请求行接下来的部分是 /,它代表客户端请求的 统一资源标识符Uniform Resource IdentifierURI) —— URI 大体上类似,但也不完全类似于 URL(统一资源定位符Uniform Resource Locators)。URI 和 URL 之间的区别对于本章的目的来说并不重要,不过 HTTP 规范使用术语 URI,所以这里可以简单的将 URL 理解为 URI。

+

最后一部分是客户端使用的 HTTP 版本,然后请求行以 CRLF 序列 (CRLF 代表回车和换行,carriage return line feed,这是打字机时代的术语!)结束。CRLF 序列也可以写成\r\n,其中\r是回车符,\n是换行符。CRLF 序列将请求行与其余请求数据分开。请注意,打印 CRLF 时,我们会看到一个新行,而不是\r\n

+

观察目前运行程序所接收到的数据的请求行,可以看到 GET 是 method,/ 是请求 URI,而 HTTP/1.1 是版本。

+

Host: 开始的其余的行是 headers;GET 请求没有 body。

+

如果你希望的话,尝试用不同的浏览器发送请求,或请求不同的地址,比如 127.0.0.1:7878/test,来观察请求数据如何变化。

+

现在我们知道了浏览器请求了什么。让我们返回一些数据!

+

编写响应

+

我们将实现在客户端请求的响应中发送数据的功能。响应有如下格式:

+
HTTP-Version Status-Code Reason-Phrase CRLF
+headers CRLF
+message-body
+
+

第一行叫做 状态行status line),它包含响应的 HTTP 版本、一个数字状态码用以总结请求的结果和一个描述之前状态码的文本原因短语。CRLF 序列之后是任意 header,另一个 CRLF 序列,和响应的 body。

+

这里是一个使用 HTTP 1.1 版本的响应例子,其状态码为 200,原因短语为 OK,没有 header,也没有 body:

+
HTTP/1.1 200 OK\r\n\r\n
+
+

状态码 200 是一个标准的成功响应。这些文本是一个微型的成功 HTTP 响应。让我们将这些文本写入流作为成功请求的响应!在 handle_connection 函数中,我们需要去掉打印请求数据的 println!,并替换为示例 20-3 中的代码:

+

文件名:src/main.rs

+
use std::{
+    io::{prelude::*, BufReader},
+    net::{TcpListener, TcpStream},
+};
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+
+    for stream in listener.incoming() {
+        let stream = stream.unwrap();
+
+        handle_connection(stream);
+    }
+}
+
+fn handle_connection(mut stream: TcpStream) {
+    let buf_reader = BufReader::new(&stream);
+    let http_request: Vec<_> = buf_reader
+        .lines()
+        .map(|result| result.unwrap())
+        .take_while(|line| !line.is_empty())
+        .collect();
+
+    let response = "HTTP/1.1 200 OK\r\n\r\n";
+
+    stream.write_all(response.as_bytes()).unwrap();
+}
+

示例 20-3: 将一个微型成功 HTTP 响应写入流

+

新代码中的第一行定义了变量 response 来存放将要返回的成功响应的数据。接着,在 response 上调用 as_bytes,因为 streamwrite_all 方法获取一个 &[u8] 并直接将这些字节发送给连接。因为 write_all 操作可能会失败,所以像之前那样对任何错误结果使用 unwrap。同理,在真实世界的应用中这里需要添加错误处理。

+

有了这些修改,运行我们的代码并进行请求!我们不再向终端打印任何数据,所以不会再看到除了 Cargo 以外的任何输出。不过当在浏览器中加载 127.0.0.1:7878 时,会得到一个空页面而不是错误。太棒了!我们刚刚手写收发了一个 HTTP 请求与响应。

+

返回真正的 HTML

+

让我们实现不只是返回空页面的功能。在项目根目录创建一个新文件,hello.html —— 也就是说,不是在 src 目录。在此可以放入任何你期望的 HTML;列表 20-4 展示了一个可能的文本:

+

文件名:hello.html

+
<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Hello!</title>
+  </head>
+  <body>
+    <h1>Hello!</h1>
+    <p>Hi from Rust</p>
+  </body>
+</html>
+
+

示例 20-4: 一个简单的 HTML 文件用来作为响应

+

这是一个极小化的 HTML5 文档,它有一个标题和一小段文本。为了在 server 接受请求时返回它,需要如示例 20-5 所示修改 handle_connection 来读取 HTML 文件,将其加入到响应的 body 中,并发送:

+

文件名:src/main.rs

+
use std::{
+    fs,
+    io::{prelude::*, BufReader},
+    net::{TcpListener, TcpStream},
+};
+// --snip--
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+
+    for stream in listener.incoming() {
+        let stream = stream.unwrap();
+
+        handle_connection(stream);
+    }
+}
+
+fn handle_connection(mut stream: TcpStream) {
+    let buf_reader = BufReader::new(&stream);
+    let http_request: Vec<_> = buf_reader
+        .lines()
+        .map(|result| result.unwrap())
+        .take_while(|line| !line.is_empty())
+        .collect();
+
+    let status_line = "HTTP/1.1 200 OK";
+    let contents = fs::read_to_string("hello.html").unwrap();
+    let length = contents.len();
+
+    let response =
+        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
+
+    stream.write_all(response.as_bytes()).unwrap();
+}
+

示例 20-5: 将 hello.html 的内容作为响应 body 发送

+

我们在开头 use 语句将标准库的文件系统模块 fs 引入作用域。打开和读取文件的代码应该看起来很熟悉,因为第十二章 I/O 项目的示例 12-4 中读取文件内容时出现过类似的代码。

+

接下来,使用 format! 将文件内容加入到将要写入流的成功响应的 body 中。

+

使用 cargo run 运行程序,在浏览器加载 127.0.0.1:7878,你应该会看到渲染出来的 HTML 文件!

+

目前忽略了 http_request 中的请求数据并无条件的发送了 HTML 文件的内容。这意味着如果尝试在浏览器中请求 127.0.0.1:7878/something-else 也会得到同样的 HTML 响应。目前我们的 server 的作用是非常有限的,也不是大部分 server 所做的;让我们检查请求并只对格式良好(well-formed)的请求 / 发送 HTML 文件。

+

验证请求并有选择的进行响应

+

目前我们的 web server 不管客户端请求什么都会返回相同的 HTML 文件。让我们增加在返回 HTML 文件前检查浏览器是否请求 /,并在其请求任何其他内容时返回错误的功能。为此需要如示例 20-6 那样修改 handle_connection。新代码接收到的请求的内容与已知的 / 请求的一部分做比较,并增加了 ifelse 块来区别处理请求:

+

文件名:src/main.rs

+
use std::{
+    fs,
+    io::{prelude::*, BufReader},
+    net::{TcpListener, TcpStream},
+};
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+
+    for stream in listener.incoming() {
+        let stream = stream.unwrap();
+
+        handle_connection(stream);
+    }
+}
+// --snip--
+
+fn handle_connection(mut stream: TcpStream) {
+    let buf_reader = BufReader::new(&stream);
+    let request_line = buf_reader.lines().next().unwrap().unwrap();
+
+    if request_line == "GET / HTTP/1.1" {
+        let status_line = "HTTP/1.1 200 OK";
+        let contents = fs::read_to_string("hello.html").unwrap();
+        let length = contents.len();
+
+        let response = format!(
+            "{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"
+        );
+
+        stream.write_all(response.as_bytes()).unwrap();
+    } else {
+        // some other request
+    }
+}
+

示例 20-6: 以不同于其它请求的方式处理 / 请求

+

我们只看 HTTP 请求的第一行,所以不同于将整个请求读取进 vector 中,这里调用 next 从迭代器中获取第一项。第一个 unwrap 负责处理 Option 并在迭代器没有项时停止程序。第二个 unwrap 处理 Result 并与示例 20-2 中增加的 map 中的 unwrap 有着相同的效果。

+

接下来检查 request_line 是否等于一个 / 路径的 GET 请求。如果是,if 代码块返回 HTML 文件的内容。

+

如果 request_line 等于一个 / 路径的 GET 请求,就说明接收的是其他请求。我们之后会在 else 块中增加代码来响应所有其他请求。

+

现在如果运行代码并请求 127.0.0.1:7878,就会得到 hello.html 中的 HTML。如果进行任何其他请求,比如 127.0.0.1:7878/something-else,则会得到像运行示例 20-1 和 20-2 中代码那样的连接错误。

+

现在向示例 20-7 的 else 块增加代码来返回一个带有 404 状态码的响应,这代表了所请求的内容没有找到。接着也会返回一个 HTML 向浏览器终端用户表明此意:

+

文件名:src/main.rs

+
use std::{
+    fs,
+    io::{prelude::*, BufReader},
+    net::{TcpListener, TcpStream},
+};
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+
+    for stream in listener.incoming() {
+        let stream = stream.unwrap();
+
+        handle_connection(stream);
+    }
+}
+
+fn handle_connection(mut stream: TcpStream) {
+    let buf_reader = BufReader::new(&stream);
+    let request_line = buf_reader.lines().next().unwrap().unwrap();
+
+    if request_line == "GET / HTTP/1.1" {
+        let status_line = "HTTP/1.1 200 OK";
+        let contents = fs::read_to_string("hello.html").unwrap();
+        let length = contents.len();
+
+        let response = format!(
+            "{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"
+        );
+
+        stream.write_all(response.as_bytes()).unwrap();
+    // --snip--
+    } else {
+        let status_line = "HTTP/1.1 404 NOT FOUND";
+        let contents = fs::read_to_string("404.html").unwrap();
+        let length = contents.len();
+
+        let response = format!(
+            "{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"
+        );
+
+        stream.write_all(response.as_bytes()).unwrap();
+    }
+}
+

示例 20-7: 对于任何不是 / 的请求返回 404 状态码的响应和错误页面

+

这里,响应的状态行有状态码 404 和原因短语 NOT FOUND。仍然没有返回任何 header,而其 body 将是 404.html 文件中的 HTML。需要在 hello.html 同级目录创建 404.html 文件作为错误页面;这一次也可以随意使用任何 HTML 或使用示例 20-8 中的示例 HTML:

+

文件名:404.html

+
<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Hello!</title>
+  </head>
+  <body>
+    <h1>Oops!</h1>
+    <p>Sorry, I don't know what you're asking for.</p>
+  </body>
+</html>
+
+

示例 20-8: 任何 404 响应所返回错误页面内容样例

+

有了这些修改,再次运行 server。请求 127.0.0.1:7878 应该会返回 hello.html 的内容,而对于任何其他请求,比如 127.0.0.1:7878/foo,应该会返回 404.html 中的错误 HTML!

+

少量代码重构

+

目前 ifelse 块中的代码有很多的重复:他们都读取文件并将其内容写入流。唯一的区别是状态行和文件名。为了使代码更为简明,将这些区别分别提取到一行 ifelse 中,对状态行和文件名变量赋值;然后在读取文件和写入响应的代码中无条件的使用这些变量。重构后取代了大段 ifelse 块代码后的结果如示例 20-9 所示:

+

文件名:src/main.rs

+
use std::{
+    fs,
+    io::{prelude::*, BufReader},
+    net::{TcpListener, TcpStream},
+};
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+
+    for stream in listener.incoming() {
+        let stream = stream.unwrap();
+
+        handle_connection(stream);
+    }
+}
+// --snip--
+
+fn handle_connection(mut stream: TcpStream) {
+    // --snip--
+    let buf_reader = BufReader::new(&stream);
+    let request_line = buf_reader.lines().next().unwrap().unwrap();
+
+    let (status_line, filename) = if request_line == "GET / HTTP/1.1" {
+        ("HTTP/1.1 200 OK", "hello.html")
+    } else {
+        ("HTTP/1.1 404 NOT FOUND", "404.html")
+    };
+
+    let contents = fs::read_to_string(filename).unwrap();
+    let length = contents.len();
+
+    let response =
+        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
+
+    stream.write_all(response.as_bytes()).unwrap();
+}
+

示例 20-9: 重构使得 ifelse 块中只包含两个情况所不同的代码

+

现在 ifelse 块所做的唯一的事就是在一个元组中返回合适的状态行和文件名的值;接着使用第十九章讲到的使用模式的 let 语句通过解构元组的两部分为 filenameheader 赋值。

+

之前读取文件和写入响应的冗余代码现在位于 ifelse 块之外,并会使用变量 status_linefilename。这样更易于观察这两种情况真正有何不同,还意味着如果需要改变如何读取文件或写入响应时只需要更新一处的代码。示例 20-9 中代码的行为与示例 20-8 完全一样。

+

好极了!我们有了一个 40 行左右 Rust 代码的小而简单的 server,它对一个请求返回页面内容而对所有其他请求返回 404 响应。

+

目前 server 运行于单线程中,它一次只能处理一个请求。让我们模拟一些慢请求来看看这如何会成为一个问题,并进行修复以便 server 可以一次处理多个请求。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch21-02-multithreaded.html b/ch21-02-multithreaded.html new file mode 100644 index 000000000..a8dfb9d73 --- /dev/null +++ b/ch21-02-multithreaded.html @@ -0,0 +1,1155 @@ + + + + + + 将单线程 server 变为多线程 server - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

将单线程 server 变为多线程 server

+
+

ch21-02-multithreaded.md +
+commit 98c6225e5fb8255349ec0dc235433530ed3fb534

+
+

目前 server 会依次处理每一个请求,意味着它在完成第一个连接的处理之前不会处理第二个连接。如果 server 正接收越来越多的请求,这类串行操作会使性能越来越差。如果一个请求花费很长时间来处理,随后而来的请求则不得不等待这个长请求结束,即便这些新请求可以很快就处理完。我们需要修复这种情况,不过首先让我们实际尝试一下这个问题。

+

在当前 server 实现中模拟慢请求

+

让我们看看一个慢请求如何影响当前 server 实现中的其他请求。示例 20-10 通过模拟慢响应实现了 /sleep 请求处理,它会使 server 在响应之前休眠五秒。

+

文件名:src/main.rs

+
use std::{
+    fs,
+    io::{prelude::*, BufReader},
+    net::{TcpListener, TcpStream},
+    thread,
+    time::Duration,
+};
+// --snip--
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+
+    for stream in listener.incoming() {
+        let stream = stream.unwrap();
+
+        handle_connection(stream);
+    }
+}
+
+fn handle_connection(mut stream: TcpStream) {
+    // --snip--
+
+    let buf_reader = BufReader::new(&stream);
+    let request_line = buf_reader.lines().next().unwrap().unwrap();
+
+    let (status_line, filename) = match &request_line[..] {
+        "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
+        "GET /sleep HTTP/1.1" => {
+            thread::sleep(Duration::from_secs(5));
+            ("HTTP/1.1 200 OK", "hello.html")
+        }
+        _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
+    };
+
+    // --snip--
+
+    let contents = fs::read_to_string(filename).unwrap();
+    let length = contents.len();
+
+    let response =
+        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
+
+    stream.write_all(response.as_bytes()).unwrap();
+}
+

示例 20-10: 通过休眠五秒来模拟慢请求

+

if 切换到 match 后现在有三个分支了。我们需要显式匹配一个 slice 的 request_line 以匹配字符串字面值的模式。match 不会像相等方法那样自动引用和解引用。

+

第一个分支与示例 20-9 中的 if 代码块相同。第二个分支匹配一个 /sleep 请求。当接收到这个请求时,server 在渲染成功 HTML 页面之前会先休眠五秒。第三个分支与示例 20-9 中的 else 代码块相同。

+

现在就可以真切的看出我们的 server 有多么的原始:真实的库将会以更简洁的方式处理多请求识别问题!

+

使用 cargo run 启动 server,并接着打开两个浏览器窗口:一个请求 http://127.0.0.1:7878/ 而另一个请求 http://127.0.0.1:7878/sleep 。如果像之前一样多次请求 /,会发现响应的比较快速。不过如果请求 /sleep 之后再请求 /,就会看到 / 会等待直到 sleep 休眠完五秒之后才出现。

+

有多种技术可以用来避免所有请求都排在慢请求之后;我们将要实现的一个便是线程池。

+

使用线程池改善吞吐量

+

线程池thread pool)是一组预先分配的等待或准备处理任务的线程。当程序收到一个新任务,线程池中的一个线程会被分配任务,这个线程会离开并处理任务。其余的线程则可用于处理在第一个线程处理任务的同时处理其他接收到的任务。当第一个线程处理完任务时,它会返回空闲线程池中等待处理新任务。线程池允许我们并发处理连接,增加 server 的吞吐量。

+

我们会将池中线程限制为较少的数量,以防拒绝服务(Denial of Service,DoS)攻击;如果程序为每一个接收的请求都新建一个线程,某人向 server 发起千万级的请求时会耗尽服务器的资源并导致所有请求的处理都被终止。

+

不同于分配无限的线程,线程池中将有固定数量的等待线程。当新进请求时,将请求发送到线程池中做处理。线程池会维护一个接收请求的队列。每一个线程会从队列中取出一个请求,处理请求,接着向队列索取另一个请求。通过这种设计,则可以并发处理 N 个请求,其中 N 为线程数。如果每一个线程都在响应慢请求,之后的请求仍然会阻塞队列,不过相比之前增加了能处理的慢请求的数量。

+

这个设计仅仅是多种改善 web server 吞吐量的方法之一。其他可供探索的方法有 fork/join 模型fork/join model)、单线程异步 I/O 模型single-threaded async I/O model)或者多线程异步 I/O 模型multi-threaded async I/O model)。如果你对这个主题感兴趣,则可以阅读更多关于其他解决方案的内容并尝试实现它们;对于一个像 Rust 这样的底层语言,所有这些方法都是可能的。

+

在开始之前,让我们讨论一下线程池应用看起来怎样。当尝试设计代码时,首先编写客户端接口确实有助于指导代码设计。以期望的调用方式来构建 API 代码的结构,接着在这个结构之内实现功能,而不是先实现功能再设计公有 API。

+

类似于第十二章项目中使用的测试驱动开发。这里将要使用编译器驱动开发(compiler-driven development)。我们将编写调用所期望的函数的代码,接着观察编译器错误告诉我们接下来需要修改什么使得代码可以工作。不过在开始之前,我们将探索不会作为起点的技术。

+

为每一个请求分配线程

+

首先,让我们探索一下为每一个连接都创建一个线程的代码看起来如何。这并不是最终方案,因为正如之前讲到的它会潜在的分配无限的线程,不过这是一个可用的多线程 server 的起点。接着我们会增加线程池作为改进,这样比较两个方案将会更容易。示例 20-11 展示了 main 的改变,它在 for 循环中为每一个流分配了一个新线程进行处理:

+

文件名:src/main.rs

+
use std::{
+    fs,
+    io::{prelude::*, BufReader},
+    net::{TcpListener, TcpStream},
+    thread,
+    time::Duration,
+};
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+
+    for stream in listener.incoming() {
+        let stream = stream.unwrap();
+
+        thread::spawn(|| {
+            handle_connection(stream);
+        });
+    }
+}
+
+fn handle_connection(mut stream: TcpStream) {
+    let buf_reader = BufReader::new(&stream);
+    let request_line = buf_reader.lines().next().unwrap().unwrap();
+
+    let (status_line, filename) = match &request_line[..] {
+        "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
+        "GET /sleep HTTP/1.1" => {
+            thread::sleep(Duration::from_secs(5));
+            ("HTTP/1.1 200 OK", "hello.html")
+        }
+        _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
+    };
+
+    let contents = fs::read_to_string(filename).unwrap();
+    let length = contents.len();
+
+    let response =
+        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
+
+    stream.write_all(response.as_bytes()).unwrap();
+}
+

示例 20-11: 为每一个流新建一个线程

+

正如第十六章讲到的,thread::spawn 会创建一个新线程并在其中运行闭包中的代码。如果运行这段代码并在在浏览器中加载 /sleep,接着在另两个浏览器标签页中加载 /,确实会发现 / 请求不必等待 /sleep 结束。不过正如之前提到的,这最终会使系统崩溃因为我们无限制的创建新线程。

+

创建有限数量的线程

+

我们期望线程池以类似且熟悉的方式工作,以便从线程切换到线程池并不会对使用该 API 的代码做出较大的修改。示例 20-12 展示我们希望用来替换 thread::spawnThreadPool 结构体的假想接口:

+

文件名:src/main.rs

+
use std::{
+    fs,
+    io::{prelude::*, BufReader},
+    net::{TcpListener, TcpStream},
+    thread,
+    time::Duration,
+};
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+    let pool = ThreadPool::new(4);
+
+    for stream in listener.incoming() {
+        let stream = stream.unwrap();
+
+        pool.execute(|| {
+            handle_connection(stream);
+        });
+    }
+}
+
+fn handle_connection(mut stream: TcpStream) {
+    let buf_reader = BufReader::new(&stream);
+    let request_line = buf_reader.lines().next().unwrap().unwrap();
+
+    let (status_line, filename) = match &request_line[..] {
+        "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
+        "GET /sleep HTTP/1.1" => {
+            thread::sleep(Duration::from_secs(5));
+            ("HTTP/1.1 200 OK", "hello.html")
+        }
+        _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
+    };
+
+    let contents = fs::read_to_string(filename).unwrap();
+    let length = contents.len();
+
+    let response =
+        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
+
+    stream.write_all(response.as_bytes()).unwrap();
+}
+

示例 20-12: 假想的 ThreadPool 接口

+

这里使用 ThreadPool::new 来创建一个新的线程池,它有一个可配置的线程数的参数,在这里是四。这样在 for 循环中,pool.execute 有着类似 thread::spawn 的接口,它获取一个线程池运行于每一个流的闭包。pool.execute 需要实现为获取闭包并传递给池中的线程运行。这段代码还不能编译,不过通过尝试,编译器会指导我们如何修复它。

+

采用编译器驱动构建 ThreadPool

+

继续并对示例 20-12 中的 src/main.rs 做出修改,并利用来自 cargo check 的编译器错误来驱动开发。下面是我们得到的第一个错误:

+
$ cargo check
+    Checking hello v0.1.0 (file:///projects/hello)
+error[E0433]: failed to resolve: use of undeclared type `ThreadPool`
+  --> src/main.rs:11:16
+   |
+11 |     let pool = ThreadPool::new(4);
+   |                ^^^^^^^^^^ use of undeclared type `ThreadPool`
+
+For more information about this error, try `rustc --explain E0433`.
+error: could not compile `hello` (bin "hello") due to 1 previous error
+
+

好的,这告诉我们需要一个 ThreadPool 类型或模块,所以我们将构建一个。ThreadPool 的实现会与 web server 的特定工作相独立,所以让我们从 hello crate 切换到存放 ThreadPool 实现的新库 crate。这也意味着可以在任何工作中使用这个单独的线程池库,而不仅仅是处理网络请求。

+

创建 src/lib.rs 文件,它包含了目前可用的最简单的 ThreadPool 定义:

+

文件名:src/lib.rs

+
pub struct ThreadPool;
+

接着编辑 main.rs 文件通过在 src/main.rs 的开头增加如下代码将 ThreadPool 从库 crate 引入作用域:

+

文件名:src/main.rs

+
use hello::ThreadPool;
+use std::{
+    fs,
+    io::{prelude::*, BufReader},
+    net::{TcpListener, TcpStream},
+    thread,
+    time::Duration,
+};
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+    let pool = ThreadPool::new(4);
+
+    for stream in listener.incoming() {
+        let stream = stream.unwrap();
+
+        pool.execute(|| {
+            handle_connection(stream);
+        });
+    }
+}
+
+fn handle_connection(mut stream: TcpStream) {
+    let buf_reader = BufReader::new(&stream);
+    let request_line = buf_reader.lines().next().unwrap().unwrap();
+
+    let (status_line, filename) = match &request_line[..] {
+        "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
+        "GET /sleep HTTP/1.1" => {
+            thread::sleep(Duration::from_secs(5));
+            ("HTTP/1.1 200 OK", "hello.html")
+        }
+        _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
+    };
+
+    let contents = fs::read_to_string(filename).unwrap();
+    let length = contents.len();
+
+    let response =
+        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
+
+    stream.write_all(response.as_bytes()).unwrap();
+}
+

这仍然不能工作,再次尝试运行来得到下一个需要解决的错误:

+
$ cargo check
+    Checking hello v0.1.0 (file:///projects/hello)
+error[E0599]: no function or associated item named `new` found for struct `ThreadPool` in the current scope
+  --> src/main.rs:12:28
+   |
+12 |     let pool = ThreadPool::new(4);
+   |                            ^^^ function or associated item not found in `ThreadPool`
+
+For more information about this error, try `rustc --explain E0599`.
+error: could not compile `hello` (bin "hello") due to 1 previous error
+
+

这告诉我们下一步是为 ThreadPool 创建一个叫做 new 的关联函数。我们还知道 new 需要有一个参数可以接受 4,而且 new 应该返回 ThreadPool 实例。让我们实现拥有此特征的最小化 new 函数:

+

文件夹:src/lib.rs

+
pub struct ThreadPool;
+
+impl ThreadPool {
+    pub fn new(size: usize) -> ThreadPool {
+        ThreadPool
+    }
+}
+

这里选择 usize 作为 size 参数的类型,因为我们知道为负的线程数没有意义。我们还知道将使用 4 作为线程集合的元素数量,这也就是使用 usize 类型的原因,如第三章 “整型” 部分所讲。

+

再次编译检查这段代码:

+
$ cargo check
+    Checking hello v0.1.0 (file:///projects/hello)
+error[E0599]: no method named `execute` found for struct `ThreadPool` in the current scope
+  --> src/main.rs:17:14
+   |
+17 |         pool.execute(|| {
+   |         -----^^^^^^^ method not found in `ThreadPool`
+
+For more information about this error, try `rustc --explain E0599`.
+error: could not compile `hello` (bin "hello") due to 1 previous error
+
+

现在有了一个警告和一个错误。暂时先忽略警告,发生错误是因为并没有 ThreadPool 上的 execute 方法。回忆 “创建有限数量的线程” 部分我们决定线程池应该有与 thread::spawn 类似的接口,同时我们将实现 execute 函数来获取传递的闭包并将其传递给池中的空闲线程执行。

+

我们会在 ThreadPool 上定义 execute 函数来获取一个闭包参数。回忆第十三章的 “将被捕获的值移出闭包和 Fn trait” 部分,闭包作为参数时可以使用三个不同的 trait:FnFnMutFnOnce。我们需要决定这里应该使用哪种闭包。最终需要实现的类似于标准库的 thread::spawn,所以我们可以观察 thread::spawn 的签名在其参数中使用了何种 bound。查看文档会发现:

+
pub fn spawn<F, T>(f: F) -> JoinHandle<T>
+    where
+        F: FnOnce() -> T,
+        F: Send + 'static,
+        T: Send + 'static,
+

F 是这里我们关心的参数;T 与返回值有关所以我们并不关心。考虑到 spawn 使用 FnOnce 作为 F 的 trait bound,这可能也是我们需要的,因为最终会将传递给 execute 的参数传给 spawn。因为处理请求的线程只会执行闭包一次,这也进一步确认了 FnOnce 是我们需要的 trait,这里符合 FnOnceOnce 的意思。

+

F 还有 trait bound Send 和生命周期绑定 'static,这对我们的情况也是有意义的:需要 Send 来将闭包从一个线程转移到另一个线程,而 'static 是因为并不知道线程会执行多久。让我们编写一个使用带有这些 bound 的泛型参数 FThreadPoolexecute 方法:

+

文件名:src/lib.rs

+
pub struct ThreadPool;
+
+impl ThreadPool {
+    // --snip--
+    pub fn new(size: usize) -> ThreadPool {
+        ThreadPool
+    }
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+    }
+}
+

FnOnce trait 仍然需要之后的 (),因为这里的 FnOnce 代表一个没有参数也没有返回值的闭包。正如函数的定义,返回值类型可以从签名中省略,不过即便没有参数也需要括号。

+

这里再一次增加了 execute 方法的最小化实现:它没有做任何工作,只是尝试让代码能够编译。再次进行检查:

+
$ cargo check
+    Checking hello v0.1.0 (file:///projects/hello)
+    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.24s
+
+

现在就只有警告了!这意味着能够编译了!注意如果尝试 cargo run 运行程序并在浏览器中发起请求,仍会在浏览器中出现在本章开始时那样的错误。这个库实际上还没有调用传递给 execute 的闭包!

+
+

一个你可能听说过的关于像 Haskell 和 Rust 这样有严格编译器的语言的说法是 “如果代码能够编译,它就能工作”。这是一个提醒大家的好时机,实际上这并不是普适的。我们的项目可以编译,不过它完全没有做任何工作!如果构建一个真实且功能完整的项目,则需花费大量的时间来开始编写单元测试来检查代码能否编译 并且 拥有期望的行为。

+
+

new 中验证池中线程数量

+

这里仍然存在警告是因为其并没有对 newexecute 的参数做任何操作。让我们用期望的行为来实现这些函数。以考虑 new 作为开始。之前选择使用无符号类型作为 size 参数的类型,因为线程数为负的线程池没有意义。然而,线程数为零的线程池同样没有意义,不过零是一个完全有效的 usize 值。让我们增加在返回 ThreadPool 实例之前检查 size 是否大于零的代码,并使用 assert! 宏在得到零时 panic,如示例 20-13 所示:

+

文件名:src/lib.rs

+
pub struct ThreadPool;
+
+impl ThreadPool {
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        ThreadPool
+    }
+
+    // --snip--
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+    }
+}
+

示例 20-13: 实现 ThreadPool::newsize 为零时 panic

+

这里也用文档注释为 ThreadPool 增加了一些文档。注意这里遵循了良好的文档实践并增加了一个部分来提示函数会 panic 的情况,正如第十四章所讨论的。尝试运行 cargo doc --open 并点击 ThreadPool 结构体来查看生成的 new 的文档看起来如何!

+

相比像这里使用 assert! 宏,也可以让 new 像之前 I/O 项目中示例 12-9 中 Config::build 那样将 new 更改为 build 并返回一个 Result,不过在这里我们选择创建一个没有任何线程的线程池应该是不可恢复的错误。如果你想做的更好,尝试编写一个采用如下签名的名为 build 的函数来对比一下 new 函数:

+
pub fn build(size: usize) -> Result<ThreadPool, PoolCreationError> {
+

分配空间以储存线程

+

现在有了一个有效的线程池线程数,就可以实际创建这些线程并在返回结构体之前将它们储存在 ThreadPool 结构体中。不过如何 “储存” 一个线程?让我们再看看 thread::spawn 的签名:

+
pub fn spawn<F, T>(f: F) -> JoinHandle<T>
+    where
+        F: FnOnce() -> T,
+        F: Send + 'static,
+        T: Send + 'static,
+

spawn 返回 JoinHandle<T>,其中 T 是闭包返回的类型。尝试使用 JoinHandle 来看看会发生什么。在我们的情况中,传递给线程池的闭包会处理连接并不返回任何值,所以 T 将会是单元类型 ()

+

示例 20-14 中的代码可以编译,不过实际上还并没有创建任何线程。我们改变了 ThreadPool 的定义来存放一个 thread::JoinHandle<()> 的 vector 实例,使用 size 容量来初始化,并设置一个 for 循环来运行创建线程的代码,并返回包含这些线程的 ThreadPool 实例:

+

文件名:src/lib.rs

+
use std::thread;
+
+pub struct ThreadPool {
+    threads: Vec<thread::JoinHandle<()>>,
+}
+
+impl ThreadPool {
+    // --snip--
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let mut threads = Vec::with_capacity(size);
+
+        for _ in 0..size {
+            // create some threads and store them in the vector
+        }
+
+        ThreadPool { threads }
+    }
+    // --snip--
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+    }
+}
+

示例 20-14: 为 ThreadPool 创建一个 vector 来存放线程

+

这里将 std::thread 引入库 crate 的作用域,因为使用了 thread::JoinHandle 作为 ThreadPool 中 vector 元素的类型。

+

在得到了有效的数量之后,ThreadPool 新建一个存放 size 个元素的 vector。with_capacity 函数与 Vec::new 做了同样的工作,不过有一个重要的区别:它为 vector 预先分配空间。因为已经知道了 vector 中需要 size 个元素,预先进行分配比仅仅 Vec::new 要稍微有效率一些,因为 Vec::new 随着插入元素而重新改变大小。

+

如果再次运行 cargo check,它应该会成功。

+

Worker 结构体负责从 ThreadPool 中将代码传递给线程

+

示例 20-14 的 for 循环中留下了一个关于创建线程的注释。如何实际创建线程呢?这是一个难题。标准库提供的创建线程的方法,thread::spawn,它期望获取一些一旦创建线程就应该执行的代码。然而,我们希望开始线程并使其等待稍后传递的代码。标准库的线程实现并没有包含这么做的方法;我们必须自己实现。

+

我们将要实现的行为是创建线程并稍后发送代码,这会在 ThreadPool 和线程间引入一个新数据类型来管理这种新行为。这个数据结构称为 Worker,这是一个池实现中的常见概念。想象一下在餐馆厨房工作的员工:员工等待来自客户的订单,他们负责接受这些订单并完成它们。

+

不同于在线程池中储存一个 JoinHandle<()> 实例的 vector,我们会储存 Worker 结构体的实例。每一个 Worker 会储存一个单独的 JoinHandle<()> 实例。接着会在 Worker 上实现一个方法,该方法将闭包发送到已经运行的线程中执行。我们还会赋予每一个 worker id,这样就可以在日志和调试中区别线程池中的不同 worker。

+

如下是创建 ThreadPool 时会发生的新过程。在通过如下方式设置完 Worker 之后,我们会实现向线程发送闭包的代码:

+
    +
  1. 定义 Worker 结构体存放 idJoinHandle<()>
  2. +
  3. 修改 ThreadPool 存放一个 Worker 实例的 vector
  4. +
  5. 定义 Worker::new 函数,它获取一个 id 数字并返回一个带有 id 和用空闭包分配的线程的 Worker 实例
  6. +
  7. ThreadPool::new 中,使用 for 循环计数生成 id,使用这个 id 新建 Worker,并储存进 vector 中
  8. +
+

如果你渴望挑战,在查示例 20-15 中的代码之前尝试自己实现这些修改。

+

准备好了吗?示例 20-15 就是一个做出了这些修改的例子:

+

文件名:src/lib.rs

+
use std::thread;
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+}
+
+impl ThreadPool {
+    // --snip--
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id));
+        }
+
+        ThreadPool { workers }
+    }
+    // --snip--
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+    }
+}
+
+struct Worker {
+    id: usize,
+    thread: thread::JoinHandle<()>,
+}
+
+impl Worker {
+    fn new(id: usize) -> Worker {
+        let thread = thread::spawn(|| {});
+
+        Worker { id, thread }
+    }
+}
+

示例 20-15: 修改 ThreadPool 存放 Worker 实例而不是直接存放线程

+

这里将 ThreadPool 中字段名从 threads 改为 workers,因为它现在储存 Worker 而不是 JoinHandle<()>。使用 for 循环中的计数作为 Worker::new 的参数,并将每一个新建的 Worker 储存在叫做 workers 的 vector 中。

+

Worker 结构体和其 new 函数是私有的,因为外部代码(比如 src/main.rs 中的 server)并不需要知道关于 ThreadPool 中使用 Worker 结构体的实现细节。Worker::new 函数使用 id 参数并储存了使用一个空闭包创建的 JoinHandle<()>

+
+

注意:如果操作系统因为没有足够的系统资源而无法创建线程时,thread::spawn 会 panic。这会导致整个 server panic,即使一些线程可能创建成功了。出于简单的考虑,这个行为是可行的,不过在一个生产级别的线程池实现中,你可能会希望使用 std::thread::Builder 和其 spawn 方法来返回一个 Result

+
+

这段代码能够编译并用指定给 ThreadPool::new 的参数创建储存了一系列的 Worker 实例,不过 仍然 没有处理 execute 中得到的闭包。让我们聊聊接下来怎么做。

+

使用信道向线程发送请求

+

下一个需要解决的问题是传递给 thread::spawn 的闭包完全没有做任何工作。目前,我们在 execute 方法中获得期望执行的闭包,不过在创建 ThreadPool 的过程中创建每一个 Worker 时需要向 thread::spawn 传递一个闭包。

+

我们希望刚创建的 Worker 结构体能够从 ThreadPool 的队列中获取需要执行的代码,并发送到线程中执行它们。

+

在第十六章,我们学习了 信道 —— 一个沟通两个线程的简单手段 —— 对于这个例子来说则是绝佳的。这里信道将充当任务队列的作用,execute 将通过 ThreadPool 向其中线程正在寻找工作的 Worker 实例发送任务。如下是这个计划:

+
    +
  1. ThreadPool 会创建一个信道并充当发送者。
  2. +
  3. 每个 Worker 将会充当接收者。
  4. +
  5. 新建一个 Job 结构体来存放用于向信道中发送的闭包。
  6. +
  7. execute 方法会在发送者发出期望执行的任务。
  8. +
  9. 在线程中,Worker 会遍历接收者并执行任何接收到的任务。
  10. +
+

让我们以在 ThreadPool::new 中创建信道并让 ThreadPool 实例充当发送者开始,如示例 20-16 所示。Job 是将在信道中发出的类型,目前它是一个没有任何内容的结构体:

+

文件名:src/lib.rs

+
use std::{sync::mpsc, thread};
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: mpsc::Sender<Job>,
+}
+
+struct Job;
+
+impl ThreadPool {
+    // --snip--
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id));
+        }
+
+        ThreadPool { workers, sender }
+    }
+    // --snip--
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+    }
+}
+
+struct Worker {
+    id: usize,
+    thread: thread::JoinHandle<()>,
+}
+
+impl Worker {
+    fn new(id: usize) -> Worker {
+        let thread = thread::spawn(|| {});
+
+        Worker { id, thread }
+    }
+}
+

示例 20-16: 修改 ThreadPool 来储存一个传输 Job 实例的发送者

+

ThreadPool::new 中,新建了一个信道,并接着让线程池在接收端等待。这段代码能够成功编译。

+

让我们尝试在线程池创建每个 worker 时将接收者传递给它们。须知我们希望在 worker 所分配的线程中使用接收者,所以将在闭包中引用 receiver 参数。示例 20-17 中展示的代码还不能编译:

+

文件名:src/lib.rs

+
use std::{sync::mpsc, thread};
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: mpsc::Sender<Job>,
+}
+
+struct Job;
+
+impl ThreadPool {
+    // --snip--
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id, receiver));
+        }
+
+        ThreadPool { workers, sender }
+    }
+    // --snip--
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+    }
+}
+
+// --snip--
+
+
+struct Worker {
+    id: usize,
+    thread: thread::JoinHandle<()>,
+}
+
+impl Worker {
+    fn new(id: usize, receiver: mpsc::Receiver<Job>) -> Worker {
+        let thread = thread::spawn(|| {
+            receiver;
+        });
+
+        Worker { id, thread }
+    }
+}
+

示例 20-17: 将信道的接收端传递给 worker

+

这是一些小而直观的修改:将接收者传递进了 Worker::new,并接着在闭包中使用它。

+

如果尝试 check 代码,会得到这个错误:

+
$ cargo check
+    Checking hello v0.1.0 (file:///projects/hello)
+error[E0382]: use of moved value: `receiver`
+  --> src/lib.rs:26:42
+   |
+21 |         let (sender, receiver) = mpsc::channel();
+   |                      -------- move occurs because `receiver` has type `std::sync::mpsc::Receiver<Job>`, which does not implement the `Copy` trait
+...
+25 |         for id in 0..size {
+   |         ----------------- inside of this loop
+26 |             workers.push(Worker::new(id, receiver));
+   |                                          ^^^^^^^^ value moved here, in previous iteration of loop
+   |
+note: consider changing this parameter type in method `new` to borrow instead if owning the value isn't necessary
+  --> src/lib.rs:47:33
+   |
+47 |     fn new(id: usize, receiver: mpsc::Receiver<Job>) -> Worker {
+   |        --- in this method       ^^^^^^^^^^^^^^^^^^^ this parameter takes ownership of the value
+help: consider moving the expression out of the loop so it is only moved once
+   |
+25 ~         let mut value = Worker::new(id, receiver);
+26 ~         for id in 0..size {
+27 ~             workers.push(value);
+   |
+
+For more information about this error, try `rustc --explain E0382`.
+error: could not compile `hello` (lib) due to 1 previous error
+
+

这段代码尝试将 receiver 传递给多个 Worker 实例。这是不行的,回忆第十六章:Rust 所提供的信道实现是多 生产者,单 消费者 的。这意味着不能简单的克隆信道的消费端来解决问题。我们也不希望将一个消息向多个消费者发送多次;我们希望有一个消息列表和多个 worker 这样每个消息就只会处理一次。

+

另外,从信道队列中取出任务涉及到修改 receiver,所以这些线程需要一个能安全的共享和修改 receiver 的方式,否则可能导致竞争状态(参考第十六章)。

+

回忆一下第十六章讨论的线程安全智能指针,为了在多个线程间共享所有权并允许线程修改其值,需要使用 Arc<Mutex<T>>Arc 使得多个 worker 拥有接收端,而 Mutex 则确保一次只有一个 worker 能从接收端得到任务。示例 20-18 展示了所需的修改:

+

文件名:src/lib.rs

+
use std::{
+    sync::{mpsc, Arc, Mutex},
+    thread,
+};
+// --snip--
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: mpsc::Sender<Job>,
+}
+
+struct Job;
+
+impl ThreadPool {
+    // --snip--
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let receiver = Arc::new(Mutex::new(receiver));
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id, Arc::clone(&receiver)));
+        }
+
+        ThreadPool { workers, sender }
+    }
+
+    // --snip--
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+    }
+}
+
+// --snip--
+
+struct Worker {
+    id: usize,
+    thread: thread::JoinHandle<()>,
+}
+
+impl Worker {
+    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
+        // --snip--
+        let thread = thread::spawn(|| {
+            receiver;
+        });
+
+        Worker { id, thread }
+    }
+}
+

示例 20-18: 使用 ArcMutex 在 worker 间共享接收者

+

ThreadPool::new 中,将接收者放入一个 Arc 和一个 Mutex 中。对于每一个新 worker,克隆 Arc 来增加引用计数,如此这些 worker 就可以共享接收者的所有权了。

+

通过这些修改,代码可以编译了!我们做到了!

+

实现 execute 方法

+

最后让我们实现 ThreadPool 上的 execute 方法。同时也要修改 Job 结构体:它将不再是结构体,Job 将是一个有着 execute 接收到的闭包类型的 trait 对象的类型别名。第二十章 “类型别名用来创建类型同义词” 部分提到过,类型别名允许将长的类型变短。观察示例 20-19:

+

文件名:src/lib.rs

+
use std::{
+    sync::{mpsc, Arc, Mutex},
+    thread,
+};
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: mpsc::Sender<Job>,
+}
+
+// --snip--
+
+type Job = Box<dyn FnOnce() + Send + 'static>;
+
+impl ThreadPool {
+    // --snip--
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let receiver = Arc::new(Mutex::new(receiver));
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id, Arc::clone(&receiver)));
+        }
+
+        ThreadPool { workers, sender }
+    }
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+        let job = Box::new(f);
+
+        self.sender.send(job).unwrap();
+    }
+}
+
+// --snip--
+
+struct Worker {
+    id: usize,
+    thread: thread::JoinHandle<()>,
+}
+
+impl Worker {
+    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
+        let thread = thread::spawn(|| {
+            receiver;
+        });
+
+        Worker { id, thread }
+    }
+}
+

示例 20-19: 为存放每一个闭包的 Box 创建一个 Job 类型别名,接着在信道中发出任务

+

在使用 execute 得到的闭包新建 Job 实例之后,将这些任务从信道的发送端发出。这里调用 send 上的 unwrap,因为发送可能会失败,这可能发生于例如停止了所有线程执行的情况,这意味着接收端停止接收新消息了。不过目前我们无法停止线程执行;只要线程池存在它们就会一直执行。使用 unwrap 是因为我们知道失败不可能发生,即便编译器不这么认为。

+

不过到此事情还没有结束!在 worker 中,传递给 thread::spawn 的闭包仍然还只是 引用 了信道的接收端。相反我们需要闭包一直循环,向信道的接收端请求任务,并在得到任务时执行它们。如示例 20-20 对 Worker::new 做出修改:

+

文件名:src/lib.rs

+
use std::{
+    sync::{mpsc, Arc, Mutex},
+    thread,
+};
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: mpsc::Sender<Job>,
+}
+
+type Job = Box<dyn FnOnce() + Send + 'static>;
+
+impl ThreadPool {
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let receiver = Arc::new(Mutex::new(receiver));
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id, Arc::clone(&receiver)));
+        }
+
+        ThreadPool { workers, sender }
+    }
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+        let job = Box::new(f);
+
+        self.sender.send(job).unwrap();
+    }
+}
+
+struct Worker {
+    id: usize,
+    thread: thread::JoinHandle<()>,
+}
+
+// --snip--
+
+impl Worker {
+    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
+        let thread = thread::spawn(move || loop {
+            let job = receiver.lock().unwrap().recv().unwrap();
+
+            println!("Worker {id} got a job; executing.");
+
+            job();
+        });
+
+        Worker { id, thread }
+    }
+}
+

示例 20-20: 在 worker 线程中接收并执行任务

+

这里,首先在 receiver 上调用了 lock 来获取互斥器,接着 unwrap 在出现任何错误时 panic。如果互斥器处于一种叫做 被污染poisoned)的状态时获取锁可能会失败,这可能发生于其他线程在持有锁时 panic 了且没有释放锁。在这种情况下,调用 unwrap 使其 panic 是正确的行为。请随意将 unwrap 改为包含有意义错误信息的 expect

+

如果锁定了互斥器,接着调用 recv 从信道中接收 Job。最后的 unwrap 也绕过了一些错误,这可能发生于持有信道发送端的线程停止的情况,类似于如果接收端关闭时 send 方法如何返回 Err 一样。

+

调用 recv 会阻塞当前线程,所以如果还没有任务,其会等待直到有可用的任务。Mutex<T> 确保一次只有一个 Worker 线程尝试请求任务。

+

现在线程池处于可以运行的状态了!执行 cargo run 并发起一些请求:

+
$ cargo run
+   Compiling hello v0.1.0 (file:///projects/hello)
+warning: field is never read: `workers`
+ --> src/lib.rs:7:5
+  |
+7 |     workers: Vec<Worker>,
+  |     ^^^^^^^^^^^^^^^^^^^^
+  |
+  = note: `#[warn(dead_code)]` on by default
+
+warning: field is never read: `id`
+  --> src/lib.rs:48:5
+   |
+48 |     id: usize,
+   |     ^^^^^^^^^
+
+warning: field is never read: `thread`
+  --> src/lib.rs:49:5
+   |
+49 |     thread: thread::JoinHandle<()>,
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+warning: `hello` (lib) generated 3 warnings
+    Finished dev [unoptimized + debuginfo] target(s) in 1.40s
+     Running `target/debug/hello`
+Worker 0 got a job; executing.
+Worker 2 got a job; executing.
+Worker 1 got a job; executing.
+Worker 3 got a job; executing.
+Worker 0 got a job; executing.
+Worker 2 got a job; executing.
+Worker 1 got a job; executing.
+Worker 3 got a job; executing.
+Worker 0 got a job; executing.
+Worker 2 got a job; executing.
+
+

成功了!现在我们有了一个可以异步执行连接的线程池!它绝不会创建超过四个线程,所以当 server 收到大量请求时系统也不会负担过重。如果请求 /sleep,server 也能够通过另外一个线程处理其他请求。

+
+

注意如果同时在多个浏览器窗口打开 /sleep,它们可能会彼此间隔地加载 5 秒,因为一些浏览器出于缓存的原因会顺序执行相同请求的多个实例。这些限制并不是由于我们的 web server 造成的。

+
+

在学习了第十七章和第十八章的 while let 循环之后,你可能会好奇为何不能如此编写 worker 线程,如示例 20-21 所示:

+

文件名:src/lib.rs

+
use std::{
+    sync::{mpsc, Arc, Mutex},
+    thread,
+};
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: mpsc::Sender<Job>,
+}
+
+type Job = Box<dyn FnOnce() + Send + 'static>;
+
+impl ThreadPool {
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let receiver = Arc::new(Mutex::new(receiver));
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id, Arc::clone(&receiver)));
+        }
+
+        ThreadPool { workers, sender }
+    }
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+        let job = Box::new(f);
+
+        self.sender.send(job).unwrap();
+    }
+}
+
+struct Worker {
+    id: usize,
+    thread: thread::JoinHandle<()>,
+}
+// --snip--
+
+impl Worker {
+    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
+        let thread = thread::spawn(move || {
+            while let Ok(job) = receiver.lock().unwrap().recv() {
+                println!("Worker {id} got a job; executing.");
+
+                job();
+            }
+        });
+
+        Worker { id, thread }
+    }
+}
+

示例 20-21: 一个使用 while letWorker::new 替代实现

+

这段代码可以编译和运行,但是并不会产生所期望的线程行为:一个慢请求仍然会导致其他请求等待执行。其原因有些微妙:Mutex 结构体没有公有 unlock 方法,因为锁的所有权依赖 lock 方法返回的 LockResult<MutexGuard<T>>MutexGuard<T> 的生命周期。这允许借用检查器在编译时确保绝不会在没有持有锁的情况下访问由 Mutex 守护的资源,不过如果没有认真的思考 MutexGuard<T> 的生命周期的话,也可能会导致比预期更久的持有锁。

+

示例 20-20 中的代码使用的 let job = receiver.lock().unwrap().recv().unwrap(); 之所以可以工作是因为对于 let 来说,当 let 语句结束时任何表达式中等号右侧使用的临时值都会立即被丢弃。然而 while letif letmatch)直到相关的代码块结束都不会丢弃临时值。在示例 20-21 中,job() 调用期间锁一直持续,这也意味着其他的 worker 无法接受任务。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/ch21-03-graceful-shutdown-and-cleanup.html b/ch21-03-graceful-shutdown-and-cleanup.html new file mode 100644 index 000000000..d63455fa6 --- /dev/null +++ b/ch21-03-graceful-shutdown-and-cleanup.html @@ -0,0 +1,1023 @@ + + + + + + 优雅停机与清理 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

优雅停机与清理

+
+

ch21-03-graceful-shutdown-and-cleanup.md +
+commit 3e5105b52f7e8d3d95def07ffade4dcb1cfdee27

+
+

示例 20-20 中的代码如期通过使用线程池异步的响应请求。这里有一些警告说 workersidthread 字段没有直接被使用,这提醒了我们并没有清理所有的内容。当使用不那么优雅的 ctrl-c 终止主线程时,所有其他线程也会立刻停止,即便它们正处于处理请求的过程中。

+

现在我们要为 ThreadPool 实现 Drop trait 对线程池中的每一个线程调用 join,这样这些线程将会执行完它们的请求。接着会为 ThreadPool 实现一个告诉线程它们应该停止接收新请求并结束的方式。为了实践这些代码,修改 server 在优雅停机(graceful shutdown)之前只接受两个请求。

+

ThreadPool 实现 Drop Trait

+

现在开始为线程池实现 Drop。当线程池被丢弃时,应该 join 所有线程以确保它们完成其操作。示例 20-22 展示了 Drop 实现的第一次尝试;这些代码还不能够编译:

+

文件名:src/lib.rs

+
use std::{
+    sync::{mpsc, Arc, Mutex},
+    thread,
+};
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: mpsc::Sender<Job>,
+}
+
+type Job = Box<dyn FnOnce() + Send + 'static>;
+
+impl ThreadPool {
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let receiver = Arc::new(Mutex::new(receiver));
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id, Arc::clone(&receiver)));
+        }
+
+        ThreadPool { workers, sender }
+    }
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+        let job = Box::new(f);
+
+        self.sender.send(job).unwrap();
+    }
+}
+
+impl Drop for ThreadPool {
+    fn drop(&mut self) {
+        for worker in &mut self.workers {
+            println!("Shutting down worker {}", worker.id);
+
+            worker.thread.join().unwrap();
+        }
+    }
+}
+
+struct Worker {
+    id: usize,
+    thread: thread::JoinHandle<()>,
+}
+
+impl Worker {
+    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
+        let thread = thread::spawn(move || loop {
+            let job = receiver.lock().unwrap().recv().unwrap();
+
+            println!("Worker {id} got a job; executing.");
+
+            job();
+        });
+
+        Worker { id, thread }
+    }
+}
+

示例 20-22: 当线程池离开作用域时 join 每个线程

+

这里首先遍历线程池中的每个 workers。这里使用了 &mut 因为 self 本身是一个可变引用而且也需要能够修改 worker。对于每一个线程,会打印出说明信息表明此特定 worker 正在关闭,接着在 worker 线程上调用 join。如果 join 调用失败,通过 unwrap 使得 panic 并进行不优雅的关闭。

+

如下是尝试编译代码时得到的错误:

+
$ cargo check
+    Checking hello v0.1.0 (file:///projects/hello)
+error[E0507]: cannot move out of `worker.thread` which is behind a mutable reference
+  --> src/lib.rs:52:13
+   |
+52 |             worker.thread.join().unwrap();
+   |             ^^^^^^^^^^^^^ ------ `worker.thread` moved due to this method call
+   |             |
+   |             move occurs because `worker.thread` has type `JoinHandle<()>`, which does not implement the `Copy` trait
+   |
+note: `JoinHandle::<T>::join` takes ownership of the receiver `self`, which moves `worker.thread`
+  --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/thread/mod.rs:1778:17
+
+For more information about this error, try `rustc --explain E0507`.
+error: could not compile `hello` (lib) due to 1 previous error
+
+

这里的错误告诉我们并不能调用 join,因为我们只有每一个 worker 的可变借用,而 join 需要获取其参数的所有权。为了解决这个问题,需要一个方法将 thread 移动出拥有其所有权的 Worker 实例以便 join 可以消费这个线程。示例 17-15 中我们曾见过这么做的方法:如果 Worker 存放的是 Option<thread::JoinHandle<()>,就可以在 Option 上调用 take 方法将值从 Some 成员中移动出来而对 None 成员不做处理。换句话说,正在运行的 Workerthread 将是 Some 成员值,而当需要清理 worker 时,将 Some 替换为 None,这样 worker 就没有可以运行的线程了。

+

为此需要更新 Worker 的定义为如下:

+

文件名:src/lib.rs

+
use std::{
+    sync::{mpsc, Arc, Mutex},
+    thread,
+};
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: mpsc::Sender<Job>,
+}
+
+type Job = Box<dyn FnOnce() + Send + 'static>;
+
+impl ThreadPool {
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let receiver = Arc::new(Mutex::new(receiver));
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id, Arc::clone(&receiver)));
+        }
+
+        ThreadPool { workers, sender }
+    }
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+        let job = Box::new(f);
+
+        self.sender.send(job).unwrap();
+    }
+}
+
+impl Drop for ThreadPool {
+    fn drop(&mut self) {
+        for worker in &mut self.workers {
+            println!("Shutting down worker {}", worker.id);
+
+            worker.thread.join().unwrap();
+        }
+    }
+}
+
+struct Worker {
+    id: usize,
+    thread: Option<thread::JoinHandle<()>>,
+}
+
+impl Worker {
+    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
+        let thread = thread::spawn(move || loop {
+            let job = receiver.lock().unwrap().recv().unwrap();
+
+            println!("Worker {id} got a job; executing.");
+
+            job();
+        });
+
+        Worker { id, thread }
+    }
+}
+

现在依靠编译器来找出其他需要修改的地方。check 代码会得到两个错误:

+
$ cargo check
+    Checking hello v0.1.0 (file:///projects/hello)
+error[E0599]: no method named `join` found for enum `Option` in the current scope
+  --> src/lib.rs:52:27
+   |
+52 |             worker.thread.join().unwrap();
+   |                           ^^^^ method not found in `Option<JoinHandle<()>>`
+   |
+note: the method `join` exists on the type `JoinHandle<()>`
+  --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/thread/mod.rs:1778:5
+help: consider using `Option::expect` to unwrap the `JoinHandle<()>` value, panicking if the value is an `Option::None`
+   |
+52 |             worker.thread.expect("REASON").join().unwrap();
+   |                          +++++++++++++++++
+
+error[E0308]: mismatched types
+  --> src/lib.rs:72:22
+   |
+72 |         Worker { id, thread }
+   |                      ^^^^^^ expected `Option<JoinHandle<()>>`, found `JoinHandle<_>`
+   |
+   = note: expected enum `Option<JoinHandle<()>>`
+            found struct `JoinHandle<_>`
+help: try wrapping the expression in `Some`
+   |
+72 |         Worker { id, thread: Some(thread) }
+   |                      +++++++++++++      +
+
+Some errors have detailed explanations: E0308, E0599.
+For more information about an error, try `rustc --explain E0308`.
+error: could not compile `hello` (lib) due to 2 previous errors
+
+

让我们修复第二个错误,它指向 Worker::new 结尾的代码;当新建 Worker 时需要将 thread 值封装进 Some。做出如下改变以修复问题:

+

文件名:src/lib.rs

+
use std::{
+    sync::{mpsc, Arc, Mutex},
+    thread,
+};
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: mpsc::Sender<Job>,
+}
+
+type Job = Box<dyn FnOnce() + Send + 'static>;
+
+impl ThreadPool {
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let receiver = Arc::new(Mutex::new(receiver));
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id, Arc::clone(&receiver)));
+        }
+
+        ThreadPool { workers, sender }
+    }
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+        let job = Box::new(f);
+
+        self.sender.send(job).unwrap();
+    }
+}
+
+impl Drop for ThreadPool {
+    fn drop(&mut self) {
+        for worker in &mut self.workers {
+            println!("Shutting down worker {}", worker.id);
+
+            worker.thread.join().unwrap();
+        }
+    }
+}
+
+struct Worker {
+    id: usize,
+    thread: Option<thread::JoinHandle<()>>,
+}
+
+impl Worker {
+    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
+        // --snip--
+
+        let thread = thread::spawn(move || loop {
+            let job = receiver.lock().unwrap().recv().unwrap();
+
+            println!("Worker {id} got a job; executing.");
+
+            job();
+        });
+
+        Worker {
+            id,
+            thread: Some(thread),
+        }
+    }
+}
+

第一个错误位于 Drop 实现中。之前提到过要调用 Option 上的 takethread 移动出 worker。如下改变会修复问题:

+

文件名:src/lib.rs

+
use std::{
+    sync::{mpsc, Arc, Mutex},
+    thread,
+};
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: mpsc::Sender<Job>,
+}
+
+type Job = Box<dyn FnOnce() + Send + 'static>;
+
+impl ThreadPool {
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let receiver = Arc::new(Mutex::new(receiver));
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id, Arc::clone(&receiver)));
+        }
+
+        ThreadPool { workers, sender }
+    }
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+        let job = Box::new(f);
+
+        self.sender.send(job).unwrap();
+    }
+}
+
+impl Drop for ThreadPool {
+    fn drop(&mut self) {
+        for worker in &mut self.workers {
+            println!("Shutting down worker {}", worker.id);
+
+            if let Some(thread) = worker.thread.take() {
+                thread.join().unwrap();
+            }
+        }
+    }
+}
+
+struct Worker {
+    id: usize,
+    thread: Option<thread::JoinHandle<()>>,
+}
+
+impl Worker {
+    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
+        let thread = thread::spawn(move || loop {
+            let job = receiver.lock().unwrap().recv().unwrap();
+
+            println!("Worker {id} got a job; executing.");
+
+            job();
+        });
+
+        Worker {
+            id,
+            thread: Some(thread),
+        }
+    }
+}
+

如第十八章我们见过的,Option 上的 take 方法会取出 Some 而留下 None。使用 if let 解构 Some 并得到线程,接着在线程上调用 join。如果 worker 的线程已然是 None,就知道此时这个 worker 已经清理了其线程所以无需做任何操作。

+

向线程发送信号使其停止接收任务

+

有了所有这些修改,代码就能编译且没有任何警告。不过也有坏消息,这些代码还不能以我们期望的方式运行。问题的关键在于 Worker 中分配的线程所运行的闭包中的逻辑:调用 join 并不会关闭线程,因为它们一直 loop 来寻找任务。如果采用这个实现来尝试丢弃 ThreadPool,则主线程会永远阻塞在等待第一个线程结束上。

+

为了修复这个问题,我们将修改 ThreadPooldrop 实现并修改 Worker 循环。

+

首先修改 ThreadPooldrop 实现在等待线程结束前显式丢弃 sender。示例 20-23 展示了 ThreadPool 显式丢弃 sender 所作的修改。我们使用了与之前处理线程时相同的 Optiontake 技术以便能从 ThreadPool 中移动 sender

+

文件名:src/lib.rs

+
use std::{
+    sync::{mpsc, Arc, Mutex},
+    thread,
+};
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: Option<mpsc::Sender<Job>>,
+}
+// --snip--
+
+type Job = Box<dyn FnOnce() + Send + 'static>;
+
+impl ThreadPool {
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        // --snip--
+
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let receiver = Arc::new(Mutex::new(receiver));
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id, Arc::clone(&receiver)));
+        }
+
+        ThreadPool {
+            workers,
+            sender: Some(sender),
+        }
+    }
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+        let job = Box::new(f);
+
+        self.sender.as_ref().unwrap().send(job).unwrap();
+    }
+}
+
+impl Drop for ThreadPool {
+    fn drop(&mut self) {
+        drop(self.sender.take());
+
+        for worker in &mut self.workers {
+            println!("Shutting down worker {}", worker.id);
+
+            if let Some(thread) = worker.thread.take() {
+                thread.join().unwrap();
+            }
+        }
+    }
+}
+
+struct Worker {
+    id: usize,
+    thread: Option<thread::JoinHandle<()>>,
+}
+
+impl Worker {
+    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
+        let thread = thread::spawn(move || loop {
+            let job = receiver.lock().unwrap().recv().unwrap();
+
+            println!("Worker {id} got a job; executing.");
+
+            job();
+        });
+
+        Worker {
+            id,
+            thread: Some(thread),
+        }
+    }
+}
+

示例 20-23: 在 join worker 线程之前显式丢弃 sender

+

丢弃 sender 会关闭信道,这表明不会有更多的消息被发送。这时 worker 中的无限循环中的所有 recv 调用都会返回错误。在示例 20-24 中,我们修改 Worker 循环在这种情况下优雅地退出,这意味着当 ThreadPooldrop 实现调用 join 时线程会结束。

+

文件名:src/lib.rs

+
use std::{
+    sync::{mpsc, Arc, Mutex},
+    thread,
+};
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: Option<mpsc::Sender<Job>>,
+}
+
+type Job = Box<dyn FnOnce() + Send + 'static>;
+
+impl ThreadPool {
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let receiver = Arc::new(Mutex::new(receiver));
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id, Arc::clone(&receiver)));
+        }
+
+        ThreadPool {
+            workers,
+            sender: Some(sender),
+        }
+    }
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+        let job = Box::new(f);
+
+        self.sender.as_ref().unwrap().send(job).unwrap();
+    }
+}
+
+impl Drop for ThreadPool {
+    fn drop(&mut self) {
+        drop(self.sender.take());
+
+        for worker in &mut self.workers {
+            println!("Shutting down worker {}", worker.id);
+
+            if let Some(thread) = worker.thread.take() {
+                thread.join().unwrap();
+            }
+        }
+    }
+}
+
+struct Worker {
+    id: usize,
+    thread: Option<thread::JoinHandle<()>>,
+}
+
+impl Worker {
+    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
+        let thread = thread::spawn(move || loop {
+            let message = receiver.lock().unwrap().recv();
+
+            match message {
+                Ok(job) => {
+                    println!("Worker {id} got a job; executing.");
+
+                    job();
+                }
+                Err(_) => {
+                    println!("Worker {id} disconnected; shutting down.");
+                    break;
+                }
+            }
+        });
+
+        Worker {
+            id,
+            thread: Some(thread),
+        }
+    }
+}
+

示例 20-24:当 recv 返回错误时显式退出循环

+

为了实践这些代码,如示例 20-25 所示修改 main 在优雅停机 server 之前只接受两个请求:

+

文件名:src/main.rs

+
use hello::ThreadPool;
+use std::{
+    fs,
+    io::{prelude::*, BufReader},
+    net::{TcpListener, TcpStream},
+    thread,
+    time::Duration,
+};
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+    let pool = ThreadPool::new(4);
+
+    for stream in listener.incoming().take(2) {
+        let stream = stream.unwrap();
+
+        pool.execute(|| {
+            handle_connection(stream);
+        });
+    }
+
+    println!("Shutting down.");
+}
+
+fn handle_connection(mut stream: TcpStream) {
+    let buf_reader = BufReader::new(&stream);
+    let request_line = buf_reader.lines().next().unwrap().unwrap();
+
+    let (status_line, filename) = match &request_line[..] {
+        "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
+        "GET /sleep HTTP/1.1" => {
+            thread::sleep(Duration::from_secs(5));
+            ("HTTP/1.1 200 OK", "hello.html")
+        }
+        _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
+    };
+
+    let contents = fs::read_to_string(filename).unwrap();
+    let length = contents.len();
+
+    let response =
+        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
+
+    stream.write_all(response.as_bytes()).unwrap();
+}
+

示例 20-25: 在处理两个请求之后通过退出循环来停止 server

+

你不会希望真实世界的 web server 只处理两次请求就停机了,这只是为了展示优雅停机和清理处于正常工作状态。

+

take 方法定义于 Iterator trait,这里限制循环最多头 2 次。ThreadPool 会在 main 的结尾离开作用域,而且还会看到 drop 实现的运行。

+

使用 cargo run 启动 server,并发起三个请求。第三个请求应该会失败,而终端的输出应该看起来像这样:

+
$ cargo run
+   Compiling hello v0.1.0 (file:///projects/hello)
+    Finished dev [unoptimized + debuginfo] target(s) in 1.0s
+     Running `target/debug/hello`
+Worker 0 got a job; executing.
+Shutting down.
+Shutting down worker 0
+Worker 3 got a job; executing.
+Worker 1 disconnected; shutting down.
+Worker 2 disconnected; shutting down.
+Worker 3 disconnected; shutting down.
+Worker 0 disconnected; shutting down.
+Shutting down worker 1
+Shutting down worker 2
+Shutting down worker 3
+
+

可能会出现不同顺序的 worker 和信息输出。可以从信息中看到服务是如何运行的:worker 0 和 worker 3 获取了头两个请求。server 会在头第二个请求后停止接受请求,ThreadPoolDrop 实现甚至会在 worker 3 开始工作之前就开始执行。丢弃 sender 会断开所有 worker 的连接并让它们关闭。每个 worker 在断开时会打印出一个信息,接着线程池调用 join 来等待每一个 worker 线程结束。

+

这个特定的运行过程中一个有趣的地方在于:ThreadPool 丢弃 sender,而在任何线程收到消息之前,就尝试 join worker 0 了。worker 0 还没有从 recv 获得一个错误,所以主线程阻塞直到 worker 0 结束。与此同时,worker 3 接收到一个任务接着所有线程会收到一个错误。一旦 worker 0 结束,主线程就等待余下其他 worker 结束。此时它们都退出了循环并停止。

+

恭喜!现在我们完成了这个项目,也有了一个使用线程池异步响应请求的基础 web server。我们能对 server 执行优雅停机,它会清理线程池中的所有线程。

+

如下是完整的代码参考:

+

文件名:src/main.rs

+
use hello::ThreadPool;
+use std::{
+    fs,
+    io::{prelude::*, BufReader},
+    net::{TcpListener, TcpStream},
+    thread,
+    time::Duration,
+};
+
+fn main() {
+    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+    let pool = ThreadPool::new(4);
+
+    for stream in listener.incoming().take(2) {
+        let stream = stream.unwrap();
+
+        pool.execute(|| {
+            handle_connection(stream);
+        });
+    }
+
+    println!("Shutting down.");
+}
+
+fn handle_connection(mut stream: TcpStream) {
+    let buf_reader = BufReader::new(&stream);
+    let request_line = buf_reader.lines().next().unwrap().unwrap();
+
+    let (status_line, filename) = match &request_line[..] {
+        "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
+        "GET /sleep HTTP/1.1" => {
+            thread::sleep(Duration::from_secs(5));
+            ("HTTP/1.1 200 OK", "hello.html")
+        }
+        _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
+    };
+
+    let contents = fs::read_to_string(filename).unwrap();
+    let length = contents.len();
+
+    let response =
+        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
+
+    stream.write_all(response.as_bytes()).unwrap();
+}
+

文件名:src/lib.rs

+
use std::{
+    sync::{mpsc, Arc, Mutex},
+    thread,
+};
+
+pub struct ThreadPool {
+    workers: Vec<Worker>,
+    sender: Option<mpsc::Sender<Job>>,
+}
+
+type Job = Box<dyn FnOnce() + Send + 'static>;
+
+impl ThreadPool {
+    /// Create a new ThreadPool.
+    ///
+    /// The size is the number of threads in the pool.
+    ///
+    /// # Panics
+    ///
+    /// The `new` function will panic if the size is zero.
+    pub fn new(size: usize) -> ThreadPool {
+        assert!(size > 0);
+
+        let (sender, receiver) = mpsc::channel();
+
+        let receiver = Arc::new(Mutex::new(receiver));
+
+        let mut workers = Vec::with_capacity(size);
+
+        for id in 0..size {
+            workers.push(Worker::new(id, Arc::clone(&receiver)));
+        }
+
+        ThreadPool {
+            workers,
+            sender: Some(sender),
+        }
+    }
+
+    pub fn execute<F>(&self, f: F)
+    where
+        F: FnOnce() + Send + 'static,
+    {
+        let job = Box::new(f);
+
+        self.sender.as_ref().unwrap().send(job).unwrap();
+    }
+}
+
+impl Drop for ThreadPool {
+    fn drop(&mut self) {
+        drop(self.sender.take());
+
+        for worker in &mut self.workers {
+            println!("Shutting down worker {}", worker.id);
+
+            if let Some(thread) = worker.thread.take() {
+                thread.join().unwrap();
+            }
+        }
+    }
+}
+
+struct Worker {
+    id: usize,
+    thread: Option<thread::JoinHandle<()>>,
+}
+
+impl Worker {
+    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
+        let thread = thread::spawn(move || loop {
+            let message = receiver.lock().unwrap().recv();
+
+            match message {
+                Ok(job) => {
+                    println!("Worker {id} got a job; executing.");
+
+                    job();
+                }
+                Err(_) => {
+                    println!("Worker {id} disconnected; shutting down.");
+                    break;
+                }
+            }
+        });
+
+        Worker {
+            id,
+            thread: Some(thread),
+        }
+    }
+}
+

这里还有很多可以做的事!如果你希望继续增强这个项目,如下是一些点子:

+
    +
  • ThreadPool 和其公有方法增加更多文档
  • +
  • 为库的功能增加测试
  • +
  • unwrap 调用改为更健壮的错误处理
  • +
  • 使用 ThreadPool 进行其他不同于处理网络请求的任务
  • +
  • crates.io 上寻找一个线程池 crate 并使用它实现一个类似的 web server,将其 API 和鲁棒性与我们的实现做对比
  • +
+

总结

+

好极了!你结束了本书的学习!由衷感谢你同我们一道加入这次 Rust 之旅。现在你已经准备好出发并实现自己的 Rust 项目并帮助他人了。请不要忘记我们的社区,这里有其他 Rustaceans 正乐于帮助你迎接 Rust 之路上的任何挑战。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/clipboard.min.js b/clipboard.min.js new file mode 100644 index 000000000..02c549e35 --- /dev/null +++ b/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.4 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n .hljs { + color: var(--links); +} + +/* + body-container is necessary because mobile browsers don't seem to like + overflow-x on the body tag when there is a tag. +*/ +#body-container { + /* + This is used when the sidebar pushes the body content off the side of + the screen on small screens. Without it, dragging on mobile Safari + will want to reposition the viewport in a weird way. + */ + overflow-x: clip; +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-block-end-color: var(--bg); + border-block-end-width: 1px; + border-block-end-style: solid; +} +#menu-bar.sticky, +.js #menu-bar-hover-placeholder:hover + #menu-bar, +.js #menu-bar:hover, +.js.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-block-end-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +.icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +.icon-button i { + margin: 0; +} + +.right-buttons { + margin: 0 15px; +} +.right-buttons a { + text-decoration: none; +} + +.left-buttons { + display: flex; + margin: 0 5px; +} +.no-js .left-buttons button { + display: none; +} + +.menu-title { + display: inline-block; + font-weight: 200; + font-size: 2.4rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.js .menu-title { + cursor: pointer; +} + +.menu-bar, +.menu-bar:visited, +.nav-chapters, +.nav-chapters:visited, +.mobile-nav-chapters, +.mobile-nav-chapters:visited, +.menu-bar .icon-button, +.menu-bar a i { + color: var(--icons); +} + +.menu-bar i:hover, +.menu-bar .icon-button:hover, +.nav-chapters:hover, +.mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +.nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: fixed; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +.nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +.nav-wrapper { + margin-block-start: 50px; + display: none; +} + +.mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +/* Only Firefox supports flow-relative values */ +.previous { float: left; } +[dir=rtl] .previous { float: right; } + +/* Only Firefox supports flow-relative values */ +.next { + float: right; + right: var(--page-padding); +} +[dir=rtl] .next { + float: left; + right: unset; + left: var(--page-padding); +} + +/* Use the correct buttons for RTL layouts*/ +[dir=rtl] .previous i.fa-angle-left:before {content:"\f105";} +[dir=rtl] .next i.fa-angle-right:before { content:"\f104"; } + +@media only screen and (max-width: 1080px) { + .nav-wide-wrapper { display: none; } + .nav-wrapper { display: block; } +} + +/* sidebar-visible */ +@media only screen and (max-width: 1380px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; } + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; } +} + +/* Inline code */ + +:not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +:not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +a:hover > .hljs { + text-decoration: underline; +} + +pre { + position: relative; +} +pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; + + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; +} +pre:hover > .buttons { + visibility: visible; + opacity: 1 +} +pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); +} +pre > .buttons i { + margin-inline-start: 8px; +} +pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 3px 5px; + font-size: 14px; + + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); +} +@media (pointer: coarse) { + pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } + + .sidebar-resize-indicator { + /* Hide resize indicator on devices with limited accuracy */ + display: none; + } +} +pre > code { + display: block; + padding: 1rem; +} + +/* FIXME: ACE editors overlap their buttons because ACE does absolute + positioning within the code block which breaks padding. The only solution I + can think of is to move the padding to the outer pre tag (or insert a div + wrapper), but that would require fixing a whole bunch of CSS rules. +*/ +.hljs.ace_editor { + padding: 0rem 0rem; +} + +pre > .result { + margin-block-start: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +mark { + border-radius: 2px; + padding-block-start: 0; + padding-block-end: 1px; + padding-inline-start: 3px; + padding-inline-end: 3px; + margin-block-start: 0; + margin-block-end: -1px; + margin-inline-start: -3px; + margin-inline-end: -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +.searchbar-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: auto; + margin-inline-end: auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +.searchresults-header { + font-weight: bold; + font-size: 1em; + padding-block-start: 18px; + padding-block-end: 0; + padding-inline-start: 5px; + padding-inline-end: 0; + color: var(--searchresults-header-fg); +} + +.searchresults-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); + border-block-end: 1px dashed var(--searchresults-border-color); +} + +ul#searchresults { + list-style: none; + padding-inline-start: 20px; +} +ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +ul#searchresults span.teaser { + display: block; + clear: both; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: 20px; + margin-inline-end: 0; + font-size: 0.8em; +} +ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ + +.sidebar { + position: fixed; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +[dir=rtl] .sidebar { left: unset; right: 0; } +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.no-js .sidebar, +.js:not(.sidebar-resizing) .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +.sidebar code { + line-height: 2em; +} +.sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +.sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: calc(var(--sidebar-resize-indicator-width) * -1); + top: 0; + bottom: 0; + display: flex; + align-items: center; +} + +.sidebar-resize-handle .sidebar-resize-indicator { + width: 100%; + height: 12px; + background-color: var(--icons); + margin-inline-start: var(--sidebar-resize-indicator-space); +} + +[dir=rtl] .sidebar .sidebar-resize-handle { + left: calc(var(--sidebar-resize-indicator-width) * -1); + right: unset; +} +.js .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: calc(var(--sidebar-resize-indicator-width) - var(--sidebar-resize-indicator-space)); +} +/* sidebar-hidden */ +#sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); + z-index: -1; +} +[dir=rtl] #sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); +} +.sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +.sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +/* sidebar-visible */ +#sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); +} +[dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); +} +@media only screen and (min-width: 620px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + margin-inline-start: calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)); + } + [dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + } +} + +.chapter { + list-style: none outside none; + padding-inline-start: 0; + line-height: 2.2em; +} + +.chapter ol { + width: 100%; +} + +.chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +.chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +.chapter li a:hover { + color: var(--sidebar-active); +} + +.chapter li a.active { + color: var(--sidebar-active); +} + +.chapter li > a.toggle { + cursor: pointer; + display: block; + margin-inline-start: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +.chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +.chapter li:not(.expanded) + li > ol { + display: none; +} + +.chapter li.chapter-item { + line-height: 1.5em; + margin-block-start: 0.6em; +} + +.chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +.spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +.chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + .chapter li a { padding: 5px 0; } + .spacer { margin: 10px 0; } +} + +.section { + list-style: none outside none; + padding-inline-start: 20px; + line-height: 1.9em; +} + +/* Theme Menu Popup */ + +.theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; + /* Don't let the children's background extend past the rounded corners. */ + overflow: hidden; +} +[dir=rtl] .theme-popup { left: unset; right: 10px; } +.theme-popup .default { + color: var(--icons); +} +.theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 20px; + line-height: 25px; + white-space: nowrap; + text-align: start; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +.theme-popup .theme:hover { + background-color: var(--theme-hover); +} + +.theme-selected::before { + display: inline-block; + content: "✓"; + margin-inline-start: -14px; + width: 14px; +} diff --git a/css/general.css b/css/general.css new file mode 100644 index 000000000..7670b087d --- /dev/null +++ b/css/general.css @@ -0,0 +1,232 @@ +/* Base styles and content styles */ + +:root { + /* Browser default font-size is 16px, this way 1 rem = 10px */ + font-size: 62.5%; + color-scheme: var(--color-scheme); +} + +html { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; + -webkit-text-size-adjust: none; +} + +body { + margin: 0; + font-size: 1.6rem; + overflow-x: hidden; +} + +code { + font-family: var(--mono-font) !important; + font-size: var(--code-font-size); + direction: ltr !important; +} + +/* make long words/inline code not x overflow */ +main { + overflow-wrap: break-word; +} + +/* make wide tables scroll if they overflow */ +.table-wrapper { + overflow-x: auto; +} + +/* Don't change font size in headers. */ +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + font-size: unset; +} + +.left { float: left; } +.right { float: right; } +.boring { opacity: 0.6; } +.hide-boring .boring { display: none; } +.hidden { display: none !important; } + +h2, h3 { margin-block-start: 2.5em; } +h4, h5 { margin-block-start: 2em; } + +.header + .header h3, +.header + .header h4, +.header + .header h5 { + margin-block-start: 1em; +} + +h1:target::before, +h2:target::before, +h3:target::before, +h4:target::before, +h5:target::before, +h6:target::before { + display: inline-block; + content: "»"; + margin-inline-start: -30px; + width: 30px; +} + +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { + /* Safari does not support logical properties */ + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + +.page { + outline: 0; + padding: 0 var(--page-padding); + margin-block-start: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +} +.page-wrapper { + box-sizing: border-box; + background-color: var(--bg); +} +.no-js .page-wrapper, +.js:not(.sidebar-resizing) .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} +[dir=rtl] .js:not(.sidebar-resizing) .page-wrapper { + transition: margin-right 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} + +.content { + overflow-y: auto; + padding: 0 5px 50px 5px; +} +.content main { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} +.content p { line-height: 1.45em; } +.content ol { line-height: 1.45em; } +.content ul { line-height: 1.45em; } +.content a { text-decoration: none; } +.content a:hover { text-decoration: underline; } +.content img, .content video { max-width: 100%; } +.content .header:link, +.content .header:visited { + color: var(--fg); +} +.content .header:link, +.content .header:visited:hover { + text-decoration: none; +} + +table { + margin: 0 auto; + border-collapse: collapse; +} +table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; +} +table thead { + background: var(--table-header-bg); +} +table thead td { + font-weight: 700; + border: none; +} +table thead th { + padding: 3px 20px; +} +table thead tr { + border: 1px var(--table-header-bg) solid; +} +/* Alternate background colors for rows */ +table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); +} + + +blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-block-start: .1em solid var(--quote-border); + border-block-end: .1em solid var(--quote-border); +} + +.warning { + margin: 20px; + padding: 0 20px; + border-inline-start: 2px solid var(--warning-border); +} + +.warning:before { + position: absolute; + width: 3rem; + height: 3rem; + margin-inline-start: calc(-1.5rem - 21px); + content: "ⓘ"; + text-align: center; + background-color: var(--bg); + color: var(--warning-border); + font-weight: bold; + font-size: 2rem; +} + +blockquote .warning:before { + background-color: var(--quote-bg); +} + +kbd { + background-color: var(--table-border-color); + border-radius: 4px; + border: solid 1px var(--theme-popup-border); + box-shadow: inset 0 -1px 0 var(--theme-hover); + display: inline-block; + font-size: var(--code-font-size); + font-family: var(--mono-font); + line-height: 10px; + padding: 4px 5px; + vertical-align: middle; +} + +:not(.footnote-definition) + .footnote-definition, +.footnote-definition + :not(.footnote-definition) { + margin-block-start: 2em; +} +.footnote-definition { + font-size: 0.9em; + margin: 0.5em 0; +} +.footnote-definition p { + display: inline; +} + +.tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; +} +.tooltipped .tooltiptext { + visibility: visible; +} + +.chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; +} + +.result-no-output { + font-style: italic; +} diff --git a/css/print.css b/css/print.css new file mode 100644 index 000000000..80ec3a544 --- /dev/null +++ b/css/print.css @@ -0,0 +1,50 @@ + +#sidebar, +#menu-bar, +.nav-chapters, +.mobile-nav-chapters { + display: none; +} + +#page-wrapper.page-wrapper { + transform: none !important; + margin-inline-start: 0px; + overflow-y: initial; +} + +#content { + max-width: none; + margin: 0; + padding: 0; +} + +.page { + overflow-y: initial; +} + +code { + direction: ltr !important; +} + +pre > .buttons { + z-index: 2; +} + +a, a:visited, a:active, a:hover { + color: #4183c4; + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + page-break-inside: avoid; + page-break-after: avoid; +} + +pre, code { + page-break-inside: avoid; + white-space: pre-wrap; +} + +.fa { + display: none !important; +} diff --git a/css/variables.css b/css/variables.css new file mode 100644 index 000000000..0da55e8c9 --- /dev/null +++ b/css/variables.css @@ -0,0 +1,279 @@ + +/* Globals */ + +:root { + --sidebar-width: 300px; + --sidebar-resize-indicator-width: 8px; + --sidebar-resize-indicator-space: 2px; + --page-padding: 15px; + --content-max-width: 750px; + --menu-bar-height: 50px; + --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; + --code-font-size: 0.875em /* please adjust the ace font size accordingly in editor.js */ +} + +/* Themes */ + +.ayu { + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; + + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #0096cf; + + --inline-code-color: #ffb454; + + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); + + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; + + --color-scheme: dark; +} + +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + + --color-scheme: dark; +} + +.light { + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); + + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; + + --scrollbar: #8F8F8F; + + --icons: #747474; + --icons-hover: #000000; + + --links: #20609f; + + --inline-code-color: #301900; + + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; + + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; + + --color-scheme: light; +} + +.navy { + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; + + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; + + --color-scheme: dark; +} + +.rust { + --bg: hsl(60, 9%, 87%); + --fg: #262625; + + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #262625; + + --links: #2b79a2; + + --inline-code-color: #6e6b5e; + + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; + + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; + + --color-scheme: light; +} + +@media (prefers-color-scheme: dark) { + .light.no-js { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + } +} diff --git a/elasticlunr.min.js b/elasticlunr.min.js new file mode 100644 index 000000000..94b20dd2e --- /dev/null +++ b/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.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 A;{X5v literal 0 HcmV?d00001 diff --git a/favicon.svg b/favicon.svg new file mode 100644 index 000000000..90e0ea58b --- /dev/null +++ b/favicon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/ferris.css b/ferris.css new file mode 100644 index 000000000..caa2ee7c7 --- /dev/null +++ b/ferris.css @@ -0,0 +1,45 @@ +body.light .does_not_compile, +body.light .panics, +body.light .not_desired_behavior, +body.rust .does_not_compile, +body.rust .panics, +body.rust .not_desired_behavior { + background: #fff1f1; +} + +body.coal .does_not_compile, +body.coal .panics, +body.coal .not_desired_behavior, +body.navy .does_not_compile, +body.navy .panics, +body.navy .not_desired_behavior, +body.ayu .does_not_compile, +body.ayu .panics, +body.ayu .not_desired_behavior { + background: #501f21; +} + +.ferris-container { + position: absolute; + z-index: 99; + right: 5px; + top: 30px; +} + +.ferris { + vertical-align: top; + margin-left: 0.2em; + height: auto; +} + +.ferris-large { + width: 4.5em; +} + +.ferris-small { + width: 2.3em; +} + +.ferris-explain { + width: 100px; +} \ No newline at end of file diff --git a/ferris.js b/ferris.js new file mode 100644 index 000000000..4fd025eed --- /dev/null +++ b/ferris.js @@ -0,0 +1,65 @@ +var ferrisTypes = [ + { + attr: 'does_not_compile', + title: '这段代码无法通过编译!' + }, + { + attr: 'panics', + title: '这段代码会 Panic!' + }, + { + attr: 'not_desired_behavior', + title: '这段代码的运行结果不符合预期。' + } +] + +document.addEventListener('DOMContentLoaded', () => { + for (var ferrisType of ferrisTypes) { + attachFerrises(ferrisType) + } +}) + +function attachFerrises(type) { + var elements = document.getElementsByClassName(type.attr) + + for (var codeBlock of elements) { + var lines = codeBlock.innerText.replace(/\n$/, '').split(/\n/).length + var size = 'large' + if (lines < 4) { + size = 'small' + } + + var container = prepareFerrisContainer(codeBlock, size == 'small') + container.appendChild(createFerris(type, size)) + } +} + +function prepareFerrisContainer(element, useButtons) { + var foundButtons = element.parentElement.querySelector('.buttons') + if (useButtons && foundButtons) { + return foundButtons + } + + var div = document.createElement('div') + div.classList.add('ferris-container') + + element.parentElement.insertBefore(div, element) + + return div +} + +function createFerris(type, size) { + var a = document.createElement('a') + a.setAttribute('href', 'ch00-00-introduction.html#ferris') + a.setAttribute('target', '_blank') + + var img = document.createElement('img') + img.setAttribute('src', 'img/ferris/' + type.attr + '.svg') + img.setAttribute('title', type.title) + img.classList.add('ferris') + img.classList.add('ferris-' + size) + + a.appendChild(img) + + return a +} \ No newline at end of file diff --git a/fonts/OPEN-SANS-LICENSE.txt b/fonts/OPEN-SANS-LICENSE.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/fonts/OPEN-SANS-LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/fonts/SOURCE-CODE-PRO-LICENSE.txt b/fonts/SOURCE-CODE-PRO-LICENSE.txt new file mode 100644 index 000000000..366206f54 --- /dev/null +++ b/fonts/SOURCE-CODE-PRO-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/fonts/fonts.css b/fonts/fonts.css new file mode 100644 index 000000000..858efa598 --- /dev/null +++ b/fonts/fonts.css @@ -0,0 +1,100 @@ +/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */ +/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */ + +/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), + url('open-sans-v17-all-charsets-300.woff2') format('woff2'); +} + +/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300; + src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'), + url('open-sans-v17-all-charsets-300italic.woff2') format('woff2'); +} + +/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), + url('open-sans-v17-all-charsets-regular.woff2') format('woff2'); +} + +/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: local('Open Sans Italic'), local('OpenSans-Italic'), + url('open-sans-v17-all-charsets-italic.woff2') format('woff2'); +} + +/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), + url('open-sans-v17-all-charsets-600.woff2') format('woff2'); +} + +/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 600; + src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'), + url('open-sans-v17-all-charsets-600italic.woff2') format('woff2'); +} + +/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), + url('open-sans-v17-all-charsets-700.woff2') format('woff2'); +} + +/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 700; + src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), + url('open-sans-v17-all-charsets-700italic.woff2') format('woff2'); +} + +/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 800; + src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), + url('open-sans-v17-all-charsets-800.woff2') format('woff2'); +} + +/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 800; + src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'), + url('open-sans-v17-all-charsets-800italic.woff2') format('woff2'); +} + +/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: url('source-code-pro-v11-all-charsets-500.woff2') format('woff2'); +} diff --git a/fonts/open-sans-v17-all-charsets-300.woff2 b/fonts/open-sans-v17-all-charsets-300.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9f51be370fa913ce6de2922b580c262c4822b337 GIT binary patch literal 44352 zcmV(;K-<4}Pew8T0RR910Ifg(5dZ)H0f7hr0Ib{q0RR9100000000000000000000 z0000QE*lUWfmQ}!0EY+&fhq})G!YOAg!yQMtSAeP3IG8%0we>R0t6rhgFFYi4Ge-h zTM$x_K;*{m=TyO<(oF`$dr#+gT@uRz<@OP72f1way{Ld4djxa`IG0*=K;{4c|Nq>i zF~-^s+Z{rPn$}0zLzV=G*ddk#MfRZCOSo7Svxg)@O1QTM(GtC{-8am>TkfXJ&}5JO zXokZnNWAaG&x#r1r&DFc3k@sfl$|@RDaX?kWW{EN@TZnHp}gCDd}u9PW@H>gZ142z+QEhtr+J1&#|>KAj6Y2`)3tZkBe+ebjmTS6=W*;+$iHPBB3Un)Qo?6q*dE(P3T9y565vHowfyevYxI9K2P(y z$<_L{@8?J5hBF;TxvX%vUMY{MW;AQOFw;MRE?UNs>(i)Pw#F30SO&%}gA&nV#5ynh z%lr4w|41^EwI78NR7X_&MdMPeXq|gj4oJ6}tzd{4Fvwwq1Zjy_sfS1l0YYgJLOuSa zG~qZt#{MG5VL1;uY?c0qywYwhjn*_`$CiZFZCFDFz-?kG;zz}gkK?(Z;(4Ip0|Y@p zL`0q-DhfWlFW)O~_Uv1l(z*7n%=kiif-51?{(S1>dTz;-%RXz{zW_NG4POWVdSfQ{H?gb&VPWmSuI@as@lXQ zCML+EVq_sv+K31qR)E!rHdbOZcI*#x`rpX1-FQZd2?w2J5+HD^d^xN_9WLUu;R1_>$Sl2l1j{i_PqRoxBKXmEfAv5RRCG~gHz zoRPqp)jl)`>4DtY_ee=+oD0vBlrtv1+}R|)Aj>WYFNl--dsEGJL13vB!x?g=A&fDlOONKn#&pyZ<<^Gt#Y5O9+B{||V8CFK!GIY^G7 ziird-fZ=XPfYkAzOvx!^1&5rvR8_9Zlqy%TZCti4x_G(NsHD}UoUD}Q&&1ywU=hnR zK_eK;d!w1V-89?ZEBgl|7bFMOFTBI&;bU#pwZ9KM5d*ckoOlTrnn@#e=0bxf_LKF$ zd-0Mi4MXYT*CGx?Tq%ZXXdY`yIWWVJf|?K(5DNrL%GP_mZs@nw-vBb}Rw0W;wB!)N z5TjzUSNZXIA7943^nXK*r#Dw9|Mtf&ksu-=h_`Yp9V;Dkh;8<4psUZVb-$?#qp%T! ziAdB1b$5t5hjOzR8iD$*)2$e71R6>Zt8%DEY$Sg2KWN&b4Cqr8h>8`6#((@8#L}XktLaTS zryU~vMx03nNxOB%uQY)H>VL7pz)zP2nhY%8WH@)-0RsdY-07d0c5ee-ah{%=QSM%u z*8so2)#K3GU!m!|?O$6+?&yD~(Fj>ZOxK05BApxGi zJr7YET6WG{j1#TYt(MkW%SPIA4dOUU&zsN+<{}nS6r*LQrr)v8tl?2R`* z6w<>(odO>Dg>%+<`=H~%Re+D2bI267Gb@WPo}vT*tKEȮck{9tEK*~BMoW% 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 literal 0 HcmV?d00001 diff --git a/fonts/open-sans-v17-all-charsets-300italic.woff2 b/fonts/open-sans-v17-all-charsets-300italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2f545448418cba6668a2e7d49e9616e8c69dfd15 GIT binary patch literal 40656 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 bQBM5)6s%p?oy_T)fR3IrepgG2|qH4K6n zTjEWT0M>3h@}ENV+_q{F9wW<-3brc`y_pI_^4p(Ua9sB|0Gw|m`2YX^KRubqVVATn zNekEj{BQrDNslN|DcXpZA-X^~dK8u+%2-5Irnagte8a?(^PQHDA{Ia>x8E;>s=qh`PM9HJ1<#&OtZjf!-5cTIED~WWHDzI$2&YI z-Qx_U$EM$KlLl(PE)LgB-E!IUkaA<%CtwLP6`45Di)=MXIdNdHSN3iVq9AM zW$$vH*PwWVFLy0m^MBLs2Du(884Xzm#x8>rZHyHsULO9fi|@W9RUh;~&`vmeNlSn| zUHLy%^$r9js)H)+Tt0XPT}agq13U(brxo75{lYd9v2}uZ*SGtHwrP4Q94xD5SfeTcynoRZcTmcB! z|IfY6+?N7SQU=}gLr|c!mS};%tuf1*^*R&=&=|m9$hm)94|)`EAy7sg+xyU<5&T>+PVPD728Hda7D(-wSBu5C)Gdv)`@3pXOX&?kiFF%}^ak}Y4e z9%ulKM*G*#kQ{P2PSURDcV7BVoGo!}kX#h5!tBxwFV2n!&FB6pSFL=Pz-G405@Oh& zzi+kWu_v%=2*Ii)=%g>6FsPyoCW>8L2Tkhu^eDIftLh{`s=8@1{J(1Fy&Xb=%o|3) zpZJi}CE=~Y%&KeTn@ztzN2m0_=(M`)pPv5zewuEd;Ey%bNVzpE#INw&t2k?nvi2Q-?3EO}B}9?*MVKF5;nz(9yr1prxgCmMxh$w^EhIY{6D zF3ZcN>)j+J-gdFuv}e!%zp8$^X4Iz}fMKkT6rrIs)dW*JM zKbqQ0SMzp$k*q6C=>-MAV-8#BAm&@|ME`4N&iSP@lmgH>NKUJQKZsYr1H&pqAs~q0 z@I23cvtsXG@Wi2Is7WnJt2%94%sa~#IzWae{EhX`y?BX{n4xqBnv{(>DaBBIto3|h zfYxgxLPhG&a+=#*%jGQbs}UiJXgJefpHP8xD8@;AI(0BY7!x|Y@A?1#{2S?c-!<7w zMMYIbMMXr_v_C%YGN!e#^Y(u?SYZdk2X&_l*=NWY#<>=9l5ASeUMMAp(fker8VosLx@B&L&j#7*0l3cc_Y%PiDbiC znq_muF3v_)zKIPAq`5)LWS^0k&iS=&tXr9C@l#Ytp6LBabDVCmNkLU5q8K6qcPVWHIMBuRYSXvRHJ= zm$~xUxT-(UKl6R%`^j$#1p-xY1#*ywVHks1n1>P^g41vj?kqc&y)%Vih1#uxnp5-Y zp!y&uLfJwkLgl&s+?8A*XXlo48``Vi?q8rj;U@J)g#<3T&7xA0nnc`{=bIg|5wX}>R8SI)bT|x{~1f00nIQ~ zF97vA-B=GobMi zKMo{dg$W&0Aoc(K@1Od{m&R6E0LWUa@SuFYpX0^$J;ptccE6q2a(FR34Et%w5EX_{ z=>w_^quNK*_=MU6AD;jYS{Qx#bf1%AJn3PV~S>7F4$6__XUyaab_{e5$&(L0;2g`U3613b^K zhH^f`Ek#ug66HW?0n}}sRAS+mj((b~HJaQ!Y=l*kG&ViSCVVR1;IAa~#v)DY(hV_t ztB~CC=fU8X2o7*#>k=iVs@`#}jIF#hCL|{9cc4wI4{?QnSiOejiIIK=-U_4)a~ z1A2gL7U&v4$wa#4s#rI(xaG&ODuWg0R#3aB?#-{R@HlC1j&BPekZia}+dt&lDMRat zhl*dJvz`sQtt|&THt#xxG*_S!G_2+8m$*93)a=yz+8CE0SZ`vTqXSj7NBgvd#1|ilzpx)ea^NUqpX$l@ghY1G{EW}LhxvXe6FaI z{%1Uo+p{n;^q#<$Mvux6^u{dF7l%M=RS7GyJNC*sTdJeCR%@ z^kQ`nT2-_Q*6_&=7xmIZNe?`?Dw5%$U@`F5Ff6U=b8v{if}Py(GRW5y;kG-M&A%Nx zO(gz)Y9>bltWkOm%i4?Vo;DC6cIfH~eS^CCO0v(25&JMOeZP*A!Lk~KlkM3+G~rZvoH8ON%` zQr>`6Dn+m!%G{VQrU%uV(rRjT)_-8@G(&HujFj=_AJ;Vyho$L2&Qe$D?W$zjOktu* zu`?T0rg~<;;Vz{<4=;IWA`v^`^vhG> zGX3&QdWbWH5bnzz_gjfdrf+!3HILaukY_mwQs~S9FqB)6%hWw~rjO*0Ioa{Pn)@|M zhR$RRf+o2N$6VfWVA14)z6fhtCSN63kPzFQrZ=YbjNYI(ODz&hXrKHR4}F#dO(c(+ zX$!5RYJRI;%j&0y%O>J#q}ocPh(xkYFGT{(?0Sft{JIMZK>m*!c~BJ=?JL7&gWL9z0?Q zV7AJtGBi1M0HGw+K=#}RtR@MW`z55wjnXtu2wGY;L?u=zQl~Y(VEib~wSD+&apr4uR;QLsaxi;kl$Ez24a*vqVmKNhFb-z7L>C_|^UFNn&y8Wr@=QOdy* zWou$Tl1e*&GhzG){qQ#vJ?>7~#E9^RJ$sIHakj_IRd61i1~vPI(h@y}gN%T`*)P=) ziYLOz_NdYR49b5DcU|ulPBpRdg=e@OM z%9jkBu^`e;-eca9+raInN5@tdX8`pS0M}))*21A707PWGOtKs}h9Pcvt_Ws-`)|3! z=F#U-&iUOo&oW4a6W{djI@cFOv?@->$uvNvI&Y+L8K2;~`o{Fk7`!T@w=y>M@_wu` zn0=KAt2NAqL@*#@f^*~!bY>d*J6U;8khn+-km;%^t}zBA5h$fbCZ>jhinXwg*9tB` zMKcwqy&R?$qcr1-CJh7@g{O?w%6;S=r2Beb55lU&N40oN3N3^1Gl#Cos9Otr}y`9ZR5BsIlaHERpX6zwYj&UNA-j1 z(~-?F36f51{q~$vv&o%I%QPZ#I;108{2_d_^bP1fjp#g@k$ye**@v6(=OW1r0AZ!E zw91L9oWmh9lqzibsz*i0b*26-bCnB2>r-TgF2Zz#{Qvrvf&m8jIaD5s{Z2K2F$eAZ~38U?aKHR%Knph`X|sW>We3O`(8x zRcMtlN!m`L_z1^U6DroHjJc$s=uT#f$8w8Zz8qa)@1-u?aWpVMDGJ=YB`R5RV07m; zCa{@*rmV+Pb2-S;r(!C|3R)dp`Kr$(J-i%=xairYaU!In`YiNnEOS_-zH$=(jsJ}1 z`eD0IVv^PHQ~6y5^u=5bnQyL$L&}n?2t94*gGaG2+BsBJSlQ>1Ow8r9_SQ&R{O)Tz zX9H*}TVFOrx+>N!WD4f-{Dz1LqkAekTF7g=B6$^eDpw$+Dlkytp2Qcm6L8z zlW=Is*>O{hK=@6-J1@nUNfa{(rmCO)!;x?4!N?UNM6)WLK=pd^{tX!_DL{tby@H*5 z9>%I2cyk-Kc4k+|-_OKksb`@AVlgx-Ex6)yk3n^2O#7MB$iTQpMK7Kv%PjVna2 zM1QBLWKWSF^*ho7Dzk#Em)xP4ElX3T7M5hpbtiYXFTaEKFNS}5rXmffUJ*`#Q+E~u z`-yh!5q@Gs4=2JnW-y@LiG!pzu`9)&c;c2x`AVs{#xZZYM^&93fkS=iY3}Z^x$;?i z?@gzyS7tCWi>01Tv~Tvs&%3&M1g*s%@hZkaCvYF~uAS!*?H%Xb$)PZ;89=EzRza0V zzfUK*3RvG*L9Fi0T;u*|4x*j-Wc&@*_JHYz-vb(6t6H3B8!%|NRER}sdQ|~tfCLD7 zVi>RiU|($EVB|Uxa!I;Yj#1pRo~h=;k_jp@t_e@X6#~w}4QpO7Xl`vnjYfV1uUNQ2 zN(oR2gGq2d1WeJ?S*Za=n6}E$e}KCio6L>kK~AyEZ!4l+SDt$~N^^{lnZBI0O3aF( zy*#d}!3sscxi7$20ajX^5(v=h=`^1ACev_s_BR%C5X4Tb!%i|7(2x{0P5ADf`O6Qm zE3uR{T!vn3oL~UwZLD`_i?bL)(;xs#1vGqV`}m9K-w%8kVeQ^G@SoB=3tE?eY%2Go zu_Y3TC~W?PLj7_lPvhwYKW60|{ZXu+uT94smi7R7ar~7dVRXjfG}iX}=1DZ4#na=z z>U`2(;h0(MkpjMlMge(e$I*R~Ze47q#-qB~@d(+goy`ZO5aVp(cmF<%r_Kl_(bY8g zAn($kY}9hSX}E4?nUbocA@w{4-hzZ^_DX{~{~TCm;B7{SJ>=(}RS8JWVh-Wu z);ZgGltz$PBmb;mCQF7Q6h}EAoS1ER9=^Dmwz)XvhbSnOdcVDe0o?S&&Pz{$D6X+4 z+i9lO|N3O0pXA*L#k_z;n#yp4f@S|v&6;pi;19Y38< z$jD%k53!xSyvdVMtcO*ZdocH`c$vLJCUbjhp5O-|qo;JA{~Yl%r* zg-mPU8uZtF`BF{FmfdrLIy7l12pmSfo`QZgxX?vZhXGx7t;=c#veZlQ)#9Zdp&}4! zv<3h~73s9EqDFg3xiyXOsj z!@wZITN}(xnRlEaA)o9Rz9ixSINWtLPMw>DgB)8_=>q8LR;fTB>OY|yAu?ftR#WWE zm_K>a9{&B@mB~n%10Pe-3#P9yJX>?GR{^U}SPpV%P2P9RrNNKM_dHP$3DN z``_2;G(VHU(H8&TSWBKZv|A+V+rosVHa=lY8ay$jm2$_W0dx}Rppehw$8{OkGYmjS z)5V#Ad>w2MnYVJdu~cN(@^(caO-4eDp|65qi<#BAxXBGpA#;&Q6bjmC=n70u1n(5V zRHC|SNf1)%mwpZE_q)q-vyT!m)?Ht3S%V|5YC4KSJM(W!TKQC=ab z=-7Mt)2?lJe&MNd7R=yI`m|tIjzdl4!*60}PlzCHv~j@C94cAItBe zUvwyxDXv1DcNa#o-id_}wBR20AEGjo+{6vf(f)Jz0$pP?x!eW%LHEtbqvJP~Fay=Q z+t1uUd){@qrgMDOEPP#k0$oyPrJ3XEM_BiyF%ICG;e~{daC`+WE!$+5^V}@-q=!|u zP9`S}K@3Wa*j`_%X1~a6vLO8G4~cNzK`RG{Cs6XiG*6lw@)bixt)@ z093V|23@OgnE~7aWf`&y1J6gfYkSL*YG2;DKUPuDBg2Jt- zo-}*Q{#|F}B%&2Lx;qvAT-{z}J?|BM_ufbUhsON)g~YblC8wiEinCz-^ZVwW$L_hg zdr#kY$-AppMDqP!#p*+1*YDji^A(7J7Cw#$e3p=}pYTSj*KP%}DgM2@APt&jc_)AT zd66kO2NQ=m&5+g~p_F!%q_@E-q5?b34EZh4nr;^{nMj&Dd3z>xgzo*ang)+moK4t9 zTjg{1u&x!`*F27mg9jFR{alD~Y=nZBJ|~PHRK2>_dj^VX4WJ~Xq|v_&eZdDk6H#X2 zULy|QUM>{ypws-9pvgauZjhgl(^lkhT_v``+M~k5xySCB7fZcz$(x4~^WCAMpm~KEoewsS+!%u5mnaT=UHZ9MVyx8`ME< zAY~nHO|0mP3*-c8Eu)5#B@VP*uher`Jv&V^tGvPt@^>H#3ET#KZrCP^%8X1zQg2sS z(jH{sH@PQsI#Q-k-LR&{#9XD{`BLojQcbX&>eHc$xeV&~U=M_@12|O+qHfh|Fn?2; z7;2(UzdP4snbVzgr54+~S553Ka%kw?gO1*{OWP!7Vm8M5i%MqO>SG8{y|zh4*I)CL zMuqdPKq`igmhiH1RK1&q&{aFDRtD%ZB-UZo_98mxxAX`Dka+YWUvGMlk@DP!x34pd$NuT&Jd5Z!AazY2>D>-k2Y=mxVG50H^{?A^U% zONb_!08SybnSqvw(CNVIYpaa3^XqDNy-vx}pXSqO1i5hmEv(7g`WyF-sMkTkmGM-p z$8>lt2+kXP-6+_r{);Ocrse!^Mm3bYIFGvsgu?$L?m3Qg8xADFKSqUO5;%|o4(-wR z@`1Dyl5R3UNwEu^dz%1I*we4kiqKpUrixNb0>WB@Vvi~Sz1gJwr*L`456eXh z-}`4SW+JaYXQSiy^rM*2#2W3WH)NJ%9C(`lmhg1Kc+JZNt!I;|O+Q^)j9IeIBU`*i z)9**<9XJo4wFXL&sL_au!#|Uq8-ECY zTV5vk*Hgz96Cixw)>@;51p=Cq2ahdO|6&p(b5{Mml6kS=zaBvPh2CV|Pa($ufuK=@ z8)pV6S&({E8x0&toGv8fu%|Z3mc}AE$&DouRH8CU>)qZxRbPNVw%nJ|{FLK}LnHtR z4RPH)WIP3b2dUpl$tF!?3EV@QEX+X9;FD}M?+Ssh&%b6DUfC|m?QN(_=~dOJNjIy( zaH?}LJ?>^e`BV6j?QfWi11z_?*7zi9j0LE*!~%4)ep(NS!G_)S7Pe!6k?0A5WdtB^ zVIKV9Pr;Q)S{mq5e|KD8>I$HAIO=ujD`HO9QlQOKW^UJo%g|<(6$;#baU0`EDm9fU z*+?@8De6xfJ7jnfFlB_|B32TmT^M&B+Ao2P=e;H&E1z2lB};qj(=HhrxPi_lhGAb6 zdv&PW=9slCWsSLN9bdNQCg)t)04L4fidHVlSZ1ncBo7XDqYZt;`a5v_5xL~i;llXT z)I`;NA1SUK0#711-FDwRrVC2zt*cODyjwSq<#$D{P(m->Xnn4a23+;DLavkglE4{u zVFEN1!3t8K+6h?Yd7FJae~&Y{%W#ybv$Jr5-7n>vvik5x>cWE zhrZP(>(KQlRw!7z3lV;+SE6|ZKm2pWVHwt%Km^eB6Za72k-B&!VDT1*F60`Kz`Uv? z8hHP-jaaRWs@z*pvAenm{|GLU**`kG4;9|lgpeZoTR@q{BsqL=?lc6I%zKg%WwY!| zAaOx3i@(gJYn3C-MTV;`Id}F1kiQGP{z-W1OOY<%I4$?u43tlZMwG}4L-v#jfP~=w zj$37Z@`ZoF%})V;XL?hu-~Gla)=5%MhmCG*>Q4}U@%V7Y4{dja5Ot(@{rjy>Oj>#O%_4-ecP z2e-?+cISZd+N{X8pcTg3;Ta9JbZI?eH3)!qrdK$Kj+XM7@#;^AQSSEH6+Kghp6ao~ z0L8oOyNa>&jUkW|DMMMLA1N}RW%8b!2-$lp{H$y%-6U^G3$9m9E`v5K#rY5bt{N8^ z2%pd`rJP-}pc|*rU8Y2jQmU3xZfS++0R`#fK>gX>hviKDm4J5t;*dKd=G8pZtKM~W z$sAP=8#?OV*n}u}c|-N@4M6>xn;F^69Nu~JULf^D9xnXLjyq$A5kl=IqULW4t|@Xv zUN~Oh!sr0E;fd7Pv+2~Nkkqb(+MS8^|FYqv922dQ@J3g)YnolFI#m<3k=zrbENB)^ zTP)pCj+xbqOup!VqC0O$2Tm$U!KjV^pdCX5`HR4%z{#m_LsZPv*^dzl(&>Z?4&?7J zrM|5M!@=5VzM_6F(4ER)u8Ybu{aoza^ZX3}O2T&kfdK77uGy(l{k!gV9}*#4I8rG z#%c9>Iz#H{jR?^B-CfKu$;<-XN0r&5oD#!r1lqH1CS6o$Zkw)la<>^l$If!EAy=Bs zwwpA4U%v4248^l%?Zc;0{A6-bcXTpSrXnV9+%2P`QNsnqRiv3Cs>%=jLepO@>2vPuzE8eJ>DOy!C6phB@f@UC>*Y)1riFngBS;iT)I zq*3uCSs#*WGo}Z}CezF}FDnrVppbi!r)TuLXugoCelnw9tjw&M#-=6+I0_Ain_yvZ zGqfbzK2d_90&Sshart$332NN*o$~0WVL-P@`cX~4I=MBtft{l0w$TawLH#CwI{&j@ z8cUoU!{C+T-Kka9gY?}WWDW3LOUbtyc7O;RUyEKve{#-~p>gKU^tK0-W5x(#oo)?{ zABtxNQQUNys%38MB&0vU_3V`<4CNrAj;6sOJ($<-+9IFE>^BpYM3f1nrf(3xKQ@4?d{#Fj;j~z;F|7B=2AhWG2-HU9JS_AiPbj@ zoDI^q3xFC}nIg~*=2R9`E1%ZfZO@349AC=M)o>;L92moFGUHGh)?q6e&)$@sdnF|4O51B=<`m^ zgGcCDq_0Fg_lKy0;ex8ss>0#Iicy)`C-V0aMfxCgf@f!Z@cA{;HP*B^B+3+lM47|j zCRhXlh2cU0U_2{qA#x0WdnzwM2> z!-h(xyBq(0qb4eXMF_b~6D9n>0oH;3;$6u%EMMErb{u546kWPI;?u(K`L8CoF@o*rujs$kuN#wGy8m`!r8{t$Dh|kPpzY|xfDmaZJ|Vey z@Lq(H{#&luzPapC$>Ei)O;ds19C#q}Z5>$y%&MrK5v~0`LBuCdZq36^Fzp7eo*+sp;t& z4^uTma~OB^@zHLUD$*F7p}Sn9id&eOWsIA;Q7CNCzRM~7?ureE-N%dnf{9kkwjCX` zc=CDoEnxF`-C1S4z~65%$qhyEQ3bJ)P5I8YkeXOq$dJz5P+5jTqTz{aOXPicHx4!^ z^hRaxQ8HpY(Piq7)@3?hI<`KR6Qgw3A6XjFQ7jx@8kTi#I+i=OULvtGoqjQ{DR2O~ z*xfY35#ouk2(o6vqOmRWL0ywQHH&8F};ruwyd81!rg7=4kXnJ8U%c?Q|YPXicv03jZ>#(B@WBc4$LN{cEz$%SMwBgm#i>9|HerF)$UzI zwo`~_nSJw?)z-g?s*t#lTK~I9rJH|`E`>?xUa>rN>=SY1+3W!y8d#_KylJ=89@{^i zakRXT6lzrwvvRxeDNcx~22c=}9aAHJJJ4NjiFPwe{LyZ7s{O#EKzvPn!$i0L!)(<& ztm}L<7S~V=<>Y#vD)mJ;-^4SE;96dQfBVoHcYg>o{GLJdKkW_MyRcNAXn8FQ0l;-> zbLl65h@Y&Qt*({tRJs{(tm8m>%eMfE>}vo;^6B0cKV}=S^`Ja2L^wl=N!Li1fSkvS z2@7qrstZ>ZbK$$mugR6R0%T}cP?q1F9)4?YsvzJN9Mk9dvcckQ~bmD=}g`?cEe0=b!D42UTbb&yB!1iSS84DBL z6W0BwhpZBa(m!vdzp_>}DPX{ow^#jfUl+&|;OzPZ#~0sLg&++!%4V zIp+&y$~dDe|DXQr`mv6leyn?~C|HzuD?mZ~!~d4}orNWz9jy8=m=>kF${^+90w8Bd z^}3aRg1jrU@sdFpPd4EqKA zoyFfW$P)18+sYg@Mgk*2y0)Y$`kLFehMX@nQT6dBsNx4$VrKyAaegD^NpPz?~+o&U&57)8iFs3vnuCAybnHk9> zEph-+e!TpXl}QwuGB(V~;viQIMB|$fi7mu|rk=ljWOrsMw0+#Xyew-K;ex0RTe*D& z=iMjcD;E@ZlWGc*UGgc~C@S0t#@6OY**(J6J81^S3%Tvbp%si$DT4q?&}E3^ohDZ5 zz}C9Cg1B~)CB_Gdqs8$_D^t;650>BLBFyZJ(xd~qVAyn-rYnE^WWi)keXi-|n*x3@ z9+s^$X$Hpka@&W&jkJsr(9$b_K@$>1G(oL3GsUURBt*fT%z@&#^tH)}gX@kMdC~H#+Kf4w@wiksX0rD0YR#zwV;fA+RX1HS&4aYS>;Ch#;ZnRz!)5{ zJU%@W7b&4TWW|j(N4U8o=(Qnlu*uUxC4wHBJ(o*csvRgfeKDA*^TPN{ZRxb?hUlvg zcgqM#IiXyyb!-&%pq3CxOA(*;pwU+=kL3xp6@2)ACRv!c`6+*U1VJZn*dxM;5(oG4 z3B*4<^uvdF61+k~!mm1$2=PH>IfL7xmjHtHQzu$EbiAvJbsKy1Kb@nUKqe zvJ<+8U=3cgJbPd(-$AWtHf|YIP_77nEX}|we_Q(@H<6-`jz#wOHM@!uhBA?xBQch% zENw~R8O!6)3VOO+zLiUW^=1<|!f5?Fj{ zQI^!*C%Tz7QkIaqIu*M(wRt8(Pk*Vf<<)8ewgz$*Edi`|wJ&qWRg%uL6)amufFH0O za;xR{kCz%=Vkh_(Y1P~YLxnXyYd2r^9-pKeZY= z3MQl0Ve2ca8@nI66Fn0G2k~#C;#XLORxSwk_B2JaiN+lWgzLeZ`+@X-EF z`I|x=%9Ei&%~;P+PpymvoQ5c+Gll~*>SnWo|POBgUJb4tmNt&G1@o6>(W>cTnNedJCX-gJy6~X z#!pws|MhQ;cay)np}CSgMF%=ntmRdbJF~D@IFy6R;I$Gl zmKI%K9L1oqMs`9ynzM6}G!7X6YduVZS^#B}d8VEWar<-N!L`krZNQ4uLg z?s}o2uHdwksIZhYJ@?Q^J=dh9h={Z#H=U3K8=aJdh=`OVeYcKKx6Cvr*UU6G*UU^; z$E-{(kyKuA)lI>V*Oi<#oYkB+FK@W3xofy9PqTk~x9_l%Dc9)KD9@+}kVV|wBn2T= zjIByOEWT&oCg>(<)D)^1$*H^OujX%-snl;&UgtlQW0Qj}EVyjl-b;s#n266QVJ=gp z%iUF7MDx^=9dyFRU1a5FT$ z;lV*(K3*LG9TYxf2nZZ%7pblqQV7k@$&QPkBhiMD_~|R!xY*lcu+o|s1^0mtM@~mh z`wkcP{sm4v8@L>~?q$XIOByi&hNJn1cZB7ZNTJ3kr~v|@fi|j&>#5Sc%G;f@wX>Va zr0j3XG-T3l^ugo^CV*&LX_+YZk~3!(b8}|qa&qUUvuvuYtShT*U>=^v#vTN?iKhnw z;pxf$p|W7OpmMYl>YN<&NrrcZ)!UGvnQu?S0>R$eD&LeHeXSj%aw593DpEsm_7zzP zIZ65A5*Dvf=1yi}jvyz0)5Lq(ePz+Q^+jg!Bbo85q3PZe$tnj9?*G^$62iB;#(JWPe9r0vgPNw%5DU|g_-P99r;^U5=`C6}fg5&Ru{#s)mzq0fm1-v1l; z5}hg1f_2f(-G9cS`jY9)G(}_tYp<32^pMr8k}iNq7T{~)udJPl4)W3c>k2Kyi_`b% zQ$6u{iM27ktuXlBTVsE?ln>Av3im&FT!-=AKRbr{^&QI^_Pr}sYGuigaKrV z;4-GnEUW~a1*U0UABy4VoPHGRexPe z-O_?o5w&k?;Y>kFL!aQoq?W4qn88J#AmG1X3z38Q?s<7km8JYb_rl4iljf7_PnKKF zTQ=cWk%@!^i>*&LmrHdmb^Vw9@h$PbykzEg92ius`ptcc%DsUJyKYAfHXyJ-=CKG( z&*v3qX7qLr!RHJ1i(ryE5O`j!%} z%1l>o1{{;c`l;QjF#E0_&ihHNaaZ@6`}4e4m&Px0VEfQko;KiDqI$ICih zKh%*;>jAicdyRVo3>Hz{-e;ww+hyNQ#t8w?B38DiAkLhH)CJlrc2z1yCaG`H8?FY< zDGRqJ|HXOYE9#cAt{Os@h_lojPP|_TRiZzWvQUzrGCMt=I$KMT$>?f_@{pw+_?yPZ>Xj1d zE0aZe;d3Lr{IennCaMrsHPowGsL3UF{{5H={vZb729FuIPD@>-o>mb4uu0 z33A7$5Mukt!Cuo#+zr{bRt_%iDOd?+)y%~HL?+QU2lb;3cM7x76XxtVZ@fW39!=g{ zlL%E?B%V03u_%vC6H*fV{1W2`9tm;&UKz1z9!e8(@)JrvzH&sV`{%Yc((^?S7Fcj- zkc$B-))7_?F+lnWDWn}pnG2apA%%o6+#xYEIVr^iX-ownhK%M4iKj_Vu27-{9dLRU zVj6B(=NDE?wSRDS295H8zrG$|+@bggRogrcerP%yLT)tZC1~2K zO&9G)O{MolQF%&J`=`9(!KGGspxh5#PA#Xju6`$N8)a;YM5540gejL*ZOVSy)3x#c0&tm4!FKZuj@#I7d2Tp)Oz%L_UY#B z6Uw#E&owkC&Nhs6m~ug*59WItr>EK!=|#L=3XagHR8ut8=H61|4Qh|R8r2;l&&~SY z&{9oCn>;4)(tGq)Y@eFG+r7Rx&g_ae+P@>i%C9(aI-$rd%SiqD?8P9lW1dI-RGp7F z+uim0Jy=N1kE7}=RIs#ME-ABI7(swXq~??a z|H1H2GX_3qPg71C#*lVnDH#7N@~wNKa>|qu(jI$v-kv{91#?~ktn!lj+toCktZuex ztu%dFV?mX}EFvj0Dbhb9)D(UB$4Z@7HkBI!yLrIHjWjx~qQnSgOQda^-f*^ROZusc zs0j!+d@EeeKB%AeUXaN%aPG5^>e6yWTN!F-h5Fvb-uLafZu-GY`}>OP`|j}Otwn4| zU|WQ4vt;XPVRT7ZQg%tBp+ZX4P(xi27F)-;FlD(?Y5eWW{|7bRF)3;MG~23cSzoHR zkB7}nhXdrZxZzjnCPlC+Q=KB+;xyuwmIQI(r`hU--o>LQr zYj=m3)Y3R>?bQ6jz{NcE{3W4aIOgiAEX_AMxHNtA0cQUD4kg%E+VcPLoj(-iITe5` zlK)&T5c;hkg@%Gbl8h~l960(kCxI0BPZansiBzBC220vrVr$1W1de7i>}wtvCg&&T zEt8f>5OH%b!)T!9jTo_>d0>3DY6(a-VVwytdW|dF_a~K>eXNQ zTc6}r?$p@X-PQvJjDsW)a zpcKlfs=BOtO=!TCOrFMvs>6pRnSM&Y?1;6brHQQM|Hw-Z6#M#yM&(;rM)Js%tfyl` zZp^)<<>(1r>;HJwuy|M@Pm@Sagi~?S?75yTv|3))St*8nUvl%yx(c&8?NEs!e6mp=h@+X1Nn-i>^)Ic%r9(@6XHHqx-fMsEL-CG}VwGI)qBSX1q|+{s zX+caPB(g_T1EKcOsHc$_Eosfk`L*`dk3zru^T^05dufhY@e1933(h&4+V%9~hcG&j z1Kdd#>LMKzASNMpGx2x+xsbI96fDC@1hd)2l*OwxB;Ya0fB1|XtMho!aFnua{}hT9 zp#=j0D11if`<54id9Ni0UqKiEOhQV$42LfcnStzlERwI~C+o(#sR0yzMhq;=$C70A z>eRYL=LSVuR5e5XOCF=7@+b17!vw#%kvbiE{oMC@#i|UIq{mV#?+{Bgh$Ymj`OApf zU>oF#;N8ISp{&hZU6cJh9U=)!*B36Ez|9G}ki+xUvF!V+Par@Q{J*v96PAtkjZUiP zXP-}+UK?zVfZv&WCI-IgwSW;{o;`H5U5isI7t)FloH*cl&Kz)o;CZeX2}!ZNU*P1A zG~igxQbS;eJtDM^0H-5CLWg~G!7Z&p2~kbH3sxqPI}-<7&zXZu<@xLQ@>XB4;cNoO zJu|^gZEk%;qkl8A;XhtZPC*e3%}#Rjz%Fy^`F$d@HV}w42h5dzD4lrfB>m!A0r_%b zLZz!bV#aOer}u+D)b#e=4N8b^^jRy^rFj@!1Y9cRMt!}Qad}sIzx16{dkpKV5v!0F z(OgiuudEAzURr*=d}j%;wIK5q$oA&#>$hxgs7+wxE``%$?HrVIY-^(>5B1)1iu9Z9 zxX4~B;*I(tMGkk{iuu2T%}? zzw|MG2g<#v;7|f$6#$&JZ{FU08q4Sr-!-mK6MrIwU4n;3>6%eC&eGjdp1+sMuAFM6|v^4i*{$F`hBxE zC|zG8GUOji`fi;rj$p63LV^O5okxTcrTVWmP=HPPi!WzQz%}4mG`)((Nt?iN`BPyP zzKxd=WsSCl>yT~V(1pvUIhF_#KKw8@+|)W$-nlAG#E{Fw@tmpEwU+P!lfAg<>&eC#u z&G84!Gs`~6FUR`L2zb+-=bniByN_3Q-nMQu)2*Jp&`KgbAz*XVB+c9yjr24qEkkY@ zls>O2E&w|~#J|^I2+y$2dVhVDola-Qvb46r3NJuA&}99>6J|)zBJfiG ziip;+QdhxFoYq`o`Av2*k21e!9_ZSIcji2&WofKy&OZOhyctz!l?`3f;5_2&;drpzHzjxwyeJHwpNh#f!nm8=}~rk+r#4L?>1sEWsuu7N)3(4QzM zUScmf)l@&!C~~_y6;_SMn5s^giW0&e2s}HJS5kPnB~iwU{$a0)J&5O)Y2-tF#tnbA zR!o*`j(>_(|Agc>*Wy&cPE$=^VlPjqPA;*^up2D)s_MGx5-X|~hMn-LxvKG+5Vd!c z{3#<&#d7-Ml#)eB=H{=Y2op2$gh<6MBMF`V+S;<(!uYF|xp_scsI|Fysge16Gjrp8 z6oQf1sC|-NhrO&KtGZNT55tyq4_Y?KIVc}pVlVeyv`003`xb_q8Z`WZ0It^nKN|2> z^;cafR;Ci~zOjBM#*0S=Z837}B=Gb3-NvrV{)^ih*9nL)02gHtOR5R{s9REbdVX@Z zvFBayiw*4M^#AP`gU~I_p@MjH%HJ#Om3m1f>lS!(z6Q9^4;24v<&GvzSQJhvhUH$O z-a-Skf{$6_toMwjEIT*V?XCv6&ycTQ)RKaXpPije8bWw1%?OnHa0rOy)6K~x_Hz0= z#}Vn*C+}!fzER9XEo5g!FU(9u&t+vt&0#q2C@%-{C$`4azZhJ+#a?y4xUjZNvhY7b z09?E<5Nc)2mAwJSbg@=^H{j-JS&U??P8*?kOs+ys5sbB~-ea#PUFUOp!v1p6eBcjp7}=Hz=b+-&XSL{$`3 zm)Q99qjZJAiS6H|`0QVad}%F+T=V4eyExKA)b%j;XB}pl)W*W+0WbAcUT$G?v3c^w zRv^VKjIm%nI8}qY_5X|9u(LslZ&kKq=(-^Se7o$&8*XUEw?x6W5c*z~Ks+<6{XRQ) z>Qj{maV*^salVHaeXOND=|YHIwXynafHle03!#4}<(W{%6Se&)V6Oq0@aOXZwra>z zQc2C!B}-m1<(D7Ha4*5UkFH*o#*a#kwRn0sDoegiOCF`D4-gl_vx(u8xg+xf!~1a3 zD@A|MTk<|MZ&zjSl*^pd!kFl^qU_A{(x|BPA{P06p=97eGI=HuK)HS~0&Y}PA)bpc zdbU^cuIpV(UC-6&I-;@nD)*_<7;!NV=XD_~1a3kdwcVodgdtci5``br-fHPT?1vUXISUX`AoUXw{I#IgTN z3>R+8MC$0-n%Vr>s@cSYqh~P=gNHjQq zNA_n`brwjJ1e{eQ+tk)GSyR$K z_x$crUG>pHwIwXr*SK?HthH}^tS`VxN;cVA1a*6FXMZ0r~xpz6Df+#nTA3#J48 zt3KEPh)5|a;z!H$qxkiX!jeH}_hfZ(-&9A3j#JXRaD3Mn?rVX8CAP00+zW$6dZnE< z>o?m*yeTn%kSv+Ji9%2CQIbV;=I$azb;85ukXqJ_cgb? z>PvnGX`42lybX#?C3=}B!6jU4p2e2ru!5QmZ2F?Z*i~t0XlPVZd%4@A+M<(-9G@1U znqR(T1I1dZi7w2oZ`^Wb0PFhAqyIW~w~9*?CoDGyXOH&+CIAk{12 z^#6bPpWlJ99qLA(PXJynmn+-=?v%!7DWY+lE4mvfvc#B8cp%8}K$t~2dILgI{z1f< zLRZJ|eRx3mFofTud{_?0yqVQElR6%KKWVWww`Z)RU~nvBC~`S=ZYZaHRQap z40C@>I%45@JUwh_#Q0|i&X}{sP+i4^;hkYo=lO#-Xipxg>Y^jR@CkX^gX+G1^meeHb1+{Te*6sqE{e)+hHk# zOiquUK&jq41}{N8X#1YZEDlLFN)eesAnX+jw~0ei(s3^89z8bn3b4oIISG7JM2o~uI#B=`b>|lHMFF!G`4W0z8{st zTiL{rA)!4}2`8A?=%U$hQbIj{ii5@I3%O)TM^*viM;JLFRWUd>wR)uW-b`h5Ec#l2-EuwkZj@(gv9W^;)*l`^ zQjlNWn-LB}`r)Ku3Yv}(&$c+maut{%(imo_qUmf5XX(*}6(4CV%Sgt9c_}ZIWLov5 z)3pD;Bz?XnkPn<+a5!BER8a6=2%`KaAGkR0Z+;56v9#zf zKkm=u&+kv~&-m_NAblVz+y?wf{Tcj?-mbK2{dGy&bLTST#(|81k%3HsmZ>{N{pdi3 zz`$2kzD6)cWN}7qVxmk|T#`|fn2=eWSF)0sxw0(dpStw=2O8oOWsSxuH|dXSRg9mF z(^ibDp`4l$N4V^L!}M+%jDgbq$CtCIKvXD_$s`tLwmOWj&aU0N+&dV{~^ zm88L71p)>UZ<9G$-G;uW4wJ+T-9_8!AIPgJ7{gU@Mp}W!+FZ=~FgVN*fzSiP5k?3I zTmy(o6;{=8l8@kQ#Kpj zrdS(c2@3y#sa3gWI|7lh;E~R*qW;OcEHx5hhwQ%YwnfH{ElII{uckB0<_N=nKdu$= zV=tj9=eKN6EWb-RZ;yDz2nFVLMc&o^7ZdYeWLUgCsN~%5I>l#w(r{J#l{pY`GZYOT{ulAiLs^GW;gP4Ds zq~FYJM*l6J?QyOZZUjE#69TRco*&G1B&~b61hqL3!ta(L6f{kQJp0B!DuH3gb zN1lQ{(Enll`p z;eKJ__kwGYwh3C1l?ioatRZI4pli@h%pdi7 z=0*-BrLm>^rSacNZh$4el=@XY^U<2w;=hZxSZRCQk&defkc#j&1z|trO^-EiRKCeJ~xnkGST&z1?)@k-mcIjy~>p-{8 zO5yTNQj0{IcYv{Q)u$>!Qx9Ls%%m26oR@Y&q$6VtPPH;UIRK>Q;SKWE@-(LN)JOSA z2FKx^hG+>onDzNL{!Ig63!IHcCdrxH?Zztk`Nj@7guRTK;bwZRiZmXjWZKC!H1x!?6BgqDo6m ztDvcrrK!xUNcowZUO<;CO`n&Mua6=BqXu`BEo4ojrxlwkiZ-Vq{C`JS!9mXR`35a2XKwT8}xlF31}@mbIx-Y^`L4rQkIh4l1U%+taRd!nw8 z!6?BK6cNQ4#3m}6uB#)Lz#+DYl-E#`C;AT{F@-dgpvFN5s6$)_Dx~ZwjP4X~2OT_V zXK9xZ#Q1uPqB|ton9yia>C1D0ry@*V!C{O(kA**oy!-Hh|A}CVftZ?-fmrLF@F!8t zq}Mu+wa&^lR68iPwY8NW=^j7O(4IVgq-*X_4$yIvk2M`hcB#E(3AYSUyvq^XqixJ) zVh62pq%98;^$;~9foZU(Gc{It$p8u91A@R#C&LAbSoANm9!U> zQth;<5&!&0D@Y_lI#tAs8f04*AH#%h9Oq(TOycBrh&D7f4YFnVOe)5~aUyh(g^k!F@1;-rut1{CGUFouFQZlc|j{Cc!I^{*raw z$xjgg{T1VRVldyzCwUL1A9wEXFuF>9i4T<+LMLlAy{hvkmglR9`6v(e?WM~@c@mWo zjX3Ct4o{m=gh1PxBVQXNimz>4D+V^ME6@Uu;AvTRmIEglfFhSfzHd zC-`gJYVa|NCYq&+M92h+Xs5(RMoHFi+jvRY3k6G*2)Qygi1Aty4NS}oHUG;>VY^xw zxGDzCW0}k2xa7iztx98Knavw3xL5#5RNS)vH4Tl;xL`M1s41u!hZ%}`VZ|{BPw7DZ zo&KF(lH0g@c{+r6P}qNEHJOB%v4Ks?$m2HH86dgZH!;rtH!+ zA;pxswW|J0I(lB(&bwLNj~c)1=(VWsYY7=yu)Za4a%bo*IsC#)YC-BiZcm1k1pwvA zE7%M&Bbf#s*KY2vRM3t-rS!122=m0-1D!lL%CO>0RP;Zbrk&P($kIAbO?xHpMZahV z@M4)V_Lj^j{JoP!gu90w(D{&|celZln}Qa+20m>Nl0A5QD15?G4=GtI>HhSoxuZWM zA-v6RwhRqek*vGCyfkk$|3LHk>~3Svr{1@}((BZ}D&rCiV*hE9eX~Zg{7La%ao6(9 zi*rjGa%PWhK*smFpMm-G^t@1=72}`c5>Si-rzO_Kv~@coYG+UyQF<;>mryAks1LF* zYA*N8Ny10ew*YaIISF^k#*wwzid*~VXL)#L=-Q0T#!b3%ld0FO)dhaSTn)l!GgeFe zYw>pu3!=r+`aqWmxFGi|dD3)>$U> z3x8Ic8fsa?L8c6A0iO$GknvXgAU)Cwol@d7Q^XFXGBPk~h(Lj3P-!-}(^Qtxx{D!-GF_&1Ji|g?(L(A?=+} zvyzRH`cL(v8>84(_d*n4g;3Xj(eK#eI6}2bnbcp15YHR=`pg7uP=@`v4!YJMf3BeTvc`47kki0IVCM{fRvN+KfH>BJ>h`ry z(qB8*KM%xf?+kVJ>2ccnGf)#QHJ5cx_0jIU?sVC6ymi&myALuXztuF_rL&mu>?X;j zHjG_7K78};1p&@rcztGd#_i8IRa4(n{SlwP4^ne7eAOR$XoZHw-WwUIp6--9==@l< zQFV!JJ<-&vKhKCKGjdRBZ;jy!uwOMc`?fscHBjQ}Ay~30Jy>u2G7gccrIE@yuQQM1 zvB{MuIpy3E>x5#gs7v0jd>J2K|MU8Dso7m)W8B@sEYxEyu&KK1vA?3=_hv8G6lj_g zF*p+XsW=JaD;!aEmJ?6f!9u2ZO|arsCc;5R>2cGK`ZMSARDO78&-V08R9AFNb;r6a zS!yP#gB|}nsSzp3$>m{zGJd4Khuo802xLm4rG z+!D3SltjQInLqOB6!jHVH&r#SHI*!xR&ghdXy6*=(Yn&&9p>hGgZ+1i6Y~|Qq!vh( zihgGM2MlZ6d4qpfnx39f22%oPw@w3X4?9)DhVD^jJj`W&=L&yb>UEa8rMflAm45LF ztp2qIar&|9vhJz&N&0M!;DiMj4HyfN`Rk&M{U4vRZddmx^R*A8J|g79&DZhSXqOR@ zzDd|*WH4>D>Y(RsP_SzCU>40}4>4C)uC9f_mWHdc?m_lgY8Ox-*prgmNQ4dOd#p1p zEAbPuSaDC%Y5T>>i1{^lP+(B9WgmZ$eD5cXimH|&Y>Akk#y5XGJSB#$4bBfY)oDP$ z6VXh1VX6nuJ>_(K>^KZ;ZXLxCvys{^UgARXmIwiTNK!mZoc8(K&(v=a;|C{no07-# zTMqDgsTcp}4_*S+&JsUTnW}kq2oYrFEG0$-1AmIp)80yuyukkIw*}kb@34ks<l3ZTP=*8o`{}U);P=6@&|88o2wzvAj04=|`+^Iod8yh@N{ss2p*MpzH?TarY zi%s2<2gp5iU(U3bR5 zl6Q(qq>(gd$z`oA1CL*9-N$ULvy`;(V}q~O-XgJ>z|hfC&Jys0Hex?n=SHy@6J6x) z>YfWu|BaBPKl^Y_J&Kq(eNOv8{&;RvS5SmNE+$FC$e?oh60mxn_>sK5xxH#;0<&Nt z)-O!$z80LDOPvi!Pb|`=NYeXk zXjzGVoADg)@b5}L$y29cHzrOcWBk|h)YNxEo#a!jsWDQ*N~&ilZfN$EB%5_Z+E${7 z^egzLwkXINYApU5y+s~Io&>@Uzd}`4h;ro*>sBtlNHXH$(&^;KlY1{WcS8HIQgA|5Z@^@0bkh4Pp9m)$)`;cZ4+&=a zQ-$>%zeZYyK$FtT%t%KMZ-Q-j9M_e>^4{8RbPY`3MH4+`>p7DV-$*hc_&A|I`zCcJ zdJppGydHP4kSjZB??@iD+Ca1s#*kw&!-=tKtLpv5obSl##?c`+9mi2gdbZ z?k_)ou>b7kA<6bXbC}DZhkbY)*M&i0=jLe>Nd+mP)GoVhD7hjJW}Lax(F{lQJ4w!o z#LU00&6--%0D7~;g^}XPI?N432-)2eO@fpoY*T|JJ6HI3rJtKqZh}7-k1j1fii>c` z^Gci^4UA}Xga1VpzNMNsuJqd*UJ~y<*iM^WuDq|yoO+}|9WM}^;+_0d`zZZX)27n$ zZo`nVnI%!v+sTnYa0-s;zuaFudHDG0@%{Tju{_V^LZRultALtrj0|?-z3tpRT^xRt zt9AcyY~K7_g5rDZ7&!)ky2E+ zz*wyoZ&@@u3p)e5f&?QgOj_jCFvfTcDL5)_dT(ZF;a=B5XGLRnlCIWJl8>7U9`76y z-T!fa`PGB1r_Wbc0@}BrTZ5X)*Pz|w)fGYf#OMT`+s6@4nEAqWVX*ReT@!fYb$;fTn#YGh@cveK!^hfgbVK2W*@IsR)clyKG)rrr7! zj5vSoEx&(fddB60#6V*=yI{NvIGM9{RLADKbz(w3ZUO72=()uTu`dpe=hS-hB{12< zZQ>)>ITKyLp??!^XD?_nZZS5;3x#LhQt>x+;AHtf{CKEe92W)5i#i%i8O*P4Co1lp zuDdSC^IcK|!37a8;O3F2+V;3ZAS7Z%jk%$Mzqur8wmqnQ2{DoA@Mwsejh%V2NhD`y zzox}2L+APyq_oF(BwoQ|nbkHl#4ZF)R@q*8rzDXQ<$&<8_A~|}ld1Ci>v#prPl7`1 zY(rUB6ntRL2%gHWI$(Y>ec2?DsVtGYw7r6t=X)$6jK{`_$~}vYSJ_-r)lM90i#IAc z|K;T7%Dp~Px$_oRe3Zqnd*VZ0+g5j$-bqQOG_=>JslZ}WHYJ5MQ86I;_2|*S#_mqp zr8z$5`0BlRp9!u0TdAp2aC0Ra3V;Raj@%1?`C`5S$pGnB4*l^>wCS%FpFWA#^WNge z@damB`re|%8-qc5N)hiG^-W^gAksZalXei0eHtOygO=V-{?C**0u1nW5`&n;9E`IB z%)G?u`V%r3ku|?GD%!M#oy8 zyB@%;Mq30lzgZ2wXb}FnL2tN1?W)4A@ZofqhtobDeo$J5!}VgNL5INxQB|6t+1+~_ zVYjH}3TYNFUoal~tVTx%G>6tfjXG#_wnl9{6hGJG5^U0(l{#qw?E6u<7QPC94QwVR z@6`i>(4k*D|2oh4xj6s{Rq~sdOMoeK`h1r%K~r}?^Rvc{WGr7;?HO8#-KEtt@dB3) zrsmPqt#nVfP-qe>g51MR)dpsw$W^5iSDyyzSu`_kbo*9!1NiKnzu@}K?lq5NgtJ$Dy|9$|v zUnku})Rss`y3eOiwCFbe*H?*HclR|+!G(~kIV;*sK`CB(^SmyQ9b(;^-&hfV1+7~s z8}a?UDf$X49@85x2pvmf&d@LnWf>l3Dk^h2$YK-G@1hu0W?>J0o5}-mZ_!-)Qkx)&ms<5doPI)2m+Ex8s*t<5r z_?H|k09XeII9!Y>01{+XA+ZA+o-M0>N_NvVnmM*gE^R4~#E}5hD9>ckv6*y;s%}O$ zJL7sUa{b4mj_Q9UaT3z`s=pmdE1tfp6gR8-AGWmv)ZG^~;l0JNRm&)s;_g!h=W7*d zrPNlqfq4`#fFTTH1f!V5oSXenyH7F5steHqG#^HP`v}^_qLw~+&OJFza57$da8iqt zVpDo15O!|{2$w#?XQE}>k)u^LYf9-~dqWZR8Ctrb2)rb~#5@$ORggF3)E9FnV!^zc zY3#LTF+O6bS1|62T(J-NJlV!3W?|;#vBjcmyKP`IZ&eVuyL9L7=}I@vY#?f}yX;&! zdHJE0(_HSEAA503bN()9Ps0f8p%%uOf+mVkWWSJwCk(@}8G38lS1z*5p0cB++*rBv zqvj)b12h?AJ2$+)Nk2Y6tZEh`#oOZxx*Ltxy7bV?tt6Yv!+e-3F3M2T*o>ID=A_}4 zrM32OcGkI#r-go){L4I*dO{ZlB`KB`N5VS}h5DMuOR{4<(y! z<-Mo@FAy<;Sd}ObJrnI&5c{+-3a4nOkmjQYlU2g@tgh85^IX9MLdH|NzlY~9X5_EO zumtEmyr`^Yixx(*o&VG&-ZV85^k89Os&mFCfxR|#SNG~@1VzEp6lES*Y z1ZFBZ02@A#M*Hy!r9Lgib!XV8gycuCrx&@;sV=+|S_(tWWw#>XugbToB{`MLNbPVc-QQYgwN6Kyuq^l}R=$|Ep$V57*>I`scFWdc zBTnoW${ERoT5FI=wN{RW>t$m1dbm->!i_QzZZ>djvmDWj1?kpMLuqQBEeGGT?XYmG z5iV~{3bz|}$IdSiYVeW%t|lQ0>#49@nW!D<#u zG@>7SnT0`pUk6{!?AMkVlSzL9k{eJ4= zB31S(YGru?o1*v7#~8d~MYJ*oaaP1u#`L3-!|MsSjt#AWPVHpp-3xdRl|-Vhn7I1;-fVdMr(14D7qH%i1yV_K!Bn|5zIlwufi8wzsDT zx<{iPcH8QG;q5O&?Kds8VoTpotB~c7bVV(is3PTE-%7%;J8pvRe*E3Qo*_Y>AmpI9 zydpkxE>2Btfa1MmSvDlR9`G|oDH<|;yDctYk#zSeU_gQFkG`b-tlrnN|NIaB#Qw(F zcls~ByZ9M@z5wjKCs_cjgnRlregn>tKY;X$nRzI2LW|h{tHx^pmI1&%IR9QQCKCQ6 z{=7|+Sm~nqdh!2{WEGf$8Ckkj|HA3anFe3%JBXfqh( zqWfst(p;uM?ve0e)V5r(AD;=!%@AnP)rmggW*fzZW$6c(j4l@QFhSH&06!NYFTRHB z#muo90?e4wMh}|qA-Ne}vx8~!MkkFaZ8XuCkkV#kS}4_1)EvD>HbFG#Rvpvypx2+;%yg6it)zQ6@*GJe zsKcGeX)YADH#3LV4hG9i>D=2%HSc{~rz`mBRj2Wj*@I%oT`;vpbl7x*^&=fW!;D6? zonx{oW}y7nW#@FCzKkh+K8&YNRW-Sc{{SV!jcg|JL3}Z?g9X4~2?rkChZ6A^vcJlbM*f74Lu`;D) zpVtPUk&&j~x05m>|03Vdka&vgn?WOHymwjK{Sx-Aaj2f|!!iauh*6Z_ zwt#P1@5UiVQ+T)#m>{~u{+=tz-l{zl@@37tO|X*qt+5%Ca19*axvI<&ia{e3v2~h@T2uXuq8|tWWmcGd6sjm7XYKeVd#iW()YY=w+P|%}qP^ zt%S9oxH#mxu)fONb~G&D-x_0d86jjl;zxz?%jFqA9~138>;GS# zhCzwkXZz&&PwlsyED5l-!};9M&`8&wR)uxL-nL~*(_=wrfY^DnI=+J$6ym-|a6!vY z1!T=7L!L>!!lr`e4xq80>99pB7(l^0hB;DWQ6X>f+J_GslhVZR0M|>iN27Bof3zC|_}2|;m(dlO)-k2~{nUg| z*GG^v=i;iUO*%JzWM-^Qq8CGv6xgeqw@(W~;JIoInXWc2E zkG0f4ogHhHt0Gn(^>lnrE-*u;?(C0T0K?-`?LJ z4(5pB0(&xUanxcG5kd6o0b-q8ZqG~;fCa>bTFYj;m z)?e=U4E^5s^NzhfZmZjCdUJ`J2GtkijUB~XBYi2Ky>uCIo5L6egwsvnp8+K7oF{+W zNV`tf$cdstgo3XrIe66`uR{^Bil0Bnq#G1QEzy#-o>f4q50ZTnyBuRo2?LdEOHQHq zAt4Sf?~Mz(V>e@divuAEN+0G|^S^ua-IAnaNT4AIBm9Us2%i@@(Sie%Z1gK(1gcm3 zB?3AJ!bEPc@F3li+_oUSheIR$J48xNRbp#F=JpH(&|r+16Dyj>J-AK2zm}*!m@uuo zB&kbJ7lX;)F==u~$lXsNjZ77AFL+e!OYPDgfVJ#ae0PblY2ueOO}^QTn{kuoUC0R^ z+u<+6D_5N$Sd;Q#jDZ$M*kJDn{>zQ1G1UPnp6ykJ;ML zaRKHX0DcSYPYIl7GZvSIk)#h*Z&rB@AQN6}^SY|eUs6>|lBjkk>C${6)JnR*wl^jR z6mUX8VUNjAkl)LU7$?E3F8i6^y~+jVdA~0J-nb!6cMzi(3kQ;Pz;fOLTS*Bg3w+?^ zg;cAWzC%Y^D@I8JL-_m~&CAhpl-;Txiho(Smf#o-pApAy=3;A+jJ0nyVNN^+^}O$Z#XR(o&QQ$*-CfccHNYFK^S3nJj6Y-Jj8kmGoWn4-J^ZNt zJPn^z>laWhVfTXn#V0HN)0n&Fv(IRezM1auVh@KS0OjN3;yucm*dlWGrkrI^Vsxw_ zH=VRfZj=(>AsJymg&*GH;qG!<)3MN9r)WrxUshSGb^8{r6~O)(z;^eHvU~7zQdHJf z>{Ob8CUIF3?n-*1T%pqqbDs2{1LR;kPAV{k~$DESR^4(ub} z4`sUrl~k1Uar{=#z_HQaYo4t_D(k7P9hB1EcIRmfR)Bp1ke9;B>_(0c?u!Y{gp{kU zWVpA?MxgJua)I7=&v=TaCj#a(nF$2RlLZ_pGHoh~$AL^OZ7zVJNf83h)(DgeJ+`sz zosEeB3L_iUVgyVyiWD!(hh7la=c4H2_uAY5^W+ULTc(oBWZOV|4I^ zjXd7np8}>RpCK+C&B7QvOp-iI{U*zn9(R`s+sWlmkWzNwqdpTg8_uxs0tp*^f28ib z!9`=RJY$&>JuNfCAwycBegrh{AK{|#Kw}apWoLGY6b8n?i=iqF`UT6q;Z-eL9R=oG z@3Eq%r7*xVw3TWG2ne)d79s9}%4f$O zIb8t8HA%=DH5d7;EpyX*RTY#u zx&*Fy$=N;!*z}VIh+qQ==`pYxdIx}J=p5q_x0|}mr$U{0?j&(eY6{ZY6pdC(5G3J(BZK!X3;j%79HvlTe`V0&;qKu+ zBVBn>4o3rg3Us~7d#vmBiCSa!su%*cRjF2T9G=WteOG;R7-rXQ}ZXlzpH>W8Ema9o%qY4m%1OTVUnqW?ymDDK-L zFDTM1k*RiOvfVEesGXhwgaaPI-CG*zmO=seh|5X#z3P4$etS1?H+Q!cKIu9~aky73 zrRqN8TH!8KoF-HJEil?7f+l{Nvz%w;5B!0DGpWZxfl+rIpqmfkrc`xn(j+>fNduH6 zDvd7ckn5pJl9MfCp$~Liu*4nS0ZC7ijtL(s_m1LMmDH^8{^P7%A^-bRnfwW>F#B56PWrrR^%tpX z8CNdX17HWzF#}n~N-QuDVYWa_yjUT|@zNX9^^WN6>v++>0K@LuPZ3DcuI=aSN1tQ+ zX?=Ii$1H0<$jEu~1!Hc=iwrrvsFreY7|=EfR{@u0#7ufrm+3MJwZw^i_9?*7OB_4g zbCn#l@M9>_3nn&bsH|X3{lXdR8 z7Tr8m;z_;IGfog%`uqjh6L=p&*0rXn{7#8A^i}dvRTjBD9Z>sS2`nIqCQVof zRVsZ_!38r|*=_nlqK<512p2X4Pss=%nPw~1hfDRkR8@DZ;4C<=Zwj#iUC*zFn7y*otHOxj=tlp)7nplaNJqj;E0tSsemJ@ zU^$C02Nv2l4n2)SyOwd}sc)yIgpq|nf&D_e*7MZg*feFc>9;k3yzw|tCy$FJ-`Z|o zZjK9^l4XZzzY9EV2#K0iu!swMy(IvL!+Vl0C%X{GiPl36Lk<#Rlee2VhKbItvKeD4 z<%t%U2OV%ZkHp7kaT~QgjhBp_q4`2=Xl&4_F;E&`VcZ4bvjx#blF7_#;hVDbN`8PR zf`K_a9B|Xw0)J?$n_H-s>6X2D-EPgRTmNeJ$SW}Mj6sI9;Z&=}zBDv09MORUWB$Y7 zFYVWTKYf~2ptr9>xP9X<0pi--vir}}yea8-KY`L@@;ZFM>(?2YS7*xfl_~YuJh8bt zGj4)AFaEP|jA|DBXyYCt;pPfkVOz3mruJ{Ee~)Dt9!Huy0LP*EnM*kgu;SpmYuME; zw5HN5Dz)_fc0N2I1np{qZ=W3JlJ6fuvCWo;PP=eC4zZ@Vuqqkbs{JOLQy6qkfw9#nDWj$U~+I zcSla;#O3fERjq5jUP&)-0^MVH1hrT^BA`4##qgplotvTf0*==-(o8RtN4TnS;_W9{ zsqyIh%K1Oy^i}9~Nz1tm7l?HY^lB$M;9I5Y51djD>Y#8&)%*mF=j%tL0k?EEXmG-F zd%yU<(7SKDXbYG&M@@LMk~1iid0@|5Haz>wn!e(m|C%@c-5EMx-*5Vf5?+E4cRGNn zkqMU`F$?C{5+522g-oA-meT4jeHNpz6^hZxu-Hlwjl!(YW}gYvsctAYv7hIeE~h3R zYFXwVn6f;nfjv?K`Soe;v=!gQ_k-Z1hvk67kSqQ|@^;1eg;_7XuM>V8@&+AgTth9K zL0%)d#c(Ix1Ct1_`SY1NYg8^$KK(%cZyhqx4$uKIT$#ORaX>9=<9HH6NkN; zhPEA%$TH;R5dKgmZ*J>)^TLg3I(Hj-_o_@depjE7x5I6s@%EPH?dvltk6%2JYlu$( z<)=qz0D~3>hgoBpO^7*-o!EHnECVG3;e})W>3Eeayb!L1OHJuJ6_Np+|Ku90Oj_;S zCz5i&QKUg{GHRdVL}s+*nA+CzX|(kzY6_Xt52W-<6>Cc%x+Zm?Ji6&J z^bT1mVs+zC@Qx-~unxb1KuVl2es5p_liVM{pexcVO!>@8H2%ySPC?@ok_Dwv$xfS` zh`APCGx$hSj};a7_hcu>F~bn&fz3;?=oV*W*J;q<5uHu}8YuO;YZ3__#HayCd`MFr zn?>>R(41E8>{r#>x6~q`ZzF#eZ{iJ9y-MmIe{H~Ksn6>wv=bTfl*iQ9gg#Hg9fePwpxLon~Qe~~`EN8lJq>AeL0X&f^%j+K%+^M=n$GBbCA6@ z7geTOoP8F6%U$WCI0&?*f_Z$HvEFVGWd)IArD2kvC(#NQ`huJW z=UbO%a~6XJmLNg;{r>Gt>i!|XrTgK*;tWjLXKD#-l^0ji&(<$uk50pCPVr>H*x=Jj zLAPG#)Z&q@=B7jmx}|Uy!+^7c!|{g-W4*_Sp5HkKYnc*u#!6#QS^gjE`f(`L>oxvJ z2@a|CO*UOpRL=wZ)51kyd8&J#a_fy5KbeLxC>Y*2Ma7%l3x=%nJ1d3 zDP3kf)8r^5F8SRHky*8yVobb%xvi<(AXqoh0?OcsYL&##URH?+6amOvkyf1xNWx?4=;zK*L%L_J6)A-1(u7Gxw5?zq? zs?EZv@wxt<(*jdxfUR?e($VJ>7sVP*wuhc$`%zpl%D&-e7*%rin?A|bp6;(L%yYw7 zzGASye5Ao$;w$WlYDXZF$;W7=A42k|6l_}8ZSC|$^h5|K zY(66hWr3-!=5UG^O7V?0){J0d*kX6X=Di~46@a#Nq?`3PO*yPN`zR-S+sUor#=>4# zvr6f|k+zbW#>M4l18D;vdCJoswig#yS8K-y0H51_%?~e@H#g-4Z9{0!giv0rw2&oV zl^sg;N~ve*c-b>aRu|IcI%*b!^e(S@^+YQUSN99bWrj7gv;)tD#R%txj~r_}Rz_Sb z!-(iv?T%?Zz{O!aol+F$)HOJbRO^thLQms@W*ZJQrymC?b%9Dj6CFDlMSMaio>-t9 zSp+!O_@qc>Vsy4pwh}Zd6{zS8zh#|sa3;~S_hZ{nw6Sg5wv&x*dt+x~V`DzCxf|QI zZ992$>-XNex9a{kHFeIMu0B&eQ~mAJpPx*+R`diz028Igz`!%DA>B5U#U$HIjNP6C z49~%bD4XL4M~O4(L|;s4lv8PlxV-nt@kUVOb_*%huHgrgMjB zz{`5cP;KpR{Ht+z=62FNTWR&IuzyZ2ZJAETyi(Z3zl#7&=$D$FJaCxdz(MA{6sekh_xSL}CJp?30fAKeW~kF0G74Vtt>3wJeS#6Cv$SWfCX*K z;-=yA&%lqN2`?lNIyFLBR2vtn!d*8mX7oLBOVugQ>=VhQ%ZYP%4xlGMu7s1=(2rv4 zINiL$!fD}$u7c_A4CBxF$zOx1m03Hc8*`FHyBSZyNq58kOI9h$q=5KAm;!7e!1wL1 zmHA-{2lUE%Ie-kq>C-hHUpfnQud&+nB6bc>yKK@dVb(zxW5Ovh=7)^hh;k+;${UE( zaEB}Y%SeMd1^SbgvXt2wg$>X_r0cH#22mD#d`wpt7`MPY!9)9FFWVeNNFAnl5*S(B zM5ji@OuR;QtFc@+=q%Z`;t}@rGm0)sJbG!-)eY<7(Q%rsf^o& z^yV2}+CXNaEzvJ?oCQ0u9mMWfTQS?U<*b2Y*{}fJ>?BGwf}AOSyX6>B(Oz_H5B%vc z1Z$6)acypi*NI%i(i?GsfjUIRSj51UwMwu(&c|UNsA6(9qx2$lJ%}bjlZ)YUMDxN% z!SbxEZs?5#)}J*(px~yvHES_|5(&w6X}D1Opfv~t9?v0W>R4L-TWF$f*RO&)BM z@+(AM`1nXXihc)`b+3d=ERXzMAQs<~3?+;r+Ak77u%-A?Zxl>fd=aqihyhYMWk5~@ z)@Sk|L(d9aL$Finn3MmE8vc}e5Xx%Sj6BnNNES(igRx3|usTXK|Tk}C~DG2e0GF< zhW;lOOspGuStuKBm}jVFAYgiE1SYpA*->|qZct2J4?%t&FrBB6!o!EqF+UF~+}o80 zw_2PWvlA6B1>22{I{j{KN+#AR2|rmw-6fOabitZHQkVqpDc}04NE`oAm1eE4H0lgO zD-@HPN#SCk^Lhe++(TpQYfjj zY znuc0Zp%jithORSCnmff}P)ML!+b=%T1QpzkCIpL^e#tvo#kv{tH&20;B#mXe#T$1y^i)fglSb1#t898}7o zNva5Xg1w=x=nLNFaM5bP3aMfT(F=eZm|d%h@7~3OkM>^l z=2J-+AF*LsR($4~@JWe3XJ!#pgWgvtFG2_XGFOWESbygpBZj0m!l#cQ97>t_?yc>MEzeDITx+K@)hvia@D$3R2r*J;C){nyQ}lbUY&&v%(mJ?W}9 zEW9l4b}m8>!9#+%BGD}A{6LM4r5WBw3^f#n^1 z$fm{KZ!b3_FK9**+oC_x{mJyNllDmS<%B(yoav`PjO0}@iLq}A^3W)+oafW$J)`;( zvu4C;0|#plJ$*M02-&mhR`|JonMZCHoli%QfR_bphwBz+vx6(Ln?hLGTqdJU#2@1}inOF9o#r1Wkhh^Od1izJ5D~V9WHo5UZVa!q@%ITHNLy*n zL0L05=&v3Mm5&m9u?U;{qOyoD890$*mA5bn6RL~!bQzXE zk5OJgvX+-LEHd*TPsoWJ3%O`=aJkBvNB|~B6O>^iXzRK?oR|TFAKfI<;Xj}qm_atF zVhJ&t%QeonGmh{!VVJ=lZS5Vc);>|)#p3&;#KZ5I+v;j&zjK~DrBCOtYD3T)%QvOX zAanvp;YDK!b`$hid>o;3_>9bQrEeW8Ej$`B^Ri->8HX9c?QUQ}XQ4Nx+xp3S3`3QLz2UkMlHmjv^daWg1M*Wc!#oULIGjI1wuG>DuZ z8>f4hh>U)&@20kb!1h@=y-{24 zXCm4!3Kel`64W;ub2=w$o~p@KxwR|aHEbLzF@Wsp)vALlF$XWF&&=!GfE^93t2Wzm zI0I&bb9h&%f;=x{wWk_JmRig$vMDf3J~+on(z^s@WF#TpwPO8BP8Gi}1*d+dp2z}D z^m_&FvrOpd-u_i{7gRxhxz-F^ybbb;u=xb!?Vzr8A-UC zth*IAXRZ6!a{+-AK1kJx#!R66?71OKDEG5UGD2OoRrtV!U5U=)E7xEDyA?kP0Bi3- zKo$n}SKnLTXV){4?UF^GIW}9p5mV|rfCt-&uGzJKw1+MB-25-znKiq{f>$W)zXOyj zWC9iUd0ythOo3d3tr$%c=aw5Ue<}2fEdICsiHV2L*Kucufv&~_^xFP{rlJnMRz_If z^5yXmwOO(}60#(in7Zys+gN5xXeR5;ACrPcu1&Ibdh?lF^-pO7&8~Z`*K{ONapmi! zn!IWBSnXx4{_8D*bR=d3UK#5g{}huqdkS7JLTa(q1MPO7*l}`()Ob@8r4H)# zq4SmftaPcpM~Y2w+mW5NzW_7N?9FOotUD?-7|ekq_=CI|a?>u%GRl7$y_#NdRmQJ> z_yEPRMyN8*ZkfFUc(#a7qYniXq>TUS9j8)-asK(Wk5YMTt6F1&byE!H0! zv+n@f%yy3xBJDm-i{N-=Q!l%}YxBy3@y;#pg(F$Ieb&v#?LbGXdCX!qbp;;VlyC^ z0ZK?N+Oj`t$W&GY*O)}C($IxmXWM`6#-Bh~gB+j@*EYjo&ek9KsIR?kK6V!h!Q3Vd zgiJZNB^xK+vjbkW9m6RBQ`O2=fRss9OikPe zN<=nVjVrzhJbnc02`-7*H1GElAI$bL!A^ZHFrp*iYml$X^|b5=rxecN74mbXHidFn zi8LHo#WE+9%+%&Pz)@QYpVxa^U5AxalP6B%h@|Yr#D-IUmEy}-u*9|f{mZJ%pA)ItkwOg(U z&IvTH?qb>ck=|j81#3M#2P&&HPW$m#x8RgRI0W=ySDmcyHSktt+UKe-U0!YhJs_mL z&P$uK@g*o!>0KyEY}{Y9*8Dv1E}T`bNxUTR7O6sRvy#vyg3(XVw!&`b3{%e|Cs5H1 z@O&^(Fb3EvYeMlN0Qo43YEkL-qevlx&69Q8Z)Z=(u7f?mbsP#y!%rniQLQPi@I*XC z)n^Y_^taJba|V#sZxbzbwN9|hB((p-!dX)PCpKSbz6=`tuYAUQ@ci!f87{pVZ==yn zDQ7+L-!~Efrn{v5gb<9#riOtEuOG^?q^2)XS|&7@(XPm0Btv2=6;vouk2k!6`+iMu z@-q`WAcR`K0Q+C>{!b#IGM{gBO=cBB@hN#1IAj3k1t31>zSpK%h`*}3W;F^POe&Lg z{fqo13s`6iACA%;4FN~7o_Ht>+K5kWmB^_h%652sJ1^-%Au+x;3u9JfYadX{pv+Z4 z`NIm^`A|A6&_d!W?`c~|2LBi*T?;kc znd-7e7Li;2;X7imj>PG|QYI(%qoK`v49d7jjU%A9+&+2Zq5i6mYrrs1ZQ5?NKFiPJ zVkqxciAyuBqL6kmy@Y+YRXDAgm+rd|6=h70a*C4(1Kumm}m6IziMg}Q=h zN4D7F(EMG$0g zRLng7OXbg+$?F+brXPwGD_a+84cu>0*E!a_{@G0muLc-qF;SO5Y_5@@$jU--qos4C zOWCKagk*KkSB+p7afQTfrGZl5>ba$Z1JRI&u7aBIn>iyD+;JlVxl`uW30wY@xXFgg zXCZq*(#JMtV%2j0^q%o3M%XIBH1oNQi-6jlQD1YuSwM{CJy-HOQ5 z+K2f++pq%#a+lMKIeFR!?jsO3N9QL~&lEx`T4_J4X@8mik;%b4{-zLg*Y_o$Zt|vX zn;cwTZi6q}jZJxYzM)W9R@uOSH{QCitxC4hxtbO&6J%}wsRLdkX#>KP62CnA)bquS zukj~F2tQ)FIA^5=N3Fj8RO#>3SM+%g$WM z#{JTq413*F8U70K7FlqUN`VF7j)c-MX zt{61u2$qZ9RnL=No8*t3OYkDe?G|k`ad^FOWH1Gi>k3Da@i|wUf7e3ugnHv<(4=%`#dZQ z=->#ZGcEm$CU%6D5z7-}m;qAnrrTA1F&lU?{!6;7gpyg{K&Bjps1cdz4Oz66Ct>h3 zQX2@HS<#MNn}(Ofgu7r~VP14DiM&9CAwX$yz)G}jaYTN}E8W(nH;f*|TwUG(2d90ChZpTnBpWWtVJ8SUcJje94h-EFgtd;dcP8)Hn3XSWYUtl~y?iK3-Sng{F_T zKnPV7a{axkS8lxrv}}i!ZDw_*-V7j}X`uqZht$C&njIw)35i;3uf$_ih!U$JLW!Mq z9?&;KWHJ+EF$45%lc7l&R)?PZ%Ro$=CWbUdTKke(tun7rW%Wfn-Ad5ttGM}SmkhfR z@^oaT*_9(GHdxz3>YKI;#}oIg2-|lNQgmIOp!Y3n6083@H&d|fKfxsy9(MxM;hsV` zKqR8dx66p;R24>LGTJx=ERkdkiv3G+^lRJg&E?gBR#p)MfeKOjmfq|>Rfdo)R;P35 z{AHekiq&pXDCEg1=*ybg&1si^O7by!C=;P#kua2o98$HjkFrCP5WsHq#zBw4oDNE3 zVW^IxVdf*4Cy!XpBzK4F6U($oLA;DWJATX)pP|27{Jc)Nc% z9Y8xsTeuw1H7xar%wzOO5!82E2)FoytMsfK)j{(_p9p^ipA!co1n(HeehFW+#LWY`+GLV&9`S0Qj0zjEYIacz(5+! z43p2vuClva81>FrXGsj_1ZhTB6HkfhT`0I&2deyqy*H)CSNdv7F)h}%OlfQ*h0(Gn zR{aUDC0$VBs87DBl4LYXBASOy&#Dg6C&3|vPt$rtQ~_Co%fv^LJY0zEWImvKGiF;u z15-I+XU*hT9TU$xL#SmPg&PpZshM-1u@xhlQ4g|y-AO^~@7xYPi&@if2dD9e&>nD`4A&Co82e z2;S9Ak?w7@MDp-G$W9qx;Gljg?5VcHO)I-sB4foWCXbTcj*PBJG+or25Yj=7zT7om1lPwl~l;LE#xdh^$F zbJ^m}hi`P1WNfbJmpM2oYV*&1v#_@(>@C{}blz_EM2j8}F5UK5=#)943ob^sY71dl zpO_~DTs&}?;*i^@mdtTyI#WOrw8_d1A{F?kXFMLK_#G1H>%Y$%u;WTh02b2n8WP;`KE%4@XIT6(`bfo6GM_(duQnC5rLrtq7>=3{HNRrBvm zzXpWnYIws^yD^Ytacdm2-Tr|7OS*Vv{_iWuSPNK7zMTWD6ZkjvMu7@LK=n@Fulp=N`` zlhYW?JJ4n&z-3sRjWR_%h0%vCP}*rXQfQ4bCg0~28LU8W6#cKx6F5q2(Q5zn z7|a)4=!^N?JYr3B+x#%Bcnbi5>W|KI)-e;_P?C41tC{kWP!EmDDIE)~_iBH<%E|VV zIEnc(|JW}O{)TGs$auWN@-OljKy4P^bhD**DJHJCig9z!KjVI1bq8~Sioy>R0>}^q zZP3#*?vKb{NUL(J(-;mu_NMTre>X=2f3siF%U{-OM`AT~U_0guc84Gjn#naP%} z7NnGqU{+%8XgV&Dqnwr4R7vE)puE}9q%cW`zWU z)vsaoe?mB71RO%A=a%<`a^j2?X;Wh=|46?#QmzUef1vGe-?@m@a=Z$(xc=GtuAYOQ zI=dMvmwq6y3T&p!eiLx+$o8P8mbA3!{%gR{GMd!CLn(dRq*C(NQ+x|)$~Gx%AcvKo z^~X2B_&&9~uW|KugS>c$jkYRXq~;k67=YlfP=<6hkrIO z#GJs1IuGmo_j(p5(&rKnje(U6_wlJ5o|>YR>)hUHrnp!(3#{}kf{tYpO{;h2ArOv7 zI;d!eFID((bzcgN0=IMVpM0mD6XXChA@xXEwV|#E&%+q|);CRk@v^GGuCRQX!F#Lh zH(la6v~C=G71MXs%!{{Kl9$5dVOxZgCy6zEfqo#SC33Wa{<&T86_!u?6YviC@a4$w z*YlTnk^C6E-)gKM17qjW%HP-e*H7){nS)O{)ho_E94?kyKF9s|8iVJ~nz%0sYte9f z|B;gViJZyoNj~dRANi`++u5U!xtkvf4({R6_6={B=D!xTk8ZQZrka?u>&Ug^R?SA! zA3SIiS?uK8Q0*apmF4T{(8UrpMmI-EF7}TVkkmgy=AOMHKi-2Sf7S1;yd1G@H?Rde zeSCC7yn-LUh1w-h6eH_*4GOk=Qb`ArEwvND9*F+jzn^0Nydbc73eK&!2=~rRE9E~C z_G|EO(|Q}*eE-e*gnt#se*%{4vw#k+w6tgCcDU{|!))P~JKiF*!|#QNLZzmY{rM6^ zHt8T4bRjq$V@-@&%K{p5FI0ee^{V=H8`WP+cP<4(lUdSYXi>?5b&sd_wJ&dTkJz8a zsUl3Nxpa1ti~}bXVr9(3#eW`rhFWJ_Iq}(7%NyyNoCfvZ-zpCRxkMI!R33mJYg$?SsnqYj-1xyG~^2@mdy zvifYqN zaAPS18_Y5H$^4$Ecr0&rg_cz{XX*)+k^4qC?%t@cV^m2X8w&k5`^Q8?Hf9$?r_INj zs&PVApU;@q8=F(3%sEm-hVuJ91Gp5WNpdQIIzc(Hrk4tn{m0+G)GyVFZjY~y*6?A= zLMqpqPf1YKl*Ql*1poYWhRcr2o^gq7C>yq{Z@2F)&(t#S6F9(zTxy45YnKGsPE1cB z-|`=rL*RC5idf|MQ>=>vDIglS>!v#tC%#M)OQ`A-Y5KgAu#MD4Knf1Omc)WY>VKHmZ-`J#*WvKJ3+XxDS^dzD@f8 z4BQ8S*UBCR3vF znTU`-ds{|#RoE+Cm%kuCaOv8h`TP_OBE^$^+B=GgD`IZnRK;1YQmGZR8^g9B5+rt1 zX4^Q3FgW|!ET8dLf5#$>bmX`fdtc6?0QHJ7u^gU$V=X<~QNP!SL@|3W&JHkc*USsNz;iKuHCm*qZ7=MZBt@p1v<>?epdmCNDWd%kb+3K z46_{u<4S5f-LnCnA$y}T2ZLrul~vV~%;mpmkpwXQU9M~khByIbiOayM+`x!ZC;kS& z#w1YPlFRxN8dDcT`=N)~GFl&Wk%x_Suti_k-TA95;dK5Dqyip=`>R>867PzM()D=8 z=U}>_ULdkU$PVm8GzQqIWZV^#v|36M1>2G>{`>9;qda|}c-V_4K3agL_Iyo5J~to# z4l1Pciq1Ff}Um%DC`zLFDobPYGl)fEfe91WoD$e)P0@6N^a zwyRqD5(16A!ch)=1(TP`6TwXW#6vxUyQ@>YYQ2AP&bZa)F(gbJf%q;8p0EEFe!j%K zRSzjw=M+ALxqyrjRu$dgHg~vUi!|EL6Y2x^m5>jO(IdKXMf7^4!vskUT>VMzZnFM# zF%&<5lS(aVlH+zKZ5ldEhPJ^VILF9bdb$%DH$|D@S34vaeM~c=NVQ4Hv$Y=rC;Jy> z2;-EARrqgzo%`R*SZkO<;kjDoYbaN!f zeT#%D&WrXC?<8e=KaleXLh3J*2}Bu>hbwks#K7c;TVweLN-I5f59;}^`Xysy0A!ec z7-^V0;_*83gv~OPFR(Mqb;2KisLBV?0?kTdV0&?6w?&}T`yt$>oS-PBr~QXHjxkR9 z_t|tvnkJhco|{fJD7Q+9CcL!WbGFy&09}a%9$yKdhmYpYy-x|YH={y1)%|K`&TF^% zuom#@ci1K+9rWdIPjh7O^<-VJPh{+6cF~6P)q&sIzQ5EiCHHaSi?f{3$2rxzM#a>| zYx+yCaSlg}t{q%)re&d?l^_!7?!|jZ&t8VkA_BKT&*xEo4tey1Ly!hXbq2@Yqz9T&U@CQ5(UxAbK^N062)!e5>pZnlXhqU9~S;qENKP* z&&e-aNsaIMNAXVS1vK(lP^qJT3QAOsph^OmT@*r*vQgjj&mTXrbVuUBbAF;wdGLay zCL0|^VZ9{8B|F!cP6J!-dJ}XNymO1TmYjajiqeawRZ+yp2xZKKB^KXTln1Es8z0Dk z#DXj%UP6ckkzo!se3`T0vRTgp#Va}BD8{t{YK{ATgHtlBdtUGMDFzS`_liZJktzg{ zQO}x=Bs?vCh3AQ7z^Pl$TTK^)|;oqiu5V7TDH!6G7keIz7Xk^^ExgG2Ic

D& zKmG7e67!kl#@t`?2092GluuaI?(wqHGc$CxbhOu&-QklBs;yusvX`9XbS$sFoH+FwvSs*$VNBEt-3}x$RNG$?<{E4Ybo(b3OQlfghskNz z9}K5Z3VQ3758HkG0jW@{RIXI$g7RShkH;@~Tu&=BS_r#d@9~%{hig#_2T@|P9H)w? z=gh}5S>q^Cq)p*cpk@GaSXq4sH<14^6;np5c+t|$J9x&lS&Se9UXJl& z`)tC!CGF^PM{9Gle70PoNpUr~Y%X6Z!}+OG>@qySno#@WZs|(!*Vl)pnmp&Xm-VKQ zd#My=>7WO!yH+kA!}m@QP$?RL){Bk$Qv*y2cO;BUYachhU4q|dA!Mv|yd}&v+!gE% z{DqB_ousX_y~Gbfu*tQR**BQz*PQqTVG6mV8#<{f+pRkMaZ3L)vy(`szQ9`Qf3L->DdXY}1dMc^^Csk2NTKs7&QcmZsc@0=Q*+*}0+ubaVYp z?_|MQ3hbnc(VG!jcF*kMaE)V8EC4oZFthXNL(^I^9lZlOJ$lJAO5=PrN|Oa{fGt+^ z86n<5N4dk4So5{kLjS&dhC18h8m3KH)**}vqTFD5^iMTKEbcl&5* zW^QC_D;06l5fzsu|eN0BcF>w|9d0O=b_CFVJ+E}_9y>Lu<@sRBZRB_KQXt_6*y+3*^M zE`8Gx-~2b)<#e>sMPht9=HdY`yV6x{- z64g$bGMR7NOT#uSC|2C5PQzyT^d!Zjg}qSQ?g6h$P4ccGk1(o5QhVy0CTs#8Vc)~9 zOq7?zT_f$!BRru4nCKiVUdJbNGaH|)2T8r+vx5vQZAuho$o6xH5)jXZGCov~fcRfT z&bKQLJ3z=#;>0N62R2Ai419Sb^WkaElLsFHLI;>$2KQ0{9@j2ZT<&_5+_Qnn+unjA znR%4OQ<~yW{LJ??8#ND;4y+f5FkhH;oGaMu*V%`Yil((-`_{i*wzrFu0@>r@;Q!@9 ztG-5C$|o66q0!cO8N3oR-ZuJgm%HhR9u|9gr72nkgf z`o9%BG~SIbmXx=T6}XWG!96o?82ddt~la{g9g5aRjJlk4d!jyanU_J7pF% z77h|AA4MVw=oD5BKVh$ZqKjco|ES*^`7lni8w`M~OOWG;!0pS{gxy|=mLhl`j&hO$ zyh#a7>{8aWnp$JtTk9*E)-=y}7@o8Aa4GKMcm(?Dkj`*yw&d^BbmmXdiwG6W=0S!H zhPH0Do+Bm19r|tQO1}!sqQwXgXJt)nTYP{voU&oA`&wBCy5wXMu+q{aM~Pnu^`Xm% z>~wKZWVqL`FH-T@4e}yAN80yR(3BfT^Ox^K6v1kT9mt8Me)EpvvO~*=Dzl0TbRG>Y z021OhH){SbYUb?JJhVvyjO_=O!9SzJSr7p`)%p3ee#i#M@JWL}?M@`DqCi*ZE@Tjp F{|Bsk2y6fV literal 0 HcmV?d00001 diff --git a/fonts/open-sans-v17-all-charsets-600italic.woff2 b/fonts/open-sans-v17-all-charsets-600italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c99aabe80340fd88a6aeb5729251e76c9a6f35ec GIT binary patch literal 42120 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 E9}-z&tN;K2 literal 0 HcmV?d00001 diff --git a/fonts/open-sans-v17-all-charsets-700.woff2 b/fonts/open-sans-v17-all-charsets-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..421a1ab25fa88105ab776552d7201205f7899841 GIT binary patch literal 44988 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 literal 0 HcmV?d00001 diff --git a/fonts/open-sans-v17-all-charsets-700italic.woff2 b/fonts/open-sans-v17-all-charsets-700italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..12ce3d20d1ce2288206e8b4f31c20f76452efe37 GIT binary patch literal 40800 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%0DER>;wf zVBDdX6yT^@hsa6^7VO1Zc7gVe%1X{FVwSmObJMew6WY@h4rf8xf`leq*QjPR6&qJ7 z{skWl?PmultDuCzXhpTj0rzD8J#ka+E2C)-vq>|_WA3Q-Z}Q!&4|S^$0zZnO+cnBf zWXM9P`E-E2{3oBE#eG?fihl(gLC$!a@T~h7t|2j+FYFEsoE<7xdTgP!ffS){+P8og zdyt^$q!2AI18ymjRDE$qe#1VSW!I z$_)}EJrMEb&$#5zcUO6OeZ3wX88U{F`8(}8rkoK%kEmZ&0xb&H{Z#CR!dsGw4 zqAMhrA|Ae4VOsz2lb@wAW8L6}w*V$T8vrJljmg@}S=PhBr#Pc=b#xv! zxzuoWp7~x9S3n{ zGEoe>_-5D76>kS#slQm{QviWx$;w?@yz2`-3vShJxR_w?OSdW9*^x*AOW|-@GXM>M5A z32Je|<)tM5T%mv^4}n_Hcj5BNaDH!;fmHI4P&fUhfcbg^1fqp@E`kwkQ4nGYCJ-#n zS5em~@qjQHz+fVt@eL6dnLZIAC%TOx_U=_=E==9Y0h%s!_9~{pJj2Nhol275d(+(r=tMf( ztf6Bn4byRlv!s69Z8<;!P+MtKMxg3cMPn@Bk0l}!)Xe+wiFIAI#>#Pn5B>nDutO zPD48MB1Fur%q%SEQZR}JW2UY;(>QOMpRL#=lO@T63@BJY+J?{%eM3xKP?a=$0`uSvb>hsh7(#o^+l2xR3J~be!f8mSvi%D(W82?EdcJ{PJnr)^(b$ zPVZEWp3d0@E47re_TIlwGkMJ;VOHnh$XXA?rX#i{o{=katSN>h;QJP`gbqBkvgLEV zapuO*d4@r91q3{k)v53^tw)S(C`;2!x~aYy-IrO9KCbM%pj0ko>>If?i4r4``|Fh> z9u+XADFw;KO4-lKJV+2mMj!$?6r9{CZauG4b`BeHG>;tYjI@sm%+N~G?|!Rl|D5?; z*~x(qY3Fk`{(tChuK9r63N5#&?V^=sUh)IfwrVO?VFgx>F9^y!&jImv$xcyZ=Z~E% zkl2lqX0Ldx{1Sp3nT9$8rNrMTh&D}F=U!e&E4fu74k}ty!8UW$)SUAj#|V-2hH@u2tV>8W7eMjAV&=i51aWasycj?LPFaG-1|}Gz*w`l4jioj-c!c~y zuCDG-hI@9)?8E~Sza5hjAvJ`;UmVIBo1Wteq6SSFC00;&{>)UP|5~Kw;Q4uM!yciD zcl{-Y7PcQjSu-Ai`P$a7BNQ&MIQ%if0-KSkylW_?UVwr=bSUXO#tQ^3$(x)cHp^x5 z)f?LEN~1VQ3h2LXm#fL_j89*?rvZ*o6T~GB{$4$*c45<5(vb)2%Eu#e!M4f ztNq$8!~9jPJWA39D%WVB1s^u5r6}cP!Zf?0xqY z?jbS4l%HW~PsX4S2p=|HI6;+ioN0+uxVaHW#+Mj5*;sVuZ2TU?UTzGK9bcFlMu_KY z5t++R-x`(JLxvQW%RD7R{XxgJyzMVwyNj|pZ0_G~7)0_YNpm`WIjOV4*?Zxt%!Q_pxv0qF9eFl#1$xru^2;P7FsL;mXN{Fv5Y zk%7ddXegR=?HLEdfnMlGVEFgqk>ou1p@YeYobYFMF$Sy(fwz^#_<^A_uBg}Swy3@GHAkRY z(_zs+SPR-vfy3>@E636Y<|3{`a)28`+1^d<)}4#A)avR`#nyPG{B(aAy>$_f2w6ai zC-E;RlSth`nc*p2qE*i<4)l(7!FymX6e`%$g$n|r=kQm|I;htQmRx{dmC<=CVN#P! z3ckeO?59Z90we{B@n;-$qh6a^i(mORqOBsDtmbAY1$IC4)Sf3MsO}54-6*OXHxlR< zUOBoPo22+Qc80(W&gIo!v%5;?cB4%cdQb~ck0iw{S8UI6qOCXc9G7e;xF8v2HRni5 z41&dd-1CD2Q=h}}mQ{PoWCLc7ER)$-Z>9KO2^r@K=y{I$l|#H@8DfZ@k~|gP@KD3H ze!^SKOj4BXvUiaVRY;{&Wq8%ZEaD&W(yb1qdXME#qJ-}L_DQ@YfZlxWS4WdlStCYd z>p|F7q#73ykkfKPY#^{hmR`*5Gg2O43#StnA;>9(dFJ@$>Lg?QHzH1~qLg_t76_2IN7C-^Cqj_ zX*gBvI}swJ(KcMz8Y-h!1%y9<j^RMiV}?~2=CKU z0;L?qzWQQFmrrR5;X9D4g!J24sdlcDyiyXDa`Gsi4@<(o$USa%Qk z;&H}@)61HsFbNOV1S^;nceTgOjzAkCA|sXU85B}IqdGTGFhywqZ=TB`)mFO!ozF8p z)4RXR*hcEmPFzghXsaa}qKP9nbC0(UEl|FbSi3Qv)0i#jYAN6f7B6GuKG;g|?}O(- zx|`>je9tdQl!;ktElAyo#p)};YF6CTsZ>(ND26u?W!*Yfb3jd9f%`bL9|UBs*4qqh zTKM85wf;%mJSOBc?9+L{HikS^Z&NG^NbgvtD<`0^?9h;ED{33ykp2>P0a#p)7K1L~ z3Nw@|O31TJq`Oakj-v?~NSK{$t4N?MqB5A+_?jY*ga~hsELoIgI zRerhe?feg+R7(rT)Z!>dD4>ZtkZ})j(SHO)WQ+8tJoyAqBtbY#ipPM*Cs1j$5V&Xi#h0~WEe z0x3KEm{P-vTRzjp0?j{w40qK6svV~?(t2pjmK)nBF#l|1V{aV42=DLvFhw%t>%tzn zA}-jlx`+fITjqMQsTDeA5fmK9X(8g`Lu$CTDgXN*H8G?5a^(-%R^*^vOKiMtx7P4r zjL8<3Q)+`XT~;HjV(+JoiK}ROG}Q8iyIOcXd%y=>(cTRiI@^OesGan6kr# zKdMM~nD_*@2$YW@&skf^RQImxunJCG!YuX*=BmdTaYUsSJ&x!7eyS_gLh zhGCJiAwEvkz`E~|DT@jWt|j>$)S0LXpu+F&ju5N?`%TnsPPJju`nfYXQ`1+RpnwfK z`NdyIVbI*hs^f;sGc`XxX912y-6A%u&gReUn{=|BGjzn!^fE58T}L zFSnHxWZPdpPa7dI)Re*Tu4n0BxF4_qXKk^s8H52dPkwt?5ft@wL#6k3C$HA2S;ba8 zSoDI6+^Jas{E9zSv^e+T!N8`R#96-&z_J1Oz`}>pvwd8~gqh8B>B5TwPSa#=$nuu| zF4QGfM?QbJl84X|Mx}&-?|g+1r^gl!C~?h+C5|4dqkAI;a46_N!B0BStiYkB<;@{b zWr)vLR#?WUK-KxK7p$jLQhiTlR;lP(K6^mb;3S~?MR*s=d9!Us2UxCwH0aD+sbwgQ ztfl3rx}jLtwnF8>)(M4!pzVSfc~k>0i_?A11hsZw+Zav-o$|mDu6a0dq%c?cN{6)q z?pc`Hm|EJVix{+J)Ydo2C?u;49YM$m!I%le#KEKw2M1=M?ONi%MaS7~UJ$B{*fdxX z?%CA3pO^9JJJe#-+Xs(k8(^~Md<2X1fM*0UJ2M(bZbT z6BQKAn*}vH1co|kNW!bUiEauP*;s>d{xn=1ky!}B(%TeDMiXoHa+Iy~33=OU@G32j zxY{zwi|#k}%;@zLHRL~ug#m0kOrT)~&R$vD?Y`{fy8Y!WQKCJ*xU4p%g0xAI^3$$0 zkoxjf2tOiJIXcXiXtg03TMXqW@RblcY)vq}fXHTT(o{Wp!Up^xFPmZyTId%pfT@6ey>~4sa?~-gic*t3wZF@(TJCTiQMQ zzpe2%Tphw3lA`v4>G4|wOrTFo0+ud=BUy_b^kr$S!jO{=#3ihOMXn9Hp`kGr6|;NR z0?2F}5hNvZn;X=fdd(JkfA9+*lta=(@cDfqf_WdFSI9kV=K+9*m zW_PVa9dMPsj%F4BTDt^^4F+ePR1yuPx3Boi=|vz}y|wLrUgVuO zL+NCUV~(C0`Q%=SSzGp~$68;jeqy0{n*1vq+~HxT3P8SwM7bIhaN^-8`xoGA>Bx%rd%9Z{@S6Q#b>|4jcQ}1Bj#0 z5;9Iomj(LUMTctU#jIY;CZ=`?hT!JFN-y&2O?Vn8vL}>d`VgyHEbYQo5jWo_Y`C9) z@~<$&x;cbfsM(CkBZ3SE$VJ%dx5wLKsECqpEa3(3f$SsIN2%ow#W~}z&ol*%7>dMO z@Y3W0CNKph+@v0b2$4M~11KqF`z@2h+u5dpZ33SRlJthWwe6=Nw*8~l3R_Xa2%7=! zB-0}gD4sx%YH>hdD}aySl|UEp88L2IAp}QY31}XLCd$(6p}-M1tXBF`a#FcD>I7Ps z&tW1bHHI1rYf^OJM#tT_!T2%wP(~ItV;hT@R~u4n2`m3LASJR-rHLVD4l_{>>n<}b zR{l0e<}DN2Oal^mI(SzcL%@L@*czBnOao#4<=FJEN)|lMvcfV4?TJkCla&`ownw{N zYlKNGywwVt41hmzNC;4*Rc|Fm`KImw9_~Z$rNf6%MOhH?DQ6&v%x$89Nzh#3E6NCO zTxoGD_7ZHU3>|@~Mk>~%OD1h-a*WBdqAwKYrx18*Rf(Q?Aj9ge+7%N1a!SM6N zO=0AB>^9*(u)Q7qx2&FLU`Lf8P#NpSDzP2OlbPDX;0^}mkCicLb0fHvyFGlnr(}Cp zn=1LE*d^Pau4=Sf=^LU_<)kXY!CbWFlmQwf6elPE+m5~IJbnammK(XUaLeK*7(p)6 zZeF9WRC0APuPl`U3o2(9nlrCH9kp_JkXU9A&-MqD>>1KV=n~SnVHoT3DvAuyFgFP& zU~iGlXP3Prs+<)wPc`+1bjdQM2cX*p;CoIFIVAbBygLOdPeC5M`nfUGJXUtQ-`kA|yNc7aO66kV~0hAn@MFx+QwB2uf@qQo_#< z=`_EY9&CI~J#wb*8rW3?^D0)2aq3C7cR=$PBQ>d$Dx`&RJ3BjSSdt^RQe2)Ujk{RB zIT!|uLu6?98Y)-irx~hzuu|CLpZ(x^&4ejUvDH{o&lD{((J`}ziICmOypb!I=0^7^5qQQ(;v~srremrX%JdzU9KOmQeLWeeA_Q52+nxa?YRduu}Bxb*3E3A zkoHAVO-F9h8*x#;-+^L)rPxq-=fB)*PiaHk>3$cz12`F7}hL2`XN(wC@aN3 zG4y)bzg+aA-L}gQ42S#n(5L#c`~nSy&!UR;1yTl|2?h&is@Rr|oOY1eR!yB8be1eB z&uKWfr3oV!Q6r0yBc~A~Z#lMk44?nz*b|ExK8qS&B@CYuhTn1Q{dlor@O)WaXY>1s zpC=#Kp{I&u&+IXgOl{|aE;1PDZqZmfk~I0}=pm~(xlnYtgQrnH?|G(<-Wo5{glb49 zHjdN0w4mWpwn&bIn+D_rE*D4!X@6?tO)3c-QEAcZ@g-ziIPeH5p^MmA(-Y=*pd_)g zqUoYQe;?(&fyK=Aa$1;iA@YQ$CMJZYN1gIa|Lnaz7;>mQzPGf#bSMyfq&%s!q8^@l z1)!p7{)k@Of4DeKs^3}kU@cEu`tR{-54D}huj^X`PM9=G>%v-8rpEQS;s|O!hbR-$ zO7r4!ii+aWauQ;9OOfab2Fg<&W4zZH8&iJ4XDu3A;9s84mSn8a|5XJ8Becy$^iAg% z5cp9vSFtqUWd$9hGVWtUdJ`D1WP{jf^~FTWJIS-t#`(=qE_`D%DOzN6*W0iVR=jYl za3Nf`AQ|^IrtDYAqbH`@VmY?(F7yxP-=66CBQJ0}`y}5P)DQ)x|MN0NL+{Tg))@4u ztxun%yB>+WpDpS6VZCDaW>+sE+L+8=ap=}MAD)oqIi+An)&!48wdDq|uV!SOU|fH& zlNM!;F1kh<^XBYXd=8bgLN6<=ZzD7OAAHl?gQb>W{-M_C2{Q8oMipVId0qX?VJFzU z3Dnjc-&(%U6?NoYxuu;z;RMQkLr+Ta?=%JQd#2mx6Afe`gVR>+U4K52cUx!0-03KW zKn&lZg$l-_IN>jmkoC&;kyX9Bs^2D+uO9&AJ<4#U!O%~&W5UBn+8In?NL@I{sZ zuido+#fhpCr9RsL%3)u+_@s2>r6Yvq2z8v_h;KR)kX^N#tnrEXV&_$G{Ozgk8`{W@ z<%VABot|RRcg2lIr++4a-bsgu#-ucAf-ad@p_OxUkQ|iT?&uh^%TiPX?Pm_S`^Cil zcIhKtZOwNp6>k?kPN+ZnU*Niv&#S#M@`kOMU9qJH&;3m@%SywFYvlY)l~Ae67c%HZ z-wjx)g3*#d*>5~#z+ryY0ycOyo3@sMgcI?#d3YVn!@AluaFWZ zp9Rqg=##0i#~sB^MJY~HAO>4UO>0=$NG{Kzc}K38ELO@J>toXqrNog+8z?t|Z+w0H zdei6-#qr)JCeDx17ho~SgICV4&vbY6D4*whKQi-`ODiw=(HGnLZ2AsoBAS6*Y3zV| zpo+q7cDvK(N(g^C6KxYUBMnu1D{Yz*AfXk6*6B1640Yz}RckA`W3gJqG80tZ9rje= z8!IChZib>a6knMx@9eE+Zkrg5ZXx7s8SlX01~;<~T2kZob>+2?%jU7>r?6-Lf@EAQ zFHg8GK21I*7ZzXkBQUO0(ld2WG5?AB$XmacxNtK?tWco{!Dz*KRU-7y+S2Acg8kS8 zUp8jCXeJN)!1dNd9^I+p_YG^6xVtL{L=Z<{#PcMbWhDAW2vI8+S7Q z`+I-htK_FCYycr%{k|g)HQis@OvWlbi3mGrctmT=tpFbtt4z2B&lF5R+W=nSv*hTS zl388p+r%lh$A}nnpG`TXTw}?WVT_e`h6h(5F~2)2+rm+0O|i6SWPk5 zNZoFam%n!e{Z)~A15y#{Z8jfjZtIBg-}sfQx`YZ^14Hk>9Xu$hmPsPF#Cl2x7rkQn zx>KUe?aVRWqdS~D(&k>lxjDxtj{yNtOPiG$*SDAd_<-U5Rc9%YNr%d_D&wn84TLA2 zBBs~!fyRI;#Mb<%y-Q|EJ3rXEAVfMVfxj!X{rK%j$ho;!koEY@OUz7dczS&%9?08zIWUj+rLPFyMr}kkV|2)WXb~ze69#NOZ z4D}&+W-vOv3XerBPds-SF?2TKrF&6l+G3X{WhN43CCo~0#ZggpjML(%N3`ijrE3~q z={SYCd|1VX$g=F{|eM!M^uL@OqI3YK~%Q z^@Rd6i;PH+m}YA^S)!yn^ZbkGq>Ifr28(Lh{ZoI|yKlz*3!eVoso2_s5dH-zFI6EtAChOv@sp!;ay zZi(N^zsvZR3{mYK;%=UA$6K8~&sZhYEWgK=t~#tfVRDx=8I$th5RB zQtSW%_>slicQXCa+`kP12(eVI9bxtyd3nJ?_=qh*Fd+)?_<+rD^^Lw3|3+sPn@9`xkmd6&N`1rx=Q6dX-qz3g6*hR-g)p8TVl~} zy*?%o+p=Bg!#A)mZ>BAl#*m-7z`$6X8_PG#+}n1zY+LLyVL|2@P(O5kbY2IsryA># z(~^Yj6nCc##o!~^?VDGG7c)SheSgNi10+3@l#MO5_f>kPMWpUuDKRgvV!lp3KsK+a zCf$`!J1jD^**(7W^1r2HBGzGMZ28&$d>(jXPpI>G9&dL_>?#-$5^K9g;dWyI(mk8` zjJ<~;e@=Dy?DcKfhk4^+ZCsLee9FEwwBOyK#Vl5$d^jaY)E&jQsuT3a?kmj`KI+tW zncUAo*7cIm#W3tvLOhcgcv(5>4~oQ&z)#Bj21wa6ZpEv&4u4;J7`#D<0{&j_yu~_; zfD2`im64TXb(`Cci>dAP7JSCdLc8)!(}Mz1d%e47h3_djrBMkgoKFrui6>ic z#lylFmMvb+QO$0N(;D3`!3JhnytmoA>z%+}TDzaPr;z7-CSE-ZwLn2D`emEDZxzKL zDyD^19m52uI^m(HZVCI7MaDJcCpn{9p_LHtWvRu(Vk{iu`+z7!hg6!Gw=tsS?;Z09 zS<`!cd$fJMI!fEi|3*-JkJiy*)Qh(=tC;?Ai8ES7`*N2F-L~%O34Xy7lLbTe=!edx zJRL`dEv_H(z#o=&vZt01>kcp|nA^2mrWnx71R~0WqSE#|krVF)A){!Ey+uc2y4r9O{ z3gR{@)e=R|eROMe@_dCsKiz%NkyQ!jU-;=(t7m$o!z95h0DPbOM}}wn_Ruc|CDsdr zl`JgK$r!1OK)mZ=iWjtgMtps=Lq1CW)F>yA)Y>6*%tNY9WhJlI zi(I2E^fF4V+e-tuqUS~W=`1zJRe@TRm0OVI5QH4>G+U))_6Yf934yr9<9}4{d;$4Y zYWc$seD=UEO4XRsUzSoY!{+D7qU#$giD_wQiJ<^1udVGXO{rByWR(gcYO8y*r%9CJ zl0RE#;PDN54zEbhh4o1KwD8qAWUEl$MEf#NyF>#cef=>GX%9kRCJPX23PUMVmMAG?*iSfyC{HQS| zzK=VWknLt4w#E!%q});}Hnq6Qm7Cn<8{O0*np{-Mjn0aVv+hYU8IdHF<7G@qB-S=~ z+-+$O|2WVugkl#a&iNKiJH*G??}o{atb%1=L82^v=6X}yn7W~+KUtF;ny1!w`!?d` z?h*4}9kYxj{^qMiS7jd84V!lhdmT-pEyrpS;({aa4S^e7($ZsM;W0>27Lh+x?7B0f zIt&(o{b(ufIk5uVI$gjeUS;fZO~4b-vfd-PBhUF1w3MeDgTSbzO2rgtyrq?{K%YS} zI+o7gmc?c$$_g~!0^rtkir)ZiQM_t@d-KOHz)k(y&DG*Z)OhlU1JUER=URTL;Cq(V z>Y7O?tsChZXfdljYj{C0k*l~(=wJ$xi9CMY_i+KfNI$J@%5K9uQ z+`odt4DY5P#>{$K9eQgdKw6))h`s|Exse(<1R60~iA0B?2CG~--7r+eS#9rkG%>lL zqb9O)*t7GzRDOn05?HxSc6?nunGQ{OpUQ6XRT87%SSmkJNu!oh(xg>JA`z0pj>U86!t{!4uL`HdC7G4o z(E%6Y6w8*FE{qtL|C?n~PUT^B+aBlCg0{G|V@eiVe+otnM(S10dItNBXl2$9~|mM|wpD!T}$4iY%E?oQK~N%xBADTy|qaycZ_U1Kwd7OcIIC zW+XHCL?V-I&N59Qk!d_y?%{2Wq>}a%mHj4WVRdaq!Q}(S`9p-|S&(@%hAQq273320 zk6`%qwUiqv_PS+Q-(ci=hDr9ULtU))yGGOzVYvNhX*ECi(RBW>+m@Q<$A&M?1WAnW zYeEguXY_D?GA>(g@-CG}Qq!pw%gx@TJ2AyDTk8*tlQf8u)KbE@*1n7dd@V5eDVX>s zIBT_0s-A7RzheGz66@S=CLA3&TpBC1cy#*)mjk7=ob`7Iogik=s;ZLDhD%struFy$ zj-#K4rB02qa>JX{q$31AUC17R9YaYSI}JK0^k_i#oDM2pg(q=qmPO_(ho8%=<9gvv zi~X%Kr<%n#!9km3qvgst{fz>j8Ng<}TYH{N`~~M4T{xWoRmR0Lkim zq;>TA4^s1M6o~gfJ|7R0?{2Q*zV-o%3_L=xO91i@fu$hCbQ0yWE(HRPY!zE=A4Uy=Y5Xpf@4N9LNgx0*y9nid_%mYUO5 zj*?M1*Iv~||1Vtb?#YZjLT7X^olINCtVX}Xz$#;^eV{}*K_ZHUXF|?5>tga zQwlUkPqNtDwi2b0vFUKdHWz$<^||T~4!ag?O{2(0^HW#%l2V}ZKXmEwd`?D`bFxcE zm!j9{Se0djp);jW-(eB=@YfF4k1=XmPK4htuw36AJ1<^#dA=l7)ft;&7cFr|!3^}Z zSqx}(ZAcCKKmiLPLN|(lKRW!biwy)AKi+CE{-FTadVl67Wp@$(RxEGH!Ez}HXB177Ma(Lweh_wX_|VJj1?OC0u{;2P zXqJs$nps{CFbiU=2YOr{zhIU_**mQb;U8YoiJ{`qEgM|~{4pY_J-K70J1}OBSkNh7 zgPNOhu--QVGuvZeUGxNOiK-6~`JA}r=)g*h5CZkUcNB ze*HWYNucn}(2u<@4>C>M?F=oeFEsP-Vwk7)M3glc%n~$;ck{@ng;djQ55MnBIC~T* zXJOh0Ecyx=27VF1mQ3#luMB{4a=zFa-^bEn7P>!@7|QwZsbs_V;u`ZymdrTU46Iq1 z55D|!)uTxt+JRF5*!A<*(||Lcx@fabHP@!6J*4a!v2FH0CSg`4oR(4(iGIo1D&B)) zNl8jiVj|@H+c$n^<=TPP_+CRrU(?aTQMSv6MY3}(J3^WM+@iEw&t7Dmq$biT+l?Q_ zWfJ6}5z)X4k0#siOssSY)_U~xWml%XeH1fd)h@~kDF&n6hrN+^e{b!+vCFFPuCaY0 z+UpOFE?!PfQRK=q!y`VZht;$vQ5Z~g?Q6XVljbk<%hoWjSZ}WB)*CP70>V_lL^8Pa zv*+GGfJTNw|QdtNv*(rhc+1YrCF%eL&gzCjL0X zw{5nf+?Q8}*m9hSOHn|6TvWt$VktOjf=IDVN{Rm3WchLDO>Nwt9OfxNC0V z{|5{`E?~f+3)kh(mEQ#iY>PR_Yi#WcJ{Rb_KADGALtj7CQ>ockkP2c_E7~J>^Z;Ia zImJf@fLbJN_9K}UR-SR+v)3@GH439ziRvYD$3e1_2kI3A9v z{rB^RNrVUfEKAI>Nzcxz?=R8{iX>=*Jib4XW{+BS%xKSM8i7JhD~PO!7qP-r_(A{0 zRaC^OLP58f296l6m`vBqS6Zrh^NV>!Ys$N%_cNs3C7fA6qK4ZVF= z7xe&)#jXoF8@MKxKcBTtj_SLy6b{ewYdP8IJOHACd`HaMyg^=C!YS`{`MJ8DJzSv} zIdRi&hBo@&)2J`T)FD~i4Yh#b9BwS(iLcX8q4mAYVZ0Q!OFZpjz@r)d2jA{)_E{cn znjg%{iTaivDySek>&;O6o7006+gEG*-THC+cj#}PNpWFIYwNrCwt!}|uV90o08MxD ze=5K?y!8NO)HfCIZj|zB)ThHfC1ct4DbfT4*bw>F2MT9Iy8!0YmqbSIP~e;D4s<{K zUn98`~FIA(_aZJWMYvy;85Nm7R4hs4}-x7I9*Q}XT`2+%= zzUd$+x%KU@y|p*$e`SZcgfmJ}OY}M@NLwK(Dt`wxM9=}nnlA7C%5G6<`1L40RoeID zb(~!>0VmwV-}Jv``WtiGutdNUX5Joz%}!FEWM3cuP7~@i=u-`jOI14(jUp} zqFw``uzM%{`Kfemr68Qm_kurgC5eD`JZKr35r`+Cd4PFN#nmw$3Mo>bEC4S+(7&$a z1aAdqJ|@-lnfQqszY?1e@`?SGjp;MO8FEw*SdKi1+uTL%sa8D~4#5yg?Qv=_~BiTWI_t>b!m#%-yo1Qa@ z`e8xr5*xn&ZW%Gjry0flvg`bUhF!whes0Qs@mc&)30tJo?>AAk*L(SPP3yh7_`nXe zj8JzYP)7~JmWL@yz zs2}{#xqN37%F!J;xv4F;3b{I&N(a$hFt-3d^`impa5As}Q;ggT`D_PipHS&CqTK{8 zy{C3&WTo7|dS~DI;g?B(tfVseO7Lm|uGKl7?^(iqC?RJoJ#^Yy5K-9@=W8zEmlmhx z8@Jqd8hrNS<@rXnp3lClDq&Eb%qSJgg%nacp=iS#t}7j?KkKNXQqe>#(pD=t<9KC+ zT3>dPSY0R>P~-b$f(bz{g?(1#&N)AEN9~1{>|gIByHjfnsa+U~N0V&dw1}vxWW)?a zzupYqI41mPdH3cdTV|IOoKnwJKP2yqk?IZ{OZO)e#ncJ~qP zHg&H!H=wRF8)A7xdB>>mUyQ!%Faz-SLC1qMr0A(Ta@XMWxKX_10g^i`^?xvekdB}6 zD1(*vIh^T4bcH8bif61az9H^M+UwGmW|1zP{caT=!O0CaWT6VLW<~v_(&>0anBwD? z@(DI;Ga$`zwRoZRjc)_!&p0OQ=lB^vtagvlj(!!bQJwCH9LHg?pLG-;>d&U^KJcD`F4F}}&{JRpM7 z#^eawarUd~+$_2S`NuZ`6!sl~yrYrnvU-jq5`tB+122S@U+$hnJPg@Uz^Cr@2m`j! z6tCXRuWGM1@as*H2Rl*l$V9Lc8I|<6s#pC5lyPn!Q!Ns%~{Q>w1;6#US09jHCdM>|i{bKoVt1={5cV zgM|Fs^in53#4bG=?&JbpFAWDvSs|9Sj@d>wr)@j>F8Oiq(3pM%UKcGnOJ z<+I;YgApm1$J!w(zjZo0hX1Zz9Hv&#V+8Mhun2R>pawY++-BP{b)|$%C?4 z0E^Q%0#lT?g*L(~>kyi?6oXG?w;j(o+28y`=+-~D)=p1XF38R{dj^@!pu{zk@Fh0{>Foyj1FZ5C|^~#s_E$K^=lH2re8$b7(EOg0=+{yIa zDm*eJ8(fHJv;JAUzv;Sur(V@pNtFUzWnjnY+?P1=$7+Imb`2|0(^Ub@xPV|Y$0OvE zFzF=RwMovmGNiS&ofJlW9AqwW*!zJbV_Ts<1Sg!)jdC_dnmC*9_fW_1Cb(wLGG+P+ z4_(wodU&84h%qfSf_!Qp;LLdB6o8k3q}xM{&VJnZ>xs*}AJ7icL3uy+snf+ks9oio zm~_h%$4l4B7MM-B?jJD1P`s~aZ@a(31SzMA?&a~=6R;q2T_>9L3HYE&Ygtb6UnKW) zyzjMMdlHAKt|U4pmNzT;+ceJ!IGY_-@Qr*A6%5=U*xjh-3lpQrevu!Pz~1HlEioUG zW{;h(Rp*I#uO#SG=GPKUhVQm13tl(OnG8zXRqK&gS=*X4O<8S-Zpr3Iw38G*ArtAe zyFn^0&vy?CK3EplJ{$--Qt=p9*6Z@H5qVWqahc13tUUPFNVr1TjQ$+uo&FaJBlMSD zZz`BcOpvb-s7Y|YSU%ayUYXgMtjRQ}kR{?t@Pl!B$Pfei22#mlmBe%jOZi_odI><| zK2ZMiK%Fmg2Gk@q_i=k3n_DJ5BgIwaSriK0CGAxb0-2UYj8q%+;d9wOAf4Vzezc)2 zRJCL6KQkSGCxD8@4P{y8YOacc82oGE7no|W0&=xdG#`FGWBTPHy`19A9N$6-jG{HIP4A2^%csUZqQu;n^~-7A=CVolIon+O08ve zS{LTNR7*^!T9bB@p}TS&{x$Ns?z0{)#MM4t!SN9( zT*PwSgeXE};N^d=5TO>mP0>_m!n@Zhjj`?I8=9&Lckxq-Ov^U`%0Deo9y(?}8?riQx3p&>dOY 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

33OR1_N*!%ylDDa|3D1;gP8brBkv%FrMeyX$5% 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�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 literal 0 HcmV?d00001 diff --git a/fonts/open-sans-v17-all-charsets-italic.woff2 b/fonts/open-sans-v17-all-charsets-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..398b68a0853fbf6368758deb1da49d347e3e7d89 GIT binary patch literal 41076 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

  • ~`;p}3;==ZtNy# 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 literal 0 HcmV?d00001 diff --git a/fonts/open-sans-v17-all-charsets-regular.woff2 b/fonts/open-sans-v17-all-charsets-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8383e94c65478622baf43553262e0e31b8725e2b GIT binary patch literal 43236 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⪚aqC6F-jh=?`}zBG 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 + + + + + 前言 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/highlight.css b/highlight.css new file mode 100644 index 000000000..ba57b82b2 --- /dev/null +++ b/highlight.css @@ -0,0 +1,82 @@ +/* + * An increased contrast highlighting scheme loosely based on the + * "Base16 Atelier Dune Light" theme by Bram de Haan + * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) + * Original Base16 color scheme by Chris Kempson + * (https://github.com/chriskempson/base16) + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #575757; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d70025; +} + +/* Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b21e00; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #008200; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #0030f2; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #9d00ec; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f6f7f6; + color: #000; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #22863a; + background-color: #f0fff4; +} + +.hljs-deletion { + color: #b31d28; + background-color: #ffeef0; +} diff --git a/highlight.js b/highlight.js new file mode 100644 index 000000000..18d24345b --- /dev/null +++ b/highlight.js @@ -0,0 +1,54 @@ +/* + Highlight.js 10.1.1 (93fd0d73) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){s+=""}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=``}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"
    ":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); +hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}()); +hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}()); +hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin://,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}()); +hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}()); +hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}()); +hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}()); +hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}()); +hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}()); +hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}()); +hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}()); +hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:""},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}()); +hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}()); +hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}()); +hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}()); +hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); +hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:")",end:">",keywords:{name:"style"},contains:[c],starts:{end:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:")",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}()); +hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}()); +hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}()); +hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}()); +hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}()); +hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}()); +hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}()); +hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}()); +hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}()); +hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}()); +hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}()); +hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}()); +hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}}()); +hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}()); +hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}()); +hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin://},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}()); +hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}()); +hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}()); +hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}()); +hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}()); +hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}()); +hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}()); +hljs.registerLanguage("nim",function(){"use strict";return function(e){return{name:"Nim",aliases:["nim"],keywords:{keyword:"addr and as asm bind block break case cast const continue converter discard distinct div do elif else end enum except export finally for from func generic if import in include interface is isnot iterator let macro method mixin mod nil not notin object of or out proc ptr raise ref return shl shr static template try tuple type using var when while with without xor yield",literal:"shared guarded stdin stdout stderr result true false",built_in:"int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float float32 float64 bool char string cstring pointer expr stmt void auto any range array openarray varargs seq set clong culong cchar cschar cshort cint csize clonglong cfloat cdouble clongdouble cuchar cushort cuint culonglong cstringarray semistatic"},contains:[{className:"meta",begin:/{\./,end:/\.}/,relevance:10},{className:"string",begin:/[a-zA-Z]\w*"/,end:/"/,contains:[{begin:/""/}]},{className:"string",begin:/([a-zA-Z]\w*)?"""/,end:/"""/},e.QUOTE_STRING_MODE,{className:"type",begin:/\b[A-Z]\w+\b/,relevance:0},{className:"number",relevance:0,variants:[{begin:/\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/},{begin:/\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(\d[_\d]*)('?[iIuUfF](8|16|32|64))?/}]},e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("nix",function(){"use strict";return function(e){var n={keyword:"rec with let in inherit assert if else then",literal:"true false or and null",built_in:"import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation"},i={className:"subst",begin:/\$\{/,end:/}/,keywords:n},t={className:"string",contains:[i],variants:[{begin:"''",end:"''"},{begin:'"',end:'"'}]},s=[e.NUMBER_MODE,e.HASH_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t,{begin:/[a-zA-Z0-9-_]+(\s*=)/,returnBegin:!0,relevance:0,contains:[{className:"attr",begin:/\S+/}]}];return i.contains=s,{name:"Nix",aliases:["nixos"],keywords:n,contains:s}}}()); +hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}()); +hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}()); +hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}()); \ No newline at end of file diff --git a/img/ferris/does_not_compile.svg b/img/ferris/does_not_compile.svg new file mode 100644 index 000000000..48b7b4d3a --- /dev/null +++ b/img/ferris/does_not_compile.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/ferris/not_desired_behavior.svg b/img/ferris/not_desired_behavior.svg new file mode 100644 index 000000000..47f402455 --- /dev/null +++ b/img/ferris/not_desired_behavior.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/ferris/panics.svg b/img/ferris/panics.svg new file mode 100644 index 000000000..be55f5e09 --- /dev/null +++ b/img/ferris/panics.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/trpl04-01.svg b/img/trpl04-01.svg new file mode 100644 index 000000000..314f53ba1 --- /dev/null +++ b/img/trpl04-01.svg @@ -0,0 +1,68 @@ + + + + + + +%3 + + + +table0 + +s1 + +name + +value + +ptr + + +len + +5 + +capacity + +5 + + + +table1 + +index + +value + +0 + +h + +1 + +e + +2 + +l + +3 + +l + +4 + +o + + + +table0:c->table1:pointee + + + + + diff --git a/img/trpl04-02.svg b/img/trpl04-02.svg new file mode 100644 index 000000000..70d490f0b --- /dev/null +++ b/img/trpl04-02.svg @@ -0,0 +1,95 @@ + + + + + + +%3 + + + +table0 + +s1 + +name + +value + +ptr + + +len + +5 + +capacity + +5 + + + +table1 + +index + +value + +0 + +h + +1 + +e + +2 + +l + +3 + +l + +4 + +o + + + +table0:c->table1:pointee + + + + + +table3 + +s2 + +name + +value + +ptr + + +len + +5 + +capacity + +5 + + + +table3:c->table1:pointee + + + + + diff --git a/img/trpl04-03.svg b/img/trpl04-03.svg new file mode 100644 index 000000000..7c153e23a --- /dev/null +++ b/img/trpl04-03.svg @@ -0,0 +1,123 @@ + + + + + + +%3 + + + +table0 + +s2 + +name + +value + +ptr + + +len + +5 + +capacity + +5 + + + +table1 + +index + +value + +0 + +h + +1 + +e + +2 + +l + +3 + +l + +4 + +o + + + +table0:c->table1:pointee + + + + + +table3 + +s1 + +name + +value + +ptr + + +len + +5 + +capacity + +5 + + + +table4 + +index + +value + +0 + +h + +1 + +e + +2 + +l + +3 + +l + +4 + +o + + + +table3:c->table4:pointee + + + + + diff --git a/img/trpl04-04.svg b/img/trpl04-04.svg new file mode 100644 index 000000000..a0513abd9 --- /dev/null +++ b/img/trpl04-04.svg @@ -0,0 +1,96 @@ + + + + + + +%3 + + + +table0 + + +s1 + +name + +value + +ptr + + +len + +5 + +capacity + +5 + + + +table1 + +index + +value + +0 + +h + +1 + +e + +2 + +l + +3 + +l + +4 + +o + + + +table0:c->table1:pointee + + + + + +table3 + +s2 + +name + +value + +ptr + + +len + +5 + +capacity + +5 + + + +table3:c->table1:pointee + + + + + diff --git a/img/trpl04-05.svg b/img/trpl04-05.svg new file mode 100644 index 000000000..f3c6e8a82 --- /dev/null +++ b/img/trpl04-05.svg @@ -0,0 +1,95 @@ + + + + + + + + +cluster_heap + + + +s + +s + +name + +value + +ptr + + +len + +4 + +capacity + +4 + + + +ahoy + +index + +value + +0 + +a + +1 + +h + +2 + +o + +3 + +y + + + +s:c->ahoy:pointee + + + + + +hello + + +index + +value + +0 + +h + +1 + +e + +2 + +l + +3 + +l + +4 + +o + + + diff --git a/img/trpl04-06.svg b/img/trpl04-06.svg new file mode 100644 index 000000000..b4bf2ebee --- /dev/null +++ b/img/trpl04-06.svg @@ -0,0 +1,87 @@ + + + + + + +%3 + + + +table0 + +s + +name + +value + +ptr + + + + +table1 + +s1 + +name + +value + +ptr + + +len + +5 + +capacity + +5 + + + +table0:c->table1:borrowee + + + + + +table2 + +index + +value + +0 + +h + +1 + +e + +2 + +l + +3 + +l + +4 + +o + + + +table1:c->table2:pointee + + + + + diff --git a/img/trpl04-07.svg b/img/trpl04-07.svg new file mode 100644 index 000000000..e64415fe4 --- /dev/null +++ b/img/trpl04-07.svg @@ -0,0 +1,115 @@ + + + + + + +%3 + + + +table0 + +world + +name + +value + +ptr + + +len + +5 + + + +table4 + +index + +value + +0 + +h + +1 + +e + +2 + +l + +3 + +l + +4 + +o + +5 + + + +6 + +w + +7 + +o + +8 + +r + +9 + +l + +10 + +d + + + +table0:c->table4:pointee2 + + + + + +table3 + +s + +name + +value + +ptr + + +len + +11 + +capacity + +11 + + + +table3:c->table4:pointee + + + + + diff --git a/img/trpl14-01.png b/img/trpl14-01.png new file mode 100644 index 0000000000000000000000000000000000000000..d7deaaf95222c9ee3cb21d5b10efb8947739650e GIT binary patch literal 123988 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 v*{pC%YYYgw)w&h&F- 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 literal 0 HcmV?d00001 diff --git a/img/trpl14-02.png b/img/trpl14-02.png new file mode 100644 index 0000000000000000000000000000000000000000..121801b7632647fda2894e4323fa39e09987d722 GIT binary patch literal 81694 zcmeFYbyr-=@;{6P2@u>J5(qjF90qp_5`w$C%is_^IKiDj5(w@ZoWUJ}+YA-j^`(klChJ_%+3oPX!nR`O3szDo*fNrXypkkiXiijlE+J(FayLMw1=HMU~ zC+m1LTw4ilRI6-#+43OxXe^^jn{tjQ4xt^#9lY_ur9nXeY${nkLBI_tSo8G?(Tx5g z;XoUTA<6a@!p6&?4#DEB)LeWHcBfrKM#uz1hiVZfog#d-=)^G3Y}Vf`yrsugLYSnJ zq8ucFq2S6%0vQ3$Y4}pY8;P(ds^8ZIxMc-=+RO3ED`j46snr-{jbxt(H9~`wj4I6p zBB&^NlGt7u>2e<~SLEobD=LRJt0vD_{+QAPo*9~pDwo#r`| zYx-TYv}Ybjme1KNM~J2!T^jir`V+Q-UAQ#7fUqNasjj*M zBJ1u)@=h}*6+qI>ulMLz@|cb2Z@*F#XP~s2gt@4Ukr{uFU6#;N1)|^t-z8F5Lm0cB z(BLrCz-URA3G4*3MpNg4#_pTQJN8<^@eoA`=AxI~gppMu4Y~Cqayls@_q9^{2Hdj0 zhRHH-ghY2^USn>E?At3jFnb{gN9Oi%n8;N#cJ;)YkLgf&X-3OwO*wyk%R|X-l&bn{ z3-6JET9x3&Vh6>teXi`y>8x~=TF3M z#6AY9d^7v{K!dx}-|2C~gmB6pI$YlA0klVWCWaae+X3WWDqVxhkv445jOkc44_vmx z5lY0-MAgAvlsd?0Itjw3NDs86VIk49#LwSpaw2=_qRiJ}jiR1+nW;S;?q;c`)(l}c zp;&klh;%DKAb|AxUEK!$9>RRLVY9Dq7xyI2TCfC)ggiQxDJ?kaiCK&Q!*LW2epDFU zlsqu`eKCV>6pA|Sd7^Won+3K;xP#1oVt!KZpu!f?bo7cWHT}0ir7h(5g*>weyi!M# zt|d6bvPF~99zt2+J4O9A7_CSZ()Lp#HVnS_-@=UK+9s{{5KuYUW21G=I5Kd+-DWjB zYy=-nF{@vdBbD`&R})_g8~3+Xiyn%+?jsYx^bTPaz*p_L0f}}X7{_aGww=n}@dOeD zMO{JjF+AQecV}+MZQy^#twpcH_!RcE=UES357{-(CGHw-v^3*X-X3;7SksKpmBUrg zmB1AML#g?&ph8KTBoBUWt%1Ot*2h4UsHi}p;3q$zpe-*_>}|nb`(!bf^7U&5r9q`Z zqOH{}^DWjbrY(v09Q|n!x#&;mFWq0VGA}c;r;Maf57WL)uv5h@VAQB9jVVo?McpUc z7ujcJXJ=<+H?A1cGpmr%OVzurAGa5o^;MnuA~+>bZ_D$<@rfhT5y}zY5mD~zrXsYN znY||$L>EH8n13Pv5_XLEspDALDDGG2)!%L3s&O1E*DUvGF0xR%=PwWD zR|Eb%^Eh=kWm$BU&|&^QODGeZJ^`w`6QqrMj9Mar>!X`zWojUT>BG>9tKTA(mkAau&I^U>jv#$iXDeXXCJv&BRM zps}i{b64CO-EGjj#It!v-s8e`)OBTRVKYp~M<_byYc7Xy(YVpL*{;fXt~t87|A0Jr zHooPDq`PSwVe4!gkaC2QLd0um;d9Nzz+$WtMU(GJi)+52h@rb-Q`?&7jCb~4V_!x8 z(WkZ#!t39b?z7NV8CJ{-{spkSS(cdu8^4$1;l03Z^IfwsBLUNZN@d=iz#4m? z(OnCQY|m)eDuy$@6uvg&nu?pe#`6ZogXgMBl}drx_*u1#pX`U5na{r%DDo;0ec}6( zG@U%-RgA5So!uH}H^DPu`)S5Wxhda>=e`H)16d1q{P=97gp z_5{_XckQ!_ntvHchg3($@Y>1i>=0STS0?#mqu^`zv@stIN~1fdfj>u((*bbACuUb9 zXCklD6S0=oT;f3TAp8ZUAF&MEQbR_ofHka2$soO4_v}}8inE^Ls3LKyM-T#eB3)2FaMvSV$;Ya(*;YZvjk zZJ`MWEMGRQE%G1ulAD}s*aq>=tvs(RTXt;qvlP**Dmhu@c2pfuEfnMBZ{~4W9a+)u zz&U(#czeHlk?(w%u(a;mwJY8$u^h@9Ng6p!o&*+*yI1-6xpHTAXS|mHr>XI}iSn1_ zAwW1mhq_eM4&<@TwO^BLE;SI7fRmG$wzm+nIgV>X0spC8vzZrFN^y>Pj*)?vcb95y+I~>WlaVp14l4Fs0-*#$j8?ZZ zyS=%(`Q~{J!-SSKABG>`itHIDuT}gNUti&?pE1JW-l!)Wt#ZxUUdC5}{m3(D4UcYj z^J^Scl|?vGG>syPAdjZ(_4`Bq8)q6nMd}$EZD0*Z<7)Q)N7CBqTKxK#hqZI%Uk=q( z7dYRWrZ7QE8<9vUZLAm(0NzOAs^NZ-&k#!9%#6I;iC3ImlYL@5(uuh15@>?> zMok$WU!dA*>Uij=C<~c8J93y>IGb5=fE-=mAqN5i5F`YDb+q&_r3E=UIJpafMCkvh zAq0Q_T@0Y7{iBM9y$HRIiW;qyvzsL?F9#0?C%x!XT3TA5n}wB-hP3QI$>IM*=xsba zT!a7sZ*Ol7Z*C4}H){Zwpr9at^A+ILD|UDdc6T2q4^t4klRLvd8u?c{(w6S#ZniES zw$4tpzuPr6bN2KQp{M`d(Z7HH7^fx3_CGy2x&L!o@CgEbe*tiDa031>G7np;|3UWq z%Rk8enAbnL1O9GINX-^x>7XlZ>uBlZ4j-B*7pDLx@Q;4}_US(({S&FqpGXB?{TJz< zKK+UG_gI8f-E1x4Z2HX%Q7$0hZ)N|i4+Q+?)So!_53&4F3YUxMQy}2qG8TQxVm|*1 z0YMx=L0Uo+gm{>X)~?xq(}^b0kEB5;-TIA=m`xhDI=#e%go4~WVf%}0ocffFGMhS2 z&3#49$EgKO;;wgw>W8Uja)i~vPgfp&!0jW4i**54Yu~N{*C(vKC-S(hhuwElZt}dX z^hUFI%f^SK#ZjaSA~5P5mm4G8zm!J@qeuPa5%W-v-S3$oV5{~89p+A~B9(Dvj^$N#QjiG+Xp6-#F-<}b7S_uv1YA^&E@ zKVJSnF{J*h+ueI3ls{DR9g5X>&X11A2S5Ixhr6fXuO+{W|NIn~qSretPB+-jfZ6Lt zUtxa;kxl-J(k|;(kfMTzi-;%Qp3Q5YCjK{d{y-P(j^voz+A1_(Y1qd2rc#ka8p-HW zG>hnOsuKK=laAZ*ft40_>-kpC1C~!8ZDju3?eFyxh%uTgJg<^3YKUa??2sH8fJW(v zkBEmGqDNnC(v39#Q3f;GyTL;(h2(dW|9L`cF*XW<(el`Y;VQPcXcO~WO=l?)S7+^x z6JJXGMd65O3mRWLMd6>iolj}~sg*ysh=^yS23JOM!cKgW|1SSiuPgA?xxG_V@t5}h z^LMfUg$L6y6rv4*mtCrud@t9HCyT%4Ddv)A&9_X`{Y+O^SpQcph@+4r!lx0pLCYKi zCrhO}z1hugOJmpfohowVud38hn$^VW=1@)Am>EB7Xi{jdh%CvI++c z8v`^}msd7RKY55gnj<(90BRfpSFg<+c)ZxX;#^1qcp9K|kIoL$hm z>#Haw4-cwQ#k}ISDqKSJC_AH>Z$8lLE;l+-v9m4zi}NQLgG@pug;TgcXU zzWzy_b{Qz`c4}{P;M3ui+t|$y@`_<^)EV23!Ms-$yVrET(TMmj75uFW#2B+*-BHWG z{wSbBtRl8AI(z;<>{p^hfmSZ}pbak-&+`pS%_kNAkO|9$)7HTQE{z%i#Tm2(G%Sa820%&^QfOMH^z2~qi%{}IN@KYLiCu#DI6E7P1iP&zF>;pHSrm+?{vOpw^H=^L!rTn8@~>!ywRvZ zCbBg_q7s@VzWn=kp*DenyYG8-e6&XuzPs9bP??>E{BU)&JRe8S%i<_s zTrZA&Er(=;+@n1W7qm(!0%R4Nej!aI>(GXZ@RsEg#byESA;x5kdYbTzP1b zT#=%@+mlQYW(^|jy*OYT^Bqf!f0rL6A|)H{$sR_yiQIA=pDtZb?k8!Tc9_ixY$OOm zZq3+9U23Y=zrb$FMRWsZYeJ?|EGc?StqF~pnmoFECTP06}^inYc zl2UsE5*Ydhzf;)bVco>tem}APsOQ0VcIxN5L6w>L{%6tIB7TjxaD#T=(6k`n##j)i z5+VNLq(%kx{cpZbzC`~mlI;+=woq$e``%K6eY%cU;}q|A-#2*A)Z>TH>W-vx`o;nt zpb28HW7AW^(-`bgboo-YLI#j4m4Dl?_jKaO<;&Fc~>>J|6O|qsaIEaz0?S(5UZ;iIFn! z{$j>yJV&t90xtt^Z_WQ)rDMcbL5F#%eK#%$g{Pmv#m~nPK&NuQ!YY6< zel}ju<^tu+Fo?w`!SSM669K+kTFD_uJVT6gJ+8%Y1x<5(He6Xq57=W=x>{_mIa)AJ zxV*)0?D%%7h=2N0`i@S}i1YrBJ&qyxO7aaC$3lC>kahcB$=r{D^X=6}=q7Ah3Giu+ zWApx9li`=wxhu&^96tiDH_-scQ#SW-JF)^df;)|CzV;`n)~4$bYbDN@qX9o6*(W}UgI8a<(~ZX9jhjwqT&0Q z(HoT?mZ7PtouBYHt6*=nbYB#`raPotYp|Oerd#9qb}=oQ#9`P9s+l+@IB7qBofX`4 z4T?p7HlTIPM7Lll@N?jMr3ViWCMnS;`-zGS@kwBnoe#c%wJ8(?JHtAbk2C&bocK!?sST~bIF-@u4$5uXi(-#@nM%6O>1_6N zvIK+n!YqpVr|jI*K9IMShjxN@f@L-aHQxjMDwh=0vCK#3#T<;YJS`gs5tzt@0+~D@ zpBPUN{Wa)ZlwBU}9Vl}VKDg56?fgiR00hd9Ej0dIviE~M1MHZMLQF@gqP_bQ?ek1M z6CCpf3_lSg;$5dA7`fLEB)1MiEV@UQLvchGsC>4P0&hAW@2kA^Hqsq$kK3w*_e+ZW zEy8f(tdY*wl+MO6d$r7Ut4_X3ymf^KT|Bx-D_BN;M-4gKbxp4Xk>{>u50d5iY>Rj7 zIU%3SZk4n7#x`rxM@XYqfu|62r5c*!0}nE(0tv$6O(m&JSl)XgU0en-1RAMP=FdtL zq2mnl5ct8*RtUfQmf)HTQy|!`XmdiqF6sj)A&Jj$9i)`*?9U686d=DwM<^bPypT^< zZHFcB;~GkH4L9w5jPb4F?PGzMU;)~LIKi*YL|l8)(NZnb4Zq`nv!4go;8zhTt@DI#TqmM?WM_YNxZ{&7oO|wv=+UOzAn%&=z+Y|my$a36jmaJKgf9%6hk6SFP zq$in?y4vNZJv}e=7prO}fWjr_+AJbeg;YRCq*mbl4f{`!&WaaDA`J>1__(Oj6-#BK zzWOI7&Hjslr1NAKN~JJW(ana!3}1PXr!8t?Luf`0H(>!f8Z<)$wi=OmY{```wBpTz zO6y2H8DmMPDc`Uy-(YFCr<*DZ9%c0hqEBrJi;CtYaBhxNGFSJ!Z1a)*@EY_$q(9#b z)^Kj=aAO-{oktnx{a(=wd5g z;Hsfo-max(H0q(!D&Ve4coR(J~h?^5Ja9#!TnyC10H+Z3no|b%nzei*0T7p>)zFoIS3zd8%N| zEQWnL9t|4+8G50|%@yWTjmJcfWT<5;&PaB%4qxKa(+W?u2Zg{?+(m1XM0}-%%B1np z7=T8cPD*QOA`~L><(pWjT{(Ms4Wn40IF_@H3)_cSj=gq5beZa6m&VEzXm)iyG&vvS|MqcJ7Uz(sQ-=YNp;C;lhV#^wd@BNTx0(&_7K>99HB|+5gY<9D2 zJ}Hllnqs}BU%(m;ZCRX<>5;HHM_bALfSI}W{%xktpz0ptQ4(@_S z_ZBGs4p`|C$tj!V&l@9fob59*-mMqM2y#=!$!AoQ5Ras>s&1CQFCQiA21x zs#~yX$h+|iQzO`{@(N9}fX_uQCZ(8RF|D!u$rxKvBOY&dn>9L`gOgGsHR91=F88%U z{XV^15?EUT>e`ump^x{!E|s=J-N&tzw@IsU4DiHDB0(B8fH>cb0d{?nEz&qLZt#Fq zX6D;8P-$e2cNE>B(&`4H5YIjZ66rt^kDwTC%Mfw|t>lel6;Eej7+^nqu5A*UYVKfY z@!{ika}NPS!lvsBY80=^7n{F|K@L<9oNXRep2`<|=WHW7EuPqw%7c=*;0=4%TOyy1 zW^J>r7!o3bFL)pohrYICo(-^ImsdR3K#tH@L+*KR`O1NFVy2mGRVY(^(fpBvb~mEst$BLiIBA8PXM zi|Wg#bd*y%vKB8Ac#feTi6Ki9I5H((o6R7^v=7Ep^jd8m zkE=w^V@7&#*t(w@2O>qw6M_&DUw@S0Vnjy|Q3-7x=6XjWo5wj$6CW^`;1cE1r}7ZZ z?Xf$UIfOf+WU$pO&R5-GRea%d zpn1;umKe`4K0viu#5R-boU@Xb=cPc9VAUv#`n+YA}S89}Jx0Lnyoec?zpzZ3lvSE;mAH_X!xD7$0-fNq5 zL+-lF!W4dI^ak(brS;2=RC*v;nORVa?zBLcO+gmO8aA0>1r){Vj*>M^o(krl5bi^4 zw~?%2vCVg(LL$Vbij`G-xmFYJKc&-elSAM0oXjw8(3u&_7Nxg~T%K4gjvmr)!;@8D zzI;St8YX1-j>3%0pKF+K7g3+!iOro}XbPAY>?%=$87Ht2++|`Jh6cfk7#w_@#62}J z`zYO9F>5KUXeIhAoEg%?fHH+_dKNEye2VlrwQRQj=_(F@`&_cPybvTuNl8*k#)wN- z(69UA)7wKB?Xx~7te=HlJwjoqKrR(p83)dy@kFt{YLJLD57_=0cNP0G;4W@n3WbnB zo79+*@MIwYq^sJoku*C;5i-;#tb|FoP)X8qX1-Yl8}a;b@a#u#Os#(2*QC6D-O^UD zPoFZB(w$(FEzZ9aBmzDlo@Zed8;Cqmw=v+BC&2vH!RmRh!lGKbE17ZPl4<|(o5#mk z_%H4K~$T%`AP@MPaPk@JP-wDSbO#zz0oB~#?>?o zRx^6~8IxkPQIzl!SH5KzkDr>c__7Nb2ecU%!Ggngnvg#AeG?Y0cD`4X@JshSo?le{ zk%D17JI<#EHy|#7&r2xfPKFw4p8)}3OVhc;ByacE*^9FylBeO{K?x_lT*aa@+gPwj zS?7*cy+harFc=ZcRUP381W>-|aV@W)ID%(e$Z&QhSi{^GveIp33mz*5wQ*oS6<@`V z<@p`|m{G(}9<*O6(atGDC%p6-tMykKXg;PLcQG(cKO(of)!c8=@MNFAPP#dJ5BlIy zj*Hy#-95Yw4Rdud3#bB_Qvp%X^Ey5(~EC5)rUG>6YAw?fJU`b#%fmw`!J zG%Dd12}Y2I>c0SzvWW6~N%#S6-;}TDZVMal2_nD=q}R_*c$&N>5AI!dl~e9U9s%Fi zDc}wwo8i-A=U12WXtg}JI&Y`r$eQOyh^`53acvQ)cFsO-A^-HZQJYD89?%-CH?P-j zMHa*2;F6YQ)OfF~8S*As-t;#7$`jb+7H*kumVmZf9PI^EUEmJ?MDzHG`do76tUG8w zlS;02L=Ot=aJ~!D5aBst$SbPFnC<&e;pF1q+e)ljSNPByg%d%d9}w+btXbs$7XVmB=c;zmU8@~)(v_|im-H5p(u_Itgs zAH0X__) z`yYKx+UG%aB&VcRh~cS`8d&|QWOX*xr?@dBh)@&P8R3KSI?A|$fS-#@_R!j7w3zI> z%}AQ#qT*ZC>jL8;4?=BEbQj5Gn0fWB19tL$aivZST~~O{c}_$?q1GViZ8-R?{iY-$ zfH3fEn*fGY#riX$Eqix4{pdTcW!JeIR`)X)dV(l8x|f?t8<{yT4TJiI{8J-U60$l2 zA@ML#cGi@!KHL&LA-`fbP%Ac*gy5!NgdGQfZqlBzv5k)-7?tk-l7BbR=U&~b zePvHlF@P3pb8(`5W6x+nv_(3{|0cXGx+7&#`iqO$S;Ag;!2qcWy3W=UiLWc>gr5nF z`I2IUk`I<>sI8ZosI{*<7oh6$Ii`1Py=c&uNZpj9b_=Qja>O(!n$-ERx&BJ>KAk55 z>t*w<8JTLQ=;KTrQLjCb=%uY!>`19SWkNN_ck2hJ?OVvNY)xt?p(As6VdKMN&d&v|0p>T)Lk)ZFGg$Hvd4a zf#)OIxF>)!3HiO%g5aw6Y8xN5~-sJ*RQu$(5O*8;uOzP z(9g}6@!}<6@tm;7&A@QBUHg(GF}5H5uNQRc>)9xMEPu}X6W2m?=--`fhD6ol$&pQ9 z6sDjuLr0I`Y5!8+9+A{Y8d3CM^zJZAESBYb1>QY~!B=%LK``m6sJoAz2K8EH78?0w zsGm>6Xdf#I>sjW}9maug;YTg50ft!j4=Q}H0S4pDA=ZHu1(TA!vf&BcN(qmTTojlwfTWD z^~|rV#E^0gu5_W4``%iEfTh+Ux~8pZ~NS_D&bZ_qg9UyzRdhFCL5t- zDW*xX(nyBW+%yLma{M}!&JJdnd7kcq^tfrD=uWz&&={We-u)Fr@6}Y_8ULe(d8;UI za75FUb$)=CUDuA^$+vmFAKGyHi-B7mVPd^4Ux3$cI=A;LR}ds_2zX6b|9vZ$Fb#DXf(q6m-vsgpEr01V0+jK*{*o@k&4EHc{Y3{oB@(y9Ao zde9ru9(QE3++%#;HPotRg5JCE%Cm9-YI+!rtlE0b)%57V;8Zqq$FCl;DCKkdB8X0E zU!%qf^2CzsWC%oA-sHa0Dl*VJyA;%##6Ta3d^4|2&8j}%1JyIW8BdGPok{I@Nb}{e z7-2f75Um>xV9XAm4|bu!H2wkK(I_4(P?kYCEf4d%_q5ug^}qcKAAA#k_dI4&#^_CR zm+u8sc;xdkOCAhGPW9+McZ~4tuAhJh9u5o-0OJqi)yDxkrD+=nG+2+9CxaZeUXj~i zSquh;gUC-!B+@BcRW=HHq&S_MY-3MxW37>#KbPWK@i^^`_andJ_x)LzG=$~J^R9fE z6zAfk^D*#i2>8LHdrKk>%_ci!60)r#2)$LKBh$=^Aj(6(V-$J05C}6Sx6ynZi{|w( zv-bj!@&Wj&ml)?O>A?b6A4I){Cp4sgvi9xXt7DK~8KgAS>zF*XXLf2$y%#OKBF60B z;mHFetBN+q!XaE# z>qz7@k7K_AfdDqHiXZ{PJRn|V+s;=ab)Y?dpFeZ;Q(XT`Octw zWCBK%%t1Mi!gtK3$t8Alzg>UwIwsW~k|-d82WL;|@)2(?m%n2VOLb!C9;NP&-2Zo zUw1B>Qs8#s!H01-oM_^x3ZC_bxbt5o=ziuJ|5og$2KS>SC%WxwRUn$<_rVAFG_m&P z)0bTS(c%;=9MX}ln$Q(hmb&lo)6v;yh)Z^{rjg$X-n)5Zi$G(!@v8=4E9VXlAKr#7 zM>Q2Ly=%!Q?ls`6v9w3gU_-6r=(Abj7Nxf8A(f;|4Mvkh1p?uD`W1K*dasvuFYY=& zc%T;spK6Z4&nF>Gt6utI#5C|Y65rZ}#0XUQsKoI8sdtemJ<`EXAZQ^$r7G>JXlOq6~=37N3Eu#ikF4#~9zQ3YH~ ziDtnMi`v-`6FxX>4JH|B#_q;EV#yD2)u4sgQFg-5;zi$Djr78gR`y6XDc<9!0{@|W zUE#UzG3FLM${Na1-kZuY3Z_{-Levp>J|z=8fddINCr>C*$jC2%SPX|7?2#oV=1=Gz zmPew@1Zk-!y9V?TrxIl`KGFdYKx%TD+@>Mv7_i7okZ;be0sI8++LVUGQbK-cKKP4- ztWh)Z`MYAPVz6SGHB94)a9a=&!Q8RkSV0@*i-Z?*}^ZQNE~tq z{B34?v(M2?vv09h)qT2UmRvTLoXwbX#-O~~zMm-J8H4(wahGSVG&?z*Q)rvPi(E(T zwYP6xp3zNecnciQ66Fz<$g!DMe-RA_-bI7~;xTtQZX{54Nn!ccG>{B94kL(burfz` z_7gl)&K6nMIVgmSQr&g6N0CE(=Srx%@y;wzDdN$CQY_-PF{SPjchaA}|3b#^)`|js;?;*INB9DAqbzGYI@r@IXpWL>P5uK!L+?Q8Iji15 zUzht{895uxw@& zCN8J3)G-o1NyZ*9Qh(1$V5Fuag>O%mDNnkQVNVc4Roh1m67blDygy+hhT98o56Jhn zM_sG7BmMBxh2&v;f8p+<4bx^U5%-EY!aOX-pJWh!@38Ve6U(vM{!-*tG0`ASf>l}XkE_e z9&){whUAo}J|U_~5q2NLGdhDCD!Ct@g}>9S1g5$H2bl&?LW0lXm@%EZ1$U#2f#+uB z(Lcb1rg`Qzw{C{gqzvQBPHkgiE6G}-Qdn}uyVOw`BTRwu?gn)}N4qg%9U{O7n4`*e z5bwU8R88qW>@W>lWq*`Z)Dq~k+ffmge^2W`%ZO6UbJlI&{F7fFQeN{eS}9fGUxiAF zU_pJ*uZj*|!BbB=3I*D;d~$VNHY1rJ>vslwl$K$raz~;|48Vi154zPIg%yiWK|BVW zYb@Hsr^*Z+zt1!MWOb0c*J{r>ho#9jLxqq*kFbQG3&VKOwOm)x)M#Wx8U|?8pTdiM z`}4&~(Bm@yS5VQ_eCGo%uPn{>qVGXPKzpBUYJG;=nMp7@sh1q2f|vW}GmB8C0 zTf==&U3d(OEGY_*Kol%vHh6!vega9&i=-fQ#e&6w)tFHeD4g4;_`l;K;bHe8jz!|o z9LI}2fKFh+xI+TUJ2JLE-tJ#dU2pgH=3sz854r)g-|T3_SU&{DFm=gv2!a-f6j4Lq zT{T@Hk(vp_d5(sWrs2(=N}?NcR#QtAbU|BuJo2nums5fH(B!YC+}H3pcy z_iU9Qa?#DbmwaE2GXh74j#)xDn>Lv!XFt};5P<+5w z8UQ54P1<9jXez609foa&q#ajV0T1;-t@YD;T+k3-xIb_n7p=!{t56kc);JexY7()Cmm8{@P956`!v+uyU zM9~t&bkeTxgGMZexZiQhm-WjP_le6@3kYnoy0<7XVuW|z07}6&2Mk09p?i}`QsXRG z%?Sh&d$T{BnWUEK+jRhEj>-*+0vTFoKN4l}_n2b8eO7tP1IbiRu_QnBFE3QHZ7dEE z5YIvOWVq0-f~H{opepk~=&NpY z(K|QgvpH+wokI$-_2|$8!~>`q-zFv(gh}lCeKYw$bUF@*`mDXXp}184(}AAU`N#Ov z(u>Qc1@}VSXMNF3)Wl-OklXp)OVPZ>`zm7n7_qyGlUs?5#x!`=lpH6-Y)NLjKH7!z zqxEw>fzxtx5pbg5Cp&^eV;ezq{aAKQ!uN}1Ns-%|xar;~%s^ZgOAqb181KHg0z!VL z)8e>Dq*dVRS%kx%b$P_Xa8!q#&cS;G|f!gI~XdBItLFBYokZs z3tWdDEVeg{(Q%1VzfCDEP zWU*|H2(|B1M7x$v;?XbCbVe zRvawD4ju;)HMf$S@nyk0_fTW*&+{LZJxLn2>O9YT1CmSM|LC!m_0|VYk?uZ`m|*Oz zKDr5nS+Rmgb2~EvSjf`QtWkjAt!zrq$8a%&y&gqvHk3KHSj3td7s}6O&>0wOT1L-5 zaqQxb1SVJv-BSw$E zV7H!rI*OXW#$*a4=RzIK<#WuET8O1Mh{UGY(Pr{d+rRFQ=B;?dN_>4k=$Xea9o^Ds zage-*d!wF(trTp}kmey`w~)i^`Gb(tmT82L~w=IgK~LO}JI*l_e** z*#jQrbmUvmm0p89xG>8-Lqs-$k)JvlghN*{({(byv1Hto)F4sde);lXY ztx{-Y6uF)`FwpdY0{RMhIh~upsbN?-FS%W;EHw{O;fNHAGYm(_I?^z0zy2+N;THu5 z0WByEoqvp5?6*EZ)u1>1qs4H<96UNa-1|Nhh92bw0#7>rgaazQie%%?HZy`vN7$P# zM#BBW^L($?{G1h^7uz4f9slFkLO-61HNSG@;(Ai|DKk7zatm{F#46h|f;CJqHuFto z$1gj6ID|CcnX#Pq4jy9cHgU7s3v##rl4m*X7YKy|fKRzL5hIVjU9AObNj-jv1prT# z6TfXnP^>h}8y)!2=D1R3J|mZ1fJ36Tt?4+Px46X{@4dAQwOQ5)i-TPg^^~RcZhRWP z>GwH<J+4Vp0QN%&WH_ZT=<|I#@X{1WNqe!)$syOXFrH~uflZVv zIDdX|`d3uK+^zk$cpx=W;> z(byOPn}}-9xwqOkJdTEq#*C>2*{oJR=)FD2sHF6ZdiE9D>Ah8ONaENo35?U$KmuiI z)q7o}0dp<%`#o<%ZD06eopqc0gvh+euf3vD(vq^md7?aTO6TnAkMKxB_avj_Ighk< z86Z_O&{U|QF_vE)MEQO!pQ_62O6h4r7xrxgF|4@+>Z2VC8W4Ox_l`EdPwU`sP-RV| zdhe&U2a}(B1sOb=nR&+)Pa>sA9lx0^`GoHjF2;vg2jlMJz9r2*hR@U;j$OWjT7*Lk zo19ktNx?(*b1YP3$0t^swH44VF65&){hXMRC$XLsbtfmym}3h$$@C6bZJX#{#`~XEJS2i%Jo}kpIJL?i zLj5wuk_&EkY1CTIoSi$LA5QzVglzvk90yHlp1=8Ru22f?U++u!n%ciyqhjjcJPZ9m-&h$1kPfj3K7j=UyKE1ElZ2#^aXu}8UcCUpnf{dpFd`p z7)akytUAPSwNfzEjP$oVMoFQ%Qo~;ra~Hv@chN zOFzBsVp=J{*rgWyoLb+ZM#hX|UdJ4p-)c0Y&v8*JqVCcPv*_|Sxb5%Hqz?R6nti!k zCEj*6Sq#}Ap1xzl+{$1QL*29es4qtB@vHMuF05t$2POR8KrDO^j9%jQH3DtNtz{HI zP<6iaNArRBK-4w8(J%k&8c2gY{DvAkbt+>TlU2y}|8d>mA1d@RuZzC_|%*-6aAd9TJD`ZlpV8#hT(5Rd%s?oNfRRfQz^6_{LUaPk84=s<$um;z+)i1ff!6Y|IhCLzXZP8 z`FWoAf6qDu$Z!G-GynV9rOqG%G35Ur$e&XPW~B6Md1U0rp9@S#1W_uEHG_Qb$xqFe zkqLaX@>?V>!`{S9MfxbQKb}o$7{(89skPWny#<0bd+g9R7%=^*5W-J2>-!=a+P|)y zpG)3I9e&uS%$kU4`L~7s%ZB=WIH_?MAK#63qgDj`Q(E-f5z=1)o}a0Dn`Gs`oOHjv zivf__ag^N2U-&OYEIT7iwl}&bZvj%eKPTds*YWs3UDvbuE~nz}+vksiEEskIwAxok zs{P9c{cX31g42eLcaApy?>qPR@Lp(<9IW{NC#EBhHg39n#<^=6Bn;a}qgsvyHOKJ@ z+_nZ(=}PKg3OHV-f~zUta<JOse*`Kc20UsV%uGCF`9% z*QLfoQ`uR`>(s9jfB2#jtqa1q&FMN!K_l_Ln+fIyDEcduY*+(J_|+c9k_#{Afq4X-W4;#eJ6kSflIF) z{RHG@mBjqckx@bL)y2EUhX0%}(O0QUjHMpe2PxAmZG;qi`C&@8^tIr>ioDA&Rj0rs zQTW%}SeC~#obRU$NpO;KQRAncoD|nnv&Q*sJbM(x-|7uE77_O}U-3;m`NtL9-;4wl zQI4>LEzTg}DFHT2x(Np#8y9ct`%@(K_l=Rt4o8IqiJ+Daf2Z`wa*GPCC*&3!@#y_u z($zm_N5~jnVqJK$#8BpBuZ^V2VQV5P`s*=F9Lf1pTnv*4W=h4$+r)kMDbur?ko(6z z1SRt);`M3&n+B(%QGC>&*^EC zgZN*&7bYSD$H+rJ@wmUMGGS|ZFuk(k4=(`N!!pW;9Vw#}1vdYsI%h|Q9Vsn3^3?wv z&uvzdJ!b|-}M?}Ff;Yg!NeOU1nzAW2#a5jZz0hpCqMkH?ybfcjv&z~d^1 z7ch{g3w4^*`;z&mVc8)4(;&Xu_%kj7&kudIiVuwNT$CWVjhe5e8RZdtT)6}mX#6Fvx6Gjw{qZ*Fi zUu8;ki!0Dd`XiPm{M$(^1m_vxkVXV}|5bnrp$^iapJFvd5RaBp0#cky`PoWBRTC<2 zcOV2*H1gC8lk5i@e}p2k+rxoi%N}-A?!28I?)tj_uTvT+llqAm0@M8U4W#)I$CJ$z zrM<~f+)njEwMnpmW}}^4U+i3Hx%ms(lJ|p*gh{;skmY-_$7pl@b-4cUwCkQHAcr|O zD>WJ*H+8_#u#*Fr4sA~ELM?b;%~qg_90HKs)hVFU+7Y<9v<1i5q*H@#&C!T$o?3bD zm|uQ{_v5R*#WvW+tZeYQR|Qh{$)mNQw&hM4zTy=3^NxWi475g25*sCBB`-BAY`ALy z@B}+>cw4x}6yH#|hC5Q9lJ?2)?RmQZ>4WRZ;xn(imC~H!%^-?btR=*H{OVAh7#!2( zV{Ze`E;p+Wdb2xN1SAly9rJi_xNTIl8Nz1dILhV)o{E1BkP*mAVlXejx8l zC*%2r6iq+5lVV;r-pWw5S)6SoaDA!^5(_**Po%bp4#6O{MT&(eUlvrtO&Y<7R9UUv zB|=uc50gNbGR4|Ozt|+l^)d#H6Nq0N!T8RXK|(%F79J7oE5yzxG#)tpe9^*YeRmT3%)G_3)U#V(20(c!rt>QP(CBmFcr z7OeKoip7w85Di~X&GF4&zQ4VSIEB9vdRYzfp%7;gH|_gE>(~(`-ikDLbrMy9((Lbd z#rfhM6|#P`BHN;&#frQ_c2G z0CVmVY6KTL3{^*gK~wYTMRztnAqim))!kfQY@8}rF4ToFFGrk$xPP7ecB@}tE0L5G zC#K2e@s}K1qIt=pmp^hZJZ^Sw^n1|kN!O|419&h)T*vAzmznGbys_*D@cgsgD2jUh z((mut_}qXR#4HpT@rApm24!th+jfzRc}v=WR0@{48$oadR=tRwhSX z;p5t=BjnnmY1p{S?P-$!FPntj8ZPj~gN*?E#Yvs8CrkX0SkL2zdn9%wZiit_B@8L^ zPGtZSyU-5G;IdzTy%ToSP7zx1MoHs)64*A^SglRo_*p6L(4FW&Tnu6th>HeL_X&*c z&NsOcH@X!w%(|US!-9@u-Ba*s-P{d^ENjnNU7`n$aCP^CO~&QKh?euKws~-o>@C3a zti1%Z_`{B?3sBv+;b;YxOdnORF z&vL*r6WJXeR6Yj=ymX++>so`;Tgj4-x)+E{|h}r3Wau8&;Awt(DhJ2NV_^T9c(;2IN=fgffT|9r6 zWP;VtDjfLAkNyp%xQ+3W6y3S~CflyyYpy{NAk+Kd3CUqs_@9o%$bMS?T@ zD>T^lUOi*P_7{>Z+)n#?bwp@P`|r7we%R~tE_${)RHwUNpBbtp9dTiqf-N zM0;E!;XD_nbnv<4l;Sqao9)@FZAbj&4=*I^h-wvEfi9Qyn+#>L>g(&1i=8?dr#cbg zR}*EzH&(gbT}+tYSosLkw~Mk5)AMr#R1fOYgN8%oha6!*=vKW8DE9_Y$@XE z_+_Njq(R$LOvj;-z7#>h|n8$5KS zw9%N)R@qWU&;AiLflQvvGr)OHB-n1W&cj1+1V?vZo(0$cQSR}Kz@_132~14v!p3qO zji3AmBJqHLvpbZ=U}Gz$sI`}SmGA~vhWGx?$ zX^KED$gA*4)(d<3a8^C+Mh;hcv_Pw_v|^XKfwGQ#14cp{n1+PPJP5o<}&@MO^XIIF+o zsC-_?iaa@_%c2LX(xg@SgQDe=JBui-!7Q{at<`L%FYiX*yZV=mP{@|DurO2`L9(tH zQ?jCmbF$mx6@ZFo^ROH4$?d#HVcdlq{D48BzVu+_$N7g_FJk0^Iv(U#uEaM_F`o*G z;tF-Y;P$RIYZPDVS#BDviRi$#i9^yy)LHV|uGkdg8HwT;yFfp4>vhD52qE2k&RPxi6QP0!B#7Q zrJbvd%8zF;41}6ya$KT2+(zVSJ|a`P_lrza!`mNb##p-GIiv@3?(3ehT+o)Rk+X|n z2~`+1!jasU>5%Vf9x=iU`joDnV)luoExG6tPl1V@4`CdQ<(q6%SN|r!CyQEg>jXh0 z@alFbAL$aSzzncY*ug^!2^|M%#*U%V_HVI7D4yS ze3kkZPLtg?ju%MliIRDxlF^+{z0s>cFumLPyuRtv-e&bXF-NKU1^E=Ae1lAe7mZD5 za&XT+b}*v9R_@h5bUnMy7hA+?hvYbAn)91Fa!ovSR!lHCz?!ON;p z-y*EVw~w%BVxJPqbX{YK8GX>?M4bhJWs`LFveEGyEv_GfNnKxDf>K^4?&W{~5Cc#Q z2LQ->g~B~6RL?O`k?2u#V|&7pG69nFU*M_VGfHyL0Kg4WWWm4Hnp^0)@CkofHpT5& zg=rfdwU0jG0ahqKK}s-VX}5$an;WY;(KM;_Qc(vry3wvfqi%>rFrpY993mE}y7O8_ zZP$}|MJ+e`I)=#@ryujiVveua4ERMZi&ZpKEH%AwG8H}69tC{#-2yV)>lo{MB~A@z zw-8(hh)#fz>X;0T|4^36#5(uXs=ENXPFokuGK7qQ(vjtFZuk5_i}DL)cuoUI3tk%& zJJ!YS@x@AlC84JMk{4^Tbt}HWj~(|DUZ(Sj`(@rb3s`h_rtNLw{OrHdQPIxcqHXEVs2lUuGnF$uE_i%YpFGa~!XxG0~<;|7>yexCX2j%8! z$3x*ll=!24SVeR|s4gB-X!e#I*W_?MQ{APFNlgZkw8MP4n5M4%Kt)jY7GYOA1&h5D z5{bX7eOO^k0Mn!}yRP~AX~`_H%O<$U)x#7=+ieF~KD5Q1#9whIBY14% z7rZ>}9wY8i+&sw$GFWCN&3jwGrUU8na{m{s126-ubSNtO^&c&c-^Z|AX!h59$KpwP zDYEozGoX4MGhOJGzX7>4mfsjj1Lb~cPGEHo>v13;KFfOTVrANcWd6HI!~;F=zB2Mh zObisWhzbJ`3;VDWZ4LG?VcKiJd~Oia1?P6$GujCwDRz>OLlhRs#~mAZz8CrJY|Jc` zfsD}hwopNzY@M0rloV(tIJ>|%@ZzQ5}zMrP5U=^qrV%mG_{D3 zBR`PUpe5+(^0c3d#M*VIA7k*=#J2;sfHIReV^jD+k40k?2X)POpsFjZ&{ysN|8c+M zA1v-*wAqR%?HSZJkY7L=3ihTH6iu+Nl%A*?84;QBavzy(&*_vYlU=)PNYa%WeOnRP zndCaq^XOWNukqB$Zkk<}kds>eLqR#bBk&Ohd4zHQo<)wJuCztgu_A5|j!V zC^J_R#1JLBP^6X0=#)2c574jYeyCw8A>GTy=w!I{PfU>%E;v!>4MMeOZ>G4O;QH|o zMNKDtT>JDR-S1@HzOCNmLz&VjO3UioGc{FohKc2gVWzqfQ~(6;AXdfx8|avN8)@#P zE${(?emPMQWi+Z{Bh$?YLZXiAX6;A|M3T5T+5pd#{V+CVmehRt<{IWm#!%FZDV|{B zOk_*#jaA|sr@wtW(e(ykJd>Jo)(uD;g0sxb8;09wU zSqa3_124jciifiQa@Kwoeb+$))d3>qC!a)PX>w^vZ#JvZPmQZn}++@GGn~mV?)$*m2WkE z+aOlYVYzD?J}CMZV8VzH-fAW-Fh^x$B+tBvye>$rFZRd)VA}Rgz7I<3xIIXmmN3fq zS_v+g?-xZ5KW8?C=P2F-fQ}u^Ca3R#hX01GJ3JDELmr7X?g5{vXehBp#}gRkMkp9d zTRsYw!ZXI3LsJt)ODtTJE{s+T9YNahwAEBuFH8h^qMQs)giVcCz@YlelS7?`V_!bEfL5SPg7zkQ-n|6&_elvX}q?hd36?qzFl z5B9+c;Y4_L=$_hq7d7*0meY1w+pKtCmRJ@i=I-DJfCc^; zLkn@h3c7iqE^Pr0zmU6;Ki9Pl#++&c$8$v@I4R{4kYqeHfCLZ_n}9;f$>L1W769rT zyW{mDCcWqJPowwttg2%Ei6su>c!tAQ1GBG+s-0RjKoKI6To#2l3BNUpoR43;j$Q%G zj<8y)#7NwR&1=tA@TcE8PMUL-_X%87z(N*)0h$}fO#tU9*uq@}N!MBF(fMB&7+5gh zDPcC6Cjc&iWO)HE!A_PJ=rsaohnwR=Fqbyd{iht=30!@aJ0OfPahL>}s2S;a_705M zL~h$Du$iJT+5l|5H0H5BoPGVgeC|~e&zb*?qN;I5(D7?g_@jzXl($2Ty^L=Gi?x=c z*f&&EKy8PI1hy9cHV6zXf>a95_=c{IK+#0H>oHdXNXTc+E9QNTH<|=Z^S(tBaF|3U z@HrL308aUYSe)zcN?P^+0?{x@!uflQlo}78?6iV^(&ur_*3>{MbpSv+TR%dZ4{B~l z-pTQt)7=__#AAn_xiW>HBVDMxGFpityeNw0cVq6KVUG(kP)17848M{)i@XdF3 zP_6uk9AaUHJ0`;Ibf825lGAB`$St<1zn!A`xw0rR=FaQCy*KsEErws|OWC;w+;Y7a z&fqXxdAMVC&s*RHUjkC+h~V*7uL6WU@qHW9?Aldo>m_8Pw@in4KX5Ii60IOv?7`*YS#=F2<@{ zVE-7CGyL%QARP&{(bH_c^ktxyE%VudibW@G$#l@T?ew4|{kr1Lc!RxKzI5}x$8Gxb zft}KVT3Zr#o*_3ZAM^2IAGO*h`FzQ?4E4}nb1&ICM$r#bmp3fM!8*_~#_KM<`zT}F zh0${E=}l^H61Y4(FYL}wl3QYCujhD5jkkEjmKRIZtEg-;iB<_#PI4?g>~^FtM%)Az zUE0o{Z8$g*#dIXvZ*8d9PL(p%*|OE8Y#6woM0g4LmF2k!C~l9;FpTq@6}1muQ+0Yw zjfqxvH@c2PcVny%sm1I)buYV^4$@s2=b`qh6L}TyTd`5OjsKu40*wl~kkQ4KrAI<} zA+Cm9SQEEicPtBPUxiug!PAI~U_2IbHS{*T1sKFvwf;4y*jJ|sI0nrLa?L<=O;*Me zd0#u}?njv1_WxvM0bR?q_|c#CX!h$ZP2fJ*6MRc|c0S_*@{cjy)Ws zpEFu0AHvLK)M7UJfIMK;PZ*EOLY)@x6Db#40>qnuQg<`XS}K%#1+VQhCa${GvkB>) zZni!tu)aEDRj+|&Rx+V?W}#SXCUf9hxyQ|Q*t=5MXW;DU zm|es*s18kog}(*h;gRP2RyzU#u$HEA)Xc)79aP^UT%I}2z?F}#on#yzfv-Fp^wWdxi?QKj~Kf=W{d@h(p%xJtWZ#yagaEY_^vv_#K_Hh;Tu zoZZ;=lBo^G%RupqZoivj?@(n~tGeKgF7C=CVDOUCf^o}&_#nEtTJdXig{*j=2^+`O+Xwg)<7+T#r zD7EeKD2`znuO>M4*ow*xXmU#w#;FB9c`4*<{WUI* zu-XHZ?78ph-T1rNOqi+f1BI}t-$B~Gd9sXb3XgjSPLhfwFzX15LMt3`7o}T!*0gTU zW1cS|Gdyg?b0N2oiuFX{(G~Z`39xK-f^p+`w<{>_hgWn@vI_*Q`XxY}PUlB7Lx51r z^m>J8CUJ3ZuQjv}5dBwB1x~eZQqj>A+C63teKeIf54KA!rxA}fM%6)$RHH8z9`Bp?#U9Dqq2`)rYRJ(S>>oxVjf{gCQM-)7%A|^CS`$QG zcOUFCU8?NC3h%HQYG_~#&aQ`t5mwxQNVEeDzh$)g{^;te7_k$jIbIsfLFwA(8UXqh zRZfQAKviWhblGCsw2ya(Z|73mJnHqFv%2!<#8SM+YXNlmyFT>?zp>-gQSOSdyPl^g$qERrZ`(l#fg#y~ zM#b#2dqhj1MwVvvrlSjjy8o6Y27)UZG6tD2&N|z!nLoFQE~vDWSKMO^I@ycKta#o> z5}{CCvim_wX{M%s5@o0$-0c94MoT) zgw4|&wyq+kGH#qW)*mIQ?b5Rg`22~Yd8$(Fg1b7iSacGDshl!>^|84W+XQ8$8OTpg zYAmf#>(iQ>d3_J(<7PK=OL}b{CtAHnY2lr0ZN`sLxADKSNA!T)=lmSC>1h}z+T4V- z6shpay2juUX1@}8l9Rc{rNn@>kL+7j_wBq ztK@id8uRBqH*?uIToys#%5x9(N1$hduxX7 zYf!b~r9K79t8m}?GRff#`$`8%D3ie@x>LHeja}FM2Rf)5m9A>#t2jAT*wGrDZUn&t zoY&utEz}Q@wptu(t!zD#cT|~11`B4K(>3vhN7&?I5vPtO~_U{GtXBDsl^;4h!Vi*6r|;v-3|>Jk~NeS6k-NsmdA20 z@6y3yV6X~;qI|VOQ{Rsg5o;8$V-^x9#UeKNYg;TRRHrqNx)nt)`~jP< z=UfkAiSiy?XHXI269vA4vYN5khJjd_x(#pNNPmeUBoaUpWC^wAP)h^fO8oa6J2jmE`{}_cOtkrdnQD{EH?B(P8KF zBbm*Dn`x`yWsM6XR)2{{8m|gMy*n$Cs%KlbxlEZJqBvbXlhu_ErGx7eK2GN~XT06F zpvf73xo~s5zB;lw&SEZ)&iCNCT+ptI$ik1^ywO69D<(oN)sjHo{YJ6r!#G>{NzEH8 zC~$nqv6_^2zBq!cwjl5|^G+sDaH|Tzf8MY%`cUaH;i1cfJaPUl{fgT+OY0!$g6E~j zAxN-pyFoLfI$&AX|I!(D1h_qX{WbjNgHyol-boqabxm z0vD5RBQo`;cIppQ(;wo1BWuA!T}5^37R2BS`6n~uWg~fNE;2PBm!ex9I0be1(;}{l zv=~!F>mWmeg`}3z%BJxAK8Y?K_{@F>f@0NpNE@e}V09rYLN$pz95GuKs%m+H%V7&m z_7C*anb6ibwLCGuVICaKo4K4Ii<$&W*|YKw1tM#6p12b@SI(LKj`L+(=^cErdgO=i zU9Nljre@UgiSKqPYwC<=OrMFN+L%YH)9Vso8F-J7zpYe=E?V9-Xr^F%xLX@nBioI# zNMjd=BwBlAVL^NPDG$fGZL9JbusI`$V_z&x8nri^-ObJ0*Z8Uhxjs*K0}*CI87Ci zYkQF~MH$05N48F-@|5DMd8kV?S)&ge@qDuT*3kXiOfzmcVMSWQZ@vv4&u6i*eVX!^ zoSLb$BT9bgR1-Hq#F4U9H?8WwKy<;9KtCPW^VAZZH)6A-pf0qz$H(}w4~@gLTEtN3 zPO5#?+D}Z3(%GP}@V%=1KLv=JKO<*1JUWcrFa3iVSKMWs=l^Zh_xAne+xY zu=;A5>QtVV5ifQIkLheh-Xr})qPytBsdu%VkDf+9mGyC1)|>p2c0k$T47zq43LV*} z8HU=acRKR-;JAmiyM=8RSYK?nrCcd{Yq=hHQKXQ#;{?;-J3+D821NOKKi{Nrkxhy_ zHWHvznNx0+AX>cl^dWX_Fk$$!?kUs&zm7Ng**7>QS4wsdu!x**?_|Vi+8llqkDuCx z8Gk=NfZ+owZJ*QtL8myHbF*XkV@ZcWk9P6{%-#K4g9fna`oaOn87Lpi)JnwA@+03w zA${`tJ~B{fnniB}D^;L*RkNZq5Idm(Cc#97olb=Wqo2Y678CFZrx^j9cD1s1F~fOm zY68)kZ;M_&l%APj#XQ-^*8oI@it?)YG#@r6mbfMY61T0kSlt`{0X<~vzM6)Oqjp?- z@yRT=BaI1n{!fgbqRM6lVm-%WeT-QwroFiY>}5oV{Yk{IwCXb^ju)q#j2FklW)3Xf zwgp>02mg5dOZ;MkIJbNZvad)ipINRLL$&cRF^v9J6@UO=tpX3zW2S3Zkr7th$doo{ z>vF0-ioIkM_wE{Ti{`TcWGI@@S}VS4iKRM$1<*K$Br?huc4WT(cx$m^FWO|P!a7^o zn#oZ0u*^KdkXRZah+)?uP(|(h-n?XBvF6|`X$0~A#_Tj7EL-o5E|u*vb$7Xs zj7>KcTU1<@?pO9KSyF7Bgo1q)-Ph0Hl8gHPca8%#CVJ(MPpW~fA9+^D@KPQ)fLfTn zD_+h|5}MuoHzcaqqG(P276&g_nO6Z1c-2*Yx!3ys1qL(r6IE^3TCUm4BdRmNOM^4QU^IqQ19Hyf?0b(0=xy9; z+dByAjPb$tS4JZfN;4O%QFjay`R!Kir!EofErg}&Crz3(5u6G$$m!mCZWpJWjOEfI z%5~}CYxNiVw@sdvSEKVkoQT)**qczRRJ$<3{8)yH5rL-h@y22CV7tZ`<#Dai{HJ$R zs`8HWsOD-_$=uL4kEz}~m}jFQ%KK%-oKp)`>43Q2x}bVLK;|4&H`|SHm6L&>s!yt3 zm!H_K1sS5ly9xr&!$x%w>Cndo%>o7!s6yT)xY>`X)AP>m!~S235Ohyuj2|%Td#M;r z=j=&<7ig4;Q!MZ@6KlBMhXO;kthpBaM6)|v^Jel@cuOcW6NoJ+0c zK@Tg6MbREz^)FF@16-+!@a<3?#|5V2Cf32{)TIFC^YK7Y%?xBjMd92dGAA>r)&K_M zm?t*?e2Y+(ai%M%wpsUhPES9G?oa!(Nf5f{J|c4zk5`4S@2bjJ9_LhasVhhz40E>u ztE3hBR?+oz-p{yU?_D~bc{oI@p2S1_>6-9F2-S5%6%%{wg*IHUdaHJs)K?658=rz@ zbAr4gSKp@`?hBTYVPz@u?POB(LHVPIaH0x3n9s&x5; zaNF{$t%nTE579NOdt$#IFGa{WKqh=dnaKDKQMs2s4x3D{k9*g?PNik~rD4~1QX#I1 z^bj6e3KPEFa09b|d#=}Kt62O)5V|)ZJ_;pRXc`8Sr5yr_DuYV|oT#GtuFZxa-wLOp z87@)N096esHehS6`B}6M`Vi!L4QOckD4GWwadHmrch|5Km{F(LindGCj=K(hbM@wT z>jNj7`aB4=qRs_%N7PT&FSIhQOA3us@{Ml-&)Cia$MI(zO^;PMO&>xK$&-B)SKqo> zHU&4>lx2?be7%yCG=> zClXGxSdxMrK!5bB0%+Hzo*j(AMv_8M)Uyc=V23@H12eVS*{!n4UKqDDTN{=_;vUE1 zErQ$20U&9flYoc}b1RKTE&(ja3JeO-&(~bT@8PR`$qVdYHOf>eI2Z*0K*z5|=>a#n zrV2=)rT}2gTE;R0&-Hxj`=SFV)m9Mm54NO0VqI?*O9WWNMK6P+TN=Evramr4FR_e% zeRKW+ty>`KA(QSQ5$J7UESGFQq7vfI9li-%6MNA&e~3=Snjak5k~AqY;93(De9!nQ zG6m^j%-^t)%*wD{tvH!lWRj6qYfDM-h}&VT<+uIh?;ggblRe^G6pde1d$^5@zoER> zG^I5~Rer;BEP+Qlvm9$4$UJS?o%!OePWaYSZK_dPPOn{&bgfPhkhtN#&`4yez0yyK zVb0IvTF1WrUi`}@rGbO7Ru7SpAIE4*@%he;gYyW6CGKdId7Ml)Y9c9VI%NFkLF~Y1Has6O{M&;?kn;5 z-IyIvL0_zWZ&FqcjkO=s@#C%@L~oe^)K0-^9yZ372Lpi#3Y9n{aWaXf+f&-jtiPkT6FwcRQQ zw@0POs%1T5bhQQyy(c24&~Ov?<1$Ob2w7VuD9M}3OG=?9ODJS7v>eTyeo6Pn;zgsE zqk3DC)0TJX6EP9;?*t^T9Nm=GmZEnGBX!Fr214s1=C8^mPL3^(h>3=d8CGOYUYSpW zxLus!WM_U=z+tvGd4n^Q?_pfULfe;wEj5xps}q@1V5pK8N-*s{8@C^YqWzZS9C69h6~MGMPxD~)s42k1 z%@mKIHeQVE@=P1C*@$kN4Q1GNP@zA3D?>|KIO|N5lrc*{(ksD3Kv(@#l8?mrJ9SQM z*gZ?l2In4+TjcHNrRy}HuJRD39~{4UDLARtHgPkd5# z8y++$GKAdIM&1HFnk;b`)s0U3`zi<>`SMi1u>yA&lL?bg;9wwmhSdIA^%~+B%Vrp& z6DAnxS*`mG^w=BDQL;W35pa6QYf(H=JeEzz{}a;oqUdpv<>;%0ckbS|GETASq%qE(gU1nch|O3`XB-m76~I_n zD1fs)HWRMgLpTKm-MEro9=eVKQ3xZNvDAvc-;s7&;~jxlI*LZlQTzq=2d$X}NtyAq z^qK>tt)Xfr)o-_SksRkxHxjx;?{jY0n@4b3j%^udMa}TpJT5Wr3&AdC@@DER3G}lx zKYmo5|7|6ZWP4Z6-q4iAu?wF!F3ittJNKAYFB$Wl{yc&hD!XYxSoKSvP{lqy(PD3* z#Q;=eeT_?8b<%TP5dtsvk3bF_3taXZ=+(-)&+6(+lS|oG9~OMgBZN0oREZB;%{y#XetW z4&&ke(!x$Cb4`WqZVK1cq)14EOjop;Y15l&5((bRWAQ&ze^L^-AWL4yYkTSj07zK^ zV~&WvwWxr=oJ81tk>M#xATa3n9?j%ZfdXV8j&$9=ZC!4>VJ|7q7B9AWHw4GeM{{Vi zp#wH=qLkNuON;fW-o3xSQ5=u+(DzawE7F1fT^JNmbjs;8r(G#KP=q)~eNPE@sY?Zg z_Q}r322?eec4sbxiV%hE^~u70<%Xgs@E&pS8_nAzZA2cGh}Y+*U0|VpdbsrK`fs7E z7q$lMzL4B$R&8`W273=ScSI@6x+QIGJ9?2={WP3VyTwWs{+|F%u&e1qrz`ejODz<4ZoDtd6 zQ5v`T;rjEe_^Cem5(qDxF#$9TfdSfQ`^(f)f+@|`DOkuOrpr&d;b|kE>2J^>XzC-a z|M4?lbl^fmE~Z{Bs~bETZ^5H>XPtCqx7U>S-!0(m&+m+Xg~NE=5p*-RVdr;%EZBZt z9r5eBeU0V`#?4o&4_#RZmrE?TujGggh?sg6i~rhIkH} zoNps0=wB26jG4eEh-A4)v^qYhP_F~?0OYxGpo?JwSViCU2Q(SL*XIUWpAyh*Fcy6CnBDp?4f5zu z*yh(|`@h#q5~)iMA+>W#8un4+Aiub>@R`k&PEbV5>39cJdmS`uAS*vbZutW04L-~W z|NFVWzYt=Cmr(SC2`OW0zE1#}h;CuG>G!X17|qk3{uw3wp(_9VE3%$K9kjc&k?ho@ zVJ~AdBxB-1d$$&LGvy-Mu4o3fy374Q&*TPb_bJWEu-v zHv0NaJCH4B2-N02L5+hFv}Fn#Apd3c{32s}A`XZBO_NHc`&1YRFY9xG+SCA~5C#W5 zTm|TBz%A0MZ5z75=(q`LupHnKuqBuk`{Q%le0Bm_rcbu7xR)Q=F8DvDW(e|Z+ysAd+*-JpxussoX$IE(JOar!$*_=Ml-}36wWaz6$+d8}>U$dkb1Q zT3Mg=dy>5JMneK|Q|;tRQ{z%cge_`TD3I~Us9)ZF@F*768q%Cet9I(hesi}d74*{O z_B+_q2OLrRy|dUofT35K3%F`G1nuf90s2-S-b{tH?hs%L-~um4E!RDtNz|q_mn^Bc zg~qclLx2lVp2V0K$^uwd8G%jr;w+}2m0Qf!DkTO6z&6}r-ZipehbEjcu_Xp#Ko*G0 z#Hr+9Vk`L7$BkGN3 zr$eB1vLj>PIPfu^FfXx+JXt*l){_Z9M7u&L;BoEBW;#NTo3ctsl8=t#ypN&;E1YY) zrI`k=RI0*>v`z+P6?BHJ)}~;@ysB7BRxA`+{pOJh}Af)#P9+qWQMreXA|2JW_Su zYYJV)d37)Kzz;XFot%s4`NrPkNa`Ce8Rw_yrq~cq&`&TM`P*vzte9+e$SS>UWn3KT zr#7zd(7Sov>`JCQBk^3qd^P)=#Jm6Tz&)}C?{noB zKo2x?Bu0KNh~Ae~4I~jPASNky0$VeYHKKty2}yrBEf{kMjgn3H`!kFu&)}|?i{Jw@ z$zj0n-~I?iVLeensRmZ-9OnUX61RK!0*Zu}K;FjzbJf;M5`F}eHz2b|YKRe9dtV5P zUxQ5xYf4@j)Du6&Q(Fpz>XiaV_?ei|-$7xIS}Kr$2|F_*T1r3gtUf4}rD;Egvk1+cna zPhR92SZ_U;)^7!<^(X^g{MYBYk2Gw8Kup(q_PuD|m_SiR_lUdhz4}z;lheyiL+dt$ zCL8gg0>V{nr)*=rNwN74joUETNx^upvK(M@@i5Z?>GU3l+K~TpT!X zV7H&#@2q(0FBxH63$rrd28Ogr8B@TCVDVKCo^SXzV7{`$2=i(XFKpMig}`vY|F&d@ zr6~5E{CJJ@r2?w$w@70YX7Czbp)HWsC{%7|@7f!(MBTQ{YjI2ScengQK^e?~Wx6PgU2$n%S z_!#vMo3Q_#(hnuTI|z5I@%_j00)hQqIQh9Zcl7lC*=7EZ0M!SU9LU=6{F@%__owdp z?jhv+Eftmjz46~)2&IAifi5z!_s{a$FM%a2;Pf;hB}LHW5K_eX?-2P3$aIjYvi_P# z{d&^<|0(&$+5CSsC8;`TkJo=&B%bjU%+7~KB}N0EzT5&=43`Gf&j0ve8jsB&2*xY1 zQ`H{|#2ox*7A2H{)DBlLh#2+r{(UXzd3LaxP-(j=iqB=#Pdbs`-3p`R4QfvH)%ftRjHVJ-xw7~Ls#%1S|9yf4Qis^0k$LayTP66SWm^4B40a};_ z^Pyec;rdziC6Z zzZlwaPA~|zbqR9gb_sLRo?68o94i%bDbbzfpz~I8tWQLc?7o?a(-Ey>n|9?naEW-C zOWzQ0uEb&LXr^=5a=2r2svt)t!}Fmt-I@_-r1{H2T)*o%HRHN|7v;PB&#$M#Bk^60 zC>fkjkut=h z(FEhZ$8+_@Uib~wvdvD=e9fRXoIZ+g_{#XkId^98@SB3m=z9ND_qDsf)5QVz%HrBV z#HZ=wsWyY2vYtFD&3QVs$5da4{`OYk)Zma1=L$sz{hGjI{upx0eL*vseQ2{tq})zU z{dDZ4wii-Ojas`ukc-?|#kdupkP|Y~X;&t&BV2UX+hEg$ty|%jyWBx^lt~CY#IC#Qk7Z4D}>+dqaiC>#`t8+ZpR)DIv?aQBdtcqjI+`X*NfvT z&rZz&O!z@z_8i(YI_q@L0w?+Hm&pXc=z_-E$@2cX9$`x|;2r(0$s60RtgwHOEk~?A zS?2T7s^FMl56nBQQdof+mlfUf63Sc<;2oencUQaqmaIYcwl2>l_O4OiTfH<5tA%W? ztbD$=izMujq^Jx0GGezaNjBZ>P7#t1&I3DKeLUEBRKzIO%o!tH6=;T)QO4sbC05x^ z*VFiNL}khz_Cr1Snipre2rIKpZWh$i39C4r+89CoCf2YGHFi?RY3a&3*{xDIe9ge} zU`wJrr(mQzcRI~yyyMl-G-RtxJkX%fs>Rd+nQebwX|_`9W_I!au=kcxQFeXbuz{d} zAWDjes7Nz}bPA%<4MUf7cY{bNASm4>4AR{=z)&)jFqCvSAl+T>9=)#fxz6*t@3r2q z&sxt~d>CLc%yArh|Mx$BVJpLB?UOXT+BFlgg*W$JubZ7(HfaO-)cyDXW_hvzlaFwL z9cWtX=*r&Zx-Q>e^|wl5&>b8?Lr2o0moS?sz2W-mV6}9l>Lebumo>qZ$>gY1SgEqS zxTMeswRo=6MJknp+Kdnp5K`O(a5CiQyn%@~N4 z&=e2zmrsnGYho1iWA}ZmLsSbY*?k2pm{4U)jI3iPYW8=BMFbC0$<$bp{cu&~oaeh8 zWDp%2R&TpZNoz7MV!1V z^P-1MX&WgFG?(}~Ac5}$VDtb6w5eKfB_cPk_u*Q#n2~JNC)MX|vbk*$6Wo-}91tHi z&b&D@fj#b&D-lK+_~TZEc06m`A!QI#hzvh`Lro}hpK}d=% zk4Xl-*P-MqQljQUHzC+N;e&87FTAbXCpmfHF=gnuT{z#fTPu=vUux`PE-7#!VkFF2 zN{~4Cw>ac~^oESGnoz30V{PR-QP7*{4k2MGEGtvROzgWzvwwzj>bR6UkG&+-((BeV zQ#jVICBapeCHs+Eq#I!j8Ks_r9Gnm;jPgMumxqw?23aCahd)HH8JGN7Q<>y<&OnpK?nPYY~w zmVGQ0wr4E~k6yPQEJPJI@*J+LSmzAhFYgLsJ(aXnrzmgl#N!oNp z`$=ohAyDb1linT$^H~dnLPj-nGRv)n9BqeaRZY)=R4d7Nep$y8(1qTjK3lFXGz@9C zvdL-AbQ60PJhNznFm>#XU2&BO37@W=)<)NEQWe_PVUDF_xuhs7@8L3y&&hqVjL+{2 zT;+jIhE3!YFOAljI}KY#nbOH7O_o>!s5_BAKJpc0us%wM=pf_*zT%HBjH5U+t5vMk zv8R3L2?m);Gi&9lt}P*T86T$)r@a=4!sWj*g^vy>_(JFv`Wg>puj*l;nNS}HyZfut zj%^C~rJYA{lJIncMfIHNsuk6moz zhWhTsy3}VwmxL~CwpBC+q*H|J9UF^;lL{L3a+q~XgLLRK8Ly!y(Y_NLlI|~kM9z21 zl`}J5&2M~P^LWCr;g!IjbGV>YbEuAniKMPUOqK$&B ziC4;PzCE!_Op2I(ay(w;nv-RC`uYsV(AssUoSHU}tgMB2A|j_RLT>W=aivk6O)^`L zt8~3b5m^BZ-FR;O-*?fM6)cCO9pw>*-19%TmiFbPu4=naxK*W3#9!dVIzqi}PO)h` ziz(uexw$sv%(c^Bp+_QDaCkiS(-t3POC<6Yl@`%pm+Lxma&bm z2kxL)p4@In{Ubh`U?SGSuICp`JA^k5EncV z7%gHQw-|ceRV@SEC;!f(G()uE%dJz~gjohgX{-s6d3MZ0Jon(c3JQfkY=&^{=dTE- zRW@ncZD{q=ce4+qJQ;S_s+Z|!^tO7@omb8*7@6O#Rq=G> zOUR!j;CBeZ9IUaJT(8PpmHqcapTxTRBStA$lc@nm?+Bq9z4WC(@WfyBS0JgLI8Tp! zXH{Wk)ya6v#tZX??S5vSA?Mu6c285}#C674j~~&m6@N~1LltApGaXk|v>_mKG6|nB zzuK6z6=z;pP_sfCWvtmTymYpbQ6Vt9V2`cmmyv!;+w_B)4H52g`|gNkL1Zz(D0*G-H1gvh}Nbi5bw0Eaa79j>W;dR|NLgZZm9t8Qj_E zW($oi+GXlkF44jg9&*U#Rr3}YjWJGh_e=~8za5%eE^=NWxU@TYT%1yow$i&GB#@Z% z#EV42w~6rq;g2fQfw`Og&CwqQ85)xI&C+fgp;<%9oE*9wsc9KDunR`|H6Sp#T5tA} z*D`TxRhxr>Y*iqZYC#{3yYmC**?-?!%!`u9H>9P|PBE=NKQ(@#-%@1Veb-t|GckkQ z(|w@e3n_G(t18yx2w8I88LGi1bl|&Dp#6!o(KQ!O9bGE*H%PG zJ73XlXfk!=SPL9CZjcqLe1i$Roc-I!R2aWea8Ge$KQYe-^K*r+>wp{tSpaQP`^qsu zhn58@mUu<8pCg1V-~bKtwy!w%j)uq;=^Cv<3612{*DSlZL~5}*-jyc3B2+ zr_1b<6}OfKO;jDfRMylxc1vYXf|yiA>LZeL$EVtUHIqDTGzNNcJky%Bx|uY>6G38k z)_FK#WKRGo2pg|ZyxK^4mifzb_N@5xnKnp5`t<@*E z->z~;vqp$*9dGBT`ZLj6hn|jT1O#-REsJyf%nDE!j0~v8dMlLAtQjnxx#b%O?_l=U{ZSV5GKE zU@&(L$dlF3yWYp~BKR62Bg%&JDOIl1xF{3FiBjac=`ikhrVWKmE~^p; zE_}rMJFLIholp}6L=jX~pMH4iA7pK_$sUAi;4#r}Y$my$y?cgj`RpGPZxC4Pu>X86 zsbo=qQNQPk^UWP_!?Lz9%->SMi9X;P&}{p_f<45-6e7v5)X)=YA95GL0~@fr6C zm)d(hU>Z4J`{su&{Y_>rI>PgSUESoJbn+t??db`}WdfLV{jMMf`tyGvuP_^)^2VSR z=u;p)>?=zX^P&JJhVPEq503hWu;i7TvN+buq=_|0351`oWMF(5W;duvsD&C zE3*D;1t}O|K}ks4Cgr<)*)Q&$*+*{MkO)Xr#-mKZL4^FLCB^FXth8|@7ga^Se|@BM z2Q0aZMN1d1@r_K0dx$}T$)X(d9|el!S=N6qz(Eg%^h#M%K4~}d&ln(G`}!dXv}L=f zAC~aUkB;b{UA@EypsACXUL^SEKOuvfOjas*$nMwGnh!%Gy35R;lBoQxbz(trnZ;1C z>#oWWk>A)W(NO4MyBbRmKc+{MP_F-8<8Yn>g_Mh1D}BL)f=SE|Fc(Puz2);z!4%UM zHBHncA@SR$1)<`oDn;rahZ$y}xL?`!Q+E%N`tR=RzdJd3m^4x~NbSb|HjsEHipB)y z|Mw>UIdl8}bx%ZF7^OA-eP2ase;W|oHeFHqox0t>BAdj`B^}G0o7x>6`tMeOsK%{d zU|!eXrD5Cr_S*Z*oIEVdqDp`FyW`$E82#Il;vb#oXflA$VJY5MGXLA|`}Y$DF>RR~ zbd{H({`qzPh{k_?i{<%Vq`kzZzo z4knDar@eN5*#c`5T18e8vA^xuf1OvNSW+o(VBcfi@V)|d6%!x|T&#cue~PjKQq(5E zLVz6uaR6d<2^gqG^$cx0?kF>3iyQW$~T zM8H&QD*z*N$yp#C$VI=$TEEKS2>$8Iju&C%vtIMofU>0+&;5@#`|DfquHduUX<-zg zgO;7T&$ZgA|At_Kknvw%#?L{3iZ(OqN#;Xk zY4)(ERLQ3aYe=7-?(`)AMh{&`@Z1K_|K^v9*kNe(``lD&L6nT~OXEGG|eW8lIxwc91g1?`Qe2kFM3>Yk^P30s;72XO6 z>)6Ch0&{|R0O08=C_^#|TdZ!3==oY>K>X_K6r3hC5>I)n!Gbfvj1>V%zc=xP6#}=w z<%(u&=GZ4D@qZo)xBPBDEKwR)5(`vP40~okf&^>4`vs*nF?RMOVD_Z(p`(=}!^_RE zaLdzt&wqT3jr)zKDvh@YHSFtpbNT8iOgS^f4siqfn&A_g$wnY_X98}OYd_G?>VjT) z-#Z1$cht0dAd{zK*oS!TW|FSIvEPe2(Vxc#a^#Ou(`5%7|ehSaoJaCaz^eF2d+ z9&CZ5^wDXcQl0?x{d!9t7X2@yYpEE_5*y>7ZxqAmP)8PwBaDDeU1hJx#p&S8s5kSH zP2-u%4uBN5-S4=v4xl;miAYMyer#cYzQ&e@gJsC1RvNqBz~%+QL+^&(uMUXddiB=T z>yLRY$kXee`N$G0;*7-#;$Q_F|Y&qAC}cag*#Y3uNFV~viQ+7 zPwWH3XH^BCKs35V-F60kpVAK|3LTeW!$HX3BL9LwLS_NL=h!fFWu_!~Gf-J9 z9L`7Zh@9<45pu|E+>CLBvMAx4UJ9ocnZl4nZT5715m}N^+Q&Y6e{U20btMWGm`^{b z*&1uw8A;p!R7J0$Pvk<-JTaHB?|{rWPQ5p9kt2H#a50_EXP1Za7YP&zPFpc<1#5)& zc)x4pXUl1&2zgd50a`%x1ZFB6??8zJ(l;ruN#6O^14-Z@#pDekuO)XrfDXHfGE3sN zUiR-UGw$jxte#qi^&K|>O&0`abi5W$!P&kFeCy6XDr0A2;bY{s*#R0&mpDLP(CdN= zK%;O`FU*NP5;hE25XQXtufUe>al;JPdT+azfd}>pCbhHBqwF726>)76L-5L?f3(#W zN|uE2Do_+Y9F|rE-6^1$rFf4UI61{(3i7Ljg100vTH-f-j>OPZIDn7z^K`M4K3GqO zEVLe@J94y*N7nz~yo1_zl^HAPsX3zP4)giuL9mD@B#Y^v`P85E%1`MrNNa9XN#zZM zJS<}q*LGtM>3d6NZ(eOV(whwW$>!xv)Ax{dAcSyOCu*S)vPo5pW)MKCClR)hk$22rA1g{9iT;5;N?j9hHJs0P_I4 z&VvbnR5vV~4pBS>60^p#L2V4sr*D^Xn7uG~xr9=qj>OI=I#VH@xa)%unH8{uc>=Pd z0Jwm4>6Tiku3zxL7Eoac51(g>5P@KTe9dvwPm-(*hjmY`(n99+*jOQf|9yU9 zG7V8@%V#fPS)JI0((0 zX5Z84WhnobFvo~BU}-Cr9pGGX@32Wcml#)Bqa{YU#mL8V77@4*Db2c7zs{rH^))MM zwHL&k$hYx9^#Jtpm|^4HCJ=0U(#G^UIFPmq_)Yv8#3WhhuDF*cxs-?Vp5O_57SRg= zeixLd^G70S*!d_!h8m!US4-lmQOh0u{X&<#=)a1aKhupb=9qS;6JAy)wVn+yzkJ2- z(Jw*9hek!xN=G8j2x9FHKX`&5;`LFvhJ^ns$u$l7*{4Hnry$JWxjK&N0{lmyn~eJ& z0$GMZ*G$VEr(pO!G$BCBf9mYRT`nZ%&}AjS6;vzP^OcE^B^eDuiiHQ02Ig*6LjI@o z0BAZ&f*dq4D~;CnbOw_-NtR*~9!`g!ul(f&Vg82pJdO)8J0PWupKS?N-*k2b&Xp9f zNYaPEa@>Bv9HSiDGmtI)xddbMfyosX02arHxc$Y1AsKWu@U0#{@u#fC7hnl5QYjQseb?9%QJ97XVI{j{v}{3xIP(3iiahBuE$BPPaN*%$`&hN#a!g zm#*NSrw)vyQgyy^D*7KWtuSMi^qP=GylF(0z1x^vYyl0^BuC4P| z|7T1Bn&k8@kO_?cZKGa2?gm~juK`;=-f3dv9za5wV017-U*8IvuEkhXQp+8C1LKSj z>J0!NC{6++h*|_tCLP@jXPWmPU)Ef@hUb=k-3#P~QQP{2J_w@ChSJNv6bNY}({@xmIsu2qnJvtyJoL!kj7IZnBiX8j0;N|#Az zbre{fS!PG{oA0_9D|jZIl$Gx03eY!UTzaCNX4#|dfri&-yu^QPn@1SD?Id5kkC zc7B}|ht()s^_a~#P!7m6OsNL8GrYz+1Ag&Tuz}16IzRx?Fr4v=3Z|%KWcgHk4_ar) zAe~0bpm(K)xM}E(tE>W?OR@8B8_8%i;`csED@$m@?;mhA9X>Hue(!~EFN;ur%cM|qVVc0C3w*5P~wdYMOO z;{5C+2@@X|KrY0Uixe2p1y&FkR7N-Ec&?Jc_+c@v0?@`+r72^JTU2-a?%iOcx_>P- z+LiAL)2vwqjWtD`4E^j}p4s0*f&$%j03N|lqG)tIOqh4Yu$RCTk(2%#hDfLIMm3Nv zCa&!fMpu#8|K|`)ma=8JNSD5AcL{aVp07Qx*dDzF--sU@2Tm&fnQSTg*IvP)_qUba zBf=}@2R=yq519k&6VHPVZunuzg2goaYk~CKn;5fr=1r*z10N<* zz1Q;Y{%5q0rp6E~ihEQHiM}{uU`%UII+UbiU9%@&1jZ8Nukl*0i=j~Nf4iOsR|1Kk z=EAC@NBn<~A?e|FK5iH7>t3=L-?a{{diX^7*kHD_lXhnsftB@ ziZaaZQ~oX&OXDNx2B-36JTI?__S*3;>zc-Ox*-~|V-rPfKUKmiHpjcau5UOVUn12t zg1yoqJDr`oNIdzNAO?yBR~s+nhtTz$W$RK0bPs2+hJ}HiLP}rivIo3X=O%j0#NL@9 zj_s(4DK1ut?_W!2hUW_Y?KQ^j-Vb83Vzbw*0YKHH^&L@=YST)j;Kk`quZR^u6k^i) z*PDIIWQldFWnB|k>e8@AJc~WY6372NJNAww!yesUop!WIWgyg13Pmg#1-r>LnW^muYWTRG}6RDqkJq z`c)Q~6E1VIZrwX|1}eFx<)8qjJbp&{g^4G(=j?TEr9|z49tM3+c{RYh830#xt>Yct z;l%Z9=qZ!71;vylNk5<+81vf&8k~p3eoerH*qYyY`88|Zugr&8YHqigi(21`6{wwq zWlfT*K#>aY*Pi@o#q=vmfo!^l2LLZTD9#0sXdDCiH1IqIf~soyr|Lf7EH(iG5$qUQ zNeqqP;qXwQc6dF6Lk9v+w_iLm`r!i-X|N;@6HHUtF_P(3zxZ{ruF$^+hAPfGKme75 zrgH2PmRfP+$>c`z+`X074DsN)5I}ZTH&$&Pn~;w+6p!}22)sg#J_84y?jyI~SEm0z zU)kWpD>9+mw{1>J#?CP+mx5)X zU^!A!v<5F1|)4dLyg;K;Y;I$DKXuk3V4pTwf3R55;PZl(uANR7mYwPl|z=U6c zrqfL|(PTWFWY^--_Pf21+l?7^_pQEJ0y~=`VQ>?iQHG@rk~-RN$^v`}8_O&xTI%3@$2l{Npp@(bvvSJs0b}Ttl zB3z1nVjH1ieV@abQ`4^zTVz(o&|$?3ubjOZ4jSsRG!oH3s^=XSE7_zRmgV-$)v7pu z0lijP=n|&aDoXY64Wt5yZuamUy!1n(!E zIo5$OI5$XRgGKJ0WiszD8O$}ZM%g}P_JEQ;*prIIf zk2U97M8!PvphM)m|EN#QK*Q?U(Kl%-lt9T{G55~hEH60mXSY^5B1qt=>WgPB6-vZy z(LkXfl9{PMaX*ikxRK2QFu~-UTdstPz+}{dB&zr`245J+3Eu=!l2mAkcM%{cMoU2G zEi&H36=W!hOr&uM_I$tJ4SUVd{*_YeO|8r*S4 zTE6jKdO8?A_C(kRrnfA20@E~y3FLflm?hU0-(Ax^?ci%nJ5E~hPVu;Zq8<0D$|sN; z7G}RDb9XSwNRTju=4jVlQ2m#dc@8LF)fqhp4C@|^cvLMij+Fbl{EW)2K4$spuB>{X zAl$$?#5J;LUb^zh5}tt6{l#7+)K2B2t!Bnwo2s55Je4*Ms`0RSDqs2j12*{l`ICaO z1N9>3f?l`4h%b5N(a3+DiUrr%cxymD*bNe>Zt&zNS*q+n2T}l!i`dZjY(+1H(_8lv z#yFCBW6JwLX9viCv@_O}{1SH$Ze=LPz1Av?L-3}PGQ$eG#rEapv)}cM>yZ6Ve19YyUj(<#@C==??K0y3=&GvNr`UzN04EoGmMTwUiZVkZ5nqe zAkt#3gMDCpnDLcjo>DbuFK>&+$?U`hhNpmT?>xlxACrl-@WU`xUpZlqZW2dll>==2 zO9{UfP@Jtr2l)_PhN&w?fFQ%jVB@5O#Lf>sU(vgeGTZ`&cT=*cZPasRx%ZQ3+HjI< zim6jT7lD;PI5GZ3;&Nk14JJ!Z;amo>`awuNh>Zf%_V&1bqcV=y1Nek9zY$7HEk74N zgthQ<5MyUT;D?z^BcP;Mk2cy|Nc>?GA(Xs_CuLS#GowA01=3X31dNm3SLSfgW5mdJ z14B)ucy?W1gyp9yzzXQVw|=Ag3)AX7*FS^WpSc-?u#VuXWzoMYtr7yq{mlue{D6p#JkMgH?@xhT(;?#u8s7}sb1TXJD@7Bsk`&77Nh9>1L#CVMUw|k z)z?PHSYpk3zzTm6*3c>LJ3t&*98)T7r>EMwcBw~rLfbZ9>dESLb=@C%y4EDr+JWz; zPtv=G+_g`YyiTnIt&LMvQqC^(CS0=v+^HwDq1*n1%<#2s^Qf$VRf4rc4BcoYtf8i{ zBo9r|8vHamqXI&0I=38WIhEBW)U=0hbnHz`F(G2Lqi8nMjatvj~k1wtgiL3a=4911^*yW58RDy;qNhT3jC^ zG8~WTL~X$eHIf5X!rT&$ANfWsdJx+8z*ZU=y98d}vN82c4Z{7Uy+Q;_vk{2%GLWUT z7umAP)N3KZJ_!qk-fKT_-!+}(`! zIzDt7xqpTq%1JYkAJ(UQhCe{92w685Q4U1Z%Z^pg@he;UT=s`JfoSIjGqxFVdqh(jr0++-(lDh>O-8*Oc}XOh z6fbrO{Ui5;ZVBGFxI>`$HTt#WBf-dh^eBev2Fj_-*Vl8X6cF2GZ?6Q4RJl_uj6ITL z$D+Lj`2bCJm`vY&Vcw-r5{SEo4m|Pm3^}Ct$`#ln2ck-r($R0UAITgLkcrF)(}anf z4$Tk}z~~1$qvASMW@#hHt`sTiN+pnXIKSt(o3CC(2EjiEt{RI)!2k9`ZG`*fnd~Iwa7@bYQW>1R>+4GHBWt^Ub~!fK>*=h|{5jsW>>}F;Oed>S zV1&#ZaDRH`X6NVC7p8i$3x0~25h68+s;_-4{C zlB-7*lG>BCWVQR=NjnqI4cgA$ZQpKmq{sVVnmwVg-AReQcSZ;q*xg}+eNcGtK(NnT zzNn*QL&Ns#UZ&-sRt?%wFK3@+BG}7r)`)0twl*v?#Y_Jt&M`Uh8B?_B#C#la+{XoN1o)${@L%ihd;L;GTNCvz;3(LN{q!bVLBuf%bwo2|Cp1 z3n}8Z8#cXldDo@lAhSPv&cvx(%imZ=c)njGk+NMUg4FKLCya$TZLiJO?z`9(u-<5{>xK3$|#)heiZz=LpKzyr6(M^bJXs`d0^>w~CIuDe_Z-W3M);D z#7cH}O$DBgH9JP*Os(_~#-PhQ}SWKycCVXfC%sQDPLuyy{s z_ee9nw}$iMaTH`7jC+jt`ka=2kcHD*pFAX%*mKvsW?lCL!CS1Wgvg!~A9Qia*Qj245~yXYgYc1c>8Pm^FO|Y4v(bZp)-Sp?P>NfM zWqg3(dRapyLr4F}kc5Uc%+8W;=JS)Yv1etWMtZ%Gh!)T91nW`Z8WKj)tXpEGvA+H6 z>)wE6F$S4gkFPAim6xp7F{4=37pjso=Pbin#j{Yc5%?}2g8X_#{Jfy-=~BGvyL!8# zeqKpey<0q}y~riOV=2AV!Lmr!HA17g?;-()By_BT4LH2(8!vlHr3_r9*w-hmjJ-j> zPRG5#IAFyVQKs3&;o8l(bZ3|mB1l|sO|r@=?3`X)GVHG?m`akGaAx+&$#($f$Y}qn zoD%`%(Z0~WF|Sl;ohRV$Y9kmQ+}@`ZtfMN5XgLk8;cjJpKgv*0zu?@>2jcK|4t5NxHi_29t>%5D+PcC=0 zm51~M?CmTgjvx)wW_bBcA>sW8#}$Q{T(}36OUIJoWCM#w=Rq8r(zZZhgYm8oU%~B6 zg!63)T<)5S!iOy>EnEw<1uJ-vhMBkS*a|NPs-#G$xth6F(w^=9(ADR2`la9+ex~rT z1R0rSifhFA*y^I@oPHX!c_e%SHy0XsI~Uy(ZH3$xjx3So+s5DM^p1_vpul;@2q1NHmg87Gi2Q(U3X4tqx3MECo*g=zJ5_o#ew7({Ar@*%rhg$lBJa@fQMgZwpkHm)?VG$`YY1Q5 zBIMwj(c{#>bN5#Xi1VQn<~Cd+gMI(%^Vif&tRg*AjF)dX+}?jAh*N^y>OpDAQefC} zddg?tcr+z$0NA`F2m#g$VXqV$^YtTR=(h|)>3 z%#uB`P7=vj2P*Bz^8o1kMO1Z$a&U6pGw`S;6M?rflC3B}*bECuhli;1Z#Lev6sJ|e z`90D18+dq&fcQ)_;PPiOkxR|p!o)BieKB9qTd%)d?@Q4_e1A6MK3pbXk+h78annmT zFsp^HwxRV_#AO^*o*NPJ@&1Yltc8yn@9Z}FyS^t4Gwk}sVTVg$GKxlZbZhNRMA;vG z4UnxnjMT72tDBXCOkqd^_19NhD-bu3AZYy;*=Oa*_-9P z+O{e2vBazO#Nqj6GPzmWn{MvU5)kQ$WOl8NdmUR0?;7d6UU9@1g(;90#~a}qCbJEN zTT0g{rbwjz9B$BQI8*zGD?{@$S$EQLS#g zu9N060kOG5kArxcqtfh3seDq??*7&C*T1y@6mGd+v$JTZIUBU>YTUiUvqyfE9wtiE z>Qtt{IDXIoFf{A%tm3&T84_5`BI-%*;$oeAnsK4R#8W}&wpXFmlrDR#ZIQP=`}&IA zY17VohE4n1;X=G}jjw!z5KMdI9g5%Cs6KI!J_L366d4VwwzDrSQ~(Q-JCaLC=zGK# zw7H5);+JJ>daZ_Gdy|H+m=}F6=RNEec$50o{9|UkzV*Qfe*4A466BP)aLS-wA2a@e zH>tsoRCeu)BSHC4)d;Vhn=9&J*6lgNjHsjLy@ShrS59Ag+#qQZF8DZYxVtr5x!5%` z*%ClqolADWW{tF;z}{@eYU4y*SmuNIgO--s9!6Tp@9yJUnv?60e#gl_>3%wMXB(2}nq)?LSJFr!TOqv&{b}EL@aAfx}UR7Jo8-yFLCo=My>Mqt}b` z#n8R&J*GfChE1sq5*6$}0G^j`%tfFi?2|Wej_FrVLvg}$&&XB{XSY#~Zks!C)|<%; z)7scK=-)SN6QDn&u`Z$7kjxcL+p{r8d$FeY3rAuUImvl4$4kA&{IsaS67JSgZp7S; zQ+8FJ@exIAKd7PMv!?VgYi8ki;Wm|8ZDKc>7zy$UlRFoxJVSTs)*EX4UTZfv8JtV= zjMS#ZCbHU?y?=kDJg+tG{jOtYP8t5(vLdeWJ0^9$;4Q>PpeF;_HE-h$oix3P;zl|? z(pZ+TmEuC}Mjde=I1HW_>Y>m_`jHR6}ys zSM($|oBfyapwpjujWXzn-I;Y?dlyP5cL`NHHBN)HrktZa=WsEf7s#;SHE1l;USU@7G@=CoSvzvCUKNLN>)U@@ z_JG3Nd^zyTIBqPK-DQSULm48m^A9+hcKutli>`Tj(G2@J7G!Hdu^YFk;nj1xVPdrD z7asRg(^j~VH%?n=@cGN%t8?6mh~dwdLU?T&+@U*f`&2V^7s9HWVUVp5B-W*yw;1T1 zY}+VfT)6r*iNQL&bgnYaZaJNBe&iqus;W}0Qnm4n!T)U#i5XF}TgDKj!BN$XMPkOO zGB;3nJ4>pVPQknDiiO_m-@@e1xxqbQ5V(@`6MV&V^p#@o35<#Gz ztwZtIqKeUzP*pb9N0zIBv|LC&R3pM`yD;R~D6s3LUAtKKrIOHNUf&GeQu);L7D?ls z;$GqV#*f#&#fSOC*$Xm>D~klE#_mukt5>ZLIm3Z6frRGK9~{Kb=a+I&Q+#_s5^u64 z{?0tHE+1_?&F!w?lep)^L9=8ln-$u`#s;TO<31$;wplfC<|15ACXa+C2)iZePRmvz zf*WPZx31<5wmn0*S)FWW2QAh|%v-_tJq$MMz{sc$k`*u;FkW z#W$uA2gMn7ola?f5s|~@&)#3lA`b0CxQbO~+>#>%5soCq-+nT=@nEt+54MnJ)dtoDDz!WzNC1!cDDxn$II`2!tT_3`<`pNP4SSc^VhU#fjIyIp zgT-DeJ<*eRtTjy~VhqE&^oa^`ZjDq8PP4>`5RcaUf^@cBgfwI5Q?_p=w*t3W)s=lk z$O8!TN9LH=hN@%wf>qy?>iaXGoW9w{>A1X)HpK7V3>_GAFPK&eP-iv)qq}f50$LV0E6QZz5p>@jXXu`IDOnEI78-$gKn&OCOj!Wv zQ&%`{OQ6Q96-?v0UztpN3x95`m3qF_PN17-g0%u4E_XyfF0SWG?{J3uB@2C~q{zM8 z<~`pgFP)|Lpi$)_!9b|xZ7gIr8kWNfMB8hdQ1H6*m0m5+tH)FO^KCQhn$n)}XrIixB{J`EwNTbVjrmT(k zOjoI~Hu=6uKStFYDm=e<`*ZxsdKU9VTOm^RqPY^mSg>3BipD*74^JbTlp&1F=1%eV zld+sTBh>*%9XcoHHIVX%`Ie)-4uoer^+AWyiDbAbW1I+SyHV202g@t9KO?2Jr)Bhj zrWmz#3r@9y`~1V4(`qnGl7PeAbW2~UjBWrZ+}Q$fk9YMk+q(K9O-_(FDEEMPR*-s& zeWl}8YSe{n=hT`>T?bxm@Ty zCe6z|97X!GkK9j~{qzl$kN!@Ph?h{yaq!Uz#gp!!2jSIKJJdG3B4K?#FzyB3xxO3Y z1svWD@_iTQiCx7PCnxOPp)0AS0`ub^iB3<0E!Xok>0A<@i}@O+TZ)c|GU#31H+aNg zaK(i!YSZ^6l`}Cx+-*>3(swh`X~*xK-46WG+<;f^Gn2`dhTZ6bR75bMwC@d+Ly)Cg z2uIw>Dm|V%!(tDSp{KwnHoX-LuVYKD(v#VoZMQAh#(4I-4`;G+%RyPU%g)C$9lt#C zT8-8uGtn!%u zWEeTuX4=2TTZ)+m8x3zrA{b|G?~A`~uUMVov3My^_|PCH@^Qhn=ZGSQgp%{z+ruI3 z{L=&`cYrN|(~_2DbwH(@opCjUm$e%nMz<=;8)Azya${v4!ngutq8FFVanf$oBlHl* zN$8z!`7G#dF z&uNeKFn-K*7?-$ldzi=ADX-GzeYi$okw72gz+~m8CHO1XuOIDTJG{NM=l84Ca&N5D z8 z$X)1d^Pf8(Job*%sR{Z*am_@KQjjd4`2F$Kd}c|zjT0jmMz}!xURx=U*Ousz(HuBiOp7)4I6fvmHY;+TwncR~ z7DqyS0cJpcG>}TWwx;9#N`zv>rn_Nbp!Qdey{MSA9mHZ_BP&9${+sgKMQ83C8YrAC zF9Sitv!z<$50(=)Rw73B9JP0ZZN3dKO5Ap#`SR=B>66b1MAt)9-qyF@Ht6$`Ni_q2g&{IH}($s+rXyoR!pA9d zcaGRCx#bN~PFfb4UqfF6@lR2jC1x2WlMfU`=@jQWZ<>E1^OqSLt^Vp;E5`74fF|xT z$yLskmyC@0m70!7nrJSolT)P_b$fIr{B7jGoVM<+!X+5)Rf*!&3S}^3#C`7zfP?ki z`&;g%o4C4qq&|vHTepdWj;t-wGxDyD_?ZmBBE1kug0^}tLg*I!9Z}r2hIA;dpgSKP zNqIxlwnJKxHvLh90>sjq{Oc{{``Zsc0DZxsmyV5~16_7vOy1t$cuOz= zNWoRy2hkja-}ItM`GSfmZvpu z^!AsS6st}gC8KI|2P*Ah+&ha4sE(Za{Tg`+*F#J0Q?wDY5mmdtT?WA*p7H&0SExkx z1sl3cMaySp>p?l&Z^o-a8P?Ols@F;FB+SXIiUpAzvTv8NT{d51jBUTsxRnm{MH7T) zuQheb78=yi`ufy8gY9e!1rZ7gC^#tV#p@Eu`E~LXdd+JwVOQ%1QFZfn{E(rQi4#GE z?U0;gF2v6&UrSZ{VfHFGmt<-CeV6|>`=0+&=>Z)|UQSaa_*p5kJ z-g9jM1sCNH=4p2Pl0`@8yO7tdP7!ue1{QZ^TFPP>Z0_Pazfxyimp)x-P7!{ptfRc6 zKMmilJ!uNRGdZ}OS4TLvy>Bq2iXHDDWS{2vfurz)Wmuz(k6!`D57}b$`4-B;`$s+) z6$f&cLg?2a)A08I*{#WRO?_l=(Xw=1XE{w;!@!nBd19~K$#Yp1S7{Yar<_t&DG75- z7_cpzn{etBC*W(flXch_C;MS0^%}Or6y*wY;-tziI^kEQ$U7k)x#L5W01KDKo4D^5 zcRRYxXV3wqTPTsvboaot4lcwjur$!OBeOV_aUn$~%(?~2! z@uC<7YYK08TiD5+%w}HaOHl}ZM3UK*-%_LE{G0j5eI?^c-^plxRd5OrBlKKLnEJ8?llXxj<03vWu$4*gy=4Y9wa5$kqe!iC<1*Z3>smqC+aW4{HDZ^7 zvEY(lV#(X#MlN+Z6ufp1lH5a6l*|#=Xt(9k!;?RD9)AgcpumN}KBm9Eu}Oo+(9T)& znn?o>msGPZyIkx5?`E>ca<0vRCxRFwfFqH`vyCSXXC449+t6 z4lZ%&JV8^->$B7|vNIV!EHJwOc84{DvE2_#e11(Z?gD$7WXgk*yn^3Mi~%A5>2-Qd z44AA69KSbE;zR3an|+EJc$ez=6EQHSFy~CmRpiHZe%Oatzlbh!OQF+mBoAejJAaxM ze0*v-&Ig^IHIn;d(V(D-1?+RUfy)BD5t)P(W4sP=2ee~H(qN3?=9Ru(p9 zG9}TGglvWDlr&j2p6&OF=nOnt`%QenXct}z;s*CmDhd!nvVXAVX3t4;ggZ0kf0LF~ zKN*s~)J7HSx&%8?u{DoQ`g7YDFGoM)wU#G2wk0k37|nXQ{S{Pxdp63HB~<>GyH?#= zcI11}TntTNQ1dw&a9_S){tNCa;=iaxf4xu$zWxnIm&(FQRrS9(JAa_t>8BXPw2w9H z_W#D-9i+kF{4?6sRR4v5{R{K`?-$4jaB1if6UN`d9RG()@rRoE2dD;^IR7_(4ACD% z@c@rbA?#H{!EP9E1YjmzMW>7Hrv3w!`eJ-nRK$q0NG1}nnSPlfk z)x^V*e`l12h>I$lg|;Z>{&mM+KPbVFK690G5&=Ci{wDY61M%+vuf4a7t14~dMuA}~ zf(S|ph~QW>Qi9SV7Tq06H`1Mg3W|)!qo_xeE`*Sy|DYue9&1;~9QzE2j*TODBr}3ud zm5xg)pc<;*7A5dN?Ri2+51m}9S*P@*?+k&Qo&%_y;-%xV=34PiNvQmEmefQTp5;mY zPjF?<{dtCD*Ufdb3YaG9^k->L1K=xR@VHU^_!%f7H$9pYQUaDmB%&nUBrVP} z)nJGCs|QGN44G9^4~vlduK+5F4dAT>DRlaP%KJKv06Vo+v;$;gIyaIUL0b1a)nmFT zL^EDI(!`f@0xKKPfkj0Ksf|%I-dzn`40V7bYjyyP!V)`R&3-!UOH?l}+Z!A`o~}Yf zagPCPc7uYF-N0X(lM%GsxdE8%iz@L0jpm(cKf!a%2p2>6WhUoW>LrBaY|+S&k6*J0 z;KT1axxnj*7<_o;k#bWc-)L?#P@c~Ap8a^QK8{CX@%a*hqeIMAa(7r;xi!@sme}Q6 z+dn-lzSasN))sI&VZcr-Is!O#R|$|jbtb;NHaP(>IV*4|yt61l3tu1Lx&JGnNX?E& z5g0JUtbY%!A?Gi$>G@^9DMrxAEDMNIK7wYH=8O(LfMtsNB!TZ}PW+Tm1H5A*;iqah z6_6hPHvr~se$Pht!#!)r!Nb6Xo>OQTnu@y6ed4kJ5)&yQBVuK52NqsVmaJxD{0W@* z(b=sR6$J0Rdim`9orA^fW?%v@b-VS4A_iprH$ok15D~3>L&yxjvY5)}X zReAm45$v^YU?$Y+T7$>^T?3khg85n0m4+w&a%SZ~O$wiQnQc5x)m6av#?N ztc%9naa2ep@gp7A>lqaZ!vN`N=Z|{w4G466QoDIT{#hdUO6e{3v)+k68#@jGe$bM4tB6kSd4nh+C5wgEuPpx8F1D=7<({D#0S9~qiGZ2Ry02P*u z{CeJ#9O{pUsWBbltiTP9H9xNp{JG^mAUKkSZ@@J!zGWyx;`y0byMd5ItQb5& zXBC2XK&3srt4A)HIDBJ&A>-jp=2N1icIFhvH@-w2m*v{Y;&a!^K$CEPE%#@&%qf2U$dAHGrO8zYafaUxUk{80WF+X9GR@XI@=evt^?kXP zIXl4tMvw2~gZi9DObTw_aq=XFWnFV`6^^bj4a}v8yxhF7-^sO<)7b>p(mHh~K(=5* zAn%O_zOlG7tsaOP)7JT$xwKiYmhzUZwIkAGE!xkZR}@N$y2#@%cZ$Ah1R z(W7odzD-UWefO^w!H5xEMV*t3V_5Hg@m2UavQxUl+uj0)Gvnfnvc7kwFOm={S;c)l z)3|f8G<>Ecp!2wPP2EFEUxu16K4!q`Z$f6Yu;d@#d*mfT zYJSyU#{ZObw4}a7=*N={RmFF@E7`662aBvrPTRVrYBP(ve3MEmxg0I6rfEdwwCNa+ z5OBWjM#2JgZM0EVz;zFqj_EvfZg?;KH3CCBl*|`6;=USfw5KKjl*Ho=(%8N4P118qVw2A?G-&Q2mBI zRgSL9fZ7DMfvU!sJSD&Ci~+I;iBsew8JtIwr@FtL|M!4c{wZjJdW`{*FOef+UAusQ zLaT?B`q?GdEV`CpH+g-Iq(I!FIH?2-O9Geih0_e?edN9}r26Y9W80@shizDF(%edT zTB4LDOE>*M*b+!X%_Q;{j?Nns4E}H&nfvG%wnU%h^$Fmc`b}ZHCFeM&JT{|;V}nVq zbpIJh0hq{Jj=z|_gEBS+4Uc6%Vzahe1NVih?@p3DeHB51>qt}0ASvl8Sy|d)Bpfrd z?*v-W&%-JWGOb}JEOu36TTS$6FGA7P?F(zFb$bDwzjl$Xp5uBurBGUHvTO==$^A%% zBME$dG<3{A|ERkLrxemf-i3l!>ZIIeC7NberPvcPHSaEyWULC(cZI&4R3MOGns?+lQG4 zLuZ!3%E01)v21t3>ezeRz3oDGn)P%==(=3R( zt}oZHcXrA|nGORF0F}lmJW5F%N;&*r!NN$p`XwHo%}v(rt+lNUk_Q<+c{jt4UyX1T zrRfSq5)Ah+^Euis_I)0o5j${dzvPzu&b+Oolt3KV#;zM~709Jq=Xb?~U2&MI>~h1RL4Q`< z+$dLjz!P>|HBeD70#NuicpMaTo8&(7$jai~`$m8mw5B@jEI;*Ym1V5VAZAc1K(RsS znw$>mOwLR8VChHr6a`vAW|x|->T}?mQ^J+aC-~)ssq8Ra{=u@)A!&8ONh@&+D(x=b7z0iliI>OE2Zw=YEWxteAVOgey)e1<)7t{0L+H6(R;}qXG4qlGFv*GTN z6gFK;M?YA?Hh4jusZ?H0Dc7J|g;+givfYVnAbGsJA?JgT-62=;wf(CD@%INC3}mbm zvxp}TxUgu8oMq%LBeCSK5aT9tp2{_dhDU(s?^phP4}N+C9id8IYwbkW>2K|^OSGZA zG`xmXf+?c8zxs9WEBt5~7j3njl5UXpz8Iqo9a8z=D*db9q|M`>@*d_^dimF$@gY*wY#GUA3Vp4`5L@fo@MmbJ1R0UFl@apYQXR^ptBG6tevccjR@UHYma zd;efAA#&*35Nr)CHY&Zp{Bl`>RFf>LV3ek#v?t03nMx*PYa`ZuPfr^H(VE?;uMKGz z9u&uN}xUM&ejDVlk6Mhd;gY9Lmv|h1Vjo(LNTkiyQnOpKKuhFhP=-n&izDI(U|ivf-UBgWp)J}&H2iLNIET}|<-$m5ad8>Y z8S{XetOUkci$HkE0@s!Ti=5x11}vZ^_1YPMronI-aHxJC;;>m(;hKEIs^TYY1tOYB za}iAChgmomyl!T>{o;Q4v15?tV=wvBNULPF;LvjRCQ08U=QN8N)qY9oTu=(+WJWVY zIpez;2)20=((FJT!cEhKGT4JAOcaN&3;s!onp>H)*qxeEb?6%ygYftGXDxC>BMOHW zu{&Mv0xC~|NWs%;ufiSsk=?aP)nWhWnMi~dR(y1PjNL-Bo0z9>!W96#uO8H@n*H4M z4<6na?%4Y@oQW0Rz+ZCcxFwvcIJFGcbiW;3@Wvc*V_Au{U`=0Ul;Fd6mzP@PS6AI} z7|jL`@BOm@|F9Kbc6-xU;nP8LAm)~Jn$ociHR~89T3HN2HAB3Rixq?a(GpaExJ-y0 z)6h1=pCvV-`=DSWWvfyx2|5${JI5gR!X&jSMna=7>tWN7?6BGXaQKLjU%Gw6>m0>= z-luZHE+pSqnI4{~@iB&i@v}JZ-nFwM`VPST0Omk%;Q^&t1^V(jl>0;4my_Q@e?i^0 z5!oW-!{sGa=se1V!ypOhvA8sOO*nL_o*^d$?ClgtFxw6r+!G~{$6(cUvac7 z(K4Vn(-S4|+snR0$*WwTgK)16q!*eDdQ#^`5L(K(vvysQ9#)c9a&pP>{=%|sIh&)L z;1gN@I642AJ2Q^NgCKHpVMKjL4|Y)+3o%8Pgsy{N!!v|0-~2j3q!1)< zic*VU`@71mx-p<%m+GCh{GLdg;v6tO!>xh+>}7#&z{{&mMvI>uvoHCp_>m<{WxeHb zHl=tvz$XxKMK6^d6Rv*ZBw5i&!hjVW<3yrr`A0Y?j>X%pBDx?!_3i?7k`_D9Nrqg0z6F zK_sY_!F~K)!a7;A*G7n2l1hSw<0`ZLag319(6ftV=Pogv9M154GW}q(z+0v#R_5*< zX_yf;x%lu`N90D1NE9S2z{+qOwKt&#EW|;uORW~7$Qcuq^ilV_*Q@W@zZ-*MMnuA_ z4Idfj=+zlH76KW5NX5C~3$lFDpr>cDo04^!h+ZaKng&~MA5=CV8#o*chB(P;|HV>7 z)z0G=D?d{*>fS?3|BwXFt1>x#FWj|gL-{g5?#ZN>x}5B`(Zz^md5RJlXXh(Hf63lJ6zmm&s1Q-MxTA)}acxfg;E;!bVj0L#F*+6$MJ zK_oiHlhyHck7CM_fe9DtfbC`!p3DfCfSHK#sD5%VK*wWv7A^8+R>kc&qU86#>!ZIH z6ZCbBGW8ZiyJ1Xvt}E$-@@u)2G3%v)?jRIlPgW+kV1H?VeN(^M#=qCeWs{c}EV;J8{{rLNP_qsTe`kvz>&?#ifCC zLrmxU<<2S+rJQ?$mPAyW0*{t@-%XGB6dCtrR^q@22#t^PuvR za79zQM{ND8MM339ih;Sx@`*AL^~>*k28A_tUF+%1U%vVO?y$0rMP!XZOiT+8*SVpb zHg`ibPwa3KdH?rVb2xr(L1h&3zdV15c{u+k;lZbW{ng9R&`UO#3NHK`p#J^IO^Srd zRet^p_pdHEn%gFP^*GbofFEw@zsK+|f)AFuIgS3ycVn60emHTZ-~ZJoM|Hsm2i#@G z`_=Q#PvrzXhPlD#*Z=n_d_Pbew0knTUfccZ8ArpI!@;i*9`&XB)dI$+wt^3i6KneI zht>7(89Y*lXJp@6<@K*VnLi0Wn9l0if)_`klj{N0;OQ{Rv3wthjO+_@CC&gR=jeSX$NkS6J;Dd&qF?0Y+oLs&BcTlS{} zP#c;U59Z;HX8)Wz`^Uk}%<7s}glo)y=1i)>=PDR0sizjJI`2(c!_0+v;WE+I1R{wF z%^UpN8PIUp2FpdymHvOPAo5d#6nt4lgN;AiBj!ZG9HtQzFsjPaX(p3@M`1J69sy~P zc^U!U&-ugqGjQW>e0h#sBRA};QPH1~=|o=yOfz2&{!efTp@nBl+QG~I3fv7L!U8aI zPJ>w=je0K3qT(G*(!-IAk(@>AQQsnj`~TzLYcs$jlv-nV86Gf+Cm4wHDabT9$64+S z6(KwA(i_&6y0izKNS zCY7NgN(C!nIVkWfO{6D!fze5s2dk272vG6MzeVtGk(XjjWzm^gP2}H195yT5O#|K{WUhn zlV*<5K1ef2%J^0*epA&MLu`n_BkJhjWi3eX;c$V-Ybw+gd7v`z;s9p=F)3XFIiW~V zFs4OzRxr>0#3hTKL?F)Hetf)BJ_x#l8la|wWg1=4UE%f{a&2yFH~5>C--h&o4$+CL zazack5fz~L8b%O+s5dKTS(mAGZ-DG^G2CY4GfadBV2WbY882#)kSq#SUoNBHH`Cl%-hR60E#%?0~gF}P-z?lX$ne`wv7Y3AGZRxCW1slErD;^YPpH$ z;ohwV@q<$Dv3+$QfkKg`ewl_JhVtCGXbKq4!J+MQRv&&nw2D6Gju$LfN zo`+f#hj5Q#vi6;gz?Bm+@fE<)>pHsjHWWdb^#YSej2LM{wL61y!;;q&j~ zcbpT>UbY=WhrDKZh!NFGNG%eF2m{}>Uep6;T@(XgZi?9V`!L(BuTA0#za{FdVKtg)?GF*L@H2;)tQ}&Z#NGVJK z_WP!=oCO`y%AH^*Y)4g4zGOaNQ`vqm%=r0+XlNg-#w9T3&gXU7e<5hVo+DQ+2*0X2 zXq4SNlwz_9vR^gyV$qA0Tq`B4B|9LuL11!oP@*jzQefr;D=-#C(v5tw%&ZMIqg_O> zLx9C4#%ltULyz;IeA-vtQ}fY`*G(QS)3aRz3z2yi9QGl_Q!rh8-PpD#^F8$sTk}OZcue} z0BNymPX@w|#Zc~5O%4=51-b;)w2cq*?r#ux^B~_X9#3+9mF6xL$|~N9j6;W$LJb*} z$k+`CFZ(Qu=cU;T&9rpxg*J){+I*_EVm}?>ZiOvlV8X4wTrhdg;oBb%tE~5r+IuaV z37g&of`)OU_P0GJq%#BH>E31slJH(}!54_k@&!f9YCfNzY7uHubg#C+H&<=G7lzdL z`O)+BR$C(NK}%#;bSL@FI$L=pQ$yKCzurJE;5>rH;{#+SeWp{Tz0`9M8T9?UFL^}Q z$ax)Yn~wbJNpMH@JfO#P8wKbCA6LCfpQ3;4EM3vOqpC>)hgh6(bve>RCeu> zy_mDb9n_$3{kAZTg%U>@6AnuZZKj|QmKDeLTk7R)UZXSWaIcNN=-EL#X86!ri7FO$ zzdTTwE~GDpP&kw`aO;Q8B044uvcXU9oM%UJ5~&Lp5n*<*d>QYos)l4sXxdji4MFsV zbI8^N)jp++-YAl==p)j;Tzr4$k@o0ff3~LBhM=XU_1Drni<#BWFl^T<>u2X`n58pi zHgFAm1=Rg(W?4ydvD1k$+jWH$0WfPo&HD2R$Rj7Pjms_wC*XZ8iax`gW!T&D(*@o_ zvGBY4qmqJppRTv#ch9b64fOnu-!7#f7sbbP{ISYwhqzWmFd(-hjX3tzj7O7&V_3aI_m=r*~}{g{06@4>R6 z<8z3310g~yt^(R;jjl{tojv=5!>3lKVVe8OZXWt|7dCj?!*(s6a7~I< zis9BcLHAt5$Aj9?Y_=^r{!K9qtqfohAKZW0_fvvDMGsr`M=sY|WYiWy6{Vq=Lr6^R z)5`0kCf_j#VZx$`0Vj+@?4~bxDT{%O`RWWnSl$$t#g60{bkk1D)yw&J*8~2?yYPXc zxwdRha4ljgjpzX)%JO-(YtN9L*9MO>OicE+KmYb`ZVb5$^1$rvptFBZY*eY7o%8HA zrim01K=Yl%HZ>NH4IY>2K#&deBML;{1*}sa1UJg#Ys#LtizbYlJl>bQR(}pfZ$>Tv zl!$G+;UP{1K}qJ?{1N+w;GOGh50)gO!~~xmwF2+Lf2BvsEf4l*>t^=eFPFmD4dt2~ zMt;f*bdbE@jdK(+5~~Wazc8JP7Qzo?Qjf?GBRgdeL!EDf>PlRMFOp%KwLL(@Cq~1)9dN6M&}9MGsr>#x9bTV^S(zX) z1hb$>cJQN}9st+~{d6gYDI^`)Fqs^LZ05qLv1g3C8={aUK-4wyxf4rYf@td#5_Vw_ zk$I&?=fcF}d0_ho)3QAspA6wm+vjpdS1zJfZy{{Lg}rpA<)rHxDwbF2KU2uhwHr)SOPL^3X1L4vAeDOHWLQ z7TK|)!rV|{_7Nx`)!TSun8Jqk_6Q(oU1N@137)he?%QWq*u=11;hcFi*C?6@V8a=_e^-21uaj>DhI>!ULbg^+!)B9 z>5FvYr=1*!p)?`2;684??67#goNm;ixf_`>LC*e3gw*b}_jCh-5CW{Zau0-|`w0b3 zWbOx`%5|g3eIsS<>*>CU!CBMvyl}AZxcz+M{=rW92?eWqB;UiW>BebiG_+e1kM9e} zNLdd8nrR6jbGfkN?h1|@J`Veyr#@{XyF3Kx+UlJ(^5ovW&zein%gWI@B6MN+sqYiD zh)IjGI6W0GJZXCYxyF`m?(R2*$_eCSX`}3>oWVRq8GwReDWU?!v(GLhjU?o>bY8O9 zm}$)i=kkJm{anRnn}oB)GCtGpolZUJs)pE6G?{WRSCwHBw~bhi+nd__6l27x&2I4g z^*XJRf+heOx4}H3D8M{LHf1`CU;zx4*TBC*p2Ch1PT-&AMu?QaW|Y3ayYinxB7&<} z6!s5qBfmIx15!BiPcxPO^ZK8Ey@u4BL$6qWSqD>dK%q1Bpw;7-HS{9{ZBck$_usSm z;U@_bsDm5cMx6c*jQHV=@2Bpk0^!vBYRk_B<6q|xHG~N*0dgL^2fu0_r^*myx~be-G-)Zw_Cl{w?QEk^S#4?q*H^{ST8(?u$Rh{eRy524Ckr z`SV|mD3D7GcVTGO?$$33iiS~-bd5MB&iHqm% z;QRT9!Ik*Gy|He|Q`=g9UM9c53MhHQdaP8wuUtzvSR{Sm^+0FOs!#dXH_|HL2R{Yj z60ZQLkOJi=Y^J>6ocPaRLu)z#bLDH=-xuodi&w`8NvDpyi=^@|zL?u3xYj|M6k-;? zda$yD;gVQyk>vhZ@cr|-%y19y^o+BS{Qb&5mlB_!su-Re?f(w?-{t-OIR1a{K}yz< zw@PC8Yt0eLkHNak2BU;Qn73a(W;5uj1C(0WJ=0RlIVtEZ1r$Sl&z=XVnjwreyP?!< zTi{gK$C&SgZd75JWch3Y4CeFdZ-n_DSJPDxAR7-jb-i9Q94RS;(N6|Oj)^A0`uaLD z4kU`_VZ;2srrcBrsD5MWwg0${r1>bUZ&OE4M;(vjn-4dMluI3-qw7wMhA&&~t$c}y z!J^jqL?wDx8*#OQEnV6*23m?e(SoNBAm#ZmVgS(jWfc_Un})hDA}DSS=i->N`Y3^% zBO=`lV56rnRQ`Z8B=XFs8aiCeP7-A0m=;MI@!xjIW3+e`a` zLMtd;4xfVhL;BXrC|@qlM9Vx#HzS==!cCedkjuYAz#O+h3_3>TYoRt(6mK}MQxO8o z)?Ur=-oZk}@tqu6IDqmft;(cM%SU}+JLW>eY5;m>lH&spJ^l=Xbwm)P3OhP;2#^aJ zRfXjU(~jF|g-kMvAcuh!Fu7_!)UyiVE=oiPR+zn7#d} zirG&}lRSA+pj<dzr)5X zZy);Si~~|J=z!fcYJ_1Wp-DpaA4Vfk$I9TpTMw!LoIM{$&Mso&q|PO*PuHIvype9Z zO4Od=e6+s}a;}32SPftVj%%(3WPe56|Jky<8KVkUmSG6LT7|eYK+74wOc&W=Uy*>J zh+D47aHtUd#8caM-?wCb;xn1p#>7^{vPg7~!6-i}swg|26$(4ps?9U6Z;daUy*->- z#%|KzKCo=_p4}i%debsLe5dwQ*j_!|_C{)}(Xows-#|B=@do%8pL4iuJebdSZFJB1 zVNvhig3o%9|4``52wg1(neAhbBD^vxQ2)wIr@p4_ZsGJ8|WzK zk2K~P7nd6s9x?8anf{lPh>T^+lVyEQBE8G-7GMv)fqsogoR0qB>8JKn z3l=mu6dxWY3#Hs%u<)N}pW96`p%r58wULUv*`3Cnb-MGYg>b7l#DMQP()NZmPNW#M zdm=0Mhm{^VyxM1DCpC+x{7@_VW{HUl*U1%@!F4{JJ75yTFp{-4t=^WnVGf4 zTiaiDQ$bQ@c7WBS9V$#3^o zi1N(mO3cc)=X5)i-zm94z?0k9k2E(4&gcBBj${;sBBF-`hq2OAuR>-Fm4dIJD~U^DDd}BUkuN z_TGhYt5-fyjZCF3*g`rXhMOuV46qmA;{tT#5(02~@RrOo-xg^(Rgu{TdY$2gUOS^6 zheie3ckqlI*=<`WW(v;6u2%7J5V9eTa>ElSXw<(LboffD+Xr|p6U0O=8a?cfs}BcA z)E&o(`Pw|8VvWaO0S@@e`m`TaME8LiMIiH*!a@KvoH z(1945PXjEC?-E?b8`2C>Q8C@VrqIL;w%Z@Eoy0u=mxLi*VVu}Qpy}j63w5B2XThY=>1mGw_N2S(Hm>knrlj5GVCL#g3OOgX$Y?oS#E#Aa zgy3scH6(HV(6gGY@}5@d(j9WqVJAF>YSdxZt}{0@MG7aZDS~H^X9Ze0=9d#bntKm& zn2l99zAFINi&XF$YT1NF&+9vkC&Q41n`D5G8jFW+O681ie3`WaDMX>REaWK|5lF-wTeMqU6nr- z+8T^#a~bXTE+wa6kir(1j*~|{n**KQL1;8hi8%m_YB8r%%p&CF@!e8doLO*sFxzmq z0;I{e7^;^nt%QdXXfc^FXh9fcyip1e8+X(WHYc-l3AN_iKfOdOt`N>b7@teoL3^IN zr*4FuPDjlnDJQv{GNfhCD&Z>d(eh$I{YvDaG+S!xv6IKkxK29378PHFN zr6XSXKB>B(6<;Q=A?C)Z{ek9ITt%9koveh6#pk`4ZuNkWgx1`2>64T?F{e_*j>>^n zBf&M4iR|1!=2Jm=b&5`16{p0-$0!p(pD$y$Vz-q-=bv#k!GSJ#ZXu>MnD_-vVx1sq z1|oqHNvEw#yCCbv;&e0Sx-8!oh`v)S0n^VCT{R8U2`yYzUTemyZnjYBU zlh7-S@n&G3Td+uVjolYJG4gw-LS)&ssu*(LDSyC#Zif$@Fm{6vdvT66HKsMkJpjNg zX0=;CGg}z zkKJsy>UvMA(s>J2KR1%gksIAF$3H*6YJwA)Yi+g2o-FJ)JnLJ2+=d!w56L`_IR?^# zk(soW&xpON3L?kwPRv{^uVU>_p{h~CcLZ+zZcojG^=1m?cFu;r4%_DrF{bH|GX)-o z8FQ_BDyxl1YXsP?*)BpP3yvez3mt2nx?)zH z;(pE3%W6j8>eyb7`@Z&5Qg=Fy3a<5nVnJoF?=SQs9ln!n9TXEeN z+XYRy>WUh1FfzxTU7V9gL-fi?riw{<{c!(^vRJ6P3Y=pfPh`HR^?^Six!b7x!$DCb zL+IBQ2jctFMpGFZsus6XPw14jTjWm$`@U#gE*LKQ7-q^_5Nbu%pZ+o;{N0t|h4o?T zdf)4Ot+#P4WcwF_)#OThzS85nD8@C&8fB!DD8v6nH`bi^wwzq39gSUP73I<%EFKyu z-yZEY=rS2=QOq@ZZo8b?s%9}rfd?Pc&$dm*quHv-XkP2`@mTU!`Ix$(Q8l@Lwbyi! z)Ps*K^^Wa+0@|C2dbUQZrZ(`I-K%`K-!XB<5N>dH3x%d9rW?_z`=6in5$U=eK*j&frnnc%JVnGQ)*9dc%^kTejv_TuQvkQ65Qg|j zD(Va*#GDnxwV|(%Y2t0>oAvR^*`GLgva+RuYusI822_k7zM4|n4-!HlPa9(BQxlCF z5~bTEM9R~4$g&)c_ht+`aa%3PU5=%6!dP}M5DiO*sK53;JY?+(a#o(1XH78T3!v&F zX1yjWc%Pk6S%@?UMU=|}&y9)-P^gzJaqD}`6ap*{4|n9MpTC3Z%!X3?iZe{@m$O%_ zukFSe_0UMi7hG+K*$^VNI6gSvY}WPs&R%Oa-)Q;#!OFtAn%{F$hK60)=?E5b*^a%I z*p1;gJ#NN-JvF<+QS<6yMhLtEOUt7oUcfA6>G)=G@~M8!$|_vx#a`6tV8`BQUn?sg zPF{Iq@0%%~=>n&>fLkZC4ofr|)G2o?hT?DZ?fXTAvfYdde%N)daVu9llCznNPgg7F ztsXee=rQ~5N+n56Q6#eQ_sFTv}3rM z+DyiFZZxRZYg(z3a)+!X5iQKy>*n@+cVjbi{1v;<17X3_PVIhzd}n3cem}Yr`J{c7 zpGR1z`bdg_w=KqQn~gHuofC@6d}GMAo>s(WI?NRcY=?2xoc4{GF}&h~c$b(w((#j= zn)da%+-rSUbqSk_nm=aTqy0)S_Jh6gYI_~FsJMe&PkJ`CEY9n7_i&g-884nAQ)fFJ z$`m@o&_ASmJS3ww$q=(Kf>Kl*XKJ=o_flCSCbS&yU_-?a(^L^P(e~q9Ctu z(HEw%sMaEkKy2=>l%3fyelBA@F7`KYV!PH&f+}E>$>nrzM@zw&C)-z5kTg@W>NV4H zQUk5;);zDSs}Ui zCb^#R?`Qy>x;18`cb6rhu{Jb!dpy@I-fnWjXS!lAlW`mG8&M@~E-kx(>17xD-LePa zhqWE0j3xTsy%8SUt-B?yuy>UI zR#DqCT$;F+?OoUtwuKwVg$*J;r&iha%BR((*EVu$)IZERvC+|lHV4iQ&GMq={q++H zs|nG%J}S{F(F>xx1BCLvcxyfdZXglii#Apn-XpfHy)y(TMs~b#rcm-*p)|2aq2*8bbTi^CkZCmhmmf{QBl)}o$ky^{oBB{ zuyQkXiR{>IxwdbzKeOijy`VelF{Z=TMZHtSlJ64C`1y*V5iwUR>vZfj(?dU{@SZhOo;2(Ci+B42Z6q~>1uqdr39~uM5-iXy zh!SiXx*tLJxPbOyc51SGMua(Q4n`tV``Ihy8JY69gI$@jxO2GEjur_9xgtk;RnDjy zY})p-h4-u7titgyh<5N!W{+|+tEa`gO=K!c%wiu5)F?zB_GEP^fJ1 z*$1K6$C|1~FOxL?zHubmq`yB1t!THi1i?I46y7ppjmW0uB`FJ8 zM-m*jhOSr#v!C^#kT@_c~Dta4Q*sSh+IM9>vwz&nMBq>Z~u@0(-PVY-II`uT= z0$MgK#%t8GpALso9hk%qs=B0nvB*Row+mWN)%Z1|4Vi-0I$?Ji3w*b2fPvzfMo$30+~lQjDT=d*R}H)eIv(+{ZGf z{N!A_{dl#{?Z2T)^H)^pN2sUON+_V7DjI~IWN=;&{o^8^V;<+u+j2QUdRaopx2GN) z*;U@7aPGuqKR4<>?lo;K-9BISdS1axwtn}a(1CCzYe3ev^q9n`@e!*4X%hAYb=W=_ z7rI+Ll|Bc|Ll7psw>gg3|fVsUPQMiOTE|b@1 zLLz;ORw<{V+D71%nxp>EGmd=2rTKt(yU__@wancb{~fQdD|wa~jW(aIagni^kZKKg zTk4A19*w`y6({HT{bRA1v3S0oz?-iO94)Nud&5^iI^S;3gxz=uXM194cu3q1FIrYE z^f>VtOuqgw!-}WPu$y*V6ExmZ^WoQ9!w%4hYkc9OQsD8tJO-Vck3?;V=FF%;l|wW8 zjL(f)J^%zUrL|?T-_*;eE8-N|{3w(EsZ~lx zBPJ$FH#1Z}M)1sze&18awMvSmNLF33!|`CxD;Jvo2wHLHv$TG@ z%v!Hru%0Dv$?jy0(+UYa&6B9Yf>serC$>iV_UDxRJNxI(A$**RJt=iP?D!xHAJqAT(Y>RObTg1R%!5sCSEI^FA38rjeFhU6IT zLKRBR8p!Ls2I$bqAa}d<+vnz_U7rY=xP&r~sFEB7EL*iZ#Ac;=-ne^djmai?eyy_e zNaZMZ@*VENQp)G*rB2D6!byYL+g!_&d7VeO2a-I)aX4j1RU;JUamwHBacQk@G>I=| z%bzNk9LyUoZ?pSt_;K9f0$}hg`;`&YhMTyQ&Kq^fEr1}}d>B0VaFm=*rnCc_@WJr1 ztN_(fbozy6`VMY&Y_jB8XC;;2mDutln4DiFju?)=1XSPMk0PUyldLw-SGXkRxAIO% zJwP^=D(XAy_-HNNZiSFvvVx_^-h^#-;w9^Ym4)nvm|8aGa<8+=dbaB}qcx1jG1mGu z?J$~tXc}NPh^Kg&%R03NFJKtpeN`y#3HiOQX2LER$y;A_7YZp*hqQ}|MX|Sh+YrvDTt+F|HJuZu5#fZV{OCfv-Oga%YwhU6aHtH zlVg**6!(FBqq&1LG^3a|Ql|K$Y9|s-Hb9DdwjV*A z^lwr@tKhL||2Lb6oY$WytX-A zF#J$^HZNpSJ+D=bV$3UEE=j4`zcQi2enrz`vFxo|m1PE0$I z{(8-bvjcnf_yxtI(~euwI1hSE+P<8-lU=TVT`geCP=1h5yB!tR?0i$P`7Z9T^=6Q} zi=iAtcKp)0%m<=_MS{8RPd}6QWU!-F*|g+$BtXEW{axRiwX5O7@nPNhj3*_H$-Sur zrK%yuhBe}-l_Hy!Wp~2{38}B|%JAA(UU-GlW(&KNyrV2<#!BgC&h<`_3+`garln~V z+4x5DDE5ji0_IdUDXc-LOT9O6ZDjojEsEcK@n@9Y*Nf0 zJkP6D=Vundgc=}J=ULt=31Vp^w3WsO_q`j- zp#Z2UM2l}}Z~G!cY}z*T9NUN%KRU|OG53}iG5Q}1U?es^Zwt7@V(Ym}xQenmam42f zfbJ-*cI#7=Zqkv`9ZMkX4Oo)OkUdLk^>NQdItSKwZ|EM?J>EFeAmRqDs00jNQHE?J z1EL(m-*{j0)+H=V`d~2cUor^J;Vo9m6s-QJ9hKKG4U-!S^cyHF#4%NOa)zaAYhE5D zwN=Ou%oRsDcdc5uhzOPvC3fjP5iH{Z zDVm6+y`@bxbX6j!6B+Tek(B-VTtwbuOEYa~-Xlq9t#d|D(MyR_2r?wz?h|uw=Zs0G zPb*t@dT5)lj{(HvV^UUM>2bOk^(bdPrwqqj%2jepu0lMLX>ZT@56}Fa9XZ#QR%Jv| zXGXbCXohHtOZwxA&dNw>_*<_HTAyA#`E9Ge$o_6Bgo%WQ4`q%&3l>rfgq`Q7(nM|6 zUb-$fwm@}@V|>f)>2$Df50<-pvDIEe?(oWehvjJkRVtAK@zUuj4L2X-T>bJ46@$qK zLpl}-Z*ivE2RV1-pf(+r=ywud)Vyjk%sG^`P$S+K*lc6fOE^=sdWyz`T5~n!bL&75 z<=Jd#xD%?$mg=YumO1GTF7yej-0Gl|&@g#4>M=a{A>DQa`h(+mo*AvfmLD0E*=o1> zrk;>|!@F=czN{W$J8>qzA!Rh9>2BJ7 zXd*(Fv<7@>QItPR81NCZ%w&~N3<&CUr?xz6c=L3*JBTy8lvvGm)C`M-a05T+9ZtjU z0iA6EUpmoh`?oz9?pe@Hs+m=y5MX-2*gJRY1{3K_u}V(uCYsDo8n4`G>b)@@Vq+ra ziY&O*vcn_J2gW270BMOdCc!-GBuO;|qBc9G)$+LIoo%Y+?gqA0eG(G2r!fi9WHlZO ze4foz)mA`Y+;aIQ!?ST`@`)1tK4i^0BJ(<&OZ!h>Vn^ty@rTeABx(HN9*ym*kM1TD z@yUT?GZoPIg}m*z`tXo6?FJmQ^V_OeHOG9kEWNOY-A%$<#J{TE6YW7JfAKWWIxgg@cws%s- z1s-uX2B%}#{S#etF!a{nF=2bnS!8HL^ICYE!ZjD*cN*EGc>gwQ5RhrQv_iWLG87H?@Q+MVzcb28W*Hl3bKnFRfnE9*ff`LIZZ9Jfh8RKWKP7I=UOv znh8A_3xVt1-#dGu*kdmU#BOOX%}0vwN231)v^7TvCh0C1dVCm)R4@g6ev{@m)2a7+ zjK!(j)5>8iUmYcHglF~n3y};{UdF@FhWY5M*PEW-(K8M|7aM7SQUG)R|o#}%4bmvFc{S+>Yh6KN?EtQOq zDchJk%)YuTSMnzkCF&kPtWxlYA6>;y?8BHlyrTM9h^5%7L8sHNS4KEjV`_+Ehv!On z=N&wle%2|XYuD+|7EgQ2+%}4dSrpKIN9!Y6El%@&&HxxPX3S?Ny>>Nv1Zm$9EYuI( z;x@{0r@I|)O_6ntl$=2?@z3QvkB(`sSi!U{A#o!rYohFMUHD<_opb+u#&gWNiWE+# z$HMrDnHXAQvVG}sPrrXY;C$WbkRd?vy$uY5=jV>Nqy(LEcVA5tb#c3gl7mo0D}7b? zoxgQWSX5olmWZreng0QC%THzYT@o%j*B+WX)=FlGzLCjiTn0wLzZk}D-q-n0snyJj zD*?HWkm|RLd)9Pszw^_ny($2&H{@LmvD&9bPkTs4&W`cx)k4C*N63Jz3($X+W_aHHJcS?hxpmc+Dr-LBPP%@M>NOyOqbfcu?5YpZ6;C0`7 zUwhxz^Spn+`|<;ybI$XKb*#0H@5)d$6*+8-7Z?Z#2-xzkq+cT-Jbj0N@I)5vDf|t1 zW=jkK0ZYzGN=i*$N{UL&$==+`#tZ@BRcM?Rs0X&y>N9 ze)$7Uo+`6D8dv%^+u+N3H#|gF87&!I7uHY3L`{`w=l5#FadEB{hEf~K7{$BbgO-C- zALoN~F4%3J>HaVlf*_A@0XNAs3YF?>s_-Z@BV~DIlbA+CB(cW!CtF9CPE0~#o{T|{7KjAOttg`A*pxmdnLk{U69vXYB9`X%Vqx`Z)k885yq&c z$off+ka6WCg&9Eh@%U0gzoL&&RA-j?xn%i0n~U*^OJ(TS)hcwq4kn-Y)~@*~>X#bx z2a%I;$FOkfzvKEnUy|}pT|wz{z3LY{0?Z20?t^ZmIFWAPn{OdXujjLKeFRX?vDm5I zhz=#QsdxkVb-$1jl#E-LhIKXIb`kj#hho-;zF5wY^wjnbs*>ep7Igzy4Dj1T*gsLt z4J)b^E9sXvw!X9v4OlR`pY6%&CUhME)TpJ9J*nXBR`OJlgw8#!Vj^}l4ze{3^Dw*T z#l1nN$D{rLwvo+c5!N>W4aVZkhO-idHgLSqeM6-HnL7Nva-w-fDzU%&zE3oK9#OW6&#zi8DF#ka- z!$a#gi>!uq|LGOlIxU#G@EtWU;98aT{n<2%X`wmh8w!D69NnH&80(z}7;y=vbniJY zu|IS_gp33?Y<6a*+~h@K^NhcUFiuR!;j)p(q7A~Q4PB9zTR_I?zB{t?zz*snzv%cF zTy-~?c9=LO?;%~UvPH9y#-vYkQ%FIah}>ux;GjJG++YSWFY#7Y7#Zi&Z8WLHDnmO8 zB@S)H5fxyb;Df-|p}1+^;k&vQty_(~k*f+4OxeH=!r(HIn$&6$Ic=!OU8U5HE|=`} z!1JUlK~Y$^3g$179cx7!CN~73;M8t5L%DK>_RdI?VQo@3%}}|wc;qf+Bt; zmIYRBF)qBP#NF&^bGc$fIAr}iP~7GsY>n_t?CGbYO;GBY;-yD1(l1L?18Qc?U5AZ8 zgnV&SQT5(-GVLd*+EGG>NcU8L0KZTwVmg0K_9t%dkY}r~hMu0Z8>?Xqbi6F5(DY+9 zB>jN`M!Jz8;73yNulj|*g)rNpSMTN3&NYU!^hp9);uRXX5mj#pig7qU?S2RjenX%#FEwvza>Clu4&9-3*jj{D_i*n*iA%mXAa?#%+D&5cdG2Q)``SDdduRKIs5ey==R+F6&0OdUzT&WIP z;7H&IIzq09{h>@o74xc>&f+x!Q+ziqQM7_Qsl4~AK6$NIBH!FiSu0U~rjn_s&?@#T z_7klyuA8hguQRSogt7I+ugZnypaGqM%uMr4tk6Ly#Q@cts1K^x84Rzh3c?HGrk?IR z-x1kiW@Tk%W;H1J{@%Dm=6&4zo9Yp3ktr|L$vlB^{%R|36k8Nq#y#Xc-aVpJmAY)y z$;mC0Q=(JBYo_Zb*Fv^I=i0WVwc_5HZZ&S%=R|ujK|*pJ^4bxsRO3{P)F*-ouGcP1 zjc$!(dTIMeiys!d8u?sNPXS(bUKL)RUV~?DyLw~Zg{l*ElQ@$kTM1kClVUl`!|i|> ztY@D`FM}#l9fQVA#JS7)e!Vayg_7Qyj@gab=iBoyvHvXZFP}TiHzFZ0nd4{}(%n?p z1aD$*2CJKA|Hux=j*s{Na5bCK$sU*Okd@5l%x;mLjSvM?LAoH$5G_)^=gWK@$|*_= z$wRz9ZJc_)*;jX1K8)Xvn`K`_wVH%|6-??)9^qLupEDOUG`Ax*V&Iv#bQ>rhO|hb| zNwaMoxlQyeL+PR!leDQAS*`CmV38tDjvFjAO*KE$`TAb={Y#d*_q96D-v890f5%!e zXYIQD^~0V?s#VKK<8RZ}Vc}%2WT9F@9ZH>;y{Gfewf1|z_g?>Qt+KB4{$Ou9 zS_7&rt80UayQ4YvyXU*sZ@zLlbsTbBSpTsSAm}L=no^j`CX_v*KVl419!WJpGx6zr z)jJj0ur29q)I``g)g(+dNJc8+_Weh0#c1D8h$3m7*FuA1x}J!hvtC`(lIx^<@>Xqk zNzYzRQ>@T(%iP^p)J56_lT5j)zVM@wwZJvLsJ4yohbikQ>B;QJ1Y3C&$c(^9L7sZQ;I=4|WfE1iu;47;VzW$PJ0w zF@L-mBkIRc!nvg`XYS_=A<-l~1^y7!#%-p(M4yjI9bW1JQ>?zA!4x1oj$i9b8Wq3` z3zQ9r53CK|4yF%$6DWdKhcSv#hI0^g2uUP$r1^sToTx$Ym|+$&2%B-dVf0c>5j%1r zWPM3p_;N?RTBDk!(F|YEYV})9?0(OW-dDz7jU`z4+-!f}@!!eFQK<*!s}A95g&LU3 zncIH{Cle%BaajQQ=-urp1VADO<5=Wn z0=I(V(@ppLW!raQAR>^h!DfZcTIHyje`WYa=?2jTWx`2tMThmfYgY6op zlb5S6zZa4geSUlJKD#d0L-}G(-kNl_VkWM{y9K;?jY+h|Tx*kIr)INN2r0E$vaE8P z?u~krRk%A%J?(9+WF0@8?NX25XB=icNnfTIVVhRJ z!RdB(iLIbTqn5Dy|$mP8Ir4yxV zoAR<#oEEVUX+pwcmllWVws#uW-unIeSS`Bu1DDeyvug%*&$_XNJz_7+4{d)6t+_WX z-873`P;Yd_cKoE2r(_lr0Drh5JG)v^TN;aoGOiWWA_2%O%^46t?nvUQf!@K-5b`yq zVZw1#J5>c3eh&fD77}qDh~->>Pv2w^q`O20%=vAob32-xiqZgBYB*6bnRuSL!A)Po zpQ;K6xJyZu4Ixm~ARNl`a&y;PS#C|bCH}TWP+2b;O;Dijtm?ptRG3^Y4?*~&t(l7vm4~g3owJ~a z2+f}ng7D|Z*B~0IKSNxsMQF5@)u^QGoy@3s*tpr)X+$xosHlXUOw9#fOUwRiI{cRi zjirl=gCGdx?(WX!&c$Z$WC7w35D);dbAmWIS>YpCojvVbj67KFoN51Bm{} zSvj~^+1pV)u4`m$@9H8#L-V-NfBpSMrat(l!OoHS7mc7Ar@Kl}X0r~jt(Z&S7ZHdTQ0 ze@y+`r@u{oq(xBG$;u4QrblLoatMR|C$1o~7cRKX+iv@zQjE28cAdgn31 z-e0@<$)b0U>0`4*7*BKk2XM7R=y3%D#+ZhF1U&QXeEMAEKSuozP6ow(l8s*( zA~B)=zvEjp!B{`%`g7CMzwzuJ9sw$FYJ<28AaVb3tpCAsDHU4r)l<=4P^SZW(6i50mk?LEKLi<20=|NDN&wB?6)UcOmE1|txceq?XLJpc{?sa$aV*Nd2#(}7%d+LvI%ZmpYSHfHpur% z(a5slp!H?~Uy+5Qdn)4VKk&CI^%GY(w+0e-C3ly)!5>~4iX)xIivv112PSRs+$S7v z_UiJy4_dTn2S06e%>Qq8!%0Ydfi%K0fn^cFGVCx#@<(?7(c&ylqpzaXNpc0GXq2>&n?|YE^XNST79$Ml!rpBO=Vl&@pOADJ8B;s%k~d!gKuh1IL+C&-6T)Y8DvWjX9pwHv7XNz{!?%yxRaCXy{YMqV#vG`^4}Cp>X}@uZUu4Ii0ZDUudvO|9H-H&RhpM&6JIg z84;!ZOJ2(OhNl>^@or8Ri|%zz>z@CF4D7q;?4r~h~|@lWc^@SEZ~{bsWDW?$$T z7P*dn!$y4Pu+mO{VT_qBulHX`i;MI$%%J3lg%Q@C?Xb$7@GMm&OU#$6^`v=;bmW>hksf z(fp4KLy_%TuQs!u>>{F)sikDcewc3WL>UP*GJ|tVwO)>oYX`2MQ_f?Tf8A7Z{Orh`o+P{fEzUpJxtQvc9g5WV*tFAcP7(8Z?u#|r?m6TLr_3&0lmQ3BiFV)1ut4fBm&aNHUTy5G`cb-o~SRE}5w&a}q# z=MG2U{*s^wFF)H^fs1*rX!70KevBN&BfJ`3kNV!n5^Ed!ohJ4PGq5(7ml0LvA|#Gw zQXP&-;pCuFcu++|L=d?;z(M$Vn8$N;bO?rDzLanq#od-%9tue{&T9U8>d_yg_lTZ5 z=;ccoveAWxKneSa1HsyQiyd|d_idsRgk6$-#xP`icDdg7W!(p<+%L68e=Kx+HU2N7 z#RH%8o8MJY+1mFB)_^zn#|drUbnIJr?vA2-Q$U~uU8nDVtba-C^^O%>uXgi`8y|tv z9(U+)qaDNyq_O0olwTZtElk}dK6%YnK3OAsu?HAlF)&LeJKa+c) z8;fXfxmZemv<>t-W5|8H9pStIji-$lEHFQI&~;H(<6|NTP(BhuOO!@c|UuEE25z{9MzNkpyw zN~B=GywHAqHv8*UkIX<~g(%HMb!iP0*a) zvFq_D1r!}}0;uGz$GD_=kJ^eG#@fw6o7mlsR@=+wcRoiwFs{msp_`lK2YubXvhVDb zW1o|7?xXWW&k8Db-y&(qBCKIZ?NEX*SE`SCN$X0uureQhj)LC;wB}@fxw(N#SpOPmSy)ls`7hQi7E?rhXsgFBomdWaPx3%7%pEbDWMCt7LYralSk)^O9r-V8}|~GC}%f_i3?(NYTvUlFK4B1>cf~ zN#jmoQLjuW_jHeQ3M~#DJ2JAD)q^K2%S18cKv$x(1P*9^=>@xW`puP5S31HoJ(-p&#+t}B5gxvX^yoF$b5FR$n?=&Af3@WczkI}`RWn2X11 z`vk*g!r2=06JHc#lQ!En9WRh3GT{L*t02x70`uP2fo$wy6`wEcC1)Hj2g`Df5bQr#RZSqCCuu?Y8=>M}A@9}7d3o0}W(bE*!n!{P%98<| zrQ`V0Yy&isi_1RI3+y8PFJ{`#y&iwAsW>gN2VinH)4=E@A+dh)u)iNl56)!adgb|? zH3>-Y6l!trwP0jw^n#X9j{_;t8*o>-=r&)omzsVvZztx}Qr)!gi4J**2yIll>Zuk7 z(5dgd4Q!M-0L|#5XC{b>K^QB7koOOx#^0%re zWejWW4;qp4il|hOz*OKuw4WnN9e^+U8HZEAxG_K*R}jFSWmYMK!LF>$R*eDxdz=T3 zGq&xwBAX*2F7KI3vVDCD$0%OB_I5wR_4ciCdG=0CSN1I}_S!L~r{vhQZynrc-dVV& zq>-mS@p_KMTh-g|?=SP07Hl*Ak{i4fHUwDLz`8w1&g6s-Ju^nljkp!;3?=Z+ep`qM z9r;5s%_3{4)ZTLN;8~YsF`>l<-DPt#Tp}d9Yct7nl+>8PQ;9dzv z9UO&Se>$GcS(mYnRJhTlcClA3I1RE|CEM0AVX>y(rV6>+8JULiV=?o{Rbp9>06>3C zvSmO!TwN#Y#G0{Oy!tQpR?wEj4}PYQW9aJJX;bFJW&n%}iF5TsNtkj8vMoeJ{Jn{C zebnjLC(&==@cHt~tGoK^oucriU4Vkqckc$1EuXo`v>A28@MH_olcY5W7eHwj!lDX3 zjt$4N3<&1n@;ZgBG=cn#7~6vdJFC5g>(rLs=3#}8>(zJVzvC%)pvde(aHUT(D3;P7 zg7(C|ac8fzG%Ucs@L<6Gbu}@9CP*-0@#4|G54j*I5fEpq&E>>BD>X7SdRgAUdWX1M zuPM}W%y!;^17;`pT#xAyBC*rX3p{b{>?bk(k-#$E|JpRx_b(UL?*ac;2f37y1s4JF zh%5(br~i*dES8mcR)v?jtex%tW3jE2w2F=z>At7^7JC?kwn}Z?_CH9L&A;JH%HY|{ za%OC$S*C0g4dYNiK3GZ`1>?uMK4EV)LioIwA^G)rho7HceWqqHL1!nqkKyNIf(@&( z?G^AoJ=p*k%4c0!lhc@kGzyGZaY7zu&xUXI#Sp}`Pv#eCn7k`!p{+N(axa4WZh+UMy`!2 zmuwZ9Mz3TBqfqdUGEK=xh<~Zdm2kwbn^THE*|PqlCfG0}t~RttJ(!7?n=SYLWh~ zz1n4$rO9V~TnR4E!dE_4PCVa$xYRPox_XNHT=E=Y6`U+PKT0Sl4k1;IBZD0q&>LGQ zfh>j5i*NeqOhXuk%<&}U-Uf^Vo2B;PF2Z*GTBKt7-ERv_Da?CLSM4`j;shE|*xqv5 z5iHXSC)$53syQK|m$bBfm_B}Q`ScE^6zF1@jt?lf^@h^FvsO?>Ti3cyrsLBW_!6Dr zge|+?Z+?_VB2QLRCEK@p>O8?7pz3V51%3@nzQ5?JW-g|dD%;SHJGr|1o$Ybi0|Il{ z?Qq|kSe|5rk**HDKmv|sleh(h8)M1{9ob#1_^w6p#fy~i{WOi0%v8A!Wh|D`zn(}q zPqEWCH1Vo;oz>$jshN2n*opt3MhEl%63Wk6h-9Xes=M%&fz8XW>QZokXF`#z>yw-w zt*>(j_R%N2ff8MIPF(Y8+?Xbbt0TD47yaW15K>?9oU7Am@M;-+JgarI?~M9T|Cs`Y zb?LEEPqHCoEof*eFf|` zd^P%H21V?no?_mYdOkA8^?9c1Fp4*#vR^YuiS!L4zz;pVlE|^lSx%VA;5Lg4w$E-? zQZ*u|mzUg~FMDm@xSebKzGngF{Cm-1k=^@Li5(KM{L$NAF$t`l-|W;b3KI6_C>8?8 z+{TI34T|;vqu7uWzyjk}U%aIZonsbCytjQ^7eWx3lx!BwT^$0~U?3qwj#ZBa|&2y4bi;0`|DTZrFD!O=UL%wFYU4+M_AMkhq1R1r;4>mp_x+q*kF%Qn})|_@$Y!Ly+?P&@q-gYI|cysVU zUEAFrCn59=lzQS-a&&^sfXFEB+><55qCMlbJuz^$aCl|;AX^h*?+;GSpCi(fq3UP; zm~23wZ=yCe({E)!9|kVcA8uh+OV~il>E_`qjp}h_5h*9%#mBglT>&{!CG|oz_tLmq z!S!w~F*o%hs;*_vw#S=ldmgSzliy3ubd6uSElFM2Dl_$7batRprnJJ9G#4iJa21%Y zyVek^csb}z?+7p-@8=w9Fj@E$FBx_sUw(q5;VcRd!m#!>-53nyI-tzc>Wybv4n>?R zGL|i8Gt8=5Vq=4tJVM>nqUY*ZGw77fkDlq~jrPc5*7{0thhY~sUy7=HbW_Q^-1BxX zA|s!6>;Vd_C!c}O+bh|f7hmCc4Q%?TQDt!#y%d~(`r6sA zIw&2;ua=QfUPw^d6~I3cTfi0x9O)E0#-(2%($ZCj={Y{@p->Qou z^2!B2+$@*z)CcOU_GpTC!x~0E+KumumR8tyMlH03?q^eBpg012*`K-;sR9|_xo4$D zF9Uh-AmhNKYoY;(bw{v0&`LlqrN}=k%GE^8Z5rJ%8+_7*y=z*{wK=_*o}T?X(`OjF z@9OM_MKz8XVK+d2C!iYlz%A&-zEOqCD%MRS%8#yLxZA5wBJCO3NY*P0(S%@q53EPN z(cdAleQNuT1vmYM=;kssD@Cv#?jq+2IB$06T-8DZ1s`rt=4W_TdnHc*NNNtxCiF*0 zwmvbU-FS|A>wCHjtx56s=Mi_=^6V>5rQSX#S*h%?2fIp&PHs*_Zo0C#D=uc)W|L)c z=cX3d5-pIL1()}`6OvzjDx3`Ij_BS- z6}yyJy(?a{)Sl~uYh$vZ)7_Str8V@@$2glu}9Xw}zU_#4G zf}_%~00*g*uU2{API0y|QgbpC?K~mstXM!a$*5aPwXHm5|Kw$Z}ms*QF+raNytmc06=tFSxeV1RJ!{V1Jnwb@W!L3?~T_-2}DrH z(q($y0(O>>61(4M8C?^FuAI)v8Fg)8*P^v3sv93m{w%#<-B)wVqC-c)gE71WZaW#d zU~eEiL3YG4d*KLo0o!ySn)xpoj&Ic8*J{+SJfnZAP$@jR^(M*>aYIl+07{h!m5>+) zi(dQRO1=wTWemXM18%b8zb@S-CrbGhZj5K<1XNExr0v`{!_>f%rM}{pag02UQ3Nom z5guo%@0q1H?NyI{1hySzFP`$H?!#W3QSC@V(MQ(Yr|#-UJOenT8zP-X1THneA(+l0 z*@-yxoI#?*G#1>1u1y9K5{abRXyJHv0WyHoojjYsU-1@lH6xjXVh7D90~CApeP|NR z^2}z!x!;O8lN zewjt;dtfbxQZ<*|Mz7k=%X_s*ntOGvqXc1_JSzKyT=2+bE$l3xZNxR`S0g(R$MdFd zE4Ywb-5toK&S&XJI^QBhSUDwa2WEXXo*5~9^jpEH~Nih zr#JuX*tnr~hnP7fy4cSC_u250CQ&RHJo7Kb20;DeZ6~rLQjB3q4O6xXH*e?kNu{B> zHCc7RT}|(eHifYisnpJwZKBgRK0|%gbOFP`oV1E+DVvnNKt}b}j8iE!hB3w5gwqV4 zmg52D@MDdIh3hVHxE~`7sh=5)SAWvLnQ$Cr%&t{@5)*|F#0tDre6Ma8#F_o#t^TI^ zSA12%_qR_YtONXL{KvUHL0+pN6MUUA@~Aqw@m3`Ic82dtroBU(!}#%u6@DzVcWyD| zq6|(dfxj>Um2e3|xCXO%LU0EHg6 zef5k^tR8PP1xoPY%8SYT%nU|yfhq@sIvG4!Q6*`1wLn9(P#jvX)a>c>l<3kGfu2Ac5|q>D+c)h zhsde=3zPhIRZ*%FFFdoT!%);9wqrJTDHww6wo$aiVO^|Ck%7YyHVc$#F0GlBP6;xu zURFQ?k=^>1!KeaxYwCiq!4zNu{Tee`O%iKs+JPXdPCeX!2q~!BxwXyOXMYhvi9`u) zLWA)xd8`?WJ!IPs!WWY`E`J}))C8cD+*WSMOsVy5`<}`AxEV^N&g+PKOzXIfoBnr`Q~^N@4y zfd#5PUkYI3c@C6j8`NAVjYNPH)gB$sNKl~+^x!Uis`@ymLWL!r^T9>ytanE}M? z(Y=%hzqUA0C&>(e_sL0b@^9W)h#`x8@6+`JXgIFqqKnZK=hix4qG(U64!oo-0hU23 zFX2f&HRjUrl@W3-F5K2eKNiPy zyk`QefDfsqvnOrpX-VIW zO;S0I7*~Yf-Fo#_AlH?*jLXo9m&PdW?dyL<=0<8OIwEQ0F8m)Djnq19n~NeFRb*)u zn-6JPGF*_Kr{ni0_P|w%C$7lBqo$w*;i(V6P^C zb^yUrubdg_pOfui5jZ|j>0l|Qu7=<}p;tn)9(KXkZ{|RFBajvFEa&M)gns{Cz-2Tg z^=Y$QC`9vaIPT|48fzFG)C&-Lxq;EfaNFPY;X}G$$hhCQB!Hpt2;!gyKI-rv4@3#F zdhoZcPa3fm#U{8?%fpShbZjYXAI0WgDV-!%X;{TwLw9Xfv6RbFQhVzxV{GTJu@-eb zqjIS>G@CUr386_B{G5DQbCNf=?^gJ5IbI4jx*fviW*;S5_Ph*8BF$wIYLF0eSJacC zURF7FBZ=RuuWRysIXcNZiB3y+4kg7>2NVTMY^|h|LcdE5s0yvTu#*H{#MJU9*js6F zsA*!`Hzb2E(A!E=vqa%$DpRz&NVS_8BsV_e3_7FM8d!^L{Hbz?`NSK|m4-4C7k0v` zbPRLQwJsDvdl0l`6gps9bM0*mAvhD}yTngla3I@fXiWX>GEo{6FPOPFxJ-M(TUKE4 zO0Pccv3SfrfXrsMtzL*fYE;_8Z8SuO-wRz3Sq5?pqS;BM6M)z4OvE7kj=~U~2$rry z=3euC4XDG0y3@rRH?QZwIO#`Y+YZYoq^MeJxK&a|5~mlK2UDn5o@8N=~+ zu3>R+j5zx*uL^KM+jVaufD*#hu}EzZD&u2t#{-VLxhyTvq_l)4LBXQ3usY_@3D z2}NKwSSFtl@-6%Vb7x}VZ7@Xt*t2jVn)xGo?D0?KLc8M;f@yEh8O@WTo!oSj0qw<* zibGm0x093t>$Xl?(H-`Yijr2$=%;D&sR3R|qMc>ndKQKqdK!BYJVT9Z-$%UX zW>s!O30$f9+Fe)QCIsn^D7y)sz=W6;B3a1>{<)w&W(!ww>@ zd-)2YZ`*8hRFUW#5Gjri$$~3W7P7Whpgx|`0a4g-*E6BwvMC2KoO2Zsy6ag? z)9fGCDKjRMe*18v9rfouSdxGUL5on(!l3cO^wR2(L?mZ@!p(f(=+#2>m~sK({raSq z!!vs6(i9ALU|-{N=}y}+9m0#2Zw&+Kw*?yTB%&4Ho=R&y2PQVGZ*MgjrU6(?bVJW3 zb-oYoUhQcv$}ptW10p!;kTbQ5C|}|kscyy#%UN~fY|voX5Yy)db7%}!PZNm$6aPHYU z)nlbOqRxAKmSMb8XcXpaM@4P# z_Htu4O{n4K5VK1jXnE{bxf3t=hUDC|7Im86Aq6&Xy8aP#mUtd-p$u%lwoTuecq791 zbNlyOi(~h&4+{*}SOwRxipTnlI(@ml^;29ICSjo+2z81H@6$9Ar46v7;)P@%QCic2 z4$(rI*G@stmQm?m)u`y2pj3eOz6^H$XLm7%}{ z_s#O&>;9A)<+g7yqetBuvO`i@lsG`~l03}VKpa)IN)vzcjw3$?MaHC61r?*!ZXm&~ zpy1`(Ii~%lD-HLSeOgi!GL6sd23OK_2UqVm=0}zbUn6WdxQaUN%e>Re!}$)^u42Vpw|CbKTrui)9QEq28hiq94(Nd6fQ~O0DHfD6AAlO_Z!`Hb>)fXurUNKF zZ*z^)PYvmQ$&H#qSRw1^PY89eRIXeEH1NuVv5wJE%wE;_^j+=nf`q2V-GZ8TJ~}Gh z8J?nHeTmHca+v%IaJ&&_% zb_y-*q?Y(SpK9YguZ59IuIGCajIFV$7t=6iVRis)ngqb>IPvrTk!zsb$TRpf4MfvtbY_%4NLQ` zP1WIRb1%Hujv&JzA^ZrWGq375;f38>=B5TS%Mu3!7jt?d7Y<-OoJlA1PT@+*Z=e%4?bOAwyTDH4r$Xbo#JeJw)*1>= z;bLq66>OooivgD>X;qUdLOJ#ycXiC>q<+rr-G6V?=P||~Ex;dGeyd~qM(ISVAtPAN z&L_mfA%Zf97~EYE>al4C9YF-N7fSN`Kqh7?dmK80tw0k6;J{35-|OdyQ;PLm9m;m5 zMj!eaj+?C5KKB+R++0$84MA$$u70*-0J7>iSkS9c9_Sj0z__})y}$JlyYciM+iR8R zB0X(&JNn+1EaYhI?pt^Axz~N{rm-i_>m$u*bfE#oV*>=h6{$I|mO!?O{iGj!v!}IX z0~qeyiiLMSRRhL5TegT3IUy?5MsR3n^j&+gAN*!PahL$`J0@%H2d%dIOKCHp9 zcVEbYzV@zK63BDj15?p8<1l9pd_TS~FQf_gONt{Lrokg7A|!sc}8ySGj6S)(n$bM-yXo@47*14l5; z{EipV-t7QUeZ3V)f{KE$Y+3-dA4=B=5C2?Xa(bCYB`!`-#tAJbX(?b_8aV5m^YVx> z-BT|AdJ=wZg;9T6tPejHq=-gXh;7>@$nD))?Fg@Q z@)NpDA1|_{e0WDz-KycvWPJpEC;Ab=x1_C7BrRMDZ$aq%(Sc^W8sSJYb7u6+ zO1ANocHC}^p;yyvVN{4`(tvZ3(pI{D?fn^fvh&_Ijk``u0<%`F&ArYfE11>%$$5RK z#gr-gz&sf8c`EaR_Zw^yzALW!RF1Ukso}E1W)OWK>AK$?D*HlcZ|xl zsIK=~qsrz>1jNg?dlO&#=uIcpK$hlD%=Tw-JSdQU3Q@P;}Ua^5`{RnF5BKykHEv{ zgLNE`J8cFm`AV`AsQt1f4laRipx~t(h%Dc!4=Yhdw zuu3?cra%t>EO35K7wOp|d!!uo6AWJTf@$n;-34?Yq6p9m1Cj{+CrSncOM7b3#X8Ht zwd2;|-iEQvjb2BL7U4HLA!+)zmIK&WCtlIaLPCKtO`qlJZui%DiK0 zGe!c}TiKXv@_8P8r~7~U9kxq$;^`RyN1g6od`~d#vZ`zW4u$vFgB5T)`#qF83^j-V z3rG!|1K#?eO*n%@k*@kTHeBE>YTK9wmy&bvR>ZY<H?cOK~|A#vrJ;ST*}jUye+~P+9!+&h3YhIykR%hW}ZLSJ%5&h z<*xH5udXdU7t#1yY?43Vc%fTYo>15=&T-XmWdCBwPE&Fd^fuCi<-%jA)aAcos1L~O z4u|()?Bv>f5(Yk&)?e8nbi&qK&CX}jS|m3t#!HId$Kg#l2b8+>1|GxVu;u+c??th3Db7y^Y4+kBU6DoBi@dX8+Rt zxy1koZ|G7rBHX`d{kcQ2A!TPNVb!l0-U4{8HpJ1RjRw+IYMKl%+!`gy1a3Iz$n#)9 zhq@W*C_8XrbG97i?9-ZPlPE@(+qwPd7w~wCqoHH7u&8v0zwnb)mJ>bbY5LZB^o>x` z4di;;RNDma$YfSC9PN$Fu1{o$q3Ep>9{*o~3JS zbZufIu5+(Tvy==WgWeUhiwS)~2OA@TV$_hG!Feb@rOxWdNo78wBZhs4s7BJK5(}Fc ztMz=f3w?bSY?>P#%Sn=lwWS}q8T*L3dd4IP`>FrXHq0KbwtI;y>VuWi>}kq zjZlk82Z#H7NyN8F$@PBS?)_5?Qw$*p8Au##(h{5Z@r%M$lF zK-qh+QKwqNm2%vNr4o$XqA95sU{m|k{7HlZnpmOEj0Rc`{cP(+%Rxl)0L{XQ?st;J zOSMQ zE4;-b!W%@Tl*S6II+khRKweL|4%Lan4s(UPd$aLmc7r?kL+CzJ0v3Ho#AEqH74qDU{b=qBvekM37+ ze6=B~g}EGrU#^;LmeiRpV%?h;w(z%&>Co@1hI2|;V6*dkllvP_)#gAy-rju{*a#CO z{*os!!c&t2ITVgse(b2pZQlP$*-A^}Q|sxu`!klw;g!&*Op$=vXbX-#-8UYxj;x^M zg>XtPW%kC+?3W%(vk{gn0)tA}SA1(vNp08TRa>|pT9oismmw0XFosB0x&g{5Jh65c`JXw}N<*_S`; zFnVvg&Af@ZKmc!?FQ)mF8ITl-i^b~VZ&r;#tK^{tTgdQtL=ihASj4^$@(qyx(Zz;| zZ9_tL2NW$U^2;8vf`M4|Rt7oJC2W8<1e16QfBQI-)9i5{cD;9aG+{DH47 z2f2lm%-YF9u6#BfTS!X3B}G{fdVf9)DPK@9Y(yWs@v9vAoD$Wh;=jsGahtl}S(1i8 zi|qEpC|GiZvKK*gPVH^RWu67=fGbvqkLF};#_e~MF3Gl_h}-+dkDbz1ge|Yti6??M zYw&4h)xJ)eh#1HP;am>$EjQbn;9O)vR;2i$_rl?7@#pjRTo{-+PSqViAHZ3tfzoGb z963VMX^Ie1`)0@GqtZ3regXcpkLN#SD85Ab^b_>$^a))F_iGyAF%piSmgDqrVo(w; z2|pN0HPDEi#GnC3Pij7^wXg9m9D@Bi!V+8uI6dVBdJ*tEIp+EE)<8|Sq2ilwS1{ibFcPbiHf@_3pN&~P4`g6G{Pn% zyox~u-i30xCR87$N$SI_+9~%*rDx#n))SWU7V+>rR~h?E`!ipwHZ;%Dboz$wiuvQxq%~e(_ACQ5DI;nkc1S-{@hLc?x6tj5cs+ zDHTpoA}0H7=A%&enflUe)%2?&3t}=F@@5i4mh2WOiIEcowyP%eQS^Ze>2IOu8MB9Z zGzT0`$9CigYJgA9YZ#6>sn&fZv*&FZU-M{EQ#wk=wUu}bkIhK@9GM?2)k%} zOo?SsB5fIYP>{J!srPsb?eQJZHLqnoU`r`AS;+FR?3*dDr%9nL4_*5CUP^e7MfqEr zJ`dFWn#G^R{T(Go6eAQI&=A2fRekenMTSq**b^^*ZXh5IqiPLNG@dzRE0 zw4BMR$k_cMx*9?oM)A{8wRPkEv6VTnbM3GT2Sn(7bp}3H z$A`)0GyYgbO`5+sI zbO68O)D8SXRvWQtyE_kzfg9C`*K7t+*)Nb}0gxx3Rr=J=%Df;GxF}YlA4xDy*`NMD z?7d}NRa@IWDj|Z1(j6+&wdgLTlvG5zTe=&hm5>nWP#WoOke2Q)r5ovnGbZl+?!Di~ z{rt~|^X>e<_`?NjtvTkr#~s&w-Pc$Iy}%Sbu|k%&T0`1sA^7T;gMK?jcpWDi=Pe8! z2H3^S6!&@`k34-VT4v*+^;R3XW#c6(xrpP4ZzJBK#SALfoOgI&7%o<~;S5>gUi>n) zU$Nt>&w9(#si*Fb#}-h?hvbrd`#wb4;Hg;(b9W#J$}yH>i6JjGjl}&-QCGs^mJKl* zc$^V3b^Hc1=L>SSpSNfFtZ~^F_kHW2es;2khU)vz&RloQ&Oa}o$nb7P$gPRagi}Ub z+Ihjpur2V9tWTBlw)qpbX23e;-dmICS38sG#}+BECtG)&`q(}Sa8Mp-+slxV+Z{k! zGDAed86Y?y5#uiY>2EDP-DZTfNxvhy!~Hhw=G9wXzbfQ7`#V=B3cehMDZw0sct>A| zLNXF>4C;RFYWEZH05;CsVQJC(hhvHs_W41u8ia70`04-%k8UyPky-AW(o+X zWM#c>TQ-9obopx3H|lnREh4PiiaI0A6L4eJn(fd@xrvS_V5W$Tp)965vBoVx5I|Ar?mXYh8(!81$Tb9 z@A6J5Tm)LWWNG4Ot*A>7_4r$=^S&p-?kh2|(>}nIX?}NhB3k!qGHcDMo}~I={5#XL zr@bPLtIIPoR$dsJxFkqMvyNNZLS4R9vP91&rvkl_^GLcc*6r$JlWJ#1yVZMA)bVR> z^=+{_-)%Cx?DoGpZa72TMkt}Fm0()5O5PM^+Ck<7_3g2=Q*zBu>1T0~A%34O2h0a3 zcQ>+3upYW!lw4WKs=IT1?5UX&aZD(yJgahKKLB9!^gCnry6KsZ*<1Y3I2i0BBCJ)H ze!QH0ZJ{qxBl2!RknNAk#xfa8JfuiytjE${Fohnq3ruR9*O0oU`;j(DTncRsq9)u! zfxCTF*hZ?_?1#4}FUw!L6U}TUYmWWyhQ?u06b@NJ&9|N8E^$(_2B^Qp^%TG%mfEhF zhkDI@jS-p;sNyXjYx}&@Evqrrtw7cul8l(hf$^xl8b;=RIt)(GygBKN7M0c#q2yU)~7cesmlv6^{$c#Y7D! zpDT0mKp|KBvWX)x@}9N@J>=UQJ|Pt`_r22%`*K;s;r`SDI7{~?*u)GV2_h`;1_6kp$xcD~gGdFNeXPBTSBggilrd(&gMb~a(lM`(QWu`iqti10=Rg`fIk|9C@CabMPhNyZarCh(Ng)HXi2z&9*0imdq%8$CkST&Da}5 zwF52a_&J%&BAXl{Vcom^zI2!!UI*h`Qavg=0rBEH>xPgbX|9NO!V{<+ICkF0O+|$=b9N4%JZ3zvok^=Ec={&M`oaE4^ljl7A8pUXkl}kToQeGUc;At(D{!hA z-p0@K$Cz7swOu1DIG}XQbccRlw6i0S*gqPP-m@sO%34HgaM|@oW_vkf~aA46GP6_t2^!t!~Xrb)r{xtYqTC4`?0INq{p-!%9*W@AJ z3`#axa4pOC84Vt$@9$+Kq){(-XC`{9O$M#La^cL9d0U(E$fPVK`F%XGxsyUMYbDQs zWqc3moynk+Z1vbap|f{tHc--9%{iUjw))T;>fSU`d)?!CfKILgONQ~nw^jC8#hcXl zzsg_S5;M~z@622rd(;|5n)85p`W3P4$l+Ind-P%jLnpm2>ANlhU}+)=o)lZ1ALaKS z626q-+iBh%@xIGrB!D34R9ITP7^#YDW6%19Vrkj%?zV<+7IShG?8tVlMU#Y7EkPiS z(10pWq5K-&22t!6L6sJzPc@MyAbJLcTs41?OIn{8P4c>feEsWB9`Lq_+6#{o7FUry zj7(k^e9_XXtSEKwlv*=N2}_IZEIy8|9M)y-s%kNd6Kg8b!k3*u8R;^|l@{nz+CT1M z?KNGN?p-DjaD&*|TQ&$1PArq!$80-o-@FPo+rBkUm9~+2xGw2lFgop)=DX!y>U58r ztC^VZMEtrwXmaNbBADEgA8p1^E9yF9}oHyg6Ads3JKrdfDx9G z`^jP_5DoC^$FBU5Rx_sWZ(J;JRN0G@r}V9M8e3%=_qF~)N5d^LHAa!7Tb(uC5GJ6a z8_bSb`yJHCNvXikvpWnNxo5CzIv;ER*?|?42MS_yL&~->0YL{w`06DSud^vezKw%v zc9#G#&OCmnWb*5q6K#jMA}y0|t@mZbAkHpSy5J8pj79z#OwjAZBmZjjB0k-S;Ey3= zEirU3GfZAo7$fo$hZf4w2SI(hR>wz1L?j6&BcD3;?j;`8=rDKgij)+PF&pYfa zgE?kWLoKIvNsaKbS@*NXm4bzE$@kTsz7dqP!~3jNsq)0@jV}8sWa&bvQJV00!ro1DGjgQf&vkf(KFet=Q zYJU1MZI~qLjbLc!MucVvUaS^Qj@m=g3fS6KgW#@4A5Piymfao$F%uSlwTF)0t%*yhb~BWReSKs z{xr<%P5sM8AHleR-VCwDfgLsqebKjvs|WcWZUlCBZWt!my)s6oW-1wPK)2i|YnFv!lJ2U_w{pZqkxK`u%mvhoK;)nzM#>`ND&9;Jy?61Js_0tBFcVK7VvqA3XjFyHIl8T~is9x7 zm?n_H({#0RIX$zl|h`-57xJDXD*U|9Bt^l3Ad zK-d=ejNOW=C;4Zfcb9AFT^&7Jww5=&Lk5OwcVAG)bYhL){n1RwX+_xd;={mu@ekT7 zQHT>5U+*`3yElO`;-zDjvg*!N7HBffOm)C9(z0+XaOvEb{d`HSC*MaHPgBFT&cNKFo3dIoHJyjDa$i2oiqi>qoHR#7+fLK5fp^YqoKrC5_C z)b;P)_hh8%*)!?u&v$_!1?{&s!OI=nc8aJ}v$FAYSWrRV#YaVrm^Iv*D==QIhOYo2 zTh?%zbC2Vh-`|%C6njzxh6mH5KqJK%>eTlXTV6mDp(P;U#A_>`aW>Jh?PN{d3DWVo z7dV)L+)C|*LAd~gS&V*o5FZt_pyNE|Vsh>e45-lh21&aFmYTsH4!1uSC;6BNW~eg2 zIB4#c^{7ql?#f!&-A8@saHI=4(jv8uavg*WDUa|K@x$hkBcFG$&(r=-5c$(;qH7WR zbU*nE-)h<*&XEpw_m(+Mx!*#@BJew^1+z-3<4PPr{vUKweD{%k@qav~CVzyH4f7=&&4hEwbdkddT$nvbF?gL1f=>nK6 zZJs(Xz;~Jn#E#!ReRndpR5EOAmU|dRthLqge8RYWR6kM)?7UmO*!J*Xj$LF;I+3y> zm`6>~LSir4Z%QE~3!#9;Ai`c4WkyRio-+K$T>x3YrR3Kb(O4Q3Nd1b7+)aD!3y?Ws zNwDeRUJYXHk>H%Rm7lcDD{LiP4YqLAod6TT&SmzDz_poO%)_UM%YdOy+tbwys&v#& zeP|qA)x1)F0u1+HrI?_LrNn~{N?P$6dO6rL#RcEO6CrJg#mvZEKhtHfK4gDYZ00l2Ap|6^2kW7LjI9T{B2W6Xc?ee8iX0_T6vD_KgCiJj-!bVO~;!v zr*t|U!1nYfbFWZ}^8KMm|E$+bA_rv`jGWcM)T9i0Z8}DP)rT}vHwuU$Hs-QY!am~3 zdujUy7mXt#h}BF18biyJj}(pHEbtIUSQ>cluvovWeyvXGM2aZ2BIJ~+OSG-%hrz3L z67!jNW=-xykRFKK?~s-X86A}7=hDH?0(253Zxl%Bf{F>4J24@t4&22)_$ekkkA#5;%ik z8l;g(p!+{B{q47Z{pj}weC>m8h$(-)^yh~9Gxvo)@#_i(NHCn841#_mVe_{?#D|A; zf9_)idHp>v{m)NK5eK?ID~mDAzqvVotN^+oEo5YXO?pYeZvVzB{<&1}he4!p!SpFn zhONKmE&ucTe!boE!F{0Zg3QuD{kQl2=1187>zntrQMyIj^CqrQ2i?UV$xRmzJSt;_ zmNQ6$4AiUs%-sIAC?R-n416LYI&+bXPf}!XtFmM+PyV1HQl7sviD(K$;&v8E zmI=MzOE&%abo%JQ6Yky};{4q*{<2*I6!2%ok5Z)nt9pjJM)rha;lpy5{NI{#DdH=2yI~sHYI5at;!3#xZqP6+ zWO|szOif`-DEio)VpG^!^QsM&msQ-Pp zh(UU27@e>by1xR)Uwi4#Wru#Xgth_ki5C6;y!6kqUY2W%c0)61@?SX*uB=rf49^Bc#kIrB+dDMZ{9y2 z@c;KW4>vKu=p0lJQjoSt)&79wV2#t>08sj1#c3e)1D4@Q@I>q4U{qF;q4ebh(3%+R z;oXi0w44Nj4;)y3L#_UPp%C9&sB?vxLpcmkvIYk+#EHWonXdNRk3FD_r0W@cc5a!< zDUf!Gx1X|VqmjId=e9|wr~geJbsbW^Qlm#>lXvEp&&1B`r*o!31?)|41x0mskcgT? z;%O)?_xX!{Ma`9j8{{{bl{A6S(Q4f6xj_{`5Ch^sxwCEy3jcJ4SITJ)y-2non-j8} zq5SP$g6X2Lnd?=a?{*G?(qmvBlpW;SYTWyMPp-w#bm3xQ&|V!B{=V=*mT^Kch(VI6 z)|LkdM-2`p9+o@}28{KmE!oTeVb<5*MlSK`IXS9HKE!0X=?5AS?4J=uPBN}nDzt|P zGtg}o08}f~US@0A^v|N?l6y{>A;15q6ltx7^yFS_?Lv;P;63tEhAEzDG*zeMP&(!g zUs5PVA{H08Q8Fm=u1x7qJm;^?_(!}>_Y=|;!yVE3tY{ac6%)Hc6mablV6Q{VqBx@e z`y0u{A|Y@=X(5qaN$!y5`Z8gqh(<0^DzCGW83e${dIpE(lYa@_U+F3O-i9qcAv=}x z3=!Q*cxW0K`RD^El%(k3CT3FJ^L%;RBz%j6E!T?K@?X3oke0*JIKBj`S`rY{iIt)R znc8?`w=Lv$@qd{bWCH_Gl>_k$#O7BTkAmlh{!@w*a+IC~LRyXF$~~ZBf^Raf-sC{A zj7EgMJ4O2b#2hGtElRL-HvT2ChQT9Jn(9>oU@kzf2Po+vhMQntTf8ZJKd$&BU$MN& z+P}DESnc&&0Ruh&8zvh3YikWkg6}kn%i!ejWBje9Lc*k4jV48qvfj3H zX#k;1RQduTj6tWpC3ZsHQ9WbqjKpiLpjOg#n3Jn*-mHcf6`L`f~4;3?TpPT~!d;9^ppANy_-uBxc5uliNgU#Y!P5h6m zBUGkG_%G{&oS4=PNV@gS62t%L@3b-YWxfMIQ-X8K^2sT{4-$d3l-VvPIHUt>W6UjR zyuAw4?p##>gfIxyMkcELi@#EIZ2>vOhiQ=fsU&@&NX(kd=reKhDx0f|qYUt<(tPnW zDyYc^!-9aw6w@@A2NUfBT4F)^Hasj1uz#^SV6)O+!|3_-m^yY@d$`EWfC8H_=uOA~ zB|01DgKW)&yF4qON&sk_Mq)qqzzouEgXsD^!0BVQA}rP;UIXACU#VmrH&8~&j9NRS zR9w|=yX8yl0g+WMv;Hf6?NW@P zy;aQh&a)rak7~SNZX^Ccx)`80Gzn0j z^TkMEj15clCw0!;+Kq^JIsW0#>o;hk!s9$A`tJr<9Q}q|nMdyuV70ybc@DKE@t%vJ zPwqZdRI?I21wc*GCBPPNZyy2u89FoIDbi$<&Zd?JP^jWzJ#XbSYzgOP+NkRP&r>>rBIlGb!eg-oDM6E)a z$oSf!2zR;egNYn_NZ-)eY9k3TJ@&@n=*9P2g4AB>pf!@g1&8yQAOt%T*zr)&_Tj}(Brx**O2F$eE0h%<3Eus1&J z{oZZ?R4Z2(4{00*^^{Zio}2%WRDMn6Fymy{K)u$MLVA#CFVmKg!T0qLtY1+DWB`F= zrg%UM(`t+Fw|?XLcEFH5FWFAKePGE)T6zsXF+e(WPGQe$4)%4^J{V?Vs6EKFkf!d{ zh1*|~rhn!>g<$~(B-L@r1 z)oi*&ya|rov40xITZu6bAS2-LK_Zkow48HiUleO;6CiScb|&FBpp-ed54LE*abd`m z?Vxmv3LpL#sJz(+1kwsytdt1Laxmx-xg7H>PqPx_OatvyNorD@W_gaQ&4*#>IAl!M*`A5NS+eMV7yVC?{n+5K+N4Q7$=<3FlTvuHc}}dwx8(1s2gFVxorS{4!p~uPWkK+| zw@7T|RvlnD<`8sSIFji(0aFcFD}>0P*<=jfy-FswlDTBH@us<}{p>++k6Q3F`I4ee zEPmx@7i%G?xm9KTXAsbUv|i*M zIBeytvzoF><(ze2SDhtXw&+xnn|d;}w!m3`(mf`hbUKuGS#}3exBhfEf30T4c?jQV3owbJG9tr&FvQZ8omcgGW7ERJ#VOvO=nN9yX@j~pg%AfI zrFyjPuvE91Aqr?b3F_u%UGU7{{c!z`K!)FRAr&DpFEVjhr z$S8~Ux{4K`BR!V&NH@@lleHM?__+_s<<)}GE~cp+2N3)y#rnT*fwq{_>590Zikb<{ zL?8w;gRiyDT8{eyFaZ4tgE+GeRs7OM>Nj9aCKVsU62v9Sb3&qfbGzE+aqiKG>(e1GX3q}6s= zcWWIVEEBleW&UlNyoSgyX?iV9H1d1-qi$k{`yV3HJ5`2g#G>T#KuhyN$C*{FCMkkDYI^*hb{_v8uxt&qCKqI*v%JcDzvZ1VtX&QV!97NLoBi^3#b z9XrYBSid+KzdaBoeSdLzRKHy*&X*$ZrEEf&T?nD%^Wn0+rz0w`G@_{)%OsggSa ziwA(`Y#Y=Mr(i6-$tFfjo-@MsT!BhGru%aEM10qq1C&%m9~Vr z1FI@q;?)0(g!j8$(fouKDTM4zsC)$mePM-h4Ul5mVfmUr<(TK|{e?Ni?^@>f9%G zHKuy71=64Vi`S6Gu#}FB5R`0j^@hMJld9-a#A;E(em zf_1hsB;Ul}Sb3fvTwTsy(TU$ru+7dg*ahmMdsaxYM_FXjAPQ=N6>0d`iRyBLcK=A6o?5()2(L zQdxY536y6BK_bY5q0DFs`CeWmSF%8r6lzk962cnurwY8R489FI1?EgU4ua6Sfx&l1F!q>!Hc3G`hTsHF^(k!Ar}G1nOe7i= zzmc>5qm=2xgB#Ub#TW(St8oxVVXo~hju`nl5Py*Y@#~~wX3tT4+tD4`XYwW;87w}o zhzJ3PBQGTuORExqgRfTFzRq$!-?{A6ynMl<4!9*%r-fZCoe^8l=`Da1{i0O{iP)V5 zav|$-{1SWzPnSKpN~r$4cuFwQ7zNOrvfN!6lt=x-AAI*Ls$ERd(c(91qR#}8~W;;a`p z8{vut6pD4m0obHj1r~HS;Pi&>e~GsuAiE@Zb3f33PxlLz^HfTgS#I2mAlvqg6{x2; z2(_ERXmjbq2-nx->4@v%I&4U-k$`5`kr5HFw^;^s4i&20bk zj@g|hnu=r4&&Cb>RvgN=qYHNcG8`8-|MQwRkX-#I9fFceOu+-cSo{y3yOh9f*MBSci_jbT#W-l>WW)5y~AEFwp zjsp5cBA5rq!hM>_COd!`;2b5mIrVqp4t^rCR*ZB z+&!7xn=7c~sDm$=bB8}+iba~IX!4xMx}JtXQtECO>zc9<`;$32eM=)^0$=O&pt>jD zy_Y$8sS%Y)3Q(Z+R8wx7%;tb<(Dz4L+?Dp7^`*Rb>#C-OqE!GU7yv=9Md#5=lh0=Z zlYlHEyI935MRU|2;$EUe?sp)P{vy37hy5d?*jp&-%1)XVOEbrAK%f*?zOo_p2;l_C zzXFT8-@^XOQ@xLv{>p?`;!ehDB4k6WfWb!p*kim?PBXQtlu>k5|KC>vX*Us%SV%E*!mmM!ZmZlGisJryoB+8#t zH!;HpW;Nma;#lvtQ{f$a*n^bB_yc_wgF+-xr{o5bbmiL!o#B#ipf#iuza0oujCHd+m+ z;qV?AeJG?4C$S!QN=1SDVp~DUlHbRU?6D5p?Y1D56-sEx;S^}StDGwtk!r7HqmPhk z6BfyMVRD}zgG_U>eYL`*a?$}XZdx+m@F1XaF3PJ1@9AOQi+(|eIFI;j7rbV^d;Zo1 zNJ@P}5qtW1BgFXo?s35w|9VqAh$P04yeHGN>t6Tb<;x8z1!WUjhMWfoita)8vu`g( zWi`xz8WPX$VICL_pAAv}?V&8cT<+;Za7q_ip6i!K>87WE9vcp_fU6R#i>stod@K_I z%Sa5m2bGQI>f6qW5dUO;z*SZ3H8fPxvag8Gjj!yT1H|Fq*~y`&6KBg);^C=!;A;s0 z)&j0OEcg}EPKb*Qc_&cj$H`cp1WwyS3L4_+*sFa{NMnI-xeSnFx^2DJnf57iN{WX3@$Lm3Vfgxo*MUlJvb_2e#mtaFjQ(+D3bEe zfOtD^#MX-F6;!ox89ZtQ)4QRt7cXx%ef1aE|Gdk#Zckq}rqjYa8QmI)mG3gWJ^)pI z17;h1Q0JIV^W>S%G>Q*Rm$k2(RZ)|sfC4u8>$ma>O5%tJa&;?i3Ds+E(!|9x&yeL~ z7R92tLNL|=C_$fLH1C>YhiQH~?N=Ch29+P~7EDvi>rJkJZEv4;b682yK!+d$*B@YB8mABk$;9YnwEpsA5BG9>MJ|4t0%-+=ME@Qu z{B#dKuYCY+1Rw+IIX~Wb-u&#qSAPTof-&efFySg{f>U}h<(7{>9_ob2TMRonHPUDF_M) z45JT<Bq`<1FpQqixeV0Hrppc9Fq?1{X$kA(d+f^1xJxSu^jY7mOul zR8S{no=LEr*(6N51%ii`jMt)ZUehXF~I^km@pDaBI1hLt*@uMxIJK%qiZUB3#pHcDU^9|mf}{ErRc zc)!5<-`!+SVdVWhJF?~@jQU$Ch~(_i>8sFem%L3ghIqu;ragplM}+90I6#3HBAwm# zAV_=Tc?02TLcw>w^{fT?s2_LrS>$cCzoHTh{XK*spu-z>tgv{}>*4;e9>PbcMlu>4TeiXA zH{rK$;dBe_)gkWtDWakH&z#wd=s}I$f^7gXti<4$F;~niTvXZD7Iz>{7fVv-2eb`P zKx9#ypgl_4hi|%_(gdS@n2}&VQ4uDU)^xS0=J>;xMw2tkdHTQ5XcCa=$5xX^Uo`ev zfeB0;aus~ffu}GwE$kCe%;&k+~efk%^WHxSl`o^pShKO+xdm{LSs;w*%PdA}zak7}%9w z0VFqTsWlL5-zrs5-+m>M^EUI_&4}dt$ZzjItUbcKFZ3ARB5}Uj#n8dfp0nM2Z2G)s zx!3^Wg&5X-=$zgtUglmO$z>Hr-`4d!WdE9448QNb;dP6LS7($;mRa?x6e91ZiZ+Ca`ZRwy&PZbO79gzSy8U9PmRYcg7J1^Lx|=V(3qK zwbaR)owvX|DLqgE|5yW>UN4eGP}V<(n%;6@s=QE_l#;Ry8J#_)8qxJd#j{WPkbpM2 zz3FumHC40Ty)5H(sLB3HzX3;Nk5TgdH#gvsfAbGF4s~dFxHV-4)w)yOJ&y|pmV~%V z^3AFFwvaew!dv%9*-%GKstN|uB;#Ic#=6r|6?2xzqIIn_?w@*=)#Z?J-O>$BOf)wT zCFZtn4iY_+c=qh}($E{Tfq?;$ZO(NE(S3xy+c>lpqi+inb69yxa(hNlhD&oVc+J*N zS$PDcvC`}PPajmJv+prZh#3aI{PME>!exDW$#i4ASYFj_)xJMjRJuI~yvsrSu>e&Ha|G8ihuQ%>9 zAHu?ZaA9A#iU?|UW?OHJG4G8h)~~M`M#i$YSFbEbdIq?srzMFlmnRc^IBy{x8r&-W zUSs?4TX@uj8Y&zj`ZokPFM6jpT@>g-H^6`Y_Rseml$BfCv2Nn^`215$#WFdbRVTVX7}=7{iBh+ZaS1lh*gNQ)=T_F8$f`HWoGsE19LiB1+?HdX?*l3I zYPod9y&_7<3g1<->+kS{p{__txXpiNJ>5^U;IJEs>ERoS%F|6NX3SkZYvg-WCH}uI z=DsO>taO{^8wyiA`xPZ`dP2m{KCiy-uMU3Rgh|z6=%HZIPd~gi3UnDbx0FJIZo-q* zjHE6e4arD)6i06LrZ0;58UuB1E|Vo8aJ--3eq%mw{BH>3-n(o6>n6N)^#tdSc8(S5 zE&>hho)NA3<2ls+QNZ>=)FuT&Qm#OlY^ z4tt4QBr-6lMgPmnk1_ggUI?83e6l)SU7qyH^B#jri3E?s7QNX-Nf@4nqi`&z1?h1r zwMn7ljt-XGF6kjSY={Z`(a$^s!65hy*`%!rhJ63iiGg?sDZ>-LJ1BiD$4!7|=B)*DNNN9wJ9y-`1LoJBn!Gw#f zFA{2>w7YoLmys0J8@-yD%c=L;2zeg(zpPvc8@XAu0iWREuX}u=B9wtI2#BP@x0C>l zl&2E(iM&{No%b^#dS(&u=bt79k^gDN*X#W50gtGBY1n}K>vJ$@U{1SwPM0UkByA(9 zPqCm3TYoTJI+>=W?tEABWKbSOrwClOGpV(?FzU0((G=h=n9+c%~yG9G;U{yb~Wis#-M*; zkp`@iQq#oMwWiwa^JCxC$G*3%0mr@*SoWg#JpoIyy_sV`%GaA~em66`LH--JcZ~7v zAeNruSp;kv@P?FQ*-e&~Ul2crmW^Eg=2A7M<-nqN{D`O+jeHH+DHr% zB3bl1xXP?Zs9&VMg$}?pu$N2{a8ny56(nXhL&#}PKb)<2&k><5ge=NzvaE6vhe74#msh!K zGlCyV^OnFRiqxZjF>X6hQLnNMv)`PkoK)guVP(~yZw*e?yggHD66Iu!8~l3sON?Sm z0FLz4!TM;gN*=58=z5o3sHl7dn52}o-I+3Tq&?e?UP9T*SVHJ zeL$Hi<4j(y1(**vjYdtyrd7r>bq~>5^xEUOz%prE29-yk?-9INs6}@m9aR@Lpv*q* z_F;jiT&qE?UKGW?g4;afDDwypFKYc=1EAK|W3jUIMzb%@&+je;udNOmJ|bUNfCbwmv?iLLpn{&Z=g5Vz5uwc+e;JaNPB*u^i_=i~XBf|a0GyLi6W z%b7&M#SzqpP{CtG|cM@$+h1ychkc8TR)5PEUkern3dBoZ4z|enUeqWB6UlP7b?* z2w3&n!zm10PYu=p!c|rq0(@V4e*Gmam>lsx;pp^3BkDS3b~)N&pY<{x$_zV6556?* zPxgI8MKyVt@^MC2t=_%XOtrQZ9CWy3mGkT)?Ta!~io{rO@IA{j?E&o-sjww3qBjXu8-f7%5pYQC#WfP ze54OQcox32tPmkd_$o5B`Ktw-1Bt{(G~T;sQ_niZJ{BjQ&3eW~46()3X?dR)p1jGK zw3ir=(GSqOIbKzkN4`9A?Be$ksVBapan`{RagOc2t?{cX?0K_h3I*+cd z%RaWdmYp9^R|jH2TRY}ydA@r8cgfK_bu&StpXT{)E6ef#%&$Fq&~^bDJ@Wf$<9uR4 z_z$3T#+2yYE%+;660IRLB8~_`_Sex_!a(Q#{r=W8?^goiYb!*W!5wZd&%^8(o-25Kt#`FByph{4? z@~_!a@$*k3DlhdWF#$h}abe8Bqt8uF-lU>m#-5pMvF3M|WX+~a;q!cf`=qEh0Z2c6 z2+EN}YXXt%*@l%rS#Q@KowD^?sn%!BPk;a3;JqY0v(leZd+!~RPr6LP+Vgz495@6d zi5D-z#oaO;Y?r=`3Yta41ah{Q)ryl;3py^Ou9$4TYQNpQ5!#4Cm%8aYyttIz`yspq zlce{|c1x4Rq}?ECK1pCy0dsC{F)oR-qk1+k63aNTSLq3@rv6QheVoi1E~j_mSZJ5% zdOP>EZ~eoe|3n|FvdiAz7-v<5!!@}zUF{GBPC?}95h^SjHcM!L25a7429sqH^V&;k zIImKifUXfiX4d8ovuIWZ0*{Mh-gLM~ML~7SVvp{Cc)j9ysot*Jp{C&tz0#Ecs4p^yUat;KWTOHtCqW$z?pp~qs(39}mcU7a>q!pl4jEwHo zy>XuxnQdMuGfI?qTTD0l{(u)Q66}W41ZK=GrTySknRg?~T%{(Xcb6iFOZz!plRPdf zp~f;dk4K{q$`V?(jDr9mk5~`+4?c}i2KPrmnbIaoU+}BWrj5(UMikX-G!yxjaYC+8 zCublBhF0O@qTqkz5DQ^%3{-x~T;*yuyMhtYF8HGnZ6h({ZoSVmi+15YNQP>nqn7;< zW6o2W{X^;_FG^o45OA8uqeQMm-DdwZe;U4&$nUZMPQNVT;GC>#erxcN`ekNlTOkNy zu|wa1s8V24i58h!3Tr1@7UyG1_Z*T-afio`NGH&Ex|Xl1*epp(yo}{1Y7R zMY&=<_opkM-mWQ>F}lVny%De^6dWP?<3N?A0r$c$s6Ik%LUw1aMbum36sb_y8|l5e zNsqFdys`RvQ`M$pa+7DX$ZUi%DlR=TzE;0hR9%BDEui@@59YJ;t5A1R*^DCHDOj1H ztU?Oxc|r5@XqTq!$ynu8w2{X+&9+DRgolj>-oA%{oJkAfidWM=BUjh$m5KBj(Lv8B zn!Tgg=$STK&8rbo0oRJ&&w^LygBd-VzKl}!M*R<=JQk%Vf>xme#1j9_j*&mL0QLkf z_T`fZm|`a`0Rd?brJy1&C5D6TTe7BH2`(DEacq$h&4ZZsWKPvuXS)-CS}cHm2~NwP z#Y@>(wswAg8WkaYDv)%bGr*s2=g@sk)*TV8IGELWwvW0}Y)AW%R>7JlVi~9o=j~Uf zBazr1`n#uy;w3rU^s#;QR^AB^Ji0a_c^)th@y}j@8Mk8dRMj{DuBqd(O zw?ybt$+QR9xh!@Y*SG)BH5ORzQYjMM+8SuCjjokN$PbVws6&0ws;{17Fv9*Jkn&p| zLe@Z)F^;jjxu}i7NHdX>&N*Mc#^sD#-PPij)obbTa8c9A=kNYu-}mpAttYM#GI$2` zaP_mPjnwBKpav1bP|{bT=npKkGxl|O9kwDsba%E*Yao-BO!tfsT0C9Pj{?hbVpFZM z&3fvw^qk-`?*r7Lm5bGK8TQdC8Q}p7g?y#L#~`{JoIMctafZ=DyPOtr#_dR*fXyfr z#c2HwE?NPb=@^W*wdXzp>Wcrl427DBE0;Rcm@`@qAE1>|`bHgLf8XD?bpqXN)9L{N z-czxTGwCQKL$>b7!z}rb+6-zF!&`TW(G^2Q)pIziCVmCV@louQXnk^juYtj)g-2c4z}Qaq$SyPLf6Q2StP>JLF|)bf=@aYMsW3OcdF5wA zQhvEHS)Q-^Ms#vq-?Go9=4zz;(0FCe9(5Y}YsdO&w1Q zP?VOM{8UO`$M`zzKS4sP`Sra;RG+Tw*Xlo?cEeq8DhPhF%WX)$TEf(7Pc%#|Kg84P zAIA!NwI2t=qLN`N=B+`X=Xr(ZHwF&;a{&sA$8LjZ!a;|dlamRIv9B10MDb?UXY1=_ z%d6gg2g81I7+O2#sc`YYPq`?@xpfO?7u#5?+LGW@zbJqGbn-@EX)cmT>#89jq-C&N8)`+%3}LmoY6+dW=vc(xEaTn1EQy_Ao> zt@0_>){PHatQ*C$n)Json~dbNAG};XKISr3$%rpCDRy&WT`twm2@Xk3S9P$d$t~6; zt@_R6cN~z%8yzjqdG{$Uzw?{3k_H#Kuwi-1MIVWb(llWRH#zvjF zY5jsNe|@3-gN^m;_dPM}CXt&?-LdS&xkq_JoHhK;`#({NjCkFy1}m&|x8;jU^G)(r z=&Bc`UbW^WDQ-uw$88$o=$F^4P9})Ip{O=0`8yQjS^TiT`QSAx!F@HnQS7m*3RexB z3sZ^u`eVB8PD*RD$!A6aNmq(MgVZ|&V7Bc zlc~N$didjqOB?I=@+vIqj!f7lKY&OFCsos~%ljTVfToJC4Jsn)uP&=0fJ*qL+J0vc7+&yo z1rGsJ3MMjYwWBDLB(Q12B_J@9!5B$reb_ERA82Xu>%-#p;XDR|jyA@z!uyRapNygu z(t$z*H5y*3cd#aJoQ6kUAM8a+-^``Z;F9pzSi+G9tMmzSADh|+7W@|{^_J$O4a%Nn zo}#5EeOY{HqW(#%Rf_2E8|hm;e3f5jy2d^6{?c}DWfL~y(Gh|9xjCsaRO!L#N*hB0 zkcTLfErRkh9OQ}0V9 zk3%U0`OUU)u9H<-L{NrOfFqw%TtNXKFh6|I4NdI73G6wEUs2crDR~DV;ms+~QHE@Q z?#y?23&rP^*80`2C#yg;9n&)Jf0yL73m+z}UCLtaNRA#1N4e+y1UW~0h~OnPILJ9% z99@LLmZK9CUumL&xbN9yRtsun`=szjn5j59<6>(TTgg;LLbnD z-ifvT(r!g%xHQB zB85nzyd0`~hc$9DBoj|xE9@poj=DV%BuWd!JG6;-@(%;N0sjN@TUQtM1<~ZeZCetw z7e-|P%Ebob>6og;2GXAxy?8V-WJp5n!C9&?!~(8kDU5wRfb4KzA^VkG{jPIvoY4H9 zLwpSVr7f4=b@uaB8PjO0qHzAB`YeZ)Df;&}J!8kf49rx0AEJMs-U0oL?sDB4AO!~C zid{eldFG9TCbHMQWE+fEU01BST(Z>xU=XQL>go%p^3fI)8`V}RW!kg5Nd=qfDkpQ+ z>gzlM1+SD@Cm%5$MHScH{rJC@V<;|EU&Cd+AaT^v7EDA19b7tfCPVb@-Maw*(_k4D zx?Al*z=o#1Ef16sy$8^gM1O=H;dhjDqn{G>rp64XPQoSF21O#BA9UicKmFvHkT*%L zN@-E;GF77EW9wp$PSE@4O5U?i(6sFrwIAlrHR5i&3*wCo&ZJcm`>^a3Jg@%4FOd3q6vRglm=ds^VdMYWo zmsOs94ES4o1Hr~|pf@zh9{i2Riyq@d2_O3!`*g?ayLV3Jw16Rwgr;dvA*+*l1k_0_aGM<_)i8!6gazaE(SC*Zaz@v;)Uk)8pV2jgdVz=2wV!Y(NB zJHsg?bB4Dz!MQUW3xOR_RXkm9_hdWQbi8PUcG4_?CC5qmi2|ENZap|3ae0h1kgE~E${p#86*0XyBE2115T=Z=+@wZQ%o%&(qbU&X6 zLv`g}NC2|TCxh--0knL8j>quWeQ8VHnF;1FpP~jG=X!@y$KIeFC1|Tr%V4WJ|2go70Y|eb48|uORsyv(I-740o6n zo4?EMIhCKyA?9gf*rqwJ{Vz~nmlc#jpobS!m_S}{AoasHH}J1 z=4>JaN(JIF>`qeh-Wu-Iga+S&)0RR?anWAefigOWL^tF%}%&hl|=cs9V@cR^JonXggHmv;a# zzSvSN5ENb+PnP9^VE!B=)l{8POi_v&PAw_9TL83EWz)iv_Kl(M-!H+ZyEgYaEa>F% z#jK1(>lzEUC&?Ch?&mw=g>mfG$3M0E39tboSPW_e-ce5ehAw(5; zZ+8Hlmutyzn1G6B@dQXu?sJbS{9w|W!>&029R3UU>I|?ADe)Jp{0=hS>jTy@w1cEg zM(RC0`Yq-h@z4eyQ7ke>%Vk@mY@7c-?0xlLm0k0-BA^nAA|MEY0Z1w>D5ZiTDP2d9 zZfT?i3myT5(KK0p>bY)aSX}!#%KL7en$^KOekK5v!@&%@62C{T64r!=Jeg(Y#ttlT?yo|IN zrVD%ax@>N!tOrxc?#t8}u<;6n1X}_``@{qLAf%ugN5)Hcu5{VsLGyy!*hpvCnGe9o zu&Swd+UMZr=smnubt{doGd}f_KXq6XvF2C!qt*t)%*+hAkHd~GB#VdZ*zd_Ci5+v4 z%T$*8^4w2?vip99-fjnw(fv`HnGPU6P5`{TJI&Xagi)~-^TFKkz9Zz9rHC07sWzXV zYAQ^-AIC0Lpx;5W+!R5|rn62_1GGt^L?lm~=h`%HO-)VNKrjFl6~;qS*B#&V#a=(? zPi8#X965m>Wfdf{wlMS&dUt$)v2c8oHiB+@C<0sahDGyCu{*nOArNV{kRDJRxV(wY zRh%fFcw9Q>;Vt=YuIQy^u5_)@`uTRW5=W{MixLj8m;d#f67^8(YcJ#(`@OL3pCmVY z*MrM-D>lOdr@H1@5+$xxsubGYXfX6c$NbZg>=#1mHX@>_>xd%!pAQJn)U-9ypyJS7gvmF8<^0pN1s51U23ce4MK(BSJr1SPdr!JrFe5y6Bh%IJI;$*B zaTuJ3;3^@`JJZ6y=isxWZu7^y18)U zb3O$do#11C;)N`x?;a+*UW{Sd6qk6l7b)TKefU{Z;d!PPX_Dz$5S-)g8PW#?k$TLE zks4Pmr&_6$w>aBK8PE?aCj7cc8M&GAbz6cE2>6R-^z!MF>1(#@U8UyhieW9ex3Z=N zXULUu+PP6m=Y1k`e=U+<&`ZS&pwVBOYw5y9>5H0l+VIB7t z6*I`5TUB9W80vMmSN6<$;n$NW*u>gCv29@MsFd~em#sUFyB}Y6%5^EsV+&{_PQyGs z`Dd`mw}HWM#mRYudz+uI)p8&#Nrk_mwaP!7)0iGjW59^1*!i4Fw8Y7NisW0tbm`C( z`rKyHIA{otq4IB#R2(g0*KfapB>sI+rXkeH)buL}+-9t0rjtFrmS;AB;%eC5SZ)ft zkY$$~O-2QGiMInRLwk(ifqdpBVDCS44i??*NoliE0V?2Jl^~sS$BRNAv$5(rKWS#_h%A%+1e4QYj$EJ9%|8rM;fBsQu7R*(-NYtQWG_t2&Dh$ArhEjB}E^=Y*5x* z7aLEDRN8qu%lo;_ucB@fiw2Mp`3vbr1YG=RNZBr^Yh`_w>AEEzZ3o-<7yVxO zpJ=#etvGf1A8qbV9sN0_dCd^xEIKoy(QVE%>x1j87MEYtN0Ms$GWwb3RkdK-|vu2qCwO`g_Xw~&`r6qq)MD*?mOV9PMITKYi=9dFb zjzXes0+RFng-r}sG`k;f%ygz|-tFU-9GE#}EMAFT2}X!@+zubkVzPmFvOckLmSsO(i5?B9^+f1iQi83y`@ z9zdKHR|{}2mS3uwtX_I{`0!!r@&}*YtKMPI(b4Iibqc`yii^C@zy-EAdWGfEzTX#+ zK;S);a(+=!3nbSLP;Q=ayc_5RBkUU+zu0r5XsffPZ0#zm;@0BU0!BQtEaInoBW~a2 z*DW*4q4A8wvHBMJep-tk4|t3&hBD&{7GrbwLm*KuY}SiB^YI~ZyyJic+OBaG(t8{U zxSlx&Uz`3Kp?-NfDjrOTur(GM0e^iP;4toi?Bwj6%O&z(e)iXt-TeqCu-ZOHoct{j z`{lN{5wcG(=#V`X7<2snrQ)u`2V;4aR`{PVDk$~dY;6N#A_74cBa*m%jFgmA zI!TPQW3tk5>-?EBXL@!dLoNwIEA=si_+mHiXYbi*LxgZK7?{QzygzS%e>T}m8LG7o znyXt^((NHRuJ2xfPT)zS!sOpXZ@=tSs`tm;Q>hvfMEq~)KEafMe4HBS3cMsb*h67J-e>((A$^v_P zby@6stuM2b_4c@M`JAtO+IqR@wnB;HM7i$xe(e=K{7ufy`EP$Y*T3hOGc1}?tf@oO zfU+6VHqvQ{q6lb%a`}G$%5=v~gYFE{PHyxq$8IuCb5LQ$^xJa*{t-gXV|ih!k8^nP zsofqDN3ZrxE9l}(^G-3av9VoAZYTa{34cB90{dJ-j=P6GUIfty1L&H9L9EmOLZ8GN z&yIT^odL*C8ej+uhn>w8bCBdU0Iu>*e{>5%dbrX>=*)3$G9u;8wOJf)j}yX$-dV#0 z`0%}Z+TYFT0(k%~IQ|aXpKFp(P$P_guAvOhLY0LHEzT2HQUa@;kd#!9XxJc?F4_UH zmvTWQwj-hmqf`8}_)KJ%xRM{Vbd3?*GN6Sg2?a=E$_c>E1W>FYsx;9GyA`ACL{2-( zbHZMxls#Khz%C(dy);m{HoT|c!VAY>bf64x2`u|6K>KY=)s_l0Cg64eCgik!kCfN0 zfDtf`g#8v8O63o7xf5KD@V2B*p_u?=4FucS9(Mh{yu_<3oia%M4Cswb8e}=6D)-)D1RGvvCc94rS zEzftR`j1Rzu<^3rk_OZ>lwIFXX*N;71!IC7-$XA)`_ubZ?d7%>Z1zbYfLqu_M2JZF z9ZJWl(|8i;sUKvMw(PEhr_<4SGqquR$5LJlU<dP8W-C_NqHEA2Cf8x4^7xUPwcaZ0)Wl_4Uu}A zg{5#kX#dZFFfDKT18lvuDTB=~(=;!aplK~c-GgJDfP{n=jE^g)Z2;6bJ^9#Bcl7mR znwN3;=Fr;2V)IZaJ9(`OZDq)oFTBQ4GERSr)96w-fMmrt9||$7L?M7g>F4TG;$$2g z@qd4KUo}h(`daA{(|h^C?tJCI9`vn}&Yp@%Bcn5XjZikEhba!UB-W6a>O;EPbX*z%8ae+ifRK-#~Ly~00 zB3$zWyH?Lbhm{PQ^l;dEDyB-6rKP2fTG}ev1AF}?`RKBWittl^@Lhj~a!5+&_;-9h zgqMS3LgUm3R5~J(l4~V|C{b;|;*%tF^VS)bCtJ9l4ip+rW`_naDoI;r5-|Zk#l~+n zPskKToB>#t&cHN3V2+kNC-Us@H>Y+WO@%0AJ*VI%2!0WT+zU8)vgz_obF;2%a28{Y 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 F{{vktfA9bR literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 000000000..80f52f125 --- /dev/null +++ b/index.html @@ -0,0 +1,246 @@ + + + + + + Rust 程序设计语言 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Rust 程序设计语言

    +
    +

    title-page.md +
    +commit d94e03a18a2590ed3f1c67b859cb11528d2a2d5c

    +
    +

    本书的英文原版作者为 Steve Klabnik 和 Carol Nichols,并由 Rust 社区补充完善。本简体中文译本由 Rust 中文社区翻译。

    +

    本书假设你使用 Rust 1.78.0(2024-05-02 发布)或更新的版本。请查看 第 1 章的 “安装” 部分 了解如何安装和升级 Rust。

    +

    本书的英文原版 HTML 格式可以在 https://doc.rust-lang.org/stable/book/ 在线阅读;使用 rustup 安装的 Rust 也包含一份英文离线版,运行 rustup docs --book 即可打开。

    +

    本书还有一些社区 翻译版本。简体中文译本可以在 https://kaisery.github.io/trpl-zh-cn/ 在线阅读。

    +

    本书也有 由 No Starch Press 出版的纸质版和电子版

    +
    +

    🚨 想要具有互动性的学习体验吗?试试 Rust Book 的另一个版本,其中包括测验、高亮、可视化等功能https://rust-book.cs.brown.edu

    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/mark.min.js b/mark.min.js new file mode 100644 index 000000000..163623188 --- /dev/null +++ b/mark.min.js @@ -0,0 +1,7 @@ +/*!*************************************************** +* mark.js v8.11.1 +* https://markjs.io/ +* Copyright (c) 2014–2018, Julian Kühnel +* Released under the MIT license https://git.io/vwTVl +*****************************************************/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Mark=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,a=function a(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),o=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,c=0;a=Array.prototype.slice.call(a);var u=function(){--s<=0&&o(c)};s||u(),a.forEach(function(t){e.matches(t,i.exclude)?u():i.onIframeReady(t,function(e){n(t)&&(c++,r(e)),u()},u)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:null===t?e.nextNode():e.nextNode()&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach(function(e,t){e.val===n&&(i=t,o=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach(function(e){e.handled||i.getIframeContents(e.val,function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o,a=this,s=this.createIterator(t,e,r),c=[],u=[],l=void 0,h=void 0;void 0,o=a.getIteratorNode(s),h=o.prevNode,l=o.node;)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(l,h,e,c)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return u.push(e)},r)}),u.push(l);u.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(c,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),a=o.length;a||i(),o.forEach(function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,function(){--a<=0&&i()})};r.iframes?r.waitForIframes(o,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every(function(t){return!r.call(e,t)||(i=!0,!1)}),i}return!1}}]),e}(),o=function(){function e(n){t(this,e),this.opt=r({},{diacritics:!0,synonyms:{},accuracy:"partially",caseSensitive:!1,ignoreJoiners:!1,ignorePunctuation:[],wildcards:"disabled"},n)}return n(e,[{key:"create",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),new RegExp(e,"gm"+(this.opt.caseSensitive?"":"i"))}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==a&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(a)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynonyms(a)+"|"+this.processSynonyms(s)+")"+r))}return e}},{key:"processSynonyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":""})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":""})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach(function(i){n.every(function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="";switch(("string"==typeof n?[]:n.limiters).forEach(function(e){i+="|"+t.escapeStr(e)}),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,a=i.end;i.valid&&(e.start=o,e.length=a-o,n.push(e),r=a)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,a=t-o,s=parseInt(e.start,10)-a;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=i.textContent,i.parentNode.replaceChild(a,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every(function(a,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(a.node))return!1;var u=t-a.start,l=(n>a.end?a.end:n)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(l+a.start);if(a.node=o.wrapRangeInTextNode(a.node,u,l),e.value=h+f,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=l),e.nodes[n].end-=l)}),n-=l,i(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0})}},{key:"wrapGroups",value:function(e,t,n,r){return r((e=this.wrapRangeInTextNode(e,t,t+n)).previousSibling),e}},{key:"separateGroups",value:function(e,t,n,r,i){for(var o=t.length,a=1;a-1&&r(t[a],e)&&(e=this.wrapGroups(e,s,t[a].length,i))}return e}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[a];){if(o.opt.separateGroups)t=o.separateGroups(t,i,a,n,r);else{if(!n(i[a],t))continue;var s=i.index;if(0!==a)for(var c=1;c + + + + + Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Rust 程序设计语言

    +
    +

    title-page.md +
    +commit d94e03a18a2590ed3f1c67b859cb11528d2a2d5c

    +
    +

    本书的英文原版作者为 Steve Klabnik 和 Carol Nichols,并由 Rust 社区补充完善。本简体中文译本由 Rust 中文社区翻译。

    +

    本书假设你使用 Rust 1.78.0(2024-05-02 发布)或更新的版本。请查看 第 1 章的 “安装” 部分 了解如何安装和升级 Rust。

    +

    本书的英文原版 HTML 格式可以在 https://doc.rust-lang.org/stable/book/ 在线阅读;使用 rustup 安装的 Rust 也包含一份英文离线版,运行 rustup docs --book 即可打开。

    +

    本书还有一些社区 翻译版本。简体中文译本可以在 https://kaisery.github.io/trpl-zh-cn/ 在线阅读。

    +

    本书也有 由 No Starch Press 出版的纸质版和电子版

    +
    +

    🚨 想要具有互动性的学习体验吗?试试 Rust Book 的另一个版本,其中包括测验、高亮、可视化等功能https://rust-book.cs.brown.edu

    +
    +

    前言

    +
    +

    foreword.md +
    +commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f

    +
    +

    Rust 程序设计语言的本质实际在于 赋能empowerment):无论你现在编写的是何种代码,Rust 能让你在更为广泛的编程领域走得更远,写出自信。(这一点并不显而易见)

    +

    举例来说,那些“系统层面”的工作涉及内存管理、数据表示和并发等底层细节。从传统角度来看,这是一个神秘的编程领域,只为浸润多年的极少数人所触及,也只有他们能避开那些臭名昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。

    +

    Rust 破除了这些障碍:它消除了旧的陷阱,并提供了伴你一路同行的友好、精良的工具。想要 “深入” 底层控制的程序员可以使用 Rust,无需时刻担心出现崩溃或安全漏洞,也无需因为工具链不靠谱而被迫去了解其中的细节。更妙的是,语言设计本身会自然而然地引导你编写出可靠的代码,并且运行速度和内存使用上都十分高效。

    +

    已经在从事编写底层代码的程序员可以使用 Rust 来提升信心。例如,在 Rust 中引入并行是相对低风险的操作,因为编译器会替你找到经典的错误。同时你可以自信地采取更加激进的优化,而不会意外引入崩溃或漏洞。

    +

    但 Rust 并不局限于底层系统编程。它表达力强、写起来舒适,让人能够轻松地编写出命令行应用、网络服务器等各种类型的代码——在本书中就有这两者的简单示例。使用 Rust 能让你把在一个领域中学习的技能延伸到另一个领域:你可以通过编写网页应用来学习 Rust,接着将同样的技能应用到你的 Raspberry Pi(树莓派)上。

    +

    本书全面介绍了 Rust 为用户赋予的能力。其内容平易近人,致力于帮助你提升 Rust 的知识,并且提升你作为程序员整体的理解与自信。欢迎你加入 Rust 社区,让我们准备深入学习 Rust 吧!

    +

    —— Nicholas Matsakis 和 Aaron Turon

    +

    简介

    +
    +

    ch00-00-introduction.md +
    +commit 1fb74c3f1d8aeba39373e9f4cdb9a4bdca95604f

    +
    +
    +

    注意:此书的英文原版与 No Starch Press 出版的《The Rust Programming Language》纸质版和电子版一致。

    +
    +

    欢迎阅读《Rust 程序设计语言》,这是一本关于 Rust 的入门书籍。Rust 程序设计语言能帮助你编写更快、更可靠的软件。在编程语言设计中,高层的工程学与底层的控制往往是难以兼得的;而 Rust 则试图挑战这一矛盾。通过平衡强大的技术能力与优秀的开发者体验,Rust 为你提供了控制底层细节(如内存使用)的选项,而无需承受通常与此类控制相关的所有繁琐细节。

    +

    Rust 适合哪些人

    +

    Rust 因多种原因适合许多人。让我们看看几个最重要的群体。

    +

    开发者团队

    +

    Rust 已证明是一个对于具有不同系统编程知识水平的大型开发团队协作而言,非常高效的工具。底层代码容易出现各种微妙的错误,在大多数其他语言中,这些错误只能通过广泛的测试和经验丰富的开发者的仔细审核代码来捕捉。在 Rust 中,编译器充当了守门员的角色,拒绝编译包含这些难以察觉的错误的代码,包括并发错误。通过与编译器合作,团队可以将时间集中在程序逻辑上,而不是追踪 bug。

    +

    Rust 也为系统编程世界带来了现代化的开发工具:

    +
      +
    • Cargo 是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。
    • +
    • Rustfmt 格式化工具确保开发者遵循一致的代码风格。
    • +
    • rust-analyzer 为集成开发环境(IDE)提供了强大的代码补全和内联错误信息功能。
    • +
    +

    通过使用 Rust 生态系统中丰富的工具,开发者在编写系统级代码时可以更加高效。

    +

    学生

    +

    Rust 适合学生群体,也适合有兴趣学习系统概念的人。许多人通过 Rust 学习了操作系统开发等主题。社区对学生问题非常欢迎并乐于回答。通过类似这本书以及其他内容的努力,Rust 团队希望使系统概念能为更多人所易于理解,特别是编程新手。

    +

    公司

    +

    数百家大小规模的公司在生产环境中使用 Rust 完成各种任务,包括命令行工具、Web 服务、DevOps 工具、嵌入式设备、音视频分析与转码、加密货币、生物信息学、搜索引擎、物联网(IOT)程序、机器学习,甚至是 Firefox 浏览器的重要部分。

    +

    开源开发者

    +

    Rust 适合那些希望构建 Rust 编程语言、社区、开发工具和库的开发者。我们非常欢迎你为 Rust 语言作出贡献。

    +

    重视速度和稳定性的开发者

    +

    Rust 适合那些渴望在编程语言中寻求速度与稳定性的开发者。对于速度来说,既是指 Rust 可以运行的多快,也是指编写 Rust 程序的速度。Rust 编译器的检查确保了增加功能和重构代码时的稳定性,这与那些缺乏这些检查的语言中脆弱的祖传代码形成了鲜明对比,开发者往往不敢去修改这些代码。通过追求零成本抽象(zero-cost abstractions)—— 将高级语言特性编译成底层代码,并且与手写的代码运行速度同样快。Rust 努力确保代码又安全又快速。

    +

    这里提到的只是几个较大的受益群体,Rust 语言也希望能支持更多其他用户。总的来说,Rust 最重要的目标是消除数十年来程序员习以为常的取舍,让安全和高效、速度和易读易用可以兼得。试试看 Rust,说不定它的选择就适合你。

    +

    本书适合哪些人

    +

    本书假设你已经有其他编程语言的经验,任何语言均可,我们尽可能让各种语言背景的人都能读懂。本书的重点不是程序设计本身,也不是程序设计思维。如果你完全没学过编程,建议你先阅读专门介绍程序设计的书籍。

    +

    如何阅读本书

    +

    本书大体上假设您按从头到尾的顺序阅读。后面的章节建立在前面章节概念的基础上。前面的章节可能不会深入介绍部分主题,而是留待后续章节重新讨论。

    +

    本书分为两类章节:概念章节和项目章节。在概念章节中,我们学习 Rust 的某个方面。在项目章节中,我们应用目前所学的知识一同构建小型程序。第二、十二和二十章是项目章节;其余都是概念章节。

    +

    第一章介绍如何安装 Rust,如何编写一个 “Hello, world!” 程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第二章是一个编写 Rust 语言的实战介绍,我们会构建一个猜数字游戏。我们会站在较高的层次介绍一些概念,而后续章节将提供更多细节。如果你希望立刻就动手实践一下,第二章是开始的好地方。第三章介绍 Rust 中类似其他编程语言的特性,第四章会学习 Rust 的所有权系统。如果你是一个特别细致的学习者,喜欢在进入下一环节之前学习每一个细节,你可能会想要跳过第二章,直接阅读第三章,等到你想要通过项目应用所学到的细节时再回到第二章。

    +

    第五章讨论结构体(struct)和方法,第六章介绍枚举(enum)、match 表达式和 if let 控制流结构。在 Rust 中,创建自定义类型需要用到结构体和枚举。

    +

    第七章介绍 Rust 的模块(module)系统,其中的私有性规则用来组织代码和公开的 API(应用程序接口)。第八章讨论标准库提供的常见集合数据结构,例如 Vector(向量)、字符串和 Hash Map(散列表)。第九章探索 Rust 的错误处理的理念与技术。

    +

    第十章深入介绍泛型(generic)、Trait 和生命周期(lifetime),这些功能让你能够定义适用于多种类型的代码。第十一章全面讲述了测试,因为就算 Rust 有安全保证,也需要测试确保程序逻辑正确。第十二章中将会构建我们自己的 grep 命令行工具的功能子集实现,用于在文件中搜索文本。为此会用到之前章节讨论的很多概念。

    +

    第十三章探索闭包(closure)和迭代器(iterator),这两个 Rust 特性来自函数式编程语言。第十四章会深入探讨 Cargo 并介绍分享代码库的最佳实践。第十五章讨论标准库提供的智能指针以及相关的 Trait。

    +

    第十六章将引导我们了解不同的并发编程模型,并探讨 Rust 如何帮助你无畏地进行多线程编程。第十七章将在此基础上进一步探索 Rust 的 async 和 await 语法,以及它们所支持的轻量级并发模型。

    +

    第十八章着眼于 Rust 风格与你可能比较熟悉的 OOP(面向对象编程)原则之间的比较。

    +

    第十九章介绍模式和模式匹配,它是在 Rust 程序中表达思想的有效方式。第二十章是一个高级主题大杂烩,包括不安全 Rust(unsafe Rust)、宏(macro)和更多关于生命周期、Trait、类型、函数和闭包的内容。

    +

    第二十一章我们将会完成一个项目,实现一个底层的、多线程的 Web 服务器!

    +

    最后的附录包含了一些关于该语言的实用信息,其格式更像是参考资料。附录 A 涵盖了 Rust 的关键字,附录 B 涵盖了 Rust 的运算符和符号,附录 C 涵盖了标准库提供的可派生 Trait,附录 D 涵盖了一些有用的开发工具,而附录 E 解释了 Rust 版本。在附录 F 中,你可以找到本书的翻译版本,而在附录 G 中,我们将讨论 Rust 是如何制作的以及什么是 nightly Rust。

    +

    阅读本书没有错误的方式:如果你想跳过前面的内容,尽管跳过!如果你遇到任何困惑,可能需要回到前面的章节。请采取对你最有效的方式。

    +

    +

    学习 Rust 的一个重要部分是学会如何阅读编译器显示的错误信息:它们会指引你编写出能运行的代码。为此,我们将提供许多不能编译的示例,以及在每种情况下编译器将显示的错误信息。请知悉,如果你输入并运行一个随机示例,它可能无法编译!确保你阅读了示例周围的文本,以判断你尝试运行的示例是否出错。Ferris 也将帮助你区分那些不是意在工作的代码:

    +
    + + + +
    Ferris含义
    Ferris 头上有问号这段代码无法通过编译!
    Ferris 举起两只钳子这段代码会 Panic!
    Ferris 举起一只钳子并耸肩这段代码的运行结果不符合预期。
    +
    +

    在大部分情况,我们会指导你将无法通过编译的代码修改为正确版本。

    +

    源代码

    +

    生成本书的源码可以在 GitHub 上找到。

    +
    +

    译者注:此译本也有 GitHub 仓库,欢迎提交 Issue 和 PR :)

    +
    +

    入门指南

    +
    +

    ch01-00-getting-started.md +
    +commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f

    +
    +

    让我们开始 Rust 之旅!有很多内容需要学习,但每次旅程总有起点。在本章中,我们会讨论:

    +
      +
    • 在 Linux、macOS 和 Windows 上安装 Rust
    • +
    • 编写一个打印 Hello, world! 的程序
    • +
    • 使用 Rust 的包管理器和构建系统 cargo
    • +
    +

    安装

    +
    +

    ch01-01-installation.md
    +commit d5eb2f7a8e9c6f51b4478f9cd46f55448e2ca2c1

    +
    +

    第一步是安装 Rust。我们会通过 rustup 下载 Rust,这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要联网。

    +
    +

    注意:如果你出于某些理由倾向于不使用 rustup,请到 Rust 的其他安装方法页面 查看其它安装选项。

    +
    +

    接下来的步骤会安装最新的稳定版 Rust 编译器。Rust 的稳定性确保本书所有示例在最新版本的 Rust 中能够继续编译。不同版本的输出可能略有不同,因为 Rust 经常改进错误信息和警告。也就是说,任何通过这些步骤安装的最新稳定版 Rust,都应该能正常运行本书中的内容。

    +
    +

    命令行标记

    +

    本章和全书中,我们会展示一些在终端中使用的命令。所有需要输入到终端的行都以 $ 开头。你不需要输入$字符;这里显示的$字符表示命令行提示符,仅用于提示每行命令的起点。不以 $ 起始的行通常展示前一个命令的输出。另外,PowerShell 专用的示例会采用 > 而不是 $

    +
    +

    在 Linux 或 macOS 上安装 rustup

    +

    如果你使用 Linux 或 macOS,打开终端并输入如下命令:

    +
    $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
    +
    +

    此命令下载一个脚本并开始安装 rustup 工具,这会安装最新稳定版 Rust。过程中可能会提示你输入密码。如果安装成功,将会出现如下内容:

    +
    Rust is installed now. Great!
    +
    +

    另外,你还需要一个 链接器(linker),这是 Rust 用来将其编译的输出连接到一个文件中的程序。很可能你已经有一个了。如果你遇到了链接器错误,请尝试安装一个 C 编译器,它通常包括一个链接器。C 编译器也很有用,因为一些常见的 Rust 包依赖于 C 代码,因此需要安装一个 C 编译器。

    +

    在 macOS 上,你可以通过运行以下命令获得 C 语言编译器:

    +
    $ xcode-select --install
    +
    +

    Linux 用户通常需要根据发行版(distribution)文档安装 GCC 或 Clang。比如,如果你使用 Ubuntu,可以安装 build-essential 包。

    +

    在 Windows 上安装 rustup

    +

    在 Windows 上,前往 https://www.rust-lang.org/install.html 并按照说明安装 Rust。在安装过程的某个步骤,你会被提示要安装 Visual Studio。它提供了一个链接器和编译程序所需的原生库。如果你在此步骤需要更多帮助,请访问 https://rust-lang.github.io/rustup/installation/windows-msvc.html

    +

    本书的余下部分会使用能同时运行于 cmd.exe 和 PowerShell 的命令。如果存在特定差异,我们会解释使用哪一个。

    +

    故障排除(Troubleshooting)

    +

    要检查是否正确安装了 Rust,打开命令行并输入:

    +
    $ rustc --version
    +
    +

    你应该可以看到按照以下格式显示的最新稳定版本的版本号、对应的 Commit Hash 和 Commit 日期:

    +
    rustc x.y.z (abcabcabc yyyy-mm-dd)
    +
    +

    如果看到了这样的信息,就说明 Rust 已经安装成功了!

    +
    +

    译者:恭喜入坑!(此处应该有掌声!)

    +
    +

    如果没看到,请按照下面说明的方法检查 Rust 是否在您的 %PATH% 系统变量中。

    +

    在 Windows CMD 中,请使用命令:

    +
    > echo %PATH%
    +
    +

    在 PowerShell 中,请使用命令:

    +
    > echo $env:Path
    +
    +

    在 Linux 和 macOS 中,请使用命令:

    +
    $ echo $PATH
    +
    +

    如果一切正确但 Rust 仍不能使用,有许多地方可以求助。您可以在社区页面查看如何与其他 Rustaceans(Rust 用户的称号,有自嘲意味)联系。

    +

    更新与卸载

    +

    通过 rustup 安装了 Rust 之后,更新到最新版本就很简单了,只需要在您对应的命令行中运行如下更新脚本:

    +
    $ rustup update
    +
    +

    若要卸载 Rust 和 rustup,请在命令行中运行如下卸载脚本:

    +
    $ rustup self uninstall
    +
    +

    本地文档

    +

    安装程序也自带一份文档的本地拷贝,可以离线阅读。运行 rustup doc 在浏览器中查看本地文档。

    +

    任何时候,如果你拿不准标准库中的类型或函数的用途和用法,请查阅应用程序接口(application programming interface,API)文档!

    +

    Hello, World!

    +
    +

    ch01-02-hello-world.md +
    +commit 1fb74c3f1d8aeba39373e9f4cdb9a4bdca95604f

    +
    +

    既然安装好了 Rust,是时候来编写第一个 Rust 程序了。当学习一门新语言的时候,使用该语言在屏幕上打印 Hello, world! 是一项传统,我们将沿用这一传统!

    +
    +

    注意:本书假设你熟悉基本的命令行操作。Rust 对于你的编辑器、工具,以及代码位于何处并没有特定的要求,如果你更倾向于使用集成开发环境(IDE),而不是命令行,请尽管使用你喜欢的 IDE。目前很多 IDE 都在一定程度上支持 Rust;查看 IDE 文档以了解更多细节。Rust 团队一直致力于借助 rust-analyzer 提供强大的 IDE 支持。详见附录 D

    +
    +

    创建项目目录

    +

    首先创建一个存放 Rust 代码的目录。Rust 并不关心代码的存放位置,不过对于本书的练习和项目来说,我们建议你在 home 目录中创建 projects 目录,并将你的所有项目存放在这里。

    +

    打开终端并输入如下命令创建 projects 目录,并在 projects 目录中为 “Hello, world!” 项目创建一个目录。

    +

    对于 Linux、macOS 和 Windows PowerShell,输入:

    +
    $ mkdir ~/projects
    +$ cd ~/projects
    +$ mkdir hello_world
    +$ cd hello_world
    +
    +

    对于 Windows CMD,输入:

    +
    > mkdir "%USERPROFILE%\projects"
    +> cd /d "%USERPROFILE%\projects"
    +> mkdir hello_world
    +> cd hello_world
    +
    +

    编写并运行 Rust 程序

    +

    接下来,新建一个源文件,命名为 main.rs。Rust 源文件总是以 .rs 扩展名结尾。如果文件名包含多个单词,那么按照命名习惯,应当使用下划线来分隔单词。例如命名为 hello_world.rs,而不是 helloworld.rs

    +

    现在打开刚创建的 main.rs 文件,输入示例 1-1 中的代码。

    +
    +

    文件名:main.rs

    +
    fn main() {
    +    println!("Hello, world!");
    +}
    +
    示例 1-1:一个打印 `Hello, world!` 的程序
    +
    +

    保存文件,并回到当前目录为“~/projects/hello_world”的终端窗口。在 Linux 或 macOS 上,输入如下命令,编译并运行文件:

    +
    $ rustc main.rs
    +$ ./main
    +Hello, world!
    +
    +

    在 Windows 上,输入命令 .\main.exe,而不是 ./main

    +
    > rustc main.rs
    +> .\main.exe
    +Hello, world!
    +
    +

    不管使用何种操作系统,终端应该打印字符串 Hello, world!。如果没有看到这些输出,回到安装部分的 “故障排除” 小节查找有帮助的方法。

    +

    如果 Hello, world! 出现了,恭喜你!你已经正式编写了一个 Rust 程序。现在你成为一名 Rust 程序员,欢迎!

    +

    分析这个 Rust 程序

    +

    现在,让我们回过头来仔细看看这个 “Hello, world!” 程序。这是第一块拼图:

    +
    fn main() {
    +
    +}
    +

    这几行定义了一个名叫 main 的函数。main 函数是一个特殊的函数:在可执行的 Rust 程序中,它总是最先运行的代码。第一行代码声明了一个叫做 main 的函数,它没有参数也没有返回值。如果有参数的话,它们的名称应该出现在小括号 () 中。

    +

    函数体被包裹在 {} 中。Rust 要求所有函数体都要用花括号包裹起来。一般来说,将左花括号与函数声明置于同一行并以空格分隔,是良好的代码风格。

    +
    +

    注:如果你希望在 Rust 项目中保持一种标准风格,可以使用名为 rustfmt 的自动格式化工具将代码格式化为特定的风格(更多内容详见附录 D 中的 rustfmt)。Rust 团队已经在标准的 Rust 发行版中包含了这个工具,就像 rustc 一样。所以它应该已经安装在你的电脑中了!

    +
    +

    main 函数中有如下代码:

    +
    #![allow(unused)]
    +fn main() {
    +    println!("Hello, world!");
    +}
    +

    这行代码完成这个简单程序的所有工作:在屏幕上打印文本。这里有四个重要的细节需要注意。首先 Rust 的缩进风格使用 4 个空格,而不是 1 个制表符(tab)。

    +

    第二,println! 调用了一个 Rust 宏(macro)。如果是调用函数,则应输入 println(没有!)。我们将在第二十章详细讨论宏。现在你只需记住,当看到符号 ! 的时候,就意味着调用的是宏而不是普通函数,并且宏并不总是遵循与函数相同的规则。

    +

    第三,"Hello, world!" 是一个字符串。我们把这个字符串作为一个参数传递给 println!,字符串将被打印到屏幕上。

    +

    第四,该行以分号结尾(;),这代表一个表达式的结束和下一个表达式的开始。大部分 Rust 代码行以分号结尾。

    +

    编译和运行是彼此独立的步骤

    +

    你刚刚运行了一个新创建的程序,那么让我们检查此过程中的每一个步骤。

    +

    在运行 Rust 程序之前,必须先使用 Rust 编译器编译它,即输入 rustc 命令并传入源文件名称,如下:

    +
    $ rustc main.rs
    +
    +

    如果你有 C 或 C++ 背景,就会发现这与 gccclang 类似。编译成功后,Rust 会输出一个二进制的可执行文件。

    +

    在 Linux、macOS 或 Windows 的 PowerShell 上,在 shell 中输入 ls 命令可以看见这个可执行文件。

    +
    $ ls
    +main  main.rs
    +
    +

    在 Linux 和 macOS,你会看到两个文件。在 Windows PowerShell 中,你会看到同使用 CMD 相同的三个文件。在 Windows 的 CMD 上,则输入如下内容:

    +
    > dir /B %= the /B option says to only show the file names =%
    +main.exe
    +main.pdb
    +main.rs
    +
    +

    这展示了扩展名为 .rs 的源文件、可执行文件(在 Windows 下是 main.exe,其它平台是 main),以及当使用 CMD 时会有一个包含调试信息、扩展名为 .pdb 的文件。从这里开始运行 mainmain.exe 文件,如下:

    +
    $ ./main # Windows 是 .\main.exe
    +
    +

    如果这里的 main.rs 是上文所述的 “Hello, world!” 程序,那么在终端上就会打印出 Hello, world!

    +

    如果你更熟悉动态语言,如 Ruby、Python 或 JavaScript,则可能不习惯将编译和运行分为两个单独的步骤。Rust 是一种 预编译静态类型ahead-of-time compiled)语言,这意味着你可以编译程序,并将可执行文件送给其他人,他们甚至不需要安装 Rust 就可以运行。如果你给他人一个 .rb.py.js 文件,他们需要先分别安装 Ruby,Python,JavaScript 实现(运行时环境,VM)。不过在这些语言中,只需要一句命令就可以编译和运行程序。这一切都是语言设计上的权衡取舍。

    +

    仅仅使用 rustc 编译简单程序是没问题的,不过随着项目的增长,你可能需要管理你项目的方方面面,并让代码易于分享。接下来,我们要介绍一个叫做 Cargo 的工具,它会帮助你编写真实世界中的 Rust 程序。

    +

    Hello, Cargo!

    +
    +

    ch01-03-hello-cargo.md +
    +commit 299fd1f3e11dd61ca136fb51d713f6b0ba7515ff

    +
    +

    Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目,因为它可以为你处理很多任务,比如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 依赖dependencies))。

    +

    最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。如果使用 Cargo 来构建 “Hello, world!” 项目,将只会用到 Cargo 构建代码的那部分功能。在编写更复杂的 Rust 程序时,你将添加依赖项,如果使用 Cargo 启动项目,则添加依赖项将更容易。

    +

    由于绝大多数 Rust 项目使用 Cargo,本书接下来的部分假设你也使用 Cargo。如果使用 “安装” 部分介绍的官方安装包的话,则自带了 Cargo。如果通过其他方式安装的话,可以在终端输入如下命令检查是否安装了 Cargo:

    +
    $ cargo --version
    +
    +

    如果你看到了版本号,说明已安装!如果看到类似 command not found 的错误,你应该查看相应安装文档以确定如何单独安装 Cargo。

    +

    使用 Cargo 创建项目

    +

    我们使用 Cargo 创建一个新项目,然后看看与上面的 “Hello, world!” 项目有什么不同。回到 projects 目录(或者你存放代码的目录)。接着,可在任何操作系统下运行以下命令:

    +
    $ cargo new hello_cargo
    +$ cd hello_cargo
    +
    +

    第一行命令新建了名为 hello_cargo 的目录和项目。我们将项目命名为 hello_cargo,同时 Cargo 在一个同名目录中创建项目文件。

    +

    进入 hello_cargo 目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录:一个 Cargo.toml 文件,一个 src 目录,以及位于 src 目录中的 main.rs 文件。

    +

    这也会在 hello_cargo 目录初始化了一个 git 仓库,以及一个 .gitignore 文件。如果在一个已经存在的 git 仓库中运行 cargo new,则这些 git 相关文件则不会生成;可以通过运行 cargo new --vcs=git 来覆盖这些行为。

    +
    +

    注意:Git 是一个常用的版本控制系统(version control system,VCS)。可以通过 --vcs 参数使 cargo new 切换到其它版本控制系统(VCS),或者不使用 VCS。运行 cargo new --help 参看可用的选项。

    +
    +

    请自行选用文本编辑器打开 Cargo.toml 文件。它应该看起来如示例 1-2 所示:

    +
    +

    文件名:Cargo.toml

    +
    [package]
    +name = "hello_cargo"
    +version = "0.1.0"
    +edition = "2021"
    +
    +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
    +
    +[dependencies]
    +
    +
    示例 1-2:*cargo new* 命令生成的 *Cargo.toml* 的内容
    +
    +

    这个文件使用 TOML (Tom's Obvious, Minimal Language) 格式,这是 Cargo 配置文件的格式。

    +

    第一行,[package],是一个片段(section)标题,表明下面的语句用来配置一个包。随着我们在这个文件增加更多的信息,还将增加其他片段(section)。

    +

    接下来的三行设置了 Cargo 编译程序所需的配置:项目的名称、项目的版本以及要使用的 Rust 版本。附录 E 会介绍 edition 的值。

    +

    最后一行,[dependencies],是罗列项目依赖的片段的开始。在 Rust 中,代码包被称为 crates。这个项目并不需要其他的 crate,不过在第二章的第一个项目会用到依赖,那时会用得上这个片段。

    +

    现在打开 src/main.rs 看看:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    println!("Hello, world!");
    +}
    +

    Cargo 为你生成了一个 “Hello, world!” 程序,正如我们之前编写的示例 1-1!目前为止,我们的项目与 Cargo 生成项目的区别是 Cargo 将代码放在 src 目录,同时项目根目录包含一个 Cargo.toml 配置文件。

    +

    Cargo 期望源文件存放在 src 目录中。项目根目录只存放 README、license 信息、配置文件和其他跟代码无关的文件。使用 Cargo 帮助你保持项目干净整洁,一切井井有条。

    +

    如果没有使用 Cargo 开始项目,比如我们创建的 “Hello, world!” 项目,你可以将其转换为使用 Cargo 的项目。将项目代码移入 src 目录,并创建一个合适的 Cargo.toml 文件。一个简单的创建 Cargo.toml 文件的方法是运行 cargo init,它会自动为你创建该文件。

    +

    构建并运行 Cargo 项目

    +

    现在让我们看看通过 Cargo 构建和运行 “Hello, world!” 程序有什么不同!在 hello_cargo 目录下,输入下面的命令来构建项目:

    +
    $ cargo build
    +   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
    +    Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs
    +
    +

    这个命令会创建一个可执行文件 target/debug/hello_cargo (在 Windows 上是 target\debug\hello_cargo.exe),而不是放在目前目录下。由于默认的构建方法是调试构建(debug build),Cargo 会将可执行文件放在名为 debug 的目录中。可以通过这个命令运行可执行文件:

    +
    $ ./target/debug/hello_cargo # 或者在 Windows 下为 .\target\debug\hello_cargo.exe
    +Hello, world!
    +
    +

    如果一切顺利,终端上应该会打印出 Hello, world!。首次运行 cargo build 时,也会使 Cargo 在项目根目录创建一个新文件:Cargo.lock。这个文件记录项目依赖的实际版本。这个项目并没有依赖,所以其内容比较少。你自己永远也不需要碰这个文件,让 Cargo 处理它就行了。

    +

    我们刚刚使用 cargo build 构建了项目,并使用 ./target/debug/hello_cargo 运行了程序,也可以使用 cargo run 在一个命令中同时编译并运行生成的可执行文件:

    +
    $ cargo run
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
    +     Running `target/debug/hello_cargo`
    +Hello, world!
    +
    +

    比起要记得运行 cargo build 之后再用可执行文件的完整路径来运行程序,使用 cargo run 可以实现完全相同的效果,而且要方便得多,所以大多数开发者会使用 cargo run

    +

    注意这一次并没有出现表明 Cargo 正在编译 hello_cargo 的输出。Cargo 发现文件并没有被改变,所以它并没有重新编译,而是直接运行了可执行文件。如果修改了源文件的话,Cargo 会在运行之前重新构建项目,并会出现像这样的输出:

    +
    $ cargo run
    +   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs
    +     Running `target/debug/hello_cargo`
    +Hello, world!
    +
    +

    Cargo 还提供了一个叫 cargo check 的命令。该命令快速检查代码确保其可以编译,但并不产生可执行文件:

    +
    $ cargo check
    +   Checking hello_cargo v0.1.0 (file:///projects/hello_cargo)
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs
    +
    +

    为什么你会不需要可执行文件呢?通常 cargo check 要比 cargo build 快得多,因为它省略了生成可执行文件的步骤。如果你在编写代码时持续的进行检查,cargo check 可以让你快速了解现在的代码能不能正常通过编译!为此很多 Rustaceans 编写代码时定期运行 cargo check 确保它们可以编译。当准备好使用可执行文件时才运行 cargo build

    +

    我们回顾下已学习的 Cargo 内容:

    +
      +
    • 可以使用 cargo new 创建项目。
    • +
    • 可以使用 cargo build 构建项目。
    • +
    • 可以使用 cargo run 一步构建并运行项目。
    • +
    • 可以使用 cargo check 在不生成二进制文件的情况下构建项目来检查错误。
    • +
    • 有别于将构建结果放在与源码相同的目录,Cargo 会将其放到 target/debug 目录。
    • +
    +

    使用 Cargo 的一个额外的优点是,不管你使用什么操作系统,其命令都是一样的。所以从现在开始本书将不再为 Linux 和 macOS 以及 Windows 提供相应的命令。

    +

    发布(release)构建

    +

    当项目最终准备好发布时,可以使用 cargo build --release 来优化编译项目。这会在 target/release 而不是 target/debug 下生成可执行文件。这些优化可以让 Rust 代码运行的更快,不过启用这些优化也需要消耗更长的编译时间。这也就是为什么会有两种不同的配置:一种是为了开发,你需要经常快速重新构建;另一种是为用户构建最终程序,它们不会经常重新构建,并且希望程序运行得越快越好。如果你在测试代码的运行时间,请确保运行 cargo build --release 并使用 target/release 下的可执行文件进行测试。

    +

    把 Cargo 当作习惯

    +

    对于简单项目,Cargo 并不比 rustc 提供了更多的优势,不过随着开发的深入,终将证明其价值。一旦程序壮大到由多个文件组成,亦或者是需要其他的依赖,让 Cargo 协调构建过程就会简单得多。

    +

    即便 hello_cargo 项目十分简单,它现在也使用了很多在你之后的 Rust 生涯将会用到的实用工具。其实,要在任何已存在的项目上工作时,可以使用如下命令通过 Git 检出代码,移动到该项目目录并构建:

    +
    $ git clone example.org/someproject
    +$ cd someproject
    +$ cargo build
    +
    +

    关于更多 Cargo 的信息,请查阅 其文档

    +

    总结

    +

    你已经准备好开启 Rust 之旅了!在本章中,你学习了如何:

    +
      +
    • 使用 rustup 安装最新稳定版的 Rust
    • +
    • 更新到新版的 Rust
    • +
    • 打开本地安装的文档
    • +
    • 直接通过 rustc 编写并运行 Hello, world! 程序
    • +
    • 使用 Cargo 创建并运行新项目
    • +
    +

    是时候通过构建更实质性的程序来熟悉读写 Rust 代码了。所以在第二章我们会构建一个猜猜看游戏程序。如果你更愿意从学习 Rust 常用的编程概念开始,请阅读第三章,接着再回到第二章。

    +

    写个猜数字游戏

    +
    +

    ch02-00-guessing-game-tutorial.md +
    +commit 11ca3d508b0a28b03f7d9f16c88726088fafd87e

    +
    +

    让我们一起动手完成一个项目来快速上手 Rust!本章将介绍一些 Rust 中常见的概念,并通过真实的程序来展示如何运用它们。你将会学到 letmatch、方法(methods)、关联函数(associated functions)、外部 crate 等知识!后续章节会深入探讨这些概念的细节。在这一章,我们将主要练习基础内容。

    +

    我们会实现一个经典的新手编程问题:猜数字游戏。游戏的规则如下:程序将会生成一个 1 到 100 之间的随机整数。然后提示玩家输入一个猜测值。输入后,程序会指示该猜测是太低还是太高。如果猜对了,游戏会打印祝贺信息并退出。

    +

    准备一个新项目

    +

    要创建一个新项目,进入第一章中创建的 projects 目录,使用 Cargo 新建一个项目,如下:

    +
    $ cargo new guessing_game
    +$ cd guessing_game
    +
    +

    第一个命令,cargo new,它获取项目的名称(guessing_game)作为第一个参数。第二个命令进入到新创建的项目目录。

    +

    看看生成的 Cargo.toml 文件:

    +

    文件名:Cargo.toml

    +
    [package]
    +name = "guessing_game"
    +version = "0.1.0"
    +edition = "2021"
    +
    +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
    +
    +[dependencies]
    +
    +

    正如第一章那样,cargo new 生成了一个 “Hello, world!” 程序。查看 src/main.rs 文件:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    println!("Hello, world!");
    +}
    +

    现在使用 cargo run 命令,一步完成 “Hello, world!” 程序的编译和运行:

    +
    $ cargo run
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.50s
    +     Running `target/debug/guessing_game`
    +Hello, world!
    +
    +

    当你需要在项目中快速迭代时,run 命令就能派上用场,正如我们在这个游戏项目中做的,在下一次迭代之前快速测试每一次迭代。

    +

    重新打开 src/main.rs 文件。我们将会在这个文件中编写全部的代码。

    +

    处理一次猜测

    +

    猜数字程序的第一部分请求和处理用户输入,并检查输入是否符合预期的格式。首先,我们会允许玩家输入一个猜测。在 src/main.rs 中输入示例 2-1 中的代码。

    +
    +

    文件名:src/main.rs

    +
    use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    println!("You guessed: {}", guess);
    +}
    +
    示例 2-1:获取用户猜测并打印的代码
    +
    +

    这些代码包含很多信息,我们一行一行地过一遍。为了获取用户输入并打印结果作为输出,我们需要将 io 输入/输出库引入当前作用域。io 库来自于标准库,也被称为 std

    +
    use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    println!("You guessed: {}", guess);
    +}
    +

    默认情况下,Rust 设定了若干个会自动导入到每个程序作用域中的标准库内容,这组内容被称为 预导入(prelude) 内容。你可以在标准库文档中查看预导入的所有内容。

    +

    如果你需要的类型不在预导入内容中,就必须使用 use 语句显式地将其引入作用域。std::io 库提供很多有用的功能,包括接收用户输入的功能。

    +

    如第一章所提及,main 函数是程序的入口点:

    +
    use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    println!("You guessed: {}", guess);
    +}
    +

    fn 语法声明了一个新函数,小括号 () 表明没有参数,大括号 { 作为函数体的开始。

    +

    第一章也提及了 println! 是一个在屏幕上打印字符串的宏:

    +
    use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    println!("You guessed: {}", guess);
    +}
    +

    这些代码仅仅打印提示,介绍游戏的内容然后请求用户输入。

    +

    使用变量储存值

    +

    接下来,创建一个 变量variable)来储存用户输入,像这样:

    +
    use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    println!("You guessed: {}", guess);
    +}
    +

    现在程序开始变得有意思了!这一小行代码发生了很多事。我们使用 let 语句来创建变量。这里是另外一个例子:

    +
    let apples = 5;
    +

    这行代码新建了一个叫做 apples 的变量并把它绑定到值 5 上。在 Rust 中,变量默认是不可变的,这意味着一旦我们给变量赋值,这个值就不再可以修改了。我们将会在第三章的 “变量与可变性” 部分详细讨论这个概念。下面的例子展示了如何在变量名前使用 mut 来使一个变量可变:

    +
    let apples = 5; // 不可变
    +let mut bananas = 5; // 可变
    +
    +

    注意:// 语法开始一个注释,持续到行尾。Rust 忽略注释中的所有内容,第三章将会详细介绍注释。

    +
    +

    回到猜数字程序中。现在我们知道了 let mut guess 会引入一个叫做 guess 的可变变量。等号(=)告诉 Rust 我们现在想将某个值绑定在变量上。等号的右边是 guess 所绑定的值,它是 String::new 的结果,这个函数会返回一个 String 的新实例。String 是一个标准库提供的字符串类型,它是 UTF-8 编码的可增长文本块。

    +

    ::new 那一行的 :: 语法表明 newString 类型的一个 关联函数associated function)。关联函数是针对某个类型实现的函数,在这个例子中是 String。这个 new 函数创建了一个新的空字符串。你会发现许多类型上都有一个 new 函数,因为这是为某种类型创建新值的常用函数名。

    +

    总的来说,let mut guess = String::new(); 这一行创建了一个可变变量,当前它绑定到一个新的 String 空实例上。

    +

    接收用户输入

    +

    回忆一下,我们在程序的第一行使用 use std::io; 从标准库中引入了输入/输出功能。现在调用 io 库中的函数 stdin,这允许我们处理用户输入:

    +
    use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    println!("You guessed: {}", guess);
    +}
    +

    如果程序的开头没有使用 use std::io; 引入 io 库,我们仍可以通过把函数调用写成 std::io::stdin 来使用该函数。stdin 函数返回一个 std::io::Stdin 的实例,这是一种代表终端标准输入句柄的类型。

    +

    接下来,代码中的 .read_line(&mut guess) 调用了标准输入句柄上的 read_line 方法,以获取用户输入。我们还将 &mut guess 作为参数传递给 read_line 函数,让其将用户输入储存到这个字符串中。read_line 的工作是,无论用户在标准输入中键入什么内容,都将其追加(不会覆盖其原有内容)到一个字符串中,因此它需要字符串作为参数。这个字符串参数应该是可变的,以便 read_line 将用户输入附加上去。

    +

    & 表示这个参数是一个 引用reference),它允许多处代码访问同一处数据,而无需在内存中多次拷贝。引用是一个复杂的特性,Rust 的一个主要优势就是安全而简单的操纵引用。完成当前程序并不需要了解如此多细节。现在,我们只需知道它像变量一样,默认是不可变的。因此,需要写成 &mut guess 来使其可变,而不是 &guess。(第四章会更全面的解释引用。)

    +

    使用 Result 类型来处理潜在的错误

    +

    我们还没有完全分析完这行代码。虽然我们已经讲到了第三行代码,但要注意:它仍是逻辑行(虽然换行了但仍是语句)的一部分。后一部分是这个方法(method):

    +
    use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    println!("You guessed: {}", guess);
    +}
    +

    我们也可以将代码这样写:

    +
    io::stdin().read_line(&mut guess).expect("Failed to read line");
    +

    不过,过长的代码行难以阅读,所以最好拆开来写。通常来说,当使用 .method_name() 语法调用方法时引入换行符和空格将长的代码行拆开是明智的。现在来看看这行代码干了什么。

    +

    之前提到了 read_line 会将用户输入附加到传递给它的字符串中,不过它也会返回一个类型为 Result 的值。 +Result 是一种枚举类型,通常也写作 enum。枚举类型变量的值可以是多种可能状态中的一个。我们把每种可能的状态称为一种 枚举成员(variant)

    +

    第六章将介绍枚举的更多细节。这里的 Result 类型将用来编码错误处理的信息。

    +

    Result 的成员是 OkErrOk 成员表示操作成功,内部包含成功时产生的值。Err 成员则意味着操作失败,并且 Err 中包含有关操作失败的原因或方式的信息。

    +

    这些 Result 类型的作用是编码错误处理信息。Result 类型的值,像其他类型一样,拥有定义于其上的方法。Result 的实例拥有 expect 方法。如果 io::Result 实例的值是 Errexpect 会导致程序崩溃,并显示当做参数传递给 expect 的信息。如果 read_line 方法返回 Err,则可能是来源于底层操作系统错误的结果。如果 Result 实例的值是 Okexpect 会获取 Ok 中的值并原样返回。在本例中,这个值是用户输入到标准输入中的字节数。

    +

    如果不调用 expect,程序也能编译,不过会出现一个警告:

    +
    $ cargo build
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +warning: unused `Result` that must be used
    +  --> src/main.rs:10:5
    +   |
    +10 |     io::stdin().read_line(&mut guess);
    +   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    +   |
    +   = note: this `Result` may be an `Err` variant, which should be handled
    +   = note: `#[warn(unused_must_use)]` on by default
    +help: use `let _ = ...` to ignore the resulting value
    +   |
    +10 |     let _ = io::stdin().read_line(&mut guess);
    +   |     +++++++
    +
    +warning: `guessing_game` (bin "guessing_game") generated 1 warning
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.59s
    +
    +

    Rust 警告我们没有使用 read_line 的返回值 Result,说明有一个可能的错误没有处理。

    +

    消除警告的正确做法是实际去编写错误处理代码,不过由于我们就是希望程序在出现问题时立即崩溃,所以直接使用 expect第九章 会学习如何从错误中恢复。

    +

    使用 println! 占位符打印值

    +

    除了位于结尾的右花括号,目前为止就只有这一行代码值得讨论一下了,就是这一行:

    +
    use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    println!("You guessed: {}", guess);
    +}
    +

    这行代码现在打印了存储用户输入的字符串。{} 这对大括号是一个占位符:把 {} 想象成小蟹钳,可以夹住合适的值。当打印变量的值时,变量名可以写进大括号中。当打印表达式的执行结果时,格式化字符串(format string)中大括号中留空,格式化字符串后跟逗号分隔的需要打印的表达式列表,其顺序与每一个空大括号占位符的顺序一致。在一个 println! 调用中打印变量和表达式的值看起来像这样:

    +
    #![allow(unused)]
    +fn main() {
    +let x = 5;
    +let y = 10;
    +
    +println!("x = {x} and y + 2 = {}", y + 2);
    +}
    +

    这行代码会打印出 x = 5 and y + 2 = 12

    +

    测试第一部分代码

    +

    让我们来测试下猜数字游戏的第一部分。使用 cargo run 运行:

    +
    $ cargo run
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +    Finished dev [unoptimized + debuginfo] target(s) in 6.44s
    +     Running `target/debug/guessing_game`
    +Guess the number!
    +Please input your guess.
    +6
    +You guessed: 6
    +
    +

    至此为止,游戏的第一部分已经完成:我们从键盘获取输入并打印了出来。

    +

    生成一个秘密数字

    +

    接下来,需要生成一个秘密数字,好让用户来猜。秘密数字应该每次都不同,这样重复玩才不会乏味;范围应该在 1 到 100 之间,这样才不会太困难。Rust 标准库中尚未包含随机数功能。然而,Rust 团队还是提供了一个包含上述功能的 rand crate

    +

    使用 crate 来增加更多功能

    +

    记住,crate 是一组 Rust 源代码文件。我们正在构建的项目是一个 二进制 crate,它生成一个可执行文件。 rand crate 是一个 库 crate,库 crate 可以包含任意能被其他程序使用的代码,但是无法独立执行。

    +

    Cargo 对外部 crate 的运用是其真正的亮点所在。在我们使用 rand 编写代码之前,需要修改 Cargo.toml 文件,引入一个 rand 依赖。现在打开这个文件并将下面这一行添加到 [dependencies] 片段标题之下。在当前版本下,请确保按照我们这里的方式指定 rand,否则本教程中的示例代码可能无法工作。

    +

    文件名:Cargo.toml

    +
    [dependencies]
    +rand = "0.8.5"
    +
    +

    Cargo.toml 文件中,标题以及之后的内容属同一个片段,直到遇到下一个标题才开始新的片段。[dependencies] 片段告诉 Cargo 本项目依赖了哪些外部 crate 及其版本。本例中,我们使用语义化版本 0.8.5 来指定 rand crate。Cargo 理解 语义化版本(Semantic Versioning)(有时也称为 SemVer),这是一种定义版本号的标准。0.8.5 事实上是 ^0.8.5 的简写,它表示任何至少是 0.8.5 但小于 0.9.0 的版本。

    +

    Cargo 认为这些版本与 0.8.5 版本的公有 API 相兼容,这样的版本指定确保了我们可以获取能使本章代码编译的最新的补丁(patch)版本。任何大于等于 0.9.0 的版本不能保证和接下来的示例采用了相同的 API。

    +

    现在,不修改任何代码,构建项目,如示例 2-2 所示。

    +
    +
    $ cargo build
    +    Updating crates.io index
    +  Downloaded rand v0.8.5
    +  Downloaded libc v0.2.127
    +  Downloaded getrandom v0.2.7
    +  Downloaded cfg-if v1.0.0
    +  Downloaded ppv-lite86 v0.2.16
    +  Downloaded rand_chacha v0.3.1
    +  Downloaded rand_core v0.6.3
    +   Compiling libc v0.2.127
    +   Compiling getrandom v0.2.7
    +   Compiling cfg-if v1.0.0
    +   Compiling ppv-lite86 v0.2.16
    +   Compiling rand_core v0.6.3
    +   Compiling rand_chacha v0.3.1
    +   Compiling rand v0.8.5
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +    Finished dev [unoptimized + debuginfo] target(s) in 2.53s
    +
    +
    示例 2-2:将 rand crate 添加为依赖之后运行 `cargo build` 的输出
    +
    +

    可能会出现不同的版本号(多亏了语义化版本,它们与代码是兼容的!),并且显示的行数可能会有所不同(取决于操作系统),行的顺序也可能会不同。

    +

    现在我们有了一个外部依赖,Cargo 从 registry 上获取所有包的最新版本信息,这是一份来自 Crates.io 的数据副本。Crates.io 是 Rust 生态系统中,人们发布其开源 Rust 项目的平台,供他人使用。

    +

    在更新完 registry 后,Cargo 检查 [dependencies] 片段并下载列表中包含但还未下载的 crates。本例中,虽然只声明了 rand 一个依赖,然而 Cargo 还是额外获取了 rand 所需要的其他 crates,因为 rand 依赖它们来正常工作。下载完成后,Rust 编译依赖,然后使用这些依赖编译项目。

    +

    如果不做任何修改,立刻再次运行 cargo build,则不会看到任何除了 Finished 行之外的输出。Cargo 知道它已经下载并编译了依赖,同时 Cargo.toml 文件也没有变动。Cargo 还知道代码也没有任何修改,所以它不会重新编译代码。因为无事可做,它会简单地退出。

    +

    如果打开 src/main.rs 文件,做一些无关紧要的修改,保存并再次构建,则会出现两行输出:

    +
    $ cargo build
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +    Finished dev [unoptimized + debuginfo] target(s) in 2.53 secs
    +
    +

    这一行表示 Cargo 只针对 src/main.rs 文件的微小修改而更新构建。依赖没有变化,所以 Cargo 知道它可以复用已经为此下载并编译的代码。它只是重新构建了部分(项目)代码。

    +

    Cargo.lock 文件确保构建是可重现的

    +

    Cargo 有一个机制,确保无论是你还是其他人在任何时候重新构建代码,都会生成相同的构建产物:Cargo 只会使用你指定的依赖版本,除非你明确指定其他版本。例如,如果下周 rand crate 的 0.8.6 版本出来了,该版本包含了一个重要的 bug 修复,但同时也引入了一个会破坏你代码的回归问题。为了解决这个问题,Rust 在你第一次运行 cargo build 时创建了 Cargo.lock 文件,我们现在可以在 guessing_game 目录找到它。

    +

    当第一次构建项目时,Cargo 计算出所有符合要求的依赖版本并写入 Cargo.lock 文件。当将来构建项目时,Cargo 会发现 Cargo.lock 已存在并使用其中指定的版本,而不是再次计算所有的版本。这使得你拥有了一个自动化的可重现的构建。换句话说,项目会持续使用 0.8.5 直到你显式升级,多亏有了 Cargo.lock 文件。由于 Cargo.lock 文件对于“可重复构建”非常重要,因此它通常会和项目中的其余代码一样纳入到版本控制系统中。

    +

    更新 crate 到一个新版本

    +

    当你 确实 需要升级 crate 时,Cargo 提供了这样一个命令,update,它会忽略 Cargo.lock 文件,并计算出所有符合 Cargo.toml 声明的最新版本。Cargo 接下来会把这些版本写入 Cargo.lock 文件。不过,Cargo 默认只会寻找大于 0.8.5 而小于 0.9.0 的版本。如果 rand crate 发布了两个新版本,0.8.60.9.0,在运行 cargo update 时会出现如下内容:

    +
    $ cargo update
    +    Updating crates.io index
    +    Updating rand v0.8.5 -> v0.8.6
    +
    +

    Cargo 忽略了 0.9.0 版本。这时,你也会注意到的 Cargo.lock 文件中的变化无外乎现在使用的 rand crate 版本是0.8.6 。如果想要使用 0.9.0 版本的 rand 或是任何 0.9.x 系列的版本,必须像这样更新 Cargo.toml 文件:

    +
    [dependencies]
    +rand = "0.9.0"
    +
    +

    下一次运行 cargo build 时,Cargo 会更新可用 crate 的 registry,并根据你指定的新版本重新评估 rand 的要求。

    +

    第十四章会讲到 Cargo 及其生态系统 的更多内容,不过目前你只需要了解这么多。通过 Cargo 复用库文件非常容易,因此 Rustacean 能够编写出由很多包组装而成的更轻巧的项目。

    +

    生成一个随机数

    +

    让我们开始使用 rand 来生成一个猜数字随机数。下一步是更新 src/main.rs,如示例 2-3 所示。

    +
    +

    文件名:src/main.rs

    +
    use std::io;
    +use rand::Rng;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    let secret_number = rand::thread_rng().gen_range(1..=100);
    +
    +    println!("The secret number is: {secret_number}");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    println!("You guessed: {guess}");
    +}
    +
    示例 2-3:添加生成随机数的代码
    +
    +

    首先,我们新增了一行 use rand::Rng;Rng 是一个 trait,它定义了随机数生成器应实现的方法,想使用这些方法的话,此 trait 必须在作用域中。第十章会详细介绍 trait。

    +

    接下来,我们在中间还新增加了两行。第一行调用了 rand::thread_rng 函数提供实际使用的随机数生成器:它位于当前执行线程的本地环境中,并从操作系统获取 seed。接着调用随机数生成器的 gen_range 方法。这个方法由 use rand::Rng 语句引入到作用域的 Rng trait 定义。gen_range 方法获取一个范围表达式(range expression)作为参数,并生成一个在此范围之间的随机数。这里使用的这类范围表达式使用了 start..=end 这样的形式,也就是说包含了上下端点,所以需要指定 1..=100 来请求一个 1 和 100 之间的数。

    +
    +

    注意:你不可能凭空就知道应该 use 哪个 trait 以及该从 crate 中调用哪个方法,因此每个 crate 有使用说明文档。Cargo 有一个很棒的功能是:运行 cargo doc --open 命令来构建所有本地依赖提供的文档,并在浏览器中打开。例如,假设你对 rand crate 中的其他功能感兴趣,你可以运行 cargo doc --open 并点击左侧导航栏中的 rand

    +
    +

    新增加的第二行代码打印出了秘密数字。这在开发程序时很有用,因为可以测试它,不过在最终版本中会删掉它。如果游戏一开始就打印出结果就没什么可玩的了!

    +

    尝试运行程序几次:

    +
    $ cargo run
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +    Finished dev [unoptimized + debuginfo] target(s) in 2.53s
    +     Running `target/debug/guessing_game`
    +Guess the number!
    +The secret number is: 7
    +Please input your guess.
    +4
    +You guessed: 4
    +
    +$ cargo run
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
    +     Running `target/debug/guessing_game`
    +Guess the number!
    +The secret number is: 83
    +Please input your guess.
    +5
    +You guessed: 5
    +
    +

    你应该能得到不同的随机数,同时它们应该都是在 1 和 100 之间的。干得漂亮!

    +

    比较猜测的数字和秘密数字

    +

    现在有了用户输入和一个随机数,我们可以比较它们。这个步骤如示例 2-4 所示。注意这段代码还不能通过编译,我们稍后会解释。

    +
    +

    文件名:src/main.rs

    +
    use rand::Rng;
    +use std::cmp::Ordering;
    +use std::io;
    +
    +fn main() {
    +    // --snip--
    +    println!("Guess the number!");
    +
    +    let secret_number = rand::thread_rng().gen_range(1..=100);
    +
    +    println!("The secret number is: {secret_number}");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    println!("You guessed: {guess}");
    +
    +    match guess.cmp(&secret_number) {
    +        Ordering::Less => println!("Too small!"),
    +        Ordering::Greater => println!("Too big!"),
    +        Ordering::Equal => println!("You win!"),
    +    }
    +}
    +
    示例 2-4:处理比较两个数字可能的返回值
    +
    +

    首先我们增加了另一个 use 声明,从标准库引入了一个叫做 std::cmp::Ordering 的类型到作用域中。 Ordering 也是一个枚举,不过它的成员是 LessGreaterEqual。这是比较两个值时可能出现的三种结果。

    +

    接着,底部的五行新代码使用了 Ordering 类型,cmp 方法用来比较两个值并可以在任何可比较的值上调用。它获取一个被比较值的引用:这里是把 guesssecret_number 做比较。然后它会返回一个刚才通过 use 引入作用域的 Ordering 枚举的成员。使用一个 match 表达式,根据对 guesssecret_number 调用 cmp 返回的 Ordering 成员来决定接下来做什么。

    +

    一个 match 表达式由 分支(arms) 构成。一个分支包含一个 模式pattern)和表达式开头的值与分支模式相匹配时应该执行的代码。Rust 获取提供给 match 的值并挨个检查每个分支的模式。match 结构和模式是 Rust 中强大的功能,它体现了代码可能遇到的多种情形,并帮助你确保没有遗漏处理。这些功能将分别在第六章和第十九章详细介绍。

    +

    让我们看看使用 match 表达式的例子。假设用户猜了 50,这时随机生成的秘密数字是 38。

    +

    比较 50 与 38 时,因为 50 比 38 要大,cmp 方法会返回 Ordering::GreaterOrdering::Greatermatch 表达式得到的值。它检查第一个分支的模式,Ordering::LessOrdering::Greater并不匹配,所以它忽略了这个分支的代码并来到下一个分支。下一个分支的模式是 Ordering::Greater正确 匹配!这个分支关联的代码被执行,在屏幕打印出 Too big!match 表达式会在第一次成功匹配后终止,因为该场景下没有检查最后一个分支的必要。

    +

    然而,示例 2-4 的代码目前并不能编译,可以尝试一下:

    +
    $ cargo build
    + Downloading crates ...
    +  Downloaded rand_core v0.6.2
    +  Downloaded getrandom v0.2.2
    +  Downloaded rand_chacha v0.3.0
    +  Downloaded ppv-lite86 v0.2.10
    +  Downloaded libc v0.2.86
    +   Compiling libc v0.2.86
    +   Compiling getrandom v0.2.2
    +   Compiling cfg-if v1.0.0
    +   Compiling ppv-lite86 v0.2.10
    +   Compiling rand_core v0.6.2
    +   Compiling rand_chacha v0.3.0
    +   Compiling rand v0.8.5
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +error[E0308]: mismatched types
    +  --> src/main.rs:22:21
    +   |
    +22 |     match guess.cmp(&secret_number) {
    +   |                 --- ^^^^^^^^^^^^^^ expected `&String`, found `&{integer}`
    +   |                 |
    +   |                 arguments to this method are incorrect
    +   |
    +   = note: expected reference `&String`
    +              found reference `&{integer}`
    +note: method defined here
    +  --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/cmp.rs:839:8
    +
    +For more information about this error, try `rustc --explain E0308`.
    +error: could not compile `guessing_game` (bin "guessing_game") due to 1 previous error
    +
    +

    错误的核心表明这里有 不匹配的类型mismatched types)。Rust 有一个静态强类型系统,同时也有类型推断。当我们写出 let guess = String::new() 时,Rust 推断出 guess 应该是 String 类型,并不需要我们写出类型。另一方面,secret_number,是数字类型。几个数字类型拥有 1 到 100 之间的值:32 位数字 i32;32 位无符号数字 u32;64 位数字 i64 等等。Rust 默认使用 i32,所以它是 secret_number 的类型,除非增加类型信息,或任何能让 Rust 推断出不同数值类型的信息。这里错误的原因在于 Rust 不会比较字符串类型和数字类型。

    +

    所以我们必须把从输入中读取到的 String 转换为一个真正的数字类型,才好与秘密数字进行比较。这可以通过在 main 函数体中增加如下代码来实现:

    +

    文件名:src/main.rs

    +
    use rand::Rng;
    +use std::cmp::Ordering;
    +use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    let secret_number = rand::thread_rng().gen_range(1..=100);
    +
    +    println!("The secret number is: {secret_number}");
    +
    +    println!("Please input your guess.");
    +
    +    // --snip--
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    let guess: u32 = guess.trim().parse().expect("Please type a number!");
    +
    +    println!("You guessed: {guess}");
    +
    +    match guess.cmp(&secret_number) {
    +        Ordering::Less => println!("Too small!"),
    +        Ordering::Greater => println!("Too big!"),
    +        Ordering::Equal => println!("You win!"),
    +    }
    +}
    +

    这行新代码是:

    +
    let guess: u32 = guess.trim().parse().expect("Please type a number!");
    +

    这里创建了一个叫做 guess 的变量。不过等等,不是已经有了一个叫做 guess 的变量了吗?确实如此,不过 Rust 允许用一个新值来 隐藏Shadowingguess 之前的值。这个功能常用在需要转换值类型之类的场景。它允许我们复用 guess 变量的名字,而不是被迫创建两个不同变量,诸如 guess_strguess 之类。第三章会介绍 shadowing 的更多细节,现在只需知道这个功能经常用于将一个类型的值转换为另一个类型的值。

    +

    我们将这个新变量绑定到 guess.trim().parse() 表达式上。表达式中的 guess 指的是包含输入的字符串类型 guess 变量。String 实例的 trim 方法会去除字符串开头和结尾的空白字符,我们必须执行此方法才能将字符串与 u32 比较,因为 u32 只能包含数值型数据。用户必须输入 enter 键才能让 read_line 返回并输入他们的猜想,这将会在字符串中增加一个换行(newline)符。例如,用户输入 5 并按下 enter(在 Windows 上,按下 enter 键会得到一个回车符和一个换行符,\r\n),guess 看起来像这样:5\n 或者 5\r\n\n 代表 “换行”,回车键;\r 代表 “回车”,回车键。trim 方法会消除 \n 或者 \r\n,只留下 5

    +

    字符串的 parse 方法 将字符串转换成其他类型。这里用它来把字符串转换为数值。我们需要告诉 Rust 具体的数字类型,这里通过 let guess: u32 指定。guess 后面的冒号(:)告诉 Rust 我们指定了变量的类型。Rust 有一些内建的数字类型;u32 是一个无符号的 32 位整型。对于不大的正整数来说,它是不错的默认类型,第三章还会讲到其他数字类型。

    +

    另外,程序中的 u32 注解以及与 secret_number 的比较,意味着 Rust 会推断出 secret_number 也是 u32 类型。现在可以使用相同类型比较两个值了!

    +

    parse 方法只有在字符逻辑上可以转换为数字的时候才能工作所以非常容易出错。例如,字符串中包含 A👍%,就无法将其转换为一个数字。因此,parse 方法返回一个 Result 类型。像之前 “使用 Result 类型来处理潜在的错误” 讨论的 read_line 方法那样,再次按部就班的用 expect 方法处理即可。如果 parse 不能从字符串生成一个数字,返回一个 ResultErr 成员时,expect 会使游戏崩溃并打印附带的信息。如果 parse 成功地将字符串转换为一个数字,它会返回 ResultOk 成员,然后 expect 会返回 Ok 值中的数字。

    +

    现在让我们运行程序!

    +
    $ cargo run
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.43s
    +     Running `target/debug/guessing_game`
    +Guess the number!
    +The secret number is: 58
    +Please input your guess.
    +  76
    +You guessed: 76
    +Too big!
    +
    +

    漂亮!即便是在猜测之前添加了空格,程序依然能判断出用户猜测了 76。多运行程序几次,输入不同的数字来检验不同的行为:猜一个正确的数字,猜一个过大的数字和猜一个过小的数字。

    +

    现在游戏已经大体上能玩了,不过用户只能猜一次。增加一个循环来改变它吧!

    +

    使用循环来允许多次猜测

    +

    loop 关键字创建了一个无限循环。我们会增加循环来给用户更多机会猜数字:

    +

    文件名:src/main.rs

    +
    use rand::Rng;
    +use std::cmp::Ordering;
    +use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    let secret_number = rand::thread_rng().gen_range(1..=100);
    +
    +    // --snip--
    +
    +    println!("The secret number is: {secret_number}");
    +
    +    loop {
    +        println!("Please input your guess.");
    +
    +        // --snip--
    +
    +
    +        let mut guess = String::new();
    +
    +        io::stdin()
    +            .read_line(&mut guess)
    +            .expect("Failed to read line");
    +
    +        let guess: u32 = guess.trim().parse().expect("Please type a number!");
    +
    +        println!("You guessed: {guess}");
    +
    +        match guess.cmp(&secret_number) {
    +            Ordering::Less => println!("Too small!"),
    +            Ordering::Greater => println!("Too big!"),
    +            Ordering::Equal => println!("You win!"),
    +        }
    +    }
    +}
    +

    如上所示,我们将提示用户猜测之后的所有内容移动到了循环中。确保 loop 循环中的代码多缩进四个空格,再次运行程序。注意这里有一个新问题,因为程序忠实地执行了我们的要求:永远地请求另一个猜测,用户好像无法退出啊!

    +

    用户总能使用 ctrl-c 终止程序。不过还有另一个方法跳出无限循环,就是 “比较猜测与秘密数字” 部分提到的 parse:如果用户输入的答案不是一个数字,程序会崩溃。我们可以利用这一点来退出,如下所示:

    +
    $ cargo run
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +    Finished dev [unoptimized + debuginfo] target(s) in 1.50s
    +     Running `target/debug/guessing_game`
    +Guess the number!
    +The secret number is: 59
    +Please input your guess.
    +45
    +You guessed: 45
    +Too small!
    +Please input your guess.
    +60
    +You guessed: 60
    +Too big!
    +Please input your guess.
    +59
    +You guessed: 59
    +You win!
    +Please input your guess.
    +quit
    +thread 'main' panicked at 'Please type a number!: ParseIntError { kind: InvalidDigit }', src/main.rs:28:47
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +

    输入 quit 将会退出程序,同时你会注意到其他任何非数字输入也一样。然而,这并不理想,我们想要当猜测正确的数字时游戏停止。

    +

    猜测正确后退出

    +

    让我们增加一个 break 语句,在用户猜对时退出游戏:

    +

    文件名:src/main.rs

    +
    use rand::Rng;
    +use std::cmp::Ordering;
    +use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    let secret_number = rand::thread_rng().gen_range(1..=100);
    +
    +    println!("The secret number is: {secret_number}");
    +
    +    loop {
    +        println!("Please input your guess.");
    +
    +        let mut guess = String::new();
    +
    +        io::stdin()
    +            .read_line(&mut guess)
    +            .expect("Failed to read line");
    +
    +        let guess: u32 = guess.trim().parse().expect("Please type a number!");
    +
    +        println!("You guessed: {guess}");
    +
    +        // --snip--
    +
    +        match guess.cmp(&secret_number) {
    +            Ordering::Less => println!("Too small!"),
    +            Ordering::Greater => println!("Too big!"),
    +            Ordering::Equal => {
    +                println!("You win!");
    +                break;
    +            }
    +        }
    +    }
    +}
    +

    通过在 You win! 之后增加一行 break,用户猜对了神秘数字后会退出循环。退出循环也意味着退出程序,因为循环是 main 的最后一部分。

    +

    处理无效输入

    +

    为了进一步改善游戏性,不要在用户输入非数字时崩溃,需要忽略非数字,让用户可以继续猜测。可以通过修改 guessString 转化为 u32 那部分代码来实现,如示例 2-5 所示:

    +
    +

    文件名:src/main.rs

    +
    use rand::Rng;
    +use std::cmp::Ordering;
    +use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    let secret_number = rand::thread_rng().gen_range(1..=100);
    +
    +    println!("The secret number is: {secret_number}");
    +
    +    loop {
    +        println!("Please input your guess.");
    +
    +        let mut guess = String::new();
    +
    +        // --snip--
    +
    +        io::stdin()
    +            .read_line(&mut guess)
    +            .expect("Failed to read line");
    +
    +        let guess: u32 = match guess.trim().parse() {
    +            Ok(num) => num,
    +            Err(_) => continue,
    +        };
    +
    +        println!("You guessed: {guess}");
    +
    +        // --snip--
    +
    +        match guess.cmp(&secret_number) {
    +            Ordering::Less => println!("Too small!"),
    +            Ordering::Greater => println!("Too big!"),
    +            Ordering::Equal => {
    +                println!("You win!");
    +                break;
    +            }
    +        }
    +    }
    +}
    +
    示例 2-5:忽略非数字的猜测并重新请求数字而不是让程序崩溃
    +
    +

    我们将 expect 调用换成 match 语句,以从遇到错误就崩溃转换为处理错误。须知 parse 返回一个 Result 类型,而 Result 是一个拥有 OkErr 成员的枚举。这里使用的 match 表达式,和之前处理 cmp 方法返回 Ordering 时用的一样。

    +

    如果 parse 能够成功的将字符串转换为一个数字,它会返回一个包含结果数字的 Ok。这个 Ok 值与 match 第一个分支的模式相匹配,该分支对应的动作返回 Ok 值中的数字 num,最后如愿变成新创建的 guess 变量。

    +

    如果 parse 能将字符串转换为一个数字,它会返回一个包含更多错误信息的 ErrErr 值不能匹配第一个 match 分支的 Ok(num) 模式,但是会匹配第二个分支的 Err(_) 模式:_ 是一个通配符值,本例中用来匹配所有 Err 值,不管其中有何种信息。所以程序会执行第二个分支的动作,continue 意味着进入 loop 的下一次循环,请求另一个猜测。这样程序就有效的忽略了 parse 可能遇到的所有错误!

    +

    现在程序中的一切都应该如预期般工作了。让我们试试吧:

    +
    $ cargo run
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +    Finished dev [unoptimized + debuginfo] target(s) in 4.45s
    +     Running `target/debug/guessing_game`
    +Guess the number!
    +The secret number is: 61
    +Please input your guess.
    +10
    +You guessed: 10
    +Too small!
    +Please input your guess.
    +99
    +You guessed: 99
    +Too big!
    +Please input your guess.
    +foo
    +Please input your guess.
    +61
    +You guessed: 61
    +You win!
    +
    +

    太棒了!再有最后一个小的修改,就能完成猜数字游戏了:还记得程序依然会打印出秘密数字。在测试时还好,但正式发布时会毁了游戏。删掉打印秘密数字的 println!。示例 2-6 为最终代码:

    +
    +

    文件名:src/main.rs

    +
    use rand::Rng;
    +use std::cmp::Ordering;
    +use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    let secret_number = rand::thread_rng().gen_range(1..=100);
    +
    +    loop {
    +        println!("Please input your guess.");
    +
    +        let mut guess = String::new();
    +
    +        io::stdin()
    +            .read_line(&mut guess)
    +            .expect("Failed to read line");
    +
    +        let guess: u32 = match guess.trim().parse() {
    +            Ok(num) => num,
    +            Err(_) => continue,
    +        };
    +
    +        println!("You guessed: {guess}");
    +
    +        match guess.cmp(&secret_number) {
    +            Ordering::Less => println!("Too small!"),
    +            Ordering::Greater => println!("Too big!"),
    +            Ordering::Equal => {
    +                println!("You win!");
    +                break;
    +            }
    +        }
    +    }
    +}
    +
    示例 2-6:猜数字游戏的完整代码
    +
    +

    此时此刻,你顺利完成了猜数字游戏。恭喜!

    +

    总结

    +

    本项目通过动手实践,向你介绍了 Rust 新概念:letmatch、函数、使用外部 crate 等等,接下来的几章,你会继续深入学习这些概念。第三章介绍大部分编程语言都有的概念,比如变量、数据类型和函数,以及如何在 Rust 中使用它们。第四章探索所有权(ownership),这是一个 Rust 同其他语言大不相同的功能。第五章讨论结构体和方法的语法,而第六章侧重解释枚举。

    +

    常见编程概念

    +
    +

    ch03-00-common-programming-concepts.md +
    +commit d0acb2595c891de97a133d06635c50ab449dd65c

    +
    +

    本章介绍一些几乎所有编程语言都有的概念,以及它们在 Rust 中是如何工作的。很多编程语言的核心概念都是共通的,本章中展示的概念都不是 Rust 所特有的,不过我们会在 Rust 上下文中讨论它们,并解释使用这些概念的惯例。

    +

    具体来说,我们将会学习变量、基本类型、函数、注释和控制流。每一个 Rust 程序中都会用到这些基础知识,提早学习这些概念会让你在起步时就打下坚实的基础。

    +
    +

    关键字

    +

    Rust 语言有一组保留的 关键字keywords),就像大部分语言一样,它们只能由语言本身使用。记住,你不能使用这些关键字作为变量或函数的名称。大部分关键字有特殊的意义,你将在 Rust 程序中使用它们完成各种任务;一些关键字目前没有相应的功能,是为将来可能添加的功能保留的。可以在附录 A 中找到关键字的列表。

    +
    +

    变量和可变性

    +
    +

    ch03-01-variables-and-mutability.md

    +

    commit 21a2ed14f4480dab62438dcc1130291bebc65379

    +
    +

    正如第二章中“使用变量储存值” 部分提到的那样,变量默认是不可改变的(immutable)。这是 Rust 提供给你的众多优势之一,让你得以充分利用 Rust 提供的安全性和简单并发性来编写代码。不过,你仍然可以使用可变变量。让我们探讨一下 Rust 为何及如何鼓励你利用不可变性,以及何时你会选择不使用不可变性。

    +

    当变量不可变时,一旦值被绑定一个名称上,你就不能改变这个值。为了对此进行说明,使用 cargo new variables 命令在 projects 目录生成一个叫做 variables 的新项目。

    +

    接着,在新建的 variables 目录,打开 src/main.rs 并将代码替换为如下代码,这些代码还不能编译,我们会首次检查到不可变错误(immutability error)。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x = 5;
    +    println!("The value of x is: {x}");
    +    x = 6;
    +    println!("The value of x is: {x}");
    +}
    +

    保存并使用 cargo run 运行程序。应该会看到一条与不可变性有关的错误信息,如下输出所示:

    +
    $ cargo run
    +   Compiling variables v0.1.0 (file:///projects/variables)
    +error[E0384]: cannot assign twice to immutable variable `x`
    + --> src/main.rs:4:5
    +  |
    +2 |     let x = 5;
    +  |         - first assignment to `x`
    +3 |     println!("The value of x is: {x}");
    +4 |     x = 6;
    +  |     ^^^^^ cannot assign twice to immutable variable
    +  |
    +help: consider making this binding mutable
    +  |
    +2 |     let mut x = 5;
    +  |         +++
    +
    +For more information about this error, try `rustc --explain E0384`.
    +error: could not compile `variables` (bin "variables") due to 1 previous error
    +
    +

    这个例子展示了编译器如何帮助你找出程序中的错误。虽然编译错误令人沮丧,但那只是表示程序不能安全的完成你想让它完成的工作;并 不能 说明你不是一个好程序员!经验丰富的 Rustacean 们一样会遇到编译错误。

    +

    错误信息指出错误的原因是 不能对不可变变量 x 二次赋值cannot assign twice to immutable variable `x` ),因为你尝试对不可变变量 x 赋第二个值。

    +

    在尝试改变预设为不可变的值时,产生编译时错误是很重要的,因为这种情况可能导致 bug。如果一部分代码假设一个值永远也不会改变,而另一部分代码改变了这个值,第一部分代码就有可能以不可预料的方式运行。不得不承认这种 bug 的起因难以跟踪,尤其是第二部分代码只是 有时 会改变值。

    +

    Rust 编译器保证,如果声明一个值不会变,它就真的不会变,所以你不必自己跟踪它。这意味着你的代码更易于推导。

    +

    不过可变性也是非常有用的,可以用来更方便地编写代码。尽管变量默认是不可变的,你仍然可以在变量名前添加 mut 来使其可变,正如在第二章所做的那样。mut 也向读者表明了其他代码将会改变这个变量值的意图。

    +

    例如,让我们将 src/main.rs 修改为如下代码:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let mut x = 5;
    +    println!("The value of x is: {x}");
    +    x = 6;
    +    println!("The value of x is: {x}");
    +}
    +

    现在运行这个程序,出现如下内容:

    +
    $ cargo run
    +   Compiling variables v0.1.0 (file:///projects/variables)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s
    +     Running `target/debug/variables`
    +The value of x is: 5
    +The value of x is: 6
    +
    +

    通过 mut,允许把绑定到 x 的值从 5 改成 6。是否让变量可变的最终决定权仍然在你,取决于在某个特定情况下,你是否认为变量可变会让代码更加清晰明了。

    +

    常量

    +

    类似于不可变变量,常量 (constants) 是绑定到一个名称的不允许改变的值,不过常量与变量还是有一些区别。

    +

    首先,不允许对常量使用 mut。常量不光默认不可变,它总是不可变。声明常量使用 const 关键字而不是 let,并且 必须 注明值的类型。在下一部分,“数据类型” 中会介绍类型和类型注解,现在无需关心这些细节,记住总是标注类型即可。

    +

    常量可以在任何作用域中声明,包括全局作用域,这在一个值需要被很多部分的代码用到时很有用。

    +

    最后一个区别是,常量只能被设置为常量表达式,而不可以是其他任何只能在运行时计算出的值。

    +

    下面是一个声明常量的例子:

    +
    #![allow(unused)]
    +fn main() {
    +const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
    +}
    +

    常量的名称是 THREE_HOURS_IN_SECONDS,它的值被设置为 60(一分钟内的秒数)乘以 60(一小时内的分钟数)再乘以 3(我们在这个程序中要计算的小时数)的结果。Rust 对常量的命名约定是在单词之间使用全大写加下划线。编译器能够在编译时计算一组有限的操作,这使我们可以选择以更容易理解和验证的方式写出此值,而不是将此常量设置为值 10,800。有关声明常量时可以使用哪些操作的详细信息,请参阅 Rust Reference 的常量求值部分

    +

    在声明它的作用域之中,常量在整个程序生命周期中都有效,此属性使得常量可以作为多处代码使用的全局范围的值,例如一个游戏中所有玩家可以获取的最高分或者光速。

    +

    将遍布于应用程序中的硬编码值声明为常量,能帮助后来的代码维护人员了解值的意图。如果将来需要修改硬编码值,也只需修改汇聚于一处的硬编码值。

    +

    隐藏

    +

    正如在第二章猜数字游戏中所讲,我们可以定义一个与之前变量同名的新变量。Rustacean 们称之为第一个变量被第二个 隐藏(Shadowing) 了,这意味着当您使用变量的名称时,编译器将看到第二个变量。实际上,第二个变量“遮蔽”了第一个变量,此时任何使用该变量名的行为中都会视为是在使用第二个变量,直到第二个变量自己也被隐藏或第二个变量的作用域结束。可以用相同变量名称来隐藏一个变量,以及重复使用 let 关键字来多次隐藏,如下所示:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x = 5;
    +
    +    let x = x + 1;
    +
    +    {
    +        let x = x * 2;
    +        println!("The value of x in the inner scope is: {x}");
    +    }
    +
    +    println!("The value of x is: {x}");
    +}
    +

    这个程序首先将 x 绑定到值 5 上。接着通过 let x = 创建了一个新变量 x,获取初始值并加 1,这样 x 的值就变成 6 了。然后,在使用花括号创建的内部作用域内,第三个 let 语句也隐藏了 x 并创建了一个新的变量,将之前的值乘以 2x 得到的值是 12。当该作用域结束时,内部 shadowing 的作用域也结束了,x 又返回到 6。运行这个程序,它会有如下输出:

    +
    $ cargo run
    +   Compiling variables v0.1.0 (file:///projects/variables)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
    +     Running `target/debug/variables`
    +The value of x in the inner scope is: 12
    +The value of x is: 6
    +
    +

    隐藏与将变量标记为 mut 是有区别的。当不小心尝试对变量重新赋值时,如果没有使用 let 关键字,就会导致编译时错误。通过使用 let,我们可以用这个值进行一些计算,不过计算完之后变量仍然是不可变的。

    +

    mut 与隐藏的另一个区别是,当再次使用 let 时,实际上创建了一个新变量,我们可以改变值的类型,并且复用这个名字。例如,假设程序请求用户输入空格字符来说明希望在文本之间显示多少个空格,接下来我们想将输入存储成数字(多少个空格):

    +
    fn main() {
    +    let spaces = "   ";
    +    let spaces = spaces.len();
    +}
    +

    第一个 spaces 变量是字符串类型,第二个 spaces 变量是数字类型。隐藏使我们不必使用不同的名字,如 spaces_strspaces_num;相反,我们可以复用 spaces 这个更简单的名字。然而,如果尝试使用 mut,将会得到一个编译时错误,如下所示:

    +
    fn main() {
    +    let mut spaces = "   ";
    +    spaces = spaces.len();
    +}
    +

    这个错误说明,我们不能改变变量的类型:

    +
    $ cargo run
    +   Compiling variables v0.1.0 (file:///projects/variables)
    +error[E0308]: mismatched types
    + --> src/main.rs:3:14
    +  |
    +2 |     let mut spaces = "   ";
    +  |                      ----- expected due to this value
    +3 |     spaces = spaces.len();
    +  |              ^^^^^^^^^^^^ expected `&str`, found `usize`
    +
    +For more information about this error, try `rustc --explain E0308`.
    +error: could not compile `variables` (bin "variables") due to 1 previous error
    +
    +

    现在我们已经了解了变量如何工作,让我们看看变量可以拥有的更多数据类型。

    +

    数据类型

    +
    +

    ch03-02-data-types.md +
    +commit d0acb2595c891de97a133d06635c50ab449dd65c

    +
    +

    在 Rust 中,每一个值都属于某一个 数据类型data type),这告诉 Rust 它被指定为何种数据,以便明确数据处理方式。我们将看到两类数据类型子集:标量(scalar)和复合(compound)。

    +

    记住,Rust 是 静态类型statically typed)语言,也就是说在编译时就必须知道所有变量的类型。根据值及其使用方式,编译器通常可以推断出我们想要用的类型。当多种类型均有可能时,比如第二章的 “比较猜测的数字和秘密数字” 使用 parseString 转换为数字时,必须增加类型注解,像这样:

    +
    #![allow(unused)]
    +fn main() {
    +let guess: u32 = "42".parse().expect("Not a number!");
    +}
    +

    如果不像上面的代码这样添加类型注解 : u32,Rust 会显示如下错误,这说明编译器需要我们提供更多信息,来了解我们想要的类型:

    +
    $ cargo build
    +   Compiling no_type_annotations v0.1.0 (file:///projects/no_type_annotations)
    +error[E0284]: type annotations needed
    + --> src/main.rs:2:9
    +  |
    +2 |     let guess = "42".parse().expect("Not a number!");
    +  |         ^^^^^        ----- type must be known at this point
    +  |
    +  = note: cannot satisfy `<_ as FromStr>::Err == _`
    +help: consider giving `guess` an explicit type
    +  |
    +2 |     let guess: /* Type */ = "42".parse().expect("Not a number!");
    +  |              ++++++++++++
    +
    +For more information about this error, try `rustc --explain E0284`.
    +error: could not compile `no_type_annotations` (bin "no_type_annotations") due to 1 previous error
    +
    +

    你会看到其它数据类型的各种类型注解。

    +

    标量类型

    +

    标量scalar)类型代表一个单独的值。Rust 有四种基本的标量类型:整型、浮点型、布尔类型和字符类型。你可能在其他语言中见过它们。让我们深入了解它们在 Rust 中是如何工作的。

    +

    整型

    +

    整数 是一个没有小数部分的数字。我们在第二章使用过 u32 整数类型。该类型声明表明,它关联的值应该是一个占据 32 比特位的无符号整数(有符号整数类型以 i 开头而不是 u)。表格 3-1 展示了 Rust 内建的整数类型。我们可以使用其中的任一个来声明一个整数值的类型。

    +

    表格 3-1: Rust 中的整型

    +
    + + + + + + +
    长度有符号无符号
    8-biti8u8
    16-biti16u16
    32-biti32u32
    64-biti64u64
    128-biti128u128
    archisizeusize
    +
    +

    每一个变体都可以是有符号或无符号的,并有一个明确的大小。有符号无符号 代表数字能否为负值,换句话说,这个数字是否有可能是负数(有符号数),或者永远为正而不需要符号(无符号数)。这有点像在纸上书写数字:当需要考虑符号的时候,数字以加号或减号作为前缀;然而,可以安全地假设为正数时,加号前缀通常省略。有符号数以补码形式(two’s complement representation) 存储。

    +

    每一个有符号的变体可以储存包含从 -(2n - 1) 到 2n - 1 - 1 在内的数字,这里 n 是变体使用的位数。所以 i8 可以储存从 -(27) 到 27 - 1 在内的数字,也就是从 -128 到 127。无符号的变体可以储存从 0 到 2n - 1 的数字,所以 u8 可以储存从 0 到 28 - 1 的数字,也就是从 0 到 255。

    +

    另外,isizeusize 类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的,32 位架构上它们是 32 位的。

    +

    可以使用表格 3-2 中的任何一种形式编写数字字面值。请注意可以是多种数字类型的数字字面值允许使用类型后缀,例如 57u8 来指定类型,同时也允许使用 _ 做为分隔符以方便读数,例如1_000,它的值与你指定的 1000 相同。

    +

    表格 3-2: Rust 中的整型字面值

    +
    + + + + + +
    数字字面值例子
    Decimal (十进制)98_222
    Hex (十六进制)0xff
    Octal (八进制)0o77
    Binary (二进制)0b1111_0000
    Byte (单字节字符)(仅限于u8)b'A'
    +
    +

    那么该使用哪种类型的数字呢?如果拿不定主意,Rust 的默认类型通常是个不错的起点,数字类型默认是 i32isizeusize 主要作为某些集合的索引。

    +
    +
    整型溢出
    +

    比方说有一个 u8 ,它可以存放从零到 255 的值。那么当你将其修改为 256 时会发生什么呢?这被称为 “整型溢出”(“integer overflow” ),这会导致以下两种行为之一的发生。当在 debug 模式编译时,Rust 检查这类问题并使程序 panic,这个术语被 Rust 用来表明程序因错误而退出。第九章 panic! 与不可恢复的错误” 部分会详细介绍 panic。

    +

    使用 --release flag 在 release 模式中构建时,Rust 不会检测会导致 panic 的整型溢出。相反发生整型溢出时,Rust 会进行一种被称为二进制补码 wrapping(two’s complement wrapping)的操作。简而言之,比此类型能容纳最大值还大的值会回绕到最小值,值 256 变成 0,值 257 变成 1,依此类推。程序不会 panic,不过变量可能也不会是你所期望的值。依赖整型溢出 wrapping 的行为被认为是一种错误。

    +

    为了显式地处理溢出的可能性,可以使用这几类标准库提供的原始数字类型方法:

    +
      +
    • 所有模式下都可以使用 wrapping_* 方法进行 wrapping,如 wrapping_add
    • +
    • 如果 checked_* 方法出现溢出,则返回 None
    • +
    • overflowing_* 方法返回值和一个布尔值,表示是否出现溢出
    • +
    • saturating_* 方法在值的最小值或最大值处进行饱和处理
    • +
    +
    +

    浮点型

    +

    Rust 也有两个原生的 浮点数floating-point numbers)类型,它们是带小数点的数字。Rust 的浮点数类型是 f32f64,分别占 32 位和 64 位。默认类型是 f64,因为在现代 CPU 中,它与 f32 速度几乎一样,不过精度更高。所有的浮点型都是有符号的。

    +

    这是一个展示浮点数的实例:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x = 2.0; // f64
    +
    +    let y: f32 = 3.0; // f32
    +}
    +

    浮点数采用 IEEE-754 标准表示。f32 是单精度浮点数,f64 是双精度浮点数。

    +

    数值运算

    +

    Rust 中的所有数字类型都支持基本数学运算:加法、减法、乘法、除法和取余。整数除法会向零舍入到最接近的整数。下面的代码展示了如何在 let 语句中使用它们:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    // addition
    +    let sum = 5 + 10;
    +
    +    // subtraction
    +    let difference = 95.5 - 4.3;
    +
    +    // multiplication
    +    let product = 4 * 30;
    +
    +    // division
    +    let quotient = 56.7 / 32.2;
    +    let truncated = -5 / 3; // 结果为 -1
    +
    +    // remainder
    +    let remainder = 43 % 5;
    +}
    +

    这些语句中的每个表达式使用了一个数学运算符并计算出了一个值,然后绑定给一个变量。附录 B 包含 Rust 提供的所有运算符的列表。

    +

    布尔型

    +

    正如其他大部分编程语言一样,Rust 中的布尔类型有两个可能的值:truefalse。Rust 中的布尔类型使用 bool 表示。例如:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let t = true;
    +
    +    let f: bool = false; // with explicit type annotation
    +}
    +

    使用布尔值的主要场景是条件表达式,例如 if 表达式。在 “控制流”(“Control Flow”) 部分将介绍 if 表达式在 Rust 中如何工作。

    +

    字符类型

    +

    Rust 的 char 类型是语言中最原生的字母类型。下面是一些声明 char 值的例子:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let c = 'z';
    +    let z: char = 'ℤ'; // with explicit type annotation
    +    let heart_eyed_cat = '😻';
    +}
    +

    注意,我们用单引号声明 char 字面量,而与之相反的是,使用双引号声明字符串字面量。Rust 的 char 类型的大小为四个字节 (four bytes),并代表了一个 Unicode 标量值(Unicode Scalar Value),这意味着它可以比 ASCII 表示更多内容。在 Rust 中,带变音符号的字母(Accented letters),中文、日文、韩文等字符,emoji(绘文字)以及零长度的空白字符都是有效的 char 值。Unicode 标量值包含从 U+0000U+D7FFU+E000U+10FFFF 在内的值。不过,“字符” 并不是一个 Unicode 中的概念,所以人直觉上的 “字符” 可能与 Rust 中的 char 并不符合。第八章的 “使用字符串储存 UTF-8 编码的文本” 中将详细讨论这个主题。

    +

    复合类型

    +

    复合类型Compound types)可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array)。

    +

    元组类型

    +

    元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定:一旦声明,其长度不会增大或缩小。

    +

    我们使用包含在圆括号中的逗号分隔的值列表来创建一个元组。元组中的每一个位置都有一个类型,而且这些不同值的类型也不必是相同的。这个例子中使用了可选的类型注解:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let tup: (i32, f64, u8) = (500, 6.4, 1);
    +}
    +

    tup 变量绑定到整个元组上,因为元组是一个单独的复合元素。为了从元组中获取单个值,可以使用模式匹配(pattern matching)来解构(destructure)元组值,像这样:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let tup = (500, 6.4, 1);
    +
    +    let (x, y, z) = tup;
    +
    +    println!("The value of y is: {y}");
    +}
    +

    程序首先创建了一个元组并绑定到 tup 变量上。接着使用了 let 和一个模式将 tup 分成了三个不同的变量,xyz。这叫做 解构destructuring),因为它将一个元组拆成了三个部分。最后,程序打印出了 y 的值,也就是 6.4

    +

    我们也可以使用点号(.)后跟值的索引来直接访问它们。例如:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x: (i32, f64, u8) = (500, 6.4, 1);
    +
    +    let five_hundred = x.0;
    +
    +    let six_point_four = x.1;
    +
    +    let one = x.2;
    +}
    +

    这个程序创建了一个元组,x,然后使用其各自的索引访问元组中的每个元素。跟大多数编程语言一样,元组的第一个索引值是 0。

    +

    不带任何值的元组有个特殊的名称,叫做 单元(unit) 元组。这种值以及对应的类型都写作 (),表示空值或空的返回类型。如果表达式不返回任何其他值,则会隐式返回单元值。

    +

    数组类型

    +

    另一个包含多个值的方式是 数组array)。与元组不同,数组中的每个元素的类型必须相同。Rust 中的数组与一些其他语言中的数组不同,Rust 中的数组长度是固定的。

    +

    我们将数组的值写成在方括号内,用逗号分隔:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let a = [1, 2, 3, 4, 5];
    +}
    +

    当你想要在栈(stack)而不是在堆(heap)上为数据分配空间(第四章将讨论栈与堆的更多内容),或者是想要确保总是有固定数量的元素时,数组非常有用。但是数组并不如 vector 类型灵活。vector 类型是标准库提供的一个 允许 增长和缩小长度的类似数组的集合类型。当不确定是应该使用数组还是 vector 的时候,那么很可能应该使用 vector。第八章会详细讨论 vector。

    +

    然而,当你确定元素个数不会改变时,数组会更有用。例如,当你在一个程序中使用月份名字时,你更应趋向于使用数组而不是 vector,因为你确定只会有 12 个元素。

    +
    #![allow(unused)]
    +fn main() {
    +let months = ["January", "February", "March", "April", "May", "June", "July",
    +              "August", "September", "October", "November", "December"];
    +}
    +

    可以像这样编写数组的类型:在方括号中包含每个元素的类型,后跟分号,再后跟数组元素的数量。

    +
    #![allow(unused)]
    +fn main() {
    +let a: [i32; 5] = [1, 2, 3, 4, 5];
    +}
    +

    这里,i32 是每个元素的类型。分号之后,数字 5 表明该数组包含五个元素。

    +

    你还可以通过在方括号中指定初始值加分号再加元素个数的方式来创建一个每个元素都为相同值的数组:

    +
    #![allow(unused)]
    +fn main() {
    +let a = [3; 5];
    +}
    +

    变量名为 a 的数组将包含 5 个元素,这些元素的值最初都将被设置为 3。这种写法与 let a = [3, 3, 3, 3, 3]; 效果相同,但更简洁。

    +
    访问数组元素
    +

    数组是可以在栈 (stack) 上分配的已知固定大小的单个内存块。可以使用索引来访问数组的元素,像这样:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let a = [1, 2, 3, 4, 5];
    +
    +    let first = a[0];
    +    let second = a[1];
    +}
    +

    在这个例子中,叫做 first 的变量的值是 1,因为它是数组索引 [0] 的值。变量 second 将会是数组索引 [1] 的值 2

    +
    无效的数组元素访问
    +

    让我们看看如果我们访问数组结尾之后的元素会发生什么呢?比如你执行以下代码,它使用类似于第 2 章中的猜数字游戏的代码从用户那里获取数组索引:

    +

    文件名:src/main.rs

    +
    use std::io;
    +
    +fn main() {
    +    let a = [1, 2, 3, 4, 5];
    +
    +    println!("Please enter an array index.");
    +
    +    let mut index = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut index)
    +        .expect("Failed to read line");
    +
    +    let index: usize = index
    +        .trim()
    +        .parse()
    +        .expect("Index entered was not a number");
    +
    +    let element = a[index];
    +
    +    println!("The value of the element at index {index} is: {element}");
    +}
    +

    此代码编译成功。如果您使用 cargo run 运行此代码并输入 01234,程序将在数组中的索引处打印出相应的值。如果你输入一个超过数组末端的数字,如 10,你会看到这样的输出:

    +
    thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src/main.rs:19:19
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +

    程序在索引操作中使用一个无效的值时导致 运行时 错误。程序带着错误信息退出,并且没有执行最后的 println! 语句。当尝试用索引访问一个元素时,Rust 会检查指定的索引是否小于数组的长度。如果索引超出了数组长度,Rust 会 panic,这是 Rust 术语,它用于程序因为错误而退出的情况。这种检查必须在运行时进行,特别是在这种情况下,因为编译器不可能知道用户在以后运行代码时将输入什么值。

    +

    这是第一个在实战中遇到的 Rust 安全原则的例子。在很多底层语言中,并没有进行这类检查,这样当提供了一个不正确的索引时,就会访问无效的内存。通过立即退出而不是允许内存访问并继续执行,Rust 让你避开此类错误。第九章会更详细地讨论 Rust 的错误处理机制,以及如何编写可读性强而又安全的代码,使程序既不会 panic 也不会导致非法内存访问。

    +

    函数

    +
    +

    ch03-03-how-functions-work.md +
    +commit d0acb2595c891de97a133d06635c50ab449dd65c

    +
    +

    函数在 Rust 代码中非常普遍。你已经见过语言中最重要的函数之一:main 函数,它是很多程序的入口点。你也见过 fn 关键字,它用来声明新函数。

    +

    Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并使用下划线分隔单词。这是一个包含函数定义示例的程序:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    println!("Hello, world!");
    +
    +    another_function();
    +}
    +
    +fn another_function() {
    +    println!("Another function.");
    +}
    +

    我们在 Rust 中通过输入 fn 后面跟着函数名和一对圆括号来定义函数。大括号告诉编译器哪里是函数体的开始和结尾。

    +

    可以使用函数名后跟圆括号来调用我们定义过的任意函数。因为程序中已定义 another_function 函数,所以可以在 main 函数中调用它。注意,源码中 another_function 定义在 main 函数 之后;也可以定义在之前。Rust 不关心函数定义所在的位置,只要函数被调用时出现在调用之处可见的作用域内就行。

    +

    让我们新建一个叫做 functions 的二进制项目来进一步探索函数。将上面的 another_function 例子写入 src/main.rs 中并运行。你应该会看到如下输出:

    +
    $ cargo run
    +   Compiling functions v0.1.0 (file:///projects/functions)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.28s
    +     Running `target/debug/functions`
    +Hello, world!
    +Another function.
    +
    +

    main 函数中的代码会按顺序执行。首先,打印 “Hello, world!” 信息,然后调用 another_function 函数并打印它的信息。

    +

    参数

    +

    我们可以定义为拥有 参数parameters)的函数,参数是特殊变量,是函数签名的一部分。当函数拥有参数(形参)时,可以为这些参数提供具体的值(实参)。技术上讲,这些具体值被称为参数(arguments),但是在日常交流中,人们倾向于不区分使用 parameterargument 来表示函数定义中的变量或调用函数时传入的具体值。

    +

    在这版 another_function 中,我们增加了一个参数:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    another_function(5);
    +}
    +
    +fn another_function(x: i32) {
    +    println!("The value of x is: {x}");
    +}
    +

    尝试运行程序,将会输出如下内容:

    +
    $ cargo run
    +   Compiling functions v0.1.0 (file:///projects/functions)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.21s
    +     Running `target/debug/functions`
    +The value of x is: 5
    +
    +

    another_function 的声明中有一个命名为 x 的参数。x 的类型被指定为 i32。当我们将 5 传给 another_function 时,println! 宏会把 5 放在格式字符串中包含 x 的那对花括号的位置。

    +

    在函数签名中,必须 声明每个参数的类型。这是 Rust 设计中一个经过慎重考虑的决定:要求在函数定义中提供类型注解,意味着编译器再也不需要你在代码的其他地方注明类型来指出你的意图。而且,在知道函数需要什么类型后,编译器就能够给出更有用的错误消息。

    +

    当定义多个参数时,使用逗号分隔,像这样:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    print_labeled_measurement(5, 'h');
    +}
    +
    +fn print_labeled_measurement(value: i32, unit_label: char) {
    +    println!("The measurement is: {value}{unit_label}");
    +}
    +

    这个例子创建了一个名为 print_labeled_measurement 的函数,它有两个参数。第一个参数名为 value,类型是 i32。第二个参数是 unit_label ,类型是 char。然后,该函数打印包含 valueunit_label 的文本。

    +

    尝试运行代码。使用上面的例子替换当前 functions 项目的 src/main.rs 文件,并用 cargo run 运行它:

    +
    $ cargo run
    +   Compiling functions v0.1.0 (file:///projects/functions)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
    +     Running `target/debug/functions`
    +The measurement is: 5h
    +
    +

    因为我们使用 5 作为 value 的值,h 作为 unit_label 的值来调用函数,所以程序输出包含这些值。

    +

    语句和表达式

    +

    函数体由一系列的语句和一个可选的结尾表达式构成。目前为止,我们提到的函数还不包含结尾表达式,不过你已经见过作为语句一部分的表达式。因为 Rust 是一门基于表达式(expression-based)的语言,这是一个需要理解的(不同于其他语言)重要区别。其他语言并没有这样的区别,所以让我们看看语句与表达式有什么区别以及这些区别是如何影响函数体的。

    +

    语句Statements)是执行一些操作但不返回值的指令。 +表达式Expressions)计算并产生一个值。让我们看一些例子。

    +

    实际上,我们已经使用过语句和表达式。使用 let 关键字创建变量并绑定一个值是一个语句。在列表 3-1 中,let y = 6; 是一个语句。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let y = 6;
    +}
    +

    列表 3-1:包含一个语句的 main 函数定义

    +

    函数定义也是语句,上面整个例子本身就是一个语句。

    +

    语句不返回值。因此,不能把 let 语句赋值给另一个变量,比如下面的例子尝试做的,会产生一个错误:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x = (let y = 6);
    +}
    +

    当运行这个程序时,会得到如下错误:

    +
    $ cargo run
    +   Compiling functions v0.1.0 (file:///projects/functions)
    +error: expected expression, found `let` statement
    + --> src/main.rs:2:14
    +  |
    +2 |     let x = (let y = 6);
    +  |              ^^^
    +  |
    +  = note: only supported directly in conditions of `if` and `while` expressions
    +
    +warning: unnecessary parentheses around assigned value
    + --> src/main.rs:2:13
    +  |
    +2 |     let x = (let y = 6);
    +  |             ^         ^
    +  |
    +  = note: `#[warn(unused_parens)]` on by default
    +help: remove these parentheses
    +  |
    +2 -     let x = (let y = 6);
    +2 +     let x = let y = 6;
    +  |
    +
    +warning: `functions` (bin "functions") generated 1 warning
    +error: could not compile `functions` (bin "functions") due to 1 previous error; 1 warning emitted
    +
    +

    let y = 6 语句并不返回值,所以没有可以绑定到 x 上的值。这与其他语言不同,例如 C 和 Ruby,它们的赋值语句会返回所赋的值。在这些语言中,可以这么写 x = y = 6,这样 xy 的值都是 6;Rust 中不能这样写。

    +

    表达式会计算出一个值,并且你将编写的大部分 Rust 代码是由表达式组成的。考虑一个数学运算,比如 5 + 6,这是一个表达式并计算出值 11。表达式可以是语句的一部分:在示例 3-1 中,语句 let y = 6; 中的 6 是一个表达式,它计算出的值是 6。函数调用是一个表达式。宏调用是一个表达式。用大括号创建的一个新的块作用域也是一个表达式,例如:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let y = {
    +        let x = 3;
    +        x + 1
    +    };
    +
    +    println!("The value of y is: {y}");
    +}
    +

    这个表达式:

    +
    {
    +    let x = 3;
    +    x + 1
    +}
    +

    是一个代码块,它的值是 4。这个值作为 let 语句的一部分被绑定到 y 上。注意 x+1 这一行在结尾没有分号,与你见过的大部分代码行不同。表达式的结尾没有分号。如果在表达式的结尾加上分号,它就变成了语句,而语句不会返回值。在接下来探索具有返回值的函数和表达式时要谨记这一点。

    +

    具有返回值的函数

    +

    函数可以向调用它的代码返回值。我们并不对返回值命名,但要在箭头(->)后声明它的类型。在 Rust 中,函数的返回值等同于函数体最后一个表达式的值。使用 return 关键字和指定值,可从函数中提前返回;但大部分函数隐式的返回最后的表达式。这是一个有返回值的函数的例子:

    +

    文件名:src/main.rs

    +
    fn five() -> i32 {
    +    5
    +}
    +
    +fn main() {
    +    let x = five();
    +
    +    println!("The value of x is: {x}");
    +}
    +

    five 函数中没有函数调用、宏、甚至没有 let 语句 —— 只有数字 5。这在 Rust 中是一个完全有效的函数。注意,也指定了函数返回值的类型,就是 -> i32。尝试运行代码;输出应该看起来像这样:

    +
    $ cargo run
    +   Compiling functions v0.1.0 (file:///projects/functions)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s
    +     Running `target/debug/functions`
    +The value of x is: 5
    +
    +

    five 函数的返回值是 5,所以返回值类型是 i32。让我们仔细检查一下这段代码。有两个重要的部分:首先,let x = five(); 这一行表明我们使用函数的返回值初始化一个变量。因为 five 函数返回 5,这一行与如下代码相同:

    +
    #![allow(unused)]
    +fn main() {
    +let x = 5;
    +}
    +

    其次,five 函数没有参数并定义了返回值类型,不过函数体只有单单一个 5 也没有分号,因为这是一个表达式,我们想要返回它的值。

    +

    让我们看看另一个例子:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x = plus_one(5);
    +
    +    println!("The value of x is: {x}");
    +}
    +
    +fn plus_one(x: i32) -> i32 {
    +    x + 1
    +}
    +

    运行代码会打印出 The value of x is: 6。但如果在包含 x + 1 的行尾加上一个分号,把它从表达式变成语句,我们将看到一个错误。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x = plus_one(5);
    +
    +    println!("The value of x is: {x}");
    +}
    +
    +fn plus_one(x: i32) -> i32 {
    +    x + 1;
    +}
    +

    运行代码会产生一个错误,如下:

    +
    $ cargo run
    +   Compiling functions v0.1.0 (file:///projects/functions)
    +error[E0308]: mismatched types
    + --> src/main.rs:7:24
    +  |
    +7 | fn plus_one(x: i32) -> i32 {
    +  |    --------            ^^^ expected `i32`, found `()`
    +  |    |
    +  |    implicitly returns `()` as its body has no tail or `return` expression
    +8 |     x + 1;
    +  |          - help: remove this semicolon to return this value
    +
    +For more information about this error, try `rustc --explain E0308`.
    +error: could not compile `functions` (bin "functions") due to 1 previous error
    +
    +

    主要的错误信息,“mismatched types”(类型不匹配),揭示了代码的核心问题。函数 plus_one 的定义说明它要返回一个 i32 类型的值,不过语句并不会返回值,使用单位类型 () 表示不返回值。因为不返回值与函数定义相矛盾,从而出现一个错误。在输出中,Rust 提供了一条信息,可能有助于纠正这个错误:它建议删除分号,这会修复这个错误。

    +

    注释

    +
    +

    ch03-04-comments.md +
    +commit d0acb2595c891de97a133d06635c50ab449dd65c

    +
    +

    所有程序员都力求使其代码易于理解,不过有时还需要提供额外的解释。在这种情况下,程序员在源码中留下 注释comments),编译器会忽略它们,不过阅读代码的人可能觉得有用。

    +

    这是一个简单的注释:

    +
    #![allow(unused)]
    +fn main() {
    +// hello, world
    +}
    +

    在 Rust 中,惯用的注释样式是以两个斜杠开始注释,并持续到本行的结尾。对于超过一行的注释,需要在每一行前都加上 //,像这样:

    +
    #![allow(unused)]
    +fn main() {
    +// So we’re doing something complicated here, long enough that we need
    +// multiple lines of comments to do it! Whew! Hopefully, this comment will
    +// explain what’s going on.
    +}
    +

    注释也可以放在包含代码的行的末尾:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let lucky_number = 7; // I’m feeling lucky today
    +}
    +

    不过你更经常看到的是以这种格式使用它们,也就是位于它所解释的代码行的上面一行:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    // I’m feeling lucky today
    +    let lucky_number = 7;
    +}
    +

    Rust 还有另一种注释,称为文档注释,我们将在 14 章的 “将 crate 发布到 Crates.io” 部分讨论它。

    +

    控制流

    +
    +

    ch03-05-control-flow.md +
    +commit d0acb2595c891de97a133d06635c50ab449dd65c

    +
    +

    根据条件是否为真来决定是否执行某些代码,以及根据条件是否为真来重复运行一段代码的能力是大部分编程语言的基本组成部分。Rust 代码中最常见的用来控制执行流的结构是 if 表达式和循环。

    +

    if 表达式

    +

    if 表达式允许根据条件执行不同的代码分支。你提供一个条件并表示 “如果条件满足,运行这段代码;如果条件不满足,不运行这段代码。

    +

    projects 目录新建一个叫做 branches 的项目,来学习 if 表达式。在 src/main.rs 文件中,输入如下内容:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let number = 3;
    +
    +    if number < 5 {
    +        println!("condition was true");
    +    } else {
    +        println!("condition was false");
    +    }
    +}
    +

    所有的 if 表达式都以 if 关键字开头,其后跟一个条件。在这个例子中,条件检查变量 number 的值是否小于 5。在条件为 true 时希望执行的代码块位于紧跟条件之后的大括号中。if 表达式中与条件关联的代码块有时被叫做 arms,就像第二章 “比较猜测的数字和秘密数字” 部分中讨论到的 match 表达式中的分支一样。

    +

    也可以包含一个可选的 else 表达式来提供一个在条件为 false 时应当执行的代码块,这里我们就这么做了。如果不提供 else 表达式并且条件为 false 时,程序会直接忽略 if 代码块并继续执行下面的代码。

    +

    尝试运行代码,应该能看到如下输出:

    +
    $ cargo run
    +   Compiling branches v0.1.0 (file:///projects/branches)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
    +     Running `target/debug/branches`
    +condition was true
    +
    +

    尝试改变 number 的值使条件为 false 时看看会发生什么:

    +
    fn main() {
    +    let number = 7;
    +
    +    if number < 5 {
    +        println!("condition was true");
    +    } else {
    +        println!("condition was false");
    +    }
    +}
    +

    再次运行程序并查看输出:

    +
    $ cargo run
    +   Compiling branches v0.1.0 (file:///projects/branches)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
    +     Running `target/debug/branches`
    +condition was false
    +
    +

    另外值得注意的是代码中的条件 必须bool 值。如果条件不是 bool 值,我们将得到一个错误。例如,尝试运行以下代码:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let number = 3;
    +
    +    if number {
    +        println!("number was three");
    +    }
    +}
    +

    这里 if 条件的值是 3,Rust 抛出了一个错误:

    +
    $ cargo run
    +   Compiling branches v0.1.0 (file:///projects/branches)
    +error[E0308]: mismatched types
    + --> src/main.rs:4:8
    +  |
    +4 |     if number {
    +  |        ^^^^^^ expected `bool`, found integer
    +
    +For more information about this error, try `rustc --explain E0308`.
    +error: could not compile `branches` (bin "branches") due to 1 previous error
    +
    +

    这个错误表明 Rust 期望一个 bool 却得到了一个整数。不像 Ruby 或 JavaScript 这样的语言,Rust 并不会尝试自动地将非布尔值转换为布尔值。必须总是显式地使用布尔值作为 if 的条件。例如,如果想要 if 代码块只在一个数字不等于 0 时执行,可以把 if 表达式修改成下面这样:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let number = 3;
    +
    +    if number != 0 {
    +        println!("number was something other than zero");
    +    }
    +}
    +

    运行代码会打印出 number was something other than zero

    +

    使用 else if 处理多重条件

    +

    可以将 else if 表达式与 ifelse 组合来实现多重条件。例如:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let number = 6;
    +
    +    if number % 4 == 0 {
    +        println!("number is divisible by 4");
    +    } else if number % 3 == 0 {
    +        println!("number is divisible by 3");
    +    } else if number % 2 == 0 {
    +        println!("number is divisible by 2");
    +    } else {
    +        println!("number is not divisible by 4, 3, or 2");
    +    }
    +}
    +

    这个程序有四个可能的执行路径。运行后应该能看到如下输出:

    +
    $ cargo run
    +   Compiling branches v0.1.0 (file:///projects/branches)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
    +     Running `target/debug/branches`
    +number is divisible by 3
    +
    +

    当执行这个程序时,它按顺序检查每个 if 表达式并执行第一个条件为 true 的代码块。注意即使 6 可以被 2 整除,也不会输出 number is divisible by 2,更不会输出 else 块中的 number is not divisible by 4, 3, or 2。原因是 Rust 只会执行第一个条件为 true 的代码块,并且一旦它找到一个以后,甚至都不会检查剩下的条件了。

    +

    使用过多的 else if 表达式会使代码显得杂乱无章,所以如果有多于一个 else if 表达式,最好重构代码。为此,第六章会介绍一个强大的 Rust 分支结构(branching construct),叫做 match

    +

    let 语句中使用 if

    +

    因为 if 是一个表达式,我们可以在 let 语句的右侧使用它,例如在示例 3-2 中:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let condition = true;
    +    let number = if condition { 5 } else { 6 };
    +
    +    println!("The value of number is: {number}");
    +}
    +

    示例 3-2:将 if 表达式的返回值赋给一个变量

    +

    number 变量将会绑定到表示 if 表达式结果的值上。运行这段代码看看会出现什么:

    +
    $ cargo run
    +   Compiling branches v0.1.0 (file:///projects/branches)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s
    +     Running `target/debug/branches`
    +The value of number is: 5
    +
    +

    记住,代码块的值是其最后一个表达式的值,而数字本身就是一个表达式。在这个例子中,整个 if 表达式的值取决于哪个代码块被执行。这意味着 if 的每个分支的可能的返回值都必须是相同类型;在示例 3-2 中,if 分支和 else 分支的结果都是 i32 整型。如果它们的类型不匹配,如下面这个例子,则会出现一个错误:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let condition = true;
    +
    +    let number = if condition { 5 } else { "six" };
    +
    +    println!("The value of number is: {number}");
    +}
    +

    当编译这段代码时,会得到一个错误。ifelse 分支的值类型是不相容的,同时 Rust 也准确地指出在程序中的何处发现的这个问题:

    +
    $ cargo run
    +   Compiling branches v0.1.0 (file:///projects/branches)
    +error[E0308]: `if` and `else` have incompatible types
    + --> src/main.rs:4:44
    +  |
    +4 |     let number = if condition { 5 } else { "six" };
    +  |                                 -          ^^^^^ expected integer, found `&str`
    +  |                                 |
    +  |                                 expected because of this
    +
    +For more information about this error, try `rustc --explain E0308`.
    +error: could not compile `branches` (bin "branches") due to 1 previous error
    +
    +

    if 代码块中的表达式返回一个整数,而 else 代码块中的表达式返回一个字符串。这不可行,因为变量必须只有一个类型。Rust 需要在编译时就确切的知道 number 变量的类型,这样它就可以在编译时验证在每处使用的 number 变量的类型是有效的。如果number的类型仅在运行时确定,则 Rust 无法做到这一点;且编译器必须跟踪每一个变量的多种假设类型,那么它就会变得更加复杂,对代码的保证也会减少。

    +

    使用循环重复执行

    +

    多次执行同一段代码是很常用的,Rust 为此提供了多种 循环loops)。一个循环执行循环体中的代码直到结尾并紧接着回到开头继续执行。为了实验一下循环,让我们新建一个叫做 loops 的项目。

    +

    Rust 有三种循环:loopwhilefor。我们每一个都试试。

    +

    使用 loop 重复执行代码

    +

    loop 关键字告诉 Rust 一遍又一遍地执行一段代码直到你明确要求停止。

    +

    作为一个例子,将 loops 目录中的 src/main.rs 文件修改为如下:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    loop {
    +        println!("again!");
    +    }
    +}
    +

    当运行这个程序时,我们会看到连续的反复打印 again!,直到我们手动停止程序。大部分终端都支持一个快捷键,ctrl-c,来终止一个陷入无限循环的程序。尝试一下:

    +
    $ cargo run
    +   Compiling loops v0.1.0 (file:///projects/loops)
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.29s
    +     Running `target/debug/loops`
    +again!
    +again!
    +again!
    +again!
    +^Cagain!
    +
    +

    符号 ^C 代表你在这按下了ctrl-c。在 ^C 之后你可能看到也可能看不到 again! ,这取决于在接收到终止信号时代码执行到了循环的何处。

    +

    幸运的是,Rust 提供了一种从代码中跳出循环的方法。可以使用 break 关键字来告诉程序何时停止循环。回忆一下在第二章猜猜看游戏的 “猜测正确后退出” 部分使用过它来在用户猜对数字赢得游戏后退出程序。

    +

    我们在猜谜游戏中也使用了 continue。循环中的 continue 关键字告诉程序跳过这个循环迭代中的任何剩余代码,并转到下一个迭代。

    +

    从循环返回值

    +

    loop 的一个用例是重试可能会失败的操作,比如检查线程是否完成了任务。然而你可能会需要将操作的结果传递给其它的代码。如果将返回值加入你用来停止循环的 break 表达式,它会被停止的循环返回:

    +
    fn main() {
    +    let mut counter = 0;
    +
    +    let result = loop {
    +        counter += 1;
    +
    +        if counter == 10 {
    +            break counter * 2;
    +        }
    +    };
    +
    +    println!("The result is {result}");
    +}
    +

    在循环之前,我们声明了一个名为 counter 的变量并初始化为 0。接着声明了一个名为 result 来存放循环的返回值。在循环的每一次迭代中,我们将 counter 变量加 1,接着检查计数是否等于 10。当相等时,使用 break 关键字返回值 counter * 2。循环之后,我们通过分号结束赋值给 result 的语句。最后打印出 result 的值,也就是 20

    +

    循环标签:在多个循环之间消除歧义

    +

    如果存在嵌套循环,breakcontinue 应用于此时最内层的循环。你可以选择在一个循环上指定一个 循环标签loop label),然后将标签与 breakcontinue 一起使用,使这些关键字应用于已标记的循环而不是最内层的循环。下面是一个包含两个嵌套循环的示例

    +
    fn main() {
    +    let mut count = 0;
    +    'counting_up: loop {
    +        println!("count = {count}");
    +        let mut remaining = 10;
    +
    +        loop {
    +            println!("remaining = {remaining}");
    +            if remaining == 9 {
    +                break;
    +            }
    +            if count == 2 {
    +                break 'counting_up;
    +            }
    +            remaining -= 1;
    +        }
    +
    +        count += 1;
    +    }
    +    println!("End count = {count}");
    +}
    +

    外层循环有一个标签 counting_up,它将从 0 数到 2。没有标签的内部循环从 10 向下数到 9。第一个没有指定标签的 break 将只退出内层循环。break 'counting_up; 语句将退出外层循环。这个代码打印:

    +
    $ cargo run
    +   Compiling loops v0.1.0 (file:///projects/loops)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.58s
    +     Running `target/debug/loops`
    +count = 0
    +remaining = 10
    +remaining = 9
    +count = 1
    +remaining = 10
    +remaining = 9
    +count = 2
    +remaining = 10
    +End count = 2
    +
    +

    while 条件循环

    +

    在程序中计算循环的条件也很常见。当条件为 true,执行循环。当条件不再为 true,调用 break 停止循环。这个循环类型可以通过组合 loopifelsebreak 来实现;如果你喜欢的话,现在就可以在程序中试试。

    +

    然而,这个模式太常用了,Rust 为此内置了一个语言结构,它被称为 while 循环。示例 3-3 使用了 while:程序循环三次,每次数字都减一。接着,在循环结束后,打印出另一个信息并退出。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let mut number = 3;
    +
    +    while number != 0 {
    +        println!("{number}!");
    +
    +        number -= 1;
    +    }
    +
    +    println!("LIFTOFF!!!");
    +}
    +

    示例 3-3: 当条件为真时,使用 while 循环运行代码

    +

    这种结构消除了很多使用 loopifelsebreak 时所必须的嵌套,这样更加清晰。当条件为 true 就执行,否则退出循环。

    +

    使用 for 遍历集合

    +

    可以使用 while 结构来遍历集合中的元素,比如数组。例如,看看示例 3-4。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let a = [10, 20, 30, 40, 50];
    +    let mut index = 0;
    +
    +    while index < 5 {
    +        println!("the value is: {}", a[index]);
    +
    +        index += 1;
    +    }
    +}
    +

    示例 3-4:使用 while 循环遍历集合中的元素

    +

    这里,代码对数组中的元素进行计数。它从索引 0 开始,并接着循环直到遇到数组的最后一个索引(这时,index < 5 不再为真)。运行这段代码会打印出数组中的每一个元素:

    +
    $ cargo run
    +   Compiling loops v0.1.0 (file:///projects/loops)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.32s
    +     Running `target/debug/loops`
    +the value is: 10
    +the value is: 20
    +the value is: 30
    +the value is: 40
    +the value is: 50
    +
    +

    数组中的所有五个元素都如期被打印出来。尽管 index 在某一时刻会到达值 5,不过循环在其尝试从数组获取第六个值(会越界)之前就停止了。

    +

    但这个过程很容易出错;如果索引长度或测试条件不正确会导致程序 panic。例如,如果将 a 数组的定义改为包含 4 个元素而忘记了更新条件 while index < 4,则代码会 panic。这也使程序更慢,因为编译器增加了运行时代码来对每次循环进行条件检查,以确定在循环的每次迭代中索引是否在数组的边界内。

    +

    作为更简洁的替代方案,可以使用 for 循环来对一个集合的每个元素执行一些代码。for 循环看起来如示例 3-5 所示:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let a = [10, 20, 30, 40, 50];
    +
    +    for element in a {
    +        println!("the value is: {element}");
    +    }
    +}
    +

    示例 3-5:使用 for 循环遍历集合中的元素

    +

    当运行这段代码时,将看到与示例 3-4 一样的输出。更为重要的是,我们增强了代码安全性,并消除了可能由于超出数组的结尾或遍历长度不够而缺少一些元素而导致的 bug。

    +

    例如,在示例 3-4 的代码中,如果你将 a 数组的定义改为有四个元素,但忘记将条件更新为 while index < 4,代码将会 panic。使用 for 循环的话,就不需要惦记着在改变数组元素个数时修改其他的代码了。

    +

    for 循环的安全性和简洁性使得它成为 Rust 中使用最多的循环结构。即使是在想要循环执行代码特定次数时,例如示例 3-3 中使用 while 循环的倒计时例子,大部分 Rustacean 也会使用 for 循环。这么做的方式是使用 Range,它是标准库提供的类型,用来生成从一个数字开始到另一个数字之前结束的所有数字的序列。

    +

    下面是一个使用 for 循环来倒计时的例子,它还使用了一个我们还未讲到的方法,rev,用来反转 range。

    +

    注意:以下代码不会踏足到数字 4,仅从一个数字开始到另一个数字之前。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    for number in (1..4).rev() {
    +        println!("{number}!");
    +    }
    +    println!("LIFTOFF!!!");
    +}
    +

    这段代码看起来更帅气不是吗?

    +

    总结

    +

    你做到了!这是一个大章节:你学习了变量、标量和复合数据类型、函数、注释、 if 表达式和循环!如果你想要实践本章讨论的概念,尝试构建如下程序:

    +
      +
    • 相互转换摄氏与华氏温度。
    • +
    • 生成第 n 个斐波那契数。
    • +
    • 打印圣诞颂歌 “The Twelve Days of Christmas” 的歌词,并利用歌曲中的重复部分(编写循环)。
    • +
    +

    当你准备好继续的时候,让我们讨论一个其他语言中 并不 常见的概念:所有权(ownership)。

    +

    认识所有权

    +
    +

    ch04-00-understanding-ownership.md +
    +commit a5e0c5b2c5f9054be3b961aea2c7edfeea591de8

    +
    +

    所有权(系统)是 Rust 最为与众不同的特性,对语言的其他部分有着深刻含义。它让 Rust 无需垃圾回收(garbage collector)即可保障内存安全,因此理解 Rust 中所有权如何工作是十分重要的。本章,我们将讲到所有权以及相关功能:借用(borrowing)、slice 以及 Rust 如何在内存中布局数据。

    +

    什么是所有权?

    +
    +

    ch04-01-what-is-ownership.md +
    +commit 3d51f70c78162faaebcab0da0de2ddd333e7a8ed

    +
    +

    所有权ownership)是 Rust 用于如何管理内存的一组规则。所有程序都必须管理其运行时使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时有规律地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则,程序都不能编译。在运行时,所有权系统的任何功能都不会减慢程序。

    +

    因为所有权对很多程序员来说都是一个新概念,需要一些时间来适应。好消息是随着你对 Rust 和所有权系统的规则越来越有经验,你就越能自然地编写出安全和高效的代码。持之以恒!

    +

    当你理解了所有权,你将有一个坚实的基础来理解那些使 Rust 独特的功能。在本章中,你将通过完成一些示例来学习所有权,这些示例基于一个常用的数据结构:字符串。

    +
    +

    栈(Stack)与堆(Heap)

    +

    在很多语言中,你并不需要经常考虑到栈与堆。不过在像 Rust 这样的系统编程语言中,值是位于栈上还是堆上在更大程度上影响了语言的行为以及为何必须做出这样的抉择。我们会在本章的稍后部分描述所有权与栈和堆相关的内容,所以这里只是一个用来预热的简要解释。

    +

    栈和堆都是代码在运行时可供使用的内存,但是它们的结构不同。栈以放入值的顺序存储值并以相反顺序取出值。这也被称作 后进先出last in, first out)。想象一下一叠盘子:当增加更多盘子时,把它们放在盘子堆的顶部,当需要盘子时,也从顶部拿走。不能从中间也不能从底部增加或拿走盘子!增加数据叫做 进栈pushing onto the stack),而移出数据叫做 出栈popping off the stack)。栈中的所有数据都必须占用已知且固定的大小。在编译时大小未知或大小可能变化的数据,要改为存储在堆上。 +堆是缺乏组织的:当向堆放入数据时,你要请求一定大小的空间。内存分配器(memory allocator)在堆的某处找到一块足够大的空位,把它标记为已使用,并返回一个表示该位置地址的 指针pointer)。这个过程称作 在堆上分配内存allocating on the heap),有时简称为 “分配”(allocating)。(将数据推入栈中并不被认为是分配)。因为指向放入堆中数据的指针是已知的并且大小是固定的,你可以将该指针存储在栈上,不过当需要实际数据时,必须访问指针。想象一下去餐馆就座吃饭。当进入时,你说明有几个人,餐馆员工会找到一个够大的空桌子并领你们过去。如果有人来迟了,他们也可以通过询问来找到你们坐在哪。

    +

    入栈比在堆上分配内存要快,因为(入栈时)分配器无需为存储新数据去搜索内存空间;其位置总是在栈顶。相比之下,在堆上分配内存则需要更多的工作,这是因为分配器必须首先找到一块足够存放数据的内存空间,并接着做一些记录为下一次分配做准备。

    +

    访问堆上的数据比访问栈上的数据慢,因为必须通过指针来访问。现代处理器在内存中跳转越少就越快(缓存)。继续类比,假设有一个服务员在餐厅里处理多个桌子的点菜。在一个桌子报完所有菜后再移动到下一个桌子是最有效率的。从桌子 A 听一个菜,接着桌子 B 听一个菜,然后再桌子 A,然后再桌子 B 这样的流程会更加缓慢。出于同样原因,处理器在处理的数据彼此较近的时候(比如在栈上)比较远的时候(比如可能在堆上)能更好的工作。

    +

    当你的代码调用一个函数时,传递给函数的值(包括可能指向堆上数据的指针)和函数的局部变量被压入栈中。当函数结束时,这些值被移出栈。

    +

    跟踪哪部分代码正在使用堆上的哪些数据,最大限度的减少堆上的重复数据的数量,以及清理堆上不再使用的数据确保不会耗尽空间,这些问题正是所有权系统要处理的。一旦理解了所有权,你就不需要经常考虑栈和堆了,不过明白了所有权的主要目的就是管理堆数据,能够帮助解释为什么所有权要以这种方式工作。

    +
    +

    所有权规则

    +

    首先,让我们看一下所有权的规则。当我们通过举例说明时,请谨记这些规则:

    +
    +
      +
    1. Rust 中的每一个值都有一个 所有者owner)。
    2. +
    3. 值在任一时刻有且只有一个所有者。
    4. +
    5. 当所有者(变量)离开作用域,这个值将被丢弃。
    6. +
    +
    +

    变量作用域

    +

    既然我们已经掌握了基本语法,将不会在之后的例子中包含 fn main() { 代码,所以如果你是一路跟过来的,必须手动将之后例子的代码放入一个 main 函数中。这样,例子将显得更加简明,使我们可以关注实际细节而不是样板代码。

    +

    在所有权的第一个例子中,我们看看一些变量的 作用域scope)。作用域是一个项(item)在程序中有效的范围。假设有这样一个变量:

    +
    #![allow(unused)]
    +fn main() {
    +let s = "hello";
    +}
    +

    变量 s 绑定到了一个字符串字面值,这个字符串值是硬编码进程序代码中的。这个变量从声明的点开始直到当前 作用域 结束时都是有效的。示例 4-1 中的注释标明了变量 s 在何处是有效的。

    +
    fn main() {
    +    {                      // s 在这里无效,它尚未声明
    +        let s = "hello";   // 从此处起,s 是有效的
    +
    +        // 使用 s
    +    }                      // 此作用域已结束,s 不再有效
    +}
    +

    示例 4-1:一个变量和其有效的作用域

    +

    换句话说,这里有两个重要的时间点:

    +
      +
    • s 进入作用域 时,它就是有效的。
    • +
    • 这一直持续到它 离开作用域 为止。
    • +
    +

    目前为止,变量是否有效与作用域的关系跟其他编程语言是类似的。现在我们在此基础上介绍 String 类型。

    +

    String 类型

    +

    为了演示所有权的规则,我们需要一个比第三章 “数据类型” 中讲到的都要复杂的数据类型。前面介绍的类型都是已知大小的,可以存储在栈中,并且当离开作用域时被移出栈,如果代码的另一部分需要在不同的作用域中使用相同的值,可以快速简单地复制它们来创建一个新的独立实例。不过我们需要寻找一个存储在堆上的数据来探索 Rust 是如何知道该在何时清理数据的。

    +

    我们会专注于 String 与所有权相关的部分。这些方面也同样适用于标准库提供的或你自己创建的其他复杂数据类型。在第八章会更深入地讲解 String

    +

    我们已经见过字符串字面值,即被硬编码进程序里的字符串值。字符串字面值是很方便的,不过它们并不适合使用文本的每一种场景。原因之一就是它们是不可变的。另一个原因是并非所有字符串的值都能在编写代码时就知道:例如,要是想获取用户输入并存储该怎么办呢?为此,Rust 有另一种字符串类型,String。这个类型管理被分配到堆上的数据,所以能够存储在编译时未知大小的文本。可以使用 from 函数基于字符串字面值来创建 String,如下:

    +
    #![allow(unused)]
    +fn main() {
    +let s = String::from("hello");
    +}
    +

    这两个冒号 :: 是运算符,允许将特定的 from 函数置于 String 类型的命名空间(namespace)下,而不需要使用类似 string_from 这样的名字。在第五章的 “方法语法”(“Method Syntax”) 部分会着重讲解这个语法,而且在第七章的 “路径用于引用模块树中的项” 中会讲到模块的命名空间。

    +

    可以 修改此类字符串:

    +
    fn main() {
    +    let mut s = String::from("hello");
    +
    +    s.push_str(", world!"); // push_str() 在字符串后追加字面值
    +
    +    println!("{s}"); // 将打印 `hello, world!`
    +}
    +

    那么这里有什么区别呢?为什么 String 可变而字面值却不行呢?区别在于两个类型对内存的处理上。

    +

    内存与分配

    +

    就字符串字面值来说,我们在编译时就知道其内容,所以文本被直接硬编码进最终的可执行文件中。这使得字符串字面值快速且高效。不过这些特性都只得益于字符串字面值的不可变性。不幸的是,我们不能为了每一个在编译时大小未知的文本而将一块内存放入二进制文件中,并且它的大小还可能随着程序运行而改变。

    +

    对于 String 类型,为了支持一个可变,可增长的文本片段,需要在堆上分配一块在编译时未知大小的内存来存放内容。这意味着:

    +
      +
    • 必须在运行时向内存分配器(memory allocator)请求内存。
    • +
    • 需要一个当我们处理完 String 时将内存返回给分配器的方法。
    • +
    +

    第一部分由我们完成:当调用 String::from 时,它的实现 (implementation) 请求其所需的内存。这在编程语言中是非常通用的。

    +

    然而,第二部分实现起来就各有区别了。在有 垃圾回收garbage collectorGC)的语言中,GC 记录并清除不再使用的内存,而我们并不需要关心它。在大部分没有 GC 的语言中,识别出不再使用的内存并调用代码显式释放就是我们的责任了,跟请求内存的时候一样。从历史的角度上说正确处理内存回收曾经是一个困难的编程问题。如果忘记回收了会浪费内存。如果过早回收了,将会出现无效变量。如果重复回收,这也是个 bug。我们需要精确的为一个 allocate 配对一个 free

    +

    Rust 采取了一个不同的策略:内存在拥有它的变量离开作用域后就被自动释放。下面是示例 4-1 中作用域例子的一个使用 String 而不是字符串字面值的版本:

    +
    fn main() {
    +    {
    +        let s = String::from("hello"); // 从此处起,s 是有效的
    +
    +        // 使用 s
    +    }                                  // 此作用域已结束,
    +                                       // s 不再有效
    +}
    +

    这是一个将 String 需要的内存返回给分配器的很自然的位置:当 s 离开作用域的时候。当变量离开作用域,Rust 为我们调用一个特殊的函数。这个函数叫做 drop,在这里 String 的作者可以放置释放内存的代码。Rust 在结尾的 } 处自动调用 drop

    +
    +

    注意:在 C++ 中,这种 item 在生命周期结束时释放资源的模式有时被称作 资源获取即初始化Resource Acquisition Is Initialization (RAII))。如果你使用过 RAII 模式的话应该对 Rust 的 drop 函数并不陌生。

    +
    +

    这个模式对编写 Rust 代码的方式有着深远的影响。现在它看起来很简单,不过在更复杂的场景下代码的行为可能是不可预测的,比如当有多个变量使用在堆上分配的内存时。现在让我们探索一些这样的场景。

    +

    +

    变量与数据交互的方式(一):移动

    +

    在 Rust 中,多个变量可以采取不同的方式与同一数据进行交互。让我们看看示例 4-2 中一个使用整型的例子。

    +
    fn main() {
    +    let x = 5;
    +    let y = x;
    +}
    +

    示例 4-2:将变量 x 的整数值赋给 y

    +

    我们大致可以猜到这在干什么:“将 5 绑定到 x;接着生成一个值 x 的拷贝并绑定到 y”。现在有了两个变量,xy,都等于 5。这也正是事实上发生了的,因为整数是有已知固定大小的简单值,所以这两个 5 被放入了栈中。

    +

    现在看看这个 String 版本:

    +
    fn main() {
    +    let s1 = String::from("hello");
    +    let s2 = s1;
    +}
    +

    这看起来与上面的代码非常类似,所以我们可能会假设它们的运行方式也是类似的:也就是说,第二行可能会生成一个 s1 的拷贝并绑定到 s2 上。不过,事实上并不完全是这样。

    +

    看看图 4-1 以了解 String 的底层会发生什么。String 由三部分组成,如图左侧所示:一个指向存放字符串内容内存的指针,一个长度,和一个容量。这一组数据存储在栈上。右侧则是堆上存放内容的内存部分。

    +

    Two tables: the first table contains the representation of s1 on the
+stack, consisting of its length (5), capacity (5), and a pointer to the first
+value in the second table. The second table contains the representation of the
+string data on the heap, byte by byte.

    +

    图 4-1:将值 "hello" 绑定给 s1String 在内存中的表现形式

    +

    长度表示 String 的内容当前使用了多少字节的内存。容量是 String 从分配器总共获取了多少字节的内存。长度与容量的区别是很重要的,不过在当前上下文中并不重要,所以现在可以忽略容量。

    +

    当我们将 s1 赋值给 s2String 的数据被复制了,这意味着我们从栈上拷贝了它的指针、长度和容量。我们并没有复制指针指向的堆上数据。换句话说,内存中数据的表现如图 4-2 所示。

    +

    Three tables: tables s1 and s2 representing those strings on the
+stack, respectively, and both pointing to the same string data on the heap.

    +

    图 4-2:变量 s2 的内存表现,它有一份 s1 指针、长度和容量的拷贝

    +

    这个表现形式看起来 并不像 图 4-3 中的那样,如果 Rust 也拷贝了堆上的数据,那么内存看起来就是这样的。如果 Rust 这么做了,那么操作 s2 = s1 在堆上数据比较大的时候会对运行时性能造成非常大的影响。

    +

    Four tables: two tables representing the stack data for s1 and s2,
+and each points to its own copy of string data on the heap.

    +

    图 4-3:另一个 s2 = s1 时可能的内存表现,如果 Rust 同时也拷贝了堆上的数据的话

    +

    之前我们提到过当变量离开作用域后,Rust 自动调用 drop 函数并清理变量的堆内存。不过图 4-2 展示了两个数据指针指向了同一位置。这就有了一个问题:当 s2s1 离开作用域,它们都会尝试释放相同的内存。这是一个叫做 二次释放double free)的错误,也是之前提到过的内存安全性 bug 之一。两次释放(相同)内存会导致内存污染,它可能会导致潜在的安全漏洞。

    +

    为了确保内存安全,在 let s2 = s1; 之后,Rust 认为 s1 不再有效,因此 Rust 不需要在 s1 离开作用域后清理任何东西。看看在 s2 被创建之后尝试使用 s1 会发生什么;这段代码不能运行:

    +
    fn main() {
    +    let s1 = String::from("hello");
    +    let s2 = s1;
    +
    +    println!("{s1}, world!");
    +}
    +

    你会得到一个类似如下的错误,因为 Rust 禁止你使用无效的引用。

    +
    $ cargo run
    +   Compiling ownership v0.1.0 (file:///projects/ownership)
    +error[E0382]: borrow of moved value: `s1`
    + --> src/main.rs:5:15
    +  |
    +2 |     let s1 = String::from("hello");
    +  |         -- move occurs because `s1` has type `String`, which does not implement the `Copy` trait
    +3 |     let s2 = s1;
    +  |              -- value moved here
    +4 |
    +5 |     println!("{s1}, world!");
    +  |               ^^^^ value borrowed here after move
    +  |
    +  = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
    +help: consider cloning the value if the performance cost is acceptable
    +  |
    +3 |     let s2 = s1.clone();
    +  |                ++++++++
    +
    +For more information about this error, try `rustc --explain E0382`.
    +error: could not compile `ownership` (bin "ownership") due to 1 previous error
    +
    +

    如果你在其他语言中听说过术语 浅拷贝shallow copy)和 深拷贝deep copy),那么拷贝指针、长度和容量而不拷贝数据可能听起来像浅拷贝。不过因为 Rust 同时使第一个变量无效了,这个操作被称为 移动move),而不是叫做浅拷贝。上面的例子可以解读为 s1移动 到了 s2 中。那么具体发生了什么,如图 4-4 所示。

    +

    Three tables: tables s1 and s2 representing those strings on the
+stack, respectively, and both pointing to the same string data on the heap.
+Table s1 is grayed out be-cause s1 is no longer valid; only s2 can be used to
+access the heap data.

    +

    图 4-4:s1 无效之后的内存表现

    +

    这样就解决了我们的问题!因为只有 s2 是有效的,当其离开作用域,它就释放自己的内存,完毕。

    +

    另外,这里还隐含了一个设计选择:Rust 永远也不会自动创建数据的 “深拷贝”。因此,任何 自动 的复制都可以被认为是对运行时性能影响较小的。

    +

    +

    变量与数据交互的方式(二):克隆

    +

    如果我们 确实 需要深度复制 String 中堆上的数据,而不仅仅是栈上的数据,可以使用一个叫做 clone 的通用函数。第五章会讨论方法语法,不过因为方法在很多语言中是一个常见功能,所以之前你可能已经见过了。

    +

    这是一个实际使用 clone 方法的例子:

    +
    fn main() {
    +    let s1 = String::from("hello");
    +    let s2 = s1.clone();
    +
    +    println!("s1 = {s1}, s2 = {s2}");
    +}
    +

    这段代码能正常运行,并且明确产生图 4-3 中行为,这里堆上的数据 确实 被复制了。

    +

    当出现 clone 调用时,你知道一些特定的代码被执行而且这些代码可能相当消耗资源。你很容易察觉到一些不寻常的事情正在发生。

    +

    只在栈上的数据:拷贝

    +

    这里还有一个没有提到的小窍门。这些代码使用了整型并且是有效的,它们是示例 4-2 中的一部分:

    +
    fn main() {
    +    let x = 5;
    +    let y = x;
    +
    +    println!("x = {x}, y = {y}");
    +}
    +

    但这段代码似乎与我们刚刚学到的内容相矛盾:没有调用 clone,不过 x 依然有效且没有被移动到 y 中。

    +

    原因是像整型这样的在编译时已知大小的类型被整个存储在栈上,所以拷贝其实际的值是快速的。这意味着没有理由在创建变量 y 后使 x 无效。换句话说,这里没有深浅拷贝的区别,所以这里调用 clone 并不会与通常的浅拷贝有什么不同,我们可以不用管它。

    +

    Rust 有一个叫做 Copy trait 的特殊注解,可以用在类似整型这样的存储在栈上的类型上(第十章将会详细讲解 trait)。如果一个类型实现了 Copy trait,那么一个旧的变量在将其赋值给其他变量后仍然可用。

    +

    Rust 不允许自身或其任何部分实现了 Drop trait 的类型使用 Copy trait。如果我们对其值离开作用域时需要特殊处理的类型使用 Copy 注解,将会出现一个编译时错误。要学习如何为你的类型添加 Copy 注解以实现该 trait,请阅读附录 C 中的 “可派生的 trait”

    +

    那么哪些类型实现了 Copy trait 呢?你可以查看给定类型的文档来确认,不过作为一个通用的规则,任何一组简单标量值的组合都可以实现 Copy,任何不需要分配内存或某种形式资源的类型都可以实现 Copy 。如下是一些 Copy 的类型:

    +
      +
    • 所有整数类型,比如 u32
    • +
    • 布尔类型,bool,它的值是 truefalse
    • +
    • 所有浮点数类型,比如 f64
    • +
    • 字符类型,char
    • +
    • 元组,当且仅当其包含的类型也都实现 Copy 的时候。比如,(i32, i32) 实现了 Copy,但 (i32, String) 就没有。
    • +
    +

    所有权与函数

    +

    将值传递给函数与给变量赋值的原理相似。向函数传递值可能会移动或者复制,就像赋值语句一样。示例 4-3 使用注释展示变量何时进入和离开作用域:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let s = String::from("hello");  // s 进入作用域
    +
    +    takes_ownership(s);             // s 的值移动到函数里 ...
    +                                    // ... 所以到这里不再有效
    +
    +    let x = 5;                      // x 进入作用域
    +
    +    makes_copy(x);                  // x 应该移动函数里,
    +                                    // 但 i32 是 Copy 的,
    +                                    // 所以在后面可继续使用 x
    +
    +} // 这里,x 先移出了作用域,然后是 s。但因为 s 的值已被移走,
    +  // 没有特殊之处
    +
    +fn takes_ownership(some_string: String) { // some_string 进入作用域
    +    println!("{some_string}");
    +} // 这里,some_string 移出作用域并调用 `drop` 方法。
    +  // 占用的内存被释放
    +
    +fn makes_copy(some_integer: i32) { // some_integer 进入作用域
    +    println!("{some_integer}");
    +} // 这里,some_integer 移出作用域。没有特殊之处
    +

    示例 4-3:带有所有权和作用域注释的函数

    +

    当尝试在调用 takes_ownership 后使用 s 时,Rust 会抛出一个编译时错误。这些静态检查使我们免于犯错。试试在 main 函数中添加使用 sx 的代码来看看哪里能使用它们,以及所有权规则会在哪里阻止我们这么做。

    +

    返回值与作用域

    +

    返回值也可以转移所有权。示例 4-4 展示了一个返回了某些值的示例,与示例 4-3 一样带有类似的注释。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let s1 = gives_ownership();         // gives_ownership 将返回值
    +                                        // 转移给 s1
    +
    +    let s2 = String::from("hello");     // s2 进入作用域
    +
    +    let s3 = takes_and_gives_back(s2);  // s2 被移动到
    +                                        // takes_and_gives_back 中,
    +                                        // 它也将返回值移给 s3
    +} // 这里,s3 移出作用域并被丢弃。s2 也移出作用域,但已被移走,
    +  // 所以什么也不会发生。s1 离开作用域并被丢弃
    +
    +fn gives_ownership() -> String {             // gives_ownership 会将
    +                                             // 返回值移动给
    +                                             // 调用它的函数
    +
    +    let some_string = String::from("yours"); // some_string 进入作用域。
    +
    +    some_string                              // 返回 some_string 
    +                                             // 并移出给调用的函数
    +                                             // 
    +}
    +
    +// takes_and_gives_back 将传入字符串并返回该值
    +fn takes_and_gives_back(a_string: String) -> String { // a_string 进入作用域
    +                                                      // 
    +
    +    a_string  // 返回 a_string 并移出给调用的函数
    +}
    +

    示例 4-4: 转移返回值的所有权

    +

    变量的所有权总是遵循相同的模式:将值赋给另一个变量时移动它。当持有堆中数据值的变量离开作用域时,其值将通过 drop 被清理掉,除非数据被移动为另一个变量所有。

    +

    虽然这样是可以的,但是在每一个函数中都获取所有权并接着返回所有权有些啰嗦。如果我们想要函数使用一个值但不获取所有权该怎么办呢?如果我们还要接着使用它的话,每次都传进去再返回来就有点烦人了,除此之外,我们也可能想返回函数体中产生的一些数据。

    +

    我们可以使用元组来返回多个值,如示例 4-5 所示。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let s1 = String::from("hello");
    +
    +    let (s2, len) = calculate_length(s1);
    +
    +    println!("The length of '{s2}' is {len}.");
    +}
    +
    +fn calculate_length(s: String) -> (String, usize) {
    +    let length = s.len(); // len() 返回字符串的长度
    +
    +    (s, length)
    +}
    +

    示例 4-5: 返回参数的所有权

    +

    但是这未免有些形式主义,而且这种场景应该很常见。幸运的是,Rust 对此提供了一个不用获取所有权就可以使用值的功能,叫做 引用references)。

    +

    引用与借用

    +
    +

    ch04-02-references-and-borrowing.md +
    +commit 3d51f70c78162faaebcab0da0de2ddd333e7a8ed

    +
    +

    示例 4-5 中的元组代码有这样一个问题:我们必须将 String 返回给调用函数,以便在调用 calculate_length 后仍能使用 String,因为 String 被移动到了 calculate_length 内。相反我们可以提供一个 String 值的引用(reference)。引用reference)像一个指针,因为它是一个地址,我们可以由此访问储存于该地址的属于其他变量的数据。 +与指针不同,引用确保指向某个特定类型的有效值。

    +

    下面是如何定义并使用一个(新的)calculate_length 函数,它以一个对象的引用作为参数而不是获取值的所有权:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let s1 = String::from("hello");
    +
    +    let len = calculate_length(&s1);
    +
    +    println!("The length of '{s1}' is {len}.");
    +}
    +
    +fn calculate_length(s: &String) -> usize {
    +    s.len()
    +}
    +

    首先,注意变量声明和函数返回值中的所有元组代码都消失了。其次,注意我们传递 &s1calculate_length,同时在函数定义中,我们获取 &String 而不是 String。这些 & 符号就是 引用,它们允许你使用值但不获取其所有权。图 4-6 展示了一张示意图。

    +

    Three tables: the table for s contains only a pointer to the table
+for s1. The table for s1 contains the stack data for s1 and points to the
+string data on the heap.

    +

    图 4-6:&String s 指向 String s1 示意图

    +
    +

    注意:与使用 & 引用相反的操作是 解引用dereferencing),它使用解引用运算符,*。我们将会在第八章遇到一些解引用运算符,并在第十五章详细讨论解引用。

    +
    +

    仔细看看这个函数调用:

    +
    fn main() {
    +    let s1 = String::from("hello");
    +
    +    let len = calculate_length(&s1);
    +
    +    println!("The length of '{s1}' is {len}.");
    +}
    +
    +fn calculate_length(s: &String) -> usize {
    +    s.len()
    +}
    +

    &s1 语法让我们创建一个 指向s1 的引用,但是并不拥有它。因为并不拥有这个值,所以当引用停止使用时,它所指向的值也不会被丢弃。

    +

    同理,函数签名使用 & 来表明参数 s 的类型是一个引用。让我们增加一些解释性的注释:

    +
    fn main() {
    +    let s1 = String::from("hello");
    +
    +    let len = calculate_length(&s1);
    +
    +    println!("The length of '{s1}' is {len}.");
    +}
    +
    +fn calculate_length(s: &String) -> usize { // s 是 String 的引用
    +    s.len()
    +} // 这里,s 离开了作用域。但因为它并不拥有引用值的所有权,
    +  // 所以什么也不会发生
    +

    变量 s 有效的作用域与函数参数的作用域一样,不过当 s 停止使用时并不丢弃引用指向的数据,因为 s 并没有所有权。当函数使用引用而不是实际值作为参数,无需返回值来交还所有权,因为就不曾拥有所有权。

    +

    我们将创建一个引用的行为称为 借用borrowing)。正如现实生活中,如果一个人拥有某样东西,你可以从他那里借来。当你使用完毕,必须还回去。我们并不拥有它。

    +

    如果我们尝试修改借用的变量呢?尝试示例 4-6 中的代码。剧透:这行不通!

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let s = String::from("hello");
    +
    +    change(&s);
    +}
    +
    +fn change(some_string: &String) {
    +    some_string.push_str(", world");
    +}
    +

    示例 4-6:尝试修改借用的值

    +

    这里是错误:

    +
    $ cargo run
    +   Compiling ownership v0.1.0 (file:///projects/ownership)
    +error[E0596]: cannot borrow `*some_string` as mutable, as it is behind a `&` reference
    + --> src/main.rs:8:5
    +  |
    +8 |     some_string.push_str(", world");
    +  |     ^^^^^^^^^^^ `some_string` is a `&` reference, so the data it refers to cannot be borrowed as mutable
    +  |
    +help: consider changing this to be a mutable reference
    +  |
    +7 | fn change(some_string: &mut String) {
    +  |                         +++
    +
    +For more information about this error, try `rustc --explain E0596`.
    +error: could not compile `ownership` (bin "ownership") due to 1 previous error
    +
    +

    正如变量默认是不可变的,引用也一样。(默认)不允许修改引用的值。

    +

    可变引用

    +

    我们通过一个小调整就能修复示例 4-6 代码中的错误,允许我们修改一个借用的值,这就是 可变引用mutable reference):

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let mut s = String::from("hello");
    +
    +    change(&mut s);
    +}
    +
    +fn change(some_string: &mut String) {
    +    some_string.push_str(", world");
    +}
    +

    首先,我们必须将 s 改为 mut。然后在调用 change 函数的地方创建一个可变引用 &mut s,并更新函数签名以接受一个可变引用 some_string: &mut String。这就非常清楚地表明,change 函数将改变它所借用的值。

    +

    可变引用有一个很大的限制:如果你有一个对该变量的可变引用,你就不能再创建对该变量的引用。这些尝试创建两个 s 的可变引用的代码会失败:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let mut s = String::from("hello");
    +
    +    let r1 = &mut s;
    +    let r2 = &mut s;
    +
    +    println!("{}, {}", r1, r2);
    +}
    +

    错误如下:

    +
    $ cargo run
    +   Compiling ownership v0.1.0 (file:///projects/ownership)
    +error[E0499]: cannot borrow `s` as mutable more than once at a time
    + --> src/main.rs:5:14
    +  |
    +4 |     let r1 = &mut s;
    +  |              ------ first mutable borrow occurs here
    +5 |     let r2 = &mut s;
    +  |              ^^^^^^ second mutable borrow occurs here
    +6 |
    +7 |     println!("{}, {}", r1, r2);
    +  |                        -- first borrow later used here
    +
    +For more information about this error, try `rustc --explain E0499`.
    +error: could not compile `ownership` (bin "ownership") due to 1 previous error
    +
    +

    这个报错说这段代码是无效的,因为我们不能在同一时间多次将 s 作为可变变量借用。第一个可变的借入在 r1 中,并且必须持续到在 println! 中使用它,但是在那个可变引用的创建和它的使用之间,我们又尝试在 r2 中创建另一个可变引用,该引用借用与 r1 相同的数据。

    +

    这一限制以一种非常小心谨慎的方式允许可变性,防止同一时间对同一数据存在多个可变引用。新 Rustacean 们经常难以适应这一点,因为大部分语言中变量任何时候都是可变的。这个限制的好处是 Rust 可以在编译时就避免数据竞争。数据竞争data race)类似于竞态条件,它可由这三个行为造成:

    +
      +
    • 两个或更多指针同时访问同一数据。
    • +
    • 至少有一个指针被用来写入数据。
    • +
    • 没有同步数据访问的机制。
    • +
    +

    数据竞争会导致未定义行为,难以在运行时追踪,并且难以诊断和修复;Rust 避免了这种情况的发生,因为它甚至不会编译存在数据竞争的代码!

    +

    一如既往,可以使用大括号来创建一个新的作用域,以允许拥有多个可变引用,只是不能 同时 拥有:

    +
    fn main() {
    +    let mut s = String::from("hello");
    +
    +    {
    +        let r1 = &mut s;
    +    } // r1 在这里离开了作用域,所以我们完全可以创建一个新的引用
    +
    +    let r2 = &mut s;
    +}
    +

    Rust 在同时使用可变与不可变引用时也采用的类似的规则。这些代码会导致一个错误:

    +
    fn main() {
    +    let mut s = String::from("hello");
    +
    +    let r1 = &s; // 没问题
    +    let r2 = &s; // 没问题
    +    let r3 = &mut s; // 大问题
    +
    +    println!("{}, {}, and {}", r1, r2, r3);
    +}
    +

    错误如下:

    +
    $ cargo run
    +   Compiling ownership v0.1.0 (file:///projects/ownership)
    +error[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable
    + --> src/main.rs:6:14
    +  |
    +4 |     let r1 = &s; // no problem
    +  |              -- immutable borrow occurs here
    +5 |     let r2 = &s; // no problem
    +6 |     let r3 = &mut s; // BIG PROBLEM
    +  |              ^^^^^^ mutable borrow occurs here
    +7 |
    +8 |     println!("{}, {}, and {}", r1, r2, r3);
    +  |                                -- immutable borrow later used here
    +
    +For more information about this error, try `rustc --explain E0502`.
    +error: could not compile `ownership` (bin "ownership") due to 1 previous error
    +
    +

    哇哦!我们 不能在拥有不可变引用的同时拥有可变引用。

    +

    不可变引用的用户可不希望在他们的眼皮底下值就被意外的改变了!然而,多个不可变引用是可以的,因为没有哪个只能读取数据的人有能力影响其他人读取到的数据。

    +

    注意一个引用的作用域从声明的地方开始一直持续到最后一次使用为止。例如,因为最后一次使用不可变引用(println!),发生在声明可变引用之前,所以如下代码是可以编译的:

    +
    fn main() {
    +    let mut s = String::from("hello");
    +
    +    let r1 = &s; // 没问题
    +    let r2 = &s; // 没问题
    +    println!("{r1} and {r2}");
    +    // 此位置之后 r1 和 r2 不再使用
    +
    +    let r3 = &mut s; // 没问题
    +    println!("{r3}");
    +}
    +

    不可变引用 r1r2 的作用域在 println! 最后一次使用之后结束,这也是创建可变引用 r3 的地方。它们的作用域没有重叠,所以代码是可以编译的。编译器可以在作用域结束之前判断不再使用的引用。

    +

    尽管这些错误有时使人沮丧,但请牢记这是 Rust 编译器在提前指出一个潜在的 bug(在编译时而不是在运行时)并精准显示问题所在。这样你就不必去跟踪为何数据并不是你想象中的那样。

    +

    悬垂引用(Dangling References)

    +

    在具有指针的语言中,很容易通过释放内存时保留指向它的指针而错误地生成一个 悬垂指针dangling pointer),所谓悬垂指针是其指向的内存可能已经被分配给其它持有者。相比之下,在 Rust 中编译器确保引用永远也不会变成悬垂状态:当你拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域。

    +

    让我们尝试创建一个悬垂引用,Rust 会通过一个编译时错误来避免:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let reference_to_nothing = dangle();
    +}
    +
    +fn dangle() -> &String {
    +    let s = String::from("hello");
    +
    +    &s
    +}
    +

    这里是错误:

    +
    $ cargo run
    +   Compiling ownership v0.1.0 (file:///projects/ownership)
    +error[E0106]: missing lifetime specifier
    + --> src/main.rs:5:16
    +  |
    +5 | fn dangle() -> &String {
    +  |                ^ expected named lifetime parameter
    +  |
    +  = help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
    +help: consider using the `'static` lifetime, but this is uncommon unless you're returning a borrowed value from a `const` or a `static`
    +  |
    +5 | fn dangle() -> &'static String {
    +  |                 +++++++
    +help: instead, you are more likely to want to return an owned value
    +  |
    +5 - fn dangle() -> &String {
    +5 + fn dangle() -> String {
    +  |
    +
    +error[E0515]: cannot return reference to local variable `s`
    + --> src/main.rs:8:5
    +  |
    +8 |     &s
    +  |     ^^ returns a reference to data owned by the current function
    +
    +Some errors have detailed explanations: E0106, E0515.
    +For more information about an error, try `rustc --explain E0106`.
    +error: could not compile `ownership` (bin "ownership") due to 2 previous errors
    +
    +

    错误信息引用了一个我们还未介绍的功能:生命周期(lifetimes)。第十章会详细介绍生命周期。不过,如果你不理会生命周期部分,错误信息中确实包含了为什么这段代码有问题的关键信息:

    +
    this function's return type contains a borrowed value, but there is no value
    +for it to be borrowed from
    +
    +

    让我们仔细看看我们的 dangle 代码的每一步到底发生了什么:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let reference_to_nothing = dangle();
    +}
    +
    +fn dangle() -> &String { // dangle 返回一个字符串的引用
    +
    +    let s = String::from("hello"); // s 是一个新字符串
    +
    +    &s // 返回字符串 s 的引用
    +} // 这里 s 离开作用域并被丢弃。其内存被释放。
    +  // 危险!
    +

    因为 s 是在 dangle 函数内创建的,当 dangle 的代码执行完毕后,s 将被释放。不过我们尝试返回它的引用。这意味着这个引用会指向一个无效的 String,这可不对!Rust 不会允许我们这么做。

    +

    这里的解决方法是直接返回 String

    +
    fn main() {
    +    let string = no_dangle();
    +}
    +
    +fn no_dangle() -> String {
    +    let s = String::from("hello");
    +
    +    s
    +}
    +

    这样就没有任何错误了。所有权被移动出去,所以没有值被释放。

    +

    引用的规则

    +

    让我们概括一下之前对引用的讨论:

    +
      +
    • 在任意给定时间,要么 只能有一个可变引用,要么 只能有多个不可变引用。
    • +
    • 引用必须总是有效的。
    • +
    +

    接下来,我们来看看另一种不同类型的引用:slice。

    +

    Slice 类型

    +
    +

    ch04-03-slices.md +
    +commit 3d51f70c78162faaebcab0da0de2ddd333e7a8ed

    +
    +

    slice 允许你引用集合中一段连续的元素序列,而不用引用整个集合。slice 是一种引用,所以它没有所有权。

    +

    这里有一个编程小习题:编写一个函数,该函数接收一个用空格分隔单词的字符串,并返回在该字符串中找到的第一个单词。如果函数在该字符串中并未找到空格,则整个字符串就是一个单词,所以应该返回整个字符串。

    +

    让我们推敲下如何不用 slice 编写这个函数的签名,来理解 slice 能解决的问题:

    +
    fn first_word(s: &String) -> ?
    +

    first_word 函数有一个参数 &String。因为我们不需要所有权,所以这没有问题。不过应该返回什么呢?我们并没有一个真正获取 部分 字符串的办法。不过,我们可以返回单词结尾的索引,结尾由一个空格表示。试试如示例 4-7 中的代码。

    +

    文件名:src/main.rs

    +
    fn first_word(s: &String) -> usize {
    +    let bytes = s.as_bytes();
    +
    +    for (i, &item) in bytes.iter().enumerate() {
    +        if item == b' ' {
    +            return i;
    +        }
    +    }
    +
    +    s.len()
    +}
    +
    +fn main() {}
    +

    示例 4-7:first_word 函数返回 String 参数的一个字节索引值

    +

    因为需要逐个元素的检查 String 中的值是否为空格,需要用 as_bytes 方法将 String 转化为字节数组。

    +
    fn first_word(s: &String) -> usize {
    +    let bytes = s.as_bytes();
    +
    +    for (i, &item) in bytes.iter().enumerate() {
    +        if item == b' ' {
    +            return i;
    +        }
    +    }
    +
    +    s.len()
    +}
    +
    +fn main() {}
    +

    接下来,使用 iter 方法在字节数组上创建一个迭代器:

    +
    fn first_word(s: &String) -> usize {
    +    let bytes = s.as_bytes();
    +
    +    for (i, &item) in bytes.iter().enumerate() {
    +        if item == b' ' {
    +            return i;
    +        }
    +    }
    +
    +    s.len()
    +}
    +
    +fn main() {}
    +

    我们将在第十三章详细讨论迭代器。现在,只需知道 iter 方法返回集合中的每一个元素,而 enumerate 包装了 iter 的结果,将这些元素作为元组的一部分来返回。enumerate 返回的元组中,第一个元素是索引,第二个元素是集合中元素的引用。这比我们自己计算索引要方便一些。

    +

    因为 enumerate 方法返回一个元组,我们可以使用模式来解构,我们将在第六章中进一步讨论有关模式的问题。所以在 for 循环中,我们指定了一个模式,其中元组中的 i 是索引而元组中的 &item 是单个字节。因为我们从 .iter().enumerate() 中获取了集合元素的引用,所以模式中使用了 &

    +

    for 循环中,我们通过字节的字面值语法来寻找代表空格的字节。如果找到了一个空格,返回它的位置。否则,使用 s.len() 返回字符串的长度:

    +
    fn first_word(s: &String) -> usize {
    +    let bytes = s.as_bytes();
    +
    +    for (i, &item) in bytes.iter().enumerate() {
    +        if item == b' ' {
    +            return i;
    +        }
    +    }
    +
    +    s.len()
    +}
    +
    +fn main() {}
    +

    现在有了一个找到字符串中第一个单词结尾索引的方法,不过这有一个问题。我们返回了一个独立的 usize,不过它只在 &String 的上下文中才是一个有意义的数字。换句话说,因为它是一个与 String 相分离的值,无法保证将来它仍然有效。考虑一下示例 4-8 中使用了示例 4-7 中 first_word 函数的程序。

    +

    文件名:src/main.rs

    +
    fn first_word(s: &String) -> usize {
    +    let bytes = s.as_bytes();
    +
    +    for (i, &item) in bytes.iter().enumerate() {
    +        if item == b' ' {
    +            return i;
    +        }
    +    }
    +
    +    s.len()
    +}
    +
    +fn main() {
    +    let mut s = String::from("hello world");
    +
    +    let word = first_word(&s); // word 的值为 5
    +
    +    s.clear(); // 这清空了字符串,使其等于 ""
    +
    +    // word 在此处的值仍然是 5,
    +    // 但是没有更多的字符串让我们可以有效地应用数值 5。word 的值现在完全无效!
    +}
    +

    示例 4-8:存储 first_word 函数调用的返回值并接着改变 String 的内容

    +

    这个程序编译时没有任何错误,而且在调用 s.clear() 之后使用 word 也不会出错。因为 words 状态完全没有联系,所以 word 仍然包含值 5。可以尝试用值 5 来提取变量 s 的第一个单词,不过这是有 bug 的,因为在我们将 5 保存到 word 之后 s 的内容已经改变。

    +

    我们不得不时刻担心 word 的索引与 s 中的数据不再同步,这很啰嗦且易出错!如果编写这么一个 second_word 函数的话,管理索引这件事将更加容易出问题。它的签名看起来像这样:

    +
    fn second_word(s: &String) -> (usize, usize) {
    +

    现在我们要跟踪一个开始索引 一个结尾索引,同时有了更多从数据的某个特定状态计算而来的值,但都完全没有与这个状态相关联。现在有三个飘忽不定的不相关变量需要保持同步。

    +

    幸运的是,Rust 为这个问题提供了一个解决方法:字符串 slice。

    +

    字符串 slice

    +

    字符串 slicestring slice)是 String 中一部分值的引用,它看起来像这样:

    +
    fn main() {
    +    let s = String::from("hello world");
    +
    +    let hello = &s[0..5];
    +    let world = &s[6..11];
    +}
    +

    不同于整个 String 的引用,hello 是一个部分 String 的引用,由一个额外的 [0..5] 部分指定。可以使用一个由中括号中的 [starting_index..ending_index] 指定的 range 创建一个 slice,其中 starting_index 是 slice 的第一个位置,ending_index 则是 slice 最后一个位置的后一个值。在其内部,slice 的数据结构存储了 slice 的开始位置和长度,长度对应于 ending_index 减去 starting_index 的值。所以对于 let world = &s[6..11]; 的情况,world 将是一个包含指向 s 索引 6 的指针和长度值 5 的 slice。

    +

    图 4-7 展示了一个图例。

    +

    Three tables: a table representing the stack data of s, which points
+to the byte at index 0 in a table of the string data "hello world" on
+the heap. The third table rep-resents the stack data of the slice world, which
+has a length value of 5 and points to byte 6 of the heap data table.

    +

    图 4-7:引用了部分 String 的字符串 slice

    +

    对于 Rust 的 .. range 语法,如果想要从索引 0 开始,可以不写两个点号之前的值。换句话说,如下两个语句是相同的:

    +
    #![allow(unused)]
    +fn main() {
    +let s = String::from("hello");
    +
    +let slice = &s[0..2];
    +let slice = &s[..2];
    +}
    +

    依此类推,如果 slice 包含 String 的最后一个字节,也可以舍弃尾部的数字。这意味着如下也是相同的:

    +
    #![allow(unused)]
    +fn main() {
    +let s = String::from("hello");
    +
    +let len = s.len();
    +
    +let slice = &s[3..len];
    +let slice = &s[3..];
    +}
    +

    也可以同时舍弃这两个值来获取整个字符串的 slice。所以如下亦是相同的:

    +
    #![allow(unused)]
    +fn main() {
    +let s = String::from("hello");
    +
    +let len = s.len();
    +
    +let slice = &s[0..len];
    +let slice = &s[..];
    +}
    +
    +

    注意:字符串 slice range 的索引必须位于有效的 UTF-8 字符边界内,如果尝试从一个多字节字符的中间位置创建字符串 slice,则程序将会因错误而退出。出于介绍字符串 slice 的目的,本部分假设只使用 ASCII 字符集;第八章的 “使用字符串储存 UTF-8 编码的文本” 部分会更加全面的讨论 UTF-8 处理问题。

    +
    +

    在记住所有这些知识后,让我们重写 first_word 来返回一个 slice。“字符串 slice” 的类型声明写作 &str

    +

    文件名:src/main.rs

    +
    fn first_word(s: &String) -> &str {
    +    let bytes = s.as_bytes();
    +
    +    for (i, &item) in bytes.iter().enumerate() {
    +        if item == b' ' {
    +            return &s[0..i];
    +        }
    +    }
    +
    +    &s[..]
    +}
    +
    +fn main() {}
    +

    我们使用跟示例 4-7 相同的方式获取单词结尾的索引,通过寻找第一个出现的空格。当找到一个空格,我们返回一个字符串 slice,它使用字符串的开始和空格的索引作为开始和结束的索引。

    +

    现在当调用 first_word 时,会返回与底层数据关联的单个值。这个值由一个 slice 开始位置的引用和 slice 中元素的数量组成。

    +

    second_word 函数也可以改为返回一个 slice:

    +
    fn second_word(s: &String) -> &str {
    +

    现在我们有了一个不易混淆且直观的 API 了,因为编译器会确保指向 String 的引用持续有效。还记得示例 4-8 程序中,那个当我们获取第一个单词结尾的索引后,接着就清除了字符串导致索引就无效的 bug 吗?那些代码在逻辑上是不正确的,但却没有显示任何直接的错误。问题会在之后尝试对空字符串使用第一个单词的索引时出现。slice 就不可能出现这种 bug 并让我们更早的知道出问题了。使用 slice 版本的 first_word 会抛出一个编译时错误:

    +

    文件名:src/main.rs

    +
    fn first_word(s: &String) -> &str {
    +    let bytes = s.as_bytes();
    +
    +    for (i, &item) in bytes.iter().enumerate() {
    +        if item == b' ' {
    +            return &s[0..i];
    +        }
    +    }
    +
    +    &s[..]
    +}
    +
    +fn main() {
    +    let mut s = String::from("hello world");
    +
    +    let word = first_word(&s);
    +
    +    s.clear(); // 错误!
    +
    +    println!("the first word is: {word}");
    +}
    +

    这里是编译错误:

    +
    $ cargo run
    +   Compiling ownership v0.1.0 (file:///projects/ownership)
    +error[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable
    +  --> src/main.rs:18:5
    +   |
    +16 |     let word = first_word(&s);
    +   |                           -- immutable borrow occurs here
    +17 |
    +18 |     s.clear(); // error!
    +   |     ^^^^^^^^^ mutable borrow occurs here
    +19 |
    +20 |     println!("the first word is: {word}");
    +   |                                  ------ immutable borrow later used here
    +
    +For more information about this error, try `rustc --explain E0502`.
    +error: could not compile `ownership` (bin "ownership") due to 1 previous error
    +
    +

    回忆一下借用规则,当拥有某值的不可变引用时,就不能再获取一个可变引用。因为 clear 需要清空 String,它尝试获取一个可变引用。在调用 clear 之后的 println! 使用了 word 中的引用,所以这个不可变的引用在此时必须仍然有效。Rust 不允许 clear 中的可变引用和 word 中的不可变引用同时存在,因此编译失败。Rust 不仅使得我们的 API 简单易用,也在编译时就消除了一整类的错误!

    +

    +

    字符串字面值就是 slice

    +

    还记得我们讲到过字符串字面值被储存在二进制文件中吗?现在知道 slice 了,我们就可以正确地理解字符串字面值了:

    +
    #![allow(unused)]
    +fn main() {
    +let s = "Hello, world!";
    +}
    +

    这里 s 的类型是 &str:它是一个指向二进制程序特定位置的 slice。这也就是为什么字符串字面值是不可变的;&str 是一个不可变引用。

    +

    字符串 slice 作为参数

    +

    在知道了能够获取字面值和 String 的 slice 后,我们对 first_word 做了改进,这是它的签名:

    +
    fn first_word(s: &String) -> &str {
    +

    而更有经验的 Rustacean 会编写出示例 4-9 中的签名,因为它使得可以对 &String 值和 &str 值使用相同的函数:

    +
    fn first_word(s: &str) -> &str {
    +    let bytes = s.as_bytes();
    +
    +    for (i, &item) in bytes.iter().enumerate() {
    +        if item == b' ' {
    +            return &s[0..i];
    +        }
    +    }
    +
    +    &s[..]
    +}
    +
    +fn main() {
    +    let my_string = String::from("hello world");
    +
    +    // `first_word` 适用于 `String`(的 slice),部分或全部
    +    let word = first_word(&my_string[0..6]);
    +    let word = first_word(&my_string[..]);
    +    // `first_word` 也适用于 `String` 的引用,
    +    // 这等价于整个 `String` 的 slice
    +    let word = first_word(&my_string);
    +
    +    let my_string_literal = "hello world";
    +
    +    // `first_word` 适用于字符串字面值,部分或全部
    +    let word = first_word(&my_string_literal[0..6]);
    +    let word = first_word(&my_string_literal[..]);
    +
    +    // 因为字符串字面值已经 **是** 字符串 slice 了,
    +    // 这也是适用的,无需 slice 语法!
    +    let word = first_word(my_string_literal);
    +}
    +

    示例 4-9: 通过将 s 参数的类型改为字符串 slice 来改进 first_word 函数

    +

    如果有一个字符串 slice,可以直接传递它。如果有一个 String,则可以传递整个 String 的 slice 或对 String 的引用。这种灵活性利用了 deref coercions 的优势,这个特性我们将在“函数和方法的隐式 Deref 强制转换”章节中介绍。定义一个获取字符串 slice 而不是 String 引用的函数使得我们的 API 更加通用并且不会丢失任何功能:

    +

    文件名:src/main.rs

    +
    fn first_word(s: &str) -> &str {
    +    let bytes = s.as_bytes();
    +
    +    for (i, &item) in bytes.iter().enumerate() {
    +        if item == b' ' {
    +            return &s[0..i];
    +        }
    +    }
    +
    +    &s[..]
    +}
    +
    +fn main() {
    +    let my_string = String::from("hello world");
    +
    +    // `first_word` 适用于 `String`(的 slice),部分或全部
    +    let word = first_word(&my_string[0..6]);
    +    let word = first_word(&my_string[..]);
    +    // `first_word` 也适用于 `String` 的引用,
    +    // 这等价于整个 `String` 的 slice
    +    let word = first_word(&my_string);
    +
    +    let my_string_literal = "hello world";
    +
    +    // `first_word` 适用于字符串字面值,部分或全部
    +    let word = first_word(&my_string_literal[0..6]);
    +    let word = first_word(&my_string_literal[..]);
    +
    +    // 因为字符串字面值已经 **是** 字符串 slice 了,
    +    // 这也是适用的,无需 slice 语法!
    +    let word = first_word(my_string_literal);
    +}
    +

    其他类型的 slice

    +

    字符串 slice,正如你想象的那样,是针对字符串的。不过也有更通用的 slice 类型。考虑一下这个数组:

    +
    #![allow(unused)]
    +fn main() {
    +let a = [1, 2, 3, 4, 5];
    +}
    +

    就跟我们想要获取字符串的一部分那样,我们也会想要引用数组的一部分。我们可以这样做:

    +
    #![allow(unused)]
    +fn main() {
    +let a = [1, 2, 3, 4, 5];
    +
    +let slice = &a[1..3];
    +
    +assert_eq!(slice, &[2, 3]);
    +}
    +

    这个 slice 的类型是 &[i32]。它跟字符串 slice 的工作方式一样,通过存储第一个集合元素的引用和一个集合总长度。你可以对其他所有集合使用这类 slice。第八章讲到 vector 时会详细讨论这些集合。

    +

    总结

    +

    所有权、借用和 slice 这些概念让 Rust 程序在编译时确保内存安全。Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码。

    +

    所有权系统影响了 Rust 中很多其他部分的工作方式,所以我们还会继续讲到这些概念,这将贯穿本书的余下内容。让我们开始第五章,来看看如何将多份数据组合进一个 struct 中。

    +

    使用结构体组织相关联的数据

    +
    +

    ch05-00-structs.md +
    +commit 8612c4a5801b61f8d2e952f8bbbb444692ff1ec2

    +
    +

    struct,或者 structure,是一个自定义数据类型,允许你包装和命名多个相关的值,从而形成一个有意义的组合。如果你熟悉一门面向对象语言,struct 就像对象中的数据属性。在本章中,我们会对元组和结构体进行比较和对比。

    +

    我们还将演示如何定义和实例化结构体,并讨论如何定义关联函数,特别是被称为 方法 的那种关联函数,以指定与结构体类型相关的行为。你可以在程序中基于结构体和枚举(enum)(在第六章介绍)创建新类型,以充分利用 Rust 的编译时类型检查。

    +

    结构体的定义和实例化

    +
    +

    ch05-01-defining-structs.md +
    +commit a371f82b0916cf21de2d56bd386ca5d72f7699b0

    +
    +

    结构体和我们在“元组类型”部分论过的元组类似,它们都包含多个相关的值。和元组一样,结构体的每一部分可以是不同类型。但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来指定或访问实例中的值。

    +

    定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段field)。例如,示例 5-1 展示了一个存储用户账号信息的结构体:

    +

    文件名:src/main.rs

    +
    struct User {
    +    active: bool,
    +    username: String,
    +    email: String,
    +    sign_in_count: u64,
    +}
    +
    +fn main() {}
    +

    示例 5-1:User 结构体定义

    +

    一旦定义了结构体后,为了使用它,通过为每个字段指定具体值来创建这个结构体的 实例。创建一个实例需要以结构体的名字开头,接着在大括号中使用 key: value 键 - 值对的形式提供字段,其中 key 是字段的名字,value 是需要存储在字段中的数据值。实例中字段的顺序不需要和它们在结构体中声明的顺序一致。换句话说,结构体的定义就像一个类型的通用模板,而实例则会在这个模板中放入特定数据来创建这个类型的值。例如,可以像示例 5-2 这样来声明一个特定的用户:

    +

    文件名:src/main.rs

    +
    struct User {
    +    active: bool,
    +    username: String,
    +    email: String,
    +    sign_in_count: u64,
    +}
    +
    +fn main() {
    +    let user1 = User {
    +        active: true,
    +        username: String::from("someusername123"),
    +        email: String::from("someone@example.com"),
    +        sign_in_count: 1,
    +    };
    +}
    +

    示例 5-2:创建 User 结构体的实例

    +

    为了从结构体中获取某个特定的值,可以使用点号。举个例子,想要用户的邮箱地址,可以用 user1.email。如果结构体的实例是可变的,我们可以使用点号并为对应的字段赋值。示例 5-3 展示了如何改变一个可变的 User 实例中 email 字段的值:

    +

    文件名:src/main.rs

    +
    struct User {
    +    active: bool,
    +    username: String,
    +    email: String,
    +    sign_in_count: u64,
    +}
    +
    +fn main() {
    +    let mut user1 = User {
    +        active: true,
    +        username: String::from("someusername123"),
    +        email: String::from("someone@example.com"),
    +        sign_in_count: 1,
    +    };
    +
    +    user1.email = String::from("anotheremail@example.com");
    +}
    +

    示例 5-3:改变 User 实例 email 字段的值

    +

    注意整个实例必须是可变的;Rust 并不允许只将某个字段标记为可变。另外需要注意同其他任何表达式一样,我们可以在函数体的最后一个表达式中构造一个结构体的新实例,来隐式地返回这个实例。

    +

    示例 5-4 显示了一个 build_user 函数,它返回一个带有给定的 email 和用户名的 User 结构体实例。active 字段的值为 true,并且 sign_in_count 的值为 1

    +

    文件名:src/main.rs

    +
    struct User {
    +    active: bool,
    +    username: String,
    +    email: String,
    +    sign_in_count: u64,
    +}
    +
    +fn build_user(email: String, username: String) -> User {
    +    User {
    +        active: true,
    +        username: username,
    +        email: email,
    +        sign_in_count: 1,
    +    }
    +}
    +
    +fn main() {
    +    let user1 = build_user(
    +        String::from("someone@example.com"),
    +        String::from("someusername123"),
    +    );
    +}
    +

    示例 5-4:build_user 函数获取 email 和用户名并返回 User 实例

    +

    为函数参数起与结构体字段相同的名字是可以理解的,但是不得不重复 emailusername 字段名称与变量有些啰嗦。如果结构体有更多字段,重复每个名称就更加烦人了。幸运的是,有一个方便的简写语法!

    +

    使用字段初始化简写语法

    +

    因为示例 5-4 中的参数名与字段名都完全相同,我们可以使用 字段初始化简写语法field init shorthand)来重写 build_user,这样其行为与之前完全相同,不过无需重复 usernameemail 了,如示例 5-5 所示。

    +

    文件名:src/main.rs

    +
    struct User {
    +    active: bool,
    +    username: String,
    +    email: String,
    +    sign_in_count: u64,
    +}
    +
    +fn build_user(email: String, username: String) -> User {
    +    User {
    +        active: true,
    +        username,
    +        email,
    +        sign_in_count: 1,
    +    }
    +}
    +
    +fn main() {
    +    let user1 = build_user(
    +        String::from("someone@example.com"),
    +        String::from("someusername123"),
    +    );
    +}
    +

    示例 5-5:build_user 函数使用了字段初始化简写语法,因为 usernameemail 参数与结构体字段同名

    +

    这里我们创建了一个新的 User 结构体实例,它有一个叫做 email 的字段。我们想要将 email 字段的值设置为 build_user 函数 email 参数的值。因为 email 字段与 email 参数有着相同的名称,则只需编写 email 而不是 email: email

    +

    使用结构体更新语法从其他实例创建实例

    +

    使用旧实例的大部分值但改变其部分值来创建一个新的结构体实例通常是很有用的。这可以通过 结构体更新语法struct update syntax)实现。

    +

    首先,示例 5-6 展示了不使用更新语法时,如何在 user2 中创建一个新 User 实例。我们为 email 设置了新的值,其他值则使用了实例 5-2 中创建的 user1 中的同名值:

    +

    文件名:src/main.rs

    +
    struct User {
    +    active: bool,
    +    username: String,
    +    email: String,
    +    sign_in_count: u64,
    +}
    +
    +fn main() {
    +    // --snip--
    +
    +    let user1 = User {
    +        email: String::from("someone@example.com"),
    +        username: String::from("someusername123"),
    +        active: true,
    +        sign_in_count: 1,
    +    };
    +
    +    let user2 = User {
    +        active: user1.active,
    +        username: user1.username,
    +        email: String::from("another@example.com"),
    +        sign_in_count: user1.sign_in_count,
    +    };
    +}
    +

    示例 5-6:使用 user1 中的一个值创建一个新的 User 实例

    +

    使用结构体更新语法,我们可以通过更少的代码来达到相同的效果,如示例 5-7 所示。.. 语法指定了剩余未显式设置值的字段应有与给定实例对应字段相同的值。

    +

    文件名:src/main.rs

    +
    struct User {
    +    active: bool,
    +    username: String,
    +    email: String,
    +    sign_in_count: u64,
    +}
    +
    +fn main() {
    +    // --snip--
    +
    +    let user1 = User {
    +        email: String::from("someone@example.com"),
    +        username: String::from("someusername123"),
    +        active: true,
    +        sign_in_count: 1,
    +    };
    +
    +    let user2 = User {
    +        email: String::from("another@example.com"),
    +        ..user1
    +    };
    +}
    +

    示例 5-7:使用结构体更新语法为一个 User 实例设置一个新的 email 值,不过其余值来自 user1 变量中实例的字段

    +

    示例 5-7 中的代码也在 user2 中创建了一个新实例,但该实例中 email 字段的值与 user1 不同,而 usernameactivesign_in_count 字段的值与 user1 相同。..user1 必须放在最后,以指定其余的字段应从 user1 的相应字段中获取其值,但我们可以选择以任何顺序为任意字段指定值,而不用考虑结构体定义中字段的顺序。

    +

    请注意,结构更新语法就像带有 = 的赋值,因为它移动了数据,就像我们在“变量与数据交互的方式(一):移动”部分讲到的一样。在这个例子中,总体上说我们在创建 user2 后就不能再使用 user1 了,因为 user1username 字段中的 String 被移到 user2 中。如果我们给 user2emailusername 都赋予新的 String 值,从而只使用 user1activesign_in_count 值,那么 user1 在创建 user2 后仍然有效。activesign_in_count 的类型是实现 Copy trait 的类型,所以我们在“变量与数据交互的方式(二):克隆” 部分讨论的行为同样适用。

    +

    使用没有命名字段的元组结构体来创建不同的类型

    +

    也可以定义与元组(在第三章讨论过)类似的结构体,称为 元组结构体tuple structs)。元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型。当你想给整个元组取一个名字,并使元组成为与其他元组不同的类型时,元组结构体是很有用的,这时像常规结构体那样为每个字段命名就显得多余和形式化了。

    +

    要定义元组结构体,以 struct 关键字和结构体名开头并后跟元组中的类型。例如,下面是两个分别叫做 ColorPoint 元组结构体的定义和用法:

    +

    文件名:src/main.rs

    +
    struct Color(i32, i32, i32);
    +struct Point(i32, i32, i32);
    +
    +fn main() {
    +    let black = Color(0, 0, 0);
    +    let origin = Point(0, 0, 0);
    +}
    +

    注意 blackorigin 值的类型不同,因为它们是不同的元组结构体的实例。你定义的每一个结构体有其自己的类型,即使结构体中的字段可能有着相同的类型。例如,一个获取 Color 类型参数的函数不能接受 Point 作为参数,即便这两个类型都由三个 i32 值组成。在其他方面,元组结构体实例类似于元组,你可以将它们解构为单独的部分,也可以使用 . 后跟索引来访问单独的值,等等。

    +

    没有任何字段的类单元结构体

    +

    我们也可以定义一个没有任何字段的结构体!它们被称为 类单元结构体unit-like structs)因为它们类似于 (),即“元组类型”一节中提到的 unit 类型。类单元结构体常常在你想要在某个类型上实现 trait 但不需要在类型中存储数据的时候发挥作用。我们将在第十章介绍 trait。下面是一个声明和实例化一个名为 AlwaysEqual 的 unit 结构的例子。

    +

    文件名:src/main.rs

    +
    struct AlwaysEqual;
    +
    +fn main() {
    +    let subject = AlwaysEqual;
    +}
    +

    为了定义 AlwaysEqual,我们使用 struct 关键字,接着是我们想要的名称,然后是一个分号。不需要花括号或圆括号!然后,我们可以以类似的方式在 subject 变量中创建 AlwaysEqual 的实例:只需使用我们定义的名称,无需任何花括号或圆括号。设想我们稍后将为这个类型实现某种行为,使得每个 AlwaysEqual 的实例始终等于任何其它类型的实例,也许是为了获得一个已知的结果以便进行测试。我们不需要任何数据来实现这种行为!在第十章中,你会看到如何定义特征并在任何类型上实现它们,包括类单元结构体。

    +
    +

    结构体数据的所有权

    +

    在示例 5-1 中的 User 结构体的定义中,我们使用了自身拥有所有权的 String 类型而不是 &str 字符串 slice 类型。这是一个有意而为之的选择,因为我们想要这个结构体拥有它所有的数据,为此只要整个结构体是有效的话其数据也是有效的。

    +

    可以使结构体存储被其他对象拥有的数据的引用,不过这么做的话需要用上 生命周期lifetimes),这是一个第十章会讨论的 Rust 功能。生命周期确保结构体引用的数据有效性跟结构体本身保持一致。如果你尝试在结构体中存储一个引用而不指定生命周期将是无效的,比如这样:

    +

    文件名:src/main.rs

    +
    struct User {
    +    active: bool,
    +    username: &str,
    +    email: &str,
    +    sign_in_count: u64,
    +}
    +
    +fn main() {
    +    let user1 = User {
    +        active: true,
    +        username: "someusername123",
    +        email: "someone@example.com",
    +        sign_in_count: 1,
    +    };
    +}
    +

    编译器会抱怨它需要生命周期标识符:

    +
    $ cargo run
    +   Compiling structs v0.1.0 (file:///projects/structs)
    +error[E0106]: missing lifetime specifier
    + --> src/main.rs:3:15
    +  |
    +3 |     username: &str,
    +  |               ^ expected named lifetime parameter
    +  |
    +help: consider introducing a named lifetime parameter
    +  |
    +1 ~ struct User<'a> {
    +2 |     active: bool,
    +3 ~     username: &'a str,
    +  |
    +
    +error[E0106]: missing lifetime specifier
    + --> src/main.rs:4:12
    +  |
    +4 |     email: &str,
    +  |            ^ expected named lifetime parameter
    +  |
    +help: consider introducing a named lifetime parameter
    +  |
    +1 ~ struct User<'a> {
    +2 |     active: bool,
    +3 |     username: &str,
    +4 ~     email: &'a str,
    +  |
    +
    +For more information about this error, try `rustc --explain E0106`.
    +error: could not compile `structs` due to 2 previous errors
    +
    +

    第十章会讲到如何修复这个问题以便在结构体中存储引用,不过现在,我们会使用像 String 这类拥有所有权的类型来替代 &str 这样的引用以修正这个错误。

    +
    +

    结构体示例程序

    +
    +

    ch05-02-example-structs.md +
    +commit 8612c4a5801b61f8d2e952f8bbbb444692ff1ec2

    +
    +

    为了理解何时会需要使用结构体,让我们编写一个计算长方形面积的程序。我们会从单独的变量开始,接着重构程序直到使用结构体替代它们为止。

    +

    使用 Cargo 新建一个叫做 rectangles 的二进制程序,它获取以像素为单位的长方形的宽度和高度,并计算出长方形的面积。示例 5-8 显示了位于项目的 src/main.rs 中的小程序,它刚刚好实现此功能:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let width1 = 30;
    +    let height1 = 50;
    +
    +    println!(
    +        "The area of the rectangle is {} square pixels.",
    +        area(width1, height1)
    +    );
    +}
    +
    +fn area(width: u32, height: u32) -> u32 {
    +    width * height
    +}
    +

    示例 5-8:通过分别指定长方形的宽和高的变量来计算长方形面积

    +

    现在使用 cargo run 运行程序:

    +
    $ cargo run
    +   Compiling rectangles v0.1.0 (file:///projects/rectangles)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.42s
    +     Running `target/debug/rectangles`
    +The area of the rectangle is 1500 square pixels.
    +
    +

    这个示例代码在调用 area 函数时传入每个维度,虽然可以正确计算出长方形的面积,但我们仍然可以修改这段代码来使它的意义更加明确,并且增加可读性。

    +

    这些代码的问题突显在 area 的签名上:

    +
    fn main() {
    +    let width1 = 30;
    +    let height1 = 50;
    +
    +    println!(
    +        "The area of the rectangle is {} square pixels.",
    +        area(width1, height1)
    +    );
    +}
    +
    +fn area(width: u32, height: u32) -> u32 {
    +    width * height
    +}
    +

    函数 area 本应该计算一个长方形的面积,不过函数却有两个参数。这两个参数是相关联的,不过程序本身却没有表现出这一点。将长度和宽度组合在一起将更易懂也更易处理。第三章的 “元组类型” 部分已经讨论过了一种可行的方法:元组。

    +

    使用元组重构

    +

    示例 5-9 展示了使用元组的另一个程序版本。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let rect1 = (30, 50);
    +
    +    println!(
    +        "The area of the rectangle is {} square pixels.",
    +        area(rect1)
    +    );
    +}
    +
    +fn area(dimensions: (u32, u32)) -> u32 {
    +    dimensions.0 * dimensions.1
    +}
    +

    示例 5-9:使用元组来指定长方形的宽高

    +

    在某种程度上说,这个程序更好一点了。元组帮助我们增加了一些结构性,并且现在只需传一个参数。不过在另一方面,这个版本却有一点不明确了:元组并没有给出元素的名称,所以计算变得更费解了,因为不得不使用索引来获取元组的每一部分:

    +

    在计算面积时将宽和高弄混倒无关紧要,不过当在屏幕上绘制长方形时就有问题了!我们必须牢记 width 的元组索引是 0height 的元组索引是 1。如果其他人要使用这些代码,他们必须要搞清楚这一点,并也要牢记于心。很容易忘记或者混淆这些值而造成错误,因为我们没有在代码中传达数据的意图。

    +

    使用结构体重构:赋予更多意义

    +

    我们使用结构体为数据命名来为其赋予意义。我们可以将我们正在使用的元组转换成一个有整体名称而且每个部分也有对应名字的结构体,如示例 5-10 所示:

    +

    文件名:src/main.rs

    +
    struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +fn main() {
    +    let rect1 = Rectangle {
    +        width: 30,
    +        height: 50,
    +    };
    +
    +    println!(
    +        "The area of the rectangle is {} square pixels.",
    +        area(&rect1)
    +    );
    +}
    +
    +fn area(rectangle: &Rectangle) -> u32 {
    +    rectangle.width * rectangle.height
    +}
    +

    示例 5-10:定义 Rectangle 结构体

    +

    这里我们定义了一个结构体并称其为 Rectangle。在大括号中定义了字段 widthheight,类型都是 u32。接着在 main 中,我们创建了一个具体的 Rectangle 实例,它的宽是 30,高是 50

    +

    函数 area 现在被定义为接收一个名叫 rectangle 的参数,其类型是一个结构体 Rectangle 实例的不可变借用。第四章讲到过,我们希望借用结构体而不是获取它的所有权,这样 main 函数就可以保持 rect1 的所有权并继续使用它,所以这就是为什么在函数签名和调用的地方会有 &

    +

    area 函数访问 Rectangle 实例的 widthheight 字段(注意,访问对结构体的引用的字段不会移动字段的所有权,这就是为什么你经常看到对结构体的引用)。area 的函数签名现在明确的阐述了我们的意图:使用 Rectanglewidthheight 字段,计算 Rectangle 的面积。这表明宽高是相互联系的,并为这些值提供了描述性的名称而不是使用元组的索引值 01 。结构体胜在更清晰明了。

    +

    通过派生 trait 增加实用功能

    +

    在调试程序时打印出 Rectangle 实例来查看其所有字段的值非常有用。示例 5-11 像前面章节那样尝试使用 println!。但这并不行。

    +

    文件名:src/main.rs

    +
    struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +fn main() {
    +    let rect1 = Rectangle {
    +        width: 30,
    +        height: 50,
    +    };
    +
    +    println!("rect1 is {}", rect1);
    +}
    +

    示例 5-11:尝试打印出 Rectangle 实例

    +

    当我们运行这个代码时,会出现带有如下核心信息的错误:

    +
    error[E0277]: `Rectangle` doesn't implement `std::fmt::Display`
    +
    +

    println! 宏能处理很多类型的格式,不过,{} 默认告诉 println! 使用被称为 Display 的格式:意在提供给直接终端用户查看的输出。目前为止见过的基本类型都默认实现了 Display,因为它就是向用户展示 1 或其他任何基本类型的唯一方式。不过对于结构体,println! 应该用来输出的格式是不明确的,因为这有更多显示的可能性:是否需要逗号?需要打印出大括号吗?所有字段都应该显示吗?由于这种不确定性,Rust 不会尝试猜测我们的意图,所以结构体并没有提供一个 Display 实现来使用 println!{} 占位符。

    +

    但是如果我们继续阅读错误,将会发现这个有帮助的信息:

    +
       = help: the trait `std::fmt::Display` is not implemented for `Rectangle`
    +   = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
    +
    +

    让我们来试试!现在 println! 宏调用看起来像 println!("rect1 is {:?}", rect1); 这样。在 {} 中加入 :? 指示符告诉 println! 我们想要使用叫做 Debug 的输出格式。Debug 是一个 trait,它允许我们以一种对开发者有帮助的方式打印结构体,以便当我们调试代码时能看到它的值。

    +

    这样调整后再次运行程序。见鬼了!仍然能看到一个错误:

    +
    error[E0277]: `Rectangle` doesn't implement `Debug`
    +
    +

    不过编译器又一次给出了一个有帮助的信息:

    +
       = help: the trait `Debug` is not implemented for `Rectangle`
    +   = note: add `#[derive(Debug)]` to `Rectangle` or manually `impl Debug for Rectangle`
    +
    +

    Rust 确实 包含了打印出调试信息的功能,不过我们必须为结构体显式选择这个功能。为此,在结构体定义之前加上外部属性 #[derive(Debug)],如示例 5-12 所示:

    +

    文件名:src/main.rs

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +fn main() {
    +    let rect1 = Rectangle {
    +        width: 30,
    +        height: 50,
    +    };
    +
    +    println!("rect1 is {rect1:?}");
    +}
    +

    示例 5-12:增加属性来派生 Debug trait,并使用调试格式打印 Rectangle 实例

    +

    现在我们再运行这个程序时,就不会有任何错误,并会出现如下输出:

    +
    $ cargo run
    +   Compiling rectangles v0.1.0 (file:///projects/rectangles)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s
    +     Running `target/debug/rectangles`
    +rect1 is Rectangle { width: 30, height: 50 }
    +
    +

    好极了!这并不是最漂亮的输出,不过它显示这个实例的所有字段,毫无疑问这对调试有帮助。当我们有一个更大的结构体时,能有更易读一点的输出就好了,为此可以使用 {:#?} 替换 println! 字符串中的 {:?}。在这个例子中使用 {:#?} 风格将会输出如下:

    +
    $ cargo run
    +   Compiling rectangles v0.1.0 (file:///projects/rectangles)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s
    +     Running `target/debug/rectangles`
    +rect1 is Rectangle {
    +    width: 30,
    +    height: 50,
    +}
    +
    +

    另一种使用 Debug 格式打印数值的方法是使用 dbg!dbg! 宏接收一个表达式的所有权(与 println! 宏相反,后者接收的是引用),打印出代码中调用 dbg! 宏时所在的文件和行号,以及该表达式的结果值,并返回该值的所有权。

    +
    +

    注意:调用 dbg! 宏会打印到标准错误控制台流(stderr),与 println! 不同,后者会打印到标准输出控制台流(stdout)。我们将在第十二章 “将错误信息写入标准错误而不是标准输出” 一节中更多地讨论 stderrstdout

    +
    +

    下面是一个例子,我们对分配给 width 字段的值以及 rect1 中整个结构的值感兴趣。

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +fn main() {
    +    let scale = 2;
    +    let rect1 = Rectangle {
    +        width: dbg!(30 * scale),
    +        height: 50,
    +    };
    +
    +    dbg!(&rect1);
    +}
    +

    我们可以把 dbg! 放在表达式 30 * scale 周围,因为 dbg! 返回表达式的值的所有权,所以 width 字段将获得相同的值,就像我们在那里没有 dbg! 调用一样。我们不希望 dbg! 拥有 rect1 的所有权,所以我们在下一次调用 dbg! 时传递一个引用。下面是这个例子的输出结果:

    +
    $ cargo run
    +   Compiling rectangles v0.1.0 (file:///projects/rectangles)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.61s
    +     Running `target/debug/rectangles`
    +[src/main.rs:10:16] 30 * scale = 60
    +[src/main.rs:14:5] &rect1 = Rectangle {
    +    width: 60,
    +    height: 50,
    +}
    +
    +

    我们可以看到第一点输出来自 src/main.rs 第 10 行,我们正在调试表达式 30 * scale,其结果值是 60(为整数实现的 Debug 格式化是只打印它们的值)。在 src/main.rs 第 14 行 的 dbg! 调用输出 &rect1 的值,即 Rectangle 结构。这个输出使用了更为易读的 Debug 格式。当你试图弄清楚你的代码在做什么时,dbg! 宏可能真的很有帮助!

    +

    除了 Debug trait,Rust 还为我们提供了很多可以通过 derive 属性来使用的 trait,它们可以为我们的自定义类型增加实用的行为。附录 C 中列出了这些 trait 和行为。第十章会介绍如何通过自定义行为来实现这些 trait,同时还有如何创建你自己的 trait。除了 derive 之外,还有很多属性;更多信息请参见 Rust Reference 的 Attributes 部分。

    +

    我们的 area 函数是非常特殊的,它只计算长方形的面积。如果这个行为与 Rectangle 结构体再结合得更紧密一些就更好了,因为它不能用于其他类型。现在让我们看看如何继续重构这些代码,来将 area 函数协调进 Rectangle 类型定义的 area 方法 中。

    +

    方法语法

    +
    +

    ch05-03-method-syntax.md +
    +commit d339373a838fd312a8a9bcc9487e1ffbc9e1582f

    +
    +

    方法(method)与函数类似:它们使用 fn 关键字和名称声明,可以拥有参数和返回值,同时包含在某处调用该方法时会执行的代码。不过方法与函数是不同的,因为它们在结构体的上下文中被定义(或者是枚举或 trait 对象的上下文,将分别在第六章第十八章讲解),并且它们第一个参数总是 self,它代表调用该方法的结构体实例。

    +

    定义方法

    +

    让我们把前面实现的获取一个 Rectangle 实例作为参数的 area 函数,改写成一个定义于 Rectangle 结构体上的 area 方法,如示例 5-13 所示:

    +

    文件名:src/main.rs

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +impl Rectangle {
    +    fn area(&self) -> u32 {
    +        self.width * self.height
    +    }
    +}
    +
    +fn main() {
    +    let rect1 = Rectangle {
    +        width: 30,
    +        height: 50,
    +    };
    +
    +    println!(
    +        "The area of the rectangle is {} square pixels.",
    +        rect1.area()
    +    );
    +}
    +

    示例 5-13:在 Rectangle 结构体上定义 area 方法

    +

    为了使函数定义于 Rectangle 的上下文中,我们开始了一个 impl 块(implimplementation 的缩写),这个 impl 块中的所有内容都将与 Rectangle 类型相关联。接着将 area 函数移动到 impl 大括号中,并将签名中的第一个(在这里也是唯一一个)参数和函数体中其他地方的对应参数改成 self。然后在 main 中将我们先前调用 area 方法并传递 rect1 作为参数的地方,改成使用 方法语法method syntax)在 Rectangle 实例上调用 area 方法。方法语法获取一个实例并加上一个点号,后跟方法名、圆括号以及任何参数。

    +

    area 的签名中,使用 &self 来替代 rectangle: &Rectangle&self 实际上是 self: &Self 的缩写。在一个 impl 块中,Self 类型是 impl 块的类型的别名。方法的第一个参数必须有一个名为 selfSelf 类型的参数,所以 Rust 让你在第一个参数位置上只用 self 这个名字来简化。注意,我们仍然需要在 self 前面使用 & 来表示这个方法借用了 Self 实例,就像我们在 rectangle: &Rectangle 中做的那样。方法可以选择获得 self 的所有权,或者像我们这里一样不可变地借用 self,或者可变地借用 self,就跟其他参数一样。

    +

    这里选择 &self 的理由跟在函数版本中使用 &Rectangle 是相同的:我们并不想获取所有权,只希望能够读取结构体中的数据,而不是写入。如果想要在方法中改变调用方法的实例,需要将第一个参数改为 &mut self。通过仅仅使用 self 作为第一个参数来使方法获取实例的所有权是很少见的;这种技术通常用在当方法将 self 转换成别的实例的时候,这时我们想要防止调用者在转换之后使用原始的实例。

    +

    使用方法替代函数,除了可使用方法语法和不需要在每个函数签名中重复 self 的类型之外,其主要好处在于组织性。我们将某个类型实例能做的所有事情都一起放入 impl 块中,而不是让将来的用户在我们的库中到处寻找 Rectangle 的功能。

    +

    请注意,我们可以选择将方法的名称与结构中的一个字段相同。例如,我们可以在 Rectangle 上定义一个方法,并命名为 width

    +

    文件名:src/main.rs

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +impl Rectangle {
    +    fn width(&self) -> bool {
    +        self.width > 0
    +    }
    +}
    +
    +fn main() {
    +    let rect1 = Rectangle {
    +        width: 30,
    +        height: 50,
    +    };
    +
    +    if rect1.width() {
    +        println!("The rectangle has a nonzero width; it is {}", rect1.width);
    +    }
    +}
    +

    在这里,我们选择让 width 方法在实例的 width 字段的值大于 0 时返回 true,等于 0 时则返回 false:我们可以出于任何目的,在同名的方法中使用同名的字段。在 main 中,当我们在 rect1.width 后面加上括号时。Rust 知道我们指的是方法 width。当我们不使用圆括号时,Rust 知道我们指的是字段 width

    +

    通常,但并不总是如此,与字段同名的方法将被定义为只返回字段中的值,而不做其他事情。这样的方法被称为 getters,Rust 并不像其他一些语言那样为结构字段自动实现它们。Getters 很有用,因为你可以把字段变成私有的,但方法是公共的,这样就可以把对字段的只读访问作为该类型公共 API 的一部分。我们将在第七章中讨论什么是公有和私有,以及如何将一个字段或方法指定为公有或私有。

    +
    +

    -> 运算符到哪去了?

    +

    在 C/C++ 语言中,有两个不同的运算符来调用方法:. 直接在对象上调用方法,而 -> 在一个对象的指针上调用方法,这时需要先解引用(dereference)指针。换句话说,如果 object 是一个指针,那么 object->something() 就像 (*object).something() 一样。

    +

    Rust 并没有一个与 -> 等效的运算符;相反,Rust 有一个叫 自动引用和解引用automatic referencing and dereferencing)的功能。方法调用是 Rust 中少数几个拥有这种行为的地方。

    +

    它是这样工作的:当使用 object.something() 调用方法时,Rust 会自动为 object 添加 &&mut* 以便使 object 与方法签名匹配。也就是说,这些代码是等价的:

    +
    #![allow(unused)]
    +fn main() {
    +#[derive(Debug,Copy,Clone)]
    +struct Point {
    +    x: f64,
    +    y: f64,
    +}
    +
    +impl Point {
    +   fn distance(&self, other: &Point) -> f64 {
    +       let x_squared = f64::powi(other.x - self.x, 2);
    +       let y_squared = f64::powi(other.y - self.y, 2);
    +
    +       f64::sqrt(x_squared + y_squared)
    +   }
    +}
    +let p1 = Point { x: 0.0, y: 0.0 };
    +let p2 = Point { x: 5.0, y: 6.5 };
    +p1.distance(&p2);
    +(&p1).distance(&p2);
    +}
    +

    第一行看起来简洁的多。这种自动引用的行为之所以有效,是因为方法有一个明确的接收者———— self 的类型。在给出接收者和方法名的前提下,Rust 可以明确地计算出方法是仅仅读取(&self),做出修改(&mut self)或者是获取所有权(self)。事实上,Rust 对方法接收者的隐式借用让所有权在实践中更友好。

    +
    +

    带有更多参数的方法

    +

    让我们通过实现 Rectangle 结构体上的另一方法来练习使用方法。这回,我们让一个 Rectangle 的实例获取另一个 Rectangle 实例,如果 self (第一个 Rectangle)能完全包含第二个长方形则返回 true;否则返回 false。一旦我们定义了 can_hold 方法,就可以编写示例 5-14 中的代码。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let rect1 = Rectangle {
    +        width: 30,
    +        height: 50,
    +    };
    +    let rect2 = Rectangle {
    +        width: 10,
    +        height: 40,
    +    };
    +    let rect3 = Rectangle {
    +        width: 60,
    +        height: 45,
    +    };
    +
    +    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
    +    println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));
    +}
    +

    示例 5-14:使用还未实现的 can_hold 方法

    +

    同时我们希望看到如下输出,因为 rect2 的两个维度都小于 rect1,而 rect3rect1 要宽:

    +
    Can rect1 hold rect2? true
    +Can rect1 hold rect3? false
    +
    +

    因为我们想定义一个方法,所以它应该位于 impl Rectangle 块中。方法名是 can_hold,并且它会获取另一个 Rectangle 的不可变借用作为参数。通过观察调用方法的代码可以看出参数是什么类型的:rect1.can_hold(&rect2) 传入了 &rect2,它是一个 Rectangle 的实例 rect2 的不可变借用。这是可以理解的,因为我们只需要读取 rect2(而不是写入,这意味着我们需要一个不可变借用),而且希望 main 保持 rect2 的所有权,这样就可以在调用这个方法后继续使用它。can_hold 的返回值是一个布尔值,其实现会分别检查 self 的宽高是否都大于另一个 Rectangle。让我们在示例 5-13 的 impl 块中增加这个新的 can_hold 方法,如示例 5-15 所示:

    +

    文件名:src/main.rs

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +impl Rectangle {
    +    fn area(&self) -> u32 {
    +        self.width * self.height
    +    }
    +
    +    fn can_hold(&self, other: &Rectangle) -> bool {
    +        self.width > other.width && self.height > other.height
    +    }
    +}
    +
    +fn main() {
    +    let rect1 = Rectangle {
    +        width: 30,
    +        height: 50,
    +    };
    +    let rect2 = Rectangle {
    +        width: 10,
    +        height: 40,
    +    };
    +    let rect3 = Rectangle {
    +        width: 60,
    +        height: 45,
    +    };
    +
    +    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
    +    println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));
    +}
    +

    示例 5-15:在 Rectangle 上实现 can_hold 方法,它获取另一个 Rectangle 实例作为参数

    +

    如果结合示例 5-14 的 main 函数来运行,就会看到期望的输出。在方法签名中,可以在 self 后增加多个参数,而且这些参数就像函数中的参数一样工作。

    +

    关联函数

    +

    所有在 impl 块中定义的函数被称为 关联函数associated functions),因为它们与 impl 后面命名的类型相关。我们可以定义不以 self 为第一参数的关联函数(因此不是方法),因为它们并不作用于一个结构体的实例。我们已经使用了一个这样的函数:在 String 类型上定义的 String::from 函数。

    +

    不是方法的关联函数经常被用作返回一个结构体新实例的构造函数。这些函数的名称通常为 new ,但 new 并不是一个关键字。例如我们可以提供一个叫做 square 关联函数,它接受一个维度参数并且同时作为宽和高,这样可以更轻松的创建一个正方形 Rectangle 而不必指定两次同样的值:

    +

    文件名:src/main.rs

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +impl Rectangle {
    +    fn square(size: u32) -> Self {
    +        Self {
    +            width: size,
    +            height: size,
    +        }
    +    }
    +}
    +
    +fn main() {
    +    let sq = Rectangle::square(3);
    +}
    +

    关键字 Self 在函数的返回类型中代指在 impl 关键字后出现的类型,在这里是 Rectangle

    +

    使用结构体名和 :: 语法来调用这个关联函数:比如 let sq = Rectangle::square(3);。这个函数位于结构体的命名空间中::: 语法用于关联函数和模块创建的命名空间。第七章会讲到模块。

    +

    多个 impl

    +

    每个结构体都允许拥有多个 impl 块。例如,示例 5-16 中的代码等同于示例 5-15,但每个方法有其自己的 impl 块。

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +impl Rectangle {
    +    fn area(&self) -> u32 {
    +        self.width * self.height
    +    }
    +}
    +
    +impl Rectangle {
    +    fn can_hold(&self, other: &Rectangle) -> bool {
    +        self.width > other.width && self.height > other.height
    +    }
    +}
    +
    +fn main() {
    +    let rect1 = Rectangle {
    +        width: 30,
    +        height: 50,
    +    };
    +    let rect2 = Rectangle {
    +        width: 10,
    +        height: 40,
    +    };
    +    let rect3 = Rectangle {
    +        width: 60,
    +        height: 45,
    +    };
    +
    +    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
    +    println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));
    +}
    +

    示例 5-16:使用多个 impl 块重写示例 5-15

    +

    这里没有理由将这些方法分散在多个 impl 块中,不过这是有效的语法。第十章讨论泛型和 trait 时会看到实用的多 impl 块的用例。

    +

    总结

    +

    结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,让你指定结构体的实例所具有的行为。

    +

    但结构体并不是创建自定义类型的唯一方法:让我们转向 Rust 的枚举功能,为你的工具箱再添一个工具。

    +

    枚举和模式匹配

    +
    +

    ch06-00-enums.md +
    +commit bb7e429ad6b59d9a0c37db7434976364cbb9c6da

    +
    +

    本章介绍 枚举enumerations),也被称作 enums。枚举允许你通过列举可能的 成员variants)来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做 Option,它代表一个值要么是某个值要么什么都不是。然后会讲到在 match 表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。最后会介绍 if let,另一个简洁方便处理代码中枚举的结构。

    +

    枚举的定义

    +
    +

    ch06-01-defining-an-enum.md +
    +commit bb7e429ad6b59d9a0c37db7434976364cbb9c6da

    +
    +

    结构体给予你将字段和数据聚合在一起的方法,像 Rectangle 结构体有 widthheight 两个字段。而枚举给予你一个途径去声明某个值是一个集合中的一员。比如,我们想让 Rectangle 是一些形状的集合,包含 CircleTriangle 。为了做到这个,Rust 提供了枚举类型。

    +

    让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4(version four)和 IPv6(version six)。这是我们的程序可能会遇到的所有可能的 IP 地址类型:所以可以 枚举 出所有可能的值,这也正是此枚举名字的由来。

    +

    任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能两者都是。IP 地址的这个特性使得枚举数据结构非常适合这个场景,因为枚举值只可能是其中一个成员。IPv4 和 IPv6 从根本上讲仍是 IP 地址,所以当代码在处理适用于任何类型的 IP 地址的场景时应该把它们当作相同的类型。

    +

    可以通过在代码中定义一个 IpAddrKind 枚举来表现这个概念并列出可能的 IP 地址类型,V4V6。这被称为枚举的 成员variants):

    +
    enum IpAddrKind {
    +    V4,
    +    V6,
    +}
    +
    +fn main() {
    +    let four = IpAddrKind::V4;
    +    let six = IpAddrKind::V6;
    +
    +    route(IpAddrKind::V4);
    +    route(IpAddrKind::V6);
    +}
    +
    +fn route(ip_kind: IpAddrKind) {}
    +

    现在 IpAddrKind 就是一个可以在代码中使用的自定义数据类型了。

    +

    枚举值

    +

    可以像这样创建 IpAddrKind 两个不同成员的实例:

    +
    enum IpAddrKind {
    +    V4,
    +    V6,
    +}
    +
    +fn main() {
    +    let four = IpAddrKind::V4;
    +    let six = IpAddrKind::V6;
    +
    +    route(IpAddrKind::V4);
    +    route(IpAddrKind::V6);
    +}
    +
    +fn route(ip_kind: IpAddrKind) {}
    +

    注意枚举的成员位于其标识符的命名空间中,并使用两个冒号分开。这么设计的益处是现在 IpAddrKind::V4IpAddrKind::V6 都是 IpAddrKind 类型的。例如,接着可以定义一个函数来接收任何 IpAddrKind类型的参数:

    +
    enum IpAddrKind {
    +    V4,
    +    V6,
    +}
    +
    +fn main() {
    +    let four = IpAddrKind::V4;
    +    let six = IpAddrKind::V6;
    +
    +    route(IpAddrKind::V4);
    +    route(IpAddrKind::V6);
    +}
    +
    +fn route(ip_kind: IpAddrKind) {}
    +

    现在可以使用任一成员来调用这个函数:

    +
    enum IpAddrKind {
    +    V4,
    +    V6,
    +}
    +
    +fn main() {
    +    let four = IpAddrKind::V4;
    +    let six = IpAddrKind::V6;
    +
    +    route(IpAddrKind::V4);
    +    route(IpAddrKind::V6);
    +}
    +
    +fn route(ip_kind: IpAddrKind) {}
    +

    使用枚举甚至还有更多优势。进一步考虑一下我们的 IP 地址类型,目前没有一个存储实际 IP 地址 数据 的方法;只知道它是什么 类型 的。考虑到已经在第五章学习过结构体了,你可能会像示例 6-1 那样处理这个问题:

    +
    fn main() {
    +    enum IpAddrKind {
    +        V4,
    +        V6,
    +    }
    +
    +    struct IpAddr {
    +        kind: IpAddrKind,
    +        address: String,
    +    }
    +
    +    let home = IpAddr {
    +        kind: IpAddrKind::V4,
    +        address: String::from("127.0.0.1"),
    +    };
    +
    +    let loopback = IpAddr {
    +        kind: IpAddrKind::V6,
    +        address: String::from("::1"),
    +    };
    +}
    +

    示例 6-1:将 IP 地址的数据和 IpAddrKind 成员存储在一个 struct

    +

    这里我们定义了一个有两个字段的结构体 IpAddrIpAddrKind(之前定义的枚举)类型的 kind 字段和 String 类型 address 字段。我们有这个结构体的两个实例。第一个,home,它的 kind 的值是 IpAddrKind::V4 与之相关联的地址数据是 127.0.0.1。第二个实例,loopbackkind 的值是 IpAddrKind 的另一个成员,V6,关联的地址是 ::1。我们使用了一个结构体来将 kindaddress 打包在一起,现在枚举成员就与值相关联了。

    +

    我们可以使用一种更简洁的方式来表达相同的概念,仅仅使用枚举并将数据直接放进每一个枚举成员而不是将枚举作为结构体的一部分。IpAddr 枚举的新定义表明了 V4V6 成员都关联了 String 值:

    +
    fn main() {
    +    enum IpAddr {
    +        V4(String),
    +        V6(String),
    +    }
    +
    +    let home = IpAddr::V4(String::from("127.0.0.1"));
    +
    +    let loopback = IpAddr::V6(String::from("::1"));
    +}
    +

    我们直接将数据附加到枚举的每个成员上,这样就不需要一个额外的结构体了。这里也很容易看出枚举工作的另一个细节:每一个我们定义的枚举成员的名字也变成了一个构建枚举的实例的函数。也就是说,IpAddr::V4() 是一个获取 String 参数并返回 IpAddr 类型实例的函数调用。作为定义枚举的结果,这些构造函数会自动被定义。

    +

    用枚举替代结构体还有另一个优势:每个成员可以处理不同类型和数量的数据。IPv4 版本的 IP 地址总是含有四个值在 0 和 255 之间的数字部分。如果我们想要将 V4 地址存储为四个 u8 值而 V6 地址仍然表现为一个 String,这就不能使用结构体了。枚举则可以轻易的处理这个情况:

    +
    fn main() {
    +    enum IpAddr {
    +        V4(u8, u8, u8, u8),
    +        V6(String),
    +    }
    +
    +    let home = IpAddr::V4(127, 0, 0, 1);
    +
    +    let loopback = IpAddr::V6(String::from("::1"));
    +}
    +

    这些代码展示了使用枚举来存储两种不同 IP 地址的几种可能的选择。然而,事实证明存储和编码 IP 地址实在是太常见了以致标准库提供了一个开箱即用的定义!让我们看看标准库是如何定义 IpAddr 的:它正有着跟我们定义和使用的一样的枚举和成员,不过它将成员中的地址数据嵌入到了两个不同形式的结构体中,它们对不同的成员的定义是不同的:

    +
    #![allow(unused)]
    +fn main() {
    +struct Ipv4Addr {
    +    // --snip--
    +}
    +
    +struct Ipv6Addr {
    +    // --snip--
    +}
    +
    +enum IpAddr {
    +    V4(Ipv4Addr),
    +    V6(Ipv6Addr),
    +}
    +}
    +

    这些代码展示了可以将任意类型的数据放入枚举成员中:例如字符串、数字类型或者结构体。甚至可以包含另一个枚举!另外,标准库中的类型通常并不比你设想出来的要复杂多少。

    +

    注意虽然标准库中包含一个 IpAddr 的定义,仍然可以创建和使用我们自己的定义而不会有冲突,因为我们并没有将标准库中的定义引入作用域。第七章会讲到如何导入类型。

    +

    来看看示例 6-2 中的另一个枚举的例子:它的成员中内嵌了多种多样的类型:

    +
    enum Message {
    +    Quit,
    +    Move { x: i32, y: i32 },
    +    Write(String),
    +    ChangeColor(i32, i32, i32),
    +}
    +
    +fn main() {}
    +

    示例 6-2:一个 Message 枚举,其每个成员都存储了不同数量和类型的值

    +

    这个枚举有四个含有不同类型的成员:

    +
      +
    • Quit 没有关联任何数据。
    • +
    • Move 类似结构体包含命名字段。
    • +
    • Write 包含单独一个 String
    • +
    • ChangeColor 包含三个 i32
    • +
    +

    定义一个如示例 6-2 中所示那样的有关联值的枚举的方式和定义多个不同类型的结构体的方式很相像,除了枚举不使用 struct 关键字以及其所有成员都被组合在一起位于 Message 类型下。如下这些结构体可以包含与之前枚举成员中相同的数据:

    +
    struct QuitMessage; // 类单元结构体
    +struct MoveMessage {
    +    x: i32,
    +    y: i32,
    +}
    +struct WriteMessage(String); // 元组结构体
    +struct ChangeColorMessage(i32, i32, i32); // 元组结构体
    +
    +fn main() {}
    +

    不过,如果我们使用不同的结构体,由于它们都有不同的类型,我们将不能像使用示例 6-2 中定义的 Message 枚举那样,轻易的定义一个能够处理这些不同类型的结构体的函数,因为枚举是单独一个类型。

    +

    结构体和枚举还有另一个相似点:就像可以使用 impl 来为结构体定义方法那样,也可以在枚举上定义方法。这是一个定义于我们 Message 枚举上的叫做 call 的方法:

    +
    fn main() {
    +    enum Message {
    +        Quit,
    +        Move { x: i32, y: i32 },
    +        Write(String),
    +        ChangeColor(i32, i32, i32),
    +    }
    +
    +    impl Message {
    +        fn call(&self) {
    +            // 在这里定义方法体
    +        }
    +    }
    +
    +    let m = Message::Write(String::from("hello"));
    +    m.call();
    +}
    +

    方法体使用了 self 来获取调用方法的值。这个例子中,创建了一个值为 Message::Write(String::from("hello")) 的变量 m,而且这就是当 m.call() 运行时 call 方法中的 self 的值。

    +

    让我们看看标准库中的另一个非常常见且实用的枚举:Option

    +

    Option 枚举和其相对于空值的优势

    +

    这一部分会分析一个 Option 的案例,Option 是标准库定义的另一个枚举。Option 类型应用广泛因为它编码了一个非常普遍的场景,即一个值要么有值要么没值。

    +

    例如,如果请求一个非空列表的第一项,会得到一个值,如果请求一个空的列表,就什么也不会得到。从类型系统的角度来表达这个概念就意味着编译器需要检查是否处理了所有应该处理的情况,这样就可以避免在其他编程语言中非常常见的 bug。

    +

    编程语言的设计经常要考虑包含哪些功能,但考虑排除哪些功能也很重要。Rust 并没有很多其他语言中有的空值功能。空值Null )是一个值,它代表没有值。在有空值的语言中,变量总是这两种状态之一:空值和非空值。

    +

    Tony Hoare,null 的发明者,在他 2009 年的演讲 “Null References: The Billion Dollar Mistake” 中曾经说到:

    +
    +

    I call it my billion-dollar mistake. At that time, I was designing the first +comprehensive type system for references in an object-oriented language. My +goal was to ensure that all use of references should be absolutely safe, with +checking performed automatically by the compiler. But I couldn't resist the +temptation to put in a null reference, simply because it was so easy to +implement. This has led to innumerable errors, vulnerabilities, and system +crashes, which have probably caused a billion dollars of pain and damage in +the last forty years.

    +

    我称之为我十亿美元的错误。当时,我在为一个面向对象语言设计第一个综合性的面向引用的类型系统。我的目标是通过编译器的自动检查来保证所有引用的使用都应该是绝对安全的。不过我未能抵抗住引入一个空引用的诱惑,仅仅是因为它是这么的容易实现。这引发了无数错误、漏洞和系统崩溃,在之后的四十多年中造成了数十亿美元的苦痛和伤害。

    +
    +

    空值的问题在于当你尝试像一个非空值那样使用一个空值,会出现某种形式的错误。因为空和非空的属性无处不在,非常容易出现这类错误。

    +

    然而,空值尝试表达的概念仍然是有意义的:空值是一个因为某种原因目前无效或缺失的值。

    +

    问题不在于概念而在于具体的实现。为此,Rust 并没有空值,不过它确实拥有一个可以编码存在或不存在概念的枚举。这个枚举是 Option<T>,而且它定义于标准库中,如下:

    +
    #![allow(unused)]
    +fn main() {
    +enum Option<T> {
    +    None,
    +    Some(T),
    +}
    +}
    +

    Option<T> 枚举是如此有用以至于它甚至被包含在了 prelude 之中,你不需要将其显式引入作用域。另外,它的成员也是如此,可以不需要 Option:: 前缀来直接使用 SomeNone。即便如此 Option<T> 也仍是常规的枚举,Some(T)None 仍是 Option<T> 的成员。

    +

    <T> 语法是一个我们还未讲到的 Rust 功能。它是一个泛型类型参数,第十章会更详细的讲解泛型。目前,所有你需要知道的就是 <T> 意味着 Option 枚举的 Some 成员可以包含任意类型的数据,同时每一个用于 T 位置的具体类型使得 Option<T> 整体作为不同的类型。这里是一些包含数字类型和字符串类型 Option 值的例子:

    +
    fn main() {
    +    let some_number = Some(5);
    +    let some_char = Some('e');
    +
    +    let absent_number: Option<i32> = None;
    +}
    +

    some_number 的类型是 Option<i32>some_char 的类型是 Option<char>,是不同于some_number的类型。因为我们在 Some 成员中指定了值,Rust 可以推断其类型。对于 absent_number,Rust 需要我们指定 Option 整体的类型,因为编译器只通过 None 值无法推断出 Some 成员保存的值的类型。这里我们告诉 Rust 希望 absent_numberOption<i32> 类型的。

    +

    当有一个 Some 值时,我们就知道存在一个值,而这个值保存在 Some 中。当有个 None 值时,在某种意义上,它跟空值具有相同的意义:并没有一个有效的值。那么,Option<T> 为什么就比空值要好呢?

    +

    简而言之,因为 Option<T>T(这里 T 可以是任何类型)是不同的类型,编译器不允许像一个肯定有效的值那样使用 Option<T>。例如,这段代码不能编译,因为它尝试将 Option<i8>i8 相加:

    +
    fn main() {
    +    let x: i8 = 5;
    +    let y: Option<i8> = Some(5);
    +
    +    let sum = x + y;
    +}
    +

    如果运行这些代码,将得到类似这样的错误信息:

    +
    $ cargo run
    +   Compiling enums v0.1.0 (file:///projects/enums)
    +error[E0277]: cannot add `Option<i8>` to `i8`
    + --> src/main.rs:5:17
    +  |
    +5 |     let sum = x + y;
    +  |                 ^ no implementation for `i8 + Option<i8>`
    +  |
    +  = help: the trait `Add<Option<i8>>` is not implemented for `i8`
    +  = help: the following other types implement trait `Add<Rhs>`:
    +            `&'a i8` implements `Add<i8>`
    +            `&i8` implements `Add<&i8>`
    +            `i8` implements `Add<&i8>`
    +            `i8` implements `Add`
    +
    +For more information about this error, try `rustc --explain E0277`.
    +error: could not compile `enums` (bin "enums") due to 1 previous error
    +
    +

    很好!事实上,错误信息意味着 Rust 不知道该如何将 Option<i8>i8 相加,因为它们的类型不同。当在 Rust 中拥有一个像 i8 这样类型的值时,编译器确保它总是有一个有效的值。我们可以自信使用而无需做空值检查。只有当使用 Option<i8>(或者任何用到的类型)的时候需要担心可能没有值,而编译器会确保我们在使用值之前处理了为空的情况。

    +

    换句话说,在对 Option<T> 进行运算之前必须将其转换为 T。通常这能帮助我们捕获到空值最常见的问题之一:假设某值不为空但实际上为空的情况。

    +

    消除了错误地假设一个非空值的风险,会让你对代码更加有信心。为了拥有一个可能为空的值,你必须要显式的将其放入对应类型的 Option<T> 中。接着,当使用这个值时,必须明确的处理值为空的情况。只要一个值不是 Option<T> 类型,你就 可以 安全的认定它的值不为空。这是 Rust 的一个经过深思熟虑的设计决策,来限制空值的泛滥以增加 Rust 代码的安全性。

    +

    那么当有一个 Option<T> 的值时,如何从 Some 成员中取出 T 的值来使用它呢?Option<T> 枚举拥有大量用于各种情况的方法:你可以查看它的文档。熟悉 Option<T> 的方法将对你的 Rust 之旅非常有用。

    +

    总的来说,为了使用 Option<T> 值,需要编写处理每个成员的代码。你想要一些代码只当拥有 Some(T) 值时运行,允许这些代码使用其中的 T。也希望一些代码只在值为 None 时运行,这些代码并没有一个可用的 T 值。match 表达式就是这么一个处理枚举的控制流结构:它会根据枚举的成员运行不同的代码,这些代码可以使用匹配到的值中的数据。

    +

    match 控制流结构

    +
    +

    ch06-02-match.md +
    +commit 3962c0224b274e2358e0acf06443af64df115359

    +
    +

    Rust 有一个叫做 match 的极为强大的控制流运算符,它允许我们将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。模式可由字面值、变量、通配符和许多其他内容构成;第十九章会涉及到所有不同种类的模式以及它们的作用。match 的力量来源于模式的表现力以及编译器检查,它确保了所有可能的情况都得到处理。

    +

    可以把 match 表达式想象成某种硬币分类器:硬币滑入有着不同大小孔洞的轨道,每一个硬币都会掉入符合它大小的孔洞。同样地,值也会通过 match 的每一个模式,并且在遇到第一个 “符合” 的模式时,值会进入相关联的代码块并在执行中被使用。

    +

    因为刚刚提到了硬币,让我们用它们来作为一个使用 match 的例子!我们可以编写一个函数来获取一个未知的硬币,并以一种类似验钞机的方式,确定它是何种硬币并返回它的美分值,如示例 6-3 中所示。

    +
    enum Coin {
    +    Penny,
    +    Nickel,
    +    Dime,
    +    Quarter,
    +}
    +
    +fn value_in_cents(coin: Coin) -> u8 {
    +    match coin {
    +        Coin::Penny => 1,
    +        Coin::Nickel => 5,
    +        Coin::Dime => 10,
    +        Coin::Quarter => 25,
    +    }
    +}
    +
    +fn main() {}
    +

    示例 6-3:一个枚举和一个以枚举成员作为模式的 match 表达式

    +

    拆开 value_in_cents 函数中的 match 来看。首先,我们列出 match 关键字后跟一个表达式,在这个例子中是 coin 的值。这看起来非常像 if 所使用的条件表达式,不过这里有一个非常大的区别:对于 if,表达式必须返回一个布尔值,而这里它可以是任何类型的。例子中的 coin 的类型是示例 6-3 中定义的 Coin 枚举。

    +

    接下来是 match 的分支。一个分支有两个部分:一个模式和一些代码。第一个分支的模式是值 Coin::Penny 而之后的 => 运算符将模式和将要运行的代码分开。这里的代码就仅仅是值 1。每一个分支之间使用逗号分隔。

    +

    match 表达式执行时,它将结果值按顺序与每一个分支的模式相比较。如果模式匹配了这个值,这个模式相关联的代码将被执行。如果模式并不匹配这个值,将继续执行下一个分支,非常类似一个硬币分类器。可以拥有任意多的分支:示例 6-3 中的 match 有四个分支。

    +

    每个分支相关联的代码是一个表达式,而表达式的结果值将作为整个 match 表达式的返回值。

    +

    如果分支代码较短的话通常不使用大括号,正如示例 6-3 中的每个分支都只是返回一个值。如果想要在分支中运行多行代码,可以使用大括号,而分支后的逗号是可选的。例如,如下代码在每次使用Coin::Penny 调用时都会打印出 “Lucky penny!”,同时仍然返回代码块最后的值,1

    +
    enum Coin {
    +    Penny,
    +    Nickel,
    +    Dime,
    +    Quarter,
    +}
    +
    +fn value_in_cents(coin: Coin) -> u8 {
    +    match coin {
    +        Coin::Penny => {
    +            println!("Lucky penny!");
    +            1
    +        }
    +        Coin::Nickel => 5,
    +        Coin::Dime => 10,
    +        Coin::Quarter => 25,
    +    }
    +}
    +
    +fn main() {}
    +

    绑定值的模式

    +

    匹配分支的另一个有用的功能是可以绑定匹配的模式的部分值。这也就是如何从枚举成员中提取值的。

    +

    作为一个例子,让我们修改枚举的一个成员来存放数据。1999 年到 2008 年间,美国在 25 美分的硬币的一侧为 50 个州的每一个都印刷了不同的设计。其他的硬币都没有这种区分州的设计,所以只有这些 25 美分硬币有特殊的价值。可以将这些信息加入我们的 enum,通过改变 Quarter 成员来包含一个 State 值,示例 6-4 中完成了这些修改:

    +
    #[derive(Debug)] // 这样可以立刻看到州的名称
    +enum UsState {
    +    Alabama,
    +    Alaska,
    +    // --snip--
    +}
    +
    +enum Coin {
    +    Penny,
    +    Nickel,
    +    Dime,
    +    Quarter(UsState),
    +}
    +
    +fn main() {}
    +

    示例 6-4:Quarter 成员也存放了一个 UsState 值的 Coin 枚举

    +

    想象一下我们的一个朋友尝试收集所有 50 个州的 25 美分硬币。在根据硬币类型分类零钱的同时,也可以报告出每个 25 美分硬币所对应的州名称,这样如果我们的朋友没有的话,他可以将其加入收藏。

    +

    在这些代码的匹配表达式中,我们在匹配 Coin::Quarter 成员的分支的模式中增加了一个叫做 state 的变量。当匹配到 Coin::Quarter 时,变量 state 将会绑定 25 美分硬币所对应州的值。接着在那个分支的代码中使用 state,如下:

    +
    #[derive(Debug)]
    +enum UsState {
    +    Alabama,
    +    Alaska,
    +    // --snip--
    +}
    +
    +enum Coin {
    +    Penny,
    +    Nickel,
    +    Dime,
    +    Quarter(UsState),
    +}
    +
    +fn value_in_cents(coin: Coin) -> u8 {
    +    match coin {
    +        Coin::Penny => 1,
    +        Coin::Nickel => 5,
    +        Coin::Dime => 10,
    +        Coin::Quarter(state) => {
    +            println!("State quarter from {state:?}!");
    +            25
    +        }
    +    }
    +}
    +
    +fn main() {
    +    value_in_cents(Coin::Quarter(UsState::Alaska));
    +}
    +

    如果调用 value_in_cents(Coin::Quarter(UsState::Alaska))coin 将是 Coin::Quarter(UsState::Alaska)。当将值与每个分支相比较时,没有分支会匹配,直到遇到 Coin::Quarter(state)。这时,state 绑定的将会是值 UsState::Alaska。接着就可以在 println! 表达式中使用这个绑定了,像这样就可以获取 Coin 枚举的 Quarter 成员中内部的州的值。

    +

    匹配 Option<T>

    +

    我们在之前的部分中使用 Option<T> 时,是为了从 Some 中取出其内部的 T 值;我们还可以像处理 Coin 枚举那样使用 match 处理 Option<T>!只不过这回比较的不再是硬币,而是 Option<T> 的成员,但 match 表达式的工作方式保持不变。

    +

    比如我们想要编写一个函数,它获取一个 Option<i32> ,如果其中含有一个值,将其加一。如果其中没有值,函数应该返回 None 值,而不尝试执行任何操作。

    +

    得益于 match,编写这个函数非常简单,它将看起来像示例 6-5 中这样:

    +
    fn main() {
    +    fn plus_one(x: Option<i32>) -> Option<i32> {
    +        match x {
    +            None => None,
    +            Some(i) => Some(i + 1),
    +        }
    +    }
    +
    +    let five = Some(5);
    +    let six = plus_one(five);
    +    let none = plus_one(None);
    +}
    +

    示例 6-5:一个在 Option<i32> 上使用 match 表达式的函数

    +

    匹配 Some(T)

    +

    让我们更仔细地检查 plus_one 的第一行操作。当调用 plus_one(five) 时,plus_one 函数体中的 x 将会是值 Some(5)。接着将其与每个分支比较。

    +
    fn main() {
    +    fn plus_one(x: Option<i32>) -> Option<i32> {
    +        match x {
    +            None => None,
    +            Some(i) => Some(i + 1),
    +        }
    +    }
    +
    +    let five = Some(5);
    +    let six = plus_one(five);
    +    let none = plus_one(None);
    +}
    +

    Some(5) 并不匹配模式 None,所以继续进行下一个分支。

    +
    fn main() {
    +    fn plus_one(x: Option<i32>) -> Option<i32> {
    +        match x {
    +            None => None,
    +            Some(i) => Some(i + 1),
    +        }
    +    }
    +
    +    let five = Some(5);
    +    let six = plus_one(five);
    +    let none = plus_one(None);
    +}
    +

    Some(5)Some(i) 匹配吗?当然匹配!它们是相同的成员。i 绑定了 Some 中包含的值,所以 i 的值是 5。接着匹配分支的代码被执行,所以我们将 i 的值加一并返回一个含有值 6 的新 Some

    +

    接着考虑下示例 6-5 中 plus_one 的第二个调用,这里 xNone。我们进入 match 并与第一个分支相比较。

    +
    fn main() {
    +    fn plus_one(x: Option<i32>) -> Option<i32> {
    +        match x {
    +            None => None,
    +            Some(i) => Some(i + 1),
    +        }
    +    }
    +
    +    let five = Some(5);
    +    let six = plus_one(five);
    +    let none = plus_one(None);
    +}
    +

    匹配上了!这里没有值来加一,所以程序结束并返回 => 右侧的值 None,因为第一个分支就匹配到了,其他的分支将不再比较。

    +

    match 与枚举相结合在很多场景中都是有用的。你会在 Rust 代码中看到很多这样的模式:match 一个枚举,绑定其中的值到一个变量,接着根据其值执行代码。这在一开始有点复杂,不过一旦习惯了,你会希望所有语言都拥有它!这一直是用户的最爱。

    +

    匹配是穷尽的

    +

    match 还有另一方面需要讨论:这些分支必须覆盖了所有的可能性。考虑一下 plus_one 函数的这个版本,它有一个 bug 并不能编译:

    +
    fn main() {
    +    fn plus_one(x: Option<i32>) -> Option<i32> {
    +        match x {
    +            Some(i) => Some(i + 1),
    +        }
    +    }
    +
    +    let five = Some(5);
    +    let six = plus_one(five);
    +    let none = plus_one(None);
    +}
    +

    我们没有处理 None 的情况,所以这些代码会造成一个 bug。幸运的是,这是一个 Rust 知道如何处理的 bug。如果尝试编译这段代码,会得到这个错误:

    +
    $ cargo run
    +   Compiling enums v0.1.0 (file:///projects/enums)
    +error[E0004]: non-exhaustive patterns: `None` not covered
    + --> src/main.rs:3:15
    +  |
    +3 |         match x {
    +  |               ^ pattern `None` not covered
    +  |
    +note: `Option<i32>` defined here
    + --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/option.rs:574:1
    + ::: /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/option.rs:578:5
    +  |
    +  = note: not covered
    +  = note: the matched value is of type `Option<i32>`
    +help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    +  |
    +4 ~             Some(i) => Some(i + 1),
    +5 ~             None => todo!(),
    +  |
    +
    +For more information about this error, try `rustc --explain E0004`.
    +error: could not compile `enums` (bin "enums") due to 1 previous error
    +
    +

    Rust 知道我们没有覆盖所有可能的情况甚至知道哪些模式被忘记了!Rust 中的匹配是 穷尽的exhaustive):必须穷举到最后的可能性来使代码有效。特别的在这个 Option<T> 的例子中,Rust 防止我们忘记明确的处理 None 的情况,这让我们免于假设拥有一个实际上为空的值,从而使之前提到的价值亿万的错误不可能发生。

    +

    通配模式和 _ 占位符

    +

    让我们看一个例子,我们希望对一些特定的值采取特殊操作,而对其他的值采取默认操作。想象我们正在玩一个游戏,如果你掷出骰子的值为 3,角色不会移动,而是会得到一顶新奇的帽子。如果你掷出了 7,你的角色将失去新奇的帽子。对于其他的数值,你的角色会在棋盘上移动相应的格子。这是一个实现了上述逻辑的 match,骰子的结果是硬编码而不是一个随机值,其他的逻辑部分使用了没有函数体的函数来表示,实现它们超出了本例的范围:

    +
    fn main() {
    +    let dice_roll = 9;
    +    match dice_roll {
    +        3 => add_fancy_hat(),
    +        7 => remove_fancy_hat(),
    +        other => move_player(other),
    +    }
    +
    +    fn add_fancy_hat() {}
    +    fn remove_fancy_hat() {}
    +    fn move_player(num_spaces: u8) {}
    +}
    +

    对于前两个分支,匹配模式是字面值 37,最后一个分支则涵盖了所有其他可能的值,模式是我们命名为 other 的一个变量。other 分支的代码通过将其传递给 move_player 函数来使用这个变量。

    +

    即使我们没有列出 u8 所有可能的值,这段代码依然能够编译,因为最后一个模式将匹配所有未被特殊列出的值。这种通配模式满足了 match 必须被穷尽的要求。请注意,我们必须将通配分支放在最后,因为模式是按顺序匹配的。如果我们在通配分支后添加其他分支,Rust 将会警告我们,因为此后的分支永远不会被匹配到。

    +

    Rust 还提供了一个模式,当我们不想使用通配模式获取的值时,请使用 _ ,这是一个特殊的模式,可以匹配任意值而不绑定到该值。这告诉 Rust 我们不会使用这个值,所以 Rust 也不会警告我们存在未使用的变量。

    +

    让我们改变游戏规则:现在,当你掷出的值不是 3 或 7 的时候,你必须再次掷出。这种情况下我们不需要使用这个值,所以我们改动代码使用 _ 来替代变量 other

    +
    fn main() {
    +    let dice_roll = 9;
    +    match dice_roll {
    +        3 => add_fancy_hat(),
    +        7 => remove_fancy_hat(),
    +        _ => reroll(),
    +    }
    +
    +    fn add_fancy_hat() {}
    +    fn remove_fancy_hat() {}
    +    fn reroll() {}
    +}
    +

    这个例子也满足穷举性要求,因为我们在最后一个分支中明确地忽略了其他的值。我们没有忘记处理任何东西。

    +

    最后,让我们再次改变游戏规则,如果你掷出 3 或 7 以外的值,你的回合将无事发生。我们可以使用单元值(在“元组类型”一节中提到的空元组)作为 _ 分支的代码:

    +
    fn main() {
    +    let dice_roll = 9;
    +    match dice_roll {
    +        3 => add_fancy_hat(),
    +        7 => remove_fancy_hat(),
    +        _ => (),
    +    }
    +
    +    fn add_fancy_hat() {}
    +    fn remove_fancy_hat() {}
    +}
    +

    在这里,我们明确告诉 Rust 我们不会使用与前面模式不匹配的值,并且这种情况下我们不想运行任何代码。

    +

    我们将在第十九章中介绍更多关于模式和匹配的内容。现在,让我们继续讨论 if let 语法,这在 match 表达式有点啰嗦的情况下很有用。

    +

    if let 简洁控制流

    +
    +

    ch06-03-if-let.md +
    +commit bb7e429ad6b59d9a0c37db7434976364cbb9c6da

    +
    +

    if let 语法让我们以一种不那么冗长的方式结合 iflet,来处理只匹配一个模式的值而忽略其他模式的情况。考虑示例 6-6 中的程序,它匹配一个 config_max 变量中的 Option<u8> 值并只希望当值为 Some 成员时执行代码:

    +
    fn main() {
    +    let config_max = Some(3u8);
    +    match config_max {
    +        Some(max) => println!("The maximum is configured to be {max}"),
    +        _ => (),
    +    }
    +}
    +

    示例 6-6:match 只关心当值为 Some 时执行代码

    +

    如果值是 Some,我们希望打印出 Some 成员中的值,这个值被绑定到模式中的 max 变量里。对于 None 值我们不希望做任何操作。为了满足 match 表达式(穷尽性)的要求,必须在处理完这唯一的成员后加上 _ => (),这样也要增加很多烦人的样板代码。

    +

    不过我们可以使用 if let 这种更短的方式编写。如下代码与示例 6-6 中的 match 行为一致:

    +
    fn main() {
    +    let config_max = Some(3u8);
    +    if let Some(max) = config_max {
    +        println!("The maximum is configured to be {max}");
    +    }
    +}
    +

    if let 语法获取通过等号分隔的一个模式和一个表达式。它的工作方式与 match 相同,这里的表达式对应 match 而模式则对应第一个分支。在这个例子中,模式是 Some(max)max 绑定为 Some 中的值。接着可以在 if let 代码块中使用 max 了,就跟在对应的 match 分支中一样。模式不匹配时 if let 块中的代码不会执行。

    +

    使用 if let 意味着编写更少代码,更少的缩进和更少的样板代码。然而,这样会失去 match 强制要求的穷尽性检查。matchif let 之间的选择依赖特定的环境以及增加简洁度和失去穷尽性检查的权衡取舍。

    +

    换句话说,可以认为 if letmatch 的一个语法糖,它当值匹配某一模式时执行代码而忽略所有其他值。

    +

    可以在 if let 中包含一个 elseelse 块中的代码与 match 表达式中的 _ 分支块中的代码相同,这样的 match 表达式就等同于 if letelse。回忆一下示例 6-4 中 Coin 枚举的定义,其 Quarter 成员也包含一个 UsState 值。如果想要计数所有不是 25 美分的硬币的同时也报告 25 美分硬币所属的州,可以使用这样一个 match 表达式:

    +
    #[derive(Debug)]
    +enum UsState {
    +    Alabama,
    +    Alaska,
    +    // --snip--
    +}
    +
    +enum Coin {
    +    Penny,
    +    Nickel,
    +    Dime,
    +    Quarter(UsState),
    +}
    +
    +fn main() {
    +    let coin = Coin::Penny;
    +    let mut count = 0;
    +    match coin {
    +        Coin::Quarter(state) => println!("State quarter from {state:?}!"),
    +        _ => count += 1,
    +    }
    +}
    +

    或者可以使用这样的 if letelse 表达式:

    +
    #[derive(Debug)]
    +enum UsState {
    +    Alabama,
    +    Alaska,
    +    // --snip--
    +}
    +
    +enum Coin {
    +    Penny,
    +    Nickel,
    +    Dime,
    +    Quarter(UsState),
    +}
    +
    +fn main() {
    +    let coin = Coin::Penny;
    +    let mut count = 0;
    +    if let Coin::Quarter(state) = coin {
    +        println!("State quarter from {state:?}!");
    +    } else {
    +        count += 1;
    +    }
    +}
    +

    如果你的程序遇到一个使用 match 表达起来过于啰嗦的逻辑,记住 if let 也在你的 Rust 工具箱中。

    +

    总结

    +

    现在我们涉及到了如何使用枚举来创建有一系列可列举值的自定义类型。我们也展示了标准库的 Option<T> 类型是如何帮助你利用类型系统来避免出错的。当枚举值包含数据时,你可以根据需要处理多少情况来选择使用 matchif let 来获取并使用这些值。

    +

    你的 Rust 程序现在能够使用结构体和枚举在自己的作用域内表现其内容了。在你的 API 中使用自定义类型保证了类型安全:编译器会确保你的函数只会得到它期望的类型的值。

    +

    为了向你的用户提供一个组织良好的 API,它使用起来很直观并且只向用户暴露他们确实需要的部分,那么现在就让我们转向 Rust 的模块系统吧。

    +

    使用包、Crate 和模块管理不断增长的项目

    +
    +

    ch07-00-managing-growing-projects-with-packages-crates-and-modules.md +
    +commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c

    +
    +

    当你编写大型程序时,组织你的代码显得尤为重要。通过对相关功能进行分组和划分不同功能的代码,你可以清楚在哪里可以找到实现了特定功能的代码,以及在哪里可以改变一个功能的工作方式。

    +

    到目前为止,我们编写的程序都在一个文件的一个模块中。伴随着项目的增长,你应该通过将代码分解为多个模块和多个文件来组织代码。一个包可以包含多个二进制 crate 项和一个可选的 crate 库。伴随着包的增长,你可以将包中的部分代码提取出来,做成独立的 crate,这些 crate 则作为外部依赖项。本章将会涵盖所有这些概念。对于一个由一系列相互关联的包组成的超大型项目,Cargo 提供了 “工作空间” 这一功能,我们将在第十四章的 “Cargo Workspaces” 对此进行讲解。

    +

    我们也会讨论封装来实现细节,这可以使你更高级地重用代码:你实现了一个操作后,其他的代码可以通过该代码的公共接口来进行调用,而不需要知道它是如何实现的。你在编写代码时可以定义哪些部分是其他代码可以使用的公共部分,以及哪些部分是你有权更改实现细节的私有部分。这是另一种减少你在脑海中记住项目内容数量的方法。

    +

    这里有一个需要说明的概念 “作用域(scope)”:代码所在的嵌套上下文有一组定义为 “in scope” 的名称。当阅读、编写和编译代码时,程序员和编译器需要知道特定位置的特定名称是否引用了变量、函数、结构体、枚举、模块、常量或者其他有意义的项。你可以创建作用域,以及改变哪些名称在作用域内还是作用域外。同一个作用域内不能拥有两个相同名称的项;可以使用一些工具来解决名称冲突。

    +

    Rust 有许多功能可以让你管理代码的组织,包括哪些内容可以被公开,哪些内容作为私有部分,以及程序每个作用域中的名字。这些功能,有时被统称为 “模块系统(the module system)”,包括:

    +
      +
    • Packages):Cargo 的一个功能,它允许你构建、测试和分享 crate。
    • +
    • Crates :一个模块的树形结构,它形成了库或二进制项目。
    • +
    • 模块Modules)和 use:允许你控制作用域和路径的私有性。
    • +
    • 路径path):一个命名例如结构体、函数或模块等项的方式。
    • +
    +

    本章将会涵盖所有这些概念,讨论它们如何交互,并说明如何使用它们来管理作用域。到最后,你会对模块系统有深入的了解,并且能够像专业人士一样使用作用域!

    +

    包和 Crate

    +
    +

    ch07-01-packages-and-crates.md +
    +commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c

    +
    +

    模块系统的第一部分,我们将介绍包和 crate。

    +

    crate 是 Rust 在编译时最小的代码单位。如果你用 rustc 而不是 cargo 来编译一个文件(第一章我们这么做过),编译器还是会将那个文件认作一个 crate。crate 可以包含模块,模块可以定义在其他文件,然后和 crate 一起编译,我们会在接下来的章节中遇到。

    +

    crate 有两种形式:二进制项和库。二进制项 可以被编译为可执行程序,比如一个命令行程序或者一个 web server。它们必须有一个 main 函数来定义当程序被执行的时候所需要做的事情。目前我们所创建的 crate 都是二进制项。

    +

    并没有 main 函数,它们也不会编译为可执行程序,它们提供一些诸如函数之类的东西,使其他项目也能使用这些东西。比如 第二章rand crate 就提供了生成随机数的东西。大多数时间 Rustaceans 说的 crate 指的都是库,这与其他编程语言中 library 概念一致。

    +

    crate root 是一个源文件,Rust 编译器以它为起始点,并构成你的 crate 的根模块(我们将在 “定义模块来控制作用域与私有性” 一节深入解读)。

    +

    package)是提供一系列功能的一个或者多个 crate。一个包会包含一个 Cargo.toml 文件,阐述如何去构建这些 crate。Cargo 就是一个包含构建你代码的二进制项的包。Cargo 也包含这些二进制项所依赖的库。其他项目也能用 Cargo 库来实现与 Cargo 命令行程序一样的逻辑。

    +

    包中可以包含至多一个库 crate(library crate)。包中可以包含任意多个二进制 crate(binary crate),但是必须至少包含一个 crate(无论是库的还是二进制的)。

    +

    让我们来看看创建包的时候会发生什么。首先,我们输入命令 cargo new

    +
    $ cargo new my-project
    +     Created binary (application) `my-project` package
    +$ ls my-project
    +Cargo.toml
    +src
    +$ ls my-project/src
    +main.rs
    +
    +

    运行了这条命令后,我们先用 ls (译者注:此命令为 Linux 平台的指令,Windows 下可用 dir)来看看 Cargo 给我们创建了什么,Cargo 会给我们的包创建一个 Cargo.toml 文件。查看 Cargo.toml 的内容,会发现并没有提到 src/main.rs,因为 Cargo 遵循的一个约定:src/main.rs 就是一个与包同名的二进制 crate 的 crate 根。同样的,Cargo 知道如果包目录中包含 src/lib.rs,则包带有与其同名的库 crate,且 src/lib.rs 是 crate 根。crate 根文件将由 Cargo 传递给 rustc 来实际构建库或者二进制项目。

    +

    在此,我们有了一个只包含 src/main.rs 的包,意味着它只含有一个名为 my-project 的二进制 crate。如果一个包同时含有 src/main.rssrc/lib.rs,则它有两个 crate:一个二进制的和一个库的,且名字都与包相同。通过将文件放在 src/bin 目录下,一个包可以拥有多个二进制 crate:每个 src/bin 下的文件都会被编译成一个独立的二进制 crate。

    +

    定义模块来控制作用域与私有性

    +
    +

    ch07-02-defining-modules-to-control-scope-and-privacy.md +
    +commit 310ea6cb0dd855eaf510c9ba05648bc5836ead0c

    +
    +

    在本节,我们将讨论模块和其它一些关于模块系统的部分,如允许你命名项的 路径paths);用来将路径引入作用域的 use 关键字;以及使项变为公有的 pub 关键字。我们还将讨论 as 关键字、外部包和 glob 运算符。现在,让我们把注意力放在模块上!

    +

    首先,我们将从一系列的规则开始,在你未来组织代码的时候,这些规则可被用作简单的参考。接下来我们将会详细的解释每条规则。

    +

    模块小抄

    +

    这里我们提供一个简单的参考,用来解释模块、路径、use关键词和pub关键词如何在编译器中工作,以及大部分开发者如何组织他们的代码。我们将在本章节中举例说明每条规则,不过这是一个解释模块工作方式的良好参考。

    +
      +
    • 从 crate 根节点开始: 当编译一个 crate, 编译器首先在 crate 根文件(通常,对于一个库 crate 而言是src/lib.rs,对于一个二进制 crate 而言是src/main.rs)中寻找需要被编译的代码。
    • +
    • 声明模块: 在 crate 根文件中,你可以声明一个新模块;比如,你用mod garden;声明了一个叫做garden的模块。编译器会在下列路径中寻找模块代码: +
        +
      • 内联,在大括号中,当mod garden后方不是一个分号而是一个大括号
      • +
      • 在文件 src/garden.rs
      • +
      • 在文件 src/garden/mod.rs
      • +
      +
    • +
    • 声明子模块: 在除了 crate 根节点以外的其他文件中,你可以定义子模块。比如,你可能在src/garden.rs中定义了mod vegetables;。编译器会在以父模块命名的目录中寻找子模块代码: +
        +
      • 内联,在大括号中,当mod vegetables后方不是一个分号而是一个大括号
      • +
      • 在文件 src/garden/vegetables.rs
      • +
      • 在文件 src/garden/vegetables/mod.rs
      • +
      +
    • +
    • 模块中的代码路径: 一旦一个模块是你 crate 的一部分,你可以在隐私规则允许的前提下,从同一个 crate 内的任意地方,通过代码路径引用该模块的代码。举例而言,一个 garden vegetables 模块下的Asparagus类型可以在crate::garden::vegetables::Asparagus被找到。
    • +
    • 私有 vs 公用: 一个模块里的代码默认对其父模块私有。为了使一个模块公用,应当在声明时使用pub mod替代mod。为了使一个公用模块内部的成员公用,应当在声明前使用pub
    • +
    • use 关键字: 在一个作用域内,use关键字创建了一个成员的快捷方式,用来减少长路径的重复。在任何可以引用crate::garden::vegetables::Asparagus的作用域,你可以通过 use crate::garden::vegetables::Asparagus;创建一个快捷方式,然后你就可以在作用域中只写Asparagus来使用该类型。
    • +
    +

    这里我们创建一个名为backyard的二进制 crate 来说明这些规则。该 crate 的路径同样命名为backyard,该路径包含了这些文件和目录:

    +
    backyard
    +├── Cargo.lock
    +├── Cargo.toml
    +└── src
    +    ├── garden
    +    │   └── vegetables.rs
    +    ├── garden.rs
    +    └── main.rs
    +
    +

    这个例子中的 crate 根文件是src/main.rs,该文件包括了:

    +

    文件名:src/main.rs

    +
    use crate::garden::vegetables::Asparagus;
    +
    +pub mod garden;
    +
    +fn main() {
    +    let plant = Asparagus {};
    +    println!("I'm growing {plant:?}!");
    +}
    +

    pub mod garden;行告诉编译器应该包含在src/garden.rs文件中发现的代码:

    +

    文件名:src/garden.rs

    +
    pub mod vegetables;
    +

    在此处, pub mod vegetables;意味着在src/garden/vegetables.rs中的代码也应该被包括。这些代码是:

    +
    #[derive(Debug)]
    +pub struct Asparagus {}
    +

    现在让我们深入了解这些规则的细节并在实际中演示它们!

    +

    在模块中对相关代码进行分组

    +

    模块 让我们可以将一个 crate 中的代码进行分组,以提高可读性与重用性。因为一个模块中的代码默认是私有的,所以还可以利用模块控制项的 私有性。私有项是不可为外部使用的内在详细实现。我们也可以将模块和它其中的项标记为公开的,这样,外部代码就可以使用并依赖于它们。

    +

    在餐饮业,餐馆中会有一些地方被称之为 前台front of house),还有另外一些地方被称之为 后台back of house)。前台是招待顾客的地方,在这里,店主可以为顾客安排座位,服务员接受顾客下单和付款,调酒师会制作饮品。后台则是由厨师工作的厨房,洗碗工的工作地点,以及经理做行政工作的地方组成。

    +

    我们可以将函数放置到嵌套的模块中,来使我们的 crate 结构与实际的餐厅结构相同。通过执行 cargo new --lib restaurant,来创建一个新的名为 restaurant 的库。然后将示例 7-1 中所罗列出来的代码放入 src/lib.rs 中,来定义一些模块和函数。

    +

    文件名:src/lib.rs

    +
    mod front_of_house {
    +    mod hosting {
    +        fn add_to_waitlist() {}
    +
    +        fn seat_at_table() {}
    +    }
    +
    +    mod serving {
    +        fn take_order() {}
    +
    +        fn serve_order() {}
    +
    +        fn take_payment() {}
    +    }
    +}
    +

    示例 7-1:一个包含了其他内置了函数的模块的 front_of_house 模块

    +

    我们定义一个模块,是以 mod 关键字为起始,然后指定模块的名字(本例中叫做 front_of_house),并且用花括号包围模块的主体。在模块内,我们还可以定义其他的模块,就像本例中的 hostingserving 模块。模块还可以保存一些定义的其他项,比如结构体、枚举、常量、特性、或者函数。

    +

    通过使用模块,我们可以将相关的定义分组到一起,并指出它们为什么相关。程序员可以通过使用这段代码,更加容易地找到他们想要的定义,因为他们可以基于分组来对代码进行导航,而不需要阅读所有的定义。程序员向这段代码中添加一个新的功能时,他们也会知道代码应该放置在何处,可以保持程序的组织性。

    +

    在前面我们提到了,src/main.rssrc/lib.rs 叫做 crate 根。之所以这样叫它们是因为这两个文件的内容都分别在 crate 模块结构的根组成了一个名为 crate 的模块,该结构被称为 模块树module tree)。

    +

    示例 7-2 展示了示例 7-1 中的模块树的结构。

    +
    crate
    + └── front_of_house
    +     ├── hosting
    +     │   ├── add_to_waitlist
    +     │   └── seat_at_table
    +     └── serving
    +         ├── take_order
    +         ├── serve_order
    +         └── take_payment
    +
    +

    示例 7-2: 示例 7-1 中代码的模块树

    +

    这个树展示了一些模块是如何被嵌入到另一个模块的(例如,hosting 嵌套在 front_of_house 中)。这个树还展示了一些模块是互为 兄弟siblings)的,这意味着它们定义在同一模块中(hostingserving 被一起定义在 front_of_house 中)。继续沿用家庭关系的比喻,如果一个模块 A 被包含在模块 B 中,我们将模块 A 称为模块 B 的 child),模块 B 则是模块 A 的 parent)。注意,整个模块树都植根于名为 crate 的隐式模块下。

    +

    这个模块树可能会令你想起电脑上文件系统的目录树;这是一个非常恰当的类比!就像文件系统的目录,你可以使用模块来组织你的代码。并且,就像目录中的文件,我们需要一种方法来找到模块。

    +

    引用模块项目的路径

    +
    +

    ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md +
    +commit 2b4565662d1a7973d870744a923f58f8f7dcce91

    +
    +

    来看一下 Rust 如何在模块树中找到一个项的位置,我们使用路径的方式,就像在文件系统使用路径一样。为了调用一个函数,我们需要知道它的路径。

    +

    路径有两种形式:

    +
      +
    • 绝对路径absolute path)是以 crate 根(root)开头的全路径;对于外部 crate 的代码,是以 crate 名开头的绝对路径,对于当前 crate 的代码,则以字面值 crate 开头。
    • +
    • 相对路径relative path)从当前模块开始,以 selfsuper 或定义在当前模块中的标识符开头。
    • +
    +

    绝对路径和相对路径都后跟一个或多个由双冒号(::)分割的标识符。

    +

    回到示例 7-1,假设我们希望调用 add_to_waitlist 函数。还是同样的问题,add_to_waitlist 函数的路径是什么?在示例 7-3 中删除了一些模块和函数。

    +

    我们在 crate 根定义了一个新函数 eat_at_restaurant,并在其中展示调用 add_to_waitlist 函数的两种方法。eat_at_restaurant 函数是我们 crate 库的一个公共 API,所以我们使用 pub 关键字来标记它。在 “使用 pub 关键字暴露路径” 一节,我们将详细介绍 pub。注意,这个例子无法编译通过,我们稍后会解释原因。

    +

    文件名:src/lib.rs

    +
    mod front_of_house {
    +    mod hosting {
    +        fn add_to_waitlist() {}
    +    }
    +}
    +
    +pub fn eat_at_restaurant() {
    +    // 绝对路径
    +    crate::front_of_house::hosting::add_to_waitlist();
    +
    +    // 相对路径
    +    front_of_house::hosting::add_to_waitlist();
    +}
    +

    示例 7-3: 使用绝对路径和相对路径来调用 add_to_waitlist 函数

    +

    第一种方式,我们在 eat_at_restaurant 中调用 add_to_waitlist 函数,使用的是绝对路径。add_to_waitlist 函数与 eat_at_restaurant 被定义在同一 crate 中,这意味着我们可以使用 crate 关键字为起始的绝对路径。

    +

    crate 后面,我们持续地嵌入模块,直到我们找到 add_to_waitlist。你可以想象出一个相同结构的文件系统,我们通过指定路径 /front_of_house/hosting/add_to_waitlist 来执行 add_to_waitlist 程序。我们使用 crate 从 crate 根开始就类似于在 shell 中使用 / 从文件系统根开始。

    +

    第二种方式,我们在 eat_at_restaurant 中调用 add_to_waitlist,使用的是相对路径。这个路径以 front_of_house 为起始,这个模块在模块树中,与 eat_at_restaurant 定义在同一层级。与之等价的文件系统路径就是 front_of_house/hosting/add_to_waitlist。以模块名开头意味着该路径是相对路径。

    +

    选择使用相对路径还是绝对路径,要取决于你的项目,也取决于你是更倾向于将项的定义代码与使用该项的代码分开来移动,还是一起移动。举一个例子,如果我们要将 front_of_house 模块和 eat_at_restaurant 函数一起移动到一个名为 customer_experience 的模块中,我们需要更新 add_to_waitlist 的绝对路径,但是相对路径还是可用的。然而,如果我们要将 eat_at_restaurant 函数单独移到一个名为 dining 的模块中,还是可以使用原本的绝对路径来调用 add_to_waitlist,但是相对路径必须要更新。我们更倾向于使用绝对路径,因为把代码定义和项调用各自独立地移动是更常见的。

    +

    让我们试着编译一下示例 7-3,并查明为何不能编译!示例 7-4 展示了这个错误。

    +
    $ cargo build
    +   Compiling restaurant v0.1.0 (file:///projects/restaurant)
    +error[E0603]: module `hosting` is private
    + --> src/lib.rs:9:28
    +  |
    +9 |     crate::front_of_house::hosting::add_to_waitlist();
    +  |                            ^^^^^^^  --------------- function `add_to_waitlist` is not publicly re-exported
    +  |                            |
    +  |                            private module
    +  |
    +note: the module `hosting` is defined here
    + --> src/lib.rs:2:5
    +  |
    +2 |     mod hosting {
    +  |     ^^^^^^^^^^^
    +
    +error[E0603]: module `hosting` is private
    +  --> src/lib.rs:12:21
    +   |
    +12 |     front_of_house::hosting::add_to_waitlist();
    +   |                     ^^^^^^^  --------------- function `add_to_waitlist` is not publicly re-exported
    +   |                     |
    +   |                     private module
    +   |
    +note: the module `hosting` is defined here
    +  --> src/lib.rs:2:5
    +   |
    +2  |     mod hosting {
    +   |     ^^^^^^^^^^^
    +
    +For more information about this error, try `rustc --explain E0603`.
    +error: could not compile `restaurant` (lib) due to 2 previous errors
    +
    +

    示例 7-4: 构建示例 7-3 出现的编译器错误

    +

    错误信息说 hosting 模块是私有的。换句话说,我们拥有 hosting 模块和 add_to_waitlist 函数的正确路径,但是 Rust 不让我们使用,因为它不能访问私有片段。在 Rust 中,默认所有项(函数、方法、结构体、枚举、模块和常量)对父模块都是私有的。如果希望创建一个私有函数或结构体,你可以将其放入一个模块。

    +

    父模块中的项不能使用子模块中的私有项,但是子模块中的项可以使用它们父模块中的项。这是因为子模块封装并隐藏了它们的实现详情,但是子模块可以看到它们定义的上下文。继续拿餐馆作比喻,把私有性规则想象成餐馆的后台办公室:餐馆内的事务对餐厅顾客来说是不可知的,但办公室经理可以洞悉其经营的餐厅并在其中做任何事情。

    +

    Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你就知道可以更改内部代码的哪些部分而不会破坏外部代码。不过 Rust 也确实提供了通过使用 pub 关键字来创建公共项,使子模块的内部部分暴露给上级模块。

    +

    使用 pub 关键字暴露路径

    +

    让我们回头看一下示例 7-4 的错误,它告诉我们 hosting 模块是私有的。我们想让父模块中的 eat_at_restaurant 函数可以访问子模块中的 add_to_waitlist 函数,因此我们使用 pub 关键字来标记 hosting 模块,如示例 7-5 所示。

    +

    文件名:src/lib.rs

    +
    mod front_of_house {
    +    pub mod hosting {
    +        fn add_to_waitlist() {}
    +    }
    +}
    +
    +pub fn eat_at_restaurant() {
    +    // 绝对路径
    +    crate::front_of_house::hosting::add_to_waitlist();
    +
    +    // 相对路径
    +    front_of_house::hosting::add_to_waitlist();
    +}
    +

    示例 7-5: 使用 pub 关键字声明 hosting 模块使其可在 eat_at_restaurant 使用

    +

    不幸的是,示例 7-5 的代码编译仍然有错误,如示例 7-6 所示。

    +
    $ cargo build
    +   Compiling restaurant v0.1.0 (file:///projects/restaurant)
    +error[E0603]: function `add_to_waitlist` is private
    + --> src/lib.rs:9:37
    +  |
    +9 |     crate::front_of_house::hosting::add_to_waitlist();
    +  |                                     ^^^^^^^^^^^^^^^ private function
    +  |
    +note: the function `add_to_waitlist` is defined here
    + --> src/lib.rs:3:9
    +  |
    +3 |         fn add_to_waitlist() {}
    +  |         ^^^^^^^^^^^^^^^^^^^^
    +
    +error[E0603]: function `add_to_waitlist` is private
    +  --> src/lib.rs:12:30
    +   |
    +12 |     front_of_house::hosting::add_to_waitlist();
    +   |                              ^^^^^^^^^^^^^^^ private function
    +   |
    +note: the function `add_to_waitlist` is defined here
    +  --> src/lib.rs:3:9
    +   |
    +3  |         fn add_to_waitlist() {}
    +   |         ^^^^^^^^^^^^^^^^^^^^
    +
    +For more information about this error, try `rustc --explain E0603`.
    +error: could not compile `restaurant` (lib) due to 2 previous errors
    +
    +

    示例 7-6: 构建示例 7-5 出现的编译器错误

    +

    发生了什么?在 mod hosting 前添加了 pub 关键字,使其变成公有的。伴随着这种变化,如果我们可以访问 front_of_house,那我们也可以访问 hosting。但是 hosting内容contents)仍然是私有的;这表明使模块公有并不使其内容也是公有的。模块上的 pub 关键字只允许其父模块引用它,而不允许访问内部代码。因为模块是一个容器,只是将模块变为公有能做的其实并不太多;同时需要更深入地选择将一个或多个项变为公有。

    +

    示例 7-6 中的错误说,add_to_waitlist 函数是私有的。私有性规则不但应用于模块,还应用于结构体、枚举、函数和方法。

    +

    让我们继续将 pub 关键字放置在 add_to_waitlist 函数的定义之前,使其变成公有。如示例 7-7 所示。

    +

    文件名:src/lib.rs

    +
    mod front_of_house {
    +    pub mod hosting {
    +        pub fn add_to_waitlist() {}
    +    }
    +}
    +
    +pub fn eat_at_restaurant() {
    +    // 绝对路径
    +    crate::front_of_house::hosting::add_to_waitlist();
    +
    +    // 相对路径
    +    front_of_house::hosting::add_to_waitlist();
    +}
    +

    示例 7-7: 为 mod hosting +和 fn add_to_waitlist 添加 pub 关键字使它们可以在 +eat_at_restaurant 函数中被调用

    +

    现在代码可以编译通过了!为了了解为何增加 pub 关键字使得我们可以在 add_to_waitlist 中调用这些路径与私有性规则有关,让我们看看绝对路径和相对路径。

    +

    在绝对路径,我们从 crate 也就是 crate 根开始。crate 根中定义了 front_of_house 模块。虽然 front_of_house 模块不是公有的,不过因为 eat_at_restaurant 函数与 front_of_house 定义于同一模块中(即,eat_at_restaurantfront_of_house 是兄弟),我们可以从 eat_at_restaurant 中引用 front_of_house。接下来是使用 pub 标记的 hosting 模块。我们可以访问 hosting 的父模块,所以可以访问 hosting。最后,add_to_waitlist 函数被标记为 pub ,我们可以访问其父模块,所以这个函数调用是有效的!

    +

    在相对路径,其逻辑与绝对路径相同,除了第一步:不同于从 crate 根开始,路径从 front_of_house 开始。front_of_house 模块与 eat_at_restaurant 定义于同一模块,所以从 eat_at_restaurant 中开始定义的该模块相对路径是有效的。接下来因为 hostingadd_to_waitlist 被标记为 pub,路径其余的部分也是有效的,因此函数调用也是有效的!

    +

    如果你计划共享你的库 crate 以便其它项目可以使用你的代码,公有 API 将是决定 crate 用户如何与你代码交互的契约。关于管理公有 API 的修改以便被人更容易依赖你的库有着很多考量。这些考量超出了本书的范畴;如果你对这些话题感兴趣,请查阅 The Rust API Guidelines

    +
    +

    二进制和库 crate 包的最佳实践

    +

    我们提到过包(package)可以同时包含一个 src/main.rs 二进制 crate 根和一个 src/lib.rs 库 crate 根,并且这两个 crate 默认以包名来命名。通常,这种包含二进制 crate 和库 crate 的模式的包,在二进制 crate 中只保留足以生成一个可执行文件的代码,并由可执行文件调用库 crate 的代码。又因为库 crate 可以共享,这使得其它项目从包提供的大部分功能中受益。

    +

    模块树应该定义在 src/lib.rs 中。这样通过以包名开头的路径,公有项就可以在二进制 crate 中使用。二进制 crate 就变得同其它在该 crate 之外的、使用库 crate 的用户一样:二者都只能使用公有 API。这有助于你设计一个好的 API;你不仅仅是作者,也是用户!

    +

    第十二章我们会通过一个同时包含二进制 crate 和库 crate 的命令行程序来展示这些包组织上的实践。

    +
    +

    super 开始的相对路径

    +

    我们可以通过在路径的开头使用 super ,从父模块开始构建相对路径,而不是从当前模块或者 crate 根开始。这类似以 .. 语法开始一个文件系统路径。使用 super 允许我们引用父模块中的已知项,这使得重新组织模块树变得更容易 —— 当模块与父模块关联的很紧密,但某天父模块可能要移动到模块树的其它位置。

    +

    考虑一下示例 7-8 中的代码,它模拟了厨师更正了一个错误订单,并亲自将其提供给客户的情况。back_of_house 模块中的定义的 fix_incorrect_order 函数通过指定的 super 起始的 deliver_order 路径,来调用父模块中的 deliver_order 函数:

    +

    文件名:src/lib.rs

    +
    fn deliver_order() {}
    +
    +mod back_of_house {
    +    fn fix_incorrect_order() {
    +        cook_order();
    +        super::deliver_order();
    +    }
    +
    +    fn cook_order() {}
    +}
    +

    示例 7-8: 使用以 super 开头的相对路径从父目录开始调用函数

    +

    fix_incorrect_order 函数在 back_of_house 模块中,所以我们可以使用 super 进入 back_of_house 父模块,也就是本例中的 crate 根。在这里,我们可以找到 deliver_order。成功!我们认为 back_of_house 模块和 deliver_order 函数之间可能具有某种关联关系,并且,如果我们要重新组织这个 crate 的模块树,需要一起移动它们。因此,我们使用 super,这样一来,如果这些代码被移动到了其他模块,我们只需要更新很少的代码。

    +

    创建公有的结构体和枚举

    +

    我们还可以使用 pub 来设计公有的结构体和枚举,不过关于在结构体和枚举上使用 pub 还有一些额外的细节需要注意。如果我们在一个结构体定义的前面使用了 pub ,这个结构体会变成公有的,但是这个结构体的字段仍然是私有的。我们可以根据情况决定每个字段是否公有。在示例 7-9 中,我们定义了一个公有结构体 back_of_house:Breakfast,其中有一个公有字段 toast 和私有字段 seasonal_fruit。这个例子模拟的情况是,在一家餐馆中,顾客可以选择随餐附赠的面包类型,但是厨师会根据季节和库存情况来决定随餐搭配的水果。餐馆可用的水果变化是很快的,所以顾客不能选择水果,甚至无法看到他们将会得到什么水果。

    +

    文件名:src/lib.rs

    +
    mod back_of_house {
    +    pub struct Breakfast {
    +        pub toast: String,
    +        seasonal_fruit: String,
    +    }
    +
    +    impl Breakfast {
    +        pub fn summer(toast: &str) -> Breakfast {
    +            Breakfast {
    +                toast: String::from(toast),
    +                seasonal_fruit: String::from("peaches"),
    +            }
    +        }
    +    }
    +}
    +
    +pub fn eat_at_restaurant() {
    +    // 在夏天订购一个黑麦土司作为早餐
    +    let mut meal = back_of_house::Breakfast::summer("Rye");
    +    // 改变主意更换想要面包的类型
    +    meal.toast = String::from("Wheat");
    +    println!("I'd like {} toast please", meal.toast);
    +
    +    // 如果取消下一行的注释代码不能编译;
    +    // 不允许查看或修改早餐附带的季节水果
    +    // meal.seasonal_fruit = String::from("blueberries");
    +}
    +

    示例 7-9: 带有公有和私有字段的结构体

    +

    因为 back_of_house::Breakfast 结构体的 toast 字段是公有的,所以我们可以在 eat_at_restaurant 中使用点号来随意的读写 toast 字段。注意,我们不能在 eat_at_restaurant 中使用 seasonal_fruit 字段,因为 seasonal_fruit 是私有的。尝试去除那一行修改 seasonal_fruit 字段值的代码的注释,看看你会得到什么错误!

    +

    还请注意一点,因为 back_of_house::Breakfast 具有私有字段,所以这个结构体需要提供一个公共的关联函数来构造 Breakfast 的实例 (这里我们命名为 summer)。如果 Breakfast 没有这样的函数,我们将无法在 eat_at_restaurant 中创建 Breakfast 实例,因为我们不能在 eat_at_restaurant 中设置私有字段 seasonal_fruit 的值。

    +

    与之相反,如果我们将枚举设为公有,则它的所有成员都将变为公有。我们只需要在 enum 关键字前面加上 pub,就像示例 7-10 展示的那样。

    +

    文件名:src/lib.rs

    +
    mod back_of_house {
    +    pub enum Appetizer {
    +        Soup,
    +        Salad,
    +    }
    +}
    +
    +pub fn eat_at_restaurant() {
    +    let order1 = back_of_house::Appetizer::Soup;
    +    let order2 = back_of_house::Appetizer::Salad;
    +}
    +

    示例 7-10: 设计公有枚举,使其所有成员公有

    +

    因为我们创建了名为 Appetizer 的公有枚举,所以我们可以在 eat_at_restaurant 中使用 SoupSalad 成员。

    +

    如果枚举成员不是公有的,那么枚举会显得用处不大;给枚举的所有成员挨个添加 pub 是很令人恼火的,因此枚举成员默认就是公有的。结构体通常使用时,不必将它们的字段公有化,因此结构体遵循常规,内容全部是私有的,除非使用 pub 关键字。

    +

    还有一种使用 pub 的场景我们还没有涉及到,那就是我们最后要讲的模块功能:use 关键字。我们将先单独介绍 use,然后展示如何结合使用 pubuse

    +

    使用 use 关键字将路径引入作用域

    +
    +

    ch07-04-bringing-paths-into-scope-with-the-use-keyword.md +
    +commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c

    +
    +

    不得不编写路径来调用函数显得不便且重复。在示例 7-7 中,无论我们选择 add_to_waitlist 函数的绝对路径还是相对路径,每次我们想要调用 add_to_waitlist 时,都必须指定front_of_househosting。幸运的是,有一种方法可以简化这个过程。我们可以使用 use 关键字创建一个短路径,然后就可以在作用域中的任何地方使用这个更短的名字。

    +

    在示例 7-11 中,我们将 crate::front_of_house::hosting 模块引入了 eat_at_restaurant 函数的作用域,而我们只需要指定 hosting::add_to_waitlist 即可在 eat_at_restaurant 中调用 add_to_waitlist 函数。

    +

    文件名:src/lib.rs

    +
    mod front_of_house {
    +    pub mod hosting {
    +        pub fn add_to_waitlist() {}
    +    }
    +}
    +
    +use crate::front_of_house::hosting;
    +
    +pub fn eat_at_restaurant() {
    +    hosting::add_to_waitlist();
    +}
    +

    示例 7-11: 使用 use 将模块引入作用域

    +

    在作用域中增加 use 和路径类似于在文件系统中创建软连接(符号连接,symbolic link)。通过在 crate 根增加 use crate::front_of_house::hosting,现在 hosting 在作用域中就是有效的名称了,如同 hosting 模块被定义于 crate 根一样。通过 use 引入作用域的路径也会检查私有性,同其它路径一样。

    +

    注意 use 只能创建 use 所在的特定作用域内的短路径。示例 7-12 将 eat_at_restaurant 函数移动到了一个叫 customer 的子模块,这又是一个不同于 use 语句的作用域,所以函数体不能编译。

    +

    文件名:src/lib.rs

    +
    mod front_of_house {
    +    pub mod hosting {
    +        pub fn add_to_waitlist() {}
    +    }
    +}
    +
    +use crate::front_of_house::hosting;
    +
    +mod customer {
    +    pub fn eat_at_restaurant() {
    +        hosting::add_to_waitlist();
    +    }
    +}
    +

    示例 7-12: use 语句只适用于其所在的作用域

    +

    编译器错误显示短路径不再适用于 customer 模块中:

    +
    $ cargo build
    +   Compiling restaurant v0.1.0 (file:///projects/restaurant)
    +error[E0433]: failed to resolve: use of undeclared crate or module `hosting`
    +  --> src/lib.rs:11:9
    +   |
    +11 |         hosting::add_to_waitlist();
    +   |         ^^^^^^^ use of undeclared crate or module `hosting`
    +   |
    +help: consider importing this module through its public re-export
    +   |
    +10 +     use crate::hosting;
    +   |
    +
    +warning: unused import: `crate::front_of_house::hosting`
    + --> src/lib.rs:7:5
    +  |
    +7 | use crate::front_of_house::hosting;
    +  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    +  |
    +  = note: `#[warn(unused_imports)]` on by default
    +
    +For more information about this error, try `rustc --explain E0433`.
    +warning: `restaurant` (lib) generated 1 warning
    +error: could not compile `restaurant` (lib) due to 1 previous error; 1 warning emitted
    +
    +

    注意这里还有一个警告说 use 在其作用域内不再被使用!为了修复这个问题,可以将 use 移动到 customer 模块内,或者在子模块 customer 内通过 super::hosting 引用父模块中的这个短路径。

    +

    创建惯用的 use 路径

    +

    在示例 7-11 中,你可能会比较疑惑,为什么我们是指定 use crate::front_of_house::hosting ,然后在 eat_at_restaurant 中调用 hosting::add_to_waitlist ,而不是通过指定一直到 add_to_waitlist 函数的 use 路径来得到相同的结果,如示例 7-13 所示。

    +

    文件名:src/lib.rs

    +
    mod front_of_house {
    +    pub mod hosting {
    +        pub fn add_to_waitlist() {}
    +    }
    +}
    +
    +use crate::front_of_house::hosting::add_to_waitlist;
    +
    +pub fn eat_at_restaurant() {
    +    add_to_waitlist();
    +}
    +

    示例 7-13: 使用 useadd_to_waitlist 函数引入作用域,这并不符合习惯

    +

    虽然示例 7-11 和 7-13 都完成了相同的任务,但示例 7-11 是使用 use 将函数引入作用域的习惯用法。要想使用 use 将函数的父模块引入作用域,我们必须在调用函数时指定父模块,这样可以清晰地表明函数不是在本地定义的,同时使完整路径的重复度最小化。示例 7-13 中的代码不清楚 add_to_waitlist 是在哪里被定义的。

    +

    另一方面,使用 use 引入结构体、枚举和其他项时,习惯是指定它们的完整路径。示例 7-14 展示了将 HashMap 结构体引入二进制 crate 作用域的习惯用法。

    +

    文件名:src/main.rs

    +
    use std::collections::HashMap;
    +
    +fn main() {
    +    let mut map = HashMap::new();
    +    map.insert(1, 2);
    +}
    +

    示例 7-14: 将 HashMap 引入作用域的习惯用法

    +

    这种习惯用法背后没有什么硬性要求:它只是一种惯例,人们已经习惯了以这种方式阅读和编写 Rust 代码。

    +

    这个习惯用法有一个例外,那就是我们想使用 use 语句将两个具有相同名称的项带入作用域,因为 Rust 不允许这样做。示例 7-15 展示了如何将两个具有相同名称但不同父模块的 Result 类型引入作用域,以及如何引用它们。

    +

    文件名:src/lib.rs

    +
    use std::fmt;
    +use std::io;
    +
    +fn function1() -> fmt::Result {
    +    // --snip--
    +    Ok(())
    +}
    +
    +fn function2() -> io::Result<()> {
    +    // --snip--
    +    Ok(())
    +}
    +

    示例 7-15: 使用父模块将两个具有相同名称的类型引入同一作用域

    +

    如你所见,使用父模块可以区分这两个 Result 类型。如果我们是指定 use std::fmt::Resultuse std::io::Result,我们将在同一作用域拥有了两个 Result 类型,当我们使用 Result 时,Rust 则不知道我们要用的是哪个。

    +

    使用 as 关键字提供新的名称

    +

    使用 use 将两个同名类型引入同一作用域这个问题还有另一个解决办法:在这个类型的路径后面,我们使用 as 指定一个新的本地名称或者别名。示例 7-16 展示了另一个编写示例 7-15 中代码的方法,通过 as 重命名其中一个 Result 类型。

    +

    文件名:src/lib.rs

    +
    use std::fmt::Result;
    +use std::io::Result as IoResult;
    +
    +fn function1() -> Result {
    +    // --snip--
    +    Ok(())
    +}
    +
    +fn function2() -> IoResult<()> {
    +    // --snip--
    +    Ok(())
    +}
    +

    示例 7-16: 使用 as 关键字重命名引入作用域的类型

    +

    在第二个 use 语句中,我们选择 IoResult 作为 std::io::Result 的新名称,它与从 std::fmt 引入作用域的 Result 并不冲突。示例 7-15 和示例 7-16 都是惯用的,如何选择都取决于你!

    +

    使用 pub use 重导出名称

    +

    使用 use 关键字,将某个名称导入当前作用域后,这个名称在此作用域中就可以使用了,但它对此作用域之外还是私有的。如果想让其他人调用我们的代码时,也能够正常使用这个名称,就好像它本来就在当前作用域一样,那我们可以将 pubuse 合起来使用。这种技术被称为 “重导出re-exporting)”:我们不仅将一个名称导入了当前作用域,还允许别人把它导入他们自己的作用域。

    +

    示例 7-17 将示例 7-11 根模块中的 use 改为 pub use

    +

    文件名:src/lib.rs

    +
    mod front_of_house {
    +    pub mod hosting {
    +        pub fn add_to_waitlist() {}
    +    }
    +}
    +
    +pub use crate::front_of_house::hosting;
    +
    +pub fn eat_at_restaurant() {
    +    hosting::add_to_waitlist();
    +}
    +

    示例 7-17: 通过 pub use 使名称可从新作用域中被导入至任何代码

    +

    在这个修改之前,外部代码需要使用路径 restaurant::front_of_house::hosting::add_to_waitlist() 来调用 add_to_waitlist 函数。现在这个 pub use 从根模块重导出了 hosting 模块,外部代码现在可以使用路径 restaurant::hosting::add_to_waitlist

    +

    当你代码的内部结构与调用你代码的程序员所想象的结构不同时,重导出会很有用。例如,在这个餐馆的比喻中,经营餐馆的人会想到“前台”和“后台”。但顾客在光顾一家餐馆时,可能不会以这些术语来考虑餐馆的各个部分。使用 pub use,我们可以使用一种结构编写代码,却将不同的结构形式暴露出来。这样做使我们的库井井有条,也使开发这个库的程序员和调用这个库的程序员都更加方便。在“使用 pub use 导出合适的公有 API”部分让我们再看另一个 pub use 的例子来了解这如何影响 crate 的文档。

    +

    使用外部包

    +

    在第二章中我们编写了一个猜猜看游戏。那个项目使用了一个外部包,rand,来生成随机数。为了在项目中使用 rand,在 Cargo.toml 中加入了如下行:

    +

    文件名:Cargo.toml

    +
    rand = "0.8.5"
    +
    +

    Cargo.toml 中加入 rand 依赖告诉了 Cargo 要从 crates.io 下载 rand 和其依赖,并使其可在项目代码中使用。

    +

    接着,为了将 rand 定义引入项目包的作用域,我们加入一行 use 起始的包名,它以 rand 包名开头并列出了需要引入作用域的项。回忆一下第二章的 “生成一个随机数” 部分,我们曾将 Rng trait 引入作用域并调用了 rand::thread_rng 函数:

    +
    use std::io;
    +use rand::Rng;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    let secret_number = rand::thread_rng().gen_range(1..=100);
    +
    +    println!("The secret number is: {secret_number}");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    println!("You guessed: {guess}");
    +}
    +

    crates.io 上有很多 Rust 社区成员发布的包,将其引入你自己的项目都需要一道相同的步骤:在 Cargo.toml 列出它们并通过 use 将其中定义的项引入项目包的作用域中。

    +

    注意 std 标准库对于你的包来说也是外部 crate。因为标准库随 Rust 语言一同分发,无需修改 Cargo.toml 来引入 std,不过需要通过 use 将标准库中定义的项引入项目包的作用域中来引用它们,比如我们使用的 HashMap

    +
    #![allow(unused)]
    +fn main() {
    +use std::collections::HashMap;
    +}
    +

    这是一个以标准库 crate 名 std 开头的绝对路径。

    +

    嵌套路径来消除大量的 use

    +

    当需要引入很多定义于相同包或相同模块的项时,为每一项单独列出一行会占用源码很大的空间。例如猜猜看章节示例 2-4 中有两行 use 语句都从 std 引入项到作用域:

    +

    文件名:src/main.rs

    +
    use rand::Rng;
    +// --snip--
    +use std::cmp::Ordering;
    +use std::io;
    +// --snip--
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    let secret_number = rand::thread_rng().gen_range(1..=100);
    +
    +    println!("The secret number is: {secret_number}");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    println!("You guessed: {guess}");
    +
    +    match guess.cmp(&secret_number) {
    +        Ordering::Less => println!("Too small!"),
    +        Ordering::Greater => println!("Too big!"),
    +        Ordering::Equal => println!("You win!"),
    +    }
    +}
    +

    相反,我们可以使用嵌套路径将相同的项在一行中引入作用域。这么做需要指定路径的相同部分,接着是两个冒号,接着是大括号中的各自不同的路径部分,如示例 7-18 所示。

    +

    文件名:src/main.rs

    +
    use rand::Rng;
    +// --snip--
    +use std::{cmp::Ordering, io};
    +// --snip--
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    let secret_number = rand::thread_rng().gen_range(1..=100);
    +
    +    println!("The secret number is: {secret_number}");
    +
    +    println!("Please input your guess.");
    +
    +    let mut guess = String::new();
    +
    +    io::stdin()
    +        .read_line(&mut guess)
    +        .expect("Failed to read line");
    +
    +    let guess: u32 = guess.trim().parse().expect("Please type a number!");
    +
    +    println!("You guessed: {guess}");
    +
    +    match guess.cmp(&secret_number) {
    +        Ordering::Less => println!("Too small!"),
    +        Ordering::Greater => println!("Too big!"),
    +        Ordering::Equal => println!("You win!"),
    +    }
    +}
    +

    示例 7-18: 指定嵌套的路径在一行中将多个带有相同前缀的项引入作用域

    +

    在较大的程序中,使用嵌套路径从相同包或模块中引入很多项,可以显著减少所需的独立 use 语句的数量!

    +

    我们可以在路径的任何层级使用嵌套路径,这在组合两个共享子路径的 use 语句时非常有用。例如,示例 7-19 中展示了两个 use 语句:一个将 std::io 引入作用域,另一个将 std::io::Write 引入作用域:

    +

    文件名:src/lib.rs

    +
    use std::io;
    +use std::io::Write;
    +

    示例 7-19: 通过两行 use 语句引入两个路径,其中一个是另一个的子路径

    +

    两个路径的相同部分是 std::io,这正是第一个路径。为了在一行 use 语句中引入这两个路径,可以在嵌套路径中使用 self,如示例 7-20 所示。

    +

    文件名:src/lib.rs

    +
    use std::io::{self, Write};
    +

    示例 7-20: 将示例 7-19 中部分重复的路径合并为一个 use 语句

    +

    这一行便将 std::iostd::io::Write 同时引入作用域。

    +

    通过 glob 运算符将所有的公有定义引入作用域

    +

    如果希望将一个路径下 所有 公有项引入作用域,可以指定路径后跟 *,glob 运算符:

    +
    #![allow(unused)]
    +fn main() {
    +use std::collections::*;
    +}
    +

    这个 use 语句将 std::collections 中定义的所有公有项引入当前作用域。使用 glob 运算符时请多加小心!Glob 会使得我们难以推导作用域中有什么名称和它们是在何处定义的。

    +

    glob 运算符经常用于测试模块 tests 中,这时会将所有内容引入作用域;我们将在第十一章 “如何编写测试” 部分讲解。glob 运算符有时也用于 prelude 模式;查看 标准库中的文档 了解这个模式的更多细节。

    +

    将模块拆分成多个文件

    +
    +

    ch07-05-separating-modules-into-different-files.md +
    +commit 2b4565662d1a7973d870744a923f58f8f7dcce91

    +
    +

    到目前为止,本章所有的例子都在一个文件中定义多个模块。当模块变得更大时,你可能想要将它们的定义移动到单独的文件中,从而使代码更容易阅读。

    +

    例如,我们从示例 7-17 中包含多个餐厅模块的代码开始。我们会将模块提取到各自的文件中,而不是将所有模块都定义到 crate 根文件中。在这里,crate 根文件是 src/lib.rs,不过这个过程也适用于 crate 根文件是 src/main.rs 的二进制 crate。

    +

    首先将 front_of_house 模块提取到其自己的文件中。删除 front_of_house 模块的大括号中的代码,只留下 mod front_of_house; 声明,这样 src/lib.rs 会包含如示例 7-21 所示的代码。注意直到创建示例 7-22 中的 src/front_of_house.rs 文件之前代码都不能编译。

    +

    文件名:src/lib.rs

    +
    mod front_of_house;
    +
    +pub use crate::front_of_house::hosting;
    +
    +pub fn eat_at_restaurant() {
    +    hosting::add_to_waitlist();
    +}
    +

    示例 7-21: 声明 front_of_house 模块,其内容将位于 src/front_of_house.rs

    +

    接下来将之前大括号内的代码放入一个名叫 src/front_of_house.rs 的新文件中,如示例 7-22 所示。因为编译器找到了 crate 根中名叫 front_of_house 的模块声明,它就知道去搜寻这个文件。

    +

    文件名:src/front_of_house.rs

    +
    pub mod hosting {
    +    pub fn add_to_waitlist() {}
    +}
    +

    示例 7-22: 在 src/front_of_house.rs 中定义 front_of_house +模块

    +

    注意你只需在模块树中的某处使用一次 mod 声明就可以加载这个文件。一旦编译器知道了这个文件是项目的一部分(并且通过 mod 语句的位置知道了代码在模块树中的位置),项目中的其他文件应该使用其所声明的位置的路径来引用那个文件的代码,这在“引用模块项目的路径”部分有讲到。换句话说,mod 不是 你可能会在其他编程语言中看到的 "include" 操作。

    +

    接下来我们同样将 hosting 模块提取到自己的文件中。这个过程会有所不同,因为 hostingfront_of_house 的子模块而不是根模块。我们将 hosting 的文件放在与模块树中它的父级模块同名的目录中,在这里是 src/front_of_house/

    +

    为了移动 hosting,修改 src/front_of_house.rs 使之仅包含 hosting 模块的声明。

    +

    文件名:src/front_of_house.rs

    +
    pub mod hosting;
    +

    接着我们创建一个 src/front_of_house 目录和一个包含 hosting 模块定义的 hosting.rs 文件:

    +

    文件名:src/front_of_house/hosting.rs

    +
    #![allow(unused)]
    +fn main() {
    +pub fn add_to_waitlist() {}
    +}
    +

    如果将 hosting.rs 放在 src 目录,编译器会认为 hosting 模块中的 hosting.rs 的代码声明于 crate 根,而不是声明为 front_of_house 的子模块。编译器所遵循的哪些文件对应哪些模块的代码的规则,意味着目录和文件更接近于模块树。

    +
    +

    另一种文件路径

    +

    目前为止我们介绍了 Rust 编译器所最常用的文件路径;不过一种更老的文件路径也仍然是支持的。

    +

    对于声明于 crate 根的 front_of_house 模块,编译器会在如下位置查找模块代码:

    +
      +
    • src/front_of_house.rs(我们所介绍的)
    • +
    • src/front_of_house/mod.rs(老风格,不过仍然支持)
    • +
    +

    对于 front_of_house 的子模块 hosting,编译器会在如下位置查找模块代码:

    +
      +
    • src/front_of_house/hosting.rs(我们所介绍的)
    • +
    • src/front_of_house/hosting/mod.rs(老风格,不过仍然支持)
    • +
    +

    如果你对同一模块同时使用这两种路径风格,会得到一个编译错误。在同一项目中的不同模块混用不同的路径风格是允许的,不过这会使他人感到疑惑。

    +

    使用 mod.rs 这一文件名的风格的主要缺点是会导致项目中出现很多 mod.rs 文件,当你在编辑器中同时打开它们时会感到疑惑。

    +
    +

    我们将各个模块的代码移动到独立文件了,同时模块树依旧相同。eat_at_restaurant 中的函数调用也无需修改继续保持有效,即便其定义存在于不同的文件中。这个技巧让你可以在模块代码增长时,将它们移动到新文件中。

    +

    注意,src/lib.rs 中的 pub use crate::front_of_house::hosting 语句也并未发生改变。use 也不会对哪些文件会被编译为 crate 的一部分有任何影响。mod 关键字声明了模块,而 Rust 会在与模块同名的文件中查找模块的代码。

    +

    总结

    +

    Rust 提供了将包分成多个 crate,将 crate 分成模块,以及通过指定绝对或相对路径从一个模块引用另一个模块中定义的项的方式。你可以通过使用 use 语句将路径引入作用域,这样在多次使用时可以使用更短的路径。模块定义的代码默认是私有的,不过可以选择增加 pub 关键字使其定义变为公有。

    +

    接下来,让我们看看一些标准库提供的集合数据类型,你可以利用它们编写出漂亮整洁的代码。

    +

    常见集合

    +
    +

    ch08-00-common-collections.md +
    +commit 1fd890031311612e54965f7f800a8c8bd4464663

    +
    +

    Rust 标准库中包含一系列被称为 集合collections)的非常有用的数据结构。大部分其他数据类型都代表一个特定的值,不过集合可以包含多个值。不同于内建的数组和元组类型,这些集合指向的数据是储存在堆上的,这意味着数据的数量不必在编译时就已知,并且还可以随着程序的运行增长或缩小。每种集合都有着不同功能和成本,而根据当前情况选择合适的集合,这是一项应当逐渐掌握的技能。在这一章里,我们将详细的了解三个在 Rust 程序中被广泛使用的集合:

    +
      +
    • vector 允许我们一个挨着一个地储存一系列数量可变的值
    • +
    • 字符串string)是字符的集合。我们之前见过 String 类型,不过在本章我们将深入了解。
    • +
    • 哈希 maphash map)允许我们将值与一个特定的键(key)相关联。这是一个叫做 map 的更通用的数据结构的特定实现。
    • +
    +

    对于标准库提供的其他类型的集合,请查看文档

    +

    我们将讨论如何创建和更新 vector、字符串和哈希 map,以及它们有什么特别之处。

    +

    使用 Vector 储存列表

    +
    +

    ch08-01-vectors.md +
    +commit ac16184a7f56d17daa9c4c76901371085dc0ac43

    +
    +

    我们要讲到的第一个类型是 Vec<T>,也被称为 vector。vector 允许我们在一个单独的数据结构中储存多于一个的值,它在内存中彼此相邻地排列所有的值。vector 只能储存相同类型的值。它们在拥有一系列项的场景下非常实用,例如文件中的文本行或是购物车中商品的价格。

    +

    新建 vector

    +

    为了创建一个新的空 vector,可以调用 Vec::new 函数,如示例 8-1 所示:

    +
    fn main() {
    +    let v: Vec<i32> = Vec::new();
    +}
    +

    示例 8-1:新建一个空的 vector 来储存 i32 类型的值

    +

    注意这里我们增加了一个类型注解。因为没有向这个 vector 中插入任何值,Rust 并不知道我们想要储存什么类型的元素。这是一个非常重要的点。vector 是用泛型实现的,第十章会涉及到如何对你自己的类型使用它们。现在,所有你需要知道的就是 Vec<T> 是一个由标准库提供的类型,它可以存放任何类型,而当 Vec 存放某个特定类型时,那个类型位于尖括号中。在示例 8-1 中,我们告诉 Rust v 这个 Vec<T> 将存放 i32 类型的元素。

    +

    通常,我们会用初始值来创建一个 Vec<T> 而 Rust 会推断出储存值的类型,所以很少会需要这些类型注解。为了方便 Rust 提供了 vec! 宏,这个宏会根据我们提供的值来创建一个新的 vector。示例 8-2 新建一个拥有值 123Vec<i32>。推断为 i32 是因为这是默认整型类型,第三章的 “数据类型” 讨论过:

    +
    fn main() {
    +    let v = vec![1, 2, 3];
    +}
    +

    示例 8-2:新建一个包含初值的 vector

    +

    因为我们提供了 i32 类型的初始值,Rust 可以推断出 v 的类型是 Vec<i32>,因此类型注解就不是必须的。接下来让我们看看如何修改一个 vector。

    +

    更新 vector

    +

    对于新建一个 vector 并向其增加元素,可以使用 push 方法,如示例 8-3 所示:

    +
    fn main() {
    +    let mut v = Vec::new();
    +
    +    v.push(5);
    +    v.push(6);
    +    v.push(7);
    +    v.push(8);
    +}
    +

    示例 8-3:使用 push 方法向 vector 增加值

    +

    如第三章中讨论的任何变量一样,如果想要能够改变它的值,必须使用 mut 关键字使其可变。放入其中的所有值都是 i32 类型的,而且 Rust 也根据数据做出如此判断,所以不需要 Vec<i32> 注解。

    +

    读取 vector 的元素

    +

    有两种方法引用 vector 中储存的值:通过索引或使用 get 方法。在接下来的示例中,为了更加清楚的说明,我们已经标注了这些函数返回的值的类型。

    +

    示例 8-4 展示了访问 vector 中一个值的两种方式,索引语法或者 get 方法:

    +
    fn main() {
    +    let v = vec![1, 2, 3, 4, 5];
    +
    +    let third: &i32 = &v[2];
    +    println!("The third element is {third}");
    +
    +    let third: Option<&i32> = v.get(2);
    +    match third {
    +        Some(third) => println!("The third element is {third}"),
    +        None => println!("There is no third element."),
    +    }
    +}
    +

    列表 8-4:使用索引语法或 get 方法来访问 vector 中的项

    +

    这里有几个细节需要注意。我们使用索引值 2 来获取第三个元素,因为索引是从数字 0 开始的。使用 &[] 会得到一个索引位置元素的引用。当使用索引作为参数调用 get 方法时,会得到一个可以用于 matchOption<&T>

    +

    Rust 提供了两种引用元素的方法的原因是当尝试使用现有元素范围之外的索引值时可以选择让程序如何运行。举个例子,让我们看看使用这个技术,尝试在当有一个 5 个元素的 vector 接着访问索引 100 位置的元素会发生什么,如示例 8-5 所示:

    +
    fn main() {
    +    let v = vec![1, 2, 3, 4, 5];
    +
    +    let does_not_exist = &v[100];
    +    let does_not_exist = v.get(100);
    +}
    +

    示例 8-5:尝试访问一个包含 5 个元素的 vector 的索引 100 处的元素

    +

    当运行这段代码,你会发现对于第一个 [] 方法,当引用一个不存在的元素时 Rust 会造成 panic。这个方法更适合当程序认为尝试访问超过 vector 结尾的元素是一个严重错误的情况,这时应该使程序崩溃。

    +

    get 方法被传递了一个数组外的索引时,它不会 panic 而是返回 None。当偶尔出现超过 vector 范围的访问属于正常情况的时候可以考虑使用它。接着你的代码可以有处理 Some(&element)None 的逻辑,如第六章讨论的那样。例如,索引可能来源于用户输入的数字。如果它们不慎输入了一个过大的数字那么程序就会得到 None 值,你可以告诉用户当前 vector 元素的数量并再请求它们输入一个有效的值。这就比因为输入错误而使程序崩溃要友好的多!

    +

    一旦程序获取了一个有效的引用,借用检查器将会执行所有权和借用规则(第四章讲到)来确保 vector 内容的这个引用和任何其他引用保持有效。回忆一下不能在相同作用域中同时存在可变和不可变引用的规则。这个规则适用于示例 8-6,当我们获取了 vector 的第一个元素的不可变引用并尝试在 vector 末尾增加一个元素的时候,如果尝试在函数的后面引用这个元素是行不通的:

    +
    fn main() {
    +    let mut v = vec![1, 2, 3, 4, 5];
    +
    +    let first = &v[0];
    +
    +    v.push(6);
    +
    +    println!("The first element is: {first}");
    +}
    +

    示例 8-6:在拥有 vector 中项的引用的同时向其增加一个元素

    +

    编译会给出这个错误:

    +
    $ cargo run
    +   Compiling collections v0.1.0 (file:///projects/collections)
    +error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable
    + --> src/main.rs:6:5
    +  |
    +4 |     let first = &v[0];
    +  |                  - immutable borrow occurs here
    +5 |
    +6 |     v.push(6);
    +  |     ^^^^^^^^^ mutable borrow occurs here
    +7 |
    +8 |     println!("The first element is: {first}");
    +  |                                     ------- immutable borrow later used here
    +
    +For more information about this error, try `rustc --explain E0502`.
    +error: could not compile `collections` (bin "collections") due to 1 previous error
    +
    +

    示例 8-6 中的代码看起来应该能够运行:为什么第一个元素的引用会关心 vector 结尾的变化?不能这么做的原因是由于 vector 的工作方式:在 vector 的结尾增加新元素时,在没有足够空间将所有元素依次相邻存放的情况下,可能会要求分配新内存并将老的元素拷贝到新的空间中。这时,第一个元素的引用就指向了被释放的内存。借用规则阻止程序陷入这种状况。

    +
    +

    注意:关于 Vec<T> 类型的更多实现细节,请查看 “The Rustonomicon”

    +
    +

    遍历 vector 中的元素

    +

    如果想要依次访问 vector 中的每一个元素,我们可以遍历其所有的元素而无需通过索引一次一个的访问。示例 8-7 展示了如何使用 for 循环来获取 i32 值的 vector 中的每一个元素的不可变引用并将其打印:

    +
    fn main() {
    +    let v = vec![100, 32, 57];
    +    for i in &v {
    +        println!("{i}");
    +    }
    +}
    +

    示例 8-7:通过 for 循环遍历 vector 的元素并打印

    +

    我们也可以遍历可变 vector 的每一个元素的可变引用以便能改变它们。示例 8-8 中的 for 循环会给每一个元素加 50

    +
    fn main() {
    +    let mut v = vec![100, 32, 57];
    +    for i in &mut v {
    +        *i += 50;
    +    }
    +}
    +

    示例 8-8:遍历 vector 中元素的可变引用

    +

    为了修改可变引用所指向的值,在使用 += 运算符之前必须使用解引用运算符(*)获取 i 中的值。第十五章的 “通过解引用运算符追踪指针的值” 部分会详细介绍解引用运算符。

    +

    因为借用检查器的规则,无论可变还是不可变地遍历一个 vector 都是安全的。如果尝试在示例 8-7 和 示例 8-8 的 for 循环体内插入或删除项,都会得到一个类似示例 8-6 代码中类似的编译错误。for 循环中获取的 vector 引用阻止了同时对 vector 整体的修改。

    +

    使用枚举来储存多种类型

    +

    vector 只能储存相同类型的值。这是很不方便的;绝对会有需要储存一系列不同类型的值的用例。幸运的是,枚举的成员都被定义为相同的枚举类型,所以当需要在 vector 中储存不同类型值时,我们可以定义并使用一个枚举!

    +

    例如,假如我们想要从电子表格的一行中获取值,而这一行的有些列包含数字,有些包含浮点值,还有些是字符串。我们可以定义一个枚举,其成员会存放这些不同类型的值,同时所有这些枚举成员都会被当作相同类型:那个枚举的类型。接着可以创建一个储存枚举值的 vector,这样最终就能够储存不同类型的值了。示例 8-9 展示了其用例:

    +
    fn main() {
    +    enum SpreadsheetCell {
    +        Int(i32),
    +        Float(f64),
    +        Text(String),
    +    }
    +
    +    let row = vec![
    +        SpreadsheetCell::Int(3),
    +        SpreadsheetCell::Text(String::from("blue")),
    +        SpreadsheetCell::Float(10.12),
    +    ];
    +}
    +

    示例 8-9:定义一个枚举,以便能在 vector 中存放不同类型的数据

    +

    Rust 在编译时必须确切知道 vector 中的类型,这样它才能确定在堆上需要为每个元素分配多少内存。我们还必须明确这个 vector 中允许的类型。如果 Rust 允许 vector 存储任意类型,那么可能会因为一个或多个类型在对 vector 元素执行操作时导致(类型相关)错误。使用枚举加上 match 表达式意味着 Rust 会在编译时确保每种可能的情况都得到处理,正如第六章讲到的那样。

    +

    如果在编写程序时不能确切无遗地知道运行时会储存进 vector 的所有类型,枚举技术就行不通了。相反,你可以使用 trait 对象,第十八章会讲到它。

    +

    现在我们了解了一些使用 vector 的最常见的方式,请一定去看看标准库中 Vec 定义的很多其他实用方法的 API 文档。例如,除了 push 之外还有一个 pop 方法,它会移除并返回 vector 的最后一个元素。

    +

    丢弃 vector 时也会丢弃其所有元素

    +

    类似于任何其他的 struct,vector 在其离开作用域时会被释放,如示例 8-4 所标注的:

    +
    fn main() {
    +    {
    +        let v = vec![1, 2, 3, 4];
    +
    +        // do stuff with v
    +    } // <- v goes out of scope and is freed here
    +}
    +

    示例 8-10:展示 vector 和其元素于何处被丢弃

    +

    当 vector 被丢弃时,所有其内容也会被丢弃,这意味着这里它包含的整数将被清理。借用检查器确保了任何 vector 中内容的引用仅在 vector 本身有效时才可用。

    +

    让我们继续下一个集合类型:String

    +

    使用字符串储存 UTF-8 编码的文本

    +
    +

    ch08-02-strings.md +
    +commit 668c64760b5c7ea654facb4ba5fe9faddfda27cc

    +
    +

    第四章已经讲过一些字符串的内容,不过现在让我们更深入地了解它。字符串是新晋 Rustacean 们通常会被困住的领域,这是由于三方面理由的结合:Rust 倾向于确保暴露出可能的错误,字符串是比很多程序员所想象的要更为复杂的数据结构,以及 UTF-8。所有这些要素结合起来对于来自其他语言背景的程序员就可能显得很困难了。

    +

    在集合章节中讨论字符串的原因是,字符串就是作为字节的集合外加一些方法实现的,当这些字节被解释为文本时,这些方法提供了实用的功能。在这一部分,我们会讲到 String 中那些任何集合类型都有的操作,比如创建、更新和读取。也会讨论 String 与其他集合不一样的地方,例如索引 String 是很复杂的,由于人和计算机理解 String 数据方式的不同。

    +

    什么是字符串?

    +

    在开始深入这些方面之前,我们需要讨论一下术语 字符串 的具体意义。Rust 的核心语言中只有一种字符串类型:字符串 slice str,它通常以被借用的形式出现,&str。第四章讲到了 字符串 slices:它们是一些对储存在别处的 UTF-8 编码字符串数据的引用。举例来说,由于字符串字面值被储存在程序的二进制输出中,因此字符串字面值也是字符串 slices。

    +

    字符串(String)类型由 Rust 标准库提供,而不是编入核心语言,它是一种可增长、可变、可拥有、UTF-8 编码的字符串类型。当 Rustaceans 提及 Rust 中的 "字符串 "时,他们可能指的是 String 或 string slice &str 类型,而不仅仅是其中一种类型。虽然本节主要讨论 String,但这两种类型在 Rust 的标准库中都有大量使用,而且 String 和 字符串 slices 都是 UTF-8 编码的。

    +

    新建字符串

    +

    很多 Vec 可用的操作在 String 中同样可用,事实上 String 被实现为一个带有一些额外保证、限制和功能的字节 vector 的封装。其中一个同样作用于 Vec<T>String 函数的例子是用来新建一个实例的 new 函数,如示例 8-11 所示。

    +
    fn main() {
    +    let mut s = String::new();
    +}
    +

    示例 8-11:新建一个空的 String

    +

    这新建了一个叫做 s 的空的字符串,接着我们可以向其中装载数据。通常字符串会有初始数据,因为我们希望一开始就有这个字符串。为此,可以使用 to_string 方法,它能用于任何实现了 Display trait 的类型,比如字符串字面值。示例 8-12 展示了两个例子。

    +
    fn main() {
    +    let data = "initial contents";
    +
    +    let s = data.to_string();
    +
    +    // 该方法也可直接用于字符串字面值:
    +    let s = "initial contents".to_string();
    +}
    +

    示例 8-12:使用 to_string 方法从字符串字面值创建 String

    +

    这些代码会创建包含 initial contents 的字符串。

    +

    也可以使用 String::from 函数来从字符串字面值创建 String。示例 8-13 中的代码等同于使用 to_string

    +
    fn main() {
    +    let s = String::from("initial contents");
    +}
    +

    示例 8-13:使用 String::from 函数从字符串字面值创建 String

    +

    因为字符串应用广泛,这里有很多不同的用于字符串的通用 API 可供选择。其中一些可能看起来多余,不过都有其用武之地!在这个例子中,String::from.to_string 最终做了完全相同的工作,所以如何选择就是代码风格与可读性的问题了。

    +

    记住字符串是 UTF-8 编码的,所以可以包含任何可以正确编码的数据,如示例 8-14 所示。

    +
    fn main() {
    +    let hello = String::from("السلام عليكم");
    +    let hello = String::from("Dobrý den");
    +    let hello = String::from("Hello");
    +    let hello = String::from("שלום");
    +    let hello = String::from("नमस्ते");
    +    let hello = String::from("こんにちは");
    +    let hello = String::from("안녕하세요");
    +    let hello = String::from("你好");
    +    let hello = String::from("Olá");
    +    let hello = String::from("Здравствуйте");
    +    let hello = String::from("Hola");
    +}
    +

    示例 8-14:在字符串中储存不同语言的问候语

    +

    所有这些都是有效的 String 值。

    +

    更新字符串

    +

    String 的大小可以增加,其内容也可以改变,就像可以放入更多数据来改变 Vec 的内容一样。另外,可以方便的使用 + 运算符或 format! 宏来拼接 String 值。

    +

    使用 push_strpush 附加字符串

    +

    可以通过 push_str 方法来附加字符串 slice,从而使 String 变长,如示例 8-15 所示。

    +
    fn main() {
    +    let mut s = String::from("foo");
    +    s.push_str("bar");
    +}
    +

    示例 8-15:使用 push_str 方法向 String 附加字符串 slice

    +

    执行这两行代码之后,s 将会包含 foobarpush_str 方法采用字符串 slice,因为我们并不需要获取参数的所有权。例如,示例 8-16 中我们希望在将 s2 的内容附加到 s1 之后还能使用它。

    +
    fn main() {
    +    let mut s1 = String::from("foo");
    +    let s2 = "bar";
    +    s1.push_str(s2);
    +    println!("s2 is {s2}");
    +}
    +

    示例 8-16:将字符串 slice 的内容附加到 String 后使用它

    +

    如果 push_str 方法获取了 s2 的所有权,就不能在最后一行打印出其值了。好在代码如我们期望那样工作!

    +

    push 方法被定义为获取一个单独的字符作为参数,并附加到 String 中。示例 8-17 展示了使用 push 方法将字母 "l" 加入 String 的代码。

    +
    fn main() {
    +    let mut s = String::from("lo");
    +    s.push('l');
    +}
    +

    示例 8-17:使用 push 将一个字符加入 String 值中

    +

    执行这些代码之后,s 将会包含 “lol”。

    +

    使用 + 运算符或 format! 宏拼接字符串

    +

    通常你会希望将两个已知的字符串合并在一起。一种办法是像这样使用 + 运算符,如示例 8-18 所示。

    +
    fn main() {
    +    let s1 = String::from("Hello, ");
    +    let s2 = String::from("world!");
    +    let s3 = s1 + &s2; // 注意 s1 被移动了,不能继续使用
    +}
    +

    示例 8-18:使用 + 运算符将两个 String 值合并到一个新的 String 值中

    +

    执行完这些代码之后,字符串 s3 将会包含 Hello, world!s1 在相加后不再有效的原因,和使用 s2 的引用的原因,与使用 + 运算符时调用的函数签名有关。+ 运算符使用了 add 函数,这个函数签名看起来像这样:

    +
    fn add(self, s: &str) -> String {
    +

    在标准库中你会发现,add 的定义使用了泛型和关联类型。在这里我们替换为了具体类型,这也正是当使用 String 值调用这个方法会发生的。第十章会讨论泛型。这个签名提供了理解 + 运算那微妙部分的线索。

    +

    首先,s2 使用了 &,意味着我们使用第二个字符串的 引用 与第一个字符串相加。这是因为 add 函数的 s 参数:只能将 &strString 相加,不能将两个 String 值相加。不过等一下 —— &s2 的类型是 &String, 而不是 add 第二个参数所指定的 &str。那么为什么示例 8-18 还能编译呢?

    +

    之所以能够在 add 调用中使用 &s2 是因为 &String 可以被 强转coerced)成 &str。当add函数被调用时,Rust 使用了一个被称为 Deref 强制转换deref coercion)的技术,你可以将其理解为它把 &s2 变成了 &s2[..]。第十五章会更深入的讨论 Deref 强制转换。因为 add 没有获取参数的所有权,所以 s2 在这个操作后仍然是有效的 String

    +

    其次,可以发现签名中 add 获取了 self 的所有权,因为 self 没有 使用 &。这意味着示例 8-18 中的 s1 的所有权将被移动到 add 调用中,之后就不再有效。所以虽然 let s3 = s1 + &s2; 看起来就像它会复制两个字符串并创建一个新的字符串,而实际上这个语句会获取 s1 的所有权,附加上从 s2 中拷贝的内容,并返回结果的所有权。换句话说,它看起来好像生成了很多拷贝,不过实际上并没有:这个实现比拷贝要更高效。

    +

    如果想要级联多个字符串,+ 的行为就显得笨重了:

    +
    fn main() {
    +    let s1 = String::from("tic");
    +    let s2 = String::from("tac");
    +    let s3 = String::from("toe");
    +
    +    let s = s1 + "-" + &s2 + "-" + &s3;
    +}
    +

    这时 s 的内容会是 “tic-tac-toe”。在有这么多 +" 字符的情况下,很难理解具体发生了什么。对于更为复杂的字符串链接,可以使用 format! 宏:

    +
    fn main() {
    +    let s1 = String::from("tic");
    +    let s2 = String::from("tac");
    +    let s3 = String::from("toe");
    +
    +    let s = format!("{s1}-{s2}-{s3}");
    +}
    +

    这些代码也会将 s 设置为 “tic-tac-toe”。format!println! 的工作原理相同,不过不同于将输出打印到屏幕上,它返回一个带有结果内容的 String。这个版本就好理解的多,宏 format! 生成的代码使用引用所以不会获取任何参数的所有权。

    +

    索引字符串

    +

    在很多语言中,通过索引来引用字符串中的单独字符是有效且常见的操作。然而在 Rust 中,如果你尝试使用索引语法访问 String 的一部分,会出现一个错误。考虑一下如示例 8-19 中所示的无效代码。

    +
    fn main() {
    +    let s1 = String::from("hello");
    +    let h = s1[0];
    +}
    +

    示例 8-19:尝试对字符串使用索引语法

    +

    这段代码会导致如下错误:

    +
    $ cargo run
    +   Compiling collections v0.1.0 (file:///projects/collections)
    +error[E0277]: the type `str` cannot be indexed by `{integer}`
    + --> src/main.rs:3:16
    +  |
    +3 |     let h = s1[0];
    +  |                ^ string indices are ranges of `usize`
    +  |
    +  = help: the trait `SliceIndex<str>` is not implemented for `{integer}`, which is required by `String: Index<_>`
    +  = note: you can use `.chars().nth()` or `.bytes().nth()`
    +          for more information, see chapter 8 in The Book: <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>
    +  = help: the trait `SliceIndex<[_]>` is implemented for `usize`
    +  = help: for that trait implementation, expected `[_]`, found `str`
    +  = note: required for `String` to implement `Index<{integer}>`
    +
    +For more information about this error, try `rustc --explain E0277`.
    +error: could not compile `collections` (bin "collections") due to 1 previous error
    +
    +

    错误和提示说明了全部问题:Rust 的字符串不支持索引。那么接下来的问题是,为什么不支持呢?为了回答这个问题,我们必须先聊一聊 Rust 是如何在内存中储存字符串的。

    +

    内部表现

    +

    String 是一个 Vec<u8> 的封装。让我们看看示例 8-14 中一些正确编码的字符串的例子。首先是这一个:

    +
    fn main() {
    +    let hello = String::from("السلام عليكم");
    +    let hello = String::from("Dobrý den");
    +    let hello = String::from("Hello");
    +    let hello = String::from("שלום");
    +    let hello = String::from("नमस्ते");
    +    let hello = String::from("こんにちは");
    +    let hello = String::from("안녕하세요");
    +    let hello = String::from("你好");
    +    let hello = String::from("Olá");
    +    let hello = String::from("Здравствуйте");
    +    let hello = String::from("Hola");
    +}
    +

    在这里,len 的值是 4,这意味着储存字符串 “Hola” 的 Vec 的长度是四个字节:这里每一个字母的 UTF-8 编码都占用一个字节。那下面这个例子又如何呢?(注意这个字符串中的首字母是西里尔字母的 Ze 而不是数字 3。)

    +
    fn main() {
    +    let hello = String::from("السلام عليكم");
    +    let hello = String::from("Dobrý den");
    +    let hello = String::from("Hello");
    +    let hello = String::from("שלום");
    +    let hello = String::from("नमस्ते");
    +    let hello = String::from("こんにちは");
    +    let hello = String::from("안녕하세요");
    +    let hello = String::from("你好");
    +    let hello = String::from("Olá");
    +    let hello = String::from("Здравствуйте");
    +    let hello = String::from("Hola");
    +}
    +

    当问及这个字符是多长的时候有人可能会说是 12。然而,Rust 的回答是 24。这是使用 UTF-8 编码 “Здравствуйте” 所需要的字节数,这是因为每个 Unicode 标量值需要两个字节存储。因此一个字符串字节值的索引并不总是对应一个有效的 Unicode 标量值。作为演示,考虑如下无效的 Rust 代码:

    +
    let hello = "Здравствуйте";
    +let answer = &hello[0];
    +

    我们已经知道 answer 不是第一个字符 3。当使用 UTF-8 编码时,(西里尔字母的 Ze)З 的第一个字节是 208,第二个是 151,所以 answer 实际上应该是 208,不过 208 自身并不是一个有效的字母。返回 208 可不是一个请求字符串第一个字母的人所希望看到的,不过它是 Rust 在字节索引 0 位置所能提供的唯一数据。用户通常不会想要一个字节值被返回。即使这个字符串只有拉丁字母,如果 &"hello"[0] 是返回字节值的有效代码,它也会返回 104 而不是 h

    +

    为了避免返回意外的值并造成不能立刻发现的 bug,Rust 根本不会编译这些代码,并在开发过程中及早杜绝了误会的发生。

    +

    字节、标量值和字形簇!天呐!

    +

    这引起了关于 UTF-8 的另外一个问题:从 Rust 的角度来讲,事实上有三种相关方式可以理解字符串:字节、标量值和字形簇(最接近人们眼中 字母 的概念)。

    +

    比如这个用梵文书写的印度语单词 “नमस्ते”,最终它储存在 vector 中的 u8 值看起来像这样:

    +
    [224, 164, 168, 224, 164, 174, 224, 164, 184, 224, 165, 141, 224, 164, 164,
    +224, 165, 135]
    +
    +

    这里有 18 个字节,也就是计算机最终会储存的数据。如果从 Unicode 标量值的角度理解它们,也就像 Rust 的 char 类型那样,这些字节看起来像这样:

    +
    ['न', 'म', 'स', '्', 'त', 'े']
    +
    +

    这里有六个 char,不过第四个和第六个都不是字母,它们是发音符号本身并没有任何意义。最后,如果以字形簇的角度理解,就会得到人们所说的构成这个单词的四个字母:

    +
    ["न", "म", "स्", "ते"]
    +
    +

    Rust 提供了多种不同的方式来解释计算机储存的原始字符串数据,这样程序就可以选择它需要的表现方式,而无所谓是何种人类语言。

    +

    最后一个 Rust 不允许使用索引获取 String 字符的原因是,索引操作预期总是需要常数时间(O(1))。但是对于 String 不可能保证这样的性能,因为 Rust 必须从开头到索引位置遍历来确定有多少有效的字符。

    +

    字符串 slice

    +

    索引字符串通常是一个坏点子,因为字符串索引应该返回的类型是不明确的:字节值、字符、字形簇或者字符串 slice。因此,如果你真的希望使用索引创建字符串 slice 时,Rust 会要求你更明确一些。为了更明确索引并表明你需要一个字符串 slice,相比使用 [] 和单个值的索引,可以使用 [] 和一个 range 来创建含特定字节的字符串 slice:

    +
    #![allow(unused)]
    +fn main() {
    +let hello = "Здравствуйте";
    +
    +let s = &hello[0..4];
    +}
    +

    这里,s 会是一个 &str,它包含字符串的头四个字节。早些时候,我们提到了这些字母都是两个字节长的,所以这意味着 s 将会是 “Зд”。

    +

    如果获取 &hello[0..1] 会发生什么呢?答案是:Rust 在运行时会 panic,就跟访问 vector 中的无效索引时一样:

    +
    $ cargo run
    +   Compiling collections v0.1.0 (file:///projects/collections)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s
    +     Running `target/debug/collections`
    +thread 'main' panicked at src/main.rs:4:19:
    +byte index 1 is not a char boundary; it is inside 'З' (bytes 0..2) of `Здравствуйте`
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +

    你应该小心谨慎地使用这个操作,因为这么做可能会使你的程序崩溃。

    +

    遍历字符串的方法

    +

    操作字符串每一部分的最好的方法是明确表示需要字符还是字节。对于单独的 Unicode 标量值使用 chars 方法。对 “Зд” 调用 chars 方法会将其分开并返回两个 char 类型的值,接着就可以遍历其结果来访问每一个元素了:

    +
    #![allow(unused)]
    +fn main() {
    +for c in "Зд".chars() {
    +    println!("{c}");
    +}
    +}
    +

    这些代码会打印出如下内容:

    +
    З
    +д
    +
    +

    另外 bytes 方法返回每一个原始字节,这可能会适合你的使用场景:

    +
    #![allow(unused)]
    +fn main() {
    +for b in "Зд".bytes() {
    +    println!("{b}");
    +}
    +}
    +

    这些代码会打印出组成 String 的 4 个字节:

    +
    208
    +151
    +208
    +180
    +
    +

    不过请记住有效的 Unicode 标量值可能会由不止一个字节组成。

    +

    从字符串中获取如同天城文这样的字形簇是很复杂的,所以标准库并没有提供这个功能。crates.io 上有些提供这样功能的 crate。

    +

    字符串并不简单

    +

    总而言之,字符串还是很复杂的。不同的语言选择了不同的向程序员展示其复杂性的方式。Rust 选择了以准确的方式处理 String 数据作为所有 Rust 程序的默认行为,这意味着程序员们必须更多的思考如何预先处理 UTF-8 数据。这种权衡取舍相比其他语言更多的暴露出了字符串的复杂性,不过也使你在开发周期后期免于处理涉及非 ASCII 字符的错误。

    +

    好消息是标准库提供了很多围绕 String&str 构建的功能,来帮助我们正确处理这些复杂场景。请务必查看这些使用方法的文档,例如 contains 来搜索一个字符串,和 replace 将字符串的一部分替换为另一个字符串。

    +

    称作 String 的类型是由标准库提供的,而没有写进核心语言部分,它是可增长的、可变的、有所有权的、UTF-8 编码的字符串类型。当 Rustacean 们谈到 Rust 的 “字符串”时,它们通常指的是 String 或字符串 slice &str 类型,而不特指其中某一个。虽然本部分内容大多是关于 String 的,不过这两个类型在 Rust 标准库中都被广泛使用,String 和字符串 slices 都是 UTF-8 编码的。

    +

    现在让我们转向一些不太复杂的集合:哈希 map!

    +

    使用 Hash Map 储存键值对

    +
    +

    ch08-03-hash-maps.md +
    +commit 50775360ba3904c41e84176337ff47e6e7d6177c

    +
    +

    最后介绍的常用集合类型是 哈希 maphash map)。HashMap<K, V> 类型储存了一个键类型 K 对应一个值类型 V 的映射。它通过一个 哈希函数hashing function)来实现映射,决定如何将键和值放入内存中。很多编程语言支持这种数据结构,不过通常有不同的名字:哈希、map、对象、哈希表或者关联数组,仅举几例。

    +

    哈希 map 可以用于需要任何类型作为键来寻找数据的情况,而不是像 vector 那样通过索引。例如,在一个游戏中,你可以将每个团队的分数记录到哈希 map 中,其中键是队伍的名字而值是每个队伍的分数。给出一个队名,就能得到他们的得分。

    +

    本章我们会介绍哈希 map 的基本 API,不过还有更多吸引人的功能隐藏于标准库在 HashMap<K, V> 上定义的函数中。一如既往请查看标准库文档来了解更多信息。

    +

    新建一个哈希 map

    +

    可以使用 new 创建一个空的 HashMap,并使用 insert 增加元素。在示例 8-20 中我们记录两支队伍的分数,分别是蓝队和黄队。蓝队开始有 10 分而黄队开始有 50 分:

    +
    fn main() {
    +    use std::collections::HashMap;
    +
    +    let mut scores = HashMap::new();
    +
    +    scores.insert(String::from("Blue"), 10);
    +    scores.insert(String::from("Yellow"), 50);
    +}
    +

    示例 8-20:新建一个哈希 map 并插入一些键值对

    +

    注意必须首先 use 标准库中集合部分的 HashMap。在这三个常用集合中,HashMap 是最不常用的,所以并没有被 prelude 自动引用。标准库中对 HashMap 的支持也相对较少,例如,并没有内建的构建宏。

    +

    像 vector 一样,哈希 map 将它们的数据储存在堆上,这个 HashMap 的键类型是 String 而值类型是 i32。类似于 vector,哈希 map 是同质的:所有的键必须是相同类型,值也必须都是相同类型。

    +

    访问哈希 map 中的值

    +

    可以通过 get 方法并提供对应的键来从哈希 map 中获取值,如示例 8-21 所示:

    +
    fn main() {
    +    use std::collections::HashMap;
    +
    +    let mut scores = HashMap::new();
    +
    +    scores.insert(String::from("Blue"), 10);
    +    scores.insert(String::from("Yellow"), 50);
    +
    +    let team_name = String::from("Blue");
    +    let score = scores.get(&team_name).copied().unwrap_or(0);
    +}
    +

    示例 8-21:访问哈希 map 中储存的蓝队分数

    +

    这里,score 是与蓝队分数相关的值,应为 10get 方法返回 Option<&V>,如果某个键在哈希 map 中没有对应的值,get 会返回 None。程序中通过调用 copied 方法来获取一个 Option<i32> 而不是 Option<&i32>,接着调用 unwrap_orscores 中没有该键所对应的项时将其设置为零。

    +

    可以使用与 vector 类似的方式来遍历哈希 map 中的每一个键值对,也就是 for 循环:

    +
    fn main() {
    +    use std::collections::HashMap;
    +
    +    let mut scores = HashMap::new();
    +
    +    scores.insert(String::from("Blue"), 10);
    +    scores.insert(String::from("Yellow"), 50);
    +
    +    for (key, value) in &scores {
    +        println!("{key}: {value}");
    +    }
    +}
    +

    这会以任意顺序打印出每一个键值对:

    +
    Yellow: 50
    +Blue: 10
    +
    +

    哈希 map 和所有权

    +

    对于像 i32 这样的实现了 Copy trait 的类型,其值可以拷贝进哈希 map。对于像 String 这样拥有所有权的值,其值将被移动而哈希 map 会成为这些值的所有者,如示例 8-22 所示:

    +
    fn main() {
    +    use std::collections::HashMap;
    +
    +    let field_name = String::from("Favorite color");
    +    let field_value = String::from("Blue");
    +
    +    let mut map = HashMap::new();
    +    map.insert(field_name, field_value);
    +    // 这里 field_name 和 field_value 不再有效,
    +    // 尝试使用它们看看会出现什么编译错误!
    +}
    +

    示例 8-22:展示一旦键值对被插入后就为哈希 map 所拥有

    +

    insert 调用将 field_namefield_value 移动到哈希 map 中后,将不能使用这两个绑定。

    +

    如果将值的引用插入哈希 map,这些值本身将不会被移动进哈希 map。但是这些引用指向的值必须至少在哈希 map 有效时也是有效的。第十章 “生命周期确保引用有效” 部分将会更多的讨论这个问题。

    +

    更新哈希 map

    +

    尽管键值对的数量是可以增长的,每个唯一的键只能同时关联一个值(反之不一定成立:比如蓝队和黄队的 scores 哈希 map 中都可能存储有 10 这个值)。

    +

    当我们想要改变哈希 map 中的数据时,必须决定如何处理一个键已经有值了的情况。可以选择完全无视旧值并用新值代替旧值。可以选择保留旧值而忽略新值,并只在键 没有 对应值时增加新值。或者可以结合新旧两值。让我们看看这分别该如何处理!

    +

    覆盖一个值

    +

    如果我们插入了一个键值对,接着用相同的键插入一个不同的值,与这个键相关联的旧值将被替换。即便示例 8-23 中的代码调用了两次 insert,哈希 map 也只会包含一个键值对,因为两次都是对蓝队的键插入的值:

    +
    fn main() {
    +    use std::collections::HashMap;
    +
    +    let mut scores = HashMap::new();
    +
    +    scores.insert(String::from("Blue"), 10);
    +    scores.insert(String::from("Blue"), 25);
    +
    +    println!("{scores:?}");
    +}
    +

    示例 8-23:替换以特定键储存的值

    +

    这会打印出 {"Blue": 25}。原始的值 10 则被覆盖了。

    +

    只在键没有对应值时插入键值对

    +

    我们经常会检查某个特定的键是否已经存在于哈希 map 中并进行如下操作:如果哈希 map 中键已经存在则不做任何操作。如果不存在则连同值一块插入。

    +

    为此哈希 map 有一个特有的 API,叫做 entry,它获取我们想要检查的键作为参数。entry 函数的返回值是一个枚举,Entry,它代表了可能存在也可能不存在的值。比如说我们想要检查黄队的键是否关联了一个值。如果没有,就插入值 50,对于蓝队也是如此。使用 entry API 的代码看起来像示例 8-24 这样:

    +
    fn main() {
    +    use std::collections::HashMap;
    +
    +    let mut scores = HashMap::new();
    +    scores.insert(String::from("Blue"), 10);
    +
    +    scores.entry(String::from("Yellow")).or_insert(50);
    +    scores.entry(String::from("Blue")).or_insert(50);
    +
    +    println!("{scores:?}");
    +}
    +

    示例 8-24:使用 entry 方法只在键没有对应一个值时插入

    +

    Entryor_insert 方法在键对应的值存在时就返回这个值的可变引用,如果不存在则将参数作为新值插入并返回新值的可变引用。这比编写自己的逻辑要简明的多,另外也与借用检查器结合得更好。

    +

    运行示例 8-24 的代码会打印出 {"Yellow": 50, "Blue": 10}。第一个 entry 调用会插入黄队的键和值 50,因为黄队并没有一个值。第二个 entry 调用不会改变哈希 map 因为蓝队已经有了值 10

    +

    根据旧值更新一个值

    +

    另一个常见的哈希 map 的应用场景是找到一个键对应的值并根据旧的值更新它。例如,示例 8-25 中的代码计数一些文本中每一个单词分别出现了多少次。我们使用哈希 map 以单词作为键并递增其值来记录我们遇到过几次这个单词。如果是第一次看到某个单词,就插入值 0

    +
    fn main() {
    +    use std::collections::HashMap;
    +
    +    let text = "hello world wonderful world";
    +
    +    let mut map = HashMap::new();
    +
    +    for word in text.split_whitespace() {
    +        let count = map.entry(word).or_insert(0);
    +        *count += 1;
    +    }
    +
    +    println!("{map:?}");
    +}
    +

    示例 8-25:通过哈希 map 储存单词和计数来统计出现次数

    +

    这会打印出 {"world": 2, "hello": 1, "wonderful": 1}。你可能会看到相同的键值对以不同的顺序打印:回忆一下“访问哈希 map 中的值”部分中遍历哈希 map 会以任意顺序进行。

    +

    split_whitespace 方法返回一个由空格分隔 text 值子 slice 的迭代器。or_insert 方法返回这个键的值的一个可变引用(&mut V)。这里我们将这个可变引用储存在 count 变量中,所以为了赋值必须首先使用星号(*)解引用 count。这个可变引用在 for 循环的结尾离开作用域,这样所有这些改变都是安全的并符合借用规则。

    +

    哈希函数

    +

    HashMap 默认使用一种叫做 SipHash 的哈希函数,它可以抵御涉及哈希表(hash table)1 的拒绝服务(Denial of Service, DoS)攻击。然而这并不是可用的最快的算法,不过为了更高的安全性值得付出一些性能的代价。如果性能监测显示此哈希函数非常慢,以致于你无法接受,你可以指定一个不同的 hasher 来切换为其它函数。hasher 是一个实现了 BuildHasher trait 的类型。第十章会讨论 trait 和如何实现它们。你并不需要从头开始实现你自己的 hasher;crates.io 有其他人分享的实现了许多常用哈希算法的 hasher 的库。

    + +

    总结

    +

    vector、字符串和哈希 map 会在你的程序需要储存、访问和修改数据时帮助你。这里有一些你应该能够解决的练习问题:

    +
      +
    • 给定一系列数字,使用 vector 并返回这个列表的中位数(排列数组后位于中间的值)和众数(出现次数最多的值;在这里哈希 map 会很有帮助)。
    • +
    • 将字符串转换为 Pig Latin,也就是每一个单词的第一个辅音字母被移动到单词的结尾并增加 “ay”,所以 “first” 会变成 “irst-fay”。元音字母开头的单词则在结尾增加 “hay”(“apple” 会变成 “apple-hay”)。牢记 UTF-8 编码!
    • +
    • 使用哈希 map 和 vector,创建一个文本接口来允许用户向公司的部门中增加员工的名字。例如,“Add Sally to Engineering” 或 “Add Amir to Sales”。接着让用户获取一个部门的所有员工的列表,或者公司每个部门的所有员工按照字典序排列的列表。
    • +
    +

    标准库 API 文档中描述的这些类型的方法将有助于你进行这些练习!

    +

    我们已经开始接触可能会有失败操作的复杂程序了,这也意味着接下来是一个了解错误处理的绝佳时机!

    +

    错误处理

    +
    +

    ch09-00-error-handling.md +
    +commit 199ca99926f232ee7f581a917eada4b65ff21754

    +
    +

    错误是软件中不可否认的事实,所以 Rust 有一些处理出错情况的特性。在许多情况下,Rust 要求你承认错误的可能性,并在你的代码编译前采取一些行动。这一要求使你的程序更加健壮,因为它可以确保你在将代码部署到生产环境之前就能发现错误并进行适当的处理。

    +

    Rust 将错误分为两大类:可恢复的recoverable)和 不可恢复的unrecoverable)错误。对于一个可恢复的错误,比如文件未找到的错误,我们很可能只想向用户报告问题并重试操作。不可恢复的错误总是 bug 出现的征兆,比如试图访问一个超过数组末端的位置,因此我们要立即停止程序。

    +

    大多数语言并不区分这两种错误,并采用类似异常这样方式统一处理它们。Rust 没有异常。相反,它有 Result<T, E> 类型,用于处理可恢复的错误,还有 panic! 宏,在程序遇到不可恢复的错误时停止执行。本章首先介绍 panic! 调用,接着会讲到如何返回 Result<T, E>。此外,我们将探讨在决定是尝试从错误中恢复还是停止执行时的注意事项。

    +

    panic! 处理不可恢复的错误

    +
    +

    ch09-01-unrecoverable-errors-with-panic.md +
    +commit 2921743516b3e2c0f45a95390e7b536e42f4af7c

    +
    +

    突然有一天,代码出问题了,而你对此束手无策。对于这种情况,Rust 有 panic!宏。在实践中有两种方法造成 panic:执行会造成代码 panic 的操作(比如访问超过数组结尾的内容)或者显式调用 panic! 宏。这两种情况都会使程序 panic。通常情况下这些 panic 会打印出一个错误信息,展开并清理栈数据,然后退出。通过一个环境变量,你也可以让 Rust 在 panic 发生时打印调用堆栈(call stack)以便于定位 panic 的原因。

    +
    +

    对应 panic 时的栈展开或终止

    +

    当出现 panic 时,程序默认会开始 展开unwinding),这意味着 Rust 会回溯栈并清理它遇到的每一个函数的数据,不过这个回溯并清理的过程有很多工作。另一种选择是直接 终止abort),这会不清理数据就退出程序。

    +

    那么程序所使用的内存需要由操作系统来清理。如果你需要项目的最终二进制文件越小越好,panic 时通过在 Cargo.toml[profile] 部分增加 panic = 'abort',可以由展开切换为终止。例如,如果你想要在 release 模式中 panic 时直接终止:

    +
    [profile.release]
    +panic = 'abort'
    +
    +
    +

    让我们在一个简单的程序中调用 panic!

    +

    文件名:src/main.rs

    +
    fn main() {
    +    panic!("crash and burn");
    +}
    +

    运行程序将会出现类似这样的输出:

    +
    $ cargo run
    +   Compiling panic v0.1.0 (file:///projects/panic)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.25s
    +     Running `target/debug/panic`
    +thread 'main' panicked at src/main.rs:2:5:
    +crash and burn
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +

    最后两行包含 panic! 调用造成的错误信息。第一行显示了 panic 提供的信息并指明了源码中 panic 出现的位置:src/main.rs:2:5 表明这是 src/main.rs 文件的第二行第五个字符。

    +

    在这个例子中,被指明的那一行是我们代码的一部分,而且查看这一行的话就会发现 panic! 宏的调用。在其他情况下,panic! 可能会出现在我们的代码所调用的代码中。错误信息报告的文件名和行号可能指向别人代码中的 panic! 宏调用,而不是我们代码中最终导致 panic! 的那一行。我们可以使用 panic! 被调用的函数的 backtrace 来寻找代码中出问题的地方。下面我们会详细介绍 backtrace 是什么。

    +

    使用 panic! 的 backtrace

    +

    让我们来看看另一个因为我们代码中的 bug 引起的别的库中 panic! 的例子,而不是直接的宏调用。示例 9-1 有一些尝试通过索引访问 vector 中元素的例子:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let v = vec![1, 2, 3];
    +
    +    v[99];
    +}
    +

    示例 9-1:尝试访问超越 vector 结尾的元素,这会造成 panic!

    +

    这里尝试访问 vector 的第一百个元素(这里的索引是 99 因为索引从 0 开始),不过它只有三个元素。这种情况下 Rust 会 panic。[] 应当返回一个元素,不过如果传递了一个无效索引,就没有可供 Rust 返回的正确的元素。

    +

    C 语言中,尝试读取数据结构之后的值是未定义行为(undefined behavior)。你会得到任何对应数据结构中这个元素的内存位置的值,甚至是这些内存并不属于这个数据结构的情况。这被称为 缓冲区溢出buffer overread),并可能会导致安全漏洞,比如攻击者可以像这样操作索引来读取储存在数据结构之后不被允许的数据。

    +

    为了保护程序远离这类漏洞,如果尝试读取一个索引不存在的元素,Rust 会停止执行并拒绝继续。尝试运行上面的程序会出现如下输出:

    +
    $ cargo run
    +   Compiling panic v0.1.0 (file:///projects/panic)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.27s
    +     Running `target/debug/panic`
    +thread 'main' panicked at src/main.rs:4:6:
    +index out of bounds: the len is 3 but the index is 99
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +

    错误指向 main.rs 的第 4 行,这里我们尝试访问索引 99。下面的说明(note)行提醒我们可以设置 RUST_BACKTRACE 环境变量来得到一个 backtrace。backtrace 是一个执行到目前位置所有被调用的函数的列表。Rust 的 backtrace 跟其他语言中的一样:阅读 backtrace 的关键是从头开始读直到发现你编写的文件。这就是问题的发源地。这一行往上是你的代码所调用的代码;往下则是调用你的代码的代码。这些行可能包含核心 Rust 代码,标准库代码或用到的 crate 代码。让我们将 RUST_BACKTRACE 环境变量设置为任何不是 0 的值来获取 backtrace 看看。示例 9-2 展示了与你看到类似的输出:

    +
    $ RUST_BACKTRACE=1 cargo run
    +thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 99', src/main.rs:4:5
    +stack backtrace:
    +   0: rust_begin_unwind
    +             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/std/src/panicking.rs:584:5
    +   1: core::panicking::panic_fmt
    +             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/panicking.rs:142:14
    +   2: core::panicking::panic_bounds_check
    +             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/panicking.rs:84:5
    +   3: <usize as core::slice::index::SliceIndex<[T]>>::index
    +             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/slice/index.rs:242:10
    +   4: core::slice::index::<impl core::ops::index::Index<I> for [T]>::index
    +             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/slice/index.rs:18:9
    +   5: <alloc::vec::Vec<T,A> as core::ops::index::Index<I>>::index
    +             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/alloc/src/vec/mod.rs:2591:9
    +   6: panic::main
    +             at ./src/main.rs:4:5
    +   7: core::ops::function::FnOnce::call_once
    +             at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/ops/function.rs:248:5
    +note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
    +
    +

    示例 9-2:当设置 RUST_BACKTRACE 环境变量时 panic! 调用所生成的 backtrace 信息

    +

    这里有大量的输出!你实际看到的输出可能因不同的操作系统和 Rust 版本而有所不同。为了获取带有这些信息的 backtrace,必须启用 debug 标识。当不使用 --release 参数运行 cargo build 或 cargo run 时 debug 标识会默认启用,就像这里一样。

    +

    示例 9-2 的输出中,backtrace 的 12 行指向了我们项目中造成问题的行:src/main.rs 的第 4 行。如果你不希望程序 panic,第一个提到我们编写的代码行的位置是你应该开始调查的,以便查明是什么值如何在这个地方引起了 panic。在示例 9-1 中,我们故意编写会 panic 的代码来演示如何使用 backtrace,修复这个 panic 的方法就是不要尝试在一个只包含三个项的 vector 中请求索引是 100 的元素。当将来你的代码出现了 panic,你需要搞清楚在这特定的场景下代码中执行了什么操作和什么值导致了 panic,以及应当如何处理才能避免这个问题。

    +

    本章后面的小节 “要不要 panic!” 会再次回到 panic! 并讲解何时应该、何时不应该使用 panic! 来处理错误情况。接下来,我们来看看如何使用 Result 来从错误中恢复。

    +

    Result 处理可恢复的错误

    +
    +

    ch09-02-recoverable-errors-with-result.md +
    +commit 699adc6f5cb76f6e9d567ff0a57d8a844ac07a88

    +
    +

    大部分错误并没有严重到需要程序完全停止执行。有时候,一个函数失败,仅仅就是因为一个容易理解和响应的原因。例如,如果因为打开一个并不存在的文件而失败,此时我们可能想要创建这个文件,而不是终止进程。

    +

    回忆一下第二章 “使用 Result 类型来处理潜在的错误” 部分中的那个 Result 枚举,它定义有如下两个成员,OkErr

    +
    #![allow(unused)]
    +fn main() {
    +enum Result<T, E> {
    +    Ok(T),
    +    Err(E),
    +}
    +}
    +

    TE 是泛型类型参数;第十章会详细介绍泛型。现在你需要知道的就是 T 代表成功时返回的 Ok 成员中的数据的类型,而 E 代表失败时返回的 Err 成员中的错误的类型。因为 Result 有这些泛型类型参数,我们可以将 Result 类型和标准库中为其定义的函数用于很多不同的场景,这些情况中需要返回的成功值和失败值可能会各不相同。

    +

    让我们调用一个返回 Result 的函数,因为它可能会失败:如示例 9-3 所示打开一个文件:

    +

    文件名:src/main.rs

    +
    use std::fs::File;
    +
    +fn main() {
    +    let greeting_file_result = File::open("hello.txt");
    +}
    +

    示例 9-3:打开文件

    +

    File::open 的返回值是 Result<T, E>。泛型参数 T 会被 File::open 的实现放入成功返回值的类型 std::fs::File,这是一个文件句柄。错误返回值使用的 E 的类型是 std::io::Error。这些返回类型意味着 File::open 调用可能成功并返回一个可以读写的文件句柄。这个函数调用也可能会失败:例如,也许文件不存在,或者可能没有权限访问这个文件。File::open 函数需要一个方法在告诉我们成功与否的同时返回文件句柄或者错误信息。这些信息正好是 Result 枚举所代表的。

    +

    File::open 成功时,greeting_file_result 变量将会是一个包含文件句柄的 Ok 实例。当失败时,greeting_file_result 变量将会是一个包含了更多关于发生了何种错误的信息的 Err 实例。

    +

    我们需要在示例 9-3 的代码中增加根据 File::open 返回值进行不同处理的逻辑。示例 9-4 展示了一个使用基本工具处理 Result 的例子:第六章学习过的 match 表达式。

    +

    文件名:src/main.rs

    +
    use std::fs::File;
    +
    +fn main() {
    +    let greeting_file_result = File::open("hello.txt");
    +
    +    let greeting_file = match greeting_file_result {
    +        Ok(file) => file,
    +        Err(error) => panic!("Problem opening the file: {error:?}"),
    +    };
    +}
    +

    示例 9-4:使用 match 表达式处理可能会返回的 Result 成员

    +

    注意与 Option 枚举一样,Result 枚举和其成员也被导入到了 prelude 中,所以就不需要在 match 分支中的 OkErr 之前指定 Result::

    +

    这里我们告诉 Rust 当结果是 Ok 时,返回 Ok 成员中的 file 值,然后将这个文件句柄赋值给变量 greeting_filematch 之后,我们可以利用这个文件句柄来进行读写。

    +

    match 的另一个分支处理从 File::open 得到 Err 值的情况。在这种情况下,我们选择调用 panic! 宏。如果当前目录没有一个叫做 hello.txt 的文件,当运行这段代码时会看到如下来自 panic! 宏的输出:

    +
    $ cargo run
    +   Compiling error-handling v0.1.0 (file:///projects/error-handling)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.73s
    +     Running `target/debug/error-handling`
    +thread 'main' panicked at src/main.rs:8:23:
    +Problem opening the file: Os { code: 2, kind: NotFound, message: "No such file or directory" }
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +

    一如既往,此输出准确地告诉了我们到底出了什么错。

    +

    匹配不同的错误

    +

    示例 9-4 中的代码不管 File::open 是因为什么原因失败都会 panic!。我们真正希望的是对不同的错误原因采取不同的行为:如果 File::open 因为文件不存在而失败,我们希望创建这个文件并返回新文件的句柄。如果 File::open 因为任何其他原因失败,例如没有打开文件的权限,我们仍然希望像示例 9-4 那样 panic!。让我们看看示例 9-5,其中 match 增加了另一个分支:

    +

    文件名:src/main.rs

    +
    use std::fs::File;
    +use std::io::ErrorKind;
    +
    +fn main() {
    +    let greeting_file_result = File::open("hello.txt");
    +
    +    let greeting_file = match greeting_file_result {
    +        Ok(file) => file,
    +        Err(error) => match error.kind() {
    +            ErrorKind::NotFound => match File::create("hello.txt") {
    +                Ok(fc) => fc,
    +                Err(e) => panic!("Problem creating the file: {e:?}"),
    +            },
    +            other_error => {
    +                panic!("Problem opening the file: {other_error:?}");
    +            }
    +        },
    +    };
    +}
    +

    示例 9-5:使用不同的方式处理不同类型的错误

    +

    File::open 返回的 Err 成员中的值类型 io::Error,它是一个标准库中提供的结构体。这个结构体有一个返回 io::ErrorKind 值的 kind 方法可供调用。io::ErrorKind 是一个标准库提供的枚举,它的成员对应 io 操作可能导致的不同错误类型。我们感兴趣的成员是 ErrorKind::NotFound,它代表尝试打开的文件并不存在。这样,match 就匹配完 greeting_file_result 了,不过对于 error.kind() 还有一个内层 match

    +

    我们希望在内层 match 中检查的条件是 error.kind() 的返回值是否为 ErrorKindNotFound 成员。如果是,则尝试通过 File::create 创建文件。然而因为 File::create 也可能会失败,还需要增加一个内层 match 语句。当文件不能被创建,会打印出一个不同的错误信息。外层 match 的最后一个分支保持不变,这样对任何除了文件不存在的错误会使程序 panic。

    +
    +

    不同于使用 matchResult<T, E>

    +

    这里有好多 matchmatch 确实很强大,不过也非常的原始。第十三章我们会介绍闭包(closure),它会和定义在 Result<T, E> 中的很多方法一起使用。在处理代码中的 Result<T, E> 值时,相比于使用 match ,使用这些方法会更加简洁。

    +

    例如,这是另一个编写与示例 9-5 逻辑相同但是使用闭包和 unwrap_or_else 方法的例子:

    +
    use std::fs::File;
    +use std::io::ErrorKind;
    +
    +fn main() {
    +    let greeting_file = File::open("hello.txt").unwrap_or_else(|error| {
    +        if error.kind() == ErrorKind::NotFound {
    +            File::create("hello.txt").unwrap_or_else(|error| {
    +                panic!("Problem creating the file: {:?}", error);
    +            })
    +        } else {
    +            panic!("Problem opening the file: {:?}", error);
    +        }
    +    });
    +}
    +

    虽然这段代码有着如示例 9-5 一样的行为,但并没有包含任何 match 表达式且更容易阅读。在阅读完第十三章后再回到这个例子,并查看标准库文档 unwrap_or_else 方法都做了什么操作。在处理错误时,还有很多这类方法可以消除大量嵌套的 match 表达式。

    +
    +

    失败时 panic 的简写:unwrapexpect

    +

    match 能够胜任它的工作,不过它可能有点冗长并且不总是能很好的表明其意图。Result<T, E> 类型定义了很多辅助方法来处理各种情况。其中之一叫做 unwrap,它的实现就类似于示例 9-4 中的 match 语句。如果 Result 值是成员 Okunwrap 会返回 Ok 中的值。如果 Result 是成员 Errunwrap 会为我们调用 panic!。这里是一个实践 unwrap 的例子:

    +

    文件名:src/main.rs

    +
    use std::fs::File;
    +
    +fn main() {
    +    let greeting_file = File::open("hello.txt").unwrap();
    +}
    +

    如果调用这段代码时不存在 hello.txt 文件,我们将会看到一个 unwrap 调用 panic! 时提供的错误信息:

    +
    thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os {
    +code: 2, kind: NotFound, message: "No such file or directory" }',
    +src/main.rs:4:49
    +
    +

    还有另一个类似于 unwrap 的方法它还允许我们选择 panic! 的错误信息:expect。使用 expect 而不是 unwrap 并提供一个好的错误信息可以表明你的意图并更易于追踪 panic 的根源。expect 的语法看起来像这样:

    +

    文件名:src/main.rs

    +
    use std::fs::File;
    +
    +fn main() {
    +    let greeting_file = File::open("hello.txt")
    +        .expect("hello.txt should be included in this project");
    +}
    +

    expectunwrap 的使用方式一样:返回文件句柄或调用 panic! 宏。expect 在调用 panic! 时使用的错误信息将是我们传递给 expect 的参数,而不像 unwrap 那样使用默认的 panic! 信息。它看起来像这样:

    +
    thread 'main' panicked at 'hello.txt should be included in this project: Error
    +{ repr: Os { code: 2, message: "No such file or directory" } }',
    +src/libcore/result.rs:906:4
    +
    +

    在生产级别的代码中,大部分 Rustaceans 选择 expect 而不是 unwrap 并提供更多关于为何操作期望是一直成功的上下文。如此如果该假设真的被证明是错的,你也有更多的信息来用于调试。

    +

    传播错误

    +

    当编写一个其实先会调用一些可能会失败的操作的函数时,除了在这个函数中处理错误外,还可以选择让调用者知道这个错误并决定该如何处理。这被称为 传播propagating)错误,这样能更好的控制代码调用,因为比起你代码所拥有的上下文,调用者可能拥有更多信息或逻辑来决定应该如何处理错误。

    +

    例如,示例 9-6 展示了一个从文件中读取用户名的函数。如果文件不存在或不能读取,这个函数会将这些错误返回给调用它的代码:

    +

    文件名:src/main.rs

    +
    #![allow(unused)]
    +fn main() {
    +use std::fs::File;
    +use std::io::{self, Read};
    +
    +fn read_username_from_file() -> Result<String, io::Error> {
    +    let username_file_result = File::open("hello.txt");
    +
    +    let mut username_file = match username_file_result {
    +        Ok(file) => file,
    +        Err(e) => return Err(e),
    +    };
    +
    +    let mut username = String::new();
    +
    +    match username_file.read_to_string(&mut username) {
    +        Ok(_) => Ok(username),
    +        Err(e) => Err(e),
    +    }
    +}
    +}
    +

    示例 9-6:一个函数使用 match 将错误返回给代码调用者

    +

    这个函数可以编写成更加简短的形式,不过我们以大量手动处理开始以便探索错误处理;在最后我们会展示更短的形式。让我们看看函数的返回值:Result<String, io::Error>。这意味着函数返回一个 Result<T, E> 类型的值,其中泛型参数 T 的具体类型是 String,而 E 的具体类型是 io::Error

    +

    如果这个函数没有出任何错误成功返回,函数的调用者会收到一个包含 StringOk 值 —— 函数从文件中读取到的用户名。如果函数遇到任何错误,函数的调用者会收到一个 Err 值,它储存了一个包含更多这个问题相关信息的 io::Error 实例。这里选择 io::Error 作为函数的返回值是因为它正好是函数体中那两个可能会失败的操作的错误返回值:File::open 函数和 read_to_string 方法。

    +

    函数体以调用 File::open 函数开始。接着使用 match 处理返回值 Result,类似示例 9-4,如果 File::open 成功了,模式变量 file 中的文件句柄就变成了可变变量 username_file 中的值,接着函数继续执行。在 Err 的情况下,我们没有调用 panic!,而是使用 return 关键字提前结束整个函数,并将来自 File::open 的错误值(现在在模式变量 e 中)作为函数的错误值传回给调用者。

    +

    所以,如果在 username_file 中有一个文件句柄,该函数随后会在变量 username 中创建一个新的 String 并调用文件句柄 username_file 上的 read_to_string 方法,以将文件的内容读入 usernameread_to_string 方法也返回一个 Result,因为它可能会失败,哪怕是 File::open 已经成功了。因此,我们需要另一个 match 来处理这个 Result:如果 read_to_string 执行成功,那么这个函数也就成功了,我们将从文件中读取的用户名返回,此时用户名位于被封装进 Okusername 中。如果 read_to_string 执行失败,则像之前处理 File::open 的返回值的 match 那样返回错误值。然而,我们无需显式调用 return 语句,因为这是函数的最后一个表达式。

    +

    调用这个函数的代码最终会得到一个包含用户名的 Ok 值,或者一个包含 io::ErrorErr 值。我们无从得知调用者会如何处理这些值。例如,如果他们得到了一个 Err 值,他们可能会选择 panic! 并使程序崩溃、使用一个默认的用户名或者从文件之外的地方寻找用户名。我们没有足够的信息知晓调用者具体会如何尝试,所以将所有的成功或失败信息向上传播,让他们选择合适的处理方法。

    +

    这种传播错误的模式在 Rust 是如此的常见,以至于 Rust 提供了 ? 问号运算符来使其更易于处理。

    +

    传播错误的简写:? 运算符

    +

    示例 9-7 展示了一个 read_username_from_file 的实现,它实现了与示例 9-6 中的代码相同的功能,不过这个实现使用了 ? 运算符:

    +

    文件名:src/main.rs

    +
    #![allow(unused)]
    +fn main() {
    +use std::fs::File;
    +use std::io::{self, Read};
    +
    +fn read_username_from_file() -> Result<String, io::Error> {
    +    let mut username_file = File::open("hello.txt")?;
    +    let mut username = String::new();
    +    username_file.read_to_string(&mut username)?;
    +    Ok(username)
    +}
    +}
    +

    示例 9-7:一个使用 ? 运算符向调用者返回错误的函数

    +

    Result 值之后的 ? 被定义为与示例 9-6 中定义的处理 Result 值的 match 表达式有着完全相同的工作方式。如果 Result 的值是 Ok,这个表达式将会返回 Ok 中的值而程序将继续执行。如果值是 ErrErr 将作为整个函数的返回值,就好像使用了 return 关键字一样,这样错误值就被传播给了调用者。

    +

    示例 9-6 中的 match 表达式与 ? 运算符所做的有一点不同:? 运算符所使用的错误值被传递给了 from 函数,它定义于标准库的 From trait 中,其用来将错误从一种类型转换为另一种类型。当 ? 运算符调用 from 函数时,收到的错误类型被转换为由当前函数返回类型所指定的错误类型。这在当函数返回单个错误类型来代表所有可能失败的方式时很有用,即使其可能会因很多种原因失败。

    +

    例如,我们可以将示例 9-7 中的 read_username_from_file 函数修改为返回一个自定义的 OurError 错误类型。如果我们也定义了 impl From<io::Error> for OurError 来从 io::Error 构造一个 OurError 实例,那么 read_username_from_file 函数体中的 ? 运算符调用会调用 from 并转换错误而无需在函数中增加任何额外的代码。

    +

    在示例 9-7 的上下文中,File::open 调用结尾的 ? 会将 Ok 中的值返回给变量 username_file。如果发生了错误,? 运算符会使整个函数提前返回并将任何 Err 值返回给调用代码。同理也适用于 read_to_string 调用结尾的 ?

    +

    ? 运算符消除了大量样板代码并使得函数的实现更简单。我们甚至可以在 ? 之后直接使用链式方法调用来进一步缩短代码,如示例 9-8 所示:

    +

    文件名:src/main.rs

    +
    #![allow(unused)]
    +fn main() {
    +use std::fs::File;
    +use std::io::{self, Read};
    +
    +fn read_username_from_file() -> Result<String, io::Error> {
    +    let mut username = String::new();
    +
    +    File::open("hello.txt")?.read_to_string(&mut username)?;
    +
    +    Ok(username)
    +}
    +}
    +

    示例 9-8:问号运算符之后的链式方法调用

    +

    username 中创建新的 String 被放到了函数开头;这一部分没有变化。我们对 File::open("hello.txt")? 的结果直接链式调用了 read_to_string,而不再创建变量 username_file。仍然需要 read_to_string 调用结尾的 ?,而且当 File::openread_to_string 都成功没有失败时返回包含用户名 usernameOk 值。其功能再一次与示例 9-6 和示例 9-7 保持一致,不过这是一个与众不同且更符合工程学(ergonomic)的写法。

    +

    示例 9-9 展示了一个使用 fs::read_to_string 的更为简短的写法:

    +

    文件名:src/main.rs

    +
    #![allow(unused)]
    +fn main() {
    +use std::fs;
    +use std::io;
    +
    +fn read_username_from_file() -> Result<String, io::Error> {
    +    fs::read_to_string("hello.txt")
    +}
    +}
    +

    示例 9-9: 使用 fs::read_to_string 而不是打开后读取文件

    +

    将文件读取到一个字符串是相当常见的操作,所以 Rust 提供了名为 fs::read_to_string 的函数,它会打开文件、新建一个 String、读取文件的内容,并将内容放入 String,接着返回它。当然,这样做就没有展示所有这些错误处理的机会了,所以我们最初就选择了艰苦的道路。

    +

    哪里可以使用 ? 运算符

    +

    ? 运算符只能被用于返回值与 ? 作用的值相兼容的函数。因为 ? 运算符被定义为从函数中提早返回一个值,这与示例 9-6 中的 match 表达式有着完全相同的工作方式。示例 9-6 中 match 作用于一个 Result 值,提早返回的分支返回了一个 Err(e) 值。函数的返回值必须是 Result 才能与这个 return 相兼容。

    +

    在示例 9-10 中,让我们看看在返回值不兼容的 main 函数中使用 ? 运算符会得到什么错误:

    +

    文件名:src/main.rs

    +
    use std::fs::File;
    +
    +fn main() {
    +    let greeting_file = File::open("hello.txt")?;
    +}
    +

    示例 9-10: 尝试在返回 ()main 函数中使用 ? 的代码不能编译

    +

    这段代码打开一个文件,这可能会失败。? 运算符作用于 File::open 返回的 Result 值,不过 main 函数的返回类型是 () 而不是 Result。当编译这些代码,会得到如下错误信息:

    +
    $ cargo run
    +   Compiling error-handling v0.1.0 (file:///projects/error-handling)
    +error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`)
    + --> src/main.rs:4:48
    +  |
    +3 | fn main() {
    +  | --------- this function should return `Result` or `Option` to accept `?`
    +4 |     let greeting_file = File::open("hello.txt")?;
    +  |                                                ^ cannot use the `?` operator in a function that returns `()`
    +  |
    +  = help: the trait `FromResidual<Result<Infallible, std::io::Error>>` is not implemented for `()`
    +help: consider adding return type
    +  |
    +3 ~ fn main() -> Result<(), Box<dyn std::error::Error>> {
    +4 |     let greeting_file = File::open("hello.txt")?;
    +5 + 
    +6 +     Ok(())
    +7 + }
    +  |
    +
    +For more information about this error, try `rustc --explain E0277`.
    +error: could not compile `error-handling` (bin "error-handling") due to 1 previous error
    +
    +

    这个错误指出只能在返回 Result 或者其它实现了 FromResidual 的类型的函数中使用 ? 运算符。

    +

    为了修复这个错误,有两个选择。一个是,如果没有限制的话将函数的返回值改为 Result<T, E>。另一个是使用 matchResult<T, E> 的方法中合适的一个来处理 Result<T, E>

    +

    错误信息也提到 ? 也可用于 Option<T> 值。如同对 Result 使用 ? 一样,只能在返回 Option 的函数中对 Option 使用 ?。在 Option<T> 上调用 ? 运算符的行为与 Result<T, E> 类似:如果值是 None,此时 None 会从函数中提前返回。如果值是 SomeSome 中的值作为表达式的返回值同时函数继续。示例 9-11 中有一个从给定文本中返回第一行最后一个字符的函数的例子:

    +
    fn last_char_of_first_line(text: &str) -> Option<char> {
    +    text.lines().next()?.chars().last()
    +}
    +
    +fn main() {
    +    assert_eq!(
    +        last_char_of_first_line("Hello, world\nHow are you today?"),
    +        Some('d')
    +    );
    +
    +    assert_eq!(last_char_of_first_line(""), None);
    +    assert_eq!(last_char_of_first_line("\nhi"), None);
    +}
    +

    示例 9-11: 在 Option<T> 值上使用 ? 运算符

    +

    这个函数返回 Option<char> 因为它可能会在这个位置找到一个字符,也可能没有字符。这段代码获取 text 字符串 slice 作为参数并调用其 lines 方法,这会返回一个字符串中每一行的迭代器。因为函数希望检查第一行,所以调用了迭代器 next 来获取迭代器中第一个值。如果 text 是空字符串,next 调用会返回 None,此时我们可以使用 ? 来停止并从 last_char_of_first_line 返回 None。如果 text 不是空字符串,next 会返回一个包含 text 中第一行的字符串 slice 的 Some 值。

    +

    ? 会提取这个字符串 slice,然后可以在字符串 slice 上调用 chars 来获取字符的迭代器。我们感兴趣的是第一行的最后一个字符,所以可以调用 last 来返回迭代器的最后一项。这是一个 Option,因为有可能第一行是一个空字符串,例如 text 以一个空行开头而后面的行有文本,像是 "\nhi"。不过,如果第一行有最后一个字符,它会返回在一个 Some 成员中。? 运算符作用于其中给了我们一个简洁的表达这种逻辑的方式。如果我们不能在 Option 上使用 ? 运算符,则不得不使用更多的方法调用或者 match 表达式来实现这些逻辑。

    +

    注意你可以在返回 Result 的函数中对 Result 使用 ? 运算符,可以在返回 Option 的函数中对 Option 使用 ? 运算符,但是不可以混合搭配。? 运算符不会自动将 Result 转化为 Option,反之亦然;在这些情况下,可以使用类似 Resultok 方法或者 Optionok_or 方法来显式转换。

    +

    目前为止,我们所使用的所有 main 函数都返回 ()main 函数是特殊的因为它是可执行程序的入口点和退出点,为了使程序能正常工作,其可以返回的类型是有限制的。

    +

    幸运的是 main 函数也可以返回 Result<(), E>,示例 9-12 中的代码来自示例 9-10 不过修改了 main 的返回值为 Result<(), Box<dyn Error>> 并在结尾增加了一个 Ok(()) 作为返回值。这段代码可以编译:

    +
    use std::error::Error;
    +use std::fs::File;
    +
    +fn main() -> Result<(), Box<dyn Error>> {
    +    let greeting_file = File::open("hello.txt")?;
    +
    +    Ok(())
    +}
    +

    示例 9-12: 修改 main 返回 Result<(), E> 允许对 Result 值使用 ? 运算符

    +

    Box<dyn Error> 类型是一个 trait 对象trait object)第十八章 顾及不同类型值的 trait 对象” 部分会做介绍。目前可以将 Box<dyn Error> 理解为 “任何类型的错误”。在返回 Box<dyn Error> 错误类型 main 函数中对 Result 使用 ? 是允许的,因为它允许任何 Err 值提前返回。即便 main 函数体从来只会返回 std::io::Error 错误类型,通过指定 Box<dyn Error>,这个签名也仍是正确的,甚至当 main 函数体中增加更多返回其他错误类型的代码时也是如此。

    +

    main 函数返回 Result<(), E>,如果 main 返回 Ok(()) 可执行程序会以 0 值退出,而如果 main 返回 Err 值则会以非零值退出;成功退出的程序会返回整数 0,运行错误的程序会返回非 0 的整数。Rust 也会从二进制程序中返回与这个惯例相兼容的整数。

    +

    main 函数也可以返回任何实现了 std::process::Termination trait 的类型,它包含了一个返回 ExitCodereport 函数。请查阅标准库文档了解更多为自定义类型实现 Termination trait 的细节。

    +

    现在我们讨论过了调用 panic! 或返回 Result 的细节,是时候回到它们各自适合哪些场景的话题了。

    +

    要不要 panic!

    +
    +

    ch09-03-to-panic-or-not-to-panic.md +
    +commit dd8f47a74b67178cea8c832e3b4eaf3bb515bd72

    +
    +

    那么,该如何决定何时应该 panic! 以及何时应该返回 Result 呢?如果代码 panic,就没有恢复的可能。你可以选择对任何错误场景都调用 panic!,不管是否有可能恢复,不过这样就是你代替调用者决定了这是不可恢复的。选择返回 Result 值的话,就将选择权交给了调用者,而不是代替他们做出决定。调用者可能会选择以符合他们场景的方式尝试恢复,或者也可能干脆就认为 Err 是不可恢复的,所以他们也可能会调用 panic! 并将可恢复的错误变成了不可恢复的错误。因此返回 Result 是定义可能会失败的函数的一个好的默认选择。

    +

    在一些类似示例、原型代码(prototype code)和测试中,panic 比返回 Result 更为合适,下文中会讨论合适的原因,紧接着讨论另外一种特殊情况,即有些场景编译器无法认识这个分支代码是不可能走到的,但是程序员可以判断出来的,这种场景也可以用 panic!。另外章节最后会总结一些在库代码中如何决定是否要 panic 的通用指导原则。

    +

    示例、代码原型和测试都非常适合 panic

    +

    当你编写一个示例来展示一些概念时,在拥有健壮的错误处理代码的同时也会使得例子不那么明确。例如,调用一个类似 unwrap 这样可能 panic! 的方法可以被理解为一个你实际希望程序处理错误方式的占位符,它根据其余代码运行方式可能会各不相同。

    +

    类似地,在我们准备好决定如何处理错误之前,unwrapexpect方法在原型设计时非常方便。当我们准备好让程序更加健壮时,它们会在代码中留下清晰的标记。

    +

    如果方法调用在测试中失败了,我们希望这个测试都失败,即便这个方法并不是需要测试的功能。因为 panic! 会将测试标记为失败,此时调用 unwrapexpect 是恰当的。

    +

    当我们比编译器知道更多的情况

    +

    当你有一些其他的逻辑来确保 Result 会是 Ok 值时,调用 unwrap 或者 expect 也是合适的,虽然编译器无法理解这种逻辑。你仍然需要处理一个 Result 值:即使在你的特定情况下逻辑上是不可能的,你所调用的任何操作仍然有可能失败。如果通过人工检查代码来确保永远也不会出现 Err 值,那么调用 unwrap 也是完全可以接受的,这里是一个例子:

    +
    fn main() {
    +    use std::net::IpAddr;
    +
    +    let home: IpAddr = "127.0.0.1"
    +        .parse()
    +        .expect("Hardcoded IP address should be valid");
    +}
    +

    我们通过解析一个硬编码的字符来创建一个 IpAddr 实例。可以看出 127.0.0.1 是一个有效的 IP 地址,所以这里使用 expect 是可以接受的。然而,拥有一个硬编码的有效的字符串也不能改变 parse 方法的返回值类型:它仍然是一个 Result 值,而编译器仍然会要求我们处理这个 Result,好像还是有可能出现 Err 成员那样。这是因为编译器还没有智能到可以识别出这个字符串总是一个有效的 IP 地址。如果 IP 地址字符串来源于用户而不是硬编码进程序中的话,那么就 确实 有失败的可能性,这时就绝对需要我们以一种更健壮的方式处理 Result 了。提及这个 IP 地址是硬编码的假设会促使我们将来把 expect 替换为更好的错误处理,我们应该从其它代码获取 IP 地址。

    +

    错误处理指导原则

    +

    在当有可能会导致有害状态的情况下建议使用 panic! —— 在这里,有害状态是指当一些假设、保证、协议或不可变性被打破的状态,例如无效的值、自相矛盾的值或者被传递了不存在的值 —— 外加如下几种情况:

    +
      +
    • 有害状态是非预期的行为,与偶尔会发生的行为相对,比如用户输入了错误格式的数据。
    • +
    • 在此之后代码的运行依赖于不处于这种有害状态,而不是在每一步都检查是否有问题。
    • +
    • 没有可行的手段来将有害状态信息编码进所使用的类型中的情况。我们会在第十八章 “将状态和行为编码为类型” 部分通过一个例子来说明我们的意思。
    • +
    +

    如果别人调用你的代码并传递了一个没有意义的值,尽最大可能返回一个错误,如此库的用户就可以决定在这种情况下该如何处理。然而在继续执行代码是不安全或有害的情况下,最好的选择可能是调用 panic! 并警告库的用户他们的代码中有 bug,这样他们就会在开发时进行修复。类似的,如果你正在调用不受你控制的外部代码,并且它返回了一个你无法修复的无效状态,那么 panic! 往往是合适的。

    +

    然而当错误预期会出现时,返回 Result 仍要比调用 panic! 更为合适。这样的例子包括解析器接收到格式错误的数据,或者 HTTP 请求返回了一个表明触发了限流的状态。在这些例子中,应该通过返回 Result 来表明失败预期是可能的,这样将有害状态向上传播,调用者就可以决定该如何处理这个问题。使用 panic! 来处理这些情况就不是最好的选择。

    +

    当你的代码在进行一个使用无效值进行调用时可能将用户置于风险中的操作时,代码应该首先验证值是有效的,并在其无效时 panic!。这主要是出于安全的原因:尝试操作无效数据会暴露代码漏洞,这就是标准库在尝试越界访问数组时会 panic! 的主要原因:尝试访问不属于当前数据结构的内存是一个常见的安全隐患。函数通常都遵循 契约contracts):它们的行为只有在输入满足特定条件时才能得到保证。当违反契约时 panic 是有道理的,因为这通常代表调用方的 bug,而且这也不是那种你希望所调用的代码必须处理的错误。事实上所调用的代码也没有合理的方式来恢复,而是需要调用方的 程序员 修复其代码。函数的契约,尤其是当违反它会造成 panic 的契约,应该在函数的 API 文档中得到解释。

    +

    虽然在所有函数中都拥有许多错误检查是冗长而烦人的。幸运的是,可以利用 Rust 的类型系统(以及编译器的类型检查)为你进行很多检查。如果函数有一个特定类型的参数,可以在知晓编译器已经确保其拥有一个有效值的前提下进行你的代码逻辑。例如,如果你使用了一个并不是 Option 的类型,则程序期望它是 有值 的并且不是 空值。你的代码无需处理 SomeNone 这两种情况,它只会有一种情况就是绝对会有一个值。尝试向函数传递空值的代码甚至根本不能编译,所以你的函数在运行时没有必要判空。另外一个例子是使用像 u32 这样的无符号整型,也会确保它永远不为负。

    +

    创建自定义类型进行有效性验证

    +

    让我们使用 Rust 类型系统的思想来进一步确保值的有效性,并尝试创建一个自定义类型以进行验证。回忆一下第二章的猜猜看游戏,我们的代码要求用户猜测一个 1 到 100 之间的数字,在将其与秘密数字做比较之前我们从未验证用户的猜测是位于这两个数字之间的,我们只验证它是否为正。在这种情况下,其影响并不是很严重:“Too high” 或 “Too low” 的输出仍然是正确的。但是这是一个很好的引导用户得出有效猜测的辅助,例如当用户猜测一个超出范围的数字或者输入字母时采取不同的行为。

    +

    一种实现方式是将猜测解析成 i32 而不仅仅是 u32,来默许输入负数,接着检查数字是否在范围内:

    +

    文件名:src/main.rs

    +
    use rand::Rng;
    +use std::cmp::Ordering;
    +use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    let secret_number = rand::thread_rng().gen_range(1..=100);
    +
    +    loop {
    +        // --snip--
    +
    +        println!("Please input your guess.");
    +
    +        let mut guess = String::new();
    +
    +        io::stdin()
    +            .read_line(&mut guess)
    +            .expect("Failed to read line");
    +
    +        let guess: i32 = match guess.trim().parse() {
    +            Ok(num) => num,
    +            Err(_) => continue,
    +        };
    +
    +        if guess < 1 || guess > 100 {
    +            println!("The secret number will be between 1 and 100.");
    +            continue;
    +        }
    +
    +        match guess.cmp(&secret_number) {
    +            // --snip--
    +            Ordering::Less => println!("Too small!"),
    +            Ordering::Greater => println!("Too big!"),
    +            Ordering::Equal => {
    +                println!("You win!");
    +                break;
    +            }
    +        }
    +    }
    +}
    +

    if 表达式检查了值是否超出范围,告诉用户出了什么问题,并调用 continue 开始下一次循环,请求另一个猜测。if 表达式之后,就可以在知道 guess 在 1 到 100 之间的情况下与秘密数字作比较了。

    +

    然而,这并不是一个理想的解决方案:如果让程序仅仅处理 1 到 100 之间的值是一个绝对需要满足的要求,而且程序中的很多函数都有这样的要求,在每个函数中都有这样的检查将是非常冗余的(并可能潜在的影响性能)。

    +

    相反我们可以创建一个新类型来将验证放入创建其实例的函数中,而不是到处重复这些检查。这样就可以安全地在函数签名中使用新类型并相信它们接收到的值。示例 9-13 中展示了一个定义 Guess 类型的方法,只有在 new 函数接收到 1 到 100 之间的值时才会创建 Guess 的实例:

    +

    文件名:src/lib.rs

    +
    #![allow(unused)]
    +fn main() {
    +pub struct Guess {
    +    value: i32,
    +}
    +
    +impl Guess {
    +    pub fn new(value: i32) -> Guess {
    +        if value < 1 || value > 100 {
    +            panic!("Guess value must be between 1 and 100, got {value}.");
    +        }
    +
    +        Guess { value }
    +    }
    +
    +    pub fn value(&self) -> i32 {
    +        self.value
    +    }
    +}
    +}
    +

    示例 9-13:一个 Guess 类型,它只在值位于 1 和 100 之间时才继续

    +

    首先,我们定义了一个包含 i32 类型字段 value 的结构体 Guess。这里是储存猜测值的地方。

    +

    接着在 Guess 上实现了一个叫做 new 的关联函数来创建 Guess 的实例。new 定义为接收一个 i32 类型的参数 value 并返回一个 Guessnew 函数中代码的测试确保了其值是在 1 到 100 之间的。如果 value 没有通过测试则调用 panic!,这会警告调用这个函数的程序员有一个需要修改的 bug,因为创建一个 value 超出范围的 Guess 将会违反 Guess::new 所遵循的契约。Guess::new 会出现 panic 的条件应该在其公有 API 文档中被提及;第十四章会涉及到在 API 文档中表明 panic! 可能性的相关规则。如果 value 通过了测试,我们新建一个 Guess,其字段 value 将被设置为参数 value 的值,接着返回这个 Guess

    +

    接着,我们实现了一个借用了 self 的方法 value,它没有任何其他参数并返回一个 i32。这类方法有时被称为 getter,因为它的目的就是返回对应字段的数据。这样的公有方法是必要的,因为 Guess 结构体的 value 字段是私有的。私有的字段 value 是很重要的,这样使用 Guess 结构体的代码将不允许直接设置 value 的值:调用者 必须 使用 Guess::new 方法来创建一个 Guess 的实例,这就确保了不会存在一个 value 没有通过 Guess::new 函数的条件检查的 Guess

    +

    于是,一个接收(或返回)1 到 100 之间数字的函数就可以声明为接收(或返回) Guess的实例,而不是 i32,同时其函数体中也无需进行任何额外的检查。

    +

    总结

    +

    Rust 的错误处理功能被设计为帮助你编写更加健壮的代码。panic! 宏代表一个程序无法处理的状态,并停止执行而不是使用无效或不正确的值继续处理。Rust 类型系统的 Result 枚举代表操作可能会在一种可以恢复的情况下失败。可以使用 Result 来告诉代码调用者他需要处理潜在的成功或失败。在适当的场景使用 panic!Result 将会使你的代码在面对不可避免的错误时显得更加可靠。

    +

    现在我们已经见识过了标准库中 OptionResult 泛型枚举的能力了,在下一章让我们聊聊泛型是如何工作的,以及如何在你的代码中使用它们。

    +

    泛型、Trait 和生命周期

    +
    +

    ch10-00-generics.md +
    +commit 4aa96a3d20570f868bd20e8e3e865b047284be30

    +
    +

    每一个编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是 泛型generics)。泛型是具体类型或其他属性的抽象替代。我们可以表达泛型的属性,比如它们的行为或如何与其他泛型相关联,而不需要在编写和编译代码时知道它们在这里实际上代表什么。

    +

    函数可以获取一些不同于 i32String 这样具体类型的泛型参数,就像一个获取未知类型值的函数可以对多种具体类型的值运行同一段代码一样。事实上我们已经使用过第六章的 Option<T>,第八章的 Vec<T>HashMap<K, V>,以及第九章的 Result<T, E> 这些泛型了。本章会探索如何使用泛型定义我们自己的类型、函数和方法!

    +

    首先,我们将回顾一下提取函数以减少代码重复的机制。接下来,我们将使用相同的技术,从两个仅参数类型不同的函数中创建一个泛型函数。我们也会讲到结构体和枚举定义中的泛型。

    +

    之后,我们讨论 trait,这是一个定义泛型行为的方法。trait 可以与泛型结合来将泛型限制为只接受拥有特定行为的类型,而不是任意类型。

    +

    最后介绍 生命周期lifetimes),它是一类允许我们向编译器提供引用如何相互关联的泛型。Rust 的生命周期功能允许在很多场景下借用值的同时仍然使编译器能够检查这些引用的有效性。

    +

    提取函数来减少重复

    +

    泛型允许我们使用一个可以代表多种类型的占位符来替换特定类型,以此来减少代码冗余。在深入了解泛型的语法之前,我们首先来看一种没有使用泛型的减少冗余的方法,即提取一个函数。在这个函数中,我们用一个可以代表多种值的占位符来替换具体的值。接着我们使用相同的技术来提取一个泛型函数!!通过学习如何识别并提取可以整合进一个函数的重复代码,你也会开始识别出可以使用泛型的重复代码。

    +

    让我们从下面这个寻找列表中最大值的小程序开始,如示例 10-1 所示:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let number_list = vec![34, 50, 25, 100, 65];
    +
    +    let mut largest = &number_list[0];
    +
    +    for number in &number_list {
    +        if number > largest {
    +            largest = number;
    +        }
    +    }
    +
    +    println!("The largest number is {largest}");
    +    assert_eq!(*largest, 100);
    +}
    +

    示例 10-1:在一个数字列表中寻找最大值的函数

    +

    这段代码获取一个整型列表,存放在变量 number_list 中。它将列表的第一个数字的引用放入了变量 largest 中。接着遍历了列表中的所有数字,如果当前值大于 largest 中储存的值,将 largest 替换为这个值。如果当前值小于或者等于目前为止的最大值,largest 保持不变。当列表中所有值都被考虑到之后,largest 将会指向最大值,在这里也就是 100。

    +

    我们的任务是在两个不同的数字列表中寻找最大值。为此我们可以选择重复示例 10-1 中的代码在程序的两个不同位置使用相同的逻辑,如示例 10-2 所示:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let number_list = vec![34, 50, 25, 100, 65];
    +
    +    let mut largest = &number_list[0];
    +
    +    for number in &number_list {
    +        if number > largest {
    +            largest = number;
    +        }
    +    }
    +
    +    println!("The largest number is {largest}");
    +
    +    let number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8];
    +
    +    let mut largest = &number_list[0];
    +
    +    for number in &number_list {
    +        if number > largest {
    +            largest = number;
    +        }
    +    }
    +
    +    println!("The largest number is {largest}");
    +}
    +

    示例 10-2:寻找 两个 数字列表最大值的代码

    +

    虽然代码能够执行,但是重复的代码是冗余且容易出错的,更新逻辑时我们不得不记住需要修改多处地方的代码。

    +

    为了消除重复,我们要创建一层抽象,定义一个处理任意整型列表作为参数的函数。这个方案使得代码更简洁,并且表现了寻找任意列表中最大值这一概念。

    +

    在示例 10-3 的程序中将寻找最大值的代码提取到了一个叫做 largest 的函数中。接着我们调用该函数来寻找示例 10-2 中两个列表中的最大值。之后也可以将该函数用于任何可能的 i32 值的列表。

    +

    文件名:src/main.rs

    +
    fn largest(list: &[i32]) -> &i32 {
    +    let mut largest = &list[0];
    +
    +    for item in list {
    +        if item > largest {
    +            largest = item;
    +        }
    +    }
    +
    +    largest
    +}
    +
    +fn main() {
    +    let number_list = vec![34, 50, 25, 100, 65];
    +
    +    let result = largest(&number_list);
    +    println!("The largest number is {result}");
    +    assert_eq!(*result, 100);
    +
    +    let number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8];
    +
    +    let result = largest(&number_list);
    +    println!("The largest number is {result}");
    +    assert_eq!(*result, 6000);
    +}
    +

    示例 10-3:抽象后的寻找两个数字列表最大值的代码

    +

    largest 函数有一个参数 list,它代表会传递给函数的任何具体的 i32值的 slice。函数定义中的 list 代表任何 &[i32]。当调用 largest 函数时,其代码实际上运行于我们传递的特定值上。

    +

    总的来说,从示例 10-2 到示例 10-3 中涉及的机制经历了如下几步:

    +
      +
    1. 找出重复代码。
    2. +
    3. 将重复代码提取到了一个函数中,并在函数签名中指定了代码中的输入和返回值。
    4. +
    5. 将重复代码的两个实例,改为调用函数。
    6. +
    +

    接下来我们会使用相同的步骤通过泛型来减少重复。与函数体可以处理任意的 list 而不是具体的值一样,泛型也允许代码处理任意类型。

    +

    如果我们有两个函数,一个寻找一个 i32 值的 slice 中的最大项而另一个寻找 char 值的 slice 中的最大项该怎么办?该如何消除重复呢?让我们拭目以待!

    +

    泛型数据类型

    +
    +

    ch10-01-syntax.md +
    +commit f2a78f64b668f63f581203c6bac509903f7c00ee

    +
    +

    我们可以使用泛型为像函数签名或结构体这样的项创建定义,这样它们就可以用于多种不同的具体数据类型。让我们看看如何使用泛型定义函数、结构体、枚举和方法,然后我们将讨论泛型如何影响代码性能。

    +

    在函数定义中使用泛型

    +

    当使用泛型定义函数时,本来在函数签名中指定参数和返回值的类型的地方,会改用泛型来表示。采用这种技术,使得代码适应性更强,从而为函数的调用者提供更多的功能,同时也避免了代码的重复。

    +

    回到 largest 函数,示例 10-4 中展示了两个函数,它们的功能都是寻找 slice 中最大值。接着我们使用泛型将其合并为一个函数。

    +

    文件名:src/main.rs

    +
    fn largest_i32(list: &[i32]) -> &i32 {
    +    let mut largest = &list[0];
    +
    +    for item in list {
    +        if item > largest {
    +            largest = item;
    +        }
    +    }
    +
    +    largest
    +}
    +
    +fn largest_char(list: &[char]) -> &char {
    +    let mut largest = &list[0];
    +
    +    for item in list {
    +        if item > largest {
    +            largest = item;
    +        }
    +    }
    +
    +    largest
    +}
    +
    +fn main() {
    +    let number_list = vec![34, 50, 25, 100, 65];
    +
    +    let result = largest_i32(&number_list);
    +    println!("The largest number is {result}");
    +    assert_eq!(*result, 100);
    +
    +    let char_list = vec!['y', 'm', 'a', 'q'];
    +
    +    let result = largest_char(&char_list);
    +    println!("The largest char is {result}");
    +    assert_eq!(*result, 'y');
    +}
    +

    示例 10-4:两个函数,不同点只是名称和签名类型

    +

    largest_i32 函数是从示例 10-3 中摘出来的,它用来寻找 slice 中最大的 i32largest_char 函数寻找 slice 中最大的 char。因为两者函数体的代码是一样的,我们可以定义一个函数,再引进泛型参数来消除这种重复。

    +

    为了参数化这个新函数中的这些类型,我们需要为类型参数命名,道理和给函数的形参起名一样。任何标识符都可以作为类型参数的名字。这里选用 T,因为传统上来说,Rust 的类型参数名字都比较短,通常仅为一个字母,同时,Rust 类型名的命名规范是首字母大写驼峰式命名法(UpperCamelCase)。T 作为 “type” 的缩写是大部分 Rust 程序员的首选。

    +

    如果要在函数体中使用参数,就必须在函数签名中声明它的名字,好让编译器知道这个名字指代的是什么。同理,当在函数签名中使用一个类型参数时,必须在使用它之前就声明它。为了定义泛型版本的 largest 函数,类型参数声明位于函数名称与参数列表中间的尖括号 <> 中,像这样:

    +
    fn largest<T>(list: &[T]) -> &T {
    +

    可以这样理解这个定义:函数 largest 有泛型类型 T。它有个参数 list,其类型是元素为 T 的 slice。largest 函数会返回一个与 T 相同类型的引用。

    +

    示例 10-5 中的 largest 函数在它的签名中使用了泛型,统一了两个实现。该示例也展示了如何调用 largest 函数,把 i32 值的 slice 或 char 值的 slice 传给它。请注意这些代码还不能编译,不过稍后在本章会解决这个问题。

    +

    文件名:src/main.rs

    +
    fn largest<T>(list: &[T]) -> &T {
    +    let mut largest = &list[0];
    +
    +    for item in list {
    +        if item > largest {
    +            largest = item;
    +        }
    +    }
    +
    +    largest
    +}
    +
    +fn main() {
    +    let number_list = vec![34, 50, 25, 100, 65];
    +
    +    let result = largest(&number_list);
    +    println!("The largest number is {result}");
    +
    +    let char_list = vec!['y', 'm', 'a', 'q'];
    +
    +    let result = largest(&char_list);
    +    println!("The largest char is {result}");
    +}
    +

    示例 10-5:一个使用泛型参数的 largest 函数定义,尚不能编译

    +

    如果现在就编译这个代码,会出现如下错误:

    +
    $ cargo run
    +   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
    +error[E0369]: binary operation `>` cannot be applied to type `&T`
    + --> src/main.rs:5:17
    +  |
    +5 |         if item > largest {
    +  |            ---- ^ ------- &T
    +  |            |
    +  |            &T
    +  |
    +help: consider restricting type parameter `T`
    +  |
    +1 | fn largest<T: std::cmp::PartialOrd>(list: &[T]) -> &T {
    +  |             ++++++++++++++++++++++
    +
    +For more information about this error, try `rustc --explain E0369`.
    +error: could not compile `chapter10` (bin "chapter10") due to 1 previous error
    +
    +

    帮助说明中提到了 std::cmp::PartialOrd,这是一个 trait。下一部分会讲到 trait。不过简单来说,这个错误表明 largest 的函数体不能适用于 T 的所有可能的类型。因为在函数体需要比较 T 类型的值,不过它只能用于我们知道如何排序的类型。为了开启比较功能,标准库中定义的 std::cmp::PartialOrd trait 可以实现类型的比较功能(查看附录 C 获取该 trait 的更多信息)。依照帮助说明中的建议,我们限制 T 只对实现了 PartialOrd 的类型有效后代码就可以编译了,因为标准库为 i32char 实现了 PartialOrd

    +

    结构体定义中的泛型

    +

    同样也可以用 <> 语法来定义结构体,它包含一个或多个泛型参数类型字段。示例 10-6 定义了一个可以存放任何类型的 xy 坐标值的结构体 Point

    +

    文件名:src/main.rs

    +
    struct Point<T> {
    +    x: T,
    +    y: T,
    +}
    +
    +fn main() {
    +    let integer = Point { x: 5, y: 10 };
    +    let float = Point { x: 1.0, y: 4.0 };
    +}
    +

    示例 10-6:Point 结构体存放了两个 T 类型的值 xy

    +

    其语法类似于函数定义中使用泛型。首先,必须在结构体名称后面的尖括号中声明泛型参数的名称。接着在结构体定义中可以指定具体数据类型的位置使用泛型类型。

    +

    注意 Point<T> 的定义中只使用了一个泛型类型,这个定义表明结构体 Point<T> 对于一些类型 T 是泛型的,而且字段 xy 都是 相同类型的,无论它具体是何类型。如果尝试创建一个有不同类型值的 Point<T> 的实例,像示例 10-7 中的代码就不能编译:

    +

    文件名:src/main.rs

    +
    struct Point<T> {
    +    x: T,
    +    y: T,
    +}
    +
    +fn main() {
    +    let wont_work = Point { x: 5, y: 4.0 };
    +}
    +

    示例 10-7:字段 xy 的类型必须相同,因为它们都有相同的泛型类型 T

    +

    在这个例子中,当把整型值 5 赋值给 x 时,就告诉了编译器这个 Point<T> 实例中的泛型 T 全是整型。接着指定 y 为浮点值 4.0,因为它y被定义为与 x 相同类型,所以将会得到一个像这样的类型不匹配错误:

    +
    $ cargo run
    +   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
    +error[E0308]: mismatched types
    + --> src/main.rs:7:38
    +  |
    +7 |     let wont_work = Point { x: 5, y: 4.0 };
    +  |                                      ^^^ expected integer, found floating-point number
    +
    +For more information about this error, try `rustc --explain E0308`.
    +error: could not compile `chapter10` (bin "chapter10") due to 1 previous error
    +
    +

    如果想要定义一个 xy 可以有不同类型且仍然是泛型的 Point 结构体,我们可以使用多个泛型类型参数。在示例 10-8 中,我们修改 Point 的定义为拥有两个泛型类型 TU。其中字段 xT 类型的,而字段 yU 类型的:

    +

    文件名:src/main.rs

    +
    struct Point<T, U> {
    +    x: T,
    +    y: U,
    +}
    +
    +fn main() {
    +    let both_integer = Point { x: 5, y: 10 };
    +    let both_float = Point { x: 1.0, y: 4.0 };
    +    let integer_and_float = Point { x: 5, y: 4.0 };
    +}
    +

    示例 10-8:使用两个泛型的 Point,这样 xy 可能是不同类型

    +

    现在所有这些 Point 实例都合法了!你可以在定义中使用任意多的泛型类型参数,不过太多的话,代码将难以阅读和理解。当你发现代码中需要很多泛型时,这可能表明你的代码需要重构分解成更小的结构。

    +

    枚举定义中的泛型

    +

    和结构体类似,枚举也可以在成员中存放泛型数据类型。第六章我们曾用过标准库提供的 Option<T> 枚举,这里再回顾一下:

    +
    #![allow(unused)]
    +fn main() {
    +enum Option<T> {
    +    Some(T),
    +    None,
    +}
    +}
    +

    现在这个定义应该更容易理解了。如你所见 Option<T> 是一个拥有泛型 T 的枚举,它有两个成员:Some,它存放了一个类型 T 的值,和不存在任何值的None。通过 Option<T> 枚举可以表达有一个可能的值的抽象概念,同时因为 Option<T> 是泛型的,无论这个可能的值是什么类型都可以使用这个抽象。

    +

    枚举也可以拥有多个泛型类型。第九章使用过的 Result 枚举定义就是一个这样的例子:

    +
    #![allow(unused)]
    +fn main() {
    +enum Result<T, E> {
    +    Ok(T),
    +    Err(E),
    +}
    +}
    +

    Result 枚举有两个泛型类型,TEResult 有两个成员:Ok,它存放一个类型 T 的值,而 Err 则存放一个类型 E 的值。这个定义使得 Result 枚举能很方便的表达任何可能成功(返回 T 类型的值)也可能失败(返回 E 类型的值)的操作。实际上,这就是我们在示例 9-3 用来打开文件的方式:当成功打开文件的时候,T 对应的是 std::fs::File 类型;而当打开文件出现问题时,E 的值则是 std::io::Error 类型。

    +

    当你意识到代码中定义了多个结构体或枚举,它们不一样的地方只是其中的值的类型的时候,不妨通过泛型类型来避免重复。

    +

    方法定义中的泛型

    +

    在为结构体和枚举实现方法时(像第五章那样),一样也可以用泛型。示例 10-9 中展示了示例 10-6 中定义的结构体 Point<T>,和在其上实现的名为 x 的方法。

    +

    文件名:src/main.rs

    +
    struct Point<T> {
    +    x: T,
    +    y: T,
    +}
    +
    +impl<T> Point<T> {
    +    fn x(&self) -> &T {
    +        &self.x
    +    }
    +}
    +
    +fn main() {
    +    let p = Point { x: 5, y: 10 };
    +
    +    println!("p.x = {}", p.x());
    +}
    +

    示例 10-9:在 Point<T> 结构体上实现方法 x,它返回 T 类型的字段 x 的引用

    +

    这里在 Point<T> 上定义了一个叫做 x 的方法来返回字段 x 中数据的引用:

    +

    注意必须在 impl 后面声明 T,这样就可以在 Point<T> 上实现的方法中使用 T 了。通过在 impl 之后声明泛型 T,Rust 就知道 Point 的尖括号中的类型是泛型而不是具体类型。我们可以为泛型参数选择一个与结构体定义中声明的泛型参数所不同的名称,不过依照惯例使用了相同的名称。在声明泛型类型参数的 impl 中编写的方法将会定义在该类型的任何实例上,无论最终替换泛型类型参数的是何具体类型。(译者注:以示例 10-9 为例,impl 中声明了泛型类型参数 Tx 是编写在 impl 中的方法,x 方法将会定义在 Point<T> 的任何实例上,无论最终替换泛型类型参数 T 的是何具体类型)。

    +

    定义方法时也可以为泛型指定限制(constraint)。例如,可以选择为 Point<f32> 实例实现方法,而不是为泛型 Point 实例。示例 10-10 展示了一个没有在 impl 之后(的尖括号)声明泛型的例子,这里使用了一个具体类型,f32

    +

    文件名:src/main.rs

    +
    struct Point<T> {
    +    x: T,
    +    y: T,
    +}
    +
    +impl<T> Point<T> {
    +    fn x(&self) -> &T {
    +        &self.x
    +    }
    +}
    +
    +impl Point<f32> {
    +    fn distance_from_origin(&self) -> f32 {
    +        (self.x.powi(2) + self.y.powi(2)).sqrt()
    +    }
    +}
    +
    +fn main() {
    +    let p = Point { x: 5, y: 10 };
    +
    +    println!("p.x = {}", p.x());
    +}
    +

    示例 10-10:构建一个只用于拥有泛型参数 T 的结构体的具体类型的 impl

    +

    这段代码意味着 Point<f32> 类型会有一个方法 distance_from_origin,而其他 T 不是 f32 类型的 Point<T> 实例则没有定义此方法。这个方法计算点实例与坐标 (0.0, 0.0) 之间的距离,并使用了只能用于浮点型的数学运算符。

    +

    结构体定义中的泛型类型参数并不总是与结构体方法签名中使用的泛型是同一类型。示例 10-11 中为 Point 结构体使用了泛型类型 X1Y1,为 mixup 方法签名使用了 X2Y2 来使得示例更加清楚。这个方法用 selfPoint 类型的 x 值(类型 X1)和参数的 Point 类型的 y 值(类型 Y2)来创建一个新 Point 类型的实例:

    +

    文件名:src/main.rs

    +
    struct Point<X1, Y1> {
    +    x: X1,
    +    y: Y1,
    +}
    +
    +impl<X1, Y1> Point<X1, Y1> {
    +    fn mixup<X2, Y2>(self, other: Point<X2, Y2>) -> Point<X1, Y2> {
    +        Point {
    +            x: self.x,
    +            y: other.y,
    +        }
    +    }
    +}
    +
    +fn main() {
    +    let p1 = Point { x: 5, y: 10.4 };
    +    let p2 = Point { x: "Hello", y: 'c' };
    +
    +    let p3 = p1.mixup(p2);
    +
    +    println!("p3.x = {}, p3.y = {}", p3.x, p3.y);
    +}
    +

    示例 10-11:方法使用了与结构体定义中不同类型的泛型

    +

    main 函数中,定义了一个有 i32 类型的 x(其值为 5)和 f64y(其值为 10.4)的 Pointp2 则是一个有着字符串 slice 类型的 x(其值为 "Hello")和 char 类型的 y(其值为c)的 Point。在 p1 上以 p2 作为参数调用 mixup 会返回一个 p3,它会有一个 i32 类型的 x,因为 x 来自 p1,并拥有一个 char 类型的 y,因为 y 来自 p2println! 会打印出 p3.x = 5, p3.y = c

    +

    这个例子的目的是展示一些泛型通过 impl 声明而另一些通过方法定义声明的情况。这里泛型参数 X1Y1 声明于 impl 之后,因为它们与结构体定义相对应。而泛型参数 X2Y2 声明于 fn mixup 之后,因为它们只是相对于方法本身的。

    +

    泛型代码的性能

    +

    在阅读本部分内容的同时,你可能会好奇使用泛型类型参数是否会有运行时消耗。好消息是泛型并不会使程序比具体类型运行得慢。

    +

    Rust 通过在编译时进行泛型代码的 单态化monomorphization)来保证效率。单态化是一个通过填充编译时使用的具体类型,将通用代码转换为特定代码的过程。

    +

    在这个过程中,编译器所做的工作正好与示例 10-5 中我们创建泛型函数的步骤相反。编译器寻找所有泛型代码被调用的位置并使用泛型代码针对具体类型生成代码。

    +

    让我们看看这如何用于标准库中的 Option 枚举:

    +
    #![allow(unused)]
    +fn main() {
    +let integer = Some(5);
    +let float = Some(5.0);
    +}
    +

    当 Rust 编译这些代码的时候,它会进行单态化。编译器会读取传递给 Option<T> 的值并发现有两种 Option<T>:一个对应 i32 另一个对应 f64。为此,它会将泛型定义 Option<T> 展开为两个针对 i32f64 的定义,接着将泛型定义替换为这两个具体的定义。

    +

    编译器生成的单态化版本的代码看起来像这样(编译器会使用不同于如下假想的名字):

    +

    文件名:src/main.rs

    +
    enum Option_i32 {
    +    Some(i32),
    +    None,
    +}
    +
    +enum Option_f64 {
    +    Some(f64),
    +    None,
    +}
    +
    +fn main() {
    +    let integer = Option_i32::Some(5);
    +    let float = Option_f64::Some(5.0);
    +}
    +

    泛型 Option<T> 被编译器替换为了具体的定义。因为 Rust 会将每种情况下的泛型代码编译为具体类型,使用泛型没有运行时开销。当代码运行时,它的执行效率就跟好像手写每个具体定义的重复代码一样。这个单态化过程正是 Rust 泛型在运行时极其高效的原因。

    +

    Trait:定义共同行为

    +
    +

    ch10-02-traits.md +
    +commit 92bfbfacf88ee9a814cea0a58e9c019c529ef4ae

    +
    +

    trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 trait 以一种抽象的方式定义共同行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。

    +
    +

    注意:trait 类似于其他语言中的常被称为 接口interfaces)的功能,虽然有一些不同。

    +
    +

    定义 trait

    +

    一个类型的行为由其可供调用的方法构成。如果可以对不同类型调用相同的方法的话,这些类型就可以共享相同的行为了。trait 定义是一种将方法签名组合起来的方法,目的是定义一个实现某些目的所必需的行为的集合。

    +

    例如,这里有多个存放了不同类型和属性文本的结构体:结构体 NewsArticle 用于存放发生于世界各地的新闻故事,而结构体 Tweet 最多只能存放 280 个字符的内容,以及像是否转推或是否是对推友的回复这样的元数据。

    +

    我们想要创建一个名为 aggregator 的多媒体聚合库用来显示可能储存在 NewsArticleTweet 实例中的数据摘要。为了实现功能,每个结构体都要能够获取摘要,这样的话就可以调用实例的 summarize 方法来请求摘要。示例 10-12 中展示了一个表现这个概念的公有 Summary trait 的定义:

    +

    文件名:src/lib.rs

    +
    pub trait Summary {
    +    fn summarize(&self) -> String;
    +}
    +

    示例 10-12:Summary trait 定义,它包含由 summarize 方法提供的行为

    +

    这里使用 trait 关键字来声明一个 trait,后面是 trait 的名字,在这个例子中是 Summary。我们也声明 traitpub 以便依赖这个 crate 的 crate 也可以使用这个 trait,正如我们见过的一些示例一样。在大括号中声明描述实现这个 trait 的类型所需要的行为的方法签名,在这个例子中是 fn summarize(&self) -> String

    +

    在方法签名后跟分号,而不是在大括号中提供其实现。接着每一个实现这个 trait 的类型都需要提供其自定义行为的方法体,编译器也会确保任何实现 Summary trait 的类型都拥有与这个签名的定义完全一致的 summarize 方法。

    +

    trait 体中可以有多个方法:一行一个方法签名且都以分号结尾。

    +

    为类型实现 trait

    +

    现在我们定义了 Summary trait 的签名,接着就可以在多媒体聚合库中实现这个类型了。示例 10-13 中展示了 NewsArticle 结构体上 Summary trait 的一个实现,它使用标题、作者和创建的位置作为 summarize 的返回值。对于 Tweet 结构体,我们选择将 summarize 定义为用户名后跟推文的全部文本作为返回值,并假设推文内容已经被限制为 280 字符以内。

    +

    文件名:src/lib.rs

    +
    pub trait Summary {
    +    fn summarize(&self) -> String;
    +}
    +
    +pub struct NewsArticle {
    +    pub headline: String,
    +    pub location: String,
    +    pub author: String,
    +    pub content: String,
    +}
    +
    +impl Summary for NewsArticle {
    +    fn summarize(&self) -> String {
    +        format!("{}, by {} ({})", self.headline, self.author, self.location)
    +    }
    +}
    +
    +pub struct Tweet {
    +    pub username: String,
    +    pub content: String,
    +    pub reply: bool,
    +    pub retweet: bool,
    +}
    +
    +impl Summary for Tweet {
    +    fn summarize(&self) -> String {
    +        format!("{}: {}", self.username, self.content)
    +    }
    +}
    +

    示例 10-13:在 NewsArticleTweet 类型上实现 Summary trait

    +

    在类型上实现 trait 类似于实现常规方法。区别在于 impl 关键字之后,我们提供需要实现 trait 的名称,接着是 for 和需要实现 trait 的类型的名称。在 impl 块中,使用 trait 定义中的方法签名,不过不再后跟分号,而是需要在大括号中编写函数体来为特定类型实现 trait 方法所拥有的行为。

    +

    现在库在 NewsArticleTweet 上实现了Summary trait,crate 的用户可以像调用常规方法一样调用 NewsArticleTweet 实例的 trait 方法了。唯一的区别是 trait 必须和类型一起引入作用域以便使用额外的 trait 方法。这是一个二进制 crate 如何利用 aggregator 库 crate 的例子:

    +
    use aggregator::{Summary, Tweet};
    +
    +fn main() {
    +    let tweet = Tweet {
    +        username: String::from("horse_ebooks"),
    +        content: String::from(
    +            "of course, as you probably already know, people",
    +        ),
    +        reply: false,
    +        retweet: false,
    +    };
    +
    +    println!("1 new tweet: {}", tweet.summarize());
    +}
    +

    这会打印出 1 new tweet: horse_ebooks: of course, as you probably already know, people

    +

    其他依赖 aggregator crate 的 crate 也可以将 Summary 引入作用域以便为其自己的类型实现该 trait。需要注意的限制是,只有在 trait 或类型至少有一个属于当前 crate 时,我们才能对类型实现该 trait。例如,可以为 aggregator crate 的自定义类型 Tweet 实现如标准库中的 Display trait,这是因为 Tweet 类型位于 aggregator crate 本地的作用域中。类似地,也可以在 aggregator crate 中为 Vec<T> 实现 Summary,这是因为 Summary trait 位于 aggregator crate 本地作用域中。

    +

    但是不能为外部类型实现外部 trait。例如,不能在 aggregator crate 中为 Vec<T> 实现 Display trait。这是因为 DisplayVec<T> 都定义于标准库中,它们并不位于 aggregator crate 本地作用域中。这个限制是被称为 相干性coherence)的程序属性的一部分,或者更具体的说是 孤儿规则orphan rule),其得名于不存在父类型。这条规则确保了其他人编写的代码不会破坏你代码,反之亦然。没有这条规则的话,两个 crate 可以分别对相同类型实现相同的 trait,而 Rust 将无从得知应该使用哪一个实现。

    +

    默认实现

    +

    有时为 trait 中的某些或全部方法提供默认的行为,而不是在每个类型的每个实现中都定义自己的行为是很有用的。这样当为某个特定类型实现 trait 时,可以选择保留或重载每个方法的默认行为。

    +

    示例 10-14 中我们为 Summary trait 的 summarize 方法指定一个默认的字符串值,而不是像示例 10-12 中那样只是定义方法签名:

    +

    文件名:src/lib.rs

    +
    pub trait Summary {
    +    fn summarize(&self) -> String {
    +        String::from("(Read more...)")
    +    }
    +}
    +
    +pub struct NewsArticle {
    +    pub headline: String,
    +    pub location: String,
    +    pub author: String,
    +    pub content: String,
    +}
    +
    +impl Summary for NewsArticle {}
    +
    +pub struct Tweet {
    +    pub username: String,
    +    pub content: String,
    +    pub reply: bool,
    +    pub retweet: bool,
    +}
    +
    +impl Summary for Tweet {
    +    fn summarize(&self) -> String {
    +        format!("{}: {}", self.username, self.content)
    +    }
    +}
    +

    示例 10-14:Summary trait 的定义,带有一个 summarize 方法的默认实现

    +

    如果想要对 NewsArticle 实例使用这个默认实现,可以通过 impl Summary for NewsArticle {} 指定一个空的 impl 块。

    +

    虽然我们不再直接为 NewsArticle 定义 summarize 方法了,但是我们提供了一个默认实现并且指定 NewsArticle 实现 Summary trait。因此,我们仍然可以对 NewsArticle 实例调用 summarize 方法,如下所示:

    +
    use aggregator::{self, NewsArticle, Summary};
    +
    +fn main() {
    +    let article = NewsArticle {
    +        headline: String::from("Penguins win the Stanley Cup Championship!"),
    +        location: String::from("Pittsburgh, PA, USA"),
    +        author: String::from("Iceburgh"),
    +        content: String::from(
    +            "The Pittsburgh Penguins once again are the best \
    +             hockey team in the NHL.",
    +        ),
    +    };
    +
    +    println!("New article available! {}", article.summarize());
    +}
    +

    这段代码会打印 New article available! (Read more...)

    +

    summarize 创建默认实现并不要求对示例 10-13 中 Tweet 上的 Summary 实现做任何改变。其原因是重载一个默认实现的语法与实现没有默认实现的 trait 方法的语法一样。

    +

    默认实现允许调用相同 trait 中的其他方法,哪怕这些方法没有默认实现。如此,trait 可以提供很多有用的功能而只需要实现指定一小部分内容。例如,我们可以定义 Summary trait,使其具有一个需要实现的 summarize_author 方法,然后定义一个 summarize 方法,此方法的默认实现调用 summarize_author 方法:

    +
    pub trait Summary {
    +    fn summarize_author(&self) -> String;
    +
    +    fn summarize(&self) -> String {
    +        format!("(Read more from {}...)", self.summarize_author())
    +    }
    +}
    +
    +pub struct Tweet {
    +    pub username: String,
    +    pub content: String,
    +    pub reply: bool,
    +    pub retweet: bool,
    +}
    +
    +impl Summary for Tweet {
    +    fn summarize_author(&self) -> String {
    +        format!("@{}", self.username)
    +    }
    +}
    +

    为了使用这个版本的 Summary,只需在实现 trait 时定义 summarize_author 即可:

    +
    pub trait Summary {
    +    fn summarize_author(&self) -> String;
    +
    +    fn summarize(&self) -> String {
    +        format!("(Read more from {}...)", self.summarize_author())
    +    }
    +}
    +
    +pub struct Tweet {
    +    pub username: String,
    +    pub content: String,
    +    pub reply: bool,
    +    pub retweet: bool,
    +}
    +
    +impl Summary for Tweet {
    +    fn summarize_author(&self) -> String {
    +        format!("@{}", self.username)
    +    }
    +}
    +

    一旦定义了 summarize_author,我们就可以对 Tweet 结构体的实例调用 summarize 了,而 summarize 的默认实现会调用我们提供的 summarize_author 定义。因为实现了 summarize_authorSummary trait 就提供了 summarize 方法的功能,且无需编写更多的代码。

    +
    use aggregator::{self, Summary, Tweet};
    +
    +fn main() {
    +    let tweet = Tweet {
    +        username: String::from("horse_ebooks"),
    +        content: String::from(
    +            "of course, as you probably already know, people",
    +        ),
    +        reply: false,
    +        retweet: false,
    +    };
    +
    +    println!("1 new tweet: {}", tweet.summarize());
    +}
    +

    这会打印出 1 new tweet: (Read more from @horse_ebooks...)

    +

    注意无法从相同方法的重载实现中调用默认方法。

    +

    trait 作为参数

    +

    知道了如何定义 trait 和在类型上实现这些 trait 之后,我们可以探索一下如何使用 trait 来接受多种不同类型的参数。示例 10-13 中为 NewsArticleTweet 类型实现了 Summary trait,用其来定义了一个函数 notify 来调用其参数 item 上的 summarize 方法,该参数是实现了 Summary trait 的某种类型。为此可以使用 impl Trait 语法,像这样:

    +
    pub trait Summary {
    +    fn summarize(&self) -> String;
    +}
    +
    +pub struct NewsArticle {
    +    pub headline: String,
    +    pub location: String,
    +    pub author: String,
    +    pub content: String,
    +}
    +
    +impl Summary for NewsArticle {
    +    fn summarize(&self) -> String {
    +        format!("{}, by {} ({})", self.headline, self.author, self.location)
    +    }
    +}
    +
    +pub struct Tweet {
    +    pub username: String,
    +    pub content: String,
    +    pub reply: bool,
    +    pub retweet: bool,
    +}
    +
    +impl Summary for Tweet {
    +    fn summarize(&self) -> String {
    +        format!("{}: {}", self.username, self.content)
    +    }
    +}
    +
    +pub fn notify(item: &impl Summary) {
    +    println!("Breaking news! {}", item.summarize());
    +}
    +

    对于 item 参数,我们指定了 impl 关键字和 trait 名称,而不是具体的类型。该参数支持任何实现了指定 trait 的类型。在 notify 函数体中,可以调用任何来自 Summary trait 的方法,比如 summarize。我们可以传递任何 NewsArticleTweet 的实例来调用 notify。任何用其它如 Stringi32 的类型调用该函数的代码都不能编译,因为它们没有实现 Summary

    +

    Trait Bound 语法

    +

    impl Trait 语法更直观,但它实际上是更长形式的 trait bound 语法的语法糖。它看起来像:

    +
    pub fn notify<T: Summary>(item: &T) {
    +    println!("Breaking news! {}", item.summarize());
    +}
    +

    这与之前的例子相同,不过稍微冗长了一些。trait bound 与泛型参数声明在一起,位于尖括号中的冒号后面。

    +

    impl Trait 很方便,适用于短小的例子。更长的 trait bound 则适用于更复杂的场景。例如,可以获取两个实现了 Summary 的参数。使用 impl Trait 的语法看起来像这样:

    +
    pub fn notify(item1: &impl Summary, item2: &impl Summary) {
    +

    这适用于 item1item2 允许是不同类型的情况(只要它们都实现了 Summary)。不过如果你希望强制它们都是相同类型呢?这只有在使用 trait bound 时才有可能:

    +
    pub fn notify<T: Summary>(item1: &T, item2: &T) {
    +

    泛型 T 被指定为 item1item2 的参数限制,如此传递给参数 item1item2 值的具体类型必须一致。

    +

    通过 + 指定多个 trait bound

    +

    如果 notify 需要显示 item 的格式化形式,同时也要使用 summarize 方法,那么 item 就需要同时实现两个不同的 trait:DisplaySummary。这可以通过 + 语法实现:

    +
    pub fn notify(item: &(impl Summary + Display)) {
    +

    + 语法也适用于泛型的 trait bound:

    +
    pub fn notify<T: Summary + Display>(item: &T) {
    +

    通过指定这两个 trait bound,notify 的函数体可以调用 summarize 并使用 {} 来格式化 item

    +

    通过 where 简化 trait bound

    +

    然而,使用过多的 trait bound 也有缺点。每个泛型有其自己的 trait bound,所以有多个泛型参数的函数在名称和参数列表之间会有很长的 trait bound 信息,这使得函数签名难以阅读。为此,Rust 有另一个在函数签名之后的 where 从句中指定 trait bound 的语法。所以除了这么写:

    +
    fn some_function<T: Display + Clone, U: Clone + Debug>(t: &T, u: &U) -> i32 {
    +

    还可以像这样使用 where 从句:

    +
    fn some_function<T, U>(t: &T, u: &U) -> i32
    +where
    +    T: Display + Clone,
    +    U: Clone + Debug,
    +{
    +    unimplemented!()
    +}
    +

    这个函数签名就显得不那么杂乱,函数名、参数列表和返回值类型都离得很近,看起来跟没有那么多 trait bounds 的函数很像。

    +

    返回实现了 trait 的类型

    +

    也可以在返回值中使用 impl Trait 语法,来返回实现了某个 trait 的类型:

    +
    pub trait Summary {
    +    fn summarize(&self) -> String;
    +}
    +
    +pub struct NewsArticle {
    +    pub headline: String,
    +    pub location: String,
    +    pub author: String,
    +    pub content: String,
    +}
    +
    +impl Summary for NewsArticle {
    +    fn summarize(&self) -> String {
    +        format!("{}, by {} ({})", self.headline, self.author, self.location)
    +    }
    +}
    +
    +pub struct Tweet {
    +    pub username: String,
    +    pub content: String,
    +    pub reply: bool,
    +    pub retweet: bool,
    +}
    +
    +impl Summary for Tweet {
    +    fn summarize(&self) -> String {
    +        format!("{}: {}", self.username, self.content)
    +    }
    +}
    +
    +fn returns_summarizable() -> impl Summary {
    +    Tweet {
    +        username: String::from("horse_ebooks"),
    +        content: String::from(
    +            "of course, as you probably already know, people",
    +        ),
    +        reply: false,
    +        retweet: false,
    +    }
    +}
    +

    通过使用 impl Summary 作为返回值类型,我们指定了 returns_summarizable 函数返回某个实现了 Summary trait 的类型,但是不确定其具体的类型。在这个例子中 returns_summarizable 返回了一个 Tweet,不过调用方并不知情。

    +

    返回一个只是指定了需要实现的 trait 的类型的能力在闭包和迭代器场景十分的有用,第十三章会介绍它们。闭包和迭代器创建只有编译器知道的类型,或者是非常非常长的类型。impl Trait 允许你简单的指定函数返回一个 Iterator 而无需写出实际的冗长的类型。

    +

    不过这只适用于返回单一类型的情况。例如,这段代码的返回值类型指定为返回 impl Summary,但是返回了 NewsArticleTweet 就行不通:

    +
    pub trait Summary {
    +    fn summarize(&self) -> String;
    +}
    +
    +pub struct NewsArticle {
    +    pub headline: String,
    +    pub location: String,
    +    pub author: String,
    +    pub content: String,
    +}
    +
    +impl Summary for NewsArticle {
    +    fn summarize(&self) -> String {
    +        format!("{}, by {} ({})", self.headline, self.author, self.location)
    +    }
    +}
    +
    +pub struct Tweet {
    +    pub username: String,
    +    pub content: String,
    +    pub reply: bool,
    +    pub retweet: bool,
    +}
    +
    +impl Summary for Tweet {
    +    fn summarize(&self) -> String {
    +        format!("{}: {}", self.username, self.content)
    +    }
    +}
    +
    +fn returns_summarizable(switch: bool) -> impl Summary {
    +    if switch {
    +        NewsArticle {
    +            headline: String::from(
    +                "Penguins win the Stanley Cup Championship!",
    +            ),
    +            location: String::from("Pittsburgh, PA, USA"),
    +            author: String::from("Iceburgh"),
    +            content: String::from(
    +                "The Pittsburgh Penguins once again are the best \
    +                 hockey team in the NHL.",
    +            ),
    +        }
    +    } else {
    +        Tweet {
    +            username: String::from("horse_ebooks"),
    +            content: String::from(
    +                "of course, as you probably already know, people",
    +            ),
    +            reply: false,
    +            retweet: false,
    +        }
    +    }
    +}
    +

    这里尝试返回 NewsArticleTweet。这不能编译,因为 impl Trait 工作方式的限制。第十八章的 “顾及不同类型值的 trait 对象” 部分会介绍如何编写这样一个函数。

    +

    使用 trait bound 有条件地实现方法

    +

    通过使用带有 trait bound 的泛型参数的 impl 块,可以有条件地只为那些实现了特定 trait 的类型实现方法。例如,示例 10-15 中的类型 Pair<T> 总是实现了 new 方法并返回一个 Pair<T> 的实例(回忆一下第五章的 “定义方法” 部分,Self 是一个 impl 块类型的类型别名(type alias),在这里是 Pair<T>)。不过在下一个 impl 块中,只有那些为 T 类型实现了 PartialOrd trait(来允许比较) Display trait(来启用打印)的 Pair<T> 才会实现 cmp_display 方法:

    +
    use std::fmt::Display;
    +
    +struct Pair<T> {
    +    x: T,
    +    y: T,
    +}
    +
    +impl<T> Pair<T> {
    +    fn new(x: T, y: T) -> Self {
    +        Self { x, y }
    +    }
    +}
    +
    +impl<T: Display + PartialOrd> Pair<T> {
    +    fn cmp_display(&self) {
    +        if self.x >= self.y {
    +            println!("The largest member is x = {}", self.x);
    +        } else {
    +            println!("The largest member is y = {}", self.y);
    +        }
    +    }
    +}
    +

    示例 10-15:根据 trait bound 在泛型上有条件的实现方法

    +

    也可以对任何实现了特定 trait 的类型有条件地实现 trait。对任何满足特定 trait bound 的类型实现 trait 被称为 blanket implementations,它们被广泛的用于 Rust 标准库中。例如,标准库为任何实现了 Display trait 的类型实现了 ToString trait。这个 impl 块看起来像这样:

    +
    impl<T: Display> ToString for T {
    +    // --snip--
    +}
    +

    因为标准库有了这些 blanket implementation,我们可以对任何实现了 Display trait 的类型调用由 ToString 定义的 to_string 方法。例如,可以将整型转换为对应的 String 值,因为整型实现了 Display

    +
    #![allow(unused)]
    +fn main() {
    +let s = 3.to_string();
    +}
    +

    blanket implementation 会出现在 trait 文档的 “Implementers” 部分。

    +

    trait 和 trait bound 让我们能够使用泛型类型参数来减少重复,而且能够向编译器明确指定泛型类型需要拥有哪些行为。然后编译器可以利用 trait bound 信息检查代码中所用到的具体类型是否提供了正确的行为。在动态类型语言中,如果我们调用了一个未定义的方法,会在运行时出现错误。Rust 将这些错误移动到了编译时,甚至在代码能够运行之前就强迫我们修复问题。另外,我们也无需编写运行时检查行为的代码,因为在编译时就已经检查过了。这样既提升了性能又不必放弃泛型的灵活性。

    +

    生命周期确保引用有效

    +
    +

    ch10-03-lifetime-syntax.md +
    +commit 5f67eee42345ba44f6f08a22c2192165f4b0e930

    +
    +

    生命周期是另一类我们已经使用过的泛型。不同于确保类型有期望的行为,生命周期确保引用如预期一直有效。

    +

    当在第四章讨论 “引用和借用” 部分时,我们遗漏了一个重要的细节:Rust 中的每一个引用都有其 生命周期lifetime),也就是引用保持有效的作用域。大部分时候生命周期是隐含并可以推断的,正如大部分时候类型也是可以推断的一样。类似于当因为有多种可能类型的时候必须注明类型,也会出现引用的生命周期以一些不同方式相关联的情况,所以 Rust 需要我们使用泛型生命周期参数来注明它们的关系,这样就能确保运行时实际使用的引用绝对是有效的。

    +

    生命周期注解甚至不是一个大部分语言都有的概念,所以这可能感觉起来有些陌生。虽然本章不可能涉及到它全部的内容,我们会讲到一些通常你可能会遇到的生命周期语法以便你熟悉这个概念。

    +

    生命周期避免了悬垂引用

    +

    生命周期的主要目标是避免悬垂引用dangling references),后者会导致程序引用了非预期引用的数据。考虑一下示例 10-16 中的程序,它有一个外部作用域和一个内部作用域。

    +
    fn main() {
    +    let r;
    +
    +    {
    +        let x = 5;
    +        r = &x;
    +    }
    +
    +    println!("r: {r}");
    +}
    +

    示例 10-16:尝试使用离开作用域的值的引用

    +
    +

    注意:示例 10-16、10-17 和 10-23 中声明了没有初始值的变量,所以这些变量存在于外部作用域。这乍看之下好像和 Rust 不允许存在空值相冲突。然而如果尝试在给它一个值之前使用这个变量,会出现一个编译时错误,这就说明了 Rust 确实不允许空值。

    +
    +

    外部作用域声明了一个没有初值的变量 r,而内部作用域声明了一个初值为 5 的变量x。在内部作用域中,我们尝试将 r 的值设置为一个 x 的引用。接着在内部作用域结束后,尝试打印出 r 的值。这段代码不能编译因为 r 引用的值在尝试使用之前就离开了作用域。如下是错误信息:

    +
    $ cargo run
    +   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
    +error[E0597]: `x` does not live long enough
    + --> src/main.rs:6:13
    +  |
    +5 |         let x = 5;
    +  |             - binding `x` declared here
    +6 |         r = &x;
    +  |             ^^ borrowed value does not live long enough
    +7 |     }
    +  |     - `x` dropped here while still borrowed
    +8 |
    +9 |     println!("r: {r}");
    +  |                  --- borrow later used here
    +
    +For more information about this error, try `rustc --explain E0597`.
    +error: could not compile `chapter10` (bin "chapter10") due to 1 previous error
    +
    +

    变量 x 并没有 “存在的足够久”。其原因是 x 在到达第 7 行内部作用域结束时就离开了作用域。不过 r 在外部作用域仍是有效的;作用域越大我们就说它 “存在的越久”。如果 Rust 允许这段代码工作,r 将会引用在 x 离开作用域时被释放的内存,这时尝试对 r 做任何操作都不能正常工作。那么 Rust 是如何决定这段代码是不被允许的呢?这得益于借用检查器。

    +

    借用检查器

    +

    Rust 编译器有一个 借用检查器borrow checker),它比较作用域来确保所有的借用都是有效的。示例 10-17 展示了与示例 10-16 相同的例子不过带有变量生命周期的注释:

    +
    fn main() {
    +    let r;                // ---------+-- 'a
    +                          //          |
    +    {                     //          |
    +        let x = 5;        // -+-- 'b  |
    +        r = &x;           //  |       |
    +    }                     // -+       |
    +                          //          |
    +    println!("r: {r}");   //          |
    +}                         // ---------+
    +

    示例 10-17:rx 的生命周期注解,分别叫做 'a'b

    +

    这里将 r 的生命周期标记为 'a 并将 x 的生命周期标记为 'b。如你所见,内部的 'b 块要比外部的生命周期 'a 小得多。在编译时,Rust 比较这两个生命周期的大小,并发现 r 拥有生命周期 'a,不过它引用了一个拥有生命周期 'b 的对象。程序被拒绝编译,因为生命周期 'b 比生命周期 'a 要小:被引用的对象比它的引用者存在的时间更短。

    +

    让我们看看示例 10-18 中这个并没有产生悬垂引用且可以正确编译的例子:

    +
    fn main() {
    +    let x = 5;            // ----------+-- 'b
    +                          //           |
    +    let r = &x;           // --+-- 'a  |
    +                          //   |       |
    +    println!("r: {r}");   //   |       |
    +                          // --+       |
    +}                         // ----------+
    +

    示例 10-18:一个有效的引用,因为数据比引用有着更长的生命周期

    +

    这里 x 拥有生命周期 'b,比 'a 要大。这就意味着 r 可以引用 x:Rust 知道 r 中的引用在 x 有效的时候也总是有效的。

    +

    现在我们已经在一个具体的例子中展示了引用的生命周期位于何处,并讨论了 Rust 如何分析生命周期来保证引用总是有效的,接下来让我们聊聊在函数的上下文中参数和返回值的泛型生命周期。

    +

    函数中的泛型生命周期

    +

    让我们来编写一个返回两个字符串 slice 中较长者的函数。这个函数获取两个字符串 slice 并返回一个字符串 slice。一旦我们实现了 longest 函数,示例 10-19 中的代码应该会打印出 The longest string is abcd

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let string1 = String::from("abcd");
    +    let string2 = "xyz";
    +
    +    let result = longest(string1.as_str(), string2);
    +    println!("The longest string is {result}");
    +}
    +

    示例 10-19:main 函数调用 longest 函数来寻找两个字符串 slice 中较长的一个

    +

    注意这个函数获取作为引用的字符串 slice,而不是字符串,因为我们不希望 longest 函数获取参数的所有权。参考之前第四章中的 “字符串 slice 作为参数” 部分中更多关于为什么示例 10-19 的参数正符合我们期望的讨论。

    +

    如果尝试像示例 10-20 中那样实现 longest 函数,它并不能编译:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let string1 = String::from("abcd");
    +    let string2 = "xyz";
    +
    +    let result = longest(string1.as_str(), string2);
    +    println!("The longest string is {result}");
    +}
    +
    +fn longest(x: &str, y: &str) -> &str {
    +    if x.len() > y.len() {
    +        x
    +    } else {
    +        y
    +    }
    +}
    +

    示例 10-20:一个 longest 函数的实现,它返回两个字符串 slice 中较长者,现在还不能编译

    +

    相应地会出现如下有关生命周期的错误:

    +
    $ cargo run
    +   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
    +error[E0106]: missing lifetime specifier
    + --> src/main.rs:9:33
    +  |
    +9 | fn longest(x: &str, y: &str) -> &str {
    +  |               ----     ----     ^ expected named lifetime parameter
    +  |
    +  = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `x` or `y`
    +help: consider introducing a named lifetime parameter
    +  |
    +9 | fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    +  |           ++++     ++          ++          ++
    +
    +For more information about this error, try `rustc --explain E0106`.
    +error: could not compile `chapter10` (bin "chapter10") due to 1 previous error
    +
    +

    提示文本揭示了返回值需要一个泛型生命周期参数,因为 Rust 并不知道将要返回的引用是指向 xy。事实上我们也不知道,因为函数体中 if 块返回一个 x 的引用而 else 块返回一个 y 的引用!

    +

    当我们定义这个函数的时候,并不知道传递给函数的具体值,所以也不知道到底是 if 还是 else 会被执行。我们也不知道传入的引用的具体生命周期,所以也就不能像示例 10-17 和 10-18 那样通过观察作用域来确定返回的引用是否总是有效。借用检查器自身同样也无法确定,因为它不知道 xy 的生命周期是如何与返回值的生命周期相关联的。为了修复这个错误,我们将增加泛型生命周期参数来定义引用间的关系以便借用检查器可以进行分析。

    +

    生命周期注解语法

    +

    生命周期注解并不改变任何引用的生命周期的长短。相反它们描述了多个引用生命周期相互的关系,而不影响其生命周期。与当函数签名中指定了泛型类型参数后就可以接受任何类型一样,当指定了泛型生命周期后函数也能接受任何生命周期的引用。

    +

    生命周期注解有着一个不太常见的语法:生命周期参数名称必须以撇号(')开头,其名称通常全是小写,类似于泛型其名称非常短。大多数人使用 'a 作为第一个生命周期注解。生命周期参数注解位于引用的 & 之后,并有一个空格来将引用类型与生命周期注解分隔开。

    +

    这里有一些例子:我们有一个没有生命周期参数的 i32 的引用,一个有叫做 'a 的生命周期参数的 i32 的引用,和一个生命周期也是 'ai32 的可变引用:

    +
    &i32        // 引用
    +&'a i32     // 带有显式生命周期的引用
    +&'a mut i32 // 带有显式生命周期的可变引用
    +

    单个的生命周期注解本身没有多少意义,因为生命周期注解告诉 Rust 多个引用的泛型生命周期参数如何相互联系的。让我们在 longest 函数的上下文中理解生命周期注解如何相互联系。

    +

    例如如果函数有一个生命周期 'ai32 的引用的参数 first。还有另一个同样是生命周期 'ai32 的引用的参数 second。这两个生命周期注解意味着引用 firstsecond 必须与这泛型生命周期存在得一样久。

    +

    函数签名中的生命周期注解

    +

    为了在函数签名中使用生命周期注解,需要在函数名和参数列表间的尖括号中声明泛型生命周期(lifetime)参数,就像泛型类型(type)参数一样。

    +

    我们希望函数签名表达如下限制:也就是这两个参数和返回的引用存活的一样久。(两个)参数和返回的引用的生命周期是相关的。就像示例 10-21 中在每个引用中都加上了 'a 那样。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let string1 = String::from("abcd");
    +    let string2 = "xyz";
    +
    +    let result = longest(string1.as_str(), string2);
    +    println!("The longest string is {result}");
    +}
    +
    +fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    +    if x.len() > y.len() {
    +        x
    +    } else {
    +        y
    +    }
    +}
    +

    示例 10-21:longest 函数定义指定了签名中所有的引用必须有相同的生命周期 'a

    +

    这段代码能够编译并会产生我们希望得到的示例 10-19 中的 main 函数的结果。

    +

    现在函数签名表明对于某些生命周期 'a,函数会获取两个参数,它们都是与生命周期 'a 存在的至少一样长的字符串 slice。函数会返回一个同样也与生命周期 'a 存在的至少一样长的字符串 slice。它的实际含义是 longest 函数返回的引用的生命周期与函数参数所引用的值的生命周期的较小者一致。这些关系就是我们希望 Rust 分析代码时所使用的。

    +

    记住通过在函数签名中指定生命周期参数时,我们并没有改变任何传入值或返回值的生命周期,而是指出任何不满足这个约束条件的值都将被借用检查器拒绝。注意 longest 函数并不需要知道 xy 具体会存在多久,而只需要知道有某个可以被 'a 替代的作用域将会满足这个签名。

    +

    当在函数中使用生命周期注解时,这些注解出现在函数签名中,而不存在于函数体中的任何代码中。生命周期注解成为了函数约定的一部分,非常像签名中的类型。让函数签名包含生命周期约定意味着 Rust 编译器的工作变得更简单了。如果函数注解有误或者调用方法不对,编译器错误可以更准确地指出代码和限制的部分。如果不这么做的话,Rust 编译会对我们期望的生命周期关系做更多的推断,这样编译器可能只能指出离出问题地方很多步之外的代码。

    +

    当具体的引用被传递给 longest 时,被 'a 所替代的具体生命周期是 x 的作用域与 y 的作用域相重叠的那一部分。换一种说法就是泛型生命周期 'a 的具体生命周期等同于 xy 的生命周期中较小的那一个。因为我们用相同的生命周期参数 'a 标注了返回的引用值,所以返回的引用值就能保证在 xy 中较短的那个生命周期结束之前保持有效。

    +

    让我们看看如何通过传递拥有不同具体生命周期的引用来限制 longest 函数的使用。示例 10-22 是一个很直观的例子。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let string1 = String::from("long string is long");
    +
    +    {
    +        let string2 = String::from("xyz");
    +        let result = longest(string1.as_str(), string2.as_str());
    +        println!("The longest string is {result}");
    +    }
    +}
    +
    +fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    +    if x.len() > y.len() {
    +        x
    +    } else {
    +        y
    +    }
    +}
    +

    示例 10-22:通过拥有不同的具体生命周期的 String 值调用 longest 函数

    +

    在这个例子中,string1 直到外部作用域结束都是有效的,string2 则在内部作用域中是有效的,而 result 则引用了一些直到内部作用域结束都是有效的值。借用检查器认可这些代码;它能够编译和运行,并打印出 The longest string is long string is long

    +

    接下来,让我们尝试另外一个例子,该例子揭示了 result 的引用的生命周期必须是两个参数中较短的那个。以下代码将 result 变量的声明移动出内部作用域,但是将 resultstring2 变量的赋值语句一同留在内部作用域中。接着,使用了变量 resultprintln! 也被移动到内部作用域之外。注意示例 10-23 中的代码不能通过编译:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let string1 = String::from("long string is long");
    +    let result;
    +    {
    +        let string2 = String::from("xyz");
    +        result = longest(string1.as_str(), string2.as_str());
    +    }
    +    println!("The longest string is {result}");
    +}
    +
    +fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    +    if x.len() > y.len() {
    +        x
    +    } else {
    +        y
    +    }
    +}
    +

    示例 10-23:尝试在 string2 离开作用域之后使用 result

    +

    如果尝试编译会出现如下错误:

    +
    $ cargo run
    +   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
    +error[E0597]: `string2` does not live long enough
    + --> src/main.rs:6:44
    +  |
    +5 |         let string2 = String::from("xyz");
    +  |             ------- binding `string2` declared here
    +6 |         result = longest(string1.as_str(), string2.as_str());
    +  |                                            ^^^^^^^ borrowed value does not live long enough
    +7 |     }
    +  |     - `string2` dropped here while still borrowed
    +8 |     println!("The longest string is {result}");
    +  |                                     -------- borrow later used here
    +
    +For more information about this error, try `rustc --explain E0597`.
    +error: could not compile `chapter10` (bin "chapter10") due to 1 previous error
    +
    +

    错误表明为了保证 println! 中的 result 是有效的,string2 需要直到外部作用域结束都是有效的。Rust 知道这些是因为(longest)函数的参数和返回值都使用了相同的生命周期参数 'a

    +

    如果从人的角度读上述代码,我们可能会觉得这个代码是正确的。 string1 更长,因此 result 会包含指向 string1 的引用。因为 string1 尚未离开作用域,对于 println! 来说 string1 的引用仍然是有效的。然而,我们通过生命周期参数告诉 Rust 的是: longest 函数返回的引用的生命周期应该与传入参数的生命周期中较短那个保持一致。因此,借用检查器不允许示例 10-23 中的代码,因为它可能会存在无效的引用。

    +

    请尝试更多采用不同的值和不同生命周期的引用作为 longest 函数的参数和返回值的实验。并在开始编译前猜想你的实验能否通过借用检查器,接着编译一下看看你的理解是否正确!

    +

    深入理解生命周期

    +

    指定生命周期参数的正确方式依赖函数实现的具体功能。例如,如果将 longest 函数的实现修改为总是返回第一个参数而不是最长的字符串 slice,就不需要为参数 y 指定一个生命周期。如下代码将能够编译:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let string1 = String::from("abcd");
    +    let string2 = "efghijklmnopqrstuvwxyz";
    +
    +    let result = longest(string1.as_str(), string2);
    +    println!("The longest string is {result}");
    +}
    +
    +fn longest<'a>(x: &'a str, y: &str) -> &'a str {
    +    x
    +}
    +

    我们为参数 x 和返回值指定了生命周期参数 'a,不过没有为参数 y 指定,因为 y 的生命周期与参数 x 和返回值的生命周期没有任何关系。

    +

    当从函数返回一个引用,返回值的生命周期参数需要与一个参数的生命周期参数相匹配。如果返回的引用 没有 指向任何一个参数,那么唯一的可能就是它指向一个函数内部创建的值。然而它将会是一个悬垂引用,因为它将会在函数结束时离开作用域。尝试考虑这个并不能编译的 longest 函数实现:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let string1 = String::from("abcd");
    +    let string2 = "xyz";
    +
    +    let result = longest(string1.as_str(), string2);
    +    println!("The longest string is {result}");
    +}
    +
    +fn longest<'a>(x: &str, y: &str) -> &'a str {
    +    let result = String::from("really long string");
    +    result.as_str()
    +}
    +

    即便我们为返回值指定了生命周期参数 'a,这个实现却编译失败了,因为返回值的生命周期与参数完全没有关联。这里是会出现的错误信息:

    +
    $ cargo run
    +   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
    +error[E0515]: cannot return value referencing local variable `result`
    +  --> src/main.rs:11:5
    +   |
    +11 |     result.as_str()
    +   |     ------^^^^^^^^^
    +   |     |
    +   |     returns a value referencing data owned by the current function
    +   |     `result` is borrowed here
    +
    +For more information about this error, try `rustc --explain E0515`.
    +error: could not compile `chapter10` (bin "chapter10") due to 1 previous error
    +
    +

    出现的问题是 resultlongest 函数的结尾将离开作用域并被清理,而我们尝试从函数返回一个 result 的引用。无法指定生命周期参数来改变悬垂引用,而且 Rust 也不允许我们创建一个悬垂引用。在这种情况,最好的解决方案是返回一个有所有权的数据类型而不是一个引用,这样函数调用者就需要负责清理这个值了。

    +

    综上,生命周期语法是用于将函数的多个参数与其返回值的生命周期进行关联的。一旦它们形成了某种关联,Rust 就有了足够的信息来允许内存安全的操作并阻止会产生悬垂指针亦或是违反内存安全的行为。

    +

    结构体定义中的生命周期注解

    +

    目前为止,我们定义的结构体全都包含拥有所有权的类型。也可以定义包含引用的结构体,不过这需要为结构体定义中的每一个引用添加生命周期注解。示例 10-24 中有一个存放了一个字符串 slice 的结构体 ImportantExcerpt

    +

    文件名:src/main.rs

    +
    struct ImportantExcerpt<'a> {
    +    part: &'a str,
    +}
    +
    +fn main() {
    +    let novel = String::from("Call me Ishmael. Some years ago...");
    +    let first_sentence = novel.split('.').next().unwrap();
    +    let i = ImportantExcerpt {
    +        part: first_sentence,
    +    };
    +}
    +

    示例 10-24:一个存放引用的结构体,所以其定义需要生命周期注解

    +

    这个结构体有唯一一个字段 part,它存放了一个字符串 slice,这是一个引用。类似于泛型参数类型,必须在结构体名称后面的尖括号中声明泛型生命周期参数,以便在结构体定义中使用生命周期参数。这个注解意味着 ImportantExcerpt 的实例不能比其 part 字段中的引用存在的更久。

    +

    这里的 main 函数创建了一个 ImportantExcerpt 的实例,它存放了变量 novel 所拥有的 String 的第一个句子的引用。novel 的数据在 ImportantExcerpt 实例创建之前就存在。另外,直到 ImportantExcerpt 离开作用域之后 novel 都不会离开作用域,所以 ImportantExcerpt 实例中的引用是有效的。

    +

    生命周期省略(Lifetime Elision)

    +

    现在我们已经知道了每一个引用都有一个生命周期,而且我们需要为那些使用了引用的函数或结构体指定生命周期。然而,第四章的示例 4-9 中有一个函数,如示例 10-25 所示,它没有生命周期注解却能编译成功:

    +

    文件名:src/lib.rs

    +
    fn first_word(s: &str) -> &str {
    +    let bytes = s.as_bytes();
    +
    +    for (i, &item) in bytes.iter().enumerate() {
    +        if item == b' ' {
    +            return &s[0..i];
    +        }
    +    }
    +
    +    &s[..]
    +}
    +
    +fn main() {
    +    let my_string = String::from("hello world");
    +
    +    // first_word works on slices of `String`s
    +    let word = first_word(&my_string[..]);
    +
    +    let my_string_literal = "hello world";
    +
    +    // first_word works on slices of string literals
    +    let word = first_word(&my_string_literal[..]);
    +
    +    // Because string literals *are* string slices already,
    +    // this works too, without the slice syntax!
    +    let word = first_word(my_string_literal);
    +}
    +

    示例 10-25:示例 4-9 定义了一个没有使用生命周期注解的函数,即便其参数和返回值都是引用

    +

    这个函数没有生命周期注解却能编译是由于一些历史原因:在早期版本(pre-1.0)的 Rust 中,这的确是不能编译的。每一个引用都必须有明确的生命周期。那时的函数签名将会写成这样:

    +
    fn first_word<'a>(s: &'a str) -> &'a str {
    +

    在编写了很多 Rust 代码后,Rust 团队发现在特定情况下 Rust 程序员们总是重复地编写一模一样的生命周期注解。这些场景是可预测的并且遵循几个明确的模式。接着 Rust 团队就把这些模式编码进了 Rust 编译器中,如此借用检查器在这些情况下就能推断出生命周期而不再强制程序员显式的增加注解。

    +

    这里我们提到一些 Rust 的历史是因为更多的明确的模式被合并和添加到编译器中是完全可能的。未来只会需要更少的生命周期注解。

    +

    被编码进 Rust 引用分析的模式被称为 生命周期省略规则lifetime elision rules)。这并不是需要程序员遵守的规则;这些规则是一系列特定的场景,此时编译器会考虑,如果代码符合这些场景,就无需明确指定生命周期。

    +

    省略规则并不提供完整的推断:如果 Rust 在明确遵守这些规则的前提下变量的生命周期仍然是模棱两可的话,它不会猜测剩余引用的生命周期应该是什么。编译器会在可以通过增加生命周期注解来解决错误问题的地方给出一个错误提示,而不是进行推断或猜测。

    +

    函数或方法的参数的生命周期被称为 输入生命周期input lifetimes),而返回值的生命周期被称为 输出生命周期output lifetimes)。

    +

    编译器采用三条规则来判断引用何时不需要明确的注解。第一条规则适用于输入生命周期,后两条规则适用于输出生命周期。如果编译器检查完这三条规则后仍然存在没有计算出生命周期的引用,编译器将会停止并生成错误。这些规则适用于 fn 定义,以及 impl 块。

    +

    第一条规则是编译器为每一个引用参数都分配一个生命周期参数。换句话说就是,函数有一个引用参数的就有一个生命周期参数:fn foo<'a>(x: &'a i32),有两个引用参数的函数就有两个不同的生命周期参数,fn foo<'a, 'b>(x: &'a i32, y: &'b i32),依此类推。

    +

    第二条规则是如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数:fn foo<'a>(x: &'a i32) -> &'a i32

    +

    第三条规则是如果方法有多个输入生命周期参数并且其中一个参数是 &self&mut self,说明是个对象的方法 (method)(译者注:这里涉及 rust 的面向对象参见 17 章),那么所有输出生命周期参数被赋予 self 的生命周期。第三条规则使得方法更容易读写,因为只需更少的符号。

    +

    假设我们自己就是编译器。并应用这些规则来计算示例 10-25 中 first_word 函数签名中的引用的生命周期。开始时签名中的引用并没有关联任何生命周期:

    +
    fn first_word(s: &str) -> &str {
    +

    接着编译器应用第一条规则,也就是每个引用参数都有其自己的生命周期。我们像往常一样称之为 'a,所以现在签名看起来像这样:

    +
    fn first_word<'a>(s: &'a str) -> &str {
    +

    对于第二条规则,因为这里正好只有一个输入生命周期参数所以是适用的。第二条规则表明输入参数的生命周期将被赋予输出生命周期参数,所以现在签名看起来像这样:

    +
    fn first_word<'a>(s: &'a str) -> &'a str {
    +

    现在这个函数签名中的所有引用都有了生命周期,如此编译器可以继续它的分析而无须程序员标记这个函数签名中的生命周期。

    +

    让我们再看看另一个例子,这次我们从示例 10-20 中没有生命周期参数的 longest 函数开始:

    +
    fn longest(x: &str, y: &str) -> &str {
    +

    再次假设我们自己就是编译器并应用第一条规则:每个引用参数都有其自己的生命周期。这次有两个参数,所以就有两个(不同的)生命周期:

    +
    fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &str {
    +

    再来应用第二条规则,因为函数存在多个输入生命周期,它并不适用于这种情况。再来看第三条规则,它同样也不适用,这是因为没有 self 参数。应用了三个规则之后编译器还没有计算出返回值类型的生命周期。这就是在编译示例 10-20 的代码时会出现错误的原因:编译器使用所有已知的生命周期省略规则,仍不能计算出签名中所有引用的生命周期。

    +

    因为第三条规则真正能够适用的就只有方法签名,现在就让我们看看那种情况中的生命周期,并看看为什么这条规则意味着我们经常不需要在方法签名中标注生命周期。

    +

    方法定义中的生命周期注解

    +

    当为带有生命周期的结构体实现方法时,其语法依然类似示例 10-11 中展示的泛型类型参数的语法。我们在哪里声明和使用生命周期参数,取决于它们是与结构体字段相关还是与方法参数和返回值相关。

    +

    (实现方法时)结构体字段的生命周期必须总是在 impl 关键字之后声明并在结构体名称之后被使用,因为这些生命周期是结构体类型的一部分。

    +

    impl 块里的方法签名中,引用可能与结构体字段中的引用相关联,也可能是独立的。另外,生命周期省略规则也经常让我们无需在方法签名中使用生命周期注解。让我们看看一些使用示例 10-24 中定义的结构体 ImportantExcerpt 的例子。

    +

    首先,这里有一个方法 level。其唯一的参数是 self 的引用,而且返回值只是一个 i32,并不引用任何值:

    +
    struct ImportantExcerpt<'a> {
    +    part: &'a str,
    +}
    +
    +impl<'a> ImportantExcerpt<'a> {
    +    fn level(&self) -> i32 {
    +        3
    +    }
    +}
    +
    +impl<'a> ImportantExcerpt<'a> {
    +    fn announce_and_return_part(&self, announcement: &str) -> &str {
    +        println!("Attention please: {announcement}");
    +        self.part
    +    }
    +}
    +
    +fn main() {
    +    let novel = String::from("Call me Ishmael. Some years ago...");
    +    let first_sentence = novel.split('.').next().unwrap();
    +    let i = ImportantExcerpt {
    +        part: first_sentence,
    +    };
    +}
    +

    impl 之后和类型名称之后的生命周期参数是必要的,不过因为第一条生命周期规则我们并不必须标注 self 引用的生命周期。

    +

    这里是一个适用于第三条生命周期省略规则的例子:

    +
    struct ImportantExcerpt<'a> {
    +    part: &'a str,
    +}
    +
    +impl<'a> ImportantExcerpt<'a> {
    +    fn level(&self) -> i32 {
    +        3
    +    }
    +}
    +
    +impl<'a> ImportantExcerpt<'a> {
    +    fn announce_and_return_part(&self, announcement: &str) -> &str {
    +        println!("Attention please: {announcement}");
    +        self.part
    +    }
    +}
    +
    +fn main() {
    +    let novel = String::from("Call me Ishmael. Some years ago...");
    +    let first_sentence = novel.split('.').next().unwrap();
    +    let i = ImportantExcerpt {
    +        part: first_sentence,
    +    };
    +}
    +

    这里有两个输入生命周期,所以 Rust 应用第一条生命周期省略规则并给予 &selfannouncement 它们各自的生命周期。接着,因为其中一个参数是 &self,返回值类型被赋予了 &self 的生命周期,这样所有的生命周期都被计算出来了。

    +

    静态生命周期

    +

    这里有一种特殊的生命周期值得讨论:'static,其生命周期能够存活于整个程序期间。所有的字符串字面值都拥有 'static 生命周期,我们也可以选择像下面这样标注出来:

    +
    #![allow(unused)]
    +fn main() {
    +let s: &'static str = "I have a static lifetime.";
    +}
    +

    这个字符串的文本被直接储存在程序的二进制文件中而这个文件总是可用的。因此所有的字符串字面值都是 'static 的。

    +

    你可能在错误信息的帮助文本中见过使用 'static 生命周期的建议,不过将引用指定为 'static 之前,思考一下这个引用是否真的在整个程序的生命周期里都有效,以及你是否希望它存在得这么久。大部分情况中,推荐 'static 生命周期的错误信息都是尝试创建一个悬垂引用或者可用的生命周期不匹配的结果。在这种情况下的解决方案是修复这些问题而不是指定一个 'static 的生命周期。

    +

    结合泛型类型参数、trait bounds 和生命周期

    +

    让我们简要的看一下在同一函数中指定泛型类型参数、trait bounds 和生命周期的语法!

    +
    fn main() {
    +    let string1 = String::from("abcd");
    +    let string2 = "xyz";
    +
    +    let result = longest_with_an_announcement(
    +        string1.as_str(),
    +        string2,
    +        "Today is someone's birthday!",
    +    );
    +    println!("The longest string is {result}");
    +}
    +
    +use std::fmt::Display;
    +
    +fn longest_with_an_announcement<'a, T>(
    +    x: &'a str,
    +    y: &'a str,
    +    ann: T,
    +) -> &'a str
    +where
    +    T: Display,
    +{
    +    println!("Announcement! {ann}");
    +    if x.len() > y.len() {
    +        x
    +    } else {
    +        y
    +    }
    +}
    +

    这个是示例 10-21 中那个返回两个字符串 slice 中较长者的 longest 函数,不过带有一个额外的参数 annann 的类型是泛型 T,它可以被放入任何实现了 where 从句中指定的 Display trait 的类型。这个额外的参数会使用 {} 打印,这也就是为什么 Display trait bound 是必须的。因为生命周期也是泛型,所以生命周期参数 'a 和泛型类型参数 T 都位于函数名后的同一尖括号列表中。

    +

    总结

    +

    这一章介绍了很多的内容!现在你知道了泛型类型参数、trait 和 trait bounds 以及泛型生命周期类型,你已经准备好编写既不重复又能适用于多种场景的代码了。泛型类型参数意味着代码可以适用于不同的类型。trait 和 trait bounds 保证了即使类型是泛型的,这些类型也会拥有所需要的行为。由生命周期注解所指定的引用生命周期之间的关系保证了这些灵活多变的代码不会出现悬垂引用。而所有的这一切发生在编译时所以不会影响运行时效率!

    +

    你可能不会相信,这个话题还有更多需要学习的内容:第十八章会讨论 trait 对象,这是另一种使用 trait 的方式。还有更多更复杂的涉及生命周期注解的场景,只有在非常高级的情况下才会需要它们;对于这些内容,请阅读 Rust Reference。不过接下来,让我们聊聊如何在 Rust 中编写测试,来确保代码的所有功能能像我们希望的那样工作!

    +

    编写自动化测试

    +
    +

    ch11-00-testing.md +
    +commit 765318b844569a642ceef7bf1adab9639cbf6af3

    +
    +

    Edsger W. Dijkstra 在其 1972 年的文章【谦卑的程序员】(“The Humble Programmer”)中说到 “软件测试是证明 bug 存在的有效方法,而证明其不存在时则显得令人绝望的不足。”(“Program testing can be a very effective way to show the presence of bugs, but it is hopelessly inadequate for showing their absence.”)这并不意味着我们不该尽可能地测试软件!

    +

    程序的正确性意味着代码如我们期望的那样运行。Rust 是一个相当注重正确性的编程语言,不过正确性是一个难以证明的复杂主题。Rust 的类型系统在此问题上下了很大的功夫,不过类型系统不可能捕获所有问题。为此,Rust 包含了编写自动化软件测试的功能支持。

    +

    假设我们可以编写一个叫做 add_two 的将传递给它的值加二的函数。它的签名有一个整型参数并返回一个整型值。当实现和编译这个函数时,Rust 会进行所有目前我们已经见过的类型检查和借用检查,例如,这些检查会确保我们不会传递 String 或无效的引用给这个函数。Rust 所 不能 检查的是这个函数是否会准确的完成我们期望的工作:返回参数加二后的值,而不是比如说参数加 10 或减 50 的值!这也就是测试出场的地方。

    +

    我们可以编写测试断言,比如说,当传递 3add_two 函数时,返回值是 5。无论何时对代码进行修改,都可以运行测试来确保任何现存的正确行为没有被改变。

    +

    测试是一项复杂的技能:虽然不能在一个章节的篇幅中介绍如何编写好的测试的每个细节,但我们还是会讨论 Rust 测试功能的机制。我们会讲到编写测试时会用到的注解和宏,运行测试的默认行为和选项,以及如何将测试组织成单元测试和集成测试。

    +

    如何编写测试

    +
    +

    ch11-01-writing-tests.md +
    +commit 6e2fe7c0f085989cc498cec139e717e2af172cb7

    +
    +

    Rust 中的测试函数是用来验证非测试代码是否是按照期望的方式运行的。测试函数体通常执行如下三种操作:

    +
      +
    1. 设置任何所需的数据或状态
    2. +
    3. 运行需要测试的代码
    4. +
    5. 断言其结果是我们所期望的
    6. +
    +

    让我们看看 Rust 提供的专门用来编写测试的功能:test 属性、一些宏和 should_panic 属性。

    +

    测试函数剖析

    +

    作为最简单例子,Rust 中的测试就是一个带有 test 属性注解的函数。属性(attribute)是关于 Rust 代码片段的元数据;第五章中结构体中用到的 derive 属性就是一个例子。为了将一个函数变成测试函数,需要在 fn 行之前加上 #[test]。当使用 cargo test 命令运行测试时,Rust 会构建一个测试执行程序用来调用被标注的函数,并报告每一个测试是通过还是失败。

    +

    每次使用 Cargo 新建一个库项目时,它会自动为我们生成一个测试模块和一个测试函数。这个模块提供了一个编写测试的模板,为此每次开始新项目时不必去查找测试函数的具体结构和语法了。当然你也可以额外增加任意多的测试函数以及测试模块!

    +

    在实际编写测试代码之前,让我们先通过尝试那些自动生成的测试模版来探索测试是如何工作的。接着,我们会写一些真正的测试,调用我们编写的代码并断言它们的行为的正确性。

    +

    让我们创建一个新的库项目 adder,它会将两个数字相加:

    +
    $ cargo new adder --lib
    +     Created library `adder` project
    +$ cd adder
    +
    +

    adder 库中 src/lib.rs 的内容应该看起来如示例 11-1 所示:

    +

    文件名:src/lib.rs

    +
    pub fn add(left: usize, right: usize) -> usize {
    +    left + right
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn it_works() {
    +        let result = add(2, 2);
    +        assert_eq!(result, 4);
    +    }
    +}
    +

    示例 11-1:由 cargo new 自动生成的测试模块和函数

    +

    现在让我们暂时忽略 tests 模块和 #[cfg(test)] 注解并只关注函数本身。注意 fn 行之前的 #[test]:这个属性表明这是一个测试函数,这样测试执行者就知道将其作为测试处理。tests 模块中也可以有非测试的函数来帮助我们建立通用场景或进行常见操作,必须每次都标明哪些函数是测试。

    +

    示例函数体通过使用 assert_eq! 宏来断言 2 加 2 等于 4。一个典型的测试的格式,就是像这个例子中的断言一样。接下来运行就可以看到测试通过。

    +

    cargo test 命令会运行项目中所有的测试,如示例 11-2 所示:

    +
    $ cargo test
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.57s
    +     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
    +
    +running 1 test
    +test tests::it_works ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests adder
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    示例 11-2:运行自动生成测试的输出

    +

    Cargo 编译并运行了测试。可以看到 running 1 test 这一行。下一行显示了生成的测试函数的名称,它是 it_works,以及测试的运行结果,ok。接着可以看到全体测试运行结果的摘要:test result: ok. 意味着所有测试都通过了。1 passed; 0 failed 表示通过或失败的测试数量。

    +

    可以将一个测试标记为忽略这样在特定情况下它就不会运行;本章之后的“除非特别指定否则忽略某些测试”部分会介绍它。因为之前我们并没有将任何测试标记为忽略,所以摘要中会显示 0 ignored。我们也没有过滤需要运行的测试,所以摘要中会显示0 filtered out。在下一部分 “控制测试如何运行” 会讨论忽略和过滤测试。

    +

    0 measured 统计是针对性能测试的。性能测试(benchmark tests)在编写本书时,仍只能用于 Rust 开发版(nightly Rust)。请查看 性能测试的文档 了解更多。

    +

    测试输出中的以 Doc-tests adder 开头的这一部分是所有文档测试的结果。我们现在并没有任何文档测试,不过 Rust 会编译任何在 API 文档中的代码示例。这个功能帮助我们使文档和代码保持同步!在第十四章的 “文档注释作为测试” 部分会讲到如何编写文档测试。现在我们将忽略 Doc-tests 部分的输出。

    +

    让我们开始自定义测试来满足我们的需求。首先给 it_works 函数起个不同的名字,比如 exploration,像这样:

    +

    文件名:src/lib.rs

    +
    pub fn add(left: usize, right: usize) -> usize {
    +    left + right
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn exploration() {
    +        let result = add(2, 2);
    +        assert_eq!(result, 4);
    +    }
    +}
    +

    并再次运行 cargo test。现在输出中将出现 exploration 而不是 it_works

    +
    $ cargo test
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.59s
    +     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
    +
    +running 1 test
    +test tests::exploration ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests adder
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    现在让我们增加另一个测试,不过这一次是一个会失败的测试!当测试函数中出现 panic 时测试就失败了。每一个测试都在一个新线程中运行,当主线程发现测试线程异常了,就将对应测试标记为失败。第九章讲到了最简单的造成 panic 的方法:调用 panic! 宏。写入新测试 another 后, src/lib.rs 现在看起来如示例 11-3 所示:

    +

    文件名:src/lib.rs

    +
    pub fn add(left: usize, right: usize) -> usize {
    +    left + right
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn exploration() {
    +        let result = add(2, 2);
    +        assert_eq!(result, 4);
    +    }
    +
    +    #[test]
    +    fn another() {
    +        panic!("Make this test fail");
    +    }
    +}
    +

    示例 11-3:增加第二个因调用了 panic! 而失败的测试

    +

    再次 cargo test 运行测试。输出应该看起来像示例 11-4,它表明 exploration 测试通过了而 another 失败了:

    +
    $ cargo test
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.72s
    +     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
    +
    +running 2 tests
    +test tests::another ... FAILED
    +test tests::exploration ... ok
    +
    +failures:
    +
    +---- tests::another stdout ----
    +thread 'tests::another' panicked at src/lib.rs:17:9:
    +Make this test fail
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +
    +failures:
    +    tests::another
    +
    +test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +error: test failed, to rerun pass `--lib`
    +
    +

    示例 11-4:一个测试通过和一个测试失败的测试结果

    +

    test tests::another 这一行是 FAILED 而不是 ok 了。在单独测试结果和摘要之间多了两个新的部分:第一个部分显示了测试失败的详细原因。在这个例子中,我们看到 another 因为在 src/lib.rs 的第 10 行 panicked at 'Make this test fail' 而失败的详细信息。下一部分列出了所有失败的测试,这在有很多测试和很多失败测试的详细输出时很有帮助。我们可以通过使用失败测试的名称来只运行这个测试,以便调试;下一部分 “控制测试如何运行” 会讲到更多运行测试的方法。

    +

    最后是摘要行:总体上讲,测试结果是 FAILED。有一个测试通过和一个测试失败。

    +

    现在我们见过不同场景中测试结果是什么样子的了,再来看看除 panic! 之外的一些在测试中有帮助的宏吧。

    +

    使用 assert! 宏来检查结果

    +

    assert! 宏由标准库提供,在希望确保测试中一些条件为 true 时非常有用。需要向 assert! 宏提供一个求值为布尔值的参数。如果值是 trueassert! 什么也不做,同时测试会通过。如果值为 falseassert! 调用 panic! 宏,这会导致测试失败。assert! 宏帮助我们检查代码是否以期望的方式运行。

    +

    回忆一下第五章中,示例 5-15 中有一个 Rectangle 结构体和一个 can_hold 方法,在示例 11-5 中再次使用它们。将它们放进 src/lib.rs 并使用 assert! 宏编写一些测试。

    +

    文件名:src/lib.rs

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +impl Rectangle {
    +    fn can_hold(&self, other: &Rectangle) -> bool {
    +        self.width > other.width && self.height > other.height
    +    }
    +}
    +

    示例 11-5:第五章中 Rectangle 结构体和其 can_hold 方法

    +

    can_hold 方法返回一个布尔值,这意味着它完美符合 assert! 宏的使用场景。在示例 11-6 中,让我们编写一个 can_hold 方法的测试来作为练习,这里创建一个长为 8 宽为 7 的 Rectangle 实例,并假设它可以放得下另一个长为 5 宽为 1 的 Rectangle 实例:

    +

    文件名:src/lib.rs

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +impl Rectangle {
    +    fn can_hold(&self, other: &Rectangle) -> bool {
    +        self.width > other.width && self.height > other.height
    +    }
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn larger_can_hold_smaller() {
    +        let larger = Rectangle {
    +            width: 8,
    +            height: 7,
    +        };
    +        let smaller = Rectangle {
    +            width: 5,
    +            height: 1,
    +        };
    +
    +        assert!(larger.can_hold(&smaller));
    +    }
    +}
    +

    示例 11-6:一个 can_hold 的测试,检查一个较大的矩形确实能放得下一个较小的矩形

    +

    注意在 tests 模块中新增加了一行:use super::*;tests 是一个普通的模块,它遵循第七章 “路径用于引用模块树中的项” 部分介绍的可见性规则。因为这是一个内部模块,要测试外部模块中的代码,需要将其引入到内部模块的作用域中。这里选择使用 glob 全局导入,以便在 tests 模块中使用所有在外部模块定义的内容。

    +

    我们将测试命名为 larger_can_hold_smaller,并创建所需的两个 Rectangle 实例。接着调用 assert! 宏并传递 larger.can_hold(&smaller) 调用的结果作为参数。这个表达式预期会返回 true,所以测试应该通过。让我们拭目以待!

    +
    $ cargo test
    +   Compiling rectangle v0.1.0 (file:///projects/rectangle)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s
    +     Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e)
    +
    +running 1 test
    +test tests::larger_can_hold_smaller ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests rectangle
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    它确实通过了!再来增加另一个测试,这一回断言一个更小的矩形不能放下一个更大的矩形:

    +

    文件名:src/lib.rs

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +impl Rectangle {
    +    fn can_hold(&self, other: &Rectangle) -> bool {
    +        self.width > other.width && self.height > other.height
    +    }
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn larger_can_hold_smaller() {
    +        // --snip--
    +        let larger = Rectangle {
    +            width: 8,
    +            height: 7,
    +        };
    +        let smaller = Rectangle {
    +            width: 5,
    +            height: 1,
    +        };
    +
    +        assert!(larger.can_hold(&smaller));
    +    }
    +
    +    #[test]
    +    fn smaller_cannot_hold_larger() {
    +        let larger = Rectangle {
    +            width: 8,
    +            height: 7,
    +        };
    +        let smaller = Rectangle {
    +            width: 5,
    +            height: 1,
    +        };
    +
    +        assert!(!smaller.can_hold(&larger));
    +    }
    +}
    +

    因为这里 can_hold 函数的正确结果是 false ,我们需要将这个结果取反后传递给 assert! 宏。因此 can_hold 返回 false 时测试就会通过:

    +
    $ cargo test
    +   Compiling rectangle v0.1.0 (file:///projects/rectangle)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s
    +     Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e)
    +
    +running 2 tests
    +test tests::larger_can_hold_smaller ... ok
    +test tests::smaller_cannot_hold_larger ... ok
    +
    +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests rectangle
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    两个通过的测试!现在让我们看看如果引入一个 bug 的话测试结果会发生什么。将 can_hold 方法中比较长度时本应使用大于号的地方改成小于号:

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +// --snip--
    +impl Rectangle {
    +    fn can_hold(&self, other: &Rectangle) -> bool {
    +        self.width < other.width && self.height > other.height
    +    }
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn larger_can_hold_smaller() {
    +        let larger = Rectangle {
    +            width: 8,
    +            height: 7,
    +        };
    +        let smaller = Rectangle {
    +            width: 5,
    +            height: 1,
    +        };
    +
    +        assert!(larger.can_hold(&smaller));
    +    }
    +
    +    #[test]
    +    fn smaller_cannot_hold_larger() {
    +        let larger = Rectangle {
    +            width: 8,
    +            height: 7,
    +        };
    +        let smaller = Rectangle {
    +            width: 5,
    +            height: 1,
    +        };
    +
    +        assert!(!smaller.can_hold(&larger));
    +    }
    +}
    +

    现在运行测试会产生:

    +
    $ cargo test
    +   Compiling rectangle v0.1.0 (file:///projects/rectangle)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s
    +     Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e)
    +
    +running 2 tests
    +test tests::larger_can_hold_smaller ... FAILED
    +test tests::smaller_cannot_hold_larger ... ok
    +
    +failures:
    +
    +---- tests::larger_can_hold_smaller stdout ----
    +thread 'tests::larger_can_hold_smaller' panicked at src/lib.rs:28:9:
    +assertion failed: larger.can_hold(&smaller)
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +
    +failures:
    +    tests::larger_can_hold_smaller
    +
    +test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +error: test failed, to rerun pass `--lib`
    +
    +

    我们的测试捕获了 bug!因为 larger.length 是 8 而 smaller.length 是 5,can_hold 中的长度比较现在因为 8 不小于 5 而返回 false

    +

    使用 assert_eq!assert_ne! 宏来测试相等

    +

    测试功能的一个常用方法是将需要测试代码的值与期望值做比较,并检查是否相等。可以通过向 assert! 宏传递一个使用 == 运算符的表达式来做到。不过这个操作实在是太常见了,以至于标准库提供了一对宏来更方便的处理这些操作 —— assert_eq!assert_ne!。这两个宏分别比较两个值是相等还是不相等。当断言失败时它们也会打印出这两个值具体是什么,以便于观察测试 为什么 失败,而 assert! 只会打印出它从 == 表达式中得到了 false 值,而不是打印导致 false 的两个值。

    +

    示例 11-7 中,让我们编写一个对其参数加二并返回结果的函数 add_two。接着使用 assert_eq! 宏测试这个函数。

    +

    文件名:src/lib.rs

    +
    pub fn add_two(a: usize) -> usize {
    +    a + 2
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn it_adds_two() {
    +        let result = add_two(2);
    +        assert_eq!(result, 4);
    +    }
    +}
    +

    示例 11-7:使用 assert_eq! 宏测试 add_two 函数

    +

    测试通过了!

    +
    $ cargo test
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s
    +     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
    +
    +running 1 test
    +test tests::it_adds_two ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests adder
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    我们传递给 assert_eq! 宏的第一个参数 4 ,它等于调用 add_two(2) 的结果。测试中的这一行 test tests::it_adds_two ... okok 表明测试通过!

    +

    在代码中引入一个 bug 来看看使用 assert_eq! 的测试失败是什么样的。修改 add_two 函数的实现使其加 3

    +
    pub fn add_two(a: usize) -> usize {
    +    a + 3
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn it_adds_two() {
    +        let result = add_two(2);
    +        assert_eq!(result, 4);
    +    }
    +}
    +

    再次运行测试:

    +
    $ cargo test
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.61s
    +     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
    +
    +running 1 test
    +test tests::it_adds_two ... FAILED
    +
    +failures:
    +
    +---- tests::it_adds_two stdout ----
    +thread 'tests::it_adds_two' panicked at src/lib.rs:12:9:
    +assertion `left == right` failed
    +  left: 5
    + right: 4
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +
    +failures:
    +    tests::it_adds_two
    +
    +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +error: test failed, to rerun pass `--lib`
    +
    +

    测试捕获到了 bug!it_adds_two 测试失败,错误信息告诉我们断言失败了,它告诉我们 assertion failed: `(left == right)` 以及 leftright 的值是什么。这个错误信息有助于我们开始调试:它说 assert_eq!left 参数是 4,而 right 参数,也就是 add_two(2) 的结果,是 5。可以想象当有很多测试在运行时这些信息是多么的有用。

    +

    需要注意的是,在一些语言和测试框架中,断言两个值相等的函数的参数被称为 expectedactual,而且指定参数的顺序非常重要。然而在 Rust 中,它们则叫做 leftright,同时指定期望的值和被测试代码产生的值的顺序并不重要。这个测试中的断言也可以写成 assert_eq!(add_two(2), 4),这时失败信息仍同样是 assertion failed: `(left == right)`

    +

    assert_ne! 宏在传递给它的两个值不相等时通过,而在相等时失败。在代码按预期运行,我们不确定值 是什么,不过能确定值绝对 不会 是什么的时候,这个宏最有用处。例如,如果一个函数保证会以某种方式改变其输出,不过这种改变方式是由运行测试时是星期几来决定的,这时最好的断言可能就是函数的输出不等于其输入。

    +

    assert_eq!assert_ne! 宏在底层分别使用了 ==!=。当断言失败时,这些宏会使用调试格式打印出其参数,这意味着被比较的值必须实现了 PartialEqDebug trait。所有的基本类型和大部分标准库类型都实现了这些 trait。对于自定义的结构体和枚举,需要实现 PartialEq 才能断言它们的值是否相等。需要实现 Debug 才能在断言失败时打印它们的值。因为这两个 trait 都是派生 trait,如第五章示例 5-12 所提到的,通常可以直接在结构体或枚举上添加 #[derive(PartialEq, Debug)] 注解。附录 C “可派生 trait” 中有更多关于这些和其他派生 trait 的详细信息。

    +

    自定义失败信息

    +

    你也可以向 assert!assert_eq!assert_ne! 宏传递一个可选的失败信息参数,可以在测试失败时将自定义失败信息一同打印出来。任何在 assert! 的一个必需参数和 assert_eq!assert_ne! 的两个必需参数之后指定的参数都会传递给 format! 宏(在第八章的 “使用 + 运算符或 format! 宏拼接字符串” 部分讨论过),所以可以传递一个包含 {} 占位符的格式字符串和需要放入占位符的值。自定义信息有助于记录断言的意义;当测试失败时就能更好的理解代码出了什么问题。

    +

    例如,比如说有一个根据人名进行问候的函数,而我们希望测试将传递给函数的人名显示在输出中:

    +

    文件名:src/lib.rs

    +
    pub fn greeting(name: &str) -> String {
    +    format!("Hello {name}!")
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn greeting_contains_name() {
    +        let result = greeting("Carol");
    +        assert!(result.contains("Carol"));
    +    }
    +}
    +

    这个程序的需求还没有被确定,因此问候文本开头的 Hello 文本很可能会改变。然而我们并不想在需求改变时不得不更新测试,所以相比检查 greeting 函数返回的确切值,我们将仅仅断言输出的文本中包含输入参数。

    +

    让我们通过将 greeting 改为不包含 name 在代码中引入一个 bug 来测试失败时是怎样的:

    +
    pub fn greeting(name: &str) -> String {
    +    String::from("Hello!")
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn greeting_contains_name() {
    +        let result = greeting("Carol");
    +        assert!(result.contains("Carol"));
    +    }
    +}
    +

    运行测试会产生:

    +
    $ cargo test
    +   Compiling greeter v0.1.0 (file:///projects/greeter)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.91s
    +     Running unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a)
    +
    +running 1 test
    +test tests::greeting_contains_name ... FAILED
    +
    +failures:
    +
    +---- tests::greeting_contains_name stdout ----
    +thread 'tests::greeting_contains_name' panicked at src/lib.rs:12:9:
    +assertion failed: result.contains("Carol")
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +
    +failures:
    +    tests::greeting_contains_name
    +
    +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +error: test failed, to rerun pass `--lib`
    +
    +

    结果仅仅告诉了我们断言失败了和失败的行号。一个更有用的失败信息应该打印出 greeting 函数的值。让我们为测试函数增加一个自定义失败信息参数:带占位符的格式字符串,以及 greeting 函数的值:

    +
    pub fn greeting(name: &str) -> String {
    +    String::from("Hello!")
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn greeting_contains_name() {
    +        let result = greeting("Carol");
    +        assert!(
    +            result.contains("Carol"),
    +            "Greeting did not contain name, value was `{result}`"
    +        );
    +    }
    +}
    +

    现在如果再次运行测试,将会看到更有价值的信息:

    +
    $ cargo test
    +   Compiling greeter v0.1.0 (file:///projects/greeter)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.93s
    +     Running unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a)
    +
    +running 1 test
    +test tests::greeting_contains_name ... FAILED
    +
    +failures:
    +
    +---- tests::greeting_contains_name stdout ----
    +thread 'tests::greeting_contains_name' panicked at src/lib.rs:12:9:
    +Greeting did not contain name, value was `Hello!`
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +
    +failures:
    +    tests::greeting_contains_name
    +
    +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +error: test failed, to rerun pass `--lib`
    +
    +

    可以在测试输出中看到所取得的确切的值,这会帮助我们理解真正发生了什么,而不是期望发生什么。

    +

    使用 should_panic 检查 panic

    +

    除了检查返回值之外,检查代码是否按照期望处理错误也是很重要的。例如,考虑第九章示例 9-10 创建的 Guess 类型。其他使用 Guess 的代码都是基于 Guess 实例仅有的值范围在 1 到 100 的前提。可以编写一个测试来确保创建一个超出范围的值的 Guess 实例会 panic。

    +

    可以通过对函数增加另一个属性 should_panic 来实现这些。这个属性在函数中的代码 panic 时会通过,而在其中的代码没有 panic 时失败。

    +

    示例 11-8 展示了一个检查 Guess::new 是否按照我们的期望出错的测试:

    +

    文件名:src/lib.rs

    +
    pub struct Guess {
    +    value: i32,
    +}
    +
    +impl Guess {
    +    pub fn new(value: i32) -> Guess {
    +        if value < 1 || value > 100 {
    +            panic!("Guess value must be between 1 and 100, got {value}.");
    +        }
    +
    +        Guess { value }
    +    }
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    #[should_panic]
    +    fn greater_than_100() {
    +        Guess::new(200);
    +    }
    +}
    +

    示例 11-8:测试会造成 panic! 的条件

    +

    #[should_panic] 属性位于 #[test] 之后,对应的测试函数之前。让我们看看测试通过时它是什么样子:

    +
    $ cargo test
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s
    +     Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d)
    +
    +running 1 test
    +test tests::greater_than_100 - should panic ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests guessing_game
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    看起来不错!现在在代码中引入 bug,移除 new 函数在值大于 100 时会 panic 的条件:

    +
    pub struct Guess {
    +    value: i32,
    +}
    +
    +// --snip--
    +impl Guess {
    +    pub fn new(value: i32) -> Guess {
    +        if value < 1 {
    +            panic!("Guess value must be between 1 and 100, got {value}.");
    +        }
    +
    +        Guess { value }
    +    }
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    #[should_panic]
    +    fn greater_than_100() {
    +        Guess::new(200);
    +    }
    +}
    +

    如果运行示例 11-8 的测试,它会失败:

    +
    $ cargo test
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.62s
    +     Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d)
    +
    +running 1 test
    +test tests::greater_than_100 - should panic ... FAILED
    +
    +failures:
    +
    +---- tests::greater_than_100 stdout ----
    +note: test did not panic as expected
    +
    +failures:
    +    tests::greater_than_100
    +
    +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +error: test failed, to rerun pass `--lib`
    +
    +

    这回并没有得到非常有用的信息,不过一旦我们观察测试函数,会发现它标注了 #[should_panic]。这个错误意味着代码中测试函数 Guess::new(200) 并没有产生 panic。

    +

    然而 should_panic 测试结果可能会非常含糊不清。should_panic 甚至在一些不是我们期望的原因而导致 panic 时也会通过。为了使 should_panic 测试结果更精确,我们可以给 should_panic 属性增加一个可选的 expected 参数。测试工具会确保错误信息中包含其提供的文本。例如,考虑示例 11-9 中修改过的 Guess,这里 new 函数根据其值是过大还或者过小而提供不同的 panic 信息:

    +

    文件名:src/lib.rs

    +
    pub struct Guess {
    +    value: i32,
    +}
    +
    +// --snip--
    +
    +impl Guess {
    +    pub fn new(value: i32) -> Guess {
    +        if value < 1 {
    +            panic!(
    +                "Guess value must be greater than or equal to 1, got {value}."
    +            );
    +        } else if value > 100 {
    +            panic!(
    +                "Guess value must be less than or equal to 100, got {value}."
    +            );
    +        }
    +
    +        Guess { value }
    +    }
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    #[should_panic(expected = "less than or equal to 100")]
    +    fn greater_than_100() {
    +        Guess::new(200);
    +    }
    +}
    +

    示例 11-9:一个会带有特定错误信息的 panic! 条件的测试

    +

    这个测试会通过,因为 should_panic 属性中 expected 参数提供的值是 Guess::new 函数 panic 信息的子串。我们可以指定期望的整个 panic 信息,在这个例子中是 Guess value must be less than or equal to 100, got 200.expected 信息的选择取决于 panic 信息有多独特或动态,和你希望测试有多准确。在这个例子中,错误信息的子字符串足以确保函数在 else if value > 100 的情况下运行。

    +

    为了观察带有 expected 信息的 should_panic 测试失败时会发生什么,让我们再次引入一个 bug,将 if value < 1else if value > 100 的代码块对换:

    +
    pub struct Guess {
    +    value: i32,
    +}
    +
    +impl Guess {
    +    pub fn new(value: i32) -> Guess {
    +        if value < 1 {
    +            panic!(
    +                "Guess value must be less than or equal to 100, got {value}."
    +            );
    +        } else if value > 100 {
    +            panic!(
    +                "Guess value must be greater than or equal to 1, got {value}."
    +            );
    +        }
    +
    +        Guess { value }
    +    }
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    #[should_panic(expected = "less than or equal to 100")]
    +    fn greater_than_100() {
    +        Guess::new(200);
    +    }
    +}
    +

    这一次运行 should_panic 测试,它会失败:

    +
    $ cargo test
    +   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s
    +     Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d)
    +
    +running 1 test
    +test tests::greater_than_100 - should panic ... FAILED
    +
    +failures:
    +
    +---- tests::greater_than_100 stdout ----
    +thread 'tests::greater_than_100' panicked at src/lib.rs:12:13:
    +Guess value must be greater than or equal to 1, got 200.
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +note: panic did not contain expected string
    +      panic message: `"Guess value must be greater than or equal to 1, got 200."`,
    + expected substring: `"less than or equal to 100"`
    +
    +failures:
    +    tests::greater_than_100
    +
    +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +error: test failed, to rerun pass `--lib`
    +
    +

    失败信息表明测试确实如期望 panic 了,不过 panic 信息中并没有包含 expected 信息 'Guess value must be less than or equal to 100'。而我们得到的 panic 信息是 'Guess value must be greater than or equal to 1, got 200.'。这样就可以开始寻找 bug 在哪了!

    +

    Result<T, E> 用于测试

    +

    目前为止,我们编写的测试在失败时都会 panic。我们也可以使用 Result<T, E> 编写测试!这是一个延伸自示例 11-1 的测试,使用 Result<T, E> 重写,并在失败时返回 Err 而非 panic:

    +
    pub fn add(left: usize, right: usize) -> usize {
    +    left + right
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    // ANCHOR: here
    +    #[test]
    +    fn it_works() -> Result<(), String> {
    +        let result = add(2, 2);
    +
    +        if result == 4 {
    +            Ok(())
    +        } else {
    +            Err(String::from("two plus two does not equal four"))
    +        }
    +    }
    +    // ANCHOR_END: here
    +}
    +

    现在 it_works 函数的返回值类型为 Result<(), String>。在函数体中,不同于调用 assert_eq! 宏,而是在测试通过时返回 Ok(()),在测试失败时返回带有 StringErr

    +

    这样编写测试来返回 Result<T, E> 就可以在函数体中使用问号运算符,如此可以方便的编写任何运算符会返回 Err 成员的测试。

    +

    不能对这些使用 Result<T, E> 的测试使用 #[should_panic] 注解。为了断言一个操作返回 Err 成员,不要使用对 Result<T, E> 值使用问号表达式(?)。而是使用 assert!(value.is_err())

    +

    现在你知道了几种编写测试的方法,让我们看看运行测试时会发生什么,以及可以用于 cargo test 的不同选项。

    +

    控制测试如何运行

    +
    +

    ch11-02-running-tests.md +
    +commit 34314c10f699cc882d4e0b06f2a24bd37a5435f2

    +
    +

    就像 cargo run 会编译代码并运行生成的二进制文件一样,cargo test 在测试模式下编译代码并运行生成的测试二进制文件。cargo test 产生的二进制文件的默认行为是并发运行所有的测试,并截获测试运行过程中产生的输出,阻止它们被显示出来,使得阅读测试结果相关的内容变得更容易。不过可以指定命令行参数来改变 cargo test 的默认行为。

    +

    可以将一部分命令行参数传递给 cargo test,而将另外一部分传递给生成的测试二进制文件。为了分隔这两种参数,需要先列出传递给 cargo test 的参数,接着是分隔符 --,再之后是传递给测试二进制文件的参数。运行 cargo test --help 会提示 cargo test 的有关参数,而运行 cargo test -- --help 可以提示在分隔符之后使用的有关参数。

    +

    并行或连续的运行测试

    +

    当运行多个测试时,Rust 默认使用线程来并行运行。这意味着测试会更快地运行完毕,所以你可以更快的得到代码能否工作的反馈。因为测试是在同时运行的,你应该确保测试不能相互依赖,或依赖任何共享的状态,包括依赖共享的环境,比如当前工作目录或者环境变量。

    +

    举个例子,每一个测试都运行一些代码,假设这些代码都在硬盘上创建一个 test-output.txt 文件并写入一些数据。接着每一个测试都读取文件中的数据并断言这个文件包含特定的值,而这个值在每个测试中都是不同的。因为所有测试都是同时运行的,一个测试可能会在另一个测试读写文件过程中修改了文件。那么第二个测试就会失败,并不是因为代码不正确,而是因为测试并行运行时相互干扰。一个解决方案是使每一个测试读写不同的文件;另一个解决方案是一次运行一个测试。

    +

    如果你不希望测试并行运行,或者想要更加精确的控制线程的数量,可以传递 --test-threads 参数和希望使用线程的数量给测试二进制文件。例如:

    +
    $ cargo test -- --test-threads=1
    +
    +

    这里将测试线程设置为 1,告诉程序不要使用任何并行机制。这也会比并行运行花费更多时间,不过在有共享的状态时,测试就不会潜在的相互干扰了。

    +

    显示函数输出

    +

    默认情况下,当测试通过时,Rust 的测试库会截获打印到标准输出的所有内容。比如在测试中调用了 println! 而测试通过了,我们将不会在终端看到 println! 的输出:只会看到说明测试通过的提示行。如果测试失败了,则会看到所有标准输出和其他错误信息。

    +

    例如,示例 11-10 有一个无意义的函数,它打印出其参数的值并接着返回 10。接着还有一个会通过的测试和一个会失败的测试:

    +

    文件名:src/lib.rs

    +
    fn prints_and_returns_10(a: i32) -> i32 {
    +    println!("I got the value {a}");
    +    10
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn this_test_will_pass() {
    +        let value = prints_and_returns_10(4);
    +        assert_eq!(value, 10);
    +    }
    +
    +    #[test]
    +    fn this_test_will_fail() {
    +        let value = prints_and_returns_10(8);
    +        assert_eq!(value, 5);
    +    }
    +}
    +

    示例 11-10:一个调用了 println! 的函数的测试

    +

    运行 cargo test 将会看到这些测试的输出:

    +
    $ cargo test
    +   Compiling silly-function v0.1.0 (file:///projects/silly-function)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s
    +     Running unittests src/lib.rs (target/debug/deps/silly_function-160869f38cff9166)
    +
    +running 2 tests
    +test tests::this_test_will_fail ... FAILED
    +test tests::this_test_will_pass ... ok
    +
    +failures:
    +
    +---- tests::this_test_will_fail stdout ----
    +I got the value 8
    +thread 'tests::this_test_will_fail' panicked at src/lib.rs:19:9:
    +assertion `left == right` failed
    +  left: 10
    + right: 5
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +
    +failures:
    +    tests::this_test_will_fail
    +
    +test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +error: test failed, to rerun pass `--lib`
    +
    +

    注意输出中不会出现测试通过时打印的内容,即 I got the value 4。因为当测试通过时,这些输出会被截获。失败测试的输出 I got the value 8 ,则出现在输出的测试摘要部分,同时也显示了测试失败的原因。

    +

    如果你希望也能看到通过的测试中打印的值,也可以在结尾加上 --show-output 告诉 Rust 显示成功测试的输出。

    +
    $ cargo test -- --show-output
    +
    +

    使用 --show-output 参数再次运行示例 11-10 中的测试会显示如下输出:

    +
    $ cargo test -- --show-output
    +   Compiling silly-function v0.1.0 (file:///projects/silly-function)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.60s
    +     Running unittests src/lib.rs (target/debug/deps/silly_function-160869f38cff9166)
    +
    +running 2 tests
    +test tests::this_test_will_fail ... FAILED
    +test tests::this_test_will_pass ... ok
    +
    +successes:
    +
    +---- tests::this_test_will_pass stdout ----
    +I got the value 4
    +
    +
    +successes:
    +    tests::this_test_will_pass
    +
    +failures:
    +
    +---- tests::this_test_will_fail stdout ----
    +I got the value 8
    +thread 'tests::this_test_will_fail' panicked at src/lib.rs:19:9:
    +assertion `left == right` failed
    +  left: 10
    + right: 5
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +
    +failures:
    +    tests::this_test_will_fail
    +
    +test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +error: test failed, to rerun pass `--lib`
    +
    +

    通过指定名字来运行部分测试

    +

    有时运行整个测试集会耗费很长时间。如果你负责特定位置的代码,你可能会希望只运行与这些代码相关的测试。你可以向 cargo test 传递所希望运行的测试名称的参数来选择运行哪些测试。

    +

    为了展示如何运行部分测试,示例 11-11 为 add_two 函数创建了三个测试,我们可以选择具体运行哪一个:

    +

    文件名:src/lib.rs

    +
    pub fn add_two(a: usize) -> usize {
    +    a + 2
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn add_two_and_two() {
    +        let result = add_two(2);
    +        assert_eq!(result, 4);
    +    }
    +
    +    #[test]
    +    fn add_three_and_two() {
    +        let result = add_two(3);
    +        assert_eq!(result, 5);
    +    }
    +
    +    #[test]
    +    fn one_hundred() {
    +        let result = add_two(100);
    +        assert_eq!(result, 102);
    +    }
    +}
    +

    示例 11-11:不同名称的三个测试

    +

    如果没有传递任何参数就运行测试,如你所见,所有测试都会并行运行:

    +
    $ cargo test
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.62s
    +     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
    +
    +running 3 tests
    +test tests::add_three_and_two ... ok
    +test tests::add_two_and_two ... ok
    +test tests::one_hundred ... ok
    +
    +test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests adder
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    运行单个测试

    +

    可以向 cargo test 传递任意测试的名称来只运行这个测试:

    +
    $ cargo test one_hundred
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.69s
    +     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
    +
    +running 1 test
    +test tests::one_hundred ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s
    +
    +
    +

    只有名称为 one_hundred 的测试被运行了;因为其余两个测试并不匹配这个名称。测试输出在摘要行的结尾显示了 2 filtered out 表明还存在比本次所运行的测试更多的测试没有被运行。

    +

    不能像这样指定多个测试名称;只有传递给 cargo test 的第一个值才会被使用。不过有运行多个测试的方法。

    +

    过滤运行多个测试

    +

    我们可以指定部分测试的名称,任何名称匹配这个名称的测试会被运行。例如,因为头两个测试的名称包含 add,可以通过 cargo test add 来运行这两个测试:

    +
    $ cargo test add
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.61s
    +     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
    +
    +running 2 tests
    +test tests::add_three_and_two ... ok
    +test tests::add_two_and_two ... ok
    +
    +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s
    +
    +
    +

    这运行了所有名字中带有 add 的测试,也过滤掉了名为 one_hundred 的测试。同时注意测试所在的模块也是测试名称的一部分,所以可以通过模块名来运行一个模块中的所有测试。

    +

    除非特别指定否则忽略某些测试

    +

    有时一些特定的测试执行起来是非常耗费时间的,所以在大多数运行 cargo test 的时候希望能排除它们。虽然可以通过参数列举出所有希望运行的测试来做到,也可以使用 ignore 属性来标记耗时的测试并排除它们,如下所示:

    +

    文件名:src/lib.rs

    +
    pub fn add(left: usize, right: usize) -> usize {
    +    left + right
    +}
    +
    +// ANCHOR: here
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn it_works() {
    +        let result = add(2, 2);
    +        assert_eq!(result, 4);
    +    }
    +
    +    #[test]
    +    #[ignore]
    +    fn expensive_test() {
    +        // 需要运行一个小时的代码
    +    }
    +}
    +// ANCHOR_END: here
    +

    对于想要排除的测试,我们在 #[test] 之后增加了 #[ignore] 行。现在如果运行测试,就会发现 it_works 运行了,而 expensive_test 没有运行:

    +
    $ cargo test
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.60s
    +     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
    +
    +running 2 tests
    +test tests::expensive_test ... ignored
    +test tests::it_works ... ok
    +
    +test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests adder
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    expensive_test 被列为 ignored,如果我们只希望运行被忽略的测试,可以使用 cargo test -- --ignored

    +
    $ cargo test -- --ignored
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.61s
    +     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
    +
    +running 1 test
    +test expensive_test ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s
    +
    +   Doc-tests adder
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    通过控制运行哪些测试,你可以确保能够快速地运行 cargo test 。当你需要运行 ignored 的测试时,可以执行 cargo test -- --ignored。如果你希望不管是否忽略都要运行全部测试,可以运行 cargo test -- --include-ignored

    +

    测试的组织结构

    +
    +

    ch11-03-test-organization.md +
    +commit 654d8902d380dbb8dd94ed2e548dfc0aa80c07cb

    +
    +

    本章一开始就提到,测试是一个复杂的概念,而且不同的开发者也采用不同的技术和组织。Rust 社区倾向于根据测试的两个主要分类来考虑问题:单元测试unit tests)与 集成测试integration tests)。单元测试倾向于更小而更集中,在隔离的环境中一次测试一个模块,或者是测试私有接口。而集成测试对于你的库来说则完全是外部的。它们与其他外部代码一样,通过相同的方式使用你的代码,只测试公有接口而且每个测试都有可能会测试多个模块。

    +

    为了保证你的库能够按照你的预期运行,从独立和整体的角度编写这两类测试都是非常重要的。

    +

    单元测试

    +

    单元测试的目的是在与其他部分隔离的环境中测试每一个单元的代码,以便于快速而准确地验证某个单元的代码功能是否符合预期。单元测试与它们要测试的代码共同存放在位于 src 目录下相同的文件中。规范是在每个文件中创建包含测试函数的 tests 模块,并使用 cfg(test) 标注模块。

    +

    测试模块和 #[cfg(test)]

    +

    测试模块的 #[cfg(test)] 注解告诉 Rust 只在执行 cargo test 时才编译和运行测试代码,而在运行 cargo build 时不这么做。这在只希望构建库的时候可以节省编译时间,并且因为它们并没有包含测试,所以能减少编译产生的文件的大小。与之对应的集成测试因为位于另一个文件夹,所以它们并不需要 #[cfg(test)] 注解。然而单元测试位于与源码相同的文件中,所以你需要使用 #[cfg(test)] 来指定它们不应该被包含进编译结果中。

    +

    回忆本章第一部分新建的 adder 项目,Cargo 为我们生成了如下代码:

    +

    文件名:src/lib.rs

    +
    pub fn add(left: usize, right: usize) -> usize {
    +    left + right
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn it_works() {
    +        let result = add(2, 2);
    +        assert_eq!(result, 4);
    +    }
    +}
    +

    上述代码就是自动生成的测试模块。cfg 属性代表配置configuration) ,它告诉 Rust,接下来的项,只有在给定特定配置选项时,才会被包含。在这种情况下,配置选项是 test,即 Rust 所提供的用于编译和运行测试的配置选项。通过使用 cfg 属性,Cargo 只会在我们主动使用 cargo test 运行测试时才编译测试代码。这包括测试模块中可能存在的帮助函数,以及标注为 #[test] 的函数。

    +

    测试私有函数

    +

    测试社区中一直存在关于是否应该对私有函数直接进行测试的论战,而在其他语言中想要测试私有函数是一件困难的,甚至是不可能的事。不过无论你坚持哪种测试意识形态,Rust 的私有性规则确实允许你测试私有函数。考虑示例 11-12 中带有私有函数 internal_adder 的代码:

    +

    文件名:src/lib.rs

    +
    pub fn add_two(a: usize) -> usize {
    +    internal_adder(a, 2)
    +}
    +
    +fn internal_adder(left: usize, right: usize) -> usize {
    +    left + right
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn internal() {
    +        let result = internal_adder(2, 2);
    +        assert_eq!(result, 4);
    +    }
    +}
    +

    示例 11-12:测试私有函数

    +

    注意 internal_adder 函数并没有标记为 pub。测试也不过是 Rust 代码,同时 tests 也仅仅是另一个模块。正如 “路径用于引用模块树中的项” 部分所说,子模块的项可以使用其上级模块的项。在测试中,我们通过 use super::*test 模块的父模块的所有项引入了作用域,接着测试调用了 internal_adder。如果你并不认为应该测试私有函数,Rust 也不会强迫你这么做。

    +

    集成测试

    +

    在 Rust 中,集成测试对于你需要测试的库来说完全是外部的。同其他使用库的代码一样使用库文件,也就是说它们只能调用一部分库中的公有 API。集成测试的目的是测试库的多个部分能否一起正常工作。一些单独能正确运行的代码单元集成在一起也可能会出现问题,所以集成测试的覆盖率也是很重要的。为了创建集成测试,你需要先创建一个 tests 目录。

    +

    tests 目录

    +

    为了编写集成测试,需要在项目根目录创建一个 tests 目录,与 src 同级。Cargo 知道如何去寻找这个目录中的集成测试文件。接着可以随意在这个目录中创建任意多的测试文件,Cargo 会将每一个文件当作单独的 crate 来编译。

    +

    让我们来创建一个集成测试。保留示例 11-12 中 src/lib.rs 的代码。创建一个 tests 目录,新建一个文件 tests/integration_test.rs。目录结构应该看起来像这样:

    +
    adder
    +├── Cargo.lock
    +├── Cargo.toml
    +├── src
    +│   └── lib.rs
    +└── tests
    +    └── integration_test.rs
    +
    +

    将示例 11-13 中的代码输入到 tests/integration_test.rs 文件中。

    +

    文件名:tests/integration_test.rs

    +
    use adder::add_two;
    +
    +#[test]
    +fn it_adds_two() {
    +    let result = add_two(2);
    +    assert_eq!(result, 4);
    +}
    +

    示例 11-13:一个 adder crate 中函数的集成测试

    +

    因为每一个 tests 目录中的测试文件都是完全独立的 crate,所以需要在每一个文件中导入库。为此与单元测试不同,我们需要在文件顶部添加 use adder

    +

    并不需要将 tests/integration_test.rs 中的任何代码标注为 #[cfg(test)]tests 文件夹在 Cargo 中是一个特殊的文件夹,Cargo 只会在运行 cargo test 时编译这个目录中的文件。现在就运行 cargo test 试试:

    +
    $ cargo test
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.31s
    +     Running unittests src/lib.rs (target/debug/deps/adder-1082c4b063a8fbe6)
    +
    +running 1 test
    +test tests::internal ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +     Running tests/integration_test.rs (target/debug/deps/integration_test-1082c4b063a8fbe6)
    +
    +running 1 test
    +test it_adds_two ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests adder
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    现在有了三个部分的输出:单元测试、集成测试和文档测试。注意如果一个部分的任何测试失败,之后的部分都不会运行。例如如果一个单元测试失败,则不会有任何集成测试和文档测试的输出,因为这些测试只会在所有单元测试都通过后才会执行。

    +

    第一部分单元测试与我们之前见过的一样:每个单元测试一行(示例 11-12 中有一个叫做 internal 的测试),接着是一个单元测试的摘要行。

    +

    集成测试部分以行 Running tests/integration_test.rs开头。接下来每一行是一个集成测试中的测试函数,以及一个位于 Doc-tests adder 部分之前的集成测试的摘要行。

    +

    每一个集成测试文件有对应的测试结果部分,所以如果在 tests 目录中增加更多文件,测试结果中就会有更多集成测试结果部分。

    +

    我们仍然可以通过指定测试函数的名称作为 cargo test 的参数来运行特定集成测试。也可以使用 cargo test--test 后跟文件的名称来运行某个特定集成测试文件中的所有测试:

    +
    $ cargo test --test integration_test
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.64s
    +     Running tests/integration_test.rs (target/debug/deps/integration_test-82e7799c1bc62298)
    +
    +running 1 test
    +test it_adds_two ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    这个命令只运行了 tests 目录中我们指定的文件 integration_test.rs 中的测试。

    +

    集成测试中的子模块

    +

    随着集成测试的增加,你可能希望在 tests 目录创建更多文件以便更好地组织它们,例如根据测试的功能来将测试分组。如前所述,tests 目录中的每一个文件都被编译成一个单独的 crate,这有助于创建独立的作用域,以便更接近于最终用户使用你的 crate 的方式。但这意味着,tests 目录中的文件的行为,和你在第七章中学习如何将代码分为模块和文件时,学到的 src 中的文件的行为不一样。

    +

    当你有一些在多个集成测试文件都会用到的帮助函数,而你尝试按照第七章 “将模块移动到其他文件” 部分的步骤将它们提取到一个通用的模块中时, tests 目录中文件行为的不同就会凸显出来。例如,如果我们可以创建 一个tests/common.rs 文件并创建一个名叫 setup 的函数,我们希望这个函数能被多个测试文件的测试函数调用:

    +

    文件名:tests/common.rs

    +
    pub fn setup() {
    +    // setup code specific to your library's tests would go here
    +}
    +

    如果再次运行测试,将会在测试结果中看到一个新的对应 common.rs 文件的测试结果部分,即便这个文件并没有包含任何测试函数,也没有任何地方调用了 setup 函数:

    +
    $ cargo test
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.89s
    +     Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
    +
    +running 1 test
    +test tests::internal ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +     Running tests/common.rs (target/debug/deps/common-92948b65e88960b4)
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +     Running tests/integration_test.rs (target/debug/deps/integration_test-92948b65e88960b4)
    +
    +running 1 test
    +test it_adds_two ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests adder
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    我们并不想要common 出现在测试结果中显示 running 0 tests 。我们只是希望其能被其他多个集成测试文件中调用罢了。

    +

    为了不让 common 出现在测试输出中,我们将创建 tests/common/mod.rs ,而不是创建 tests/common.rs 。现在项目目录结构看起来像这样:

    +
    ├── Cargo.lock
    +├── Cargo.toml
    +├── src
    +│   └── lib.rs
    +└── tests
    +    ├── common
    +    │   └── mod.rs
    +    └── integration_test.rs
    +
    +

    这是一种老的命名规范,正如第七章 “另一种文件路径” 中提到的 Rust 仍然理解它们。这样命名告诉 Rust 不要将 common 看作一个集成测试文件。将 setup 函数代码移动到 tests/common/mod.rs 并删除 tests/common.rs 文件之后,测试输出中将不会出现这一部分。tests 目录中的子目录不会被作为单独的 crate 编译或作为一个测试结果部分出现在测试输出中。

    +

    一旦拥有了 tests/common/mod.rs,就可以将其作为模块以便在任何集成测试文件中使用。这里是一个 tests/integration_test.rs 中调用 setup 函数的 it_adds_two 测试的例子:

    +

    文件名:tests/integration_test.rs

    +
    use adder::add_two;
    +
    +mod common;
    +
    +#[test]
    +fn it_adds_two() {
    +    common::setup();
    +
    +    let result = add_two(2);
    +    assert_eq!(result, 4);
    +}
    +

    注意 mod common; 声明与示例 7-21 中展示的模块声明相同。接着在测试函数中就可以调用 common::setup() 了。

    +

    二进制 crate 的集成测试

    +

    如果项目是二进制 crate 并且只包含 src/main.rs 而没有 src/lib.rs,这样就不可能在 tests 目录创建集成测试并使用 extern crate 导入 src/main.rs 中定义的函数。只有库 crate 才会向其他 crate 暴露了可供调用和使用的函数;二进制 crate 只意在单独运行。

    +

    这就是许多 Rust 二进制项目使用一个简单的 src/main.rs 调用 src/lib.rs 中的逻辑的原因之一。因为通过这种结构,集成测试 就可以 通过 extern crate 测试库 crate 中的主要功能了,而如果这些重要的功能没有问题的话,src/main.rs 中的少量代码也就会正常工作且不需要测试。

    +

    总结

    +

    Rust 的测试功能提供了一个确保即使你改变了函数的实现方式,也能继续以期望的方式运行的途径。单元测试独立地验证库的不同部分,也能够测试私有函数实现细节。集成测试则检查多个部分是否能结合起来正确地工作,并像其他外部代码那样测试库的公有 API。即使 Rust 的类型系统和所有权规则可以帮助避免一些 bug,不过测试对于减少代码中不符合期望行为的逻辑 bug 仍然是很重要的。

    +

    让我们将本章和其他之前章节所学的知识组合起来,在下一章一起编写一个项目!

    +

    一个 I/O 项目:构建一个命令行程序

    +
    +

    ch12-00-an-io-project.md +
    +commit 02a168ed346042f07010f8b65b4eeed623dd31d1

    +
    +

    本章既是一个目前所学的很多技能的概括,也是一个更多标准库功能的探索。我们将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 技能。

    +

    Rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择,所以我们的项目将创建一个我们自己版本的经典命令行搜索工具:grep。grep 是 “Globally search a Regular Expression and Print.” 的首字母缩写。grep 最简单的使用场景是在特定文件中搜索指定字符串。为此,grep 获取一个文件路径和一个字符串作为参数,接着读取文件并找到其中包含字符串参数的行,然后打印出这些行。

    +

    在这个过程中,我们会展示如何让我们的命令行工具利用很多命令行工具中用到的终端功能。读取环境变量来使得用户可以配置工具的行为。打印到标准错误控制流(stderr)而不是标准输出(stdout),例如这样用户可以选择将成功输出重定向到文件中的同时仍然在屏幕上显示错误信息。

    +

    一位 Rust 社区的成员,Andrew Gallant,已经创建了一个功能完整且非常快速的 grep 版本,叫做 ripgrep。相比之下,我们的版本将非常简单,本章将教会你一些帮助理解像 ripgrep 这样真实项目的背景知识。

    +

    我们的 grep 项目将会结合之前所学的一些内容:

    + +

    另外还会简要的讲到闭包、迭代器和 trait 对象,它们分别会在 第十三章第十八章 中详细介绍。

    +

    接受命令行参数

    +
    +

    ch12-01-accepting-command-line-arguments.md +
    +commit 02a168ed346042f07010f8b65b4eeed623dd31d1

    +
    +

    一如既往使用 cargo new 新建一个项目,我们称之为 minigrep 以便与可能已经安装在系统上的 grep 工具相区别:

    +
    $ cargo new minigrep
    +     Created binary (application) `minigrep` project
    +$ cd minigrep
    +
    +

    第一个任务是让 minigrep 能够接受两个命令行参数:文件路径和要搜索的字符串。也就是说我们希望能够使用 cargo run、要搜索的字符串和被搜索的文件的路径来运行程序,像这样:

    +
    $ cargo run -- searchstring example-filename.txt
    +
    +

    现在 cargo new 生成的程序忽略任何传递给它的参数。Crates.io 上有一些现成的库可以帮助我们接受命令行参数,不过我们正在学习这些内容,让我们自己来实现一个。

    +

    读取参数值

    +

    为了确保 minigrep 能够获取传递给它的命令行参数的值,我们需要一个 Rust 标准库提供的函数 std::env::args。这个函数返回一个传递给程序的命令行参数的 迭代器iterator)。我们会在 第十三章 全面的介绍它们。但是现在只需理解迭代器的两个细节:迭代器生成一系列的值,可以在迭代器上调用 collect 方法将其转换为一个集合,比如包含所有迭代器产生元素的 vector。

    +

    示例 12-1 中允许 minigrep 程序读取任何传递给它的命令行参数并将其收集到一个 vector 中。

    +

    文件名:src/main.rs

    +
    use std::env;
    +
    +fn main() {
    +    let args: Vec<String> = env::args().collect();
    +    dbg!(args);
    +}
    +

    示例 12-1:将命令行参数收集到一个 vector 中并打印出来

    +

    首先使用 use 语句来将 std::env 模块引入作用域以便可以使用它的 args 函数。注意 std::env::args 函数被嵌套进了两层模块中。正如 第七章 讲到的,当所需函数嵌套了多于一层模块时,通常将父模块引入作用域,而不是其自身。这便于我们利用 std::env 中的其他函数。这比增加了 use std::env::args; 后仅仅使用 args 调用函数要更明确一些,因为 args 容易被错认成一个定义于当前模块的函数。

    +
    +

    args 函数和无效的 Unicode

    +

    注意 std::env::args 在其任何参数包含无效 Unicode 字符时会 panic。如果你需要接受包含无效 Unicode 字符的参数,使用 std::env::args_os 代替。这个函数返回 OsString 值而不是 String 值。这里出于简单考虑使用了 std::env::args,因为 OsString 值每个平台都不一样而且比 String 值处理起来更为复杂。

    +
    +

    main 函数的第一行,我们调用了 env::args,并立即使用 collect 来创建了一个包含迭代器所有值的 vector。collect 可以被用来创建很多类型的集合,所以这里显式注明 args 的类型来指定我们需要一个字符串 vector。虽然在 Rust 中我们很少会需要注明类型,然而 collect 是一个经常需要注明类型的函数,因为 Rust 不能推断出你想要什么类型的集合。

    +

    最后,我们使用调试宏打印出 vector。让我们尝试分别用两种方式(不包含参数和包含参数)运行代码:

    +
    $ cargo run
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.61s
    +     Running `target/debug/minigrep`
    +[src/main.rs:5:5] args = [
    +    "target/debug/minigrep",
    +]
    +
    +
    $ cargo run -- needle haystack
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.57s
    +     Running `target/debug/minigrep needle haystack`
    +[src/main.rs:5:5] args = [
    +    "target/debug/minigrep",
    +    "needle",
    +    "haystack",
    +]
    +
    +

    注意 vector 的第一个值是 "target/debug/minigrep",它是我们二进制文件的名称。这与 C 中的参数列表的行为相匹配,让程序使用在执行时调用它们的名称。如果要在消息中打印它或者根据用于调用程序的命令行别名更改程序的行为,通常可以方便地访问程序名称,不过考虑到本章的目的,我们将忽略它并只保存所需的两个参数。

    +

    将参数值保存进变量

    +

    目前程序可以访问指定为命令行参数的值。现在需要将这两个参数的值保存进变量这样就可以在程序的余下部分使用这些值了。让我们如示例 12-2 这样做:

    +

    文件名:src/main.rs

    +
    use std::env;
    +
    +fn main() {
    +    let args: Vec<String> = env::args().collect();
    +
    +    let query = &args[1];
    +    let file_path = &args[2];
    +
    +    println!("Searching for {query}");
    +    println!("In file {file_path}");
    +}
    +

    示例 12-2:创建变量来存放查询参数和文件路径参数

    +

    正如之前打印出 vector 时所所看到的,程序的名称占据了 vector 的第一个值 args[0],所以我们从索引为 1 的参数开始。minigrep 获取的第一个参数是需要搜索的字符串,所以将其将第一个参数的引用存放在变量 query 中。第二个参数将是文件路径,所以将第二个参数的引用放入变量 file_path 中。

    +

    我们将临时打印出这些变量的值来证明代码如我们期望的那样工作。使用参数 testsample.txt 再次运行这个程序:

    +
    $ cargo run -- test sample.txt
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
    +     Running `target/debug/minigrep test sample.txt`
    +Searching for test
    +In file sample.txt
    +
    +

    好的,它可以工作!我们将所需的参数值保存进了对应的变量中。之后会增加一些错误处理来应对类似用户没有提供参数的情况,不过现在我们将忽略它们并开始增加读取文件功能。

    +

    读取文件

    +
    +

    ch12-02-reading-a-file.md +
    +commit 02a168ed346042f07010f8b65b4eeed623dd31d1

    +
    +

    现在我们要增加读取由 file_path 命令行参数指定的文件的功能。首先,需要一个用来测试的示例文件:我们会用一个拥有多行少量文本且有一些重复单词的文件。示例 12-3 是一首艾米莉·狄金森(Emily Dickinson)的诗,它正适合这个工作!在项目根目录创建一个文件 poem.txt,并输入诗 "I'm nobody! Who are you?":

    +

    文件名:poem.txt

    +
    I'm nobody! Who are you?
    +Are you nobody, too?
    +Then there's a pair of us - don't tell!
    +They'd banish us, you know.
    +
    +How dreary to be somebody!
    +How public, like a frog
    +To tell your name the livelong day
    +To an admiring bog!
    +
    +

    示例 12-3:艾米莉·狄金森的诗 “I’m nobody! Who are you?”,一个好的测试用例

    +

    创建完这个文件之后,修改 src/main.rs 并增加如示例 12-4 所示的打开文件的代码:

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::fs;
    +
    +fn main() {
    +    // --snip--
    +    let args: Vec<String> = env::args().collect();
    +
    +    let query = &args[1];
    +    let file_path = &args[2];
    +
    +    println!("Searching for {query}");
    +    println!("In file {file_path}");
    +
    +    let contents = fs::read_to_string(file_path)
    +        .expect("Should have been able to read the file");
    +
    +    println!("With text:\n{contents}");
    +}
    +

    示例 12-4:读取第二个参数所指定的文件内容

    +

    首先,我们增加了一个 use 语句来引入标准库中的相关部分:我们需要 std::fs 来处理文件。

    +

    main 中新增了一行语句:fs::read_to_string 接受 file_path,打开文件,接着返回包含其内容的 std::io::Result<String>

    +

    在这些代码之后,我们再次增加了临时的 println! 打印出读取文件之后 contents 的值,这样就可以检查目前为止的程序能否工作。

    +

    尝试运行这些代码,随意指定一个字符串作为第一个命令行参数(因为还未实现搜索功能的部分)而将 poem.txt 文件将作为第二个参数:

    +
    $ cargo run -- the poem.txt
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
    +     Running `target/debug/minigrep the poem.txt`
    +Searching for the
    +In file poem.txt
    +With text:
    +I'm nobody! Who are you?
    +Are you nobody, too?
    +Then there's a pair of us - don't tell!
    +They'd banish us, you know.
    +
    +How dreary to be somebody!
    +How public, like a frog
    +To tell your name the livelong day
    +To an admiring bog!
    +
    +
    +

    好的!代码读取并打印出了文件的内容。虽然它还有一些瑕疵:此时 main 函数有着多个职能,通常函数只负责一个功能的话会更简洁并易于维护。另一个问题是没有尽可能的处理错误。虽然我们的程序还很小,这些瑕疵并不是什么大问题,不过随着程序功能的丰富,将会越来越难以用简单的方法修复它们。在开发程序时,及早开始重构是一个最佳实践,因为重构少量代码时要容易的多,所以让我们现在就开始吧。

    +

    重构改进模块性和错误处理

    +
    +

    ch12-03-improving-error-handling-and-modularity.md +
    +commit 83788ff212a3281328e2f8f223ce9e0f69220b97

    +
    +

    为了改善我们的程序这里有四个问题需要修复,而且它们都与程序的组织方式和如何处理潜在错误有关。第一,main 现在进行了两个任务:它解析了参数并打开了文件。对于一个这样的小函数,这并不是一个大问题。然而如果 main 中的功能持续增加,main 函数处理的独立任务也会增加。当函数承担了更多责任,它就更难以推导,更难以测试,并且更难以在不破坏其他部分的情况下做出修改。最好能分离出功能以便每个函数就负责一个任务。

    +

    这同时也关系到第二个问题:queryfile_path 是程序中的配置变量,而像 contents 则用来执行程序逻辑。随着 main 函数的增长,就需要引入更多的变量到作用域中,而当作用域中有更多的变量时,将更难以追踪每个变量的目的。最好能将配置变量组织进一个结构,这样就能使它们的目的更明确了。

    +

    第三个问题是如果打开文件失败我们使用 expect 来打印出错误信息,不过这个错误信息只是说 Should have been able to read the file。读取文件失败的原因有多种:例如文件不存在,或者没有打开此文件的权限。目前,无论处于何种情况,我们只是打印出“文件读取出现错误”的信息,这并没有给予使用者具体的信息!

    +

    第四,我们不停地使用 expect 来处理不同的错误,如果用户没有指定足够的参数来运行程序,他们会从 Rust 得到 index out of bounds 错误,而这并不能明确地解释问题。如果所有的错误处理都位于一处,这样将来的维护者在需要修改错误处理逻辑时就只需要考虑这一处代码。将所有的错误处理都放在一处也有助于确保我们打印的错误信息对终端用户来说是有意义的。

    +

    让我们通过重构项目来解决这些问题。

    +

    二进制项目的关注分离

    +

    main 函数负责多个任务的组织问题在许多二进制项目中很常见。所以 Rust 社区开发出一类在 main 函数开始变得庞大时进行二进制程序的关注分离的指导。这些过程有如下步骤:

    +
      +
    • 将程序拆分成 main.rslib.rs 并将程序的逻辑放入 lib.rs 中。
    • +
    • 当命令行解析逻辑比较小时,可以保留在 main.rs 中。
    • +
    • 当命令行解析开始变得复杂时,也同样将其从 main.rs 提取到 lib.rs 中。
    • +
    +

    经过这些过程之后保留在 main 函数中的责任应该被限制为:

    +
      +
    • 使用参数值调用命令行解析逻辑
    • +
    • 设置任何其他的配置
    • +
    • 调用 lib.rs 中的 run 函数
    • +
    • 如果 run 返回错误,则处理这个错误
    • +
    +

    这个模式的一切就是为了关注分离:main.rs 处理程序运行,而 lib.rs 处理所有的真正的任务逻辑。因为不能直接测试 main 函数,这个结构通过将所有的程序逻辑移动到 lib.rs 的函数中使得我们可以测试它们。仅仅保留在 main.rs 中的代码将足够小以便阅读就可以验证其正确性。让我们遵循这些步骤来重构程序。

    +

    提取参数解析器

    +

    首先,我们将解析参数的功能提取到一个 main 将会调用的函数中,为将命令行解析逻辑移动到 src/lib.rs 中做准备。示例 12-5 中展示了新 main 函数的开头,它调用了新函数 parse_config。目前它仍将定义在 src/main.rs 中:

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::fs;
    +
    +fn main() {
    +    let args: Vec<String> = env::args().collect();
    +
    +    let (query, file_path) = parse_config(&args);
    +
    +    // --snip--
    +
    +    println!("Searching for {query}");
    +    println!("In file {file_path}");
    +
    +    let contents = fs::read_to_string(file_path)
    +        .expect("Should have been able to read the file");
    +
    +    println!("With text:\n{contents}");
    +}
    +
    +fn parse_config(args: &[String]) -> (&str, &str) {
    +    let query = &args[1];
    +    let file_path = &args[2];
    +
    +    (query, file_path)
    +}
    +

    示例 12-5:从 main 中提取出 parse_config 函数

    +

    我们仍然将命令行参数收集进一个 vector,不过不同于在 main 函数中将索引 1 的参数值赋值给变量 query 和将索引 2 的值赋值给变量 file_path,我们将整个 vector 传递给 parse_config 函数。接着 parse_config 函数将包含决定哪个参数该放入哪个变量的逻辑,并将这些值返回到 main。仍然在 main 中创建变量 queryfile_path,不过 main 不再负责处理命令行参数与变量如何对应。

    +

    这对重构我们这小程序可能有点大材小用,不过我们将采用小的、增量的步骤进行重构。在做出这些改变之后,再次运行程序并验证参数解析是否仍然正常。经常验证你的进展是一个好习惯,这样在遇到问题时能帮助你定位问题的成因。

    +

    组合配置值

    +

    我们可以采取另一个小的步骤来进一步改善这个函数。现在函数返回一个元组,不过立刻又将元组拆成了独立的部分。这是一个我们可能没有进行正确抽象的信号。

    +

    另一个表明还有改进空间的迹象是 parse_config 名称的 config 部分,它暗示了我们返回的两个值是相关的并都是一个配置值的一部分。目前除了将这两个值组合进元组之外并没有表达这个数据结构的意义:我们可以将这两个值放入一个结构体并给每个字段一个有意义的名字。这会让未来的维护者更容易理解不同的值如何相互关联以及它们的目的。

    +
    +

    注意:一些同学将这种在复杂类型更为合适的场景下使用基本类型的反模式称为 基本类型偏执primitive obsession)。

    +
    +

    示例 12-6 展示了 parse_config 函数的改进。

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::fs;
    +
    +fn main() {
    +    let args: Vec<String> = env::args().collect();
    +
    +    let config = parse_config(&args);
    +
    +    println!("Searching for {}", config.query);
    +    println!("In file {}", config.file_path);
    +
    +    let contents = fs::read_to_string(config.file_path)
    +        .expect("Should have been able to read the file");
    +
    +    // --snip--
    +
    +    println!("With text:\n{contents}");
    +}
    +
    +struct Config {
    +    query: String,
    +    file_path: String,
    +}
    +
    +fn parse_config(args: &[String]) -> Config {
    +    let query = args[1].clone();
    +    let file_path = args[2].clone();
    +
    +    Config { query, file_path }
    +}
    +

    示例 12-6:重构 parse_config 返回一个 Config 结构体实例

    +

    新定义的结构体 Config 中包含字段 queryfile_path。 +parse_config 的签名表明它现在返回一个 Config 值。在之前的 parse_config 函数体中,我们返回了引用 argsString 值的字符串 slice,现在我们定义 Config 来包含拥有所有权的 String 值。main 中的 args 变量是参数值的所有者并只允许 parse_config 函数借用它们,这意味着如果 Config 尝试获取 args 中值的所有权将违反 Rust 的借用规则。

    +

    还有许多不同的方式可以处理 String 的数据,而最简单但有些不太高效的方式是调用这些值的 clone 方法。这会生成 Config 实例可以拥有的数据的完整拷贝,不过会比储存字符串数据的引用消耗更多的时间和内存。不过拷贝数据使得代码显得更加直白因为无需管理引用的生命周期,所以在这种情况下牺牲一小部分性能来换取简洁性的取舍是值得的。

    +
    +

    使用 clone 的权衡取舍

    +

    由于其运行时消耗,许多 Rustacean 之间有一个趋势是倾向于避免使用 clone 来解决所有权问题。在关于迭代器的第十三章中,我们将会学习如何更有效率的处理这种情况,不过现在,复制一些字符串来取得进展是没有问题的,因为只会进行一次这样的拷贝,而且文件路径和要搜索的字符串都比较短。在第一轮编写时拥有一个可以工作但有点低效的程序要比尝试过度优化代码更好一些。随着你对 Rust 更加熟练,将能更轻松的直奔合适的方法,不过现在调用 clone 是完全可以接受的。

    +
    +

    我们更新 mainparse_config 返回的 Config 实例放入变量 config 中,并将之前分别使用 queryfile_path 变量的代码更新为现在的使用 Config 结构体的字段的代码。

    +

    现在代码更明确的表现了我们的意图,queryfile_path 是相关联的并且它们的目的是配置程序如何工作。任何使用这些值的代码就知道在 config 实例中对应目的的字段名中寻找它们。

    +

    创建一个 Config 的构造函数

    +

    目前为止,我们将负责解析命令行参数的逻辑从 main 提取到了 parse_config 函数中,这有助于我们看清值 queryfile_path 是相互关联的并应该在代码中表现这种关系。接着我们增加了 Config 结构体来描述 queryfile_path 的相关性,并能够从 parse_config 函数中将这些值的名称作为结构体字段名称返回。

    +

    所以现在 parse_config 函数的目的是创建一个 Config 实例,我们可以将 parse_config 从一个普通函数变为一个叫做 new 的与结构体关联的函数。做出这个改变使得代码更符合习惯:可以像标准库中的 String 调用 String::new 来创建一个该类型的实例那样,将 parse_config 变为一个与 Config 关联的 new 函数。示例 12-7 展示了需要做出的修改:

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::fs;
    +
    +fn main() {
    +    let args: Vec<String> = env::args().collect();
    +
    +    let config = Config::new(&args);
    +
    +    println!("Searching for {}", config.query);
    +    println!("In file {}", config.file_path);
    +
    +    let contents = fs::read_to_string(config.file_path)
    +        .expect("Should have been able to read the file");
    +
    +    println!("With text:\n{contents}");
    +
    +    // --snip--
    +}
    +
    +// --snip--
    +
    +struct Config {
    +    query: String,
    +    file_path: String,
    +}
    +
    +impl Config {
    +    fn new(args: &[String]) -> Config {
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Config { query, file_path }
    +    }
    +}
    +

    示例 12-7:将 parse_config 变为 Config::new

    +

    这里将 main 中调用 parse_config 的地方更新为调用 Config::new。我们将 parse_config 的名字改为 new 并将其移动到 impl 块中,这使得 new 函数与 Config 相关联。再次尝试编译并确保它可以工作。

    +

    修复错误处理

    +

    现在我们开始修复错误处理。回忆一下之前提到过如果 args vector 包含少于 3 个项并尝试访问 vector 中索引 1 或索引 2 的值会造成程序 panic。尝试不带任何参数运行程序;这将看起来像这样:

    +
    $ cargo run
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
    +     Running `target/debug/minigrep`
    +thread 'main' panicked at src/main.rs:27:21:
    +index out of bounds: the len is 1 but the index is 1
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +

    index out of bounds: the len is 1 but the index is 1 是一个针对程序员的错误信息,然而这并不能真正帮助终端用户理解发生了什么和他们应该做什么。现在就让我们修复它吧。

    +

    改善错误信息

    +

    在示例 12-8 中,在 new 函数中增加了一个检查在访问索引 12 之前检查 slice 是否足够长。如果 slice 不够长,程序会打印一个更好的错误信息并 panic:

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::fs;
    +
    +fn main() {
    +    let args: Vec<String> = env::args().collect();
    +
    +    let config = Config::new(&args);
    +
    +    println!("Searching for {}", config.query);
    +    println!("In file {}", config.file_path);
    +
    +    let contents = fs::read_to_string(config.file_path)
    +        .expect("Should have been able to read the file");
    +
    +    println!("With text:\n{contents}");
    +}
    +
    +struct Config {
    +    query: String,
    +    file_path: String,
    +}
    +
    +impl Config {
    +    // --snip--
    +    fn new(args: &[String]) -> Config {
    +        if args.len() < 3 {
    +            panic!("not enough arguments");
    +        }
    +        // --snip--
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Config { query, file_path }
    +    }
    +}
    +

    示例 12-8:增加一个参数数量检查

    +

    这类似于 示例 9-13 中的 Guess::new 函数,那里如果 value 参数超出了有效值的范围就调用 panic!。不同于检查值的范围,这里检查 args 的长度至少是 3,而函数的剩余部分则可以在假设这个条件成立的基础上运行。如果 args 少于 3 个项,则这个条件将为真,并调用 panic! 立即终止程序。

    +

    有了 new 中这几行额外的代码,再次不带任何参数运行程序并看看现在错误看起来像什么:

    +
    $ cargo run
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
    +     Running `target/debug/minigrep`
    +thread 'main' panicked at src/main.rs:26:13:
    +not enough arguments
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +

    这个输出就好多了,现在有了一个合理的错误信息。然而,还是有一堆额外的信息我们不希望提供给用户。所以在这里使用示例 9-9 中的技术可能不是最好的;正如 第九章 所讲到的一样,panic! 的调用更趋向于程序上的问题而不是使用上的问题。相反我们可以使用第九章学习的另一个技术 —— 返回一个可以表明成功或错误的 Result

    +

    new 中返回 Result 而不是调用 panic!

    +

    我们可以选择返回一个 Result 值,它在成功时会包含一个 Config 的实例,而在错误时会描述问题。我们还将把函数名从new改为build,因为许多程序员希望 new 函数永远不会失败。当 Config::newmain 交流时,可以使用 Result 类型来表明这里存在问题。接着修改 mainErr 成员转换为对用户更友好的错误,而不是 panic! 调用产生的关于 thread 'main'RUST_BACKTRACE 的文本。

    +

    示例 12-9 展示了为了返回 ResultConfig::new 的返回值和函数体中所需的改变。注意这还不能编译,直到下一个示例同时也更新了 main 之后。

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::fs;
    +
    +fn main() {
    +    let args: Vec<String> = env::args().collect();
    +
    +    let config = Config::new(&args);
    +
    +    println!("Searching for {}", config.query);
    +    println!("In file {}", config.file_path);
    +
    +    let contents = fs::read_to_string(config.file_path)
    +        .expect("Should have been able to read the file");
    +
    +    println!("With text:\n{contents}");
    +}
    +
    +struct Config {
    +    query: String,
    +    file_path: String,
    +}
    +
    +impl Config {
    +    fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +

    示例 12-9:从 Config::build 中返回 Result

    +

    现在 build 函数返回一个 Result,在成功时带有一个 Config 实例而在出现错误时带有一个 &'static str。回忆一下第十章 “静态生命周期” 中讲到 &'static str 是字符串字面值的类型,也是目前的错误信息。

    +

    build 函数体中有两处修改:当没有足够参数时不再调用 panic!,而是返回 Err 值。同时我们将 Config 返回值包装进 Ok 成员中。这些修改使得函数符合其新的类型签名。

    +

    通过让 Config::build 返回一个 Err 值,这就允许 main 函数处理 build 函数返回的 Result 值并在出现错误的情况更明确的结束进程。

    +

    调用 Config::build 并处理错误

    +

    为了处理错误情况并打印一个对用户友好的信息,我们需要像示例 12-10 那样更新 main 函数来处理现在 Config::build 返回的 Result。另外还需要手动实现原先由 panic!负责的工作,即以非零错误码退出命令行工具的工作。非零的退出状态是一个惯例信号,用来告诉调用程序的进程:该程序以错误状态退出了。

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::fs;
    +use std::process;
    +
    +fn main() {
    +    let args: Vec<String> = env::args().collect();
    +
    +    let config = Config::build(&args).unwrap_or_else(|err| {
    +        println!("Problem parsing arguments: {err}");
    +        process::exit(1);
    +    });
    +
    +    // --snip--
    +
    +    println!("Searching for {}", config.query);
    +    println!("In file {}", config.file_path);
    +
    +    let contents = fs::read_to_string(config.file_path)
    +        .expect("Should have been able to read the file");
    +
    +    println!("With text:\n{contents}");
    +}
    +
    +struct Config {
    +    query: String,
    +    file_path: String,
    +}
    +
    +impl Config {
    +    fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +

    示例 12-10:如果新建 Config 失败则使用错误码退出

    +

    在上面的示例中,使用了一个之前没有详细说明的方法:unwrap_or_else,它定义于标准库的 Result<T, E> 上。使用 unwrap_or_else 可以进行一些自定义的非 panic! 的错误处理。当 ResultOk 时,这个方法的行为类似于 unwrap:它返回 Ok 内部封装的值。然而,当其值是 Err 时,该方法会调用一个 闭包closure),也就是一个我们定义的作为参数传递给 unwrap_or_else 的匿名函数。第十三章 会更详细的介绍闭包。现在你需要理解的是 unwrap_or_else 会将 Err 的内部值,也就是示例 12-9 中增加的 not enough arguments 静态字符串的情况,传递给闭包中位于两道竖线间的参数 err。闭包中的代码在其运行时可以使用这个 err 值。

    +

    我们新增了一个 use 行来从标准库中导入 process。在错误的情况闭包中将被运行的代码只有两行:我们打印出了 err 值,接着调用了 std::process::exitprocess::exit 会立即停止程序并将传递给它的数字作为退出状态码。这类似于示例 12-8 中使用的基于 panic! 的错误处理,除了不会再得到所有的额外输出了。让我们试试:

    +
    $ cargo run
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s
    +     Running `target/debug/minigrep`
    +Problem parsing arguments: not enough arguments
    +
    +

    非常好!现在输出对于用户来说就友好多了。

    +

    main 提取逻辑

    +

    现在我们完成了配置解析的重构:让我们转向程序的逻辑。正如 “二进制项目的关注分离” 部分所展开的讨论,我们将提取一个叫做 run 的函数来存放目前 main 函数中不属于设置配置或处理错误的所有逻辑。一旦完成这些,main 函数将简明得足以通过观察来验证,而我们将能够为所有其他逻辑编写测试。

    +

    示例 12-11 展示了提取出来的 run 函数。目前我们只进行小的增量式的提取函数的改进。我们仍将在 src/main.rs 中定义这个函数:

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::fs;
    +use std::process;
    +
    +fn main() {
    +    // --snip--
    +
    +    let args: Vec<String> = env::args().collect();
    +
    +    let config = Config::build(&args).unwrap_or_else(|err| {
    +        println!("Problem parsing arguments: {err}");
    +        process::exit(1);
    +    });
    +
    +    println!("Searching for {}", config.query);
    +    println!("In file {}", config.file_path);
    +
    +    run(config);
    +}
    +
    +fn run(config: Config) {
    +    let contents = fs::read_to_string(config.file_path)
    +        .expect("Should have been able to read the file");
    +
    +    println!("With text:\n{contents}");
    +}
    +
    +// --snip--
    +
    +struct Config {
    +    query: String,
    +    file_path: String,
    +}
    +
    +impl Config {
    +    fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +

    示例 12-11:提取 run 函数来包含剩余的程序逻辑

    +

    现在 run 函数包含了 main 中从读取文件开始的剩余的所有逻辑。run 函数获取一个 Config 实例作为参数。

    +

    run 函数中返回错误

    +

    通过将剩余的逻辑分离进 run 函数而不是留在 main 中,就可以像示例 12-9 中的 Config::build 那样改进错误处理。不再通过 expect 允许程序 panic,run 函数将会在出错时返回一个 Result<T, E>。这让我们进一步以一种对用户友好的方式统一 main 中的错误处理。示例 12-12 展示了 run 签名和函数体中的改变:

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::fs;
    +use std::process;
    +use std::error::Error;
    +
    +// --snip--
    +
    +
    +fn main() {
    +    let args: Vec<String> = env::args().collect();
    +
    +    let config = Config::build(&args).unwrap_or_else(|err| {
    +        println!("Problem parsing arguments: {err}");
    +        process::exit(1);
    +    });
    +
    +    println!("Searching for {}", config.query);
    +    println!("In file {}", config.file_path);
    +
    +    run(config);
    +}
    +
    +fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    println!("With text:\n{contents}");
    +
    +    Ok(())
    +}
    +
    +struct Config {
    +    query: String,
    +    file_path: String,
    +}
    +
    +impl Config {
    +    fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +

    示例 12-12:修改 run 函数返回 Result

    +

    这里我们做出了三个明显的修改。首先,将 run 函数的返回类型变为 Result<(), Box<dyn Error>>。之前这个函数返回 unit 类型 (),现在它仍然保持作为 Ok 时的返回值。

    +

    对于错误类型,使用了 trait 对象 Box<dyn Error>(在开头使用了 use 语句将 std::error::Error 引入作用域)。第十八章 会涉及 trait 对象。目前只需知道 Box<dyn Error> 意味着函数会返回实现了 Error trait 的类型,不过无需指定具体将会返回的值的类型。这提供了在不同的错误场景可能有不同类型的错误返回值的灵活性。这也就是 dyn,它是 “动态的”(“dynamic”)的缩写。

    +

    第二个改变是去掉了 expect 调用并替换为 第九章 讲到的 ?。不同于遇到错误就 panic!? 会从函数中返回错误值并让调用者来处理它。

    +

    第三个修改是现在成功时这个函数会返回一个 Ok 值。因为 run 函数签名中声明成功类型返回值是 (),这意味着需要将 unit 类型值包装进 Ok 值中。Ok(()) 一开始看起来有点奇怪,不过这样使用 () 是惯用的做法,表明调用 run 函数只是为了它的副作用;函数并没有返回什么有意义的值。

    +

    上述代码能够编译,不过会有一个警告:

    +
    $ cargo run -- the poem.txt
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +warning: unused `Result` that must be used
    +  --> src/main.rs:19:5
    +   |
    +19 |     run(config);
    +   |     ^^^^^^^^^^^
    +   |
    +   = note: this `Result` may be an `Err` variant, which should be handled
    +   = note: `#[warn(unused_must_use)]` on by default
    +help: use `let _ = ...` to ignore the resulting value
    +   |
    +19 |     let _ = run(config);
    +   |     +++++++
    +
    +warning: `minigrep` (bin "minigrep") generated 1 warning
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.71s
    +     Running `target/debug/minigrep the poem.txt`
    +Searching for the
    +In file poem.txt
    +With text:
    +I'm nobody! Who are you?
    +Are you nobody, too?
    +Then there's a pair of us - don't tell!
    +They'd banish us, you know.
    +
    +How dreary to be somebody!
    +How public, like a frog
    +To tell your name the livelong day
    +To an admiring bog!
    +
    +
    +

    Rust 提示我们的代码忽略了 Result 值,它可能表明这里存在一个错误。但我们却没有检查这里是否有一个错误,而编译器提醒我们这里应该有一些错误处理代码!现在就让我们修正这个问题。

    +

    处理 mainrun 返回的错误

    +

    我们将检查错误并使用类似示例 12-10 中 Config::build 处理错误的技术来处理它们,不过有一些细微的不同:

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::error::Error;
    +use std::fs;
    +use std::process;
    +
    +fn main() {
    +    // --snip--
    +
    +    let args: Vec<String> = env::args().collect();
    +
    +    let config = Config::build(&args).unwrap_or_else(|err| {
    +        println!("Problem parsing arguments: {err}");
    +        process::exit(1);
    +    });
    +
    +    println!("Searching for {}", config.query);
    +    println!("In file {}", config.file_path);
    +
    +    if let Err(e) = run(config) {
    +        println!("Application error: {e}");
    +        process::exit(1);
    +    }
    +}
    +
    +fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    println!("With text:\n{contents}");
    +
    +    Ok(())
    +}
    +
    +struct Config {
    +    query: String,
    +    file_path: String,
    +}
    +
    +impl Config {
    +    fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +

    我们使用 if let 来检查 run 是否返回一个 Err 值,不同于 unwrap_or_else,并在出错时调用 process::exit(1)run 并不返回像 Config::build 返回的 Config 实例那样需要 unwrap 的值。因为 run 在成功时返回 (),而我们只关心检测错误,所以并不需要 unwrap_or_else 来返回未封装的值,因为它只会是 ()

    +

    不过两个例子中 if letunwrap_or_else 的函数体都一样:打印出错误并退出。

    +

    将代码拆分到库 crate

    +

    现在我们的 minigrep 项目看起来好多了!现在我们将要拆分 src/main.rs 并将一些代码放入 src/lib.rs,这样就能测试它们并拥有一个含有更少功能的 main 函数。

    +

    让我们将所有不是 main 函数的代码从 src/main.rs 移动到新文件 src/lib.rs 中:

    +
      +
    • run 函数定义
    • +
    • 相关的 use 语句
    • +
    • Config 的定义
    • +
    • Config::build 函数定义
    • +
    +

    现在 src/lib.rs 的内容应该看起来像示例 12-13(为了简洁省略了函数体)。注意直到下一个示例修改完 src/main.rs 之后,代码还不能编译:

    +

    文件名:src/lib.rs

    +
    use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        // --snip--
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    // --snip--
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    println!("With text:\n{contents}");
    +
    +    Ok(())
    +}
    +

    示例 12-13:将 Configrun 移动到 src/lib.rs

    +

    这里使用了公有的 pub 关键字:在 Config、其字段和其 build 方法,以及 run 函数上。现在我们有了一个拥有可以测试的公有 API 的库 crate 了。

    +

    现在需要在 src/main.rs 中将移动到 src/lib.rs 的代码引入二进制 crate 的作用域中,如示例 12-14 所示:

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::process;
    +
    +use minigrep::Config;
    +
    +fn main() {
    +    // --snip--
    +    let args: Vec<String> = env::args().collect();
    +
    +    let config = Config::build(&args).unwrap_or_else(|err| {
    +        println!("Problem parsing arguments: {err}");
    +        process::exit(1);
    +    });
    +
    +    println!("Searching for {}", config.query);
    +    println!("In file {}", config.file_path);
    +
    +    if let Err(e) = minigrep::run(config) {
    +        // --snip--
    +        println!("Application error: {e}");
    +        process::exit(1);
    +    }
    +}
    +

    示例 12-14:将 minigrep crate 引入 src/main.rs 的作用域中

    +

    我们添加了一行 use minigrep::Config,它将 Config 类型引入作用域,并使用 crate 名称作为 run 函数的前缀。通过这些重构,所有功能应该能够联系在一起并运行了。运行 cargo run 来确保一切都正确的衔接在一起。

    +

    哇哦!我们做了大量的工作,不过我们为将来的成功打下了基础。现在处理错误将更容易,同时代码也更加模块化。从现在开始几乎所有的工作都将在 src/lib.rs 中进行。

    +

    让我们利用这些新创建的模块的优势来进行一些在旧代码中难以展开的工作,这些工作在新代码中非常容易实现,那就是:编写测试!

    +

    采用测试驱动开发完善库的功能

    +
    +

    ch12-04-testing-the-librarys-functionality.md +
    +commit 8fd2327e4135876b368cc2793eb4a7e455b691f0

    +
    +

    现在我们将逻辑提取到了 src/lib.rs 并将所有的参数解析和错误处理留在了 src/main.rs 中,为代码的核心功能编写测试将更加容易。我们可以直接使用多种参数调用函数并检查返回值而无需从命令行运行二进制文件了。

    +

    在这一部分,我们将遵循测试驱动开发(Test Driven Development, TDD)的模式来逐步增加 minigrep 的搜索逻辑。它遵循如下步骤:

    +
      +
    1. 编写一个失败的测试,并运行它以确保它失败的原因是你所期望的。
    2. +
    3. 编写或修改足够的代码来使新的测试通过。
    4. +
    5. 重构刚刚增加或修改的代码,并确保测试仍然能通过。
    6. +
    7. 从步骤 1 开始重复!
    8. +
    +

    虽然这只是众多编写软件的方法之一,不过 TDD 有助于驱动代码的设计。在编写能使测试通过的代码之前编写测试有助于在开发过程中保持高测试覆盖率。

    +

    我们将测试驱动实现实际在文件内容中搜索查询字符串并返回匹配的行示例的功能。我们将在一个叫做 search 的函数中增加这些功能。

    +

    编写失败测试

    +

    去掉 src/lib.rssrc/main.rs 中用于检查程序行为的 println! 语句,因为不再真正需要它们了。接着我们会像 第十一章 那样增加一个 test 模块和一个测试函数。测试函数指定了 search 函数期望拥有的行为:它会获取一个需要查询的字符串和用来查询的文本,并只会返回包含请求的文本行。示例 12-15 展示了这个测试,它还不能编译:

    +

    文件名:src/lib.rs

    +
    use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    Ok(())
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn one_result() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +}
    +

    示例 12-15:创建一个我们期望的 search 函数的失败测试

    +

    这里选择使用 "duct" 作为这个测试中需要搜索的字符串。用来搜索的文本有三行,其中只有一行包含 "duct"。(注意双引号之后的反斜杠,这告诉 Rust 不要在字符串字面值内容的开头加入换行符)我们断言 search 函数的返回值只包含期望的那一行。

    +

    我们还不能运行这个测试并看到它失败,因为它甚至都还不能编译:search 函数还不存在呢!根据 TDD 的原则,我们将增加足够的代码来使其能够编译:一个总是会返回空 vector 的 search 函数定义,如示例 12-16 所示。然后这个测试应该能够编译并因为空 vector 并不匹配一个包含一行 "safe, fast, productive." 的 vector 而失败。

    +

    文件名:src/lib.rs

    +
    use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    vec![]
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn one_result() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +}
    +

    示例 12-16:刚好足够使测试通过编译的 search 函数定义

    +

    注意需要在 search 的签名中定义一个显式生命周期 'a 并用于 contents 参数和返回值。回忆一下 第十章 中讲到生命周期参数指定哪个参数的生命周期与返回值的生命周期相关联。在这个例子中,我们表明返回的 vector 中应该包含引用参数 contents(而不是参数query)slice 的字符串 slice。

    +

    换句话说,我们告诉 Rust 函数 search 返回的数据将与 search 函数中的参数 contents 的数据存在的一样久。这是非常重要的!为了使这个引用有效那么 slice 引用的数据也需要保持有效;如果编译器认为我们是在创建 query 而不是 contents 的字符串 slice,那么安全检查将是不正确的。

    +

    如果尝试不用生命周期编译的话,我们将得到如下错误:

    +
    $ cargo build
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +error[E0106]: missing lifetime specifier
    +  --> src/lib.rs:28:51
    +   |
    +28 | pub fn search(query: &str, contents: &str) -> Vec<&str> {
    +   |                      ----            ----         ^ expected named lifetime parameter
    +   |
    +   = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `query` or `contents`
    +help: consider introducing a named lifetime parameter
    +   |
    +28 | pub fn search<'a>(query: &'a str, contents: &'a str) -> Vec<&'a str> {
    +   |              ++++         ++                 ++              ++
    +
    +For more information about this error, try `rustc --explain E0106`.
    +error: could not compile `minigrep` (lib) due to 1 previous error
    +
    +

    Rust 不可能知道我们需要的是哪一个参数,所以需要告诉它。因为参数 contents 包含了所有的文本而且我们希望返回匹配的那部分文本,所以我们知道 contents 是应该要使用生命周期语法来与返回值相关联的参数。

    +

    其他语言中并不需要你在函数签名中将参数与返回值相关联。所以这么做可能仍然感觉有些陌生,随着时间的推移这将会变得越来越容易。你可能想要将这个例子与第十章中 “生命周期确保引用有效” 部分做对比。

    +

    现在运行测试:

    +
    $ cargo test
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.97s
    +     Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94)
    +
    +running 1 test
    +test tests::one_result ... FAILED
    +
    +failures:
    +
    +---- tests::one_result stdout ----
    +thread 'tests::one_result' panicked at src/lib.rs:44:9:
    +assertion `left == right` failed
    +  left: ["safe, fast, productive."]
    + right: []
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +
    +failures:
    +    tests::one_result
    +
    +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +error: test failed, to rerun pass `--lib`
    +
    +

    好的,测试失败了,这正是我们所期望的。修改代码来让测试通过吧!

    +

    编写使测试通过的代码

    +

    目前测试之所以会失败是因为我们总是返回一个空的 vector。为了修复并实现 search,我们的程序需要遵循如下步骤:

    +
      +
    • 遍历内容的每一行文本。
    • +
    • 查看这一行是否包含要搜索的字符串。
    • +
    • 如果有,将这一行加入列表返回值中。
    • +
    • 如果没有,什么也不做。
    • +
    • 返回匹配到的结果列表
    • +
    +

    让我们一步一步的来,从遍历每行开始。

    +

    使用 lines 方法遍历每一行

    +

    Rust 有一个有助于一行一行遍历字符串的方法,出于方便它被命名为 lines,它如示例 12-17 这样工作。注意这还不能编译:

    +

    文件名:src/lib.rs

    +
    use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    for line in contents.lines() {
    +        // do something with line
    +    }
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn one_result() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +}
    +

    示例 12-17:遍历 contents 的每一行

    +

    lines 方法返回一个迭代器。第十三章 会深入了解迭代器,不过我们已经在 示例 3-5 中见过使用迭代器的方法了,在那里使用了一个 for 循环和迭代器在一个集合的每一项上运行了一些代码。

    +

    用查询字符串搜索每一行

    +

    接下来将会增加检查当前行是否包含查询字符串的功能。幸运的是,字符串类型为此也有一个叫做 contains 的实用方法!如示例 12-18 所示在 search 函数中加入 contains 方法调用。注意这仍然不能编译:

    +

    文件名:src/lib.rs

    +
    use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    for line in contents.lines() {
    +        if line.contains(query) {
    +            // 对文本行进行操作
    +        }
    +    }
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn one_result() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +}
    +

    示例 12-18:增加检查文本行是否包含 query 中字符串的功能

    +

    存储匹配的行

    +

    为了完成这个函数,我们还需要一个方法来存储包含查询字符串的行。为此可以在 for 循环之前创建一个可变的 vector 并调用 push 方法在 vector 中存放一个 line。在 for 循环之后,返回这个 vector,如示例 12-19 所示:

    +

    文件名:src/lib.rs

    +
    use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.contains(query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn one_result() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +}
    +

    示例 12-19:储存匹配的行以便可以返回它们

    +

    现在 search 函数应该返回只包含 query 的那些行,而测试应该会通过。让我们运行测试:

    +
    $ cargo test
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.22s
    +     Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94)
    +
    +running 1 test
    +test tests::one_result ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +     Running unittests src/main.rs (target/debug/deps/minigrep-9cd200e5fac0fc94)
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests minigrep
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    测试通过了,它可以工作了!

    +

    现在正是可以考虑重构的时机,在保证测试通过,保持功能不变的前提下重构 search 函数。search 函数中的代码并不坏,不过并没有利用迭代器的一些实用功能。第十三章将回到这个例子并深入探索迭代器并看看如何改进代码。

    +

    run 函数中使用 search 函数

    +

    现在 search 函数是可以工作并测试通过了的,我们需要实际在 run 函数中调用 search。需要将 config.query 值和 run 从文件中读取的 contents 传递给 search 函数。接着 run 会打印出 search 返回的每一行:

    +

    文件名:src/lib.rs

    +
    use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    for line in search(&config.query, &contents) {
    +        println!("{line}");
    +    }
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.contains(query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn one_result() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +}
    +

    这里仍然使用了 for 循环获取了 search 返回的每一行并打印出来。

    +

    现在整个程序应该可以工作了!让我们试一试,首先使用一个只会在艾米莉·狄金森的诗中返回一行的单词 “frog”:

    +
    $ cargo run -- frog poem.txt
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.38s
    +     Running `target/debug/minigrep frog poem.txt`
    +How public, like a frog
    +
    +

    好的!现在试试一个会匹配多行的单词,比如 “body”:

    +
    $ cargo run -- body poem.txt
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
    +     Running `target/debug/minigrep body poem.txt`
    +I'm nobody! Who are you?
    +Are you nobody, too?
    +How dreary to be somebody!
    +
    +

    最后,让我们确保搜索一个在诗中哪里都没有的单词时不会得到任何行,比如 "monomorphization":

    +
    $ cargo run -- monomorphization poem.txt
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
    +     Running `target/debug/minigrep monomorphization poem.txt`
    +
    +

    非常好!我们创建了一个属于自己的迷你版经典工具,并学习了很多如何组织程序的知识。我们还学习了一些文件输入输出、生命周期、测试和命令行解析的内容。

    +

    为了使这个项目更丰满,我们将简要的展示如何处理环境变量和打印到标准错误,这两者在编写命令行程序时都很有用。

    +

    处理环境变量

    +
    +

    ch12-05-working-with-environment-variables.md +
    +commit 9c0fa2714859738ff73cbbb829592e4c037d7e46

    +
    +

    我们将增加一个额外的功能来改进 minigrep:用户可以通过设置环境变量来设置搜索是否是大小写敏感的。当然,我们也可以将其设计为一个命令行参数并要求用户每次需要时都加上它,不过在这里我们将使用环境变量。这允许用户设置环境变量一次之后在整个终端会话中所有的搜索都将是大小写不敏感的。

    +

    编写一个大小写不敏感 search 函数的失败测试

    +

    首先我们希望增加一个新函数 search_case_insensitive,并将会在环境变量有值时调用它。这里将继续遵循 TDD 过程,其第一步是再次编写一个失败测试。我们将为新的大小写不敏感搜索函数新增一个测试函数,并将老的测试函数从 one_result 改名为 case_sensitive 来更清楚的表明这两个测试的区别,如示例 12-20 所示:

    +

    文件名:src/lib.rs

    +
    use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    for line in search(&config.query, &contents) {
    +        println!("{line}");
    +    }
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.contains(query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn case_sensitive() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Duct tape.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +
    +    #[test]
    +    fn case_insensitive() {
    +        let query = "rUsT";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Trust me.";
    +
    +        assert_eq!(
    +            vec!["Rust:", "Trust me."],
    +            search_case_insensitive(query, contents)
    +        );
    +    }
    +}
    +

    示例 12-20:为准备添加的大小写不敏感函数新增失败测试

    +

    注意我们也改变了老测试中 contents 的值。还新增了一个含有文本 "Duct tape." 的行,它有一个大写的 D,这在大小写敏感搜索时不应该匹配 "duct"。我们修改这个测试以确保不会意外破坏已经实现的大小写敏感搜索功能;这个测试现在应该能通过并在处理大小写不敏感搜索时应该能一直通过。

    +

    大小写 不敏感 搜索的新测试使用 "rUsT" 作为其查询字符串。在我们将要增加的 search_case_insensitive 函数中,"rUsT" 查询应该包含带有一个大写 R 的 "Rust:" 还有 "Trust me." 这两行,即便它们与查询的大小写都不同。这个测试现在不能编译,因为还没有定义 search_case_insensitive 函数。请随意增加一个总是返回空 vector 的骨架实现,正如示例 12-16 中 search 函数为了使测试通过编译并失败时所做的那样。

    +

    实现 search_case_insensitive 函数

    +

    search_case_insensitive 函数,如示例 12-21 所示,将与 search 函数基本相同。唯一的区别是它会将 query 变量和每一 line 都变为小写,这样不管输入参数是大写还是小写,在检查该行是否包含查询字符串时都会是小写。

    +

    文件名:src/lib.rs

    +
    use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    for line in search(&config.query, &contents) {
    +        println!("{line}");
    +    }
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.contains(query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +pub fn search_case_insensitive<'a>(
    +    query: &str,
    +    contents: &'a str,
    +) -> Vec<&'a str> {
    +    let query = query.to_lowercase();
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.to_lowercase().contains(&query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn case_sensitive() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Duct tape.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +
    +    #[test]
    +    fn case_insensitive() {
    +        let query = "rUsT";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Trust me.";
    +
    +        assert_eq!(
    +            vec!["Rust:", "Trust me."],
    +            search_case_insensitive(query, contents)
    +        );
    +    }
    +}
    +

    示例 12-21:定义 search_case_insensitive 函数,它在比较查询和每一行之前将它们都转换为小写

    +

    首先我们将 query 字符串转换为小写,并将其覆盖到同名的变量中。对查询字符串调用 to_lowercase 是必需的,这样不管用户的查询是 "rust""RUST""Rust" 或者 "rUsT",我们都将其当作 "rust" 处理并对大小写不敏感。虽然 to_lowercase 可以处理基本的 Unicode,但它不是 100% 准确。如果编写真实的程序的话,我们还需多做一些工作,不过这一部分是关于环境变量而不是 Unicode 的,所以这样就够了。

    +

    注意 query 现在是一个 String 而不是字符串 slice,因为调用 to_lowercase 是在创建新数据,而不是引用现有数据。如果查询字符串是 "rUsT",这个字符串 slice 并不包含可供我们使用的小写的 ut,所以必需分配一个包含 "rust" 的新 String。现在当我们将 query 作为一个参数传递给 contains 方法时,需要增加一个 & 因为 contains 的签名被定义为获取一个字符串 slice。

    +

    接下来我们对每一 line 都调用 to_lowercase 将其转为小写。现在我们将 linequery 都转换成了小写,这样就可以不管查询的大小写进行匹配了。

    +

    让我们看看这个实现能否通过测试:

    +
    $ cargo test
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.33s
    +     Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94)
    +
    +running 2 tests
    +test tests::case_insensitive ... ok
    +test tests::case_sensitive ... ok
    +
    +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +     Running unittests src/main.rs (target/debug/deps/minigrep-9cd200e5fac0fc94)
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests minigrep
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +
    +

    好的!现在,让我们在 run 函数中实际调用新 search_case_insensitive 函数。首先,我们将在 Config 结构体中增加一个配置项来切换大小写敏感和大小写不敏感搜索。增加这些字段会导致编译错误,因为我们还没有在任何地方初始化这些字段:

    +

    文件名:src/lib.rs

    +
    use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +    pub ignore_case: bool,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    let results = if config.ignore_case {
    +        search_case_insensitive(&config.query, &contents)
    +    } else {
    +        search(&config.query, &contents)
    +    };
    +
    +    for line in results {
    +        println!("{line}");
    +    }
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.contains(query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +pub fn search_case_insensitive<'a>(
    +    query: &str,
    +    contents: &'a str,
    +) -> Vec<&'a str> {
    +    let query = query.to_lowercase();
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.to_lowercase().contains(&query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn case_sensitive() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Duct tape.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +
    +    #[test]
    +    fn case_insensitive() {
    +        let query = "rUsT";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Trust me.";
    +
    +        assert_eq!(
    +            vec!["Rust:", "Trust me."],
    +            search_case_insensitive(query, contents)
    +        );
    +    }
    +}
    +

    这里增加了 ignore_case 字符来存放一个布尔值。接着我们需要 run 函数检查 case_sensitive 字段的值并使用它来决定是否调用 search 函数或 search_case_insensitive 函数,如示例 12-22 所示。注意这还不能编译:

    +

    文件名:src/lib.rs

    +
    use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +    pub ignore_case: bool,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    let results = if config.ignore_case {
    +        search_case_insensitive(&config.query, &contents)
    +    } else {
    +        search(&config.query, &contents)
    +    };
    +
    +    for line in results {
    +        println!("{line}");
    +    }
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.contains(query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +pub fn search_case_insensitive<'a>(
    +    query: &str,
    +    contents: &'a str,
    +) -> Vec<&'a str> {
    +    let query = query.to_lowercase();
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.to_lowercase().contains(&query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn case_sensitive() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Duct tape.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +
    +    #[test]
    +    fn case_insensitive() {
    +        let query = "rUsT";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Trust me.";
    +
    +        assert_eq!(
    +            vec!["Rust:", "Trust me."],
    +            search_case_insensitive(query, contents)
    +        );
    +    }
    +}
    +

    示例 12-22:根据 config.ignore_case 的值调用 searchsearch_case_insensitive

    +

    最后需要实际检查环境变量。处理环境变量的函数位于标准库的 env 模块中,所以我们需要在 src/lib.rs 的开头将这个模块引入作用域中。接着使用 env 模块的 var 方法来检查一个叫做 IGNORE_CASE 的环境变量,如示例 12-23 所示:

    +

    文件名:src/lib.rs

    +
    use std::env;
    +// --snip--
    +
    +use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +    pub ignore_case: bool,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        let ignore_case = env::var("IGNORE_CASE").is_ok();
    +
    +        Ok(Config {
    +            query,
    +            file_path,
    +            ignore_case,
    +        })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    let results = if config.ignore_case {
    +        search_case_insensitive(&config.query, &contents)
    +    } else {
    +        search(&config.query, &contents)
    +    };
    +
    +    for line in results {
    +        println!("{line}");
    +    }
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.contains(query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +pub fn search_case_insensitive<'a>(
    +    query: &str,
    +    contents: &'a str,
    +) -> Vec<&'a str> {
    +    let query = query.to_lowercase();
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.to_lowercase().contains(&query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn case_sensitive() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Duct tape.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +
    +    #[test]
    +    fn case_insensitive() {
    +        let query = "rUsT";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Trust me.";
    +
    +        assert_eq!(
    +            vec!["Rust:", "Trust me."],
    +            search_case_insensitive(query, contents)
    +        );
    +    }
    +}
    +

    示例 12-23:检查叫做 IGNORE_CASE 的环境变量

    +

    这里创建了一个新变量 ignore_case。为了设置它的值,需要调用 env::var 函数并传递我们需要寻找的环境变量名称,IGNORE_CASEenv::var 返回一个 Result,它在环境变量被设置时返回包含其值的 Ok 成员,并在环境变量未被设置时返回 Err 成员。

    +

    我们使用 Resultis_ok 方法来检查环境变量是否被设置,这也就意味着我们 需要 进行一个大小写不敏感的搜索。如果IGNORE_CASE 环境变量没有被设置为任何值,is_ok 会返回 false 并将进行大小写敏感的搜索。我们并不关心环境变量所设置的 ,只关心它是否被设置了,所以检查 is_ok 而不是 unwrapexpect 或任何我们已经见过的 Result 的方法。

    +

    我们将变量 ignore_case 的值传递给 Config 实例,这样 run 函数可以读取其值并决定是否调用 search 或者示例 12-22 中实现的 search_case_insensitive

    +

    让我们试一试吧!首先不设置环境变量并使用查询 to 运行程序,这应该会匹配任何全小写的单词 “to” 的行:

    +
    $ cargo run -- to poem.txt
    +   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
    +     Running `target/debug/minigrep to poem.txt`
    +Are you nobody, too?
    +How dreary to be somebody!
    +
    +

    看起来程序仍然能够工作!现在将 IGNORE_CASE 设置为 1 并仍使用相同的查询 to

    +
    $ IGNORE_CASE=1 cargo run to poem.txt
    +
    +

    如果你使用 PowerShell,则需要用两个命令来分别设置环境变量并运行程序:

    +
    PS> $Env:IGNORE_CASE=1; cargo run to poem.txt
    +
    +

    而这会让 IGNORE_CASE 的效果在当前 shell 会话中持续生效。可以通过 Remove-Item 命令来取消设置:

    +
    PS> Remove-Item Env:IGNORE_CASE
    +
    +

    这回应该得到包含可能有大写字母的 “to” 的行:

    +
    Are you nobody, too?
    +How dreary to be somebody!
    +To tell your name the livelong day
    +To an admiring bog!
    +
    +

    好极了,我们也得到了包含 “To” 的行!现在 minigrep 程序可以通过环境变量控制进行大小写不敏感搜索了。现在你知道了如何管理由命令行参数或环境变量设置的选项了!

    +

    一些程序允许对相同配置同时使用参数 环境变量。在这种情况下,程序来决定参数和环境变量的优先级。作为一个留给你的测试,尝试通过一个命令行参数或一个环境变量来控制大小写敏感搜索。并在运行程序时遇到矛盾值时决定命令行参数和环境变量的优先级。

    +

    std::env 模块还包含了更多处理环境变量的实用功能;请查看官方文档来了解其可用的功能。

    +

    将错误信息输出到标准错误而不是标准输出

    +
    +

    ch12-06-writing-to-stderr-instead-of-stdout.md +
    +commit 02a168ed346042f07010f8b65b4eeed623dd31d1

    +
    +

    目前为止,我们将所有的输出都通过 println! 写到了终端。大部分终端都提供了两种输出:标准输出standard outputstdout)对应一般信息,标准错误standard errorstderr)则用于错误信息。这种区别允许用户选择将程序正常输出定向到一个文件中并仍将错误信息打印到屏幕上。

    +

    但是 println! 宏只能够打印到标准输出,所以我们必须使用其他方法来打印到标准错误。

    +

    检查错误应该写入何处

    +

    首先,让我们观察一下目前 minigrep 打印的所有内容是如何被写入标准输出的,包括那些应该被写入标准错误的错误信息。可以通过将标准输出流重定向到一个文件同时有意产生一个错误来做到这一点。我们没有重定向标准错误流,所以任何发送到标准错误的内容将会继续显示在屏幕上。

    +

    命令行程序被期望将错误信息发送到标准错误流,这样即便选择将标准输出流重定向到文件中时仍然能看到错误信息。目前我们的程序并不符合期望;相反我们将看到它将错误信息输出保存到了文件中!

    +

    我们通过 > 和文件路径 output.txt 来运行程序,我们期望重定向标准输出流到该文件中。在这里,我们没有传递任何参数,所以会产生一个错误:

    +
    $ cargo run > output.txt
    +
    +

    > 语法告诉 shell 将标准输出的内容写入到 output.txt 文件中而不是屏幕上。我们并没有看到期望的错误信息打印到屏幕上,所以这意味着它一定被写入了文件中。如下是 output.txt 所包含的:

    +
    Problem parsing arguments: not enough arguments
    +
    +

    是的,错误信息被打印到了标准输出中。像这样的错误信息被打印到标准错误中将会有用得多,将使得只有成功运行所产生的输出才会写入文件。我们接下来就修改。

    +

    将错误打印到标准错误

    +

    让我们如示例 12-24 所示的代码改变错误信息是如何被打印的。得益于本章早些时候的重构,所有打印错误信息的代码都位于 main 一个函数中。标准库提供了 eprintln! 宏来打印到标准错误流,所以将两个调用 println! 打印错误信息的位置替换为 eprintln!

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::process;
    +
    +use minigrep::Config;
    +
    +fn main() {
    +    let args: Vec<String> = env::args().collect();
    +
    +    let config = Config::build(&args).unwrap_or_else(|err| {
    +        eprintln!("Problem parsing arguments: {err}");
    +        process::exit(1);
    +    });
    +
    +    if let Err(e) = minigrep::run(config) {
    +        eprintln!("Application error: {e}");
    +        process::exit(1);
    +    }
    +}
    +

    示例 12-24:使用 eprintln! 将错误信息写入标准错误而不是标准输出

    +

    现在我们再次尝试用同样的方式运行程序,不使用任何参数并通过 > 重定向标准输出:

    +
    $ cargo run > output.txt
    +Problem parsing arguments: not enough arguments
    +
    +

    现在我们看到了屏幕上的错误信息,同时 output.txt 里什么也没有,这正是命令行程序所期望的行为。

    +

    如果使用不会造成错误的参数再次运行程序,不过仍然将标准输出重定向到一个文件,像这样:

    +
    $ cargo run -- to poem.txt > output.txt
    +
    +

    我们并不会在终端看到任何输出,同时 output.txt 将会包含其结果:

    +

    文件名:output.txt

    +
    Are you nobody, too?
    +How dreary to be somebody!
    +
    +

    这一部分展示了现在我们适当的使用了成功时产生的标准输出和错误时产生的标准错误。

    +

    总结

    +

    在这一章中,我们回顾了目前为止的一些主要章节并涉及了如何在 Rust 环境中进行常规的 I/O 操作。通过使用命令行参数、文件、环境变量和打印错误的 eprintln! 宏,现在你已经准备好编写命令行程序了。通过结合前几章的知识,你的代码将会是组织良好的,并能有效的将数据存储到合适的数据结构中、更好的处理错误,并且还是经过良好测试的。

    +

    接下来,让我们探索一些 Rust 中受函数式编程语言影响的功能:闭包和迭代器。

    +

    Rust 中的函数式语言功能:迭代器与闭包

    +
    +

    ch13-00-functional-features.md +
    +commit daa268a0cd04ef76a8067a26ed7d28ec2a9336d3

    +
    +

    Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是 函数式编程functional programming)。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。

    +

    本章我们不会讨论函数式编程是或不是什么的问题,而是展示 Rust 的一些在功能上与其他被认为是函数式语言类似的特性。

    +

    更具体的,我们将要涉及:

    +
      +
    • 闭包Closures),一个可以储存在变量里的类似函数的结构
    • +
    • 迭代器Iterators),一种处理元素序列的方式
    • +
    • 如何使用闭包和迭代器来改进第十二章的 I/O 项目。
    • +
    • 闭包和迭代器的性能。(剧透警告: 它们的速度超乎你的想象!)
    • +
    +

    我们已经介绍了其它受函数式风格影响的 Rust 功能,比如模式匹配和枚举,这些已经在其他章节中讲到过了。因为掌握闭包和迭代器是编写符合语言风格的高性能 Rust 代码的重要一环,所以我们将专门用一整章来讲解它们。

    +

    闭包:可以捕获环境的匿名函数

    +
    +

    ch13-01-closures.md +
    +commit a2cb72d3ad7584cc1ae3b85f715c877872f5e3ab

    +
    +

    Rust 的 闭包closures)是可以保存在变量中或作为参数传递给其他函数的匿名函数。你可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获其被定义时所在作用域中的值。我们将展示这些闭包特性如何支持代码复用和行为定制。

    +

    闭包会捕获其环境

    +

    我们首先了解如何通过闭包捕获定义它的环境中的值以便之后使用。考虑如下场景:我们的 T 恤公司偶尔会向邮件列表中的某位成员赠送一件限量版的独家 T 恤作为促销。邮件列表中的成员可以选择将他们的喜爱的颜色添加到个人信息中。如果被选中的成员设置了喜爱的颜色,他们将获得那个颜色的 T 恤。如果他没有设置喜爱的颜色,他们会获赠公司当前库存最多的颜色的款式。

    +

    有很多种方式来实现这一点。例如,使用有 RedBlue 两个成员的 ShirtColor 枚举(出于简单考虑限定为两种颜色)。我们使用 Inventory 结构体来代表公司的库存,它有一个类型为 Vec<ShirtColor>shirts 字段表示库存中的衬衫的颜色。Inventory 上定义的 giveaway 方法获取免费衬衫得主所喜爱的颜色(如有),并返回其获得的衬衫的颜色。初始代码如示例 13-1 所示:

    +

    文件名:src/main.rs

    +
    #[derive(Debug, PartialEq, Copy, Clone)]
    +enum ShirtColor {
    +    Red,
    +    Blue,
    +}
    +
    +struct Inventory {
    +    shirts: Vec<ShirtColor>,
    +}
    +
    +impl Inventory {
    +    fn giveaway(&self, user_preference: Option<ShirtColor>) -> ShirtColor {
    +        user_preference.unwrap_or_else(|| self.most_stocked())
    +    }
    +
    +    fn most_stocked(&self) -> ShirtColor {
    +        let mut num_red = 0;
    +        let mut num_blue = 0;
    +
    +        for color in &self.shirts {
    +            match color {
    +                ShirtColor::Red => num_red += 1,
    +                ShirtColor::Blue => num_blue += 1,
    +            }
    +        }
    +        if num_red > num_blue {
    +            ShirtColor::Red
    +        } else {
    +            ShirtColor::Blue
    +        }
    +    }
    +}
    +
    +fn main() {
    +    let store = Inventory {
    +        shirts: vec![ShirtColor::Blue, ShirtColor::Red, ShirtColor::Blue],
    +    };
    +
    +    let user_pref1 = Some(ShirtColor::Red);
    +    let giveaway1 = store.giveaway(user_pref1);
    +    println!(
    +        "The user with preference {:?} gets {:?}",
    +        user_pref1, giveaway1
    +    );
    +
    +    let user_pref2 = None;
    +    let giveaway2 = store.giveaway(user_pref2);
    +    println!(
    +        "The user with preference {:?} gets {:?}",
    +        user_pref2, giveaway2
    +    );
    +}
    +

    示例 13-1:衬衫公司赠送场景

    +

    main 函数中定义的 store 还剩下两件蓝衬衫和一件红衬衫,可以在限量版促销活动中赠送。我们通过调用 giveaway 方法,为一个期望红衬衫的用户和一个没有特定偏好的用户进行赠送。

    +

    再次强调,这段代码有多种实现方式。这里为了专注于闭包,我们继续使用已经学习过的概念,除了 giveaway 方法体中使用了闭包。在 giveaway 方法中,我们将用户偏好作为 Option<ShirtColor> 类型的参数获取,并在 user_preference 上调用 unwrap_or_else 方法。Option<T> 上的 unwrap_or_else 方法 由标准库定义。它接受一个无参闭包作为参数,该闭包返回一个 T 类型的值(与 Option<T>Some 变体中存储的值类型相同,这里是 ShirtColor)。如果 Option<T>Some 成员,则 unwrap_or_else 返回 Some 中的值。如果 Option<T>None 成员,则 unwrap_or_else 调用闭包并返回闭包的返回值。

    +

    我们将闭包表达式 || self.most_stocked() 作为 unwrap_or_else 的参数。这是一个本身不获取参数的闭包(如果闭包有参数,它们会出现在两道竖杠之间)。闭包体调用了 self.most_stocked()。我们在这里定义了闭包,而 unwrap_or_else 的实现会在之后需要其结果的时候执行闭包。

    +

    运行代码会打印出:

    +
    $ cargo run
    +   Compiling shirt-company v0.1.0 (file:///projects/shirt-company)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.27s
    +     Running `target/debug/shirt-company`
    +The user with preference Some(Red) gets Red
    +The user with preference None gets Blue
    +
    +

    这里有一个有趣的地方是,我们传递了一个闭包,该闭包会在当前的 Inventory 实例上调用 self.most_stocked() 方法。标准库不需要了解我们定义的 InventoryShirtColor 类型,也不需要了解我们在这个场景中要使用的逻辑。闭包捕获了对 self(即 Inventory 实例)的不可变引用,并将其与我们指定的代码一起传递给 unwrap_or_else 方法。相比之下,函数无法以这种方式捕获其环境。

    +

    闭包类型推断和注解

    +

    函数与闭包还有更多区别。闭包通常不要求像 fn 函数那样对参数和返回值进行类型注解。函数需要类型注解是因为这些类型是暴露给用户的显式接口的一部分。严格定义这些接口对于确保所有人对函数使用和返回值的类型达成一致理解非常重要。与此相比,闭包并不用于这样暴露在外的接口:它们储存在变量中并被使用,不用命名它们或暴露给库的用户调用。

    +

    闭包通常较短,并且只与特定的上下文相关,而不是适用于任意情境。在这些有限的上下文中,编译器可以推断参数和返回值的类型,类似于它推断大多数变量类型的方式(尽管在某些罕见的情况下,编译器也需要闭包的类型注解)。

    +

    类似于变量,如果我们希望增加代码的明确性和清晰度,可以添加类型注解,但代价是是会使代码变得比严格必要的更冗长。为示例 13-1 中定义的闭包标注类型看起来如示例 13-2 中的定义一样。这个例子中,我们定义了一个闭包并将它保存在变量中,而不是像示例 13-1 那样在传参的地方定义它。

    +

    文件名:src/main.rs

    +
    use std::thread;
    +use std::time::Duration;
    +
    +fn generate_workout(intensity: u32, random_number: u32) {
    +    let expensive_closure = |num: u32| -> u32 {
    +        println!("calculating slowly...");
    +        thread::sleep(Duration::from_secs(2));
    +        num
    +    };
    +
    +    if intensity < 25 {
    +        println!("Today, do {} pushups!", expensive_closure(intensity));
    +        println!("Next, do {} situps!", expensive_closure(intensity));
    +    } else {
    +        if random_number == 3 {
    +            println!("Take a break today! Remember to stay hydrated!");
    +        } else {
    +            println!(
    +                "Today, run for {} minutes!",
    +                expensive_closure(intensity)
    +            );
    +        }
    +    }
    +}
    +
    +fn main() {
    +    let simulated_user_specified_value = 10;
    +    let simulated_random_number = 7;
    +
    +    generate_workout(simulated_user_specified_value, simulated_random_number);
    +}
    +

    示例 13-2:为闭包的参数和返回值增加可选的类型注解

    +

    有了类型注解,闭包的语法看起来就更像函数的语法了。如下是一个对其参数加一的函数的定义与拥有相同行为闭包语法的纵向对比。这里增加了一些空格来对齐相应部分。这展示了除了使用竖线以及一些可选语法外,闭包语法与函数语法有多么地相似:

    +
    fn  add_one_v1   (x: u32) -> u32 { x + 1 }
    +let add_one_v2 = |x: u32| -> u32 { x + 1 };
    +let add_one_v3 = |x|             { x + 1 };
    +let add_one_v4 = |x|               x + 1  ;
    +

    第一行展示了一个函数定义,第二行展示了一个完整标注的闭包定义。第三行闭包定义中省略了类型注解,而第四行去掉了可选的大括号,因为闭包体只有一个表达式,所以大括号是可选的。这些都是有效的闭包定义,并在调用时产生相同的行为。调用闭包是 add_one_v3add_one_v4 能够编译的必要条件,因为类型将从其用法中推断出来。这类似于 let v = Vec::new();,Rust 需要类型注解或是某种类型的值被插入到 Vec 中,才能推断其类型。

    +

    对于闭包定义,编译器会为每个参数和返回值推断出一个具体类型。例如,示例 13-3 展示了一个简短的闭包定义,该闭包仅仅返回作为参数接收到的值。除了作为示例用途外,这个闭包并不是很实用。注意这个定义没有增加任何类型注解。因为没有类型注解,我们可以使用任意类型来调用这个闭包,我们在这里第一次调用时使用了 String 类型。但是如果我们接着尝试使用整数来调用 example_closure,就会得到一个错误。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let example_closure = |x| x;
    +
    +    let s = example_closure(String::from("hello"));
    +    let n = example_closure(5);
    +}
    +

    示例 13-3:尝试调用一个被推断为两个不同类型的闭包

    +

    编译器给出如下错误:

    +
    $ cargo run
    +   Compiling closure-example v0.1.0 (file:///projects/closure-example)
    +error[E0308]: mismatched types
    + --> src/main.rs:5:29
    +  |
    +5 |     let n = example_closure(5);
    +  |             --------------- ^- help: try using a conversion method: `.to_string()`
    +  |             |               |
    +  |             |               expected `String`, found integer
    +  |             arguments to this function are incorrect
    +  |
    +note: expected because the closure was earlier called with an argument of type `String`
    + --> src/main.rs:4:29
    +  |
    +4 |     let s = example_closure(String::from("hello"));
    +  |             --------------- ^^^^^^^^^^^^^^^^^^^^^ expected because this argument is of type `String`
    +  |             |
    +  |             in this closure call
    +note: closure parameter defined here
    + --> src/main.rs:2:28
    +  |
    +2 |     let example_closure = |x| x;
    +  |                            ^
    +
    +For more information about this error, try `rustc --explain E0308`.
    +error: could not compile `closure-example` (bin "closure-example") due to 1 previous error
    +
    +

    第一次使用 String 值调用 example_closure 时,编译器推断出 x 的类型以及闭包的返回类型为 String。接着这些类型被锁定进闭包 example_closure 中,如果尝试对同一闭包使用不同类型则就会得到类型错误。

    +

    捕获引用或者移动所有权

    +

    闭包可以通过三种方式捕获其环境中的值,它们直接对应到函数获取参数的三种方式:不可变借用、可变借用和获取所有权。闭包将根据函数体中对捕获值的操作来决定使用哪种方式。

    +

    在示例 13-4 中定义了一个捕获名为 list 的 vector 的不可变引用的闭包,因为只需不可变引用就能打印其值:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let list = vec![1, 2, 3];
    +    println!("Before defining closure: {list:?}");
    +
    +    let only_borrows = || println!("From closure: {list:?}");
    +
    +    println!("Before calling closure: {list:?}");
    +    only_borrows();
    +    println!("After calling closure: {list:?}");
    +}
    +

    示例 13-4:定义并调用一个捕获不可变引用的闭包

    +

    这个示例也展示了变量可以绑定一个闭包定义,并且我们可以像使用函数名一样,使用变量名和括号来调用该闭包。

    +

    因为同时可以有多个 list 的不可变引用,所以在闭包定义之前,闭包定义之后调用之前,闭包调用之后代码仍然可以访问 list。该代码可以编译、运行并输出:

    +
    $ cargo run
    +     Locking 1 package to latest compatible version
    +      Adding closure-example v0.1.0 (/Users/chris/dev/rust-lang/book/tmp/listings/ch13-functional-features/listing-13-04)
    +   Compiling closure-example v0.1.0 (file:///projects/closure-example)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s
    +     Running `target/debug/closure-example`
    +Before defining closure: [1, 2, 3]
    +Before calling closure: [1, 2, 3]
    +From closure: [1, 2, 3]
    +After calling closure: [1, 2, 3]
    +
    +

    接下来在示例 13-5 中,我们修改闭包体让它向 list vector 增加一个元素。闭包现在捕获一个可变引用:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let mut list = vec![1, 2, 3];
    +    println!("Before defining closure: {list:?}");
    +
    +    let mut borrows_mutably = || list.push(7);
    +
    +    borrows_mutably();
    +    println!("After calling closure: {list:?}");
    +}
    +

    示例 13-5:定义并调用一个捕获可变引用的闭包

    +

    代码可以编译、运行并打印:

    +
    $ cargo run
    +     Locking 1 package to latest compatible version
    +      Adding closure-example v0.1.0 (/Users/chris/dev/rust-lang/book/tmp/listings/ch13-functional-features/listing-13-05)
    +   Compiling closure-example v0.1.0 (file:///projects/closure-example)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s
    +     Running `target/debug/closure-example`
    +Before defining closure: [1, 2, 3]
    +After calling closure: [1, 2, 3, 7]
    +
    +

    注意在 borrows_mutably 闭包的定义和调用之间不再有 println!,这是因为当 borrows_mutably 被定义时,它捕获了对 list 的可变引用。闭包在被调用后就不再被使用,这时可变借用结束。因为当可变借用存在时不允许有其它的借用,所以在闭包定义和调用之间不能有不可变引用来进行打印。可以尝试在这里添加 println! 看看你会得到什么报错信息!

    +

    即使闭包体不严格需要所有权,如果希望强制闭包获取它在环境中所使用的值的所有权,可以在参数列表前使用 move 关键字。

    +

    当将闭包传递到一个新的线程时,这个技巧特别有用,因为它将数据的所有权移动到新线程中。我们将在第十六章讨论并发时详细讨论线程以及为什么你可能需要使用它们。不过现在,我们先简要探索一下如何使用需要 move 关键字的闭包来生成一个新线程。示例 13-6 展示了如何修改示例 13-4,以便在一个新线程中而不是在主线程中打印 vector:

    +

    文件名:src/main.rs

    +
    use std::thread;
    +
    +fn main() {
    +    let list = vec![1, 2, 3];
    +    println!("Before defining closure: {list:?}");
    +
    +    thread::spawn(move || println!("From thread: {list:?}"))
    +        .join()
    +        .unwrap();
    +}
    +

    示例 13-6:使用 move 来强制闭包为线程获取 list 的所有权

    +

    我们生成了一个新的线程,并给这个线程传递一个闭包作为参数来运行,闭包体打印出列表。在示例 13-4 中,闭包仅通过不可变引用捕获了 list,因为这是打印列表所需的最少的访问权限。这个例子中,尽管闭包体依然只需要不可变引用,我们还是在闭包定义前写上 move 关键字,以确保 list 被移动到闭包中。新线程可能在主线程剩余部分执行完前执行完,也可能在主线程执行完之后执行完。如果主线程维护了 list 的所有权但却在新线程之前结束并且丢弃了 list,则在线程中的不可变引用将失效。因此,编译器要求 list 被移动到在新线程中运行的闭包中,这样引用就是有效的。试着移除 move 关键字,或者在闭包定义后在主线程中使用 list,看看你会得到什么编译器报错!

    +

    + +

    +

    将被捕获的值移出闭包和 Fn trait

    +

    一旦闭包捕获了定义它的环境中的某个值的引用或所有权(也就影响了什么会被移 闭包,如有),闭包体中的代码则决定了在稍后执行闭包时,这些引用或值将如何处理(也就影响了什么会被移 闭包,如有)。闭包体可以执行以下任一操作:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获任何值。

    +

    闭包捕获和处理环境中的值的方式会影响闭包实现哪些 trait,而 trait 是函数和结构体指定它们可以使用哪些类型闭包的方式。根据闭包体如何处理这些值,闭包会自动、渐进地实现一个、两个或全部三个 Fn trait。

    +
      +
    1. FnOnce 适用于只能被调用一次的闭包。所有闭包至少都实现了这个 trait,因为所有闭包都能被调用。一个会将捕获的值从闭包体中移出的闭包只会实现 FnOnce trait,而不会实现其他 Fn 相关的 trait,因为它只能被调用一次。
    2. +
    3. FnMut 适用于不会将捕获的值移出闭包体,但可能会修改捕获值的闭包。这类闭包可以被调用多次。
    4. +
    5. Fn 适用于既不将捕获的值移出闭包体,也不修改捕获值的闭包,同时也包括不从环境中捕获任何值的闭包。这类闭包可以被多次调用而不会改变其环境,这在会多次并发调用闭包的场景中十分重要。
    6. +
    +

    让我们来看示例 13-1 中使用的在 Option<T> 上的 unwrap_or_else 方法的定义:

    +
    impl<T> Option<T> {
    +    pub fn unwrap_or_else<F>(self, f: F) -> T
    +    where
    +        F: FnOnce() -> T
    +    {
    +        match self {
    +            Some(x) => x,
    +            None => f(),
    +        }
    +    }
    +}
    +

    回忆一下,T 是表示 OptionSome 成员中的值的类型的泛型。类型 T 也是 unwrap_or_else 函数的返回值类型:举例来说,在 Option<String> 上调用 unwrap_or_else 会得到一个 String

    +

    接着注意到 unwrap_or_else 函数有额外的泛型参数 FF 是参数 f 的类型,f 是调用 unwrap_or_else 时提供的闭包。

    +

    泛型 F 的 trait bound 是 FnOnce() -> T,这意味着 F 必须能够被调用一次,没有参数并返回一个 T。在 trait bound 中使用 FnOnce 表示 unwrap_or_else 最多只会调用 f 一次。在 unwrap_or_else 的函数体中可以看到,如果 OptionSomef 不会被调用。如果 OptionNonef 将会被调用一次。由于所有的闭包都实现了 FnOnceunwrap_or_else 接受所有三种类型的闭包,十分灵活。

    +
    +

    注意:函数也可以实现所有的三种 Fn traits。如果我们要做的事情不需要从环境中捕获值,则可以在需要某种实现了 Fn trait 的东西时使用函数而不是闭包。举个例子,可以在 Option<Vec<T>> 的值上调用 unwrap_or_else(Vec::new),以便在值为 None 时获取一个新的空的 vector。

    +
    +

    现在让我们来看定义在 slice 上的标准库方法 sort_by_key,看看它与 unwrap_or_else 的区别,以及为什么 sort_by_key 使用 FnMut 而不是 FnOnce 作为 trait bound。这个闭包以一个 slice 中当前被考虑的元素的引用作为参数,并返回一个可以排序的 K 类型的值。当你想按照 slice 中每个元素的某个属性进行排序时,这个函数非常有用。在示例 13-7 中,我们有一个 Rectangle 实例的列表,并使用 sort_by_keyRectanglewidth 属性对它们从低到高排序:

    +

    文件名:src/main.rs

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +fn main() {
    +    let mut list = [
    +        Rectangle { width: 10, height: 1 },
    +        Rectangle { width: 3, height: 5 },
    +        Rectangle { width: 7, height: 12 },
    +    ];
    +
    +    list.sort_by_key(|r| r.width);
    +    println!("{list:#?}");
    +}
    +

    示例 13-7:使用 sort_by_key 对长方形按宽度排序

    +

    代码输出:

    +
    $ cargo run
    +   Compiling rectangles v0.1.0 (file:///projects/rectangles)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.41s
    +     Running `target/debug/rectangles`
    +[
    +    Rectangle {
    +        width: 3,
    +        height: 5,
    +    },
    +    Rectangle {
    +        width: 7,
    +        height: 12,
    +    },
    +    Rectangle {
    +        width: 10,
    +        height: 1,
    +    },
    +]
    +
    +

    sort_by_key 被定义为接收一个 FnMut 闭包的原因是它会多次调用这个闭包:对 slice 中的每个元素调用一次。闭包 |r| r.width 不捕获、修改或将任何东西移出它的环境,所以它满足 trait bound 的要求。

    +

    相比之下,示例 13-8 展示了一个只实现了 FnOnce trait 的闭包的例子,因为它从环境中移出了一个值。编译器不允许我们在 sort_by_key 中使用这个闭包:

    +

    文件名:src/main.rs

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +fn main() {
    +    let mut list = [
    +        Rectangle { width: 10, height: 1 },
    +        Rectangle { width: 3, height: 5 },
    +        Rectangle { width: 7, height: 12 },
    +    ];
    +
    +    let mut sort_operations = vec![];
    +    let value = String::from("closure called");
    +
    +    list.sort_by_key(|r| {
    +        sort_operations.push(value);
    +        r.width
    +    });
    +    println!("{list:#?}");
    +}
    +

    示例 13-8:尝试在 sort_by_key 上使用一个 FnOnce 闭包

    +

    这是一个刻意构造的、复杂且无效的方式,试图统计在对 list 进行排序时 sort_by_key 调用闭包的次数。该代码试图通过将闭包环境中的 value(一个 String)插入 sort_operations vector 来实现计数。闭包捕获了 value,然后通过将 value 的所有权转移给 sort_operations vector 的方式将其移出闭包。这个闭包只能被调用一次;尝试第二次调用它将无法工作,因为这时 value 已经不在闭包的环境中,无法被再次插入 sort_operations 中!因而,这个闭包只实现了 FnOnce。当我们尝试编译此代码时,会出现错误提示:value 不能从闭包中移出,因为闭包必须实现 FnMut

    +
    $ cargo run
    +   Compiling rectangles v0.1.0 (file:///projects/rectangles)
    +error[E0507]: cannot move out of `value`, a captured variable in an `FnMut` closure
    +  --> src/main.rs:18:30
    +   |
    +15 |     let value = String::from("closure called");
    +   |         ----- captured outer variable
    +16 |
    +17 |     list.sort_by_key(|r| {
    +   |                      --- captured by this `FnMut` closure
    +18 |         sort_operations.push(value);
    +   |                              ^^^^^ move occurs because `value` has type `String`, which does not implement the `Copy` trait
    +   |
    +help: consider cloning the value if the performance cost is acceptable
    +   |
    +18 |         sort_operations.push(value.clone());
    +   |                                   ++++++++
    +
    +For more information about this error, try `rustc --explain E0507`.
    +error: could not compile `rectangles` (bin "rectangles") due to 1 previous error
    +
    +

    报错指向了闭包体中将 value 移出环境的那一行。要修复此问题,我们需要修改闭包体,使其不会将值移出环境。在环境中维护一个计数器,并在闭包体中递增其值,是计算闭包被调用次数的一个更简单直接的方法。示例 13-9 中的闭包可以在 sort_by_key 中使用,因为它只捕获了 num_sort_operations 计数器的可变引用,因此可以被多次调用:

    +

    文件名:src/main.rs

    +
    #[derive(Debug)]
    +struct Rectangle {
    +    width: u32,
    +    height: u32,
    +}
    +
    +fn main() {
    +    let mut list = [
    +        Rectangle { width: 10, height: 1 },
    +        Rectangle { width: 3, height: 5 },
    +        Rectangle { width: 7, height: 12 },
    +    ];
    +
    +    let mut num_sort_operations = 0;
    +    list.sort_by_key(|r| {
    +        num_sort_operations += 1;
    +        r.width
    +    });
    +    println!("{list:#?}, sorted in {num_sort_operations} operations");
    +}
    +

    示例 13-9:允许在 sort_by_key 上使用一个 FnMut 闭包

    +

    当定义或使用涉及闭包的函数或类型时,Fn traits 十分重要。在下个小节中,我们将讨论迭代器。许多迭代器方法都接收闭包参数,因此在继续前,请记住这些闭包的细节!

    +

    使用迭代器处理元素序列

    +
    +

    ch13-02-iterators.md +
    +commit eabaaaa90ee6937db3690dc56f739116be55ecb2

    +
    +

    迭代器模式允许你依次对一个序列中的项执行某些操作。迭代器iterator)负责遍历序列中的每一项并确定序列何时结束的逻辑。使用迭代器时,你无需自己重新实现这些逻辑。

    +

    在 Rust 中,迭代器是 惰性的lazy),这意味着在调用消费迭代器的方法之前不会执行任何操作。例如,示例 13-10 中的代码通过调用定义于 Vec<T> 上的 iter 方法在一个 vector v1 上创建了一个迭代器。这段代码本身并没有执行任何有用的操作。

    +
    fn main() {
    +    let v1 = vec![1, 2, 3];
    +
    +    let v1_iter = v1.iter();
    +}
    +

    示例 13-10:创建一个迭代器

    +

    迭代器被储存在 v1_iter 变量中。一旦创建迭代器之后,可以选择用多种方式利用它。在第三章的示例 3-5 中,我们使用 for 循环来遍历一个数组并在每一个项上执行了一些代码。在底层它隐式地创建并接着消费了一个迭代器,不过直到现在我们都一笔带过了它具体是如何工作的。

    +

    示例 13-11 中的例子将迭代器的创建和 for 循环中的使用分开。当 for 循环使用 v1_iter 中的迭代器时,迭代器中的每一个元素都会用于循环的一次迭代,并打印出每个值。

    +
    fn main() {
    +    let v1 = vec![1, 2, 3];
    +
    +    let v1_iter = v1.iter();
    +
    +    for val in v1_iter {
    +        println!("Got: {val}");
    +    }
    +}
    +

    示例 13-11:在一个 for 循环中使用迭代器

    +

    在标准库中没有提供迭代器的语言中,我们可能会使用一个从 0 开始的索引变量,使用这个变量索引 vector 中的值,并循环增加其值直到达到 vector 中的元素总量。

    +

    迭代器为我们处理了所有这些逻辑,这减少了重复代码并消除了潜在的混乱。另外,迭代器的实现方式提供了对多种不同的序列使用相同逻辑的灵活性,而不仅仅是像 vector 这样可索引的数据结构。让我们看看迭代器是如何做到这些的。

    +

    Iterator trait 和 next 方法

    +

    迭代器都实现了一个叫做 Iterator 的定义于标准库的 trait。这个 trait 的定义看起来像这样:

    +
    #![allow(unused)]
    +fn main() {
    +pub trait Iterator {
    +    type Item;
    +
    +    fn next(&mut self) -> Option<Self::Item>;
    +
    +    // 此处省略了方法的默认实现
    +}
    +}
    +

    注意这里有一个我们还未讲到的新语法:type ItemSelf::Item,它们定义了 trait 的 关联类型associated type)。第二十章会深入讲解关联类型,不过现在只需知道这段代码表明实现 Iterator trait 要求同时定义一个 Item 类型,这个 Item 类型被用作 next 方法的返回值类型。换句话说,Item 类型将是迭代器返回元素的类型。

    +

    nextIterator 实现者被要求定义的唯一方法:next 方法,该方法每次返回迭代器中的一个项,封装在 Some 中,并且当迭代完成时,返回 None

    +

    可以直接调用迭代器的 next 方法;示例 13-12 展示了对由 vector 创建的迭代器重复调用 next 方法时返回的值。

    +

    文件名:src/lib.rs

    +
    #[cfg(test)]
    +mod tests {
    +    #[test]
    +    fn iterator_demonstration() {
    +        let v1 = vec![1, 2, 3];
    +
    +        let mut v1_iter = v1.iter();
    +
    +        assert_eq!(v1_iter.next(), Some(&1));
    +        assert_eq!(v1_iter.next(), Some(&2));
    +        assert_eq!(v1_iter.next(), Some(&3));
    +        assert_eq!(v1_iter.next(), None);
    +    }
    +}
    +

    示例 13-12:在迭代器上(直接)调用 next 方法

    +

    注意我们需要将 v1_iter 声明为可变的:在迭代器上调用 next 方法会改变迭代器内部的状态,该状态用于跟踪迭代器在序列中的位置。换句话说,代码 消费(consume)了,或者说用尽了迭代器。每一次 next 调用都会从迭代器中消费一个项。使用 for 循环时无需使 v1_iter 可变因为 for 循环会获取 v1_iter 的所有权并在后台使 v1_iter 可变。

    +

    还需要注意的是,从 next 调用中获取的值是对 vector 中值的不可变引用。iter 方法生成一个不可变引用的迭代器。如果我们需要一个获取 v1 所有权并返回拥有所有权的迭代器,则可以调用 into_iter 而不是 iter。类似地,如果我们希望迭代可变引用,可以调用 iter_mut 而不是 iter

    +

    消费迭代器的方法

    +

    Iterator trait 有一系列不同的由标准库提供默认实现的方法;你可以在 Iterator trait 的标准库 API 文档中找到所有这些方法。一些方法在其定义中调用了 next 方法,这也就是为什么在实现 Iterator trait 时要求实现 next 方法的原因。

    +

    这些调用 next 方法的方法被称为 消费适配器consuming adaptors),因为调用它们会消耗迭代器。一个消费适配器的例子是 sum 方法。这个方法获取迭代器的所有权并反复调用 next 来遍历迭代器,因而会消费迭代器。在遍历过程中,它将每个项累加到一个总和中,并在迭代完成时返回这个总和。示例 13-13 有一个展示 sum 方法使用的测试:

    +

    文件名:src/lib.rs

    +
    #[cfg(test)]
    +mod tests {
    +    #[test]
    +    fn iterator_sum() {
    +        let v1 = vec![1, 2, 3];
    +
    +        let v1_iter = v1.iter();
    +
    +        let total: i32 = v1_iter.sum();
    +
    +        assert_eq!(total, 6);
    +    }
    +}
    +

    示例 13-13:调用 sum 方法获取迭代器所有项的总和

    +

    调用 sum 之后不再允许使用 v1_iter 因为调用 sum 时它会获取迭代器的所有权。

    +

    产生其他迭代器的方法

    +

    Iterator trait 中定义了另一类方法,被称为 迭代器适配器iterator adaptors),它们不会消耗当前的迭代器,而是通过改变原始迭代器的某些方面来生成不同的迭代器。

    +

    示例 13-14 展示了一个调用迭代器适配器方法 map 的例子,该方法使用一个闭包对每个元素进行操作。map 方法返回一个新的迭代器,该迭代器生成经过修改的元素。这里的闭包创建了一个新的迭代器,其中 vector 中的每个元素都被加 1。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let v1: Vec<i32> = vec![1, 2, 3];
    +
    +    v1.iter().map(|x| x + 1);
    +}
    +

    示例 13-14:调用迭代器适配器 map 来创建一个新迭代器

    +

    不过这些代码会产生一个警告:

    +
    $ cargo run
    +   Compiling iterators v0.1.0 (file:///projects/iterators)
    +warning: unused `Map` that must be used
    + --> src/main.rs:4:5
    +  |
    +4 |     v1.iter().map(|x| x + 1);
    +  |     ^^^^^^^^^^^^^^^^^^^^^^^^
    +  |
    +  = note: iterators are lazy and do nothing unless consumed
    +  = note: `#[warn(unused_must_use)]` on by default
    +help: use `let _ = ...` to ignore the resulting value
    +  |
    +4 |     let _ = v1.iter().map(|x| x + 1);
    +  |     +++++++
    +
    +warning: `iterators` (bin "iterators") generated 1 warning
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.47s
    +     Running `target/debug/iterators`
    +
    +

    示例 13-14 中的代码实际上并没有做任何事;所指定的闭包从未被调用过。警告提醒了我们原因所在:迭代器适配器是惰性的,因此我们需要在此处消费迭代器。

    +

    为了修复这个警告并消费迭代器,我们将使用第十二章示例 12-1 结合 env::args 使用的 collect 方法。这个方法消费迭代器并将结果收集到一个集合数据类型中。

    +

    在示例 13-15 中,我们将遍历由 map 调用生成的迭代器结果收集到一个 vector 中。这个 vector 将包含原始 vector 中每个元素加 1 的结果。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let v1: Vec<i32> = vec![1, 2, 3];
    +
    +    let v2: Vec<_> = v1.iter().map(|x| x + 1).collect();
    +
    +    assert_eq!(v2, vec![2, 3, 4]);
    +}
    +

    示例 13-15:调用 map 方法创建一个新迭代器,接着调用 collect 方法消费新迭代器并创建一个 vector

    +

    由于 map 接受一个闭包,因此我们可以指定希望在每个元素上执行的任何操作。这是一个很好的例子,展示了如何通过闭包来自定义某些行为,同时复用 Iterator trait 提供的迭代行为。

    +

    可以链式调用多个迭代器适配器来以一种可读的方式进行复杂的操作。不过因为所有的迭代器都是惰性的,你必须调用一个消费适配器方法,才能从这些迭代器适配器的调用中获取结果。

    +

    使用捕获其环境的闭包

    +

    很多迭代器适配器接受闭包作为参数,而我们通常会指定捕获其环境的闭包作为迭代器适配器的参数。

    +

    作为一个例子,我们使用 filter 方法来获取一个闭包。该闭包从迭代器中获取一项并返回一个 bool。如果闭包返回 true,其值将会包含在 filter 提供的新迭代器中。如果闭包返回 false,其值不会被包含。

    +

    示例 13-16 中使用 filter 和一个捕获环境中变量 shoe_size 的闭包来遍历一个 Shoe 结构体集合。它只会返回指定鞋码的鞋子。

    +

    文件名:src/lib.rs

    +
    #[derive(PartialEq, Debug)]
    +struct Shoe {
    +    size: u32,
    +    style: String,
    +}
    +
    +fn shoes_in_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> {
    +    shoes.into_iter().filter(|s| s.size == shoe_size).collect()
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn filters_by_size() {
    +        let shoes = vec![
    +            Shoe {
    +                size: 10,
    +                style: String::from("sneaker"),
    +            },
    +            Shoe {
    +                size: 13,
    +                style: String::from("sandal"),
    +            },
    +            Shoe {
    +                size: 10,
    +                style: String::from("boot"),
    +            },
    +        ];
    +
    +        let in_my_size = shoes_in_size(shoes, 10);
    +
    +        assert_eq!(
    +            in_my_size,
    +            vec![
    +                Shoe {
    +                    size: 10,
    +                    style: String::from("sneaker")
    +                },
    +                Shoe {
    +                    size: 10,
    +                    style: String::from("boot")
    +                },
    +            ]
    +        );
    +    }
    +}
    +

    示例 13-16:使用 filter 方法和一个捕获 shoe_size 的闭包

    +

    shoes_in_size 函数获取一个鞋子 vector 的所有权和一个鞋码作为参数。它返回一个只包含指定鞋码的鞋子的 vector。

    +

    shoes_in_size 函数体中调用了 into_iter 来创建一个获取 vector 所有权的迭代器。接着调用 filter 将这个迭代器适配成一个只含有那些闭包返回 true 的元素的新迭代器。

    +

    闭包从环境中捕获了 shoe_size 变量并使用其值与每一只鞋的大小作比较,只保留指定鞋码的鞋子。最终,调用 collect 将迭代器适配器返回的值收集进一个 vector 并返回。

    +

    这个测试展示当调用 shoes_in_size 时,返回的只会是与我们指定的鞋码相同的鞋子。

    +

    改进 I/O 项目

    +
    +

    ch13-03-improving-our-io-project.md +
    +commit 2cd1b5593d26dc6a03c20f8619187ad4b2485552

    +
    +

    掌握了这些关于迭代器的新知识后,我们可以使用迭代器来改进第十二章中 I/O 项目的实现来使得代码更简洁明了。接下来,让我们看看迭代器如何改进 Config::build 函数和 search 函数的实现。

    +

    使用迭代器去除 clone

    +

    在示例 12-6 中,我们增加了一些代码获取一个 String 类型的 slice 并创建一个 Config 结构体的实例,它们索引 slice 中的值并克隆这些值以便 Config 结构体可以拥有这些值。在示例 13-17 中重现了第十二章结尾示例 12-23 中 Config::build 函数的实现:

    +

    文件名:src/lib.rs

    +
    use std::env;
    +use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +    pub ignore_case: bool,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        let ignore_case = env::var("IGNORE_CASE").is_ok();
    +
    +        Ok(Config {
    +            query,
    +            file_path,
    +            ignore_case,
    +        })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    let results = if config.ignore_case {
    +        search_case_insensitive(&config.query, &contents)
    +    } else {
    +        search(&config.query, &contents)
    +    };
    +
    +    for line in results {
    +        println!("{line}");
    +    }
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.contains(query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +pub fn search_case_insensitive<'a>(
    +    query: &str,
    +    contents: &'a str,
    +) -> Vec<&'a str> {
    +    let query = query.to_lowercase();
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.to_lowercase().contains(&query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn case_sensitive() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Duct tape.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +
    +    #[test]
    +    fn case_insensitive() {
    +        let query = "rUsT";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Trust me.";
    +
    +        assert_eq!(
    +            vec!["Rust:", "Trust me."],
    +            search_case_insensitive(query, contents)
    +        );
    +    }
    +}
    +

    示例 13-17:重现示例 12-23 的 Config::build 函数

    +

    当时我们说过不必担心低效的 clone 调用,因为我们以后会将其移除。好吧,就是现在!

    +

    起初这里需要 clone 的原因是参数 args 中有一个 String 元素的 slice,而 build 函数并不拥有 args。为了能够返回 Config 实例的所有权,我们需要克隆 Config 中字段 queryfile_path 的值,这样 Config 实例就能拥有这些值。

    +

    在学习了迭代器之后,我们可以将 build 函数改为获取一个有所有权的迭代器作为参数,而不是借用 slice。我们将使用迭代器功能代替之前检查 slice 长度和索引特定位置的代码。这样可以更清晰地表达 Config::build 函数的操作,因为迭代器会负责访问这些值。

    +

    一旦 Config::build 获取了迭代器的所有权并不再使用借用的索引操作,就可以将迭代器中的 String 值移动到 Config 中,而不是调用 clone 分配新的空间。

    +

    直接使用返回的迭代器

    +

    打开 I/O 项目的 src/main.rs 文件,它看起来应该像这样:

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::process;
    +
    +use minigrep::Config;
    +
    +fn main() {
    +    let args: Vec<String> = env::args().collect();
    +
    +    let config = Config::build(&args).unwrap_or_else(|err| {
    +        eprintln!("Problem parsing arguments: {err}");
    +        process::exit(1);
    +    });
    +
    +    // --snip--
    +
    +    if let Err(e) = minigrep::run(config) {
    +        eprintln!("Application error: {e}");
    +        process::exit(1);
    +    }
    +}
    +

    首先我们修改第十二章结尾示例 12-24 中的 main 函数的开头为示例 13-18 中的代码。在更新 Config::build 之前这些代码还不能编译:

    +

    文件名:src/main.rs

    +
    use std::env;
    +use std::process;
    +
    +use minigrep::Config;
    +
    +fn main() {
    +    let config = Config::build(env::args()).unwrap_or_else(|err| {
    +        eprintln!("Problem parsing arguments: {err}");
    +        process::exit(1);
    +    });
    +
    +    // --snip--
    +
    +    if let Err(e) = minigrep::run(config) {
    +        eprintln!("Application error: {e}");
    +        process::exit(1);
    +    }
    +}
    +

    示例 13-25:将 env::args 的返回值传递给 Config::build

    +

    env::args 函数返回一个迭代器!不同于将迭代器的值收集到一个 vector 中接着传递一个 slice 给 Config::build,现在我们直接将 env::args 返回的迭代器的所有权传递给 Config::build

    +

    接下来需要更新 Config::build 的定义。在 I/O 项目的 src/lib.rs 中,将 Config::build 的签名改为如示例 13-19 所示。这仍然不能编译因为我们还需更新函数体。

    +

    文件名:src/lib.rs

    +
    use std::env;
    +use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +    pub ignore_case: bool,
    +}
    +
    +impl Config {
    +    pub fn build(
    +        mut args: impl Iterator<Item = String>,
    +    ) -> Result<Config, &'static str> {
    +        // --snip--
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        let ignore_case = env::var("IGNORE_CASE").is_ok();
    +
    +        Ok(Config {
    +            query,
    +            file_path,
    +            ignore_case,
    +        })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    let results = if config.ignore_case {
    +        search_case_insensitive(&config.query, &contents)
    +    } else {
    +        search(&config.query, &contents)
    +    };
    +
    +    for line in results {
    +        println!("{line}");
    +    }
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.contains(query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +pub fn search_case_insensitive<'a>(
    +    query: &str,
    +    contents: &'a str,
    +) -> Vec<&'a str> {
    +    let query = query.to_lowercase();
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.to_lowercase().contains(&query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn case_sensitive() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Duct tape.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +
    +    #[test]
    +    fn case_insensitive() {
    +        let query = "rUsT";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Trust me.";
    +
    +        assert_eq!(
    +            vec!["Rust:", "Trust me."],
    +            search_case_insensitive(query, contents)
    +        );
    +    }
    +}
    +

    示例 13-19:以迭代器作为参数更新 Config::build 的签名

    +

    env::args 函数的标准库文档显示,它返回的迭代器的类型为 std::env::Args,并且这个类型实现了 Iterator trait 并返回 String 值。

    +

    我们已经更新了 Config::build 函数的签名,因此参数 args 有一个带有 trait bounds impl Iterator<Item = String> 的泛型类型,而不是 &[String]。这里用到了第十章 “trait 作为参数” 部分讨论过的 impl Trait 语法,这意味着 args 可以是任何实现了 Iterator trait 并返回 String 项(item)的类型。

    +

    由于我们获取了 args 的所有权,并且将通过迭代来修改 args,因此我们可以在 args 参数的声明中添加 mut 关键字,使其可变。

    +

    使用 Iterator trait 代替索引

    +

    接下来,我们将修改 Config::build 的函数体。因为 args 实现了 Iterator trait,因此我们知道可以对其调用 next 方法!示例 13-20 更新了示例 12-23 中的代码,以使用 next 方法:

    +

    文件名:src/lib.rs

    +
    use std::env;
    +use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +    pub ignore_case: bool,
    +}
    +
    +impl Config {
    +    pub fn build(
    +        mut args: impl Iterator<Item = String>,
    +    ) -> Result<Config, &'static str> {
    +        args.next();
    +
    +        let query = match args.next() {
    +            Some(arg) => arg,
    +            None => return Err("Didn't get a query string"),
    +        };
    +
    +        let file_path = match args.next() {
    +            Some(arg) => arg,
    +            None => return Err("Didn't get a file path"),
    +        };
    +
    +        let ignore_case = env::var("IGNORE_CASE").is_ok();
    +
    +        Ok(Config {
    +            query,
    +            file_path,
    +            ignore_case,
    +        })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    let results = if config.ignore_case {
    +        search_case_insensitive(&config.query, &contents)
    +    } else {
    +        search(&config.query, &contents)
    +    };
    +
    +    for line in results {
    +        println!("{line}");
    +    }
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.contains(query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +pub fn search_case_insensitive<'a>(
    +    query: &str,
    +    contents: &'a str,
    +) -> Vec<&'a str> {
    +    let query = query.to_lowercase();
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.to_lowercase().contains(&query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn case_sensitive() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Duct tape.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +
    +    #[test]
    +    fn case_insensitive() {
    +        let query = "rUsT";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Trust me.";
    +
    +        assert_eq!(
    +            vec!["Rust:", "Trust me."],
    +            search_case_insensitive(query, contents)
    +        );
    +    }
    +}
    +

    示例 13-20:修改 Config::build 的函数体来使用迭代器方法

    +

    请记住 env::args 返回值的第一个值是程序的名称。我们希望忽略它并获取下一个值,所以首先调用 next 且不对其返回值做任何操作。然后,我们再次调用 next 来获取要放入 Config 结构体的 query 字段的值。如果 next 返回 Some,使用 match 来提取其值。如果它返回 None,则意味着没有提供足够的参数并通过 Err 值提早返回。我们对对 file_path 的值也进行同样的操作。

    +

    使用迭代器适配器来使代码更简明

    +

    I/O 项目中其他可以利用迭代器的地方是 search 函数,示例 13-21 中重现了第十二章结尾示例 12-19 中此函数的定义:

    +

    文件名:src/lib.rs

    +
    use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +}
    +
    +impl Config {
    +    pub fn build(args: &[String]) -> Result<Config, &'static str> {
    +        if args.len() < 3 {
    +            return Err("not enough arguments");
    +        }
    +
    +        let query = args[1].clone();
    +        let file_path = args[2].clone();
    +
    +        Ok(Config { query, file_path })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.contains(query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn one_result() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +}
    +

    示例 13-21:示例 12-19 中 search 函数的定义

    +

    可以通过使用迭代器适配器方法来编写更简明的代码。这样做还可以避免使用一个可变的中间 results vector。函数式编程风格倾向于最小化可变状态的数量来使代码更简洁。去除可变状态可能会使未来的并行搜索优化变得更容易,因为我们不必管理对 results vector 的并发访问。示例 13-22 展示了这一变化:

    +

    文件名:src/lib.rs

    +
    use std::env;
    +use std::error::Error;
    +use std::fs;
    +
    +pub struct Config {
    +    pub query: String,
    +    pub file_path: String,
    +    pub ignore_case: bool,
    +}
    +
    +impl Config {
    +    pub fn build(
    +        mut args: impl Iterator<Item = String>,
    +    ) -> Result<Config, &'static str> {
    +        args.next();
    +
    +        let query = match args.next() {
    +            Some(arg) => arg,
    +            None => return Err("Didn't get a query string"),
    +        };
    +
    +        let file_path = match args.next() {
    +            Some(arg) => arg,
    +            None => return Err("Didn't get a file path"),
    +        };
    +
    +        let ignore_case = env::var("IGNORE_CASE").is_ok();
    +
    +        Ok(Config {
    +            query,
    +            file_path,
    +            ignore_case,
    +        })
    +    }
    +}
    +
    +pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    +    let contents = fs::read_to_string(config.file_path)?;
    +
    +    let results = if config.ignore_case {
    +        search_case_insensitive(&config.query, &contents)
    +    } else {
    +        search(&config.query, &contents)
    +    };
    +
    +    for line in results {
    +        println!("{line}");
    +    }
    +
    +    Ok(())
    +}
    +
    +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    +    contents
    +        .lines()
    +        .filter(|line| line.contains(query))
    +        .collect()
    +}
    +
    +pub fn search_case_insensitive<'a>(
    +    query: &str,
    +    contents: &'a str,
    +) -> Vec<&'a str> {
    +    let query = query.to_lowercase();
    +    let mut results = Vec::new();
    +
    +    for line in contents.lines() {
    +        if line.to_lowercase().contains(&query) {
    +            results.push(line);
    +        }
    +    }
    +
    +    results
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn case_sensitive() {
    +        let query = "duct";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Duct tape.";
    +
    +        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    +    }
    +
    +    #[test]
    +    fn case_insensitive() {
    +        let query = "rUsT";
    +        let contents = "\
    +Rust:
    +safe, fast, productive.
    +Pick three.
    +Trust me.";
    +
    +        assert_eq!(
    +            vec!["Rust:", "Trust me."],
    +            search_case_insensitive(query, contents)
    +        );
    +    }
    +}
    +

    示例 13-22:在 search 函数实现中使用迭代器适配器

    +

    回忆一下,search 函数的目的是返回所有 contents 中包含 query 的行。类似于示例 13-16 中的 filter 例子,这段代码使用 filter 适配器来保留 line.contains(query) 返回 true 的行。接着使用 collect 将匹配行收集到另一个 vector 中。这样就容易多了!尝试对 search_case_insensitive 函数做出同样的使用迭代器方法的修改吧。

    +

    选择循环或迭代器

    +

    接下来的逻辑问题就是在代码中应该选择哪种风格,以及原因:是使用示例 13-21 中的原始实现还是使用示例 13-22 中使用迭代器的版本?大部分 Rust 程序员倾向于使用迭代器风格。开始这有点难以掌握,不过一旦你对不同迭代器的工作方式有了感觉之后,迭代器反而更容易理解。相比摆弄不同的循环并创建新 vector,(迭代器)代码则更关注循环的高层次目的。这抽象掉那些老生常谈的代码,这样就更容易看清代码所特有的概念,比如迭代器中每个元素必须满足的过滤条件。

    +

    不过这两种实现真的完全等价吗?直觉上的假设是更底层的循环会更快一些。让我们聊聊性能吧。

    +

    性能对比:循环 VS 迭代器

    +
    +

    ch13-04-performance.md +
    +commit 009fffa4580ffb175f1b8470b5b12e4a63d670e4

    +
    +

    为了决定是否使用循环或迭代器,你需要了解哪个实现更快:使用显式 for 循环的 search 函数版本,还是使用迭代器的版本。

    +

    我们进行了一个基准测试,将阿瑟·柯南·道尔的《福尔摩斯探案集》的全部内容加载到一个 String 中,并在内容中查找单词 “the”。以下是使用 for 循环版本和使用迭代器版本的 search 函数的基准测试结果:

    +
    test bench_search_for  ... bench:  19,620,300 ns/iter (+/- 915,700)
    +test bench_search_iter ... bench:  19,234,900 ns/iter (+/- 657,200)
    +
    +

    结果迭代器版本还要稍微快一点!这里我们不会解释性能测试的代码,我们的目的并不是为了证明它们是完全等同的,而是得出一个怎样比较这两种实现方式性能的基本思路。

    +

    对于一个更全面的性能测试,你应该使用不同大小的文本作为 contents,不同的单词以及长度各异的单词作为 query,以及各种其他变化进行检查。关键在于:迭代器,作为一个高级的抽象,被编译成了与手写的底层代码大体一致性能的代码。迭代器是 Rust 的 零成本抽象zero-cost abstractions)之一,它意味着抽象并不会引入额外的运行时开销,它与本贾尼·斯特劳斯特卢普(C++ 的设计和实现者)在 “Foundations of C++”(2012)中所定义的 零开销zero-overhead)如出一辙:

    +
    +

    In general, C++ implementations obey the zero-overhead principle: What you don't use, you don't pay for. And further: What you do use, you couldn't hand code any better.

    +
      +
    • Bjarne Stroustrup "Foundations of C++"
    • +
    +

    从整体来说,C++ 的实现遵循了零开销原则:你不需要的,无需为它买单。更有甚者的是:你需要的时候,也无法通过手写代码做得更好。

    +
      +
    • 本贾尼·斯特劳斯特卢普 "Foundations of C++"
    • +
    +
    +

    作为另一个例子,以下代码取自一个音频解码器。解码算法使用线性预测数学运算(linear prediction mathematical operation)来根据之前样本的线性函数预测将来的值。这些代码使用迭代器链对作用域中的三个变量进行某种数学计算:一个叫 buffer 的数据 slice、一个有 12 个元素的数组 coefficients、和一个代表位数据位移量的 qlp_shift。我们在这个例子中声明了这些变量,但没有为它们赋值;虽然这些代码在其上下文之外没有太多意义,不过仍是一个简明的现实例子,来展示 Rust 如何将高级概念转换为底层代码。

    +
    let buffer: &mut [i32];
    +let coefficients: [i64; 12];
    +let qlp_shift: i16;
    +
    +for i in 12..buffer.len() {
    +    let prediction = coefficients.iter()
    +                                 .zip(&buffer[i - 12..i])
    +                                 .map(|(&c, &s)| c * s as i64)
    +                                 .sum::<i64>() >> qlp_shift;
    +    let delta = buffer[i];
    +    buffer[i] = prediction as i32 + delta;
    +}
    +

    为了计算 prediction 的值,这段代码遍历了 coefficients 中的 12 个值,使用 zip 方法将系数与 buffer 的前 12 个值组合在一起。接着将每一对值相乘,再将所有结果相加,然后将总和右移 qlp_shift 位。

    +

    像音频解码器这样的程序通常最看重计算的性能。这里,我们创建了一个迭代器,使用了两个适配器,接着消费了其值。那么这段 Rust 代码将会被编译为什么样的汇编代码呢?好吧,在编写本书的这个时候,它被编译成与手写的相同的汇编代码。遍历 coefficients 的值完全用不到循环:Rust 知道这里会迭代 12 次,所以它“展开”(unroll)了循环。展开是一种将循环迭代转换为重复代码,并移除循环控制代码开销的代码优化技术。

    +

    所有的系数都被储存在了寄存器中,这意味着访问它们非常快。这里也没有运行时数组访问边界检查。所有这些 Rust 能够提供的优化使得结果代码极为高效。现在你知道了这些,请放心大胆的使用迭代器和闭包吧!它们使得代码看起来更高级,但并不为此引入运行时性能损失。

    +

    总结

    +

    闭包和迭代器是 Rust 受函数式编程语言观念所启发的功能。它们对 Rust 以高性能来明确的表达高级概念的能力有很大贡献。闭包和迭代器的实现达到了不影响运行时性能的程度。这正是 Rust 致力于提供零成本抽象的目标的一部分。

    +

    现在我们改进了 I/O 项目的(代码)表现力,那么让我们来看看 cargo 的更多功能,这些功能将帮助我们将项目分享给全世界。

    +

    进一步认识 Cargo 和 Crates.io

    +
    +

    ch14-00-more-about-cargo.md +
    +commit 44e31f9f304e0cd9ace01045d17a2aa01a449528

    +
    +

    目前为止我们只使用过 Cargo 构建、运行和测试代码这些最基本的功能,不过它还可以做到更多。本章会讨论 Cargo 其他一些更为高级的功能,我们将展示如何:

    +
      +
    • 使用发布配置来自定义构建
    • +
    • 将库发布到 crates.io
    • +
    • 使用工作空间来组织更大的项目
    • +
    • crates.io 安装二进制文件
    • +
    • 使用自定义的命令来扩展 Cargo
    • +
    +

    Cargo 的功能不止本章所介绍的,关于其全部功能的详尽解释,请查看 文档

    +

    采用发布配置自定义构建

    +
    +

    ch14-01-release-profiles.md +
    +commit 44e31f9f304e0cd9ace01045d17a2aa01a449528

    +
    +

    在 Rust 中 发布配置release profiles)文件是预定义和可定制的,它们包含不同的配置,允许程序员更灵活地控制代码编译的多种选项。每一个配置都相互独立。

    +

    Cargo 有两个主要的配置:运行 cargo build 时采用的 dev 配置和运行 cargo build --releaserelease 配置。dev 配置为开发定义了良好的默认配置,release 配置则为发布构建定义了良好的默认配置。

    +

    这些配置名称可能很眼熟,因为它们出现在构建的输出中:

    +
    $ cargo build
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.0s
    +$ cargo build --release
    +    Finished release [optimized] target(s) in 0.0s
    +
    +

    构建输出中的 devrelease 表明编译器在使用不同的配置。

    +

    当项目的 Cargo.toml 文件中没有显式增加任何 [profile.*] 部分的时候,Cargo 会对每一个配置都采用默认设置。通过增加任何希望定制的配置对应的 [profile.*] 部分,我们可以选择覆盖任意默认设置的子集。例如,如下是 devrelease 配置的 opt-level 设置的默认值:

    +

    文件名:Cargo.toml

    +
    [profile.dev]
    +opt-level = 0
    +
    +[profile.release]
    +opt-level = 3
    +
    +

    opt-level 设置控制 Rust 会对代码进行何种程度的优化。这个配置的值从 0 到 3。越高的优化级别需要更多的时间编译,所以如果你在进行开发并经常编译,可能会希望在牺牲一些代码性能的情况下减少优化以便编译得快一些。因此 devopt-level 默认为 0。当你准备发布时,花费更多时间在编译上则更好。只需要在发布模式编译一次,而编译出来的程序则会运行很多次,所以发布模式用更长的编译时间换取运行更快的代码。这正是为什么 release 配置的 opt-level 默认为 3

    +

    我们可以选择通过在 Cargo.toml 增加不同的值来覆盖任何默认设置。比如,如果我们想要在开发配置中使用级别 1 的优化,则可以在 Cargo.toml 中增加这两行:

    +

    文件名:Cargo.toml

    +
    [profile.dev]
    +opt-level = 1
    +
    +

    这会覆盖默认的设置 0。现在运行 cargo build 时,Cargo 将会使用 dev 的默认配置加上定制的 opt-level。因为 opt-level 设置为 1,Cargo 会比默认进行更多的优化,但是没有发布构建那么多。

    +

    对于每个配置的设置和其默认值的完整列表,请查看 Cargo 的文档

    +

    将 crate 发布到 Crates.io

    +
    +

    ch14-02-publishing-to-crates-io.md
    +commit 3f2a6ef48943ade3e9c0eb23d69e2b8b41f057f1

    +
    +

    我们曾经在项目中使用 crates.io 上的包作为依赖,不过你也可以通过发布自己的包来向他人分享代码。crates.io 用来分发包的源代码,所以它主要托管开源代码。

    +

    Rust 和 Cargo 有一些帮助他人更方便地找到和使用你发布的包的功能。我们将介绍一些这样的功能,接着讲到如何发布一个包。

    +

    编写有用的文档注释

    +

    准确的包文档有助于其他用户理解如何以及何时使用它们,所以花一些时间编写文档是值得的。第三章中我们讨论了如何使用双斜杠 // 注释 Rust 代码。Rust 也有特定的用于文档的注释类型,通常被称为 文档注释documentation comments),它们会生成 HTML 文档。这些 HTML 展示公有 API 文档注释的内容,它们意在让对库感兴趣的程序员理解如何 使用 这个 crate,而不是它是如何被 实现 的。

    +

    文档注释使用三斜杠 /// 而不是双斜杠以支持 Markdown 注解来格式化文本。文档注释就位于需要文档的项的之前。示例 14-1 展示了一个 my_crate crate 中 add_one 函数的文档注释,

    +

    文件名:src/lib.rs

    +
    /// Adds one to the number given.
    +///
    +/// # Examples
    +///
    +/// ```
    +/// let arg = 5;
    +/// let answer = my_crate::add_one(arg);
    +///
    +/// assert_eq!(6, answer);
    +/// ```
    +pub fn add_one(x: i32) -> i32 {
    +    x + 1
    +}
    +

    示例 14-1:一个函数的文档注释

    +

    这里,我们提供了一个 add_one 函数工作的描述,接着开始了一个标题为 Examples 的部分,和展示如何使用 add_one 函数的代码。可以运行 cargo doc 来生成这个文档注释的 HTML 文档。这个命令运行由 Rust 分发的工具 rustdoc 并将生成的 HTML 文档放入 target/doc 目录。

    +

    为了方便起见,运行 cargo doc --open 会构建当前 crate 文档(同时还有所有 crate 依赖的文档)的 HTML 并在浏览器中打开。导航到 add_one 函数将会发现文档注释的文本是如何渲染的,如图 14-1 所示:

    +`my_crate` 的 `add_one` 函数所渲染的文档注释 HTML +

    图 14-1:add_one 函数的文档注释 HTML

    +

    常用(文档注释)部分

    +

    示例 14-1 中使用了 # Examples Markdown 标题在 HTML 中创建了一个以 “Examples” 为标题的部分。其他一些 crate 作者经常在文档注释中使用的部分有:

    +
      +
    • Panics:这个函数可能会 panic! 的场景。并不希望程序崩溃的函数调用者应该确保他们不会在这些情况下调用此函数。
    • +
    • Errors:如果这个函数返回 Result,此部分描述可能会出现何种错误以及什么情况会造成这些错误,这有助于调用者编写代码来采用不同的方式处理不同的错误。
    • +
    • Safety:如果这个函数使用 unsafe 代码(这会在第二十章讨论),这一部分应该会涉及到期望函数调用者支持的确保 unsafe 块中代码正常工作的不变条件(invariants)。
    • +
    +

    大部分文档注释不需要所有这些部分,不过这是一个提醒你检查调用你代码的用户有兴趣了解的内容的列表。

    +

    文档注释作为测试

    +

    在文档注释中增加示例代码块是一个清楚的表明如何使用库的方法,这么做还有一个额外的好处:cargo test 也会像测试那样运行文档中的示例代码!没有什么比有例子的文档更好的了,但最糟糕的莫过于写完文档后改动了代码,而导致例子不能正常工作。尝试 cargo test 运行像示例 14-1 中 add_one 函数的文档;应该在测试结果中看到像这样的部分:

    +
       Doc-tests my_crate
    +
    +running 1 test
    +test src/lib.rs - add_one (line 5) ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.27s
    +
    +

    现在尝试改变函数或例子来使例子中的 assert_eq! 产生 panic。再次运行 cargo test,你将会看到文档测试捕获到了例子与代码不再同步!

    +

    注释包含项的结构

    +

    文档注释风格 //! 为包含注释的项,而不是位于注释之后的项增加文档。这通常用于 crate 根文件(通常是 src/lib.rs)或模块的根文件为 crate 或模块整体提供文档。

    +

    作为一个例子,为了增加描述包含 add_one 函数的 my_crate crate 目的的文档,可以在 src/lib.rs 开头增加以 //! 开头的注释,如示例 14-2 所示:

    +

    文件名:src/lib.rs

    +
    //! # My Crate
    +//!
    +//! `my_crate` is a collection of utilities to make performing certain
    +//! calculations more convenient.
    +
    +/// Adds one to the number given.
    +// --snip--
    +///
    +/// # Examples
    +///
    +/// ```
    +/// let arg = 5;
    +/// let answer = my_crate::add_one(arg);
    +///
    +/// assert_eq!(6, answer);
    +/// ```
    +pub fn add_one(x: i32) -> i32 {
    +    x + 1
    +}
    +

    示例 14-2:my_crate crate 整体的文档

    +

    注意 //! 的最后一行之后没有任何代码。因为它们以 //! 开头而不是 ///,这是属于包含此注释的项而不是注释之后项的文档。在这个情况下时 src/lib.rs 文件,也就是 crate 根文件。这些注释描述了整个 crate。

    +

    如果运行 cargo doc --open,将会发现这些注释显示在 my_crate 文档的首页,位于 crate 中公有项列表之上,如图 14-2 所示:

    +crate 整体注释所渲染的 HTML 文档 +

    图 14-2:包含 my_crate 整体描述的注释所渲染的文档

    +

    位于项之中的文档注释对于描述 crate 和模块特别有用。使用它们描述其容器整体的目的来帮助 crate 用户理解你的代码组织。

    +

    使用 pub use 导出合适的公有 API

    +

    公有 API 的结构是你发布 crate 时主要需要考虑的。crate 用户没有你那么熟悉其结构,并且如果模块层级过大他们可能会难以找到所需的部分。

    +

    第七章介绍了如何使用 mod 关键字来将代码组织进模块中,如何使用 pub 关键字将项变为公有,和如何使用 use 关键字将项引入作用域。然而你开发时候使用的文件架构可能并不方便用户。你的结构可能是一个包含多个层级的分层结构,不过这对于用户来说并不方便。这是因为想要使用被定义在很深层级中的类型的人可能很难发现这些类型的存在。他们也可能会厌烦要使用 use my_crate::some_module::another_module::UsefulType; 而不是 use my_crate::UsefulType; 来使用类型。

    +

    好消息是,即使文件结构对于用户来说 不是 很方便,你也无需重新安排内部组织:你可以选择使用 pub use 重导出(re-export)项来使公有结构不同于私有结构。重导出获取位于一个位置的公有项并将其公开到另一个位置,好像它就定义在这个新位置一样。

    +

    例如,假设我们创建了一个描述美术信息的库 art。这个库中包含了一个有两个枚举 PrimaryColorSecondaryColor 的模块 kinds,以及一个包含函数 mix 的模块 utils,如示例 14-3 所示:

    +

    文件名:src/lib.rs

    +
    //! # Art
    +//!
    +//! A library for modeling artistic concepts.
    +
    +pub mod kinds {
    +    /// The primary colors according to the RYB color model.
    +    pub enum PrimaryColor {
    +        Red,
    +        Yellow,
    +        Blue,
    +    }
    +
    +    /// The secondary colors according to the RYB color model.
    +    pub enum SecondaryColor {
    +        Orange,
    +        Green,
    +        Purple,
    +    }
    +}
    +
    +pub mod utils {
    +    use crate::kinds::*;
    +
    +    /// Combines two primary colors in equal amounts to create
    +    /// a secondary color.
    +    pub fn mix(c1: PrimaryColor, c2: PrimaryColor) -> SecondaryColor {
    +        // --snip--
    +        unimplemented!();
    +    }
    +}
    +

    示例 14-3:一个库 art 其组织包含 kindsutils 模块

    +

    cargo doc 所生成的 crate 文档首页如图 14-3 所示:

    +包含 `kinds` 和 `utils` 模块的 `art` +

    图 14-3:包含 kindsutils 模块的库 art 的文档首页

    +

    注意 PrimaryColorSecondaryColor 类型、以及 mix 函数都没有在首页中列出。我们必须点击 kindsutils 才能看到它们。

    +

    另一个依赖这个库的 crate 需要 use 语句来导入 art 中的项,这包含指定其当前定义的模块结构。示例 14-4 展示了一个使用 art crate 中 PrimaryColormix 项的 crate 的例子:

    +

    文件名:src/main.rs

    +
    use art::kinds::PrimaryColor;
    +use art::utils::mix;
    +
    +fn main() {
    +    let red = PrimaryColor::Red;
    +    let yellow = PrimaryColor::Yellow;
    +    mix(red, yellow);
    +}
    +

    示例 14-4:一个通过导出内部结构使用 art crate 中项的 crate

    +

    示例 14-4 中使用 art crate 代码的作者不得不搞清楚 PrimaryColor 位于 kinds 模块而 mix 位于 utils 模块。art crate 的模块结构相比使用它的开发者来说对编写它的开发者更有意义。其内部结构并没有对尝试理解如何使用 art crate 的人提供任何有价值的信息,相反因为不得不搞清楚所需的内容在何处和必须在 use 语句中指定模块名称而显得混乱。

    +

    为了从公有 API 中去掉 crate 的内部组织,我们可以采用示例 14-3 中的 art crate 并增加 pub use 语句来重导出项到顶层结构,如示例 14-5 所示:

    +

    文件名:src/lib.rs

    +
    //! # Art
    +//!
    +//! A library for modeling artistic concepts.
    +
    +pub use self::kinds::PrimaryColor;
    +pub use self::kinds::SecondaryColor;
    +pub use self::utils::mix;
    +
    +pub mod kinds {
    +    // --snip--
    +    /// The primary colors according to the RYB color model.
    +    pub enum PrimaryColor {
    +        Red,
    +        Yellow,
    +        Blue,
    +    }
    +
    +    /// The secondary colors according to the RYB color model.
    +    pub enum SecondaryColor {
    +        Orange,
    +        Green,
    +        Purple,
    +    }
    +}
    +
    +pub mod utils {
    +    // --snip--
    +    use crate::kinds::*;
    +
    +    /// Combines two primary colors in equal amounts to create
    +    /// a secondary color.
    +    pub fn mix(c1: PrimaryColor, c2: PrimaryColor) -> SecondaryColor {
    +        SecondaryColor::Orange
    +    }
    +}
    +

    示例 14-5:增加 pub use 语句重导出项

    +

    现在此 crate 由 cargo doc 生成的 API 文档会在首页列出重导出的项以及其链接,如图 14-4 所示,这使得 PrimaryColorSecondaryColor 类型和 mix 函数更易于查找。

    +Rendered documentation for the `art` crate with the re-exports on the front page +

    图 14-10:art 文档的首页,这里列出了重导出的项

    +

    art crate 的用户仍然可以看见和选择使用示例 14-4 中的内部结构,或者可以使用示例 14-5 中更为方便的结构,如示例 14-6 所示:

    +

    文件名:src/main.rs

    +
    use art::mix;
    +use art::PrimaryColor;
    +
    +fn main() {
    +    // --snip--
    +    let red = PrimaryColor::Red;
    +    let yellow = PrimaryColor::Yellow;
    +    mix(red, yellow);
    +}
    +

    示例 14-6:一个使用 art crate 中重导出项的程序

    +

    对于有很多嵌套模块的情况,使用 pub use 将类型重导出到顶级结构对于使用 crate 的人来说将会是大为不同的体验。pub use 的另一个常见用法是重导出当前 crate 的依赖的定义使其 crate 定义变成你 crate 公有 API 的一部分。

    +

    创建一个有用的公有 API 结构更像是一门艺术而非科学,你可以反复检视它们来找出最适合用户的 API。pub use 提供了解耦组织 crate 内部结构和与终端用户体现的灵活性。观察一些你所安装的 crate 的代码来看看其内部结构是否不同于公有 API。

    +

    创建 Crates.io 账号

    +

    在你可以发布任何 crate 之前,需要在 crates.io 上注册账号并获取一个 API token。为此,访问位于 crates.io 的首页并使用 GitHub 账号登录。(目前 GitHub 账号是必须的,不过将来该网站可能会支持其他创建账号的方法)一旦登录之后,查看位于 https://crates.io/me/ 的账户设置页面并获取 API token。接着使用该 API token 运行 cargo login 命令,像这样:

    +
    $ cargo login abcdefghijklmnopqrstuvwxyz012345
    +
    +

    这个命令会通知 Cargo 你的 API token 并将其储存在本地的 ~/.cargo/credentials 文件中。注意这个 token 是一个 秘密secret)且不应该与其他人共享。如果因为任何原因与他人共享了这个信息,应该立即到 crates.io 撤销并重新生成一个 token。

    +

    向新 crate 添加元信息

    +

    比如说你已经有一个希望发布的 crate。在发布之前,你需要在 crate 的 Cargo.toml 文件的 [package] 部分增加一些本 crate 的元信息(metadata)。

    +

    首先 crate 需要一个唯一的名称。虽然在本地开发 crate 时,可以使用任何你喜欢的名称。不过 crates.io 上的 crate 名称遵守先到先得的分配原则。一旦某个 crate 名称被使用,其他人就不能再发布这个名称的 crate 了。请搜索你希望使用的名称来找出它是否已被使用。如果没有,修改 Cargo.toml[package] 里的名称为你希望用于发布的名称,像这样:

    +

    文件名:Cargo.toml

    +
    [package]
    +name = "guessing_game"
    +
    +

    即使你选择了一个唯一的名称,如果此时尝试运行 cargo publish 发布该 crate 的话,会得到一个警告接着是一个错误:

    +
    $ cargo publish
    +    Updating crates.io index
    +warning: manifest has no description, license, license-file, documentation, homepage or repository.
    +See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info.
    +--snip--
    +error: failed to publish to registry at https://crates.io
    +
    +Caused by:
    +  the remote server responded with an error: missing or empty metadata fields: description, license. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for how to upload metadata
    +
    +

    这个错误是因为我们缺少一些关键信息:关于该 crate 用途的描述和用户可能在何种条款下使用该 crate 的 license。在 Cargo.toml 中添加通常是一两句话的描述,因为它将在搜索结果中和你的 crate 一起显示。对于 license 字段,你需要一个 license 标识符值license identifier value)。Linux 基金会的 Software Package Data Exchange (SPDX) 列出了可以使用的标识符。例如,为了指定 crate 使用 MIT License,增加 MIT 标识符:

    +

    文件名:Cargo.toml

    +
    [package]
    +name = "guessing_game"
    +license = "MIT"
    +
    +

    如果你希望使用不存在于 SPDX 的 license,则需要将 license 文本放入一个文件,将该文件包含进项目中,接着使用 license-file 来指定文件名而不是使用 license 字段。

    +

    关于项目所适用的 license 指导超出了本书的范畴。很多 Rust 社区成员选择与 Rust 自身相同的 license,这是一个双许可的 MIT OR Apache-2.0。这个实践展示了也可以通过 OR 分隔为项目指定多个 license 标识符。

    +

    那么,有了唯一的名称、版本号、由 cargo new 新建项目时增加的作者信息、描述和所选择的 license,已经准备好发布的项目的 Cargo.toml 文件可能看起来像这样:

    +

    文件名:Cargo.toml

    +
    [package]
    +name = "guessing_game"
    +version = "0.1.0"
    +edition = "2021"
    +description = "A fun game where you guess what number the computer has chosen."
    +license = "MIT OR Apache-2.0"
    +
    +[dependencies]
    +
    +

    Cargo 的文档 描述了其他可以指定的元信息,它们可以帮助你的 crate 更容易被发现和使用!

    +

    发布到 Crates.io

    +

    现在我们创建了一个账号,保存了 API token,为 crate 选择了一个名字,并指定了所需的元数据,你已经准备好发布了!发布 crate 会上传特定版本的 crate 到 crates.io 以供他人使用。

    +

    发布 crate 时请多加小心,因为发布是 永久性的permanent)。对应版本不可能被覆盖,其代码也不可能被删除。crates.io 的一个主要目标是作为一个存储代码的永久文档服务器,这样所有依赖 crates.io 中的 crate 的项目都能一直正常工作。而允许删除版本没办法达成这个目标。然而,可以被发布的版本号却没有限制。

    +

    再次运行 cargo publish 命令。这次它应该会成功:

    +
    $ cargo publish
    +    Updating crates.io index
    +   Packaging guessing_game v0.1.0 (file:///projects/guessing_game)
    +   Verifying guessing_game v0.1.0 (file:///projects/guessing_game)
    +   Compiling guessing_game v0.1.0
    +(file:///projects/guessing_game/target/package/guessing_game-0.1.0)
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.19s
    +   Uploading guessing_game v0.1.0 (file:///projects/guessing_game)
    +
    +

    恭喜!你现在向 Rust 社区分享了代码,而且任何人都可以轻松的将你的 crate 加入他们项目的依赖。

    +

    发布现存 crate 的新版本

    +

    当你修改了 crate 并准备好发布新版本时,改变 Cargo.tomlversion 所指定的值。请使用 语义化版本规则 来根据修改的类型决定下一个版本号。接着运行 cargo publish 来上传新版本。

    +

    使用 cargo yank 从 Crates.io 弃用版本

    +

    虽然你不能删除之前版本的 crate,但是可以阻止任何将来的项目将它们加入到依赖中。这在某个版本因为这样或那样的原因被破坏的情况很有用。对于这种情况,Cargo 支持 撤回yanking)某个版本。

    +

    撤回某个版本会阻止新项目依赖此版本,不过所有现存此依赖的项目仍然能够下载和依赖这个版本。从本质上说,撤回意味着所有带有 Cargo.lock 的项目的依赖不会被破坏,同时任何新生成的 Cargo.lock 将不能使用被撤回的版本。

    +

    为了撤回一个版本的 crate,在之前发布 crate 的目录运行 cargo yank 并指定希望撤回的版本。例如,如果我们发布了一个名为 guessing_game 的 crate 的 1.0.1 版本并希望撤回它,在 guessing_game 项目目录运行:

    +
    $ cargo yank --vers 1.0.1
    +    Updating crates.io index
    +        Yank guessing_game@1.0.1
    +
    +

    也可以撤销撤回操作,并允许项目可以再次开始依赖某个版本,通过在命令上增加 --undo

    +
    $ cargo yank --vers 1.0.1 --undo
    +    Updating crates.io index
    +      Unyank guessing_game@1.0.1
    +
    +

    撤回 并没有 删除任何代码。举例来说,撤回功能并不能删除不小心上传的秘密信息。如果出现了这种情况,请立即重新设置这些秘密信息。

    +

    Cargo 工作空间

    +
    +

    ch14-03-cargo-workspaces.md +
    +commit 704c51eec2f26a0133ae17a2c01986590c05a045

    +
    +

    第十二章中,我们构建一个包含二进制 crate 和库 crate 的包。你可能会发现,随着项目开发的深入,库 crate 持续增大,而你希望将其进一步拆分成多个库 crate。Cargo 提供了一个叫 工作空间workspaces)的功能,它可以帮助我们管理多个相关的协同开发的包。

    +

    创建工作空间

    +

    工作空间 是一系列共享同样的 Cargo.lock 和输出目录的包。让我们使用工作空间创建一个项目 —— 这里采用常见的代码以便可以关注工作空间的结构。有多种组织工作空间的方式,所以我们只展示一个常用方法。我们的工作空间有一个二进制项目和两个库。二进制项目会提供主要功能,并会依赖另两个库。一个库会提供 add_one 方法而第二个会提供 add_two 方法。这三个 crate 将会是相同工作空间的一部分。让我们以新建工作空间目录开始:

    +
    $ mkdir add
    +$ cd add
    +
    +

    接着在 add 目录中,创建 Cargo.toml 文件。这个 Cargo.toml 文件配置了整个工作空间。它不会包含 [package] 部分。相反,它以 [workspace] 部分作为开始,并通过指定 adder 的路径来为工作空间增加成员,如下会加入二进制 crate:

    +

    文件名:Cargo.toml

    +
    [workspace]
    +
    +members = [
    +    "adder",
    +]
    +
    +

    接下来,在 add 目录运行 cargo new 新建 adder 二进制 crate:

    +
    $ cargo new adder
    +     Created binary (application) `adder` package
    +
    +

    到此为止,可以运行 cargo build 来构建工作空间。add 目录中的文件应该看起来像这样:

    +
    ├── Cargo.lock
    +├── Cargo.toml
    +├── adder
    +│   ├── Cargo.toml
    +│   └── src
    +│       └── main.rs
    +└── target
    +
    +

    工作空间在顶级目录有一个 target 目录;adder 并没有自己的 target 目录。即使进入 adder 目录运行 cargo build,构建结果也位于 add/target 而不是 add/adder/target。工作空间中的 crate 之间相互依赖。如果每个 crate 有其自己的 target 目录,为了在自己的 target 目录中生成构建结果,工作空间中的每一个 crate 都不得不相互重新编译其他 crate。通过共享一个 target 目录,工作空间可以避免其他 crate 重复构建。

    +

    在工作空间中创建第二个包

    +

    接下来,让我们在工作空间中指定另一个成员 crate。这个 crate 位于 add_one 目录中,所以修改顶级 Cargo.toml 为也包含 add_one 路径:

    +

    文件名:Cargo.toml

    +
    [workspace]
    +
    +members = [
    +    "adder",
    +    "add_one",
    +]
    +
    +

    接着新生成一个叫做 add_one 的库:

    +
    $ cargo new add_one --lib
    +     Created library `add_one` package
    +
    +

    现在 add 目录应该有如下目录和文件:

    +
    ├── Cargo.lock
    +├── Cargo.toml
    +├── add_one
    +│   ├── Cargo.toml
    +│   └── src
    +│       └── lib.rs
    +├── adder
    +│   ├── Cargo.toml
    +│   └── src
    +│       └── main.rs
    +└── target
    +
    +

    add_one/src/lib.rs 文件中,增加一个 add_one 函数:

    +

    文件名:add_one/src/lib.rs

    +
    pub fn add_one(x: i32) -> i32 {
    +    x + 1
    +}
    +

    现在我们有了二进制 adder 依赖库 crate add_one。首先需要在 adder/Cargo.toml 文件中增加 add_one 作为路径依赖:

    +

    文件名:adder/Cargo.toml

    +
    [dependencies]
    +add_one = { path = "../add_one" }
    +
    +

    cargo 并不假定工作空间中的 Crates 会相互依赖,所以需要明确表明工作空间中 crate 的依赖关系。

    +

    接下来,在 adder crate 中使用( add_one crate 中的)函数 add_one。打开 adder/src/main.rs 在顶部增加一行 use 将新 add_one 库 crate 引入作用域。接着修改 main 函数来调用 add_one 函数,如示例 14-7 所示。

    +

    文件名:adder/src/main.rs

    +
    use add_one;
    +
    +fn main() {
    +    let num = 10;
    +    println!("Hello, world! {num} plus one is {}!", add_one::add_one(num));
    +}
    +

    示例 14-7:在 adder crate 中使用 add_one 库 crate

    +

    add 目录中运行 cargo build 来构建工作空间!

    +
    $ cargo build
    +   Compiling add_one v0.1.0 (file:///projects/add/add_one)
    +   Compiling adder v0.1.0 (file:///projects/add/adder)
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.68s
    +
    +

    为了在顶层 add 目录运行二进制 crate,可以通过 -p 参数和包名称来运行 cargo run 指定工作空间中我们希望使用的包:

    +
    $ cargo run -p adder
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.0s
    +     Running `target/debug/adder`
    +Hello, world! 10 plus one is 11!
    +
    +

    这会运行 adder/src/main.rs 中的代码,其依赖 add_one crate

    +

    在工作空间中依赖外部包

    +

    还需注意的是工作空间只在根目录有一个 Cargo.lock,而不是在每一个 crate 目录都有 Cargo.lock。这确保了所有的 crate 都使用完全相同版本的依赖。如果在 Cargo.tomladd_one/Cargo.toml 中都增加 rand crate,则 Cargo 会将其都解析为同一版本并记录到唯一的 Cargo.lock 中。使得工作空间中的所有 crate 都使用相同的依赖意味着其中的 crate 都是相互兼容的。让我们在 add_one/Cargo.toml 中的 [dependencies] 部分增加 rand crate 以便能够在 add_one crate 中使用 rand crate:

    +

    文件名:add_one/Cargo.toml

    +
    [dependencies]
    +rand = "0.8.5"
    +
    +

    现在就可以在 add_one/src/lib.rs 中增加 use rand; 了,接着在 add 目录运行 cargo build 构建整个工作空间就会引入并编译 rand crate:

    +
    $ cargo build
    +    Updating crates.io index
    +  Downloaded rand v0.8.5
    +   --snip--
    +   Compiling rand v0.8.5
    +   Compiling add_one v0.1.0 (file:///projects/add/add_one)
    +warning: unused import: `rand`
    + --> add_one/src/lib.rs:1:5
    +  |
    +1 | use rand;
    +  |     ^^^^
    +  |
    +  = note: `#[warn(unused_imports)]` on by default
    +
    +warning: `add_one` (lib) generated 1 warning
    +   Compiling adder v0.1.0 (file:///projects/add/adder)
    +    Finished dev [unoptimized + debuginfo] target(s) in 10.18s
    +
    +

    现在顶级的 Cargo.lock 包含了 add_onerand 依赖的信息。然而,即使 rand 被用于工作空间的某处,也不能在其他 crate 中使用它,除非也在它们的 Cargo.toml 中加入 rand。例如,如果在顶级的 adder crate 的 adder/src/main.rs 中增加 use rand;,会得到一个错误:

    +
    $ cargo build
    +  --snip--
    +   Compiling adder v0.1.0 (file:///projects/add/adder)
    +error[E0432]: unresolved import `rand`
    + --> adder/src/main.rs:2:5
    +  |
    +2 | use rand;
    +  |     ^^^^ no external crate `rand`
    +
    +

    为了修复这个错误,修改顶级 adder crate 的 Cargo.toml 来表明 rand 也是这个 crate 的依赖。构建 adder crate 会将 rand 加入到 Cargo.lockadder 的依赖列表中,但是这并不会下载 rand 的额外拷贝。Cargo 确保了工作空间中任何使用 rand 的 crate 都采用相同的版本,这节省了空间并确保了工作空间中的 crate 将是相互兼容的。

    +

    为工作空间增加测试

    +

    作为另一个提升,让我们为 add_one crate 中的 add_one::add_one 函数增加一个测试:

    +

    文件名:add_one/src/lib.rs

    +
    pub fn add_one(x: i32) -> i32 {
    +    x + 1
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn it_works() {
    +        assert_eq!(3, add_one(2));
    +    }
    +}
    +

    在顶级 add 目录运行 cargo test。在像这样的工作空间结构中运行 cargo test 会运行工作空间中所有 crate 的测试。:

    +
    $ cargo test
    +   Compiling add_one v0.1.0 (file:///projects/add/add_one)
    +   Compiling adder v0.1.0 (file:///projects/add/adder)
    +    Finished test [unoptimized + debuginfo] target(s) in 0.27s
    +     Running unittests src/lib.rs (target/debug/deps/add_one-f0253159197f7841)
    +
    +running 1 test
    +test tests::it_works ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +     Running unittests src/main.rs (target/debug/deps/adder-49979ff40686fa8e)
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests add_one
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +

    输出的第一部分显示 add_one crate 的 it_works 测试通过了。下一个部分显示 adder crate 中找到了 0 个测试,最后一部分显示 add_one crate 中有 0 个文档测试。

    +

    也可以选择运行工作空间中特定 crate 的测试,通过在根目录使用 -p 参数并指定希望测试的 crate 名称:

    +
    $ cargo test -p add_one
    +    Finished test [unoptimized + debuginfo] target(s) in 0.00s
    +     Running unittests src/lib.rs (target/debug/deps/add_one-b3235fea9a156f74)
    +
    +running 1 test
    +test tests::it_works ... ok
    +
    +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +   Doc-tests add_one
    +
    +running 0 tests
    +
    +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +

    输出显示了 cargo test 只运行了 add_one crate 的测试而没有运行 adder crate 的测试。

    +

    如果你选择向 crates.io发布工作空间中的 crate,每一个工作空间中的 crate 需要单独发布。就像 cargo test 一样,可以通过 -p 参数并指定期望发布的 crate 名来发布工作空间中的某个特定的 crate。

    +

    现在尝试以类似 add_one crate 的方式向工作空间增加 add_two crate 来作为更多的练习!

    +

    随着项目增长,考虑使用工作空间:每一个更小的组件比一大块代码要容易理解。如果它们经常需要同时被修改的话,将 crate 保持在工作空间中更易于协调 crate 的改变。

    +

    使用 cargo install 安装二进制文件

    +
    +

    ch14-04-installing-binaries.md +
    +commit 704c51eec2f26a0133ae17a2c01986590c05a045

    +
    +

    cargo install 命令用于在本地安装和使用二进制 crate。它并不打算替换系统中的包;它意在作为一个方便 Rust 开发者们安装其他人已经在 crates.io 上共享的工具的手段。只有拥有二进制目标文件的包能够被安装。二进制目标 文件是在 crate 有 src/main.rs 或者其他指定为二进制文件时所创建的可执行程序,这不同于自身不能执行但适合包含在其他程序中的库目标文件。通常 crate 的 README 文件中有该 crate 是库、二进制目标还是两者兼有的信息。

    +

    所有来自 cargo install 的二进制文件都安装到 Rust 安装根目录的 bin 文件夹中。如果你是使用 rustup.rs 来安装 Rust 且没有自定义任何配置,这个目录将是 $HOME/.cargo/bin。确保将这个目录添加到 $PATH 环境变量中就能够运行通过 cargo install 安装的程序了。

    +

    例如,第十二章提到的叫做 ripgrep 的用于搜索文件的 grep 的 Rust 实现。为了安装 ripgrep 运行如下:

    +
    $ cargo install ripgrep
    +    Updating crates.io index
    +  Downloaded ripgrep v13.0.0
    +  Downloaded 1 crate (243.3 KB) in 0.88s
    +  Installing ripgrep v13.0.0
    +--snip--
    +   Compiling ripgrep v13.0.0
    +    Finished release [optimized + debuginfo] target(s) in 3m 10s
    +  Installing ~/.cargo/bin/rg
    +   Installed package `ripgrep v13.0.0` (executable `rg`)
    +
    +

    最后一行输出展示了安装的二进制文件的位置和名称,在这里 ripgrep 被命名为 rg。只要你像上面提到的那样将安装目录加入 $PATH,就可以运行 rg --help 并开始使用一个更快更 Rust 的工具来搜索文件了!

    +

    Cargo 自定义扩展命令

    +
    +

    ch14-05-extending-cargo.md +
    +commit c084bdd9ee328e7e774df19882ccc139532e53d8

    +
    +

    Cargo 的设计使得开发者可以通过新的子命令来对 Cargo 进行扩展,而无需修改 Cargo 本身。如果 $PATH 中有类似 cargo-something 的二进制文件,就可以通过 cargo something 来像 Cargo 子命令一样运行它。像这样的自定义命令也可以运行 cargo --list 来展示出来。能够通过 cargo install 向 Cargo 安装扩展并可以如内建 Cargo 工具那样运行它们是 Cargo 设计上的一个非常方便的优点!

    +

    总结

    +

    通过 Cargo 和 crates.io 来分享代码是使得 Rust 生态环境可以用于许多不同的任务的重要组成部分。Rust 的标准库是小而稳定的,不过 crate 易于分享和使用,并采用一个不同语言自身的时间线来提供改进。不要羞于在 crates.io 上共享对你有用的代码,因为它很有可能对别人也很有用!

    +

    智能指针

    +
    +

    ch15-00-smart-pointers.md +
    +commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e

    +
    +

    指针pointer)是一个包含内存地址的变量的通用概念。这个地址引用,或 “指向”(points at)一些其他数据。Rust 中最常见的指针是第四章介绍的 引用reference)。引用以 & 符号为标志并借用了它们所指向的值。除了引用数据没有任何其他特殊功能,也没有额外开销。

    +

    另一方面,智能指针smart pointers)是一类数据结构,它们的表现类似指针,但是也拥有额外的元数据和功能。智能指针的概念并不为 Rust 所独有;其起源于 C++ 并存在于其他语言中。Rust 标准库中定义了多种不同的智能指针,它们提供了多于引用的额外功能。为了探索其基本概念,我们来看看一些智能指针的例子,这包括 引用计数reference counting)智能指针类型。这种指针允许数据有多个所有者,它会记录所有者的数量,当没有所有者时清理数据。在 Rust 中因为引用和借用,普通引用和智能指针的一个额外的区别是引用是一类只借用数据的指针;相反,在大部分情况下,智能指针 拥有 它们指向的数据。

    +

    实际上本书中已经出现过一些智能指针,比如第八章的 StringVec<T>,虽然当时并没有这样称呼它们。这些类型都属于智能指针,因为它们拥有一些数据,并允许你修改这些数据。它们也拥有元数据和额外的功能或保证。例如 String 存储了其容量作为元数据,并拥有额外的能力来确保其数据总是有效的 UTF-8 编码。

    +

    智能指针通常使用结构体实现。智能指针不同于结构体的地方在于其实现了 DerefDrop trait。Deref trait 允许智能指针结构体实例表现的像引用一样,这样就可以编写既用于引用、又用于智能指针的代码。Drop trait 允许我们自定义当智能指针离开作用域时运行的代码。本章会讨论这些 trait 以及为什么对于智能指针来说它们很重要。

    +

    考虑到智能指针是一个在 Rust 经常被使用的通用设计模式,本章并不会覆盖所有现存的智能指针。很多库都有自己的智能指针而你也可以编写属于你自己的智能指针。这里将会讲到的是来自标准库中最常用的一些:

    +
      +
    • Box<T>,用于在堆上分配值
    • +
    • Rc<T>,一个引用计数类型,其数据可以有多个所有者
    • +
    • Ref<T>RefMut<T>,通过 RefCell<T> 访问。( RefCell<T> 是一个在运行时而不是在编译时执行借用规则的类型)。
    • +
    +

    另外我们会涉及 内部可变性interior mutability)模式,这是不可变类型暴露出改变其内部值的 API。我们也会讨论 引用循环reference cycles)会如何泄漏内存,以及如何避免。

    +

    让我们开始吧!

    +

    使用Box<T>指向堆上的数据

    +
    +

    ch15-01-box.md +
    +commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e

    +
    +

    最简单直接的智能指针是 box,其类型是 Box<T>。box 允许你将一个值放在堆上而不是栈上。留在栈上的则是指向堆数据的指针。如果你想回顾一下栈与堆的区别请参考第四章。

    +

    除了数据被储存在堆上而不是栈上之外,box 没有性能损失。不过也没有很多额外的功能。它们多用于如下场景:

    +
      +
    • 当有一个在编译时未知大小的类型,而又想要在需要确切大小的上下文中使用这个类型值的时候
    • +
    • 当有大量数据并希望在确保数据不被拷贝的情况下转移所有权的时候
    • +
    • 当希望拥有一个值并只关心它的类型是否实现了特定 trait 而不是其具体类型的时候
    • +
    +

    我们会在 “box 允许创建递归类型” 部分展示第一种场景。在第二种情况中,转移大量数据的所有权可能会花费很长的时间,因为数据在栈上进行了拷贝。为了改善这种情况下的性能,可以通过 box 将这些数据储存在堆上。接着,只有少量的指针数据在栈上被拷贝。第三种情况被称为 trait 对象trait object),第十八章刚好有一整个部分 “顾及不同类型值的 trait 对象” 专门讲解这个主题。所以这里所学的内容会在第十八章再次用上!

    +

    使用 Box<T> 在堆上储存数据

    +

    在讨论 Box<T> 的堆存储用例之前,让我们熟悉一下语法以及如何与储存在 Box<T> 中的值进行交互。

    +

    示例 15-1 展示了如何使用 box 在堆上储存一个 i32

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let b = Box::new(5);
    +    println!("b = {b}");
    +}
    +

    示例 15-1:使用 box 在堆上储存一个 i32

    +

    这里定义了变量 b,其值是一个指向被分配在堆上的值 5Box。这个程序会打印出 b = 5;在这个例子中,我们可以像数据是储存在栈上的那样访问 box 中的数据。正如任何拥有数据所有权的值那样,当像 b 这样的 box 在 main 的末尾离开作用域时,它将被释放。这个释放过程作用于 box 本身(位于栈上)和它所指向的数据(位于堆上)。

    +

    将一个单独的值存放在堆上并不是很有意义,所以像示例 15-1 这样单独使用 box 并不常见。将像单个 i32 这样的值储存在栈上,也就是其默认存放的地方在大部分使用场景中更为合适。让我们看看一个不使用 box 时无法定义的类型的例子。

    +

    Box 允许创建递归类型

    +

    递归类型recursive type)的值可以拥有另一个同类型的值作为其自身的一部分。但是这会产生一个问题,因为 Rust 需要在编译时知道类型占用多少空间。递归类型的值嵌套理论上可以无限地进行下去,所以 Rust 不知道递归类型需要多少空间。因为 box 有一个已知的大小,所以通过在循环类型定义中插入 box,就可以创建递归类型了。

    +

    作为一个递归类型的例子,让我们探索一下 cons list。这是一个函数式编程语言中常见的数据类型,来展示这个(递归类型)概念。除了递归之外,我们将要定义的 cons list 类型是很直白的,所以这个例子中的概念,在任何遇到更为复杂的涉及到递归类型的场景时都很实用。

    +

    cons list 的更多内容

    +

    cons list 是一个来源于 Lisp 编程语言及其方言的数据结构,它由嵌套的列表组成。它的名字来源于 Lisp 中的 cons 函数(“construct function" 的缩写),它利用两个参数来构造一个新的列表。通过对一个包含值的列表和另一个值调用 cons,可以构建由递归列表组成的 cons list。

    +

    例如这里有一个包含列表 1,2,3 的 cons list 的伪代码表示,其每一个列表在一个括号中:

    +
    (1, (2, (3, Nil)))
    +
    +

    cons list 的每一项都包含两个元素:当前项的值和下一项。其最后一项值包含一个叫做 Nil 的值且没有下一项。cons list 通过递归调用 cons 函数产生。代表递归的终止条件(base case)的规范名称是 Nil,它宣布列表的终止。注意这不同于第六章中的 “null” 或 “nil” 的概念,它们代表无效或缺失的值。

    +

    cons list 并不是一个 Rust 中常见的类型。大部分在 Rust 中需要列表的时候,Vec<T> 是一个更好的选择。其他更为复杂的递归数据类型 确实 在 Rust 的很多场景中很有用,不过通过以 cons list 作为开始,我们可以探索如何使用 box 毫不费力的定义一个递归数据类型。

    +

    示例 15-2 包含一个 cons list 的枚举定义。注意这还不能编译因为这个类型没有已知的大小,之后我们会展示:

    +

    文件名:src/main.rs

    +
    enum List {
    +    Cons(i32, List),
    +    Nil,
    +}
    +
    +fn main() {}
    +

    示例 15-2:第一次尝试定义一个代表 i32 值的 cons list 数据结构的枚举

    +
    +

    注意:出于示例的需要我们选择实现一个只存放 i32 值的 cons list。也可以用泛型,正如第十章讲到的,来定义一个可以存放任何类型值的 cons list 类型。

    +
    +

    使用这个 cons list 来储存列表 1, 2, 3 将看起来如示例 15-3 所示:

    +

    文件名:src/main.rs

    +
    enum List {
    +    Cons(i32, List),
    +    Nil,
    +}
    +
    +use crate::List::{Cons, Nil};
    +
    +fn main() {
    +    let list = Cons(1, Cons(2, Cons(3, Nil)));
    +}
    +

    示例 15-3:使用 List 枚举储存列表 1, 2, 3

    +

    第一个 Cons 储存了 1 和另一个 List 值。这个 List 是另一个包含 2Cons 值和下一个 List 值。接着又有另一个存放了 3Cons 值和最后一个值为 NilList,非递归成员代表了列表的结尾。

    +

    如果尝试编译示例 15-3 的代码,会得到如示例 15-4 所示的错误:

    +
    $ cargo run
    +   Compiling cons-list v0.1.0 (file:///projects/cons-list)
    +error[E0072]: recursive type `List` has infinite size
    + --> src/main.rs:1:1
    +  |
    +1 | enum List {
    +  | ^^^^^^^^^
    +2 |     Cons(i32, List),
    +  |               ---- recursive without indirection
    +  |
    +help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle
    +  |
    +2 |     Cons(i32, Box<List>),
    +  |               ++++    +
    +
    +error[E0391]: cycle detected when computing when `List` needs drop
    + --> src/main.rs:1:1
    +  |
    +1 | enum List {
    +  | ^^^^^^^^^
    +  |
    +  = note: ...which immediately requires computing when `List` needs drop again
    +  = note: cycle used when computing whether `List` needs drop
    +  = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
    +
    +Some errors have detailed explanations: E0072, E0391.
    +For more information about an error, try `rustc --explain E0072`.
    +error: could not compile `cons-list` (bin "cons-list") due to 2 previous errors
    +
    +

    示例 15-4:尝试定义一个递归枚举时得到的错误

    +

    这个错误表明这个类型 “有无限的大小”。其原因是 List 的一个成员被定义为是递归的:它直接存放了另一个相同类型的值。这意味着 Rust 无法计算为了存放 List 值到底需要多少空间。让我们拆开来看为何会得到这个错误。首先了解一下 Rust 如何决定需要多少空间来存放一个非递归类型。

    +

    计算非递归类型的大小

    +

    回忆一下第六章讨论枚举定义时示例 6-2 中定义的 Message 枚举:

    +
    enum Message {
    +    Quit,
    +    Move { x: i32, y: i32 },
    +    Write(String),
    +    ChangeColor(i32, i32, i32),
    +}
    +
    +fn main() {}
    +

    当 Rust 需要知道要为 Message 值分配多少空间时,它可以检查每一个成员并发现 Message::Quit 并不需要任何空间,Message::Move 需要足够储存两个 i32 值的空间,依此类推。因为 enum 实际上只会使用其中的一个成员,所以 Message 值所需的空间等于储存其最大成员的空间大小。

    +

    与此相对当 Rust 编译器检查像示例 15-2 中的 List 这样的递归类型时会发生什么呢。编译器尝试计算出储存一个 List 枚举需要多少内存,并开始检查 Cons 成员,那么 Cons 需要的空间等于 i32 的大小加上 List 的大小。为了计算 List 需要多少内存,它检查其成员,从 Cons 成员开始。Cons成员储存了一个 i32 值和一个List值,这样的计算将无限进行下去,如图 15-1 所示:

    +An infinite Cons list +

    图 15-1:一个包含无限个 Cons 成员的无限 List

    +

    使用 Box<T> 给递归类型一个已知的大小

    +

    因为 Rust 无法计算出要为定义为递归的类型分配多少空间,所以编译器给出了一个包括了有用建议的错误:

    +
    help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `List` representable
    +  |
    +2 |     Cons(i32, Box<List>),
    +  |               ++++    +
    +
    +

    在建议中,“indirection” 意味着不同于直接储存一个值,应该间接的储存一个指向值的指针。

    +

    因为 Box<T> 是一个指针,我们总是知道它需要多少空间:指针的大小并不会根据其指向的数据量而改变。这意味着可以将 Box 放入 Cons 成员中而不是直接存放另一个 List 值。Box 会指向另一个位于堆上的 List 值,而不是存放在 Cons 成员中。从概念上讲,我们仍然有一个通过在其中 “存放” 其他列表创建的列表,不过现在实现这个概念的方式更像是一个项挨着另一项,而不是一项包含另一项。

    +

    我们可以修改示例 15-2 中 List 枚举的定义和示例 15-3 中对 List 的应用,如示例 15-65 所示,这是可以编译的:

    +

    文件名:src/main.rs

    +
    enum List {
    +    Cons(i32, Box<List>),
    +    Nil,
    +}
    +
    +use crate::List::{Cons, Nil};
    +
    +fn main() {
    +    let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));
    +}
    +

    示例 15-5:为了拥有已知大小而使用 Box<T>List 定义

    +

    Cons 成员将会需要一个 i32 的大小加上储存 box 指针数据的空间。Nil 成员不储存值,所以它比 Cons 成员需要更少的空间。现在我们知道了任何 List 值最多需要一个 i32 加上 box 指针数据的大小。通过使用 box,打破了这无限递归的连锁,这样编译器就能够计算出储存 List 值需要的大小了。图 15-2 展示了现在 Cons 成员看起来像什么:

    +A finite Cons list +

    图 15-2:因为 Cons 存放一个 Box 所以 List 不是无限大小的了

    +

    box 只提供了间接存储和堆分配;它们并没有任何其他特殊的功能,比如我们将会见到的其他智能指针。它们也没有这些特殊功能带来的性能损失,所以它们可以用于像 cons list 这样间接存储是唯一所需功能的场景。我们还将在第十八章看到 box 的更多应用场景。

    +

    Box<T> 类型是一个智能指针,因为它实现了 Deref trait,它允许 Box<T> 值被当作引用对待。当 Box<T> 值离开作用域时,由于 Box<T> 类型 Drop trait 的实现,box 所指向的堆数据也会被清除。这两个 trait 对于在本章余下讨论的其他智能指针所提供的功能中,将会更为重要。让我们更详细的探索一下这两个 trait。

    +

    通过 Deref trait 将智能指针当作常规引用处理

    +
    +

    ch15-02-deref.md +
    +commit 0514b1cf34c2eaab8285f43305c10a87f4ce34a0

    +
    +

    实现 Deref trait 允许我们重载 解引用运算符dereference operator*(不要与乘法运算符或通配符相混淆)。通过这种方式实现 Deref trait 的智能指针可以被当作常规引用来对待,可以编写操作引用的代码并用于智能指针。

    +

    让我们首先看看解引用运算符如何处理常规引用,接着尝试定义我们自己的类似 Box<T> 的类型并看看为何解引用运算符不能像引用一样工作。我们会探索如何实现 Deref trait 使得智能指针以类似引用的方式工作变为可能。最后,我们会讨论 Rust 的 Deref 强制转换deref coercions)功能以及它是如何处理引用或智能指针的。

    +
    +

    我们将要构建的 MyBox<T> 类型与真正的 Box<T> 有一个很大的区别:我们的版本不会在堆上储存数据。这个例子重点关注 Deref,所以其数据实际存放在何处,相比其类似指针的行为来说不算重要。

    +
    +

    追踪指针的值

    +

    常规引用是一个指针类型,一种理解指针的方式是将其看成指向储存在其他某处值的箭头。在示例 15-6 中,创建了一个 i32 值的引用,接着使用解引用运算符来跟踪所引用的值:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x = 5;
    +    let y = &x;
    +
    +    assert_eq!(5, x);
    +    assert_eq!(5, *y);
    +}
    +

    示例 15-6:使用解引用运算符来跟踪 i32 值的引用

    +

    变量 x 存放了一个 i325y 等于 x 的一个引用。可以断言 x 等于 5。然而,如果希望对 y 的值做出断言,必须使用 *y 来追踪引用所指向的值(也就是 解引用),这样编译器就可以比较实际的值了。一旦解引用了 y,就可以访问 y 所指向的整型值并可以与 5 做比较。

    +

    相反如果尝试编写 assert_eq!(5, y);,则会得到如下编译错误:

    +
    $ cargo run
    +   Compiling deref-example v0.1.0 (file:///projects/deref-example)
    +error[E0277]: can't compare `{integer}` with `&{integer}`
    + --> src/main.rs:6:5
    +  |
    +6 |     assert_eq!(5, y);
    +  |     ^^^^^^^^^^^^^^^^ no implementation for `{integer} == &{integer}`
    +  |
    +  = help: the trait `PartialEq<&{integer}>` is not implemented for `{integer}`
    +  = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
    +
    +For more information about this error, try `rustc --explain E0277`.
    +error: could not compile `deref-example` (bin "deref-example") due to 1 previous error
    +
    +

    不允许比较数字的引用与数字,因为它们是不同的类型。必须使用解引用运算符追踪引用所指向的值。

    +

    像引用一样使用 Box<T>

    +

    可以使用 Box<T> 代替引用来重写示例 15-6 中的代码,示例 15-7 中 Box<T> 上使用的解引用运算符与示例 15-6 中引用上使用的解引用运算符有着一样的功能:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x = 5;
    +    let y = Box::new(x);
    +
    +    assert_eq!(5, x);
    +    assert_eq!(5, *y);
    +}
    +

    示例 15-7:在 Box<i32> 上使用解引用运算符

    +

    示例 15-7 相比示例 15-6 主要不同的地方就是将 y 设置为一个指向 x 值拷贝的 Box<T> 实例,而不是指向 x 值的引用。在最后的断言中,可以使用解引用运算符以 y 为引用时相同的方式追踪 Box<T> 的指针。接下来让我们通过实现自己的类型来探索 Box<T> 能这么做有何特殊之处。

    +

    自定义智能指针

    +

    为了体会默认情况下智能指针与引用的不同,让我们创建一个类似于标准库提供的 Box<T> 类型的智能指针。接着学习如何增加使用解引用运算符的功能。

    +

    从根本上说,Box<T> 被定义为包含一个元素的元组结构体,所以示例 15-8 以相同的方式定义了 MyBox<T> 类型。我们还定义了 new 函数来对应定义于 Box<T>new 函数:

    +

    文件名:src/main.rs

    +
    struct MyBox<T>(T);
    +
    +impl<T> MyBox<T> {
    +    fn new(x: T) -> MyBox<T> {
    +        MyBox(x)
    +    }
    +}
    +
    +fn main() {}
    +

    示例 15-8:定义 MyBox<T> 类型

    +

    这里定义了一个结构体 MyBox 并声明了一个泛型参数 T,因为我们希望其可以存放任何类型的值。MyBox 是一个包含 T 类型元素的元组结构体。MyBox::new 函数获取一个 T 类型的参数并返回一个存放传入值的 MyBox 实例。

    +

    尝试将示例 15-7 中的代码加入示例 15-8 中并修改 main 使用我们定义的 MyBox<T> 类型代替 Box<T>。示例 15-9 中的代码不能编译,因为 Rust 不知道如何解引用 MyBox

    +

    文件名:src/main.rs

    +
    struct MyBox<T>(T);
    +
    +impl<T> MyBox<T> {
    +    fn new(x: T) -> MyBox<T> {
    +        MyBox(x)
    +    }
    +}
    +
    +fn main() {
    +    let x = 5;
    +    let y = MyBox::new(x);
    +
    +    assert_eq!(5, x);
    +    assert_eq!(5, *y);
    +}
    +

    示例 15-9:尝试以使用引用和 Box<T> 相同的方式使用 MyBox<T>

    +

    得到的编译错误是:

    +
    $ cargo run
    +   Compiling deref-example v0.1.0 (file:///projects/deref-example)
    +error[E0614]: type `MyBox<{integer}>` cannot be dereferenced
    +  --> src/main.rs:14:19
    +   |
    +14 |     assert_eq!(5, *y);
    +   |                   ^^
    +
    +For more information about this error, try `rustc --explain E0614`.
    +error: could not compile `deref-example` (bin "deref-example") due to 1 previous error
    +
    +

    MyBox<T> 类型不能解引用,因为我们尚未在该类型实现这个功能。为了启用 * 运算符的解引用功能,需要实现 Deref trait。

    +

    通过实现 Deref trait 将某类型像引用一样处理

    +

    如第十章 “为类型实现 trait” 部分所讨论的,为了实现 trait,需要提供 trait 所需的方法实现。Deref trait,由标准库提供,要求实现名为 deref 的方法,其借用 self 并返回一个内部数据的引用。示例 15-10 包含定义于 MyBox 之上的 Deref 实现:

    +

    文件名:src/main.rs

    +
    use std::ops::Deref;
    +
    +impl<T> Deref for MyBox<T> {
    +    type Target = T;
    +
    +    fn deref(&self) -> &Self::Target {
    +        &self.0
    +    }
    +}
    +
    +struct MyBox<T>(T);
    +
    +impl<T> MyBox<T> {
    +    fn new(x: T) -> MyBox<T> {
    +        MyBox(x)
    +    }
    +}
    +
    +fn main() {
    +    let x = 5;
    +    let y = MyBox::new(x);
    +
    +    assert_eq!(5, x);
    +    assert_eq!(5, *y);
    +}
    +

    示例 15-10:MyBox<T> 上的 Deref 实现

    +

    type Target = T; 语法定义了用于此 trait 的关联类型。关联类型是一个稍有不同的定义泛型参数的方式,现在还无需过多的担心它;第二十章会详细介绍。

    +

    deref 方法体中写入了 &self.0,这样 deref 返回了我希望通过 * 运算符访问的值的引用。回忆一下第五章 “使用没有命名字段的元组结构体来创建不同的类型” 部分 .0 用来访问元组结构体的第一个元素。示例 15-9 中的 main 函数中对 MyBox<T> 值的 * 调用现在可以编译并能通过断言了!

    +

    没有 Deref trait 的话,编译器只会解引用 & 引用类型。deref 方法向编译器提供了获取任何实现了 Deref trait 的类型的值,并且调用这个类型的 deref 方法来获取一个它知道如何解引用的 & 引用的能力。

    +

    当我们在示例 15-9 中输入 *y 时,Rust 事实上在底层运行了如下代码:

    +
    *(y.deref())
    +

    Rust 将 * 运算符替换为先调用 deref 方法再进行普通解引用的操作,如此我们便不用担心是否还需手动调用 deref 方法了。Rust 的这个特性可以让我们写出行为一致的代码,无论是面对的是常规引用还是实现了 Deref 的类型。

    +

    deref 方法返回值的引用,以及 *(y.deref()) 括号外边的普通解引用仍为必须的原因在于所有权。如果 deref 方法直接返回值而不是值的引用,其值(的所有权)将被移出 self。在这里以及大部分使用解引用运算符的情况下我们并不希望获取 MyBox<T> 内部值的所有权。

    +

    注意,每次当我们在代码中使用 * 时, * 运算符都被替换成了先调用 deref 方法再接着使用 * 解引用的操作,且只会发生一次,不会对 * 操作符无限递归替换,解引用出上面 i32 类型的值就停止了,这个值与示例 15-9 中 assert_eq!5 相匹配。

    +

    函数和方法的隐式 Deref 强制转换

    +

    Deref 强制转换deref coercions)将实现了 Deref trait 的类型的引用转换为另一种类型的引用。例如,Deref 强制转换可以将 &String 转换为 &str,因为 String 实现了 Deref trait 因此可以返回 &str。Deref 强制转换是 Rust 在函数或方法传参上的一种便利操作,并且只能作用于实现了 Deref trait 的类型。当这种特定类型的引用作为实参传递给和形参类型不同的函数或方法时将自动进行。这时会有一系列的 deref 方法被调用,把我们提供的类型转换成了参数所需的类型。

    +

    Deref 强制转换的加入使得 Rust 程序员编写函数和方法调用时无需增加过多显式使用 &* 的引用和解引用。这个功能也使得我们可以编写更多同时作用于引用或智能指针的代码。

    +

    作为展示 Deref 强制转换的实例,让我们使用示例 15-8 中定义的 MyBox<T>,以及示例 15-10 中增加的 Deref 实现。示例 15-11 展示了一个有着字符串 slice 参数的函数定义:

    +

    文件名:src/main.rs

    +
    fn hello(name: &str) {
    +    println!("Hello, {name}!");
    +}
    +
    +fn main() {}
    +

    示例 15-11:hello 函数有着 &str 类型的参数 name

    +

    可以使用字符串 slice 作为参数调用 hello 函数,比如 hello("Rust");。Deref 强制转换使得用 MyBox<String> 类型值的引用调用 hello 成为可能,如示例 15-12 所示:

    +

    文件名:src/main.rs

    +
    use std::ops::Deref;
    +
    +impl<T> Deref for MyBox<T> {
    +    type Target = T;
    +
    +    fn deref(&self) -> &T {
    +        &self.0
    +    }
    +}
    +
    +struct MyBox<T>(T);
    +
    +impl<T> MyBox<T> {
    +    fn new(x: T) -> MyBox<T> {
    +        MyBox(x)
    +    }
    +}
    +
    +fn hello(name: &str) {
    +    println!("Hello, {name}!");
    +}
    +
    +fn main() {
    +    let m = MyBox::new(String::from("Rust"));
    +    hello(&m);
    +}
    +

    示例 15-12:因为 Deref 强制转换,使用 MyBox<String> 的引用调用 hello 是可行的

    +

    这里使用 &m 调用 hello 函数,其为 MyBox<String> 值的引用。因为示例 15-10 中在 MyBox<T> 上实现了 Deref trait,Rust 可以通过 deref 调用将 &MyBox<String> 变为 &String。标准库中提供了 String 上的 Deref 实现,其会返回字符串 slice,这可以在 Deref 的 API 文档中看到。Rust 再次调用 deref&String 变为 &str,这就符合 hello 函数的定义了。

    +

    如果 Rust 没有实现 Deref 强制转换,为了使用 &MyBox<String> 类型的值调用 hello,则不得不编写示例 15-13 中的代码来代替示例 15-12:

    +

    文件名:src/main.rs

    +
    use std::ops::Deref;
    +
    +impl<T> Deref for MyBox<T> {
    +    type Target = T;
    +
    +    fn deref(&self) -> &T {
    +        &self.0
    +    }
    +}
    +
    +struct MyBox<T>(T);
    +
    +impl<T> MyBox<T> {
    +    fn new(x: T) -> MyBox<T> {
    +        MyBox(x)
    +    }
    +}
    +
    +fn hello(name: &str) {
    +    println!("Hello, {name}!");
    +}
    +
    +fn main() {
    +    let m = MyBox::new(String::from("Rust"));
    +    hello(&(*m)[..]);
    +}
    +

    示例 15-13:如果 Rust 没有 Deref 强制转换则必须编写的代码

    +

    (*m)MyBox<String> 解引用为 String。接着 &[..] 获取了整个 String 的字符串 slice 来匹配 hello 的签名。没有 Deref 强制转换所有这些符号混在一起将更难以读写和理解。Deref 强制转换使得 Rust 自动的帮我们处理这些转换。

    +

    当所涉及到的类型定义了 Deref trait,Rust 会分析这些类型并使用任意多次 Deref::deref 调用以获得匹配参数的类型。这些解析都发生在编译时,所以利用 Deref 强制转换并没有运行时损耗!

    +

    Deref 强制转换如何与可变性交互

    +

    类似于如何使用 Deref trait 重载不可变引用的 * 运算符,Rust 提供了 DerefMut trait 用于重载可变引用的 * 运算符。

    +

    Rust 在发现类型和 trait 实现满足三种情况时会进行 Deref 强制转换:

    +
      +
    • T: Deref<Target=U> 时从 &T&U
    • +
    • T: DerefMut<Target=U> 时从 &mut T&mut U
    • +
    • T: Deref<Target=U> 时从 &mut T&U
    • +
    +

    头两个情况除了第二种实现了可变性之外是相同的:第一种情况表明如果有一个 &T,而 T 实现了返回 U 类型的 Deref,则可以直接得到 &U。第二种情况表明对于可变引用也有着相同的行为。

    +

    第三个情况有些微妙:Rust 也会将可变引用强转为不可变引用。但是反之是 不可能 的:不可变引用永远也不能强转为可变引用。因为根据借用规则,如果有一个可变引用,其必须是这些数据的唯一引用(否则程序将无法编译)。将一个可变引用转换为不可变引用永远也不会打破借用规则。将不可变引用转换为可变引用则需要初始的不可变引用是数据唯一的不可变引用,而借用规则无法保证这一点。因此,Rust 无法假设将不可变引用转换为可变引用是可能的。

    +

    使用 Drop Trait 运行清理代码

    +
    +

    ch15-03-drop.md +
    +commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e

    +
    +

    对于智能指针模式来说第二个重要的 trait 是 Drop,其允许我们在值要离开作用域时执行一些代码。可以为任何类型提供 Drop trait 的实现,同时所指定的代码被用于释放类似于文件或网络连接的资源。

    +

    我们在智能指针上下文中讨论 Drop 是因为其功能几乎总是用于实现智能指针。例如,当 Box<T> 被丢弃时会释放 box 指向的堆空间。

    +

    在其他一些语言中的某些类型,我们不得不记住在每次使用完那些类型的智能指针实例后调用清理内存或资源的代码。如果忘记的话,运行代码的系统可能会因为负荷过重而崩溃。在 Rust 中,可以指定每当值离开作用域时被执行的代码,编译器会自动插入这些代码。于是我们就不需要在程序中到处编写在实例结束时清理这些变量的代码 —— 而且还不会泄漏资源。

    +

    指定在值离开作用域时应该执行的代码的方式是实现 Drop trait。Drop trait 要求实现一个叫做 drop 的方法,它获取一个 self 的可变引用。为了能够看出 Rust 何时调用 drop,让我们暂时使用 println! 语句实现 drop

    +

    示例 15-14 展示了唯一定制功能就是当其实例离开作用域时,打印出 Dropping CustomSmartPointer! 的结构体 CustomSmartPointer,这会演示 Rust 何时运行 drop 函数:

    +

    文件名:src/main.rs

    +
    struct CustomSmartPointer {
    +    data: String,
    +}
    +
    +impl Drop for CustomSmartPointer {
    +    fn drop(&mut self) {
    +        println!("Dropping CustomSmartPointer with data `{}`!", self.data);
    +    }
    +}
    +
    +fn main() {
    +    let c = CustomSmartPointer {
    +        data: String::from("my stuff"),
    +    };
    +    let d = CustomSmartPointer {
    +        data: String::from("other stuff"),
    +    };
    +    println!("CustomSmartPointers created.");
    +}
    +

    示例 15-14:结构体 CustomSmartPointer,其实现了放置清理代码的 Drop trait

    +

    Drop trait 包含在 prelude 中,所以无需导入它。我们在 CustomSmartPointer 上实现了 Drop trait,并提供了一个调用 println!drop 方法实现。drop 函数体是放置任何当类型实例离开作用域时期望运行的逻辑的地方。这里选择打印一些文本以可视化地展示 Rust 何时调用 drop

    +

    main 中,我们新建了两个 CustomSmartPointer 实例并打印出了 CustomSmartPointer created.。在 main 的结尾,CustomSmartPointer 的实例会离开作用域,而 Rust 会调用放置于 drop 方法中的代码,打印出最后的信息。注意无需显式调用 drop 方法:

    +

    当运行这个程序,会出现如下输出:

    +
    $ cargo run
    +   Compiling drop-example v0.1.0 (file:///projects/drop-example)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.60s
    +     Running `target/debug/drop-example`
    +CustomSmartPointers created.
    +Dropping CustomSmartPointer with data `other stuff`!
    +Dropping CustomSmartPointer with data `my stuff`!
    +
    +

    当实例离开作用域 Rust 会自动调用 drop,并调用我们指定的代码。变量以被创建时相反的顺序被丢弃,所以 dc 之前被丢弃。这个例子的作用是给了我们一个 drop 方法如何工作的可视化指导,不过通常需要指定类型所需执行的清理代码而不是打印信息。

    +

    通过 std::mem::drop 提早丢弃值

    +

    不幸的是,我们并不能直截了当的禁用 drop 这个功能。通常也不需要禁用 drop ;整个 Drop trait 存在的意义在于其是自动处理的。然而,有时你可能需要提早清理某个值。一个例子是当使用智能指针管理锁时;你可能希望强制运行 drop 方法来释放锁以便作用域中的其他代码可以获取锁。Rust 并不允许我们主动调用 Drop trait 的 drop 方法;当我们希望在作用域结束之前就强制释放变量的话,我们应该使用的是由标准库提供的 std::mem::drop

    +

    如果我们像是示例 15-14 那样尝试调用 Drop trait 的 drop 方法,就会得到像示例 15-15 那样的编译错误:

    +

    文件名:src/main.rs

    +
    struct CustomSmartPointer {
    +    data: String,
    +}
    +
    +impl Drop for CustomSmartPointer {
    +    fn drop(&mut self) {
    +        println!("Dropping CustomSmartPointer with data `{}`!", self.data);
    +    }
    +}
    +
    +fn main() {
    +    let c = CustomSmartPointer {
    +        data: String::from("some data"),
    +    };
    +    println!("CustomSmartPointer created.");
    +    c.drop();
    +    println!("CustomSmartPointer dropped before the end of main.");
    +}
    +

    示例 15-15:尝试手动调用 Drop trait 的 drop 方法提早清理

    +

    如果尝试编译代码会得到如下错误:

    +
    $ cargo run
    +   Compiling drop-example v0.1.0 (file:///projects/drop-example)
    +error[E0040]: explicit use of destructor method
    +  --> src/main.rs:16:7
    +   |
    +16 |     c.drop();
    +   |       ^^^^ explicit destructor calls not allowed
    +   |
    +help: consider using `drop` function
    +   |
    +16 |     drop(c);
    +   |     +++++ ~
    +
    +For more information about this error, try `rustc --explain E0040`.
    +error: could not compile `drop-example` (bin "drop-example") due to 1 previous error
    +
    +

    错误信息表明不允许显式调用 drop。错误信息使用了术语 析构函数destructor),这是一个清理实例的函数的通用编程概念。析构函数 对应创建实例的 构造函数。Rust 中的 drop 函数就是这么一个析构函数。

    +

    Rust 不允许我们显式调用 drop 因为 Rust 仍然会在 main 的结尾对值自动调用 drop,这会导致一个 double free 错误,因为 Rust 会尝试清理相同的值两次。

    +

    因为不能禁用当值离开作用域时自动插入的 drop,并且不能显式调用 drop,如果我们需要强制提早清理值,可以使用 std::mem::drop 函数。

    +

    std::mem::drop 函数不同于 Drop trait 中的 drop 方法。可以通过传递希望强制丢弃的值作为参数。std::mem::drop 位于 prelude,所以我们可以修改示例 15-15 中的 main 来调用 drop 函数。如示例 15-16 所示:

    +

    文件名:src/main.rs

    +
    struct CustomSmartPointer {
    +    data: String,
    +}
    +
    +impl Drop for CustomSmartPointer {
    +    fn drop(&mut self) {
    +        println!("Dropping CustomSmartPointer with data `{}`!", self.data);
    +    }
    +}
    +
    +fn main() {
    +    let c = CustomSmartPointer {
    +        data: String::from("some data"),
    +    };
    +    println!("CustomSmartPointer created.");
    +    drop(c);
    +    println!("CustomSmartPointer dropped before the end of main.");
    +}
    +

    示例 15-16: 在值离开作用域之前调用 std::mem::drop 显式清理

    +

    运行这段代码会打印出如下:

    +
    $ cargo run
    +   Compiling drop-example v0.1.0 (file:///projects/drop-example)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.73s
    +     Running `target/debug/drop-example`
    +CustomSmartPointer created.
    +Dropping CustomSmartPointer with data `some data`!
    +CustomSmartPointer dropped before the end of main.
    +
    +

    Dropping CustomSmartPointer with data `some data`! 出现在 CustomSmartPointer created.CustomSmartPointer dropped before the end of main. 之间,表明了 drop 方法被调用了并在此丢弃了 c

    +

    Drop trait 实现中指定的代码可以用于许多方面,来使得清理变得方便和安全:比如可以用其创建我们自己的内存分配器!通过 Drop trait 和 Rust 所有权系统,你无需担心之后的代码清理,Rust 会自动考虑这些问题。

    +

    我们也无需担心意外的清理掉仍在使用的值,这会造成编译器错误:所有权系统确保引用总是有效的,也会确保 drop 只会在值不再被使用时被调用一次。

    +

    现在我们学习了 Box<T> 和一些智能指针的特性,让我们聊聊标准库中定义的其他几种智能指针。

    +

    Rc<T> 引用计数智能指针

    +
    +

    ch15-04-rc.md +
    +commit 52fafaaa8e432e84beaaf4ea80ccba880624effd

    +
    +

    大部分情况下所有权是非常明确的:可以准确地知道哪个变量拥有某个值。然而,有些情况单个值可能会有多个所有者。例如,在图数据结构中,多个边可能指向相同的节点,而这个节点从概念上讲为所有指向它的边所拥有。节点在没有任何边指向它从而没有任何所有者之前,都不应该被清理掉。

    +

    为了启用多所有权需要显式地使用 Rust 类型 Rc<T>,其为 引用计数reference counting)的缩写。引用计数意味着记录一个值的引用数量来知晓这个值是否仍在被使用。如果某个值有零个引用,就代表没有任何有效引用并可以被清理。

    +

    可以将其想象为客厅中的电视。当一个人进来看电视时,他打开电视。其他人也可以进来看电视。当最后一个人离开房间时,他关掉电视因为它不再被使用了。如果某人在其他人还在看的时候就关掉了电视,正在看电视的人肯定会抓狂的!

    +

    Rc<T> 用于当我们希望在堆上分配一些内存供程序的多个部分读取,而且无法在编译时确定程序的哪一部分会最后结束使用它的时候。如果确实知道哪部分是最后一个结束使用的话,就可以令其成为数据的所有者,正常的所有权规则就可以在编译时生效。

    +

    注意 Rc<T> 只能用于单线程场景;第十六章并发会涉及到如何在多线程程序中进行引用计数。

    +

    使用 Rc<T> 共享数据

    +

    让我们回到示例 15-5 中使用 Box<T> 定义 cons list 的例子。这一次,我们希望创建两个共享第三个列表所有权的列表,其概念将会看起来如图 15-3 所示:

    +Two lists that share ownership of a third list +

    图 15-3: 两个列表,bc, 共享第三个列表 a 的所有权

    +

    列表 a 包含 5 之后是 10,之后是另两个列表:b 从 3 开始而 c 从 4 开始。bc 会接上包含 5 和 10 的列表 a。换句话说,这两个列表会尝试共享第一个列表所包含的 5 和 10。

    +

    尝试使用 Box<T> 定义的 List 实现并不能工作,如示例 15-17 所示:

    +

    文件名:src/main.rs

    +
    enum List {
    +    Cons(i32, Box<List>),
    +    Nil,
    +}
    +
    +use crate::List::{Cons, Nil};
    +
    +fn main() {
    +    let a = Cons(5, Box::new(Cons(10, Box::new(Nil))));
    +    let b = Cons(3, Box::new(a));
    +    let c = Cons(4, Box::new(a));
    +}
    +

    示例 15-17: 展示不能用两个 Box<T> 的列表尝试共享第三个列表的所有权

    +

    编译会得出如下错误:

    +
    $ cargo run
    +   Compiling cons-list v0.1.0 (file:///projects/cons-list)
    +error[E0382]: use of moved value: `a`
    +  --> src/main.rs:11:30
    +   |
    +9  |     let a = Cons(5, Box::new(Cons(10, Box::new(Nil))));
    +   |         - move occurs because `a` has type `List`, which does not implement the `Copy` trait
    +10 |     let b = Cons(3, Box::new(a));
    +   |                              - value moved here
    +11 |     let c = Cons(4, Box::new(a));
    +   |                              ^ value used here after move
    +
    +For more information about this error, try `rustc --explain E0382`.
    +error: could not compile `cons-list` (bin "cons-list") due to 1 previous error
    +
    +

    Cons 成员拥有其储存的数据,所以当创建 b 列表时,a 被移动进了 b 这样 b 就拥有了 a。接着当再次尝试使用 a 创建 c 时,这不被允许,因为 a 的所有权已经被移动。

    +

    可以改变 Cons 的定义来存放一个引用,不过接着必须指定生命周期参数。通过指定生命周期参数,表明列表中的每一个元素都至少与列表本身存在的一样久。这是示例 15-17 中元素与列表的情况,但并不是所有情况都如此。

    +

    相反,我们修改 List 的定义为使用 Rc<T> 代替 Box<T>,如列表 15-18 所示。现在每一个 Cons 变量都包含一个值和一个指向 ListRc<T>。当创建 b 时,不同于获取 a 的所有权,这里会克隆 a 所包含的 Rc<List>,这会将引用计数从 1 增加到 2 并允许 ab 共享 Rc<List> 中数据的所有权。创建 c 时也会克隆 a,这会将引用计数从 2 增加为 3。每次调用 Rc::cloneRc<List> 中数据的引用计数都会增加,直到有零个引用之前其数据都不会被清理。

    +

    文件名:src/main.rs

    +
    enum List {
    +    Cons(i32, Rc<List>),
    +    Nil,
    +}
    +
    +use crate::List::{Cons, Nil};
    +use std::rc::Rc;
    +
    +fn main() {
    +    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
    +    let b = Cons(3, Rc::clone(&a));
    +    let c = Cons(4, Rc::clone(&a));
    +}
    +

    示例 15-18: 使用 Rc<T> 定义的 List

    +

    需要使用 use 语句将 Rc<T> 引入作用域,因为它不在 prelude 中。在 main 中创建了存放 5 和 10 的列表并将其存放在 a 的新的 Rc<List> 中。接着当创建 bc 时,调用 Rc::clone 函数并传递 aRc<List> 的引用作为参数。

    +

    也可以调用 a.clone() 而不是 Rc::clone(&a),不过在这里 Rust 的习惯是使用 Rc::cloneRc::clone 的实现并不像大部分类型的 clone 实现那样对所有数据进行深拷贝。Rc::clone 只会增加引用计数,这并不会花费多少时间。深拷贝可能会花费很长时间。通过使用 Rc::clone 进行引用计数,可以明显的区别深拷贝类的克隆和增加引用计数类的克隆。当查找代码中的性能问题时,只需考虑深拷贝类的克隆而无需考虑 Rc::clone 调用。

    +

    克隆 Rc<T> 会增加引用计数

    +

    让我们修改示例 15-18 的代码以便观察创建和丢弃 aRc<List> 的引用时引用计数的变化。

    +

    在示例 15-19 中,修改了 main 以便将列表 c 置于内部作用域中,这样就可以观察当 c 离开作用域时引用计数如何变化。

    +

    文件名:src/main.rs

    +
    enum List {
    +    Cons(i32, Rc<List>),
    +    Nil,
    +}
    +
    +use crate::List::{Cons, Nil};
    +use std::rc::Rc;
    +
    +fn main() {
    +    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
    +    println!("count after creating a = {}", Rc::strong_count(&a));
    +    let b = Cons(3, Rc::clone(&a));
    +    println!("count after creating b = {}", Rc::strong_count(&a));
    +    {
    +        let c = Cons(4, Rc::clone(&a));
    +        println!("count after creating c = {}", Rc::strong_count(&a));
    +    }
    +    println!("count after c goes out of scope = {}", Rc::strong_count(&a));
    +}
    +

    示例 15-19:打印出引用计数

    +

    在程序中每个引用计数变化的点,会打印出引用计数,其值可以通过调用 Rc::strong_count 函数获得。这个函数叫做 strong_count 而不是 count 是因为 Rc<T> 也有 weak_count;在 “避免引用循环:将 Rc<T> 变为 Weak<T> 部分会讲解 weak_count 的用途。

    +

    这段代码会打印出:

    +
    $ cargo run
    +   Compiling cons-list v0.1.0 (file:///projects/cons-list)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.45s
    +     Running `target/debug/cons-list`
    +count after creating a = 1
    +count after creating b = 2
    +count after creating c = 3
    +count after c goes out of scope = 2
    +
    +

    我们能够看到 aRc<List> 的初始引用计数为 1,接着每次调用 clone,计数会增加 1。当 c 离开作用域时,计数减 1。不必像调用 Rc::clone 增加引用计数那样调用一个函数来减少计数;Drop trait 的实现当 Rc<T> 值离开作用域时自动减少引用计数。

    +

    从这个例子我们所不能看到的是,在 main 的结尾当 b 然后是 a 离开作用域时,此处计数会是 0,同时 Rc<List> 被完全清理。使用 Rc<T> 允许一个值有多个所有者,引用计数则确保只要任何所有者依然存在其值也保持有效。

    +

    通过不可变引用, Rc<T> 允许在程序的多个部分之间只读地共享数据。如果 Rc<T> 也允许多个可变引用,则会违反第四章讨论的借用规则之一:相同位置的多个可变借用可能造成数据竞争和不一致。不过可以修改数据是非常有用的!在下一部分,我们将讨论内部可变性模式和 RefCell<T> 类型,它可以与 Rc<T> 结合使用来处理不可变性的限制。

    +

    RefCell<T> 和内部可变性模式

    +
    +

    ch15-05-interior-mutability.md +
    +commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e

    +
    +

    内部可变性Interior mutability)是 Rust 中的一个设计模式,它允许你即使在有不可变引用时也可以改变数据,这通常是借用规则所不允许的。为了改变数据,该模式在数据结构中使用 unsafe 代码来模糊 Rust 通常的可变性和借用规则。不安全代码表明我们在手动检查这些规则而不是让编译器替我们检查。第二十章会更详细地介绍不安全代码。

    +

    当可以确保代码在运行时会遵守借用规则,即使编译器不能保证的情况,可以选择使用那些运用内部可变性模式的类型。所涉及的 unsafe 代码将被封装进安全的 API 中,而外部类型仍然是不可变的。

    +

    让我们通过遵循内部可变性模式的 RefCell<T> 类型来开始探索。

    +

    通过 RefCell<T> 在运行时检查借用规则

    +

    不同于 Rc<T>RefCell<T> 代表其数据的唯一的所有权。那么是什么让 RefCell<T> 不同于像 Box<T> 这样的类型呢?回忆一下第四章所学的借用规则:

    +
      +
    1. 在任意给定时刻,只能拥有一个可变引用或任意数量的不可变引用 之一(而不是两者)。
    2. +
    3. 引用必须总是有效的。
    4. +
    +

    对于引用和 Box<T>,借用规则的不可变性作用于编译时。对于 RefCell<T>,这些不可变性作用于 运行时。对于引用,如果违反这些规则,会得到一个编译错误。而对于 RefCell<T>,如果违反这些规则程序会 panic 并退出。

    +

    在编译时检查借用规则的优势是这些错误将在开发过程的早期被捕获,同时对运行时没有性能影响,因为所有的分析都提前完成了。为此,在编译时检查借用规则是大部分情况的最佳选择,这也正是其为何是 Rust 的默认行为。

    +

    相反在运行时检查借用规则的好处则是允许出现特定内存安全的场景,而它们在编译时检查中是不允许的。静态分析,正如 Rust 编译器,是天生保守的。但代码的一些属性不可能通过分析代码发现:其中最著名的就是 停机问题(Halting Problem),这超出了本书的范畴,不过如果你感兴趣的话这是一个值得研究的有趣主题。

    +

    因为一些分析是不可能的,如果 Rust 编译器不能通过所有权规则编译,它可能会拒绝一个正确的程序;从这种角度考虑它是保守的。如果 Rust 接受不正确的程序,那么用户也就不会相信 Rust 所做的保证了。然而,如果 Rust 拒绝正确的程序,虽然会给程序员带来不便,但不会带来灾难。RefCell<T> 正是用于当你确信代码遵守借用规则,而编译器不能理解和确定的时候。

    +

    类似于 Rc<T>RefCell<T> 只能用于单线程场景。如果尝试在多线程上下文中使用RefCell<T>,会得到一个编译错误。第十六章会介绍如何在多线程程序中使用 RefCell<T> 的功能。

    +

    如下为选择 Box<T>Rc<T>RefCell<T> 的理由:

    +
      +
    • Rc<T> 允许相同数据有多个所有者;Box<T>RefCell<T> 有单一所有者。
    • +
    • Box<T> 允许在编译时执行不可变或可变借用检查;Rc<T>仅允许在编译时执行不可变借用检查;RefCell<T> 允许在运行时执行不可变或可变借用检查。
    • +
    • 因为 RefCell<T> 允许在运行时执行可变借用检查,所以我们可以在即便 RefCell<T> 自身是不可变的情况下修改其内部的值。
    • +
    +

    在不可变值内部改变值就是 内部可变性 模式。让我们看看何时内部可变性是有用的,并讨论这是如何成为可能的。

    +

    内部可变性:不可变值的可变借用

    +

    借用规则的一个推论是当有一个不可变值时,不能可变地借用它。例如,如下代码不能编译:

    +
    fn main() {
    +    let x = 5;
    +    let y = &mut x;
    +}
    +

    如果尝试编译,会得到如下错误:

    +
    $ cargo run
    +   Compiling borrowing v0.1.0 (file:///projects/borrowing)
    +error[E0596]: cannot borrow `x` as mutable, as it is not declared as mutable
    + --> src/main.rs:3:13
    +  |
    +3 |     let y = &mut x;
    +  |             ^^^^^^ cannot borrow as mutable
    +  |
    +help: consider changing this to be mutable
    +  |
    +2 |     let mut x = 5;
    +  |         +++
    +
    +For more information about this error, try `rustc --explain E0596`.
    +error: could not compile `borrowing` (bin "borrowing") due to 1 previous error
    +
    +

    然而,特定情况下,令一个值在其方法内部能够修改自身,而在其他代码中仍视为不可变,是很有用的。值方法外部的代码就不能修改其值了。RefCell<T> 是一个获得内部可变性的方法。RefCell<T> 并没有完全绕开借用规则,编译器中的借用检查器允许内部可变性并相应地在运行时检查借用规则。如果违反了这些规则,会出现 panic 而不是编译错误。

    +

    让我们通过一个实际的例子来探索何处可以使用 RefCell<T> 来修改不可变值并看看为何这么做是有意义的。

    +

    内部可变性的用例:mock 对象

    +

    有时在测试中程序员会用某个类型替换另一个类型,以便观察特定的行为并断言它是被正确实现的。这个占位符类型被称为 测试替身(test double)。就像电影制作中的替身演员 (stunt double) 一样,替代演员完成高难度的场景。测试替身在运行测试时替代某个类型。mock 对象 是特定类型的测试替身,它们记录测试过程中发生了什么以便可以断言操作是正确的。

    +

    虽然 Rust 中的对象与其他语言中的对象并不是一回事,Rust 也没有像其他语言那样在标准库中内建 mock 对象功能,不过我们确实可以创建一个与 mock 对象有着相同功能的结构体。

    +

    如下是一个我们想要测试的场景:我们在编写一个记录某个值与最大值的差距的库,并根据当前值与最大值的差距来发送消息。例如,这个库可以用于记录用户所允许的 API 调用数量限额。

    +

    该库只提供记录与最大值的差距,以及何种情况发送什么消息的功能。使用此库的程序则期望提供实际发送消息的机制:程序可以选择记录一条消息、发送 email、发送短信等等。库本身无需知道这些细节;只需实现其提供的 Messenger trait 即可。示例 15-20 展示了库代码:

    +

    文件名:src/lib.rs

    +
    pub trait Messenger {
    +    fn send(&self, msg: &str);
    +}
    +
    +pub struct LimitTracker<'a, T: Messenger> {
    +    messenger: &'a T,
    +    value: usize,
    +    max: usize,
    +}
    +
    +impl<'a, T> LimitTracker<'a, T>
    +where
    +    T: Messenger,
    +{
    +    pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {
    +        LimitTracker {
    +            messenger,
    +            value: 0,
    +            max,
    +        }
    +    }
    +
    +    pub fn set_value(&mut self, value: usize) {
    +        self.value = value;
    +
    +        let percentage_of_max = self.value as f64 / self.max as f64;
    +
    +        if percentage_of_max >= 1.0 {
    +            self.messenger.send("Error: You are over your quota!");
    +        } else if percentage_of_max >= 0.9 {
    +            self.messenger
    +                .send("Urgent warning: You've used up over 90% of your quota!");
    +        } else if percentage_of_max >= 0.75 {
    +            self.messenger
    +                .send("Warning: You've used up over 75% of your quota!");
    +        }
    +    }
    +}
    +

    示例 15-20:一个记录某个值与最大值差距的库,并根据此值的特定级别发出警告

    +

    这些代码中一个重要部分是拥有一个方法 sendMessenger trait,其获取一个 self 的不可变引用和文本信息。这个 trait 是 mock 对象所需要实现的接口库,这样 mock 就能像一个真正的对象那样使用了。另一个重要的部分是我们需要测试 LimitTrackerset_value 方法的行为。可以改变传递的 value 参数的值,不过 set_value 并没有返回任何可供断言的值。我们希望能够说,如果我们创建一个实现了 Messenger trait 和具有特定 max 值的 LimitTracker 时,当传递不同 value 值时,消息发送者应被告知发送合适的消息。

    +

    我们所需的 mock 对象是,调用 send 并不实际发送 email 或消息,而是只记录信息被通知要发送了。可以新建一个 mock 对象实例,用其创建 LimitTracker,调用 LimitTrackerset_value 方法,然后检查 mock 对象是否有我们期望的消息。示例 15-21 展示了一个如此尝试的 mock 对象实现,不过借用检查器并不允许:

    +

    文件名:src/lib.rs

    +
    pub trait Messenger {
    +    fn send(&self, msg: &str);
    +}
    +
    +pub struct LimitTracker<'a, T: Messenger> {
    +    messenger: &'a T,
    +    value: usize,
    +    max: usize,
    +}
    +
    +impl<'a, T> LimitTracker<'a, T>
    +where
    +    T: Messenger,
    +{
    +    pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {
    +        LimitTracker {
    +            messenger,
    +            value: 0,
    +            max,
    +        }
    +    }
    +
    +    pub fn set_value(&mut self, value: usize) {
    +        self.value = value;
    +
    +        let percentage_of_max = self.value as f64 / self.max as f64;
    +
    +        if percentage_of_max >= 1.0 {
    +            self.messenger.send("Error: You are over your quota!");
    +        } else if percentage_of_max >= 0.9 {
    +            self.messenger
    +                .send("Urgent warning: You've used up over 90% of your quota!");
    +        } else if percentage_of_max >= 0.75 {
    +            self.messenger
    +                .send("Warning: You've used up over 75% of your quota!");
    +        }
    +    }
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    struct MockMessenger {
    +        sent_messages: Vec<String>,
    +    }
    +
    +    impl MockMessenger {
    +        fn new() -> MockMessenger {
    +            MockMessenger {
    +                sent_messages: vec![],
    +            }
    +        }
    +    }
    +
    +    impl Messenger for MockMessenger {
    +        fn send(&self, message: &str) {
    +            self.sent_messages.push(String::from(message));
    +        }
    +    }
    +
    +    #[test]
    +    fn it_sends_an_over_75_percent_warning_message() {
    +        let mock_messenger = MockMessenger::new();
    +        let mut limit_tracker = LimitTracker::new(&mock_messenger, 100);
    +
    +        limit_tracker.set_value(80);
    +
    +        assert_eq!(mock_messenger.sent_messages.len(), 1);
    +    }
    +}
    +

    示例 15-21:尝试实现 MockMessenger,借用检查器不允许这么做

    +

    测试代码定义了一个 MockMessenger 结构体,其 sent_messages 字段为一个 String 值的 Vec 用来记录被告知发送的消息。我们还定义了一个关联函数 new 以便于新建从空消息列表开始的 MockMessenger 值。接着为 MockMessenger 实现 Messenger trait 这样就可以为 LimitTracker 提供一个 MockMessenger。在 send 方法的定义中,获取传入的消息作为参数并储存在 MockMessengersent_messages 列表中。

    +

    在测试中,我们测试了当 LimitTracker 被告知将 value 设置为超过 max 值 75% 的某个值。首先新建一个 MockMessenger,其从空消息列表开始。接着新建一个 LimitTracker 并传递新建 MockMessenger 的引用和 max 值 100。我们使用值 80 调用 LimitTrackerset_value 方法,这超过了 100 的 75%。接着断言 MockMessenger 中记录的消息列表应该有一条消息。

    +

    然而,这个测试是有问题的:

    +
    $ cargo test
    +   Compiling limit-tracker v0.1.0 (file:///projects/limit-tracker)
    +error[E0596]: cannot borrow `self.sent_messages` as mutable, as it is behind a `&` reference
    +  --> src/lib.rs:58:13
    +   |
    +58 |             self.sent_messages.push(String::from(message));
    +   |             ^^^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable
    +   |
    +help: consider changing this to be a mutable reference in the `impl` method and the `trait` definition
    +   |
    +2  ~     fn send(&mut self, msg: &str);
    +3  | }
    +...
    +56 |     impl Messenger for MockMessenger {
    +57 ~         fn send(&mut self, message: &str) {
    +   |
    +
    +For more information about this error, try `rustc --explain E0596`.
    +error: could not compile `limit-tracker` (lib test) due to 1 previous error
    +
    +

    不能修改 MockMessenger 来记录消息,因为 send 方法获取了 self 的不可变引用。我们也不能参考错误文本的建议使用 &mut self 替代,因为这样 send 的签名就不符合 Messenger trait 定义中的签名了(可以试着这么改,看看会出现什么错误信息)。

    +

    这正是内部可变性的用武之地!我们将通过 RefCell 来储存 sent_messages,然后 send 将能够修改 sent_messages 并储存消息。示例 15-22 展示了代码:

    +

    文件名:src/lib.rs

    +
    pub trait Messenger {
    +    fn send(&self, msg: &str);
    +}
    +
    +pub struct LimitTracker<'a, T: Messenger> {
    +    messenger: &'a T,
    +    value: usize,
    +    max: usize,
    +}
    +
    +impl<'a, T> LimitTracker<'a, T>
    +where
    +    T: Messenger,
    +{
    +    pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {
    +        LimitTracker {
    +            messenger,
    +            value: 0,
    +            max,
    +        }
    +    }
    +
    +    pub fn set_value(&mut self, value: usize) {
    +        self.value = value;
    +
    +        let percentage_of_max = self.value as f64 / self.max as f64;
    +
    +        if percentage_of_max >= 1.0 {
    +            self.messenger.send("Error: You are over your quota!");
    +        } else if percentage_of_max >= 0.9 {
    +            self.messenger
    +                .send("Urgent warning: You've used up over 90% of your quota!");
    +        } else if percentage_of_max >= 0.75 {
    +            self.messenger
    +                .send("Warning: You've used up over 75% of your quota!");
    +        }
    +    }
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +    use std::cell::RefCell;
    +
    +    struct MockMessenger {
    +        sent_messages: RefCell<Vec<String>>,
    +    }
    +
    +    impl MockMessenger {
    +        fn new() -> MockMessenger {
    +            MockMessenger {
    +                sent_messages: RefCell::new(vec![]),
    +            }
    +        }
    +    }
    +
    +    impl Messenger for MockMessenger {
    +        fn send(&self, message: &str) {
    +            self.sent_messages.borrow_mut().push(String::from(message));
    +        }
    +    }
    +
    +    #[test]
    +    fn it_sends_an_over_75_percent_warning_message() {
    +        // --snip--
    +        let mock_messenger = MockMessenger::new();
    +        let mut limit_tracker = LimitTracker::new(&mock_messenger, 100);
    +
    +        limit_tracker.set_value(80);
    +
    +        assert_eq!(mock_messenger.sent_messages.borrow().len(), 1);
    +    }
    +}
    +

    示例 15-22:使用 RefCell<T> 能够在外部值被认为是不可变的情况下修改内部值

    +

    现在 sent_messages 字段的类型是 RefCell<Vec<String>> 而不是 Vec<String>。在 new 函数中新建了一个 RefCell<Vec<String>> 实例替代空 vector。

    +

    对于 send 方法的实现,第一个参数仍为 self 的不可变借用,这是符合方法定义的。我们调用 self.sent_messagesRefCellborrow_mut 方法来获取 RefCell 中值的可变引用,这是一个 vector。接着可以对 vector 的可变引用调用 push 以便记录测试过程中看到的消息。

    +

    最后必须做出的修改位于断言中:为了看到其内部 vector 中有多少个项,需要调用 RefCellborrow 以获取 vector 的不可变引用。

    +

    现在我们见识了如何使用 RefCell<T>,让我们研究一下它怎样工作的!

    +

    RefCell<T> 在运行时记录借用

    +

    当创建不可变和可变引用时,我们分别使用 &&mut 语法。对于 RefCell<T> 来说,则是 borrowborrow_mut 方法,这属于 RefCell<T> 安全 API 的一部分。borrow 方法返回 Ref<T> 类型的智能指针,borrow_mut 方法返回 RefMut<T> 类型的智能指针。这两个类型都实现了 Deref,所以可以当作常规引用对待。

    +

    RefCell<T> 记录当前有多少个活动的 Ref<T>RefMut<T> 智能指针。每次调用 borrowRefCell<T> 将活动的不可变借用计数加一。当 Ref<T> 值离开作用域时,不可变借用计数减一。就像编译时借用规则一样,RefCell<T> 在任何时候只允许有多个不可变借用或一个可变借用。

    +

    如果我们尝试违反这些规则,相比引用时的编译时错误,RefCell<T> 的实现会在运行时出现 panic。示例 15-23 展示了对示例 15-22 中 send 实现的修改,这里我们故意尝试在相同作用域创建两个可变借用以便演示 RefCell<T> 不允许我们在运行时这么做:

    +

    文件名:src/lib.rs

    +
    pub trait Messenger {
    +    fn send(&self, msg: &str);
    +}
    +
    +pub struct LimitTracker<'a, T: Messenger> {
    +    messenger: &'a T,
    +    value: usize,
    +    max: usize,
    +}
    +
    +impl<'a, T> LimitTracker<'a, T>
    +where
    +    T: Messenger,
    +{
    +    pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {
    +        LimitTracker {
    +            messenger,
    +            value: 0,
    +            max,
    +        }
    +    }
    +
    +    pub fn set_value(&mut self, value: usize) {
    +        self.value = value;
    +
    +        let percentage_of_max = self.value as f64 / self.max as f64;
    +
    +        if percentage_of_max >= 1.0 {
    +            self.messenger.send("Error: You are over your quota!");
    +        } else if percentage_of_max >= 0.9 {
    +            self.messenger
    +                .send("Urgent warning: You've used up over 90% of your quota!");
    +        } else if percentage_of_max >= 0.75 {
    +            self.messenger
    +                .send("Warning: You've used up over 75% of your quota!");
    +        }
    +    }
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +    use std::cell::RefCell;
    +
    +    struct MockMessenger {
    +        sent_messages: RefCell<Vec<String>>,
    +    }
    +
    +    impl MockMessenger {
    +        fn new() -> MockMessenger {
    +            MockMessenger {
    +                sent_messages: RefCell::new(vec![]),
    +            }
    +        }
    +    }
    +
    +    impl Messenger for MockMessenger {
    +        fn send(&self, message: &str) {
    +            let mut one_borrow = self.sent_messages.borrow_mut();
    +            let mut two_borrow = self.sent_messages.borrow_mut();
    +
    +            one_borrow.push(String::from(message));
    +            two_borrow.push(String::from(message));
    +        }
    +    }
    +
    +    #[test]
    +    fn it_sends_an_over_75_percent_warning_message() {
    +        let mock_messenger = MockMessenger::new();
    +        let mut limit_tracker = LimitTracker::new(&mock_messenger, 100);
    +
    +        limit_tracker.set_value(80);
    +
    +        assert_eq!(mock_messenger.sent_messages.borrow().len(), 1);
    +    }
    +}
    +

    示例 15-23:在同一作用域中创建两个可变引用并观察 RefCell<T> panic

    +

    这里为 borrow_mut 返回的 RefMut 智能指针创建了 one_borrow 变量。接着用相同的方式在变量 two_borrow 创建了另一个可变借用。这会在相同作用域中创建两个可变引用,这是不允许的。当运行库的测试时,示例 15-23 编译时不会有任何错误,不过测试会失败:

    +
    $ cargo test
    +   Compiling limit-tracker v0.1.0 (file:///projects/limit-tracker)
    +    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.91s
    +     Running unittests src/lib.rs (target/debug/deps/limit_tracker-e599811fa246dbde)
    +
    +running 1 test
    +test tests::it_sends_an_over_75_percent_warning_message ... FAILED
    +
    +failures:
    +
    +---- tests::it_sends_an_over_75_percent_warning_message stdout ----
    +thread 'tests::it_sends_an_over_75_percent_warning_message' panicked at src/lib.rs:60:53:
    +already borrowed: BorrowMutError
    +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    +
    +
    +failures:
    +    tests::it_sends_an_over_75_percent_warning_message
    +
    +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    +
    +error: test failed, to rerun pass `--lib`
    +
    +

    注意代码 panic 和信息 already borrowed: BorrowMutError。这也就是 RefCell<T> 如何在运行时处理违反借用规则的情况。

    +

    像我们这里这样选择在运行时捕获借用错误而不是编译时意味着会发现在开发过程的后期才会发现的潜在错误,甚至有可能发布到生产环境才会发现。还会因为在运行时而不是编译时记录借用而导致少量的运行时性能惩罚。然而,使用 RefCell 使得在只允许不可变值的上下文中编写修改自身以记录消息的 mock 对象成为可能。虽然有取舍,但是我们可以选择使用 RefCell<T> 来获得比常规引用所能提供的更多的功能。

    +

    结合 Rc<T>RefCell<T> 来拥有多个可变数据所有者

    +

    RefCell<T> 的一个常见用法是与 Rc<T> 结合。回忆一下 Rc<T> 允许对相同数据有多个所有者,不过只能提供数据的不可变访问。如果有一个储存了 RefCell<T>Rc<T> 的话,就可以得到有多个所有者 并且 可以修改的值了!

    +

    例如,回忆示例 15-18 的 cons list 的例子中使用 Rc<T> 使得多个列表共享另一个列表的所有权。因为 Rc<T> 只存放不可变值,所以一旦创建了这些列表值后就不能修改。让我们加入 RefCell<T> 来获得修改列表中值的能力。示例 15-24 展示了通过在 Cons 定义中使用 RefCell<T>,我们就允许修改所有列表中的值了:

    +

    文件名:src/main.rs

    +
    #[derive(Debug)]
    +enum List {
    +    Cons(Rc<RefCell<i32>>, Rc<List>),
    +    Nil,
    +}
    +
    +use crate::List::{Cons, Nil};
    +use std::cell::RefCell;
    +use std::rc::Rc;
    +
    +fn main() {
    +    let value = Rc::new(RefCell::new(5));
    +
    +    let a = Rc::new(Cons(Rc::clone(&value), Rc::new(Nil)));
    +
    +    let b = Cons(Rc::new(RefCell::new(3)), Rc::clone(&a));
    +    let c = Cons(Rc::new(RefCell::new(4)), Rc::clone(&a));
    +
    +    *value.borrow_mut() += 10;
    +
    +    println!("a after = {a:?}");
    +    println!("b after = {b:?}");
    +    println!("c after = {c:?}");
    +}
    +

    示例 15-24:使用 Rc<RefCell<i32>> 创建可以修改的 List

    +

    这里创建了一个 Rc<RefCell<i32>> 实例并储存在变量 value 中以便之后直接访问。接着在 a 中用包含 valueCons 成员创建了一个 List。需要克隆 value 以便 avalue 都能拥有其内部值 5 的所有权,而不是将所有权从 value 移动到 a 或者让 a 借用 value

    +

    我们将列表 a 封装进了 Rc<T> 这样当创建列表 bc 时,它们都可以引用 a,正如示例 15-18 一样。

    +

    一旦创建了列表 abc,我们将 value 的值加 10。为此对 value 调用了 borrow_mut,这里使用了第五章讨论的自动解引用功能(-> 运算符到哪去了?” 部分)来解引用 Rc<T> 以获取其内部的 RefCell<T> 值。borrow_mut 方法返回 RefMut<T> 智能指针,可以对其使用解引用运算符并修改其内部值。

    +

    当我们打印出 abc 时,可以看到它们都拥有修改后的值 15 而不是 5:

    +
    $ cargo run
    +   Compiling cons-list v0.1.0 (file:///projects/cons-list)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.63s
    +     Running `target/debug/cons-list`
    +a after = Cons(RefCell { value: 15 }, Nil)
    +b after = Cons(RefCell { value: 3 }, Cons(RefCell { value: 15 }, Nil))
    +c after = Cons(RefCell { value: 4 }, Cons(RefCell { value: 15 }, Nil))
    +
    +

    这是非常巧妙的!通过使用 RefCell<T>,我们可以拥有一个表面上不可变的 List,不过可以使用 RefCell<T> 中提供内部可变性的方法来在需要时修改数据。RefCell<T> 的运行时借用规则检查也确实保护我们免于出现数据竞争——有时为了数据结构的灵活性而付出一些性能是值得的。注意 RefCell<T> 不能用于多线程代码!Mutex<T> 是一个线程安全版本的 RefCell<T> ,我们会在第十六章讨论 Mutex<T>

    +

    引用循环与内存泄漏

    +
    +

    ch15-06-reference-cycles.md +
    +commit c06006157b14b3d47b5c716fc392b77f3b2e21ce

    +
    +

    Rust 的内存安全性保证使其难以意外地制造永远也不会被清理的内存(被称为 内存泄漏memory leak)),但并不是不可能。Rust 并不保证完全防止内存泄漏,这意味着内存泄漏在 Rust 中被认为是内存安全的。这一点可以通过 Rc<T>RefCell<T> 看出:创建引用循环的可能性是存在的。这会造成内存泄漏,因为每一项的引用计数永远也到不了 0,持有的数据也就永远不会被释放。

    +

    制造引用循环

    +

    让我们看看引用循环是如何发生的以及如何避免它。以示例 15-25 中的 List 枚举和 tail 方法的定义开始:

    +

    文件名:src/main.rs

    +
    use crate::List::{Cons, Nil};
    +use std::cell::RefCell;
    +use std::rc::Rc;
    +
    +#[derive(Debug)]
    +enum List {
    +    Cons(i32, RefCell<Rc<List>>),
    +    Nil,
    +}
    +
    +impl List {
    +    fn tail(&self) -> Option<&RefCell<Rc<List>>> {
    +        match self {
    +            Cons(_, item) => Some(item),
    +            Nil => None,
    +        }
    +    }
    +}
    +
    +fn main() {}
    +

    示例 15-25: 一个存放 RefCell 的 cons list 定义,这样可以修改 Cons 成员所引用的数据

    +

    这里采用了示例 15-5 中 List 定义的另一种变体。现在 Cons 成员的第二个元素是 RefCell<Rc<List>>,这意味着不同于像示例 15-24 那样能够修改 i32 的值,我们希望能够修改 Cons 成员所指向的 List。这里还增加了一个 tail 方法来方便我们在有 Cons 成员的时候访问其第二项。

    +

    在示例 15-26 中增加了一个 main 函数,其使用了示例 15-25 中的定义。这些代码在 a 中创建了一个列表,一个指向 a 中列表的 b 列表,接着修改 a 中的列表指向 b 中的列表,这会创建一个引用循环。在这个过程的多个位置有 println! 语句展示引用计数。

    +

    文件:src/main.rs

    +
    use crate::List::{Cons, Nil};
    +use std::cell::RefCell;
    +use std::rc::Rc;
    +
    +#[derive(Debug)]
    +enum List {
    +    Cons(i32, RefCell<Rc<List>>),
    +    Nil,
    +}
    +
    +impl List {
    +    fn tail(&self) -> Option<&RefCell<Rc<List>>> {
    +        match self {
    +            Cons(_, item) => Some(item),
    +            Nil => None,
    +        }
    +    }
    +}
    +
    +fn main() {
    +    let a = Rc::new(Cons(5, RefCell::new(Rc::new(Nil))));
    +
    +    println!("a initial rc count = {}", Rc::strong_count(&a));
    +    println!("a next item = {:?}", a.tail());
    +
    +    let b = Rc::new(Cons(10, RefCell::new(Rc::clone(&a))));
    +
    +    println!("a rc count after b creation = {}", Rc::strong_count(&a));
    +    println!("b initial rc count = {}", Rc::strong_count(&b));
    +    println!("b next item = {:?}", b.tail());
    +
    +    if let Some(link) = a.tail() {
    +        *link.borrow_mut() = Rc::clone(&b);
    +    }
    +
    +    println!("b rc count after changing a = {}", Rc::strong_count(&b));
    +    println!("a rc count after changing a = {}", Rc::strong_count(&a));
    +
    +    // Uncomment the next line to see that we have a cycle;
    +    // it will overflow the stack
    +    // println!("a next item = {:?}", a.tail());
    +}
    +

    示例 15-26:创建一个引用循环:两个 List 值互相指向彼此

    +

    这里在变量 a 中创建了一个 Rc<List> 实例来存放初值为 5, NilList 值。接着在变量 b 中创建了存放包含值 10 和指向列表 aList 的另一个 Rc<List> 实例。

    +

    最后,修改 a 使其指向 b 而不是 Nil,这就创建了一个循环。为此需要使用 tail 方法获取 aRefCell<Rc<List>> 的引用,并放入变量 link 中。接着使用 RefCell<Rc<List>>borrow_mut 方法将其值从存放 NilRc<List> 修改为 b 中的 Rc<List>

    +

    如果保持最后的 println! 行注释并运行代码,会得到如下输出:

    +
    $ cargo run
    +   Compiling cons-list v0.1.0 (file:///projects/cons-list)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.53s
    +     Running `target/debug/cons-list`
    +a initial rc count = 1
    +a next item = Some(RefCell { value: Nil })
    +a rc count after b creation = 2
    +b initial rc count = 1
    +b next item = Some(RefCell { value: Cons(5, RefCell { value: Nil }) })
    +b rc count after changing a = 2
    +a rc count after changing a = 2
    +
    +

    可以看到将列表 a 修改为指向 b 之后, ab 中的 Rc<List> 实例的引用计数都是 2。在 main 的结尾,Rust 丢弃 b,这会使 b Rc<List> 实例的引用计数从 2 减为 1。然而,b Rc<List> 不能被回收,因为其引用计数是 1 而不是 0。接下来 Rust 会丢弃 aa Rc<List> 实例的引用计数从 2 减为 1。这个实例也不能被回收,因为 b Rc<List> 实例依然引用它,所以其引用计数是 1。这些列表的内存将永远保持未被回收的状态。为了更形象的展示,我们创建了一个如图 15-4 所示的引用循环:

    +Reference cycle of lists +

    图 15-4: 列表 ab 彼此互相指向形成引用循环

    +

    如果取消最后 println! 的注释并运行程序,Rust 会尝试打印出 a 指向 b 指向 a 这样的循环直到栈溢出。

    +

    相比真实世界的程序,这个例子中创建引用循环的结果并不可怕。创建了引用循环之后程序立刻就结束了。如果在更为复杂的程序中并在循环里分配了很多内存并占有很长时间,这个程序会使用多于它所需要的内存,并有可能压垮系统并造成没有内存可供使用。

    +

    创建引用循环并不容易,但也不是不可能。如果你有包含 Rc<T>RefCell<T> 值或类似的嵌套结合了内部可变性和引用计数的类型,请务必小心确保你没有形成一个引用循环;你无法指望 Rust 帮你捕获它们。创建引用循环是一个程序上的逻辑 bug,你应该使用自动化测试、代码评审和其他软件开发最佳实践来使其最小化。

    +

    另一个解决方案是重新组织数据结构,使得一部分引用拥有所有权而另一部分没有。换句话说,循环将由一些拥有所有权的关系和一些无所有权的关系组成,只有所有权关系才能影响值是否可以被丢弃。在示例 15-25 中,我们总是希望 Cons 成员拥有其列表,所以重新组织数据结构是不可能的。让我们看看一个由父节点和子节点构成的图的例子,观察何时是使用无所有权的关系来避免引用循环的合适时机。

    +

    避免引用循环:将 Rc<T> 变为 Weak<T>

    +

    到目前为止,我们已经展示了调用 Rc::clone 会增加 Rc<T> 实例的 strong_count,和只在其 strong_count 为 0 时才会被清理的 Rc<T> 实例。你也可以通过调用 Rc::downgrade 并传递 Rc<T> 实例的引用来创建其值的 弱引用weak reference)。强引用代表如何共享 Rc<T> 实例的所有权。弱引用并不属于所有权关系,当 Rc<T> 实例被清理时其计数没有影响。它们不会造成引用循环,因为任何涉及弱引用的循环会在其相关的值的强引用计数为 0 时被打断。

    +

    调用 Rc::downgrade 时会得到 Weak<T> 类型的智能指针。不同于将 Rc<T> 实例的 strong_count 加 1,调用 Rc::downgrade 会将 weak_count 加 1。Rc<T> 类型使用 weak_count 来记录其存在多少个 Weak<T> 引用,类似于 strong_count。其区别在于 weak_count 无需计数为 0 就能使 Rc<T> 实例被清理。

    +

    强引用代表如何共享 Rc<T> 实例的所有权,但弱引用并不属于所有权关系。它们不会造成引用循环,因为任何弱引用的循环会在其相关的强引用计数为 0 时被打断。

    +

    因为 Weak<T> 引用的值可能已经被丢弃了,为了使用 Weak<T> 所指向的值,我们必须确保其值仍然有效。为此可以调用 Weak<T> 实例的 upgrade 方法,这会返回 Option<Rc<T>>。如果 Rc<T> 值还未被丢弃,则结果是 Some;如果 Rc<T> 已被丢弃,则结果是 None。因为 upgrade 返回一个 Option<Rc<T>>,Rust 会确保处理 SomeNone 的情况,所以它不会返回非法指针。

    +

    我们会创建一个某项知道其子项和父项的树形结构的例子,而不是只知道其下一项的列表。

    +

    创建树形数据结构:带有子节点的 Node

    +

    在最开始,我们将会构建一个带有子节点的树。让我们创建一个用于存放其拥有所有权的 i32 值和其子节点引用的 Node

    +

    文件名:src/main.rs

    +
    use std::cell::RefCell;
    +use std::rc::Rc;
    +
    +#[derive(Debug)]
    +struct Node {
    +    value: i32,
    +    children: RefCell<Vec<Rc<Node>>>,
    +}
    +
    +fn main() {
    +    let leaf = Rc::new(Node {
    +        value: 3,
    +        children: RefCell::new(vec![]),
    +    });
    +
    +    let branch = Rc::new(Node {
    +        value: 5,
    +        children: RefCell::new(vec![Rc::clone(&leaf)]),
    +    });
    +}
    +

    我们希望 Node 能够拥有其子节点,同时也希望能将所有权共享给变量,以便可以直接访问树中的每一个 Node,为此 Vec<T> 的项的类型被定义为 Rc<Node>。我们还希望能修改其他节点的子节点,所以 childrenVec<Rc<Node>> 被放进了 RefCell<T>

    +

    接下来,使用此结构体定义来创建一个叫做 leaf 的带有值 3 且没有子节点的 Node 实例,和另一个带有值 5 并以 leaf 作为子节点的实例 branch,如示例 15-27 所示:

    +

    文件名:src/main.rs

    +
    use std::cell::RefCell;
    +use std::rc::Rc;
    +
    +#[derive(Debug)]
    +struct Node {
    +    value: i32,
    +    children: RefCell<Vec<Rc<Node>>>,
    +}
    +
    +fn main() {
    +    let leaf = Rc::new(Node {
    +        value: 3,
    +        children: RefCell::new(vec![]),
    +    });
    +
    +    let branch = Rc::new(Node {
    +        value: 5,
    +        children: RefCell::new(vec![Rc::clone(&leaf)]),
    +    });
    +}
    +

    示例 15-27:创建没有子节点的 leaf 节点和以 leaf 作为子节点的 branch 节点

    +

    这里克隆了 leaf 中的 Rc<Node> 并储存在 branch 中,这意味着 leaf 中的 Node 现在有两个所有者:leafbranch。可以通过 branch.childrenbranch 中获得 leaf,不过无法从 leafbranchleaf 没有到 branch 的引用且并不知道它们相互关联。我们希望 leaf 知道 branch 是其父节点。稍后我们会这么做。

    +

    增加从子到父的引用

    +

    为了使子节点知道其父节点,需要在 Node 结构体定义中增加一个 parent 字段。问题是 parent 的类型应该是什么。我们知道其不能包含 Rc<T>,因为这样 leaf.parent 将会指向 branchbranch.children 会包含 leaf 的指针,这会形成引用循环,会造成其 strong_count 永远也不会为 0。

    +

    现在换一种方式思考这个关系,父节点应该拥有其子节点:如果父节点被丢弃了,其子节点也应该被丢弃。然而子节点不应该拥有其父节点:如果丢弃子节点,其父节点应该依然存在。这正是弱引用的例子!

    +

    所以 parent 使用 Weak<T> 类型而不是 Rc<T>,具体来说是 RefCell<Weak<Node>>。现在 Node 结构体定义看起来像这样:

    +

    文件名:src/main.rs

    +
    use std::cell::RefCell;
    +use std::rc::{Rc, Weak};
    +
    +#[derive(Debug)]
    +struct Node {
    +    value: i32,
    +    parent: RefCell<Weak<Node>>,
    +    children: RefCell<Vec<Rc<Node>>>,
    +}
    +
    +fn main() {
    +    let leaf = Rc::new(Node {
    +        value: 3,
    +        parent: RefCell::new(Weak::new()),
    +        children: RefCell::new(vec![]),
    +    });
    +
    +    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
    +
    +    let branch = Rc::new(Node {
    +        value: 5,
    +        parent: RefCell::new(Weak::new()),
    +        children: RefCell::new(vec![Rc::clone(&leaf)]),
    +    });
    +
    +    *leaf.parent.borrow_mut() = Rc::downgrade(&branch);
    +
    +    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
    +}
    +

    这样,一个节点就能够引用其父节点,但不拥有其父节点。在示例 15-28 中,我们更新 main 来使用新定义以便 leaf 节点可以通过 branch 引用其父节点:

    +

    文件名:src/main.rs

    +
    use std::cell::RefCell;
    +use std::rc::{Rc, Weak};
    +
    +#[derive(Debug)]
    +struct Node {
    +    value: i32,
    +    parent: RefCell<Weak<Node>>,
    +    children: RefCell<Vec<Rc<Node>>>,
    +}
    +
    +fn main() {
    +    let leaf = Rc::new(Node {
    +        value: 3,
    +        parent: RefCell::new(Weak::new()),
    +        children: RefCell::new(vec![]),
    +    });
    +
    +    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
    +
    +    let branch = Rc::new(Node {
    +        value: 5,
    +        parent: RefCell::new(Weak::new()),
    +        children: RefCell::new(vec![Rc::clone(&leaf)]),
    +    });
    +
    +    *leaf.parent.borrow_mut() = Rc::downgrade(&branch);
    +
    +    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
    +}
    +

    示例 15-28:一个 leaf 节点,其拥有指向其父节点 branchWeak 引用

    +

    创建 leaf 节点类似于示例 15-27,除了 parent 字段有所不同:leaf 开始时没有父节点,所以我们新建了一个空的 Weak 引用实例。

    +

    此时,当尝试使用 upgrade 方法获取 leaf 的父节点引用时,会得到一个 None 值。如第一个 println! 输出所示:

    +
    leaf parent = None
    +
    +

    当创建 branch 节点时,其也会新建一个 Weak<Node> 引用,因为 branch 并没有父节点。leaf 仍然作为 branch 的一个子节点。一旦在 branch 中有了 Node 实例,就可以修改 leaf 使其拥有指向父节点的 Weak<Node> 引用。这里使用了 leafparent 字段里的 RefCell<Weak<Node>>borrow_mut 方法,接着使用了 Rc::downgrade 函数来从 branch 中的 Rc<Node> 值创建了一个指向 branchWeak<Node> 引用。

    +

    当再次打印出 leaf 的父节点时,这一次将会得到存放了 branchSome 值:现在 leaf 可以访问其父节点了!当打印出 leaf 时,我们也避免了如示例 15-26 中最终会导致栈溢出的循环:Weak<Node> 引用被打印为 (Weak)

    +
    leaf parent = Some(Node { value: 5, parent: RefCell { value: (Weak) },
    +children: RefCell { value: [Node { value: 3, parent: RefCell { value: (Weak) },
    +children: RefCell { value: [] } }] } })
    +
    +

    没有无限的输出表明这段代码并没有造成引用循环。这一点也可以从观察 Rc::strong_countRc::weak_count 调用的结果看出。

    +

    可视化 strong_countweak_count 的改变

    +

    让我们通过创建了一个新的内部作用域并将 branch 的创建放入其中,来观察 Rc<Node> 实例的 strong_countweak_count 值的变化。这会展示当 branch 创建和离开作用域被丢弃时会发生什么。这些修改如示例 15-29 所示:

    +

    文件名:src/main.rs

    +
    use std::cell::RefCell;
    +use std::rc::{Rc, Weak};
    +
    +#[derive(Debug)]
    +struct Node {
    +    value: i32,
    +    parent: RefCell<Weak<Node>>,
    +    children: RefCell<Vec<Rc<Node>>>,
    +}
    +
    +fn main() {
    +    let leaf = Rc::new(Node {
    +        value: 3,
    +        parent: RefCell::new(Weak::new()),
    +        children: RefCell::new(vec![]),
    +    });
    +
    +    println!(
    +        "leaf strong = {}, weak = {}",
    +        Rc::strong_count(&leaf),
    +        Rc::weak_count(&leaf),
    +    );
    +
    +    {
    +        let branch = Rc::new(Node {
    +            value: 5,
    +            parent: RefCell::new(Weak::new()),
    +            children: RefCell::new(vec![Rc::clone(&leaf)]),
    +        });
    +
    +        *leaf.parent.borrow_mut() = Rc::downgrade(&branch);
    +
    +        println!(
    +            "branch strong = {}, weak = {}",
    +            Rc::strong_count(&branch),
    +            Rc::weak_count(&branch),
    +        );
    +
    +        println!(
    +            "leaf strong = {}, weak = {}",
    +            Rc::strong_count(&leaf),
    +            Rc::weak_count(&leaf),
    +        );
    +    }
    +
    +    println!("leaf parent = {:?}", leaf.parent.borrow().upgrade());
    +    println!(
    +        "leaf strong = {}, weak = {}",
    +        Rc::strong_count(&leaf),
    +        Rc::weak_count(&leaf),
    +    );
    +}
    +

    示例 15-29:在内部作用域创建 branch 并检查其强弱引用计数

    +

    一旦创建了 leaf,其 Rc<Node> 的强引用计数为 1,弱引用计数为 0。在内部作用域中创建了 branch 并与 leaf 相关联,此时 branchRc<Node> 的强引用计数为 1,弱引用计数为 1(因为 leaf.parent 通过 Weak<Node> 指向 branch)。这里 leaf 的强引用计数为 2,因为现在 branchbranch.children 中储存了 leafRc<Node> 的拷贝,不过弱引用计数仍然为 0。

    +

    当内部作用域结束时,branch 离开作用域,Rc<Node> 的强引用计数减少为 0,所以其 Node 被丢弃。来自 leaf.parent 的弱引用计数 1 与 Node 是否被丢弃无关,所以并没有产生任何内存泄漏!

    +

    如果在内部作用域结束后尝试访问 leaf 的父节点,会再次得到 None。在程序的结尾,leafRc<Node> 的强引用计数为 1,弱引用计数为 0,因为现在 leaf 又是 Rc<Node> 唯一的引用了。

    +

    所有这些管理计数和值的逻辑都内建于 Rc<T>Weak<T> 以及它们的 Drop trait 实现中。通过在 Node 定义中指定从子节点到父节点的关系为一个Weak<T>引用,就能够拥有父节点和子节点之间的双向引用而不会造成引用循环和内存泄漏。

    +

    总结

    +

    这一章涵盖了如何使用智能指针来做出不同于 Rust 常规引用默认所提供的保证与取舍。Box<T> 有一个已知的大小并指向分配在堆上的数据。Rc<T> 记录了堆上数据的引用数量以便可以拥有多个所有者。RefCell<T> 和其内部可变性提供了一个可以用于当需要不可变类型但是需要改变其内部值能力的类型,并在运行时而不是编译时检查借用规则。

    +

    我们还介绍了提供了很多智能指针功能的 trait DerefDrop。同时探索了会造成内存泄漏的引用循环,以及如何使用 Weak<T> 来避免它们。

    +

    如果本章内容引起了你的兴趣并希望现在就实现你自己的智能指针的话,请阅读 “The Rustonomicon” 来获取更多有用的信息。

    +

    接下来,让我们谈谈 Rust 的并发。届时甚至还会学习到一些新的对并发有帮助的智能指针。

    +

    无畏并发

    +
    +

    ch16-00-concurrency.md +
    +commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f

    +
    +

    安全且高效地处理并发编程是 Rust 的另一个主要目标。并发编程Concurrent programming),代表程序的不同部分相互独立地执行,而 并行编程parallel programming)代表程序不同部分同时执行,这两个概念随着计算机越来越多的利用多处理器的优势而显得愈发重要。由于历史原因,在此类上下文中编程一直是困难且容易出错的:Rust 希望能改变这一点。

    +

    起初,Rust 团队认为确保内存安全和防止并发问题是两个分别需要不同方法应对的挑战。随着时间的推移,团队发现所有权和类型系统是一系列解决内存安全 并发问题的强有力的工具!通过利用所有权和类型检查,在 Rust 中很多并发错误都是 编译时 错误,而非运行时错误。因此,相比花费大量时间尝试重现运行时并发 bug 出现的特定情况,Rust 会拒绝编译不正确的代码并提供解释问题的错误信息。因此,你可以在开发时修复代码,而不是在部署到生产环境后修复代码。我们给 Rust 的这一部分起了一个绰号 无畏并发fearless concurrency)。无畏并发令你的代码免于出现诡异的 bug 并可以轻松重构且无需担心会引入新的 bug。

    +
    +

    注意:出于简洁的考虑,我们将很多问题归类为 并发,而不是更准确的区分 并发和(或)并行。如果这是一本专注于并发和/或并行的书,我们肯定会更加精确的。对于本章,当我们谈到 并发 时,请自行脑内替换为 并发和(或)并行

    +
    +

    很多语言所提供的处理并发问题的解决方法都非常有特色。例如,Erlang 有着优雅的消息传递并发功能,但只有模糊不清的在线程间共享状态的方法。对于高级语言来说,只实现可能解决方案的子集是一个合理的策略,因为高级语言所许诺的价值来源于牺牲一些控制来换取抽象。然而对于底层语言则期望提供在任何给定的情况下有着最高的性能且对硬件有更少的抽象。因此,Rust 提供了多种工具,以符合实际情况和需求的方式来为问题建模。

    +

    如下是本章将要涉及到的内容:

    +
      +
    • 如何创建线程来同时运行多段代码。
    • +
    • 消息传递Message passing)并发,其中信道(channel)被用来在线程间传递消息。
    • +
    • 共享状态Shared state)并发,其中多个线程可以访问同一片数据。
    • +
    • SyncSend trait,将 Rust 的并发保证扩展到用户定义的以及标准库提供的类型中。
    • +
    +

    使用线程同时运行代码

    +
    +

    ch16-01-threads.md +
    +commit 8aecae3efe5ca8f79f055b70f05d9a3f990bce7b

    +
    +

    在大部分现代操作系统中,已执行程序的代码在一个 进程process)中运行,操作系统则会负责管理多个进程。在程序内部,也可以拥有多个同时运行的独立部分。这些运行这些独立部分的功能被称为 线程threads)。例如,web 服务器可以有多个线程以便可以同时响应多个请求。

    +

    将程序中的计算拆分进多个线程可以改善性能,因为程序可以同时进行多个任务,不过这也会增加复杂性。因为线程是同时运行的,所以无法预先保证不同线程中的代码的执行顺序。这会导致诸如此类的问题:

    +
      +
    • 竞态条件(Race conditions),多个线程以不一致的顺序访问数据或资源
    • +
    • 死锁(Deadlocks),两个线程相互等待对方,这会阻止两者继续运行
    • +
    • 只会发生在特定情况且难以稳定重现和修复的 bug
    • +
    +

    Rust 尝试减轻使用线程的负面影响。不过在多线程上下文中编程仍需格外小心,同时其所要求的代码结构也不同于运行于单线程的程序。

    +

    编程语言有一些不同的方法来实现线程,而且很多操作系统提供了创建新线程的 API。Rust 标准库使用 1:1 线程实现,这代表程序的每一个语言级线程使用一个系统线程。有一些 crate 实现了其他有着不同于 1:1 模型取舍的线程模型。

    +

    使用 spawn 创建新线程

    +

    为了创建一个新线程,需要调用 thread::spawn 函数并传递一个闭包(第十三章学习了闭包),并在其中包含希望在新线程运行的代码。示例 16-1 中的例子在主线程打印了一些文本而另一些文本则由新线程打印:

    +

    文件名:src/main.rs

    +
    use std::thread;
    +use std::time::Duration;
    +
    +fn main() {
    +    thread::spawn(|| {
    +        for i in 1..10 {
    +            println!("hi number {i} from the spawned thread!");
    +            thread::sleep(Duration::from_millis(1));
    +        }
    +    });
    +
    +    for i in 1..5 {
    +        println!("hi number {i} from the main thread!");
    +        thread::sleep(Duration::from_millis(1));
    +    }
    +}
    +

    示例 16-1: 创建一个打印某些内容的新线程,但是主线程打印其它内容

    +

    注意当 Rust 程序的主线程结束时,新线程也会结束,而不管其是否执行完毕。这个程序的输出可能每次都略有不同,不过它大体上看起来像这样:

    +
    hi number 1 from the main thread!
    +hi number 1 from the spawned thread!
    +hi number 2 from the main thread!
    +hi number 2 from the spawned thread!
    +hi number 3 from the main thread!
    +hi number 3 from the spawned thread!
    +hi number 4 from the main thread!
    +hi number 4 from the spawned thread!
    +hi number 5 from the spawned thread!
    +
    +

    thread::sleep 调用强制线程停止执行一小段时间,这会允许其他不同的线程运行。这些线程可能会轮流运行,不过并不保证如此:这依赖操作系统如何调度线程。在这里,主线程首先打印,即便新创建线程的打印语句位于程序的开头,甚至即便我们告诉新建的线程打印直到 i 等于 9,它在主线程结束之前也只打印到了 5。

    +

    如果运行代码只看到了主线程的输出,或没有出现重叠打印的现象,尝试增大区间 (变量 i 的范围) 来增加操作系统切换线程的机会。

    +

    使用 join 等待所有线程结束

    +

    由于主线程结束,示例 16-1 中的代码大部分时候不光会提早结束新建线程,因为无法保证线程运行的顺序,我们甚至不能实际保证新建线程会被执行!

    +

    可以通过将 thread::spawn 的返回值储存在变量中来修复新建线程部分没有执行或者完全没有执行的问题。thread::spawn 的返回值类型是 JoinHandleJoinHandle 是一个拥有所有权的值,当对其调用 join 方法时,它会等待其线程结束。示例 16-2 展示了如何使用示例 16-1 中创建的线程的 JoinHandle 并调用 join 来确保新建线程在 main 退出前结束运行:

    +

    文件名:src/main.rs

    +
    use std::thread;
    +use std::time::Duration;
    +
    +fn main() {
    +    let handle = thread::spawn(|| {
    +        for i in 1..10 {
    +            println!("hi number {i} from the spawned thread!");
    +            thread::sleep(Duration::from_millis(1));
    +        }
    +    });
    +
    +    for i in 1..5 {
    +        println!("hi number {i} from the main thread!");
    +        thread::sleep(Duration::from_millis(1));
    +    }
    +
    +    handle.join().unwrap();
    +}
    +

    示例 16-2: 从 thread::spawn 保存一个 JoinHandle 以确保该线程能够运行至结束

    +

    通过调用 handle 的 join 会阻塞当前线程直到 handle 所代表的线程结束。阻塞Blocking)线程意味着阻止该线程执行工作或退出。因为我们将 join 调用放在了主线程的 for 循环之后,运行示例 16-2 应该会产生类似这样的输出:

    +
    hi number 1 from the main thread!
    +hi number 2 from the main thread!
    +hi number 1 from the spawned thread!
    +hi number 3 from the main thread!
    +hi number 2 from the spawned thread!
    +hi number 4 from the main thread!
    +hi number 3 from the spawned thread!
    +hi number 4 from the spawned thread!
    +hi number 5 from the spawned thread!
    +hi number 6 from the spawned thread!
    +hi number 7 from the spawned thread!
    +hi number 8 from the spawned thread!
    +hi number 9 from the spawned thread!
    +
    +

    这两个线程仍然会交替执行,不过主线程会由于 handle.join() 调用会等待直到新建线程执行完毕。

    +

    不过让我们看看将 handle.join() 移动到 mainfor 循环之前会发生什么,如下:

    +

    文件名:src/main.rs

    +
    use std::thread;
    +use std::time::Duration;
    +
    +fn main() {
    +    let handle = thread::spawn(|| {
    +        for i in 1..10 {
    +            println!("hi number {i} from the spawned thread!");
    +            thread::sleep(Duration::from_millis(1));
    +        }
    +    });
    +
    +    handle.join().unwrap();
    +
    +    for i in 1..5 {
    +        println!("hi number {i} from the main thread!");
    +        thread::sleep(Duration::from_millis(1));
    +    }
    +}
    +

    主线程会等待直到新建线程执行完毕之后才开始执行 for 循环,所以输出将不会交替出现,如下所示:

    +
    hi number 1 from the spawned thread!
    +hi number 2 from the spawned thread!
    +hi number 3 from the spawned thread!
    +hi number 4 from the spawned thread!
    +hi number 5 from the spawned thread!
    +hi number 6 from the spawned thread!
    +hi number 7 from the spawned thread!
    +hi number 8 from the spawned thread!
    +hi number 9 from the spawned thread!
    +hi number 1 from the main thread!
    +hi number 2 from the main thread!
    +hi number 3 from the main thread!
    +hi number 4 from the main thread!
    +
    +

    诸如将 join 放置于何处这样的小细节,会影响线程是否同时运行。

    +

    move 闭包与线程一同使用

    +

    move 关键字经常用于传递给 thread::spawn 的闭包,因为闭包会获取从环境中取得的值的所有权,因此会将这些值的所有权从一个线程传送到另一个线程。在第十三章 “闭包会捕获其环境” 部分讨论了闭包上下文中的 move。现在我们会更专注于 movethread::spawn 之间的交互。

    +

    在第十三章中,我们讲到可以在参数列表前使用 move 关键字强制闭包获取其使用的环境值的所有权。这个技巧在创建新线程将值的所有权从一个线程移动到另一个线程时最为实用。

    +

    注意示例 16-1 中传递给 thread::spawn 的闭包并没有任何参数:并没有在新建线程代码中使用任何主线程的数据。为了在新建线程中使用来自于主线程的数据,需要新建线程的闭包获取它需要的值。示例 16-3 展示了一个尝试在主线程中创建一个 vector 并用于新建线程的例子,不过这么写还不能工作,如下所示:

    +

    文件名:src/main.rs

    +
    use std::thread;
    +
    +fn main() {
    +    let v = vec![1, 2, 3];
    +
    +    let handle = thread::spawn(|| {
    +        println!("Here's a vector: {v:?}");
    +    });
    +
    +    handle.join().unwrap();
    +}
    +

    示例 16-3: 尝试在另一个线程使用主线程创建的 vector

    +

    闭包使用了 v,所以闭包会捕获 v 并使其成为闭包环境的一部分。因为 thread::spawn 在一个新线程中运行这个闭包,所以可以在新线程中访问 v。然而当编译这个例子时,会得到如下错误:

    +
    $ cargo run
    +   Compiling threads v0.1.0 (file:///projects/threads)
    +error[E0373]: closure may outlive the current function, but it borrows `v`, which is owned by the current function
    + --> src/main.rs:6:32
    +  |
    +6 |     let handle = thread::spawn(|| {
    +  |                                ^^ may outlive borrowed value `v`
    +7 |         println!("Here's a vector: {v:?}");
    +  |                                     - `v` is borrowed here
    +  |
    +note: function requires argument type to outlive `'static`
    + --> src/main.rs:6:18
    +  |
    +6 |       let handle = thread::spawn(|| {
    +  |  __________________^
    +7 | |         println!("Here's a vector: {v:?}");
    +8 | |     });
    +  | |______^
    +help: to force the closure to take ownership of `v` (and any other referenced variables), use the `move` keyword
    +  |
    +6 |     let handle = thread::spawn(move || {
    +  |                                ++++
    +
    +For more information about this error, try `rustc --explain E0373`.
    +error: could not compile `threads` (bin "threads") due to 1 previous error
    +
    +

    Rust 会 推断 如何捕获 v,因为 println! 只需要 v 的引用,闭包尝试借用 v。然而这有一个问题:Rust 不知道这个新建线程会执行多久,所以无法知晓对 v 的引用是否一直有效。

    +

    示例 16-4 展示了一个 v 的引用很有可能不再有效的场景:

    +

    文件名:src/main.rs

    +
    use std::thread;
    +
    +fn main() {
    +    let v = vec![1, 2, 3];
    +
    +    let handle = thread::spawn(|| {
    +        println!("Here's a vector: {v:?}");
    +    });
    +
    +    drop(v); // oh no!
    +
    +    handle.join().unwrap();
    +}
    +

    示例 16-4: 一个具有闭包的线程,尝试使用一个在主线程中被回收的引用 v

    +

    如果 Rust 允许这段代码运行,则新建线程则可能会立刻被转移到后台并完全没有机会运行。新建线程内部有一个 v 的引用,不过主线程立刻就使用第十五章讨论的 drop 丢弃了 v。接着当新建线程开始执行,v 已不再有效,所以其引用也是无效的。噢,这太糟了!

    +

    为了修复示例 16-3 的编译错误,我们可以听取错误信息的建议:

    +
    help: to force the closure to take ownership of `v` (and any other referenced variables), use the `move` keyword
    +  |
    +6 |     let handle = thread::spawn(move || {
    +  |                                ++++
    +
    +

    通过在闭包之前增加 move 关键字,我们强制闭包获取其使用的值的所有权,而不是任由 Rust 推断它应该借用值。示例 16-5 中展示的对示例 16-3 代码的修改,可以按照我们的预期编译并运行:

    +

    文件名:src/main.rs

    +
    use std::thread;
    +
    +fn main() {
    +    let v = vec![1, 2, 3];
    +
    +    let handle = thread::spawn(move || {
    +        println!("Here's a vector: {v:?}");
    +    });
    +
    +    handle.join().unwrap();
    +}
    +

    示例 16-5: 使用 move 关键字强制获取它使用的值的所有权

    +

    我们可能希望尝试同样的方法来修复示例 16-4 中的代码,其主线程使用 move 闭包调用了 drop。然而这个修复行不通,因为示例 16-4 所尝试的操作由于一个不同的原因而不被允许。如果为闭包增加 move,将会把 v 移动进闭包的环境中,如此将不能在主线程中对其调用 drop 了。我们会得到如下不同的编译错误:

    +
    $ cargo run
    +   Compiling threads v0.1.0 (file:///projects/threads)
    +error[E0382]: use of moved value: `v`
    +  --> src/main.rs:10:10
    +   |
    +4  |     let v = vec![1, 2, 3];
    +   |         - move occurs because `v` has type `Vec<i32>`, which does not implement the `Copy` trait
    +5  |
    +6  |     let handle = thread::spawn(move || {
    +   |                                ------- value moved into closure here
    +7  |         println!("Here's a vector: {v:?}");
    +   |                                     - variable moved due to use in closure
    +...
    +10 |     drop(v); // oh no!
    +   |          ^ value used here after move
    +
    +For more information about this error, try `rustc --explain E0382`.
    +error: could not compile `threads` (bin "threads") due to 1 previous error
    +
    +

    Rust 的所有权规则又一次帮助了我们!示例 16-3 中的错误是因为 Rust 是保守的并只会为线程借用 v,这意味着主线程理论上可能使新建线程的引用无效。通过告诉 Rust 将 v 的所有权移动到新建线程,我们向 Rust 保证主线程不会再使用 v。如果对示例 16-4 也做出如此修改,那么当在主线程中使用 v 时就会违反所有权规则。 move 关键字覆盖了 Rust 默认保守的借用,但它不允许我们违反所有权规则。

    +

    现在我们对线程和线程 API 有了基本的了解,让我们讨论一下使用线程实际可以 什么吧。

    +

    使用消息传递在线程间传送数据

    +
    +

    ch16-02-message-passing.md +
    +commit 36383b4da21dbd0a0781473bc8ad7ef0ed1b6751

    +
    +

    一个日益流行的确保安全并发的方式是 消息传递message passing),这里线程或 actor 通过发送包含数据的消息来相互沟通。这个思想来源于 Go 编程语言文档中 的口号:“不要通过共享内存来通讯;而是通过通讯来共享内存。”(“Do not communicate by sharing memory; instead, share memory by communicating.”)

    +

    为了实现消息传递并发,Rust 标准库提供了一个 信道channel)实现。信道是一个通用编程概念,表示数据从一个线程发送到另一个线程。

    +

    你可以将编程中的信道想象为一个水流的渠道,比如河流或小溪。如果你将诸如橡皮鸭或小船之类的东西放入其中,它们会顺流而下到达下游。

    +

    编程中的信息渠道(信道)有两部分组成,一个发送者(transmitter)和一个接收者(receiver)。发送者位于上游位置,在这里可以将橡皮鸭放入河中,接收者则位于下游,橡皮鸭最终会漂流至此。代码中的一部分调用发送者的方法以及希望发送的数据,另一部分则检查接收端收到的消息。当发送者或接收者任一被丢弃时可以认为信道被 关闭closed)了。

    +

    这里,我们将开发一个程序,它会在一个线程生成值向信道发送,而在另一个线程会接收值并打印出来。这里会通过信道在线程间发送简单值来演示这个功能。一旦你熟悉了这项技术,你就可以将信道用于任何相互通信的任何线程,例如一个聊天系统,或利用很多线程进行分布式计算并将部分计算结果发送给一个线程进行聚合。

    +

    首先,在示例 16-6 中,创建了一个信道但没有做任何事。注意这还不能编译,因为 Rust 不知道我们想要在信道中发送什么类型:

    +

    文件名:src/main.rs

    +
    use std::sync::mpsc;
    +
    +fn main() {
    +    let (tx, rx) = mpsc::channel();
    +}
    +

    示例 16-6: 创建一个信道,并将其两端赋值给 txrx

    +

    这里使用 mpsc::channel 函数创建一个新的信道;mpsc多个生产者,单个消费者multiple producer, single consumer)的缩写。简而言之,Rust 标准库实现信道的方式意味着一个信道可以有多个产生值的 发送sending)端,但只能有一个消费这些值的 接收receiving)端。想象一下多条小河小溪最终汇聚成大河:所有通过这些小河发出的东西最后都会来到下游的大河。目前我们以单个生产者开始,但是当示例可以工作后会增加多个生产者。

    +

    mpsc::channel 函数返回一个元组:第一个元素是发送端 -- 发送者,而第二个元素是接收端 -- 接收者。由于历史原因,txrx 通常作为 发送者transmitter)和 接收者receiver)的缩写,所以这就是我们将用来绑定这两端变量的名字。这里使用了一个 let 语句和模式来解构了此元组;第十九章会讨论 let 语句中的模式和解构。现在只需知道使用 let 语句是一个方便提取 mpsc::channel 返回的元组中一部分的手段。

    +

    让我们将发送端移动到一个新建线程中并发送一个字符串,这样新建线程就可以和主线程通讯了,如示例 16-7 所示。这类似于在河的上游扔下一只橡皮鸭或从一个线程向另一个线程发送聊天信息:

    +

    文件名:src/main.rs

    +
    use std::sync::mpsc;
    +use std::thread;
    +
    +fn main() {
    +    let (tx, rx) = mpsc::channel();
    +
    +    thread::spawn(move || {
    +        let val = String::from("hi");
    +        tx.send(val).unwrap();
    +    });
    +}
    +

    示例 16-7: 将 tx 移动到一个新建的线程中并发送 “hi”

    +

    这里再次使用 thread::spawn 来创建一个新线程并使用 movetx 移动到闭包中这样新建线程就拥有 tx 了。新建线程需要拥有信道的发送端以便能向信道发送消息。信道的发送端有一个 send 方法用来获取需要放入信道的值。send 方法返回一个 Result<T, E> 类型,所以如果接收端已经被丢弃了,将没有发送值的目标,所以发送操作会返回错误。在这个例子中,出错的时候调用 unwrap 产生 panic。不过对于一个真实程序,需要合理地处理它:回到第九章复习正确处理错误的策略。

    +

    在示例 16-8 中,我们在主线程中从信道的接收者获取值。这类似于在河的下游捞起橡皮鸭或接收聊天信息:

    +

    文件名:src/main.rs

    +
    use std::sync::mpsc;
    +use std::thread;
    +
    +fn main() {
    +    let (tx, rx) = mpsc::channel();
    +
    +    thread::spawn(move || {
    +        let val = String::from("hi");
    +        tx.send(val).unwrap();
    +    });
    +
    +    let received = rx.recv().unwrap();
    +    println!("Got: {received}");
    +}
    +

    示例 16-8: 在主线程中接收并打印内容 “hi”

    +

    信道的接收者有两个有用的方法:recvtry_recv。这里,我们使用了 recv,它是 receive 的缩写。这个方法会阻塞主线程执行直到从信道中接收一个值。一旦发送了一个值,recv 会在一个 Result<T, E> 中返回它。当信道发送端关闭,recv 会返回一个错误表明不会再有新的值到来了。

    +

    try_recv 不会阻塞,相反它立刻返回一个 Result<T, E>Ok 值包含可用的信息,而 Err 值代表此时没有任何消息。如果线程在等待消息过程中还有其他工作时使用 try_recv 很有用:可以编写一个循环来频繁调用 try_recv,在有可用消息时进行处理,其余时候则处理一会其他工作直到再次检查。

    +

    出于简单的考虑,这个例子使用了 recv;主线程中除了等待消息之外没有任何其他工作,所以阻塞主线程是合适的。

    +

    如果运行示例 16-8 中的代码,我们将会看到主线程打印出这个值:

    +
    Got: hi
    +
    +

    完美!

    +

    信道与所有权转移

    +

    所有权规则在消息传递中扮演了重要角色,其有助于我们编写安全的并发代码。防止并发编程中的错误是在 Rust 程序中考虑所有权的一大优势。现在让我们做一个试验来看看信道与所有权如何一同协作以避免产生问题:我们将尝试在新建线程中的信道中发送完 val之后 再使用它。尝试编译示例 16-9 中的代码并看看为何这是不允许的:

    +

    文件名:src/main.rs

    +
    use std::sync::mpsc;
    +use std::thread;
    +
    +fn main() {
    +    let (tx, rx) = mpsc::channel();
    +
    +    thread::spawn(move || {
    +        let val = String::from("hi");
    +        tx.send(val).unwrap();
    +        println!("val is {val}");
    +    });
    +
    +    let received = rx.recv().unwrap();
    +    println!("Got: {received}");
    +}
    +

    示例 16-9: 在我们已经发送到信道中后,尝试使用 val 引用

    +

    这里尝试在通过 tx.send 发送 val 到信道中之后将其打印出来。允许这么做是一个坏主意:一旦将值发送到另一个线程后,那个线程可能会在我们再次使用它之前就将其修改或者丢弃。其他线程对值可能的修改会由于不一致或不存在的数据而导致错误或意外的结果。然而,尝试编译示例 16-9 的代码时,Rust 会给出一个错误:

    +
    $ cargo run
    +   Compiling message-passing v0.1.0 (file:///projects/message-passing)
    +error[E0382]: borrow of moved value: `val`
    +  --> src/main.rs:10:26
    +   |
    +8  |         let val = String::from("hi");
    +   |             --- move occurs because `val` has type `String`, which does not implement the `Copy` trait
    +9  |         tx.send(val).unwrap();
    +   |                 --- value moved here
    +10 |         println!("val is {val}");
    +   |                          ^^^^^ value borrowed here after move
    +   |
    +   = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
    +
    +For more information about this error, try `rustc --explain E0382`.
    +error: could not compile `message-passing` (bin "message-passing") due to 1 previous error
    +
    +

    我们的并发错误会造成一个编译时错误。send 函数获取其参数的所有权并移动这个值归接收者所有。这可以防止在发送后再次意外地使用这个值;所有权系统检查一切是否合乎规则。

    +

    发送多个值并观察接收者的等待

    +

    示例 16-8 中的代码可以编译和运行,不过它并没有明确的告诉我们两个独立的线程通过信道相互通讯。示例 16-10 则有一些改进会证明示例 16-8 中的代码是并发执行的:新建线程现在会发送多个消息并在每个消息之间暂停一秒钟。

    +

    文件名:src/main.rs

    +
    use std::sync::mpsc;
    +use std::thread;
    +use std::time::Duration;
    +
    +fn main() {
    +    let (tx, rx) = mpsc::channel();
    +
    +    thread::spawn(move || {
    +        let vals = vec![
    +            String::from("hi"),
    +            String::from("from"),
    +            String::from("the"),
    +            String::from("thread"),
    +        ];
    +
    +        for val in vals {
    +            tx.send(val).unwrap();
    +            thread::sleep(Duration::from_secs(1));
    +        }
    +    });
    +
    +    for received in rx {
    +        println!("Got: {received}");
    +    }
    +}
    +

    示例 16-10: 发送多个消息,并在每次发送后暂停一段时间

    +

    这一次,在新建线程中有一个字符串 vector 希望发送到主线程。我们遍历它们,单独的发送每一个字符串并通过一个 Duration 值调用 thread::sleep 函数来暂停一秒。

    +

    在主线程中,不再显式调用 recv 函数:而是将 rx 当作一个迭代器。对于每一个接收到的值,我们将其打印出来。当信道被关闭时,迭代器也将结束。

    +

    当运行示例 16-10 中的代码时,将看到如下输出,每一行都会暂停一秒:

    +
    Got: hi
    +Got: from
    +Got: the
    +Got: thread
    +
    +

    因为主线程中的 for 循环里并没有任何暂停或等待的代码,所以可以说主线程是在等待从新建线程中接收值。

    +

    通过克隆发送者来创建多个生产者

    +

    之前我们提到了mpscmultiple producer, single consumer 的缩写。可以运用 mpsc 来扩展示例 16-10 中的代码来创建向同一接收者发送值的多个线程。这可以通过克隆发送者来做到,如示例 16-11 所示:

    +

    文件名:src/main.rs

    +
    use std::sync::mpsc;
    +use std::thread;
    +use std::time::Duration;
    +
    +fn main() {
    +    // --snip--
    +
    +    let (tx, rx) = mpsc::channel();
    +
    +    let tx1 = tx.clone();
    +    thread::spawn(move || {
    +        let vals = vec![
    +            String::from("hi"),
    +            String::from("from"),
    +            String::from("the"),
    +            String::from("thread"),
    +        ];
    +
    +        for val in vals {
    +            tx1.send(val).unwrap();
    +            thread::sleep(Duration::from_secs(1));
    +        }
    +    });
    +
    +    thread::spawn(move || {
    +        let vals = vec![
    +            String::from("more"),
    +            String::from("messages"),
    +            String::from("for"),
    +            String::from("you"),
    +        ];
    +
    +        for val in vals {
    +            tx.send(val).unwrap();
    +            thread::sleep(Duration::from_secs(1));
    +        }
    +    });
    +
    +    for received in rx {
    +        println!("Got: {received}");
    +    }
    +
    +    // --snip--
    +}
    +

    示例 16-11: 从多个生产者发送多个消息

    +

    这一次,在创建新线程之前,我们对发送者调用了 clone 方法。这会给我们一个可以传递给第一个新建线程的发送端句柄。我们会将原始的信道发送端传递给第二个新建线程。这样就会有两个线程,每个线程将向信道的接收端发送不同的消息。

    +

    如果运行这些代码,你 可能 会看到这样的输出:

    +
    Got: hi
    +Got: more
    +Got: from
    +Got: messages
    +Got: for
    +Got: the
    +Got: thread
    +Got: you
    +
    +

    虽然你可能会看到这些值以不同的顺序出现;这依赖于你的系统。这也就是并发既有趣又困难的原因。如果通过 thread::sleep 做实验,在不同的线程中提供不同的值,就会发现它们的运行更加不确定,且每次都会产生不同的输出。

    +

    现在我们见识过了信道如何工作,再看看另一种不同的并发方式吧。

    +

    共享状态的并发

    +
    +

    ch16-03-shared-state.md +
    +commit 856d89c53a6d69470bb5669c773fdfe6aab6fcc9

    +
    +

    消息传递是一个很好的处理并发的方式,但并不是唯一一个。另一种方式是让多个线程访问同一块内存中的数据(共享状态)。再考虑一下 Go 语言文档中的这句口号:“不要通过共享内存来通讯”(“do not communicate by sharing memory.”

    +

    通过共享内存进行通信,会是什么样的代码?此外,为什么喜欢消息传递的人会警告:谨慎使用内存共享?

    +

    在某种程度上,任何编程语言中的信道都类似于单所有权,因为一旦将一个值传送到信道中,将无法再使用这个值。共享内存类似于多所有权:多个线程可以同时访问相同的内存位置。在 15 章中,我们介绍了智能指针可以实现多所有权,然而这会增加额外的复杂性,因为需要管理多个所有者。Rust 的类型系统和所有权规则在正确管理这些问题上提供了极大的帮助:举个例子,让我们来看看 互斥器,一个较常见的共享内存并发原语。

    +

    使用互斥器,实现同一时刻只允许一个线程访问数据

    +

    互斥器mutex)是 互相排斥(mutual exclusion)的缩写。在同一时刻,其只允许一个线程对数据拥有访问权。为了访问互斥器中的数据,线程首先需要通过获取互斥器的 lock)来表明其希望访问数据。锁是一个数据结构,作为互斥器的一部分,它记录谁有数据的专属访问权。因此我们讲,互斥器通过锁系统 保护guarding)其数据。

    +

    互斥器以难以使用著称(译注:原文指互斥器在其他编程语言中难以使用),因为你必须记住:

    +
      +
    1. 在使用数据之前,必须获取锁。
    2. +
    3. 使用完被互斥器所保护的数据之后,必须解锁数据,这样其他线程才能够获取锁。
    4. +
    +

    作为一个现实中互斥器的例子,想象一下在某个会议的一次小组座谈会中,只有一个麦克风。如果一位成员要发言,他必须请求或表示希望使用麦克风。得到了麦克风后,他可以畅所欲言,讲完后再将麦克风交给下一位希望讲话的成员。如果一位成员结束发言后忘记将麦克风交还,其他人将无法发言。如果对共享麦克风的管理出现了问题,座谈会将无法正常进行!

    +

    正确的管理互斥器异常复杂,这也是许多人之所以热衷于信道的原因。然而,在 Rust 中,得益于类型系统和所有权,我们不会在锁和解锁上出错。

    +

    Mutex<T>的 API

    +

    我们先从在单线程环境中使用互斥器开始,作为展示其用法的一个例子,如示例 16-12 所示:

    +

    文件名:src/main.rs

    +
    use std::sync::Mutex;
    +
    +fn main() {
    +    let m = Mutex::new(5);
    +
    +    {
    +        let mut num = m.lock().unwrap();
    +        *num = 6;
    +    }
    +
    +    println!("m = {m:?}");
    +}
    +

    示例 16-12: 出于简单的考虑,在一个单线程上下文中探索 Mutex<T> 的 API

    +

    像很多类型一样,我们使用关联函数 new 来创建一个 Mutex<T>。使用 lock 方法来获取锁,从而可以访问互斥器中的数据。这个调用会阻塞当前线程,直到我们拥有锁为止。

    +

    如果另一个线程拥有锁,并且那个线程 panic 了,则 lock 调用会失败。在这种情况下,没人能够再获取锁,所以我们调用 unwrap,使当前线程 panic。

    +

    一旦获取了锁,就可以将返回值(命名为 num)视为一个其内部数据(i32)的可变引用了。类型系统确保了我们在使用 m 中的值之前获取锁。m 的类型是 Mutex<i32> 而不是 i32,所以 必须 获取锁才能使用这个 i32 值。我们是不会忘记这么做的,因为如果没有获取锁,类型系统就不允许访问内部的 i32 值。

    +

    正如你所猜想的,Mutex<T> 是一个智能指针。更准确的说,lock 调用 返回 一个叫做 MutexGuard 的智能指针。这个智能指针实现了 Deref 来指向其内部数据;它也实现了 Drop,当 MutexGuard 离开作用域时,自动释放锁(发生在示例 16-12 内部作用域的结尾)。有了这个特性,就不会有忘记释放锁的潜在风险(忘记释放锁会使互斥器无法再被其它线程使用),因为锁的释放是自动发生的。

    +

    释放锁之后,我们可以打印出互斥器内部的 i32 值,并发现我们刚刚已经将其值改为 6。

    +

    在线程间共享 Mutex<T>

    +

    现在让我们尝试使用 Mutex<T> 在多个线程间共享同一个值。我们将启动 10 个线程,并在各个线程中对同一个计数器值加 1,这样计数器将从 0 变为 10。示例 16-13 中的例子会出现编译错误,而我们将通过这些错误来学习如何使用 Mutex<T>,以及 Rust 又是如何帮助我们正确使用的。

    +

    文件名:src/main.rs

    +
    use std::sync::Mutex;
    +use std::thread;
    +
    +fn main() {
    +    let counter = Mutex::new(0);
    +    let mut handles = vec![];
    +
    +    for _ in 0..10 {
    +        let handle = thread::spawn(move || {
    +            let mut num = counter.lock().unwrap();
    +
    +            *num += 1;
    +        });
    +        handles.push(handle);
    +    }
    +
    +    for handle in handles {
    +        handle.join().unwrap();
    +    }
    +
    +    println!("Result: {}", *counter.lock().unwrap());
    +}
    +

    示例 16-13: 程序启动了 10 个线程,每个线程都通过 Mutex<T> 来增加计数器的值

    +

    这里创建了一个 counter 变量来存放内含 i32Mutex<T>,类似示例 16-12 那样。接下来我们遍历整数区间,创建了 10 个线程。我们使用了 thread::spawn,并为所有线程传入了相同的闭包:它们每一个都将调用 lock 方法来获取 Mutex<T> 上的锁,接着将互斥器中的值加一。当一个线程结束执行,num 会离开闭包作用域并释放锁,这样另一个线程就可以获取它了。

    +

    在主线程中,我们像示例 16-2 那样收集了所有的 JoinHandle,并调用它们的 join 方法来等待所有线程结束。然后,主线程会获取锁,并打印出程序的结果。

    +

    之前提示过,这个例子不能编译,让我们看看为什么!

    +
    $ cargo run
    +   Compiling shared-state v0.1.0 (file:///projects/shared-state)
    +error[E0382]: borrow of moved value: `counter`
    +  --> src/main.rs:21:29
    +   |
    +5  |     let counter = Mutex::new(0);
    +   |         ------- move occurs because `counter` has type `Mutex<i32>`, which does not implement the `Copy` trait
    +...
    +8  |     for _ in 0..10 {
    +   |     -------------- inside of this loop
    +9  |         let handle = thread::spawn(move || {
    +   |                                    ------- value moved into closure here, in previous iteration of loop
    +...
    +21 |     println!("Result: {}", *counter.lock().unwrap());
    +   |                             ^^^^^^^ value borrowed here after move
    +   |
    +help: consider moving the expression out of the loop so it is only moved once
    +   |
    +8  ~     let mut value = counter.lock();
    +9  ~     for _ in 0..10 {
    +10 |         let handle = thread::spawn(move || {
    +11 ~             let mut num = value.unwrap();
    +   |
    +
    +For more information about this error, try `rustc --explain E0382`.
    +error: could not compile `shared-state` (bin "shared-state") due to 1 previous error
    +
    +

    错误信息表明 counter 值在上一次循环中被移动了。所以 Rust 告诉我们,不能将 counter 锁的所有权移动到多个线程中。让我们通过一个第 15 章讨论过的多所有权手段,来修复这个编译错误。

    +

    多线程和多所有权

    +

    在第 15 章中,我们用智能指针 Rc<T> 来创建引用计数,使得一个值有了多个所有者。让我们做同样的事,看看会发生什么。将示例 16-14 中的 Mutex<T> 封装进 Rc<T> 中,并在将所有权移入线程之前克隆(clone) Rc<T>

    +

    文件名:src/main.rs

    +
    use std::rc::Rc;
    +use std::sync::Mutex;
    +use std::thread;
    +
    +fn main() {
    +    let counter = Rc::new(Mutex::new(0));
    +    let mut handles = vec![];
    +
    +    for _ in 0..10 {
    +        let counter = Rc::clone(&counter);
    +        let handle = thread::spawn(move || {
    +            let mut num = counter.lock().unwrap();
    +
    +            *num += 1;
    +        });
    +        handles.push(handle);
    +    }
    +
    +    for handle in handles {
    +        handle.join().unwrap();
    +    }
    +
    +    println!("Result: {}", *counter.lock().unwrap());
    +}
    +

    示例 16-14: 尝试使用 Rc<T> 来允许多个线程拥有 Mutex<T>

    +

    再一次编译并...出现了不同的错误!编译器真是教会了我们很多!

    +
    $ cargo run
    +   Compiling shared-state v0.1.0 (file:///projects/shared-state)
    +error[E0277]: `Rc<Mutex<i32>>` cannot be sent between threads safely
    +  --> src/main.rs:11:36
    +   |
    +11 |           let handle = thread::spawn(move || {
    +   |                        ------------- ^------
    +   |                        |             |
    +   |  ______________________|_____________within this `{closure@src/main.rs:11:36: 11:43}`
    +   | |                      |
    +   | |                      required by a bound introduced by this call
    +12 | |             let mut num = counter.lock().unwrap();
    +13 | |
    +14 | |             *num += 1;
    +15 | |         });
    +   | |_________^ `Rc<Mutex<i32>>` cannot be sent between threads safely
    +   |
    +   = help: within `{closure@src/main.rs:11:36: 11:43}`, the trait `Send` is not implemented for `Rc<Mutex<i32>>`, which is required by `{closure@src/main.rs:11:36: 11:43}: Send`
    +note: required because it's used within this closure
    +  --> src/main.rs:11:36
    +   |
    +11 |         let handle = thread::spawn(move || {
    +   |                                    ^^^^^^^
    +note: required by a bound in `spawn`
    +  --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/thread/mod.rs:688:1
    +
    +For more information about this error, try `rustc --explain E0277`.
    +error: could not compile `shared-state` (bin "shared-state") due to 1 previous error
    +
    +

    哇哦,错误信息太长不看!划重点:第一行错误表明 Rc<Mutex<i32>> 不能在线程间安全传递(`Rc<Mutex<i32>>` cannot be sent between threads safely);编译器也指出了原因:Rc<Mutex<i32>> 没有实现 Send trait(the trait `Send` is not implemented for `Rc<Mutex<i32>>`)。下一节我们会讲到 Send:这是一个确保所使用的类型可以用于并发环境的 trait。

    +

    不幸的是,Rc<T> 并不能安全的在线程间共享。当 Rc<T> 管理引用计数时,它必须在每一个 clone 调用时增加计数,并在每一个克隆体被丢弃时减少计数。Rc<T> 并没有使用任何并发原语,无法确保改变计数的操作不会被其他线程打断。这可能使计数出错,并导致诡异的 bug,比如可能会造成内存泄漏,或在使用结束之前就丢弃一个值。我们所需要的是一个与 Rc<T> 完全一致,又以线程安全的方式改变引用计数的类型。

    +

    原子引用计数 Arc<T>

    +

    所幸 Arc<T> 正是这么一个类似 Rc<T> 并可以安全的用于并发环境的类型。字母 “a” 代表 原子性atomic),所以这是一个 原子引用计数atomically reference counted)类型。原子类型 (Atomics) 是另一类这里还未涉及到的并发原语:请查看标准库中 std::sync::atomic 的文档来获取更多细节。目前我们只需要知道:原子类型就像基本类型一样,可以安全的在线程间共享。

    +

    你可能会好奇,为什么不是所有的基本类型都是原子性的?为什么标准库中的类型没有全部默认使用 Arc<T> 实现?原因在于,线程安全会造成性能损失,我们希望只在必要时才为此买单。如果只是在单线程中对值进行操作,原子性提供的保证并无必要,而不加入原子性可以使代码运行得更快。

    +

    回到之前的例子:Arc<T>Rc<T> 有着相同的 API,所以我们只需修改程序中的 use 行、new 调用和 clone 调用。示例 16-15 中的代码最终可以编译和运行:

    +

    文件名:src/main.rs

    +
    use std::sync::{Arc, Mutex};
    +use std::thread;
    +
    +fn main() {
    +    let counter = Arc::new(Mutex::new(0));
    +    let mut handles = vec![];
    +
    +    for _ in 0..10 {
    +        let counter = Arc::clone(&counter);
    +        let handle = thread::spawn(move || {
    +            let mut num = counter.lock().unwrap();
    +
    +            *num += 1;
    +        });
    +        handles.push(handle);
    +    }
    +
    +    for handle in handles {
    +        handle.join().unwrap();
    +    }
    +
    +    println!("Result: {}", *counter.lock().unwrap());
    +}
    +

    示例 16-15: 使用 Arc<T> 包装一个 Mutex<T> 能够实现在多线程之间共享所有权

    +

    这会打印出:

    +
    Result: 10
    +
    +

    成功了!我们从 0 数到了 10,这好像没啥大不了的,不过一路上我们确实学习了很多关于 Mutex<T> 和线程安全的内容!这个例子中构建的结构可以用于比增加计数更为复杂的操作。使用这个策略,我们可将计算任务分成独立的部分,并分散到多个线程中,接着使用 Mutex<T> 使用各自的运算结果来更新最终的结果。

    +

    注意,对于简单的数值运算,标准库中 std::sync::atomic 模块 提供了比 Mutex<T> 更简单的类型。针对基本类型,这些类型提供了安全、并发、原子的操作。在上面的例子中,为了专注于讲明白 Mutex<T> 的用法,我们才选择在基本类型上使用 Mutex<T>。(译注:对于上面例子中出现的 i32 加法操作,更好的做法是使用 AtomicI32 类型来完成。具体参考文档。)

    +

    RefCell<T>/Rc<T>Mutex<T>/Arc<T> 的相似性

    +

    你可能注意到了,尽管 counter 是不可变的,我们仍然可以获取其内部值的可变引用;这意味着 Mutex<T> 提供了内部可变性,就像 Cell 系列类型那样。使用 RefCell<T> 可以改变 Rc<T> 中内容(在 15 章中讲到过),同样地,使用 Mutex<T> 我们也可以改变 Arc<T> 中的内容。

    +

    另一个值得注意的细节是,Rust 不能完全避免使用 Mutex<T> 所带来的逻辑错误。回忆一下,第 15 章中讲过,使用 Rc<T> 就有造成引用循环的风险:两个 Rc<T> 值相互引用,造成内存泄漏。同理,Mutex<T> 也有造成 死锁deadlock)的风险:当某个操作需要锁住两个资源,而两个线程分别持有两个资源的其中一个锁时,它们会永远相互等待。如果你对这个话题感兴趣,尝试编写一个带有死锁的 Rust 程序,接着研究别的语言中使用互斥器的死锁规避策略,并尝试在 Rust 中实现它们。标准库中 Mutex<T>MutexGuard 的 API 文档会提供有用的信息。

    +

    接下来,为了丰富本章的内容,让我们讨论一下 SendSync trait,以及如何对自定义类型使用它们。

    +

    使用 SyncSend trait 的可扩展并发

    +
    +

    ch16-04-extensible-concurrency-sync-and-send.md +
    +commit 7c7740a5ddef1458d74f1daf85fd49e03aaa97cf

    +
    +

    Rust 的并发模型中一个有趣的方面是:语言本身对并发知之 甚少。我们之前讨论的几乎所有内容,都属于标准库,而不是语言本身的内容。由于不需要语言提供并发相关的基础设施,并发方案不受标准库或语言所限:我们可以编写自己的或使用别人编写的并发功能。

    +

    然而有两个并发概念是内嵌于语言中的:std::marker 中的 SyncSend trait。

    +

    通过 Send 允许在线程间转移所有权

    +

    Send 标记 trait 表明实现了 Send 的类型值的所有权可以在线程间传送。几乎所有的 Rust 类型都是Send 的,不过有一些例外,包括 Rc<T>:这是不能 Send 的,因为如果克隆了 Rc<T> 的值并尝试将克隆的所有权转移到另一个线程,这两个线程都可能同时更新引用计数。为此,Rc<T> 被实现为用于单线程场景,这时不需要为拥有线程安全的引用计数而付出性能代价。

    +

    因此,Rust 类型系统和 trait bound 确保永远也不会意外的将不安全的 Rc<T> 在线程间发送。当尝试在示例 16-14 中这么做的时候,会得到错误 the trait Send is not implemented for Rc<Mutex<i32>>。而使用标记为 SendArc<T> 时,就没有问题了。

    +

    任何完全由 Send 的类型组成的类型也会自动被标记为 Send。几乎所有基本类型都是 Send 的,除了第二十章将会讨论的裸指针(raw pointer)。

    +

    Sync 允许多线程访问

    +

    Sync 标记 trait 表明一个实现了 Sync 的类型可以安全的在多个线程中拥有其值的引用。换一种方式来说,对于任意类型 T,如果 &TT 的不可变引用)是 Send 的话 T 就是 Sync 的,这意味着其引用就可以安全的发送到另一个线程。类似于 Send 的情况,基本类型是 Sync 的,完全由 Sync 的类型组成的类型也是 Sync 的。

    +

    智能指针 Rc<T> 也不是 Sync 的,出于其不是 Send 相同的原因。RefCell<T>(第十五章讨论过)和 Cell<T> 系列类型不是 Sync 的。RefCell<T> 在运行时所进行的借用检查也不是线程安全的。Mutex<T>Sync 的,正如 “在线程间共享 Mutex<T> 部分所讲的它可以被用来在多线程中共享访问。

    +

    手动实现 SendSync 是不安全的

    +

    通常并不需要手动实现 SendSync trait,因为由 SendSync 的类型组成的类型,自动就是 SendSync 的。因为它们是标记 trait,甚至都不需要实现任何方法。它们只是用来加强并发相关的不可变性的。

    +

    手动实现这些标记 trait 涉及到编写不安全的 Rust 代码,第十九章将会讲述具体的方法;当前重要的是,在创建新的由不是 SendSync 的部分构成的并发类型时需要多加小心,以确保维持其安全保证。“The Rustonomicon” 中有更多关于这些保证以及如何维持它们的信息。

    +

    总结

    +

    这不会是本书最后一个出现并发的章节:第二十一章的项目会在更现实的场景中使用这些概念,而不像本章中讨论的这些小例子。

    +

    正如之前提到的,因为 Rust 本身很少有处理并发的部分内容,有很多的并发方案都由 crate 实现。它们比标准库要发展的更快;请在网上搜索当前最新的用于多线程场景的 crate。

    +

    Rust 提供了用于消息传递的信道,和像 Mutex<T>Arc<T> 这样可以安全的用于并发上下文的智能指针。类型系统和借用检查器会确保这些场景中的代码,不会出现数据竞争和无效的引用。一旦代码可以编译了,我们就可以坚信这些代码可以正确的运行于多线程环境,而不会出现其他语言中经常出现的那些难以追踪的 bug。并发编程不再是什么可怕的概念:无所畏惧地并发吧!

    +

    接下来,让我们讨论一下当 Rust 程序变得更大时,有哪些符合语言习惯的问题建模方法和结构化解决方案,以及 Rust 的风格是如何与面向对象编程(Object Oriented Programming)中那些你所熟悉的概念相联系的。

    +

    Async 和 await

    +
    +

    ch17-00-async-await.md +
    +commit 3111eda07a4a4692bf69e3aaad999d840ac9c138

    +
    +

    很多我们要求计算机处理的操作都需要一定的时间才能完成。例如,如果你使用视频编辑器来创建一个家庭聚会的视频,导出视频可能会花费几分钟到几小时不等。同样,从家庭成员那里下载共享的视频也可能需要很长时间。如果我们能在等待这些长时间运行的操作完成期间做点其他事情,那就太好了。

    +

    视频导出会尽可能使用所有的 CPU 和 GPU。如果你只有一个 CPU 核,同时操作系统在导出完成前也不会暂停,那么在其运行期间你无法使用计算机进行任何其他操作。这会是一个非常糟糕的体验。相反计算机的操作系统可以(也确实可以)隐式地中断导出过程,频率足够高,使你能够在导出进行的同时完成其他任务。

    +

    下载文件则有所不同。它不占用大量的 CPU 时间。相反 CPU 需要等待来自于网络的数据。虽然可以在部分数据就绪时就开始读取,但等待剩余数据可能还需要一段时间。即便数据全部就绪了,视频文件也可能非常大,因此加载所有数据也会花费一些时间。虽然这可能只需要一两秒,不过这对于一个现代处理器来说已经是非常长的时间了,因为它每秒可以执行数十亿次操作。因此,如果能让 CPU 在等待网络调用完成的同时去处理别的工作就再好不过了。所以同上操作系统会隐式地中断你的程序以便其它工作可以在网络操作进行的同时继续进行。

    +
    +

    注意:视频导出这类操作通常被称为 “CPU 密集型”(“CPU-bound”)或者 “计算密集型”(“compute-bound”)操作。其受限于计算机 CPUGPU 处理数据的速度,以及它所能利用的计算能力。而下载视频这类操作通常被称为 “IO 密集型”(“IO-bound”)操作,因为其受限于计算机的 输入输出 速度。下载的速度最多只能与通过网络传输数据的速度一致。

    +
    +

    在上述两个例子中,操作系统的隐式中断提供了一种形式的并发。不过这种并发仅限于整个程序的级别:操作系统中断一个程序并让其它程序得以执行。在很多场景中,由于我们能比操作系统在更细粒度上理解我们的程序,因此我们可以观察到很多操作系统无法察觉的并发机会。

    +

    例如,如果我们在构建一个管理文件下载的工具,我们应当以一种不会因开始一个下载任务而锁定 UI 的方式来编写程序,并且用户应该能够同时开始多个下载任务。不过很多操作系统与网络交互的 API 都是 阻塞 的(blocking)。也就是说这些 API 会阻塞程序的进程,直到它们处理的数据完全就绪。

    +
    +

    注意:如果你仔细思索一下,会发现这是 大部分 函数调用的工作方式!不过我们通常将 “阻塞” 这个术语保留给那些与文件、网络或其它计算机资源交互的函数调用,因为这些地方是单个程序可以从 阻塞操作中获益的地方。

    +
    +

    我们可以新建专用的线程来下载每个文件以免阻塞主线程。然而,我们最终会发现这些线程的开销会成为一个问题。如果这些调用在一开始就是非阻塞的话那就更理想了。最后,如果我们能够像在阻塞代码中一样,以直接的风格编写非阻塞代码,那就更好了。比如这样:

    +
    let data = fetch_data_from(url).await;
    +println!("{data}");
    +

    这正是 Rust 的 async 抽象所提供的。不过在讲解它们在实践中如何工作之前,让我们稍微绕个远路来了解一下并行(parallelism)和并发(concurrency)的区别。

    +

    并行与并发

    +

    在上一章中,我们大致将并行和并发视为可以互换的概念。但现在我们需要更加精确地区分它们,因为它们的区别将在实际工作中显现出来。

    +

    思考一下不同的团队分割方法来开发一个软件项目。我们可以分配给一个个人多个任务,也可以每个团队成员各自负责一个任务,或者可以采用这两种方法的组合。

    +

    当一个个人在任何一个任务完成前同时处理多个任务,这就是 并发。你可能在计算机上同时运行两个项目,当你对其中一个项目感到厌倦或遇到困难时,可以切换到另一个项目。因为你是单独一个人,所以无法真正同时推进两个任务,但是你可以多任务处理,在不同任务之间切换以取得进展。

    +
    +并发工作流 +
    图 17-1:一个并发工作流,在任务 A 和任务 B 之间切换
    +
    +

    当你同意将一组任务在组员中分配,每一个组员分配一个任务并单独处理它,这就是 并行。每个组员可以真正同时进行工作。

    +
    +并发工作流 +
    图 17-2:一个并行流,其中任务 A 和任务 B 的工作同时独立进行
    +
    +

    在这两种场景中,你可能需要协调不同的任务。也许你 认为 某个人负责的任务与其他人的工作完全不相关,但实际上它确实依赖于团队中另一位成员的工作完成。一些工作可以并行进行,不过一些工作事实上是 串行 的:它们只能串行地发生,一个接着一个,如图 17-3 所示。

    +
    +并发工作流 +
    图 17-3:一个部分并行的工作流,其中任务 A 和任务 B 的工作相互独立,直到任务 A3 阻塞在等待任务 B3 的结果
    +
    +

    同理,你可能会意识到你自己的一个任务依赖另一个任务。现在并发任务也变成串行的了。

    +

    并行与并发也可能相互交叉(阻塞)。如果你得知某个同事卡在等待你的一个任务完成,你可能会集中所有精力在这个任务上来 “解锁” 你的同事。你和你的同事则不再能并行地工作了,同时你也不能够并发地处理自己的任务。

    +

    同样的基础动态也作用于软件与硬件。在一个单核的机器上,CPU 一次只能执行一个操作,不过它仍然可以并发工作。借助像线程、进程和异步(async)等工具,计算机可以暂停一个活动,并在最终切换回第一个活动之前切换到其它活动。在一个有多个 CPU 核心的机器上,它也可以并行工作。一个核心可以做一件工作的同时另一个核心可以做一些完全不相关的工作,而且这些工作实际上是同时发生的。

    +

    当使用 Rust 中的 async 时,我们总是在处理并发。取决于硬件、操作系统和所使用的异步运行时(async runtime)-- 稍后会介绍更多的异步运行时!并发也可能在底层使用了并行。

    +

    现在让我们深入理解 Rust 的异步编程实际上是如何工作的!在接下来的章节中,我们将:

    +
      +
    • 学习如何使用 Rust 的 asyncawait 语法
    • +
    • 探索如何使用异步模型来解决第十六章中遇到的一些挑战
    • +
    • 了解多线程和异步如何互补,在很多场景中你甚至可以同时使用两者
    • +
    +

    Futures 和 async 语法

    +
    +

    ch17-01-futures-and-syntax.md +
    +commit e95efa05706c5c4309df9ed47d5e91d8ed342b7d

    +
    +

    Rust 异步编程的关键元素是 futures 和 Rust 的 asyncawait 关键字。

    +

    future 是一个现在可能还没有准备好但将在未来某个时刻准备好的值。(相同的概念也出现在很多语言中,有时被称为 “task” 或者 “promise”。)Rust 提供了 Future trait 作为基础组件,这样不同的异步操作就可以在不同的数据结构上实现。在 Rust 中,我们称实现了 Future trait 的类型为 futures。每一个实现了 Future 的类型会维护自己的进度状态信息和 “ready” 的定义。

    +

    async 关键字可以用于代码块和函数,表明它们可以被中断并恢复。在一个 async 块或 async 函数中,可以使用 await 关键字来等待一个 future 准备就绪,这一过程称为 等待一个 future。async 块或 async 函数中每一个等待 future 的地方都可能是一个 async 块或 async 函数中断并随后恢复的点。检查一个 future 并查看其值是否已经准备就绪的过程被称为 轮询(polling)。

    +

    其它一些语言也使用 asyncawait 关键字进行异步编程。如果你熟悉这些语言,则可能会注意到它们与 Rust 的处理方式有显著不同,包括语法上的差异。我们将看到,这样做是有充分理由的!

    +

    在大多数情况下,编写异步 Rust 代码时,我们使用 asyncawait 关键字。Rust 将其编译为等同于使用 Future trait 的代码,这非常类似于将 for 循环编译为等同于使用 Iterator trait 的代码。不过,由于 Rust 提供了 Future trait,你也可以在需要时为你自己的数据类型实现它。在整个章节中你会看到很多函数的返回值类型都有其自己的 Future 实现。我们会在本章结尾回到这个 trait 的定义,并深入了解它的工作原理,但现在这些细节已经足够让我们继续前进了。

    +

    这些内容可能有点抽象。让我们来编写第一个异步程序:一个小型网络爬虫。我们会从命令行传递两个 URL,并发地解析它们,并返回第一个完成解析的结果。这个示例会引入不少的新语法,不过不用担心。我们会逐步解释所有你需要了解的内容。

    +

    第一个异步程序

    +

    为了保持本章的内容专注于学习 async,而不是处理生态系统的部分组件,我们已经创建了一个 trpl crate(trpl 是 “The Rust Programming Language” 的缩写)。它重导出了你需要的所有类型、traits 和函数,它们主要来自于 futurestokio crates。

    +
      +
    • futures crate 是一个 Rust 异步代码实验的官方仓库,也正是 Future 最初设计的地方。
    • +
    • Tokio 是目前 Rust 中应用最广泛的异步运行时(async runtime),特别是(但不仅是!)web 应用。这里还有其他优秀的运行时,它们可能更适合你的需求。我们在 trpl 的底层使用 Tokio 是因为它经过了充分测试且广泛使用。
    • +
    +

    在一些场景中,trpl 也会重命名或者封装原始 API 以便我们专注于与本章相关的细节。如果你想了解该 crate 的具体功能,我们鼓励你查看其源码。你可以看到每个重导出的内容来自哪个 crate,我们留下了大量注释来解释这个 crate 的用途。

    +

    创建一个名为 hello-async 的二进制项目并将 trpl crate 作为一个依赖添加:

    +
    $ cargo new hello-async
    +$ cd hello-async
    +$ cargo add trpl
    +
    +

    现在我们可以利用 trpl 提供的多种组件来编写第一个异步程序。我们构建了一个小的命令行工具来抓取两个网页,拉取各自的 <title> 元素,并打印出第一个完成全部过程的标题。

    +

    让我们开始编写一个函数,它获取一个网页 URL 作为参数,请求该 URL 并返回标题元素的文本:

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +fn main() {
    +    // TODO: we'll add this next!
    +}
    +
    +use trpl::Html;
    +
    +async fn page_title(url: &str) -> Option<String> {
    +    let response = trpl::get(url).await;
    +    let response_text = response.text().await;
    +    Html::parse(&response_text)
    +        .select_first("title")
    +        .map(|title_element| title_element.inner_html())
    +}
    +
    示例 17-1:定义一个 async 函数来获取一个 HTML 页面的标题元素
    +
    +

    在示例 17-1 中,我们定义了一个名为 page_title 的函数,并使用了 async 关键字标记。接着我们使用 trpl::get 函数来获取传入的任意 URL,然后使用 await 关键字来等待响应。接着我们调用其 text 方法来获取响应的文本,这里再一次使用 await 关键字等待。这两个步骤都是异步的。对于 get 来说,我们需要等待服务器发送回其响应的第一部分,这会包含 HTTP 头(headers)、cookies 等。这部分响应可以独立于响应体发送。特别是在响应体非常大时候,接收完整响应可能会花费一些时间。因此我们不得不等待响应 整体 返回,所以 text 方法也是异步。

    +

    我们必须显示地等待这两个 futures,因为 Rust 中的 futures 是 惰性lazy)的:在你使用 await 请求之前它们不会执行任何操作。(事实上,如果你不使用一个 futures,Rust 会显示一个编译警告)这应该会让你想起之前第十三章关于迭代器的讨论。直到你调用迭代器的 next 方法(直接调用或者使用 for 循环或者类似 map 这类在底层使用 next 的方法)之前它们什么也不会做。对于 futures 来说,同样的基本理念也是适用的:除非你显式地请求,否则它们不会执行。惰性使得 Rust 可以避免提前运行异步代码,直到真正需要时才执行。

    +
    +

    注意:这不同于上一章节中 thread::spawn 的行为,当时传递给另一个线程的闭包会立即开始运行。这也与许多其他语言处理异步的方式不同!但对于 Rust 而言,这一点非常重要。稍后我们会解释原因。

    +
    +

    当我们有了 response_text 函数,就可以使用 Html::parse 将其解析为一个 Html 类型的实例。不同于原始字符串,现在我们有了一个可以将 HTML 作为更丰富数据结构来操作的数据类型。特别是我们可以使用 select_first 方法来找出给定 CSS 选择器(selector)中第一个匹配元素。通过传递字符串 "title",我们会得到文档中的第一个 <title> 元素,如果它存在的话。由于可能没有任何匹配的元素,select_first 返回一个 Option<ElementRef>。最后我们使用 Option::map 方法,它允许我们在 Option 中有元素时对其进行处理,而在没有时则什么也不做。(这里也可以使用一个 match 表达式,但 map 更符合惯用的写法。)在传递给 map 的函数体中,我们调用了 title_element 上的 inner_html 来获取其内容,这是一个 String。当上面所讲的都完成后,我们会得到一个 Option<String>

    +

    注意 Rust 的 await 关键字出现在需要等待的表达式之后而不是之前。也就是说,这是一个 后缀关键字postfix keyword)。如果你在其它语言中使用过 async 的话,这可能与你所熟悉的有所不同。Rust 如此选择是因为这使得方法的链式调用更加简洁。因此,我们可以修改 page_url_for 的函数体来链式调用 trpl::gettext 并在其之间使用 await,如示例 17-2 所示:

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use trpl::Html;
    +
    +fn main() {
    +    // TODO: we'll add this next!
    +}
    +
    +async fn page_title(url: &str) -> Option<String> {
    +    let response_text = trpl::get(url).await.text().await;
    +    Html::parse(&response_text)
    +        .select_first("title")
    +        .map(|title_element| title_element.inner_html())
    +}
    +
    示例 17-2:使用 `await` 关键字的链式调用
    +
    +

    这样我们就成功编写了第一个异步函数!在我们向 main 加入一些代码调用它之前,让我们再多了解下我们写了什么以及它的意义。

    +

    当 Rust 遇到一个 async 关键字标记的代码块时,会将其编译为一个实现了 Future trait 的唯一的、匿名的数据类型。当 Rust 遇到一个被标记为 async 的函数时,会将其编译进一个拥有异步代码块的非异步函数。异步函数的返回值类型是编译器为异步代码块所创建的匿名数据类型。

    +

    因此,编写 async fn 就等同于编写一个返回类型的 future 的函数。当编译器遇到类似示例 17-1 中 async fn page_title 的函数定义时,它等价于以下定义的非异步函数:

    +
    #![allow(unused)]
    +fn main() {
    +extern crate trpl; // required for mdbook test
    +use std::future::Future;
    +use trpl::Html;
    +
    +fn page_title(url: &str) -> impl Future<Output = Option<String>> + '_ {
    +    async move {
    +        let text = trpl::get(url).await.text().await;
    +        Html::parse(&text)
    +            .select_first("title")
    +            .map(|title| title.inner_html())
    +    }
    +}
    +}
    +

    让我们挨个看一下转换后版本的每一个部分:

    +
      +
    • 它使用了之前第十章 “trait 作为参数” 部分讨论过的 impl Trait 语法
    • +
    • 它返回的 trait 是一个 Future,它有一个关联类型 Output。注意 Output 的类型是 Option<String>,这与 async fn 版本的 page_title 的原始返回值类型相同。
    • +
    • 所有原始函数中被调用的代码被封装进一个 async move 块。回忆一下,代码块是表达式。这整个块就是函数所返回的表达式
    • +
    • 如上所述,这个异步代码块产生一个 Option<String> 类型的值。这个值与返回类型中的 Output 类型一致。这正类似于你已经见过的其它代码块。
    • +
    • 新版函数的函数体是一个 async move 代码块,因为它如何使用 url 参数决定了这一点。(本章后续部分将更详细地讨论 asyncasync move 之间的区别。)
    • +
    • 新版本的函数在返回类型中使用了一种我们之前未见过的生命周期标记:'_。因为函数返回的 Future 指向一个引用(在这个例子中是指向 url 参数的引用)我们需要告诉 Rust 引用的生命周期。这里无需命名该生命周期,因为 Rust 足够智能到能理解这里只涉及到唯一一个引用,不过我们 必须 明确指出返回的 Future 受该生命周期的约束。
    • +
    +

    现在我们可以在 main 中调用 page_title。首先,我们只会获取一个页面的标题。在示例 17-3 中,我们沿用了第十二章中获取命令行参数的相同模式。接着我们传递第一个 URL 给 page_title,并等待结果。因为 future 产生的值是一个 Option<String>,我们使用 match 表达式来根据页面是否有 <title> 来打印不同的信息。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use trpl::Html;
    +
    +async fn main() {
    +    let args: Vec<String> = std::env::args().collect();
    +    let url = &args[1];
    +    match page_title(url).await {
    +        Some(title) => println!("The title for {url} was {title}"),
    +        None => println!("{url} had no title"),
    +    }
    +}
    +
    +async fn page_title(url: &str) -> Option<String> {
    +    let response_text = trpl::get(url).await.text().await;
    +    Html::parse(&response_text)
    +        .select_first("title")
    +        .map(|title_element| title_element.inner_html())
    +}
    +
    示例 17-3:在 `main` 中通过一个用户提供的参数调用 `page_title` 函数
    +
    +

    很不幸的是这还不能编译。唯一可以使用 await 关键字的地方是异步函数或者代码块中,同时 Rust 不允许将特殊的 main 函数标记为 async

    + +
    error[E0752]: `main` function is not allowed to be `async`
    + --> src/main.rs:6:1
    +  |
    +6 | async fn main() {
    +  | ^^^^^^^^^^^^^^^ `main` function is not allowed to be `async`
    +
    +

    main 不能标记为 async 的原因是异步代码需要一个 运行时:即一个管理执行异步代码细节的 Rust crate。一个程序的 main 函数可以 初始化 一个运行时,但是其 自身 并不是一个运行时。(稍后我们会进一步解释原因。)每一个执行异步代码的 Rust 程序必须至少有一个设置运行时并执行 futures 的地方。

    +

    大部分支持异步的语言会打包一个运行时在语言中。Rust 则不是,相这里有很多不同的异步运行时,每一个都有适合其目标的权衡取舍。例如,一个拥有很多核心和大量内存的高吞吐 web server 与一个单核、少量内存并且没有堆分配能力的微控制器相比有着截然不同的需求。提供这些运行时的 crate 通常也提供了例如文件或者网络 IO 这类常用功能的异步版本。

    +

    从这里到本章余下部分,我们会使用 trpl crate 的 run 函数,它获取一个 future 作为参数并运行到结束。在内部,调用 run 会设置一个运行时来运行传递的 future。一旦 future 完成,run 返回 future 返回的任何值。

    +

    我们可以将 page_title 返回的 future 直接传递给 run。一旦其完成,我们能够匹配返回的 Option<String>,正如示例 17-3 我们尝试的那样。然而,在本章的大部分示例中(以及大多数实际应用中的异步代码中!),我们会执行不止一次异步函数调用,所以相反我们会传递一个 async 块并显式地等待 page_title 调用的结果,如示例 17-4 所示。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use trpl::Html;
    +
    +fn main() {
    +    let args: Vec<String> = std::env::args().collect();
    +
    +    trpl::run(async {
    +        let url = &args[1];
    +        match page_title(url).await {
    +            Some(title) => println!("The title for {url} was {title}"),
    +            None => println!("{url} had no title"),
    +        }
    +    })
    +}
    +
    +async fn page_title(url: &str) -> Option<String> {
    +    let response_text = trpl::get(url).await.text().await;
    +    Html::parse(&response_text)
    +        .select_first("title")
    +        .map(|title_element| title_element.inner_html())
    +}
    +
    示例 17-4:等待一个使用异步代码块的 `trpl::run`
    +
    +

    当我们运行代码,我们会得到最初预想的行为:

    +
    $ cargo run "http://www.rust-lang.org"
    +The title for http://www.rust-lang.org was
    +            Rust Programming Language
    +
    +

    我们终于有了一些可以正常工作的异步代码!现在它们可以成功编译并运行。在我们添加代码让两个网址进行竞争之前,让我们简要地回顾一下 future 是如何工作的。

    +

    每一个 await point,也就是代码使用 await 关键字的地方,代表将控制权交还给运行时的地方。为此 Rust 需要记录异步代码块中涉及的状态,这样运行时可以去执行其他工作,并在准备好时回来继续推进当前的任务。这就像你通过编写一个枚举来保存每一个 await point 的状态一样:

    +
    #![allow(unused)]
    +fn main() {
    +extern crate trpl; // required for mdbook test
    +
    +enum PageTitleFuture<'a> {
    +    Initial { url: &'a str },
    +    GetAwaitPoint { url: &'a str },
    +    TextAwaitPoint { response: trpl::Response },
    +}
    +}
    +

    编写代码来手动控制不同状态之间的转换是非常乏味且容易出错的,特别是之后增加了更多功能和状态的时候。相反,Rust 编译器自动创建并管理异步代码的状态机数据结构。如果你感兴趣的话:是的,正常的借用和所有权也全部适用于这些数据结构。幸运的是,编译器也会为我们处理这些检查,并提供友好的错误信息。本章稍后会讲解一些相关内容!

    +

    最终需要某个组件来执行状态机。这就是运行时。(这也是为什么在了解运行时的时候,你可能会看到 executors 这个词:executor 是运行时中负责执行异步代码的部分。)

    +

    现在我们能够理解了之前示例 17-3 中为何编译器阻止我们将 main 本身标记为异步函数了。如果 main 是一个异步函数,需要有其它组件来管理 main futrue 返回的状态机,但是 main 是程序的入口点!为此我们在 main 函数中调用 trpl::run,它设置了一个运行时并运行 async 块返回的 future 并等待它返回 Ready

    +
    +

    注意:一些运行时提供了相关的宏所以你 可以 编写一个异步 main 函数。这些宏将 async fn main() { ... } 重写为正常的 fn main,执行的逻辑与我们在示例 17-5 中手动实现的一样:像 trpl::run 一样调用一个函数运行 future 直到结束。

    +
    +

    让我们将这些代码片段整理一下来看看如何编写并发代码,这里通过两个来自命令行的不同 URL 来调用 page_title 并使其相互竞争。

    +
    +

    文件名:src/main.rs

    + +
    extern crate trpl; // required for mdbook test
    +
    +use trpl::{Either, Html};
    +
    +fn main() {
    +    let args: Vec<String> = std::env::args().collect();
    +
    +    trpl::run(async {
    +        let title_fut_1 = page_title(&args[1]);
    +        let title_fut_2 = page_title(&args[2]);
    +
    +        let (url, maybe_title) =
    +            match trpl::race(title_fut_1, title_fut_2).await {
    +                Either::Left(left) => left,
    +                Either::Right(right) => right,
    +            };
    +
    +        println!("{url} returned first");
    +        match maybe_title {
    +            Some(title) => println!("Its page title is: '{title}'"),
    +            None => println!("Its title could not be parsed."),
    +        }
    +    })
    +}
    +
    +async fn page_title(url: &str) -> (&str, Option<String>) {
    +    let text = trpl::get(url).await.text().await;
    +    let title = Html::parse(&text)
    +        .select_first("title")
    +        .map(|title| title.inner_html());
    +    (url, title)
    +}
    +
    示例 17-5
    +
    +

    示例 17-5 中以分别由用户提供的 URL 调用 page_title 开始。我们将调用 page_title 产生的 future 分别保存为 title_fut_1title_fut_2。请记住,它们还没有进行任何工作,因为 future 是惰性的,并且我们还没有 await 它们。接着我们将 futures 传递给 trpl::race,它返回一个值表明哪个传递的 future 最先返回。

    +
    +

    注意:在内部 race 构建在一个更通用的函数 select 之上,你会在真实的 Rust 代码中更常遇到它。select 函数可以做很多 trpl::race 函数做不了的事,不过它也有一些额外的复杂性,所以目前我们先略过介绍。

    +
    +

    由于任何一个 future 都可以合理地 “获胜”,所以返回 Result 没有意义。相反 race 返回了一个我们之前没有见过的类型 trpl::EitherEither 类型有点类似于 Result,它也有两个成员。但是不同于 EitherEither 没有内置成功或者失败的概念。相反它使用 LeftRight 来表示 “一个或另一个”。

    +
    #![allow(unused)]
    +fn main() {
    +enum Either<A, B> {
    +    Left(A),
    +    Right(B),
    +}
    +}
    +

    race 函数返回 Left,如果第一个参数先完成,并包含该 future 的输出,如果 第二个 future 先完成,则返回 Right 和第二个 future 的输出。这匹配调用函数时参数出现的顺序:第一个参数在第二个参数的左边。

    +

    我们还更新了 page_title 来返回与传递时相同的 URL。如此如果首先返回的页面没有可以解析的 <title>,仍然可以打印出有意义的信息。有了这些信息,我们对 println! 的输出进行了封装和更新,以表明哪个 URL 最先完成,并在页面有 <title> 时打印出它的内容。

    +

    现在我们完成一个小型网页爬虫的构建了!挑选一对 URL 并运行命令行工具。你会发现某些网站稳定地快于其它网站,而有些情况哪些网站会 则每次都不同。更重要的是,你已经掌握了处理 futures 的基础知识,因此我们现在可以进一步探索更多异步操作的可能性了。

    + +

    并发与 async

    +
    +

    ch17-02-concurrency-with-async.md +
    +commit 62d441060d66f9a1c3d3cdfffa8eed40f817d1aa

    +
    +

    在这一部分,我们将使用异步来应对一些与第十六章中通过线程解决的相同的并发问题。因为之前我们已经讨论了很多关键理念了,这一部分我们会专注于线程与 future 的区别。

    +

    在很多情况下,使用异步处理并发的 API 与使用线程的非常相似。在其它的一些情况,它们则非常不同。即便线程与异步的的 API 看起来 很类似,通常它们有着不同的行为,同时它们几乎总是有着不同的性能特点。

    +

    计数

    +

    第十六章中我们应付的第一个任务是在两个不同的线程中计数。让我们用异步来完成相同的任务。trpl crate 提供了一个 spawn_task 函数,它看起来非常像 thread::spawn API,和一个 sleep 函数,这是 thread::sleep API 的异步版本。我们可以将它们结合使用,实现与线程示例相同的计数功能,如示例 17-6 所示。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::Duration;
    +
    +fn main() {
    +    trpl::run(async {
    +        trpl::spawn_task(async {
    +            for i in 1..10 {
    +                println!("hi number {i} from the first task!");
    +                trpl::sleep(Duration::from_millis(500)).await;
    +            }
    +        });
    +
    +        for i in 1..5 {
    +            println!("hi number {i} from the second task!");
    +            trpl::sleep(Duration::from_millis(500)).await;
    +        }
    +    });
    +}
    +
    示例 17-6:使用 `spawn_task` 启动两个计数任务
    +
    +

    作为开始,我们在 main 函数中使用 trpl::run,这样我们的顶层函数可以是异步的。

    +
    +

    注意:本章从现在开始,每一个示例的 main 中都会包含几乎相同的 trpl::run 封装代码,所以我们经常会连同 main 一同省略。别忘了在你的代码中加入它们!

    +
    +

    接着我们在代码块中编写了两个循环,每个其中都有一个 trpl::sleep 调用,每一个都在发送下一个信息之前等待半秒(500 毫秒)。我们将一个循环放到 trpl::spawn_task 中并将另一个放在顶层的 for 循环中。我们也在 sleep 调用之后加入了一个 await

    +

    这个实现与基于线程的版本类似,包括在运行时,你可能会在终端中看到消息以不同顺序出现的情况。

    + +
    hi number 1 from the second task!
    +hi number 1 from the first task!
    +hi number 2 from the first task!
    +hi number 2 from the second task!
    +hi number 3 from the first task!
    +hi number 3 from the second task!
    +hi number 4 from the first task!
    +hi number 4 from the second task!
    +hi number 5 from the first task!
    +
    +

    这个版本在 main 中的异步代码块中 for 循环结束后就停止了,因为当 main 函数结束时 spawn_task 产生的任务就会关闭。如果运行该任务直到结束,你需要使用一个 join 句柄(join handle)来等待第一个任务完成。对于线程来说,可以使用 join 方法来 “阻塞” 直到线程结束运行。在示例 17-7 中,我们可以使用 await 来实现相同的效果,因为任务句柄本身是一个 future。它的 Output 类型是一个 Result,所以我们还需要 unwrap 来 await 它。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::Duration;
    +
    +fn main() {
    +    trpl::run(async {
    +        let handle = trpl::spawn_task(async {
    +            for i in 1..10 {
    +                println!("hi number {i} from the first task!");
    +                trpl::sleep(Duration::from_millis(500)).await;
    +            }
    +        });
    +
    +        for i in 1..5 {
    +            println!("hi number {i} from the second task!");
    +            trpl::sleep(Duration::from_millis(500)).await;
    +        }
    +
    +        handle.await.unwrap();
    +    });
    +}
    +
    示例 17-7:在一个 join 句柄上使用 `await` 使得任务运行直到结束
    +
    +

    更新后的版本会运行 两个 循环直到结束。

    + +
    hi number 1 from the second task!
    +hi number 1 from the first task!
    +hi number 2 from the first task!
    +hi number 2 from the second task!
    +hi number 3 from the first task!
    +hi number 3 from the second task!
    +hi number 4 from the first task!
    +hi number 4 from the second task!
    +hi number 5 from the first task!
    +hi number 6 from the first task!
    +hi number 7 from the first task!
    +hi number 8 from the first task!
    +hi number 9 from the first task!
    +
    +

    目前为止,看起来异步和线程版本给出了基本一样的输出,它们只是使用了不同的语法:在 join 句柄上使用 await 而不是调用 join,和 await sleep 调用。

    +

    最大的区别在于无需再产生另一个操作系统线程来进行工作。事实上,我们甚至不需要产生一个任务。因为异步代码块会编译为匿名 future,我们可以将每一个循环放进一个异步代码块并使用 trpl::join 方法来让运行时将它们两个都运行至完成。

    +

    在第十六章中,我们展示了如何在 std::thread::spawn 调用返回的 JoinHandle 类型上调用 join 方法。trpl::join 函数也类似,不过它作用于 future。当你传递两个 future,它会产生单独一个 future 但它的输出是一个元组,当 两者 都完成时其中有每一个传递给它的 future 的输出。因此,在示例 17-8 中,我们使用 trpl::join 来等待 fut1fut2 都结束。我们 没有 await fut1fut2,而是等待 trpl::join 新产生的 future。我们忽略其输出,因为它只是一个包含两个单元值(unit value)的元组。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::Duration;
    +
    +fn main() {
    +    trpl::run(async {
    +        let fut1 = async {
    +            for i in 1..10 {
    +                println!("hi number {i} from the first task!");
    +                trpl::sleep(Duration::from_millis(500)).await;
    +            }
    +        };
    +
    +        let fut2 = async {
    +            for i in 1..5 {
    +                println!("hi number {i} from the second task!");
    +                trpl::sleep(Duration::from_millis(500)).await;
    +            }
    +        };
    +
    +        trpl::join(fut1, fut2).await;
    +    });
    +}
    +
    示例 17-8:使用 `trpl::join` 来 await 两个匿名 future
    +
    +

    当运行代码我们会看到两个 future 会运行至结束:

    + +
    hi number 1 from the first task!
    +hi number 1 from the second task!
    +hi number 2 from the first task!
    +hi number 2 from the second task!
    +hi number 3 from the first task!
    +hi number 3 from the second task!
    +hi number 4 from the first task!
    +hi number 4 from the second task!
    +hi number 5 from the first task!
    +hi number 6 from the first task!
    +hi number 7 from the first task!
    +hi number 8 from the first task!
    +hi number 9 from the first task!
    +
    +

    这里,你每次都会看到完全相同的顺序,这与我们在线程中看到的情况非常不同。这是因为 trpl::join 函数是 公平的fair),这意味着它以相同的频率检查每一个 future,使它们交替执行,绝不会让一个任务在另一个任务准备好时抢先执行。对于线程来说,操作系统会决定该检查哪个线程和会让它运行多长时间。对于异步 Rust 来说,运行时决定检查哪一个任务。(在实践中,细节会更为复杂,因为异步运行时可能在底层使用操作系统线程来作为其并发管理的一部分,因此要保证公平性可能会增加运行时的工作量,但这仍然是可行的!)运行时无需为任何操作保证公平性,同时运行时也经常提供不同的 API 来让你选择是否需要公平性。

    +

    尝试这些不同的 await future 的变体来观察它们的效果:

    +
      +
    • 去掉一个或者两个循环外的异步代码块。
    • +
    • 在定义两个异步代码块后立刻 await 它们。
    • +
    • 直将第一个循环封装进异步代码块,并在第二个循环体之后 await 作为结果的 future。
    • +
    +

    作为额外的挑战,看看你能否在运行代码 之前 想出每个情况下的输出!

    +

    消息传递

    +

    在 future 之间共享数据也与线程类似:我们会再次使用消息传递,不过这次使用的是异步版本的类型和函数。我们会采用与之前第十六章中使用的稍微不同的方法,来展示一些基于线程的并发与基于 future 的并发之间的关键差异。在示例 17-9 中,我们会从仅有一个异步代码块开始,不像 之前产生独立线程那样产生一个独立的任务。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +fn main() {
    +    trpl::run(async {
    +        let (tx, mut rx) = trpl::channel();
    +
    +        let val = String::from("hi");
    +        tx.send(val).unwrap();
    +
    +        let received = rx.recv().await.unwrap();
    +        println!("Got: {received}");
    +    });
    +}
    +
    示例 17-9:创建一个异步信道(async channel)并赋值其两端为 `tx` 和 `rx`
    +
    +

    这里我们使用了 trpl::channel,一个第十六章用于线程的多生产者、单消费者信道 API 的异步版本。异步版本的 API 与基于线程的版本只有一点微小的区别:它使用一个可变的而不是不可变的 rx,并且它的 recv 方法产生一个需要 await 的 future 而不是直接返回值。现在我们可以发送端向接收端发送消息了。注意我们无需产生一个独立的线程或者任务;只需等待(await) rx.recv 调用。

    +

    std::mpsc::channel 中的同步 Receiver::recv 方法阻塞执行直到它接收一个消息。trpl::Receiver::recv 则不会阻塞,因为它是异步的。不同于阻塞,它将控制权交还给运行时,直到接收到一个消息或者信道的发送端关闭。相比之下,我们不用 await send,因为它不会阻塞。也无需阻塞,因为信道的发送端的数量是没有限制的。

    +
    +

    注意:因为所有这些异步代码都运行在一个 trpl::run 调用的异步代码块中,其中的所有代码可以避免阻塞。然而,外面 的代码会阻塞到 run 函数返回。这正是 trpl::run 函数的全部意义:它允许你 选择 在何处阻塞一部分异步代码,也就是在何处进行同步和异步代码的转换。这正是在大部分运行时中 run 实际上被命名为 block_on 的原因。

    +
    +

    请注意这个示例中的两个地方:首先,消息立刻就会到达!其次,虽然我们使用了 future,但是这里还没有并发。示例中的所有事情都是顺序发生的,就像没涉及到 future 时一样。

    +

    让我们通过发送一系列消息并在之间休眠来解决第一个问题,如示例 17-10 所示:

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::Duration;
    +
    +fn main() {
    +    trpl::run(async {
    +        let (tx, mut rx) = trpl::channel();
    +
    +        let vals = vec![
    +            String::from("hi"),
    +            String::from("from"),
    +            String::from("the"),
    +            String::from("future"),
    +        ];
    +
    +        for val in vals {
    +            tx.send(val).unwrap();
    +            trpl::sleep(Duration::from_millis(500)).await;
    +        }
    +
    +        while let Some(value) = rx.recv().await {
    +            println!("received '{value}'");
    +        }
    +    });
    +}
    +
    示例 17-10:通过异步信道发送和接收多个消息并在每个消息之间通过 `await` 休眠
    +
    +

    除了发送消息之外,我们还需要接收它们。在这个例子中我们可以手动接收,就是调用四次 rx.recv().await,因为我们知道进来了多少条消息。然而,在现实世界中,我们通常会等待 未知 数量的消息。这时我们需要一直等待直到可以确认没有更多消息了为止。

    +

    在示例 16-10 中,我们使用了 for 循坏来处理从异步信道接收的所有消息。然而,Rust 目前还没有在 异步 序列上编写 for 循环的方法。取而代之的是,我们需要一个我们还没有见过的新循环类型,即 while let 条件循环。while let 循环是我们在第六章中见过的 if let 结构的循环版本。只要其指定的模式持续匹配循环就会一直执行。

    +

    rx.recv 调用产生一个 Future,我们会 await 它。运行时会暂停 Future 直到它就绪。一旦消息到达,future 会解析为 Some(message),每次消息到达时都会如此。。当信道关闭时,不管是否有 任何 消息到达,future 都会解析为 None 来表明没有更多的值了,我们也就应该停止轮询,也就是停止等待。

    +

    while let 循环将上述逻辑整合在一起。如果 rx.recv().await 调用的结果是 Some(message),我们会得到消息并可以在循环体中使用它,就像使用 if let 一样。如果结果是 None,则循环停止。每次循环执行完毕,它会再次触发 await point,如此运行时会再次暂停直到另一条消息到达。

    +

    现在代码可以成功发送和接收所有的消息了。不幸的是,这里还有一些问题。首先,消息并不是按照半秒的间隔到达的。它们在程序启动后两秒(2000 毫秒)后立刻一起到达。其次,程序永远也不会退出!相反它会永远等待新消息。你会需要使用 ctrl-c 来关闭它。

    +

    让我们开始理解为何消息在全部延迟后立刻一起到达,而不是逐个在延迟后到达。在一个给定的异步代码块,await 关键字在代码中出现的顺序也就是程序执行时其发生的顺序。

    +

    示例 17-10 中只有一个异步代码块,所以所有的代码线性地执行。这里仍然没有并发。所有 tx.send 调用与 trpl::sleep 调用及其相关的 await point 是依次进行的。只有在此之后 while let 循环才开始执行 recv 调用上的 await point。

    +

    为了得到我们需要的行为,在接收每条消息之间引入休眠延迟,我们需要将 txrx 操作放置于它们各自的异步代码块中。这样运行时就可以使用 trpl::join 来分别执行它们,就像在计数示例中一样。我们再一次 await trpl::join 调用的结果,而不是它们各自的 future。如果我们顺序地 await 单个 future,则就又回到了一个顺序流,这正是我们 希望做的。

    + +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::Duration;
    +
    +fn main() {
    +    trpl::run(async {
    +        let (tx, mut rx) = trpl::channel();
    +
    +        let tx_fut = async {
    +            let vals = vec![
    +                String::from("hi"),
    +                String::from("from"),
    +                String::from("the"),
    +                String::from("future"),
    +            ];
    +
    +            for val in vals {
    +                tx.send(val).unwrap();
    +                trpl::sleep(Duration::from_millis(500)).await;
    +            }
    +        };
    +
    +        let rx_fut = async {
    +            while let Some(value) = rx.recv().await {
    +                println!("received '{value}'");
    +            }
    +        };
    +
    +        trpl::join(tx_fut, rx_fut).await;
    +    });
    +}
    +
    示例 17-11:将 `send` 和 `recv` 分隔到其各自的 `async` 代码块中并 await 这些代码块的 future
    +
    +

    采用示例 17-11 中的更新后的代码,消息会以 500 毫秒的间隔打印,而不是在两秒后就全部一起打印。

    +

    但是程序仍然永远也不会退出,这是由于 while let 循环与 trpl::join 的交互方式所致:

    +
      +
    • trpl::join 返回的 future 只会完成一次,即传递的 两个 future 都完成的时候。
    • +
    • tx future 在发送 vals 中最后一条消息之后的休眠结束后立刻完成。
    • +
    • rx future 直到 while let 循环结束之前都不会完成。
    • +
    • 当信道的另一端关闭后 await rx.recv 将只会返回 None
    • +
    • 信道只有在调用 rx.close 或者发送端 tx 被丢弃时才会关闭。
    • +
    • 我们没有在任何地方调用 rx.close,并且 tx 直到传递给 trpl::run 的最外层异步代码块结束前都不会被丢弃。
    • +
    • 代码块不能结束是因为它阻塞在了等待 trpl::join 完成,这就又回到了列表的开头!
    • +
    +

    我们可以在代码的某处调用 rx.close 来手动关闭 rx,不过这并没有太多意义。在处理了任意数量的消息后停止可以使程序停止,但是可能会丢失消息。我们需要其它的手段来确保 tx 在函数的结尾 之前 被丢弃。

    +

    目前发送消息的异步代码块只是借用了 tx,因为发送消息并不需要其所有权,但是如果我们可以将 tx 移动(move)进异步代码快,它会在代码块结束后立刻被丢弃。在第十三章中我们学习了如何在闭包上使用 move 关键字,在第十六章中,我们知道了使用线程时经常需要移动数据进闭包。同样的基本原理也适用于异步代码块,因此 move 关键字也能像闭包那样作用于异步代码块。

    +

    在示例 17-12 中,我们将发送消息的异步代码块从普通的 async 代码块修改为 async move 代码块。当运行 这个 版本的代码时,它会在发送和接收完最后一条消息后优雅地关闭。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::Duration;
    +
    +fn main() {
    +    trpl::run(async {
    +        let (tx, mut rx) = trpl::channel();
    +
    +        let tx_fut = async move {
    +            let vals = vec![
    +                String::from("hi"),
    +                String::from("from"),
    +                String::from("the"),
    +                String::from("future"),
    +            ];
    +
    +            for val in vals {
    +                tx.send(val).unwrap();
    +                trpl::sleep(Duration::from_millis(500)).await;
    +            }
    +        };
    +
    +        let rx_fut = async {
    +            while let Some(value) = rx.recv().await {
    +                eprintln!("received '{value}'");
    +            }
    +        };
    +
    +        trpl::join(tx_fut, rx_fut).await;
    +    });
    +}
    +
    示例 17-12:一个可以工作的在 future 之间接收和发送消息的示例,其在结束后会正确地关闭
    +
    +

    这个异步信道也是一个多生产者信道,所以如果希望从多个 future 发送消息可以调用 tx 上的 clone 方法。在示例 17-13 中,我们克隆了 tx,在第一个异步代码块外面创建 tx1。我们像第一个 tx 一样将 tx1 移动进代码块。接下来,将原始的 tx 移动进一个 新的 异步代码块,其中会用一个稍微更长的延迟发送更多的消息。我们碰巧将新代码块放在接收消息的异步代码块之后,不过也可以放在之前。关键在于 future 被 await 的顺序,而不是它们创建的顺序。

    +

    两个发送消息的异步代码块需要是 async move 代码块,如此 txtx1 都会在代码块结束后被丢弃。否则我们就会陷入到开始时同样的无限循环。最后,我们从 trpl::join 切换到 trpl::join3 来处理额外的 future。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::Duration;
    +
    +fn main() {
    +    trpl::run(async {
    +        let (tx, mut rx) = trpl::channel();
    +
    +        let tx1 = tx.clone();
    +        let tx1_fut = async move {
    +            let vals = vec![
    +                String::from("hi"),
    +                String::from("from"),
    +                String::from("the"),
    +                String::from("future"),
    +            ];
    +
    +            for val in vals {
    +                tx1.send(val).unwrap();
    +                trpl::sleep(Duration::from_millis(500)).await;
    +            }
    +        };
    +
    +        let rx_fut = async {
    +            while let Some(value) = rx.recv().await {
    +                println!("received '{value}'");
    +            }
    +        };
    +
    +        let tx_fut = async move {
    +            let vals = vec![
    +                String::from("more"),
    +                String::from("messages"),
    +                String::from("for"),
    +                String::from("you"),
    +            ];
    +
    +            for val in vals {
    +                tx.send(val).unwrap();
    +                trpl::sleep(Duration::from_millis(1500)).await;
    +            }
    +        };
    +
    +        trpl::join3(tx1_fut, tx_fut, rx_fut).await;
    +    });
    +}
    +
    示例 17-13:通过多个异步代码块使用多个发送者
    +
    +

    现在我们会看到所有来在两个发送 future 的消息。因为发送 future 采用了稍微不同的发送延迟,消息也会以这些不同的延迟接收。

    + +
    received 'hi'
    +received 'more'
    +received 'from'
    +received 'the'
    +received 'messages'
    +received 'future'
    +received 'for'
    +received 'you'
    +
    +

    这是一个良好的开始,不过它将我们限制到少数几个 future:join 两个,或者 join3 三个。让我们看下如何处理更多的 future。

    +

    使用任意数量的 futures

    +
    +

    ch17-03-more-futures.md +
    +commit 9e85fcc9938e8f8c935d0ad8b4db7f45caaa2ca4

    +
    +

    当我们在上一部分从使用两个 future 到三个 future 的时候,我们也必须从使用 join 切换到 join3。每次我们想要改变 join 的 future 数量时都不得不调用一个不同的函数是很烦人的。令人高兴的是,我们有一个宏版本的 join 可以传递任意数量的参数。它还会自行处理 await 这些 future。因此,我们可以重写示例 17-13 中的代码来使用 join! 而不是 join3,如示例 17-14 所示:

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::Duration;
    +
    +fn main() {
    +    trpl::run(async {
    +        let (tx, mut rx) = trpl::channel();
    +
    +        let tx1 = tx.clone();
    +        let tx1_fut = async move {
    +            let vals = vec![
    +                String::from("hi"),
    +                String::from("from"),
    +                String::from("the"),
    +                String::from("future"),
    +            ];
    +
    +            for val in vals {
    +                tx1.send(val).unwrap();
    +                trpl::sleep(Duration::from_secs(1)).await;
    +            }
    +        };
    +
    +        let rx_fut = async {
    +            while let Some(value) = rx.recv().await {
    +                println!("received '{value}'");
    +            }
    +        };
    +
    +        let tx_fut = async move {
    +            let vals = vec![
    +                String::from("more"),
    +                String::from("messages"),
    +                String::from("for"),
    +                String::from("you"),
    +            ];
    +
    +            for val in vals {
    +                tx.send(val).unwrap();
    +                trpl::sleep(Duration::from_secs(1)).await;
    +            }
    +        };
    +
    +        trpl::join!(tx1_fut, tx_fut, rx_fut);
    +    });
    +}
    +
    示例 17-14:使用 `join!` 来等待多个 future
    +
    +

    相比于需要在 joinjoin3join4 等等之间切换来说这绝对是一个进步!然而,即便是这个宏形式也只能用于我们提前知道 future 的数量的情况。不过,在现实世界的 Rust 中,将 futures 放进一个集合并接着等待集合中的一些或者全部 future 完成是一个常见的模式。

    +

    为了检查一些集合中的所有 future,我们需要遍历并 join 全部 的 future。trpl::join_all 函数接受任何实现了 Iterator trait 的类型,我们在之前的第十三章中学习过它们,所以这正是我们需要的。让我们将 futures 放进一个向量,并将 join! 替换为 join_all

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::Duration;
    +
    +fn main() {
    +    trpl::run(async {
    +        let (tx, mut rx) = trpl::channel();
    +
    +        let tx1 = tx.clone();
    +        let tx1_fut = async move {
    +            let vals = vec![
    +                String::from("hi"),
    +                String::from("from"),
    +                String::from("the"),
    +                String::from("future"),
    +            ];
    +
    +            for val in vals {
    +                tx1.send(val).unwrap();
    +                trpl::sleep(Duration::from_secs(1)).await;
    +            }
    +        };
    +
    +        let rx_fut = async {
    +            while let Some(value) = rx.recv().await {
    +                println!("received '{value}'");
    +            }
    +        };
    +
    +        let tx_fut = async move {
    +            let vals = vec![
    +                String::from("more"),
    +                String::from("messages"),
    +                String::from("for"),
    +                String::from("you"),
    +            ];
    +
    +            for val in vals {
    +                tx.send(val).unwrap();
    +                trpl::sleep(Duration::from_secs(1)).await;
    +            }
    +        };
    +
    +        let futures = vec![tx1_fut, rx_fut, tx_fut];
    +
    +        trpl::join_all(futures).await;
    +    });
    +}
    +
    示例 17-15:将匿名 futures 储存在一个向量中并调用 `join_all`
    +
    +

    不幸的是这还不能编译。相反我们会得到这个错误:

    + +
    error[E0308]: mismatched types
    +  --> src/main.rs:43:37
    +   |
    +8  |           let tx1_fut = async move {
    +   |  _______________________-
    +9  | |             let vals = vec![
    +10 | |                 String::from("hi"),
    +11 | |                 String::from("from"),
    +...  |
    +19 | |             }
    +20 | |         };
    +   | |_________- the expected `async` block
    +21 |
    +22 |           let rx_fut = async {
    +   |  ______________________-
    +23 | |             while let Some(value) = rx.recv().await {
    +24 | |                 println!("received '{value}'");
    +25 | |             }
    +26 | |         };
    +   | |_________- the found `async` block
    +...
    +43 |           let futures = vec![tx1_fut, rx_fut, tx_fut];
    +   |                                       ^^^^^^ expected `async` block, found a different `async` block
    +   |
    +   = note: expected `async` block `{async block@src/main.rs:8:23: 20:10}`
    +              found `async` block `{async block@src/main.rs:22:22: 26:10}`
    +   = note: no two async blocks, even if identical, have the same type
    +   = help: consider pinning your async block and and casting it to a trait object
    +
    +

    这可能有点令人惊讶。毕竟没有一个 future 返回了任何值,所以每个代码块都会产生一个 Future<Output = ()>。然而,Future 是一个 trait,而不是一个具体类型。其具体类型是编译器为各个异步代码块生成的(不同的)数据结构。你不能将两个不同的手写的 struct 放进同一个 Vec,同样的原理也适用于编译器生成的不同 struct。

    +

    为了使代码能够正常工作,我们需要使用 trait objects,正如我们在第十二章的 “从 run 函数中返回错误” 中做的那样。(第十八章会详细介绍 trait objects。)使用 trait objects 允许我们将这些类型所产生的不同的匿名 future 视为相同的类型,因为它们都实现了 Future trait。

    +
    +

    注意:在第八章中,我们讨论过另一种将多种类型包含进一个 Vec 的方式:使用一个枚举来代表每个可以出现在向量中的不同类型。不过这里我们不能这么做。一方面,没有方法来命名这些不同的类型,因为它们是匿名的。另一方面,我们最开始采用向量和 join_all 的原因是为了处理一个直到运行时之前都不知道是什么的 future 的动态集合。

    +
    +

    我们以将 vec! 中的每个 future 用 Box::new 封装来作为开始,如示例 17-16 所示。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::Duration;
    +
    +fn main() {
    +    trpl::run(async {
    +        let (tx, mut rx) = trpl::channel();
    +
    +        let tx1 = tx.clone();
    +        let tx1_fut = async move {
    +            let vals = vec![
    +                String::from("hi"),
    +                String::from("from"),
    +                String::from("the"),
    +                String::from("future"),
    +            ];
    +
    +            for val in vals {
    +                tx1.send(val).unwrap();
    +                trpl::sleep(Duration::from_secs(1)).await;
    +            }
    +        };
    +
    +        let rx_fut = async {
    +            while let Some(value) = rx.recv().await {
    +                println!("received '{value}'");
    +            }
    +        };
    +
    +        let tx_fut = async move {
    +            let vals = vec![
    +                String::from("more"),
    +                String::from("messages"),
    +                String::from("for"),
    +                String::from("you"),
    +            ];
    +
    +            for val in vals {
    +                tx.send(val).unwrap();
    +                trpl::sleep(Duration::from_secs(1)).await;
    +            }
    +        };
    +
    +        let futures =
    +            vec![Box::new(tx1_fut), Box::new(rx_fut), Box::new(tx_fut)];
    +
    +        trpl::join_all(futures).await;
    +    });
    +}
    +
    示例 17-16:尝试用 `Box::new` 来对齐 `Vec` 中 future 的类型
    +
    +

    不幸的是,代码仍然不能编译。事实上,我们遇到了与之前相同的基本错误,不过这次我们会在第二个和第三个 Box::new 调用处各得到一个错误,同时还会得到一个提及 Unpin trait 的新错误。我们一会再回到 Unpin 错误上。首先,让我们通过显式标注 futures 的类型来修复 Box::new 调用的类型错误:

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::{future::Future, time::Duration};
    +
    +fn main() {
    +    trpl::run(async {
    +        let (tx, mut rx) = trpl::channel();
    +
    +        let tx1 = tx.clone();
    +        let tx1_fut = async move {
    +            let vals = vec![
    +                String::from("hi"),
    +                String::from("from"),
    +                String::from("the"),
    +                String::from("future"),
    +            ];
    +
    +            for val in vals {
    +                tx1.send(val).unwrap();
    +                trpl::sleep(Duration::from_secs(1)).await;
    +            }
    +        };
    +
    +        let rx_fut = async {
    +            while let Some(value) = rx.recv().await {
    +                println!("received '{value}'");
    +            }
    +        };
    +
    +        let tx_fut = async move {
    +            let vals = vec![
    +                String::from("more"),
    +                String::from("messages"),
    +                String::from("for"),
    +                String::from("you"),
    +            ];
    +
    +            for val in vals {
    +                tx.send(val).unwrap();
    +                trpl::sleep(Duration::from_secs(1)).await;
    +            }
    +        };
    +
    +        let futures: Vec<Box<dyn Future<Output = ()>>> =
    +            vec![Box::new(tx1_fut), Box::new(rx_fut), Box::new(tx_fut)];
    +
    +        trpl::join_all(futures).await;
    +    });
    +}
    +
    示例 17-17:通过使用一个显式类型声明来修复余下的类型不匹配错误
    +
    +

    这里必须编写的类型有一点复杂,让我们逐步过一遍:

    +
      +
    • 最内层的类型是 future 本身。我们显式地指出 future 的输出类型是单元类型 (),其编写为 Future<Output = ()>
    • +
    • 接着使用 dyn 将 trait 标记为动态的。
    • +
    • 整个 trait 引用被封装进一个 Box
    • +
    • 最后,我们显式表明 futures 是一个包含这些项的 Vec
    • +
    +

    这已经有了很大的区别。现在当我们运行编译器时,就只会有提到 Unpin 的错误了。虽然这里有三个错误,但请注意它们每个的内容都非常相似。

    + +
    error[E0277]: `{async block@src/main.rs:8:23: 20:10}` cannot be unpinned
    +   --> src/main.rs:46:24
    +    |
    +46  |         trpl::join_all(futures).await;
    +    |         -------------- ^^^^^^^ the trait `Unpin` is not implemented for `{async block@src/main.rs:8:23: 20:10}`, which is required by `Box<{async block@src/main.rs:8:23: 20:10}>: std::future::Future`
    +    |         |
    +    |         required by a bound introduced by this call
    +    |
    +    = note: consider using the `pin!` macro
    +            consider using `Box::pin` if you need to access the pinned value outside of the current scope
    +    = note: required for `Box<{async block@src/main.rs:8:23: 20:10}>` to implement `std::future::Future`
    +note: required by a bound in `join_all`
    +   --> /Users/chris/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.30/src/future/join_all.rs:105:14
    +    |
    +102 | pub fn join_all<I>(iter: I) -> JoinAll<I::Item>
    +    |        -------- required by a bound in this function
    +...
    +105 |     I::Item: Future,
    +    |              ^^^^^^ required by this bound in `join_all`
    +
    +error[E0277]: `{async block@src/main.rs:8:23: 20:10}` cannot be unpinned
    +  --> src/main.rs:46:9
    +   |
    +46 |         trpl::join_all(futures).await;
    +   |         ^^^^^^^^^^^^^^^^^^^^^^^ the trait `Unpin` is not implemented for `{async block@src/main.rs:8:23: 20:10}`, which is required by `Box<{async block@src/main.rs:8:23: 20:10}>: std::future::Future`
    +   |
    +   = note: consider using the `pin!` macro
    +           consider using `Box::pin` if you need to access the pinned value outside of the current scope
    +   = note: required for `Box<{async block@src/main.rs:8:23: 20:10}>` to implement `std::future::Future`
    +note: required by a bound in `JoinAll`
    +  --> /Users/chris/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.30/src/future/join_all.rs:29:8
    +   |
    +27 | pub struct JoinAll<F>
    +   |            ------- required by a bound in this struct
    +28 | where
    +29 |     F: Future,
    +   |        ^^^^^^ required by this bound in `JoinAll`
    +
    +error[E0277]: `{async block@src/main.rs:8:23: 20:10}` cannot be unpinned
    +  --> src/main.rs:46:33
    +   |
    +46 |         trpl::join_all(futures).await;
    +   |                                 ^^^^^ the trait `Unpin` is not implemented for `{async block@src/main.rs:8:23: 20:10}`, which is required by `Box<{async block@src/main.rs:8:23: 20:10}>: std::future::Future`
    +   |
    +   = note: consider using the `pin!` macro
    +           consider using `Box::pin` if you need to access the pinned value outside of the current scope
    +   = note: required for `Box<{async block@src/main.rs:8:23: 20:10}>` to implement `std::future::Future`
    +note: required by a bound in `JoinAll`
    +  --> /Users/chris/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.30/src/future/join_all.rs:29:8
    +   |
    +27 | pub struct JoinAll<F>
    +   |            ------- required by a bound in this struct
    +28 | where
    +29 |     F: Future,
    +   |        ^^^^^^ required by this bound in `JoinAll`
    +
    +Some errors have detailed explanations: E0277, E0308.
    +For more information about an error, try `rustc --explain E0277`.
    +
    +

    这里有 很多 内容需要分析,所以让我们拆开来看。信息的第一部分告诉我们第一个异步代码块(src/main.rs:8:23: 20:10)没有实现 Unpin trait,并建议使用 pin!Box::pin 来修复,在本章的稍后部分我们会深入 PinUnpin 的一些更多细节。不过现在我们可以仅仅遵循编译器的建议来解困!在示例 17-18 中,我们以更新 futures 的类型声明作为开始,用 Pin 来封装每个 Box。其次,我们使用 Box::pin 来 pin 住 futures 自身。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::{
    +    future::Future,
    +    pin::{pin, Pin},
    +    time::Duration,
    +};
    +
    +fn main() {
    +    trpl::run(async {
    +        let (tx, mut rx) = trpl::channel();
    +
    +        let tx1 = tx.clone();
    +        let tx1_fut = pin!(async move {
    +            let vals = vec![
    +                String::from("hi"),
    +                String::from("from"),
    +                String::from("the"),
    +                String::from("future"),
    +            ];
    +
    +            for val in vals {
    +                tx1.send(val).unwrap();
    +                trpl::sleep(Duration::from_secs(1)).await;
    +            }
    +        });
    +
    +        let rx_fut = pin!(async {
    +            while let Some(value) = rx.recv().await {
    +                println!("received '{value}'");
    +            }
    +        });
    +
    +        let tx_fut = pin!(async move {
    +            let vals = vec![
    +                String::from("more"),
    +                String::from("messages"),
    +                String::from("for"),
    +                String::from("you"),
    +            ];
    +
    +            for val in vals {
    +                tx.send(val).unwrap();
    +                trpl::sleep(Duration::from_secs(1)).await;
    +            }
    +        });
    +
    +        let futures: Vec<Pin<Box<dyn Future<Output = ()>>>> =
    +            vec![Box::pin(tx1_fut), Box::pin(rx_fut), Box::pin(tx_fut)];
    +
    +        trpl::join_all(futures).await;
    +    });
    +}
    +
    示例 17-18:使用 `Pin` 和 `Box::pin` 来约束 `Vec` 的类型
    +
    +

    如果编译并运行代码,我们终于会得到我们期望的输出:

    + +
    received 'hi'
    +received 'more'
    +received 'from'
    +received 'messages'
    +received 'the'
    +received 'for'
    +received 'future'
    +received 'you'
    +
    +

    (长舒一口气!)

    +

    这里还有一些我们可以进一步探索的内容。首先,因为通过 Box 来将这些 futures 放到堆上,使用 Pin<Box<T>> 会带来少量的额外开销,而我们这么做仅仅是为了使类型对齐。毕竟这里实际上并不 需要 堆分配:这些 futures 对于这个特定的函数来说是本地的。如上所述,Pin 本身是一个封装类型,因此我们可以在 Vec 中拥有单一类型的好处(也就是使用 Box 的初始原因)而不用堆分配。我们可以通过 std::pin::pin 宏来直接对每个 future 使用 Pin

    +

    然而,我们仍然必须现实地知道被 pin 的引用的类型:否则 Rust 仍然不知道如何将它们解释为动态 trait objects,这是将它们放进 Vec 所需的。因此我们在定义每个 future 的时候使用 pin!,并将 futures 定义为一个包含被 pin 的动态 Future 类型的可变引用的 Vec,如示例 17-19 所示。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::{
    +    future::Future,
    +    pin::{pin, Pin},
    +    time::Duration,
    +};
    +
    +fn main() {
    +    trpl::run(async {
    +        let (tx, mut rx) = trpl::channel();
    +
    +        let tx1 = tx.clone();
    +        let tx1_fut = pin!(async move {
    +            // --snip--
    +            let vals = vec![
    +                String::from("hi"),
    +                String::from("from"),
    +                String::from("the"),
    +                String::from("future"),
    +            ];
    +
    +            for val in vals {
    +                tx1.send(val).unwrap();
    +                trpl::sleep(Duration::from_secs(1)).await;
    +            }
    +        });
    +
    +        let rx_fut = pin!(async {
    +            // --snip--
    +            while let Some(value) = rx.recv().await {
    +                println!("received '{value}'");
    +            }
    +        });
    +
    +        let tx_fut = pin!(async move {
    +            // --snip--
    +            let vals = vec![
    +                String::from("more"),
    +                String::from("messages"),
    +                String::from("for"),
    +                String::from("you"),
    +            ];
    +
    +            for val in vals {
    +                tx.send(val).unwrap();
    +                trpl::sleep(Duration::from_secs(1)).await;
    +            }
    +        });
    +
    +        let futures: Vec<Pin<&mut dyn Future<Output = ()>>> =
    +            vec![tx1_fut, rx_fut, tx_fut];
    +
    +        trpl::join_all(futures).await;
    +    });
    +}
    +
    示例 17-19:通过 `pin!` 宏来直接使用 `Pin` 以避免不必要的堆分配
    +
    +

    目前为止我们一直忽略了可能有不同 Output 类型的事实。例如,在示例 17-20 中,匿名 future a 实现了 Future<Output = u32>,匿名 future b 实现了 Future<Output = &str>,而匿名 future c 实现了 Future<Output = bool>

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +fn main() {
    +    trpl::run(async {
    +        let a = async { 1u32 };
    +        let b = async { "Hello!" };
    +        let c = async { true };
    +
    +        let (a_result, b_result, c_result) = trpl::join!(a, b, c);
    +        println!("{a_result}, {b_result}, {c_result}");
    +    });
    +}
    +
    示例 17-20:三个不同类型的 futures
    +
    +

    我们可以使用 trpl::join! 来 await 它们,因为它允许你传递多个 future 类型并产生一个这些类型的元组。我们 不能 使用 trpl::join_all,因为它要求传递的 future 都拥有相同的类型。请记住,那个错误正是我们开启 Pin 探索之旅的原因!

    +

    这是一个基础的权衡取舍:要么我们可以使用 join_all 处理动态数量的 future,只要它们都有相同的类型;要么我们可以使用 join 函数或者 join! 宏来处理固定数量的 future,哪怕它们有着不同的类型。不过这与 Rust 处理任何其它类型是一样的。Future 并不特殊,即便我们采用了一些友好的语法来处理它们,而这其实是好事。

    +

    future 竞争

    +

    当我们使用 join 系列函数和宏来 “join” future 时,我们要求它们 全部 结束才能继续。虽然有时我们只需要 部分 future 结束就能继续,这有点像一个 future 与另一个 future 竞争。

    +

    在示例 17-21 中,我们再次使用 trpl::race 来运行 slowfast 两个 future 并相互竞争。它们每一个都会在开始运行时打印一条消息,通过调用并 await sleep 暂停一段时间,接着在其结束时打印另一条消息。然后我们将它们传递给 trpl::race 并等待其中一个结束。(结果不会令人意外:fast 会赢!)不同于我们在第一个异步程序中使用 race 的时候,这里忽略了其返回的 Either 实例,因为所有有趣的行为都发生在异步代码块中。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::Duration;
    +
    +fn main() {
    +    trpl::run(async {
    +        let slow = async {
    +            println!("'slow' started.");
    +            trpl::sleep(Duration::from_millis(100)).await;
    +            println!("'slow' finished.");
    +        };
    +
    +        let fast = async {
    +            println!("'fast' started.");
    +            trpl::sleep(Duration::from_millis(50)).await;
    +            println!("'fast' finished.");
    +        };
    +
    +        trpl::race(slow, fast).await;
    +    });
    +}
    +
    示例 17-21:使用 `race` 来获取哪个 future 最先结束的结果
    +
    +

    请注意如果你反转 race 参数的顺序,“started” 消息的顺序会改变,即使 fast future 总是第一个结束。这是因为这个特定的 race 函数实现并不是公平的。它总是以传递的参数的顺序来运行传递的 futures。其它的实现 公平的,并且会随机选择首先轮询的 future。不过无论我们使用的 race 实现是否公平,其中 一个 future 会在另一个任务开始之前一直运行到异步代码块中第一个 await 为止。

    +

    回忆一下第一个异步程序中提到在每一个 await point,如果被 await 的 future 还没有就绪,Rust 会给运行时一个机会来暂停该任务并切换到另一个任务。反过来也是正确的:Rust 只会 在一个 await point 暂停异步代码块并将控制权交还给运行时。await points 之间的一切都是同步。

    +

    这意味着如果你在异步代码块中做了一堆工作而没有一个 await point,则那个 future 会阻塞其它任何 future 继续进行。有时你可能会听说这称为一个 future starving 其它 future。在一些情况中,这可能不是什么大问题。不过,如果你在进行某种昂贵的设置或者长时间运行的任务,亦或有一个 future 会无限持续运行某些特定任务的话,你会需要思考在何时何地将控制权交还运行时。

    +

    同样地,如果你有长时间运行的阻塞操作,异步可能是一个提供了将程序的不同部分相互关联起来的实用工具。

    +

    不过在这种情况下 如何 将控制权交还运行时呢?

    +

    Yielding

    +

    让我们模拟一个长时间运行的操作。示例 17-22 引入了一个 slow 函数。它使用 std::thread::sleep 而不是 trpl::sleep 因此 slow 调用会阻塞当前线程若干毫秒。我们可以用 slow 来代表现实世界中的长时间运行并且会阻塞的操作。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::{thread, time::Duration};
    +
    +fn main() {
    +    trpl::run(async {
    +        // We will call `slow` here later
    +    });
    +}
    +
    +fn slow(name: &str, ms: u64) {
    +    thread::sleep(Duration::from_millis(ms));
    +    println!("'{name}' ran for {ms}ms");
    +}
    +
    示例 17-22:使用 `thread::sleep` 来模拟缓慢的操作
    +
    +

    在示例 17-22 中,我们使用 slow 在几个 future 中模拟这类 CPU 密集型工作。首先,每个 future 只会在进行了一系列缓慢操作 之后 才将控制权交还给运行时。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::{thread, time::Duration};
    +
    +fn main() {
    +    trpl::run(async {
    +        let a = async {
    +            println!("'a' started.");
    +            slow("a", 30);
    +            slow("a", 10);
    +            slow("a", 20);
    +            trpl::sleep(Duration::from_millis(50)).await;
    +            println!("'a' finished.");
    +        };
    +
    +        let b = async {
    +            println!("'b' started.");
    +            slow("b", 75);
    +            slow("b", 10);
    +            slow("b", 15);
    +            slow("b", 350);
    +            trpl::sleep(Duration::from_millis(50)).await;
    +            println!("'b' finished.");
    +        };
    +
    +        trpl::race(a, b).await;
    +    });
    +}
    +
    +fn slow(name: &str, ms: u64) {
    +    thread::sleep(Duration::from_millis(ms));
    +    println!("'{name}' ran for {ms}ms");
    +}
    +
    示例 17-23:使用 `thread::sleep` 来模拟缓慢的操作
    +
    +

    如果运行代码,你会看到这些输出:

    + +
    'a' started.
    +'a' ran for 30ms
    +'a' ran for 10ms
    +'a' ran for 20ms
    +'b' started.
    +'b' ran for 75ms
    +'b' ran for 10ms
    +'b' ran for 15ms
    +'b' ran for 350ms
    +'a' finished.
    +
    +

    与上一个示例一样,race 仍然在 a 完成后就立刻结束了。两个 future 之间没有交替运行。a future 一直进行其工作直到 trpl::sleep 调用被 await,然后 b future 一直进行其工作直到它自己的 trpl::sleep 调用被 await,再然后 a future 才完成。为了使两个 future 在各自缓慢任务之间都能有所进展,我们需要 await point 才能将控制权交还给运行时。这意味着我们需要一些可以 await 的东西!

    +

    我们已经在示例 17-23 中见过这类交接发生:如果去掉 a future 结尾的 trpl::sleep,那么当它完成时 b future 完全 不会运行。也许我们可以使用 sleep 函数来作为开始呢?

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::{thread, time::Duration};
    +
    +fn main() {
    +    trpl::run(async {
    +        let one_ms = Duration::from_millis(1);
    +
    +        let a = async {
    +            println!("'a' started.");
    +            slow("a", 30);
    +            trpl::sleep(one_ms).await;
    +            slow("a", 10);
    +            trpl::sleep(one_ms).await;
    +            slow("a", 20);
    +            trpl::sleep(one_ms).await;
    +            println!("'a' finished.");
    +        };
    +
    +        let b = async {
    +            println!("'b' started.");
    +            slow("b", 75);
    +            trpl::sleep(one_ms).await;
    +            slow("b", 10);
    +            trpl::sleep(one_ms).await;
    +            slow("b", 15);
    +            trpl::sleep(one_ms).await;
    +            slow("b", 35);
    +            trpl::sleep(one_ms).await;
    +            println!("'b' finished.");
    +        };
    +
    +        trpl::race(a, b).await;
    +    });
    +}
    +
    +fn slow(name: &str, ms: u64) {
    +    thread::sleep(Duration::from_millis(ms));
    +    println!("'{name}' ran for {ms}ms");
    +}
    +
    示例 17-24:使用 `sleep` 让操作切换以继续进行
    +
    +

    在示例 17-24 中,我们在 slow 调用之间增加了 trpl::sleep 调用和 await points。现在两个 future 的工作会相互交替运行:

    + +
    'a' started.
    +'a' ran for 30ms
    +'b' started.
    +'b' ran for 75ms
    +'a' ran for 10ms
    +'b' ran for 10ms
    +'a' ran for 20ms
    +'b' ran for 15ms
    +'a' finished.
    +
    +

    a future 仍然会在交还控制权给 b 之前运行一会儿,因为它在调用 trpl::sleep 之前就调用了 slow,不过在这之后两个 future 会在触发 await point 时来回切换。在这个例子中,我们在 slow 之后这么做,不过我们可以在任何合适的地方拆分任务。

    +

    不过我们并不是真的想在这里 休眠:我们希望尽可能快地取得进展。我们仅仅是需要交还控制权给运行时。我们可以使用 yield_now 函数来直接这么做。在示例 17-25 中,我们将所有的 sleep 调用替换为 yield_now

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::{thread, time::Duration};
    +
    +fn main() {
    +    trpl::run(async {
    +        let a = async {
    +            println!("'a' started.");
    +            slow("a", 30);
    +            trpl::yield_now().await;
    +            slow("a", 10);
    +            trpl::yield_now().await;
    +            slow("a", 20);
    +            trpl::yield_now().await;
    +            println!("'a' finished.");
    +        };
    +
    +        let b = async {
    +            println!("'b' started.");
    +            slow("b", 75);
    +            trpl::yield_now().await;
    +            slow("b", 10);
    +            trpl::yield_now().await;
    +            slow("b", 15);
    +            trpl::yield_now().await;
    +            slow("b", 35);
    +            trpl::yield_now().await;
    +            println!("'b' finished.");
    +        };
    +
    +        trpl::race(a, b).await;
    +    });
    +}
    +
    +fn slow(name: &str, ms: u64) {
    +    thread::sleep(Duration::from_millis(ms));
    +    println!("'{name}' ran for {ms}ms");
    +}
    +
    示例 17-25:使用 `yield_now` 让操作切换以继续进行
    +
    +

    这不仅更为清楚地表明了实际的意图而且更显著地快于使用 sleep,因为像这样使用 sleep 的定时器通常受限于其控制粒度。例如我们使用的 sleep 版本,会至少休眠一毫秒,哪怕我们传递一纳秒的 Duration。而且,现代计算机非常 快速:它们可以在一毫秒内完成很多工作!

    +

    你可以自行设置一些基准测试来验证这一点,例如示例 17-26 中的这个。(这并不是一个特别严谨的进行性能测试的方法,不过用来展示这里的区别是足够的。)这里,我们省略了所有的状态打印,传递一纳秒的 Durationtrpl::sleep,并让每一个 future 各自运行,不在 future 之间切换。接着我们运行 1000 次迭代并对比下使用 trpl::sleep 的 future 和使用 trpl::yield_now 的 future 的运行时间。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::{Duration, Instant};
    +
    +fn main() {
    +    trpl::run(async {
    +        let one_ns = Duration::from_nanos(1);
    +        let start = Instant::now();
    +        async {
    +            for _ in 1..1000 {
    +                trpl::sleep(one_ns).await;
    +            }
    +        }
    +        .await;
    +        let time = Instant::now() - start;
    +        println!(
    +            "'sleep' version finished after {} seconds.",
    +            time.as_secs_f32()
    +        );
    +
    +        let start = Instant::now();
    +        async {
    +            for _ in 1..1000 {
    +                trpl::yield_now().await;
    +            }
    +        }
    +        .await;
    +        let time = Instant::now() - start;
    +        println!(
    +            "'yield' version finished after {} seconds.",
    +            time.as_secs_f32()
    +        );
    +    });
    +}
    +
    示例 17-26:对比 `sleep` 和 `yield_now` 的性能
    +
    +

    使用 yield_now 的版本要 快得多

    +

    这意味着取决于程序所作的其它工作,异步操作甚至在计算密集型任务中也有用处,因为它提供了一个结构化程序中不同部分之间关系的实用工具。这是一种形式的 协同多任务处理cooperative multitasking),每个 futrue 有权通过 await point 来决定何时交还控制权。因此每个 future 也有责任避免长时间阻塞。在一些基于 Rust 的嵌入式系统中,这是 唯一 的多任务处理类型!

    +

    当然,在真实代码中,你通常不会在每一行上都交替使用 await 点来调用函数。虽然这样控制 yielding 相对来说更为廉价,但也不是毫无代价的!在很多情况下,尝试将计算密集型任务拆分可能会显著降低其速度,所以有时为了 整体 性能简单地让一个操作阻塞是更好的选择。你应该总是通过测量来观察代码真正的性能瓶颈是什么。不过其底层的考量在于重要的是要牢记你是否 确实 观察到了很多期望并发进行的工作在串行地进行。

    +

    构建我们自己的异步抽象

    +

    我们也可以将 futures 组合起来形成一个新模式。例如,我们可以使用已有的异步代码块构建一个 timeout 函数。当我们完成时,其结果将是另一个可以用来构建进一步异步抽象的代码块。

    +

    示例 17-27 展示了我们预期 timeout 如何处理一个缓慢运行的 future。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::time::Duration;
    +
    +fn main() {
    +    trpl::run(async {
    +        let slow = async {
    +            trpl::sleep(Duration::from_millis(100)).await;
    +            "I finished!"
    +        };
    +
    +        match timeout(slow, Duration::from_millis(10)).await {
    +            Ok(message) => println!("Succeeded with '{message}'"),
    +            Err(duration) => {
    +                println!("Failed after {} seconds", duration.as_secs())
    +            }
    +        }
    +    });
    +}
    +
    示例 17-27:使用假想的 `timeout` 来运行一个缓慢运行的操作并设置一个时限
    +
    +

    让我们来实现它!首先,让我们考虑一下 timeout 的 API:

    +
      +
    • 它需要是一个 async 函数以便可以 await。
    • +
    • 它的第一个参数应该是需要运行的 future。我们可以使用泛型以便可以处理任意 future。
    • +
    • 它的第二个参数将是需要等待的最大时间。如果我们使用 Duration 的话,将会使得将其直接传递给 trpl::sleep 变得简单。
    • +
    • 它应该返回一个 Result。如果 future 成功完成,Result 将会是包含 future 所产生的值的 Ok。如果超时先发生,Result 将会是包含超时等待的持续时间的 Err
    • +
    +

    示例 17-28 展示了这个抽象。

    + +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::{future::Future, time::Duration};
    +
    +fn main() {
    +    trpl::run(async {
    +        let slow = async {
    +            trpl::sleep(Duration::from_secs(5)).await;
    +            "Finally finished"
    +        };
    +
    +        match timeout(slow, Duration::from_millis(10)).await {
    +            Ok(message) => println!("Succeeded with '{message}'"),
    +            Err(duration) => {
    +                println!("Failed after {} seconds", duration.as_secs())
    +            }
    +        }
    +    });
    +}
    +
    +async fn timeout<F: Future>(
    +    future_to_try: F,
    +    max_time: Duration,
    +) -> Result<F::Output, Duration> {
    +    // Here is where our implementation will go!
    +}
    +
    示例 17-28:定义 `timeout` 的签名
    +
    +

    这满足了我们对类型的目标。现在让我们思考下所需的 行为:我们需要传递进来的 future 在持续时间内相互竞争。我们可以使用 trpl::sleep 和 duration 来创建一个定时器 future,并使用 trpl::race 来运行定时器 future 和调用者传递进来的 future。

    +

    我们还知道 race 是不公平的,并按照传递的顺序轮询参数。因此,我们首先传递 future_to_tryrace 以便哪怕 max_time 是一个非常短的持续时间它也能有机会完成。如果 future_to_try 首先完成,race 会返回 Leftfuture 的输出。如果 timer 首先完成,race 会返回 Right 和定时器的输出 ()

    +

    在示例 17-29 中,我们匹配 await trpl::race 的结果。如果 future_to_try 成功并得到一个 Left(output),我们返回 Ok(output)。相反如果休眠定时器超时了并得到一个 Right(()),则我们通过 _ 忽略 () 并返回 Err(max_time)

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use std::{future::Future, time::Duration};
    +
    +use trpl::Either;
    +
    +// --snip--
    +
    +fn main() {
    +    trpl::run(async {
    +        let slow = async {
    +            trpl::sleep(Duration::from_secs(5)).await;
    +            "Finally finished"
    +        };
    +
    +        match timeout(slow, Duration::from_secs(2)).await {
    +            Ok(message) => println!("Succeeded with '{message}'"),
    +            Err(duration) => {
    +                println!("Failed after {} seconds", duration.as_secs())
    +            }
    +        }
    +    });
    +}
    +
    +async fn timeout<F: Future>(
    +    future_to_try: F,
    +    max_time: Duration,
    +) -> Result<F::Output, Duration> {
    +    match trpl::race(future_to_try, trpl::sleep(max_time)).await {
    +        Either::Left(output) => Ok(output),
    +        Either::Right(_) => Err(max_time),
    +    }
    +}
    +
    示例 17-29:使用 `race` 和 `sleep` 来定义 `timeout`
    +
    +

    于是我们有了一个由另外两个帮助函数构成的可以工作的 timeout。如果我们运行代码,它会在超时之后打印失败模式:

    +
    Failed after 2 seconds
    +
    +

    由于 future 可以和其他 future 组合,你可以使用更小的异步代码块来构建非常强力的工具。例如,可以使用相同的方式来组合超时和重试,并转而将其用于类似网络调用的工作,这正是本章开头的一个示例!

    +

    在实践中,你会直接处理 asyncawait,其次才是类似 joinjoin_allrace 等函数和宏,在使用这些 API 时你只会偶尔遇到 pin

    +

    现在我们见过了一系列同时处理多个 future 的方法了。接下来,我们来看看如何通过(streams 处理一个时间序列的多个 future。不过,在此之前,这里有几个你可能想要先考虑的问题:

    +
      +
    • 我们在 Vec 上使用了 join_all 来等待一组中的所有 future 完成。相反该如何使用 Vec 来依次处理一个序列的 future 呢?这么做有哪些权衡取舍呢?
    • +
    • 仔细观察 futures crate 中的 futures::stream::FuturesUnordered 类型。使用它与使用 Vec 又有什么区别呢?(不用担心它来自与 crate 的 stream 部分的事实;它刚好能处理任何 future 的集合。)
    • +
    +

    流(Streams)

    +
    +

    ch17-04-streams.md +
    +commit f04d20fe8d1a49c3bffa10a3086c58e527ff0a90

    +
    +

    到本章的目前为止,我们大部分时间停留在独立的 future 上。一个重要的例外就是我们用过的异步信道。回忆一下在本章之前的 “消息传递” 中我们如何使用异步信道接收端的。异步 recv 方法随着时间的推移产生一个序列的项。这是一个通用的多的模式的实例,通常被称为 stream)。

    +

    一个序列的项是我们之前是见过的,回忆一下第十三章的 Iterator trait,不过迭代器和异步信道接收端有两个区别。第一个区别是时间的维度:迭代器是同步的,而信道接收端是异步的。第二个区别是 API。当直接处理 Iterator 时,我们会调用其同步 next 方法。对于这个特定的 trpl::Receiver 流,我们调用一个异步的 recv 方法。不过这两个 API 看起来非常相似。

    +

    这种相似性并非巧合。流类似于一种异步形式的迭代器。不过鉴于 trpl::Receiver 专门等待接收消息,多用途的流 API 则更为通用:它像 Iterator 一样提供了下一个项,不过是异步版本的。Rust 中迭代器和流的相似性意味着我们实际上可以从任何迭代器上创建流。就迭代器而言,可以通过调用其 next 方法并 await 输出来使用流,如示例 17-30 所示。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +fn main() {
    +    trpl::run(async {
    +        let values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    +        let iter = values.iter().map(|n| n * 2);
    +        let mut stream = trpl::stream_from_iter(iter);
    +
    +        while let Some(value) = stream.next().await {
    +            println!("The value was: {value}");
    +        }
    +    });
    +}
    +
    示例 17-30:从迭代器创建流并打印其值
    +
    +

    我们以一组数字作为开始,将其转换为一个迭代器并接着调用 map 将其所有值翻倍。然后使用 trpl::stream_from_iter 函数将迭代器转换为流。再然后在 while let 循环中到达时循环处理流中的项。

    +

    不幸的是当我们尝试运行代码时,代码无法编译。相反如果我们观察其输出,它会报告没有可用的 next 方法。

    + +
    error[E0599]: no method named `next` found for struct `Iter` in the current scope
    +  --> src/main.rs:10:40
    +   |
    +10 |         while let Some(value) = stream.next().await {
    +   |                                        ^^^^
    +   |
    +   = note: the full type name has been written to 'file:///projects/async_await/target/debug/deps/async_await-9de943556a6001b8.long-type-1281356139287206597.txt'
    +   = note: consider using `--verbose` to print the full type name to the console
    +   = help: items from traits can only be used if the trait is in scope
    +help: the following traits which provide `next` are implemented but not in scope; perhaps you want to import one of them
    +   |
    +1  + use crate::trpl::StreamExt;
    +   |
    +1  + use futures_util::stream::stream::StreamExt;
    +   |
    +1  + use std::iter::Iterator;
    +   |
    +1  + use std::str::pattern::Searcher;
    +   |
    +help: there is a method `try_next` with a similar name
    +   |
    +10 |         while let Some(value) = stream.try_next().await {
    +   |                                        ~~~~~~~~
    +
    +

    正如输出中所建议的,编译器错误的原因是我们需要在作用域中有正确的 trait 以便能够使用 next 方法。鉴于目前为止的讨论,你可能会合理地推测是 Stream,不过这里需要的 trait 实际上是 StreamExt。这里的 Ext 是 “extension”:在 Rust 社区中这是用另一个 trait 扩展 trait 的常见模式。

    +

    为什么我们需要 StreamExt 而不是 Stream,而 Stream trait 本身又是做什么的呢?简单来说,答案是贯穿整个 Rust 生态系统,Stream trait 定义了一个底层接口用于有效地组合 IteratorFuture trait。StreamExt trait 在 Stream 之上提供了一组高层 API,这包括 next 和其它类似于 Iterator trait 提供的工具方法。在本章的最后我们会回到 StreamStreamExt 并介绍更多细节。现在这已经足够我们继续了。

    +

    对编译器错误的修复是增加一个 trpl::StreamExtuse 语句,如示例 17-31 所示。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use trpl::StreamExt;
    +
    +fn main() {
    +    trpl::run(async {
    +        let values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    +        let iter = values.iter().map(|n| n * 2);
    +        let mut stream = trpl::stream_from_iter(iter);
    +
    +        while let Some(value) = stream.next().await {
    +            println!("The value was: {value}");
    +        }
    +    });
    +}
    +
    示例 17-31:成功使用迭代器作为流的基础
    +
    +

    将所有这些代码片段拼凑在一起,这段代码如我们预期般运行!更重要的是,现在我们在作用域中拥有 StreamExt,就可以使用所有其工具方法。例如在示例 17-32 中,我们使用 filter 方法来过滤掉所有不是 3 或者 5 的倍数的项。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use trpl::StreamExt;
    +
    +fn main() {
    +    trpl::run(async {
    +        let values = 1..101;
    +        let iter = values.map(|n| n * 2);
    +        let stream = trpl::stream_from_iter(iter);
    +
    +        let mut filtered =
    +            stream.filter(|value| value % 3 == 0 || value % 5 == 0);
    +
    +        while let Some(value) = filtered.next().await {
    +            println!("The value was: {value}");
    +        }
    +    });
    +}
    +
    示例 17-32:使用 `StreamExt::filter` 方法来过滤 `Stream`
    +
    +

    当然这并不是非常的有趣。我们完全可以使用普通的迭代器而不用任何异步操作来做到这些。所以让我们看看一些其它的只能用流的内容。

    +

    组合流

    +

    很多概念天然地可以用流来代表:队列中可用的项;或者处理超过计算机内存的数据,一次只能从文件系统拉取一个块;或者通过网络随着时间推移到达的数据。因为流是 future,我们也可以将其用于任何其它类型的 future,并且我们可以用一种非常有趣的方式来组合它们。例如,我们可以批量处理事件来避免触发过多的网络调用,为一系列的长时间运行的任务设置超时,或者对用户接口事件限速来避免进行无尽的工作。

    +

    让我们构建一个小的消息流作为开始,将其作为一个可能从 WebSocket 或者其它现实世界中的通信协议中遇到的数据流的替代。在示例 17-33 中,我们创建了一个返回 impl Stream<Item = String>get_messages 函数。作为其实现,我们创建了一个异步信道,循环英文字母表的前是个字符,并通过信道发送它们。

    +

    我们还使用了一个新类型:ReceiverStream,它将 trpl::channelrx 接收端转换为一个带有带有 next 方法的 Stream。回到 main,我们使用了一个 while let 循环来打印来自流中的所有消息。

    +
    +

    文件名:src/main.rs

    +
    extern crate trpl; // required for mdbook test
    +
    +use trpl::{ReceiverStream, Stream, StreamExt};
    +
    +fn main() {
    +    trpl::run(async {
    +        let mut messages = get_messages();
    +
    +        while let Some(message) = messages.next().await {
    +            println!("{message}");
    +        }
    +    });
    +}
    +
    +fn get_messages() -> impl Stream<Item = String> {
    +    let (tx, rx) = trpl::channel();
    +
    +    let messages = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"];
    +    for message in messages {
    +        tx.send(format!("Message: '{message}'")).unwrap();
    +    }
    +
    +    ReceiverStream::new(rx)
    +}
    +
    示例 17-33:使用 `rx` 接收端作为一个 `ReceiverStream`
    +
    +

    深入理解 async 相关的 traits

    +

    Futures,任务(tasks)和线程(threads)

    +

    Rust 的面向对象特性

    +
    +

    ch18-00-oop.md +
    +commit 398d6f48d2e6b7b15efd51c4541d446e89de3892

    +
    +

    面向对象编程(Object-Oriented Programming,OOP)是一种对程序进行建模方式。对象(Object)作为一个编程概念来源于 20 世纪 60 年代的 Simula 编程语言。这些对象影响了 Alan Kay 的编程架构,该架构中对象之间互相传递消息。他在 1967 年创造了 面向对象编程object-oriented programming)这个术语。关于 OOP 是什么有很多相互矛盾的定义;在一些定义下,Rust 是面向对象的;在其他定义下,Rust 不是。在本章节中,我们会探索一些被普遍认为是面向对象的特性和这些特性是如何体现在 Rust 语言习惯中的。接着会展示如何在 Rust 中实现面向对象设计模式,并讨论这么做与利用 Rust 自身的一些优势实现的方案相比有什么取舍。

    +

    面向对象语言的特征

    +
    +

    ch18-01-what-is-oo.md +
    +commit 398d6f48d2e6b7b15efd51c4541d446e89de3892

    +
    +

    关于一门语言必须具备哪些特征才能被视为面向对象,目前在编程社区中并没有共识。Rust 受到了许多编程范式的影响,包括面向对象编程(OOP);例如,在第 13 章中,我们探讨了来自函数式编程的特性。可以说,面向对象的语言共有一些共同的特征,即对象、封装和继承。我们将会讨论这些特征分别是什么,以及 Rust 是否支持它们。

    +

    对象包含数据和行为

    +

    由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(Addison-Wesley Professional, 1994)编写的书 Design Patterns: Elements of Reusable Object-Oriented Software ,通称 The Gang of Four (“四人帮”),是一本面向对象设计模式的目录。它这样定义面向对象编程:

    +
    +

    Object-oriented programs are made up of objects. An object packages both +data and the procedures that operate on that data. The procedures are +typically called methods or operations.

    +

    面向对象的程序由对象组成。一个 对象 包含数据和操作这些数据的过程。这些过程通常被称为 方法操作

    +
    +

    在这个定义下,Rust 是面向对象的:结构体和枚举包含数据而 impl 块提供了在结构体和枚举之上的方法。虽然带有方法的结构体和枚举并不被 称为 对象,但是它们提供了与对象相同的功能,参考 The Gang of Four 中对象的定义。

    +

    封装隐藏了实现细节

    +

    另一个通常与面向对象编程关联的概念是 封装encapsulation):一个对象的实现细节对使用该对象的代码不可访问。因此,对象交互的唯一方式是通过其公共 API;使用对象的代码不应能直接触及对象的内部并改变数据或行为。这使得程序员能够更改和重构一个对象的内部实现,而无需改变使用该对象的代码。

    +

    我们在第 7 章讨论了如何控制封装:我们可以使用 pub 关键字来决定代码中的哪些模块、类型、函数和方法是公有的,而默认情况下其他所有内容都是私有的。例如,我们可以定义一个 AveragedCollection 结构体,其中有一个存有 Vec<i32> 的字段。该结构体还可以有一个字段存储其平均值,以便需要时取用。示例 17-1 给出了 AveragedCollection 结构体的定义:

    +

    文件名:src/lib.rs

    +
    pub struct AveragedCollection {
    +    list: Vec<i32>,
    +    average: f64,
    +}
    +

    示例 17-1: AveragedCollection 结构体维护了一个整型列表及其所有元素的平均值。

    +

    该结构体被标记为 pub,这样其他代码就可以使用它,但结构体内的字段保持私有。这在这种情况下很重要,因为我们想确保每当列表中添加或删除值时,平均值也会更新。我们通过实现结构体上的 addremoveaverage 方法来做到这一点,如示例 17-2 所示:

    +

    文件名:src/lib.rs

    +
    pub struct AveragedCollection {
    +    list: Vec<i32>,
    +    average: f64,
    +}
    +
    +impl AveragedCollection {
    +    pub fn add(&mut self, value: i32) {
    +        self.list.push(value);
    +        self.update_average();
    +    }
    +
    +    pub fn remove(&mut self) -> Option<i32> {
    +        let result = self.list.pop();
    +        match result {
    +            Some(value) => {
    +                self.update_average();
    +                Some(value)
    +            }
    +            None => None,
    +        }
    +    }
    +
    +    pub fn average(&self) -> f64 {
    +        self.average
    +    }
    +
    +    fn update_average(&mut self) {
    +        let total: i32 = self.list.iter().sum();
    +        self.average = total as f64 / self.list.len() as f64;
    +    }
    +}
    +

    示例 17-2: 在 AveragedCollection 结构体上实现了 addremoveaverage 公有方法

    +

    公有方法 addremoveaverage 是修改 AveragedCollection 实例的唯一方式。当使用 add 方法把一个元素加入到 list 或者使用 remove 方法来删除时,这些方法的实现同时会调用私有的 update_average 方法来更新 average 字段。

    +

    listaverage 是私有的,所以没有其他方式来使得外部的代码直接向 list 增加或者删除元素,否则 list 改变时可能会导致 average 字段不同步。average 方法返回 average 字段的值,这使得外部的代码只能读取 average 而不能修改它。

    +

    因为我们已经封装了 AveragedCollection 的实现细节,改动数据结构等内部实现非常简单。例如,可以使用 HashSet<i32> 代替 Vec<i32> 作为 list 字段的类型。只要 addremoveaverage 这些公有方法的签名保持不变,使用 AveragedCollection 的代码就无需改变。如果我们将 list 设为公有,情况就未必如此: HashSet<i32>Vec<i32> 使用不同的方法增加或移除项,所以如果外部代码直接修改 list ,很可能需要进行更改。

    +

    如果封装被认为是面向对象语言所必要的特征,那么 Rust 满足这个要求。在代码中不同的部分控制 pub 的使用来封装实现细节。

    +

    继承,作为类型系统与代码共享

    +

    继承Inheritance)是一种机制:一个对象可以从另一个对象的定义中继承元素,从而获得父对象的数据和行为,无需再次定义。

    +

    如果一种语言必须具有继承才能被认为是面向对象语言,那么 Rust 不是其中之一。Rust 不支持定义一个结构体时继承父结构体的字段和方法,除非使用宏。

    +

    然而,如果您习惯于在编程过程中使用继承,那么根据运用继承的原因,Rust 提供了其他解决方案。

    +

    选择继承有两个主要的原因。其一是代码复用:您可以为一种类型实现特定的行为,继承可将其复用到不同的类型上。在 Rust 代码中可以使用默认 trait 方法实现来进行有限的代码复用,就像示例 10-14 中在 Summary trait 上增加的 summarize 方法的默认实现。任何实现了 Summary trait 的类型都可以使用 summarize 方法而无须进一步实现。这类似于父类有一个方法的实现,继承的子类也拥有这个方法的实现。当实现 Summary trait 时也可以选择覆盖 summarize 的默认实现,这类似于子类覆盖从父类继承方法的实现。

    +

    其二与类型系统有关:子类型可以用于父类型被使用的地方。这也被称为 多态polymorphism):如果多个对象共享某些特征,可以在运行时将它们互相替代。

    +
    +

    多态(Polymorphism)

    +

    对很多人来说,多态性与继承同义。但它实际上是一个更广义的概念,指的是可以处理多种类型数据的代码。对继承而言,这些类型通常是子类。 +Rust 使用泛型来抽象不同可能的类型,并通过 trait bounds 来约束这些类型所必须提供的内容。这有时被称为 bounded parametric polymorphism

    +
    +

    作为一种语言设计的解决方案,继承在许多新的编程语言中逐渐不被青睐,因为它经常有分享过多代码的风险。子类不应总是共享父类的所有特征,但是继承始终如此。它还引入了在子类上调用方法的可能性,这些方法可能没有意义,或因为方法不适用于子类而导致错误。此外,一些语言只允许单一继承(意味着子类只能从一个类继承),进一步限制了程序设计的灵活性。

    +

    出于这些原因,Rust 使用 trait 对象而非继承。接下来我们会讨论 Rust 如何使用 trait 对象实现多态性。

    +

    顾及不同类型值的 trait 对象

    +
    +

    ch18-02-trait-objects.md +
    +commit 96d4b0ec1c5e019b85604c33ceee68b3e2669d40

    +
    +

    在第八章中,我们谈到了 vector 只能存储同种类型元素的局限。示例 8-9 中提供了一个替代方案,通过定义 SpreadsheetCell 枚举,来储存整型、浮点型或文本类型的成员。这意味着,我们可以在每个单元中储存不同类型的数据,并仍能拥有一个代表一排单元的 vector。只要我们需存储的值由一组固定的类型组成,并且在代码编译时就知道具体会有哪些类型,那么这种使用枚举的办法是完全可行的。

    +

    然而有时我们希望库用户在特定情况下能够扩展有效的类型集合。为了展示如何实现这一点,这里将创建一个图形用户接口(Graphical User Interface,GUI)工具的例子,它通过遍历列表并调用每一个项目的 draw 方法来将其绘制到屏幕上 —— 此乃一个 GUI 工具的常见技术。我们将要创建一个叫做 gui 的库 crate,它含一个 GUI 库的结构。这个 GUI 库包含一些可供开发者使用的类型,比如 ButtonTextField。在此之上,gui 的用户希望创建自定义的可以绘制于屏幕上的类型:比如,一个程序员可能会增加 Image,另一个可能会增加 SelectBox

    +

    这个例子中并不会实现一个功能完善的 GUI 库,不过会展示其中各个部分是如何结合在一起的。编写库的时候,我们不可能知晓并定义所有其他程序员希望创建的类型。我们所知晓的是 gui 需要记录一系列不同类型的值,并需要能够对其中每一个值调用 draw 方法。这里无需知道调用 draw 方法时具体会发生什么,只要该值会有那个方法可供我们调用。

    +

    在拥有继承的语言中,可以定义一个名为 Component 的类,该类上有一个 draw 方法。其他的类比如 ButtonImageSelectBox 会从 Component 派生并因此继承 draw 方法。它们各自都可以覆盖 draw 方法来定义自己的行为,但是框架会把所有这些类型当作是 Component 的实例,并在其上调用 draw。不过 Rust 并没有继承,我们得另寻出路。

    +

    定义通用行为的 trait

    +

    为了实现 gui 所期望的行为,让我们定义一个 Draw trait,其中包含名为 draw 的方法。接着可以定义一个存放 trait 对象trait object)的 vector。trait 对象指向一个实现了我们指定 trait 的类型的实例,以及一个用于在运行时查找该类型的 trait 方法的表。我们通过指定某种指针来创建 trait 对象,例如 & 引用或 Box<T> 智能指针,还有 dyn keyword,以及指定相关的 trait(第二十章 “动态大小类型和 Sized trait” 部分会介绍 trait 对象必须使用指针的原因)。我们可以使用 trait 对象代替泛型或具体类型。任何使用 trait 对象的位置,Rust 的类型系统会在编译时确保任何在此上下文中使用的值会实现其 trait 对象的 trait。如此便无需在编译时就知晓所有可能的类型。

    +

    之前提到过,Rust 刻意不将结构体与枚举称为 “对象”,以便与其他语言中的对象相区别。在结构体或枚举中,结构体字段中的数据和 impl 块中的行为是分开的,不同于其他语言中将数据和行为组合进一个称为对象的概念中。trait 对象将数据和行为两者相结合,从这种意义上说 其更类似其他语言中的对象。不过 trait 对象不同于传统的对象,因为不能向 trait 对象增加数据。trait 对象并不像其他语言中的对象那么通用:其(trait 对象)具体的作用是允许对通用行为进行抽象。

    +

    示例 17-3 展示了如何定义一个带有 draw 方法的 trait Draw

    +

    文件名:src/lib.rs

    +
    pub trait Draw {
    +    fn draw(&self);
    +}
    +

    示例 17-3:Draw trait 的定义

    +

    因为第十章已经讨论过如何定义 trait,其语法看起来应该比较眼熟。接下来就是新内容了:示例 17-4 定义了一个存放了名叫 components 的 vector 的结构体 Screen。这个 vector 的类型是 Box<dyn Draw>,此为一个 trait 对象:它是 Box 中任何实现了 Draw trait 的类型的替身。

    +

    文件名:src/lib.rs

    +
    pub trait Draw {
    +    fn draw(&self);
    +}
    +
    +pub struct Screen {
    +    pub components: Vec<Box<dyn Draw>>,
    +}
    +

    示例 17-4: 一个 Screen 结构体的定义,它带有一个字段 components,其包含实现了 Draw trait 的 trait 对象的 vector

    +

    Screen 结构体上,我们将定义一个 run 方法,该方法会对其 components 上的每一个组件调用 draw 方法,如示例 17-5 所示:

    +

    文件名:src/lib.rs

    +
    pub trait Draw {
    +    fn draw(&self);
    +}
    +
    +pub struct Screen {
    +    pub components: Vec<Box<dyn Draw>>,
    +}
    +
    +impl Screen {
    +    pub fn run(&self) {
    +        for component in self.components.iter() {
    +            component.draw();
    +        }
    +    }
    +}
    +

    示例 17-5:在 Screen 上实现一个 run 方法,该方法在每个 component 上调用 draw 方法

    +

    这与定义使用了带有 trait bound 的泛型类型参数的结构体不同。泛型类型参数一次只能替代一个具体类型,而 trait 对象则允许在运行时替代多种具体类型。例如,可以定义 Screen 结构体来使用泛型和 trait bound,如示例 17-6 所示:

    +

    文件名:src/lib.rs

    +
    pub trait Draw {
    +    fn draw(&self);
    +}
    +
    +pub struct Screen<T: Draw> {
    +    pub components: Vec<T>,
    +}
    +
    +impl<T> Screen<T>
    +where
    +    T: Draw,
    +{
    +    pub fn run(&self) {
    +        for component in self.components.iter() {
    +            component.draw();
    +        }
    +    }
    +}
    +

    示例 17-6: 一种 Screen 结构体的替代实现,其 run 方法使用泛型和 trait bound

    +

    这限制了 Screen 实例必须拥有一个全是 Button 类型或者全是 TextField 类型的组件列表。如果只需要同质(相同类型)集合,则倾向于使用泛型和 trait bound,因为其定义会在编译时采用具体类型进行单态化。

    +

    另一方面,通过使用 trait 对象的方法,一个 Screen 实例可以存放一个既能包含 Box<Button>,也能包含 Box<TextField>Vec<T>。让我们看看它是如何工作的,接着会讲到其运行时性能影响。

    +

    实现 trait

    +

    现在来增加一些实现了 Draw trait 的类型。我们将提供 Button 类型。再一次重申,真正实现 GUI 库超出了本书的范畴,所以 draw 方法体中不会有任何有意义的实现。为了想象一下这个实现看起来像什么,一个 Button 结构体可能会拥有 widthheightlabel 字段,如示例 17-7 所示:

    +

    文件名:src/lib.rs

    +
    pub trait Draw {
    +    fn draw(&self);
    +}
    +
    +pub struct Screen {
    +    pub components: Vec<Box<dyn Draw>>,
    +}
    +
    +impl Screen {
    +    pub fn run(&self) {
    +        for component in self.components.iter() {
    +            component.draw();
    +        }
    +    }
    +}
    +
    +pub struct Button {
    +    pub width: u32,
    +    pub height: u32,
    +    pub label: String,
    +}
    +
    +impl Draw for Button {
    +    fn draw(&self) {
    +        // code to actually draw a button
    +    }
    +}
    +

    示例 17-7: 一个实现了 Draw trait 的 Button 结构体

    +

    Button 上的 widthheightlabel 字段会和其他组件不同,比如 TextField 可能有 widthheightlabel 以及 placeholder 字段。每一个我们希望能在屏幕上绘制的类型都会使用不同的代码来实现 Draw trait 的 draw 方法来定义如何绘制特定的类型,像这里的 Button 类型(如上提到的并不包含任何实际的 GUI 代码)。除了实现 Draw trait 之外,比如 Button 还可能有另一个包含按钮点击如何响应的方法的 impl 块。这类方法并不适用于像 TextField 这样的类型。

    +

    如果一些库的使用者决定实现一个包含 widthheightoptions 字段的结构体 SelectBox,并且也为其实现了 Draw trait,如示例 17-8 所示:

    +

    文件名:src/main.rs

    +
    use gui::Draw;
    +
    +struct SelectBox {
    +    width: u32,
    +    height: u32,
    +    options: Vec<String>,
    +}
    +
    +impl Draw for SelectBox {
    +    fn draw(&self) {
    +        // code to actually draw a select box
    +    }
    +}
    +
    +fn main() {}
    +

    示例 17-8: 另一个使用 gui 的 crate 中,在 SelectBox 结构体上实现 Draw trait

    +

    库使用者现在可以在他们的 main 函数中创建一个 Screen 实例。至此可以通过将 SelectBoxButton 放入 Box<T> 转变为 trait 对象再放入 Screen 实例中。接着可以调用 Screenrun 方法,它会调用每个组件的 draw 方法。示例 17-9 展示了这个实现:

    +

    文件名:src/main.rs

    +
    use gui::Draw;
    +
    +struct SelectBox {
    +    width: u32,
    +    height: u32,
    +    options: Vec<String>,
    +}
    +
    +impl Draw for SelectBox {
    +    fn draw(&self) {
    +        // code to actually draw a select box
    +    }
    +}
    +
    +use gui::{Button, Screen};
    +
    +fn main() {
    +    let screen = Screen {
    +        components: vec![
    +            Box::new(SelectBox {
    +                width: 75,
    +                height: 10,
    +                options: vec![
    +                    String::from("Yes"),
    +                    String::from("Maybe"),
    +                    String::from("No"),
    +                ],
    +            }),
    +            Box::new(Button {
    +                width: 50,
    +                height: 10,
    +                label: String::from("OK"),
    +            }),
    +        ],
    +    };
    +
    +    screen.run();
    +}
    +

    示例 17-9: 使用 trait 对象来存储实现了相同 trait 的不同类型的值

    +

    当编写库的时候,我们不知道何人会在何时增加 SelectBox 类型,不过 Screen 的实现能够操作并绘制这个新类型,因为 SelectBox 实现了 Draw trait,这意味着它实现了 draw 方法。

    +

    这个概念 —— 只关心值所反映的信息而不是其具体类型 —— 类似于动态类型语言中称为 鸭子类型duck typing)的概念:如果它走起来像一只鸭子,叫起来像一只鸭子,那么它就是一只鸭子!在示例 17-5 中 Screen 上的 run 实现中,run 并不需要知道各个组件的具体类型是什么。它并不检查组件是 Button 或者 SelectBox 的实例。通过指定 Box<dyn Draw> 作为 components vector 中值的类型,我们就定义了 Screen 为需要可以在其上调用 draw 方法的值。

    +

    使用 trait 对象和 Rust 类型系统来进行类似鸭子类型操作的优势是无需在运行时检查一个值是否实现了特定方法或者担心在调用时因为值没有实现方法而产生错误。如果值没有实现 trait 对象所需的 trait 则 Rust 不会编译这些代码。

    +

    例如,示例 17-10 展示了当创建一个使用 String 做为其组件的 Screen 时发生的情况:

    +

    文件名:src/main.rs

    +
    use gui::Screen;
    +
    +fn main() {
    +    let screen = Screen {
    +        components: vec![Box::new(String::from("Hi"))],
    +    };
    +
    +    screen.run();
    +}
    +

    示例 17-10: 尝试使用一种没有实现 trait 对象的 trait 的类型

    +

    我们会遇到这个错误,因为 String 没有实现 rust_gui::Draw trait:

    +
    $ cargo run
    +   Compiling gui v0.1.0 (file:///projects/gui)
    +error[E0277]: the trait bound `String: Draw` is not satisfied
    + --> src/main.rs:5:26
    +  |
    +5 |         components: vec![Box::new(String::from("Hi"))],
    +  |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Draw` is not implemented for `String`
    +  |
    +  = help: the trait `Draw` is implemented for `Button`
    +  = note: required for the cast from `Box<String>` to `Box<dyn Draw>`
    +
    +For more information about this error, try `rustc --explain E0277`.
    +error: could not compile `gui` (bin "gui") due to 1 previous error
    +
    +

    这告诉了我们,要么是我们传递了并不希望传递给 Screen 的类型并应该提供其他类型,要么应该在 String 上实现 Draw 以便 Screen 可以调用其上的 draw

    +

    trait 对象执行动态分发

    +

    回忆一下第十章 “泛型代码的性能” 部分讨论过的,当对泛型使用 trait bound 时编译器所执行的单态化处理:编译器为每一个被泛型类型参数代替的具体类型生成了函数和方法的非泛型实现。单态化产生的代码在执行 静态分发static dispatch)。静态分发发生于编译器在编译时就知晓调用了什么方法的时候。这与 动态分发dynamic dispatch)相对,这时编译器在编译时无法知晓调用了什么方法。在动态分发的场景下,编译器会生成负责在运行时确定该调用什么方法的代码。

    +

    当使用 trait 对象时,Rust 必须使用动态分发。编译器无法知晓所有可能用于 trait 对象代码的类型,所以它也不知道应该调用哪个类型的哪个方法实现。为此,Rust 在运行时使用 trait 对象中的指针来知晓需要调用哪个方法。动态分发也阻止编译器有选择的内联方法代码,这会相应的禁用一些优化。尽管在编写示例 17-5 和可以支持示例 17-9 中的代码的过程中确实获得了额外的灵活性,但仍然需要权衡取舍。

    +

    面向对象设计模式的实现

    +
    +

    ch18-03-oo-design-patterns.md +
    +commit 937784b8708c24314707378ad42faeb12a334bbd

    +
    +

    状态模式state pattern)是一个面向对象设计模式。该模式的关键在于定义一系列值的内含状态。这些状态体现为一系列的 状态对象,同时值的行为随着其内部状态而改变。我们将编写一个博客发布结构体的例子,它拥有一个包含其状态的字段,这是一个有着 "draft"、"review" 或 "published" 的状态对象

    +

    状态对象共享功能:当然,在 Rust 中使用结构体和 trait 而不是对象和继承。每一个状态对象负责其自身的行为,以及该状态何时应当转移至另一个状态。持有一个状态对象的值对于不同状态的行为以及何时状态转移毫不知情。

    +

    使用状态模式的优点在于,程序的业务需求改变时,无需改变值持有状态或者使用值的代码。我们只需更新某个状态对象中的代码来改变其规则,或者是增加更多的状态对象。

    +

    首先我们将以一种更加传统的面向对象的方式实现状态模式,接着使用一种更 Rust 一点的方式。让我们使用状态模式增量式地实现一个发布博文的工作流以探索这个概念。

    +

    这个博客的最终功能看起来像这样:

    +
      +
    1. 博文从空白的草案开始。
    2. +
    3. 一旦草案完成,请求审核博文。
    4. +
    5. 一旦博文过审,它将被发表。
    6. +
    7. 只有被发表的博文的内容会被打印,这样就不会意外打印出没有被审核的博文的文本。
    8. +
    +

    任何其他对博文的修改尝试都是没有作用的。例如,如果尝试在请求审核之前通过一个草案博文,博文应该保持未发布的状态。

    +

    示例 17-11 展示这个工作流的代码形式:这是一个我们将要在一个叫做 blog 的库 crate 中实现的 API 的示例。这段代码还不能编译,因为还未实现 blog

    +

    文件名:src/main.rs

    +
    use blog::Post;
    +
    +fn main() {
    +    let mut post = Post::new();
    +
    +    post.add_text("I ate a salad for lunch today");
    +    assert_eq!("", post.content());
    +
    +    post.request_review();
    +    assert_eq!("", post.content());
    +
    +    post.approve();
    +    assert_eq!("I ate a salad for lunch today", post.content());
    +}
    +

    示例 17-11: 展示了 blog crate 期望行为的代码

    +

    我们希望允许用户使用 Post::new 创建一个新的博文草案。也希望能在草案阶段为博文编写一些文本。如果在审批之前尝试立刻获取博文的内容,不应该获取到任何文本因为博文仍然是草案。一个好的单元测试将是断言草案博文的 content 方法返回空字符串,不过我们并不准备为这个例子编写单元测试。

    +

    接下来,我们希望能够请求审核博文,而在等待审核的阶段 content 应该仍然返回空字符串。最后当博文审核通过,它应该被发表,这意味着当调用 content 时博文的文本将被返回。

    +

    注意我们与 crate 交互的唯一的类型是 Post。这个类型会使用状态模式并会存放处于三种博文所可能的状态之一的值 —— 草案,等待审核和发布。状态上的改变由 Post 类型内部进行管理。状态依库用户对 Post 实例调用的方法而改变,但是不能直接管理状态变化。这也意味着用户不会在状态上犯错,比如在过审前发布博文。

    +

    定义 Post 并新建一个草案状态的实例

    +

    让我们开始实现这个库吧!我们知道需要一个公有 Post 结构体来存放一些文本,所以让我们从结构体的定义和一个创建 Post 实例的公有关联函数 new 开始,如示例 17-12 所示。还需定义一个私有 trait State

    +

    Post 将在私有字段 state 中存放一个 Option<T> 类型的 trait 对象 Box<dyn State>。稍后将会看到为何 Option<T> 是必须的。

    +

    文件名:src/lib.rs

    +
    pub struct Post {
    +    state: Option<Box<dyn State>>,
    +    content: String,
    +}
    +
    +impl Post {
    +    pub fn new() -> Post {
    +        Post {
    +            state: Some(Box::new(Draft {})),
    +            content: String::new(),
    +        }
    +    }
    +}
    +
    +trait State {}
    +
    +struct Draft {}
    +
    +impl State for Draft {}
    +

    示例 17-12: Post 结构体的定义和新建 Post 实例的 new 函数,State trait 和结构体 Draft

    +

    State trait 定义了所有不同状态的博文所共享的行为,这个状态对象是 DraftPendingReviewPublished,它们都会实现 State 状态。现在这个 trait 并没有任何方法,同时开始将只定义 Draft 状态因为这是我们希望博文的初始状态。

    +

    当创建新的 Post 时,我们将其 state 字段设置为一个存放了 BoxSome 值。这个 Box 指向一个 Draft 结构体新实例。这确保了无论何时新建一个 Post 实例,它都会从草案开始。因为 Poststate 字段是私有的,也就无法创建任何其他状态的 Post 了!。Post::new 函数中将 content 设置为新建的空 String

    +

    存放博文内容的文本

    +

    在示例 17-11 中,展示了我们希望能够调用一个叫做 add_text 的方法并向其传递一个 &str 来将文本增加到博文的内容中。选择实现为一个方法而不是将 content 字段暴露为 pub 。这意味着之后可以实现一个方法来控制 content 字段如何被读取。add_text 方法是非常直观的,让我们在示例 17-13 的 impl Post 块中增加一个实现:

    +

    文件名:src/lib.rs

    +
    pub struct Post {
    +    state: Option<Box<dyn State>>,
    +    content: String,
    +}
    +
    +impl Post {
    +    // --snip--
    +    pub fn new() -> Post {
    +        Post {
    +            state: Some(Box::new(Draft {})),
    +            content: String::new(),
    +        }
    +    }
    +
    +    pub fn add_text(&mut self, text: &str) {
    +        self.content.push_str(text);
    +    }
    +}
    +
    +trait State {}
    +
    +struct Draft {}
    +
    +impl State for Draft {}
    +

    示例 17-13: 实现方法 add_text 来向博文的 content 增加文本

    +

    add_text 获取一个 self 的可变引用,因为需要改变调用 add_textPost 实例。接着调用 content 中的 Stringpush_str 并传递 text 参数来保存到 content 中。这不是状态模式的一部分,因为它的行为并不依赖博文所处的状态。add_text 方法完全不与 state 状态交互,不过这是我们希望支持的行为的一部分。

    +

    确保博文草案的内容是空的

    +

    即使调用 add_text 并向博文增加一些内容之后,我们仍然希望 content 方法返回一个空字符串 slice,因为博文仍然处于草案状态,如示例 17-11 的第 8 行所示。现在让我们使用能满足要求的最简单的方式来实现 content 方法:总是返回一个空字符串 slice。当实现了将博文状态改为发布的能力之后将改变这一做法。但是目前博文只能是草案状态,这意味着其内容应该总是空的。示例 17-14 展示了这个占位符实现:

    +

    文件名:src/lib.rs

    +
    pub struct Post {
    +    state: Option<Box<dyn State>>,
    +    content: String,
    +}
    +
    +impl Post {
    +    // --snip--
    +    pub fn new() -> Post {
    +        Post {
    +            state: Some(Box::new(Draft {})),
    +            content: String::new(),
    +        }
    +    }
    +
    +    pub fn add_text(&mut self, text: &str) {
    +        self.content.push_str(text);
    +    }
    +
    +    pub fn content(&self) -> &str {
    +        ""
    +    }
    +}
    +
    +trait State {}
    +
    +struct Draft {}
    +
    +impl State for Draft {}
    +

    列表 17-14: 增加一个 Postcontent 方法的占位实现,它总是返回一个空字符串 slice

    +

    通过增加这个 content 方法,示例 17-11 中直到第 8 行的代码能如期运行。

    +

    请求审核博文来改变其状态

    +

    接下来需要增加请求审核博文的功能,这应当将其状态由 Draft 改为 PendingReview。示例 17-15 展示了这个代码:

    +

    文件名:src/lib.rs

    +
    pub struct Post {
    +    state: Option<Box<dyn State>>,
    +    content: String,
    +}
    +
    +impl Post {
    +    // --snip--
    +    pub fn new() -> Post {
    +        Post {
    +            state: Some(Box::new(Draft {})),
    +            content: String::new(),
    +        }
    +    }
    +
    +    pub fn add_text(&mut self, text: &str) {
    +        self.content.push_str(text);
    +    }
    +
    +    pub fn content(&self) -> &str {
    +        ""
    +    }
    +
    +    pub fn request_review(&mut self) {
    +        if let Some(s) = self.state.take() {
    +            self.state = Some(s.request_review())
    +        }
    +    }
    +}
    +
    +trait State {
    +    fn request_review(self: Box<Self>) -> Box<dyn State>;
    +}
    +
    +struct Draft {}
    +
    +impl State for Draft {
    +    fn request_review(self: Box<Self>) -> Box<dyn State> {
    +        Box::new(PendingReview {})
    +    }
    +}
    +
    +struct PendingReview {}
    +
    +impl State for PendingReview {
    +    fn request_review(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +}
    +

    示例 17-15: 实现 PostState trait 的 request_review 方法

    +

    这里为 Post 增加一个获取 self 可变引用的公有方法 request_review。接着在 Post 的当前状态下调用内部的 request_review 方法,并且第二个 request_review 方法会消费当前的状态并返回一个新状态。

    +

    这里给 State trait 增加了 request_review 方法;所有实现了这个 trait 的类型现在都需要实现 request_review 方法。注意不同于使用 self&self 或者 &mut self 作为方法的第一个参数,这里使用了 self: Box<Self>。这个语法意味着该方法只可在持有这个类型的 Box 上被调用。这个语法获取了 Box<Self> 的所有权使老状态无效化,以便 Post 的状态值可转换为一个新状态。

    +

    为了消费老状态,request_review 方法需要获取状态值的所有权。这就是 Poststate 字段中 Option 的来历:调用 take 方法将 state 字段中的 Some 值取出并留下一个 None,因为 Rust 不允许结构体实例中存在值为空的字段。这使得我们将 state 的值移出 Post 而不是借用它。接着我们将博文的 state 值设置为这个操作的结果。

    +

    我们需要将 state 临时设置为 None 来获取 state 值,即老状态的所有权,而不是使用 self.state = self.state.request_review(); 这样的代码直接更新状态值。这确保了当 Post 被转换为新状态后不能再使用老 state 值。

    +

    Draftrequest_review 方法需要返回一个新的,装箱的 PendingReview 结构体的实例,其用来代表博文处于等待审核状态。结构体 PendingReview 同样也实现了 request_review 方法,不过它不进行任何状态转换。相反它返回自身,因为当我们请求审核一个已经处于 PendingReview 状态的博文,它应该继续保持 PendingReview 状态。

    +

    现在我们能看出状态模式的优势了:无论 state 是何值,Postrequest_review 方法都是一样的。每个状态只负责它自己的规则。

    +

    我们将继续保持 Postcontent 方法实现不变,返回一个空字符串 slice。现在我们可以拥有 PendingReview 状态和 Draft 状态的 Post 了,不过我们希望在 PendingReview 状态下 Post 也有相同的行为。现在示例 17-11 中直到 10 行的代码是可以执行的!

    +

    增加改变 content 行为的 approve 方法

    +

    approve 方法将与 request_review 方法类似:它会将 state 设置为审核通过时应处于的状态,如示例 17-16 所示。

    +

    文件名:src/lib.rs

    +
    pub struct Post {
    +    state: Option<Box<dyn State>>,
    +    content: String,
    +}
    +
    +impl Post {
    +    // --snip--
    +    pub fn new() -> Post {
    +        Post {
    +            state: Some(Box::new(Draft {})),
    +            content: String::new(),
    +        }
    +    }
    +
    +    pub fn add_text(&mut self, text: &str) {
    +        self.content.push_str(text);
    +    }
    +
    +    pub fn content(&self) -> &str {
    +        ""
    +    }
    +
    +    pub fn request_review(&mut self) {
    +        if let Some(s) = self.state.take() {
    +            self.state = Some(s.request_review())
    +        }
    +    }
    +
    +    pub fn approve(&mut self) {
    +        if let Some(s) = self.state.take() {
    +            self.state = Some(s.approve())
    +        }
    +    }
    +}
    +
    +trait State {
    +    fn request_review(self: Box<Self>) -> Box<dyn State>;
    +    fn approve(self: Box<Self>) -> Box<dyn State>;
    +}
    +
    +struct Draft {}
    +
    +impl State for Draft {
    +    // --snip--
    +    fn request_review(self: Box<Self>) -> Box<dyn State> {
    +        Box::new(PendingReview {})
    +    }
    +
    +    fn approve(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +}
    +
    +struct PendingReview {}
    +
    +impl State for PendingReview {
    +    // --snip--
    +    fn request_review(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +
    +    fn approve(self: Box<Self>) -> Box<dyn State> {
    +        Box::new(Published {})
    +    }
    +}
    +
    +struct Published {}
    +
    +impl State for Published {
    +    fn request_review(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +
    +    fn approve(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +}
    +

    示例 17-16: 为 PostState trait 实现 approve 方法

    +

    这里为 State trait 增加了 approve 方法,并新增了一个实现了 State 的结构体,Published 状态。

    +

    类似于 PendingReviewrequest_review 的工作方式,如果对 Draft 调用 approve 方法,并没有任何效果,因为它会返回 self。当对 PendingReview 调用 approve 时,它返回一个新的、装箱的 Published 结构体的实例。Published 结构体实现了 State trait,同时对于 request_reviewapprove 两方法来说,它返回自身,因为在这两种情况博文应该保持 Published 状态。

    +

    现在需要更新 Postcontent 方法。我们希望 content 根据 Post 的当前状态返回值,所以需要 Post 代理一个定义于 state 上的 content 方法,如实例 17-17 所示:

    +

    文件名:src/lib.rs

    +
    pub struct Post {
    +    state: Option<Box<dyn State>>,
    +    content: String,
    +}
    +
    +impl Post {
    +    // --snip--
    +    pub fn new() -> Post {
    +        Post {
    +            state: Some(Box::new(Draft {})),
    +            content: String::new(),
    +        }
    +    }
    +
    +    pub fn add_text(&mut self, text: &str) {
    +        self.content.push_str(text);
    +    }
    +
    +    pub fn content(&self) -> &str {
    +        self.state.as_ref().unwrap().content(self)
    +    }
    +    // --snip--
    +
    +    pub fn request_review(&mut self) {
    +        if let Some(s) = self.state.take() {
    +            self.state = Some(s.request_review())
    +        }
    +    }
    +
    +    pub fn approve(&mut self) {
    +        if let Some(s) = self.state.take() {
    +            self.state = Some(s.approve())
    +        }
    +    }
    +}
    +
    +trait State {
    +    fn request_review(self: Box<Self>) -> Box<dyn State>;
    +    fn approve(self: Box<Self>) -> Box<dyn State>;
    +}
    +
    +struct Draft {}
    +
    +impl State for Draft {
    +    fn request_review(self: Box<Self>) -> Box<dyn State> {
    +        Box::new(PendingReview {})
    +    }
    +
    +    fn approve(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +}
    +
    +struct PendingReview {}
    +
    +impl State for PendingReview {
    +    fn request_review(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +
    +    fn approve(self: Box<Self>) -> Box<dyn State> {
    +        Box::new(Published {})
    +    }
    +}
    +
    +struct Published {}
    +
    +impl State for Published {
    +    fn request_review(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +
    +    fn approve(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +}
    +

    示例 17-17: 更新 Postcontent 方法来委托调用 Statecontent 方法

    +

    因为目标是将所有像这样的规则保持在实现了 State 的结构体中,我们将调用 state 中的值的 content 方法并传递博文实例(也就是 self)作为参数。接着返回 state 值的 content 方法的返回值。

    +

    这里调用 Optionas_ref 方法是因为需要 Option 中值的引用而不是获取其所有权。因为 state 是一个 Option<Box<dyn State>>,调用 as_ref 会返回一个 Option<&Box<dyn State>>。如果不调用 as_ref,将会得到一个错误,因为不能将 state 移动出借用的 &self 函数参数。

    +

    接着调用 unwrap 方法,这里我们知道它永远也不会 panic,因为 Post 的所有方法都确保在它们返回时 state 会有一个 Some 值。这就是一个第十二章 “当我们比编译器知道更多的情况” 部分讨论过的我们知道 None 是不可能的而编译器却不能理解的情况。

    +

    接着我们就有了一个 &Box<dyn State>,当调用其 content 时,Deref 强制转换会作用于 &Box ,这样最终会调用实现了 State trait 的类型的 content 方法。这意味着需要为 State trait 定义增加 content,这也是放置根据所处状态返回什么内容的逻辑的地方,如示例 17-18 所示:

    +

    文件名:src/lib.rs

    +
    pub struct Post {
    +    state: Option<Box<dyn State>>,
    +    content: String,
    +}
    +
    +impl Post {
    +    pub fn new() -> Post {
    +        Post {
    +            state: Some(Box::new(Draft {})),
    +            content: String::new(),
    +        }
    +    }
    +
    +    pub fn add_text(&mut self, text: &str) {
    +        self.content.push_str(text);
    +    }
    +
    +    pub fn content(&self) -> &str {
    +        self.state.as_ref().unwrap().content(self)
    +    }
    +
    +    pub fn request_review(&mut self) {
    +        if let Some(s) = self.state.take() {
    +            self.state = Some(s.request_review())
    +        }
    +    }
    +
    +    pub fn approve(&mut self) {
    +        if let Some(s) = self.state.take() {
    +            self.state = Some(s.approve())
    +        }
    +    }
    +}
    +
    +trait State {
    +    // --snip--
    +    fn request_review(self: Box<Self>) -> Box<dyn State>;
    +    fn approve(self: Box<Self>) -> Box<dyn State>;
    +
    +    fn content<'a>(&self, post: &'a Post) -> &'a str {
    +        ""
    +    }
    +}
    +
    +// --snip--
    +
    +struct Draft {}
    +
    +impl State for Draft {
    +    fn request_review(self: Box<Self>) -> Box<dyn State> {
    +        Box::new(PendingReview {})
    +    }
    +
    +    fn approve(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +}
    +
    +struct PendingReview {}
    +
    +impl State for PendingReview {
    +    fn request_review(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +
    +    fn approve(self: Box<Self>) -> Box<dyn State> {
    +        Box::new(Published {})
    +    }
    +}
    +
    +struct Published {}
    +
    +impl State for Published {
    +    // --snip--
    +    fn request_review(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +
    +    fn approve(self: Box<Self>) -> Box<dyn State> {
    +        self
    +    }
    +
    +    fn content<'a>(&self, post: &'a Post) -> &'a str {
    +        &post.content
    +    }
    +}
    +

    示例 17-18: 为 State trait 增加 content 方法

    +

    这里增加了一个 content 方法的默认实现来返回一个空字符串 slice。这意味着无需为 DraftPendingReview 结构体实现 content 了。Published 结构体会覆盖 content 方法并会返回 post.content 的值。

    +

    注意这个方法需要生命周期注解,如第十章所讨论的。这里获取 post 的引用作为参数,并返回 post 一部分的引用,所以返回的引用的生命周期与 post 参数相关。

    +

    现在示例完成了 —— 现在示例 17-11 中所有的代码都能工作!我们通过发布博文工作流的规则实现了状态模式。围绕这些规则的逻辑都存在于状态对象中而不是分散在 Post 之中。

    +
    +

    为什么不用枚举?

    +

    你可能会好奇为什么不用包含不同可能的博文状态的 enum 作为变量。这确实是一个可能的方案,尝试实现并对比最终结果来看看哪一种更适合你!使用枚举的一个缺点是每一个检查枚举值的地方都需要一个 match 表达式或类似的代码来处理所有可能的成员。这相比 trait 对象模式可能显得更重复。

    +
    +

    状态模式的权衡取舍

    +

    我们展示了 Rust 是能够实现面向对象的状态模式的,以便能根据博文所处的状态来封装不同类型的行为。Post 的方法并不知道这些不同类型的行为。通过这种组织代码的方式,要找到所有已发布博文的不同行为只需查看一处代码:PublishedState trait 的实现。

    +

    如果要创建一个不使用状态模式的替代实现,则可能会在 Post 的方法中,或者甚至于在 main 代码中用到 match 语句,来检查博文状态并在这里改变其行为。这意味着需要查看很多位置来理解处于发布状态的博文的所有逻辑!这在增加更多状态时会变得更糟:每一个 match 语句都会需要另一个分支。

    +

    对于状态模式来说,Post 的方法和使用 Post 的位置无需 match 语句,同时增加新状态只涉及到增加一个新 struct 和为其实现 trait 的方法。

    +

    这个实现易于扩展增加更多功能。为了体会使用此模式维护代码的简洁性,请尝试如下一些建议:

    +
      +
    • 增加 reject 方法将博文的状态从 PendingReview 变回 Draft
    • +
    • 在将状态变为 Published 之前需要两次 approve 调用
    • +
    • 只允许博文处于 Draft 状态时增加文本内容。提示:让状态对象负责内容可能发生什么改变,但不负责修改 Post
    • +
    +

    状态模式的一个缺点是因为状态实现了状态之间的转换,一些状态会相互联系。如果在 PendingReviewPublished 之间增加另一个状态,比如 Scheduled,则不得不修改 PendingReview 中的代码来转移到 Scheduled。如果 PendingReview 无需因为新增的状态而改变就更好了,不过这意味着切换到另一种设计模式。

    +

    另一个缺点是我们会发现一些重复的逻辑。为了消除它们,可以尝试为 State trait 中返回 selfrequest_reviewapprove 方法增加默认实现,不过这会违反对象安全性,因为 trait 不知道 self 具体是什么。我们希望能够将 State 作为一个 trait 对象,所以需要其方法是对象安全的。

    +

    另一个重复是 Postrequest_reviewapprove 这两个类似的实现。它们都委托调用了 state 字段中 Option 值的同一方法,并在结果中为 state 字段设置了新值。如果 Post 中的很多方法都遵循这个模式,我们可能会考虑定义一个宏来消除重复(查看第二十章的 “宏” 部分)。

    +

    完全按照面向对象语言的定义实现这个模式并没有尽可能地利用 Rust 的优势。让我们看看一些代码中可以做出的修改,来将无效的状态和状态转移变为编译时错误。

    +

    将状态和行为编码为类型

    +

    我们将展示如何稍微反思状态模式来进行一系列不同的权衡取舍。不同于完全封装状态和状态转移使得外部代码对其毫不知情,我们将状态编码进不同的类型。如此,Rust 的类型检查就会将任何在只能使用发布博文的地方使用草案博文的尝试变为编译时错误。

    +

    让我们考虑一下示例 17-11 中 main 的第一部分:

    +

    文件名:src/main.rs

    +
    use blog::Post;
    +
    +fn main() {
    +    let mut post = Post::new();
    +
    +    post.add_text("I ate a salad for lunch today");
    +    assert_eq!("", post.content());
    +
    +    post.request_review();
    +    assert_eq!("", post.content());
    +
    +    post.approve();
    +    assert_eq!("I ate a salad for lunch today", post.content());
    +}
    +

    我们仍然希望能够使用 Post::new 创建一个新的草案博文,并能够增加博文的内容。不过不同于存在一个草案博文时返回空字符串的 content 方法,我们将使草案博文完全没有 content 方法。这样如果尝试获取草案博文的内容,将会得到一个方法不存在的编译错误。这使得我们不可能在生产环境意外显示出草案博文的内容,因为这样的代码甚至就不能编译。示例 17-19 展示了 Post 结构体、DraftPost 结构体以及各自的方法的定义:

    +

    文件名:src/lib.rs

    +
    pub struct Post {
    +    content: String,
    +}
    +
    +pub struct DraftPost {
    +    content: String,
    +}
    +
    +impl Post {
    +    pub fn new() -> DraftPost {
    +        DraftPost {
    +            content: String::new(),
    +        }
    +    }
    +
    +    pub fn content(&self) -> &str {
    +        &self.content
    +    }
    +}
    +
    +impl DraftPost {
    +    pub fn add_text(&mut self, text: &str) {
    +        self.content.push_str(text);
    +    }
    +}
    +

    示例 17-19: 带有 content 方法的 Post 和没有 content 方法的 DraftPost

    +

    PostDraftPost 结构体都有一个私有的 content 字段来储存博文的文本。这些结构体不再有 state 字段因为我们将状态编码改为结构体类型。Post 将代表发布的博文,它有一个返回 contentcontent 方法。

    +

    仍然有一个 Post::new 函数,不过不同于返回 Post 实例,它返回 DraftPost 的实例。现在不可能创建一个 Post 实例,因为 content 是私有的同时没有任何函数返回 Post

    +

    DraftPost 上定义了一个 add_text 方法,这样就可以像之前那样向 content 增加文本,不过注意 DraftPost 并没有定义 content 方法!如此现在程序确保了所有博文都从草案开始,同时草案博文没有任何可供展示的内容。任何绕过这些限制的尝试都会产生编译错误。

    +

    实现状态转移为不同类型的转换

    +

    那么如何得到发布的博文呢?我们希望强制执行的规则是草案博文在可以发布之前必须被审核通过。等待审核状态的博文应该仍然不会显示任何内容。让我们通过增加另一个结构体 PendingReviewPost 来实现这个限制,在 DraftPost 上定义 request_review 方法来返回 PendingReviewPost,并在 PendingReviewPost 上定义 approve 方法来返回 Post,如示例 17-20 所示:

    +

    文件名:src/lib.rs

    +
    pub struct Post {
    +    content: String,
    +}
    +
    +pub struct DraftPost {
    +    content: String,
    +}
    +
    +impl Post {
    +    pub fn new() -> DraftPost {
    +        DraftPost {
    +            content: String::new(),
    +        }
    +    }
    +
    +    pub fn content(&self) -> &str {
    +        &self.content
    +    }
    +}
    +
    +impl DraftPost {
    +    // --snip--
    +    pub fn add_text(&mut self, text: &str) {
    +        self.content.push_str(text);
    +    }
    +
    +    pub fn request_review(self) -> PendingReviewPost {
    +        PendingReviewPost {
    +            content: self.content,
    +        }
    +    }
    +}
    +
    +pub struct PendingReviewPost {
    +    content: String,
    +}
    +
    +impl PendingReviewPost {
    +    pub fn approve(self) -> Post {
    +        Post {
    +            content: self.content,
    +        }
    +    }
    +}
    +

    列表 17-20: PendingReviewPost 通过调用 DraftPostrequest_review 创建,approve 方法将 PendingReviewPost 变为发布的 Post

    +

    request_reviewapprove 方法获取 self 的所有权,因此会消费 DraftPostPendingReviewPost 实例,并分别转换为 PendingReviewPost 和发布的 Post。这样在调用 request_review 之后就不会遗留任何 DraftPost 实例,后者同理。PendingReviewPost 并没有定义 content 方法,所以尝试读取其内容会导致编译错误,DraftPost 同理。因为唯一得到定义了 content 方法的 Post 实例的途径是调用 PendingReviewPostapprove 方法,而得到 PendingReviewPost 的唯一办法是调用 DraftPostrequest_review 方法,现在我们就将发博文的工作流编码进了类型系统。

    +

    这也意味着不得不对 main 做出一些小的修改。因为 request_reviewapprove 返回新实例而不是修改被调用的结构体,所以我们需要增加更多的 let post = 覆盖赋值来保存返回的实例。也不再能断言草案和等待审核的博文的内容为空字符串了,我们也不再需要它们:不能编译尝试使用这些状态下博文内容的代码。更新后的 main 的代码如示例 17-21 所示:

    +

    文件名:src/main.rs

    +
    use blog::Post;
    +
    +fn main() {
    +    let mut post = Post::new();
    +
    +    post.add_text("I ate a salad for lunch today");
    +
    +    let post = post.request_review();
    +
    +    let post = post.approve();
    +
    +    assert_eq!("I ate a salad for lunch today", post.content());
    +}
    +

    示例 17-21: main 中使用新的博文工作流实现的修改

    +

    不得不修改 main 来重新赋值 post 使得这个实现不再完全遵守面向对象的状态模式:状态间的转换不再完全封装在 Post 实现中。然而,得益于类型系统和编译时类型检查,我们得到了的是无效状态是不可能的!这确保了某些特定的 bug,比如显示未发布博文的内容,将在部署到生产环境之前被发现。

    +

    尝试为示例 17-21 之后的 blog crate 实现这一部分开始所建议的任务来体会使用这个版本的代码是何感觉。注意在这个设计中一些需求可能已经完成了。

    +

    即便 Rust 能够实现面向对象设计模式,也有其他像将状态编码进类型这样的模式存在。这些模式有着不同的权衡取舍。虽然你可能非常熟悉面向对象模式,重新思考这些问题来利用 Rust 提供的像在编译时避免一些 bug 这样有益功能。在 Rust 中面向对象模式并不总是最好的解决方案,因为 Rust 拥有像所有权这样的面向对象语言所没有的功能。

    +

    总结

    +

    阅读本章后,不管你是否认为 Rust 是一个面向对象语言,现在你都见识了 trait 对象是一个 Rust 中获取部分面向对象功能的方法。动态分发可以通过牺牲少量运行时性能来为你的代码提供一些灵活性。这些灵活性可以用来实现有助于代码可维护性的面向对象模式。Rust 也有像所有权这样不同于面向对象语言的功能。面向对象模式并不总是利用 Rust 优势的最好方式,但也是可用的选项。

    +

    接下来,让我们看看另一个提供了多样灵活性的 Rust 功能:模式。贯穿全书的模式,我们已经和它们打过照面了,但并没有见识过它们的全部本领。让我们开始探索吧!

    +

    模式与模式匹配

    +
    +

    ch19-00-patterns.md +
    +commit 6fce661a0938aa0da06526e7b8f98fd7e67a222f

    +
    +

    模式Patterns)是 Rust 中特殊的语法,它用来匹配类型中的结构,无论类型是简单还是复杂。结合使用模式和 match 表达式以及其他结构可以提供更多对程序控制流的支配权。模式由如下一些内容组合而成:

    +
      +
    • 字面值
    • +
    • 解构的数组、枚举、结构体或者元组
    • +
    • 变量
    • +
    • 通配符
    • +
    • 占位符
    • +
    +

    一些模式的例子包括x, (a, 3)Some(Color::Red)。在模式为有效的上下文中,这些部分描述了数据的形状。接着可以用其匹配值来决定程序是否拥有正确的数据来运行特定部分的代码。

    +

    我们通过将一些值与模式相比较来使用它。如果模式匹配这些值,我们对值部分进行相应处理。回忆一下第六章讨论 match 表达式时像硬币分类器那样使用模式。如果数据符合这个形状,就可以使用这些命名的片段。如果不符合,与该模式相关的代码则不会运行。

    +

    本章是所有模式相关内容的参考。我们将涉及到使用模式的有效位置,refutableirrefutable 模式的区别,和你可能会见到的不同类型的模式语法。在最后,你将会看到如何使用模式创建强大而简洁的代码。

    +

    所有可能会用到模式的位置

    +
    +

    ch19-01-all-the-places-for-patterns.md +
    +commit 0c2d41e2afce734825c3a12087d423e8c2f0ae53

    +
    +

    模式出现在 Rust 的很多地方。你已经在不经意间使用了很多模式!本部分是一个所有有效模式位置的参考。

    +

    match 分支

    +

    如第六章所讨论的,一个模式常用的位置是 match 表达式的分支。在形式上 match 表达式由 match 关键字、用于匹配的值和一个或多个分支构成,这些分支包含一个模式和在值匹配分支的模式时运行的表达式:

    +
    match VALUE {
    +    PATTERN => EXPRESSION,
    +    PATTERN => EXPRESSION,
    +    PATTERN => EXPRESSION,
    +}
    +
    +

    例如这是一个来自示例 6-5 中匹配变量 xOption<i32> 值的 match 表达式:

    +
    match x {
    +    None => None,
    +    Some(i) => Some(i + 1),
    +}
    +

    这个 match 表达式中的模式为每个箭头左边的 NoneSome(i)

    +

    match 表达式必须是 穷尽exhaustive)的,意为 match 表达式所有可能的值都必须被考虑到。一个确保覆盖每个可能值的方法是在最后一个分支使用捕获所有的模式:比如,一个匹配任何值的名称永远也不会失败,因此可以覆盖所有匹配剩下的情况。

    +

    有一个特定的模式 _ 可以匹配所有情况,不过它从不绑定任何变量。这在例如希望忽略任何未指定值的情况很有用。本章之后的 “忽略模式中的值” 部分会详细介绍 _ 模式的更多细节。

    +

    if let 条件表达式

    +

    第六章讨论过了 if let 表达式,以及它是如何主要用于编写等同于只关心一个情况的 match 语句简写的。if let 可以对应一个可选的带有代码的 elseif let 中的模式不匹配时运行。

    +

    示例 19-1 展示了也可以组合并匹配 if letelse ifelse if let 表达式。这相比 match 表达式一次只能将一个值与模式比较提供了更多灵活性。并且 Rust 并不要求一系列 if letelse ifelse if let 分支的条件相互关联。

    +

    示例 19-1 中的代码展示了一系列针对不同条件的检查来决定背景颜色应该是什么。为了达到这个例子的目的,我们创建了硬编码值的变量,在真实程序中则可能由询问用户获得。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let favorite_color: Option<&str> = None;
    +    let is_tuesday = false;
    +    let age: Result<u8, _> = "34".parse();
    +
    +    if let Some(color) = favorite_color {
    +        println!("Using your favorite color, {color}, as the background");
    +    } else if is_tuesday {
    +        println!("Tuesday is green day!");
    +    } else if let Ok(age) = age {
    +        if age > 30 {
    +            println!("Using purple as the background color");
    +        } else {
    +            println!("Using orange as the background color");
    +        }
    +    } else {
    +        println!("Using blue as the background color");
    +    }
    +}
    +

    示例 19-1: 结合 if letelse ifelse if let 以及 else

    +

    如果用户指定了中意的颜色,将使用其作为背景颜色。如果没有指定中意的颜色且今天是星期二,背景颜色将是绿色。如果用户指定了他们的年龄字符串并能够成功将其解析为数字的话,我们将根据这个数字使用紫色或者橙色。最后,如果没有一个条件符合,背景颜色将是蓝色。

    +

    这个条件结构允许我们支持复杂的需求。使用这里硬编码的值,例子会打印出 Using purple as the background color

    +

    注意 if let 也可以像 match 分支那样引入覆盖变量:if let Ok(age) = age 引入了一个新的覆盖变量 age,它包含 Ok 成员中的值。这意味着 if age > 30 条件需要位于这个代码块内部;不能将两个条件组合为 if let Ok(age) = age && age > 30,因为我们希望与 30 进行比较的被覆盖的 age 直到大括号开始的新作用域才是有效的。

    +

    if let 表达式的缺点在于其穷尽性没有为编译器所检查,而 match 表达式则检查了。如果去掉最后的 else 块而遗漏处理一些情况,编译器也不会警告这类可能的逻辑错误。

    +

    while let 条件循环

    +

    一个与 if let 结构类似的是 while let 条件循环,它允许只要模式匹配就一直进行 while 循环。我们在第十七章第一次见到 while let 循环,当时我们使用它在流还在产生新值的时候保持循环。同理在示例 19-2 展示了一个 while let 循环等待跨线程发送的消息,不过在这个示例中它检查一个 Result 而不是 Option

    +
    fn main() {
    +    let (tx, rx) = std::sync::mpsc::channel();
    +    std::thread::spawn(move || {
    +        for val in [1, 2, 3] {
    +            tx.send(val).unwrap();
    +        }
    +    });
    +
    +    while let Ok(value) = rx.recv() {
    +        println!("{value}");
    +    }
    +}
    +

    示例 19-2: 使用 while let 循环只要 rx.recv() 返回 Ok 就打印出其值

    +

    这个例子会打印出 1、2 和 3。当在第十六章遇到 recv 时,我们直接 unwrap 了错误,或者使用 for 循环将其视为迭代器处理。不过如示例 19-2 所示,我们也可以使用 while let,因为 recv 方法只要发送端持续产生消息它就一直返回 Ok,并在发送端断开连接后产生一个 Err

    +

    for 循环

    +

    for 循环中,模式是 for 关键字直接跟随的值,正如 for x in y 中的 x。示例 19-3 中展示了如何使用 for 循环来解构,或拆开一个元组作为 for 循环的一部分:

    +
    fn main() {
    +    let v = vec!['a', 'b', 'c'];
    +
    +    for (index, value) in v.iter().enumerate() {
    +        println!("{value} is at index {index}");
    +    }
    +}
    +

    列表 19-3: 在 for 循环中使用模式来解构元组

    +

    示例 19-3 的代码会打印出:

    +
    $ cargo run
    +   Compiling patterns v0.1.0 (file:///projects/patterns)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.52s
    +     Running `target/debug/patterns`
    +a is at index 0
    +b is at index 1
    +c is at index 2
    +
    +

    这里使用 enumerate 方法适配一个迭代器来产生一个值和其在迭代器中的索引,它们位于一个元组中。第一个产生的值是元组 (0, 'a')。当这个值匹配模式 (index, value)index 将会是 0 而 value 将会是 'a',并打印出第一行输出。

    +

    let 语句

    +

    在本章之前,我们只明确的讨论过通过 matchif let 使用模式,不过事实上也在别的地方使用过模式,包括 let 语句。例如,考虑一下这个直白的 let 变量赋值:

    +
    #![allow(unused)]
    +fn main() {
    +let x = 5;
    +}
    +

    不过你可能没有发觉,每一次像这样使用 let 语句就是在使用模式!let 语句更为正式的样子如下:

    +
    let PATTERN = EXPRESSION;
    +
    +

    let x = 5; 这样的语句中变量名位于 PATTERN 位置,变量名不过是形式特别朴素的模式。我们将表达式与模式比较,并为任何找到的名称赋值。所以例如 let x = 5; 的情况,x 是一个代表 “将匹配到的值绑定到变量 x” 的模式。同时因为名称 x 是整个模式,这个模式实际上等于 “将任何值绑定到变量 x,不管值是什么”。

    +

    为了更清楚的理解 let 的模式匹配方面的内容,考虑示例 19-4 中使用 let 和模式解构一个元组:

    +
    fn main() {
    +    let (x, y, z) = (1, 2, 3);
    +}
    +

    示例 19-4: 使用模式解构元组并一次创建三个变量

    +

    这里将一个元组与模式匹配。Rust 会比较值 (1, 2, 3) 与模式 (x, y, z) 并发现此值匹配这个模式。在这个例子中,将会把 1 绑定到 x2 绑定到 y 并将 3 绑定到 z。你可以将这个元组模式看作是将三个独立的变量模式结合在一起。

    +

    如果模式中元素的数量不匹配元组中元素的数量,则整个类型不匹配,并会得到一个编译时错误。例如,示例 19-5 展示了尝试用两个变量解构三个元素的元组,这是不行的:

    +
    fn main() {
    +    let (x, y) = (1, 2, 3);
    +}
    +

    示例 19-5: 一个错误的模式结构,其中变量的数量不符合元组中元素的数量

    +

    尝试编译这段代码会给出如下类型错误:

    +
    $ cargo run
    +   Compiling patterns v0.1.0 (file:///projects/patterns)
    +error[E0308]: mismatched types
    + --> src/main.rs:2:9
    +  |
    +2 |     let (x, y) = (1, 2, 3);
    +  |         ^^^^^^   --------- this expression has type `({integer}, {integer}, {integer})`
    +  |         |
    +  |         expected a tuple with 3 elements, found one with 2 elements
    +  |
    +  = note: expected tuple `({integer}, {integer}, {integer})`
    +             found tuple `(_, _)`
    +
    +For more information about this error, try `rustc --explain E0308`.
    +error: could not compile `patterns` (bin "patterns") due to 1 previous error
    +
    +

    为了修复这个错误,可以使用 _.. 来忽略元组中一个或多个值,如 “忽略模式中的值” 部分所示。如果问题是模式中有太多的变量,则解决方法是通过去掉变量使得变量数与元组中元素数相等。

    +

    函数参数

    +

    函数参数也可以是模式。列表 19-6 中的代码声明了一个叫做 foo 的函数,它获取一个 i32 类型的参数 x,现在这看起来应该很熟悉:

    +
    fn foo(x: i32) {
    +    // code goes here
    +}
    +
    +fn main() {}
    +

    列表 19-6: 在参数中使用模式的函数签名

    +

    x 部分就是一个模式!类似于之前对 let 所做的,可以在函数参数中匹配元组。列表 19-7 将传递给函数的元组拆分为值:

    +

    文件名:src/main.rs

    +
    fn print_coordinates(&(x, y): &(i32, i32)) {
    +    println!("Current location: ({x}, {y})");
    +}
    +
    +fn main() {
    +    let point = (3, 5);
    +    print_coordinates(&point);
    +}
    +

    列表 19-7: 一个在参数中解构元组的函数

    +

    这会打印出 Current location: (3, 5)。值 &(3, 5) 会匹配模式 &(x, y),如此 x 得到了值 3,而 y得到了值 5

    +

    因为如第十三章所讲闭包类似于函数,也可以在闭包参数列表中使用模式。

    +

    现在我们见过了很多使用模式的方式了,不过模式在每个使用它的地方并不以相同的方式工作;在一些地方,模式必须是 irrefutable 的,意味着它们必须匹配所提供的任何值。在另一些情况,它们则可以是 refutable 的。接下来让我们讨论这两个概念。

    +

    Refutability(可反驳性): 模式是否会匹配失效

    +
    +

    ch19-02-refutability.md +
    +commit 0c2d41e2afce734825c3a12087d423e8c2f0ae53

    +
    +

    模式有两种形式:refutable(可反驳的)和 irrefutable(不可反驳的)。能匹配任何传递的可能值的模式被称为是 不可反驳的irrefutable)。一个例子就是 let x = 5; 语句中的 x,因为 x 可以匹配任何值所以不可能会失败。对某些可能的值进行匹配会失败的模式被称为是 可反驳的refutable)。一个这样的例子便是 if let Some(x) = a_value 表达式中的 Some(x);如果变量 a_value 中的值是 None 而不是 Some,那么 Some(x) 模式不能匹配。

    +

    函数参数、let 语句和 for 循环只能接受不可反驳的模式,因为当值不匹配时,程序无法进行有意义的操作。if letwhile let 表达式可以接受可反驳和不可反驳的模式,但编译器会对不可反驳的模式发出警告,因为根据定义它们旨在处理可能的失败:条件表达式的功能在于它能够根据成功或失败来执行不同的操作。

    +

    通常我们无需担心可反驳和不可反驳模式的区别,不过确实需要熟悉可反驳性的概念,这样当在错误信息中看到时就知道如何应对。遇到这些情况,根据代码行为的意图,需要修改模式或者使用模式的结构。

    +

    让我们看看一个尝试在 Rust 要求不可反驳模式的地方使用可反驳模式以及相反情况的例子。在示例 18-8 中,有一个 let 语句,不过模式被指定为可反驳模式 Some(x)。如你所见,这不能编译:

    +
    fn main() {
    +    let some_option_value: Option<i32> = None;
    +    let Some(x) = some_option_value;
    +}
    +

    示例 18-8: 尝试在 let 中使用可反驳模式

    +

    如果 some_option_value 的值是 None,其不会成功匹配模式 Some(x),表明这个模式是可反驳的。然而,因为 let 对于 None 匹配不能产生任何合法的代码,所以 let 语句只能接受不可反驳模式。Rust 会在编译时抱怨我们尝试在要求不可反驳模式的地方使用可反驳模式:

    +
    $ cargo run
    +   Compiling patterns v0.1.0 (file:///projects/patterns)
    +error[E0005]: refutable pattern in local binding
    + --> src/main.rs:3:9
    +  |
    +3 |     let Some(x) = some_option_value;
    +  |         ^^^^^^^ pattern `None` not covered
    +  |
    +  = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
    +  = note: for more information, visit https://doc.rust-lang.org/book/ch19-02-refutability.html
    +  = note: the matched value is of type `Option<i32>`
    +help: you might want to use `let else` to handle the variant that isn't matched
    +  |
    +3 |     let Some(x) = some_option_value else { todo!() };
    +  |                                     ++++++++++++++++
    +
    +For more information about this error, try `rustc --explain E0005`.
    +error: could not compile `patterns` (bin "patterns") due to 1 previous error
    +
    +

    因为我们没有覆盖(也不可能覆盖!)到模式 Some(x) 的每一个可能的值,所以 Rust 会合理地抗议。

    +

    为了修复在需要不可反驳模式的地方使用可反驳模式的情况,可以修改使用模式的代码:不同于使用 let,可以使用 if let。如此,如果模式不匹配,大括号中的代码将被忽略,其余代码保持有效。示例 18-9 展示了如何修复示例 18-8 中的代码。

    +
    fn main() {
    +    let some_option_value: Option<i32> = None;
    +    if let Some(x) = some_option_value {
    +        println!("{x}");
    +    }
    +}
    +

    示例 18-9: 使用 if let 和一个带有可反驳模式的代码块来代替 let

    +

    我们给了代码一个得以继续的出路!虽然我们没办法在避免产生错误的情况下使用不可反驳模式,但这段使用可反驳模式的代码是完全有效的。如果为 if let 提供了一个总是会匹配的模式,比如示例 18-10 中的 x,编译器会给出一个警告:

    +
    fn main() {
    +    if let x = 5 {
    +        println!("{x}");
    +    };
    +}
    +

    示例 18-10: 尝试把不可反驳模式用到 if let

    +

    Rust 会抱怨将不可反驳模式用于 if let 是没有意义的:

    +
    $ cargo run
    +   Compiling patterns v0.1.0 (file:///projects/patterns)
    +warning: irrefutable `if let` pattern
    + --> src/main.rs:2:8
    +  |
    +2 |     if let x = 5 {
    +  |        ^^^^^^^^^
    +  |
    +  = note: this pattern will always match, so the `if let` is useless
    +  = help: consider replacing the `if let` with a `let`
    +  = note: `#[warn(irrefutable_let_patterns)]` on by default
    +
    +warning: `patterns` (bin "patterns") generated 1 warning
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.39s
    +     Running `target/debug/patterns`
    +5
    +
    +

    基于此,match匹配分支必须使用可反驳模式,除了最后一个分支需要使用能匹配任何剩余值的不可反驳模式。Rust 允许我们在只有一个匹配分支的match中使用不可反驳模式,不过这么做不是特别有用,并可以被更简单的 let 语句替代。

    +

    目前我们已经讨论了所有可以使用模式的地方,以及可反驳模式与不可反驳模式的区别,下面让我们一起去把可以用来创建模式的语法过目一遍吧。

    +

    所有的模式语法

    +
    +

    ch19-03-pattern-syntax.md +
    +commit 6fce661a0938aa0da06526e7b8f98fd7e67a222f

    +
    +

    在本节中,我们收集了模式中所有有效的语法,并讨论为什么以及何时你可能要使用这些语法。

    +

    匹配字面值

    +

    如第六章所示,可以直接匹配字面值模式。如下代码给出了一些例子:

    +
    fn main() {
    +    let x = 1;
    +
    +    match x {
    +        1 => println!("one"),
    +        2 => println!("two"),
    +        3 => println!("three"),
    +        _ => println!("anything"),
    +    }
    +}
    +

    这段代码会打印 one 因为 x 的值是 1。如果希望代码获得特定的具体值,则该语法很有用。

    +

    匹配命名变量

    +

    命名变量是匹配任何值的不可反驳模式,这在之前已经使用过数次。然而当其用于 match 表达式时情况会有些复杂。因为 match 会开始一个新作用域,match 表达式中作为模式的一部分声明的变量会覆盖 match 结构之外的同名变量,与所有变量一样。在示例 18-11 中,声明了一个值为 Some(5) 的变量 x 和一个值为 10 的变量 y。接着在值 x 上创建了一个 match 表达式。观察匹配分支中的模式和结尾的 println!,并在运行此代码或进一步阅读之前推断这段代码会打印什么。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x = Some(5);
    +    let y = 10;
    +
    +    match x {
    +        Some(50) => println!("Got 50"),
    +        Some(y) => println!("Matched, y = {y}"),
    +        _ => println!("Default case, x = {x:?}"),
    +    }
    +
    +    println!("at the end: x = {x:?}, y = {y}");
    +}
    +

    示例 18-11: 一个 match 语句其中一个分支引入了覆盖变量 y

    +

    让我们看看当 match 语句运行的时候发生了什么。第一个匹配分支的模式并不匹配 x 中定义的值,所以代码继续执行。

    +

    第二个匹配分支中的模式引入了一个新变量 y,它会匹配任何 Some 中的值。因为我们在 match 表达式的新作用域中,这是一个新变量,而不是开头声明为值 10 的那个 y。这个新的 y 绑定会匹配任何 Some 中的值,在这里是 x 中的值。因此这个 y 绑定了 xSome 内部的值。这个值是 5,所以这个分支的表达式将会执行并打印出 Matched, y = 5

    +

    如果 x 的值是 None 而不是 Some(5),头两个分支的模式不会匹配,所以会匹配下划线。这个分支的模式中没有引入变量 x,所以此时表达式中的 x 会是外部没有被覆盖的 x。在这个假想的例子中,match 将会打印 Default case, x = None

    +

    一旦 match 表达式执行完毕,其作用域也就结束了,同理内部 y 的作用域也结束了。最后的 println! 会打印 at the end: x = Some(5), y = 10

    +

    为了创建能够比较外部 xy 的值,而不引入覆盖变量的 match 表达式,我们需要相应地使用带有条件的匹配守卫(match guard)。我们稍后将在 “匹配守卫提供的额外条件” 这一小节讨论匹配守卫。

    +

    多个模式

    +

    match 表达式中,可以使用 | 语法匹配多个模式,它代表 or)运算符模式。例如,如下代码将 x 的值与匹配分支相比较,第一个分支有 选项,意味着如果 x 的值匹配此分支的任一个值,它就会运行:

    +
    fn main() {
    +    let x = 1;
    +
    +    match x {
    +        1 | 2 => println!("one or two"),
    +        3 => println!("three"),
    +        _ => println!("anything"),
    +    }
    +}
    +

    上面的代码会打印 one or two

    +

    通过 ..= 匹配值的范围

    +

    ..= 语法允许你匹配一个闭区间范围内的值。在如下代码中,当模式匹配任何在给定范围内的值时,该分支会执行:

    +
    fn main() {
    +    let x = 5;
    +
    +    match x {
    +        1..=5 => println!("one through five"),
    +        _ => println!("something else"),
    +    }
    +}
    +

    如果 x 是 1、2、3、4 或 5,第一个分支就会匹配。这个语法在匹配多个值时相比使用 | 运算符来表达相同的意思更为方便;如果使用 | 则不得不指定 1 | 2 | 3 | 4 | 5。相反指定范围就简短的多,特别是在希望匹配比如从 1 到 1000 的数字的时候!

    +

    编译器会在编译时检查范围不为空,而 char 和数字值是 Rust 仅有的可以判断范围是否为空的类型,所以范围只允许用于数字或 char 值。

    +

    如下是一个使用 char 类型值范围的例子:

    +
    fn main() {
    +    let x = 'c';
    +
    +    match x {
    +        'a'..='j' => println!("early ASCII letter"),
    +        'k'..='z' => println!("late ASCII letter"),
    +        _ => println!("something else"),
    +    }
    +}
    +

    Rust 知道 'c' 位于第一个模式的范围内,并会打印出 early ASCII letter

    +

    解构并分解值

    +

    也可以使用模式来解构结构体、枚举和元组,以便使用这些值的不同部分。让我们来分别看一看。

    +

    解构结构体

    +

    示例 18-12 展示带有两个字段 xy 的结构体 Point,可以通过带有模式的 let 语句将其分解:

    +

    文件名:src/main.rs

    +
    struct Point {
    +    x: i32,
    +    y: i32,
    +}
    +
    +fn main() {
    +    let p = Point { x: 0, y: 7 };
    +
    +    let Point { x: a, y: b } = p;
    +    assert_eq!(0, a);
    +    assert_eq!(7, b);
    +}
    +

    示例 18-12: 解构一个结构体的字段为单独的变量

    +

    这段代码创建了变量 ab 来匹配结构体 p 中的 xy 字段。这个例子展示了模式中的变量名不必与结构体中的字段名一致。不过通常希望变量名与字段名一致以便于理解变量来自于哪些字段。因为变量名匹配字段名是常见的,同时因为 let Point { x: x, y: y } = p; 包含了很多重复,所以对于匹配结构体字段的模式存在简写:只需列出结构体字段的名称,则模式创建的变量会有相同的名称。示例 18-13 展示了与示例 18-12 有着相同行为的代码,不过 let 模式创建的变量为 xy 而不是 ab

    +

    文件名:src/main.rs

    +
    struct Point {
    +    x: i32,
    +    y: i32,
    +}
    +
    +fn main() {
    +    let p = Point { x: 0, y: 7 };
    +
    +    let Point { x, y } = p;
    +    assert_eq!(0, x);
    +    assert_eq!(7, y);
    +}
    +

    示例 18-13: 使用结构体字段简写来解构结构体字段

    +

    这段代码创建了变量 xy,与变量 p 中的 xy 相匹配。其结果是变量 xy 包含结构体 p 中的值。

    +

    也可以使用字面值作为结构体模式的一部分进行解构,而不是为所有的字段创建变量。这允许我们测试一些字段为特定值的同时创建其他字段的变量。

    +

    示例 18-14 展示了一个 match 语句将 Point 值分成了三种情况:直接位于 x 轴上(此时 y = 0 为真)、位于 y 轴上(x = 0)或不在任何轴上的点。

    +

    文件名:src/main.rs

    +
    struct Point {
    +    x: i32,
    +    y: i32,
    +}
    +
    +fn main() {
    +    let p = Point { x: 0, y: 7 };
    +
    +    match p {
    +        Point { x, y: 0 } => println!("On the x axis at {x}"),
    +        Point { x: 0, y } => println!("On the y axis at {y}"),
    +        Point { x, y } => {
    +            println!("On neither axis: ({x}, {y})");
    +        }
    +    }
    +}
    +

    示例 18-14: 解构和匹配模式中的字面值

    +

    第一个分支通过指定字段 y 匹配字面值 0 来匹配任何位于 x 轴上的点。此模式仍然创建了变量 x 以便在分支的代码中使用。

    +

    类似的,第二个分支通过指定字段 x 匹配字面值 0 来匹配任何位于 y 轴上的点,并为字段 y 创建了变量 y。第三个分支没有指定任何字面值,所以其会匹配任何其他的 Point 并为 xy 两个字段创建变量。

    +

    在这个例子中,值 p 因为其 x 包含 0 而匹配第二个分支,因此会打印出 On the y axis at 7

    +

    记住 match 表达式一旦找到一个匹配的模式就会停止检查其它分支,所以即使 Point { x: 0, y: 0}x 轴上也在 y 轴上,这些代码也只会打印 On the x axis at 0

    +

    解构枚举

    +

    本书之前曾经解构过枚举(例如第六章示例 6-5),不过当时没有明确提到解构枚举的模式需要对应枚举所定义的储存数据的方式。让我们以示例 6-2 中的 Message 枚举为例,编写一个 match 使用模式解构每一个内部值,如示例 18-15 所示:

    +

    文件名:src/main.rs

    +
    enum Message {
    +    Quit,
    +    Move { x: i32, y: i32 },
    +    Write(String),
    +    ChangeColor(i32, i32, i32),
    +}
    +
    +fn main() {
    +    let msg = Message::ChangeColor(0, 160, 255);
    +
    +    match msg {
    +        Message::Quit => {
    +            println!("The Quit variant has no data to destructure.");
    +        }
    +        Message::Move { x, y } => {
    +            println!("Move in the x direction {x} and in the y direction {y}");
    +        }
    +        Message::Write(text) => {
    +            println!("Text message: {text}");
    +        }
    +        Message::ChangeColor(r, g, b) => {
    +            println!("Change the color to red {r}, green {g}, and blue {b}")
    +        }
    +    }
    +}
    +

    示例 18-15: 解构包含不同类型值成员的枚举

    +

    这段代码会打印出 Change the color to red 0, green 160, and blue 255。尝试改变 msg 的值来观察其他分支代码的运行。

    +

    对于像 Message::Quit 这样没有任何数据的枚举成员,不能进一步解构其值。只能匹配其字面值 Message::Quit,因此模式中没有任何变量。

    +

    对于像 Message::Move 这样的类结构体枚举成员,可以采用类似于匹配结构体的模式。在成员名称后,使用大括号并列出字段变量以便将其分解以供此分支的代码使用。这里使用了示例 18-13 所展示的简写。

    +

    对于像 Message::Write 这样的包含一个元素,以及像 Message::ChangeColor 这样包含三个元素的类元组枚举成员,其模式则类似于用于解构元组的模式。模式中变量的数量必须与成员中元素的数量一致。

    +

    解构嵌套的结构体和枚举

    +

    目前为止,所有的例子都只匹配了深度为一级的结构体或枚举,不过当然也可以匹配嵌套的项!例如,我们可以重构列表 18-15 的代码在 ChangeColor 消息中同时支持 RGB 和 HSV 色彩模式,如示例 18-16 所示:

    +
    enum Color {
    +    Rgb(i32, i32, i32),
    +    Hsv(i32, i32, i32),
    +}
    +
    +enum Message {
    +    Quit,
    +    Move { x: i32, y: i32 },
    +    Write(String),
    +    ChangeColor(Color),
    +}
    +
    +fn main() {
    +    let msg = Message::ChangeColor(Color::Hsv(0, 160, 255));
    +
    +    match msg {
    +        Message::ChangeColor(Color::Rgb(r, g, b)) => {
    +            println!("Change color to red {r}, green {g}, and blue {b}");
    +        }
    +        Message::ChangeColor(Color::Hsv(h, s, v)) => {
    +            println!("Change color to hue {h}, saturation {s}, value {v}")
    +        }
    +        _ => (),
    +    }
    +}
    +

    示例 18-16: 匹配嵌套的枚举

    +

    match 表达式第一个分支的模式匹配一个包含 Color::Rgb 枚举成员的 Message::ChangeColor 枚举成员,然后模式绑定了 3 个内部的 i32 值。第二个分支的模式也匹配一个 Message::ChangeColor 枚举成员,但是其内部的枚举会匹配 Color::Hsv 枚举成员。我们可以在一个 match 表达式中指定这些复杂条件,即使会涉及到两个枚举。

    +

    解构结构体和元组

    +

    甚至可以用复杂的方式来混合、匹配和嵌套解构模式。如下是一个复杂结构体的例子,其中结构体和元组嵌套在元组中,并将所有的原始类型解构出来:

    +
    fn main() {
    +    struct Point {
    +        x: i32,
    +        y: i32,
    +    }
    +
    +    let ((feet, inches), Point { x, y }) = ((3, 10), Point { x: 3, y: -10 });
    +}
    +

    这将复杂的类型分解成部分组件以便可以单独使用我们感兴趣的值。

    +

    通过模式解构是一个方便利用部分值片段的手段,比如结构体中每个单独字段的值。

    +

    忽略模式中的值

    +

    有时忽略模式中的一些值是有用的,比如 match 中最后捕获全部情况的分支实际上没有做任何事,但是它确实对所有剩余情况负责。有一些简单的方法可以忽略模式中全部或部分值:使用 _ 模式(我们已经见过了),在另一个模式中使用 _ 模式,使用一个以下划线开始的名称,或者使用 .. 忽略所剩部分的值。让我们来分别探索如何以及为什么要这么做。

    +

    使用 _ 忽略整个值

    +

    我们已经使用过下划线作为匹配但不绑定任何值的通配符模式了。虽然这作为 match 表达式最后的分支特别有用,也可以将其用于任意模式,包括函数参数中,如示例 18-17 所示:

    +

    文件名:src/main.rs

    +
    fn foo(_: i32, y: i32) {
    +    println!("This code only uses the y parameter: {y}");
    +}
    +
    +fn main() {
    +    foo(3, 4);
    +}
    +

    示例 18-17: 在函数签名中使用 _

    +

    这段代码会完全忽略作为第一个参数传递的值 3,并会打印出 This code only uses the y parameter: 4

    +

    大部分情况当你不再需要特定函数参数时,最好修改签名不再包含无用的参数。在一些情况下忽略函数参数会变得特别有用,比如实现 trait 时,当你需要特定类型签名但是函数实现并不需要某个参数时。这样可以避免一个存在未使用的函数参数的编译警告,就跟使用命名参数一样。

    +

    使用嵌套的 _ 忽略部分值

    +

    也可以在一个模式内部使用_ 忽略部分值,例如,当只需要测试部分值但在期望运行的代码中没有用到其他部分时。示例 18-18 展示了负责管理设置值的代码。业务需求是用户不允许覆盖现有的自定义设置,但是可以取消设置,也可以在当前未设置时为其提供设置。

    +
    fn main() {
    +    let mut setting_value = Some(5);
    +    let new_setting_value = Some(10);
    +
    +    match (setting_value, new_setting_value) {
    +        (Some(_), Some(_)) => {
    +            println!("Can't overwrite an existing customized value");
    +        }
    +        _ => {
    +            setting_value = new_setting_value;
    +        }
    +    }
    +
    +    println!("setting is {setting_value:?}");
    +}
    +

    示例 18-18: 当不需要 Some 中的值时在模式内使用下划线来匹配 Some 成员

    +

    这段代码会打印出 Can't overwrite an existing customized value 接着是 setting is Some(5)。在第一个匹配分支,我们不需要匹配或使用任一个 Some 成员中的值;重要的部分是需要测试 setting_valuenew_setting_value 都为 Some 成员的情况。在这种情况,我们打印出为何不改变 setting_value,并且不会改变它。

    +

    对于所有其他情况(setting_valuenew_setting_value 任一为 None),这由第二个分支的 _ 模式体现,这时确实希望允许 new_setting_value 变为 setting_value

    +

    也可以在一个模式中的多处使用下划线来忽略特定值,如示例 18-19 所示,这里忽略了一个五元元组中的第二和第四个值:

    +
    fn main() {
    +    let numbers = (2, 4, 8, 16, 32);
    +
    +    match numbers {
    +        (first, _, third, _, fifth) => {
    +            println!("Some numbers: {first}, {third}, {fifth}")
    +        }
    +    }
    +}
    +

    示例 18-19: 忽略元组的多个部分

    +

    这会打印出 Some numbers: 2, 8, 32,值 4 和 16 会被忽略。

    +

    通过在名字前以一个 _ 开头来忽略未使用的变量

    +

    如果你创建了一个变量却不在任何地方使用它,Rust 通常会给你一个警告,因为未使用的变量可能会是个 bug。但是有时创建一个还未使用的变量是有用的,比如你正在设计原型或刚刚开始一个项目。这时你希望告诉 Rust 不要警告未使用的变量,为此可以用下划线作为变量名的开头。示例 18-20 中创建了两个未使用变量,不过当编译代码时只会得到其中一个的警告:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let _x = 5;
    +    let y = 10;
    +}
    +

    示例 18-20: 以下划线开始变量名以便去掉未使用变量警告

    +

    这里得到了警告说未使用变量 y,不过没有警告说使用 _x

    +

    注意,只使用 _ 和使用以下划线开头的名称有些微妙的不同:比如 _x 仍会将值绑定到变量,而 _ 则完全不会绑定。为了展示这个区别的意义,示例 18-21 会产生一个错误。

    +
    fn main() {
    +    let s = Some(String::from("Hello!"));
    +
    +    if let Some(_s) = s {
    +        println!("found a string");
    +    }
    +
    +    println!("{s:?}");
    +}
    +

    示例 18-21: 以下划线开头的未使用变量仍然会绑定值,它可能会获取值的所有权

    +

    我们会得到一个错误,因为 s 的值仍然会移动进 _s,并阻止我们再次使用 s。然而只使用下划线本身,并不会绑定值。示例 18-22 能够无错编译,因为 s 没有被移动进 _

    +
    fn main() {
    +    let s = Some(String::from("Hello!"));
    +
    +    if let Some(_) = s {
    +        println!("found a string");
    +    }
    +
    +    println!("{s:?}");
    +}
    +

    示例 18-22: 单独使用下划线不会绑定值

    +

    上面的代码能很好的运行;因为没有把 s 绑定到任何变量;它没有被移动。

    +

    .. 忽略剩余值

    +

    对于有多个部分的值,可以使用 .. 语法来只使用特定部分并忽略其它值,同时避免不得不每一个忽略值列出下划线。.. 模式会忽略模式中剩余的任何没有显式匹配的值部分。在示例 18-23 中,有一个 Point 结构体存放了三维空间中的坐标。在 match 表达式中,我们希望只操作 x 坐标并忽略 yz 字段的值:

    +
    fn main() {
    +    struct Point {
    +        x: i32,
    +        y: i32,
    +        z: i32,
    +    }
    +
    +    let origin = Point { x: 0, y: 0, z: 0 };
    +
    +    match origin {
    +        Point { x, .. } => println!("x is {x}"),
    +    }
    +}
    +

    示例 18-23: 通过使用 .. 来忽略 Point 中除 x 以外的字段

    +

    这里列出了 x 值,接着仅仅包含了 .. 模式。这比不得不列出 y: _z: _ 要来得简单,特别是在处理有很多字段的结构体,但只涉及一到两个字段时的情形。

    +

    .. 会扩展为所需要的值的数量。示例 18-24 展示了元组中 .. 的应用:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let numbers = (2, 4, 8, 16, 32);
    +
    +    match numbers {
    +        (first, .., last) => {
    +            println!("Some numbers: {first}, {last}");
    +        }
    +    }
    +}
    +

    示例 18-24: 只匹配元组中的第一个和最后一个值并忽略掉所有其它值

    +

    这里用 firstlast 来匹配第一个和最后一个值。.. 将匹配并忽略中间的所有值。

    +

    然而使用 .. 必须是无歧义的。如果期望匹配和忽略的值是不明确的,Rust 会报错。示例 18-25 展示了一个带有歧义的 .. 例子,因此其不能编译:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let numbers = (2, 4, 8, 16, 32);
    +
    +    match numbers {
    +        (.., second, ..) => {
    +            println!("Some numbers: {second}")
    +        },
    +    }
    +}
    +

    示例 18-25: 尝试以有歧义的方式运用 ..

    +

    如果编译上面的例子,会得到下面的错误:

    +
    $ cargo run
    +   Compiling patterns v0.1.0 (file:///projects/patterns)
    +error: `..` can only be used once per tuple pattern
    + --> src/main.rs:5:22
    +  |
    +5 |         (.., second, ..) => {
    +  |          --          ^^ can only be used once per tuple pattern
    +  |          |
    +  |          previously used here
    +
    +error: could not compile `patterns` (bin "patterns") due to 1 previous error
    +
    +

    Rust 不可能决定在元组中匹配 second 值之前应该忽略多少个值,以及在之后忽略多少个值。这段代码可能表明我们意在忽略 2,绑定 second4,接着忽略 81632;抑或是意在忽略 24,绑定 second8,接着忽略 1632,以此类推。变量名 second 对于 Rust 来说并没有任何特殊意义,所以会得到编译错误,因为在这两个地方使用 .. 是有歧义的。

    +

    匹配守卫提供的额外条件

    +

    匹配守卫match guard)是一个指定于 match 分支模式之后的额外 if 条件,它也必须被满足才能选择此分支。匹配守卫用于表达比单独的模式所能允许的更为复杂的情况。

    +

    这个条件可以使用模式中创建的变量。示例 18-26 展示了一个 match,其中第一个分支有模式 Some(x) 还有匹配守卫 if x % 2 == 0 (当 x 是偶数的时候为真):

    +
    fn main() {
    +    let num = Some(4);
    +
    +    match num {
    +        Some(x) if x % 2 == 0 => println!("The number {x} is even"),
    +        Some(x) => println!("The number {x} is odd"),
    +        None => (),
    +    }
    +}
    +

    示例 18-26: 在模式中加入匹配守卫

    +

    上例会打印出 The number 4 is even。当 num 与模式中第一个分支比较时,因为 Some(4) 匹配 Some(x) 所以可以匹配。接着匹配守卫检查 x 除以 2 的余数是否等于 0,因为它等于 0,所以第一个分支被选择。

    +

    相反如果 numSome(5),因为 5 除以 2 的余数是 1 不等于 0 所以第一个分支的匹配守卫为假。接着 Rust 会前往第二个分支,这次匹配因为它没有匹配守卫所以会匹配任何 Some 成员。

    +

    无法在模式中表达类似 if x % 2 == 0 的条件,所以通过匹配守卫提供了表达类似逻辑的能力。这种替代表达方式的缺点是,编译器不会尝试为包含匹配守卫的模式检查穷尽性。

    +

    在示例 18-11 中,我们提到可以使用匹配守卫来解决模式中变量覆盖的问题,那里 match 表达式的模式中新建了一个变量而不是使用 match 之外的同名变量。新变量意味着不能够测试外部变量的值。示例 18-27 展示了如何使用匹配守卫修复这个问题。

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x = Some(5);
    +    let y = 10;
    +
    +    match x {
    +        Some(50) => println!("Got 50"),
    +        Some(n) if n == y => println!("Matched, n = {n}"),
    +        _ => println!("Default case, x = {x:?}"),
    +    }
    +
    +    println!("at the end: x = {x:?}, y = {y}");
    +}
    +

    示例 18-27: 使用匹配守卫来测试与外部变量的相等性

    +

    现在这会打印出 Default case, x = Some(5)。现在第二个匹配分支中的模式不会引入一个覆盖外部 y 的新变量 y,这意味着可以在匹配守卫中使用外部的 y。相比指定会覆盖外部 y 的模式 Some(y),这里指定为 Some(n)。此新建的变量 n 并没有覆盖任何值,因为 match 外部没有变量 n

    +

    匹配守卫 if n == y 并不是一个模式所以没有引入新变量。这个 y 正是 外部的 y 而不是新的覆盖变量 y,这样就可以通过比较 ny 来表达寻找一个与外部 y 相同的值的概念了。

    +

    也可以在匹配守卫中使用 运算符 | 来指定多个模式,同时匹配守卫的条件会作用于所有的模式。示例 18-28 展示了结合匹配守卫与使用了 | 的模式的优先级。这个例子中重要的部分是匹配守卫 if y 作用于 45 6,即使这看起来好像 if y 只作用于 6

    +
    fn main() {
    +    let x = 4;
    +    let y = false;
    +
    +    match x {
    +        4 | 5 | 6 if y => println!("yes"),
    +        _ => println!("no"),
    +    }
    +}
    +

    示例 18-28: 结合多个模式与匹配守卫

    +

    这个匹配条件表明此分支值匹配 x 值为 456 同时 ytrue 的情况。运行这段代码时会发生的是第一个分支的模式因 x4 而匹配,不过匹配守卫 if y 为假,所以第一个分支不会被选择。代码移动到第二个分支,这会匹配,此程序会打印出 no。这是因为 if 条件作用于整个 4 | 5 | 6 模式,而不仅是最后的值 6。换句话说,匹配守卫与模式的优先级关系看起来像这样:

    +
    (4 | 5 | 6) if y => ...
    +
    +

    而不是:

    +
    4 | 5 | (6 if y) => ...
    +
    +

    可以通过运行代码时的情况看出这一点:如果匹配守卫只作用于由 | 运算符指定的值列表的最后一个值,这个分支就会匹配且程序会打印出 yes

    +

    @ 绑定

    +

    at 运算符(@)允许我们在创建一个存放值的变量的同时测试其值是否匹配模式。示例 18-29 展示了一个例子,这里我们希望测试 Message::Helloid 字段是否位于 3..=7 范围内,同时也希望能将其值绑定到 id_variable 变量中以便此分支相关联的代码可以使用它。可以将 id_variable 命名为 id,与字段同名,不过出于示例的目的这里选择了不同的名称。

    +
    fn main() {
    +    enum Message {
    +        Hello { id: i32 },
    +    }
    +
    +    let msg = Message::Hello { id: 5 };
    +
    +    match msg {
    +        Message::Hello {
    +            id: id_variable @ 3..=7,
    +        } => println!("Found an id in range: {id_variable}"),
    +        Message::Hello { id: 10..=12 } => {
    +            println!("Found an id in another range")
    +        }
    +        Message::Hello { id } => println!("Found some other id: {id}"),
    +    }
    +}
    +

    示例 18-29: 使用 @ 在模式中绑定值的同时测试它

    +

    上例会打印出 Found an id in range: 5。通过在 3..=7 之前指定 id_variable @,我们捕获了任何匹配此范围的值并同时测试其值匹配这个范围模式。

    +

    第二个分支只在模式中指定了一个范围,分支相关代码没有一个包含 id 字段实际值的变量。id 字段的值可以是 10、11 或 12,不过这个模式的代码并不知情也不能使用 id 字段中的值,因为没有将 id 值保存进一个变量。

    +

    最后一个分支指定了一个没有范围的变量,此时确实拥有可以用于分支代码的变量 id,因为这里使用了结构体字段简写语法。不过此分支中没有像头两个分支那样对 id 字段的值进行测试:任何值都会匹配此分支。

    +

    使用 @ 可以在一个模式中同时测试和保存变量值。

    +

    总结

    +

    模式是 Rust 中一个很有用的功能,它有助于我们区分不同类型的数据。当用于 match 语句时,Rust 确保模式会包含每一个可能的值,否则程序将不能编译。let 语句和函数参数的模式使得这些结构更强大,可以在将值解构为更小部分的同时为变量赋值。可以创建简单或复杂的模式来满足我们的要求。

    +

    接下来,在本书倒数第二章中,我们将介绍一些 Rust 众多功能中较为高级的部分。

    +

    高级特征

    +
    +

    ch20-00-advanced-features.md +
    +commit a8536189d5f1ba2f0b1187bfae787c0d89e2871c

    +
    +

    现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十一章开始另一个新项目之前,让我们聊聊一些总有一天你会遇上的部分内容。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下很有用处。虽然很少会碰到它们,我们希望确保你了解 Rust 提供的所有功能。

    +

    本章将涉及如下内容:

    +
      +
    • 不安全 Rust:用于当需要舍弃 Rust 的某些保证并负责手动维持这些保证
    • +
    • 高级 trait:与 trait 相关的关联类型,默认类型参数,完全限定语法(fully qualified syntax),超(父)trait(supertraits)和 newtype 模式
    • +
    • 高级类型:关于 newtype 模式的更多内容,类型别名,never 类型和动态大小类型
    • +
    • 高级函数和闭包:函数指针和返回闭包
    • +
    • 宏:定义在编译时定义更多代码的方式
    • +
    +

    对所有人而言,这都是一个介绍 Rust 迷人特性的宝典!让我们翻开它吧!

    +

    不安全 Rust

    +
    +

    ch20-01-unsafe-rust.md +
    +commit 057b0d338229b87d06be772346ea0b643bdecdc5

    +
    +

    目前为止讨论过的代码都有 Rust 在编译时会强制执行的内存安全保证。然而,Rust 还隐藏有第二种语言,它不会强制执行这类内存安全保证:这被称为 不安全 Rustunsafe Rust)。它与常规 Rust 代码无异,但是会提供额外的超能力。

    +

    尽管代码可能没问题,但如果 Rust 编译器没有足够的信息可以确定,它将拒绝代码。

    +

    不安全 Rust 之所以存在,是因为静态分析本质上是保守的。当编译器尝试确定一段代码是否支持某个保证时,拒绝一些合法的程序比接受无效的程序要好一些。这必然意味着有时代码 可能 是合法的,但如果 Rust 编译器没有足够的信息来确定,它将拒绝该代码。在这种情况下,可以使用不安全代码告诉编译器,“相信我,我知道我在干什么。” 不过千万注意,使用不安全 Rust 风险自担:如果不安全代码出错了,比如解引用空指针,可能会导致不安全的内存使用。

    +

    另一个 Rust 存在不安全一面的原因是:底层计算机硬件固有的不安全性。如果 Rust 不允许进行不安全操作,那么有些任务则根本完成不了。Rust 需要能够进行像直接与操作系统交互,甚至于编写你自己的操作系统这样的底层系统编程!这也是 Rust 语言的目标之一。让我们看看不安全 Rust 能做什么,和怎么做。

    +

    不安全的超能力

    +

    可以通过 unsafe 关键字来切换到不安全 Rust,接着可以开启一个新的存放不安全代码的块。这里有五类可以在不安全 Rust 中进行而不能用于安全 Rust 的操作,它们称之为 “不安全的超能力。(unsafe superpowers)” 这些超能力是:

    +
      +
    • 解引用裸指针
    • +
    • 调用不安全的函数或方法
    • +
    • 访问或修改可变静态变量
    • +
    • 实现不安全 trait
    • +
    • 访问 union 的字段
    • +
    +

    有一点很重要,unsafe 并不会关闭借用检查器或禁用任何其他 Rust 安全检查:如果在不安全代码中使用引用,它仍会被检查。unsafe 关键字只是提供了那五个不会被编译器检查内存安全的功能。你仍然能在不安全块中获得某种程度的安全。

    +

    再者,unsafe 不意味着块中的代码就一定是危险的或者必然导致内存安全问题:其意图在于作为程序员你将会确保 unsafe 块中的代码以有效的方式访问内存。

    +

    人是会犯错误的,错误总会发生,不过通过要求这五类操作必须位于标记为 unsafe 的块中,就能够知道任何与内存安全相关的错误必定位于 unsafe 块内。保持 unsafe 块尽可能小,如此当之后调查内存 bug 时就会感谢你自己了。

    +

    为了尽可能隔离不安全代码,将不安全代码封装进一个安全的抽象并提供安全 API 是一个好主意,当我们学习不安全函数和方法时会讨论到。标准库的一部分被实现为在被评审过的不安全代码之上的安全抽象。这个技术防止了 unsafe 泄露到所有你或者用户希望使用由 unsafe 代码实现的功能的地方,因为使用其安全抽象是安全的。

    +

    让我们按顺序依次介绍上述五个超能力,同时我们会看到一些提供不安全代码的安全接口的抽象。

    +

    解引用裸指针

    +

    回到第四章的 “悬垂引用” 部分,那里提到了编译器会确保引用总是有效的。不安全 Rust 有两个被称为 裸指针raw pointers)的类似于引用的新类型。和引用一样,裸指针是不可变或可变的,分别写作 *const T*mut T。这里的星号不是解引用运算符;它是类型名称的一部分。在裸指针的上下文中,不可变 意味着指针解引用之后不能直接赋值。

    +

    裸指针与引用和智能指针的区别在于

    +
      +
    • 允许忽略借用规则,可以同时拥有不可变和可变的指针,或多个指向相同位置的可变指针
    • +
    • 不保证指向有效的内存
    • +
    • 允许为空
    • +
    • 不能实现任何自动清理功能
    • +
    +

    通过去掉 Rust 强加的保证,你可以放弃安全保证以换取性能或使用另一个语言或硬件接口的能力,此时 Rust 的保证并不适用。

    +

    示例 19-1 展示了如何从引用同时创建不可变和可变裸指针。

    +
    fn main() {
    +    let mut num = 5;
    +
    +    let r1 = &num as *const i32;
    +    let r2 = &mut num as *mut i32;
    +}
    +

    示例 19-1: 通过引用创建裸指针

    +

    注意这里没有引入 unsafe 关键字。可以在安全代码中 创建 裸指针,只是不能在不安全块之外 解引用 裸指针,稍后便会看到。

    +

    这里使用 as 将不可变和可变引用强转为对应的裸指针类型。因为直接从保证安全的引用来创建它们,可以知道这些特定的裸指针是有效,但是不能对任何裸指针做出如此假设。

    +

    作为展示接下来会创建一个不能确定其有效性的裸指针,示例 19-2 展示了如何创建一个指向任意内存地址的裸指针。尝试使用任意内存是未定义行为:此地址可能有数据也可能没有,编译器可能会优化掉这个内存访问,或者程序可能会出现段错误(segmentation fault)。通常没有好的理由编写这样的代码,不过却是可行的:

    +
    fn main() {
    +    let address = 0x012345usize;
    +    let r = address as *const i32;
    +}
    +

    示例 19-2: 创建指向任意内存地址的裸指针

    +

    记得我们说过可以在安全代码中创建裸指针,不过不能 解引用 裸指针和读取其指向的数据。现在我们要做的就是对裸指针使用解引用运算符 *,这需要一个 unsafe 块,如示例 19-3 所示:

    +
    fn main() {
    +    let mut num = 5;
    +
    +    let r1 = &num as *const i32;
    +    let r2 = &mut num as *mut i32;
    +
    +    unsafe {
    +        println!("r1 is: {}", *r1);
    +        println!("r2 is: {}", *r2);
    +    }
    +}
    +

    示例 19-3: 在 unsafe 块中解引用裸指针

    +

    创建一个指针不会造成任何危险;只有当访问其指向的值时才有可能遇到无效的值。

    +

    还需注意示例 19-1 和 19-3 中创建了同时指向相同内存位置 num 的裸指针 *const i32*mut i32。相反如果尝试同时创建 num 的不可变和可变引用,将无法通过编译,因为 Rust 的所有权规则不允许在拥有任何不可变引用的同时再创建一个可变引用。通过裸指针,就能够同时创建同一地址的可变指针和不可变指针,若通过可变指针修改数据,则可能潜在造成数据竞争。请多加小心!

    +

    既然存在这么多的危险,为何还要使用裸指针呢?一个主要的应用场景便是调用 C 代码接口,这在下一部分 “调用不安全函数或方法” 中会讲到。另一个场景是构建借用检查器无法理解的安全抽象。让我们先介绍不安全函数,接着看一看使用不安全代码的安全抽象的例子。

    +

    调用不安全函数或方法

    +

    第二类可以在不安全块中进行的操作是调用不安全函数。不安全函数和方法与常规函数方法十分类似,除了其开头有一个额外的 unsafe。在此上下文中,关键字unsafe表示该函数具有调用时需要满足的要求,而 Rust 不会保证满足这些要求。通过在 unsafe 块中调用不安全函数,表明我们已经阅读过此函数的文档并对其是否满足函数自身的契约负责。

    +

    如下是一个没有做任何操作的不安全函数 dangerous 的例子:

    +
    fn main() {
    +    unsafe fn dangerous() {}
    +
    +    unsafe {
    +        dangerous();
    +    }
    +}
    +

    必须在一个单独的 unsafe 块中调用 dangerous 函数。如果尝试不使用 unsafe 块调用 dangerous,则会得到一个错误:

    +
    $ cargo run
    +   Compiling unsafe-example v0.1.0 (file:///projects/unsafe-example)
    +error[E0133]: call to unsafe function `dangerous` is unsafe and requires unsafe function or block
    + --> src/main.rs:4:5
    +  |
    +4 |     dangerous();
    +  |     ^^^^^^^^^^^ call to unsafe function
    +  |
    +  = note: consult the function's documentation for information on how to avoid undefined behavior
    +
    +For more information about this error, try `rustc --explain E0133`.
    +error: could not compile `unsafe-example` (bin "unsafe-example") due to 1 previous error
    +
    +

    通过 unsafe 块,我们向 Rust 保证了我们已经阅读过函数的文档,理解如何正确使用,并验证过其满足函数的契约。

    +

    不安全函数体也是有效的 unsafe 块,所以在不安全函数中进行另一个不安全操作时无需新增额外的 unsafe 块。

    +

    创建不安全代码的安全抽象

    +

    仅仅因为函数包含不安全代码并不意味着整个函数都需要标记为不安全的。事实上,将不安全代码封装进安全函数是一个常见的抽象。作为一个例子,了解一下标准库中的函数 split_at_mut,它需要一些不安全代码,让我们探索如何可以实现它。这个安全函数定义于可变 slice 之上:它获取一个 slice 并从给定的索引参数开始将其分为两个 slice。split_at_mut 的用法如示例 19-4 所示:

    +
    fn main() {
    +    let mut v = vec![1, 2, 3, 4, 5, 6];
    +
    +    let r = &mut v[..];
    +
    +    let (a, b) = r.split_at_mut(3);
    +
    +    assert_eq!(a, &mut [1, 2, 3]);
    +    assert_eq!(b, &mut [4, 5, 6]);
    +}
    +

    示例 19-4: 使用安全的 split_at_mut 函数

    +

    这个函数无法只通过安全 Rust 实现。一个尝试可能看起来像示例 19-5,它不能编译。出于简单考虑,我们将 split_at_mut 实现为函数而不是方法,并只处理 i32 值而非泛型 T 的 slice。

    +
    fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) {
    +    let len = values.len();
    +
    +    assert!(mid <= len);
    +
    +    (&mut values[..mid], &mut values[mid..])
    +}
    +
    +fn main() {
    +    let mut vector = vec![1, 2, 3, 4, 5, 6];
    +    let (left, right) = split_at_mut(&mut vector, 3);
    +}
    +

    示例 19-5: 尝试只使用安全 Rust 来实现 split_at_mut

    +

    此函数首先获取 slice 的长度,然后通过检查参数是否小于或等于这个长度来断言参数所给定的索引位于 slice 当中。该断言意味着如果传入的索引比要分割的 slice 的索引更大,此函数在尝试使用这个索引前 panic。

    +

    之后我们在一个元组中返回两个可变的 slice:一个从原始 slice 的开头直到 mid 索引,另一个从 mid 直到原 slice 的结尾。

    +

    如果尝试编译示例 19-5 的代码,会得到一个错误:

    +
    $ cargo run
    +   Compiling unsafe-example v0.1.0 (file:///projects/unsafe-example)
    +error[E0499]: cannot borrow `*values` as mutable more than once at a time
    + --> src/main.rs:6:31
    +  |
    +1 | fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) {
    +  |                         - let's call the lifetime of this reference `'1`
    +...
    +6 |     (&mut values[..mid], &mut values[mid..])
    +  |     --------------------------^^^^^^--------
    +  |     |     |                   |
    +  |     |     |                   second mutable borrow occurs here
    +  |     |     first mutable borrow occurs here
    +  |     returning this value requires that `*values` is borrowed for `'1`
    +  |
    +  = help: use `.split_at_mut(position)` to obtain two mutable non-overlapping sub-slices
    +
    +For more information about this error, try `rustc --explain E0499`.
    +error: could not compile `unsafe-example` (bin "unsafe-example") due to 1 previous error
    +
    +

    Rust 的借用检查器不能理解我们要借用这个 slice 的两个不同部分:它只知道我们借用了同一个 slice 两次。本质上借用 slice 的不同部分是可以的,因为结果两个 slice 不会重叠,不过 Rust 还没有智能到能够理解这些。当我们知道某些事是可以的而 Rust 不知道的时候,就是触及不安全代码的时候了

    +

    示例 19-6 展示了如何使用 unsafe 块,裸指针和一些不安全函数调用来实现 split_at_mut

    +
    use std::slice;
    +
    +fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) {
    +    let len = values.len();
    +    let ptr = values.as_mut_ptr();
    +
    +    assert!(mid <= len);
    +
    +    unsafe {
    +        (
    +            slice::from_raw_parts_mut(ptr, mid),
    +            slice::from_raw_parts_mut(ptr.add(mid), len - mid),
    +        )
    +    }
    +}
    +
    +fn main() {
    +    let mut vector = vec![1, 2, 3, 4, 5, 6];
    +    let (left, right) = split_at_mut(&mut vector, 3);
    +}
    +

    示例 19-6: 在 split_at_mut 函数的实现中使用不安全代码

    +

    回忆第四章的 “Slice 类型” 部分,slice 是一个指向一些数据的指针,并带有该 slice 的长度。可以使用 len 方法获取 slice 的长度,使用 as_mut_ptr 方法访问 slice 的裸指针。在这个例子中,因为有一个 i32 值的可变 slice,as_mut_ptr 返回一个 *mut i32 类型的裸指针,储存在 ptr 变量中。

    +

    我们保持索引 mid 位于 slice 中的断言。接着是不安全代码:slice::from_raw_parts_mut 函数获取一个裸指针和一个长度来创建一个 slice。这里使用此函数从 ptr 中创建了一个有 mid 个项的 slice。之后在 ptr 上调用 add 方法并使用 mid 作为参数来获取一个从 mid 开始的裸指针,使用这个裸指针并以 mid 之后项的数量为长度创建一个 slice。

    +

    slice::from_raw_parts_mut 函数是不安全的因为它获取一个裸指针,并必须确信这个指针是有效的。裸指针上的 add 方法也是不安全的,因为其必须确信此地址偏移量也是有效的指针。因此必须将 slice::from_raw_parts_mutadd 放入 unsafe 块中以便能调用它们。通过观察代码,和增加 mid 必然小于等于 len 的断言,我们可以说 unsafe 块中所有的裸指针将是有效的 slice 中数据的指针。这是一个可以接受的 unsafe 的恰当用法。

    +

    注意无需将 split_at_mut 函数的结果标记为 unsafe,并可以在安全 Rust 中调用此函数。我们创建了一个不安全代码的安全抽象,其代码以一种安全的方式使用了 unsafe 代码,因为其只从这个函数访问的数据中创建了有效的指针。

    +

    与此相对,示例 19-7 中的 slice::from_raw_parts_mut 在使用 slice 时很有可能会崩溃。这段代码获取任意内存地址并创建了一个长为一万的 slice:

    +
    fn main() {
    +    use std::slice;
    +
    +    let address = 0x01234usize;
    +    let r = address as *mut i32;
    +
    +    let values: &[i32] = unsafe { slice::from_raw_parts_mut(r, 10000) };
    +}
    +

    示例 19-7: 通过任意内存地址创建 slice

    +

    我们并不拥有这个任意地址的内存,也不能保证这段代码创建的 slice 包含有效的 i32 值。试图使用臆测为有效的 values 会导致未定义的行为。

    +

    使用 extern 函数调用外部代码

    +

    有时你的 Rust 代码可能需要与其他语言编写的代码交互。为此 Rust 有一个关键字,extern,有助于创建和使用 外部函数接口Foreign Function Interface,FFI)。外部函数接口是一个编程语言用以定义函数的方式,其允许不同(外部)编程语言调用这些函数。

    +

    示例 19-8 展示了如何集成 C 标准库中的 abs 函数。extern 块中声明的函数在 Rust 代码中总是不安全的。因为其他语言不会强制执行 Rust 的规则且 Rust 无法检查它们,所以确保其安全是程序员的责任:

    +

    文件名:src/main.rs

    +
    extern "C" {
    +    fn abs(input: i32) -> i32;
    +}
    +
    +fn main() {
    +    unsafe {
    +        println!("Absolute value of -3 according to C: {}", abs(-3));
    +    }
    +}
    +

    示例 19-8: 声明并调用另一个语言中定义的 extern 函数

    +

    extern "C" 块中,列出了我们希望能够调用的另一个语言中的外部函数的签名和名称。"C" 部分定义了外部函数所使用的 应用二进制接口application binary interface,ABI) —— ABI 定义了如何在汇编语言层面调用此函数。"C" ABI 是最常见的,并遵循 C 编程语言的 ABI。

    +
    +

    从其它语言调用 Rust 函数

    +

    也可以使用 extern 来创建一个允许其他语言调用 Rust 函数的接口。不同于创建整个 extern 块,就在 fn 关键字之前增加 extern 关键字并为相关函数指定所用到的 ABI。还需增加 #[no_mangle] 注解来告诉 Rust 编译器不要 mangle 此函数的名称。Mangling 发生于当编译器将我们指定的函数名修改为不同的名称时,这会增加用于其他编译过程的额外信息,不过会使其名称更难以阅读。每一个编程语言的编译器都会以稍微不同的方式 mangle 函数名,所以为了使 Rust 函数能在其他语言中指定,必须禁用 Rust 编译器的 name mangling。

    +

    在如下的例子中,一旦其编译为动态库并从 C 语言中链接,call_from_c 函数就能够在 C 代码中访问:

    +
    #![allow(unused)]
    +fn main() {
    +#[no_mangle]
    +pub extern "C" fn call_from_c() {
    +    println!("Just called a Rust function from C!");
    +}
    +}
    +

    extern 的使用无需 unsafe

    +
    +

    访问或修改可变静态变量

    +

    目前为止全书都尽量避免讨论 全局变量global variables),Rust 确实支持它们,不过这对于 Rust 的所有权规则来说是有问题的。如果有两个线程访问相同的可变全局变量,则可能会造成数据竞争。

    +

    全局变量在 Rust 中被称为 静态static)变量。示例 19-9 展示了一个拥有字符串 slice 值的静态变量的声明和应用:

    +

    文件名:src/main.rs

    +
    static HELLO_WORLD: &str = "Hello, world!";
    +
    +fn main() {
    +    println!("name is: {HELLO_WORLD}");
    +}
    +

    示例 19-9: 定义和使用一个不可变静态变量

    +

    静态(static)变量类似于第三章 “变量和常量的区别” 部分讨论的常量。通常静态变量的名称采用 SCREAMING_SNAKE_CASE 写法。静态变量只能储存拥有 'static 生命周期的引用,这意味着 Rust 编译器可以自己计算出其生命周期而无需显式标注。访问不可变静态变量是安全的。

    +

    常量与不可变静态变量的一个微妙的区别是静态变量中的值有一个固定的内存地址。使用这个值总是会访问相同的地址。另一方面,常量则允许在任何被用到的时候复制其数据。另一个区别在于静态变量可以是可变的。访问和修改可变静态变量都是 不安全 的。示例 19-10 展示了如何声明、访问和修改名为 COUNTER 的可变静态变量:

    +

    文件名:src/main.rs

    +
    static mut COUNTER: u32 = 0;
    +
    +fn add_to_count(inc: u32) {
    +    unsafe {
    +        COUNTER += inc;
    +    }
    +}
    +
    +fn main() {
    +    add_to_count(3);
    +
    +    unsafe {
    +        println!("COUNTER: {COUNTER}");
    +    }
    +}
    +

    示例 19-10: 读取或修改一个可变静态变量是不安全的

    +

    就像常规变量一样,我们使用 mut 关键来指定可变性。任何读写 COUNTER 的代码都必须位于 unsafe 块中。这段代码可以编译并如期打印出 COUNTER: 3,因为这是单线程的。拥有多个线程访问 COUNTER 则可能导致数据竞争。

    +

    拥有可以全局访问的可变数据,难以保证不存在数据竞争,这就是为何 Rust 认为可变静态变量是不安全的。任何可能的情况,请优先使用第十六章讨论的并发技术和线程安全智能指针,这样编译器就能检测不同线程间的数据访问是否是安全的。

    +

    实现不安全 trait

    +

    unsafe 的另一个操作用例是实现不安全 trait。当 trait 中至少有一个方法中包含编译器无法验证的不变式(invariant)时 trait 是不安全的。可以在 trait 之前增加 unsafe 关键字将 trait 声明为 unsafe,同时 trait 的实现也必须标记为 unsafe,如示例 19-11 所示:

    +
    unsafe trait Foo {
    +    // methods go here
    +}
    +
    +unsafe impl Foo for i32 {
    +    // method implementations go here
    +}
    +
    +fn main() {}
    +

    示例 19-11: 定义并实现不安全 trait

    +

    通过 unsafe impl,我们承诺将保证编译器所不能验证的不变量。

    +

    作为一个例子,回忆第十六章 “使用 SyncSend trait 的可扩展并发” 部分中的 SyncSend 标记 trait,编译器会自动为完全由 SendSync 类型组成的类型自动实现它们。如果实现了一个包含一些不是 SendSync 的类型,比如裸指针,并希望将此类型标记为 SendSync,则必须使用 unsafe。Rust 不能验证我们的类型保证可以安全的跨线程发送或在多线程间访问,所以需要我们自己进行检查并通过 unsafe 表明。

    +

    访问联合体中的字段

    +

    仅适用于 unsafe 的最后一个操作是访问 联合体 中的字段,unionstruct 类似,但是在一个实例中同时只能使用一个声明的字段。联合体主要用于和 C 代码中的联合体交互。访问联合体的字段是不安全的,因为 Rust 无法保证当前存储在联合体实例中数据的类型。可以查看 参考 Rust 文档 了解有关联合体的更多信息。

    +

    何时使用不安全代码

    +

    使用 unsafe 来进行这五个操作(超能力)之一是没有问题的,甚至是不需要深思熟虑的,不过使得 unsafe 代码正确也实属不易,因为编译器不能帮助保证内存安全。当有理由使用 unsafe 代码时,是可以这么做的,通过使用显式的 unsafe 标注可以更容易地在错误发生时追踪问题的源头。

    +

    高级 trait

    +
    +

    ch20-03-advanced-traits.md +
    +commit 95e931170404cb98d476b19017cbbdbc00d0834d

    +
    +

    第十章 “trait:定义共同行为” 部分,我们第一次涉及到了 trait,不过我们并没有覆盖一些较为高级的细节。现在我们更加了解 Rust 了,可以深入理解其本质了。

    +

    关联类型在 trait 定义中指定占位符类型

    +

    关联类型associated types)让我们可以在 trait 里面增加一个待定义的类型(类型占位符),将类型占位符与 trait 相关联,这样 trait 的方法签名中就可以使用这些占位符类型。trait 的实现者在实现这个 trait 的时候,会指定一个具体类型,来替换掉这个占位符。这样,我们可以在一个 trait 中通过占位符使用不同类型,在实现此 trait 时才需要指定这些类型具体是什么。

    +

    我们之前提到,本章所描述的大部分内容都较少使用。关联类型则比较适中;它们比本书其他的内容要少见,不过比本章中的很多内容要更常见。

    +

    一个带有关联类型的 trait 的例子是标准库提供的 Iterator trait。它有一个叫做 Item 的关联类型来替代遍历的值的类型。Iterator trait 的定义如示例 19-12 所示:

    +
    pub trait Iterator {
    +    type Item;
    +
    +    fn next(&mut self) -> Option<Self::Item>;
    +}
    +

    示例 19-12: Iterator trait 的定义中带有关联类型 Item

    +

    Item 是一个占位符类型,同时 next 方法的定义表明它返回 Option<Self::Item> 类型的值。这个 trait 的实现者会指定 Item 的具体类型,无论实现者指定何种类型,next 方法都会返回一个包含了此具体类型值的 Option

    +

    关联类型看起来有点像泛型:后者允许定义一个函数时,暂不指定其可以处理的类型。为了体现这两者的区别,请看下面的例子。 +这个例子为 Counter 结构体实现了 Iterator trait,其中指定 Item 的类型为 u32

    +

    文件名:src/lib.rs

    +
    struct Counter {
    +    count: u32,
    +}
    +
    +impl Counter {
    +    fn new() -> Counter {
    +        Counter { count: 0 }
    +    }
    +}
    +
    +impl Iterator for Counter {
    +    type Item = u32;
    +
    +    fn next(&mut self) -> Option<Self::Item> {
    +        // --snip--
    +        if self.count < 5 {
    +            self.count += 1;
    +            Some(self.count)
    +        } else {
    +            None
    +        }
    +    }
    +}
    +

    这个语法类似于泛型。那么为什么 Iterator trait 不像下面示例 19-13 那样,使用泛型来定义呢?

    +
    pub trait Iterator<T> {
    +    fn next(&mut self) -> Option<T>;
    +}
    +

    示例 19-13: 一个使用泛型的 Iterator trait 假想定义

    +

    区别在于当如示例 19-13 那样使用泛型时,则不得不在每一个实现中标注类型。这是因为我们也可以实现为 Iterator<String> for Counter,或任何其他类型,这样就可以有多个 CounterIterator 的实现。换句话说,当 trait 有泛型参数时,可以多次实现这个 trait,每次需改变泛型参数的具体类型。接着当使用 Counternext 方法时,必须提供类型注解来表明希望使用 Iterator 的哪一个实现。

    +

    有了关联类型,在实现时就无需标注类型,因为不能多次实现这个 trait。对于示例 19-12 使用关联类型的定义,我们只能选择一次 Item 会是什么类型,因为只能有一个 impl Iterator for Counter。当调用 Counternext 时不必每次指定我们需要 u32 值的迭代器。

    +

    关联类型也会成为 trait 契约的一部分:trait 的实现必须提供一个类型来替代关联类型占位符。关联类型通常以它的用途来命名,并且我们最好在 API 文档中为关联类型编写文档。

    +

    默认泛型类型参数和运算符重载

    +

    当使用泛型类型参数时,可以为泛型指定一个默认的具体类型。如果默认类型就足够的话,这消除了为具体类型实现 trait 的需要。为泛型类型指定默认类型的语法是在声明泛型类型时使用 <PlaceholderType=ConcreteType>

    +

    这种情况的一个非常好的例子是使用 运算符重载Operator overloading),这是指在特定情况下自定义运算符(比如 +)行为的操作。

    +

    Rust 并不允许创建自定义运算符或重载任意运算符,不过 std::ops 中所列出的运算符和相应的 trait 可以通过实现运算符相关 trait 来重载。例如,示例 19-14 中展示了如何在 Point 结构体上实现 Add trait 来重载 + 运算符,这样就可以将两个 Point 实例相加了:

    +

    文件名:src/main.rs

    +
    use std::ops::Add;
    +
    +#[derive(Debug, Copy, Clone, PartialEq)]
    +struct Point {
    +    x: i32,
    +    y: i32,
    +}
    +
    +impl Add for Point {
    +    type Output = Point;
    +
    +    fn add(self, other: Point) -> Point {
    +        Point {
    +            x: self.x + other.x,
    +            y: self.y + other.y,
    +        }
    +    }
    +}
    +
    +fn main() {
    +    assert_eq!(
    +        Point { x: 1, y: 0 } + Point { x: 2, y: 3 },
    +        Point { x: 3, y: 3 }
    +    );
    +}
    +

    示例 19-14: 实现 Add trait 重载 Point 实例的 + 运算符

    +

    add 方法将两个 Point 实例的 x 值和 y 值分别相加来创建一个新的 PointAdd trait 有一个叫做 Output 的关联类型,它用来决定 add 方法的返回值类型。

    +

    这里默认泛型类型位于 Add trait 中。这里是其定义:

    +
    #![allow(unused)]
    +fn main() {
    +trait Add<Rhs=Self> {
    +    type Output;
    +
    +    fn add(self, rhs: Rhs) -> Self::Output;
    +}
    +}
    +

    这些代码看来应该很熟悉,这是一个带有一个方法和一个关联类型的 trait。比较陌生的部分是尖括号中的 Rhs=Self:这个语法叫做 默认类型参数default type parameters)。Rhs 是一个泛型类型参数(“right hand side” 的缩写),它用于定义 add 方法中的 rhs 参数。如果实现 Add trait 时不指定 Rhs 的具体类型,Rhs 的类型将是默认的 Self 类型,也就是在其上实现 Add 的类型。

    +

    当为 Point 实现 Add 时,使用了默认的 Rhs,因为我们希望将两个 Point 实例相加。让我们看看一个实现 Add trait 时希望自定义 Rhs 类型而不是使用默认类型的例子。

    +

    这里有两个存放不同单元值的结构体,MillimetersMeters。(这种将现有类型简单封装进另一个结构体的方式被称为 newtype 模式newtype pattern,之后的 “为了类型安全和抽象而使用 newtype 模式” 部分会详细介绍。)我们希望能够将毫米值与米值相加,并让 Add 的实现正确处理转换。可以为 Millimeters 实现 Add 并以 Meters 作为 Rhs,如示例 19-15 所示。

    +

    文件名:src/lib.rs

    +
    use std::ops::Add;
    +
    +struct Millimeters(u32);
    +struct Meters(u32);
    +
    +impl Add<Meters> for Millimeters {
    +    type Output = Millimeters;
    +
    +    fn add(self, other: Meters) -> Millimeters {
    +        Millimeters(self.0 + (other.0 * 1000))
    +    }
    +}
    +

    示例 19-15: 在 Millimeters 上实现 Add,以便能够将 MillimetersMeters 相加

    +

    为了使 MillimetersMeters 能够相加,我们指定 impl Add<Meters> 来设定 Rhs 类型参数的值而不是使用默认的 Self

    +

    默认参数类型主要用于如下两个方面:

    +
      +
    • 扩展类型而不破坏现有代码。
    • +
    • 在大部分用户都不需要的特定情况进行自定义。
    • +
    +

    标准库的 Add trait 就是一个第二个目的例子:大部分时候你会将两个相似的类型相加,不过它提供了自定义额外行为的能力。在 Add trait 定义中使用默认类型参数意味着大部分时候无需指定额外的参数。换句话说,一小部分实现的样板代码是不必要的,这样使用 trait 就更容易了。

    +

    第一个目的是相似的,但过程是反过来的:如果需要为现有 trait 增加类型参数,为其提供一个默认类型将允许我们在不破坏现有实现代码的基础上扩展 trait 的功能。

    +

    完全限定语法与消歧义:调用相同名称的方法

    +

    Rust 既不能避免一个 trait 与另一个 trait 拥有相同名称的方法,也不能阻止为同一类型同时实现这两个 trait。甚至直接在类型上实现开始已经有的同名方法也是可能的!

    +

    不过,当调用这些同名方法时,需要告诉 Rust 我们希望使用哪一个。考虑一下示例 19-16 中的代码,这里定义了 trait PilotWizard 都拥有方法 fly。接着在一个本身已经实现了名为 fly 方法的类型 Human 上实现这两个 trait。每一个 fly 方法都进行了不同的操作:

    +

    文件名:src/main.rs

    +
    trait Pilot {
    +    fn fly(&self);
    +}
    +
    +trait Wizard {
    +    fn fly(&self);
    +}
    +
    +struct Human;
    +
    +impl Pilot for Human {
    +    fn fly(&self) {
    +        println!("This is your captain speaking.");
    +    }
    +}
    +
    +impl Wizard for Human {
    +    fn fly(&self) {
    +        println!("Up!");
    +    }
    +}
    +
    +impl Human {
    +    fn fly(&self) {
    +        println!("*waving arms furiously*");
    +    }
    +}
    +
    +fn main() {}
    +

    示例 19-16: 两个 trait 定义为拥有 fly 方法,并在直接定义有 fly 方法的 Human 类型上实现这两个 trait

    +

    当调用 Human 实例的 fly 时,编译器默认调用直接实现在类型上的方法,如示例 19-17 所示。

    +

    文件名:src/main.rs

    +
    trait Pilot {
    +    fn fly(&self);
    +}
    +
    +trait Wizard {
    +    fn fly(&self);
    +}
    +
    +struct Human;
    +
    +impl Pilot for Human {
    +    fn fly(&self) {
    +        println!("This is your captain speaking.");
    +    }
    +}
    +
    +impl Wizard for Human {
    +    fn fly(&self) {
    +        println!("Up!");
    +    }
    +}
    +
    +impl Human {
    +    fn fly(&self) {
    +        println!("*waving arms furiously*");
    +    }
    +}
    +
    +fn main() {
    +    let person = Human;
    +    person.fly();
    +}
    +

    示例 19-17: 调用 Human 实例的 fly

    +

    运行这段代码会打印出 *waving arms furiously*,这表明 Rust 调用了直接实现在 Human 上的 fly 方法。

    +

    为了能够调用 Pilot trait 或 Wizard trait 的 fly 方法,我们需要使用更明显的语法以便能指定我们指的是哪个 fly 方法。这个语法展示在示例 19-18 中:

    +

    文件名:src/main.rs

    +
    trait Pilot {
    +    fn fly(&self);
    +}
    +
    +trait Wizard {
    +    fn fly(&self);
    +}
    +
    +struct Human;
    +
    +impl Pilot for Human {
    +    fn fly(&self) {
    +        println!("This is your captain speaking.");
    +    }
    +}
    +
    +impl Wizard for Human {
    +    fn fly(&self) {
    +        println!("Up!");
    +    }
    +}
    +
    +impl Human {
    +    fn fly(&self) {
    +        println!("*waving arms furiously*");
    +    }
    +}
    +
    +fn main() {
    +    let person = Human;
    +    Pilot::fly(&person);
    +    Wizard::fly(&person);
    +    person.fly();
    +}
    +

    示例 19-18: 指定我们希望调用哪一个 trait 的 fly 方法

    +

    在方法名前指定 trait 名向 Rust 澄清了我们希望调用哪个 fly 实现。也可以选择写成 Human::fly(&person),这等同于示例 19-18 中的 person.fly(),不过如果无需消歧义的话这么写就有点长了。

    +

    运行这段代码会打印出:

    +
    $ cargo run
    +   Compiling traits-example v0.1.0 (file:///projects/traits-example)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.46s
    +     Running `target/debug/traits-example`
    +This is your captain speaking.
    +Up!
    +*waving arms furiously*
    +
    +

    因为 fly 方法获取一个 self 参数,如果有两个 类型 都实现了同一 trait,Rust 可以根据 self 的类型计算出应该使用哪一个 trait 实现。

    +

    然而,不是方法的关联函数没有 self 参数。当存在多个类型或者 trait 定义了相同函数名的非方法函数时,Rust 就不总是能计算出我们期望的是哪一个类型,除非使用 完全限定语法fully qualified syntax)。例如示例 19-19 中的创建了一个希望将所有小狗叫做 Spot 的动物收容所的 trait。Animal trait 有一个关联非方法函数 baby_name。结构体 Dog 实现了 Animal,同时又直接提供了关联非方法函数 baby_name

    +

    文件名:src/main.rs

    +
    trait Animal {
    +    fn baby_name() -> String;
    +}
    +
    +struct Dog;
    +
    +impl Dog {
    +    fn baby_name() -> String {
    +        String::from("Spot")
    +    }
    +}
    +
    +impl Animal for Dog {
    +    fn baby_name() -> String {
    +        String::from("puppy")
    +    }
    +}
    +
    +fn main() {
    +    println!("A baby dog is called a {}", Dog::baby_name());
    +}
    +

    示例 19-19: 一个带有关联函数的 trait 和一个带有同名关联函数并实现了此 trait 的类型

    +

    Dog 上定义的关联函数 baby_name 的实现代码将所有的小狗起名为 Spot。Dog 类型还实现了 Animal trait,它描述了所有动物的共有的特征。小狗被称为 puppy,这表现为 DogAnimal trait 实现中与 Animal trait 相关联的函数 baby_name

    +

    main 调用了 Dog::baby_name 函数,它直接调用了定义于 Dog 之上的关联函数。这段代码会打印出:

    +
    $ cargo run
    +   Compiling traits-example v0.1.0 (file:///projects/traits-example)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.54s
    +     Running `target/debug/traits-example`
    +A baby dog is called a Spot
    +
    +

    这并不是我们需要的。我们希望调用的是 DogAnimal trait 实现那部分的 baby_name 函数,这样能够打印出 A baby dog is called a puppy。示例 19-18 中用到的技术在这并不管用;如果将 main 改为示例 19-20 中的代码,则会得到一个编译错误:

    +

    文件名:src/main.rs

    +
    trait Animal {
    +    fn baby_name() -> String;
    +}
    +
    +struct Dog;
    +
    +impl Dog {
    +    fn baby_name() -> String {
    +        String::from("Spot")
    +    }
    +}
    +
    +impl Animal for Dog {
    +    fn baby_name() -> String {
    +        String::from("puppy")
    +    }
    +}
    +
    +fn main() {
    +    println!("A baby dog is called a {}", Animal::baby_name());
    +}
    +

    示例 19-20: 尝试调用 Animal trait 的 baby_name 函数,不过 Rust 并不知道该使用哪一个实现

    +

    因为 Animal::baby_name 没有 self 参数,同时这可能会有其它类型实现了 Animal trait,Rust 无法计算出所需的是哪一个 Animal::baby_name 实现。我们会得到这个编译错误:

    +
    $ cargo run
    +   Compiling traits-example v0.1.0 (file:///projects/traits-example)
    +error[E0790]: cannot call associated function on trait without specifying the corresponding `impl` type
    +  --> src/main.rs:20:43
    +   |
    +2  |     fn baby_name() -> String;
    +   |     ------------------------- `Animal::baby_name` defined here
    +...
    +20 |     println!("A baby dog is called a {}", Animal::baby_name());
    +   |                                           ^^^^^^^^^^^^^^^^^^^ cannot call associated function of trait
    +   |
    +help: use the fully-qualified path to the only available implementation
    +   |
    +20 |     println!("A baby dog is called a {}", <Dog as Animal>::baby_name());
    +   |                                           +++++++       +
    +
    +For more information about this error, try `rustc --explain E0790`.
    +error: could not compile `traits-example` (bin "traits-example") due to 1 previous error
    +
    +

    为了消歧义并告诉 Rust 我们希望使用的是 DogAnimal 实现而不是其它类型的 Animal 实现,需要使用 完全限定语法,这是调用函数时最为明确的方式。示例 19-21 展示了如何使用完全限定语法:

    +

    文件名:src/main.rs

    +
    trait Animal {
    +    fn baby_name() -> String;
    +}
    +
    +struct Dog;
    +
    +impl Dog {
    +    fn baby_name() -> String {
    +        String::from("Spot")
    +    }
    +}
    +
    +impl Animal for Dog {
    +    fn baby_name() -> String {
    +        String::from("puppy")
    +    }
    +}
    +
    +fn main() {
    +    println!("A baby dog is called a {}", <Dog as Animal>::baby_name());
    +}
    +

    示例 19-21: 使用完全限定语法来指定我们希望调用的是 DogAnimal trait 实现中的 baby_name 函数

    +

    我们在尖括号中向 Rust 提供了类型注解,并通过在此函数调用中将 Dog 类型当作 Animal 对待,来指定希望调用的是 DogAnimal trait 实现中的 baby_name 函数。现在这段代码会打印出我们期望的数据:

    +
    $ cargo run
    +   Compiling traits-example v0.1.0 (file:///projects/traits-example)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s
    +     Running `target/debug/traits-example`
    +A baby dog is called a puppy
    +
    +

    通常,完全限定语法定义为:

    +
    <Type as Trait>::function(receiver_if_method, next_arg, ...);
    +

    对于不是方法的关联函数,其没有一个 receiver,故只会有其他参数的列表。可以选择在任何函数或方法调用处使用完全限定语法。然而,允许省略任何 Rust 能够从程序中的其他信息中计算出的部分。只有当存在多个同名实现而 Rust 需要帮助以便知道我们希望调用哪个实现时,才需要使用这个较为冗长的语法。

    +

    父 trait 用于在另一个 trait 中使用某 trait 的功能

    +

    有时我们可能会需要编写一个依赖另一个 trait 的 trait 定义:对于一个实现了第一个 trait 的类型,你希望要求这个类型也实现了第二个 trait。如此就可使 trait 定义使用第二个 trait 的关联项。这个所需的 trait 是我们实现的 trait 的 父(超)traitsupertrait)。

    +

    例如我们希望创建一个带有 outline_print 方法的 trait OutlinePrint,它会将给定的值格式化为带有星号框。也就是说,给定一个实现了标准库 Display trait 的并返回 (x, y)Point,当调用以 1 作为 x3 作为 yPoint 实例的 outline_print 会显示如下:

    +
    **********
    +*        *
    +* (1, 3) *
    +*        *
    +**********
    +
    +

    outline_print 的实现中,因为希望能够使用 Display trait 的功能,则需要说明 OutlinePrint 只能用于同时也实现了 Display 并提供了 OutlinePrint 需要的功能的类型。可以通过在 trait 定义中指定 OutlinePrint: Display 来做到这一点。这类似于为 trait 增加 trait bound。示例 19-22 展示了一个 OutlinePrint trait 的实现:

    +

    文件名:src/main.rs

    +
    use std::fmt;
    +
    +trait OutlinePrint: fmt::Display {
    +    fn outline_print(&self) {
    +        let output = self.to_string();
    +        let len = output.len();
    +        println!("{}", "*".repeat(len + 4));
    +        println!("*{}*", " ".repeat(len + 2));
    +        println!("* {output} *");
    +        println!("*{}*", " ".repeat(len + 2));
    +        println!("{}", "*".repeat(len + 4));
    +    }
    +}
    +
    +fn main() {}
    +

    示例 19-22: 实现 OutlinePrint trait,它要求来自 Display 的功能

    +

    因为指定了 OutlinePrint 需要 Display trait,则可以在 outline_print 中使用 to_string,其会为任何实现 Display 的类型自动实现。如果不在 trait 名后增加 : Display 并尝试在 outline_print 中使用 to_string,则会得到一个错误说在当前作用域中没有找到用于 &Self 类型的方法 to_string

    +

    让我们看看如果尝试在一个没有实现 Display 的类型上实现 OutlinePrint 会发生什么,比如 Point 结构体:

    +

    文件名:src/main.rs

    +
    use std::fmt;
    +
    +trait OutlinePrint: fmt::Display {
    +    fn outline_print(&self) {
    +        let output = self.to_string();
    +        let len = output.len();
    +        println!("{}", "*".repeat(len + 4));
    +        println!("*{}*", " ".repeat(len + 2));
    +        println!("* {output} *");
    +        println!("*{}*", " ".repeat(len + 2));
    +        println!("{}", "*".repeat(len + 4));
    +    }
    +}
    +
    +struct Point {
    +    x: i32,
    +    y: i32,
    +}
    +
    +impl OutlinePrint for Point {}
    +
    +fn main() {
    +    let p = Point { x: 1, y: 3 };
    +    p.outline_print();
    +}
    +

    这样会得到一个错误说 Display 是必须的而未被实现:

    +
    $ cargo run
    +   Compiling traits-example v0.1.0 (file:///projects/traits-example)
    +error[E0277]: `Point` doesn't implement `std::fmt::Display`
    +  --> src/main.rs:20:23
    +   |
    +20 | impl OutlinePrint for Point {}
    +   |                       ^^^^^ `Point` cannot be formatted with the default formatter
    +   |
    +   = help: the trait `std::fmt::Display` is not implemented for `Point`
    +   = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
    +note: required by a bound in `OutlinePrint`
    +  --> src/main.rs:3:21
    +   |
    +3  | trait OutlinePrint: fmt::Display {
    +   |                     ^^^^^^^^^^^^ required by this bound in `OutlinePrint`
    +
    +error[E0277]: `Point` doesn't implement `std::fmt::Display`
    +  --> src/main.rs:24:7
    +   |
    +24 |     p.outline_print();
    +   |       ^^^^^^^^^^^^^ `Point` cannot be formatted with the default formatter
    +   |
    +   = help: the trait `std::fmt::Display` is not implemented for `Point`
    +   = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
    +note: required by a bound in `OutlinePrint::outline_print`
    +  --> src/main.rs:3:21
    +   |
    +3  | trait OutlinePrint: fmt::Display {
    +   |                     ^^^^^^^^^^^^ required by this bound in `OutlinePrint::outline_print`
    +4  |     fn outline_print(&self) {
    +   |        ------------- required by a bound in this associated function
    +
    +For more information about this error, try `rustc --explain E0277`.
    +error: could not compile `traits-example` (bin "traits-example") due to 2 previous errors
    +
    +

    一旦在 Point 上实现 Display 并满足 OutlinePrint 要求的限制,比如这样:

    +

    文件名:src/main.rs

    +
    trait OutlinePrint: fmt::Display {
    +    fn outline_print(&self) {
    +        let output = self.to_string();
    +        let len = output.len();
    +        println!("{}", "*".repeat(len + 4));
    +        println!("*{}*", " ".repeat(len + 2));
    +        println!("* {output} *");
    +        println!("*{}*", " ".repeat(len + 2));
    +        println!("{}", "*".repeat(len + 4));
    +    }
    +}
    +
    +struct Point {
    +    x: i32,
    +    y: i32,
    +}
    +
    +impl OutlinePrint for Point {}
    +
    +use std::fmt;
    +
    +impl fmt::Display for Point {
    +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    +        write!(f, "({}, {})", self.x, self.y)
    +    }
    +}
    +
    +fn main() {
    +    let p = Point { x: 1, y: 3 };
    +    p.outline_print();
    +}
    +

    那么在 Point 上实现 OutlinePrint trait 将能成功编译,并可以在 Point 实例上调用 outline_print 来显示位于星号框中的点的值。

    +

    newtype 模式用以在外部类型上实现外部 trait

    +

    在第十章的 “为类型实现 trait” 部分,我们提到了孤儿规则(orphan rule),它说明只要 trait 或类型对于当前 crate 是本地的话就可以在此类型上实现该 trait。一个绕开这个限制的方法是使用 newtype 模式newtype pattern),它涉及到在一个元组结构体(第五章 “用没有命名字段的元组结构体来创建不同的类型” 部分介绍了元组结构体)中创建一个新类型。这个元组结构体带有一个字段作为希望实现 trait 的类型的简单封装。接着这个封装类型对于 crate 是本地的,这样就可以在这个封装上实现 trait。Newtype 是一个源自 Haskell 编程语言的概念。使用这个模式没有运行时性能惩罚,这个封装类型在编译时就被省略了。

    +

    例如,如果想要在 Vec<T> 上实现 Display,而孤儿规则阻止我们直接这么做,因为 Display trait 和 Vec<T> 都定义于我们的 crate 之外。可以创建一个包含 Vec<T> 实例的 Wrapper 结构体,接着可以如列表 19-23 那样在 Wrapper 上实现 Display 并使用 Vec<T> 的值:

    +

    文件名:src/main.rs

    +
    use std::fmt;
    +
    +struct Wrapper(Vec<String>);
    +
    +impl fmt::Display for Wrapper {
    +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    +        write!(f, "[{}]", self.0.join(", "))
    +    }
    +}
    +
    +fn main() {
    +    let w = Wrapper(vec![String::from("hello"), String::from("world")]);
    +    println!("w = {w}");
    +}
    +

    示例 19-23: 创建 Wrapper 类型封装 Vec<String> 以便能够实现 Display

    +

    Display 的实现使用 self.0 来访问其内部的 Vec<T>,因为 Wrapper 是元组结构体而 Vec<T> 是结构体总位于索引 0 的项。接着就可以使用 WrapperDisplay 的功能了。

    +

    此方法的缺点是,因为 Wrapper 是一个新类型,它没有定义于其值之上的方法;必须直接在 Wrapper 上实现 Vec<T> 的所有方法,这样就可以代理到self.0 上 —— 这就允许我们完全像 Vec<T> 那样对待 Wrapper。如果希望新类型拥有其内部类型的每一个方法,为封装类型实现 Deref trait(第十五章 “通过 Deref trait 将智能指针当作常规引用处理” 部分讨论过)并返回其内部类型是一种解决方案。如果不希望封装类型拥有所有内部类型的方法 —— 比如为了限制封装类型的行为 —— 则必须只自行实现所需的方法。

    +

    甚至当不涉及 trait 时 newtype 模式也很有用。现在让我们将话题的焦点转移到一些与 Rust 类型系统交互的高级方法上来吧。

    +

    高级类型

    +
    +

    ch20-04-advanced-types.md +
    +commit 95e931170404cb98d476b19017cbbdbc00d0834d

    +
    +

    Rust 的类型系统有一些我们曾经提到但没有讨论过的功能。首先我们从一个关于为什么 newtype 与类型一样有用的更宽泛的讨论开始。接着会转向类型别名(type aliases),一个类似于 newtype 但有着稍微不同的语义的功能。我们还会讨论 ! 类型和动态大小类型。

    +
    +

    这一部分假设你已经阅读了之前的 “newtype 模式用于在外部类型上实现外部 trait” 部分。

    +
    +

    为了类型安全和抽象而使用 newtype 模式

    +

    newtype 模式也可以用于一些其他我们还未讨论的功能,包括静态的确保某值不被混淆,和用来表示一个值的单位。实际上示例 19-15 中已经有一个这样的例子:MillimetersMeters 结构体都在 newtype 中封装了 u32 值。如果编写了一个有 Millimeters 类型参数的函数,不小心使用 Meters 或普通的 u32 值来调用该函数的程序是不能编译的。

    +

    newtype 模式也可以用于抽象掉一些类型的实现细节:例如,封装类型可以暴露出与直接使用其内部私有类型时所不同的公有 API。

    +

    newtype 也可以隐藏其内部的泛型类型。例如,可以提供一个封装了 HashMap<i32, String>People 类型,用来储存人名以及相应的 ID。使用 People 的代码只需与提供的公有 API 交互即可,比如向 People 集合增加名字字符串的方法,这样这些代码就无需知道在内部我们将一个 i32 ID 赋予了这个名字了。newtype 模式是一种实现第十八章 “封装隐藏了实现细节” 部分所讨论的隐藏实现细节的封装的轻量级方法。

    +

    类型别名用来创建类型同义词

    +

    Rust 提供了声明 类型别名type alias)的能力,使用 type 关键字来给予现有类型另一个名字。例如,可以像这样创建 i32 的别名 Kilometers

    +
    fn main() {
    +    type Kilometers = i32;
    +
    +    let x: i32 = 5;
    +    let y: Kilometers = 5;
    +
    +    println!("x + y = {}", x + y);
    +}
    +

    这意味着 Kilometersi32同义词synonym);不同于示例 19-15 中创建的 MillimetersMeters 类型。Kilometers 不是一个新的、单独的类型。Kilometers 类型的值将被完全当作 i32 类型值来对待:

    +
    fn main() {
    +    type Kilometers = i32;
    +
    +    let x: i32 = 5;
    +    let y: Kilometers = 5;
    +
    +    println!("x + y = {}", x + y);
    +}
    +

    因为 Kilometersi32 的别名,它们是同一类型,可以将 i32Kilometers 相加,也可以将 Kilometers 传递给获取 i32 参数的函数。但通过这种手段无法获得上一部分讨论的 newtype 模式所提供的类型检查的好处。换句话说,如果在哪里混用 Kilometersi32 的值,编译器也不会给出一个错误。

    +

    类型别名的主要用途是减少重复。例如,可能会有这样很长的类型:

    +
    Box<dyn Fn() + Send + 'static>
    +

    在函数签名或类型注解中每次都书写这个类型将是枯燥且易于出错的。想象一下如示例 19-24 这样全是如此代码的项目:

    +
    fn main() {
    +    let f: Box<dyn Fn() + Send + 'static> = Box::new(|| println!("hi"));
    +
    +    fn takes_long_type(f: Box<dyn Fn() + Send + 'static>) {
    +        // --snip--
    +    }
    +
    +    fn returns_long_type() -> Box<dyn Fn() + Send + 'static> {
    +        // --snip--
    +        Box::new(|| ())
    +    }
    +}
    +

    示例 19-24: 在很多地方使用名称很长的类型

    +

    类型别名通过减少项目中重复代码的数量来使其更加易于控制。这里我们为这个冗长的类型引入了一个叫做 Thunk 的别名,这样就可以如示例 19-25 所示将所有使用这个类型的地方替换为更短的 Thunk

    +
    fn main() {
    +    type Thunk = Box<dyn Fn() + Send + 'static>;
    +
    +    let f: Thunk = Box::new(|| println!("hi"));
    +
    +    fn takes_long_type(f: Thunk) {
    +        // --snip--
    +    }
    +
    +    fn returns_long_type() -> Thunk {
    +        // --snip--
    +        Box::new(|| ())
    +    }
    +}
    +

    示例 19-25: 引入类型别名 Thunk 来减少重复

    +

    这样读写起来就容易多了!为类型别名选择一个好名字也可以帮助你表达意图(单词 thunk 表示会在之后被计算的代码,所以这是一个存放闭包的合适的名字)。

    +

    类型别名也经常与 Result<T, E> 结合使用来减少重复。考虑一下标准库中的 std::io 模块。I/O 操作通常会返回一个 Result<T, E>,因为这些操作可能会失败。标准库中的 std::io::Error 结构体代表了所有可能的 I/O 错误。std::io 中大部分函数会返回 Result<T, E>,其中 Estd::io::Error,比如 Write trait 中的这些函数:

    +
    use std::fmt;
    +use std::io::Error;
    +
    +pub trait Write {
    +    fn write(&mut self, buf: &[u8]) -> Result<usize, Error>;
    +    fn flush(&mut self) -> Result<(), Error>;
    +
    +    fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>;
    +    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Error>;
    +}
    +

    这里出现了很多的 Result<..., Error>。为此,std::io 有这个类型别名声明:

    +
    use std::fmt;
    +
    +type Result<T> = std::result::Result<T, std::io::Error>;
    +
    +pub trait Write {
    +    fn write(&mut self, buf: &[u8]) -> Result<usize>;
    +    fn flush(&mut self) -> Result<()>;
    +
    +    fn write_all(&mut self, buf: &[u8]) -> Result<()>;
    +    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<()>;
    +}
    +

    因为这位于 std::io 中,可用的完全限定的别名是 std::io::Result<T>;也就是说,Result<T, E>E 放入了 std::io::ErrorWrite trait 中的函数最终看起来像这样:

    +
    use std::fmt;
    +
    +type Result<T> = std::result::Result<T, std::io::Error>;
    +
    +pub trait Write {
    +    fn write(&mut self, buf: &[u8]) -> Result<usize>;
    +    fn flush(&mut self) -> Result<()>;
    +
    +    fn write_all(&mut self, buf: &[u8]) -> Result<()>;
    +    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<()>;
    +}
    +

    类型别名在两个方面有帮助:易于编写 在整个 std::io 中提供了一致的接口。因为这是一个别名,它只是另一个 Result<T, E>,这意味着可以在其上使用 Result<T, E> 的任何方法,以及像 ? 这样的特殊语法。

    +

    从不返回的 never type

    +

    Rust 有一个叫做 ! 的特殊类型。在类型理论术语中,它被称为 empty type,因为它没有值。我们更倾向于称之为 never type。这个名字描述了它的作用:在函数从不返回的时候充当返回值。例如:

    +
    fn bar() -> ! {
    +    // --snip--
    +    panic!();
    +}
    +

    这读 “函数 bar 从不返回”,而从不返回的函数被称为 发散函数diverging functions)。不能创建 ! 类型的值,所以 bar 也不可能返回值。

    +

    不过一个不能创建值的类型有什么用呢?如果你回想一下示例 2-5 中的代码,曾经有一些看起来像这样的代码,如示例 19-26 所重现的:

    +
    use rand::Rng;
    +use std::cmp::Ordering;
    +use std::io;
    +
    +fn main() {
    +    println!("Guess the number!");
    +
    +    let secret_number = rand::thread_rng().gen_range(1..=100);
    +
    +    println!("The secret number is: {secret_number}");
    +
    +    loop {
    +        println!("Please input your guess.");
    +
    +        let mut guess = String::new();
    +
    +        // --snip--
    +
    +        io::stdin()
    +            .read_line(&mut guess)
    +            .expect("Failed to read line");
    +
    +        let guess: u32 = match guess.trim().parse() {
    +            Ok(num) => num,
    +            Err(_) => continue,
    +        };
    +
    +        println!("You guessed: {guess}");
    +
    +        // --snip--
    +
    +        match guess.cmp(&secret_number) {
    +            Ordering::Less => println!("Too small!"),
    +            Ordering::Greater => println!("Too big!"),
    +            Ordering::Equal => {
    +                println!("You win!");
    +                break;
    +            }
    +        }
    +    }
    +}
    +

    示例 19-26: match 语句和一个以 continue 结束的分支

    +

    当时我们忽略了代码中的一些细节。在第六章 match 控制流运算符” 部分,我们学习了 match 的分支必须返回相同的类型。如下代码不能工作:

    +
    fn main() {
    +    let guess = "3";
    +    let guess = match guess.trim().parse() {
    +        Ok(_) => 5,
    +        Err(_) => "hello",
    +    };
    +}
    +

    这里的 guess 必须既是整型 也是 字符串,而 Rust 要求 guess 只能是一个类型。那么 continue 返回了什么呢?为什么示例 19-26 中会允许一个分支返回 u32 而另一个分支却以 continue 结束呢?

    +

    正如你可能猜到的,continue 的值是 !。也就是说,当 Rust 要计算 guess 的类型时,它查看这两个分支。前者是 u32 值,而后者是 ! 值。因为 ! 并没有一个值,Rust 决定 guess 的类型是 u32

    +

    描述 ! 的行为的正式方式是 never type 可以强转为任何其他类型。允许 match 的分支以 continue 结束是因为 continue 并不真正返回一个值;相反它把控制权交回上层循环,所以在 Err 的情况,事实上并未对 guess 赋值。

    +

    never type 的另一个用途是 panic!。还记得 Option<T> 上的 unwrap 函数吗?它产生一个值或 panic。这里是它的定义:

    +
    enum Option<T> {
    +    Some(T),
    +    None,
    +}
    +
    +use crate::Option::*;
    +
    +impl<T> Option<T> {
    +    pub fn unwrap(self) -> T {
    +        match self {
    +            Some(val) => val,
    +            None => panic!("called `Option::unwrap()` on a `None` value"),
    +        }
    +    }
    +}
    +

    这里与示例 19-34 中的 match 发生了相同的情况:Rust 知道 valT 类型,panic!! 类型,所以整个 match 表达式的结果是 T 类型。这能工作是因为 panic! 并不产生一个值;它会终止程序。对于 None 的情况,unwrap 并不返回一个值,所以这些代码是有效的。

    +

    最后一个有着 ! 类型的表达式是 loop

    +
    fn main() {
    +    print!("forever ");
    +
    +    loop {
    +        print!("and ever ");
    +    }
    +}
    +

    这里,循环永远也不结束,所以此表达式的值是 !。但是如果引入 break 这就不为真了,因为循环在执行到 break 后就会终止。

    +

    动态大小类型和 Sized trait

    +

    Rust 需要知道有关类型的某些细节,例如为特定类型的值需要分配多少空间。这便是起初留下的一个类型系统中令人迷惑的角落:即 动态大小类型dynamically sized types)。这有时被称为 “DST” 或 “unsized types”,这些类型允许我们处理只有在运行时才知道大小的类型。

    +

    让我们深入研究一个贯穿本书都在使用的动态大小类型的细节:str。没错,不是 &str,而是 str 本身。str 是一个 DST;直到运行时我们都不知道字符串有多长。因为直到运行时都不能知道其大小,也就意味着不能创建 str 类型的变量,也不能获取 str 类型的参数。考虑一下这些代码,它们不能工作:

    +
    fn main() {
    +    let s1: str = "Hello there!";
    +    let s2: str = "How's it going?";
    +}
    +

    Rust 需要知道应该为特定类型的值分配多少内存,同时所有同一类型的值必须使用相同数量的内存。如果允许编写这样的代码,也就意味着这两个 str 需要占用完全相同大小的空间,不过它们有着不同的长度。这也就是为什么不可能创建一个存放动态大小类型的变量的原因。

    +

    那么该怎么办呢?你已经知道了这种问题的答案:s1s2 的类型是 &str 而不是 str。如果你回想第四章 “字符串 slice” 部分,slice 数据结构仅仅储存了开始位置和 slice 的长度。所以虽然 &T 是一个储存了 T 所在的内存位置的单个值,&str 则是 两个 值:str 的地址和其长度。这样,&str 就有了一个在编译时可以知道的大小:它是 usize 长度的两倍。也就是说,我们总是知道 &str 的大小,而无论其引用的字符串是多长。这里是 Rust 中动态大小类型的常规用法:它们有一些额外的元信息来储存动态信息的大小。这引出了动态大小类型的黄金规则:必须将动态大小类型的值置于某种指针之后。

    +

    可以将 str 与所有类型的指针结合:比如 Box<str>Rc<str>。事实上,之前我们已经见过了,不过是另一个动态大小类型:trait。每一个 trait 都是一个可以通过 trait 名称来引用的动态大小类型。在第十八章 顾及不同类型值的 trait 对象” 部分,我们提到了为了将 trait 用于 trait 对象,必须将它们放入指针之后,比如 &dyn TraitBox<dyn Trait>Rc<dyn Trait> 也可以)。

    +

    为了处理 DST,Rust 提供了 Sized trait 来决定一个类型的大小是否在编译时可知。这个 trait 自动为编译器在编译时就知道大小的类型实现。另外,Rust 隐式的为每一个泛型函数增加了 Sized bound。也就是说,对于如下泛型函数定义:

    +
    fn generic<T>(t: T) {
    +    // --snip--
    +}
    +

    实际上被当作如下处理:

    +
    fn generic<T: Sized>(t: T) {
    +    // --snip--
    +}
    +

    泛型函数默认只能用于在编译时已知大小的类型。然而可以使用如下特殊语法来放宽这个限制:

    +
    fn generic<T: ?Sized>(t: &T) {
    +    // --snip--
    +}
    +

    ?Sized 上的 trait bound 意味着 “T 可能是也可能不是 Sized” 同时这个注解会覆盖泛型类型必须在编译时拥有固定大小的默认规则。这种意义的 ?Trait 语法只能用于 Sized ,而不能用于任何其他 trait。

    +

    另外注意我们将 t 参数的类型从 T 变为了 &T:因为其类型可能不是 Sized 的,所以需要将其置于某种指针之后。在这个例子中选择了引用。

    +

    接下来,让我们讨论一下函数和闭包!

    +

    高级函数与闭包

    +
    +

    ch20-05-advanced-functions-and-closures.md +
    +commit 21cf840842bdf768a798869f06373c96c1cc5122

    +
    +

    本部分将探索一些有关函数和闭包的高级功能,这包括函数指针以及返回值闭包。

    +

    函数指针

    +

    我们讨论过了如何向函数传递闭包;也可以向函数传递常规函数!这个技术在我们希望传递已经定义的函数而不是重新定义闭包作为参数时很有用。函数满足类型 fn(小写的 f),不要与闭包 trait 的 Fn 相混淆。fn 被称为 函数指针function pointer)。通过函数指针允许我们使用函数作为另一个函数的参数。

    +

    指定参数为函数指针的语法类似于闭包,如示例 19-27 所示,这里定义了一个 add_one 函数将其参数加一。do_twice 函数获取两个参数:一个指向任何获取一个 i32 参数并返回一个 i32 的函数指针,和一个 i32 值。do_twice 函数传递 arg 参数调用 f 函数两次,接着将两次函数调用的结果相加。main 函数使用 add_one5 作为参数调用 do_twice

    +

    文件名:src/main.rs

    +
    fn add_one(x: i32) -> i32 {
    +    x + 1
    +}
    +
    +fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 {
    +    f(arg) + f(arg)
    +}
    +
    +fn main() {
    +    let answer = do_twice(add_one, 5);
    +
    +    println!("The answer is: {answer}");
    +}
    +

    示例 19-27: 使用 fn 类型接受函数指针作为参数

    +

    这会打印出 The answer is: 12do_twice 中的 f 被指定为一个接受一个 i32 参数并返回 i32fn。接着就可以在 do_twice 函数体中调用 f。在 main 中,可以将函数名 add_one 作为第一个参数传递给 do_twice

    +

    不同于闭包,fn 是一个类型而不是一个 trait,所以直接指定 fn 作为参数而不是声明一个带有 Fn 作为 trait bound 的泛型参数。

    +

    函数指针实现了所有三个闭包 trait(FnFnMutFnOnce),所以总是可以在调用期望闭包的函数时传递函数指针作为参数。倾向于编写使用泛型和闭包 trait 的函数,这样它就能接受函数或闭包作为参数。

    +

    一个只期望接受 fn 而不接受闭包的情况的例子是与不存在闭包的外部代码交互时:C 语言的函数可以接受函数作为参数,但 C 语言没有闭包。

    +

    作为一个既可以使用内联定义的闭包又可以使用命名函数的例子,让我们看看一个 map 的应用。使用 map 函数将一个数字 vector 转换为一个字符串 vector,就可以使用闭包,比如这样:

    +
    fn main() {
    +    let list_of_numbers = vec![1, 2, 3];
    +    let list_of_strings: Vec<String> =
    +        list_of_numbers.iter().map(|i| i.to_string()).collect();
    +}
    +

    或者可以将函数作为 map 的参数来代替闭包,像是这样:

    +
    fn main() {
    +    let list_of_numbers = vec![1, 2, 3];
    +    let list_of_strings: Vec<String> =
    +        list_of_numbers.iter().map(ToString::to_string).collect();
    +}
    +

    注意这里必须使用 “高级 trait” 部分讲到的完全限定语法,因为存在多个叫做 to_string 的函数;这里使用了定义于 ToString trait 的 to_string 函数,标准库为所有实现了 Display 的类型实现了这个 trait。

    +

    回忆一下第六章 “枚举值” 部分中定义的每一个枚举成员也变成了一个构造函数。我们可以使用这些构造函数作为实现了闭包 trait 的函数指针,这意味着可以指定构造函数作为接受闭包的方法的参数,如下:

    +
    fn main() {
    +    enum Status {
    +        Value(u32),
    +        Stop,
    +    }
    +
    +    let list_of_statuses: Vec<Status> = (0u32..20).map(Status::Value).collect();
    +}
    +

    这里创建了 Status::Value 实例,它通过 map 用范围的每一个 u32 值调用 Status::Value 的初始化函数。一些人倾向于函数风格,一些人喜欢闭包。这两种形式最终都会产生同样的代码,所以请使用对你来说更明白的形式吧。

    +

    返回闭包

    +

    闭包表现为 trait,这意味着不能直接返回闭包。对于大部分需要返回 trait 的情况,可以使用实现了期望返回的 trait 的具体类型来替代函数的返回值。但是这不能用于闭包,因为它们没有一个可返回的具体类型;例如不允许使用函数指针 fn 作为返回值类型。

    +

    这段代码尝试直接返回闭包,它并不能编译:

    +
    fn returns_closure() -> dyn Fn(i32) -> i32 {
    +    |x| x + 1
    +}
    +

    编译器给出的错误是:

    +
    $ cargo build
    +   Compiling functions-example v0.1.0 (file:///projects/functions-example)
    +error[E0746]: return type cannot have an unboxed trait object
    + --> src/lib.rs:1:25
    +  |
    +1 | fn returns_closure() -> dyn Fn(i32) -> i32 {
    +  |                         ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
    +  |
    +help: consider returning an `impl Trait` instead of a `dyn Trait`
    +  |
    +1 | fn returns_closure() -> impl Fn(i32) -> i32 {
    +  |                         ~~~~
    +help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
    +  |
    +1 ~ fn returns_closure() -> Box<dyn Fn(i32) -> i32> {
    +2 ~     Box::new(|x| x + 1)
    +  |
    +
    +For more information about this error, try `rustc --explain E0746`.
    +error: could not compile `functions-example` (lib) due to 1 previous error
    +
    +

    错误又一次指向了 Sized trait!Rust 并不知道需要多少空间来储存闭包。不过我们在上一部分见过这种情况的解决办法:可以使用 trait 对象:

    +
    fn returns_closure() -> Box<dyn Fn(i32) -> i32> {
    +    Box::new(|x| x + 1)
    +}
    +

    这段代码正好可以编译。关于 trait 对象的更多内容,请回顾第十八章的 顾及不同类型值的 trait 对象” 部分。

    +

    接下来让我们学习宏!

    +

    +
    +

    ch20-06-macros.md +
    +commit 95e931170404cb98d476b19017cbbdbc00d0834d

    +
    +

    我们已经在本书中使用过像 println! 这样的宏了,不过还没完全探索什么是宏以及它是如何工作的。Macro)指的是 Rust 中一系列的功能:使用 macro_rules!声明Declarative)宏,和三种 过程Procedural)宏:

    +
      +
    • 自定义 #[derive] 宏在结构体和枚举上指定通过 derive 属性添加的代码
    • +
    • 类属性(Attribute-like)宏定义可用于任意项的自定义属性
    • +
    • 类函数宏看起来像函数不过作用于作为参数传递的 token
    • +
    +

    我们会依次讨论每一种宏,不过首要的是,为什么已经有了函数还需要宏呢?

    +

    宏和函数的区别

    +

    从根本上来说,宏是一种为写其他代码而写代码的方式,即所谓的 元编程metaprogramming)。在附录 C 中会探讨 derive 属性,其生成各种 trait 的实现。我们也在本书中使用过 println! 宏和 vec! 宏。所有的这些宏以 展开 的方式来生成比你所手写出的更多的代码。

    +

    元编程对于减少大量编写和维护的代码是非常有用的,它也扮演了函数扮演的角色。但宏有一些函数所没有的附加能力。

    +

    一个函数签名必须声明函数参数个数和类型。相比之下,宏能够接收不同数量的参数:用一个参数调用 println!("hello") 或用两个参数调用 println!("hello {}", name) 。而且,宏可以在编译器翻译代码前展开,例如,宏可以在一个给定类型上实现 trait。而函数则不行,因为函数是在运行时被调用,同时 trait 需要在编译时实现。

    +

    实现宏不如实现函数的一面是宏定义要比函数定义更复杂,因为你正在编写生成 Rust 代码的 Rust 代码。由于这样的间接性,宏定义通常要比函数定义更难阅读、理解以及维护。

    +

    宏和函数的最后一个重要的区别是:在一个文件里调用宏 之前 必须定义它,或将其引入作用域,而函数则可以在任何地方定义和调用。

    +

    使用 macro_rules! 的声明宏用于通用元编程

    +

    Rust 最常用的宏形式是 声明宏declarative macros)。它们有时也被称为 “macros by example”、“macro_rules! 宏” 或者就是 “macros”。其核心概念是,声明宏允许我们编写一些类似 Rust match 表达式的代码。正如在第六章讨论的那样,match 表达式是控制结构,其接收一个表达式,与表达式的结果进行模式匹配,然后根据模式匹配执行相关代码。宏也将一个值和包含相关代码的模式进行比较;此种情况下,该值是传递给宏的 Rust 源代码字面值,模式用于和前面提到的源代码字面值进行比较,每个模式的相关代码会替换传递给宏的代码。所有这一切都发生于编译时。

    +

    可以使用 macro_rules! 来定义宏。让我们通过查看 vec! 宏定义来探索如何使用 macro_rules! 结构。第八章讲述了如何使用 vec! 宏来生成一个给定值的 vector。例如,下面的宏用三个整数创建一个 vector:

    +
    #![allow(unused)]
    +fn main() {
    +let v: Vec<u32> = vec![1, 2, 3];
    +}
    +

    也可以使用 vec! 宏来构造两个整数的 vector 或五个字符串 slice 的 vector。但却无法使用函数做相同的事情,因为我们无法预先知道参数值的数量和类型。

    +

    在示例 19-28 中展示了一个 vec! 稍微简化的定义。

    +

    文件名:src/lib.rs

    +
    #[macro_export]
    +macro_rules! vec {
    +    ( $( $x:expr ),* ) => {
    +        {
    +            let mut temp_vec = Vec::new();
    +            $(
    +                temp_vec.push($x);
    +            )*
    +            temp_vec
    +        }
    +    };
    +}
    +

    示例 19-28: 一个 vec! 宏定义的简化版本

    +
    +

    注意:标准库中实际定义的 vec! 包括预分配适当量的内存的代码。这部分为代码优化,为了让示例简化,此处并没有包含在内。

    +
    +

    #[macro_export] 注解表明只要导入了定义这个宏的 crate,该宏就应该是可用的。如果没有该注解,这个宏不能被引入作用域。

    +

    接着使用 macro_rules! 和宏名称开始宏定义,且所定义的宏并 不带 感叹号。名字后跟大括号表示宏定义体,在该例中宏名称是 vec

    +

    vec! 宏的结构和 match 表达式的结构类似。此处有一个分支模式 ( $( $x:expr ),* ) ,后跟 => 以及和模式相关的代码块。如果模式匹配,该相关代码块将被执行。这里这个宏只有一个模式,那就只有一个有效匹配方向,其他任何模式方向(译者注:不匹配这个模式)都会导致错误。更复杂的宏会有多个分支模式。

    +

    宏定义中有效模式语法和在第十九章提及的模式语法是不同的,因为宏模式所匹配的是 Rust 代码结构而不是值。回过头来检查下示例 19-28 中模式片段什么意思。对于全部的宏模式语法,请查阅 Rust 参考

    +

    首先,一对括号包含了整个模式。我们使用美元符号($)在宏系统中声明一个变量来包含匹配该模式的 Rust 代码。美元符号明确表明这是一个宏变量而不是普通 Rust 变量。之后是一对括号,其捕获了符合括号内模式的值用以在替代代码中使用。$() 内则是 $x:expr ,其匹配 Rust 的任意表达式,并将该表达式命名为 $x

    +

    $() 之后的逗号说明一个可有可无的逗号分隔符可以出现在 $() 所匹配的代码之后。紧随逗号之后的 * 说明该模式匹配零个或更多个 * 之前的任何模式。

    +

    当以 vec![1, 2, 3]; 调用宏时,$x 模式与三个表达式 123 进行了三次匹配。

    +

    现在让我们来看看与此分支模式相关联的代码块中的模式:匹配到模式中的$()的每一部分,都会在(=>右侧)$()* 里生成temp_vec.push($x),生成零次还是多次取决于模式匹配到多少次。$x 由每个与之相匹配的表达式所替换。当以 vec![1, 2, 3]; 调用该宏时,替换该宏调用所生成的代码会是下面这样:

    +
    {
    +    let mut temp_vec = Vec::new();
    +    temp_vec.push(1);
    +    temp_vec.push(2);
    +    temp_vec.push(3);
    +    temp_vec
    +}
    +

    我们已经定义了一个宏,其可以接收任意数量和类型的参数,同时可以生成能够创建包含指定元素的 vector 的代码。

    +

    请查阅在线文档或其他资源,如 “The Little Book of Rust Macros” 来更多地了解如何写宏,该书由 Daniel Keep 开始编写并由 Lukas Wirth 继续维护。

    +

    用于从属性生成代码的过程宏

    +

    第二种形式的宏被称为 过程宏procedural macros),因为它们更像函数(一种过程类型)。过程宏接收 Rust 代码作为输入,在这些代码上进行操作,然后产生另一些代码作为输出,而非像声明式宏那样匹配对应模式然后以另一部分代码替换当前代码。有三种类型的过程宏(自定义派生(derive),类属性和类函数),不过它们的工作方式都类似。

    +

    创建过程宏时,其定义必须驻留在它们自己的具有特殊 crate 类型的 crate 中。这么做出于复杂的技术原因,将来我们希望能够消除这些限制。在示例 19-29 中展示了如何定义过程宏,其中 some_attribute 是一个使用特定宏变体的占位符。

    +

    文件名:src/lib.rs

    +
    use proc_macro;
    +
    +#[some_attribute]
    +pub fn some_name(input: TokenStream) -> TokenStream {
    +}
    +

    示例 19-29: 一个定义过程宏的例子

    +

    定义过程宏的函数接收一个 TokenStream 作为输入并生成 TokenStream 作为输出。TokenStream 是定义于proc_macro crate 里代表一系列 token 的类型,Rust 默认携带了proc_macro crate。这就是宏的核心:宏所处理的源代码组成了输入 TokenStream,宏生成的代码是输出 TokenStream。函数上还有一个属性;这个属性指明了我们创建的过程宏的类型。在同一 crate 中可以有多种的过程宏。

    +

    让我们看看不同种类的程序宏。我们将从一个自定义的派生宏开始,然后解释使其他形式不同的小差异。

    +

    如何编写自定义 derive

    +

    让我们创建一个 hello_macro crate,其包含名为 HelloMacro 的 trait 和关联函数 hello_macro。不同于让用户为其每一个类型实现 HelloMacro trait,我们将会提供一个过程式宏以便用户可以使用 #[derive(HelloMacro)] 注解它们的类型来得到 hello_macro 函数的默认实现。该默认实现会打印 Hello, Macro! My name is TypeName!,其中 TypeName 为定义了 trait 的类型名。换言之,我们会创建一个 crate,使程序员能够写类似示例 19-30 中的代码。

    +

    文件名:src/main.rs

    +
    use hello_macro::HelloMacro;
    +use hello_macro_derive::HelloMacro;
    +
    +#[derive(HelloMacro)]
    +struct Pancakes;
    +
    +fn main() {
    +    Pancakes::hello_macro();
    +}
    +

    示例 19-30: crate 用户所写的能够使用过程式宏的代码

    +

    运行该代码将会打印 Hello, Macro! My name is Pancakes! 第一步是像下面这样新建一个库 crate:

    +
    $ cargo new hello_macro --lib
    +
    +

    接下来,会定义 HelloMacro trait 以及其关联函数:

    +

    文件名:src/lib.rs

    +
    pub trait HelloMacro {
    +    fn hello_macro();
    +}
    +

    现在有了一个包含函数的 trait。此时,crate 用户可以实现该 trait 以达到其期望的功能,像这样:

    +
    use hello_macro::HelloMacro;
    +
    +struct Pancakes;
    +
    +impl HelloMacro for Pancakes {
    +    fn hello_macro() {
    +        println!("Hello, Macro! My name is Pancakes!");
    +    }
    +}
    +
    +fn main() {
    +    Pancakes::hello_macro();
    +}
    +

    然而,他们需要为每一个他们想使用 hello_macro 的类型编写实现的代码块。我们希望为其节约这些工作。

    +

    另外,我们也无法为 hello_macro 函数提供一个能够打印实现了该 trait 的类型的名字的默认实现:Rust 没有反射的能力,因此其无法在运行时获取类型名。我们需要一个在编译时生成代码的宏。

    +

    下一步是定义过程式宏。在编写本部分时,过程式宏必须在其自己的 crate 内。该限制最终可能被取消。构造 crate 和其中宏的惯例如下:对于一个 foo 的包来说,一个自定义的派生过程宏的包被称为 foo_derive 。在 hello_macro 项目中新建名为 hello_macro_derive 的包。

    +
    $ cargo new hello_macro_derive --lib
    +
    +

    由于两个 crate 紧密相关,因此在 hello_macro 包的目录下创建过程式宏的 crate。如果改变在 hello_macro 中定义的 trait,同时也必须改变在 hello_macro_derive 中实现的过程式宏。这两个包需要分别发布,编程人员如果使用这些包,则需要同时添加这两个依赖并将其引入作用域。我们也可以只用 hello_macro 包而将 hello_macro_derive 作为一个依赖,并重新导出过程式宏的代码。但现在我们组织项目的方式使编程人员在无需 derive 功能时也能够单独使用 hello_macro

    +

    我们需要声明 hello_macro_derive crate 是过程宏 (proc-macro) crate。我们还需要 synquote crate 中的功能,正如你即将看到的,需要将它们加到依赖中。将下面的代码加入到 hello_macro_deriveCargo.toml 文件中。

    +

    文件名:hello_macro_derive/Cargo.toml

    +
    [lib]
    +proc-macro = true
    +
    +[dependencies]
    +syn = "2.0"
    +quote = "1.0"
    +
    +

    为定义一个过程式宏,请将示例 19-31 中的代码放在 hello_macro_derive crate 的 src/lib.rs 文件里面。注意这段代码在我们添加 impl_hello_macro 函数的定义之前是无法编译的。

    +

    文件名:hello_macro_derive/src/lib.rs

    +
    use proc_macro::TokenStream;
    +use quote::quote;
    +
    +#[proc_macro_derive(HelloMacro)]
    +pub fn hello_macro_derive(input: TokenStream) -> TokenStream {
    +    // Construct a representation of Rust code as a syntax tree
    +    // that we can manipulate
    +    let ast = syn::parse(input).unwrap();
    +
    +    // Build the trait implementation
    +    impl_hello_macro(&ast)
    +}
    +

    示例 19-31: 大多数过程式宏处理 Rust 代码时所需的代码

    +

    注意我们将代码分成了hello_macro_deriveimpl_hello_macro 两个函数,前者负责解析 TokenStream,后者负责转换语法树:这使得编写过程宏更方便。几乎你看到或者创建的每一个过程宏的外部函数(这里是hello_macro_derive)中的代码都跟这里是一样的。你放入内部函数(这里是impl_hello_macro)中的代码根据你的过程宏的设计目的会有所不同。

    +

    现在,我们已经引入了三个新的 crate:proc_macrosynquote 。Rust 自带 proc_macro crate,因此无需将其加到 Cargo.toml 文件的依赖中。proc_macro crate 是编译器用来读取和操作我们 Rust 代码的 API。

    +

    syn crate 将字符串中的 Rust 代码解析成为一个可以操作的数据结构。quote 则将 syn 解析的数据结构转换回 Rust 代码。这些 crate 让解析任何我们所要处理的 Rust 代码变得更简单:为 Rust 编写整个的解析器并不是一件简单的工作。

    +

    当用户在一个类型上指定 #[derive(HelloMacro)] 时,hello_macro_derive 函数将会被调用。因为我们已经使用 proc_macro_derive 及其指定名称HelloMacrohello_macro_derive 函数进行了注解,指定名称HelloMacro就是 trait 名,这是大多数过程宏遵循的习惯。

    +

    该函数首先将来自 TokenStreaminput 转换为一个我们可以解释和操作的数据结构。这正是 syn 派上用场的地方。syn 中的 parse 函数获取一个 TokenStream 并返回一个表示解析出 Rust 代码的 DeriveInput 结构体。示例 19-32 展示了从字符串 struct Pancakes; 中解析出来的 DeriveInput 结构体的相关部分:

    +
    DeriveInput {
    +    // --snip--
    +
    +    ident: Ident {
    +        ident: "Pancakes",
    +        span: #0 bytes(95..103)
    +    },
    +    data: Struct(
    +        DataStruct {
    +            struct_token: Struct,
    +            fields: Unit,
    +            semi_token: Some(
    +                Semi
    +            )
    +        }
    +    )
    +}
    +

    示例 19-32: 解析示例 19-30 中带有宏属性的代码时得到的 DeriveInput 实例

    +

    该结构体的字段展示了我们解析的 Rust 代码是一个类单元结构体,其 ident(identifier,表示名字)为 Pancakes。该结构体里面有更多字段描述了所有类型的 Rust 代码,查阅 synDeriveInput 的文档 以获取更多信息。

    +

    很快我们将定义 impl_hello_macro 函数,其用于构建所要包含在内的 Rust 新代码。但在此之前,注意其输出也是 TokenStream。所返回的 TokenStream 会被加到我们的 crate 用户所写的代码中,因此,当用户编译他们的 crate 时,他们会通过修改后的 TokenStream 获取到我们所提供的额外功能。

    +

    你可能也注意到了,当调用 syn::parse 函数失败时,我们用 unwrap 来使 hello_macro_derive 函数 panic。在错误时 panic 对过程宏来说是必须的,因为 proc_macro_derive 函数必须返回 TokenStream 而不是 Result,以此来符合过程宏的 API。这里选择用 unwrap 来简化了这个例子;在生产代码中,则应该通过 panic!expect 来提供关于发生何种错误的更加明确的错误信息。

    +

    现在我们有了将注解的 Rust 代码从 TokenStream 转换为 DeriveInput 实例的代码,让我们来创建在注解类型上实现 HelloMacro trait 的代码,如示例 19-33 所示。

    +

    文件名:hello_macro_derive/src/lib.rs

    +
    use proc_macro::TokenStream;
    +use quote::quote;
    +
    +#[proc_macro_derive(HelloMacro)]
    +pub fn hello_macro_derive(input: TokenStream) -> TokenStream {
    +    // Construct a representation of Rust code as a syntax tree
    +    // that we can manipulate
    +    let ast = syn::parse(input).unwrap();
    +
    +    // Build the trait implementation
    +    impl_hello_macro(&ast)
    +}
    +
    +fn impl_hello_macro(ast: &syn::DeriveInput) -> TokenStream {
    +    let name = &ast.ident;
    +    let gen = quote! {
    +        impl HelloMacro for #name {
    +            fn hello_macro() {
    +                println!("Hello, Macro! My name is {}!", stringify!(#name));
    +            }
    +        }
    +    };
    +    gen.into()
    +}
    +

    示例 19-33: 使用解析过的 Rust 代码实现 HelloMacro trait

    +

    我们得到一个包含以 ast.ident 作为注解类型名字(标识符)的 Ident 结构体实例。示例 19-32 中的结构体表明当 impl_hello_macro 函数运行于示例 19-30 中的代码上时 ident 字段的值是 "Pancakes"。因此,示例 19-33 中 name 变量会包含一个 Ident 结构体的实例,当打印时,会是字符串 "Pancakes",也就是示例 19-30 中结构体的名称。

    +

    quote! 宏能让我们编写希望返回的 Rust 代码。quote! 宏执行的直接结果并不是编译器所期望的所以需要转换为 TokenStream。为此需要调用 into 方法,它会消费这个中间表示(intermediate representation,IR)并返回所需的 TokenStream 类型值。

    +

    这个宏也提供了一些非常酷的模板机制;我们可以写 #name ,然后 quote! 会以名为 name 的变量值来替换它。你甚至可以做一些类似常用宏那样的重复代码的工作。查阅 quote crate 的文档 来获取详尽的介绍。

    +

    我们期望我们的过程式宏能够为通过 #name 获取到的用户注解类型生成 HelloMacro trait 的实现。该 trait 的实现有一个函数 hello_macro ,其函数体包括了我们期望提供的功能:打印 Hello, Macro! My name is 和注解的类型名。

    +

    此处所使用的 stringify! 为 Rust 内置宏。其接收一个 Rust 表达式,如 1 + 2 ,然后在编译时将表达式转换为一个字符串常量,如 "1 + 2" 。这与 format!println! 是不同的,它计算表达式并将结果转换为 String 。有一种可能的情况是,所输入的 #name 可能是一个需要打印的表达式,因此我们用 stringify!stringify! 也能通过在编译时将 #name 转换为字符串来节省内存分配。

    +

    此时,cargo build 应该都能成功编译 hello_macrohello_macro_derive 。我们将这些 crate 连接到示例 19-30 的代码中来看看过程宏的行为!在 projects 目录下用 cargo new pancakes 命令新建一个二进制项目。需要将 hello_macrohello_macro_derive 作为依赖加到 pancakes 包的 Cargo.toml 文件中去。如果你正将 hello_macrohello_macro_derive 的版本发布到 crates.io 上,其应为常规依赖;如果不是,则可以像下面这样将其指定为 path 依赖:

    +
    hello_macro = { path = "../hello_macro" }
    +hello_macro_derive = { path = "../hello_macro/hello_macro_derive" }
    +
    +

    把示例 19-30 中的代码放在 src/main.rs ,然后执行 cargo run:其应该打印 Hello, Macro! My name is Pancakes!。其包含了该过程宏中 HelloMacro trait 的实现,而无需 pancakes crate 实现它;#[derive(HelloMacro)] 增加了该 trait 实现。

    +

    接下来,让我们探索一下其他类型的过程宏与自定义派生宏有何区别。

    +

    类属性宏

    +

    类属性宏与自定义派生宏相似,不同的是 derive 属性生成代码,它们(类属性宏)能让你创建新的属性。它们也更为灵活;derive 只能用于结构体和枚举;属性还可以用于其它的项,比如函数。作为一个使用类属性宏的例子,可以创建一个名为 route 的属性用于注解 web 应用程序框架(web application framework)的函数:

    +
    #[route(GET, "/")]
    +fn index() {
    +

    #[route] 属性将由框架本身定义为一个过程宏。其宏定义的函数签名看起来像这样:

    +
    #[proc_macro_attribute]
    +pub fn route(attr: TokenStream, item: TokenStream) -> TokenStream {
    +

    这里有两个 TokenStream 类型的参数;第一个用于属性内容本身,也就是 GET, "/" 部分。第二个是属性所标记的项:在本例中,是 fn index() {} 和剩下的函数体。

    +

    除此之外,类属性宏与自定义派生宏工作方式一致:创建 proc-macro crate 类型的 crate 并实现希望生成代码的函数!

    +

    类函数宏

    +

    类函数(Function-like)宏的定义看起来像函数调用的宏。类似于 macro_rules!,它们比函数更灵活;例如,可以接受未知数量的参数。然而 macro_rules! 宏只能使用之前 “使用 macro_rules! 的声明宏用于通用元编程” 介绍的类匹配的语法定义。类函数宏获取 TokenStream 参数,其定义使用 Rust 代码操纵 TokenStream,就像另两种过程宏一样。一个类函数宏例子是可以像这样被调用的 sql! 宏:

    +
    let sql = sql!(SELECT * FROM posts WHERE id=1);
    +

    这个宏会解析其中的 SQL 语句并检查其是否是句法正确的,这是比 macro_rules! 可以做到的更为复杂的处理。sql! 宏应该被定义为如此:

    +
    #[proc_macro]
    +pub fn sql(input: TokenStream) -> TokenStream {
    +

    这类似于自定义派生宏的签名:获取括号中的 token,并返回希望生成的代码。

    +

    总结

    +

    好的!现在我们学习了 Rust 并不常用但在特定情况下你可能用得着的功能。我们介绍了很多复杂的主题,这样若你在错误信息提示或阅读他人代码时遇到它们,至少可以说之前已经见过这些概念和语法了。你可以使用本章作为一个解决方案的参考。

    +

    接下来,我们将再开始一个项目,将本书所学的所有内容付与实践!

    +

    最后的项目:构建多线程 web server

    +
    +

    ch21-00-final-project-a-web-server.md +
    +commit 5df6909c57b3ba55f156a4122a42b805436de90c

    +
    +

    这是一次漫长的旅途,不过我们到达了本书的结束。在本章中,我们将一同构建另一个项目,来展示最后几章所学,同时复习更早的章节。

    +

    作为最后的项目,我们将要实现一个返回 “hello” 的 web server,它在浏览器中看起来就如图例 20-1 所示:

    +

    hello from rust

    +

    图例 20-1: 我们最后将一起分享的项目

    +

    如下是构建 web server 的计划:

    +
      +
    1. 学习一些 TCP 与 HTTP 知识
    2. +
    3. 在套接字(socket)上监听 TCP 请求
    4. +
    5. 解析少量的 HTTP 请求
    6. +
    7. 创建一个合适的 HTTP 响应
    8. +
    9. 通过线程池改善 server 的吞吐量
    10. +
    +

    不过在开始之前,需要提到一点细节:这里使用的方法并不是使用 Rust 构建 web server 最好的方法。crates.io 上有很多可用于生产环境的 crate,它们提供了比我们所要编写的更为完整的 web server 和线程池实现。然而,本章的目的在于学习,而不是走捷径。因为 Rust 是一个系统编程语言,我们能够选择处理什么层次的抽象,并能够选择比其他语言可能或可用的层次更低的层次。因此我们将自己编写一个基础的 HTTP server 和线程池,以便学习将来可能用到的 crate 背后的通用理念和技术。

    +

    构建单线程 web server

    +
    +

    ch21-01-single-threaded.md +
    +commit 5df6909c57b3ba55f156a4122a42b805436de90c

    +
    +

    首先让我们创建一个可运行的单线程 web server,不过在开始之前,我们将快速了解一下构建 web server 所涉及到的协议。这些协议的细节超出了本书的范畴,不过一个简单的概括会提供我们所需的信息。

    +

    web server 中涉及到的两个主要协议是 超文本传输协议Hypertext Transfer ProtocolHTTP)和 传输控制协议Transmission Control ProtocolTCP)。这两者都是 请求 - 响应request-response)协议,也就是说,有 客户端client)来初始化请求,并有 服务端server)监听请求并向客户端提供响应。请求与响应的内容由协议本身定义。

    +

    TCP 是一个底层协议,它描述了信息如何从一个 server 到另一个的细节,不过其并不指定信息是什么。HTTP 构建于 TCP 之上,它定义了请求和响应的内容。为此,技术上讲可将 HTTP 用于其他协议之上,不过对于绝大部分情况,HTTP 通过 TCP 传输。我们将要做的就是处理 TCP 和 HTTP 请求与响应的原始字节数据。

    +

    监听 TCP 连接

    +

    我们的 web server 所需做的第一件事,是监听 TCP 连接。标准库提供了 std::net 模块处理这些功能。让我们一如既往新建一个项目:

    +
    $ cargo new hello
    +     Created binary (application) `hello` project
    +$ cd hello
    +
    +

    现在,在 src/main.rs 输入示例 20-1 中的代码,作为一个开始。这段代码会在地址 127.0.0.1:7878 上监听传入的 TCP 流。当获取到传入的流,它会打印出 Connection established!

    +

    文件名:src/main.rs

    +
    use std::net::TcpListener;
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +
    +    for stream in listener.incoming() {
    +        let stream = stream.unwrap();
    +
    +        println!("Connection established!");
    +    }
    +}
    +

    示例 20-1: 监听传入的流并在接收到流时打印信息

    +

    TcpListener 用于监听 TCP 连接。我们选择监听本地地址 127.0.0.1:7878。将这个地址拆开来看,冒号之前的部分是一个代表本机的 IP 地址(在每台计算机上,这个地址都指本机,并不特指作者的计算机),而 7878 是端口。选择这个端口出于两个原因:通常 HTTP 服务器不在这个端口上接受请求,所以它不太可能与你机器上运行的其它 web server 的端口冲突;而且 7878 在电话上打出来就是 "rust"(译者注:九宫格键盘上的英文)。

    +

    在这个场景中 bind 函数类似于 new 函数,在这里它返回一个新的 TcpListener 实例。这个函数叫做 bind 是因为,在网络领域,连接到要监听的端口称为“绑定到端口”(“binding to a port”)

    +

    bind 函数返回 Result<T, E>,这表明绑定可能会失败。例如,监听 80 端口需要管理员权限(非管理员用户只能监听大于 1023 的端口),所以如果尝试监听 80 端口而没有管理员权限,则会绑定失败。再比如,如果我们运行这个程序的两个实例,并因此有两个实例监听同一个端口,那么绑定也将失败。我们是出于学习目的来编写一个基础的服务器,不用关心处理这类错误,而仅仅使用 unwrap 在出现这些情况时直接停止程序。

    +

    TcpListenerincoming 方法返回一个迭代器,它提供了一系列的流(更准确的说是 TcpStream 类型的流)。stream)代表一个客户端和服务端之间打开的连接。连接connection)代表客户端连接服务端、服务端生成响应以及服务端关闭连接的全部请求 / 响应过程。为此,我们会从 TcpStream 读取客户端发送了什么并接着向流发送响应以向客户端发回数据。总体来说,这个 for 循环会依次处理每个连接并产生一系列的流供我们处理。

    +

    目前,处理流的代码中也有一个 unwrap 调用,如果 stream 出现任何错误会终止程序;如果没有任何错误,则打印出信息。下一个例子中,我们将为成功的情况增加更多功能。当客户端连接到服务端时,incoming 方法是可能返回错误的,因为我们实际上不是在遍历连接,而是遍历 连接尝试connection attempts)。连接的尝试可能会因为多种原因不能成功,大部分是操作系统相关的。例如,很多系统限制同时打开的连接数,超出数量限制的新连接尝试会产生错误,直到一些现有的连接关闭为止。

    +

    让我们试试这段代码!首先在终端执行 cargo run,接着在浏览器中打开 127.0.0.1:7878。浏览器会显示出看起来类似于“连接重置”(“Connection reset”)的错误信息,因为 server 目前并没响应任何数据。如果我们观察终端,会发现当浏览器连接我们的服务端时,会打印出一系列的信息!

    +
         Running `target/debug/hello`
    +Connection established!
    +Connection established!
    +Connection established!
    +
    +

    有时,对于一次浏览器请求,可能会打印出多条信息;这可能是因为,浏览器在请求页面的同时,还请求了其他资源,比如出现在浏览器标签页开头的图标(favicon.ico)。

    +

    这也可能是因为浏览器尝试多次连接服务端,因为服务端没有响应任何数据。作为 drop 实现的一部分,当 stream 在循环的结尾离开作用域并被丢弃,其连接将被关闭。浏览器有时通过重连来处理关闭的连接,因为对于一般网站而言,这些问题可能是暂时的。这些都不重要;现在重要的是,我们成功的处理了 TCP 连接!

    +

    记得当运行完特定版本的代码后,使用 ctrl-C 来停止程序。并通过执行 cargo run 命令在做出最新的代码修改之后重启服务。

    +

    读取请求

    +

    让我们实现读取来自浏览器请求的功能!为了分离“获取连接”以及“接下来对连接的操作”,我们将开始写一个新函数来处理连接。在这个新的 handle_connection 函数中,我们从 TCP 流中读取数据,并打印出来,以便观察浏览器发送过来的数据。将代码修改为如示例 20-2 所示:

    +

    文件名:src/main.rs

    +
    use std::{
    +    io::{prelude::*, BufReader},
    +    net::{TcpListener, TcpStream},
    +};
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +
    +    for stream in listener.incoming() {
    +        let stream = stream.unwrap();
    +
    +        handle_connection(stream);
    +    }
    +}
    +
    +fn handle_connection(mut stream: TcpStream) {
    +    let buf_reader = BufReader::new(&stream);
    +    let http_request: Vec<_> = buf_reader
    +        .lines()
    +        .map(|result| result.unwrap())
    +        .take_while(|line| !line.is_empty())
    +        .collect();
    +
    +    println!("Request: {http_request:#?}");
    +}
    +

    示例 20-2: 读取 TcpStream 并打印数据

    +

    这里将 std::io::preludestd::io::BufReader 引入作用域,来获取读写流所需的特定 trait。在 main 函数的 for 循环中,相比获取到连接时打印信息,现在调用新的 handle_connection 函数并向其传递 stream

    +

    handle_connection 中,我们新建了一个 BufReader 实例来封装一个 stream 的可变引用。BufReader 增加了缓存来替我们管理 std::io::Read trait 方法的调用。

    +

    我们创建了一个 http_request 变量来收集浏览器发送给服务端的请求行。这里增加了 Vec<_> 类型注解表明希望将这些行收集到一个 vector 中。

    +

    BufReader 实现了 std::io::BufRead trait,它提供了 lines 方法。lines 方法通过遇到换行符(newline)字节就切分数据流的方式返回一个 Result<String, std::io::Error> 的迭代器。为了获取每一个 String,通过 map 并 unwrap 每一个 Result。如果数据不是有效的 UTF-8 编码或者读取流遇到问题时,Result 可能是一个错误。一如既往生产环境的程序应该更优雅地处理这些错误,不过出于简单的目的我们选择在错误情况下停止程序。

    +

    浏览器通过连续发送两个换行符来代表一个 HTTP 请求的结束,所以为了从流中获取一个请求,我们获取行直到它们不为空。一旦将这些行收集进 vector,就可以使用友好的 debug 格式化打印它们,以便看看 web 浏览器发送给服务端的指令。

    +

    让我们试一试!启动程序并再次在浏览器中发起请求。注意浏览器中仍然会出现错误页面,不过终端中程序的输出现在看起来像这样:

    +
    $ cargo run
    +   Compiling hello v0.1.0 (file:///projects/hello)
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.42s
    +     Running `target/debug/hello`
    +Request: [
    +    "GET / HTTP/1.1",
    +    "Host: 127.0.0.1:7878",
    +    "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:99.0) Gecko/20100101 Firefox/99.0",
    +    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
    +    "Accept-Language: en-US,en;q=0.5",
    +    "Accept-Encoding: gzip, deflate, br",
    +    "DNT: 1",
    +    "Connection: keep-alive",
    +    "Upgrade-Insecure-Requests: 1",
    +    "Sec-Fetch-Dest: document",
    +    "Sec-Fetch-Mode: navigate",
    +    "Sec-Fetch-Site: none",
    +    "Sec-Fetch-User: ?1",
    +    "Cache-Control: max-age=0",
    +]
    +
    +

    根据使用的浏览器不同可能会出现稍微不同的数据。现在我们打印出了请求数据,可以通过观察第一行 GET 之后的路径来解释为何会从浏览器得到多个连接。如果重复的连接都是请求 /,就知道了浏览器尝试重复获取 / 因为它没有从程序得到响应。

    +

    让我们拆开请求数据来理解浏览器向程序请求了什么。

    +

    仔细观察 HTTP 请求

    +

    HTTP 是一个基于文本的协议,同时一个请求有如下格式:

    +
    Method Request-URI HTTP-Version CRLF
    +headers CRLF
    +message-body
    +
    +

    第一行叫做 请求行request line),它存放了客户端请求了什么的信息。请求行的第一部分是所使用的 method,比如 GETPOST,这描述了客户端如何进行请求。这里客户端使用了 GET 请求,表明它在请求信息。

    +

    请求行接下来的部分是 /,它代表客户端请求的 统一资源标识符Uniform Resource IdentifierURI) —— URI 大体上类似,但也不完全类似于 URL(统一资源定位符Uniform Resource Locators)。URI 和 URL 之间的区别对于本章的目的来说并不重要,不过 HTTP 规范使用术语 URI,所以这里可以简单的将 URL 理解为 URI。

    +

    最后一部分是客户端使用的 HTTP 版本,然后请求行以 CRLF 序列 (CRLF 代表回车和换行,carriage return line feed,这是打字机时代的术语!)结束。CRLF 序列也可以写成\r\n,其中\r是回车符,\n是换行符。CRLF 序列将请求行与其余请求数据分开。请注意,打印 CRLF 时,我们会看到一个新行,而不是\r\n

    +

    观察目前运行程序所接收到的数据的请求行,可以看到 GET 是 method,/ 是请求 URI,而 HTTP/1.1 是版本。

    +

    Host: 开始的其余的行是 headers;GET 请求没有 body。

    +

    如果你希望的话,尝试用不同的浏览器发送请求,或请求不同的地址,比如 127.0.0.1:7878/test,来观察请求数据如何变化。

    +

    现在我们知道了浏览器请求了什么。让我们返回一些数据!

    +

    编写响应

    +

    我们将实现在客户端请求的响应中发送数据的功能。响应有如下格式:

    +
    HTTP-Version Status-Code Reason-Phrase CRLF
    +headers CRLF
    +message-body
    +
    +

    第一行叫做 状态行status line),它包含响应的 HTTP 版本、一个数字状态码用以总结请求的结果和一个描述之前状态码的文本原因短语。CRLF 序列之后是任意 header,另一个 CRLF 序列,和响应的 body。

    +

    这里是一个使用 HTTP 1.1 版本的响应例子,其状态码为 200,原因短语为 OK,没有 header,也没有 body:

    +
    HTTP/1.1 200 OK\r\n\r\n
    +
    +

    状态码 200 是一个标准的成功响应。这些文本是一个微型的成功 HTTP 响应。让我们将这些文本写入流作为成功请求的响应!在 handle_connection 函数中,我们需要去掉打印请求数据的 println!,并替换为示例 20-3 中的代码:

    +

    文件名:src/main.rs

    +
    use std::{
    +    io::{prelude::*, BufReader},
    +    net::{TcpListener, TcpStream},
    +};
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +
    +    for stream in listener.incoming() {
    +        let stream = stream.unwrap();
    +
    +        handle_connection(stream);
    +    }
    +}
    +
    +fn handle_connection(mut stream: TcpStream) {
    +    let buf_reader = BufReader::new(&stream);
    +    let http_request: Vec<_> = buf_reader
    +        .lines()
    +        .map(|result| result.unwrap())
    +        .take_while(|line| !line.is_empty())
    +        .collect();
    +
    +    let response = "HTTP/1.1 200 OK\r\n\r\n";
    +
    +    stream.write_all(response.as_bytes()).unwrap();
    +}
    +

    示例 20-3: 将一个微型成功 HTTP 响应写入流

    +

    新代码中的第一行定义了变量 response 来存放将要返回的成功响应的数据。接着,在 response 上调用 as_bytes,因为 streamwrite_all 方法获取一个 &[u8] 并直接将这些字节发送给连接。因为 write_all 操作可能会失败,所以像之前那样对任何错误结果使用 unwrap。同理,在真实世界的应用中这里需要添加错误处理。

    +

    有了这些修改,运行我们的代码并进行请求!我们不再向终端打印任何数据,所以不会再看到除了 Cargo 以外的任何输出。不过当在浏览器中加载 127.0.0.1:7878 时,会得到一个空页面而不是错误。太棒了!我们刚刚手写收发了一个 HTTP 请求与响应。

    +

    返回真正的 HTML

    +

    让我们实现不只是返回空页面的功能。在项目根目录创建一个新文件,hello.html —— 也就是说,不是在 src 目录。在此可以放入任何你期望的 HTML;列表 20-4 展示了一个可能的文本:

    +

    文件名:hello.html

    +
    <!DOCTYPE html>
    +<html lang="en">
    +  <head>
    +    <meta charset="utf-8">
    +    <title>Hello!</title>
    +  </head>
    +  <body>
    +    <h1>Hello!</h1>
    +    <p>Hi from Rust</p>
    +  </body>
    +</html>
    +
    +

    示例 20-4: 一个简单的 HTML 文件用来作为响应

    +

    这是一个极小化的 HTML5 文档,它有一个标题和一小段文本。为了在 server 接受请求时返回它,需要如示例 20-5 所示修改 handle_connection 来读取 HTML 文件,将其加入到响应的 body 中,并发送:

    +

    文件名:src/main.rs

    +
    use std::{
    +    fs,
    +    io::{prelude::*, BufReader},
    +    net::{TcpListener, TcpStream},
    +};
    +// --snip--
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +
    +    for stream in listener.incoming() {
    +        let stream = stream.unwrap();
    +
    +        handle_connection(stream);
    +    }
    +}
    +
    +fn handle_connection(mut stream: TcpStream) {
    +    let buf_reader = BufReader::new(&stream);
    +    let http_request: Vec<_> = buf_reader
    +        .lines()
    +        .map(|result| result.unwrap())
    +        .take_while(|line| !line.is_empty())
    +        .collect();
    +
    +    let status_line = "HTTP/1.1 200 OK";
    +    let contents = fs::read_to_string("hello.html").unwrap();
    +    let length = contents.len();
    +
    +    let response =
    +        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
    +
    +    stream.write_all(response.as_bytes()).unwrap();
    +}
    +

    示例 20-5: 将 hello.html 的内容作为响应 body 发送

    +

    我们在开头 use 语句将标准库的文件系统模块 fs 引入作用域。打开和读取文件的代码应该看起来很熟悉,因为第十二章 I/O 项目的示例 12-4 中读取文件内容时出现过类似的代码。

    +

    接下来,使用 format! 将文件内容加入到将要写入流的成功响应的 body 中。

    +

    使用 cargo run 运行程序,在浏览器加载 127.0.0.1:7878,你应该会看到渲染出来的 HTML 文件!

    +

    目前忽略了 http_request 中的请求数据并无条件的发送了 HTML 文件的内容。这意味着如果尝试在浏览器中请求 127.0.0.1:7878/something-else 也会得到同样的 HTML 响应。目前我们的 server 的作用是非常有限的,也不是大部分 server 所做的;让我们检查请求并只对格式良好(well-formed)的请求 / 发送 HTML 文件。

    +

    验证请求并有选择的进行响应

    +

    目前我们的 web server 不管客户端请求什么都会返回相同的 HTML 文件。让我们增加在返回 HTML 文件前检查浏览器是否请求 /,并在其请求任何其他内容时返回错误的功能。为此需要如示例 20-6 那样修改 handle_connection。新代码接收到的请求的内容与已知的 / 请求的一部分做比较,并增加了 ifelse 块来区别处理请求:

    +

    文件名:src/main.rs

    +
    use std::{
    +    fs,
    +    io::{prelude::*, BufReader},
    +    net::{TcpListener, TcpStream},
    +};
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +
    +    for stream in listener.incoming() {
    +        let stream = stream.unwrap();
    +
    +        handle_connection(stream);
    +    }
    +}
    +// --snip--
    +
    +fn handle_connection(mut stream: TcpStream) {
    +    let buf_reader = BufReader::new(&stream);
    +    let request_line = buf_reader.lines().next().unwrap().unwrap();
    +
    +    if request_line == "GET / HTTP/1.1" {
    +        let status_line = "HTTP/1.1 200 OK";
    +        let contents = fs::read_to_string("hello.html").unwrap();
    +        let length = contents.len();
    +
    +        let response = format!(
    +            "{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"
    +        );
    +
    +        stream.write_all(response.as_bytes()).unwrap();
    +    } else {
    +        // some other request
    +    }
    +}
    +

    示例 20-6: 以不同于其它请求的方式处理 / 请求

    +

    我们只看 HTTP 请求的第一行,所以不同于将整个请求读取进 vector 中,这里调用 next 从迭代器中获取第一项。第一个 unwrap 负责处理 Option 并在迭代器没有项时停止程序。第二个 unwrap 处理 Result 并与示例 20-2 中增加的 map 中的 unwrap 有着相同的效果。

    +

    接下来检查 request_line 是否等于一个 / 路径的 GET 请求。如果是,if 代码块返回 HTML 文件的内容。

    +

    如果 request_line 等于一个 / 路径的 GET 请求,就说明接收的是其他请求。我们之后会在 else 块中增加代码来响应所有其他请求。

    +

    现在如果运行代码并请求 127.0.0.1:7878,就会得到 hello.html 中的 HTML。如果进行任何其他请求,比如 127.0.0.1:7878/something-else,则会得到像运行示例 20-1 和 20-2 中代码那样的连接错误。

    +

    现在向示例 20-7 的 else 块增加代码来返回一个带有 404 状态码的响应,这代表了所请求的内容没有找到。接着也会返回一个 HTML 向浏览器终端用户表明此意:

    +

    文件名:src/main.rs

    +
    use std::{
    +    fs,
    +    io::{prelude::*, BufReader},
    +    net::{TcpListener, TcpStream},
    +};
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +
    +    for stream in listener.incoming() {
    +        let stream = stream.unwrap();
    +
    +        handle_connection(stream);
    +    }
    +}
    +
    +fn handle_connection(mut stream: TcpStream) {
    +    let buf_reader = BufReader::new(&stream);
    +    let request_line = buf_reader.lines().next().unwrap().unwrap();
    +
    +    if request_line == "GET / HTTP/1.1" {
    +        let status_line = "HTTP/1.1 200 OK";
    +        let contents = fs::read_to_string("hello.html").unwrap();
    +        let length = contents.len();
    +
    +        let response = format!(
    +            "{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"
    +        );
    +
    +        stream.write_all(response.as_bytes()).unwrap();
    +    // --snip--
    +    } else {
    +        let status_line = "HTTP/1.1 404 NOT FOUND";
    +        let contents = fs::read_to_string("404.html").unwrap();
    +        let length = contents.len();
    +
    +        let response = format!(
    +            "{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"
    +        );
    +
    +        stream.write_all(response.as_bytes()).unwrap();
    +    }
    +}
    +

    示例 20-7: 对于任何不是 / 的请求返回 404 状态码的响应和错误页面

    +

    这里,响应的状态行有状态码 404 和原因短语 NOT FOUND。仍然没有返回任何 header,而其 body 将是 404.html 文件中的 HTML。需要在 hello.html 同级目录创建 404.html 文件作为错误页面;这一次也可以随意使用任何 HTML 或使用示例 20-8 中的示例 HTML:

    +

    文件名:404.html

    +
    <!DOCTYPE html>
    +<html lang="en">
    +  <head>
    +    <meta charset="utf-8">
    +    <title>Hello!</title>
    +  </head>
    +  <body>
    +    <h1>Oops!</h1>
    +    <p>Sorry, I don't know what you're asking for.</p>
    +  </body>
    +</html>
    +
    +

    示例 20-8: 任何 404 响应所返回错误页面内容样例

    +

    有了这些修改,再次运行 server。请求 127.0.0.1:7878 应该会返回 hello.html 的内容,而对于任何其他请求,比如 127.0.0.1:7878/foo,应该会返回 404.html 中的错误 HTML!

    +

    少量代码重构

    +

    目前 ifelse 块中的代码有很多的重复:他们都读取文件并将其内容写入流。唯一的区别是状态行和文件名。为了使代码更为简明,将这些区别分别提取到一行 ifelse 中,对状态行和文件名变量赋值;然后在读取文件和写入响应的代码中无条件的使用这些变量。重构后取代了大段 ifelse 块代码后的结果如示例 20-9 所示:

    +

    文件名:src/main.rs

    +
    use std::{
    +    fs,
    +    io::{prelude::*, BufReader},
    +    net::{TcpListener, TcpStream},
    +};
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +
    +    for stream in listener.incoming() {
    +        let stream = stream.unwrap();
    +
    +        handle_connection(stream);
    +    }
    +}
    +// --snip--
    +
    +fn handle_connection(mut stream: TcpStream) {
    +    // --snip--
    +    let buf_reader = BufReader::new(&stream);
    +    let request_line = buf_reader.lines().next().unwrap().unwrap();
    +
    +    let (status_line, filename) = if request_line == "GET / HTTP/1.1" {
    +        ("HTTP/1.1 200 OK", "hello.html")
    +    } else {
    +        ("HTTP/1.1 404 NOT FOUND", "404.html")
    +    };
    +
    +    let contents = fs::read_to_string(filename).unwrap();
    +    let length = contents.len();
    +
    +    let response =
    +        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
    +
    +    stream.write_all(response.as_bytes()).unwrap();
    +}
    +

    示例 20-9: 重构使得 ifelse 块中只包含两个情况所不同的代码

    +

    现在 ifelse 块所做的唯一的事就是在一个元组中返回合适的状态行和文件名的值;接着使用第十九章讲到的使用模式的 let 语句通过解构元组的两部分为 filenameheader 赋值。

    +

    之前读取文件和写入响应的冗余代码现在位于 ifelse 块之外,并会使用变量 status_linefilename。这样更易于观察这两种情况真正有何不同,还意味着如果需要改变如何读取文件或写入响应时只需要更新一处的代码。示例 20-9 中代码的行为与示例 20-8 完全一样。

    +

    好极了!我们有了一个 40 行左右 Rust 代码的小而简单的 server,它对一个请求返回页面内容而对所有其他请求返回 404 响应。

    +

    目前 server 运行于单线程中,它一次只能处理一个请求。让我们模拟一些慢请求来看看这如何会成为一个问题,并进行修复以便 server 可以一次处理多个请求。

    +

    将单线程 server 变为多线程 server

    +
    +

    ch21-02-multithreaded.md +
    +commit 98c6225e5fb8255349ec0dc235433530ed3fb534

    +
    +

    目前 server 会依次处理每一个请求,意味着它在完成第一个连接的处理之前不会处理第二个连接。如果 server 正接收越来越多的请求,这类串行操作会使性能越来越差。如果一个请求花费很长时间来处理,随后而来的请求则不得不等待这个长请求结束,即便这些新请求可以很快就处理完。我们需要修复这种情况,不过首先让我们实际尝试一下这个问题。

    +

    在当前 server 实现中模拟慢请求

    +

    让我们看看一个慢请求如何影响当前 server 实现中的其他请求。示例 20-10 通过模拟慢响应实现了 /sleep 请求处理,它会使 server 在响应之前休眠五秒。

    +

    文件名:src/main.rs

    +
    use std::{
    +    fs,
    +    io::{prelude::*, BufReader},
    +    net::{TcpListener, TcpStream},
    +    thread,
    +    time::Duration,
    +};
    +// --snip--
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +
    +    for stream in listener.incoming() {
    +        let stream = stream.unwrap();
    +
    +        handle_connection(stream);
    +    }
    +}
    +
    +fn handle_connection(mut stream: TcpStream) {
    +    // --snip--
    +
    +    let buf_reader = BufReader::new(&stream);
    +    let request_line = buf_reader.lines().next().unwrap().unwrap();
    +
    +    let (status_line, filename) = match &request_line[..] {
    +        "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
    +        "GET /sleep HTTP/1.1" => {
    +            thread::sleep(Duration::from_secs(5));
    +            ("HTTP/1.1 200 OK", "hello.html")
    +        }
    +        _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
    +    };
    +
    +    // --snip--
    +
    +    let contents = fs::read_to_string(filename).unwrap();
    +    let length = contents.len();
    +
    +    let response =
    +        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
    +
    +    stream.write_all(response.as_bytes()).unwrap();
    +}
    +

    示例 20-10: 通过休眠五秒来模拟慢请求

    +

    if 切换到 match 后现在有三个分支了。我们需要显式匹配一个 slice 的 request_line 以匹配字符串字面值的模式。match 不会像相等方法那样自动引用和解引用。

    +

    第一个分支与示例 20-9 中的 if 代码块相同。第二个分支匹配一个 /sleep 请求。当接收到这个请求时,server 在渲染成功 HTML 页面之前会先休眠五秒。第三个分支与示例 20-9 中的 else 代码块相同。

    +

    现在就可以真切的看出我们的 server 有多么的原始:真实的库将会以更简洁的方式处理多请求识别问题!

    +

    使用 cargo run 启动 server,并接着打开两个浏览器窗口:一个请求 http://127.0.0.1:7878/ 而另一个请求 http://127.0.0.1:7878/sleep 。如果像之前一样多次请求 /,会发现响应的比较快速。不过如果请求 /sleep 之后再请求 /,就会看到 / 会等待直到 sleep 休眠完五秒之后才出现。

    +

    有多种技术可以用来避免所有请求都排在慢请求之后;我们将要实现的一个便是线程池。

    +

    使用线程池改善吞吐量

    +

    线程池thread pool)是一组预先分配的等待或准备处理任务的线程。当程序收到一个新任务,线程池中的一个线程会被分配任务,这个线程会离开并处理任务。其余的线程则可用于处理在第一个线程处理任务的同时处理其他接收到的任务。当第一个线程处理完任务时,它会返回空闲线程池中等待处理新任务。线程池允许我们并发处理连接,增加 server 的吞吐量。

    +

    我们会将池中线程限制为较少的数量,以防拒绝服务(Denial of Service,DoS)攻击;如果程序为每一个接收的请求都新建一个线程,某人向 server 发起千万级的请求时会耗尽服务器的资源并导致所有请求的处理都被终止。

    +

    不同于分配无限的线程,线程池中将有固定数量的等待线程。当新进请求时,将请求发送到线程池中做处理。线程池会维护一个接收请求的队列。每一个线程会从队列中取出一个请求,处理请求,接着向队列索取另一个请求。通过这种设计,则可以并发处理 N 个请求,其中 N 为线程数。如果每一个线程都在响应慢请求,之后的请求仍然会阻塞队列,不过相比之前增加了能处理的慢请求的数量。

    +

    这个设计仅仅是多种改善 web server 吞吐量的方法之一。其他可供探索的方法有 fork/join 模型fork/join model)、单线程异步 I/O 模型single-threaded async I/O model)或者多线程异步 I/O 模型multi-threaded async I/O model)。如果你对这个主题感兴趣,则可以阅读更多关于其他解决方案的内容并尝试实现它们;对于一个像 Rust 这样的底层语言,所有这些方法都是可能的。

    +

    在开始之前,让我们讨论一下线程池应用看起来怎样。当尝试设计代码时,首先编写客户端接口确实有助于指导代码设计。以期望的调用方式来构建 API 代码的结构,接着在这个结构之内实现功能,而不是先实现功能再设计公有 API。

    +

    类似于第十二章项目中使用的测试驱动开发。这里将要使用编译器驱动开发(compiler-driven development)。我们将编写调用所期望的函数的代码,接着观察编译器错误告诉我们接下来需要修改什么使得代码可以工作。不过在开始之前,我们将探索不会作为起点的技术。

    +

    为每一个请求分配线程

    +

    首先,让我们探索一下为每一个连接都创建一个线程的代码看起来如何。这并不是最终方案,因为正如之前讲到的它会潜在的分配无限的线程,不过这是一个可用的多线程 server 的起点。接着我们会增加线程池作为改进,这样比较两个方案将会更容易。示例 20-11 展示了 main 的改变,它在 for 循环中为每一个流分配了一个新线程进行处理:

    +

    文件名:src/main.rs

    +
    use std::{
    +    fs,
    +    io::{prelude::*, BufReader},
    +    net::{TcpListener, TcpStream},
    +    thread,
    +    time::Duration,
    +};
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +
    +    for stream in listener.incoming() {
    +        let stream = stream.unwrap();
    +
    +        thread::spawn(|| {
    +            handle_connection(stream);
    +        });
    +    }
    +}
    +
    +fn handle_connection(mut stream: TcpStream) {
    +    let buf_reader = BufReader::new(&stream);
    +    let request_line = buf_reader.lines().next().unwrap().unwrap();
    +
    +    let (status_line, filename) = match &request_line[..] {
    +        "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
    +        "GET /sleep HTTP/1.1" => {
    +            thread::sleep(Duration::from_secs(5));
    +            ("HTTP/1.1 200 OK", "hello.html")
    +        }
    +        _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
    +    };
    +
    +    let contents = fs::read_to_string(filename).unwrap();
    +    let length = contents.len();
    +
    +    let response =
    +        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
    +
    +    stream.write_all(response.as_bytes()).unwrap();
    +}
    +

    示例 20-11: 为每一个流新建一个线程

    +

    正如第十六章讲到的,thread::spawn 会创建一个新线程并在其中运行闭包中的代码。如果运行这段代码并在在浏览器中加载 /sleep,接着在另两个浏览器标签页中加载 /,确实会发现 / 请求不必等待 /sleep 结束。不过正如之前提到的,这最终会使系统崩溃因为我们无限制的创建新线程。

    +

    创建有限数量的线程

    +

    我们期望线程池以类似且熟悉的方式工作,以便从线程切换到线程池并不会对使用该 API 的代码做出较大的修改。示例 20-12 展示我们希望用来替换 thread::spawnThreadPool 结构体的假想接口:

    +

    文件名:src/main.rs

    +
    use std::{
    +    fs,
    +    io::{prelude::*, BufReader},
    +    net::{TcpListener, TcpStream},
    +    thread,
    +    time::Duration,
    +};
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +    let pool = ThreadPool::new(4);
    +
    +    for stream in listener.incoming() {
    +        let stream = stream.unwrap();
    +
    +        pool.execute(|| {
    +            handle_connection(stream);
    +        });
    +    }
    +}
    +
    +fn handle_connection(mut stream: TcpStream) {
    +    let buf_reader = BufReader::new(&stream);
    +    let request_line = buf_reader.lines().next().unwrap().unwrap();
    +
    +    let (status_line, filename) = match &request_line[..] {
    +        "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
    +        "GET /sleep HTTP/1.1" => {
    +            thread::sleep(Duration::from_secs(5));
    +            ("HTTP/1.1 200 OK", "hello.html")
    +        }
    +        _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
    +    };
    +
    +    let contents = fs::read_to_string(filename).unwrap();
    +    let length = contents.len();
    +
    +    let response =
    +        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
    +
    +    stream.write_all(response.as_bytes()).unwrap();
    +}
    +

    示例 20-12: 假想的 ThreadPool 接口

    +

    这里使用 ThreadPool::new 来创建一个新的线程池,它有一个可配置的线程数的参数,在这里是四。这样在 for 循环中,pool.execute 有着类似 thread::spawn 的接口,它获取一个线程池运行于每一个流的闭包。pool.execute 需要实现为获取闭包并传递给池中的线程运行。这段代码还不能编译,不过通过尝试,编译器会指导我们如何修复它。

    +

    采用编译器驱动构建 ThreadPool

    +

    继续并对示例 20-12 中的 src/main.rs 做出修改,并利用来自 cargo check 的编译器错误来驱动开发。下面是我们得到的第一个错误:

    +
    $ cargo check
    +    Checking hello v0.1.0 (file:///projects/hello)
    +error[E0433]: failed to resolve: use of undeclared type `ThreadPool`
    +  --> src/main.rs:11:16
    +   |
    +11 |     let pool = ThreadPool::new(4);
    +   |                ^^^^^^^^^^ use of undeclared type `ThreadPool`
    +
    +For more information about this error, try `rustc --explain E0433`.
    +error: could not compile `hello` (bin "hello") due to 1 previous error
    +
    +

    好的,这告诉我们需要一个 ThreadPool 类型或模块,所以我们将构建一个。ThreadPool 的实现会与 web server 的特定工作相独立,所以让我们从 hello crate 切换到存放 ThreadPool 实现的新库 crate。这也意味着可以在任何工作中使用这个单独的线程池库,而不仅仅是处理网络请求。

    +

    创建 src/lib.rs 文件,它包含了目前可用的最简单的 ThreadPool 定义:

    +

    文件名:src/lib.rs

    +
    pub struct ThreadPool;
    +

    接着编辑 main.rs 文件通过在 src/main.rs 的开头增加如下代码将 ThreadPool 从库 crate 引入作用域:

    +

    文件名:src/main.rs

    +
    use hello::ThreadPool;
    +use std::{
    +    fs,
    +    io::{prelude::*, BufReader},
    +    net::{TcpListener, TcpStream},
    +    thread,
    +    time::Duration,
    +};
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +    let pool = ThreadPool::new(4);
    +
    +    for stream in listener.incoming() {
    +        let stream = stream.unwrap();
    +
    +        pool.execute(|| {
    +            handle_connection(stream);
    +        });
    +    }
    +}
    +
    +fn handle_connection(mut stream: TcpStream) {
    +    let buf_reader = BufReader::new(&stream);
    +    let request_line = buf_reader.lines().next().unwrap().unwrap();
    +
    +    let (status_line, filename) = match &request_line[..] {
    +        "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
    +        "GET /sleep HTTP/1.1" => {
    +            thread::sleep(Duration::from_secs(5));
    +            ("HTTP/1.1 200 OK", "hello.html")
    +        }
    +        _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
    +    };
    +
    +    let contents = fs::read_to_string(filename).unwrap();
    +    let length = contents.len();
    +
    +    let response =
    +        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
    +
    +    stream.write_all(response.as_bytes()).unwrap();
    +}
    +

    这仍然不能工作,再次尝试运行来得到下一个需要解决的错误:

    +
    $ cargo check
    +    Checking hello v0.1.0 (file:///projects/hello)
    +error[E0599]: no function or associated item named `new` found for struct `ThreadPool` in the current scope
    +  --> src/main.rs:12:28
    +   |
    +12 |     let pool = ThreadPool::new(4);
    +   |                            ^^^ function or associated item not found in `ThreadPool`
    +
    +For more information about this error, try `rustc --explain E0599`.
    +error: could not compile `hello` (bin "hello") due to 1 previous error
    +
    +

    这告诉我们下一步是为 ThreadPool 创建一个叫做 new 的关联函数。我们还知道 new 需要有一个参数可以接受 4,而且 new 应该返回 ThreadPool 实例。让我们实现拥有此特征的最小化 new 函数:

    +

    文件夹:src/lib.rs

    +
    pub struct ThreadPool;
    +
    +impl ThreadPool {
    +    pub fn new(size: usize) -> ThreadPool {
    +        ThreadPool
    +    }
    +}
    +

    这里选择 usize 作为 size 参数的类型,因为我们知道为负的线程数没有意义。我们还知道将使用 4 作为线程集合的元素数量,这也就是使用 usize 类型的原因,如第三章 “整型” 部分所讲。

    +

    再次编译检查这段代码:

    +
    $ cargo check
    +    Checking hello v0.1.0 (file:///projects/hello)
    +error[E0599]: no method named `execute` found for struct `ThreadPool` in the current scope
    +  --> src/main.rs:17:14
    +   |
    +17 |         pool.execute(|| {
    +   |         -----^^^^^^^ method not found in `ThreadPool`
    +
    +For more information about this error, try `rustc --explain E0599`.
    +error: could not compile `hello` (bin "hello") due to 1 previous error
    +
    +

    现在有了一个警告和一个错误。暂时先忽略警告,发生错误是因为并没有 ThreadPool 上的 execute 方法。回忆 “创建有限数量的线程” 部分我们决定线程池应该有与 thread::spawn 类似的接口,同时我们将实现 execute 函数来获取传递的闭包并将其传递给池中的空闲线程执行。

    +

    我们会在 ThreadPool 上定义 execute 函数来获取一个闭包参数。回忆第十三章的 “将被捕获的值移出闭包和 Fn trait” 部分,闭包作为参数时可以使用三个不同的 trait:FnFnMutFnOnce。我们需要决定这里应该使用哪种闭包。最终需要实现的类似于标准库的 thread::spawn,所以我们可以观察 thread::spawn 的签名在其参数中使用了何种 bound。查看文档会发现:

    +
    pub fn spawn<F, T>(f: F) -> JoinHandle<T>
    +    where
    +        F: FnOnce() -> T,
    +        F: Send + 'static,
    +        T: Send + 'static,
    +

    F 是这里我们关心的参数;T 与返回值有关所以我们并不关心。考虑到 spawn 使用 FnOnce 作为 F 的 trait bound,这可能也是我们需要的,因为最终会将传递给 execute 的参数传给 spawn。因为处理请求的线程只会执行闭包一次,这也进一步确认了 FnOnce 是我们需要的 trait,这里符合 FnOnceOnce 的意思。

    +

    F 还有 trait bound Send 和生命周期绑定 'static,这对我们的情况也是有意义的:需要 Send 来将闭包从一个线程转移到另一个线程,而 'static 是因为并不知道线程会执行多久。让我们编写一个使用带有这些 bound 的泛型参数 FThreadPoolexecute 方法:

    +

    文件名:src/lib.rs

    +
    pub struct ThreadPool;
    +
    +impl ThreadPool {
    +    // --snip--
    +    pub fn new(size: usize) -> ThreadPool {
    +        ThreadPool
    +    }
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +    }
    +}
    +

    FnOnce trait 仍然需要之后的 (),因为这里的 FnOnce 代表一个没有参数也没有返回值的闭包。正如函数的定义,返回值类型可以从签名中省略,不过即便没有参数也需要括号。

    +

    这里再一次增加了 execute 方法的最小化实现:它没有做任何工作,只是尝试让代码能够编译。再次进行检查:

    +
    $ cargo check
    +    Checking hello v0.1.0 (file:///projects/hello)
    +    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.24s
    +
    +

    现在就只有警告了!这意味着能够编译了!注意如果尝试 cargo run 运行程序并在浏览器中发起请求,仍会在浏览器中出现在本章开始时那样的错误。这个库实际上还没有调用传递给 execute 的闭包!

    +
    +

    一个你可能听说过的关于像 Haskell 和 Rust 这样有严格编译器的语言的说法是 “如果代码能够编译,它就能工作”。这是一个提醒大家的好时机,实际上这并不是普适的。我们的项目可以编译,不过它完全没有做任何工作!如果构建一个真实且功能完整的项目,则需花费大量的时间来开始编写单元测试来检查代码能否编译 并且 拥有期望的行为。

    +
    +

    new 中验证池中线程数量

    +

    这里仍然存在警告是因为其并没有对 newexecute 的参数做任何操作。让我们用期望的行为来实现这些函数。以考虑 new 作为开始。之前选择使用无符号类型作为 size 参数的类型,因为线程数为负的线程池没有意义。然而,线程数为零的线程池同样没有意义,不过零是一个完全有效的 usize 值。让我们增加在返回 ThreadPool 实例之前检查 size 是否大于零的代码,并使用 assert! 宏在得到零时 panic,如示例 20-13 所示:

    +

    文件名:src/lib.rs

    +
    pub struct ThreadPool;
    +
    +impl ThreadPool {
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        ThreadPool
    +    }
    +
    +    // --snip--
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +    }
    +}
    +

    示例 20-13: 实现 ThreadPool::newsize 为零时 panic

    +

    这里也用文档注释为 ThreadPool 增加了一些文档。注意这里遵循了良好的文档实践并增加了一个部分来提示函数会 panic 的情况,正如第十四章所讨论的。尝试运行 cargo doc --open 并点击 ThreadPool 结构体来查看生成的 new 的文档看起来如何!

    +

    相比像这里使用 assert! 宏,也可以让 new 像之前 I/O 项目中示例 12-9 中 Config::build 那样将 new 更改为 build 并返回一个 Result,不过在这里我们选择创建一个没有任何线程的线程池应该是不可恢复的错误。如果你想做的更好,尝试编写一个采用如下签名的名为 build 的函数来对比一下 new 函数:

    +
    pub fn build(size: usize) -> Result<ThreadPool, PoolCreationError> {
    +

    分配空间以储存线程

    +

    现在有了一个有效的线程池线程数,就可以实际创建这些线程并在返回结构体之前将它们储存在 ThreadPool 结构体中。不过如何 “储存” 一个线程?让我们再看看 thread::spawn 的签名:

    +
    pub fn spawn<F, T>(f: F) -> JoinHandle<T>
    +    where
    +        F: FnOnce() -> T,
    +        F: Send + 'static,
    +        T: Send + 'static,
    +

    spawn 返回 JoinHandle<T>,其中 T 是闭包返回的类型。尝试使用 JoinHandle 来看看会发生什么。在我们的情况中,传递给线程池的闭包会处理连接并不返回任何值,所以 T 将会是单元类型 ()

    +

    示例 20-14 中的代码可以编译,不过实际上还并没有创建任何线程。我们改变了 ThreadPool 的定义来存放一个 thread::JoinHandle<()> 的 vector 实例,使用 size 容量来初始化,并设置一个 for 循环来运行创建线程的代码,并返回包含这些线程的 ThreadPool 实例:

    +

    文件名:src/lib.rs

    +
    use std::thread;
    +
    +pub struct ThreadPool {
    +    threads: Vec<thread::JoinHandle<()>>,
    +}
    +
    +impl ThreadPool {
    +    // --snip--
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let mut threads = Vec::with_capacity(size);
    +
    +        for _ in 0..size {
    +            // create some threads and store them in the vector
    +        }
    +
    +        ThreadPool { threads }
    +    }
    +    // --snip--
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +    }
    +}
    +

    示例 20-14: 为 ThreadPool 创建一个 vector 来存放线程

    +

    这里将 std::thread 引入库 crate 的作用域,因为使用了 thread::JoinHandle 作为 ThreadPool 中 vector 元素的类型。

    +

    在得到了有效的数量之后,ThreadPool 新建一个存放 size 个元素的 vector。with_capacity 函数与 Vec::new 做了同样的工作,不过有一个重要的区别:它为 vector 预先分配空间。因为已经知道了 vector 中需要 size 个元素,预先进行分配比仅仅 Vec::new 要稍微有效率一些,因为 Vec::new 随着插入元素而重新改变大小。

    +

    如果再次运行 cargo check,它应该会成功。

    +

    Worker 结构体负责从 ThreadPool 中将代码传递给线程

    +

    示例 20-14 的 for 循环中留下了一个关于创建线程的注释。如何实际创建线程呢?这是一个难题。标准库提供的创建线程的方法,thread::spawn,它期望获取一些一旦创建线程就应该执行的代码。然而,我们希望开始线程并使其等待稍后传递的代码。标准库的线程实现并没有包含这么做的方法;我们必须自己实现。

    +

    我们将要实现的行为是创建线程并稍后发送代码,这会在 ThreadPool 和线程间引入一个新数据类型来管理这种新行为。这个数据结构称为 Worker,这是一个池实现中的常见概念。想象一下在餐馆厨房工作的员工:员工等待来自客户的订单,他们负责接受这些订单并完成它们。

    +

    不同于在线程池中储存一个 JoinHandle<()> 实例的 vector,我们会储存 Worker 结构体的实例。每一个 Worker 会储存一个单独的 JoinHandle<()> 实例。接着会在 Worker 上实现一个方法,该方法将闭包发送到已经运行的线程中执行。我们还会赋予每一个 worker id,这样就可以在日志和调试中区别线程池中的不同 worker。

    +

    如下是创建 ThreadPool 时会发生的新过程。在通过如下方式设置完 Worker 之后,我们会实现向线程发送闭包的代码:

    +
      +
    1. 定义 Worker 结构体存放 idJoinHandle<()>
    2. +
    3. 修改 ThreadPool 存放一个 Worker 实例的 vector
    4. +
    5. 定义 Worker::new 函数,它获取一个 id 数字并返回一个带有 id 和用空闭包分配的线程的 Worker 实例
    6. +
    7. ThreadPool::new 中,使用 for 循环计数生成 id,使用这个 id 新建 Worker,并储存进 vector 中
    8. +
    +

    如果你渴望挑战,在查示例 20-15 中的代码之前尝试自己实现这些修改。

    +

    准备好了吗?示例 20-15 就是一个做出了这些修改的例子:

    +

    文件名:src/lib.rs

    +
    use std::thread;
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +}
    +
    +impl ThreadPool {
    +    // --snip--
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id));
    +        }
    +
    +        ThreadPool { workers }
    +    }
    +    // --snip--
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +    }
    +}
    +
    +struct Worker {
    +    id: usize,
    +    thread: thread::JoinHandle<()>,
    +}
    +
    +impl Worker {
    +    fn new(id: usize) -> Worker {
    +        let thread = thread::spawn(|| {});
    +
    +        Worker { id, thread }
    +    }
    +}
    +

    示例 20-15: 修改 ThreadPool 存放 Worker 实例而不是直接存放线程

    +

    这里将 ThreadPool 中字段名从 threads 改为 workers,因为它现在储存 Worker 而不是 JoinHandle<()>。使用 for 循环中的计数作为 Worker::new 的参数,并将每一个新建的 Worker 储存在叫做 workers 的 vector 中。

    +

    Worker 结构体和其 new 函数是私有的,因为外部代码(比如 src/main.rs 中的 server)并不需要知道关于 ThreadPool 中使用 Worker 结构体的实现细节。Worker::new 函数使用 id 参数并储存了使用一个空闭包创建的 JoinHandle<()>

    +
    +

    注意:如果操作系统因为没有足够的系统资源而无法创建线程时,thread::spawn 会 panic。这会导致整个 server panic,即使一些线程可能创建成功了。出于简单的考虑,这个行为是可行的,不过在一个生产级别的线程池实现中,你可能会希望使用 std::thread::Builder 和其 spawn 方法来返回一个 Result

    +
    +

    这段代码能够编译并用指定给 ThreadPool::new 的参数创建储存了一系列的 Worker 实例,不过 仍然 没有处理 execute 中得到的闭包。让我们聊聊接下来怎么做。

    +

    使用信道向线程发送请求

    +

    下一个需要解决的问题是传递给 thread::spawn 的闭包完全没有做任何工作。目前,我们在 execute 方法中获得期望执行的闭包,不过在创建 ThreadPool 的过程中创建每一个 Worker 时需要向 thread::spawn 传递一个闭包。

    +

    我们希望刚创建的 Worker 结构体能够从 ThreadPool 的队列中获取需要执行的代码,并发送到线程中执行它们。

    +

    在第十六章,我们学习了 信道 —— 一个沟通两个线程的简单手段 —— 对于这个例子来说则是绝佳的。这里信道将充当任务队列的作用,execute 将通过 ThreadPool 向其中线程正在寻找工作的 Worker 实例发送任务。如下是这个计划:

    +
      +
    1. ThreadPool 会创建一个信道并充当发送者。
    2. +
    3. 每个 Worker 将会充当接收者。
    4. +
    5. 新建一个 Job 结构体来存放用于向信道中发送的闭包。
    6. +
    7. execute 方法会在发送者发出期望执行的任务。
    8. +
    9. 在线程中,Worker 会遍历接收者并执行任何接收到的任务。
    10. +
    +

    让我们以在 ThreadPool::new 中创建信道并让 ThreadPool 实例充当发送者开始,如示例 20-16 所示。Job 是将在信道中发出的类型,目前它是一个没有任何内容的结构体:

    +

    文件名:src/lib.rs

    +
    use std::{sync::mpsc, thread};
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: mpsc::Sender<Job>,
    +}
    +
    +struct Job;
    +
    +impl ThreadPool {
    +    // --snip--
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id));
    +        }
    +
    +        ThreadPool { workers, sender }
    +    }
    +    // --snip--
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +    }
    +}
    +
    +struct Worker {
    +    id: usize,
    +    thread: thread::JoinHandle<()>,
    +}
    +
    +impl Worker {
    +    fn new(id: usize) -> Worker {
    +        let thread = thread::spawn(|| {});
    +
    +        Worker { id, thread }
    +    }
    +}
    +

    示例 20-16: 修改 ThreadPool 来储存一个传输 Job 实例的发送者

    +

    ThreadPool::new 中,新建了一个信道,并接着让线程池在接收端等待。这段代码能够成功编译。

    +

    让我们尝试在线程池创建每个 worker 时将接收者传递给它们。须知我们希望在 worker 所分配的线程中使用接收者,所以将在闭包中引用 receiver 参数。示例 20-17 中展示的代码还不能编译:

    +

    文件名:src/lib.rs

    +
    use std::{sync::mpsc, thread};
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: mpsc::Sender<Job>,
    +}
    +
    +struct Job;
    +
    +impl ThreadPool {
    +    // --snip--
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id, receiver));
    +        }
    +
    +        ThreadPool { workers, sender }
    +    }
    +    // --snip--
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +    }
    +}
    +
    +// --snip--
    +
    +
    +struct Worker {
    +    id: usize,
    +    thread: thread::JoinHandle<()>,
    +}
    +
    +impl Worker {
    +    fn new(id: usize, receiver: mpsc::Receiver<Job>) -> Worker {
    +        let thread = thread::spawn(|| {
    +            receiver;
    +        });
    +
    +        Worker { id, thread }
    +    }
    +}
    +

    示例 20-17: 将信道的接收端传递给 worker

    +

    这是一些小而直观的修改:将接收者传递进了 Worker::new,并接着在闭包中使用它。

    +

    如果尝试 check 代码,会得到这个错误:

    +
    $ cargo check
    +    Checking hello v0.1.0 (file:///projects/hello)
    +error[E0382]: use of moved value: `receiver`
    +  --> src/lib.rs:26:42
    +   |
    +21 |         let (sender, receiver) = mpsc::channel();
    +   |                      -------- move occurs because `receiver` has type `std::sync::mpsc::Receiver<Job>`, which does not implement the `Copy` trait
    +...
    +25 |         for id in 0..size {
    +   |         ----------------- inside of this loop
    +26 |             workers.push(Worker::new(id, receiver));
    +   |                                          ^^^^^^^^ value moved here, in previous iteration of loop
    +   |
    +note: consider changing this parameter type in method `new` to borrow instead if owning the value isn't necessary
    +  --> src/lib.rs:47:33
    +   |
    +47 |     fn new(id: usize, receiver: mpsc::Receiver<Job>) -> Worker {
    +   |        --- in this method       ^^^^^^^^^^^^^^^^^^^ this parameter takes ownership of the value
    +help: consider moving the expression out of the loop so it is only moved once
    +   |
    +25 ~         let mut value = Worker::new(id, receiver);
    +26 ~         for id in 0..size {
    +27 ~             workers.push(value);
    +   |
    +
    +For more information about this error, try `rustc --explain E0382`.
    +error: could not compile `hello` (lib) due to 1 previous error
    +
    +

    这段代码尝试将 receiver 传递给多个 Worker 实例。这是不行的,回忆第十六章:Rust 所提供的信道实现是多 生产者,单 消费者 的。这意味着不能简单的克隆信道的消费端来解决问题。我们也不希望将一个消息向多个消费者发送多次;我们希望有一个消息列表和多个 worker 这样每个消息就只会处理一次。

    +

    另外,从信道队列中取出任务涉及到修改 receiver,所以这些线程需要一个能安全的共享和修改 receiver 的方式,否则可能导致竞争状态(参考第十六章)。

    +

    回忆一下第十六章讨论的线程安全智能指针,为了在多个线程间共享所有权并允许线程修改其值,需要使用 Arc<Mutex<T>>Arc 使得多个 worker 拥有接收端,而 Mutex 则确保一次只有一个 worker 能从接收端得到任务。示例 20-18 展示了所需的修改:

    +

    文件名:src/lib.rs

    +
    use std::{
    +    sync::{mpsc, Arc, Mutex},
    +    thread,
    +};
    +// --snip--
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: mpsc::Sender<Job>,
    +}
    +
    +struct Job;
    +
    +impl ThreadPool {
    +    // --snip--
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let receiver = Arc::new(Mutex::new(receiver));
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id, Arc::clone(&receiver)));
    +        }
    +
    +        ThreadPool { workers, sender }
    +    }
    +
    +    // --snip--
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +    }
    +}
    +
    +// --snip--
    +
    +struct Worker {
    +    id: usize,
    +    thread: thread::JoinHandle<()>,
    +}
    +
    +impl Worker {
    +    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
    +        // --snip--
    +        let thread = thread::spawn(|| {
    +            receiver;
    +        });
    +
    +        Worker { id, thread }
    +    }
    +}
    +

    示例 20-18: 使用 ArcMutex 在 worker 间共享接收者

    +

    ThreadPool::new 中,将接收者放入一个 Arc 和一个 Mutex 中。对于每一个新 worker,克隆 Arc 来增加引用计数,如此这些 worker 就可以共享接收者的所有权了。

    +

    通过这些修改,代码可以编译了!我们做到了!

    +

    实现 execute 方法

    +

    最后让我们实现 ThreadPool 上的 execute 方法。同时也要修改 Job 结构体:它将不再是结构体,Job 将是一个有着 execute 接收到的闭包类型的 trait 对象的类型别名。第二十章 “类型别名用来创建类型同义词” 部分提到过,类型别名允许将长的类型变短。观察示例 20-19:

    +

    文件名:src/lib.rs

    +
    use std::{
    +    sync::{mpsc, Arc, Mutex},
    +    thread,
    +};
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: mpsc::Sender<Job>,
    +}
    +
    +// --snip--
    +
    +type Job = Box<dyn FnOnce() + Send + 'static>;
    +
    +impl ThreadPool {
    +    // --snip--
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let receiver = Arc::new(Mutex::new(receiver));
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id, Arc::clone(&receiver)));
    +        }
    +
    +        ThreadPool { workers, sender }
    +    }
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +        let job = Box::new(f);
    +
    +        self.sender.send(job).unwrap();
    +    }
    +}
    +
    +// --snip--
    +
    +struct Worker {
    +    id: usize,
    +    thread: thread::JoinHandle<()>,
    +}
    +
    +impl Worker {
    +    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
    +        let thread = thread::spawn(|| {
    +            receiver;
    +        });
    +
    +        Worker { id, thread }
    +    }
    +}
    +

    示例 20-19: 为存放每一个闭包的 Box 创建一个 Job 类型别名,接着在信道中发出任务

    +

    在使用 execute 得到的闭包新建 Job 实例之后,将这些任务从信道的发送端发出。这里调用 send 上的 unwrap,因为发送可能会失败,这可能发生于例如停止了所有线程执行的情况,这意味着接收端停止接收新消息了。不过目前我们无法停止线程执行;只要线程池存在它们就会一直执行。使用 unwrap 是因为我们知道失败不可能发生,即便编译器不这么认为。

    +

    不过到此事情还没有结束!在 worker 中,传递给 thread::spawn 的闭包仍然还只是 引用 了信道的接收端。相反我们需要闭包一直循环,向信道的接收端请求任务,并在得到任务时执行它们。如示例 20-20 对 Worker::new 做出修改:

    +

    文件名:src/lib.rs

    +
    use std::{
    +    sync::{mpsc, Arc, Mutex},
    +    thread,
    +};
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: mpsc::Sender<Job>,
    +}
    +
    +type Job = Box<dyn FnOnce() + Send + 'static>;
    +
    +impl ThreadPool {
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let receiver = Arc::new(Mutex::new(receiver));
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id, Arc::clone(&receiver)));
    +        }
    +
    +        ThreadPool { workers, sender }
    +    }
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +        let job = Box::new(f);
    +
    +        self.sender.send(job).unwrap();
    +    }
    +}
    +
    +struct Worker {
    +    id: usize,
    +    thread: thread::JoinHandle<()>,
    +}
    +
    +// --snip--
    +
    +impl Worker {
    +    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
    +        let thread = thread::spawn(move || loop {
    +            let job = receiver.lock().unwrap().recv().unwrap();
    +
    +            println!("Worker {id} got a job; executing.");
    +
    +            job();
    +        });
    +
    +        Worker { id, thread }
    +    }
    +}
    +

    示例 20-20: 在 worker 线程中接收并执行任务

    +

    这里,首先在 receiver 上调用了 lock 来获取互斥器,接着 unwrap 在出现任何错误时 panic。如果互斥器处于一种叫做 被污染poisoned)的状态时获取锁可能会失败,这可能发生于其他线程在持有锁时 panic 了且没有释放锁。在这种情况下,调用 unwrap 使其 panic 是正确的行为。请随意将 unwrap 改为包含有意义错误信息的 expect

    +

    如果锁定了互斥器,接着调用 recv 从信道中接收 Job。最后的 unwrap 也绕过了一些错误,这可能发生于持有信道发送端的线程停止的情况,类似于如果接收端关闭时 send 方法如何返回 Err 一样。

    +

    调用 recv 会阻塞当前线程,所以如果还没有任务,其会等待直到有可用的任务。Mutex<T> 确保一次只有一个 Worker 线程尝试请求任务。

    +

    现在线程池处于可以运行的状态了!执行 cargo run 并发起一些请求:

    +
    $ cargo run
    +   Compiling hello v0.1.0 (file:///projects/hello)
    +warning: field is never read: `workers`
    + --> src/lib.rs:7:5
    +  |
    +7 |     workers: Vec<Worker>,
    +  |     ^^^^^^^^^^^^^^^^^^^^
    +  |
    +  = note: `#[warn(dead_code)]` on by default
    +
    +warning: field is never read: `id`
    +  --> src/lib.rs:48:5
    +   |
    +48 |     id: usize,
    +   |     ^^^^^^^^^
    +
    +warning: field is never read: `thread`
    +  --> src/lib.rs:49:5
    +   |
    +49 |     thread: thread::JoinHandle<()>,
    +   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    +
    +warning: `hello` (lib) generated 3 warnings
    +    Finished dev [unoptimized + debuginfo] target(s) in 1.40s
    +     Running `target/debug/hello`
    +Worker 0 got a job; executing.
    +Worker 2 got a job; executing.
    +Worker 1 got a job; executing.
    +Worker 3 got a job; executing.
    +Worker 0 got a job; executing.
    +Worker 2 got a job; executing.
    +Worker 1 got a job; executing.
    +Worker 3 got a job; executing.
    +Worker 0 got a job; executing.
    +Worker 2 got a job; executing.
    +
    +

    成功了!现在我们有了一个可以异步执行连接的线程池!它绝不会创建超过四个线程,所以当 server 收到大量请求时系统也不会负担过重。如果请求 /sleep,server 也能够通过另外一个线程处理其他请求。

    +
    +

    注意如果同时在多个浏览器窗口打开 /sleep,它们可能会彼此间隔地加载 5 秒,因为一些浏览器出于缓存的原因会顺序执行相同请求的多个实例。这些限制并不是由于我们的 web server 造成的。

    +
    +

    在学习了第十七章和第十八章的 while let 循环之后,你可能会好奇为何不能如此编写 worker 线程,如示例 20-21 所示:

    +

    文件名:src/lib.rs

    +
    use std::{
    +    sync::{mpsc, Arc, Mutex},
    +    thread,
    +};
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: mpsc::Sender<Job>,
    +}
    +
    +type Job = Box<dyn FnOnce() + Send + 'static>;
    +
    +impl ThreadPool {
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let receiver = Arc::new(Mutex::new(receiver));
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id, Arc::clone(&receiver)));
    +        }
    +
    +        ThreadPool { workers, sender }
    +    }
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +        let job = Box::new(f);
    +
    +        self.sender.send(job).unwrap();
    +    }
    +}
    +
    +struct Worker {
    +    id: usize,
    +    thread: thread::JoinHandle<()>,
    +}
    +// --snip--
    +
    +impl Worker {
    +    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
    +        let thread = thread::spawn(move || {
    +            while let Ok(job) = receiver.lock().unwrap().recv() {
    +                println!("Worker {id} got a job; executing.");
    +
    +                job();
    +            }
    +        });
    +
    +        Worker { id, thread }
    +    }
    +}
    +

    示例 20-21: 一个使用 while letWorker::new 替代实现

    +

    这段代码可以编译和运行,但是并不会产生所期望的线程行为:一个慢请求仍然会导致其他请求等待执行。其原因有些微妙:Mutex 结构体没有公有 unlock 方法,因为锁的所有权依赖 lock 方法返回的 LockResult<MutexGuard<T>>MutexGuard<T> 的生命周期。这允许借用检查器在编译时确保绝不会在没有持有锁的情况下访问由 Mutex 守护的资源,不过如果没有认真的思考 MutexGuard<T> 的生命周期的话,也可能会导致比预期更久的持有锁。

    +

    示例 20-20 中的代码使用的 let job = receiver.lock().unwrap().recv().unwrap(); 之所以可以工作是因为对于 let 来说,当 let 语句结束时任何表达式中等号右侧使用的临时值都会立即被丢弃。然而 while letif letmatch)直到相关的代码块结束都不会丢弃临时值。在示例 20-21 中,job() 调用期间锁一直持续,这也意味着其他的 worker 无法接受任务。

    +

    优雅停机与清理

    +
    +

    ch21-03-graceful-shutdown-and-cleanup.md +
    +commit 3e5105b52f7e8d3d95def07ffade4dcb1cfdee27

    +
    +

    示例 20-20 中的代码如期通过使用线程池异步的响应请求。这里有一些警告说 workersidthread 字段没有直接被使用,这提醒了我们并没有清理所有的内容。当使用不那么优雅的 ctrl-c 终止主线程时,所有其他线程也会立刻停止,即便它们正处于处理请求的过程中。

    +

    现在我们要为 ThreadPool 实现 Drop trait 对线程池中的每一个线程调用 join,这样这些线程将会执行完它们的请求。接着会为 ThreadPool 实现一个告诉线程它们应该停止接收新请求并结束的方式。为了实践这些代码,修改 server 在优雅停机(graceful shutdown)之前只接受两个请求。

    +

    ThreadPool 实现 Drop Trait

    +

    现在开始为线程池实现 Drop。当线程池被丢弃时,应该 join 所有线程以确保它们完成其操作。示例 20-22 展示了 Drop 实现的第一次尝试;这些代码还不能够编译:

    +

    文件名:src/lib.rs

    +
    use std::{
    +    sync::{mpsc, Arc, Mutex},
    +    thread,
    +};
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: mpsc::Sender<Job>,
    +}
    +
    +type Job = Box<dyn FnOnce() + Send + 'static>;
    +
    +impl ThreadPool {
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let receiver = Arc::new(Mutex::new(receiver));
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id, Arc::clone(&receiver)));
    +        }
    +
    +        ThreadPool { workers, sender }
    +    }
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +        let job = Box::new(f);
    +
    +        self.sender.send(job).unwrap();
    +    }
    +}
    +
    +impl Drop for ThreadPool {
    +    fn drop(&mut self) {
    +        for worker in &mut self.workers {
    +            println!("Shutting down worker {}", worker.id);
    +
    +            worker.thread.join().unwrap();
    +        }
    +    }
    +}
    +
    +struct Worker {
    +    id: usize,
    +    thread: thread::JoinHandle<()>,
    +}
    +
    +impl Worker {
    +    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
    +        let thread = thread::spawn(move || loop {
    +            let job = receiver.lock().unwrap().recv().unwrap();
    +
    +            println!("Worker {id} got a job; executing.");
    +
    +            job();
    +        });
    +
    +        Worker { id, thread }
    +    }
    +}
    +

    示例 20-22: 当线程池离开作用域时 join 每个线程

    +

    这里首先遍历线程池中的每个 workers。这里使用了 &mut 因为 self 本身是一个可变引用而且也需要能够修改 worker。对于每一个线程,会打印出说明信息表明此特定 worker 正在关闭,接着在 worker 线程上调用 join。如果 join 调用失败,通过 unwrap 使得 panic 并进行不优雅的关闭。

    +

    如下是尝试编译代码时得到的错误:

    +
    $ cargo check
    +    Checking hello v0.1.0 (file:///projects/hello)
    +error[E0507]: cannot move out of `worker.thread` which is behind a mutable reference
    +  --> src/lib.rs:52:13
    +   |
    +52 |             worker.thread.join().unwrap();
    +   |             ^^^^^^^^^^^^^ ------ `worker.thread` moved due to this method call
    +   |             |
    +   |             move occurs because `worker.thread` has type `JoinHandle<()>`, which does not implement the `Copy` trait
    +   |
    +note: `JoinHandle::<T>::join` takes ownership of the receiver `self`, which moves `worker.thread`
    +  --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/thread/mod.rs:1778:17
    +
    +For more information about this error, try `rustc --explain E0507`.
    +error: could not compile `hello` (lib) due to 1 previous error
    +
    +

    这里的错误告诉我们并不能调用 join,因为我们只有每一个 worker 的可变借用,而 join 需要获取其参数的所有权。为了解决这个问题,需要一个方法将 thread 移动出拥有其所有权的 Worker 实例以便 join 可以消费这个线程。示例 17-15 中我们曾见过这么做的方法:如果 Worker 存放的是 Option<thread::JoinHandle<()>,就可以在 Option 上调用 take 方法将值从 Some 成员中移动出来而对 None 成员不做处理。换句话说,正在运行的 Workerthread 将是 Some 成员值,而当需要清理 worker 时,将 Some 替换为 None,这样 worker 就没有可以运行的线程了。

    +

    为此需要更新 Worker 的定义为如下:

    +

    文件名:src/lib.rs

    +
    use std::{
    +    sync::{mpsc, Arc, Mutex},
    +    thread,
    +};
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: mpsc::Sender<Job>,
    +}
    +
    +type Job = Box<dyn FnOnce() + Send + 'static>;
    +
    +impl ThreadPool {
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let receiver = Arc::new(Mutex::new(receiver));
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id, Arc::clone(&receiver)));
    +        }
    +
    +        ThreadPool { workers, sender }
    +    }
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +        let job = Box::new(f);
    +
    +        self.sender.send(job).unwrap();
    +    }
    +}
    +
    +impl Drop for ThreadPool {
    +    fn drop(&mut self) {
    +        for worker in &mut self.workers {
    +            println!("Shutting down worker {}", worker.id);
    +
    +            worker.thread.join().unwrap();
    +        }
    +    }
    +}
    +
    +struct Worker {
    +    id: usize,
    +    thread: Option<thread::JoinHandle<()>>,
    +}
    +
    +impl Worker {
    +    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
    +        let thread = thread::spawn(move || loop {
    +            let job = receiver.lock().unwrap().recv().unwrap();
    +
    +            println!("Worker {id} got a job; executing.");
    +
    +            job();
    +        });
    +
    +        Worker { id, thread }
    +    }
    +}
    +

    现在依靠编译器来找出其他需要修改的地方。check 代码会得到两个错误:

    +
    $ cargo check
    +    Checking hello v0.1.0 (file:///projects/hello)
    +error[E0599]: no method named `join` found for enum `Option` in the current scope
    +  --> src/lib.rs:52:27
    +   |
    +52 |             worker.thread.join().unwrap();
    +   |                           ^^^^ method not found in `Option<JoinHandle<()>>`
    +   |
    +note: the method `join` exists on the type `JoinHandle<()>`
    +  --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/thread/mod.rs:1778:5
    +help: consider using `Option::expect` to unwrap the `JoinHandle<()>` value, panicking if the value is an `Option::None`
    +   |
    +52 |             worker.thread.expect("REASON").join().unwrap();
    +   |                          +++++++++++++++++
    +
    +error[E0308]: mismatched types
    +  --> src/lib.rs:72:22
    +   |
    +72 |         Worker { id, thread }
    +   |                      ^^^^^^ expected `Option<JoinHandle<()>>`, found `JoinHandle<_>`
    +   |
    +   = note: expected enum `Option<JoinHandle<()>>`
    +            found struct `JoinHandle<_>`
    +help: try wrapping the expression in `Some`
    +   |
    +72 |         Worker { id, thread: Some(thread) }
    +   |                      +++++++++++++      +
    +
    +Some errors have detailed explanations: E0308, E0599.
    +For more information about an error, try `rustc --explain E0308`.
    +error: could not compile `hello` (lib) due to 2 previous errors
    +
    +

    让我们修复第二个错误,它指向 Worker::new 结尾的代码;当新建 Worker 时需要将 thread 值封装进 Some。做出如下改变以修复问题:

    +

    文件名:src/lib.rs

    +
    use std::{
    +    sync::{mpsc, Arc, Mutex},
    +    thread,
    +};
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: mpsc::Sender<Job>,
    +}
    +
    +type Job = Box<dyn FnOnce() + Send + 'static>;
    +
    +impl ThreadPool {
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let receiver = Arc::new(Mutex::new(receiver));
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id, Arc::clone(&receiver)));
    +        }
    +
    +        ThreadPool { workers, sender }
    +    }
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +        let job = Box::new(f);
    +
    +        self.sender.send(job).unwrap();
    +    }
    +}
    +
    +impl Drop for ThreadPool {
    +    fn drop(&mut self) {
    +        for worker in &mut self.workers {
    +            println!("Shutting down worker {}", worker.id);
    +
    +            worker.thread.join().unwrap();
    +        }
    +    }
    +}
    +
    +struct Worker {
    +    id: usize,
    +    thread: Option<thread::JoinHandle<()>>,
    +}
    +
    +impl Worker {
    +    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
    +        // --snip--
    +
    +        let thread = thread::spawn(move || loop {
    +            let job = receiver.lock().unwrap().recv().unwrap();
    +
    +            println!("Worker {id} got a job; executing.");
    +
    +            job();
    +        });
    +
    +        Worker {
    +            id,
    +            thread: Some(thread),
    +        }
    +    }
    +}
    +

    第一个错误位于 Drop 实现中。之前提到过要调用 Option 上的 takethread 移动出 worker。如下改变会修复问题:

    +

    文件名:src/lib.rs

    +
    use std::{
    +    sync::{mpsc, Arc, Mutex},
    +    thread,
    +};
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: mpsc::Sender<Job>,
    +}
    +
    +type Job = Box<dyn FnOnce() + Send + 'static>;
    +
    +impl ThreadPool {
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let receiver = Arc::new(Mutex::new(receiver));
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id, Arc::clone(&receiver)));
    +        }
    +
    +        ThreadPool { workers, sender }
    +    }
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +        let job = Box::new(f);
    +
    +        self.sender.send(job).unwrap();
    +    }
    +}
    +
    +impl Drop for ThreadPool {
    +    fn drop(&mut self) {
    +        for worker in &mut self.workers {
    +            println!("Shutting down worker {}", worker.id);
    +
    +            if let Some(thread) = worker.thread.take() {
    +                thread.join().unwrap();
    +            }
    +        }
    +    }
    +}
    +
    +struct Worker {
    +    id: usize,
    +    thread: Option<thread::JoinHandle<()>>,
    +}
    +
    +impl Worker {
    +    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
    +        let thread = thread::spawn(move || loop {
    +            let job = receiver.lock().unwrap().recv().unwrap();
    +
    +            println!("Worker {id} got a job; executing.");
    +
    +            job();
    +        });
    +
    +        Worker {
    +            id,
    +            thread: Some(thread),
    +        }
    +    }
    +}
    +

    如第十八章我们见过的,Option 上的 take 方法会取出 Some 而留下 None。使用 if let 解构 Some 并得到线程,接着在线程上调用 join。如果 worker 的线程已然是 None,就知道此时这个 worker 已经清理了其线程所以无需做任何操作。

    +

    向线程发送信号使其停止接收任务

    +

    有了所有这些修改,代码就能编译且没有任何警告。不过也有坏消息,这些代码还不能以我们期望的方式运行。问题的关键在于 Worker 中分配的线程所运行的闭包中的逻辑:调用 join 并不会关闭线程,因为它们一直 loop 来寻找任务。如果采用这个实现来尝试丢弃 ThreadPool,则主线程会永远阻塞在等待第一个线程结束上。

    +

    为了修复这个问题,我们将修改 ThreadPooldrop 实现并修改 Worker 循环。

    +

    首先修改 ThreadPooldrop 实现在等待线程结束前显式丢弃 sender。示例 20-23 展示了 ThreadPool 显式丢弃 sender 所作的修改。我们使用了与之前处理线程时相同的 Optiontake 技术以便能从 ThreadPool 中移动 sender

    +

    文件名:src/lib.rs

    +
    use std::{
    +    sync::{mpsc, Arc, Mutex},
    +    thread,
    +};
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: Option<mpsc::Sender<Job>>,
    +}
    +// --snip--
    +
    +type Job = Box<dyn FnOnce() + Send + 'static>;
    +
    +impl ThreadPool {
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        // --snip--
    +
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let receiver = Arc::new(Mutex::new(receiver));
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id, Arc::clone(&receiver)));
    +        }
    +
    +        ThreadPool {
    +            workers,
    +            sender: Some(sender),
    +        }
    +    }
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +        let job = Box::new(f);
    +
    +        self.sender.as_ref().unwrap().send(job).unwrap();
    +    }
    +}
    +
    +impl Drop for ThreadPool {
    +    fn drop(&mut self) {
    +        drop(self.sender.take());
    +
    +        for worker in &mut self.workers {
    +            println!("Shutting down worker {}", worker.id);
    +
    +            if let Some(thread) = worker.thread.take() {
    +                thread.join().unwrap();
    +            }
    +        }
    +    }
    +}
    +
    +struct Worker {
    +    id: usize,
    +    thread: Option<thread::JoinHandle<()>>,
    +}
    +
    +impl Worker {
    +    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
    +        let thread = thread::spawn(move || loop {
    +            let job = receiver.lock().unwrap().recv().unwrap();
    +
    +            println!("Worker {id} got a job; executing.");
    +
    +            job();
    +        });
    +
    +        Worker {
    +            id,
    +            thread: Some(thread),
    +        }
    +    }
    +}
    +

    示例 20-23: 在 join worker 线程之前显式丢弃 sender

    +

    丢弃 sender 会关闭信道,这表明不会有更多的消息被发送。这时 worker 中的无限循环中的所有 recv 调用都会返回错误。在示例 20-24 中,我们修改 Worker 循环在这种情况下优雅地退出,这意味着当 ThreadPooldrop 实现调用 join 时线程会结束。

    +

    文件名:src/lib.rs

    +
    use std::{
    +    sync::{mpsc, Arc, Mutex},
    +    thread,
    +};
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: Option<mpsc::Sender<Job>>,
    +}
    +
    +type Job = Box<dyn FnOnce() + Send + 'static>;
    +
    +impl ThreadPool {
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let receiver = Arc::new(Mutex::new(receiver));
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id, Arc::clone(&receiver)));
    +        }
    +
    +        ThreadPool {
    +            workers,
    +            sender: Some(sender),
    +        }
    +    }
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +        let job = Box::new(f);
    +
    +        self.sender.as_ref().unwrap().send(job).unwrap();
    +    }
    +}
    +
    +impl Drop for ThreadPool {
    +    fn drop(&mut self) {
    +        drop(self.sender.take());
    +
    +        for worker in &mut self.workers {
    +            println!("Shutting down worker {}", worker.id);
    +
    +            if let Some(thread) = worker.thread.take() {
    +                thread.join().unwrap();
    +            }
    +        }
    +    }
    +}
    +
    +struct Worker {
    +    id: usize,
    +    thread: Option<thread::JoinHandle<()>>,
    +}
    +
    +impl Worker {
    +    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
    +        let thread = thread::spawn(move || loop {
    +            let message = receiver.lock().unwrap().recv();
    +
    +            match message {
    +                Ok(job) => {
    +                    println!("Worker {id} got a job; executing.");
    +
    +                    job();
    +                }
    +                Err(_) => {
    +                    println!("Worker {id} disconnected; shutting down.");
    +                    break;
    +                }
    +            }
    +        });
    +
    +        Worker {
    +            id,
    +            thread: Some(thread),
    +        }
    +    }
    +}
    +

    示例 20-24:当 recv 返回错误时显式退出循环

    +

    为了实践这些代码,如示例 20-25 所示修改 main 在优雅停机 server 之前只接受两个请求:

    +

    文件名:src/main.rs

    +
    use hello::ThreadPool;
    +use std::{
    +    fs,
    +    io::{prelude::*, BufReader},
    +    net::{TcpListener, TcpStream},
    +    thread,
    +    time::Duration,
    +};
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +    let pool = ThreadPool::new(4);
    +
    +    for stream in listener.incoming().take(2) {
    +        let stream = stream.unwrap();
    +
    +        pool.execute(|| {
    +            handle_connection(stream);
    +        });
    +    }
    +
    +    println!("Shutting down.");
    +}
    +
    +fn handle_connection(mut stream: TcpStream) {
    +    let buf_reader = BufReader::new(&stream);
    +    let request_line = buf_reader.lines().next().unwrap().unwrap();
    +
    +    let (status_line, filename) = match &request_line[..] {
    +        "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
    +        "GET /sleep HTTP/1.1" => {
    +            thread::sleep(Duration::from_secs(5));
    +            ("HTTP/1.1 200 OK", "hello.html")
    +        }
    +        _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
    +    };
    +
    +    let contents = fs::read_to_string(filename).unwrap();
    +    let length = contents.len();
    +
    +    let response =
    +        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
    +
    +    stream.write_all(response.as_bytes()).unwrap();
    +}
    +

    示例 20-25: 在处理两个请求之后通过退出循环来停止 server

    +

    你不会希望真实世界的 web server 只处理两次请求就停机了,这只是为了展示优雅停机和清理处于正常工作状态。

    +

    take 方法定义于 Iterator trait,这里限制循环最多头 2 次。ThreadPool 会在 main 的结尾离开作用域,而且还会看到 drop 实现的运行。

    +

    使用 cargo run 启动 server,并发起三个请求。第三个请求应该会失败,而终端的输出应该看起来像这样:

    +
    $ cargo run
    +   Compiling hello v0.1.0 (file:///projects/hello)
    +    Finished dev [unoptimized + debuginfo] target(s) in 1.0s
    +     Running `target/debug/hello`
    +Worker 0 got a job; executing.
    +Shutting down.
    +Shutting down worker 0
    +Worker 3 got a job; executing.
    +Worker 1 disconnected; shutting down.
    +Worker 2 disconnected; shutting down.
    +Worker 3 disconnected; shutting down.
    +Worker 0 disconnected; shutting down.
    +Shutting down worker 1
    +Shutting down worker 2
    +Shutting down worker 3
    +
    +

    可能会出现不同顺序的 worker 和信息输出。可以从信息中看到服务是如何运行的:worker 0 和 worker 3 获取了头两个请求。server 会在头第二个请求后停止接受请求,ThreadPoolDrop 实现甚至会在 worker 3 开始工作之前就开始执行。丢弃 sender 会断开所有 worker 的连接并让它们关闭。每个 worker 在断开时会打印出一个信息,接着线程池调用 join 来等待每一个 worker 线程结束。

    +

    这个特定的运行过程中一个有趣的地方在于:ThreadPool 丢弃 sender,而在任何线程收到消息之前,就尝试 join worker 0 了。worker 0 还没有从 recv 获得一个错误,所以主线程阻塞直到 worker 0 结束。与此同时,worker 3 接收到一个任务接着所有线程会收到一个错误。一旦 worker 0 结束,主线程就等待余下其他 worker 结束。此时它们都退出了循环并停止。

    +

    恭喜!现在我们完成了这个项目,也有了一个使用线程池异步响应请求的基础 web server。我们能对 server 执行优雅停机,它会清理线程池中的所有线程。

    +

    如下是完整的代码参考:

    +

    文件名:src/main.rs

    +
    use hello::ThreadPool;
    +use std::{
    +    fs,
    +    io::{prelude::*, BufReader},
    +    net::{TcpListener, TcpStream},
    +    thread,
    +    time::Duration,
    +};
    +
    +fn main() {
    +    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    +    let pool = ThreadPool::new(4);
    +
    +    for stream in listener.incoming().take(2) {
    +        let stream = stream.unwrap();
    +
    +        pool.execute(|| {
    +            handle_connection(stream);
    +        });
    +    }
    +
    +    println!("Shutting down.");
    +}
    +
    +fn handle_connection(mut stream: TcpStream) {
    +    let buf_reader = BufReader::new(&stream);
    +    let request_line = buf_reader.lines().next().unwrap().unwrap();
    +
    +    let (status_line, filename) = match &request_line[..] {
    +        "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
    +        "GET /sleep HTTP/1.1" => {
    +            thread::sleep(Duration::from_secs(5));
    +            ("HTTP/1.1 200 OK", "hello.html")
    +        }
    +        _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
    +    };
    +
    +    let contents = fs::read_to_string(filename).unwrap();
    +    let length = contents.len();
    +
    +    let response =
    +        format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
    +
    +    stream.write_all(response.as_bytes()).unwrap();
    +}
    +

    文件名:src/lib.rs

    +
    use std::{
    +    sync::{mpsc, Arc, Mutex},
    +    thread,
    +};
    +
    +pub struct ThreadPool {
    +    workers: Vec<Worker>,
    +    sender: Option<mpsc::Sender<Job>>,
    +}
    +
    +type Job = Box<dyn FnOnce() + Send + 'static>;
    +
    +impl ThreadPool {
    +    /// Create a new ThreadPool.
    +    ///
    +    /// The size is the number of threads in the pool.
    +    ///
    +    /// # Panics
    +    ///
    +    /// The `new` function will panic if the size is zero.
    +    pub fn new(size: usize) -> ThreadPool {
    +        assert!(size > 0);
    +
    +        let (sender, receiver) = mpsc::channel();
    +
    +        let receiver = Arc::new(Mutex::new(receiver));
    +
    +        let mut workers = Vec::with_capacity(size);
    +
    +        for id in 0..size {
    +            workers.push(Worker::new(id, Arc::clone(&receiver)));
    +        }
    +
    +        ThreadPool {
    +            workers,
    +            sender: Some(sender),
    +        }
    +    }
    +
    +    pub fn execute<F>(&self, f: F)
    +    where
    +        F: FnOnce() + Send + 'static,
    +    {
    +        let job = Box::new(f);
    +
    +        self.sender.as_ref().unwrap().send(job).unwrap();
    +    }
    +}
    +
    +impl Drop for ThreadPool {
    +    fn drop(&mut self) {
    +        drop(self.sender.take());
    +
    +        for worker in &mut self.workers {
    +            println!("Shutting down worker {}", worker.id);
    +
    +            if let Some(thread) = worker.thread.take() {
    +                thread.join().unwrap();
    +            }
    +        }
    +    }
    +}
    +
    +struct Worker {
    +    id: usize,
    +    thread: Option<thread::JoinHandle<()>>,
    +}
    +
    +impl Worker {
    +    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
    +        let thread = thread::spawn(move || loop {
    +            let message = receiver.lock().unwrap().recv();
    +
    +            match message {
    +                Ok(job) => {
    +                    println!("Worker {id} got a job; executing.");
    +
    +                    job();
    +                }
    +                Err(_) => {
    +                    println!("Worker {id} disconnected; shutting down.");
    +                    break;
    +                }
    +            }
    +        });
    +
    +        Worker {
    +            id,
    +            thread: Some(thread),
    +        }
    +    }
    +}
    +

    这里还有很多可以做的事!如果你希望继续增强这个项目,如下是一些点子:

    +
      +
    • ThreadPool 和其公有方法增加更多文档
    • +
    • 为库的功能增加测试
    • +
    • unwrap 调用改为更健壮的错误处理
    • +
    • 使用 ThreadPool 进行其他不同于处理网络请求的任务
    • +
    • crates.io 上寻找一个线程池 crate 并使用它实现一个类似的 web server,将其 API 和鲁棒性与我们的实现做对比
    • +
    +

    总结

    +

    好极了!你结束了本书的学习!由衷感谢你同我们一道加入这次 Rust 之旅。现在你已经准备好出发并实现自己的 Rust 项目并帮助他人了。请不要忘记我们的社区,这里有其他 Rustaceans 正乐于帮助你迎接 Rust 之路上的任何挑战。

    +

    附录

    +
    +

    appendix-00.md +
    +commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f

    +
    +

    附录部分包含一些在你的 Rust 之旅中可能用到的参考资料。

    +

    附录 A:关键字

    +
    +

    appendix-01-keywords.md +
    +commit efbafdba3618487fbc9305318fcab9775132ac15

    +
    +

    下面的列表包含 Rust 中正在使用或者以后会用到的关键字。因此,这些关键字不能被用作标识符(除了 “原始标识符” 部分介绍的原始标识符),这包括函数、变量、参数、结构体字段、模块、crate、常量、宏、静态值、属性、类型、trait 或生命周期 +的名字。

    +

    目前正在使用的关键字

    +

    如下关键字目前有对应其描述的功能。

    +
      +
    • as - 强制类型转换,消除特定包含项的 trait 的歧义,或者对 use 语句中的项重命名
    • +
    • async - 返回一个 Future 而不是阻塞当前线程
    • +
    • await - 暂停执行直到 Future 的结果就绪
    • +
    • break - 立刻退出循环
    • +
    • const - 定义常量或不变裸指针(constant raw pointer)
    • +
    • continue - 继续进入下一次循环迭代
    • +
    • crate - 在模块路径中,代指 crate root
    • +
    • dyn - 动态分发 trait 对象
    • +
    • else - 作为 ifif let 控制流结构的 fallback
    • +
    • enum - 定义一个枚举
    • +
    • extern - 链接一个外部函数或变量
    • +
    • false - 布尔字面值 false
    • +
    • fn - 定义一个函数或 函数指针类型 (function pointer type)
    • +
    • for - 遍历一个迭代器或实现一个 trait 或者指定一个更高级的生命周期
    • +
    • if - 基于条件表达式的结果分支
    • +
    • impl - 实现自有或 trait 功能
    • +
    • in - for 循环语法的一部分
    • +
    • let - 绑定一个变量
    • +
    • loop - 无条件循环
    • +
    • match - 模式匹配
    • +
    • mod - 定义一个模块
    • +
    • move - 使闭包获取其所捕获项的所有权
    • +
    • mut - 表示引用、裸指针或模式绑定的可变性
    • +
    • pub - 表示结构体字段、impl 块或模块的公有可见性
    • +
    • ref - 通过引用绑定
    • +
    • return - 从函数中返回
    • +
    • Self - 定义或实现 trait 的类型的类型别名
    • +
    • self - 表示方法本身或当前模块
    • +
    • static - 表示全局变量或在整个程序执行期间保持其生命周期
    • +
    • struct - 定义一个结构体
    • +
    • super - 表示当前模块的父模块
    • +
    • trait - 定义一个 trait
    • +
    • true - 布尔字面值 true
    • +
    • type - 定义一个类型别名或关联类型
    • +
    • union - 定义一个 union 并且是 union 声明中唯一用到的关键字
    • +
    • unsafe - 表示不安全的代码、函数、trait 或实现
    • +
    • use - 引入外部空间的符号
    • +
    • where - 表示一个约束类型的从句
    • +
    • while - 基于一个表达式的结果判断是否进行循环
    • +
    +

    保留做将来使用的关键字

    +

    如下关键字没有任何功能,不过由 Rust 保留以备将来的应用。

    +
      +
    • abstract
    • +
    • become
    • +
    • box
    • +
    • do
    • +
    • final
    • +
    • macro
    • +
    • override
    • +
    • priv
    • +
    • try
    • +
    • typeof
    • +
    • unsized
    • +
    • virtual
    • +
    • yield
    • +
    +

    原始标识符

    +

    原始标识符(Raw identifiers)允许你使用通常不能使用的关键字,其带有 r# 前缀。

    +

    例如,match 是关键字。如果尝试编译如下使用 match 作为名字的函数:

    +
    fn match(needle: &str, haystack: &str) -> bool {
    +    haystack.contains(needle)
    +}
    +

    会得到这个错误:

    +
    error: expected identifier, found keyword `match`
    + --> src/main.rs:4:4
    +  |
    +4 | fn match(needle: &str, haystack: &str) -> bool {
    +  |    ^^^^^ expected identifier, found keyword
    +
    +

    该错误表示你不能将关键字 match 用作函数标识符。你可以使用原始标识符将 match 作为函数名称使用:

    +

    文件名:src/main.rs

    +
    fn r#match(needle: &str, haystack: &str) -> bool {
    +    haystack.contains(needle)
    +}
    +
    +fn main() {
    +    assert!(r#match("foo", "foobar"));
    +}
    +

    此代码编译没有任何错误。注意 r# 前缀需同时用于函数名定义和 main 函数中的调用。

    +

    原始标识符允许使用你选择的任何单词作为标识符,即使该单词恰好是保留关键字。这给予了我们更大的自由来选择名字,这样与其他语言交互式就不用考虑到关键字问题,在要交互的语言中这个名字不是关键字。此外,原始标识符允许你使用以不同于你的 crate 使用的 Rust 版本编写的库。比如,try 在 2015 edition 中不是关键字,而在 2018 edition 则是。所以如果用 2015 edition 编写的库中带有 try 函数,在 2018 edition 中调用时就需要使用原始标识符语法,在这里是 r#try。有关版本的更多信息,请参见附录 E

    +

    附录 B:运算符与符号

    +
    +

    appendix-02-operators.md +
    +commit 396fdb69de7fb18f24b15c7ad13491b1c1fa7231

    +
    +

    该附录包含了 Rust 语法的词汇表,包括运算符以及其他的符号,这些符号单独出现或出现在路径、泛型、trait bounds、宏、属性、注释、元组以及大括号上下文中。

    +

    运算符

    +

    表 B-1 包含了 Rust 中的运算符、运算符如何出现在上下文中的示例、简短解释以及该运算符是否可重载。如果一个运算符是可重载的,则该运算符上用于重载的相关 trait 也会列出。

    +

    表 B-1: 运算符

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    运算符示例解释是否可重载
    !ident!(...), ident!{...}, ident![...]宏展开
    !!expr按位非或逻辑非Not
    !=expr != expr不等比较PartialEq
    %expr % expr算术取余Rem
    %=var %= expr算术取余与赋值RemAssign
    &&expr, &mut expr借用
    &&type, &mut type, &'a type, &'a mut type借用指针类型
    &expr & expr按位与BitAnd
    &=var &= expr按位与及赋值BitAndAssign
    &&expr && expr短路(Short-circuiting)逻辑与
    *expr * expr算术乘法Mul
    *=var *= expr算术乘法与赋值MulAssign
    **expr解引用Deref
    **const type, *mut type裸指针
    +trait + trait, 'a + trait复合类型限制
    +expr + expr算术加法Add
    +=var += expr算术加法与赋值AddAssign
    ,expr, expr参数以及元素分隔符
    -- expr算术取负Neg
    -expr - expr算术减法Sub
    -=var -= expr算术减法与赋值SubAssign
    ->fn(...) -> type, |...| -> type函数与闭包,返回类型
    .expr.ident成员访问
    ...., expr.., ..expr, expr..expr右开区间范围PartialOrd
    ..=..=expr, expr..=expr右闭区间范围模式PartialOrd
    ....expr结构体更新语法
    ..variant(x, ..), struct_type { x, .. }“与剩余部分” 的模式绑定
    ...expr...expr(Deprecated,请使用 ..=)在模式中:闭区间范围模式
    /expr / expr算术除法Div
    /=var /= expr算术除法与赋值DivAssign
    :pat: type, ident: type约束
    :ident: expr结构体字段初始化
    :'a: loop {...}循环标志
    ;expr;语句和语句结束符
    ;[...; len]固定大小数组语法的部分
    <<expr << expr左移Shl
    <<=var <<= expr左移与赋值ShlAssign
    <expr < expr小于比较PartialOrd
    <=expr <= expr小于等于比较PartialOrd
    =var = expr, ident = type赋值/等值
    ==expr == expr等于比较PartialEq
    =>pat => expr匹配准备语法的部分
    >expr > expr大于比较PartialOrd
    >=expr >= expr大于等于比较PartialOrd
    >>expr >> expr右移Shr
    >>=var >>= expr右移与赋值ShrAssign
    @ident @ pat模式绑定
    ^expr ^ expr按位异或BitXor
    ^=var ^= expr按位异或与赋值BitXorAssign
    |pat | pat模式选择
    |expr | expr按位或BitOr
    |=var |= expr按位或与赋值BitOrAssign
    ||expr || expr短路(Short-circuiting)逻辑或
    ?expr?错误传播
    +
    +

    非运算符符号

    +

    下面的列表中包含了所有和运算符不一样功能的符号;也就是说,它们并不像函数调用或方法调用一样表现。

    +

    表 B-2 展示了以其自身出现以及出现在合法其他各个地方的符号。

    +

    表 B-2:独立语法

    +
    + + + + + + + + + + + +
    符号解释
    'ident命名生命周期或循环标签
    ...u8, ...i32, ...f64, ...usize指定类型的数值常量
    "..."字符串常量
    r"...", r#"..."#, r##"..."##, etc.原始字符串字面值,未处理的转义字符
    b"..."字节字符串字面值; 构造一个字节数组类型而非字符串
    br"...", br#"..."#, br##"..."##原始字节字符串字面值,原始和字节字符串字面值的结合
    '...'字符字面值
    b'...'ASCII 码字节字面值
    |...| expr闭包
    !离散函数的总是为空的类型
    _“忽略” 模式绑定;也用于增强整型字面值的可读性
    +
    +

    表 B-3 展示了出现在从模块结构到项的路径上下文中的符号

    +

    表 B-3:路径相关语法

    +
    + + + + + + + + + +
    符号解释
    ident::ident命名空间路径
    ::path与 crate 根相对的路径(如一个显式绝对路径)
    self::path与当前模块相对的路径(如一个显式相对路径)
    super::path与父模块相对的路径
    type::ident, <type as trait>::ident关联常量、函数以及类型
    <type>::...不可以被直接命名的关联项类型(如 <&T>::...<[T]>::...,等)
    trait::method(...)通过命名定义的 trait 来消除方法调用的二义性
    type::method(...)通过命名定义的类型来消除方法调用的二义性
    <type as trait>::method(...)通过命名 trait 和类型来消除方法调用的二义性
    +
    +

    表 B-4 展示了出现在泛型类型参数上下文中的符号。

    +

    表 B-4:泛型

    +
    + + + + + + + + +
    符号解释
    path<...>为一个类型中的泛型指定具体参数(如 Vec<u8>
    path::<...>, method::<...>为一个泛型、函数或表达式中的方法指定具体参数,通常指 turbofish(如 "42".parse::<i32>()
    fn ident<...> ...泛型函数定义
    struct ident<...> ...泛型结构体定义
    enum ident<...> ...泛型枚举定义
    impl<...> ...定义泛型实现
    for<...> type高级生命周期限制
    type<ident=type>泛型,其一个或多个相关类型必须被指定为特定类型(如 Iterator<Item=T>
    +
    +

    表 B-5 展示了出现在使用 trait bounds 约束泛型参数上下文中的符号。

    +

    表 B-5: Trait Bound 约束

    +
    + + + + + + +
    符号解释
    T: U泛型参数 T 约束于实现了 U 的类型
    T: 'a泛型 T 的生命周期必须长于 'a(意味着该类型不能传递包含生命周期短于 'a 的任何引用)
    T: 'static泛型 T 不包含除 'static 之外的借用引用
    'b: 'a泛型 'b 生命周期必须长于泛型 'a
    T: ?Sized使用一个不定大小的泛型类型
    'a + trait, trait + trait复合类型限制
    +
    +

    表 B-6 展示了在调用或定义宏以及在其上指定属性时的上下文中出现的符号。

    +

    表 B-6: 宏与属性

    +
    + + + + + + +
    符号解释
    #[meta]外部属性
    #![meta]内部属性
    $ident宏替换
    $ident:kind宏捕获
    $(…)…宏重复
    ident!(...), ident!{...}, ident![...]宏调用
    +
    +

    表 B-7 展示了写注释的符号。

    +

    表 B-7: 注释

    +
    + + + + + + +
    符号注释
    //行注释
    //!内部行文档注释
    ///外部行文档注释
    /*...*/块注释
    /*!...*/内部块文档注释
    /**...*/外部块文档注释
    +
    +

    表 B-8 展示了出现在使用元组时上下文中的符号。

    +

    表 B-8: 元组

    +
    + + + + + + + + +
    符号解释
    ()空元组(亦称单元),即是字面值也是类型
    (expr)括号表达式
    (expr,)单一元素元组表达式
    (type,)单一元素元组类型
    (expr, ...)元组表达式
    (type, ...)元组类型
    expr(expr, ...)函数调用表达式;也用于初始化元组结构体 struct 以及元组枚举 enum 变体
    expr.0, expr.1, etc.元组索引
    +
    +

    表 B-9 展示了使用大括号的上下文。

    +

    表 B-9: 大括号

    +
    + + +
    符号解释
    {...}块表达式
    Type {...}struct 字面值
    +
    +

    表 B-10 展示了使用方括号的上下文。

    +

    表 B-10: 方括号

    +
    + + + + + +
    符号解释
    [...]数组
    [expr; len]复制了 lenexpr的数组
    [type; len]包含 lentype 类型的数组
    expr[expr]集合索引。重载(Index, IndexMut
    expr[..], expr[a..], expr[..b], expr[a..b]集合索引,使用 RangeRangeFromRangeToRangeFull 作为索引来代替集合 slice
    +

    附录 C:可派生的 trait

    +
    +

    appendix-03-derivable-traits.md +
    +commit c07dddac692848ade6c2112c8e15a7087fbbec45

    +
    +

    在本书的各个部分中,我们讨论了可应用于结构体和枚举定义的 derive 属性。derive 属性会在使用 derive 语法标记的类型上生成对应 trait 的默认实现的代码。

    +

    在本附录中提供了标准库中所有可以使用 derive 的 trait 的参考。这些部分涉及到:

    +
      +
    • 该 trait 将会派生什么样的操作符和方法
    • +
    • derive 提供什么样的 trait 实现
    • +
    • 由什么来实现类型的 trait
    • +
    • 是否允许实现该 trait 的条件
    • +
    • 需要 trait 操作的例子
    • +
    +

    如果你希望不同于 derive 属性所提供的行为,请查阅 标准库文档 中每个 trait 的细节以了解如何手动实现它们。

    +

    这里列出的 trait 是仅有的在标准库中定义且能通过 derive 在类型上实现。标准库中定义的其它 trait 不能通过 derive 在类型上实现。这些 trait 不存在有意义的默认行为,所以由你负责以合理的方式实现它们。

    +

    一个无法被派生的 trait 的例子是为终端用户处理格式化的 Display 。你应该时常考虑使用合适的方法来为终端用户显示一个类型。终端用户应该看到类型的什么部分?他们会找出相关部分吗?对他们来说最相关的数据格式是什么样的?Rust 编译器没有这样的洞察力,因此无法为你提供合适的默认行为。

    +

    本附录所提供的可派生 trait 列表并不全面:库可以为其自己的 trait 实现 derive,可以使用 derive 的 trait 列表事实上是无限的。实现 derive 涉及到过程宏的应用,这在第二十章的 “宏” 有介绍。

    +

    用于程序员输出的 Debug

    +

    Debug trait 用于开启格式化字符串中的调试格式,其通过在 {} 占位符中增加 :? 表明。

    +

    Debug trait 允许以调试目的来打印一个类型的实例,所以使用该类型的程序员可以在程序执行的特定时间点观察其实例。

    +

    例如,在使用 assert_eq! 宏时,Debug trait 是必须的。如果等式断言失败,这个宏就把给定实例的值作为参数打印出来,如此程序员可以看到两个实例为什么不相等。

    +

    等值比较的 PartialEqEq

    +

    PartialEq trait 可以比较一个类型的实例以检查是否相等,并开启了 ==!= 运算符的功能。

    +

    派生的 PartialEq 实现了 eq 方法。当 PartialEq 在结构体上派生时,只有所有 的字段都相等时两个实例才相等,同时只要有任何字段不相等则两个实例就不相等。当在枚举上派生时,每一个成员都和其自身相等,且和其他成员都不相等。

    +

    例如,当使用 assert_eq! 宏时,需要比较一个类型的两个实例是否相等,则 PartialEq trait 是必须的。

    +

    Eq trait 没有方法。其作用是表明每一个被标记类型的值等于其自身。Eq trait 只能应用于那些实现了 PartialEq 的类型,但并非所有实现了 PartialEq 的类型都可以实现 Eq。浮点类型就是一个例子:浮点数的实现表明两个非数字(NaN,not-a-number)值是互不相等的。

    +

    例如,对于一个 HashMap<K, V> 中的 key 来说, Eq 是必须的,这样 HashMap<K, V> 就可以知道两个 key 是否一样了。

    +

    次序比较的 PartialOrdOrd

    +

    PartialOrd trait 可以基于排序的目的而比较一个类型的实例。实现了 PartialOrd 的类型可以使用 <><=>= 操作符。但只能在同时实现了 PartialEq 的类型上使用 PartialOrd

    +

    派生 PartialOrd 实现了 partial_cmp 方法,其返回一个 Option<Ordering> ,但当给定值无法产生顺序时将返回 None。尽管大多数类型的值都可以比较,但一个无法产生顺序的例子是:浮点类型的非数字值。当在浮点数上调用 partial_cmp 时,NaN 的浮点数将返回 None

    +

    当在结构体上派生时,PartialOrd 按照结构体定义中字段出现的顺序,依次比较每个字段的值,以此来比较两个实例。当在枚举上派生时,认为在枚举定义中声明较早的枚举变体小于其后的变体。

    +

    例如,对于来自于 rand crate 中的 gen_range 方法来说,当在一个范围表达式指定的范围内生成一个随机值时,PartialOrd trait 是必须的。

    +

    Ord trait 也让你明白在一个带注解类型上的任意两个值存在有效顺序。Ord trait 实现了 cmp 方法,它返回一个 Ordering 而不是 Option<Ordering>,因为总存在一个合法的顺序。只可以在实现了 PartialOrdEqEq 依赖 PartialEq)的类型上使用 Ord trait。当在结构体或枚举上派生时, cmp 和以 PartialOrd 派生实现的 partial_cmp 表现一致。

    +

    例如,当在 BTreeSet<T>(一种基于有序值存储数据的数据结构)上存值时,Ord 是必须的。

    +

    复制值的 CloneCopy

    +

    Clone trait 可以明确地创建一个值的深拷贝(deep copy),复制过程可能包含任意代码的执行以及堆上数据的复制。查阅第四章 “变量与数据交互的方式(二):克隆” 以获取有关 Clone 的更多信息。

    +

    派生 Clone 实现了 clone 方法,其为整个的类型实现时,在类型的每一部分上调用了 clone 方法。这意味着类型中所有字段或值也必须实现了 Clone,这样才能够派生 Clone

    +

    例如,当在一个切片(slice)上调用 to_vec 方法时,Clone 是必须的。切片并不拥有其包含的实例,但是从 to_vec 中返回的 vector 需要拥有其实例,因此,to_vec 在每个元素上调用 clone。因此,存储在切片中的类型必须实现 Clone

    +

    Copy trait 允许你通过只拷贝存储在栈上的位来复制值而不需要额外的代码。查阅第四章 “只在栈上的数据:拷贝” 的部分来获取有关 Copy 的更多信息。

    +

    Copy trait 并未定义任何方法来阻止编程人员重写这些方法或违反不需要执行额外代码的假设。尽管如此,所有的编程人员可以假设复制(copy)一个值非常快。

    +

    可以在类型内部全部实现 Copy trait 的任意类型上派生 Copy。一个实现了 Copy 的类型必须也实现了 Clone,因为一个实现了 Copy 的类型也简单地实现了 Clone,其执行和 Copy 相同的任务。

    +

    Copy trait 很少使用;实现 Copy 的类型是可以优化的,这意味着你无需调用 clone,这让代码更简洁。

    +

    任何使用 Copy 的代码都可以通过 Clone 实现,但代码可能会稍慢,或者不得不在代码中的许多位置上使用 clone

    +

    固定大小的值到值映射的 Hash

    +

    Hash trait 可以实例化一个任意大小的类型,并且能够用哈希(hash)函数将该实例映射到一个固定大小的值上。派生 Hash 实现了 hash 方法。hash 方法的派生实现结合了在类型的每部分调用 hash 的结果,这意味着所有的字段或值也必须实现了 Hash,这样才能够派生 Hash

    +

    例如,在 HashMap<K, V> 上存储数据,存放 key 的时候,Hash 是必须的。

    +

    默认值的 Default

    +

    Default trait 使你创建一个类型的默认值。派生 Default 实现了 default 函数。default 函数的派生实现调用了类型每部分的 default 函数,这意味着类型中所有的字段或值也必须实现了 Default,这样才能够派生 Default

    +

    Default::default 函数通常结合结构体更新语法一起使用,这在第五章的 “使用结构体更新语法从其他实例中创建实例” 部分有讨论。可以自定义一个结构体的一小部分字段而剩余字段则使用 ..Default::default() 设置为默认值。

    +

    例如,当你在 Option<T> 实例上使用 unwrap_or_default 方法时,Default trait 是必须的。如果 Option<T>None的话,unwrap_or_default 方法将返回存储在 Option<T>T 类型的 Default::default 的结果。

    +

    附录 D:实用开发工具

    +
    +

    appendix-04-useful-development-tools.md +
    +commit 5057f157cd0b35bc7d0dc0af6ef622fa4c480996

    +
    +

    本附录,我们将讨论 Rust 项目提供的用于开发 Rust 代码的工具。

    +

    通过 rustfmt 自动格式化

    +

    rustfmt 工具根据社区代码风格格式化代码。很多项目使用 rustfmt 来避免编写 Rust 风格的争论:所有人都用这个工具格式化代码!

    +

    安装 rustfmt

    +
    $ rustup component add rustfmt
    +
    +

    这会提供 rustfmtcargo-fmt,类似于 Rust 同时安装 rustccargo。为了格式化整个 Cargo 项目:

    +
    $ cargo fmt
    +
    +

    运行此命令会格式化当前 crate 中所有的 Rust 代码。这应该只会改变代码风格,而不是代码语义。请查看 该文档 了解 rustfmt 的更多信息。

    +

    通过 rustfix 修复代码

    +

    如果你编写过 Rust 代码,那么你可能见过那些有很明显修复方式的编译器警告。例如,考虑如下代码:

    +

    文件名:src/main.rs

    +
    fn do_something() {}
    +
    +fn main() {
    +    for i in 0..100 {
    +        do_something();
    +    }
    +}
    +

    这里调用了 do_something 函数 100 次,不过从未在 for 循环体中使用变量 i。Rust 会警告说:

    +
    $ cargo build
    +   Compiling myprogram v0.1.0 (file:///projects/myprogram)
    +warning: unused variable: `i`
    + --> src/main.rs:4:9
    +  |
    +4 |     for i in 0..100 {
    +  |         ^ help: consider using `_i` instead
    +  |
    +  = note: #[warn(unused_variables)] on by default
    +
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.50s
    +
    +

    警告中建议使用 _i 名称:下划线表明该变量有意不使用。我们可以通过 cargo fix 命令使用 rustfix 工具来自动采用该建议:

    +
    $ cargo fix
    +    Checking myprogram v0.1.0 (file:///projects/myprogram)
    +      Fixing src/main.rs (1 fix)
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.59s
    +
    +

    如果再次查看 src/main.rs,会发现 cargo fix 修改了代码:

    +

    文件名:src/main.rs

    +
    fn do_something() {}
    +
    +fn main() {
    +    for _i in 0..100 {
    +        do_something();
    +    }
    +}
    +

    现在 for 循环变量变为 _i,警告也不再出现。

    +

    cargo fix 命令可以用于在不同 Rust 版本间迁移代码。版本在附录 E 中介绍。

    +

    通过 clippy 提供更多 lint 功能

    +

    clippy 工具是一系列 lint 的集合,用于捕捉常见错误和改进 Rust 代码。

    +

    安装 clippy

    +
    $ rustup component add clippy
    +
    +

    对任何 Cargo 项目运行 clippy 的 lint:

    +
    $ cargo clippy
    +
    +

    例如,如果程序使用了如 pi 这样数学常数的近似值,如下:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x = 3.1415;
    +    let r = 8.0;
    +    println!("the area of the circle is {}", x * r * r);
    +}
    +

    在此项目上运行 cargo clippy 会导致这个错误:

    +
    error: approximate value of `f{32, 64}::consts::PI` found
    + --> src/main.rs:2:13
    +  |
    +2 |     let x = 3.1415;
    +  |             ^^^^^^
    +  |
    +  = note: `#[deny(clippy::approx_constant)]` on by default
    +  = help: consider using the constant directly
    +  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#approx_constant
    +
    +

    这告诉我们 Rust 定义了更为精确的常量,而如果使用了这些常量程序将更加准确。如下代码就不会导致 clippy 产生任何错误或警告:

    +

    文件名:src/main.rs

    +
    fn main() {
    +    let x = std::f64::consts::PI;
    +    let r = 8.0;
    +    println!("the area of the circle is {}", x * r * r);
    +}
    +

    请查看 其文档 来了解 clippy 的更多信息。

    +

    使用 rust-analyzer 的 IDE 集成

    +

    为了帮助 IDE 集成,Rust 社区建议使用 rust-analyzer。这个工具是一组以编译器为中心的实用程序,它实现了 Language Server Protocol(一个 IDE 与编程语言之间的通信规范)。rust-analyzer 可以用于不同的客户端,比如 Visual Studio Code 的 Rust analyzer 插件

    +

    访问 rust-analyzer 项目的 主页 来了解如何安装它,然后为你的 IDE 安装 language server 支持。如此你的 IDE 便会获得如自动补全、跳转到定义和 inline error 之类的功能。

    +

    附录 E:版本

    +
    +

    appendix-05-editions.md +
    +commit 8cf0496bb8e56b683ea3f015871c8631684decf4

    +
    +

    早在第一章,我们见过 cargo newCargo.toml 中增加了一些有关 edition 的元数据。本附录将解释其意义!

    +

    Rust 语言和编译器有一个为期 6 周的发布循环。这意味着用户会稳定得到新功能的更新。其他编程语言发布大更新但不甚频繁;Rust 选择更为频繁的发布小更新。一段时间之后,所有这些小更新会日积月累。不过随着小更新逐次的发布,或许很难回过头来感叹:“哇,从 Rust 1.10 到 Rust 1.31,Rust 的变化真大!”

    +

    每两到三年,Rust 团队会生成一个新的 Rust 版本edition)。每一个版本会结合已经落地的功能,并提供一个清晰的带有完整更新文档和工具的功能包。新版本会作为常规的 6 周发布过程的一部分发布。

    +

    这为不同的人群提供了不同的功能:

    +
      +
    • 对于活跃的 Rust 用户,其将增量的修改与易于理解的功能包相结合。
    • +
    • 对于非用户,它表明发布了一些重大进展,这意味着 Rust 可能变得值得一试。
    • +
    • 对于 Rust 自身开发者,其提供了项目整体的集合点。
    • +
    +

    在本文档编写时,Rust 有三个可用版本:Rust 2015、Rust 2018 和 Rust 2021。本书基于 Rust 2021 edition 风格编写。

    +

    Cargo.toml 中的 edition 字段表明代码应该使用哪个版本编译。如果该字段不存在,其默认为 2015 以提供后向兼容性。

    +

    每个项目都可以选择不同于默认的 2015 edition 的版本。这样,版本可能会包含不兼容的修改,比如新增关键字可能会与代码中的标识符冲突并导致错误。不过除非选择兼容这些修改,(旧)代码仍将能够编译,即便升级了 Rust 编译器的版本。

    +

    所有 Rust 编译器都支持任何之前存在的编译器版本,并可以链接任何支持版本的 crate。编译器修改只影响最初的解析代码的过程。因此,如果你使用 Rust 2015 而某个依赖使用 Rust 2018,你的项目仍旧能够编译并使用该依赖。反之,若项目使用 Rust 2018 而依赖使用 Rust 2015 亦可工作。

    +

    有一点需要明确:大部分功能在所有版本中都能使用。开发者使用任何 Rust 版本将能继续接收最新稳定版的改进。然而在一些情况,主要是增加了新关键字的时候,则可能出现了只能用于新版本的功能。只需切换版本即可利用新版本的功能。

    +

    请查看 Edition Guide 了解更多细节,这是一个完全介绍版本的书籍,包括如何通过 cargo fix 自动将代码迁移到新版本。

    +

    附录 F:本书译本

    +
    +

    appendix-06-translation.md +
    +commit 4c8d13c52c51f1c62a80b52d7fbd7cc0b63ada43

    +
    +

    一些非英语语言的资源。多数仍在翻译中;查阅 翻译标签 来帮助翻译,或者添加译本链接!

    + +

    附录 G:Rust 是如何开发的与 “Nightly Rust”

    +
    +

    appendix-07-nightly-rust.md +
    +commit d44317c3122b44fb713aba66cc295dee3453b24b

    +
    +

    本附录介绍 Rust 是如何开发的以及这如何影响作为 Rust 开发者的你。

    +

    无停滞稳定

    +

    作为一个语言,Rust 十分 注重代码的稳定性。我们希望 Rust 成为你代码坚实的基础,假如持续地有东西在变,这个希望就实现不了。但与此同时,如果不能实验新功能的话,在发布之前我们又无法发现其中重大的缺陷,而一旦发布便再也没有修改的机会了。

    +

    对于这个问题我们的解决方案被称为 “无停滞稳定”(“stability without stagnation”),其指导性原则是:无需担心升级到最新的稳定版 Rust。每次升级应该是无痛的,并应带来新功能,更少的 bug 和更快的编译速度。

    +

    Choo, Choo! 发布通道和发布时刻表(Riding the Trains)

    +

    Rust 开发运行于一个 发布时刻表train schedule)之上。也就是说,所有的开发工作都位于 Rust 仓库的 master 分支。发布采用 software release train 模型,其被用于思科 IOS 等其它软件项目。Rust 有三个 发布通道release channel):

    +
      +
    • Nightly
    • +
    • Beta
    • +
    • Stable(稳定版)
    • +
    +

    大部分 Rust 开发者主要采用稳定版通道,不过希望实验新功能的开发者可能会使用 nightly 或 beta 版。

    +

    如下是一个开发和发布过程如何运转的例子:假设 Rust 团队正在进行 Rust 1.5 的发布工作。该版本发布于 2015 年 12 月,不过这里只是为了提供一个真实的版本。Rust 新增了一项功能:一个 master 分支的新提交。每天晚上,会产生一个新的 nightly 版本。每天都是发布版本的日子,而这些发布由发布基础设施自动完成。所以随着时间推移,发布轨迹看起来像这样,版本一天一发:

    +
    nightly: * - - * - - *
    +
    +

    每 6 周时间,是准备发布新版本的时候了!Rust 仓库的 beta 分支会从用于 nightly 的 master 分支产生。现在,有了两个发布版本:

    +
    nightly: * - - * - - *
    +                     |
    +beta:                *
    +
    +

    大部分 Rust 用户不会主要使用 beta 版本,不过在 CI 系统中对 beta 版本进行测试能够帮助 Rust 发现可能的回归缺陷(regression)。同时,每天仍产生 nightly 发布:

    +
    nightly: * - - * - - * - - * - - *
    +                     |
    +beta:                *
    +
    +

    比如我们发现了一个回归缺陷。好消息是在这些缺陷流入稳定发布之前还有一些时间来测试 beta 版本!fix 被合并到 master,为此 nightly 版本得到了修复,接着这些 fix 将 backport 到 beta 分支,一个新的 beta 发布就产生了:

    +
    nightly: * - - * - - * - - * - - * - - *
    +                     |
    +beta:                * - - - - - - - - *
    +
    +

    第一个 beta 版的 6 周后,是发布稳定版的时候了!stable 分支从 beta 分支生成:

    +
    nightly: * - - * - - * - - * - - * - - * - * - *
    +                     |
    +beta:                * - - - - - - - - *
    +                                       |
    +stable:                                *
    +
    +

    好的!Rust 1.5 发布了!然而,我们忘了些东西:因为又过了 6 周,我们还需发布 新版 Rust 的 beta 版,Rust 1.6。所以从 beta 生成 stable 分支后,新版的 beta 分支也再次从 nightly 生成:

    +
    nightly: * - - * - - * - - * - - * - - * - * - *
    +                     |                         |
    +beta:                * - - - - - - - - *       *
    +                                       |
    +stable:                                *
    +
    +

    这被称为 “train model”,因为每 6 周,一个版本 “离开车站”(“leaves the station”),不过从 beta 通道到达稳定通道还有一段旅程。

    +

    Rust 每 6 周发布一个版本,如时钟般准确。如果你知道了某个 Rust 版本的发布时间,就可以知道下个版本的时间:6 周后。每 6 周发布版本的一个好的方面是下一班车会来得更快。如果特定版本碰巧缺失某个功能也无需担心:另一个版本很快就会到来!这有助于减少因临近发版时间而偷偷释出未经完善的功能的压力。

    +

    多亏了这个过程,你总是可以切换到下一版本的 Rust 并验证是否可以轻易的升级:如果 beta 版不能如期工作,你可以向 Rust 团队报告并在发布稳定版之前得到修复!beta 版造成的破坏是非常少见的,不过 rustc 也不过是一个软件,可能会存在 bug。

    +

    不稳定功能

    +

    这个发布模型中另一个值得注意的地方:不稳定功能(unstable features)。Rust 使用一个被称为 “功能标记”(“feature flags”)的技术来确定给定版本的某个功能是否启用。如果新功能正在积极地开发中,其提交到了 master,因此会出现在 nightly 版中,不过会位于一个 功能标记 之后。作为用户,如果你希望尝试这个正在开发的功能,则可以在源码中使用合适的标记来开启,不过必须使用 nightly 版。

    +

    如果使用的是 beta 或稳定版 Rust,则不能使用任何功能标记。这是在新功能被宣布为永久稳定之前获得实用价值的关键。这既满足了希望使用最尖端技术的同学,那些坚持稳定版的同学也知道其代码不会被破坏。这就是无停滞稳定。

    +

    本书只包含稳定的功能,因为还在开发中的功能仍可能改变,当其进入稳定版时肯定会与编写本书的时候有所不同。你可以在网上获取 nightly 版的文档。

    +

    Rustup 和 Rust Nightly 的职责

    +

    Rustup 使得改变不同发布通道的 Rust 更为简单,其在全局或分项目的层次工作。其默认会安装稳定版 Rust。例如为了安装 nightly:

    +
    $ rustup toolchain install nightly
    +
    +

    你会发现 rustup 也安装了所有的 工具链toolchains,Rust 和其相关组件)。如下是一位作者的 Windows 计算机上的例子:

    +
    > rustup toolchain list
    +stable-x86_64-pc-windows-msvc (default)
    +beta-x86_64-pc-windows-msvc
    +nightly-x86_64-pc-windows-msvc
    +
    +

    如你所见,默认是稳定版。大部分 Rust 用户在大部分时间使用稳定版。你可能也会这么做,不过如果你关心最新的功能,可以为特定项目使用 nightly 版。为此,可以在项目目录使用 rustup override 来设置当前目录 rustup 使用 nightly 工具链:

    +
    $ cd ~/projects/needs-nightly
    +$ rustup override set nightly
    +
    +

    现在,每次在 ~/projects/needs-nightly 调用 rustccargorustup 会确保使用 nightly 版 Rust。在你有很多 Rust 项目时大有裨益!

    +

    RFC 过程和团队

    +

    那么你如何了解这些新功能呢?Rust 开发模式遵循一个 Request For Comments (RFC) 过程。如果你希望改进 Rust,可以编写一个提议,也就是 RFC。

    +

    任何人都可以编写 RFC 来改进 Rust,同时这些 RFC 会被 Rust 团队评审和讨论,他们由很多不同分工的子团队组成。这里是 Rust 官网上 所有团队的总列表,其包含了项目中每个领域的团队:语言设计、编译器实现、基础设施、文档等。各个团队会阅读相应的提议和评论,编写回复,并最终达成接受或回绝功能的一致。

    +

    如果功能被接受了,在 Rust 仓库会打开一个 issue,人们就可以实现它。实现功能的人当然可能不是最初提议功能的人!当实现完成后,其会合并到 master 分支并位于一个功能开关(feature gate)之后,正如 “不稳定功能” 部分所讨论的。

    +

    在稍后的某个时间,一旦使用 nightly 版的 Rust 团队能够尝试这个功能了,团队成员会讨论这个功能,它如何在 nightly 中工作,并决定是否应该进入稳定版。如果决定继续推进,功能开关会移除,然后这个功能就被认为是稳定的了!乘着“发布的列车”,最终在新的稳定版 Rust 中出现。

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/searcher.js b/searcher.js new file mode 100644 index 000000000..dc03e0a02 --- /dev/null +++ b/searcher.js @@ -0,0 +1,483 @@ +"use strict"; +window.search = window.search || {}; +(function search(search) { + // Search functionality + // + // You can use !hasFocus() to prevent keyhandling in your key + // event handlers while the user is typing their search. + + if (!Mark || !elasticlunr) { + return; + } + + //IE 11 Compatibility from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + if (!String.prototype.startsWith) { + String.prototype.startsWith = function(search, pos) { + return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; + }; + } + + var search_wrap = document.getElementById('search-wrapper'), + searchbar = document.getElementById('searchbar'), + searchbar_outer = document.getElementById('searchbar-outer'), + searchresults = document.getElementById('searchresults'), + searchresults_outer = document.getElementById('searchresults-outer'), + searchresults_header = document.getElementById('searchresults-header'), + searchicon = document.getElementById('search-toggle'), + content = document.getElementById('content'), + + searchindex = null, + doc_urls = [], + results_options = { + teaser_word_count: 30, + limit_results: 30, + }, + search_options = { + bool: "AND", + expand: true, + fields: { + title: {boost: 1}, + body: {boost: 1}, + breadcrumbs: {boost: 0} + } + }, + mark_exclude = [], + marker = new Mark(content), + current_searchterm = "", + URL_SEARCH_PARAM = 'search', + URL_MARK_PARAM = 'highlight', + teaser_count = 0, + + SEARCH_HOTKEY_KEYCODE = 83, + ESCAPE_KEYCODE = 27, + DOWN_KEYCODE = 40, + UP_KEYCODE = 38, + SELECT_KEYCODE = 13; + + function hasFocus() { + return searchbar === document.activeElement; + } + + function removeChildren(elem) { + while (elem.firstChild) { + elem.removeChild(elem.firstChild); + } + } + + // Helper to parse a url into its building blocks. + function parseURL(url) { + var a = document.createElement('a'); + a.href = url; + return { + source: url, + protocol: a.protocol.replace(':',''), + host: a.hostname, + port: a.port, + params: (function(){ + var ret = {}; + var seg = a.search.replace(/^\?/,'').split('&'); + var len = seg.length, i = 0, s; + for (;i': '>', + '"': '"', + "'": ''' + }; + var repl = function(c) { return MAP[c]; }; + return function(s) { + return s.replace(/[&<>'"]/g, repl); + }; + })(); + + function formatSearchMetric(count, searchterm) { + if (count == 1) { + return count + " search result for '" + searchterm + "':"; + } else if (count == 0) { + return "No search results for '" + searchterm + "'."; + } else { + return count + " search results for '" + searchterm + "':"; + } + } + + function formatSearchResult(result, searchterms) { + var teaser = makeTeaser(escapeHTML(result.doc.body), searchterms); + teaser_count++; + + // The ?URL_MARK_PARAM= parameter belongs inbetween the page and the #heading-anchor + var url = doc_urls[result.ref].split("#"); + if (url.length == 1) { // no anchor found + url.push(""); + } + + // encodeURIComponent escapes all chars that could allow an XSS except + // for '. Due to that we also manually replace ' with its url-encoded + // representation (%27). + var searchterms = encodeURIComponent(searchterms.join(" ")).replace(/\'/g, "%27"); + + return '' + result.doc.breadcrumbs + '' + + '' + + teaser + ''; + } + + function makeTeaser(body, searchterms) { + // The strategy is as follows: + // First, assign a value to each word in the document: + // Words that correspond to search terms (stemmer aware): 40 + // Normal words: 2 + // First word in a sentence: 8 + // Then use a sliding window with a constant number of words and count the + // sum of the values of the words within the window. Then use the window that got the + // maximum sum. If there are multiple maximas, then get the last one. + // Enclose the terms in . + var stemmed_searchterms = searchterms.map(function(w) { + return elasticlunr.stemmer(w.toLowerCase()); + }); + var searchterm_weight = 40; + var weighted = []; // contains elements of ["word", weight, index_in_document] + // split in sentences, then words + var sentences = body.toLowerCase().split('. '); + var index = 0; + var value = 0; + var searchterm_found = false; + for (var sentenceindex in sentences) { + var words = sentences[sentenceindex].split(' '); + value = 8; + for (var wordindex in words) { + var word = words[wordindex]; + if (word.length > 0) { + for (var searchtermindex in stemmed_searchterms) { + if (elasticlunr.stemmer(word).startsWith(stemmed_searchterms[searchtermindex])) { + value = searchterm_weight; + searchterm_found = true; + } + }; + weighted.push([word, value, index]); + value = 2; + } + index += word.length; + index += 1; // ' ' or '.' if last word in sentence + }; + index += 1; // because we split at a two-char boundary '. ' + }; + + if (weighted.length == 0) { + return body; + } + + var window_weight = []; + var window_size = Math.min(weighted.length, results_options.teaser_word_count); + + var cur_sum = 0; + for (var wordindex = 0; wordindex < window_size; wordindex++) { + cur_sum += weighted[wordindex][1]; + }; + window_weight.push(cur_sum); + for (var wordindex = 0; wordindex < weighted.length - window_size; wordindex++) { + cur_sum -= weighted[wordindex][1]; + cur_sum += weighted[wordindex + window_size][1]; + window_weight.push(cur_sum); + }; + + if (searchterm_found) { + var max_sum = 0; + var max_sum_window_index = 0; + // backwards + for (var i = window_weight.length - 1; i >= 0; i--) { + if (window_weight[i] > max_sum) { + max_sum = window_weight[i]; + max_sum_window_index = i; + } + }; + } else { + max_sum_window_index = 0; + } + + // add around searchterms + var teaser_split = []; + var index = weighted[max_sum_window_index][2]; + for (var i = max_sum_window_index; i < max_sum_window_index+window_size; i++) { + var word = weighted[i]; + if (index < word[2]) { + // missing text from index to start of `word` + teaser_split.push(body.substring(index, word[2])); + index = word[2]; + } + if (word[1] == searchterm_weight) { + teaser_split.push("") + } + index = word[2] + word[0].length; + teaser_split.push(body.substring(word[2], index)); + if (word[1] == searchterm_weight) { + teaser_split.push("") + } + }; + + return teaser_split.join(''); + } + + function init(config) { + results_options = config.results_options; + search_options = config.search_options; + searchbar_outer = config.searchbar_outer; + doc_urls = config.doc_urls; + searchindex = elasticlunr.Index.load(config.index); + + // Set up events + searchicon.addEventListener('click', function(e) { searchIconClickHandler(); }, false); + searchbar.addEventListener('keyup', function(e) { searchbarKeyUpHandler(); }, false); + document.addEventListener('keydown', function(e) { globalKeyHandler(e); }, false); + // If the user uses the browser buttons, do the same as if a reload happened + window.onpopstate = function(e) { doSearchOrMarkFromUrl(); }; + // Suppress "submit" events so the page doesn't reload when the user presses Enter + document.addEventListener('submit', function(e) { e.preventDefault(); }, false); + + // If reloaded, do the search or mark again, depending on the current url parameters + doSearchOrMarkFromUrl(); + } + + function unfocusSearchbar() { + // hacky, but just focusing a div only works once + var tmp = document.createElement('input'); + tmp.setAttribute('style', 'position: absolute; opacity: 0;'); + searchicon.appendChild(tmp); + tmp.focus(); + tmp.remove(); + } + + // On reload or browser history backwards/forwards events, parse the url and do search or mark + function doSearchOrMarkFromUrl() { + // Check current URL for search request + var url = parseURL(window.location.href); + if (url.params.hasOwnProperty(URL_SEARCH_PARAM) + && url.params[URL_SEARCH_PARAM] != "") { + showSearch(true); + searchbar.value = decodeURIComponent( + (url.params[URL_SEARCH_PARAM]+'').replace(/\+/g, '%20')); + searchbarKeyUpHandler(); // -> doSearch() + } else { + showSearch(false); + } + + if (url.params.hasOwnProperty(URL_MARK_PARAM)) { + var words = decodeURIComponent(url.params[URL_MARK_PARAM]).split(' '); + marker.mark(words, { + exclude: mark_exclude + }); + + var markers = document.querySelectorAll("mark"); + function hide() { + for (var i = 0; i < markers.length; i++) { + markers[i].classList.add("fade-out"); + window.setTimeout(function(e) { marker.unmark(); }, 300); + } + } + for (var i = 0; i < markers.length; i++) { + markers[i].addEventListener('click', hide); + } + } + } + + // Eventhandler for keyevents on `document` + function globalKeyHandler(e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey || e.target.type === 'textarea' || e.target.type === 'text' || !hasFocus() && /^(?:input|select|textarea)$/i.test(e.target.nodeName)) { return; } + + if (e.keyCode === ESCAPE_KEYCODE) { + e.preventDefault(); + searchbar.classList.remove("active"); + setSearchUrlParameters("", + (searchbar.value.trim() !== "") ? "push" : "replace"); + if (hasFocus()) { + unfocusSearchbar(); + } + showSearch(false); + marker.unmark(); + } else if (!hasFocus() && e.keyCode === SEARCH_HOTKEY_KEYCODE) { + e.preventDefault(); + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else if (hasFocus() && e.keyCode === DOWN_KEYCODE) { + e.preventDefault(); + unfocusSearchbar(); + searchresults.firstElementChild.classList.add("focus"); + } else if (!hasFocus() && (e.keyCode === DOWN_KEYCODE + || e.keyCode === UP_KEYCODE + || e.keyCode === SELECT_KEYCODE)) { + // not `:focus` because browser does annoying scrolling + var focused = searchresults.querySelector("li.focus"); + if (!focused) return; + e.preventDefault(); + if (e.keyCode === DOWN_KEYCODE) { + var next = focused.nextElementSibling; + if (next) { + focused.classList.remove("focus"); + next.classList.add("focus"); + } + } else if (e.keyCode === UP_KEYCODE) { + focused.classList.remove("focus"); + var prev = focused.previousElementSibling; + if (prev) { + prev.classList.add("focus"); + } else { + searchbar.select(); + } + } else { // SELECT_KEYCODE + window.location.assign(focused.querySelector('a')); + } + } + } + + function showSearch(yes) { + if (yes) { + search_wrap.classList.remove('hidden'); + searchicon.setAttribute('aria-expanded', 'true'); + } else { + search_wrap.classList.add('hidden'); + searchicon.setAttribute('aria-expanded', 'false'); + var results = searchresults.children; + for (var i = 0; i < results.length; i++) { + results[i].classList.remove("focus"); + } + } + } + + function showResults(yes) { + if (yes) { + searchresults_outer.classList.remove('hidden'); + } else { + searchresults_outer.classList.add('hidden'); + } + } + + // Eventhandler for search icon + function searchIconClickHandler() { + if (search_wrap.classList.contains('hidden')) { + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else { + showSearch(false); + } + } + + // Eventhandler for keyevents while the searchbar is focused + function searchbarKeyUpHandler() { + var searchterm = searchbar.value.trim(); + if (searchterm != "") { + searchbar.classList.add("active"); + doSearch(searchterm); + } else { + searchbar.classList.remove("active"); + showResults(false); + removeChildren(searchresults); + } + + setSearchUrlParameters(searchterm, "push_if_new_search_else_replace"); + + // Remove marks + marker.unmark(); + } + + // Update current url with ?URL_SEARCH_PARAM= parameter, remove ?URL_MARK_PARAM and #heading-anchor . + // `action` can be one of "push", "replace", "push_if_new_search_else_replace" + // and replaces or pushes a new browser history item. + // "push_if_new_search_else_replace" pushes if there is no `?URL_SEARCH_PARAM=abc` yet. + function setSearchUrlParameters(searchterm, action) { + var url = parseURL(window.location.href); + var first_search = ! url.params.hasOwnProperty(URL_SEARCH_PARAM); + if (searchterm != "" || action == "push_if_new_search_else_replace") { + url.params[URL_SEARCH_PARAM] = searchterm; + delete url.params[URL_MARK_PARAM]; + url.hash = ""; + } else { + delete url.params[URL_MARK_PARAM]; + delete url.params[URL_SEARCH_PARAM]; + } + // A new search will also add a new history item, so the user can go back + // to the page prior to searching. A updated search term will only replace + // the url. + if (action == "push" || (action == "push_if_new_search_else_replace" && first_search) ) { + history.pushState({}, document.title, renderURL(url)); + } else if (action == "replace" || (action == "push_if_new_search_else_replace" && !first_search) ) { + history.replaceState({}, document.title, renderURL(url)); + } + } + + function doSearch(searchterm) { + + // Don't search the same twice + if (current_searchterm == searchterm) { return; } + else { current_searchterm = searchterm; } + + if (searchindex == null) { return; } + + // Do the actual search + var results = searchindex.search(searchterm, search_options); + var resultcount = Math.min(results.length, results_options.limit_results); + + // Display search metrics + searchresults_header.innerText = formatSearchMetric(resultcount, searchterm); + + // Clear and insert results + var searchterms = searchterm.split(' '); + removeChildren(searchresults); + for(var i = 0; i < resultcount ; i++){ + var resultElem = document.createElement('li'); + resultElem.innerHTML = formatSearchResult(results[i], searchterms); + searchresults.appendChild(resultElem); + } + + // Display results + showResults(true); + } + + fetch(path_to_root + 'searchindex.json') + .then(response => response.json()) + .then(json => init(json)) + .catch(error => { // Try to load searchindex.js if fetch failed + var script = document.createElement('script'); + script.src = path_to_root + 'searchindex.js'; + script.onload = () => init(window.search); + document.head.appendChild(script); + }); + + // Exported functions + search.hasFocus = hasFocus; +})(window.search); diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 000000000..33e15dd4d --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Object.assign(window.search, {"doc_urls":["title-page.html#rust-程序设计语言","foreword.html#前言","ch00-00-introduction.html#简介","ch00-00-introduction.html#rust-适合哪些人","ch00-00-introduction.html#开发者团队","ch00-00-introduction.html#学生","ch00-00-introduction.html#公司","ch00-00-introduction.html#开源开发者","ch00-00-introduction.html#重视速度和稳定性的开发者","ch00-00-introduction.html#本书适合哪些人","ch00-00-introduction.html#如何阅读本书","ch00-00-introduction.html#源代码","ch01-00-getting-started.html#入门指南","ch01-01-installation.html#安装","ch01-01-installation.html#命令行标记","ch01-01-installation.html#在-linux-或-macos-上安装-rustup","ch01-01-installation.html#在-windows-上安装-rustup","ch01-01-installation.html#故障排除troubleshooting","ch01-01-installation.html#更新与卸载","ch01-01-installation.html#本地文档","ch01-02-hello-world.html#hello-world","ch01-02-hello-world.html#创建项目目录","ch01-02-hello-world.html#编写并运行-rust-程序","ch01-02-hello-world.html#分析这个-rust-程序","ch01-02-hello-world.html#编译和运行是彼此独立的步骤","ch01-03-hello-cargo.html#hello-cargo","ch01-03-hello-cargo.html#使用-cargo-创建项目","ch01-03-hello-cargo.html#构建并运行-cargo-项目","ch01-03-hello-cargo.html#发布release构建","ch01-03-hello-cargo.html#把-cargo-当作习惯","ch01-03-hello-cargo.html#总结","ch02-00-guessing-game-tutorial.html#写个猜数字游戏","ch02-00-guessing-game-tutorial.html#准备一个新项目","ch02-00-guessing-game-tutorial.html#处理一次猜测","ch02-00-guessing-game-tutorial.html#使用变量储存值","ch02-00-guessing-game-tutorial.html#接收用户输入","ch02-00-guessing-game-tutorial.html#使用-result-类型来处理潜在的错误","ch02-00-guessing-game-tutorial.html#使用-println-占位符打印值","ch02-00-guessing-game-tutorial.html#测试第一部分代码","ch02-00-guessing-game-tutorial.html#生成一个秘密数字","ch02-00-guessing-game-tutorial.html#使用-crate-来增加更多功能","ch02-00-guessing-game-tutorial.html#生成一个随机数","ch02-00-guessing-game-tutorial.html#比较猜测的数字和秘密数字","ch02-00-guessing-game-tutorial.html#使用循环来允许多次猜测","ch02-00-guessing-game-tutorial.html#猜测正确后退出","ch02-00-guessing-game-tutorial.html#处理无效输入","ch02-00-guessing-game-tutorial.html#总结","ch03-00-common-programming-concepts.html#常见编程概念","ch03-00-common-programming-concepts.html#关键字","ch03-01-variables-and-mutability.html#变量和可变性","ch03-01-variables-and-mutability.html#常量","ch03-01-variables-and-mutability.html#隐藏","ch03-02-data-types.html#数据类型","ch03-02-data-types.html#标量类型","ch03-02-data-types.html#复合类型","ch03-03-how-functions-work.html#函数","ch03-03-how-functions-work.html#参数","ch03-03-how-functions-work.html#语句和表达式","ch03-03-how-functions-work.html#具有返回值的函数","ch03-04-comments.html#注释","ch03-05-control-flow.html#控制流","ch03-05-control-flow.html#if-表达式","ch03-05-control-flow.html#使用循环重复执行","ch03-05-control-flow.html#总结","ch04-00-understanding-ownership.html#认识所有权","ch04-01-what-is-ownership.html#什么是所有权","ch04-01-what-is-ownership.html#栈stack与堆heap","ch04-01-what-is-ownership.html#所有权规则","ch04-01-what-is-ownership.html#变量作用域","ch04-01-what-is-ownership.html#string-类型","ch04-01-what-is-ownership.html#内存与分配","ch04-01-what-is-ownership.html#所有权与函数","ch04-01-what-is-ownership.html#返回值与作用域","ch04-02-references-and-borrowing.html#引用与借用","ch04-02-references-and-borrowing.html#可变引用","ch04-02-references-and-borrowing.html#悬垂引用dangling-references","ch04-02-references-and-borrowing.html#引用的规则","ch04-03-slices.html#slice-类型","ch04-03-slices.html#字符串-slice","ch04-03-slices.html#其他类型的-slice","ch04-03-slices.html#总结","ch05-00-structs.html#使用结构体组织相关联的数据","ch05-01-defining-structs.html#结构体的定义和实例化","ch05-01-defining-structs.html#使用字段初始化简写语法","ch05-01-defining-structs.html#使用结构体更新语法从其他实例创建实例","ch05-01-defining-structs.html#使用没有命名字段的元组结构体来创建不同的类型","ch05-01-defining-structs.html#没有任何字段的类单元结构体","ch05-01-defining-structs.html#结构体数据的所有权","ch05-02-example-structs.html#结构体示例程序","ch05-02-example-structs.html#使用元组重构","ch05-02-example-structs.html#使用结构体重构赋予更多意义","ch05-02-example-structs.html#通过派生-trait-增加实用功能","ch05-03-method-syntax.html#方法语法","ch05-03-method-syntax.html#定义方法","ch05-03-method-syntax.html#--运算符到哪去了","ch05-03-method-syntax.html#带有更多参数的方法","ch05-03-method-syntax.html#关联函数","ch05-03-method-syntax.html#多个-impl-块","ch05-03-method-syntax.html#总结","ch06-00-enums.html#枚举和模式匹配","ch06-01-defining-an-enum.html#枚举的定义","ch06-01-defining-an-enum.html#枚举值","ch06-01-defining-an-enum.html#option-枚举和其相对于空值的优势","ch06-02-match.html#match-控制流结构","ch06-02-match.html#绑定值的模式","ch06-02-match.html#匹配-option","ch06-02-match.html#匹配是穷尽的","ch06-02-match.html#通配模式和-_-占位符","ch06-03-if-let.html#if-let-简洁控制流","ch06-03-if-let.html#总结","ch07-00-managing-growing-projects-with-packages-crates-and-modules.html#使用包crate-和模块管理不断增长的项目","ch07-01-packages-and-crates.html#包和-crate","ch07-02-defining-modules-to-control-scope-and-privacy.html#定义模块来控制作用域与私有性","ch07-02-defining-modules-to-control-scope-and-privacy.html#模块小抄","ch07-02-defining-modules-to-control-scope-and-privacy.html#在模块中对相关代码进行分组","ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html#引用模块项目的路径","ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html#使用-pub-关键字暴露路径","ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html#二进制和库-crate-包的最佳实践","ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html#super-开始的相对路径","ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html#创建公有的结构体和枚举","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#使用-use-关键字将路径引入作用域","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#创建惯用的-use-路径","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#使用-as-关键字提供新的名称","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#使用-pub-use-重导出名称","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#使用外部包","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#嵌套路径来消除大量的-use-行","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#通过-glob-运算符将所有的公有定义引入作用域","ch07-05-separating-modules-into-different-files.html#将模块拆分成多个文件","ch07-05-separating-modules-into-different-files.html#另一种文件路径","ch07-05-separating-modules-into-different-files.html#总结","ch08-00-common-collections.html#常见集合","ch08-01-vectors.html#使用-vector-储存列表","ch08-01-vectors.html#新建-vector","ch08-01-vectors.html#更新-vector","ch08-01-vectors.html#读取-vector-的元素","ch08-01-vectors.html#遍历-vector-中的元素","ch08-01-vectors.html#使用枚举来储存多种类型","ch08-01-vectors.html#丢弃-vector-时也会丢弃其所有元素","ch08-02-strings.html#使用字符串储存-utf-8-编码的文本","ch08-02-strings.html#什么是字符串","ch08-02-strings.html#新建字符串","ch08-02-strings.html#更新字符串","ch08-02-strings.html#索引字符串","ch08-02-strings.html#字符串-slice","ch08-02-strings.html#遍历字符串的方法","ch08-02-strings.html#字符串并不简单","ch08-03-hash-maps.html#使用-hash-map-储存键值对","ch08-03-hash-maps.html#新建一个哈希-map","ch08-03-hash-maps.html#访问哈希-map-中的值","ch08-03-hash-maps.html#哈希-map-和所有权","ch08-03-hash-maps.html#更新哈希-map","ch08-03-hash-maps.html#哈希函数","ch08-03-hash-maps.html#总结","ch09-00-error-handling.html#错误处理","ch09-01-unrecoverable-errors-with-panic.html#用-panic-处理不可恢复的错误","ch09-01-unrecoverable-errors-with-panic.html#对应-panic-时的栈展开或终止","ch09-01-unrecoverable-errors-with-panic.html#使用-panic-的-backtrace","ch09-02-recoverable-errors-with-result.html#用-result-处理可恢复的错误","ch09-02-recoverable-errors-with-result.html#匹配不同的错误","ch09-02-recoverable-errors-with-result.html#失败时-panic-的简写unwrap-和-expect","ch09-02-recoverable-errors-with-result.html#传播错误","ch09-02-recoverable-errors-with-result.html#传播错误的简写-运算符","ch09-02-recoverable-errors-with-result.html#哪里可以使用--运算符","ch09-03-to-panic-or-not-to-panic.html#要不要-panic","ch09-03-to-panic-or-not-to-panic.html#示例代码原型和测试都非常适合-panic","ch09-03-to-panic-or-not-to-panic.html#当我们比编译器知道更多的情况","ch09-03-to-panic-or-not-to-panic.html#错误处理指导原则","ch09-03-to-panic-or-not-to-panic.html#创建自定义类型进行有效性验证","ch09-03-to-panic-or-not-to-panic.html#总结","ch10-00-generics.html#泛型trait-和生命周期","ch10-00-generics.html#提取函数来减少重复","ch10-01-syntax.html#泛型数据类型","ch10-01-syntax.html#在函数定义中使用泛型","ch10-01-syntax.html#结构体定义中的泛型","ch10-01-syntax.html#枚举定义中的泛型","ch10-01-syntax.html#方法定义中的泛型","ch10-01-syntax.html#泛型代码的性能","ch10-02-traits.html#trait定义共同行为","ch10-02-traits.html#定义-trait","ch10-02-traits.html#为类型实现-trait","ch10-02-traits.html#默认实现","ch10-02-traits.html#trait-作为参数","ch10-02-traits.html#返回实现了-trait-的类型","ch10-02-traits.html#使用-trait-bound-有条件地实现方法","ch10-03-lifetime-syntax.html#生命周期确保引用有效","ch10-03-lifetime-syntax.html#生命周期避免了悬垂引用","ch10-03-lifetime-syntax.html#函数中的泛型生命周期","ch10-03-lifetime-syntax.html#生命周期注解语法","ch10-03-lifetime-syntax.html#函数签名中的生命周期注解","ch10-03-lifetime-syntax.html#深入理解生命周期","ch10-03-lifetime-syntax.html#结构体定义中的生命周期注解","ch10-03-lifetime-syntax.html#生命周期省略lifetime-elision","ch10-03-lifetime-syntax.html#方法定义中的生命周期注解","ch10-03-lifetime-syntax.html#静态生命周期","ch10-03-lifetime-syntax.html#结合泛型类型参数trait-bounds-和生命周期","ch10-03-lifetime-syntax.html#总结","ch11-00-testing.html#编写自动化测试","ch11-01-writing-tests.html#如何编写测试","ch11-01-writing-tests.html#测试函数剖析","ch11-01-writing-tests.html#使用-assert-宏来检查结果","ch11-01-writing-tests.html#使用-assert_eq-和-assert_ne-宏来测试相等","ch11-01-writing-tests.html#自定义失败信息","ch11-01-writing-tests.html#使用-should_panic-检查-panic","ch11-01-writing-tests.html#将-result-用于测试","ch11-02-running-tests.html#控制测试如何运行","ch11-02-running-tests.html#并行或连续的运行测试","ch11-02-running-tests.html#显示函数输出","ch11-02-running-tests.html#通过指定名字来运行部分测试","ch11-02-running-tests.html#除非特别指定否则忽略某些测试","ch11-03-test-organization.html#测试的组织结构","ch11-03-test-organization.html#单元测试","ch11-03-test-organization.html#集成测试","ch11-03-test-organization.html#总结","ch12-00-an-io-project.html#一个-io-项目构建一个命令行程序","ch12-01-accepting-command-line-arguments.html#接受命令行参数","ch12-01-accepting-command-line-arguments.html#读取参数值","ch12-01-accepting-command-line-arguments.html#args-函数和无效的-unicode","ch12-01-accepting-command-line-arguments.html#将参数值保存进变量","ch12-02-reading-a-file.html#读取文件","ch12-03-improving-error-handling-and-modularity.html#重构改进模块性和错误处理","ch12-03-improving-error-handling-and-modularity.html#二进制项目的关注分离","ch12-03-improving-error-handling-and-modularity.html#提取参数解析器","ch12-03-improving-error-handling-and-modularity.html#组合配置值","ch12-03-improving-error-handling-and-modularity.html#创建一个-config-的构造函数","ch12-03-improving-error-handling-and-modularity.html#修复错误处理","ch12-03-improving-error-handling-and-modularity.html#从-main-提取逻辑","ch12-03-improving-error-handling-and-modularity.html#将代码拆分到库-crate","ch12-04-testing-the-librarys-functionality.html#采用测试驱动开发完善库的功能","ch12-04-testing-the-librarys-functionality.html#编写失败测试","ch12-04-testing-the-librarys-functionality.html#编写使测试通过的代码","ch12-05-working-with-environment-variables.html#处理环境变量","ch12-05-working-with-environment-variables.html#编写一个大小写不敏感-search-函数的失败测试","ch12-05-working-with-environment-variables.html#实现-search_case_insensitive-函数","ch12-06-writing-to-stderr-instead-of-stdout.html#将错误信息输出到标准错误而不是标准输出","ch12-06-writing-to-stderr-instead-of-stdout.html#检查错误应该写入何处","ch12-06-writing-to-stderr-instead-of-stdout.html#将错误打印到标准错误","ch12-06-writing-to-stderr-instead-of-stdout.html#总结","ch13-00-functional-features.html#rust-中的函数式语言功能迭代器与闭包","ch13-01-closures.html#闭包可以捕获环境的匿名函数","ch13-01-closures.html#闭包会捕获其环境","ch13-01-closures.html#闭包类型推断和注解","ch13-01-closures.html#捕获引用或者移动所有权","ch13-01-closures.html#将被捕获的值移出闭包和-fn-trait","ch13-02-iterators.html#使用迭代器处理元素序列","ch13-02-iterators.html#iterator-trait-和-next-方法","ch13-02-iterators.html#消费迭代器的方法","ch13-02-iterators.html#产生其他迭代器的方法","ch13-02-iterators.html#使用捕获其环境的闭包","ch13-03-improving-our-io-project.html#改进-io-项目","ch13-03-improving-our-io-project.html#使用迭代器去除-clone","ch13-03-improving-our-io-project.html#使用迭代器适配器来使代码更简明","ch13-03-improving-our-io-project.html#选择循环或迭代器","ch13-04-performance.html#性能对比循环-vs-迭代器","ch13-04-performance.html#总结","ch14-00-more-about-cargo.html#进一步认识-cargo-和-cratesio","ch14-01-release-profiles.html#采用发布配置自定义构建","ch14-02-publishing-to-crates-io.html#将-crate-发布到-cratesio","ch14-02-publishing-to-crates-io.html#编写有用的文档注释","ch14-02-publishing-to-crates-io.html#使用-pub-use-导出合适的公有-api","ch14-02-publishing-to-crates-io.html#创建-cratesio-账号","ch14-02-publishing-to-crates-io.html#向新-crate-添加元信息","ch14-02-publishing-to-crates-io.html#发布到-cratesio","ch14-02-publishing-to-crates-io.html#发布现存-crate-的新版本","ch14-02-publishing-to-crates-io.html#使用-cargo-yank-从-cratesio-弃用版本","ch14-03-cargo-workspaces.html#cargo-工作空间","ch14-03-cargo-workspaces.html#创建工作空间","ch14-03-cargo-workspaces.html#在工作空间中创建第二个包","ch14-04-installing-binaries.html#使用-cargo-install-安装二进制文件","ch14-05-extending-cargo.html#cargo-自定义扩展命令","ch14-05-extending-cargo.html#总结","ch15-00-smart-pointers.html#智能指针","ch15-01-box.html#使用box指向堆上的数据","ch15-01-box.html#使用-box-在堆上储存数据","ch15-01-box.html#box-允许创建递归类型","ch15-01-box.html#计算非递归类型的大小","ch15-01-box.html#使用-box-给递归类型一个已知的大小","ch15-02-deref.html#通过-deref-trait-将智能指针当作常规引用处理","ch15-02-deref.html#追踪指针的值","ch15-02-deref.html#像引用一样使用-box","ch15-02-deref.html#自定义智能指针","ch15-02-deref.html#通过实现-deref-trait-将某类型像引用一样处理","ch15-02-deref.html#函数和方法的隐式-deref-强制转换","ch15-02-deref.html#deref-强制转换如何与可变性交互","ch15-03-drop.html#使用-drop-trait-运行清理代码","ch15-04-rc.html#rc-引用计数智能指针","ch15-04-rc.html#使用-rc-共享数据","ch15-04-rc.html#克隆-rc-会增加引用计数","ch15-05-interior-mutability.html#refcell-和内部可变性模式","ch15-05-interior-mutability.html#通过-refcell-在运行时检查借用规则","ch15-05-interior-mutability.html#内部可变性不可变值的可变借用","ch15-05-interior-mutability.html#refcell-在运行时记录借用","ch15-05-interior-mutability.html#结合-rc-和-refcell-来拥有多个可变数据所有者","ch15-06-reference-cycles.html#引用循环与内存泄漏","ch15-06-reference-cycles.html#制造引用循环","ch15-06-reference-cycles.html#避免引用循环将-rc-变为-weak","ch15-06-reference-cycles.html#总结","ch16-00-concurrency.html#无畏并发","ch16-01-threads.html#使用线程同时运行代码","ch16-01-threads.html#使用-spawn-创建新线程","ch16-01-threads.html#将-move-闭包与线程一同使用","ch16-02-message-passing.html#使用消息传递在线程间传送数据","ch16-02-message-passing.html#信道与所有权转移","ch16-02-message-passing.html#发送多个值并观察接收者的等待","ch16-02-message-passing.html#通过克隆发送者来创建多个生产者","ch16-03-shared-state.html#共享状态的并发","ch16-03-shared-state.html#使用互斥器实现同一时刻只允许一个线程访问数据","ch16-03-shared-state.html#mutex的-api","ch16-03-shared-state.html#refcellrc-与-mutexarc-的相似性","ch16-04-extensible-concurrency-sync-and-send.html#使用-sync-和-send-trait-的可扩展并发","ch16-04-extensible-concurrency-sync-and-send.html#通过-send-允许在线程间转移所有权","ch16-04-extensible-concurrency-sync-and-send.html#sync-允许多线程访问","ch16-04-extensible-concurrency-sync-and-send.html#手动实现-send-和-sync-是不安全的","ch16-04-extensible-concurrency-sync-and-send.html#总结","ch17-00-async-await.html#async-和-await","ch17-00-async-await.html#并行与并发","ch17-01-futures-and-syntax.html#futures-和-async-语法","ch17-01-futures-and-syntax.html#第一个异步程序","ch17-02-concurrency-with-async.html#并发与-async","ch17-02-concurrency-with-async.html#计数","ch17-02-concurrency-with-async.html#消息传递","ch17-03-more-futures.html#使用任意数量的-futures","ch17-03-more-futures.html#future-竞争","ch17-03-more-futures.html#yielding","ch17-03-more-futures.html#构建我们自己的异步抽象","ch17-04-streams.html#流streams","ch17-04-streams.html#组合流","ch17-05-traits-for-async.html#深入理解-async-相关的-traits","ch17-06-futures-tasks-threads.html#futures任务tasks和线程threads","ch18-00-oop.html#rust-的面向对象特性","ch18-01-what-is-oo.html#面向对象语言的特征","ch18-01-what-is-oo.html#对象包含数据和行为","ch18-01-what-is-oo.html#封装隐藏了实现细节","ch18-01-what-is-oo.html#继承作为类型系统与代码共享","ch18-02-trait-objects.html#顾及不同类型值的-trait-对象","ch18-02-trait-objects.html#定义通用行为的-trait","ch18-02-trait-objects.html#实现-trait","ch18-02-trait-objects.html#trait-对象执行动态分发","ch18-03-oo-design-patterns.html#面向对象设计模式的实现","ch18-03-oo-design-patterns.html#定义-post-并新建一个草案状态的实例","ch18-03-oo-design-patterns.html#存放博文内容的文本","ch18-03-oo-design-patterns.html#确保博文草案的内容是空的","ch18-03-oo-design-patterns.html#请求审核博文来改变其状态","ch18-03-oo-design-patterns.html#增加改变-content-行为的-approve-方法","ch18-03-oo-design-patterns.html#状态模式的权衡取舍","ch18-03-oo-design-patterns.html#总结","ch19-00-patterns.html#模式与模式匹配","ch19-01-all-the-places-for-patterns.html#所有可能会用到模式的位置","ch19-01-all-the-places-for-patterns.html#match-分支","ch19-01-all-the-places-for-patterns.html#if-let-条件表达式","ch19-01-all-the-places-for-patterns.html#while-let-条件循环","ch19-01-all-the-places-for-patterns.html#for-循环","ch19-01-all-the-places-for-patterns.html#let-语句","ch19-01-all-the-places-for-patterns.html#函数参数","ch19-02-refutability.html#refutability可反驳性-模式是否会匹配失效","ch19-03-pattern-syntax.html#所有的模式语法","ch19-03-pattern-syntax.html#匹配字面值","ch19-03-pattern-syntax.html#匹配命名变量","ch19-03-pattern-syntax.html#多个模式","ch19-03-pattern-syntax.html#通过--匹配值的范围","ch19-03-pattern-syntax.html#解构并分解值","ch19-03-pattern-syntax.html#忽略模式中的值","ch19-03-pattern-syntax.html#匹配守卫提供的额外条件","ch19-03-pattern-syntax.html#-绑定","ch19-03-pattern-syntax.html#总结","ch20-00-advanced-features.html#高级特征","ch20-01-unsafe-rust.html#不安全-rust","ch20-01-unsafe-rust.html#不安全的超能力","ch20-01-unsafe-rust.html#解引用裸指针","ch20-01-unsafe-rust.html#调用不安全函数或方法","ch20-01-unsafe-rust.html#访问或修改可变静态变量","ch20-01-unsafe-rust.html#实现不安全-trait","ch20-01-unsafe-rust.html#访问联合体中的字段","ch20-01-unsafe-rust.html#何时使用不安全代码","ch20-03-advanced-traits.html#高级-trait","ch20-03-advanced-traits.html#关联类型在-trait-定义中指定占位符类型","ch20-03-advanced-traits.html#默认泛型类型参数和运算符重载","ch20-03-advanced-traits.html#完全限定语法与消歧义调用相同名称的方法","ch20-03-advanced-traits.html#父-trait-用于在另一个-trait-中使用某-trait-的功能","ch20-03-advanced-traits.html#newtype-模式用以在外部类型上实现外部-trait","ch20-04-advanced-types.html#高级类型","ch20-04-advanced-types.html#为了类型安全和抽象而使用-newtype-模式","ch20-04-advanced-types.html#类型别名用来创建类型同义词","ch20-04-advanced-types.html#从不返回的-never-type","ch20-04-advanced-types.html#动态大小类型和-sized-trait","ch20-05-advanced-functions-and-closures.html#高级函数与闭包","ch20-05-advanced-functions-and-closures.html#函数指针","ch20-05-advanced-functions-and-closures.html#返回闭包","ch20-06-macros.html#宏","ch20-06-macros.html#宏和函数的区别","ch20-06-macros.html#使用-macro_rules-的声明宏用于通用元编程","ch20-06-macros.html#用于从属性生成代码的过程宏","ch20-06-macros.html#如何编写自定义-derive-宏","ch20-06-macros.html#类属性宏","ch20-06-macros.html#类函数宏","ch20-06-macros.html#总结","ch21-00-final-project-a-web-server.html#最后的项目构建多线程-web-server","ch21-01-single-threaded.html#构建单线程-web-server","ch21-01-single-threaded.html#监听-tcp-连接","ch21-01-single-threaded.html#读取请求","ch21-01-single-threaded.html#编写响应","ch21-01-single-threaded.html#返回真正的-html","ch21-01-single-threaded.html#验证请求并有选择的进行响应","ch21-01-single-threaded.html#少量代码重构","ch21-02-multithreaded.html#将单线程-server-变为多线程-server","ch21-02-multithreaded.html#在当前-server-实现中模拟慢请求","ch21-02-multithreaded.html#使用线程池改善吞吐量","ch21-03-graceful-shutdown-and-cleanup.html#优雅停机与清理","ch21-03-graceful-shutdown-and-cleanup.html#为-threadpool-实现-drop-trait","ch21-03-graceful-shutdown-and-cleanup.html#向线程发送信号使其停止接收任务","ch21-03-graceful-shutdown-and-cleanup.html#总结","appendix-00.html#附录","appendix-01-keywords.html#附录-a关键字","appendix-01-keywords.html#目前正在使用的关键字","appendix-01-keywords.html#保留做将来使用的关键字","appendix-01-keywords.html#原始标识符","appendix-02-operators.html#附录-b运算符与符号","appendix-02-operators.html#运算符","appendix-02-operators.html#非运算符符号","appendix-03-derivable-traits.html#附录-c可派生的-trait","appendix-03-derivable-traits.html#用于程序员输出的-debug","appendix-03-derivable-traits.html#等值比较的-partialeq-和-eq","appendix-03-derivable-traits.html#次序比较的-partialord-和-ord","appendix-03-derivable-traits.html#复制值的-clone-和-copy","appendix-03-derivable-traits.html#固定大小的值到值映射的-hash","appendix-03-derivable-traits.html#默认值的-default","appendix-04-useful-development-tools.html#附录-d实用开发工具","appendix-04-useful-development-tools.html#通过-rustfmt-自动格式化","appendix-04-useful-development-tools.html#通过-rustfix-修复代码","appendix-04-useful-development-tools.html#通过-clippy-提供更多-lint-功能","appendix-04-useful-development-tools.html#使用-rust-analyzer-的-ide-集成","appendix-05-editions.html#附录-e版本","appendix-06-translation.html#附录-f本书译本","appendix-07-nightly-rust.html#附录-grust-是如何开发的与-nightly-rust","appendix-07-nightly-rust.html#无停滞稳定","appendix-07-nightly-rust.html#choo-choo-发布通道和发布时刻表riding-the-trains","appendix-07-nightly-rust.html#不稳定功能","appendix-07-nightly-rust.html#rustup-和-rust-nightly-的职责","appendix-07-nightly-rust.html#rfc-过程和团队"],"index":{"documentStore":{"docInfo":{"0":{"body":33,"breadcrumbs":2,"title":1},"1":{"body":22,"breadcrumbs":0,"title":0},"10":{"body":47,"breadcrumbs":0,"title":0},"100":{"body":48,"breadcrumbs":0,"title":0},"101":{"body":225,"breadcrumbs":0,"title":0},"102":{"body":197,"breadcrumbs":1,"title":1},"103":{"body":82,"breadcrumbs":2,"title":1},"104":{"body":75,"breadcrumbs":1,"title":0},"105":{"body":114,"breadcrumbs":2,"title":1},"106":{"body":98,"breadcrumbs":1,"title":0},"107":{"body":67,"breadcrumbs":2,"title":1},"108":{"body":116,"breadcrumbs":0,"title":0},"109":{"body":5,"breadcrumbs":0,"title":0},"11":{"body":4,"breadcrumbs":0,"title":0},"110":{"body":28,"breadcrumbs":2,"title":1},"111":{"body":87,"breadcrumbs":3,"title":1},"112":{"body":13,"breadcrumbs":1,"title":0},"113":{"body":70,"breadcrumbs":1,"title":0},"114":{"body":72,"breadcrumbs":1,"title":0},"115":{"body":156,"breadcrumbs":1,"title":0},"116":{"body":161,"breadcrumbs":2,"title":1},"117":{"body":20,"breadcrumbs":2,"title":1},"118":{"body":32,"breadcrumbs":2,"title":1},"119":{"body":93,"breadcrumbs":1,"title":0},"12":{"body":14,"breadcrumbs":0,"title":0},"120":{"body":151,"breadcrumbs":3,"title":1},"121":{"body":89,"breadcrumbs":3,"title":1},"122":{"body":33,"breadcrumbs":2,"title":0},"123":{"body":45,"breadcrumbs":4,"title":2},"124":{"body":60,"breadcrumbs":2,"title":0},"125":{"body":133,"breadcrumbs":3,"title":1},"126":{"body":11,"breadcrumbs":3,"title":1},"127":{"body":85,"breadcrumbs":1,"title":0},"128":{"body":19,"breadcrumbs":1,"title":0},"129":{"body":5,"breadcrumbs":1,"title":0},"13":{"body":16,"breadcrumbs":0,"title":0},"130":{"body":18,"breadcrumbs":0,"title":0},"131":{"body":8,"breadcrumbs":2,"title":1},"132":{"body":47,"breadcrumbs":2,"title":1},"133":{"body":21,"breadcrumbs":2,"title":1},"134":{"body":158,"breadcrumbs":2,"title":1},"135":{"body":42,"breadcrumbs":2,"title":1},"136":{"body":36,"breadcrumbs":1,"title":0},"137":{"body":25,"breadcrumbs":2,"title":1},"138":{"body":12,"breadcrumbs":4,"title":2},"139":{"body":22,"breadcrumbs":2,"title":0},"14":{"body":1,"breadcrumbs":0,"title":0},"140":{"body":87,"breadcrumbs":2,"title":0},"141":{"body":167,"breadcrumbs":2,"title":0},"142":{"body":210,"breadcrumbs":2,"title":0},"143":{"body":49,"breadcrumbs":3,"title":1},"144":{"body":20,"breadcrumbs":2,"title":0},"145":{"body":23,"breadcrumbs":2,"title":0},"146":{"body":22,"breadcrumbs":4,"title":2},"147":{"body":32,"breadcrumbs":3,"title":1},"148":{"body":53,"breadcrumbs":3,"title":1},"149":{"body":34,"breadcrumbs":3,"title":1},"15":{"body":33,"breadcrumbs":3,"title":3},"150":{"body":106,"breadcrumbs":3,"title":1},"151":{"body":16,"breadcrumbs":2,"title":0},"152":{"body":20,"breadcrumbs":2,"title":0},"153":{"body":17,"breadcrumbs":0,"title":0},"154":{"body":18,"breadcrumbs":2,"title":1},"155":{"body":59,"breadcrumbs":2,"title":1},"156":{"body":153,"breadcrumbs":3,"title":2},"157":{"body":138,"breadcrumbs":2,"title":1},"158":{"body":99,"breadcrumbs":1,"title":0},"159":{"body":84,"breadcrumbs":4,"title":3},"16":{"body":10,"breadcrumbs":2,"title":2},"160":{"body":87,"breadcrumbs":1,"title":0},"161":{"body":110,"breadcrumbs":1,"title":0},"162":{"body":246,"breadcrumbs":1,"title":0},"163":{"body":18,"breadcrumbs":2,"title":1},"164":{"body":5,"breadcrumbs":2,"title":1},"165":{"body":33,"breadcrumbs":1,"title":0},"166":{"body":17,"breadcrumbs":1,"title":0},"167":{"body":160,"breadcrumbs":1,"title":0},"168":{"body":8,"breadcrumbs":1,"title":0},"169":{"body":18,"breadcrumbs":2,"title":1},"17":{"body":28,"breadcrumbs":1,"title":1},"170":{"body":156,"breadcrumbs":1,"title":0},"171":{"body":5,"breadcrumbs":1,"title":0},"172":{"body":195,"breadcrumbs":1,"title":0},"173":{"body":151,"breadcrumbs":1,"title":0},"174":{"body":33,"breadcrumbs":1,"title":0},"175":{"body":200,"breadcrumbs":1,"title":0},"176":{"body":35,"breadcrumbs":1,"title":0},"177":{"body":11,"breadcrumbs":3,"title":1},"178":{"body":39,"breadcrumbs":3,"title":1},"179":{"body":165,"breadcrumbs":3,"title":1},"18":{"body":9,"breadcrumbs":0,"title":0},"180":{"body":240,"breadcrumbs":2,"title":0},"181":{"body":203,"breadcrumbs":3,"title":1},"182":{"body":194,"breadcrumbs":3,"title":1},"183":{"body":100,"breadcrumbs":4,"title":2},"184":{"body":9,"breadcrumbs":1,"title":0},"185":{"body":144,"breadcrumbs":1,"title":0},"186":{"body":137,"breadcrumbs":1,"title":0},"187":{"body":15,"breadcrumbs":1,"title":0},"188":{"body":202,"breadcrumbs":1,"title":0},"189":{"body":100,"breadcrumbs":1,"title":0},"19":{"body":4,"breadcrumbs":0,"title":0},"190":{"body":35,"breadcrumbs":1,"title":0},"191":{"body":129,"breadcrumbs":3,"title":2},"192":{"body":83,"breadcrumbs":1,"title":0},"193":{"body":12,"breadcrumbs":1,"title":0},"194":{"body":51,"breadcrumbs":3,"title":2},"195":{"body":10,"breadcrumbs":1,"title":0},"196":{"body":32,"breadcrumbs":0,"title":0},"197":{"body":10,"breadcrumbs":0,"title":0},"198":{"body":374,"breadcrumbs":0,"title":0},"199":{"body":421,"breadcrumbs":1,"title":1},"2":{"body":14,"breadcrumbs":0,"title":0},"20":{"body":20,"breadcrumbs":4,"title":2},"200":{"body":234,"breadcrumbs":2,"title":2},"201":{"body":205,"breadcrumbs":0,"title":0},"202":{"body":448,"breadcrumbs":2,"title":2},"203":{"body":62,"breadcrumbs":2,"title":2},"204":{"body":25,"breadcrumbs":0,"title":0},"205":{"body":9,"breadcrumbs":0,"title":0},"206":{"body":216,"breadcrumbs":0,"title":0},"207":{"body":207,"breadcrumbs":0,"title":0},"208":{"body":180,"breadcrumbs":0,"title":0},"209":{"body":10,"breadcrumbs":0,"title":0},"21":{"body":30,"breadcrumbs":2,"title":0},"210":{"body":88,"breadcrumbs":0,"title":0},"211":{"body":387,"breadcrumbs":0,"title":0},"212":{"body":5,"breadcrumbs":0,"title":0},"213":{"body":27,"breadcrumbs":2,"title":1},"214":{"body":32,"breadcrumbs":1,"title":0},"215":{"body":31,"breadcrumbs":1,"title":0},"216":{"body":64,"breadcrumbs":3,"title":2},"217":{"body":53,"breadcrumbs":1,"title":0},"218":{"body":121,"breadcrumbs":1,"title":0},"219":{"body":21,"breadcrumbs":1,"title":0},"22":{"body":38,"breadcrumbs":3,"title":1},"220":{"body":18,"breadcrumbs":1,"title":0},"221":{"body":62,"breadcrumbs":1,"title":0},"222":{"body":88,"breadcrumbs":1,"title":0},"223":{"body":76,"breadcrumbs":2,"title":1},"224":{"body":354,"breadcrumbs":1,"title":0},"225":{"body":347,"breadcrumbs":2,"title":1},"226":{"body":126,"breadcrumbs":2,"title":1},"227":{"body":17,"breadcrumbs":1,"title":0},"228":{"body":324,"breadcrumbs":1,"title":0},"229":{"body":530,"breadcrumbs":1,"title":0},"23":{"body":29,"breadcrumbs":3,"title":1},"230":{"body":7,"breadcrumbs":1,"title":0},"231":{"body":130,"breadcrumbs":2,"title":1},"232":{"body":759,"breadcrumbs":2,"title":1},"233":{"body":15,"breadcrumbs":1,"title":0},"234":{"body":13,"breadcrumbs":1,"title":0},"235":{"body":52,"breadcrumbs":1,"title":0},"236":{"body":4,"breadcrumbs":1,"title":0},"237":{"body":15,"breadcrumbs":2,"title":1},"238":{"body":7,"breadcrumbs":1,"title":0},"239":{"body":145,"breadcrumbs":1,"title":0},"24":{"body":63,"breadcrumbs":2,"title":0},"240":{"body":177,"breadcrumbs":1,"title":0},"241":{"body":203,"breadcrumbs":1,"title":0},"242":{"body":328,"breadcrumbs":3,"title":2},"243":{"body":48,"breadcrumbs":1,"title":0},"244":{"body":73,"breadcrumbs":4,"title":3},"245":{"body":41,"breadcrumbs":1,"title":0},"246":{"body":113,"breadcrumbs":1,"title":0},"247":{"body":85,"breadcrumbs":1,"title":0},"248":{"body":10,"breadcrumbs":3,"title":1},"249":{"body":603,"breadcrumbs":3,"title":1},"25":{"body":28,"breadcrumbs":4,"title":2},"250":{"body":267,"breadcrumbs":2,"title":0},"251":{"body":5,"breadcrumbs":2,"title":0},"252":{"body":98,"breadcrumbs":2,"title":1},"253":{"body":5,"breadcrumbs":1,"title":0},"254":{"body":12,"breadcrumbs":4,"title":2},"255":{"body":84,"breadcrumbs":2,"title":0},"256":{"body":11,"breadcrumbs":6,"title":2},"257":{"body":166,"breadcrumbs":4,"title":0},"258":{"body":270,"breadcrumbs":7,"title":3},"259":{"body":25,"breadcrumbs":5,"title":1},"26":{"body":103,"breadcrumbs":3,"title":1},"260":{"body":130,"breadcrumbs":5,"title":1},"261":{"body":43,"breadcrumbs":5,"title":1},"262":{"body":5,"breadcrumbs":5,"title":1},"263":{"body":31,"breadcrumbs":7,"title":3},"264":{"body":11,"breadcrumbs":4,"title":1},"265":{"body":58,"breadcrumbs":3,"title":0},"266":{"body":458,"breadcrumbs":3,"title":0},"267":{"body":73,"breadcrumbs":6,"title":2},"268":{"body":22,"breadcrumbs":4,"title":1},"269":{"body":6,"breadcrumbs":3,"title":0},"27":{"body":119,"breadcrumbs":3,"title":1},"270":{"body":40,"breadcrumbs":0,"title":0},"271":{"body":15,"breadcrumbs":2,"title":1},"272":{"body":32,"breadcrumbs":2,"title":1},"273":{"body":217,"breadcrumbs":2,"title":1},"274":{"body":44,"breadcrumbs":1,"title":0},"275":{"body":81,"breadcrumbs":2,"title":1},"276":{"body":20,"breadcrumbs":4,"title":2},"277":{"body":86,"breadcrumbs":2,"title":0},"278":{"body":33,"breadcrumbs":3,"title":1},"279":{"body":101,"breadcrumbs":2,"title":0},"28":{"body":10,"breadcrumbs":3,"title":1},"280":{"body":84,"breadcrumbs":4,"title":2},"281":{"body":162,"breadcrumbs":3,"title":1},"282":{"body":29,"breadcrumbs":3,"title":1},"283":{"body":322,"breadcrumbs":4,"title":2},"284":{"body":11,"breadcrumbs":2,"title":1},"285":{"body":177,"breadcrumbs":2,"title":1},"286":{"body":111,"breadcrumbs":2,"title":1},"287":{"body":14,"breadcrumbs":2,"title":1},"288":{"body":25,"breadcrumbs":2,"title":1},"289":{"body":539,"breadcrumbs":1,"title":0},"29":{"body":14,"breadcrumbs":3,"title":1},"290":{"body":231,"breadcrumbs":2,"title":1},"291":{"body":128,"breadcrumbs":3,"title":2},"292":{"body":14,"breadcrumbs":0,"title":0},"293":{"body":252,"breadcrumbs":0,"title":0},"294":{"body":412,"breadcrumbs":2,"title":2},"295":{"body":9,"breadcrumbs":0,"title":0},"296":{"body":28,"breadcrumbs":0,"title":0},"297":{"body":16,"breadcrumbs":0,"title":0},"298":{"body":276,"breadcrumbs":1,"title":1},"299":{"body":274,"breadcrumbs":1,"title":1},"3":{"body":1,"breadcrumbs":1,"title":1},"30":{"body":10,"breadcrumbs":2,"title":0},"300":{"body":117,"breadcrumbs":0,"title":0},"301":{"body":105,"breadcrumbs":0,"title":0},"302":{"body":44,"breadcrumbs":0,"title":0},"303":{"body":60,"breadcrumbs":0,"title":0},"304":{"body":11,"breadcrumbs":0,"title":0},"305":{"body":6,"breadcrumbs":0,"title":0},"306":{"body":396,"breadcrumbs":2,"title":2},"307":{"body":23,"breadcrumbs":2,"title":2},"308":{"body":13,"breadcrumbs":6,"title":3},"309":{"body":25,"breadcrumbs":4,"title":1},"31":{"body":14,"breadcrumbs":0,"title":0},"310":{"body":22,"breadcrumbs":4,"title":1},"311":{"body":12,"breadcrumbs":5,"title":2},"312":{"body":12,"breadcrumbs":3,"title":0},"313":{"body":31,"breadcrumbs":4,"title":2},"314":{"body":21,"breadcrumbs":2,"title":0},"315":{"body":50,"breadcrumbs":6,"title":2},"316":{"body":532,"breadcrumbs":4,"title":0},"317":{"body":9,"breadcrumbs":4,"title":1},"318":{"body":338,"breadcrumbs":3,"title":0},"319":{"body":321,"breadcrumbs":3,"title":0},"32":{"body":57,"breadcrumbs":0,"title":0},"320":{"body":839,"breadcrumbs":4,"title":1},"321":{"body":75,"breadcrumbs":4,"title":1},"322":{"body":374,"breadcrumbs":4,"title":1},"323":{"body":201,"breadcrumbs":3,"title":0},"324":{"body":242,"breadcrumbs":4,"title":1},"325":{"body":60,"breadcrumbs":3,"title":0},"326":{"body":0,"breadcrumbs":6,"title":2},"327":{"body":0,"breadcrumbs":4,"title":1},"328":{"body":22,"breadcrumbs":2,"title":1},"329":{"body":7,"breadcrumbs":1,"title":0},"33":{"body":100,"breadcrumbs":0,"title":0},"330":{"body":40,"breadcrumbs":1,"title":0},"331":{"body":105,"breadcrumbs":1,"title":0},"332":{"body":28,"breadcrumbs":1,"title":0},"333":{"body":35,"breadcrumbs":3,"title":1},"334":{"body":155,"breadcrumbs":3,"title":1},"335":{"body":273,"breadcrumbs":3,"title":1},"336":{"body":14,"breadcrumbs":3,"title":1},"337":{"body":56,"breadcrumbs":1,"title":0},"338":{"body":68,"breadcrumbs":2,"title":1},"339":{"body":61,"breadcrumbs":1,"title":0},"34":{"body":56,"breadcrumbs":0,"title":0},"340":{"body":57,"breadcrumbs":1,"title":0},"341":{"body":138,"breadcrumbs":1,"title":0},"342":{"body":453,"breadcrumbs":3,"title":2},"343":{"body":272,"breadcrumbs":1,"title":0},"344":{"body":5,"breadcrumbs":1,"title":0},"345":{"body":13,"breadcrumbs":0,"title":0},"346":{"body":7,"breadcrumbs":0,"title":0},"347":{"body":31,"breadcrumbs":1,"title":1},"348":{"body":71,"breadcrumbs":0,"title":0},"349":{"body":31,"breadcrumbs":0,"title":0},"35":{"body":43,"breadcrumbs":0,"title":0},"350":{"body":50,"breadcrumbs":0,"title":0},"351":{"body":104,"breadcrumbs":0,"title":0},"352":{"body":50,"breadcrumbs":0,"title":0},"353":{"body":171,"breadcrumbs":2,"title":1},"354":{"body":6,"breadcrumbs":0,"title":0},"355":{"body":17,"breadcrumbs":0,"title":0},"356":{"body":79,"breadcrumbs":0,"title":0},"357":{"body":19,"breadcrumbs":0,"title":0},"358":{"body":47,"breadcrumbs":0,"title":0},"359":{"body":323,"breadcrumbs":0,"title":0},"36":{"body":100,"breadcrumbs":1,"title":1},"360":{"body":288,"breadcrumbs":0,"title":0},"361":{"body":156,"breadcrumbs":0,"title":0},"362":{"body":55,"breadcrumbs":0,"title":0},"363":{"body":4,"breadcrumbs":0,"title":0},"364":{"body":19,"breadcrumbs":0,"title":0},"365":{"body":21,"breadcrumbs":2,"title":1},"366":{"body":18,"breadcrumbs":1,"title":0},"367":{"body":76,"breadcrumbs":1,"title":0},"368":{"body":433,"breadcrumbs":1,"title":0},"369":{"body":55,"breadcrumbs":1,"title":0},"37":{"body":37,"breadcrumbs":1,"title":1},"370":{"body":47,"breadcrumbs":2,"title":1},"371":{"body":6,"breadcrumbs":1,"title":0},"372":{"body":4,"breadcrumbs":1,"title":0},"373":{"body":8,"breadcrumbs":2,"title":1},"374":{"body":112,"breadcrumbs":2,"title":1},"375":{"body":161,"breadcrumbs":1,"title":0},"376":{"body":473,"breadcrumbs":1,"title":0},"377":{"body":305,"breadcrumbs":4,"title":3},"378":{"body":75,"breadcrumbs":3,"title":2},"379":{"body":12,"breadcrumbs":0,"title":0},"38":{"body":24,"breadcrumbs":0,"title":0},"380":{"body":23,"breadcrumbs":1,"title":1},"381":{"body":239,"breadcrumbs":0,"title":0},"382":{"body":157,"breadcrumbs":2,"title":2},"383":{"body":82,"breadcrumbs":2,"title":2},"384":{"body":7,"breadcrumbs":0,"title":0},"385":{"body":114,"breadcrumbs":0,"title":0},"386":{"body":100,"breadcrumbs":0,"title":0},"387":{"body":15,"breadcrumbs":0,"title":0},"388":{"body":13,"breadcrumbs":0,"title":0},"389":{"body":81,"breadcrumbs":1,"title":1},"39":{"body":6,"breadcrumbs":0,"title":0},"390":{"body":30,"breadcrumbs":0,"title":0},"391":{"body":378,"breadcrumbs":1,"title":1},"392":{"body":25,"breadcrumbs":0,"title":0},"393":{"body":20,"breadcrumbs":0,"title":0},"394":{"body":1,"breadcrumbs":0,"title":0},"395":{"body":37,"breadcrumbs":4,"title":2},"396":{"body":33,"breadcrumbs":6,"title":2},"397":{"body":87,"breadcrumbs":5,"title":1},"398":{"body":191,"breadcrumbs":4,"title":0},"399":{"body":82,"breadcrumbs":4,"title":0},"4":{"body":10,"breadcrumbs":0,"title":0},"40":{"body":207,"breadcrumbs":1,"title":1},"400":{"body":102,"breadcrumbs":5,"title":1},"401":{"body":179,"breadcrumbs":4,"title":0},"402":{"body":65,"breadcrumbs":4,"title":0},"403":{"body":7,"breadcrumbs":6,"title":2},"404":{"body":86,"breadcrumbs":5,"title":1},"405":{"body":1638,"breadcrumbs":4,"title":0},"406":{"body":21,"breadcrumbs":2,"title":0},"407":{"body":637,"breadcrumbs":5,"title":3},"408":{"body":649,"breadcrumbs":2,"title":0},"409":{"body":4,"breadcrumbs":2,"title":0},"41":{"body":115,"breadcrumbs":0,"title":0},"410":{"body":5,"breadcrumbs":0,"title":0},"411":{"body":6,"breadcrumbs":0,"title":0},"412":{"body":55,"breadcrumbs":0,"title":0},"413":{"body":13,"breadcrumbs":0,"title":0},"414":{"body":60,"breadcrumbs":0,"title":0},"415":{"body":7,"breadcrumbs":2,"title":1},"416":{"body":155,"breadcrumbs":1,"title":0},"417":{"body":144,"breadcrumbs":1,"title":0},"418":{"body":33,"breadcrumbs":4,"title":2},"419":{"body":7,"breadcrumbs":3,"title":1},"42":{"body":333,"breadcrumbs":0,"title":0},"420":{"body":21,"breadcrumbs":4,"title":2},"421":{"body":30,"breadcrumbs":4,"title":2},"422":{"body":37,"breadcrumbs":4,"title":2},"423":{"body":12,"breadcrumbs":3,"title":1},"424":{"body":19,"breadcrumbs":3,"title":1},"425":{"body":9,"breadcrumbs":2,"title":1},"426":{"body":20,"breadcrumbs":2,"title":1},"427":{"body":73,"breadcrumbs":2,"title":1},"428":{"body":70,"breadcrumbs":3,"title":2},"429":{"body":23,"breadcrumbs":4,"title":3},"43":{"body":117,"breadcrumbs":0,"title":0},"430":{"body":50,"breadcrumbs":2,"title":1},"431":{"body":21,"breadcrumbs":2,"title":1},"432":{"body":8,"breadcrumbs":7,"title":3},"433":{"body":6,"breadcrumbs":4,"title":0},"434":{"body":91,"breadcrumbs":8,"title":4},"435":{"body":8,"breadcrumbs":4,"title":0},"436":{"body":51,"breadcrumbs":7,"title":3},"437":{"body":19,"breadcrumbs":5,"title":1},"44":{"body":54,"breadcrumbs":0,"title":0},"45":{"body":186,"breadcrumbs":0,"title":0},"46":{"body":6,"breadcrumbs":0,"title":0},"47":{"body":11,"breadcrumbs":0,"title":0},"48":{"body":3,"breadcrumbs":0,"title":0},"49":{"body":144,"breadcrumbs":0,"title":0},"5":{"body":2,"breadcrumbs":0,"title":0},"50":{"body":15,"breadcrumbs":0,"title":0},"51":{"body":116,"breadcrumbs":0,"title":0},"52":{"body":70,"breadcrumbs":0,"title":0},"53":{"body":232,"breadcrumbs":0,"title":0},"54":{"body":192,"breadcrumbs":0,"title":0},"55":{"body":57,"breadcrumbs":0,"title":0},"56":{"body":89,"breadcrumbs":0,"title":0},"57":{"body":125,"breadcrumbs":0,"title":0},"58":{"body":134,"breadcrumbs":0,"title":0},"59":{"body":48,"breadcrumbs":0,"title":0},"6":{"body":4,"breadcrumbs":0,"title":0},"60":{"body":6,"breadcrumbs":0,"title":0},"61":{"body":285,"breadcrumbs":0,"title":0},"62":{"body":269,"breadcrumbs":0,"title":0},"63":{"body":5,"breadcrumbs":0,"title":0},"64":{"body":12,"breadcrumbs":0,"title":0},"65":{"body":9,"breadcrumbs":0,"title":0},"66":{"body":14,"breadcrumbs":1,"title":1},"67":{"body":2,"breadcrumbs":0,"title":0},"68":{"body":22,"breadcrumbs":0,"title":0},"69":{"body":23,"breadcrumbs":1,"title":1},"7":{"body":3,"breadcrumbs":0,"title":0},"70":{"body":287,"breadcrumbs":0,"title":0},"71":{"body":42,"breadcrumbs":0,"title":0},"72":{"body":69,"breadcrumbs":0,"title":0},"73":{"body":148,"breadcrumbs":0,"title":0},"74":{"body":222,"breadcrumbs":0,"title":0},"75":{"body":152,"breadcrumbs":2,"title":2},"76":{"body":1,"breadcrumbs":0,"title":0},"77":{"body":147,"breadcrumbs":2,"title":1},"78":{"body":335,"breadcrumbs":2,"title":1},"79":{"body":21,"breadcrumbs":2,"title":1},"8":{"body":9,"breadcrumbs":0,"title":0},"80":{"body":5,"breadcrumbs":1,"title":0},"81":{"body":10,"breadcrumbs":0,"title":0},"82":{"body":139,"breadcrumbs":0,"title":0},"83":{"body":54,"breadcrumbs":0,"title":0},"84":{"body":115,"breadcrumbs":0,"title":0},"85":{"body":29,"breadcrumbs":0,"title":0},"86":{"body":19,"breadcrumbs":0,"title":0},"87":{"body":110,"breadcrumbs":0,"title":0},"88":{"body":81,"breadcrumbs":0,"title":0},"89":{"body":25,"breadcrumbs":0,"title":0},"9":{"body":0,"breadcrumbs":0,"title":0},"90":{"body":55,"breadcrumbs":0,"title":0},"91":{"body":240,"breadcrumbs":1,"title":1},"92":{"body":10,"breadcrumbs":0,"title":0},"93":{"body":129,"breadcrumbs":0,"title":0},"94":{"body":57,"breadcrumbs":0,"title":0},"95":{"body":136,"breadcrumbs":0,"title":0},"96":{"body":39,"breadcrumbs":0,"title":0},"97":{"body":68,"breadcrumbs":1,"title":1},"98":{"body":2,"breadcrumbs":0,"title":0},"99":{"body":9,"breadcrumbs":0,"title":0}},"docs":{"0":{"body":"title-page.md commit d94e03a18a2590ed3f1c67b859cb11528d2a2d5c 本书的英文原版作者为 Steve Klabnik 和 Carol Nichols,并由 Rust 社区补充完善。本简体中文译本由 Rust 中文社区翻译。 本书假设你使用 Rust 1.78.0(2024-05-02 发布)或更新的版本。请查看 第 1 章的 “安装” 部分 了解如何安装和升级 Rust。 本书的英文原版 HTML 格式可以在 https://doc.rust-lang.org/stable/book/ 在线阅读;使用 rustup 安装的 Rust 也包含一份英文离线版,运行 rustup docs --book 即可打开。 本书还有一些社区 翻译版本 。简体中文译本可以在 https://kaisery.github.io/trpl-zh-cn/ 在线阅读。 本书也有 由 No Starch Press 出版的纸质版和电子版 。 🚨 想要具有互动性的学习体验吗?试试 Rust Book 的另一个版本,其中包括测验、高亮、可视化等功能 : https://rust-book.cs.brown.edu","breadcrumbs":"Rust 程序设计语言 » Rust 程序设计语言","id":"0","title":"Rust 程序设计语言"},"1":{"body":"foreword.md commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f Rust 程序设计语言的本质实际在于 赋能 ( empowerment ):无论你现在编写的是何种代码,Rust 能让你在更为广泛的编程领域走得更远,写出自信。(这一点并不显而易见) 举例来说,那些“系统层面”的工作涉及内存管理、数据表示和并发等底层细节。从传统角度来看,这是一个神秘的编程领域,只为浸润多年的极少数人所触及,也只有他们能避开那些臭名昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。 Rust 破除了这些障碍:它消除了旧的陷阱,并提供了伴你一路同行的友好、精良的工具。想要 “深入” 底层控制的程序员可以使用 Rust,无需时刻担心出现崩溃或安全漏洞,也无需因为工具链不靠谱而被迫去了解其中的细节。更妙的是,语言设计本身会自然而然地引导你编写出可靠的代码,并且运行速度和内存使用上都十分高效。 已经在从事编写底层代码的程序员可以使用 Rust 来提升信心。例如,在 Rust 中引入并行是相对低风险的操作,因为编译器会替你找到经典的错误。同时你可以自信地采取更加激进的优化,而不会意外引入崩溃或漏洞。 但 Rust 并不局限于底层系统编程。它表达力强、写起来舒适,让人能够轻松地编写出命令行应用、网络服务器等各种类型的代码——在本书中就有这两者的简单示例。使用 Rust 能让你把在一个领域中学习的技能延伸到另一个领域:你可以通过编写网页应用来学习 Rust,接着将同样的技能应用到你的 Raspberry Pi(树莓派)上。 本书全面介绍了 Rust 为用户赋予的能力。其内容平易近人,致力于帮助你提升 Rust 的知识,并且提升你作为程序员整体的理解与自信。欢迎你加入 Rust 社区,让我们准备深入学习 Rust 吧! —— Nicholas Matsakis 和 Aaron Turon","breadcrumbs":"前言 » 前言","id":"1","title":"前言"},"10":{"body":"本书大体上假设您按从头到尾的顺序阅读。后面的章节建立在前面章节概念的基础上。前面的章节可能不会深入介绍部分主题,而是留待后续章节重新讨论。 本书分为两类章节:概念章节和项目章节。在概念章节中,我们学习 Rust 的某个方面。在项目章节中,我们应用目前所学的知识一同构建小型程序。第二、十二和二十章是项目章节;其余都是概念章节。 第一章介绍如何安装 Rust,如何编写一个 “Hello, world!” 程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第二章是一个编写 Rust 语言的实战介绍,我们会构建一个猜数字游戏。我们会站在较高的层次介绍一些概念,而后续章节将提供更多细节。如果你希望立刻就动手实践一下,第二章是开始的好地方。第三章介绍 Rust 中类似其他编程语言的特性,第四章会学习 Rust 的所有权系统。如果你是一个特别细致的学习者,喜欢在进入下一环节之前学习每一个细节,你可能会想要跳过第二章,直接阅读第三章,等到你想要通过项目应用所学到的细节时再回到第二章。 第五章讨论结构体(struct)和方法,第六章介绍枚举(enum)、match 表达式和 if let 控制流结构。在 Rust 中,创建自定义类型需要用到结构体和枚举。 第七章介绍 Rust 的模块(module)系统,其中的私有性规则用来组织代码和公开的 API(应用程序接口)。第八章讨论标准库提供的常见集合数据结构,例如 Vector(向量)、字符串和 Hash Map(散列表)。第九章探索 Rust 的错误处理的理念与技术。 第十章深入介绍泛型(generic)、Trait 和生命周期(lifetime),这些功能让你能够定义适用于多种类型的代码。第十一章全面讲述了测试,因为就算 Rust 有安全保证,也需要测试确保程序逻辑正确。第十二章中将会构建我们自己的 grep 命令行工具的功能子集实现,用于在文件中搜索文本。为此会用到之前章节讨论的很多概念。 第十三章探索闭包(closure)和迭代器(iterator),这两个 Rust 特性来自函数式编程语言。第十四章会深入探讨 Cargo 并介绍分享代码库的最佳实践。第十五章讨论标准库提供的智能指针以及相关的 Trait。 第十六章将引导我们了解不同的并发编程模型,并探讨 Rust 如何帮助你无畏地进行多线程编程。第十七章将在此基础上进一步探索 Rust 的 async 和 await 语法,以及它们所支持的轻量级并发模型。 第十八章着眼于 Rust 风格与你可能比较熟悉的 OOP(面向对象编程)原则之间的比较。 第十九章介绍模式和模式匹配,它是在 Rust 程序中表达思想的有效方式。第二十章是一个高级主题大杂烩,包括不安全 Rust(unsafe Rust)、宏(macro)和更多关于生命周期、Trait、类型、函数和闭包的内容。 第二十一章我们将会完成一个项目,实现一个底层的、多线程的 Web 服务器! 最后的附录包含了一些关于该语言的实用信息,其格式更像是参考资料。附录 A 涵盖了 Rust 的关键字,附录 B 涵盖了 Rust 的运算符和符号,附录 C 涵盖了标准库提供的可派生 Trait,附录 D 涵盖了一些有用的开发工具,而附录 E 解释了 Rust 版本。在附录 F 中,你可以找到本书的翻译版本,而在附录 G 中,我们将讨论 Rust 是如何制作的以及什么是 nightly Rust。 阅读本书没有错误的方式:如果你想跳过前面的内容,尽管跳过!如果你遇到任何困惑,可能需要回到前面的章节。请采取对你最有效的方式。 学习 Rust 的一个重要部分是学会如何阅读编译器显示的错误信息:它们会指引你编写出能运行的代码。为此,我们将提供许多不能编译的示例,以及在每种情况下编译器将显示的错误信息。请知悉,如果你输入并运行一个随机示例,它可能无法编译!确保你阅读了示例周围的文本,以判断你尝试运行的示例是否出错。Ferris 也将帮助你区分那些不是意在工作的代码: Ferris 含义 这段代码无法通过编译! 这段代码会 Panic! 这段代码的运行结果不符合预期。 在大部分情况,我们会指导你将无法通过编译的代码修改为正确版本。","breadcrumbs":"简介 » 如何阅读本书","id":"10","title":"如何阅读本书"},"100":{"body":"ch06-01-defining-an-enum.md commit bb7e429ad6b59d9a0c37db7434976364cbb9c6da 结构体给予你将字段和数据聚合在一起的方法,像 Rectangle 结构体有 width 和 height 两个字段。而枚举给予你一个途径去声明某个值是一个集合中的一员。比如,我们想让 Rectangle 是一些形状的集合,包含 Circle 和 Triangle 。为了做到这个,Rust 提供了枚举类型。 让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4(version four)和 IPv6(version six)。这是我们的程序可能会遇到的所有可能的 IP 地址类型:所以可以 枚举 出所有可能的值,这也正是此枚举名字的由来。 任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能两者都是。IP 地址的这个特性使得枚举数据结构非常适合这个场景,因为枚举值只可能是其中一个成员。IPv4 和 IPv6 从根本上讲仍是 IP 地址,所以当代码在处理适用于任何类型的 IP 地址的场景时应该把它们当作相同的类型。 可以通过在代码中定义一个 IpAddrKind 枚举来表现这个概念并列出可能的 IP 地址类型,V4 和 V6。这被称为枚举的 成员 ( variants ): enum IpAddrKind { V4, V6,\n}\n# # fn main() {\n# let four = IpAddrKind::V4;\n# let six = IpAddrKind::V6;\n# # route(IpAddrKind::V4);\n# route(IpAddrKind::V6);\n# }\n# # fn route(ip_kind: IpAddrKind) {} 现在 IpAddrKind 就是一个可以在代码中使用的自定义数据类型了。","breadcrumbs":"枚举和模式匹配 » 枚举的定义 » 枚举的定义","id":"100","title":"枚举的定义"},"101":{"body":"可以像这样创建 IpAddrKind 两个不同成员的实例: # enum IpAddrKind {\n# V4,\n# V6,\n# }\n# # fn main() { let four = IpAddrKind::V4; let six = IpAddrKind::V6;\n# # route(IpAddrKind::V4);\n# route(IpAddrKind::V6);\n# }\n# # fn route(ip_kind: IpAddrKind) {} 注意枚举的成员位于其标识符的命名空间中,并使用两个冒号分开。这么设计的益处是现在 IpAddrKind::V4 和 IpAddrKind::V6 都是 IpAddrKind 类型的。例如,接着可以定义一个函数来接收任何 IpAddrKind类型的参数: # enum IpAddrKind {\n# V4,\n# V6,\n# }\n# # fn main() {\n# let four = IpAddrKind::V4;\n# let six = IpAddrKind::V6;\n# # route(IpAddrKind::V4);\n# route(IpAddrKind::V6);\n# }\n# fn route(ip_kind: IpAddrKind) {} 现在可以使用任一成员来调用这个函数: # enum IpAddrKind {\n# V4,\n# V6,\n# }\n# # fn main() {\n# let four = IpAddrKind::V4;\n# let six = IpAddrKind::V6;\n# route(IpAddrKind::V4); route(IpAddrKind::V6);\n# }\n# # fn route(ip_kind: IpAddrKind) {} 使用枚举甚至还有更多优势。进一步考虑一下我们的 IP 地址类型,目前没有一个存储实际 IP 地址 数据 的方法;只知道它是什么 类型 的。考虑到已经在第五章学习过结构体了,你可能会像示例 6-1 那样处理这个问题: # fn main() { enum IpAddrKind { V4, V6, } struct IpAddr { kind: IpAddrKind, address: String, } let home = IpAddr { kind: IpAddrKind::V4, address: String::from(\"127.0.0.1\"), }; let loopback = IpAddr { kind: IpAddrKind::V6, address: String::from(\"::1\"), };\n# } 示例 6-1:将 IP 地址的数据和 IpAddrKind 成员存储在一个 struct 中 这里我们定义了一个有两个字段的结构体 IpAddr:IpAddrKind(之前定义的枚举)类型的 kind 字段和 String 类型 address 字段。我们有这个结构体的两个实例。第一个,home,它的 kind 的值是 IpAddrKind::V4 与之相关联的地址数据是 127.0.0.1。第二个实例,loopback,kind 的值是 IpAddrKind 的另一个成员,V6,关联的地址是 ::1。我们使用了一个结构体来将 kind 和 address 打包在一起,现在枚举成员就与值相关联了。 我们可以使用一种更简洁的方式来表达相同的概念,仅仅使用枚举并将数据直接放进每一个枚举成员而不是将枚举作为结构体的一部分。IpAddr 枚举的新定义表明了 V4 和 V6 成员都关联了 String 值: # fn main() { enum IpAddr { V4(String), V6(String), } let home = IpAddr::V4(String::from(\"127.0.0.1\")); let loopback = IpAddr::V6(String::from(\"::1\"));\n# } 我们直接将数据附加到枚举的每个成员上,这样就不需要一个额外的结构体了。这里也很容易看出枚举工作的另一个细节:每一个我们定义的枚举成员的名字也变成了一个构建枚举的实例的函数。也就是说,IpAddr::V4() 是一个获取 String 参数并返回 IpAddr 类型实例的函数调用。作为定义枚举的结果,这些构造函数会自动被定义。 用枚举替代结构体还有另一个优势:每个成员可以处理不同类型和数量的数据。IPv4 版本的 IP 地址总是含有四个值在 0 和 255 之间的数字部分。如果我们想要将 V4 地址存储为四个 u8 值而 V6 地址仍然表现为一个 String,这就不能使用结构体了。枚举则可以轻易的处理这个情况: # fn main() { enum IpAddr { V4(u8, u8, u8, u8), V6(String), } let home = IpAddr::V4(127, 0, 0, 1); let loopback = IpAddr::V6(String::from(\"::1\"));\n# } 这些代码展示了使用枚举来存储两种不同 IP 地址的几种可能的选择。然而,事实证明存储和编码 IP 地址实在是太常见了 以致标准库提供了一个开箱即用的定义! 让我们看看标准库是如何定义 IpAddr 的:它正有着跟我们定义和使用的一样的枚举和成员,不过它将成员中的地址数据嵌入到了两个不同形式的结构体中,它们对不同的成员的定义是不同的: struct Ipv4Addr { // --snip--\n} struct Ipv6Addr { // --snip--\n} enum IpAddr { V4(Ipv4Addr), V6(Ipv6Addr),\n} 这些代码展示了可以将任意类型的数据放入枚举成员中:例如字符串、数字类型或者结构体。甚至可以包含另一个枚举!另外,标准库中的类型通常并不比你设想出来的要复杂多少。 注意虽然标准库中包含一个 IpAddr 的定义,仍然可以创建和使用我们自己的定义而不会有冲突,因为我们并没有将标准库中的定义引入作用域。第七章会讲到如何导入类型。 来看看示例 6-2 中的另一个枚举的例子:它的成员中内嵌了多种多样的类型: enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(i32, i32, i32),\n}\n# # fn main() {} 示例 6-2:一个 Message 枚举,其每个成员都存储了不同数量和类型的值 这个枚举有四个含有不同类型的成员: Quit 没有关联任何数据。 Move 类似结构体包含命名字段。 Write 包含单独一个 String。 ChangeColor 包含三个 i32。 定义一个如示例 6-2 中所示那样的有关联值的枚举的方式和定义多个不同类型的结构体的方式很相像,除了枚举不使用 struct 关键字以及其所有成员都被组合在一起位于 Message 类型下。如下这些结构体可以包含与之前枚举成员中相同的数据: struct QuitMessage; // 类单元结构体\nstruct MoveMessage { x: i32, y: i32,\n}\nstruct WriteMessage(String); // 元组结构体\nstruct ChangeColorMessage(i32, i32, i32); // 元组结构体\n# # fn main() {} 不过,如果我们使用不同的结构体,由于它们都有不同的类型,我们将不能像使用示例 6-2 中定义的 Message 枚举那样,轻易的定义一个能够处理这些不同类型的结构体的函数,因为枚举是单独一个类型。 结构体和枚举还有另一个相似点:就像可以使用 impl 来为结构体定义方法那样,也可以在枚举上定义方法。这是一个定义于我们 Message 枚举上的叫做 call 的方法: # fn main() {\n# enum Message {\n# Quit,\n# Move { x: i32, y: i32 },\n# Write(String),\n# ChangeColor(i32, i32, i32),\n# }\n# impl Message { fn call(&self) { // 在这里定义方法体 } } let m = Message::Write(String::from(\"hello\")); m.call();\n# } 方法体使用了 self 来获取调用方法的值。这个例子中,创建了一个值为 Message::Write(String::from(\"hello\")) 的变量 m,而且这就是当 m.call() 运行时 call 方法中的 self 的值。 让我们看看标准库中的另一个非常常见且实用的枚举:Option。","breadcrumbs":"枚举和模式匹配 » 枚举的定义 » 枚举值","id":"101","title":"枚举值"},"102":{"body":"这一部分会分析一个 Option 的案例,Option 是标准库定义的另一个枚举。Option 类型应用广泛因为它编码了一个非常普遍的场景,即一个值要么有值要么没值。 例如,如果请求一个非空列表的第一项,会得到一个值,如果请求一个空的列表,就什么也不会得到。从类型系统的角度来表达这个概念就意味着编译器需要检查是否处理了所有应该处理的情况,这样就可以避免在其他编程语言中非常常见的 bug。 编程语言的设计经常要考虑包含哪些功能,但考虑排除哪些功能也很重要。Rust 并没有很多其他语言中有的空值功能。 空值 ( Null )是一个值,它代表没有值。在有空值的语言中,变量总是这两种状态之一:空值和非空值。 Tony Hoare,null 的发明者,在他 2009 年的演讲 “Null References: The Billion Dollar Mistake” 中曾经说到: I call it my billion-dollar mistake. At that time, I was designing the first comprehensive type system for references in an object-oriented language. My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years. 我称之为我十亿美元的错误。当时,我在为一个面向对象语言设计第一个综合性的面向引用的类型系统。我的目标是通过编译器的自动检查来保证所有引用的使用都应该是绝对安全的。不过我未能抵抗住引入一个空引用的诱惑,仅仅是因为它是这么的容易实现。这引发了无数错误、漏洞和系统崩溃,在之后的四十多年中造成了数十亿美元的苦痛和伤害。 空值的问题在于当你尝试像一个非空值那样使用一个空值,会出现某种形式的错误。因为空和非空的属性无处不在,非常容易出现这类错误。 然而,空值尝试表达的概念仍然是有意义的:空值是一个因为某种原因目前无效或缺失的值。 问题不在于概念而在于具体的实现。为此,Rust 并没有空值,不过它确实拥有一个可以编码存在或不存在概念的枚举。这个枚举是 Option,而且它 定义于标准库中 ,如下: enum Option { None, Some(T),\n} Option 枚举是如此有用以至于它甚至被包含在了 prelude 之中,你不需要将其显式引入作用域。另外,它的成员也是如此,可以不需要 Option:: 前缀来直接使用 Some 和 None。即便如此 Option 也仍是常规的枚举,Some(T) 和 None 仍是 Option 的成员。 语法是一个我们还未讲到的 Rust 功能。它是一个泛型类型参数,第十章会更详细的讲解泛型。目前,所有你需要知道的就是 意味着 Option 枚举的 Some 成员可以包含任意类型的数据,同时每一个用于 T 位置的具体类型使得 Option 整体作为不同的类型。这里是一些包含数字类型和字符串类型 Option 值的例子: # fn main() { let some_number = Some(5); let some_char = Some('e'); let absent_number: Option = None;\n# } some_number 的类型是 Option。some_char 的类型是 Option,是不同于some_number的类型。因为我们在 Some 成员中指定了值,Rust 可以推断其类型。对于 absent_number,Rust 需要我们指定 Option 整体的类型,因为编译器只通过 None 值无法推断出 Some 成员保存的值的类型。这里我们告诉 Rust 希望 absent_number 是 Option 类型的。 当有一个 Some 值时,我们就知道存在一个值,而这个值保存在 Some 中。当有个 None 值时,在某种意义上,它跟空值具有相同的意义:并没有一个有效的值。那么,Option 为什么就比空值要好呢? 简而言之,因为 Option 和 T(这里 T 可以是任何类型)是不同的类型,编译器不允许像一个肯定有效的值那样使用 Option。例如,这段代码不能编译,因为它尝试将 Option 与 i8 相加: # fn main() { let x: i8 = 5; let y: Option = Some(5); let sum = x + y;\n# } 如果运行这些代码,将得到类似这样的错误信息: $ cargo run Compiling enums v0.1.0 (file:///projects/enums)\nerror[E0277]: cannot add `Option` to `i8` --> src/main.rs:5:17 |\n5 | let sum = x + y; | ^ no implementation for `i8 + Option` | = help: the trait `Add>` is not implemented for `i8` = help: the following other types implement trait `Add`: `&'a i8` implements `Add` `&i8` implements `Add<&i8>` `i8` implements `Add<&i8>` `i8` implements `Add` For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `enums` (bin \"enums\") due to 1 previous error 很好!事实上,错误信息意味着 Rust 不知道该如何将 Option 与 i8 相加,因为它们的类型不同。当在 Rust 中拥有一个像 i8 这样类型的值时,编译器确保它总是有一个有效的值。我们可以自信使用而无需做空值检查。只有当使用 Option(或者任何用到的类型)的时候需要担心可能没有值,而编译器会确保我们在使用值之前处理了为空的情况。 换句话说,在对 Option 进行运算之前必须将其转换为 T。通常这能帮助我们捕获到空值最常见的问题之一:假设某值不为空但实际上为空的情况。 消除了错误地假设一个非空值的风险,会让你对代码更加有信心。为了拥有一个可能为空的值,你必须要显式的将其放入对应类型的 Option 中。接着,当使用这个值时,必须明确的处理值为空的情况。只要一个值不是 Option 类型,你就 可以 安全的认定它的值不为空。这是 Rust 的一个经过深思熟虑的设计决策,来限制空值的泛滥以增加 Rust 代码的安全性。 那么当有一个 Option 的值时,如何从 Some 成员中取出 T 的值来使用它呢?Option 枚举拥有大量用于各种情况的方法:你可以查看 它的文档 。熟悉 Option 的方法将对你的 Rust 之旅非常有用。 总的来说,为了使用 Option 值,需要编写处理每个成员的代码。你想要一些代码只当拥有 Some(T) 值时运行,允许这些代码使用其中的 T。也希望一些代码只在值为 None 时运行,这些代码并没有一个可用的 T 值。match 表达式就是这么一个处理枚举的控制流结构:它会根据枚举的成员运行不同的代码,这些代码可以使用匹配到的值中的数据。","breadcrumbs":"枚举和模式匹配 » 枚举的定义 » Option 枚举和其相对于空值的优势","id":"102","title":"Option 枚举和其相对于空值的优势"},"103":{"body":"ch06-02-match.md commit 3962c0224b274e2358e0acf06443af64df115359 Rust 有一个叫做 match 的极为强大的控制流运算符,它允许我们将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。模式可由字面值、变量、通配符和许多其他内容构成; 第十九章 会涉及到所有不同种类的模式以及它们的作用。match 的力量来源于模式的表现力以及编译器检查,它确保了所有可能的情况都得到处理。 可以把 match 表达式想象成某种硬币分类器:硬币滑入有着不同大小孔洞的轨道,每一个硬币都会掉入符合它大小的孔洞。同样地,值也会通过 match 的每一个模式,并且在遇到第一个 “符合” 的模式时,值会进入相关联的代码块并在执行中被使用。 因为刚刚提到了硬币,让我们用它们来作为一个使用 match 的例子!我们可以编写一个函数来获取一个未知的硬币,并以一种类似验钞机的方式,确定它是何种硬币并返回它的美分值,如示例 6-3 中所示。 enum Coin { Penny, Nickel, Dime, Quarter,\n} fn value_in_cents(coin: Coin) -> u8 { match coin { Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter => 25, }\n}\n# # fn main() {} 示例 6-3:一个枚举和一个以枚举成员作为模式的 match 表达式 拆开 value_in_cents 函数中的 match 来看。首先,我们列出 match 关键字后跟一个表达式,在这个例子中是 coin 的值。这看起来非常像 if 所使用的条件表达式,不过这里有一个非常大的区别:对于 if,表达式必须返回一个布尔值,而这里它可以是任何类型的。例子中的 coin 的类型是示例 6-3 中定义的 Coin 枚举。 接下来是 match 的分支。一个分支有两个部分:一个模式和一些代码。第一个分支的模式是值 Coin::Penny 而之后的 => 运算符将模式和将要运行的代码分开。这里的代码就仅仅是值 1。每一个分支之间使用逗号分隔。 当 match 表达式执行时,它将结果值按顺序与每一个分支的模式相比较。如果模式匹配了这个值,这个模式相关联的代码将被执行。如果模式并不匹配这个值,将继续执行下一个分支,非常类似一个硬币分类器。可以拥有任意多的分支:示例 6-3 中的 match 有四个分支。 每个分支相关联的代码是一个表达式,而表达式的结果值将作为整个 match 表达式的返回值。 如果分支代码较短的话通常不使用大括号,正如示例 6-3 中的每个分支都只是返回一个值。如果想要在分支中运行多行代码,可以使用大括号,而分支后的逗号是可选的。例如,如下代码在每次使用Coin::Penny 调用时都会打印出 “Lucky penny!”,同时仍然返回代码块最后的值,1: # enum Coin {\n# Penny,\n# Nickel,\n# Dime,\n# Quarter,\n# }\n# fn value_in_cents(coin: Coin) -> u8 { match coin { Coin::Penny => { println!(\"Lucky penny!\"); 1 } Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter => 25, }\n}\n# # fn main() {}","breadcrumbs":"枚举和模式匹配 » match 控制流结构 » match 控制流结构","id":"103","title":"match 控制流结构"},"104":{"body":"匹配分支的另一个有用的功能是可以绑定匹配的模式的部分值。这也就是如何从枚举成员中提取值的。 作为一个例子,让我们修改枚举的一个成员来存放数据。1999 年到 2008 年间,美国在 25 美分的硬币的一侧为 50 个州的每一个都印刷了不同的设计。其他的硬币都没有这种区分州的设计,所以只有这些 25 美分硬币有特殊的价值。可以将这些信息加入我们的 enum,通过改变 Quarter 成员来包含一个 State 值,示例 6-4 中完成了这些修改: #[derive(Debug)] // 这样可以立刻看到州的名称\nenum UsState { Alabama, Alaska, // --snip--\n} enum Coin { Penny, Nickel, Dime, Quarter(UsState),\n}\n# # fn main() {} 示例 6-4:Quarter 成员也存放了一个 UsState 值的 Coin 枚举 想象一下我们的一个朋友尝试收集所有 50 个州的 25 美分硬币。在根据硬币类型分类零钱的同时,也可以报告出每个 25 美分硬币所对应的州名称,这样如果我们的朋友没有的话,他可以将其加入收藏。 在这些代码的匹配表达式中,我们在匹配 Coin::Quarter 成员的分支的模式中增加了一个叫做 state 的变量。当匹配到 Coin::Quarter 时,变量 state 将会绑定 25 美分硬币所对应州的值。接着在那个分支的代码中使用 state,如下: # #[derive(Debug)]\n# enum UsState {\n# Alabama,\n# Alaska,\n# // --snip--\n# }\n# # enum Coin {\n# Penny,\n# Nickel,\n# Dime,\n# Quarter(UsState),\n# }\n# fn value_in_cents(coin: Coin) -> u8 { match coin { Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter(state) => { println!(\"State quarter from {state:?}!\"); 25 } }\n}\n# # fn main() {\n# value_in_cents(Coin::Quarter(UsState::Alaska));\n# } 如果调用 value_in_cents(Coin::Quarter(UsState::Alaska)),coin 将是 Coin::Quarter(UsState::Alaska)。当将值与每个分支相比较时,没有分支会匹配,直到遇到 Coin::Quarter(state)。这时,state 绑定的将会是值 UsState::Alaska。接着就可以在 println! 表达式中使用这个绑定了,像这样就可以获取 Coin 枚举的 Quarter 成员中内部的州的值。","breadcrumbs":"枚举和模式匹配 » match 控制流结构 » 绑定值的模式","id":"104","title":"绑定值的模式"},"105":{"body":"我们在之前的部分中使用 Option 时,是为了从 Some 中取出其内部的 T 值;我们还可以像处理 Coin 枚举那样使用 match 处理 Option!只不过这回比较的不再是硬币,而是 Option 的成员,但 match 表达式的工作方式保持不变。 比如我们想要编写一个函数,它获取一个 Option ,如果其中含有一个值,将其加一。如果其中没有值,函数应该返回 None 值,而不尝试执行任何操作。 得益于 match,编写这个函数非常简单,它将看起来像示例 6-5 中这样: # fn main() { fn plus_one(x: Option) -> Option { match x { None => None, Some(i) => Some(i + 1), } } let five = Some(5); let six = plus_one(five); let none = plus_one(None);\n# } 示例 6-5:一个在 Option 上使用 match 表达式的函数 匹配 Some(T) 让我们更仔细地检查 plus_one 的第一行操作。当调用 plus_one(five) 时,plus_one 函数体中的 x 将会是值 Some(5)。接着将其与每个分支比较。 # fn main() {\n# fn plus_one(x: Option) -> Option {\n# match x { None => None,\n# Some(i) => Some(i + 1),\n# }\n# }\n# # let five = Some(5);\n# let six = plus_one(five);\n# let none = plus_one(None);\n# } 值 Some(5) 并不匹配模式 None,所以继续进行下一个分支。 # fn main() {\n# fn plus_one(x: Option) -> Option {\n# match x {\n# None => None, Some(i) => Some(i + 1),\n# }\n# }\n# # let five = Some(5);\n# let six = plus_one(five);\n# let none = plus_one(None);\n# } Some(5) 与 Some(i) 匹配吗?当然匹配!它们是相同的成员。i 绑定了 Some 中包含的值,所以 i 的值是 5。接着匹配分支的代码被执行,所以我们将 i 的值加一并返回一个含有值 6 的新 Some。 接着考虑下示例 6-5 中 plus_one 的第二个调用,这里 x 是 None。我们进入 match 并与第一个分支相比较。 # fn main() {\n# fn plus_one(x: Option) -> Option {\n# match x { None => None,\n# Some(i) => Some(i + 1),\n# }\n# }\n# # let five = Some(5);\n# let six = plus_one(five);\n# let none = plus_one(None);\n# } 匹配上了!这里没有值来加一,所以程序结束并返回 => 右侧的值 None,因为第一个分支就匹配到了,其他的分支将不再比较。 将 match 与枚举相结合在很多场景中都是有用的。你会在 Rust 代码中看到很多这样的模式:match 一个枚举,绑定其中的值到一个变量,接着根据其值执行代码。这在一开始有点复杂,不过一旦习惯了,你会希望所有语言都拥有它!这一直是用户的最爱。","breadcrumbs":"枚举和模式匹配 » match 控制流结构 » 匹配 Option","id":"105","title":"匹配 Option"},"106":{"body":"match 还有另一方面需要讨论:这些分支必须覆盖了所有的可能性。考虑一下 plus_one 函数的这个版本,它有一个 bug 并不能编译: # fn main() { fn plus_one(x: Option) -> Option { match x { Some(i) => Some(i + 1), } }\n# # let five = Some(5);\n# let six = plus_one(five);\n# let none = plus_one(None);\n# } 我们没有处理 None 的情况,所以这些代码会造成一个 bug。幸运的是,这是一个 Rust 知道如何处理的 bug。如果尝试编译这段代码,会得到这个错误: $ cargo run Compiling enums v0.1.0 (file:///projects/enums)\nerror[E0004]: non-exhaustive patterns: `None` not covered --> src/main.rs:3:15 |\n3 | match x { | ^ pattern `None` not covered |\nnote: `Option` defined here --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/option.rs:574:1 ::: /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/option.rs:578:5 | = note: not covered = note: the matched value is of type `Option`\nhelp: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown |\n4 ~ Some(i) => Some(i + 1),\n5 ~ None => todo!(), | For more information about this error, try `rustc --explain E0004`.\nerror: could not compile `enums` (bin \"enums\") due to 1 previous error Rust 知道我们没有覆盖所有可能的情况甚至知道哪些模式被忘记了!Rust 中的匹配是 穷尽的 ( exhaustive ):必须穷举到最后的可能性来使代码有效。特别的在这个 Option 的例子中,Rust 防止我们忘记明确的处理 None 的情况,这让我们免于假设拥有一个实际上为空的值,从而使之前提到的价值亿万的错误不可能发生。","breadcrumbs":"枚举和模式匹配 » match 控制流结构 » 匹配是穷尽的","id":"106","title":"匹配是穷尽的"},"107":{"body":"让我们看一个例子,我们希望对一些特定的值采取特殊操作,而对其他的值采取默认操作。想象我们正在玩一个游戏,如果你掷出骰子的值为 3,角色不会移动,而是会得到一顶新奇的帽子。如果你掷出了 7,你的角色将失去新奇的帽子。对于其他的数值,你的角色会在棋盘上移动相应的格子。这是一个实现了上述逻辑的 match,骰子的结果是硬编码而不是一个随机值,其他的逻辑部分使用了没有函数体的函数来表示,实现它们超出了本例的范围: # fn main() { let dice_roll = 9; match dice_roll { 3 => add_fancy_hat(), 7 => remove_fancy_hat(), other => move_player(other), } fn add_fancy_hat() {} fn remove_fancy_hat() {} fn move_player(num_spaces: u8) {}\n# } 对于前两个分支,匹配模式是字面值 3 和 7,最后一个分支则涵盖了所有其他可能的值,模式是我们命名为 other 的一个变量。other 分支的代码通过将其传递给 move_player 函数来使用这个变量。 即使我们没有列出 u8 所有可能的值,这段代码依然能够编译,因为最后一个模式将匹配所有未被特殊列出的值。这种通配模式满足了 match 必须被穷尽的要求。请注意,我们必须将通配分支放在最后,因为模式是按顺序匹配的。如果我们在通配分支后添加其他分支,Rust 将会警告我们,因为此后的分支永远不会被匹配到。 Rust 还提供了一个模式,当我们不想使用通配模式获取的值时,请使用 _ ,这是一个特殊的模式,可以匹配任意值而不绑定到该值。这告诉 Rust 我们不会使用这个值,所以 Rust 也不会警告我们存在未使用的变量。 让我们改变游戏规则:现在,当你掷出的值不是 3 或 7 的时候,你必须再次掷出。这种情况下我们不需要使用这个值,所以我们改动代码使用 _ 来替代变量 other : # fn main() { let dice_roll = 9; match dice_roll { 3 => add_fancy_hat(), 7 => remove_fancy_hat(), _ => reroll(), } fn add_fancy_hat() {} fn remove_fancy_hat() {} fn reroll() {}\n# } 这个例子也满足穷举性要求,因为我们在最后一个分支中明确地忽略了其他的值。我们没有忘记处理任何东西。 最后,让我们再次改变游戏规则,如果你掷出 3 或 7 以外的值,你的回合将无事发生。我们可以使用单元值(在 “元组类型” 一节中提到的空元组)作为 _ 分支的代码: # fn main() { let dice_roll = 9; match dice_roll { 3 => add_fancy_hat(), 7 => remove_fancy_hat(), _ => (), } fn add_fancy_hat() {} fn remove_fancy_hat() {}\n# } 在这里,我们明确告诉 Rust 我们不会使用与前面模式不匹配的值,并且这种情况下我们不想运行任何代码。 我们将在 第十九章 中介绍更多关于模式和匹配的内容。现在,让我们继续讨论 if let 语法,这在 match 表达式有点啰嗦的情况下很有用。","breadcrumbs":"枚举和模式匹配 » match 控制流结构 » 通配模式和 _ 占位符","id":"107","title":"通配模式和 _ 占位符"},"108":{"body":"ch06-03-if-let.md commit bb7e429ad6b59d9a0c37db7434976364cbb9c6da if let 语法让我们以一种不那么冗长的方式结合 if 和 let,来处理只匹配一个模式的值而忽略其他模式的情况。考虑示例 6-6 中的程序,它匹配一个 config_max 变量中的 Option 值并只希望当值为 Some 成员时执行代码: # fn main() { let config_max = Some(3u8); match config_max { Some(max) => println!(\"The maximum is configured to be {max}\"), _ => (), }\n# } 示例 6-6:match 只关心当值为 Some 时执行代码 如果值是 Some,我们希望打印出 Some 成员中的值,这个值被绑定到模式中的 max 变量里。对于 None 值我们不希望做任何操作。为了满足 match 表达式(穷尽性)的要求,必须在处理完这唯一的成员后加上 _ => (),这样也要增加很多烦人的样板代码。 不过我们可以使用 if let 这种更短的方式编写。如下代码与示例 6-6 中的 match 行为一致: # fn main() { let config_max = Some(3u8); if let Some(max) = config_max { println!(\"The maximum is configured to be {max}\"); }\n# } if let 语法获取通过等号分隔的一个模式和一个表达式。它的工作方式与 match 相同,这里的表达式对应 match 而模式则对应第一个分支。在这个例子中,模式是 Some(max),max 绑定为 Some 中的值。接着可以在 if let 代码块中使用 max 了,就跟在对应的 match 分支中一样。模式不匹配时 if let 块中的代码不会执行。 使用 if let 意味着编写更少代码,更少的缩进和更少的样板代码。然而,这样会失去 match 强制要求的穷尽性检查。match 和 if let 之间的选择依赖特定的环境以及增加简洁度和失去穷尽性检查的权衡取舍。 换句话说,可以认为 if let 是 match 的一个语法糖,它当值匹配某一模式时执行代码而忽略所有其他值。 可以在 if let 中包含一个 else。else 块中的代码与 match 表达式中的 _ 分支块中的代码相同,这样的 match 表达式就等同于 if let 和 else。回忆一下示例 6-4 中 Coin 枚举的定义,其 Quarter 成员也包含一个 UsState 值。如果想要计数所有不是 25 美分的硬币的同时也报告 25 美分硬币所属的州,可以使用这样一个 match 表达式: # #[derive(Debug)]\n# enum UsState {\n# Alabama,\n# Alaska,\n# // --snip--\n# }\n# # enum Coin {\n# Penny,\n# Nickel,\n# Dime,\n# Quarter(UsState),\n# }\n# # fn main() {\n# let coin = Coin::Penny; let mut count = 0; match coin { Coin::Quarter(state) => println!(\"State quarter from {state:?}!\"), _ => count += 1, }\n# } 或者可以使用这样的 if let 和 else 表达式: # #[derive(Debug)]\n# enum UsState {\n# Alabama,\n# Alaska,\n# // --snip--\n# }\n# # enum Coin {\n# Penny,\n# Nickel,\n# Dime,\n# Quarter(UsState),\n# }\n# # fn main() {\n# let coin = Coin::Penny; let mut count = 0; if let Coin::Quarter(state) = coin { println!(\"State quarter from {state:?}!\"); } else { count += 1; }\n# } 如果你的程序遇到一个使用 match 表达起来过于啰嗦的逻辑,记住 if let 也在你的 Rust 工具箱中。","breadcrumbs":"枚举和模式匹配 » if let 简洁控制流 » if let 简洁控制流","id":"108","title":"if let 简洁控制流"},"109":{"body":"现在我们涉及到了如何使用枚举来创建有一系列可列举值的自定义类型。我们也展示了标准库的 Option 类型是如何帮助你利用类型系统来避免出错的。当枚举值包含数据时,你可以根据需要处理多少情况来选择使用 match 或 if let 来获取并使用这些值。 你的 Rust 程序现在能够使用结构体和枚举在自己的作用域内表现其内容了。在你的 API 中使用自定义类型保证了类型安全:编译器会确保你的函数只会得到它期望的类型的值。 为了向你的用户提供一个组织良好的 API,它使用起来很直观并且只向用户暴露他们确实需要的部分,那么现在就让我们转向 Rust 的模块系统吧。","breadcrumbs":"枚举和模式匹配 » if let 简洁控制流 » 总结","id":"109","title":"总结"},"11":{"body":"生成本书的源码可以在 GitHub 上找到。 译者注:此译本也有 GitHub 仓库 ,欢迎提交 Issue 和 PR :)","breadcrumbs":"简介 » 源代码","id":"11","title":"源代码"},"110":{"body":"ch07-00-managing-growing-projects-with-packages-crates-and-modules.md commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c 当你编写大型程序时,组织你的代码显得尤为重要。通过对相关功能进行分组和划分不同功能的代码,你可以清楚在哪里可以找到实现了特定功能的代码,以及在哪里可以改变一个功能的工作方式。 到目前为止,我们编写的程序都在一个文件的一个模块中。伴随着项目的增长,你应该通过将代码分解为多个模块和多个文件来组织代码。一个包可以包含多个二进制 crate 项和一个可选的 crate 库。伴随着包的增长,你可以将包中的部分代码提取出来,做成独立的 crate,这些 crate 则作为外部依赖项。本章将会涵盖所有这些概念。对于一个由一系列相互关联的包组成的超大型项目,Cargo 提供了 “工作空间” 这一功能,我们将在第十四章的 “Cargo Workspaces” 对此进行讲解。 我们也会讨论封装来实现细节,这可以使你更高级地重用代码:你实现了一个操作后,其他的代码可以通过该代码的公共接口来进行调用,而不需要知道它是如何实现的。你在编写代码时可以定义哪些部分是其他代码可以使用的公共部分,以及哪些部分是你有权更改实现细节的私有部分。这是另一种减少你在脑海中记住项目内容数量的方法。 这里有一个需要说明的概念 “作用域(scope)”:代码所在的嵌套上下文有一组定义为 “in scope” 的名称。当阅读、编写和编译代码时,程序员和编译器需要知道特定位置的特定名称是否引用了变量、函数、结构体、枚举、模块、常量或者其他有意义的项。你可以创建作用域,以及改变哪些名称在作用域内还是作用域外。同一个作用域内不能拥有两个相同名称的项;可以使用一些工具来解决名称冲突。 Rust 有许多功能可以让你管理代码的组织,包括哪些内容可以被公开,哪些内容作为私有部分,以及程序每个作用域中的名字。这些功能,有时被统称为 “模块系统(the module system)”,包括: 包 ( Packages ):Cargo 的一个功能,它允许你构建、测试和分享 crate。 Crates :一个模块的树形结构,它形成了库或二进制项目。 模块 ( Modules )和 use :允许你控制作用域和路径的私有性。 路径 ( path ):一个命名例如结构体、函数或模块等项的方式。 本章将会涵盖所有这些概念,讨论它们如何交互,并说明如何使用它们来管理作用域。到最后,你会对模块系统有深入的了解,并且能够像专业人士一样使用作用域!","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用包、Crate 和模块管理不断增长的项目","id":"110","title":"使用包、Crate 和模块管理不断增长的项目"},"111":{"body":"ch07-01-packages-and-crates.md commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c 模块系统的第一部分,我们将介绍包和 crate。 crate 是 Rust 在编译时最小的代码单位。如果你用 rustc 而不是 cargo 来编译一个文件(第一章我们这么做过),编译器还是会将那个文件认作一个 crate。crate 可以包含模块,模块可以定义在其他文件,然后和 crate 一起编译,我们会在接下来的章节中遇到。 crate 有两种形式:二进制项和库。 二进制项 可以被编译为可执行程序,比如一个命令行程序或者一个 web server。它们必须有一个 main 函数来定义当程序被执行的时候所需要做的事情。目前我们所创建的 crate 都是二进制项。 库 并没有 main 函数,它们也不会编译为可执行程序,它们提供一些诸如函数之类的东西,使其他项目也能使用这些东西。比如 第二章 的 rand crate 就提供了生成随机数的东西。大多数时间 Rustaceans 说的 crate 指的都是库,这与其他编程语言中 library 概念一致。 crate root 是一个源文件,Rust 编译器以它为起始点,并构成你的 crate 的根模块(我们将在 “定义模块来控制作用域与私有性” 一节深入解读)。 包 ( package )是提供一系列功能的一个或者多个 crate。一个包会包含一个 Cargo.toml 文件,阐述如何去构建这些 crate。Cargo 就是一个包含构建你代码的二进制项的包。Cargo 也包含这些二进制项所依赖的库。其他项目也能用 Cargo 库来实现与 Cargo 命令行程序一样的逻辑。 包中可以包含至多一个库 crate(library crate)。包中可以包含任意多个二进制 crate(binary crate),但是必须至少包含一个 crate(无论是库的还是二进制的)。 让我们来看看创建包的时候会发生什么。首先,我们输入命令 cargo new: $ cargo new my-project Created binary (application) `my-project` package\n$ ls my-project\nCargo.toml\nsrc\n$ ls my-project/src\nmain.rs 运行了这条命令后,我们先用 ls (译者注:此命令为 Linux 平台的指令,Windows 下可用 dir)来看看 Cargo 给我们创建了什么,Cargo 会给我们的包创建一个 Cargo.toml 文件。查看 Cargo.toml 的内容,会发现并没有提到 src/main.rs ,因为 Cargo 遵循的一个约定: src/main.rs 就是一个与包同名的二进制 crate 的 crate 根。同样的,Cargo 知道如果包目录中包含 src/lib.rs ,则包带有与其同名的库 crate,且 src/lib.rs 是 crate 根。crate 根文件将由 Cargo 传递给 rustc 来实际构建库或者二进制项目。 在此,我们有了一个只包含 src/main.rs 的包,意味着它只含有一个名为 my-project 的二进制 crate。如果一个包同时含有 src/main.rs 和 src/lib.rs ,则它有两个 crate:一个二进制的和一个库的,且名字都与包相同。通过将文件放在 src/bin 目录下,一个包可以拥有多个二进制 crate:每个 src/bin 下的文件都会被编译成一个独立的二进制 crate。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 包和 Crate » 包和 Crate","id":"111","title":"包和 Crate"},"112":{"body":"ch07-02-defining-modules-to-control-scope-and-privacy.md commit 310ea6cb0dd855eaf510c9ba05648bc5836ead0c 在本节,我们将讨论模块和其它一些关于模块系统的部分,如允许你命名项的 路径 ( paths );用来将路径引入作用域的 use 关键字;以及使项变为公有的 pub 关键字。我们还将讨论 as 关键字、外部包和 glob 运算符。现在,让我们把注意力放在模块上! 首先,我们将从一系列的规则开始,在你未来组织代码的时候,这些规则可被用作简单的参考。接下来我们将会详细的解释每条规则。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 定义模块来控制作用域与私有性 » 定义模块来控制作用域与私有性","id":"112","title":"定义模块来控制作用域与私有性"},"113":{"body":"这里我们提供一个简单的参考,用来解释模块、路径、use关键词和pub关键词如何在编译器中工作,以及大部分开发者如何组织他们的代码。我们将在本章节中举例说明每条规则,不过这是一个解释模块工作方式的良好参考。 从 crate 根节点开始 : 当编译一个 crate, 编译器首先在 crate 根文件(通常,对于一个库 crate 而言是 src/lib.rs ,对于一个二进制 crate 而言是 src/main.rs )中寻找需要被编译的代码。 声明模块 : 在 crate 根文件中,你可以声明一个新模块;比如,你用mod garden;声明了一个叫做garden的模块。编译器会在下列路径中寻找模块代码: 内联,在大括号中,当mod garden后方不是一个分号而是一个大括号 在文件 src/garden.rs 在文件 src/garden/mod.rs 声明子模块 : 在除了 crate 根节点以外的其他文件中,你可以定义子模块。比如,你可能在 src/garden.rs 中定义了mod vegetables;。编译器会在以父模块命名的目录中寻找子模块代码: 内联,在大括号中,当mod vegetables后方不是一个分号而是一个大括号 在文件 src/garden/vegetables.rs 在文件 src/garden/vegetables/mod.rs 模块中的代码路径 : 一旦一个模块是你 crate 的一部分,你可以在隐私规则允许的前提下,从同一个 crate 内的任意地方,通过代码路径引用该模块的代码。举例而言,一个 garden vegetables 模块下的Asparagus类型可以在crate::garden::vegetables::Asparagus被找到。 私有 vs 公用 : 一个模块里的代码默认对其父模块私有。为了使一个模块公用,应当在声明时使用pub mod替代mod。为了使一个公用模块内部的成员公用,应当在声明前使用pub。 use 关键字 : 在一个作用域内,use关键字创建了一个成员的快捷方式,用来减少长路径的重复。在任何可以引用crate::garden::vegetables::Asparagus的作用域,你可以通过 use crate::garden::vegetables::Asparagus;创建一个快捷方式,然后你就可以在作用域中只写Asparagus来使用该类型。 这里我们创建一个名为backyard的二进制 crate 来说明这些规则。该 crate 的路径同样命名为backyard,该路径包含了这些文件和目录: backyard\n├── Cargo.lock\n├── Cargo.toml\n└── src ├── garden │ └── vegetables.rs ├── garden.rs └── main.rs 这个例子中的 crate 根文件是 src/main.rs ,该文件包括了: 文件名:src/main.rs use crate::garden::vegetables::Asparagus; pub mod garden; fn main() { let plant = Asparagus {}; println!(\"I'm growing {plant:?}!\");\n} pub mod garden;行告诉编译器应该包含在 src/garden.rs 文件中发现的代码: 文件名:src/garden.rs pub mod vegetables; 在此处, pub mod vegetables;意味着在 src/garden/vegetables.rs 中的代码也应该被包括。这些代码是: #[derive(Debug)]\npub struct Asparagus {} 现在让我们深入了解这些规则的细节并在实际中演示它们!","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 定义模块来控制作用域与私有性 » 模块小抄","id":"113","title":"模块小抄"},"114":{"body":"模块 让我们可以将一个 crate 中的代码进行分组,以提高可读性与重用性。因为一个模块中的代码默认是私有的,所以还可以利用模块控制项的 私有性 。私有项是不可为外部使用的内在详细实现。我们也可以将模块和它其中的项标记为公开的,这样,外部代码就可以使用并依赖于它们。 在餐饮业,餐馆中会有一些地方被称之为 前台 ( front of house ),还有另外一些地方被称之为 后台 ( back of house )。前台是招待顾客的地方,在这里,店主可以为顾客安排座位,服务员接受顾客下单和付款,调酒师会制作饮品。后台则是由厨师工作的厨房,洗碗工的工作地点,以及经理做行政工作的地方组成。 我们可以将函数放置到嵌套的模块中,来使我们的 crate 结构与实际的餐厅结构相同。通过执行 cargo new --lib restaurant,来创建一个新的名为 restaurant 的库。然后将示例 7-1 中所罗列出来的代码放入 src/lib.rs 中,来定义一些模块和函数。 文件名:src/lib.rs mod front_of_house { mod hosting { fn add_to_waitlist() {} fn seat_at_table() {} } mod serving { fn take_order() {} fn serve_order() {} fn take_payment() {} }\n} 示例 7-1:一个包含了其他内置了函数的模块的 front_of_house 模块 我们定义一个模块,是以 mod 关键字为起始,然后指定模块的名字(本例中叫做 front_of_house),并且用花括号包围模块的主体。在模块内,我们还可以定义其他的模块,就像本例中的 hosting 和 serving 模块。模块还可以保存一些定义的其他项,比如结构体、枚举、常量、特性、或者函数。 通过使用模块,我们可以将相关的定义分组到一起,并指出它们为什么相关。程序员可以通过使用这段代码,更加容易地找到他们想要的定义,因为他们可以基于分组来对代码进行导航,而不需要阅读所有的定义。程序员向这段代码中添加一个新的功能时,他们也会知道代码应该放置在何处,可以保持程序的组织性。 在前面我们提到了,src/main.rs 和 src/lib.rs 叫做 crate 根。之所以这样叫它们是因为这两个文件的内容都分别在 crate 模块结构的根组成了一个名为 crate 的模块,该结构被称为 模块树 ( module tree )。 示例 7-2 展示了示例 7-1 中的模块树的结构。 crate └── front_of_house ├── hosting │ ├── add_to_waitlist │ └── seat_at_table └── serving ├── take_order ├── serve_order └── take_payment 示例 7-2: 示例 7-1 中代码的模块树 这个树展示了一些模块是如何被嵌入到另一个模块的(例如,hosting 嵌套在 front_of_house 中)。这个树还展示了一些模块是互为 兄弟 ( siblings )的,这意味着它们定义在同一模块中(hosting 和 serving 被一起定义在 front_of_house 中)。继续沿用家庭关系的比喻,如果一个模块 A 被包含在模块 B 中,我们将模块 A 称为模块 B 的 子 ( child ),模块 B 则是模块 A 的 父 ( parent )。注意,整个模块树都植根于名为 crate 的隐式模块下。 这个模块树可能会令你想起电脑上文件系统的目录树;这是一个非常恰当的类比!就像文件系统的目录,你可以使用模块来组织你的代码。并且,就像目录中的文件,我们需要一种方法来找到模块。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 定义模块来控制作用域与私有性 » 在模块中对相关代码进行分组","id":"114","title":"在模块中对相关代码进行分组"},"115":{"body":"ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md commit 2b4565662d1a7973d870744a923f58f8f7dcce91 来看一下 Rust 如何在模块树中找到一个项的位置,我们使用路径的方式,就像在文件系统使用路径一样。为了调用一个函数,我们需要知道它的路径。 路径有两种形式: 绝对路径 ( absolute path )是以 crate 根(root)开头的全路径;对于外部 crate 的代码,是以 crate 名开头的绝对路径,对于当前 crate 的代码,则以字面值 crate 开头。 相对路径 ( relative path )从当前模块开始,以 self、super 或定义在当前模块中的标识符开头。 绝对路径和相对路径都后跟一个或多个由双冒号(::)分割的标识符。 回到示例 7-1,假设我们希望调用 add_to_waitlist 函数。还是同样的问题,add_to_waitlist 函数的路径是什么?在示例 7-3 中删除了一些模块和函数。 我们在 crate 根定义了一个新函数 eat_at_restaurant,并在其中展示调用 add_to_waitlist 函数的两种方法。eat_at_restaurant 函数是我们 crate 库的一个公共 API,所以我们使用 pub 关键字来标记它。在 “使用 pub 关键字暴露路径” 一节,我们将详细介绍 pub。注意,这个例子无法编译通过,我们稍后会解释原因。 文件名:src/lib.rs mod front_of_house { mod hosting { fn add_to_waitlist() {} }\n} pub fn eat_at_restaurant() { // 绝对路径 crate::front_of_house::hosting::add_to_waitlist(); // 相对路径 front_of_house::hosting::add_to_waitlist();\n} 示例 7-3: 使用绝对路径和相对路径来调用 add_to_waitlist 函数 第一种方式,我们在 eat_at_restaurant 中调用 add_to_waitlist 函数,使用的是绝对路径。add_to_waitlist 函数与 eat_at_restaurant 被定义在同一 crate 中,这意味着我们可以使用 crate 关键字为起始的绝对路径。 在 crate 后面,我们持续地嵌入模块,直到我们找到 add_to_waitlist。你可以想象出一个相同结构的文件系统,我们通过指定路径 /front_of_house/hosting/add_to_waitlist 来执行 add_to_waitlist 程序。我们使用 crate 从 crate 根开始就类似于在 shell 中使用 / 从文件系统根开始。 第二种方式,我们在 eat_at_restaurant 中调用 add_to_waitlist,使用的是相对路径。这个路径以 front_of_house 为起始,这个模块在模块树中,与 eat_at_restaurant 定义在同一层级。与之等价的文件系统路径就是 front_of_house/hosting/add_to_waitlist。以模块名开头意味着该路径是相对路径。 选择使用相对路径还是绝对路径,要取决于你的项目,也取决于你是更倾向于将项的定义代码与使用该项的代码分开来移动,还是一起移动。举一个例子,如果我们要将 front_of_house 模块和 eat_at_restaurant 函数一起移动到一个名为 customer_experience 的模块中,我们需要更新 add_to_waitlist 的绝对路径,但是相对路径还是可用的。然而,如果我们要将 eat_at_restaurant 函数单独移到一个名为 dining 的模块中,还是可以使用原本的绝对路径来调用 add_to_waitlist,但是相对路径必须要更新。我们更倾向于使用绝对路径,因为把代码定义和项调用各自独立地移动是更常见的。 让我们试着编译一下示例 7-3,并查明为何不能编译!示例 7-4 展示了这个错误。 $ cargo build Compiling restaurant v0.1.0 (file:///projects/restaurant)\nerror[E0603]: module `hosting` is private --> src/lib.rs:9:28 |\n9 | crate::front_of_house::hosting::add_to_waitlist(); | ^^^^^^^ --------------- function `add_to_waitlist` is not publicly re-exported | | | private module |\nnote: the module `hosting` is defined here --> src/lib.rs:2:5 |\n2 | mod hosting { | ^^^^^^^^^^^ error[E0603]: module `hosting` is private --> src/lib.rs:12:21 |\n12 | front_of_house::hosting::add_to_waitlist(); | ^^^^^^^ --------------- function `add_to_waitlist` is not publicly re-exported | | | private module |\nnote: the module `hosting` is defined here --> src/lib.rs:2:5 |\n2 | mod hosting { | ^^^^^^^^^^^ For more information about this error, try `rustc --explain E0603`.\nerror: could not compile `restaurant` (lib) due to 2 previous errors 示例 7-4: 构建示例 7-3 出现的编译器错误 错误信息说 hosting 模块是私有的。换句话说,我们拥有 hosting 模块和 add_to_waitlist 函数的正确路径,但是 Rust 不让我们使用,因为它不能访问私有片段。在 Rust 中,默认所有项(函数、方法、结构体、枚举、模块和常量)对父模块都是私有的。如果希望创建一个私有函数或结构体,你可以将其放入一个模块。 父模块中的项不能使用子模块中的私有项,但是子模块中的项可以使用它们父模块中的项。这是因为子模块封装并隐藏了它们的实现详情,但是子模块可以看到它们定义的上下文。继续拿餐馆作比喻,把私有性规则想象成餐馆的后台办公室:餐馆内的事务对餐厅顾客来说是不可知的,但办公室经理可以洞悉其经营的餐厅并在其中做任何事情。 Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你就知道可以更改内部代码的哪些部分而不会破坏外部代码。不过 Rust 也确实提供了通过使用 pub 关键字来创建公共项,使子模块的内部部分暴露给上级模块。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 引用模块项目的路径 » 引用模块项目的路径","id":"115","title":"引用模块项目的路径"},"116":{"body":"让我们回头看一下示例 7-4 的错误,它告诉我们 hosting 模块是私有的。我们想让父模块中的 eat_at_restaurant 函数可以访问子模块中的 add_to_waitlist 函数,因此我们使用 pub 关键字来标记 hosting 模块,如示例 7-5 所示。 文件名:src/lib.rs mod front_of_house { pub mod hosting { fn add_to_waitlist() {} }\n} pub fn eat_at_restaurant() { // 绝对路径 crate::front_of_house::hosting::add_to_waitlist(); // 相对路径 front_of_house::hosting::add_to_waitlist();\n} 示例 7-5: 使用 pub 关键字声明 hosting 模块使其可在 eat_at_restaurant 使用 不幸的是,示例 7-5 的代码编译仍然有错误,如示例 7-6 所示。 $ cargo build Compiling restaurant v0.1.0 (file:///projects/restaurant)\nerror[E0603]: function `add_to_waitlist` is private --> src/lib.rs:9:37 |\n9 | crate::front_of_house::hosting::add_to_waitlist(); | ^^^^^^^^^^^^^^^ private function |\nnote: the function `add_to_waitlist` is defined here --> src/lib.rs:3:9 |\n3 | fn add_to_waitlist() {} | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: function `add_to_waitlist` is private --> src/lib.rs:12:30 |\n12 | front_of_house::hosting::add_to_waitlist(); | ^^^^^^^^^^^^^^^ private function |\nnote: the function `add_to_waitlist` is defined here --> src/lib.rs:3:9 |\n3 | fn add_to_waitlist() {} | ^^^^^^^^^^^^^^^^^^^^ For more information about this error, try `rustc --explain E0603`.\nerror: could not compile `restaurant` (lib) due to 2 previous errors 示例 7-6: 构建示例 7-5 出现的编译器错误 发生了什么?在 mod hosting 前添加了 pub 关键字,使其变成公有的。伴随着这种变化,如果我们可以访问 front_of_house,那我们也可以访问 hosting。但是 hosting 的 内容 ( contents )仍然是私有的;这表明使模块公有并不使其内容也是公有的。模块上的 pub 关键字只允许其父模块引用它,而不允许访问内部代码。因为模块是一个容器,只是将模块变为公有能做的其实并不太多;同时需要更深入地选择将一个或多个项变为公有。 示例 7-6 中的错误说,add_to_waitlist 函数是私有的。私有性规则不但应用于模块,还应用于结构体、枚举、函数和方法。 让我们继续将 pub 关键字放置在 add_to_waitlist 函数的定义之前,使其变成公有。如示例 7-7 所示。 文件名:src/lib.rs mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} }\n} pub fn eat_at_restaurant() { // 绝对路径 crate::front_of_house::hosting::add_to_waitlist(); // 相对路径 front_of_house::hosting::add_to_waitlist();\n} 示例 7-7: 为 mod hosting 和 fn add_to_waitlist 添加 pub 关键字使它们可以在 eat_at_restaurant 函数中被调用 现在代码可以编译通过了!为了了解为何增加 pub 关键字使得我们可以在 add_to_waitlist 中调用这些路径与私有性规则有关,让我们看看绝对路径和相对路径。 在绝对路径,我们从 crate 也就是 crate 根开始。crate 根中定义了 front_of_house 模块。虽然 front_of_house 模块不是公有的,不过因为 eat_at_restaurant 函数与 front_of_house 定义于同一模块中(即,eat_at_restaurant 和 front_of_house 是兄弟),我们可以从 eat_at_restaurant 中引用 front_of_house。接下来是使用 pub 标记的 hosting 模块。我们可以访问 hosting 的父模块,所以可以访问 hosting。最后,add_to_waitlist 函数被标记为 pub ,我们可以访问其父模块,所以这个函数调用是有效的! 在相对路径,其逻辑与绝对路径相同,除了第一步:不同于从 crate 根开始,路径从 front_of_house 开始。front_of_house 模块与 eat_at_restaurant 定义于同一模块,所以从 eat_at_restaurant 中开始定义的该模块相对路径是有效的。接下来因为 hosting 和 add_to_waitlist 被标记为 pub,路径其余的部分也是有效的,因此函数调用也是有效的! 如果你计划共享你的库 crate 以便其它项目可以使用你的代码,公有 API 将是决定 crate 用户如何与你代码交互的契约。关于管理公有 API 的修改以便被人更容易依赖你的库有着很多考量。这些考量超出了本书的范畴;如果你对这些话题感兴趣,请查阅 The Rust API Guidelines","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 引用模块项目的路径 » 使用 pub 关键字暴露路径","id":"116","title":"使用 pub 关键字暴露路径"},"117":{"body":"我们提到过包(package)可以同时包含一个 src/main.rs 二进制 crate 根和一个 src/lib.rs 库 crate 根,并且这两个 crate 默认以包名来命名。通常,这种包含二进制 crate 和库 crate 的模式的包,在二进制 crate 中只保留足以生成一个可执行文件的代码,并由可执行文件调用库 crate 的代码。又因为库 crate 可以共享,这使得其它项目从包提供的大部分功能中受益。 模块树应该定义在 src/lib.rs 中。这样通过以包名开头的路径,公有项就可以在二进制 crate 中使用。二进制 crate 就变得同其它在该 crate 之外的、使用库 crate 的用户一样:二者都只能使用公有 API。这有助于你设计一个好的 API;你不仅仅是作者,也是用户! 在 第十二章 我们会通过一个同时包含二进制 crate 和库 crate 的命令行程序来展示这些包组织上的实践。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 引用模块项目的路径 » 二进制和库 crate 包的最佳实践","id":"117","title":"二进制和库 crate 包的最佳实践"},"118":{"body":"我们可以通过在路径的开头使用 super ,从父模块开始构建相对路径,而不是从当前模块或者 crate 根开始。这类似以 .. 语法开始一个文件系统路径。使用 super 允许我们引用父模块中的已知项,这使得重新组织模块树变得更容易 —— 当模块与父模块关联的很紧密,但某天父模块可能要移动到模块树的其它位置。 考虑一下示例 7-8 中的代码,它模拟了厨师更正了一个错误订单,并亲自将其提供给客户的情况。back_of_house 模块中的定义的 fix_incorrect_order 函数通过指定的 super 起始的 deliver_order 路径,来调用父模块中的 deliver_order 函数: 文件名:src/lib.rs fn deliver_order() {} mod back_of_house { fn fix_incorrect_order() { cook_order(); super::deliver_order(); } fn cook_order() {}\n} 示例 7-8: 使用以 super 开头的相对路径从父目录开始调用函数 fix_incorrect_order 函数在 back_of_house 模块中,所以我们可以使用 super 进入 back_of_house 父模块,也就是本例中的 crate 根。在这里,我们可以找到 deliver_order。成功!我们认为 back_of_house 模块和 deliver_order 函数之间可能具有某种关联关系,并且,如果我们要重新组织这个 crate 的模块树,需要一起移动它们。因此,我们使用 super,这样一来,如果这些代码被移动到了其他模块,我们只需要更新很少的代码。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 引用模块项目的路径 » super 开始的相对路径","id":"118","title":"super 开始的相对路径"},"119":{"body":"我们还可以使用 pub 来设计公有的结构体和枚举,不过关于在结构体和枚举上使用 pub 还有一些额外的细节需要注意。如果我们在一个结构体定义的前面使用了 pub ,这个结构体会变成公有的,但是这个结构体的字段仍然是私有的。我们可以根据情况决定每个字段是否公有。在示例 7-9 中,我们定义了一个公有结构体 back_of_house:Breakfast,其中有一个公有字段 toast 和私有字段 seasonal_fruit。这个例子模拟的情况是,在一家餐馆中,顾客可以选择随餐附赠的面包类型,但是厨师会根据季节和库存情况来决定随餐搭配的水果。餐馆可用的水果变化是很快的,所以顾客不能选择水果,甚至无法看到他们将会得到什么水果。 文件名:src/lib.rs mod back_of_house { pub struct Breakfast { pub toast: String, seasonal_fruit: String, } impl Breakfast { pub fn summer(toast: &str) -> Breakfast { Breakfast { toast: String::from(toast), seasonal_fruit: String::from(\"peaches\"), } } }\n} pub fn eat_at_restaurant() { // 在夏天订购一个黑麦土司作为早餐 let mut meal = back_of_house::Breakfast::summer(\"Rye\"); // 改变主意更换想要面包的类型 meal.toast = String::from(\"Wheat\"); println!(\"I'd like {} toast please\", meal.toast); // 如果取消下一行的注释代码不能编译; // 不允许查看或修改早餐附带的季节水果 // meal.seasonal_fruit = String::from(\"blueberries\");\n} 示例 7-9: 带有公有和私有字段的结构体 因为 back_of_house::Breakfast 结构体的 toast 字段是公有的,所以我们可以在 eat_at_restaurant 中使用点号来随意的读写 toast 字段。注意,我们不能在 eat_at_restaurant 中使用 seasonal_fruit 字段,因为 seasonal_fruit 是私有的。尝试去除那一行修改 seasonal_fruit 字段值的代码的注释,看看你会得到什么错误! 还请注意一点,因为 back_of_house::Breakfast 具有私有字段,所以这个结构体需要提供一个公共的关联函数来构造 Breakfast 的实例 (这里我们命名为 summer)。如果 Breakfast 没有这样的函数,我们将无法在 eat_at_restaurant 中创建 Breakfast 实例,因为我们不能在 eat_at_restaurant 中设置私有字段 seasonal_fruit 的值。 与之相反,如果我们将枚举设为公有,则它的所有成员都将变为公有。我们只需要在 enum 关键字前面加上 pub,就像示例 7-10 展示的那样。 文件名:src/lib.rs mod back_of_house { pub enum Appetizer { Soup, Salad, }\n} pub fn eat_at_restaurant() { let order1 = back_of_house::Appetizer::Soup; let order2 = back_of_house::Appetizer::Salad;\n} 示例 7-10: 设计公有枚举,使其所有成员公有 因为我们创建了名为 Appetizer 的公有枚举,所以我们可以在 eat_at_restaurant 中使用 Soup 和 Salad 成员。 如果枚举成员不是公有的,那么枚举会显得用处不大;给枚举的所有成员挨个添加 pub 是很令人恼火的,因此枚举成员默认就是公有的。结构体通常使用时,不必将它们的字段公有化,因此结构体遵循常规,内容全部是私有的,除非使用 pub 关键字。 还有一种使用 pub 的场景我们还没有涉及到,那就是我们最后要讲的模块功能:use 关键字。我们将先单独介绍 use,然后展示如何结合使用 pub 和 use。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 引用模块项目的路径 » 创建公有的结构体和枚举","id":"119","title":"创建公有的结构体和枚举"},"12":{"body":"ch01-00-getting-started.md commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f 让我们开始 Rust 之旅!有很多内容需要学习,但每次旅程总有起点。在本章中,我们会讨论: 在 Linux、macOS 和 Windows 上安装 Rust 编写一个打印 Hello, world! 的程序 使用 Rust 的包管理器和构建系统 cargo","breadcrumbs":"入门指南 » 入门指南","id":"12","title":"入门指南"},"120":{"body":"ch07-04-bringing-paths-into-scope-with-the-use-keyword.md commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c 不得不编写路径来调用函数显得不便且重复。在示例 7-7 中,无论我们选择 add_to_waitlist 函数的绝对路径还是相对路径,每次我们想要调用 add_to_waitlist 时,都必须指定front_of_house 和 hosting。幸运的是,有一种方法可以简化这个过程。我们可以使用 use 关键字创建一个短路径,然后就可以在作用域中的任何地方使用这个更短的名字。 在示例 7-11 中,我们将 crate::front_of_house::hosting 模块引入了 eat_at_restaurant 函数的作用域,而我们只需要指定 hosting::add_to_waitlist 即可在 eat_at_restaurant 中调用 add_to_waitlist 函数。 文件名:src/lib.rs mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} }\n} use crate::front_of_house::hosting; pub fn eat_at_restaurant() { hosting::add_to_waitlist();\n} 示例 7-11: 使用 use 将模块引入作用域 在作用域中增加 use 和路径类似于在文件系统中创建软连接(符号连接,symbolic link)。通过在 crate 根增加 use crate::front_of_house::hosting,现在 hosting 在作用域中就是有效的名称了,如同 hosting 模块被定义于 crate 根一样。通过 use 引入作用域的路径也会检查私有性,同其它路径一样。 注意 use 只能创建 use 所在的特定作用域内的短路径。示例 7-12 将 eat_at_restaurant 函数移动到了一个叫 customer 的子模块,这又是一个不同于 use 语句的作用域,所以函数体不能编译。 文件名:src/lib.rs mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} }\n} use crate::front_of_house::hosting; mod customer { pub fn eat_at_restaurant() { hosting::add_to_waitlist(); }\n} 示例 7-12: use 语句只适用于其所在的作用域 编译器错误显示短路径不再适用于 customer 模块中: $ cargo build Compiling restaurant v0.1.0 (file:///projects/restaurant)\nerror[E0433]: failed to resolve: use of undeclared crate or module `hosting` --> src/lib.rs:11:9 |\n11 | hosting::add_to_waitlist(); | ^^^^^^^ use of undeclared crate or module `hosting` |\nhelp: consider importing this module through its public re-export |\n10 + use crate::hosting; | warning: unused import: `crate::front_of_house::hosting` --> src/lib.rs:7:5 |\n7 | use crate::front_of_house::hosting; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default For more information about this error, try `rustc --explain E0433`.\nwarning: `restaurant` (lib) generated 1 warning\nerror: could not compile `restaurant` (lib) due to 1 previous error; 1 warning emitted 注意这里还有一个警告说 use 在其作用域内不再被使用!为了修复这个问题,可以将 use 移动到 customer 模块内,或者在子模块 customer 内通过 super::hosting 引用父模块中的这个短路径。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 使用 use 关键字将路径引入作用域","id":"120","title":"使用 use 关键字将路径引入作用域"},"121":{"body":"在示例 7-11 中,你可能会比较疑惑,为什么我们是指定 use crate::front_of_house::hosting ,然后在 eat_at_restaurant 中调用 hosting::add_to_waitlist ,而不是通过指定一直到 add_to_waitlist 函数的 use 路径来得到相同的结果,如示例 7-13 所示。 文件名:src/lib.rs mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} }\n} use crate::front_of_house::hosting::add_to_waitlist; pub fn eat_at_restaurant() { add_to_waitlist();\n} 示例 7-13: 使用 use 将 add_to_waitlist 函数引入作用域,这并不符合习惯 虽然示例 7-11 和 7-13 都完成了相同的任务,但示例 7-11 是使用 use 将函数引入作用域的习惯用法。要想使用 use 将函数的父模块引入作用域,我们必须在调用函数时指定父模块,这样可以清晰地表明函数不是在本地定义的,同时使完整路径的重复度最小化。示例 7-13 中的代码不清楚 add_to_waitlist 是在哪里被定义的。 另一方面,使用 use 引入结构体、枚举和其他项时,习惯是指定它们的完整路径。示例 7-14 展示了将 HashMap 结构体引入二进制 crate 作用域的习惯用法。 文件名:src/main.rs use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert(1, 2);\n} 示例 7-14: 将 HashMap 引入作用域的习惯用法 这种习惯用法背后没有什么硬性要求:它只是一种惯例,人们已经习惯了以这种方式阅读和编写 Rust 代码。 这个习惯用法有一个例外,那就是我们想使用 use 语句将两个具有相同名称的项带入作用域,因为 Rust 不允许这样做。示例 7-15 展示了如何将两个具有相同名称但不同父模块的 Result 类型引入作用域,以及如何引用它们。 文件名:src/lib.rs use std::fmt;\nuse std::io; fn function1() -> fmt::Result { // --snip--\n# Ok(())\n} fn function2() -> io::Result<()> { // --snip--\n# Ok(())\n} 示例 7-15: 使用父模块将两个具有相同名称的类型引入同一作用域 如你所见,使用父模块可以区分这两个 Result 类型。如果我们是指定 use std::fmt::Result 和 use std::io::Result,我们将在同一作用域拥有了两个 Result 类型,当我们使用 Result 时,Rust 则不知道我们要用的是哪个。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 创建惯用的 use 路径","id":"121","title":"创建惯用的 use 路径"},"122":{"body":"使用 use 将两个同名类型引入同一作用域这个问题还有另一个解决办法:在这个类型的路径后面,我们使用 as 指定一个新的本地名称或者别名。示例 7-16 展示了另一个编写示例 7-15 中代码的方法,通过 as 重命名其中一个 Result 类型。 文件名:src/lib.rs use std::fmt::Result;\nuse std::io::Result as IoResult; fn function1() -> Result { // --snip--\n# Ok(())\n} fn function2() -> IoResult<()> { // --snip--\n# Ok(())\n} 示例 7-16: 使用 as 关键字重命名引入作用域的类型 在第二个 use 语句中,我们选择 IoResult 作为 std::io::Result 的新名称,它与从 std::fmt 引入作用域的 Result 并不冲突。示例 7-15 和示例 7-16 都是惯用的,如何选择都取决于你!","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 使用 as 关键字提供新的名称","id":"122","title":"使用 as 关键字提供新的名称"},"123":{"body":"使用 use 关键字,将某个名称导入当前作用域后,这个名称在此作用域中就可以使用了,但它对此作用域之外还是私有的。如果想让其他人调用我们的代码时,也能够正常使用这个名称,就好像它本来就在当前作用域一样,那我们可以将 pub 和 use 合起来使用。这种技术被称为 “ 重导出 ( re-exporting )”:我们不仅将一个名称导入了当前作用域,还允许别人把它导入他们自己的作用域。 示例 7-17 将示例 7-11 根模块中的 use 改为 pub use 。 文件名:src/lib.rs mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} }\n} pub use crate::front_of_house::hosting; pub fn eat_at_restaurant() { hosting::add_to_waitlist();\n} 示例 7-17: 通过 pub use 使名称可从新作用域中被导入至任何代码 在这个修改之前,外部代码需要使用路径 restaurant::front_of_house::hosting::add_to_waitlist() 来调用 add_to_waitlist 函数。现在这个 pub use 从根模块重导出了 hosting 模块,外部代码现在可以使用路径 restaurant::hosting::add_to_waitlist。 当你代码的内部结构与调用你代码的程序员所想象的结构不同时,重导出会很有用。例如,在这个餐馆的比喻中,经营餐馆的人会想到“前台”和“后台”。但顾客在光顾一家餐馆时,可能不会以这些术语来考虑餐馆的各个部分。使用 pub use,我们可以使用一种结构编写代码,却将不同的结构形式暴露出来。这样做使我们的库井井有条,也使开发这个库的程序员和调用这个库的程序员都更加方便。在 “使用 pub use 导出合适的公有 API” 部分让我们再看另一个 pub use 的例子来了解这如何影响 crate 的文档。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 使用 pub use 重导出名称","id":"123","title":"使用 pub use 重导出名称"},"124":{"body":"在第二章中我们编写了一个猜猜看游戏。那个项目使用了一个外部包,rand,来生成随机数。为了在项目中使用 rand,在 Cargo.toml 中加入了如下行: 文件名:Cargo.toml rand = \"0.8.5\" 在 Cargo.toml 中加入 rand 依赖告诉了 Cargo 要从 crates.io 下载 rand 和其依赖,并使其可在项目代码中使用。 接着,为了将 rand 定义引入项目包的作用域,我们加入一行 use 起始的包名,它以 rand 包名开头并列出了需要引入作用域的项。回忆一下第二章的 “生成一个随机数” 部分,我们曾将 Rng trait 引入作用域并调用了 rand::thread_rng 函数: # use std::io;\nuse rand::Rng; fn main() {\n# println!(\"Guess the number!\");\n# let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {guess}\");\n} crates.io 上有很多 Rust 社区成员发布的包,将其引入你自己的项目都需要一道相同的步骤:在 Cargo.toml 列出它们并通过 use 将其中定义的项引入项目包的作用域中。 注意 std 标准库对于你的包来说也是外部 crate。因为标准库随 Rust 语言一同分发,无需修改 Cargo.toml 来引入 std,不过需要通过 use 将标准库中定义的项引入项目包的作用域中来引用它们,比如我们使用的 HashMap: use std::collections::HashMap; 这是一个以标准库 crate 名 std 开头的绝对路径。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 使用外部包","id":"124","title":"使用外部包"},"125":{"body":"当需要引入很多定义于相同包或相同模块的项时,为每一项单独列出一行会占用源码很大的空间。例如猜猜看章节示例 2-4 中有两行 use 语句都从 std 引入项到作用域: 文件名:src/main.rs # use rand::Rng;\n// --snip--\nuse std::cmp::Ordering;\nuse std::io;\n// --snip--\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {guess}\");\n# # match guess.cmp(&secret_number) {\n# Ordering::Less => println!(\"Too small!\"),\n# Ordering::Greater => println!(\"Too big!\"),\n# Ordering::Equal => println!(\"You win!\"),\n# }\n# } 相反,我们可以使用嵌套路径将相同的项在一行中引入作用域。这么做需要指定路径的相同部分,接着是两个冒号,接着是大括号中的各自不同的路径部分,如示例 7-18 所示。 文件名:src/main.rs # use rand::Rng;\n// --snip--\nuse std::{cmp::Ordering, io};\n// --snip--\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # let guess: u32 = guess.trim().parse().expect(\"Please type a number!\");\n# # println!(\"You guessed: {guess}\");\n# # match guess.cmp(&secret_number) {\n# Ordering::Less => println!(\"Too small!\"),\n# Ordering::Greater => println!(\"Too big!\"),\n# Ordering::Equal => println!(\"You win!\"),\n# }\n# } 示例 7-18: 指定嵌套的路径在一行中将多个带有相同前缀的项引入作用域 在较大的程序中,使用嵌套路径从相同包或模块中引入很多项,可以显著减少所需的独立 use 语句的数量! 我们可以在路径的任何层级使用嵌套路径,这在组合两个共享子路径的 use 语句时非常有用。例如,示例 7-19 中展示了两个 use 语句:一个将 std::io 引入作用域,另一个将 std::io::Write 引入作用域: 文件名:src/lib.rs use std::io;\nuse std::io::Write; 示例 7-19: 通过两行 use 语句引入两个路径,其中一个是另一个的子路径 两个路径的相同部分是 std::io,这正是第一个路径。为了在一行 use 语句中引入这两个路径,可以在嵌套路径中使用 self,如示例 7-20 所示。 文件名:src/lib.rs use std::io::{self, Write}; 示例 7-20: 将示例 7-19 中部分重复的路径合并为一个 use 语句 这一行便将 std::io 和 std::io::Write 同时引入作用域。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 嵌套路径来消除大量的 use 行","id":"125","title":"嵌套路径来消除大量的 use 行"},"126":{"body":"如果希望将一个路径下 所有 公有项引入作用域,可以指定路径后跟 *,glob 运算符: use std::collections::*; 这个 use 语句将 std::collections 中定义的所有公有项引入当前作用域。使用 glob 运算符时请多加小心!Glob 会使得我们难以推导作用域中有什么名称和它们是在何处定义的。 glob 运算符经常用于测试模块 tests 中,这时会将所有内容引入作用域;我们将在第十一章 “如何编写测试” 部分讲解。glob 运算符有时也用于 prelude 模式;查看 标准库中的文档 了解这个模式的更多细节。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 通过 glob 运算符将所有的公有定义引入作用域","id":"126","title":"通过 glob 运算符将所有的公有定义引入作用域"},"127":{"body":"ch07-05-separating-modules-into-different-files.md commit 2b4565662d1a7973d870744a923f58f8f7dcce91 到目前为止,本章所有的例子都在一个文件中定义多个模块。当模块变得更大时,你可能想要将它们的定义移动到单独的文件中,从而使代码更容易阅读。 例如,我们从示例 7-17 中包含多个餐厅模块的代码开始。我们会将模块提取到各自的文件中,而不是将所有模块都定义到 crate 根文件中。在这里,crate 根文件是 src/lib.rs ,不过这个过程也适用于 crate 根文件是 src/main.rs 的二进制 crate。 首先将 front_of_house 模块提取到其自己的文件中。删除 front_of_house 模块的大括号中的代码,只留下 mod front_of_house; 声明,这样 src/lib.rs 会包含如示例 7-21 所示的代码。注意直到创建示例 7-22 中的 src/front_of_house.rs 文件之前代码都不能编译。 文件名:src/lib.rs mod front_of_house; pub use crate::front_of_house::hosting; pub fn eat_at_restaurant() { hosting::add_to_waitlist();\n} 示例 7-21: 声明 front_of_house 模块,其内容将位于 src/front_of_house.rs 接下来将之前大括号内的代码放入一个名叫 src/front_of_house.rs 的新文件中,如示例 7-22 所示。因为编译器找到了 crate 根中名叫 front_of_house 的模块声明,它就知道去搜寻这个文件。 文件名:src/front_of_house.rs pub mod hosting { pub fn add_to_waitlist() {}\n} 示例 7-22: 在 src/front_of_house.rs 中定义 front_of_house 模块 注意你只需在模块树中的某处使用一次 mod 声明就可以加载这个文件。一旦编译器知道了这个文件是项目的一部分(并且通过 mod 语句的位置知道了代码在模块树中的位置),项目中的其他文件应该使用其所声明的位置的路径来引用那个文件的代码,这在 “引用模块项目的路径” 部分有讲到。换句话说,mod 不是 你可能会在其他编程语言中看到的 \"include\" 操作。 接下来我们同样将 hosting 模块提取到自己的文件中。这个过程会有所不同,因为 hosting 是 front_of_house 的子模块而不是根模块。我们将 hosting 的文件放在与模块树中它的父级模块同名的目录中,在这里是 src/front_of_house/ 。 为了移动 hosting,修改 src/front_of_house.rs 使之仅包含 hosting 模块的声明。 文件名:src/front_of_house.rs pub mod hosting; 接着我们创建一个 src/front_of_house 目录和一个包含 hosting 模块定义的 hosting.rs 文件: 文件名:src/front_of_house/hosting.rs pub fn add_to_waitlist() {} 如果将 hosting.rs 放在 src 目录,编译器会认为 hosting 模块中的 hosting.rs 的代码声明于 crate 根,而不是声明为 front_of_house 的子模块。编译器所遵循的哪些文件对应哪些模块的代码的规则,意味着目录和文件更接近于模块树。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 将模块拆分成多个文件 » 将模块拆分成多个文件","id":"127","title":"将模块拆分成多个文件"},"128":{"body":"目前为止我们介绍了 Rust 编译器所最常用的文件路径;不过一种更老的文件路径也仍然是支持的。 对于声明于 crate 根的 front_of_house 模块,编译器会在如下位置查找模块代码: src/front_of_house.rs (我们所介绍的) src/front_of_house/mod.rs (老风格,不过仍然支持) 对于 front_of_house 的子模块 hosting,编译器会在如下位置查找模块代码: src/front_of_house/hosting.rs (我们所介绍的) src/front_of_house/hosting/mod.rs (老风格,不过仍然支持) 如果你对同一模块同时使用这两种路径风格,会得到一个编译错误。在同一项目中的不同模块混用不同的路径风格是允许的,不过这会使他人感到疑惑。 使用 mod.rs 这一文件名的风格的主要缺点是会导致项目中出现很多 mod.rs 文件,当你在编辑器中同时打开它们时会感到疑惑。 我们将各个模块的代码移动到独立文件了,同时模块树依旧相同。eat_at_restaurant 中的函数调用也无需修改继续保持有效,即便其定义存在于不同的文件中。这个技巧让你可以在模块代码增长时,将它们移动到新文件中。 注意, src/lib.rs 中的 pub use crate::front_of_house::hosting 语句也并未发生改变。use 也不会对哪些文件会被编译为 crate 的一部分有任何影响。mod 关键字声明了模块,而 Rust 会在与模块同名的文件中查找模块的代码。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 将模块拆分成多个文件 » 另一种文件路径","id":"128","title":"另一种文件路径"},"129":{"body":"Rust 提供了将包分成多个 crate,将 crate 分成模块,以及通过指定绝对或相对路径从一个模块引用另一个模块中定义的项的方式。你可以通过使用 use 语句将路径引入作用域,这样在多次使用时可以使用更短的路径。模块定义的代码默认是私有的,不过可以选择增加 pub 关键字使其定义变为公有。 接下来,让我们看看一些标准库提供的集合数据类型,你可以利用它们编写出漂亮整洁的代码。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 将模块拆分成多个文件 » 总结","id":"129","title":"总结"},"13":{"body":"ch01-01-installation.md commit d5eb2f7a8e9c6f51b4478f9cd46f55448e2ca2c1 第一步是安装 Rust。我们会通过 rustup 下载 Rust,这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要联网。 注意:如果你出于某些理由倾向于不使用 rustup,请到 Rust 的其他安装方法页面 查看其它安装选项。 接下来的步骤会安装最新的稳定版 Rust 编译器。Rust 的稳定性确保本书所有示例在最新版本的 Rust 中能够继续编译。不同版本的输出可能略有不同,因为 Rust 经常改进错误信息和警告。也就是说,任何通过这些步骤安装的最新稳定版 Rust,都应该能正常运行本书中的内容。","breadcrumbs":"入门指南 » 安装 » 安装","id":"13","title":"安装"},"130":{"body":"ch08-00-common-collections.md commit 1fd890031311612e54965f7f800a8c8bd4464663 Rust 标准库中包含一系列被称为 集合 ( collections )的非常有用的数据结构。大部分其他数据类型都代表一个特定的值,不过集合可以包含多个值。不同于内建的数组和元组类型,这些集合指向的数据是储存在堆上的,这意味着数据的数量不必在编译时就已知,并且还可以随着程序的运行增长或缩小。每种集合都有着不同功能和成本,而根据当前情况选择合适的集合,这是一项应当逐渐掌握的技能。在这一章里,我们将详细的了解三个在 Rust 程序中被广泛使用的集合: vector 允许我们一个挨着一个地储存一系列数量可变的值 字符串 ( string )是字符的集合。我们之前见过 String 类型,不过在本章我们将深入了解。 哈希 map ( hash map )允许我们将值与一个特定的键(key)相关联。这是一个叫做 map 的更通用的数据结构的特定实现。 对于标准库提供的其他类型的集合,请查看 文档 。 我们将讨论如何创建和更新 vector、字符串和哈希 map,以及它们有什么特别之处。","breadcrumbs":"常见集合 » 常见集合","id":"130","title":"常见集合"},"131":{"body":"ch08-01-vectors.md commit ac16184a7f56d17daa9c4c76901371085dc0ac43 我们要讲到的第一个类型是 Vec,也被称为 vector 。vector 允许我们在一个单独的数据结构中储存多于一个的值,它在内存中彼此相邻地排列所有的值。vector 只能储存相同类型的值。它们在拥有一系列项的场景下非常实用,例如文件中的文本行或是购物车中商品的价格。","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 使用 Vector 储存列表","id":"131","title":"使用 Vector 储存列表"},"132":{"body":"为了创建一个新的空 vector,可以调用 Vec::new 函数,如示例 8-1 所示: # fn main() { let v: Vec = Vec::new();\n# } 示例 8-1:新建一个空的 vector 来储存 i32 类型的值 注意这里我们增加了一个类型注解。因为没有向这个 vector 中插入任何值,Rust 并不知道我们想要储存什么类型的元素。这是一个非常重要的点。vector 是用泛型实现的,第十章会涉及到如何对你自己的类型使用它们。现在,所有你需要知道的就是 Vec 是一个由标准库提供的类型,它可以存放任何类型,而当 Vec 存放某个特定类型时,那个类型位于尖括号中。在示例 8-1 中,我们告诉 Rust v 这个 Vec 将存放 i32 类型的元素。 通常,我们会用初始值来创建一个 Vec 而 Rust 会推断出储存值的类型,所以很少会需要这些类型注解。为了方便 Rust 提供了 vec! 宏,这个宏会根据我们提供的值来创建一个新的 vector。示例 8-2 新建一个拥有值 1、2 和 3 的 Vec。推断为 i32 是因为这是默认整型类型,第三章的 “数据类型” 讨论过: # fn main() { let v = vec![1, 2, 3];\n# } 示例 8-2:新建一个包含初值的 vector 因为我们提供了 i32 类型的初始值,Rust 可以推断出 v 的类型是 Vec,因此类型注解就不是必须的。接下来让我们看看如何修改一个 vector。","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 新建 vector","id":"132","title":"新建 vector"},"133":{"body":"对于新建一个 vector 并向其增加元素,可以使用 push 方法,如示例 8-3 所示: # fn main() { let mut v = Vec::new(); v.push(5); v.push(6); v.push(7); v.push(8);\n# } 示例 8-3:使用 push 方法向 vector 增加值 如第三章中讨论的任何变量一样,如果想要能够改变它的值,必须使用 mut 关键字使其可变。放入其中的所有值都是 i32 类型的,而且 Rust 也根据数据做出如此判断,所以不需要 Vec 注解。","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 更新 vector","id":"133","title":"更新 vector"},"134":{"body":"有两种方法引用 vector 中储存的值:通过索引或使用 get 方法。在接下来的示例中,为了更加清楚的说明,我们已经标注了这些函数返回的值的类型。 示例 8-4 展示了访问 vector 中一个值的两种方式,索引语法或者 get 方法: # fn main() { let v = vec![1, 2, 3, 4, 5]; let third: &i32 = &v[2]; println!(\"The third element is {third}\"); let third: Option<&i32> = v.get(2); match third { Some(third) => println!(\"The third element is {third}\"), None => println!(\"There is no third element.\"), }\n# } 列表 8-4:使用索引语法或 get 方法来访问 vector 中的项 这里有几个细节需要注意。我们使用索引值 2 来获取第三个元素,因为索引是从数字 0 开始的。使用 & 和 [] 会得到一个索引位置元素的引用。当使用索引作为参数调用 get 方法时,会得到一个可以用于 match 的 Option<&T>。 Rust 提供了两种引用元素的方法的原因是当尝试使用现有元素范围之外的索引值时可以选择让程序如何运行。举个例子,让我们看看使用这个技术,尝试在当有一个 5 个元素的 vector 接着访问索引 100 位置的元素会发生什么,如示例 8-5 所示: # fn main() { let v = vec![1, 2, 3, 4, 5]; let does_not_exist = &v[100]; let does_not_exist = v.get(100);\n# } 示例 8-5:尝试访问一个包含 5 个元素的 vector 的索引 100 处的元素 当运行这段代码,你会发现对于第一个 [] 方法,当引用一个不存在的元素时 Rust 会造成 panic。这个方法更适合当程序认为尝试访问超过 vector 结尾的元素是一个严重错误的情况,这时应该使程序崩溃。 当 get 方法被传递了一个数组外的索引时,它不会 panic 而是返回 None。当偶尔出现超过 vector 范围的访问属于正常情况的时候可以考虑使用它。接着你的代码可以有处理 Some(&element) 或 None 的逻辑,如第六章讨论的那样。例如,索引可能来源于用户输入的数字。如果它们不慎输入了一个过大的数字那么程序就会得到 None 值,你可以告诉用户当前 vector 元素的数量并再请求它们输入一个有效的值。这就比因为输入错误而使程序崩溃要友好的多! 一旦程序获取了一个有效的引用,借用检查器将会执行所有权和借用规则(第四章讲到)来确保 vector 内容的这个引用和任何其他引用保持有效。回忆一下不能在相同作用域中同时存在可变和不可变引用的规则。这个规则适用于示例 8-6,当我们获取了 vector 的第一个元素的不可变引用并尝试在 vector 末尾增加一个元素的时候,如果尝试在函数的后面引用这个元素是行不通的: # fn main() { let mut v = vec![1, 2, 3, 4, 5]; let first = &v[0]; v.push(6); println!(\"The first element is: {first}\");\n# } 示例 8-6:在拥有 vector 中项的引用的同时向其增加一个元素 编译会给出这个错误: $ cargo run Compiling collections v0.1.0 (file:///projects/collections)\nerror[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable --> src/main.rs:6:5 |\n4 | let first = &v[0]; | - immutable borrow occurs here\n5 |\n6 | v.push(6); | ^^^^^^^^^ mutable borrow occurs here\n7 |\n8 | println!(\"The first element is: {first}\"); | ------- immutable borrow later used here For more information about this error, try `rustc --explain E0502`.\nerror: could not compile `collections` (bin \"collections\") due to 1 previous error 示例 8-6 中的代码看起来应该能够运行:为什么第一个元素的引用会关心 vector 结尾的变化?不能这么做的原因是由于 vector 的工作方式:在 vector 的结尾增加新元素时,在没有足够空间将所有元素依次相邻存放的情况下,可能会要求分配新内存并将老的元素拷贝到新的空间中。这时,第一个元素的引用就指向了被释放的内存。借用规则阻止程序陷入这种状况。 注意:关于 Vec 类型的更多实现细节,请查看 “The Rustonomicon”","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 读取 vector 的元素","id":"134","title":"读取 vector 的元素"},"135":{"body":"如果想要依次访问 vector 中的每一个元素,我们可以遍历其所有的元素而无需通过索引一次一个的访问。示例 8-7 展示了如何使用 for 循环来获取 i32 值的 vector 中的每一个元素的不可变引用并将其打印: # fn main() { let v = vec![100, 32, 57]; for i in &v { println!(\"{i}\"); }\n# } 示例 8-7:通过 for 循环遍历 vector 的元素并打印 我们也可以遍历可变 vector 的每一个元素的可变引用以便能改变它们。示例 8-8 中的 for 循环会给每一个元素加 50: # fn main() { let mut v = vec![100, 32, 57]; for i in &mut v { *i += 50; }\n# } 示例 8-8:遍历 vector 中元素的可变引用 为了修改可变引用所指向的值,在使用 += 运算符之前必须使用解引用运算符(*)获取 i 中的值。第十五章的 “通过解引用运算符追踪指针的值” 部分会详细介绍解引用运算符。 因为借用检查器的规则,无论可变还是不可变地遍历一个 vector 都是安全的。如果尝试在示例 8-7 和 示例 8-8 的 for 循环体内插入或删除项,都会得到一个类似示例 8-6 代码中类似的编译错误。for 循环中获取的 vector 引用阻止了同时对 vector 整体的修改。","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 遍历 vector 中的元素","id":"135","title":"遍历 vector 中的元素"},"136":{"body":"vector 只能储存相同类型的值。这是很不方便的;绝对会有需要储存一系列不同类型的值的用例。幸运的是,枚举的成员都被定义为相同的枚举类型,所以当需要在 vector 中储存不同类型值时,我们可以定义并使用一个枚举! 例如,假如我们想要从电子表格的一行中获取值,而这一行的有些列包含数字,有些包含浮点值,还有些是字符串。我们可以定义一个枚举,其成员会存放这些不同类型的值,同时所有这些枚举成员都会被当作相同类型:那个枚举的类型。接着可以创建一个储存枚举值的 vector,这样最终就能够储存不同类型的值了。示例 8-9 展示了其用例: # fn main() { enum SpreadsheetCell { Int(i32), Float(f64), Text(String), } let row = vec![ SpreadsheetCell::Int(3), SpreadsheetCell::Text(String::from(\"blue\")), SpreadsheetCell::Float(10.12), ];\n# } 示例 8-9:定义一个枚举,以便能在 vector 中存放不同类型的数据 Rust 在编译时必须确切知道 vector 中的类型,这样它才能确定在堆上需要为每个元素分配多少内存。我们还必须明确这个 vector 中允许的类型。如果 Rust 允许 vector 存储任意类型,那么可能会因为一个或多个类型在对 vector 元素执行操作时导致(类型相关)错误。使用枚举加上 match 表达式意味着 Rust 会在编译时确保每种可能的情况都得到处理,正如第六章讲到的那样。 如果在编写程序时不能确切无遗地知道运行时会储存进 vector 的所有类型,枚举技术就行不通了。相反,你可以使用 trait 对象,第十八章会讲到它。 现在我们了解了一些使用 vector 的最常见的方式,请一定去看看标准库中 Vec 定义的很多其他实用方法的 API 文档 。例如,除了 push 之外还有一个 pop 方法,它会移除并返回 vector 的最后一个元素。","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 使用枚举来储存多种类型","id":"136","title":"使用枚举来储存多种类型"},"137":{"body":"类似于任何其他的 struct,vector 在其离开作用域时会被释放,如示例 8-4 所标注的: # fn main() { { let v = vec![1, 2, 3, 4]; // do stuff with v } // <- v goes out of scope and is freed here\n# } 示例 8-10:展示 vector 和其元素于何处被丢弃 当 vector 被丢弃时,所有其内容也会被丢弃,这意味着这里它包含的整数将被清理。借用检查器确保了任何 vector 中内容的引用仅在 vector 本身有效时才可用。 让我们继续下一个集合类型:String!","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 丢弃 vector 时也会丢弃其所有元素","id":"137","title":"丢弃 vector 时也会丢弃其所有元素"},"138":{"body":"ch08-02-strings.md commit 668c64760b5c7ea654facb4ba5fe9faddfda27cc 第四章已经讲过一些字符串的内容,不过现在让我们更深入地了解它。字符串是新晋 Rustacean 们通常会被困住的领域,这是由于三方面理由的结合:Rust 倾向于确保暴露出可能的错误,字符串是比很多程序员所想象的要更为复杂的数据结构,以及 UTF-8。所有这些要素结合起来对于来自其他语言背景的程序员就可能显得很困难了。 在集合章节中讨论字符串的原因是,字符串就是作为字节的集合外加一些方法实现的,当这些字节被解释为文本时,这些方法提供了实用的功能。在这一部分,我们会讲到 String 中那些任何集合类型都有的操作,比如创建、更新和读取。也会讨论 String 与其他集合不一样的地方,例如索引 String 是很复杂的,由于人和计算机理解 String 数据方式的不同。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 使用字符串储存 UTF-8 编码的文本","id":"138","title":"使用字符串储存 UTF-8 编码的文本"},"139":{"body":"在开始深入这些方面之前,我们需要讨论一下术语 字符串 的具体意义。Rust 的核心语言中只有一种字符串类型:字符串 slice str,它通常以被借用的形式出现,&str。第四章讲到了 字符串 slices :它们是一些对储存在别处的 UTF-8 编码字符串数据的引用。举例来说,由于字符串字面值被储存在程序的二进制输出中,因此字符串字面值也是字符串 slices。 字符串(String)类型由 Rust 标准库提供,而不是编入核心语言,它是一种可增长、可变、可拥有、UTF-8 编码的字符串类型。当 Rustaceans 提及 Rust 中的 \"字符串 \"时,他们可能指的是 String 或 string slice &str 类型,而不仅仅是其中一种类型。虽然本节主要讨论 String,但这两种类型在 Rust 的标准库中都有大量使用,而且 String 和 字符串 slices 都是 UTF-8 编码的。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 什么是字符串?","id":"139","title":"什么是字符串?"},"14":{"body":"本章和全书中,我们会展示一些在终端中使用的命令。所有需要输入到终端的行都以 $ 开头。你不需要输入$字符;这里显示的$字符表示命令行提示符,仅用于提示每行命令的起点。不以 $ 起始的行通常展示前一个命令的输出。另外,PowerShell 专用的示例会采用 > 而不是 $。","breadcrumbs":"入门指南 » 安装 » 命令行标记","id":"14","title":"命令行标记"},"140":{"body":"很多 Vec 可用的操作在 String 中同样可用,事实上 String 被实现为一个带有一些额外保证、限制和功能的字节 vector 的封装。其中一个同样作用于 Vec 和 String 函数的例子是用来新建一个实例的 new 函数,如示例 8-11 所示。 # fn main() { let mut s = String::new();\n# } 示例 8-11:新建一个空的 String 这新建了一个叫做 s 的空的字符串,接着我们可以向其中装载数据。通常字符串会有初始数据,因为我们希望一开始就有这个字符串。为此,可以使用 to_string 方法,它能用于任何实现了 Display trait 的类型,比如字符串字面值。示例 8-12 展示了两个例子。 # fn main() { let data = \"initial contents\"; let s = data.to_string(); // 该方法也可直接用于字符串字面值: let s = \"initial contents\".to_string();\n# } 示例 8-12:使用 to_string 方法从字符串字面值创建 String 这些代码会创建包含 initial contents 的字符串。 也可以使用 String::from 函数来从字符串字面值创建 String。示例 8-13 中的代码等同于使用 to_string。 # fn main() { let s = String::from(\"initial contents\");\n# } 示例 8-13:使用 String::from 函数从字符串字面值创建 String 因为字符串应用广泛,这里有很多不同的用于字符串的通用 API 可供选择。其中一些可能看起来多余,不过都有其用武之地!在这个例子中,String::from 和 .to_string 最终做了完全相同的工作,所以如何选择就是代码风格与可读性的问题了。 记住字符串是 UTF-8 编码的,所以可以包含任何可以正确编码的数据,如示例 8-14 所示。 # fn main() { let hello = String::from(\"السلام عليكم\"); let hello = String::from(\"Dobrý den\"); let hello = String::from(\"Hello\"); let hello = String::from(\"שלום\"); let hello = String::from(\"नमस्ते\"); let hello = String::from(\"こんにちは\"); let hello = String::from(\"안녕하세요\"); let hello = String::from(\"你好\"); let hello = String::from(\"Olá\"); let hello = String::from(\"Здравствуйте\"); let hello = String::from(\"Hola\");\n# } 示例 8-14:在字符串中储存不同语言的问候语 所有这些都是有效的 String 值。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 新建字符串","id":"140","title":"新建字符串"},"141":{"body":"String 的大小可以增加,其内容也可以改变,就像可以放入更多数据来改变 Vec 的内容一样。另外,可以方便的使用 + 运算符或 format! 宏来拼接 String 值。 使用 push_str 和 push 附加字符串 可以通过 push_str 方法来附加字符串 slice,从而使 String 变长,如示例 8-15 所示。 # fn main() { let mut s = String::from(\"foo\"); s.push_str(\"bar\");\n# } 示例 8-15:使用 push_str 方法向 String 附加字符串 slice 执行这两行代码之后,s 将会包含 foobar。push_str 方法采用字符串 slice,因为我们并不需要获取参数的所有权。例如,示例 8-16 中我们希望在将 s2 的内容附加到 s1 之后还能使用它。 # fn main() { let mut s1 = String::from(\"foo\"); let s2 = \"bar\"; s1.push_str(s2); println!(\"s2 is {s2}\");\n# } 示例 8-16:将字符串 slice 的内容附加到 String 后使用它 如果 push_str 方法获取了 s2 的所有权,就不能在最后一行打印出其值了。好在代码如我们期望那样工作! push 方法被定义为获取一个单独的字符作为参数,并附加到 String 中。示例 8-17 展示了使用 push 方法将字母 \"l\" 加入 String 的代码。 # fn main() { let mut s = String::from(\"lo\"); s.push('l');\n# } 示例 8-17:使用 push 将一个字符加入 String 值中 执行这些代码之后,s 将会包含 “lol”。 使用 + 运算符或 format! 宏拼接字符串 通常你会希望将两个已知的字符串合并在一起。一种办法是像这样使用 + 运算符,如示例 8-18 所示。 # fn main() { let s1 = String::from(\"Hello, \"); let s2 = String::from(\"world!\"); let s3 = s1 + &s2; // 注意 s1 被移动了,不能继续使用\n# } 示例 8-18:使用 + 运算符将两个 String 值合并到一个新的 String 值中 执行完这些代码之后,字符串 s3 将会包含 Hello, world!。s1 在相加后不再有效的原因,和使用 s2 的引用的原因,与使用 + 运算符时调用的函数签名有关。+ 运算符使用了 add 函数,这个函数签名看起来像这样: fn add(self, s: &str) -> String { 在标准库中你会发现,add 的定义使用了泛型和关联类型。在这里我们替换为了具体类型,这也正是当使用 String 值调用这个方法会发生的。第十章会讨论泛型。这个签名提供了理解 + 运算那微妙部分的线索。 首先,s2 使用了 &,意味着我们使用第二个字符串的 引用 与第一个字符串相加。这是因为 add 函数的 s 参数:只能将 &str 和 String 相加,不能将两个 String 值相加。不过等一下 —— &s2 的类型是 &String, 而不是 add 第二个参数所指定的 &str。那么为什么示例 8-18 还能编译呢? 之所以能够在 add 调用中使用 &s2 是因为 &String 可以被 强转 ( coerced )成 &str。当add函数被调用时,Rust 使用了一个被称为 Deref 强制转换 ( deref coercion )的技术,你可以将其理解为它把 &s2 变成了 &s2[..]。第十五章会更深入的讨论 Deref 强制转换。因为 add 没有获取参数的所有权,所以 s2 在这个操作后仍然是有效的 String。 其次,可以发现签名中 add 获取了 self 的所有权,因为 self 没有 使用 &。这意味着示例 8-18 中的 s1 的所有权将被移动到 add 调用中,之后就不再有效。所以虽然 let s3 = s1 + &s2; 看起来就像它会复制两个字符串并创建一个新的字符串,而实际上这个语句会获取 s1 的所有权,附加上从 s2 中拷贝的内容,并返回结果的所有权。换句话说,它看起来好像生成了很多拷贝,不过实际上并没有:这个实现比拷贝要更高效。 如果想要级联多个字符串,+ 的行为就显得笨重了: # fn main() { let s1 = String::from(\"tic\"); let s2 = String::from(\"tac\"); let s3 = String::from(\"toe\"); let s = s1 + \"-\" + &s2 + \"-\" + &s3;\n# } 这时 s 的内容会是 “tic-tac-toe”。在有这么多 + 和 \" 字符的情况下,很难理解具体发生了什么。对于更为复杂的字符串链接,可以使用 format! 宏: # fn main() { let s1 = String::from(\"tic\"); let s2 = String::from(\"tac\"); let s3 = String::from(\"toe\"); let s = format!(\"{s1}-{s2}-{s3}\");\n# } 这些代码也会将 s 设置为 “tic-tac-toe”。format! 与 println! 的工作原理相同,不过不同于将输出打印到屏幕上,它返回一个带有结果内容的 String。这个版本就好理解的多,宏 format! 生成的代码使用引用所以不会获取任何参数的所有权。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 更新字符串","id":"141","title":"更新字符串"},"142":{"body":"在很多语言中,通过索引来引用字符串中的单独字符是有效且常见的操作。然而在 Rust 中,如果你尝试使用索引语法访问 String 的一部分,会出现一个错误。考虑一下如示例 8-19 中所示的无效代码。 # fn main() { let s1 = String::from(\"hello\"); let h = s1[0];\n# } 示例 8-19:尝试对字符串使用索引语法 这段代码会导致如下错误: $ cargo run Compiling collections v0.1.0 (file:///projects/collections)\nerror[E0277]: the type `str` cannot be indexed by `{integer}` --> src/main.rs:3:16 |\n3 | let h = s1[0]; | ^ string indices are ranges of `usize` | = help: the trait `SliceIndex` is not implemented for `{integer}`, which is required by `String: Index<_>` = note: you can use `.chars().nth()` or `.bytes().nth()` for more information, see chapter 8 in The Book: = help: the trait `SliceIndex<[_]>` is implemented for `usize` = help: for that trait implementation, expected `[_]`, found `str` = note: required for `String` to implement `Index<{integer}>` For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `collections` (bin \"collections\") due to 1 previous error 错误和提示说明了全部问题:Rust 的字符串不支持索引。那么接下来的问题是,为什么不支持呢?为了回答这个问题,我们必须先聊一聊 Rust 是如何在内存中储存字符串的。 内部表现 String 是一个 Vec 的封装。让我们看看示例 8-14 中一些正确编码的字符串的例子。首先是这一个: # fn main() {\n# let hello = String::from(\"السلام عليكم\");\n# let hello = String::from(\"Dobrý den\");\n# let hello = String::from(\"Hello\");\n# let hello = String::from(\"שלום\");\n# let hello = String::from(\"नमस्ते\");\n# let hello = String::from(\"こんにちは\");\n# let hello = String::from(\"안녕하세요\");\n# let hello = String::from(\"你好\");\n# let hello = String::from(\"Olá\");\n# let hello = String::from(\"Здравствуйте\"); let hello = String::from(\"Hola\");\n# } 在这里,len 的值是 4,这意味着储存字符串 “Hola” 的 Vec 的长度是四个字节:这里每一个字母的 UTF-8 编码都占用一个字节。那下面这个例子又如何呢?(注意这个字符串中的首字母是西里尔字母的 Ze 而不是数字 3。) # fn main() {\n# let hello = String::from(\"السلام عليكم\");\n# let hello = String::from(\"Dobrý den\");\n# let hello = String::from(\"Hello\");\n# let hello = String::from(\"שלום\");\n# let hello = String::from(\"नमस्ते\");\n# let hello = String::from(\"こんにちは\");\n# let hello = String::from(\"안녕하세요\");\n# let hello = String::from(\"你好\");\n# let hello = String::from(\"Olá\"); let hello = String::from(\"Здравствуйте\");\n# let hello = String::from(\"Hola\");\n# } 当问及这个字符是多长的时候有人可能会说是 12。然而,Rust 的回答是 24。这是使用 UTF-8 编码 “Здравствуйте” 所需要的字节数,这是因为每个 Unicode 标量值需要两个字节存储。因此一个字符串字节值的索引并不总是对应一个有效的 Unicode 标量值。作为演示,考虑如下无效的 Rust 代码: let hello = \"Здравствуйте\";\nlet answer = &hello[0]; 我们已经知道 answer 不是第一个字符 3。当使用 UTF-8 编码时,(西里尔字母的 Ze)З 的第一个字节是 208,第二个是 151,所以 answer 实际上应该是 208,不过 208 自身并不是一个有效的字母。返回 208 可不是一个请求字符串第一个字母的人所希望看到的,不过它是 Rust 在字节索引 0 位置所能提供的唯一数据。用户通常不会想要一个字节值被返回。即使这个字符串只有拉丁字母,如果 &\"hello\"[0] 是返回字节值的有效代码,它也会返回 104 而不是 h。 为了避免返回意外的值并造成不能立刻发现的 bug,Rust 根本不会编译这些代码,并在开发过程中及早杜绝了误会的发生。 字节、标量值和字形簇!天呐! 这引起了关于 UTF-8 的另外一个问题:从 Rust 的角度来讲,事实上有三种相关方式可以理解字符串:字节、标量值和字形簇(最接近人们眼中 字母 的概念)。 比如这个用梵文书写的印度语单词 “नमस्ते”,最终它储存在 vector 中的 u8 值看起来像这样: [224, 164, 168, 224, 164, 174, 224, 164, 184, 224, 165, 141, 224, 164, 164,\n224, 165, 135] 这里有 18 个字节,也就是计算机最终会储存的数据。如果从 Unicode 标量值的角度理解它们,也就像 Rust 的 char 类型那样,这些字节看起来像这样: ['न', 'म', 'स', '्', 'त', 'े'] 这里有六个 char,不过第四个和第六个都不是字母,它们是发音符号本身并没有任何意义。最后,如果以字形簇的角度理解,就会得到人们所说的构成这个单词的四个字母: [\"न\", \"म\", \"स्\", \"ते\"] Rust 提供了多种不同的方式来解释计算机储存的原始字符串数据,这样程序就可以选择它需要的表现方式,而无所谓是何种人类语言。 最后一个 Rust 不允许使用索引获取 String 字符的原因是,索引操作预期总是需要常数时间(O(1))。但是对于 String 不可能保证这样的性能,因为 Rust 必须从开头到索引位置遍历来确定有多少有效的字符。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 索引字符串","id":"142","title":"索引字符串"},"143":{"body":"索引字符串通常是一个坏点子,因为字符串索引应该返回的类型是不明确的:字节值、字符、字形簇或者字符串 slice。因此,如果你真的希望使用索引创建字符串 slice 时,Rust 会要求你更明确一些。为了更明确索引并表明你需要一个字符串 slice,相比使用 [] 和单个值的索引,可以使用 [] 和一个 range 来创建含特定字节的字符串 slice: let hello = \"Здравствуйте\"; let s = &hello[0..4]; 这里,s 会是一个 &str,它包含字符串的头四个字节。早些时候,我们提到了这些字母都是两个字节长的,所以这意味着 s 将会是 “Зд”。 如果获取 &hello[0..1] 会发生什么呢?答案是:Rust 在运行时会 panic,就跟访问 vector 中的无效索引时一样: $ cargo run Compiling collections v0.1.0 (file:///projects/collections) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s Running `target/debug/collections`\nthread 'main' panicked at src/main.rs:4:19:\nbyte index 1 is not a char boundary; it is inside 'З' (bytes 0..2) of `Здравствуйте`\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 你应该小心谨慎地使用这个操作,因为这么做可能会使你的程序崩溃。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 字符串 slice","id":"143","title":"字符串 slice"},"144":{"body":"操作字符串每一部分的最好的方法是明确表示需要字符还是字节。对于单独的 Unicode 标量值使用 chars 方法。对 “Зд” 调用 chars 方法会将其分开并返回两个 char 类型的值,接着就可以遍历其结果来访问每一个元素了: for c in \"Зд\".chars() { println!(\"{c}\");\n} 这些代码会打印出如下内容: З\nд 另外 bytes 方法返回每一个原始字节,这可能会适合你的使用场景: for b in \"Зд\".bytes() { println!(\"{b}\");\n} 这些代码会打印出组成 String 的 4 个字节: 208\n151\n208\n180 不过请记住有效的 Unicode 标量值可能会由不止一个字节组成。 从字符串中获取如同天城文这样的字形簇是很复杂的,所以标准库并没有提供这个功能。 crates.io 上有些提供这样功能的 crate。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 遍历字符串的方法","id":"144","title":"遍历字符串的方法"},"145":{"body":"总而言之,字符串还是很复杂的。不同的语言选择了不同的向程序员展示其复杂性的方式。Rust 选择了以准确的方式处理 String 数据作为所有 Rust 程序的默认行为,这意味着程序员们必须更多的思考如何预先处理 UTF-8 数据。这种权衡取舍相比其他语言更多的暴露出了字符串的复杂性,不过也使你在开发周期后期免于处理涉及非 ASCII 字符的错误。 好消息是标准库提供了很多围绕 String 和 &str 构建的功能,来帮助我们正确处理这些复杂场景。请务必查看这些使用方法的文档,例如 contains 来搜索一个字符串,和 replace 将字符串的一部分替换为另一个字符串。 称作 String 的类型是由标准库提供的,而没有写进核心语言部分,它是可增长的、可变的、有所有权的、UTF-8 编码的字符串类型。当 Rustacean 们谈到 Rust 的 “字符串”时,它们通常指的是 String 或字符串 slice &str 类型,而不特指其中某一个。虽然本部分内容大多是关于 String 的,不过这两个类型在 Rust 标准库中都被广泛使用,String 和字符串 slices 都是 UTF-8 编码的。 现在让我们转向一些不太复杂的集合:哈希 map!","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 字符串并不简单","id":"145","title":"字符串并不简单"},"146":{"body":"ch08-03-hash-maps.md commit 50775360ba3904c41e84176337ff47e6e7d6177c 最后介绍的常用集合类型是 哈希 map ( hash map )。HashMap 类型储存了一个键类型 K 对应一个值类型 V 的映射。它通过一个 哈希函数 ( hashing function )来实现映射,决定如何将键和值放入内存中。很多编程语言支持这种数据结构,不过通常有不同的名字:哈希、map、对象、哈希表或者关联数组,仅举几例。 哈希 map 可以用于需要任何类型作为键来寻找数据的情况,而不是像 vector 那样通过索引。例如,在一个游戏中,你可以将每个团队的分数记录到哈希 map 中,其中键是队伍的名字而值是每个队伍的分数。给出一个队名,就能得到他们的得分。 本章我们会介绍哈希 map 的基本 API,不过还有更多吸引人的功能隐藏于标准库在 HashMap 上定义的函数中。一如既往请查看标准库文档来了解更多信息。","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 使用 Hash Map 储存键值对","id":"146","title":"使用 Hash Map 储存键值对"},"147":{"body":"可以使用 new 创建一个空的 HashMap,并使用 insert 增加元素。在示例 8-20 中我们记录两支队伍的分数,分别是蓝队和黄队。蓝队开始有 10 分而黄队开始有 50 分: # fn main() { use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert(String::from(\"Blue\"), 10); scores.insert(String::from(\"Yellow\"), 50);\n# } 示例 8-20:新建一个哈希 map 并插入一些键值对 注意必须首先 use 标准库中集合部分的 HashMap。在这三个常用集合中,HashMap 是最不常用的,所以并没有被 prelude 自动引用。标准库中对 HashMap 的支持也相对较少,例如,并没有内建的构建宏。 像 vector 一样,哈希 map 将它们的数据储存在堆上,这个 HashMap 的键类型是 String 而值类型是 i32。类似于 vector,哈希 map 是同质的:所有的键必须是相同类型,值也必须都是相同类型。","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 新建一个哈希 map","id":"147","title":"新建一个哈希 map"},"148":{"body":"可以通过 get 方法并提供对应的键来从哈希 map 中获取值,如示例 8-21 所示: # fn main() { use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert(String::from(\"Blue\"), 10); scores.insert(String::from(\"Yellow\"), 50); let team_name = String::from(\"Blue\"); let score = scores.get(&team_name).copied().unwrap_or(0);\n# } 示例 8-21:访问哈希 map 中储存的蓝队分数 这里,score 是与蓝队分数相关的值,应为 10。get 方法返回 Option<&V>,如果某个键在哈希 map 中没有对应的值,get 会返回 None。程序中通过调用 copied 方法来获取一个 Option 而不是 Option<&i32>,接着调用 unwrap_or 在 scores 中没有该键所对应的项时将其设置为零。 可以使用与 vector 类似的方式来遍历哈希 map 中的每一个键值对,也就是 for 循环: # fn main() { use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert(String::from(\"Blue\"), 10); scores.insert(String::from(\"Yellow\"), 50); for (key, value) in &scores { println!(\"{key}: {value}\"); }\n# } 这会以任意顺序打印出每一个键值对: Yellow: 50\nBlue: 10","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 访问哈希 map 中的值","id":"148","title":"访问哈希 map 中的值"},"149":{"body":"对于像 i32 这样的实现了 Copy trait 的类型,其值可以拷贝进哈希 map。对于像 String 这样拥有所有权的值,其值将被移动而哈希 map 会成为这些值的所有者,如示例 8-22 所示: # fn main() { use std::collections::HashMap; let field_name = String::from(\"Favorite color\"); let field_value = String::from(\"Blue\"); let mut map = HashMap::new(); map.insert(field_name, field_value); // 这里 field_name 和 field_value 不再有效, // 尝试使用它们看看会出现什么编译错误!\n# } 示例 8-22:展示一旦键值对被插入后就为哈希 map 所拥有 当 insert 调用将 field_name 和 field_value 移动到哈希 map 中后,将不能使用这两个绑定。 如果将值的引用插入哈希 map,这些值本身将不会被移动进哈希 map。但是这些引用指向的值必须至少在哈希 map 有效时也是有效的。第十章 “生命周期确保引用有效” 部分将会更多的讨论这个问题。","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 哈希 map 和所有权","id":"149","title":"哈希 map 和所有权"},"15":{"body":"如果你使用 Linux 或 macOS,打开终端并输入如下命令: $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh 此命令下载一个脚本并开始安装 rustup 工具,这会安装最新稳定版 Rust。过程中可能会提示你输入密码。如果安装成功,将会出现如下内容: Rust is installed now. Great! 另外,你还需要一个 链接器(linker) ,这是 Rust 用来将其编译的输出连接到一个文件中的程序。很可能你已经有一个了。如果你遇到了链接器错误,请尝试安装一个 C 编译器,它通常包括一个链接器。C 编译器也很有用,因为一些常见的 Rust 包依赖于 C 代码,因此需要安装一个 C 编译器。 在 macOS 上,你可以通过运行以下命令获得 C 语言编译器: $ xcode-select --install Linux 用户通常需要根据发行版(distribution)文档安装 GCC 或 Clang。比如,如果你使用 Ubuntu,可以安装 build-essential 包。","breadcrumbs":"入门指南 » 安装 » 在 Linux 或 macOS 上安装 rustup","id":"15","title":"在 Linux 或 macOS 上安装 rustup"},"150":{"body":"尽管键值对的数量是可以增长的,每个唯一的键只能同时关联一个值(反之不一定成立:比如蓝队和黄队的 scores 哈希 map 中都可能存储有 10 这个值)。 当我们想要改变哈希 map 中的数据时,必须决定如何处理一个键已经有值了的情况。可以选择完全无视旧值并用新值代替旧值。可以选择保留旧值而忽略新值,并只在键 没有 对应值时增加新值。或者可以结合新旧两值。让我们看看这分别该如何处理! 覆盖一个值 如果我们插入了一个键值对,接着用相同的键插入一个不同的值,与这个键相关联的旧值将被替换。即便示例 8-23 中的代码调用了两次 insert,哈希 map 也只会包含一个键值对,因为两次都是对蓝队的键插入的值: # fn main() { use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert(String::from(\"Blue\"), 10); scores.insert(String::from(\"Blue\"), 25); println!(\"{scores:?}\");\n# } 示例 8-23:替换以特定键储存的值 这会打印出 {\"Blue\": 25}。原始的值 10 则被覆盖了。 只在键没有对应值时插入键值对 我们经常会检查某个特定的键是否已经存在于哈希 map 中并进行如下操作:如果哈希 map 中键已经存在则不做任何操作。如果不存在则连同值一块插入。 为此哈希 map 有一个特有的 API,叫做 entry,它获取我们想要检查的键作为参数。entry 函数的返回值是一个枚举,Entry,它代表了可能存在也可能不存在的值。比如说我们想要检查黄队的键是否关联了一个值。如果没有,就插入值 50,对于蓝队也是如此。使用 entry API 的代码看起来像示例 8-24 这样: # fn main() { use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert(String::from(\"Blue\"), 10); scores.entry(String::from(\"Yellow\")).or_insert(50); scores.entry(String::from(\"Blue\")).or_insert(50); println!(\"{scores:?}\");\n# } 示例 8-24:使用 entry 方法只在键没有对应一个值时插入 Entry 的 or_insert 方法在键对应的值存在时就返回这个值的可变引用,如果不存在则将参数作为新值插入并返回新值的可变引用。这比编写自己的逻辑要简明的多,另外也与借用检查器结合得更好。 运行示例 8-24 的代码会打印出 {\"Yellow\": 50, \"Blue\": 10}。第一个 entry 调用会插入黄队的键和值 50,因为黄队并没有一个值。第二个 entry 调用不会改变哈希 map 因为蓝队已经有了值 10。 根据旧值更新一个值 另一个常见的哈希 map 的应用场景是找到一个键对应的值并根据旧的值更新它。例如,示例 8-25 中的代码计数一些文本中每一个单词分别出现了多少次。我们使用哈希 map 以单词作为键并递增其值来记录我们遇到过几次这个单词。如果是第一次看到某个单词,就插入值 0。 # fn main() { use std::collections::HashMap; let text = \"hello world wonderful world\"; let mut map = HashMap::new(); for word in text.split_whitespace() { let count = map.entry(word).or_insert(0); *count += 1; } println!(\"{map:?}\");\n# } 示例 8-25:通过哈希 map 储存单词和计数来统计出现次数 这会打印出 {\"world\": 2, \"hello\": 1, \"wonderful\": 1}。你可能会看到相同的键值对以不同的顺序打印:回忆一下 “访问哈希 map 中的值” 部分中遍历哈希 map 会以任意顺序进行。 split_whitespace 方法返回一个由空格分隔 text 值子 slice 的迭代器。or_insert 方法返回这个键的值的一个可变引用(&mut V)。这里我们将这个可变引用储存在 count 变量中,所以为了赋值必须首先使用星号(*)解引用 count。这个可变引用在 for 循环的结尾离开作用域,这样所有这些改变都是安全的并符合借用规则。","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 更新哈希 map","id":"150","title":"更新哈希 map"},"151":{"body":"HashMap 默认使用一种叫做 SipHash 的哈希函数,它可以抵御涉及哈希表(hash table) [1] 的拒绝服务(Denial of Service, DoS)攻击。然而这并不是可用的最快的算法,不过为了更高的安全性值得付出一些性能的代价。如果性能监测显示此哈希函数非常慢,以致于你无法接受,你可以指定一个不同的 hasher 来切换为其它函数。hasher 是一个实现了 BuildHasher trait 的类型。第十章会讨论 trait 和如何实现它们。你并不需要从头开始实现你自己的 hasher; crates.io 有其他人分享的实现了许多常用哈希算法的 hasher 的库。 https://en.wikipedia.org/wiki/SipHash","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 哈希函数","id":"151","title":"哈希函数"},"152":{"body":"vector、字符串和哈希 map 会在你的程序需要储存、访问和修改数据时帮助你。这里有一些你应该能够解决的练习问题: 给定一系列数字,使用 vector 并返回这个列表的中位数(排列数组后位于中间的值)和众数(出现次数最多的值;在这里哈希 map 会很有帮助)。 将字符串转换为 Pig Latin,也就是每一个单词的第一个辅音字母被移动到单词的结尾并增加 “ay”,所以 “first” 会变成 “irst-fay”。元音字母开头的单词则在结尾增加 “hay”(“apple” 会变成 “apple-hay”)。牢记 UTF-8 编码! 使用哈希 map 和 vector,创建一个文本接口来允许用户向公司的部门中增加员工的名字。例如,“Add Sally to Engineering” 或 “Add Amir to Sales”。接着让用户获取一个部门的所有员工的列表,或者公司每个部门的所有员工按照字典序排列的列表。 标准库 API 文档中描述的这些类型的方法将有助于你进行这些练习! 我们已经开始接触可能会有失败操作的复杂程序了,这也意味着接下来是一个了解错误处理的绝佳时机!","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 总结","id":"152","title":"总结"},"153":{"body":"ch09-00-error-handling.md commit 199ca99926f232ee7f581a917eada4b65ff21754 错误是软件中不可否认的事实,所以 Rust 有一些处理出错情况的特性。在许多情况下,Rust 要求你承认错误的可能性,并在你的代码编译前采取一些行动。这一要求使你的程序更加健壮,因为它可以确保你在将代码部署到生产环境之前就能发现错误并进行适当的处理。 Rust 将错误分为两大类: 可恢复的 ( recoverable )和 不可恢复的 ( unrecoverable )错误。对于一个可恢复的错误,比如文件未找到的错误,我们很可能只想向用户报告问题并重试操作。不可恢复的错误总是 bug 出现的征兆,比如试图访问一个超过数组末端的位置,因此我们要立即停止程序。 大多数语言并不区分这两种错误,并采用类似异常这样方式统一处理它们。Rust 没有异常。相反,它有 Result 类型,用于处理可恢复的错误,还有 panic! 宏,在程序遇到不可恢复的错误时停止执行。本章首先介绍 panic! 调用,接着会讲到如何返回 Result。此外,我们将探讨在决定是尝试从错误中恢复还是停止执行时的注意事项。","breadcrumbs":"错误处理 » 错误处理","id":"153","title":"错误处理"},"154":{"body":"ch09-01-unrecoverable-errors-with-panic.md commit 2921743516b3e2c0f45a95390e7b536e42f4af7c 突然有一天,代码出问题了,而你对此束手无策。对于这种情况,Rust 有 panic!宏。在实践中有两种方法造成 panic:执行会造成代码 panic 的操作(比如访问超过数组结尾的内容)或者显式调用 panic! 宏。这两种情况都会使程序 panic。通常情况下这些 panic 会打印出一个错误信息,展开并清理栈数据,然后退出。通过一个环境变量,你也可以让 Rust 在 panic 发生时打印调用堆栈(call stack)以便于定位 panic 的原因。","breadcrumbs":"错误处理 » 用 panic! 处理不可恢复的错误 » 用 panic! 处理不可恢复的错误","id":"154","title":"用 panic! 处理不可恢复的错误"},"155":{"body":"当出现 panic 时,程序默认会开始 展开 ( unwinding ),这意味着 Rust 会回溯栈并清理它遇到的每一个函数的数据,不过这个回溯并清理的过程有很多工作。另一种选择是直接 终止 ( abort ),这会不清理数据就退出程序。 那么程序所使用的内存需要由操作系统来清理。如果你需要项目的最终二进制文件越小越好,panic 时通过在 Cargo.toml 的 [profile] 部分增加 panic = 'abort',可以由展开切换为终止。例如,如果你想要在 release 模式中 panic 时直接终止: [profile.release]\npanic = 'abort' 让我们在一个简单的程序中调用 panic!: 文件名:src/main.rs fn main() { panic!(\"crash and burn\");\n} 运行程序将会出现类似这样的输出: $ cargo run Compiling panic v0.1.0 (file:///projects/panic) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.25s Running `target/debug/panic`\nthread 'main' panicked at src/main.rs:2:5:\ncrash and burn\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 最后两行包含 panic! 调用造成的错误信息。第一行显示了 panic 提供的信息并指明了源码中 panic 出现的位置: src/main.rs:2:5 表明这是 src/main.rs 文件的第二行第五个字符。 在这个例子中,被指明的那一行是我们代码的一部分,而且查看这一行的话就会发现 panic! 宏的调用。在其他情况下,panic! 可能会出现在我们的代码所调用的代码中。错误信息报告的文件名和行号可能指向别人代码中的 panic! 宏调用,而不是我们代码中最终导致 panic! 的那一行。我们可以使用 panic! 被调用的函数的 backtrace 来寻找代码中出问题的地方。下面我们会详细介绍 backtrace 是什么。","breadcrumbs":"错误处理 » 用 panic! 处理不可恢复的错误 » 对应 panic 时的栈展开或终止","id":"155","title":"对应 panic 时的栈展开或终止"},"156":{"body":"让我们来看看另一个因为我们代码中的 bug 引起的别的库中 panic! 的例子,而不是直接的宏调用。示例 9-1 有一些尝试通过索引访问 vector 中元素的例子: 文件名:src/main.rs fn main() { let v = vec![1, 2, 3]; v[99];\n} 示例 9-1:尝试访问超越 vector 结尾的元素,这会造成 panic! 这里尝试访问 vector 的第一百个元素(这里的索引是 99 因为索引从 0 开始),不过它只有三个元素。这种情况下 Rust 会 panic。[] 应当返回一个元素,不过如果传递了一个无效索引,就没有可供 Rust 返回的正确的元素。 C 语言中,尝试读取数据结构之后的值是未定义行为(undefined behavior)。你会得到任何对应数据结构中这个元素的内存位置的值,甚至是这些内存并不属于这个数据结构的情况。这被称为 缓冲区溢出 ( buffer overread ),并可能会导致安全漏洞,比如攻击者可以像这样操作索引来读取储存在数据结构之后不被允许的数据。 为了保护程序远离这类漏洞,如果尝试读取一个索引不存在的元素,Rust 会停止执行并拒绝继续。尝试运行上面的程序会出现如下输出: $ cargo run Compiling panic v0.1.0 (file:///projects/panic) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.27s Running `target/debug/panic`\nthread 'main' panicked at src/main.rs:4:6:\nindex out of bounds: the len is 3 but the index is 99\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 错误指向 main.rs 的第 4 行,这里我们尝试访问索引 99。下面的说明(note)行提醒我们可以设置 RUST_BACKTRACE 环境变量来得到一个 backtrace。 backtrace 是一个执行到目前位置所有被调用的函数的列表。Rust 的 backtrace 跟其他语言中的一样:阅读 backtrace 的关键是从头开始读直到发现你编写的文件。这就是问题的发源地。这一行往上是你的代码所调用的代码;往下则是调用你的代码的代码。这些行可能包含核心 Rust 代码,标准库代码或用到的 crate 代码。让我们将 RUST_BACKTRACE 环境变量设置为任何不是 0 的值来获取 backtrace 看看。示例 9-2 展示了与你看到类似的输出: $ RUST_BACKTRACE=1 cargo run\nthread 'main' panicked at 'index out of bounds: the len is 3 but the index is 99', src/main.rs:4:5\nstack backtrace: 0: rust_begin_unwind at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/std/src/panicking.rs:584:5 1: core::panicking::panic_fmt at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/panicking.rs:142:14 2: core::panicking::panic_bounds_check at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/panicking.rs:84:5 3: >::index at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/slice/index.rs:242:10 4: core::slice::index:: for [T]>::index at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/slice/index.rs:18:9 5: as core::ops::index::Index>::index at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/alloc/src/vec/mod.rs:2591:9 6: panic::main at ./src/main.rs:4:5 7: core::ops::function::FnOnce::call_once at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/ops/function.rs:248:5\nnote: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. 示例 9-2:当设置 RUST_BACKTRACE 环境变量时 panic! 调用所生成的 backtrace 信息 这里有大量的输出!你实际看到的输出可能因不同的操作系统和 Rust 版本而有所不同。为了获取带有这些信息的 backtrace,必须启用 debug 标识。当不使用 --release 参数运行 cargo build 或 cargo run 时 debug 标识会默认启用,就像这里一样。 示例 9-2 的输出中,backtrace 的 12 行指向了我们项目中造成问题的行: src/main.rs 的第 4 行。如果你不希望程序 panic,第一个提到我们编写的代码行的位置是你应该开始调查的,以便查明是什么值如何在这个地方引起了 panic。在示例 9-1 中,我们故意编写会 panic 的代码来演示如何使用 backtrace,修复这个 panic 的方法就是不要尝试在一个只包含三个项的 vector 中请求索引是 100 的元素。当将来你的代码出现了 panic,你需要搞清楚在这特定的场景下代码中执行了什么操作和什么值导致了 panic,以及应当如何处理才能避免这个问题。 本章后面的小节 “要不要 panic!” 会再次回到 panic! 并讲解何时应该、何时不应该使用 panic! 来处理错误情况。接下来,我们来看看如何使用 Result 来从错误中恢复。","breadcrumbs":"错误处理 » 用 panic! 处理不可恢复的错误 » 使用 panic! 的 backtrace","id":"156","title":"使用 panic! 的 backtrace"},"157":{"body":"ch09-02-recoverable-errors-with-result.md commit 699adc6f5cb76f6e9d567ff0a57d8a844ac07a88 大部分错误并没有严重到需要程序完全停止执行。有时候,一个函数失败,仅仅就是因为一个容易理解和响应的原因。例如,如果因为打开一个并不存在的文件而失败,此时我们可能想要创建这个文件,而不是终止进程。 回忆一下第二章 “使用 Result 类型来处理潜在的错误” 部分中的那个 Result 枚举,它定义有如下两个成员,Ok 和 Err: enum Result { Ok(T), Err(E),\n} T 和 E 是泛型类型参数;第十章会详细介绍泛型。现在你需要知道的就是 T 代表成功时返回的 Ok 成员中的数据的类型,而 E 代表失败时返回的 Err 成员中的错误的类型。因为 Result 有这些泛型类型参数,我们可以将 Result 类型和标准库中为其定义的函数用于很多不同的场景,这些情况中需要返回的成功值和失败值可能会各不相同。 让我们调用一个返回 Result 的函数,因为它可能会失败:如示例 9-3 所示打开一个文件: 文件名:src/main.rs use std::fs::File; fn main() { let greeting_file_result = File::open(\"hello.txt\");\n} 示例 9-3:打开文件 File::open 的返回值是 Result。泛型参数 T 会被 File::open 的实现放入成功返回值的类型 std::fs::File,这是一个文件句柄。错误返回值使用的 E 的类型是 std::io::Error。这些返回类型意味着 File::open 调用可能成功并返回一个可以读写的文件句柄。这个函数调用也可能会失败:例如,也许文件不存在,或者可能没有权限访问这个文件。File::open 函数需要一个方法在告诉我们成功与否的同时返回文件句柄或者错误信息。这些信息正好是 Result 枚举所代表的。 当 File::open 成功时,greeting_file_result 变量将会是一个包含文件句柄的 Ok 实例。当失败时,greeting_file_result 变量将会是一个包含了更多关于发生了何种错误的信息的 Err 实例。 我们需要在示例 9-3 的代码中增加根据 File::open 返回值进行不同处理的逻辑。示例 9-4 展示了一个使用基本工具处理 Result 的例子:第六章学习过的 match 表达式。 文件名:src/main.rs use std::fs::File; fn main() { let greeting_file_result = File::open(\"hello.txt\"); let greeting_file = match greeting_file_result { Ok(file) => file, Err(error) => panic!(\"Problem opening the file: {error:?}\"), };\n} 示例 9-4:使用 match 表达式处理可能会返回的 Result 成员 注意与 Option 枚举一样,Result 枚举和其成员也被导入到了 prelude 中,所以就不需要在 match 分支中的 Ok 和 Err 之前指定 Result::。 这里我们告诉 Rust 当结果是 Ok 时,返回 Ok 成员中的 file 值,然后将这个文件句柄赋值给变量 greeting_file。match 之后,我们可以利用这个文件句柄来进行读写。 match 的另一个分支处理从 File::open 得到 Err 值的情况。在这种情况下,我们选择调用 panic! 宏。如果当前目录没有一个叫做 hello.txt 的文件,当运行这段代码时会看到如下来自 panic! 宏的输出: $ cargo run Compiling error-handling v0.1.0 (file:///projects/error-handling) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.73s Running `target/debug/error-handling`\nthread 'main' panicked at src/main.rs:8:23:\nProblem opening the file: Os { code: 2, kind: NotFound, message: \"No such file or directory\" }\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 一如既往,此输出准确地告诉了我们到底出了什么错。","breadcrumbs":"错误处理 » 用 Result 处理可恢复的错误 » 用 Result 处理可恢复的错误","id":"157","title":"用 Result 处理可恢复的错误"},"158":{"body":"示例 9-4 中的代码不管 File::open 是因为什么原因失败都会 panic!。我们真正希望的是对不同的错误原因采取不同的行为:如果 File::open 因为文件不存在而失败,我们希望创建这个文件并返回新文件的句柄。如果 File::open 因为任何其他原因失败,例如没有打开文件的权限,我们仍然希望像示例 9-4 那样 panic!。让我们看看示例 9-5,其中 match 增加了另一个分支: 文件名:src/main.rs use std::fs::File;\nuse std::io::ErrorKind; fn main() { let greeting_file_result = File::open(\"hello.txt\"); let greeting_file = match greeting_file_result { Ok(file) => file, Err(error) => match error.kind() { ErrorKind::NotFound => match File::create(\"hello.txt\") { Ok(fc) => fc, Err(e) => panic!(\"Problem creating the file: {e:?}\"), }, other_error => { panic!(\"Problem opening the file: {other_error:?}\"); } }, };\n} 示例 9-5:使用不同的方式处理不同类型的错误 File::open 返回的 Err 成员中的值类型 io::Error,它是一个标准库中提供的结构体。这个结构体有一个返回 io::ErrorKind 值的 kind 方法可供调用。io::ErrorKind 是一个标准库提供的枚举,它的成员对应 io 操作可能导致的不同错误类型。我们感兴趣的成员是 ErrorKind::NotFound,它代表尝试打开的文件并不存在。这样,match 就匹配完 greeting_file_result 了,不过对于 error.kind() 还有一个内层 match。 我们希望在内层 match 中检查的条件是 error.kind() 的返回值是否为 ErrorKind的 NotFound 成员。如果是,则尝试通过 File::create 创建文件。然而因为 File::create 也可能会失败,还需要增加一个内层 match 语句。当文件不能被创建,会打印出一个不同的错误信息。外层 match 的最后一个分支保持不变,这样对任何除了文件不存在的错误会使程序 panic。 不同于使用 match 和 Result 这里有好多 match!match 确实很强大,不过也非常的原始。第十三章我们会介绍闭包(closure),它会和定义在 Result 中的很多方法一起使用。在处理代码中的 Result 值时,相比于使用 match ,使用这些方法会更加简洁。 例如,这是另一个编写与示例 9-5 逻辑相同但是使用闭包和 unwrap_or_else 方法的例子: use std::fs::File;\nuse std::io::ErrorKind; fn main() { let greeting_file = File::open(\"hello.txt\").unwrap_or_else(|error| { if error.kind() == ErrorKind::NotFound { File::create(\"hello.txt\").unwrap_or_else(|error| { panic!(\"Problem creating the file: {:?}\", error); }) } else { panic!(\"Problem opening the file: {:?}\", error); } });\n} 虽然这段代码有着如示例 9-5 一样的行为,但并没有包含任何 match 表达式且更容易阅读。在阅读完第十三章后再回到这个例子,并查看标准库文档 unwrap_or_else 方法都做了什么操作。在处理错误时,还有很多这类方法可以消除大量嵌套的 match 表达式。","breadcrumbs":"错误处理 » 用 Result 处理可恢复的错误 » 匹配不同的错误","id":"158","title":"匹配不同的错误"},"159":{"body":"match 能够胜任它的工作,不过它可能有点冗长并且不总是能很好的表明其意图。Result 类型定义了很多辅助方法来处理各种情况。其中之一叫做 unwrap,它的实现就类似于示例 9-4 中的 match 语句。如果 Result 值是成员 Ok,unwrap 会返回 Ok 中的值。如果 Result 是成员 Err,unwrap 会为我们调用 panic!。这里是一个实践 unwrap 的例子: 文件名:src/main.rs use std::fs::File; fn main() { let greeting_file = File::open(\"hello.txt\").unwrap();\n} 如果调用这段代码时不存在 hello.txt 文件,我们将会看到一个 unwrap 调用 panic! 时提供的错误信息: thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os {\ncode: 2, kind: NotFound, message: \"No such file or directory\" }',\nsrc/main.rs:4:49 还有另一个类似于 unwrap 的方法它还允许我们选择 panic! 的错误信息:expect。使用 expect 而不是 unwrap 并提供一个好的错误信息可以表明你的意图并更易于追踪 panic 的根源。expect 的语法看起来像这样: 文件名:src/main.rs use std::fs::File; fn main() { let greeting_file = File::open(\"hello.txt\") .expect(\"hello.txt should be included in this project\");\n} expect 与 unwrap 的使用方式一样:返回文件句柄或调用 panic! 宏。expect 在调用 panic! 时使用的错误信息将是我们传递给 expect 的参数,而不像 unwrap 那样使用默认的 panic! 信息。它看起来像这样: thread 'main' panicked at 'hello.txt should be included in this project: Error\n{ repr: Os { code: 2, message: \"No such file or directory\" } }',\nsrc/libcore/result.rs:906:4 在生产级别的代码中,大部分 Rustaceans 选择 expect 而不是 unwrap 并提供更多关于为何操作期望是一直成功的上下文。如此如果该假设真的被证明是错的,你也有更多的信息来用于调试。","breadcrumbs":"错误处理 » 用 Result 处理可恢复的错误 » 失败时 panic 的简写:unwrap 和 expect","id":"159","title":"失败时 panic 的简写:unwrap 和 expect"},"16":{"body":"在 Windows 上,前往 https://www.rust-lang.org/install.html 并按照说明安装 Rust。在安装过程的某个步骤,你会被提示要安装 Visual Studio。它提供了一个链接器和编译程序所需的原生库。如果你在此步骤需要更多帮助,请访问 https://rust-lang.github.io/rustup/installation/windows-msvc.html 。 本书的余下部分会使用能同时运行于 cmd.exe 和 PowerShell 的命令。如果存在特定差异,我们会解释使用哪一个。","breadcrumbs":"入门指南 » 安装 » 在 Windows 上安装 rustup","id":"16","title":"在 Windows 上安装 rustup"},"160":{"body":"当编写一个其实先会调用一些可能会失败的操作的函数时,除了在这个函数中处理错误外,还可以选择让调用者知道这个错误并决定该如何处理。这被称为 传播 ( propagating )错误,这样能更好的控制代码调用,因为比起你代码所拥有的上下文,调用者可能拥有更多信息或逻辑来决定应该如何处理错误。 例如,示例 9-6 展示了一个从文件中读取用户名的函数。如果文件不存在或不能读取,这个函数会将这些错误返回给调用它的代码: 文件名:src/main.rs use std::fs::File;\nuse std::io::{self, Read}; fn read_username_from_file() -> Result { let username_file_result = File::open(\"hello.txt\"); let mut username_file = match username_file_result { Ok(file) => file, Err(e) => return Err(e), }; let mut username = String::new(); match username_file.read_to_string(&mut username) { Ok(_) => Ok(username), Err(e) => Err(e), }\n} 示例 9-6:一个函数使用 match 将错误返回给代码调用者 这个函数可以编写成更加简短的形式,不过我们以大量手动处理开始以便探索错误处理;在最后我们会展示更短的形式。让我们看看函数的返回值:Result。这意味着函数返回一个 Result 类型的值,其中泛型参数 T 的具体类型是 String,而 E 的具体类型是 io::Error。 如果这个函数没有出任何错误成功返回,函数的调用者会收到一个包含 String 的 Ok 值 —— 函数从文件中读取到的用户名。如果函数遇到任何错误,函数的调用者会收到一个 Err 值,它储存了一个包含更多这个问题相关信息的 io::Error 实例。这里选择 io::Error 作为函数的返回值是因为它正好是函数体中那两个可能会失败的操作的错误返回值:File::open 函数和 read_to_string 方法。 函数体以调用 File::open 函数开始。接着使用 match 处理返回值 Result,类似示例 9-4,如果 File::open 成功了,模式变量 file 中的文件句柄就变成了可变变量 username_file 中的值,接着函数继续执行。在 Err 的情况下,我们没有调用 panic!,而是使用 return 关键字提前结束整个函数,并将来自 File::open 的错误值(现在在模式变量 e 中)作为函数的错误值传回给调用者。 所以,如果在 username_file 中有一个文件句柄,该函数随后会在变量 username 中创建一个新的 String 并调用文件句柄 username_file 上的 read_to_string 方法,以将文件的内容读入 username。read_to_string 方法也返回一个 Result,因为它可能会失败,哪怕是 File::open 已经成功了。因此,我们需要另一个 match 来处理这个 Result:如果 read_to_string 执行成功,那么这个函数也就成功了,我们将从文件中读取的用户名返回,此时用户名位于被封装进 Ok 的 username 中。如果 read_to_string 执行失败,则像之前处理 File::open 的返回值的 match 那样返回错误值。然而,我们无需显式调用 return 语句,因为这是函数的最后一个表达式。 调用这个函数的代码最终会得到一个包含用户名的 Ok 值,或者一个包含 io::Error 的 Err 值。我们无从得知调用者会如何处理这些值。例如,如果他们得到了一个 Err 值,他们可能会选择 panic! 并使程序崩溃、使用一个默认的用户名或者从文件之外的地方寻找用户名。我们没有足够的信息知晓调用者具体会如何尝试,所以将所有的成功或失败信息向上传播,让他们选择合适的处理方法。 这种传播错误的模式在 Rust 是如此的常见,以至于 Rust 提供了 ? 问号运算符来使其更易于处理。","breadcrumbs":"错误处理 » 用 Result 处理可恢复的错误 » 传播错误","id":"160","title":"传播错误"},"161":{"body":"示例 9-7 展示了一个 read_username_from_file 的实现,它实现了与示例 9-6 中的代码相同的功能,不过这个实现使用了 ? 运算符: 文件名:src/main.rs use std::fs::File;\nuse std::io::{self, Read}; fn read_username_from_file() -> Result { let mut username_file = File::open(\"hello.txt\")?; let mut username = String::new(); username_file.read_to_string(&mut username)?; Ok(username)\n} 示例 9-7:一个使用 ? 运算符向调用者返回错误的函数 Result 值之后的 ? 被定义为与示例 9-6 中定义的处理 Result 值的 match 表达式有着完全相同的工作方式。如果 Result 的值是 Ok,这个表达式将会返回 Ok 中的值而程序将继续执行。如果值是 Err,Err 将作为整个函数的返回值,就好像使用了 return 关键字一样,这样错误值就被传播给了调用者。 示例 9-6 中的 match 表达式与 ? 运算符所做的有一点不同:? 运算符所使用的错误值被传递给了 from 函数,它定义于标准库的 From trait 中,其用来将错误从一种类型转换为另一种类型。当 ? 运算符调用 from 函数时,收到的错误类型被转换为由当前函数返回类型所指定的错误类型。这在当函数返回单个错误类型来代表所有可能失败的方式时很有用,即使其可能会因很多种原因失败。 例如,我们可以将示例 9-7 中的 read_username_from_file 函数修改为返回一个自定义的 OurError 错误类型。如果我们也定义了 impl From for OurError 来从 io::Error 构造一个 OurError 实例,那么 read_username_from_file 函数体中的 ? 运算符调用会调用 from 并转换错误而无需在函数中增加任何额外的代码。 在示例 9-7 的上下文中,File::open 调用结尾的 ? 会将 Ok 中的值返回给变量 username_file。如果发生了错误,? 运算符会使整个函数提前返回并将任何 Err 值返回给调用代码。同理也适用于 read_to_string 调用结尾的 ?。 ? 运算符消除了大量样板代码并使得函数的实现更简单。我们甚至可以在 ? 之后直接使用链式方法调用来进一步缩短代码,如示例 9-8 所示: 文件名:src/main.rs use std::fs::File;\nuse std::io::{self, Read}; fn read_username_from_file() -> Result { let mut username = String::new(); File::open(\"hello.txt\")?.read_to_string(&mut username)?; Ok(username)\n} 示例 9-8:问号运算符之后的链式方法调用 在 username 中创建新的 String 被放到了函数开头;这一部分没有变化。我们对 File::open(\"hello.txt\")? 的结果直接链式调用了 read_to_string,而不再创建变量 username_file。仍然需要 read_to_string 调用结尾的 ?,而且当 File::open 和 read_to_string 都成功没有失败时返回包含用户名 username 的 Ok 值。其功能再一次与示例 9-6 和示例 9-7 保持一致,不过这是一个与众不同且更符合工程学(ergonomic)的写法。 示例 9-9 展示了一个使用 fs::read_to_string 的更为简短的写法: 文件名:src/main.rs use std::fs;\nuse std::io; fn read_username_from_file() -> Result { fs::read_to_string(\"hello.txt\")\n} 示例 9-9: 使用 fs::read_to_string 而不是打开后读取文件 将文件读取到一个字符串是相当常见的操作,所以 Rust 提供了名为 fs::read_to_string 的函数,它会打开文件、新建一个 String、读取文件的内容,并将内容放入 String,接着返回它。当然,这样做就没有展示所有这些错误处理的机会了,所以我们最初就选择了艰苦的道路。","breadcrumbs":"错误处理 » 用 Result 处理可恢复的错误 » 传播错误的简写:? 运算符","id":"161","title":"传播错误的简写:? 运算符"},"162":{"body":"? 运算符只能被用于返回值与 ? 作用的值相兼容的函数。因为 ? 运算符被定义为从函数中提早返回一个值,这与示例 9-6 中的 match 表达式有着完全相同的工作方式。示例 9-6 中 match 作用于一个 Result 值,提早返回的分支返回了一个 Err(e) 值。函数的返回值必须是 Result 才能与这个 return 相兼容。 在示例 9-10 中,让我们看看在返回值不兼容的 main 函数中使用 ? 运算符会得到什么错误: 文件名:src/main.rs use std::fs::File; fn main() { let greeting_file = File::open(\"hello.txt\")?;\n} 示例 9-10: 尝试在返回 () 的 main 函数中使用 ? 的代码不能编译 这段代码打开一个文件,这可能会失败。? 运算符作用于 File::open 返回的 Result 值,不过 main 函数的返回类型是 () 而不是 Result。当编译这些代码,会得到如下错误信息: $ cargo run Compiling error-handling v0.1.0 (file:///projects/error-handling)\nerror[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`) --> src/main.rs:4:48 |\n3 | fn main() { | --------- this function should return `Result` or `Option` to accept `?`\n4 | let greeting_file = File::open(\"hello.txt\")?; | ^ cannot use the `?` operator in a function that returns `()` | = help: the trait `FromResidual>` is not implemented for `()`\nhelp: consider adding return type |\n3 ~ fn main() -> Result<(), Box> {\n4 | let greeting_file = File::open(\"hello.txt\")?;\n5 + 6 + Ok(())\n7 + } | For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `error-handling` (bin \"error-handling\") due to 1 previous error 这个错误指出只能在返回 Result 或者其它实现了 FromResidual 的类型的函数中使用 ? 运算符。 为了修复这个错误,有两个选择。一个是,如果没有限制的话将函数的返回值改为 Result。另一个是使用 match 或 Result 的方法中合适的一个来处理 Result。 错误信息也提到 ? 也可用于 Option 值。如同对 Result 使用 ? 一样,只能在返回 Option 的函数中对 Option 使用 ?。在 Option 上调用 ? 运算符的行为与 Result 类似:如果值是 None,此时 None 会从函数中提前返回。如果值是 Some,Some 中的值作为表达式的返回值同时函数继续。示例 9-11 中有一个从给定文本中返回第一行最后一个字符的函数的例子: fn last_char_of_first_line(text: &str) -> Option { text.lines().next()?.chars().last()\n}\n# # fn main() {\n# assert_eq!(\n# last_char_of_first_line(\"Hello, world\\nHow are you today?\"),\n# Some('d')\n# );\n# # assert_eq!(last_char_of_first_line(\"\"), None);\n# assert_eq!(last_char_of_first_line(\"\\nhi\"), None);\n# } 示例 9-11: 在 Option 值上使用 ? 运算符 这个函数返回 Option 因为它可能会在这个位置找到一个字符,也可能没有字符。这段代码获取 text 字符串 slice 作为参数并调用其 lines 方法,这会返回一个字符串中每一行的迭代器。因为函数希望检查第一行,所以调用了迭代器 next 来获取迭代器中第一个值。如果 text 是空字符串,next 调用会返回 None,此时我们可以使用 ? 来停止并从 last_char_of_first_line 返回 None。如果 text 不是空字符串,next 会返回一个包含 text 中第一行的字符串 slice 的 Some 值。 ? 会提取这个字符串 slice,然后可以在字符串 slice 上调用 chars 来获取字符的迭代器。我们感兴趣的是第一行的最后一个字符,所以可以调用 last 来返回迭代器的最后一项。这是一个 Option,因为有可能第一行是一个空字符串,例如 text 以一个空行开头而后面的行有文本,像是 \"\\nhi\"。不过,如果第一行有最后一个字符,它会返回在一个 Some 成员中。? 运算符作用于其中给了我们一个简洁的表达这种逻辑的方式。如果我们不能在 Option 上使用 ? 运算符,则不得不使用更多的方法调用或者 match 表达式来实现这些逻辑。 注意你可以在返回 Result 的函数中对 Result 使用 ? 运算符,可以在返回 Option 的函数中对 Option 使用 ? 运算符,但是不可以混合搭配。? 运算符不会自动将 Result 转化为 Option,反之亦然;在这些情况下,可以使用类似 Result 的 ok 方法或者 Option 的 ok_or 方法来显式转换。 目前为止,我们所使用的所有 main 函数都返回 ()。main 函数是特殊的因为它是可执行程序的入口点和退出点,为了使程序能正常工作,其可以返回的类型是有限制的。 幸运的是 main 函数也可以返回 Result<(), E>,示例 9-12 中的代码来自示例 9-10 不过修改了 main 的返回值为 Result<(), Box> 并在结尾增加了一个 Ok(()) 作为返回值。这段代码可以编译: use std::error::Error;\nuse std::fs::File; fn main() -> Result<(), Box> { let greeting_file = File::open(\"hello.txt\")?; Ok(())\n} 示例 9-12: 修改 main 返回 Result<(), E> 允许对 Result 值使用 ? 运算符 Box 类型是一个 trait 对象 ( trait object )第十八章 顾及不同类型值的 trait 对象” 部分会做介绍。目前可以将 Box 理解为 “任何类型的错误”。在返回 Box 错误类型 main 函数中对 Result 使用 ? 是允许的,因为它允许任何 Err 值提前返回。即便 main 函数体从来只会返回 std::io::Error 错误类型,通过指定 Box,这个签名也仍是正确的,甚至当 main 函数体中增加更多返回其他错误类型的代码时也是如此。 当 main 函数返回 Result<(), E>,如果 main 返回 Ok(()) 可执行程序会以 0 值退出,而如果 main 返回 Err 值则会以非零值退出;成功退出的程序会返回整数 0,运行错误的程序会返回非 0 的整数。Rust 也会从二进制程序中返回与这个惯例相兼容的整数。 main 函数也可以返回任何实现了 std::process::Termination trait 的类型,它包含了一个返回 ExitCode 的 report 函数。请查阅标准库文档了解更多为自定义类型实现 Termination trait 的细节。 现在我们讨论过了调用 panic! 或返回 Result 的细节,是时候回到它们各自适合哪些场景的话题了。","breadcrumbs":"错误处理 » 用 Result 处理可恢复的错误 » 哪里可以使用 ? 运算符","id":"162","title":"哪里可以使用 ? 运算符"},"163":{"body":"ch09-03-to-panic-or-not-to-panic.md commit dd8f47a74b67178cea8c832e3b4eaf3bb515bd72 那么,该如何决定何时应该 panic! 以及何时应该返回 Result 呢?如果代码 panic,就没有恢复的可能。你可以选择对任何错误场景都调用 panic!,不管是否有可能恢复,不过这样就是你代替调用者决定了这是不可恢复的。选择返回 Result 值的话,就将选择权交给了调用者,而不是代替他们做出决定。调用者可能会选择以符合他们场景的方式尝试恢复,或者也可能干脆就认为 Err 是不可恢复的,所以他们也可能会调用 panic! 并将可恢复的错误变成了不可恢复的错误。因此返回 Result 是定义可能会失败的函数的一个好的默认选择。 在一些类似示例、原型代码(prototype code)和测试中,panic 比返回 Result 更为合适,下文中会讨论合适的原因,紧接着讨论另外一种特殊情况,即有些场景编译器无法认识这个分支代码是不可能走到的,但是程序员可以判断出来的,这种场景也可以用 panic!。另外章节最后会总结一些在库代码中如何决定是否要 panic 的通用指导原则。","breadcrumbs":"错误处理 » 要不要 panic! » 要不要 panic!","id":"163","title":"要不要 panic!"},"164":{"body":"当你编写一个示例来展示一些概念时,在拥有健壮的错误处理代码的同时也会使得例子不那么明确。例如,调用一个类似 unwrap 这样可能 panic! 的方法可以被理解为一个你实际希望程序处理错误方式的占位符,它根据其余代码运行方式可能会各不相同。 类似地,在我们准备好决定如何处理错误之前,unwrap和expect方法在原型设计时非常方便。当我们准备好让程序更加健壮时,它们会在代码中留下清晰的标记。 如果方法调用在测试中失败了,我们希望这个测试都失败,即便这个方法并不是需要测试的功能。因为 panic! 会将测试标记为失败,此时调用 unwrap 或 expect 是恰当的。","breadcrumbs":"错误处理 » 要不要 panic! » 示例、代码原型和测试都非常适合 panic","id":"164","title":"示例、代码原型和测试都非常适合 panic"},"165":{"body":"当你有一些其他的逻辑来确保 Result 会是 Ok 值时,调用 unwrap 或者 expect 也是合适的,虽然编译器无法理解这种逻辑。你仍然需要处理一个 Result 值:即使在你的特定情况下逻辑上是不可能的,你所调用的任何操作仍然有可能失败。如果通过人工检查代码来确保永远也不会出现 Err 值,那么调用 unwrap 也是完全可以接受的,这里是一个例子: # fn main() { use std::net::IpAddr; let home: IpAddr = \"127.0.0.1\" .parse() .expect(\"Hardcoded IP address should be valid\");\n# } 我们通过解析一个硬编码的字符来创建一个 IpAddr 实例。可以看出 127.0.0.1 是一个有效的 IP 地址,所以这里使用 expect 是可以接受的。然而,拥有一个硬编码的有效的字符串也不能改变 parse 方法的返回值类型:它仍然是一个 Result 值,而编译器仍然会要求我们处理这个 Result,好像还是有可能出现 Err 成员那样。这是因为编译器还没有智能到可以识别出这个字符串总是一个有效的 IP 地址。如果 IP 地址字符串来源于用户而不是硬编码进程序中的话,那么就 确实 有失败的可能性,这时就绝对需要我们以一种更健壮的方式处理 Result 了。提及这个 IP 地址是硬编码的假设会促使我们将来把 expect 替换为更好的错误处理,我们应该从其它代码获取 IP 地址。","breadcrumbs":"错误处理 » 要不要 panic! » 当我们比编译器知道更多的情况","id":"165","title":"当我们比编译器知道更多的情况"},"166":{"body":"在当有可能会导致有害状态的情况下建议使用 panic! —— 在这里,有害状态是指当一些假设、保证、协议或不可变性被打破的状态,例如无效的值、自相矛盾的值或者被传递了不存在的值 —— 外加如下几种情况: 有害状态是非预期的行为,与偶尔会发生的行为相对,比如用户输入了错误格式的数据。 在此之后代码的运行依赖于不处于这种有害状态,而不是在每一步都检查是否有问题。 没有可行的手段来将有害状态信息编码进所使用的类型中的情况。我们会在第十八章 “将状态和行为编码为类型” 部分通过一个例子来说明我们的意思。 如果别人调用你的代码并传递了一个没有意义的值,尽最大可能返回一个错误,如此库的用户就可以决定在这种情况下该如何处理。然而在继续执行代码是不安全或有害的情况下,最好的选择可能是调用 panic! 并警告库的用户他们的代码中有 bug,这样他们就会在开发时进行修复。类似的,如果你正在调用不受你控制的外部代码,并且它返回了一个你无法修复的无效状态,那么 panic! 往往是合适的。 然而当错误预期会出现时,返回 Result 仍要比调用 panic! 更为合适。这样的例子包括解析器接收到格式错误的数据,或者 HTTP 请求返回了一个表明触发了限流的状态。在这些例子中,应该通过返回 Result 来表明失败预期是可能的,这样将有害状态向上传播,调用者就可以决定该如何处理这个问题。使用 panic! 来处理这些情况就不是最好的选择。 当你的代码在进行一个使用无效值进行调用时可能将用户置于风险中的操作时,代码应该首先验证值是有效的,并在其无效时 panic!。这主要是出于安全的原因:尝试操作无效数据会暴露代码漏洞,这就是标准库在尝试越界访问数组时会 panic! 的主要原因:尝试访问不属于当前数据结构的内存是一个常见的安全隐患。函数通常都遵循 契约 ( contracts ):它们的行为只有在输入满足特定条件时才能得到保证。当违反契约时 panic 是有道理的,因为这通常代表调用方的 bug,而且这也不是那种你希望所调用的代码必须处理的错误。事实上所调用的代码也没有合理的方式来恢复,而是需要调用方的 程序员 修复其代码。函数的契约,尤其是当违反它会造成 panic 的契约,应该在函数的 API 文档中得到解释。 虽然在所有函数中都拥有许多错误检查是冗长而烦人的。幸运的是,可以利用 Rust 的类型系统(以及编译器的类型检查)为你进行很多检查。如果函数有一个特定类型的参数,可以在知晓编译器已经确保其拥有一个有效值的前提下进行你的代码逻辑。例如,如果你使用了一个并不是 Option 的类型,则程序期望它是 有值 的并且不是 空值 。你的代码无需处理 Some 和 None 这两种情况,它只会有一种情况就是绝对会有一个值。尝试向函数传递空值的代码甚至根本不能编译,所以你的函数在运行时没有必要判空。另外一个例子是使用像 u32 这样的无符号整型,也会确保它永远不为负。","breadcrumbs":"错误处理 » 要不要 panic! » 错误处理指导原则","id":"166","title":"错误处理指导原则"},"167":{"body":"让我们使用 Rust 类型系统的思想来进一步确保值的有效性,并尝试创建一个自定义类型以进行验证。回忆一下第二章的猜猜看游戏,我们的代码要求用户猜测一个 1 到 100 之间的数字,在将其与秘密数字做比较之前我们从未验证用户的猜测是位于这两个数字之间的,我们只验证它是否为正。在这种情况下,其影响并不是很严重:“Too high” 或 “Too low” 的输出仍然是正确的。但是这是一个很好的引导用户得出有效猜测的辅助,例如当用户猜测一个超出范围的数字或者输入字母时采取不同的行为。 一种实现方式是将猜测解析成 i32 而不仅仅是 u32,来默许输入负数,接着检查数字是否在范围内: 文件名:src/main.rs # use rand::Rng;\n# use std::cmp::Ordering;\n# use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# loop { // --snip-- # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# let guess: i32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; if guess < 1 || guess > 100 { println!(\"The secret number will be between 1 and 100.\"); continue; } match guess.cmp(&secret_number) { // --snip--\n# Ordering::Less => println!(\"Too small!\"),\n# Ordering::Greater => println!(\"Too big!\"),\n# Ordering::Equal => {\n# println!(\"You win!\");\n# break;\n# }\n# } }\n# } if 表达式检查了值是否超出范围,告诉用户出了什么问题,并调用 continue 开始下一次循环,请求另一个猜测。if 表达式之后,就可以在知道 guess 在 1 到 100 之间的情况下与秘密数字作比较了。 然而,这并不是一个理想的解决方案:如果让程序仅仅处理 1 到 100 之间的值是一个绝对需要满足的要求,而且程序中的很多函数都有这样的要求,在每个函数中都有这样的检查将是非常冗余的(并可能潜在的影响性能)。 相反我们可以创建一个新类型来将验证放入创建其实例的函数中,而不是到处重复这些检查。这样就可以安全地在函数签名中使用新类型并相信它们接收到的值。示例 9-13 中展示了一个定义 Guess 类型的方法,只有在 new 函数接收到 1 到 100 之间的值时才会创建 Guess 的实例: 文件名:src/lib.rs pub struct Guess { value: i32,\n} impl Guess { pub fn new(value: i32) -> Guess { if value < 1 || value > 100 { panic!(\"Guess value must be between 1 and 100, got {value}.\"); } Guess { value } } pub fn value(&self) -> i32 { self.value }\n} 示例 9-13:一个 Guess 类型,它只在值位于 1 和 100 之间时才继续 首先,我们定义了一个包含 i32 类型字段 value 的结构体 Guess。这里是储存猜测值的地方。 接着在 Guess 上实现了一个叫做 new 的关联函数来创建 Guess 的实例。new 定义为接收一个 i32 类型的参数 value 并返回一个 Guess。new 函数中代码的测试确保了其值是在 1 到 100 之间的。如果 value 没有通过测试则调用 panic!,这会警告调用这个函数的程序员有一个需要修改的 bug,因为创建一个 value 超出范围的 Guess 将会违反 Guess::new 所遵循的契约。Guess::new 会出现 panic 的条件应该在其公有 API 文档中被提及;第十四章会涉及到在 API 文档中表明 panic! 可能性的相关规则。如果 value 通过了测试,我们新建一个 Guess,其字段 value 将被设置为参数 value 的值,接着返回这个 Guess。 接着,我们实现了一个借用了 self 的方法 value,它没有任何其他参数并返回一个 i32。这类方法有时被称为 getter ,因为它的目的就是返回对应字段的数据。这样的公有方法是必要的,因为 Guess 结构体的 value 字段是私有的。私有的字段 value 是很重要的,这样使用 Guess 结构体的代码将不允许直接设置 value 的值:调用者 必须 使用 Guess::new 方法来创建一个 Guess 的实例,这就确保了不会存在一个 value 没有通过 Guess::new 函数的条件检查的 Guess。 于是,一个接收(或返回)1 到 100 之间数字的函数就可以声明为接收(或返回) Guess的实例,而不是 i32,同时其函数体中也无需进行任何额外的检查。","breadcrumbs":"错误处理 » 要不要 panic! » 创建自定义类型进行有效性验证","id":"167","title":"创建自定义类型进行有效性验证"},"168":{"body":"Rust 的错误处理功能被设计为帮助你编写更加健壮的代码。panic! 宏代表一个程序无法处理的状态,并停止执行而不是使用无效或不正确的值继续处理。Rust 类型系统的 Result 枚举代表操作可能会在一种可以恢复的情况下失败。可以使用 Result 来告诉代码调用者他需要处理潜在的成功或失败。在适当的场景使用 panic! 和 Result 将会使你的代码在面对不可避免的错误时显得更加可靠。 现在我们已经见识过了标准库中 Option 和 Result 泛型枚举的能力了,在下一章让我们聊聊泛型是如何工作的,以及如何在你的代码中使用它们。","breadcrumbs":"错误处理 » 要不要 panic! » 总结","id":"168","title":"总结"},"169":{"body":"ch10-00-generics.md commit 4aa96a3d20570f868bd20e8e3e865b047284be30 每一个编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是 泛型 ( generics )。泛型是具体类型或其他属性的抽象替代。我们可以表达泛型的属性,比如它们的行为或如何与其他泛型相关联,而不需要在编写和编译代码时知道它们在这里实际上代表什么。 函数可以获取一些不同于 i32 或 String 这样具体类型的泛型参数,就像一个获取未知类型值的函数可以对多种具体类型的值运行同一段代码一样。事实上我们已经使用过第六章的 Option,第八章的 Vec 和 HashMap,以及第九章的 Result 这些泛型了。本章会探索如何使用泛型定义我们自己的类型、函数和方法! 首先,我们将回顾一下提取函数以减少代码重复的机制。接下来,我们将使用相同的技术,从两个仅参数类型不同的函数中创建一个泛型函数。我们也会讲到结构体和枚举定义中的泛型。 之后,我们讨论 trait ,这是一个定义泛型行为的方法。trait 可以与泛型结合来将泛型限制为只接受拥有特定行为的类型,而不是任意类型。 最后介绍 生命周期 ( lifetimes ),它是一类允许我们向编译器提供引用如何相互关联的泛型。Rust 的生命周期功能允许在很多场景下借用值的同时仍然使编译器能够检查这些引用的有效性。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型、Trait 和生命周期","id":"169","title":"泛型、Trait 和生命周期"},"17":{"body":"要检查是否正确安装了 Rust,打开命令行并输入: $ rustc --version 你应该可以看到按照以下格式显示的最新稳定版本的版本号、对应的 Commit Hash 和 Commit 日期: rustc x.y.z (abcabcabc yyyy-mm-dd) 如果看到了这样的信息,就说明 Rust 已经安装成功了! 译者:恭喜入坑!(此处应该有掌声!) 如果没看到,请按照下面说明的方法检查 Rust 是否在您的 %PATH% 系统变量中。 在 Windows CMD 中,请使用命令: > echo %PATH% 在 PowerShell 中,请使用命令: > echo $env:Path 在 Linux 和 macOS 中,请使用命令: $ echo $PATH 如果一切正确但 Rust 仍不能使用,有许多地方可以求助。您可以在 社区页面 查看如何与其他 Rustaceans(Rust 用户的称号,有自嘲意味)联系。","breadcrumbs":"入门指南 » 安装 » 故障排除(Troubleshooting)","id":"17","title":"故障排除(Troubleshooting)"},"170":{"body":"泛型允许我们使用一个可以代表多种类型的占位符来替换特定类型,以此来减少代码冗余。在深入了解泛型的语法之前,我们首先来看一种没有使用泛型的减少冗余的方法,即提取一个函数。在这个函数中,我们用一个可以代表多种值的占位符来替换具体的值。接着我们使用相同的技术来提取一个泛型函数!!通过学习如何识别并提取可以整合进一个函数的重复代码,你也会开始识别出可以使用泛型的重复代码。 让我们从下面这个寻找列表中最大值的小程序开始,如示例 10-1 所示: 文件名:src/main.rs fn main() { let number_list = vec![34, 50, 25, 100, 65]; let mut largest = &number_list[0]; for number in &number_list { if number > largest { largest = number; } } println!(\"The largest number is {largest}\");\n# assert_eq!(*largest, 100);\n} 示例 10-1:在一个数字列表中寻找最大值的函数 这段代码获取一个整型列表,存放在变量 number_list 中。它将列表的第一个数字的引用放入了变量 largest 中。接着遍历了列表中的所有数字,如果当前值大于 largest 中储存的值,将 largest 替换为这个值。如果当前值小于或者等于目前为止的最大值,largest 保持不变。当列表中所有值都被考虑到之后,largest 将会指向最大值,在这里也就是 100。 我们的任务是在两个不同的数字列表中寻找最大值。为此我们可以选择重复示例 10-1 中的代码在程序的两个不同位置使用相同的逻辑,如示例 10-2 所示: 文件名:src/main.rs fn main() { let number_list = vec![34, 50, 25, 100, 65]; let mut largest = &number_list[0]; for number in &number_list { if number > largest { largest = number; } } println!(\"The largest number is {largest}\"); let number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8]; let mut largest = &number_list[0]; for number in &number_list { if number > largest { largest = number; } } println!(\"The largest number is {largest}\");\n} 示例 10-2:寻找 两个 数字列表最大值的代码 虽然代码能够执行,但是重复的代码是冗余且容易出错的,更新逻辑时我们不得不记住需要修改多处地方的代码。 为了消除重复,我们要创建一层抽象,定义一个处理任意整型列表作为参数的函数。这个方案使得代码更简洁,并且表现了寻找任意列表中最大值这一概念。 在示例 10-3 的程序中将寻找最大值的代码提取到了一个叫做 largest 的函数中。接着我们调用该函数来寻找示例 10-2 中两个列表中的最大值。之后也可以将该函数用于任何可能的 i32 值的列表。 文件名:src/main.rs fn largest(list: &[i32]) -> &i32 { let mut largest = &list[0]; for item in list { if item > largest { largest = item; } } largest\n} fn main() { let number_list = vec![34, 50, 25, 100, 65]; let result = largest(&number_list); println!(\"The largest number is {result}\");\n# assert_eq!(*result, 100); let number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8]; let result = largest(&number_list); println!(\"The largest number is {result}\");\n# assert_eq!(*result, 6000);\n} 示例 10-3:抽象后的寻找两个数字列表最大值的代码 largest 函数有一个参数 list,它代表会传递给函数的任何具体的 i32值的 slice。函数定义中的 list 代表任何 &[i32]。当调用 largest 函数时,其代码实际上运行于我们传递的特定值上。 总的来说,从示例 10-2 到示例 10-3 中涉及的机制经历了如下几步: 找出重复代码。 将重复代码提取到了一个函数中,并在函数签名中指定了代码中的输入和返回值。 将重复代码的两个实例,改为调用函数。 接下来我们会使用相同的步骤通过泛型来减少重复。与函数体可以处理任意的 list 而不是具体的值一样,泛型也允许代码处理任意类型。 如果我们有两个函数,一个寻找一个 i32 值的 slice 中的最大项而另一个寻找 char 值的 slice 中的最大项该怎么办?该如何消除重复呢?让我们拭目以待!","breadcrumbs":"泛型、Trait 和生命周期 » 提取函数来减少重复","id":"170","title":"提取函数来减少重复"},"171":{"body":"ch10-01-syntax.md commit f2a78f64b668f63f581203c6bac509903f7c00ee 我们可以使用泛型为像函数签名或结构体这样的项创建定义,这样它们就可以用于多种不同的具体数据类型。让我们看看如何使用泛型定义函数、结构体、枚举和方法,然后我们将讨论泛型如何影响代码性能。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型数据类型 » 泛型数据类型","id":"171","title":"泛型数据类型"},"172":{"body":"当使用泛型定义函数时,本来在函数签名中指定参数和返回值的类型的地方,会改用泛型来表示。采用这种技术,使得代码适应性更强,从而为函数的调用者提供更多的功能,同时也避免了代码的重复。 回到 largest 函数,示例 10-4 中展示了两个函数,它们的功能都是寻找 slice 中最大值。接着我们使用泛型将其合并为一个函数。 文件名:src/main.rs fn largest_i32(list: &[i32]) -> &i32 { let mut largest = &list[0]; for item in list { if item > largest { largest = item; } } largest\n} fn largest_char(list: &[char]) -> &char { let mut largest = &list[0]; for item in list { if item > largest { largest = item; } } largest\n} fn main() { let number_list = vec![34, 50, 25, 100, 65]; let result = largest_i32(&number_list); println!(\"The largest number is {result}\");\n# assert_eq!(*result, 100); let char_list = vec!['y', 'm', 'a', 'q']; let result = largest_char(&char_list); println!(\"The largest char is {result}\");\n# assert_eq!(*result, 'y');\n} 示例 10-4:两个函数,不同点只是名称和签名类型 largest_i32 函数是从示例 10-3 中摘出来的,它用来寻找 slice 中最大的 i32。largest_char 函数寻找 slice 中最大的 char。因为两者函数体的代码是一样的,我们可以定义一个函数,再引进泛型参数来消除这种重复。 为了参数化这个新函数中的这些类型,我们需要为类型参数命名,道理和给函数的形参起名一样。任何标识符都可以作为类型参数的名字。这里选用 T,因为传统上来说,Rust 的类型参数名字都比较短,通常仅为一个字母,同时,Rust 类型名的命名规范是首字母大写驼峰式命名法(UpperCamelCase)。T 作为 “type” 的缩写是大部分 Rust 程序员的首选。 如果要在函数体中使用参数,就必须在函数签名中声明它的名字,好让编译器知道这个名字指代的是什么。同理,当在函数签名中使用一个类型参数时,必须在使用它之前就声明它。为了定义泛型版本的 largest 函数,类型参数声明位于函数名称与参数列表中间的尖括号 <> 中,像这样: fn largest(list: &[T]) -> &T { 可以这样理解这个定义:函数 largest 有泛型类型 T。它有个参数 list,其类型是元素为 T 的 slice。largest 函数会返回一个与 T 相同类型的引用。 示例 10-5 中的 largest 函数在它的签名中使用了泛型,统一了两个实现。该示例也展示了如何调用 largest 函数,把 i32 值的 slice 或 char 值的 slice 传给它。请注意这些代码还不能编译,不过稍后在本章会解决这个问题。 文件名:src/main.rs fn largest(list: &[T]) -> &T { let mut largest = &list[0]; for item in list { if item > largest { largest = item; } } largest\n} fn main() { let number_list = vec![34, 50, 25, 100, 65]; let result = largest(&number_list); println!(\"The largest number is {result}\"); let char_list = vec!['y', 'm', 'a', 'q']; let result = largest(&char_list); println!(\"The largest char is {result}\");\n} 示例 10-5:一个使用泛型参数的 largest 函数定义,尚不能编译 如果现在就编译这个代码,会出现如下错误: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10)\nerror[E0369]: binary operation `>` cannot be applied to type `&T` --> src/main.rs:5:17 |\n5 | if item > largest { | ---- ^ ------- &T | | | &T |\nhelp: consider restricting type parameter `T` |\n1 | fn largest(list: &[T]) -> &T { | ++++++++++++++++++++++ For more information about this error, try `rustc --explain E0369`.\nerror: could not compile `chapter10` (bin \"chapter10\") due to 1 previous error 帮助说明中提到了 std::cmp::PartialOrd,这是一个 trait 。下一部分会讲到 trait。不过简单来说,这个错误表明 largest 的函数体不能适用于 T 的所有可能的类型。因为在函数体需要比较 T 类型的值,不过它只能用于我们知道如何排序的类型。为了开启比较功能,标准库中定义的 std::cmp::PartialOrd trait 可以实现类型的比较功能(查看附录 C 获取该 trait 的更多信息)。依照帮助说明中的建议,我们限制 T 只对实现了 PartialOrd 的类型有效后代码就可以编译了,因为标准库为 i32 和 char 实现了 PartialOrd。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型数据类型 » 在函数定义中使用泛型","id":"172","title":"在函数定义中使用泛型"},"173":{"body":"同样也可以用 <> 语法来定义结构体,它包含一个或多个泛型参数类型字段。示例 10-6 定义了一个可以存放任何类型的 x 和 y 坐标值的结构体 Point: 文件名:src/main.rs struct Point { x: T, y: T,\n} fn main() { let integer = Point { x: 5, y: 10 }; let float = Point { x: 1.0, y: 4.0 };\n} 示例 10-6:Point 结构体存放了两个 T 类型的值 x 和 y 其语法类似于函数定义中使用泛型。首先,必须在结构体名称后面的尖括号中声明泛型参数的名称。接着在结构体定义中可以指定具体数据类型的位置使用泛型类型。 注意 Point 的定义中只使用了一个泛型类型,这个定义表明结构体 Point 对于一些类型 T 是泛型的,而且字段 x 和 y 都是 相同类型的,无论它具体是何类型。如果尝试创建一个有不同类型值的 Point 的实例,像示例 10-7 中的代码就不能编译: 文件名:src/main.rs struct Point { x: T, y: T,\n} fn main() { let wont_work = Point { x: 5, y: 4.0 };\n} 示例 10-7:字段 x 和 y 的类型必须相同,因为它们都有相同的泛型类型 T 在这个例子中,当把整型值 5 赋值给 x 时,就告诉了编译器这个 Point 实例中的泛型 T 全是整型。接着指定 y 为浮点值 4.0,因为它y被定义为与 x 相同类型,所以将会得到一个像这样的类型不匹配错误: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10)\nerror[E0308]: mismatched types --> src/main.rs:7:38 |\n7 | let wont_work = Point { x: 5, y: 4.0 }; | ^^^ expected integer, found floating-point number For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `chapter10` (bin \"chapter10\") due to 1 previous error 如果想要定义一个 x 和 y 可以有不同类型且仍然是泛型的 Point 结构体,我们可以使用多个泛型类型参数。在示例 10-8 中,我们修改 Point 的定义为拥有两个泛型类型 T 和 U。其中字段 x 是 T 类型的,而字段 y 是 U 类型的: 文件名:src/main.rs struct Point { x: T, y: U,\n} fn main() { let both_integer = Point { x: 5, y: 10 }; let both_float = Point { x: 1.0, y: 4.0 }; let integer_and_float = Point { x: 5, y: 4.0 };\n} 示例 10-8:使用两个泛型的 Point,这样 x 和 y 可能是不同类型 现在所有这些 Point 实例都合法了!你可以在定义中使用任意多的泛型类型参数,不过太多的话,代码将难以阅读和理解。当你发现代码中需要很多泛型时,这可能表明你的代码需要重构分解成更小的结构。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型数据类型 » 结构体定义中的泛型","id":"173","title":"结构体定义中的泛型"},"174":{"body":"和结构体类似,枚举也可以在成员中存放泛型数据类型。第六章我们曾用过标准库提供的 Option 枚举,这里再回顾一下: enum Option { Some(T), None,\n} 现在这个定义应该更容易理解了。如你所见 Option 是一个拥有泛型 T 的枚举,它有两个成员:Some,它存放了一个类型 T 的值,和不存在任何值的None。通过 Option 枚举可以表达有一个可能的值的抽象概念,同时因为 Option 是泛型的,无论这个可能的值是什么类型都可以使用这个抽象。 枚举也可以拥有多个泛型类型。第九章使用过的 Result 枚举定义就是一个这样的例子: enum Result { Ok(T), Err(E),\n} Result 枚举有两个泛型类型,T 和 E。Result 有两个成员:Ok,它存放一个类型 T 的值,而 Err 则存放一个类型 E 的值。这个定义使得 Result 枚举能很方便的表达任何可能成功(返回 T 类型的值)也可能失败(返回 E 类型的值)的操作。实际上,这就是我们在示例 9-3 用来打开文件的方式:当成功打开文件的时候,T 对应的是 std::fs::File 类型;而当打开文件出现问题时,E 的值则是 std::io::Error 类型。 当你意识到代码中定义了多个结构体或枚举,它们不一样的地方只是其中的值的类型的时候,不妨通过泛型类型来避免重复。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型数据类型 » 枚举定义中的泛型","id":"174","title":"枚举定义中的泛型"},"175":{"body":"在为结构体和枚举实现方法时(像第五章那样),一样也可以用泛型。示例 10-9 中展示了示例 10-6 中定义的结构体 Point,和在其上实现的名为 x 的方法。 文件名:src/main.rs struct Point { x: T, y: T,\n} impl Point { fn x(&self) -> &T { &self.x }\n} fn main() { let p = Point { x: 5, y: 10 }; println!(\"p.x = {}\", p.x());\n} 示例 10-9:在 Point 结构体上实现方法 x,它返回 T 类型的字段 x 的引用 这里在 Point 上定义了一个叫做 x 的方法来返回字段 x 中数据的引用: 注意必须在 impl 后面声明 T,这样就可以在 Point 上实现的方法中使用 T 了。通过在 impl 之后声明泛型 T,Rust 就知道 Point 的尖括号中的类型是泛型而不是具体类型。我们可以为泛型参数选择一个与结构体定义中声明的泛型参数所不同的名称,不过依照惯例使用了相同的名称。在声明泛型类型参数的 impl 中编写的方法将会定义在该类型的任何实例上,无论最终替换泛型类型参数的是何具体类型。(译者注:以示例 10-9 为例,impl 中声明了泛型类型参数 T,x 是编写在 impl 中的方法,x 方法将会定义在 Point 的任何实例上,无论最终替换泛型类型参数 T 的是何具体类型)。 定义方法时也可以为泛型指定限制(constraint)。例如,可以选择为 Point 实例实现方法,而不是为泛型 Point 实例。示例 10-10 展示了一个没有在 impl 之后(的尖括号)声明泛型的例子,这里使用了一个具体类型,f32: 文件名:src/main.rs # struct Point {\n# x: T,\n# y: T,\n# }\n# # impl Point {\n# fn x(&self) -> &T {\n# &self.x\n# }\n# }\n# impl Point { fn distance_from_origin(&self) -> f32 { (self.x.powi(2) + self.y.powi(2)).sqrt() }\n}\n# # fn main() {\n# let p = Point { x: 5, y: 10 };\n# # println!(\"p.x = {}\", p.x());\n# } 示例 10-10:构建一个只用于拥有泛型参数 T 的结构体的具体类型的 impl 块 这段代码意味着 Point 类型会有一个方法 distance_from_origin,而其他 T 不是 f32 类型的 Point 实例则没有定义此方法。这个方法计算点实例与坐标 (0.0, 0.0) 之间的距离,并使用了只能用于浮点型的数学运算符。 结构体定义中的泛型类型参数并不总是与结构体方法签名中使用的泛型是同一类型。示例 10-11 中为 Point 结构体使用了泛型类型 X1 和 Y1,为 mixup 方法签名使用了 X2 和 Y2 来使得示例更加清楚。这个方法用 self 的 Point 类型的 x 值(类型 X1)和参数的 Point 类型的 y 值(类型 Y2)来创建一个新 Point 类型的实例: 文件名:src/main.rs struct Point { x: X1, y: Y1,\n} impl Point { fn mixup(self, other: Point) -> Point { Point { x: self.x, y: other.y, } }\n} fn main() { let p1 = Point { x: 5, y: 10.4 }; let p2 = Point { x: \"Hello\", y: 'c' }; let p3 = p1.mixup(p2); println!(\"p3.x = {}, p3.y = {}\", p3.x, p3.y);\n} 示例 10-11:方法使用了与结构体定义中不同类型的泛型 在 main 函数中,定义了一个有 i32 类型的 x(其值为 5)和 f64 的 y(其值为 10.4)的 Point。p2 则是一个有着字符串 slice 类型的 x(其值为 \"Hello\")和 char 类型的 y(其值为c)的 Point。在 p1 上以 p2 作为参数调用 mixup 会返回一个 p3,它会有一个 i32 类型的 x,因为 x 来自 p1,并拥有一个 char 类型的 y,因为 y 来自 p2。println! 会打印出 p3.x = 5, p3.y = c。 这个例子的目的是展示一些泛型通过 impl 声明而另一些通过方法定义声明的情况。这里泛型参数 X1 和 Y1 声明于 impl 之后,因为它们与结构体定义相对应。而泛型参数 X2 和 Y2 声明于 fn mixup 之后,因为它们只是相对于方法本身的。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型数据类型 » 方法定义中的泛型","id":"175","title":"方法定义中的泛型"},"176":{"body":"在阅读本部分内容的同时,你可能会好奇使用泛型类型参数是否会有运行时消耗。好消息是泛型并不会使程序比具体类型运行得慢。 Rust 通过在编译时进行泛型代码的 单态化 ( monomorphization )来保证效率。单态化是一个通过填充编译时使用的具体类型,将通用代码转换为特定代码的过程。 在这个过程中,编译器所做的工作正好与示例 10-5 中我们创建泛型函数的步骤相反。编译器寻找所有泛型代码被调用的位置并使用泛型代码针对具体类型生成代码。 让我们看看这如何用于标准库中的 Option 枚举: let integer = Some(5);\nlet float = Some(5.0); 当 Rust 编译这些代码的时候,它会进行单态化。编译器会读取传递给 Option 的值并发现有两种 Option:一个对应 i32 另一个对应 f64。为此,它会将泛型定义 Option 展开为两个针对 i32 和 f64 的定义,接着将泛型定义替换为这两个具体的定义。 编译器生成的单态化版本的代码看起来像这样(编译器会使用不同于如下假想的名字): 文件名:src/main.rs enum Option_i32 { Some(i32), None,\n} enum Option_f64 { Some(f64), None,\n} fn main() { let integer = Option_i32::Some(5); let float = Option_f64::Some(5.0);\n} 泛型 Option 被编译器替换为了具体的定义。因为 Rust 会将每种情况下的泛型代码编译为具体类型,使用泛型没有运行时开销。当代码运行时,它的执行效率就跟好像手写每个具体定义的重复代码一样。这个单态化过程正是 Rust 泛型在运行时极其高效的原因。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型数据类型 » 泛型代码的性能","id":"176","title":"泛型代码的性能"},"177":{"body":"ch10-02-traits.md commit 92bfbfacf88ee9a814cea0a58e9c019c529ef4ae trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 trait 以一种抽象的方式定义共同行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。 注意: trait 类似于其他语言中的常被称为 接口 ( interfaces )的功能,虽然有一些不同。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » Trait:定义共同行为","id":"177","title":"Trait:定义共同行为"},"178":{"body":"一个类型的行为由其可供调用的方法构成。如果可以对不同类型调用相同的方法的话,这些类型就可以共享相同的行为了。trait 定义是一种将方法签名组合起来的方法,目的是定义一个实现某些目的所必需的行为的集合。 例如,这里有多个存放了不同类型和属性文本的结构体:结构体 NewsArticle 用于存放发生于世界各地的新闻故事,而结构体 Tweet 最多只能存放 280 个字符的内容,以及像是否转推或是否是对推友的回复这样的元数据。 我们想要创建一个名为 aggregator 的多媒体聚合库用来显示可能储存在 NewsArticle 或 Tweet 实例中的数据摘要。为了实现功能,每个结构体都要能够获取摘要,这样的话就可以调用实例的 summarize 方法来请求摘要。示例 10-12 中展示了一个表现这个概念的公有 Summary trait 的定义: 文件名:src/lib.rs pub trait Summary { fn summarize(&self) -> String;\n} 示例 10-12:Summary trait 定义,它包含由 summarize 方法提供的行为 这里使用 trait 关键字来声明一个 trait,后面是 trait 的名字,在这个例子中是 Summary。我们也声明 trait 为 pub 以便依赖这个 crate 的 crate 也可以使用这个 trait,正如我们见过的一些示例一样。在大括号中声明描述实现这个 trait 的类型所需要的行为的方法签名,在这个例子中是 fn summarize(&self) -> String。 在方法签名后跟分号,而不是在大括号中提供其实现。接着每一个实现这个 trait 的类型都需要提供其自定义行为的方法体,编译器也会确保任何实现 Summary trait 的类型都拥有与这个签名的定义完全一致的 summarize 方法。 trait 体中可以有多个方法:一行一个方法签名且都以分号结尾。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » 定义 trait","id":"178","title":"定义 trait"},"179":{"body":"现在我们定义了 Summary trait 的签名,接着就可以在多媒体聚合库中实现这个类型了。示例 10-13 中展示了 NewsArticle 结构体上 Summary trait 的一个实现,它使用标题、作者和创建的位置作为 summarize 的返回值。对于 Tweet 结构体,我们选择将 summarize 定义为用户名后跟推文的全部文本作为返回值,并假设推文内容已经被限制为 280 字符以内。 文件名:src/lib.rs # pub trait Summary {\n# fn summarize(&self) -> String;\n# }\n# pub struct NewsArticle { pub headline: String, pub location: String, pub author: String, pub content: String,\n} impl Summary for NewsArticle { fn summarize(&self) -> String { format!(\"{}, by {} ({})\", self.headline, self.author, self.location) }\n} pub struct Tweet { pub username: String, pub content: String, pub reply: bool, pub retweet: bool,\n} impl Summary for Tweet { fn summarize(&self) -> String { format!(\"{}: {}\", self.username, self.content) }\n} 示例 10-13:在 NewsArticle 和 Tweet 类型上实现 Summary trait 在类型上实现 trait 类似于实现常规方法。区别在于 impl 关键字之后,我们提供需要实现 trait 的名称,接着是 for 和需要实现 trait 的类型的名称。在 impl 块中,使用 trait 定义中的方法签名,不过不再后跟分号,而是需要在大括号中编写函数体来为特定类型实现 trait 方法所拥有的行为。 现在库在 NewsArticle 和 Tweet 上实现了Summary trait,crate 的用户可以像调用常规方法一样调用 NewsArticle 和 Tweet 实例的 trait 方法了。唯一的区别是 trait 必须和类型一起引入作用域以便使用额外的 trait 方法。这是一个二进制 crate 如何利用 aggregator 库 crate 的例子: use aggregator::{Summary, Tweet}; fn main() { let tweet = Tweet { username: String::from(\"horse_ebooks\"), content: String::from( \"of course, as you probably already know, people\", ), reply: false, retweet: false, }; println!(\"1 new tweet: {}\", tweet.summarize());\n} 这会打印出 1 new tweet: horse_ebooks: of course, as you probably already know, people。 其他依赖 aggregator crate 的 crate 也可以将 Summary 引入作用域以便为其自己的类型实现该 trait。需要注意的限制是,只有在 trait 或类型至少有一个属于当前 crate 时,我们才能对类型实现该 trait。例如,可以为 aggregator crate 的自定义类型 Tweet 实现如标准库中的 Display trait,这是因为 Tweet 类型位于 aggregator crate 本地的作用域中。类似地,也可以在 aggregator crate 中为 Vec 实现 Summary,这是因为 Summary trait 位于 aggregator crate 本地作用域中。 但是不能为外部类型实现外部 trait。例如,不能在 aggregator crate 中为 Vec 实现 Display trait。这是因为 Display 和 Vec 都定义于标准库中,它们并不位于 aggregator crate 本地作用域中。这个限制是被称为 相干性 ( coherence )的程序属性的一部分,或者更具体的说是 孤儿规则 ( orphan rule ),其得名于不存在父类型。这条规则确保了其他人编写的代码不会破坏你代码,反之亦然。没有这条规则的话,两个 crate 可以分别对相同类型实现相同的 trait,而 Rust 将无从得知应该使用哪一个实现。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » 为类型实现 trait","id":"179","title":"为类型实现 trait"},"18":{"body":"通过 rustup 安装了 Rust 之后,更新到最新版本就很简单了,只需要在您对应的命令行中运行如下更新脚本: $ rustup update 若要卸载 Rust 和 rustup,请在命令行中运行如下卸载脚本: $ rustup self uninstall","breadcrumbs":"入门指南 » 安装 » 更新与卸载","id":"18","title":"更新与卸载"},"180":{"body":"有时为 trait 中的某些或全部方法提供默认的行为,而不是在每个类型的每个实现中都定义自己的行为是很有用的。这样当为某个特定类型实现 trait 时,可以选择保留或重载每个方法的默认行为。 示例 10-14 中我们为 Summary trait 的 summarize 方法指定一个默认的字符串值,而不是像示例 10-12 中那样只是定义方法签名: 文件名:src/lib.rs pub trait Summary { fn summarize(&self) -> String { String::from(\"(Read more...)\") }\n}\n# # pub struct NewsArticle {\n# pub headline: String,\n# pub location: String,\n# pub author: String,\n# pub content: String,\n# }\n# # impl Summary for NewsArticle {}\n# # pub struct Tweet {\n# pub username: String,\n# pub content: String,\n# pub reply: bool,\n# pub retweet: bool,\n# }\n# # impl Summary for Tweet {\n# fn summarize(&self) -> String {\n# format!(\"{}: {}\", self.username, self.content)\n# }\n# } 示例 10-14:Summary trait 的定义,带有一个 summarize 方法的默认实现 如果想要对 NewsArticle 实例使用这个默认实现,可以通过 impl Summary for NewsArticle {} 指定一个空的 impl 块。 虽然我们不再直接为 NewsArticle 定义 summarize 方法了,但是我们提供了一个默认实现并且指定 NewsArticle 实现 Summary trait。因此,我们仍然可以对 NewsArticle 实例调用 summarize 方法,如下所示: # use aggregator::{self, NewsArticle, Summary};\n# # fn main() { let article = NewsArticle { headline: String::from(\"Penguins win the Stanley Cup Championship!\"), location: String::from(\"Pittsburgh, PA, USA\"), author: String::from(\"Iceburgh\"), content: String::from( \"The Pittsburgh Penguins once again are the best \\ hockey team in the NHL.\", ), }; println!(\"New article available! {}\", article.summarize());\n# } 这段代码会打印 New article available! (Read more...)。 为 summarize 创建默认实现并不要求对示例 10-13 中 Tweet 上的 Summary 实现做任何改变。其原因是重载一个默认实现的语法与实现没有默认实现的 trait 方法的语法一样。 默认实现允许调用相同 trait 中的其他方法,哪怕这些方法没有默认实现。如此,trait 可以提供很多有用的功能而只需要实现指定一小部分内容。例如,我们可以定义 Summary trait,使其具有一个需要实现的 summarize_author 方法,然后定义一个 summarize 方法,此方法的默认实现调用 summarize_author 方法: pub trait Summary { fn summarize_author(&self) -> String; fn summarize(&self) -> String { format!(\"(Read more from {}...)\", self.summarize_author()) }\n}\n# # pub struct Tweet {\n# pub username: String,\n# pub content: String,\n# pub reply: bool,\n# pub retweet: bool,\n# }\n# # impl Summary for Tweet {\n# fn summarize_author(&self) -> String {\n# format!(\"@{}\", self.username)\n# }\n# } 为了使用这个版本的 Summary,只需在实现 trait 时定义 summarize_author 即可: # pub trait Summary {\n# fn summarize_author(&self) -> String;\n# # fn summarize(&self) -> String {\n# format!(\"(Read more from {}...)\", self.summarize_author())\n# }\n# }\n# # pub struct Tweet {\n# pub username: String,\n# pub content: String,\n# pub reply: bool,\n# pub retweet: bool,\n# }\n# impl Summary for Tweet { fn summarize_author(&self) -> String { format!(\"@{}\", self.username) }\n} 一旦定义了 summarize_author,我们就可以对 Tweet 结构体的实例调用 summarize 了,而 summarize 的默认实现会调用我们提供的 summarize_author 定义。因为实现了 summarize_author,Summary trait 就提供了 summarize 方法的功能,且无需编写更多的代码。 # use aggregator::{self, Summary, Tweet};\n# # fn main() { let tweet = Tweet { username: String::from(\"horse_ebooks\"), content: String::from( \"of course, as you probably already know, people\", ), reply: false, retweet: false, }; println!(\"1 new tweet: {}\", tweet.summarize());\n# } 这会打印出 1 new tweet: (Read more from @horse_ebooks...)。 注意无法从相同方法的重载实现中调用默认方法。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » 默认实现","id":"180","title":"默认实现"},"181":{"body":"知道了如何定义 trait 和在类型上实现这些 trait 之后,我们可以探索一下如何使用 trait 来接受多种不同类型的参数。示例 10-13 中为 NewsArticle 和 Tweet 类型实现了 Summary trait,用其来定义了一个函数 notify 来调用其参数 item 上的 summarize 方法,该参数是实现了 Summary trait 的某种类型。为此可以使用 impl Trait 语法,像这样: # pub trait Summary {\n# fn summarize(&self) -> String;\n# }\n# # pub struct NewsArticle {\n# pub headline: String,\n# pub location: String,\n# pub author: String,\n# pub content: String,\n# }\n# # impl Summary for NewsArticle {\n# fn summarize(&self) -> String {\n# format!(\"{}, by {} ({})\", self.headline, self.author, self.location)\n# }\n# }\n# # pub struct Tweet {\n# pub username: String,\n# pub content: String,\n# pub reply: bool,\n# pub retweet: bool,\n# }\n# # impl Summary for Tweet {\n# fn summarize(&self) -> String {\n# format!(\"{}: {}\", self.username, self.content)\n# }\n# }\n# pub fn notify(item: &impl Summary) { println!(\"Breaking news! {}\", item.summarize());\n} 对于 item 参数,我们指定了 impl 关键字和 trait 名称,而不是具体的类型。该参数支持任何实现了指定 trait 的类型。在 notify 函数体中,可以调用任何来自 Summary trait 的方法,比如 summarize。我们可以传递任何 NewsArticle 或 Tweet 的实例来调用 notify。任何用其它如 String 或 i32 的类型调用该函数的代码都不能编译,因为它们没有实现 Summary。 Trait Bound 语法 impl Trait 语法更直观,但它实际上是更长形式的 trait bound 语法的语法糖。它看起来像: pub fn notify(item: &T) { println!(\"Breaking news! {}\", item.summarize());\n} 这与之前的例子相同,不过稍微冗长了一些。trait bound 与泛型参数声明在一起,位于尖括号中的冒号后面。 impl Trait 很方便,适用于短小的例子。更长的 trait bound 则适用于更复杂的场景。例如,可以获取两个实现了 Summary 的参数。使用 impl Trait 的语法看起来像这样: pub fn notify(item1: &impl Summary, item2: &impl Summary) { 这适用于 item1 和 item2 允许是不同类型的情况(只要它们都实现了 Summary)。不过如果你希望强制它们都是相同类型呢?这只有在使用 trait bound 时才有可能: pub fn notify(item1: &T, item2: &T) { 泛型 T 被指定为 item1 和 item2 的参数限制,如此传递给参数 item1 和 item2 值的具体类型必须一致。 通过 + 指定多个 trait bound 如果 notify 需要显示 item 的格式化形式,同时也要使用 summarize 方法,那么 item 就需要同时实现两个不同的 trait:Display 和 Summary。这可以通过 + 语法实现: pub fn notify(item: &(impl Summary + Display)) { + 语法也适用于泛型的 trait bound: pub fn notify(item: &T) { 通过指定这两个 trait bound,notify 的函数体可以调用 summarize 并使用 {} 来格式化 item。 通过 where 简化 trait bound 然而,使用过多的 trait bound 也有缺点。每个泛型有其自己的 trait bound,所以有多个泛型参数的函数在名称和参数列表之间会有很长的 trait bound 信息,这使得函数签名难以阅读。为此,Rust 有另一个在函数签名之后的 where 从句中指定 trait bound 的语法。所以除了这么写: fn some_function(t: &T, u: &U) -> i32 { 还可以像这样使用 where 从句: fn some_function(t: &T, u: &U) -> i32\nwhere T: Display + Clone, U: Clone + Debug,\n{\n# unimplemented!()\n# } 这个函数签名就显得不那么杂乱,函数名、参数列表和返回值类型都离得很近,看起来跟没有那么多 trait bounds 的函数很像。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » trait 作为参数","id":"181","title":"trait 作为参数"},"182":{"body":"也可以在返回值中使用 impl Trait 语法,来返回实现了某个 trait 的类型: # pub trait Summary {\n# fn summarize(&self) -> String;\n# }\n# # pub struct NewsArticle {\n# pub headline: String,\n# pub location: String,\n# pub author: String,\n# pub content: String,\n# }\n# # impl Summary for NewsArticle {\n# fn summarize(&self) -> String {\n# format!(\"{}, by {} ({})\", self.headline, self.author, self.location)\n# }\n# }\n# # pub struct Tweet {\n# pub username: String,\n# pub content: String,\n# pub reply: bool,\n# pub retweet: bool,\n# }\n# # impl Summary for Tweet {\n# fn summarize(&self) -> String {\n# format!(\"{}: {}\", self.username, self.content)\n# }\n# }\n# fn returns_summarizable() -> impl Summary { Tweet { username: String::from(\"horse_ebooks\"), content: String::from( \"of course, as you probably already know, people\", ), reply: false, retweet: false, }\n} 通过使用 impl Summary 作为返回值类型,我们指定了 returns_summarizable 函数返回某个实现了 Summary trait 的类型,但是不确定其具体的类型。在这个例子中 returns_summarizable 返回了一个 Tweet,不过调用方并不知情。 返回一个只是指定了需要实现的 trait 的类型的能力在闭包和迭代器场景十分的有用,第十三章会介绍它们。闭包和迭代器创建只有编译器知道的类型,或者是非常非常长的类型。impl Trait 允许你简单的指定函数返回一个 Iterator 而无需写出实际的冗长的类型。 不过这只适用于返回单一类型的情况。例如,这段代码的返回值类型指定为返回 impl Summary,但是返回了 NewsArticle 或 Tweet 就行不通: # pub trait Summary {\n# fn summarize(&self) -> String;\n# }\n# # pub struct NewsArticle {\n# pub headline: String,\n# pub location: String,\n# pub author: String,\n# pub content: String,\n# }\n# # impl Summary for NewsArticle {\n# fn summarize(&self) -> String {\n# format!(\"{}, by {} ({})\", self.headline, self.author, self.location)\n# }\n# }\n# # pub struct Tweet {\n# pub username: String,\n# pub content: String,\n# pub reply: bool,\n# pub retweet: bool,\n# }\n# # impl Summary for Tweet {\n# fn summarize(&self) -> String {\n# format!(\"{}: {}\", self.username, self.content)\n# }\n# }\n# fn returns_summarizable(switch: bool) -> impl Summary { if switch { NewsArticle { headline: String::from( \"Penguins win the Stanley Cup Championship!\", ), location: String::from(\"Pittsburgh, PA, USA\"), author: String::from(\"Iceburgh\"), content: String::from( \"The Pittsburgh Penguins once again are the best \\ hockey team in the NHL.\", ), } } else { Tweet { username: String::from(\"horse_ebooks\"), content: String::from( \"of course, as you probably already know, people\", ), reply: false, retweet: false, } }\n} 这里尝试返回 NewsArticle 或 Tweet。这不能编译,因为 impl Trait 工作方式的限制。第十八章的 “顾及不同类型值的 trait 对象” 部分会介绍如何编写这样一个函数。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » 返回实现了 trait 的类型","id":"182","title":"返回实现了 trait 的类型"},"183":{"body":"通过使用带有 trait bound 的泛型参数的 impl 块,可以有条件地只为那些实现了特定 trait 的类型实现方法。例如,示例 10-15 中的类型 Pair 总是实现了 new 方法并返回一个 Pair 的实例(回忆一下第五章的 “定义方法” 部分,Self 是一个 impl 块类型的类型别名(type alias),在这里是 Pair)。不过在下一个 impl 块中,只有那些为 T 类型实现了 PartialOrd trait(来允许比较) 和 Display trait(来启用打印)的 Pair 才会实现 cmp_display 方法: use std::fmt::Display; struct Pair { x: T, y: T,\n} impl Pair { fn new(x: T, y: T) -> Self { Self { x, y } }\n} impl Pair { fn cmp_display(&self) { if self.x >= self.y { println!(\"The largest member is x = {}\", self.x); } else { println!(\"The largest member is y = {}\", self.y); } }\n} 示例 10-15:根据 trait bound 在泛型上有条件的实现方法 也可以对任何实现了特定 trait 的类型有条件地实现 trait。对任何满足特定 trait bound 的类型实现 trait 被称为 blanket implementations ,它们被广泛的用于 Rust 标准库中。例如,标准库为任何实现了 Display trait 的类型实现了 ToString trait。这个 impl 块看起来像这样: impl ToString for T { // --snip--\n} 因为标准库有了这些 blanket implementation,我们可以对任何实现了 Display trait 的类型调用由 ToString 定义的 to_string 方法。例如,可以将整型转换为对应的 String 值,因为整型实现了 Display: let s = 3.to_string(); blanket implementation 会出现在 trait 文档的 “Implementers” 部分。 trait 和 trait bound 让我们能够使用泛型类型参数来减少重复,而且能够向编译器明确指定泛型类型需要拥有哪些行为。然后编译器可以利用 trait bound 信息检查代码中所用到的具体类型是否提供了正确的行为。在动态类型语言中,如果我们调用了一个未定义的方法,会在运行时出现错误。Rust 将这些错误移动到了编译时,甚至在代码能够运行之前就强迫我们修复问题。另外,我们也无需编写运行时检查行为的代码,因为在编译时就已经检查过了。这样既提升了性能又不必放弃泛型的灵活性。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » 使用 trait bound 有条件地实现方法","id":"183","title":"使用 trait bound 有条件地实现方法"},"184":{"body":"ch10-03-lifetime-syntax.md commit 5f67eee42345ba44f6f08a22c2192165f4b0e930 生命周期是另一类我们已经使用过的泛型。不同于确保类型有期望的行为,生命周期确保引用如预期一直有效。 当在第四章讨论 “引用和借用” 部分时,我们遗漏了一个重要的细节:Rust 中的每一个引用都有其 生命周期 ( lifetime ),也就是引用保持有效的作用域。大部分时候生命周期是隐含并可以推断的,正如大部分时候类型也是可以推断的一样。类似于当因为有多种可能类型的时候必须注明类型,也会出现引用的生命周期以一些不同方式相关联的情况,所以 Rust 需要我们使用泛型生命周期参数来注明它们的关系,这样就能确保运行时实际使用的引用绝对是有效的。 生命周期注解甚至不是一个大部分语言都有的概念,所以这可能感觉起来有些陌生。虽然本章不可能涉及到它全部的内容,我们会讲到一些通常你可能会遇到的生命周期语法以便你熟悉这个概念。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 生命周期确保引用有效","id":"184","title":"生命周期确保引用有效"},"185":{"body":"生命周期的主要目标是避免 悬垂引用 ( dangling references ),后者会导致程序引用了非预期引用的数据。考虑一下示例 10-16 中的程序,它有一个外部作用域和一个内部作用域。 fn main() { let r; { let x = 5; r = &x; } println!(\"r: {r}\");\n} 示例 10-16:尝试使用离开作用域的值的引用 注意:示例 10-16、10-17 和 10-23 中声明了没有初始值的变量,所以这些变量存在于外部作用域。这乍看之下好像和 Rust 不允许存在空值相冲突。然而如果尝试在给它一个值之前使用这个变量,会出现一个编译时错误,这就说明了 Rust 确实不允许空值。 外部作用域声明了一个没有初值的变量 r,而内部作用域声明了一个初值为 5 的变量x。在内部作用域中,我们尝试将 r 的值设置为一个 x 的引用。接着在内部作用域结束后,尝试打印出 r 的值。这段代码不能编译因为 r 引用的值在尝试使用之前就离开了作用域。如下是错误信息: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10)\nerror[E0597]: `x` does not live long enough --> src/main.rs:6:13 |\n5 | let x = 5; | - binding `x` declared here\n6 | r = &x; | ^^ borrowed value does not live long enough\n7 | } | - `x` dropped here while still borrowed\n8 |\n9 | println!(\"r: {r}\"); | --- borrow later used here For more information about this error, try `rustc --explain E0597`.\nerror: could not compile `chapter10` (bin \"chapter10\") due to 1 previous error 变量 x 并没有 “存在的足够久”。其原因是 x 在到达第 7 行内部作用域结束时就离开了作用域。不过 r 在外部作用域仍是有效的;作用域越大我们就说它 “存在的越久”。如果 Rust 允许这段代码工作,r 将会引用在 x 离开作用域时被释放的内存,这时尝试对 r 做任何操作都不能正常工作。那么 Rust 是如何决定这段代码是不被允许的呢?这得益于借用检查器。 借用检查器 Rust 编译器有一个 借用检查器 ( borrow checker ),它比较作用域来确保所有的借用都是有效的。示例 10-17 展示了与示例 10-16 相同的例子不过带有变量生命周期的注释: fn main() { let r; // ---------+-- 'a // | { // | let x = 5; // -+-- 'b | r = &x; // | | } // -+ | // | println!(\"r: {r}\"); // |\n} // ---------+ 示例 10-17:r 和 x 的生命周期注解,分别叫做 'a 和 'b 这里将 r 的生命周期标记为 'a 并将 x 的生命周期标记为 'b。如你所见,内部的 'b 块要比外部的生命周期 'a 小得多。在编译时,Rust 比较这两个生命周期的大小,并发现 r 拥有生命周期 'a,不过它引用了一个拥有生命周期 'b 的对象。程序被拒绝编译,因为生命周期 'b 比生命周期 'a 要小:被引用的对象比它的引用者存在的时间更短。 让我们看看示例 10-18 中这个并没有产生悬垂引用且可以正确编译的例子: fn main() { let x = 5; // ----------+-- 'b // | let r = &x; // --+-- 'a | // | | println!(\"r: {r}\"); // | | // --+ |\n} // ----------+ 示例 10-18:一个有效的引用,因为数据比引用有着更长的生命周期 这里 x 拥有生命周期 'b,比 'a 要大。这就意味着 r 可以引用 x:Rust 知道 r 中的引用在 x 有效的时候也总是有效的。 现在我们已经在一个具体的例子中展示了引用的生命周期位于何处,并讨论了 Rust 如何分析生命周期来保证引用总是有效的,接下来让我们聊聊在函数的上下文中参数和返回值的泛型生命周期。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 生命周期避免了悬垂引用","id":"185","title":"生命周期避免了悬垂引用"},"186":{"body":"让我们来编写一个返回两个字符串 slice 中较长者的函数。这个函数获取两个字符串 slice 并返回一个字符串 slice。一旦我们实现了 longest 函数,示例 10-19 中的代码应该会打印出 The longest string is abcd: 文件名:src/main.rs fn main() { let string1 = String::from(\"abcd\"); let string2 = \"xyz\"; let result = longest(string1.as_str(), string2); println!(\"The longest string is {result}\");\n} 示例 10-19:main 函数调用 longest 函数来寻找两个字符串 slice 中较长的一个 注意这个函数获取作为引用的字符串 slice,而不是字符串,因为我们不希望 longest 函数获取参数的所有权。参考之前第四章中的 “字符串 slice 作为参数” 部分中更多关于为什么示例 10-19 的参数正符合我们期望的讨论。 如果尝试像示例 10-20 中那样实现 longest 函数,它并不能编译: 文件名:src/main.rs # fn main() {\n# let string1 = String::from(\"abcd\");\n# let string2 = \"xyz\";\n# # let result = longest(string1.as_str(), string2);\n# println!(\"The longest string is {result}\");\n# }\n# fn longest(x: &str, y: &str) -> &str { if x.len() > y.len() { x } else { y }\n} 示例 10-20:一个 longest 函数的实现,它返回两个字符串 slice 中较长者,现在还不能编译 相应地会出现如下有关生命周期的错误: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10)\nerror[E0106]: missing lifetime specifier --> src/main.rs:9:33 |\n9 | fn longest(x: &str, y: &str) -> &str { | ---- ---- ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `x` or `y`\nhelp: consider introducing a named lifetime parameter |\n9 | fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { | ++++ ++ ++ ++ For more information about this error, try `rustc --explain E0106`.\nerror: could not compile `chapter10` (bin \"chapter10\") due to 1 previous error 提示文本揭示了返回值需要一个泛型生命周期参数,因为 Rust 并不知道将要返回的引用是指向 x 或 y。事实上我们也不知道,因为函数体中 if 块返回一个 x 的引用而 else 块返回一个 y 的引用! 当我们定义这个函数的时候,并不知道传递给函数的具体值,所以也不知道到底是 if 还是 else 会被执行。我们也不知道传入的引用的具体生命周期,所以也就不能像示例 10-17 和 10-18 那样通过观察作用域来确定返回的引用是否总是有效。借用检查器自身同样也无法确定,因为它不知道 x 和 y 的生命周期是如何与返回值的生命周期相关联的。为了修复这个错误,我们将增加泛型生命周期参数来定义引用间的关系以便借用检查器可以进行分析。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 函数中的泛型生命周期","id":"186","title":"函数中的泛型生命周期"},"187":{"body":"生命周期注解并不改变任何引用的生命周期的长短。相反它们描述了多个引用生命周期相互的关系,而不影响其生命周期。与当函数签名中指定了泛型类型参数后就可以接受任何类型一样,当指定了泛型生命周期后函数也能接受任何生命周期的引用。 生命周期注解有着一个不太常见的语法:生命周期参数名称必须以撇号(')开头,其名称通常全是小写,类似于泛型其名称非常短。大多数人使用 'a 作为第一个生命周期注解。生命周期参数注解位于引用的 & 之后,并有一个空格来将引用类型与生命周期注解分隔开。 这里有一些例子:我们有一个没有生命周期参数的 i32 的引用,一个有叫做 'a 的生命周期参数的 i32 的引用,和一个生命周期也是 'a 的 i32 的可变引用: &i32 // 引用\n&'a i32 // 带有显式生命周期的引用\n&'a mut i32 // 带有显式生命周期的可变引用 单个的生命周期注解本身没有多少意义,因为生命周期注解告诉 Rust 多个引用的泛型生命周期参数如何相互联系的。让我们在 longest 函数的上下文中理解生命周期注解如何相互联系。 例如如果函数有一个生命周期 'a 的 i32 的引用的参数 first。还有另一个同样是生命周期 'a 的 i32 的引用的参数 second。这两个生命周期注解意味着引用 first 和 second 必须与这泛型生命周期存在得一样久。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 生命周期注解语法","id":"187","title":"生命周期注解语法"},"188":{"body":"为了在函数签名中使用生命周期注解,需要在函数名和参数列表间的尖括号中声明泛型生命周期( lifetime )参数,就像泛型类型( type )参数一样。 我们希望函数签名表达如下限制:也就是这两个参数和返回的引用存活的一样久。(两个)参数和返回的引用的生命周期是相关的。就像示例 10-21 中在每个引用中都加上了 'a 那样。 文件名:src/main.rs # fn main() {\n# let string1 = String::from(\"abcd\");\n# let string2 = \"xyz\";\n# # let result = longest(string1.as_str(), string2);\n# println!(\"The longest string is {result}\");\n# }\n# fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { if x.len() > y.len() { x } else { y }\n} 示例 10-21:longest 函数定义指定了签名中所有的引用必须有相同的生命周期 'a 这段代码能够编译并会产生我们希望得到的示例 10-19 中的 main 函数的结果。 现在函数签名表明对于某些生命周期 'a,函数会获取两个参数,它们都是与生命周期 'a 存在的至少一样长的字符串 slice。函数会返回一个同样也与生命周期 'a 存在的至少一样长的字符串 slice。它的实际含义是 longest 函数返回的引用的生命周期与函数参数所引用的值的生命周期的较小者一致。这些关系就是我们希望 Rust 分析代码时所使用的。 记住通过在函数签名中指定生命周期参数时,我们并没有改变任何传入值或返回值的生命周期,而是指出任何不满足这个约束条件的值都将被借用检查器拒绝。注意 longest 函数并不需要知道 x 和 y 具体会存在多久,而只需要知道有某个可以被 'a 替代的作用域将会满足这个签名。 当在函数中使用生命周期注解时,这些注解出现在函数签名中,而不存在于函数体中的任何代码中。生命周期注解成为了函数约定的一部分,非常像签名中的类型。让函数签名包含生命周期约定意味着 Rust 编译器的工作变得更简单了。如果函数注解有误或者调用方法不对,编译器错误可以更准确地指出代码和限制的部分。如果不这么做的话,Rust 编译会对我们期望的生命周期关系做更多的推断,这样编译器可能只能指出离出问题地方很多步之外的代码。 当具体的引用被传递给 longest 时,被 'a 所替代的具体生命周期是 x 的作用域与 y 的作用域相重叠的那一部分。换一种说法就是泛型生命周期 'a 的具体生命周期等同于 x 和 y 的生命周期中较小的那一个。因为我们用相同的生命周期参数 'a 标注了返回的引用值,所以返回的引用值就能保证在 x 和 y 中较短的那个生命周期结束之前保持有效。 让我们看看如何通过传递拥有不同具体生命周期的引用来限制 longest 函数的使用。示例 10-22 是一个很直观的例子。 文件名:src/main.rs fn main() { let string1 = String::from(\"long string is long\"); { let string2 = String::from(\"xyz\"); let result = longest(string1.as_str(), string2.as_str()); println!(\"The longest string is {result}\"); }\n}\n# # fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {\n# if x.len() > y.len() {\n# x\n# } else {\n# y\n# }\n# } 示例 10-22:通过拥有不同的具体生命周期的 String 值调用 longest 函数 在这个例子中,string1 直到外部作用域结束都是有效的,string2 则在内部作用域中是有效的,而 result 则引用了一些直到内部作用域结束都是有效的值。借用检查器认可这些代码;它能够编译和运行,并打印出 The longest string is long string is long。 接下来,让我们尝试另外一个例子,该例子揭示了 result 的引用的生命周期必须是两个参数中较短的那个。以下代码将 result 变量的声明移动出内部作用域,但是将 result 和 string2 变量的赋值语句一同留在内部作用域中。接着,使用了变量 result 的 println! 也被移动到内部作用域之外。注意示例 10-23 中的代码不能通过编译: 文件名:src/main.rs fn main() { let string1 = String::from(\"long string is long\"); let result; { let string2 = String::from(\"xyz\"); result = longest(string1.as_str(), string2.as_str()); } println!(\"The longest string is {result}\");\n}\n# # fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {\n# if x.len() > y.len() {\n# x\n# } else {\n# y\n# }\n# } 示例 10-23:尝试在 string2 离开作用域之后使用 result 如果尝试编译会出现如下错误: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10)\nerror[E0597]: `string2` does not live long enough --> src/main.rs:6:44 |\n5 | let string2 = String::from(\"xyz\"); | ------- binding `string2` declared here\n6 | result = longest(string1.as_str(), string2.as_str()); | ^^^^^^^ borrowed value does not live long enough\n7 | } | - `string2` dropped here while still borrowed\n8 | println!(\"The longest string is {result}\"); | -------- borrow later used here For more information about this error, try `rustc --explain E0597`.\nerror: could not compile `chapter10` (bin \"chapter10\") due to 1 previous error 错误表明为了保证 println! 中的 result 是有效的,string2 需要直到外部作用域结束都是有效的。Rust 知道这些是因为(longest)函数的参数和返回值都使用了相同的生命周期参数 'a。 如果从人的角度读上述代码,我们可能会觉得这个代码是正确的。 string1 更长,因此 result 会包含指向 string1 的引用。因为 string1 尚未离开作用域,对于 println! 来说 string1 的引用仍然是有效的。然而,我们通过生命周期参数告诉 Rust 的是: longest 函数返回的引用的生命周期应该与传入参数的生命周期中较短那个保持一致。因此,借用检查器不允许示例 10-23 中的代码,因为它可能会存在无效的引用。 请尝试更多采用不同的值和不同生命周期的引用作为 longest 函数的参数和返回值的实验。并在开始编译前猜想你的实验能否通过借用检查器,接着编译一下看看你的理解是否正确!","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 函数签名中的生命周期注解","id":"188","title":"函数签名中的生命周期注解"},"189":{"body":"指定生命周期参数的正确方式依赖函数实现的具体功能。例如,如果将 longest 函数的实现修改为总是返回第一个参数而不是最长的字符串 slice,就不需要为参数 y 指定一个生命周期。如下代码将能够编译: 文件名:src/main.rs # fn main() {\n# let string1 = String::from(\"abcd\");\n# let string2 = \"efghijklmnopqrstuvwxyz\";\n# # let result = longest(string1.as_str(), string2);\n# println!(\"The longest string is {result}\");\n# }\n# fn longest<'a>(x: &'a str, y: &str) -> &'a str { x\n} 我们为参数 x 和返回值指定了生命周期参数 'a,不过没有为参数 y 指定,因为 y 的生命周期与参数 x 和返回值的生命周期没有任何关系。 当从函数返回一个引用,返回值的生命周期参数需要与一个参数的生命周期参数相匹配。如果返回的引用 没有 指向任何一个参数,那么唯一的可能就是它指向一个函数内部创建的值。然而它将会是一个悬垂引用,因为它将会在函数结束时离开作用域。尝试考虑这个并不能编译的 longest 函数实现: 文件名:src/main.rs # fn main() {\n# let string1 = String::from(\"abcd\");\n# let string2 = \"xyz\";\n# # let result = longest(string1.as_str(), string2);\n# println!(\"The longest string is {result}\");\n# }\n# fn longest<'a>(x: &str, y: &str) -> &'a str { let result = String::from(\"really long string\"); result.as_str()\n} 即便我们为返回值指定了生命周期参数 'a,这个实现却编译失败了,因为返回值的生命周期与参数完全没有关联。这里是会出现的错误信息: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10)\nerror[E0515]: cannot return value referencing local variable `result` --> src/main.rs:11:5 |\n11 | result.as_str() | ------^^^^^^^^^ | | | returns a value referencing data owned by the current function | `result` is borrowed here For more information about this error, try `rustc --explain E0515`.\nerror: could not compile `chapter10` (bin \"chapter10\") due to 1 previous error 出现的问题是 result 在 longest 函数的结尾将离开作用域并被清理,而我们尝试从函数返回一个 result 的引用。无法指定生命周期参数来改变悬垂引用,而且 Rust 也不允许我们创建一个悬垂引用。在这种情况,最好的解决方案是返回一个有所有权的数据类型而不是一个引用,这样函数调用者就需要负责清理这个值了。 综上,生命周期语法是用于将函数的多个参数与其返回值的生命周期进行关联的。一旦它们形成了某种关联,Rust 就有了足够的信息来允许内存安全的操作并阻止会产生悬垂指针亦或是违反内存安全的行为。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 深入理解生命周期","id":"189","title":"深入理解生命周期"},"19":{"body":"安装程序也自带一份文档的本地拷贝,可以离线阅读。运行 rustup doc 在浏览器中查看本地文档。 任何时候,如果你拿不准标准库中的类型或函数的用途和用法,请查阅应用程序接口(application programming interface,API)文档!","breadcrumbs":"入门指南 » 安装 » 本地文档","id":"19","title":"本地文档"},"190":{"body":"目前为止,我们定义的结构体全都包含拥有所有权的类型。也可以定义包含引用的结构体,不过这需要为结构体定义中的每一个引用添加生命周期注解。示例 10-24 中有一个存放了一个字符串 slice 的结构体 ImportantExcerpt。 文件名:src/main.rs struct ImportantExcerpt<'a> { part: &'a str,\n} fn main() { let novel = String::from(\"Call me Ishmael. Some years ago...\"); let first_sentence = novel.split('.').next().unwrap(); let i = ImportantExcerpt { part: first_sentence, };\n} 示例 10-24:一个存放引用的结构体,所以其定义需要生命周期注解 这个结构体有唯一一个字段 part,它存放了一个字符串 slice,这是一个引用。类似于泛型参数类型,必须在结构体名称后面的尖括号中声明泛型生命周期参数,以便在结构体定义中使用生命周期参数。这个注解意味着 ImportantExcerpt 的实例不能比其 part 字段中的引用存在的更久。 这里的 main 函数创建了一个 ImportantExcerpt 的实例,它存放了变量 novel 所拥有的 String 的第一个句子的引用。novel 的数据在 ImportantExcerpt 实例创建之前就存在。另外,直到 ImportantExcerpt 离开作用域之后 novel 都不会离开作用域,所以 ImportantExcerpt 实例中的引用是有效的。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 结构体定义中的生命周期注解","id":"190","title":"结构体定义中的生命周期注解"},"191":{"body":"现在我们已经知道了每一个引用都有一个生命周期,而且我们需要为那些使用了引用的函数或结构体指定生命周期。然而,第四章的示例 4-9 中有一个函数,如示例 10-25 所示,它没有生命周期注解却能编译成功: 文件名:src/lib.rs fn first_word(s: &str) -> &str { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return &s[0..i]; } } &s[..]\n}\n# # fn main() {\n# let my_string = String::from(\"hello world\");\n# # // first_word works on slices of `String`s\n# let word = first_word(&my_string[..]);\n# # let my_string_literal = \"hello world\";\n# # // first_word works on slices of string literals\n# let word = first_word(&my_string_literal[..]);\n# # // Because string literals *are* string slices already,\n# // this works too, without the slice syntax!\n# let word = first_word(my_string_literal);\n# } 示例 10-25:示例 4-9 定义了一个没有使用生命周期注解的函数,即便其参数和返回值都是引用 这个函数没有生命周期注解却能编译是由于一些历史原因:在早期版本(pre-1.0)的 Rust 中,这的确是不能编译的。每一个引用都必须有明确的生命周期。那时的函数签名将会写成这样: fn first_word<'a>(s: &'a str) -> &'a str { 在编写了很多 Rust 代码后,Rust 团队发现在特定情况下 Rust 程序员们总是重复地编写一模一样的生命周期注解。这些场景是可预测的并且遵循几个明确的模式。接着 Rust 团队就把这些模式编码进了 Rust 编译器中,如此借用检查器在这些情况下就能推断出生命周期而不再强制程序员显式的增加注解。 这里我们提到一些 Rust 的历史是因为更多的明确的模式被合并和添加到编译器中是完全可能的。未来只会需要更少的生命周期注解。 被编码进 Rust 引用分析的模式被称为 生命周期省略规则 ( lifetime elision rules )。这并不是需要程序员遵守的规则;这些规则是一系列特定的场景,此时编译器会考虑,如果代码符合这些场景,就无需明确指定生命周期。 省略规则并不提供完整的推断:如果 Rust 在明确遵守这些规则的前提下变量的生命周期仍然是模棱两可的话,它不会猜测剩余引用的生命周期应该是什么。编译器会在可以通过增加生命周期注解来解决错误问题的地方给出一个错误提示,而不是进行推断或猜测。 函数或方法的参数的生命周期被称为 输入生命周期 ( input lifetimes ),而返回值的生命周期被称为 输出生命周期 ( output lifetimes )。 编译器采用三条规则来判断引用何时不需要明确的注解。第一条规则适用于输入生命周期,后两条规则适用于输出生命周期。如果编译器检查完这三条规则后仍然存在没有计算出生命周期的引用,编译器将会停止并生成错误。这些规则适用于 fn 定义,以及 impl 块。 第一条规则是编译器为每一个引用参数都分配一个生命周期参数。换句话说就是,函数有一个引用参数的就有一个生命周期参数:fn foo<'a>(x: &'a i32),有两个引用参数的函数就有两个不同的生命周期参数,fn foo<'a, 'b>(x: &'a i32, y: &'b i32),依此类推。 第二条规则是如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数:fn foo<'a>(x: &'a i32) -> &'a i32。 第三条规则是如果方法有多个输入生命周期参数并且其中一个参数是 &self 或 &mut self,说明是个对象的方法 (method)(译者注:这里涉及 rust 的面向对象参见 17 章),那么所有输出生命周期参数被赋予 self 的生命周期。第三条规则使得方法更容易读写,因为只需更少的符号。 假设我们自己就是编译器。并应用这些规则来计算示例 10-25 中 first_word 函数签名中的引用的生命周期。开始时签名中的引用并没有关联任何生命周期: fn first_word(s: &str) -> &str { 接着编译器应用第一条规则,也就是每个引用参数都有其自己的生命周期。我们像往常一样称之为 'a,所以现在签名看起来像这样: fn first_word<'a>(s: &'a str) -> &str { 对于第二条规则,因为这里正好只有一个输入生命周期参数所以是适用的。第二条规则表明输入参数的生命周期将被赋予输出生命周期参数,所以现在签名看起来像这样: fn first_word<'a>(s: &'a str) -> &'a str { 现在这个函数签名中的所有引用都有了生命周期,如此编译器可以继续它的分析而无须程序员标记这个函数签名中的生命周期。 让我们再看看另一个例子,这次我们从示例 10-20 中没有生命周期参数的 longest 函数开始: fn longest(x: &str, y: &str) -> &str { 再次假设我们自己就是编译器并应用第一条规则:每个引用参数都有其自己的生命周期。这次有两个参数,所以就有两个(不同的)生命周期: fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &str { 再来应用第二条规则,因为函数存在多个输入生命周期,它并不适用于这种情况。再来看第三条规则,它同样也不适用,这是因为没有 self 参数。应用了三个规则之后编译器还没有计算出返回值类型的生命周期。这就是在编译示例 10-20 的代码时会出现错误的原因:编译器使用所有已知的生命周期省略规则,仍不能计算出签名中所有引用的生命周期。 因为第三条规则真正能够适用的就只有方法签名,现在就让我们看看那种情况中的生命周期,并看看为什么这条规则意味着我们经常不需要在方法签名中标注生命周期。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 生命周期省略(Lifetime Elision)","id":"191","title":"生命周期省略(Lifetime Elision)"},"192":{"body":"当为带有生命周期的结构体实现方法时,其语法依然类似示例 10-11 中展示的泛型类型参数的语法。我们在哪里声明和使用生命周期参数,取决于它们是与结构体字段相关还是与方法参数和返回值相关。 (实现方法时)结构体字段的生命周期必须总是在 impl 关键字之后声明并在结构体名称之后被使用,因为这些生命周期是结构体类型的一部分。 impl 块里的方法签名中,引用可能与结构体字段中的引用相关联,也可能是独立的。另外,生命周期省略规则也经常让我们无需在方法签名中使用生命周期注解。让我们看看一些使用示例 10-24 中定义的结构体 ImportantExcerpt 的例子。 首先,这里有一个方法 level。其唯一的参数是 self 的引用,而且返回值只是一个 i32,并不引用任何值: # struct ImportantExcerpt<'a> {\n# part: &'a str,\n# }\n# impl<'a> ImportantExcerpt<'a> { fn level(&self) -> i32 { 3 }\n}\n# # impl<'a> ImportantExcerpt<'a> {\n# fn announce_and_return_part(&self, announcement: &str) -> &str {\n# println!(\"Attention please: {announcement}\");\n# self.part\n# }\n# }\n# # fn main() {\n# let novel = String::from(\"Call me Ishmael. Some years ago...\");\n# let first_sentence = novel.split('.').next().unwrap();\n# let i = ImportantExcerpt {\n# part: first_sentence,\n# };\n# } impl 之后和类型名称之后的生命周期参数是必要的,不过因为第一条生命周期规则我们并不必须标注 self 引用的生命周期。 这里是一个适用于第三条生命周期省略规则的例子: # struct ImportantExcerpt<'a> {\n# part: &'a str,\n# }\n# # impl<'a> ImportantExcerpt<'a> {\n# fn level(&self) -> i32 {\n# 3\n# }\n# }\n# impl<'a> ImportantExcerpt<'a> { fn announce_and_return_part(&self, announcement: &str) -> &str { println!(\"Attention please: {announcement}\"); self.part }\n}\n# # fn main() {\n# let novel = String::from(\"Call me Ishmael. Some years ago...\");\n# let first_sentence = novel.split('.').next().unwrap();\n# let i = ImportantExcerpt {\n# part: first_sentence,\n# };\n# } 这里有两个输入生命周期,所以 Rust 应用第一条生命周期省略规则并给予 &self 和 announcement 它们各自的生命周期。接着,因为其中一个参数是 &self,返回值类型被赋予了 &self 的生命周期,这样所有的生命周期都被计算出来了。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 方法定义中的生命周期注解","id":"192","title":"方法定义中的生命周期注解"},"193":{"body":"这里有一种特殊的生命周期值得讨论:'static,其生命周期 能够 存活于整个程序期间。所有的字符串字面值都拥有 'static 生命周期,我们也可以选择像下面这样标注出来: let s: &'static str = \"I have a static lifetime.\"; 这个字符串的文本被直接储存在程序的二进制文件中而这个文件总是可用的。因此所有的字符串字面值都是 'static 的。 你可能在错误信息的帮助文本中见过使用 'static 生命周期的建议,不过将引用指定为 'static 之前,思考一下这个引用是否真的在整个程序的生命周期里都有效,以及你是否希望它存在得这么久。大部分情况中,推荐 'static 生命周期的错误信息都是尝试创建一个悬垂引用或者可用的生命周期不匹配的结果。在这种情况下的解决方案是修复这些问题而不是指定一个 'static 的生命周期。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 静态生命周期","id":"193","title":"静态生命周期"},"194":{"body":"让我们简要的看一下在同一函数中指定泛型类型参数、trait bounds 和生命周期的语法! # fn main() {\n# let string1 = String::from(\"abcd\");\n# let string2 = \"xyz\";\n# # let result = longest_with_an_announcement(\n# string1.as_str(),\n# string2,\n# \"Today is someone's birthday!\",\n# );\n# println!(\"The longest string is {result}\");\n# }\n# use std::fmt::Display; fn longest_with_an_announcement<'a, T>( x: &'a str, y: &'a str, ann: T,\n) -> &'a str\nwhere T: Display,\n{ println!(\"Announcement! {ann}\"); if x.len() > y.len() { x } else { y }\n} 这个是示例 10-21 中那个返回两个字符串 slice 中较长者的 longest 函数,不过带有一个额外的参数 ann。ann 的类型是泛型 T,它可以被放入任何实现了 where 从句中指定的 Display trait 的类型。这个额外的参数会使用 {} 打印,这也就是为什么 Display trait bound 是必须的。因为生命周期也是泛型,所以生命周期参数 'a 和泛型类型参数 T 都位于函数名后的同一尖括号列表中。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 结合泛型类型参数、trait bounds 和生命周期","id":"194","title":"结合泛型类型参数、trait bounds 和生命周期"},"195":{"body":"这一章介绍了很多的内容!现在你知道了泛型类型参数、trait 和 trait bounds 以及泛型生命周期类型,你已经准备好编写既不重复又能适用于多种场景的代码了。泛型类型参数意味着代码可以适用于不同的类型。trait 和 trait bounds 保证了即使类型是泛型的,这些类型也会拥有所需要的行为。由生命周期注解所指定的引用生命周期之间的关系保证了这些灵活多变的代码不会出现悬垂引用。而所有的这一切发生在编译时所以不会影响运行时效率! 你可能不会相信,这个话题还有更多需要学习的内容:第十八章会讨论 trait 对象,这是另一种使用 trait 的方式。还有更多更复杂的涉及生命周期注解的场景,只有在非常高级的情况下才会需要它们;对于这些内容,请阅读 Rust Reference 。不过接下来,让我们聊聊如何在 Rust 中编写测试,来确保代码的所有功能能像我们希望的那样工作!","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 总结","id":"195","title":"总结"},"196":{"body":"ch11-00-testing.md commit 765318b844569a642ceef7bf1adab9639cbf6af3 Edsger W. Dijkstra 在其 1972 年的文章【谦卑的程序员】(“The Humble Programmer”)中说到 “软件测试是证明 bug 存在的有效方法,而证明其不存在时则显得令人绝望的不足。”(“Program testing can be a very effective way to show the presence of bugs, but it is hopelessly inadequate for showing their absence.”)这并不意味着我们不该尽可能地测试软件! 程序的正确性意味着代码如我们期望的那样运行。Rust 是一个相当注重正确性的编程语言,不过正确性是一个难以证明的复杂主题。Rust 的类型系统在此问题上下了很大的功夫,不过类型系统不可能捕获所有问题。为此,Rust 包含了编写自动化软件测试的功能支持。 假设我们可以编写一个叫做 add_two 的将传递给它的值加二的函数。它的签名有一个整型参数并返回一个整型值。当实现和编译这个函数时,Rust 会进行所有目前我们已经见过的类型检查和借用检查,例如,这些检查会确保我们不会传递 String 或无效的引用给这个函数。Rust 所 不能 检查的是这个函数是否会准确的完成我们期望的工作:返回参数加二后的值,而不是比如说参数加 10 或减 50 的值!这也就是测试出场的地方。 我们可以编写测试断言,比如说,当传递 3 给 add_two 函数时,返回值是 5。无论何时对代码进行修改,都可以运行测试来确保任何现存的正确行为没有被改变。 测试是一项复杂的技能:虽然不能在一个章节的篇幅中介绍如何编写好的测试的每个细节,但我们还是会讨论 Rust 测试功能的机制。我们会讲到编写测试时会用到的注解和宏,运行测试的默认行为和选项,以及如何将测试组织成单元测试和集成测试。","breadcrumbs":"编写自动化测试 » 编写自动化测试","id":"196","title":"编写自动化测试"},"197":{"body":"ch11-01-writing-tests.md commit 6e2fe7c0f085989cc498cec139e717e2af172cb7 Rust 中的测试函数是用来验证非测试代码是否是按照期望的方式运行的。测试函数体通常执行如下三种操作: 设置任何所需的数据或状态 运行需要测试的代码 断言其结果是我们所期望的 让我们看看 Rust 提供的专门用来编写测试的功能:test 属性、一些宏和 should_panic 属性。","breadcrumbs":"编写自动化测试 » 如何编写测试 » 如何编写测试","id":"197","title":"如何编写测试"},"198":{"body":"作为最简单例子,Rust 中的测试就是一个带有 test 属性注解的函数。属性(attribute)是关于 Rust 代码片段的元数据;第五章中结构体中用到的 derive 属性就是一个例子。为了将一个函数变成测试函数,需要在 fn 行之前加上 #[test]。当使用 cargo test 命令运行测试时,Rust 会构建一个测试执行程序用来调用被标注的函数,并报告每一个测试是通过还是失败。 每次使用 Cargo 新建一个库项目时,它会自动为我们生成一个测试模块和一个测试函数。这个模块提供了一个编写测试的模板,为此每次开始新项目时不必去查找测试函数的具体结构和语法了。当然你也可以额外增加任意多的测试函数以及测试模块! 在实际编写测试代码之前,让我们先通过尝试那些自动生成的测试模版来探索测试是如何工作的。接着,我们会写一些真正的测试,调用我们编写的代码并断言它们的行为的正确性。 让我们创建一个新的库项目 adder,它会将两个数字相加: $ cargo new adder --lib Created library `adder` project\n$ cd adder adder 库中 src/lib.rs 的内容应该看起来如示例 11-1 所示: 文件名:src/lib.rs pub fn add(left: usize, right: usize) -> usize { left + right\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn it_works() { let result = add(2, 2); assert_eq!(result, 4); }\n} 示例 11-1:由 cargo new 自动生成的测试模块和函数 现在让我们暂时忽略 tests 模块和 #[cfg(test)] 注解并只关注函数本身。注意 fn 行之前的 #[test]:这个属性表明这是一个测试函数,这样测试执行者就知道将其作为测试处理。tests 模块中也可以有非测试的函数来帮助我们建立通用场景或进行常见操作,必须每次都标明哪些函数是测试。 示例函数体通过使用 assert_eq! 宏来断言 2 加 2 等于 4。一个典型的测试的格式,就是像这个例子中的断言一样。接下来运行就可以看到测试通过。 cargo test 命令会运行项目中所有的测试,如示例 11-2 所示: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.57s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest tests::it_works ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 示例 11-2:运行自动生成测试的输出 Cargo 编译并运行了测试。可以看到 running 1 test 这一行。下一行显示了生成的测试函数的名称,它是 it_works,以及测试的运行结果,ok。接着可以看到全体测试运行结果的摘要:test result: ok. 意味着所有测试都通过了。1 passed; 0 failed 表示通过或失败的测试数量。 可以将一个测试标记为忽略这样在特定情况下它就不会运行;本章之后的 “除非特别指定否则忽略某些测试” 部分会介绍它。因为之前我们并没有将任何测试标记为忽略,所以摘要中会显示 0 ignored。我们也没有过滤需要运行的测试,所以摘要中会显示0 filtered out。在下一部分 “控制测试如何运行” 会讨论忽略和过滤测试。 0 measured 统计是针对性能测试的。性能测试(benchmark tests)在编写本书时,仍只能用于 Rust 开发版(nightly Rust)。请查看 性能测试的文档 了解更多。 测试输出中的以 Doc-tests adder 开头的这一部分是所有文档测试的结果。我们现在并没有任何文档测试,不过 Rust 会编译任何在 API 文档中的代码示例。这个功能帮助我们使文档和代码保持同步!在第十四章的 “文档注释作为测试” 部分会讲到如何编写文档测试。现在我们将忽略 Doc-tests 部分的输出。 让我们开始自定义测试来满足我们的需求。首先给 it_works 函数起个不同的名字,比如 exploration,像这样: 文件名:src/lib.rs pub fn add(left: usize, right: usize) -> usize { left + right\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn exploration() { let result = add(2, 2); assert_eq!(result, 4); }\n} 并再次运行 cargo test。现在输出中将出现 exploration 而不是 it_works: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.59s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest tests::exploration ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 现在让我们增加另一个测试,不过这一次是一个会失败的测试!当测试函数中出现 panic 时测试就失败了。每一个测试都在一个新线程中运行,当主线程发现测试线程异常了,就将对应测试标记为失败。第九章讲到了最简单的造成 panic 的方法:调用 panic! 宏。写入新测试 another 后, src/lib.rs 现在看起来如示例 11-3 所示: 文件名:src/lib.rs pub fn add(left: usize, right: usize) -> usize { left + right\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn exploration() { let result = add(2, 2); assert_eq!(result, 4); } #[test] fn another() { panic!(\"Make this test fail\"); }\n} 示例 11-3:增加第二个因调用了 panic! 而失败的测试 再次 cargo test 运行测试。输出应该看起来像示例 11-4,它表明 exploration 测试通过了而 another 失败了: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.72s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 2 tests\ntest tests::another ... FAILED\ntest tests::exploration ... ok failures: ---- tests::another stdout ----\nthread 'tests::another' panicked at src/lib.rs:17:9:\nMake this test fail\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::another test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 示例 11-4:一个测试通过和一个测试失败的测试结果 test tests::another 这一行是 FAILED 而不是 ok 了。在单独测试结果和摘要之间多了两个新的部分:第一个部分显示了测试失败的详细原因。在这个例子中,我们看到 another 因为在 src/lib.rs 的第 10 行 panicked at 'Make this test fail' 而失败的详细信息。下一部分列出了所有失败的测试,这在有很多测试和很多失败测试的详细输出时很有帮助。我们可以通过使用失败测试的名称来只运行这个测试,以便调试;下一部分 “控制测试如何运行” 会讲到更多运行测试的方法。 最后是摘要行:总体上讲,测试结果是 FAILED。有一个测试通过和一个测试失败。 现在我们见过不同场景中测试结果是什么样子的了,再来看看除 panic! 之外的一些在测试中有帮助的宏吧。","breadcrumbs":"编写自动化测试 » 如何编写测试 » 测试函数剖析","id":"198","title":"测试函数剖析"},"199":{"body":"assert! 宏由标准库提供,在希望确保测试中一些条件为 true 时非常有用。需要向 assert! 宏提供一个求值为布尔值的参数。如果值是 true,assert! 什么也不做,同时测试会通过。如果值为 false,assert! 调用 panic! 宏,这会导致测试失败。assert! 宏帮助我们检查代码是否以期望的方式运行。 回忆一下第五章中,示例 5-15 中有一个 Rectangle 结构体和一个 can_hold 方法,在示例 11-5 中再次使用它们。将它们放进 src/lib.rs 并使用 assert! 宏编写一些测试。 文件名:src/lib.rs #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} impl Rectangle { fn can_hold(&self, other: &Rectangle) -> bool { self.width > other.width && self.height > other.height }\n} 示例 11-5:第五章中 Rectangle 结构体和其 can_hold 方法 can_hold 方法返回一个布尔值,这意味着它完美符合 assert! 宏的使用场景。在示例 11-6 中,让我们编写一个 can_hold 方法的测试来作为练习,这里创建一个长为 8 宽为 7 的 Rectangle 实例,并假设它可以放得下另一个长为 5 宽为 1 的 Rectangle 实例: 文件名:src/lib.rs # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# # impl Rectangle {\n# fn can_hold(&self, other: &Rectangle) -> bool {\n# self.width > other.width && self.height > other.height\n# }\n# }\n# #[cfg(test)]\nmod tests { use super::*; #[test] fn larger_can_hold_smaller() { let larger = Rectangle { width: 8, height: 7, }; let smaller = Rectangle { width: 5, height: 1, }; assert!(larger.can_hold(&smaller)); }\n} 示例 11-6:一个 can_hold 的测试,检查一个较大的矩形确实能放得下一个较小的矩形 注意在 tests 模块中新增加了一行:use super::*;。tests 是一个普通的模块,它遵循第七章 “路径用于引用模块树中的项” 部分介绍的可见性规则。因为这是一个内部模块,要测试外部模块中的代码,需要将其引入到内部模块的作用域中。这里选择使用 glob 全局导入,以便在 tests 模块中使用所有在外部模块定义的内容。 我们将测试命名为 larger_can_hold_smaller,并创建所需的两个 Rectangle 实例。接着调用 assert! 宏并传递 larger.can_hold(&smaller) 调用的结果作为参数。这个表达式预期会返回 true,所以测试应该通过。让我们拭目以待! $ cargo test Compiling rectangle v0.1.0 (file:///projects/rectangle) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e) running 1 test\ntest tests::larger_can_hold_smaller ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests rectangle running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 它确实通过了!再来增加另一个测试,这一回断言一个更小的矩形不能放下一个更大的矩形: 文件名:src/lib.rs # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# # impl Rectangle {\n# fn can_hold(&self, other: &Rectangle) -> bool {\n# self.width > other.width && self.height > other.height\n# }\n# }\n# #[cfg(test)]\nmod tests { use super::*; #[test] fn larger_can_hold_smaller() { // --snip--\n# let larger = Rectangle {\n# width: 8,\n# height: 7,\n# };\n# let smaller = Rectangle {\n# width: 5,\n# height: 1,\n# };\n# # assert!(larger.can_hold(&smaller)); } #[test] fn smaller_cannot_hold_larger() { let larger = Rectangle { width: 8, height: 7, }; let smaller = Rectangle { width: 5, height: 1, }; assert!(!smaller.can_hold(&larger)); }\n} 因为这里 can_hold 函数的正确结果是 false ,我们需要将这个结果取反后传递给 assert! 宏。因此 can_hold 返回 false 时测试就会通过: $ cargo test Compiling rectangle v0.1.0 (file:///projects/rectangle) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e) running 2 tests\ntest tests::larger_can_hold_smaller ... ok\ntest tests::smaller_cannot_hold_larger ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests rectangle running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 两个通过的测试!现在让我们看看如果引入一个 bug 的话测试结果会发生什么。将 can_hold 方法中比较长度时本应使用大于号的地方改成小于号: # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# // --snip--\nimpl Rectangle { fn can_hold(&self, other: &Rectangle) -> bool { self.width < other.width && self.height > other.height }\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn larger_can_hold_smaller() {\n# let larger = Rectangle {\n# width: 8,\n# height: 7,\n# };\n# let smaller = Rectangle {\n# width: 5,\n# height: 1,\n# };\n# # assert!(larger.can_hold(&smaller));\n# }\n# # #[test]\n# fn smaller_cannot_hold_larger() {\n# let larger = Rectangle {\n# width: 8,\n# height: 7,\n# };\n# let smaller = Rectangle {\n# width: 5,\n# height: 1,\n# };\n# # assert!(!smaller.can_hold(&larger));\n# }\n# } 现在运行测试会产生: $ cargo test Compiling rectangle v0.1.0 (file:///projects/rectangle) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e) running 2 tests\ntest tests::larger_can_hold_smaller ... FAILED\ntest tests::smaller_cannot_hold_larger ... ok failures: ---- tests::larger_can_hold_smaller stdout ----\nthread 'tests::larger_can_hold_smaller' panicked at src/lib.rs:28:9:\nassertion failed: larger.can_hold(&smaller)\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::larger_can_hold_smaller test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 我们的测试捕获了 bug!因为 larger.length 是 8 而 smaller.length 是 5,can_hold 中的长度比较现在因为 8 不小于 5 而返回 false。","breadcrumbs":"编写自动化测试 » 如何编写测试 » 使用 assert! 宏来检查结果","id":"199","title":"使用 assert! 宏来检查结果"},"2":{"body":"ch00-00-introduction.md commit 1fb74c3f1d8aeba39373e9f4cdb9a4bdca95604f 注意:此书的英文原版与 No Starch Press 出版的《 The Rust Programming Language 》纸质版和电子版一致。 欢迎阅读《Rust 程序设计语言》,这是一本关于 Rust 的入门书籍。Rust 程序设计语言能帮助你编写更快、更可靠的软件。在编程语言设计中,高层的工程学与底层的控制往往是难以兼得的;而 Rust 则试图挑战这一矛盾。通过平衡强大的技术能力与优秀的开发者体验,Rust 为你提供了控制底层细节(如内存使用)的选项,而无需承受通常与此类控制相关的所有繁琐细节。","breadcrumbs":"简介 » 简介","id":"2","title":"简介"},"20":{"body":"ch01-02-hello-world.md commit 1fb74c3f1d8aeba39373e9f4cdb9a4bdca95604f 既然安装好了 Rust,是时候来编写第一个 Rust 程序了。当学习一门新语言的时候,使用该语言在屏幕上打印 Hello, world! 是一项传统,我们将沿用这一传统! 注意:本书假设你熟悉基本的命令行操作。Rust 对于你的编辑器、工具,以及代码位于何处并没有特定的要求,如果你更倾向于使用集成开发环境(IDE),而不是命令行,请尽管使用你喜欢的 IDE。目前很多 IDE 都在一定程度上支持 Rust;查看 IDE 文档以了解更多细节。Rust 团队一直致力于借助 rust-analyzer 提供强大的 IDE 支持。详见 附录 D 。","breadcrumbs":"入门指南 » Hello, World! » Hello, World!","id":"20","title":"Hello, World!"},"200":{"body":"测试功能的一个常用方法是将需要测试代码的值与期望值做比较,并检查是否相等。可以通过向 assert! 宏传递一个使用 == 运算符的表达式来做到。不过这个操作实在是太常见了,以至于标准库提供了一对宏来更方便的处理这些操作 —— assert_eq! 和 assert_ne!。这两个宏分别比较两个值是相等还是不相等。当断言失败时它们也会打印出这两个值具体是什么,以便于观察测试 为什么 失败,而 assert! 只会打印出它从 == 表达式中得到了 false 值,而不是打印导致 false 的两个值。 示例 11-7 中,让我们编写一个对其参数加二并返回结果的函数 add_two。接着使用 assert_eq! 宏测试这个函数。 文件名:src/lib.rs pub fn add_two(a: usize) -> usize { a + 2\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn it_adds_two() { let result = add_two(2); assert_eq!(result, 4); }\n} 示例 11-7:使用 assert_eq! 宏测试 add_two 函数 测试通过了! $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest tests::it_adds_two ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 我们传递给 assert_eq! 宏的第一个参数 4 ,它等于调用 add_two(2) 的结果。测试中的这一行 test tests::it_adds_two ... ok 中 ok 表明测试通过! 在代码中引入一个 bug 来看看使用 assert_eq! 的测试失败是什么样的。修改 add_two 函数的实现使其加 3: pub fn add_two(a: usize) -> usize { a + 3\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn it_adds_two() {\n# let result = add_two(2);\n# assert_eq!(result, 4);\n# }\n# } 再次运行测试: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.61s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest tests::it_adds_two ... FAILED failures: ---- tests::it_adds_two stdout ----\nthread 'tests::it_adds_two' panicked at src/lib.rs:12:9:\nassertion `left == right` failed left: 5 right: 4\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::it_adds_two test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 测试捕获到了 bug!it_adds_two 测试失败,错误信息告诉我们断言失败了,它告诉我们 assertion failed: `(left == right)` 以及 left 和 right 的值是什么。这个错误信息有助于我们开始调试:它说 assert_eq! 的 left 参数是 4,而 right 参数,也就是 add_two(2) 的结果,是 5。可以想象当有很多测试在运行时这些信息是多么的有用。 需要注意的是,在一些语言和测试框架中,断言两个值相等的函数的参数被称为 expected 和 actual,而且指定参数的顺序非常重要。然而在 Rust 中,它们则叫做 left 和 right,同时指定期望的值和被测试代码产生的值的顺序并不重要。这个测试中的断言也可以写成 assert_eq!(add_two(2), 4),这时失败信息仍同样是 assertion failed: `(left == right)`。 assert_ne! 宏在传递给它的两个值不相等时通过,而在相等时失败。在代码按预期运行,我们不确定值 会 是什么,不过能确定值绝对 不会 是什么的时候,这个宏最有用处。例如,如果一个函数保证会以某种方式改变其输出,不过这种改变方式是由运行测试时是星期几来决定的,这时最好的断言可能就是函数的输出不等于其输入。 assert_eq! 和 assert_ne! 宏在底层分别使用了 == 和 !=。当断言失败时,这些宏会使用调试格式打印出其参数,这意味着被比较的值必须实现了 PartialEq 和 Debug trait。所有的基本类型和大部分标准库类型都实现了这些 trait。对于自定义的结构体和枚举,需要实现 PartialEq 才能断言它们的值是否相等。需要实现 Debug 才能在断言失败时打印它们的值。因为这两个 trait 都是派生 trait,如第五章示例 5-12 所提到的,通常可以直接在结构体或枚举上添加 #[derive(PartialEq, Debug)] 注解。附录 C “可派生 trait” 中有更多关于这些和其他派生 trait 的详细信息。","breadcrumbs":"编写自动化测试 » 如何编写测试 » 使用 assert_eq! 和 assert_ne! 宏来测试相等","id":"200","title":"使用 assert_eq! 和 assert_ne! 宏来测试相等"},"201":{"body":"你也可以向 assert!、assert_eq! 和 assert_ne! 宏传递一个可选的失败信息参数,可以在测试失败时将自定义失败信息一同打印出来。任何在 assert! 的一个必需参数和 assert_eq! 和 assert_ne! 的两个必需参数之后指定的参数都会传递给 format! 宏(在第八章的 “使用 + 运算符或 format! 宏拼接字符串” 部分讨论过),所以可以传递一个包含 {} 占位符的格式字符串和需要放入占位符的值。自定义信息有助于记录断言的意义;当测试失败时就能更好的理解代码出了什么问题。 例如,比如说有一个根据人名进行问候的函数,而我们希望测试将传递给函数的人名显示在输出中: 文件名:src/lib.rs pub fn greeting(name: &str) -> String { format!(\"Hello {name}!\")\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn greeting_contains_name() { let result = greeting(\"Carol\"); assert!(result.contains(\"Carol\")); }\n} 这个程序的需求还没有被确定,因此问候文本开头的 Hello 文本很可能会改变。然而我们并不想在需求改变时不得不更新测试,所以相比检查 greeting 函数返回的确切值,我们将仅仅断言输出的文本中包含输入参数。 让我们通过将 greeting 改为不包含 name 在代码中引入一个 bug 来测试失败时是怎样的: pub fn greeting(name: &str) -> String { String::from(\"Hello!\")\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn greeting_contains_name() {\n# let result = greeting(\"Carol\");\n# assert!(result.contains(\"Carol\"));\n# }\n# } 运行测试会产生: $ cargo test Compiling greeter v0.1.0 (file:///projects/greeter) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.91s Running unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a) running 1 test\ntest tests::greeting_contains_name ... FAILED failures: ---- tests::greeting_contains_name stdout ----\nthread 'tests::greeting_contains_name' panicked at src/lib.rs:12:9:\nassertion failed: result.contains(\"Carol\")\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::greeting_contains_name test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 结果仅仅告诉了我们断言失败了和失败的行号。一个更有用的失败信息应该打印出 greeting 函数的值。让我们为测试函数增加一个自定义失败信息参数:带占位符的格式字符串,以及 greeting 函数的值: # pub fn greeting(name: &str) -> String {\n# String::from(\"Hello!\")\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# #[test] fn greeting_contains_name() { let result = greeting(\"Carol\"); assert!( result.contains(\"Carol\"), \"Greeting did not contain name, value was `{result}`\" ); }\n# } 现在如果再次运行测试,将会看到更有价值的信息: $ cargo test Compiling greeter v0.1.0 (file:///projects/greeter) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.93s Running unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a) running 1 test\ntest tests::greeting_contains_name ... FAILED failures: ---- tests::greeting_contains_name stdout ----\nthread 'tests::greeting_contains_name' panicked at src/lib.rs:12:9:\nGreeting did not contain name, value was `Hello!`\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::greeting_contains_name test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 可以在测试输出中看到所取得的确切的值,这会帮助我们理解真正发生了什么,而不是期望发生什么。","breadcrumbs":"编写自动化测试 » 如何编写测试 » 自定义失败信息","id":"201","title":"自定义失败信息"},"202":{"body":"除了检查返回值之外,检查代码是否按照期望处理错误也是很重要的。例如,考虑第九章示例 9-10 创建的 Guess 类型。其他使用 Guess 的代码都是基于 Guess 实例仅有的值范围在 1 到 100 的前提。可以编写一个测试来确保创建一个超出范围的值的 Guess 实例会 panic。 可以通过对函数增加另一个属性 should_panic 来实现这些。这个属性在函数中的代码 panic 时会通过,而在其中的代码没有 panic 时失败。 示例 11-8 展示了一个检查 Guess::new 是否按照我们的期望出错的测试: 文件名:src/lib.rs pub struct Guess { value: i32,\n} impl Guess { pub fn new(value: i32) -> Guess { if value < 1 || value > 100 { panic!(\"Guess value must be between 1 and 100, got {value}.\"); } Guess { value } }\n} #[cfg(test)]\nmod tests { use super::*; #[test] #[should_panic] fn greater_than_100() { Guess::new(200); }\n} 示例 11-8:测试会造成 panic! 的条件 #[should_panic] 属性位于 #[test] 之后,对应的测试函数之前。让我们看看测试通过时它是什么样子: $ cargo test Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d) running 1 test\ntest tests::greater_than_100 - should panic ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests guessing_game running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 看起来不错!现在在代码中引入 bug,移除 new 函数在值大于 100 时会 panic 的条件: # pub struct Guess {\n# value: i32,\n# }\n# // --snip--\nimpl Guess { pub fn new(value: i32) -> Guess { if value < 1 { panic!(\"Guess value must be between 1 and 100, got {value}.\"); } Guess { value } }\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# #[should_panic]\n# fn greater_than_100() {\n# Guess::new(200);\n# }\n# } 如果运行示例 11-8 的测试,它会失败: $ cargo test Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.62s Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d) running 1 test\ntest tests::greater_than_100 - should panic ... FAILED failures: ---- tests::greater_than_100 stdout ----\nnote: test did not panic as expected failures: tests::greater_than_100 test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 这回并没有得到非常有用的信息,不过一旦我们观察测试函数,会发现它标注了 #[should_panic]。这个错误意味着代码中测试函数 Guess::new(200) 并没有产生 panic。 然而 should_panic 测试结果可能会非常含糊不清。should_panic 甚至在一些不是我们期望的原因而导致 panic 时也会通过。为了使 should_panic 测试结果更精确,我们可以给 should_panic 属性增加一个可选的 expected 参数。测试工具会确保错误信息中包含其提供的文本。例如,考虑示例 11-9 中修改过的 Guess,这里 new 函数根据其值是过大还或者过小而提供不同的 panic 信息: 文件名:src/lib.rs # pub struct Guess {\n# value: i32,\n# }\n# // --snip-- impl Guess { pub fn new(value: i32) -> Guess { if value < 1 { panic!( \"Guess value must be greater than or equal to 1, got {value}.\" ); } else if value > 100 { panic!( \"Guess value must be less than or equal to 100, got {value}.\" ); } Guess { value } }\n} #[cfg(test)]\nmod tests { use super::*; #[test] #[should_panic(expected = \"less than or equal to 100\")] fn greater_than_100() { Guess::new(200); }\n} 示例 11-9:一个会带有特定错误信息的 panic! 条件的测试 这个测试会通过,因为 should_panic 属性中 expected 参数提供的值是 Guess::new 函数 panic 信息的子串。我们可以指定期望的整个 panic 信息,在这个例子中是 Guess value must be less than or equal to 100, got 200. 。 expected 信息的选择取决于 panic 信息有多独特或动态,和你希望测试有多准确。在这个例子中,错误信息的子字符串足以确保函数在 else if value > 100 的情况下运行。 为了观察带有 expected 信息的 should_panic 测试失败时会发生什么,让我们再次引入一个 bug,将 if value < 1 和 else if value > 100 的代码块对换: # pub struct Guess {\n# value: i32,\n# }\n# # impl Guess {\n# pub fn new(value: i32) -> Guess { if value < 1 { panic!( \"Guess value must be less than or equal to 100, got {value}.\" ); } else if value > 100 { panic!( \"Guess value must be greater than or equal to 1, got {value}.\" ); }\n# # Guess { value }\n# }\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# #[should_panic(expected = \"less than or equal to 100\")]\n# fn greater_than_100() {\n# Guess::new(200);\n# }\n# } 这一次运行 should_panic 测试,它会失败: $ cargo test Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d) running 1 test\ntest tests::greater_than_100 - should panic ... FAILED failures: ---- tests::greater_than_100 stdout ----\nthread 'tests::greater_than_100' panicked at src/lib.rs:12:13:\nGuess value must be greater than or equal to 1, got 200.\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\nnote: panic did not contain expected string panic message: `\"Guess value must be greater than or equal to 1, got 200.\"`, expected substring: `\"less than or equal to 100\"` failures: tests::greater_than_100 test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 失败信息表明测试确实如期望 panic 了,不过 panic 信息中并没有包含 expected 信息 'Guess value must be less than or equal to 100'。而我们得到的 panic 信息是 'Guess value must be greater than or equal to 1, got 200.'。这样就可以开始寻找 bug 在哪了!","breadcrumbs":"编写自动化测试 » 如何编写测试 » 使用 should_panic 检查 panic","id":"202","title":"使用 should_panic 检查 panic"},"203":{"body":"目前为止,我们编写的测试在失败时都会 panic。我们也可以使用 Result 编写测试!这是一个延伸自示例 11-1 的测试,使用 Result 重写,并在失败时返回 Err 而非 panic: pub fn add(left: usize, right: usize) -> usize { left + right\n} #[cfg(test)]\nmod tests { use super::*; // ANCHOR: here #[test] fn it_works() -> Result<(), String> { let result = add(2, 2); if result == 4 { Ok(()) } else { Err(String::from(\"two plus two does not equal four\")) } } // ANCHOR_END: here\n} 现在 it_works 函数的返回值类型为 Result<(), String>。在函数体中,不同于调用 assert_eq! 宏,而是在测试通过时返回 Ok(()),在测试失败时返回带有 String 的 Err。 这样编写测试来返回 Result 就可以在函数体中使用问号运算符,如此可以方便的编写任何运算符会返回 Err 成员的测试。 不能对这些使用 Result 的测试使用 #[should_panic] 注解。为了断言一个操作返回 Err 成员, 不要 使用对 Result 值使用问号表达式(?)。而是使用 assert!(value.is_err())。 现在你知道了几种编写测试的方法,让我们看看运行测试时会发生什么,以及可以用于 cargo test 的不同选项。","breadcrumbs":"编写自动化测试 » 如何编写测试 » 将 Result 用于测试","id":"203","title":"将 Result 用于测试"},"204":{"body":"ch11-02-running-tests.md commit 34314c10f699cc882d4e0b06f2a24bd37a5435f2 就像 cargo run 会编译代码并运行生成的二进制文件一样,cargo test 在测试模式下编译代码并运行生成的测试二进制文件。cargo test 产生的二进制文件的默认行为是并发运行所有的测试,并截获测试运行过程中产生的输出,阻止它们被显示出来,使得阅读测试结果相关的内容变得更容易。不过可以指定命令行参数来改变 cargo test 的默认行为。 可以将一部分命令行参数传递给 cargo test,而将另外一部分传递给生成的测试二进制文件。为了分隔这两种参数,需要先列出传递给 cargo test 的参数,接着是分隔符 --,再之后是传递给测试二进制文件的参数。运行 cargo test --help 会提示 cargo test 的有关参数,而运行 cargo test -- --help 可以提示在分隔符之后使用的有关参数。","breadcrumbs":"编写自动化测试 » 控制测试如何运行 » 控制测试如何运行","id":"204","title":"控制测试如何运行"},"205":{"body":"当运行多个测试时,Rust 默认使用线程来并行运行。这意味着测试会更快地运行完毕,所以你可以更快的得到代码能否工作的反馈。因为测试是在同时运行的,你应该确保测试不能相互依赖,或依赖任何共享的状态,包括依赖共享的环境,比如当前工作目录或者环境变量。 举个例子,每一个测试都运行一些代码,假设这些代码都在硬盘上创建一个 test-output.txt 文件并写入一些数据。接着每一个测试都读取文件中的数据并断言这个文件包含特定的值,而这个值在每个测试中都是不同的。因为所有测试都是同时运行的,一个测试可能会在另一个测试读写文件过程中修改了文件。那么第二个测试就会失败,并不是因为代码不正确,而是因为测试并行运行时相互干扰。一个解决方案是使每一个测试读写不同的文件;另一个解决方案是一次运行一个测试。 如果你不希望测试并行运行,或者想要更加精确的控制线程的数量,可以传递 --test-threads 参数和希望使用线程的数量给测试二进制文件。例如: $ cargo test -- --test-threads=1 这里将测试线程设置为 1,告诉程序不要使用任何并行机制。这也会比并行运行花费更多时间,不过在有共享的状态时,测试就不会潜在的相互干扰了。","breadcrumbs":"编写自动化测试 » 控制测试如何运行 » 并行或连续的运行测试","id":"205","title":"并行或连续的运行测试"},"206":{"body":"默认情况下,当测试通过时,Rust 的测试库会截获打印到标准输出的所有内容。比如在测试中调用了 println! 而测试通过了,我们将不会在终端看到 println! 的输出:只会看到说明测试通过的提示行。如果测试失败了,则会看到所有标准输出和其他错误信息。 例如,示例 11-10 有一个无意义的函数,它打印出其参数的值并接着返回 10。接着还有一个会通过的测试和一个会失败的测试: 文件名:src/lib.rs fn prints_and_returns_10(a: i32) -> i32 { println!(\"I got the value {a}\"); 10\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn this_test_will_pass() { let value = prints_and_returns_10(4); assert_eq!(value, 10); } #[test] fn this_test_will_fail() { let value = prints_and_returns_10(8); assert_eq!(value, 5); }\n} 示例 11-10:一个调用了 println! 的函数的测试 运行 cargo test 将会看到这些测试的输出: $ cargo test Compiling silly-function v0.1.0 (file:///projects/silly-function) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s Running unittests src/lib.rs (target/debug/deps/silly_function-160869f38cff9166) running 2 tests\ntest tests::this_test_will_fail ... FAILED\ntest tests::this_test_will_pass ... ok failures: ---- tests::this_test_will_fail stdout ----\nI got the value 8\nthread 'tests::this_test_will_fail' panicked at src/lib.rs:19:9:\nassertion `left == right` failed left: 10 right: 5\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::this_test_will_fail test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 注意输出中不会出现测试通过时打印的内容,即 I got the value 4。因为当测试通过时,这些输出会被截获。失败测试的输出 I got the value 8 ,则出现在输出的测试摘要部分,同时也显示了测试失败的原因。 如果你希望也能看到通过的测试中打印的值,也可以在结尾加上 --show-output 告诉 Rust 显示成功测试的输出。 $ cargo test -- --show-output 使用 --show-output 参数再次运行示例 11-10 中的测试会显示如下输出: $ cargo test -- --show-output Compiling silly-function v0.1.0 (file:///projects/silly-function) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.60s Running unittests src/lib.rs (target/debug/deps/silly_function-160869f38cff9166) running 2 tests\ntest tests::this_test_will_fail ... FAILED\ntest tests::this_test_will_pass ... ok successes: ---- tests::this_test_will_pass stdout ----\nI got the value 4 successes: tests::this_test_will_pass failures: ---- tests::this_test_will_fail stdout ----\nI got the value 8\nthread 'tests::this_test_will_fail' panicked at src/lib.rs:19:9:\nassertion `left == right` failed left: 10 right: 5\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::this_test_will_fail test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib`","breadcrumbs":"编写自动化测试 » 控制测试如何运行 » 显示函数输出","id":"206","title":"显示函数输出"},"207":{"body":"有时运行整个测试集会耗费很长时间。如果你负责特定位置的代码,你可能会希望只运行与这些代码相关的测试。你可以向 cargo test 传递所希望运行的测试名称的参数来选择运行哪些测试。 为了展示如何运行部分测试,示例 11-11 为 add_two 函数创建了三个测试,我们可以选择具体运行哪一个: 文件名:src/lib.rs pub fn add_two(a: usize) -> usize { a + 2\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn add_two_and_two() { let result = add_two(2); assert_eq!(result, 4); } #[test] fn add_three_and_two() { let result = add_two(3); assert_eq!(result, 5); } #[test] fn one_hundred() { let result = add_two(100); assert_eq!(result, 102); }\n} 示例 11-11:不同名称的三个测试 如果没有传递任何参数就运行测试,如你所见,所有测试都会并行运行: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.62s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 3 tests\ntest tests::add_three_and_two ... ok\ntest tests::add_two_and_two ... ok\ntest tests::one_hundred ... ok test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 运行单个测试 可以向 cargo test 传递任意测试的名称来只运行这个测试: $ cargo test one_hundred Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.69s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest tests::one_hundred ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s 只有名称为 one_hundred 的测试被运行了;因为其余两个测试并不匹配这个名称。测试输出在摘要行的结尾显示了 2 filtered out 表明还存在比本次所运行的测试更多的测试没有被运行。 不能像这样指定多个测试名称;只有传递给 cargo test 的第一个值才会被使用。不过有运行多个测试的方法。 过滤运行多个测试 我们可以指定部分测试的名称,任何名称匹配这个名称的测试会被运行。例如,因为头两个测试的名称包含 add,可以通过 cargo test add 来运行这两个测试: $ cargo test add Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.61s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 2 tests\ntest tests::add_three_and_two ... ok\ntest tests::add_two_and_two ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s 这运行了所有名字中带有 add 的测试,也过滤掉了名为 one_hundred 的测试。同时注意测试所在的模块也是测试名称的一部分,所以可以通过模块名来运行一个模块中的所有测试。","breadcrumbs":"编写自动化测试 » 控制测试如何运行 » 通过指定名字来运行部分测试","id":"207","title":"通过指定名字来运行部分测试"},"208":{"body":"有时一些特定的测试执行起来是非常耗费时间的,所以在大多数运行 cargo test 的时候希望能排除它们。虽然可以通过参数列举出所有希望运行的测试来做到,也可以使用 ignore 属性来标记耗时的测试并排除它们,如下所示: 文件名:src/lib.rs pub fn add(left: usize, right: usize) -> usize { left + right\n} // ANCHOR: here\n#[cfg(test)]\nmod tests { use super::*; #[test] fn it_works() { let result = add(2, 2); assert_eq!(result, 4); } #[test] #[ignore] fn expensive_test() { // 需要运行一个小时的代码 }\n}\n// ANCHOR_END: here 对于想要排除的测试,我们在 #[test] 之后增加了 #[ignore] 行。现在如果运行测试,就会发现 it_works 运行了,而 expensive_test 没有运行: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.60s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 2 tests\ntest tests::expensive_test ... ignored\ntest tests::it_works ... ok test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s expensive_test 被列为 ignored,如果我们只希望运行被忽略的测试,可以使用 cargo test -- --ignored: $ cargo test -- --ignored Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.61s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest expensive_test ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 通过控制运行哪些测试,你可以确保能够快速地运行 cargo test 。当你需要运行 ignored 的测试时,可以执行 cargo test -- --ignored。如果你希望不管是否忽略都要运行全部测试,可以运行 cargo test -- --include-ignored。","breadcrumbs":"编写自动化测试 » 控制测试如何运行 » 除非特别指定否则忽略某些测试","id":"208","title":"除非特别指定否则忽略某些测试"},"209":{"body":"ch11-03-test-organization.md commit 654d8902d380dbb8dd94ed2e548dfc0aa80c07cb 本章一开始就提到,测试是一个复杂的概念,而且不同的开发者也采用不同的技术和组织。Rust 社区倾向于根据测试的两个主要分类来考虑问题: 单元测试 ( unit tests )与 集成测试 ( integration tests )。单元测试倾向于更小而更集中,在隔离的环境中一次测试一个模块,或者是测试私有接口。而集成测试对于你的库来说则完全是外部的。它们与其他外部代码一样,通过相同的方式使用你的代码,只测试公有接口而且每个测试都有可能会测试多个模块。 为了保证你的库能够按照你的预期运行,从独立和整体的角度编写这两类测试都是非常重要的。","breadcrumbs":"编写自动化测试 » 测试的组织结构 » 测试的组织结构","id":"209","title":"测试的组织结构"},"21":{"body":"首先创建一个存放 Rust 代码的目录。Rust 并不关心代码的存放位置,不过对于本书的练习和项目来说,我们建议你在 home 目录中创建 projects 目录,并将你的所有项目存放在这里。 打开终端并输入如下命令创建 projects 目录,并在 projects 目录中为 “Hello, world!” 项目创建一个目录。 对于 Linux、macOS 和 Windows PowerShell,输入: $ mkdir ~/projects\n$ cd ~/projects\n$ mkdir hello_world\n$ cd hello_world 对于 Windows CMD,输入: > mkdir \"%USERPROFILE%\\projects\"\n> cd /d \"%USERPROFILE%\\projects\"\n> mkdir hello_world\n> cd hello_world","breadcrumbs":"入门指南 » Hello, World! » 创建项目目录","id":"21","title":"创建项目目录"},"210":{"body":"单元测试的目的是在与其他部分隔离的环境中测试每一个单元的代码,以便于快速而准确地验证某个单元的代码功能是否符合预期。单元测试与它们要测试的代码共同存放在位于 src 目录下相同的文件中。规范是在每个文件中创建包含测试函数的 tests 模块,并使用 cfg(test) 标注模块。 测试模块和 #[cfg(test)] 测试模块的 #[cfg(test)] 注解告诉 Rust 只在执行 cargo test 时才编译和运行测试代码,而在运行 cargo build 时不这么做。这在只希望构建库的时候可以节省编译时间,并且因为它们并没有包含测试,所以能减少编译产生的文件的大小。与之对应的集成测试因为位于另一个文件夹,所以它们并不需要 #[cfg(test)] 注解。然而单元测试位于与源码相同的文件中,所以你需要使用 #[cfg(test)] 来指定它们不应该被包含进编译结果中。 回忆本章第一部分新建的 adder 项目,Cargo 为我们生成了如下代码: 文件名:src/lib.rs pub fn add(left: usize, right: usize) -> usize { left + right\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn it_works() { let result = add(2, 2); assert_eq!(result, 4); }\n} 上述代码就是自动生成的测试模块。cfg 属性代表 配置 ( configuration ) ,它告诉 Rust,接下来的项,只有在给定特定配置选项时,才会被包含。在这种情况下,配置选项是 test,即 Rust 所提供的用于编译和运行测试的配置选项。通过使用 cfg 属性,Cargo 只会在我们主动使用 cargo test 运行测试时才编译测试代码。这包括测试模块中可能存在的帮助函数,以及标注为 #[test] 的函数。 测试私有函数 测试社区中一直存在关于是否应该对私有函数直接进行测试的论战,而在其他语言中想要测试私有函数是一件困难的,甚至是不可能的事。不过无论你坚持哪种测试意识形态,Rust 的私有性规则确实允许你测试私有函数。考虑示例 11-12 中带有私有函数 internal_adder 的代码: 文件名:src/lib.rs pub fn add_two(a: usize) -> usize { internal_adder(a, 2)\n} fn internal_adder(left: usize, right: usize) -> usize { left + right\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn internal() { let result = internal_adder(2, 2); assert_eq!(result, 4); }\n} 示例 11-12:测试私有函数 注意 internal_adder 函数并没有标记为 pub。测试也不过是 Rust 代码,同时 tests 也仅仅是另一个模块。正如 “路径用于引用模块树中的项” 部分所说,子模块的项可以使用其上级模块的项。在测试中,我们通过 use super::* 将 test 模块的父模块的所有项引入了作用域,接着测试调用了 internal_adder。如果你并不认为应该测试私有函数,Rust 也不会强迫你这么做。","breadcrumbs":"编写自动化测试 » 测试的组织结构 » 单元测试","id":"210","title":"单元测试"},"211":{"body":"在 Rust 中,集成测试对于你需要测试的库来说完全是外部的。同其他使用库的代码一样使用库文件,也就是说它们只能调用一部分库中的公有 API。集成测试的目的是测试库的多个部分能否一起正常工作。一些单独能正确运行的代码单元集成在一起也可能会出现问题,所以集成测试的覆盖率也是很重要的。为了创建集成测试,你需要先创建一个 tests 目录。 tests 目录 为了编写集成测试,需要在项目根目录创建一个 tests 目录,与 src 同级。Cargo 知道如何去寻找这个目录中的集成测试文件。接着可以随意在这个目录中创建任意多的测试文件,Cargo 会将每一个文件当作单独的 crate 来编译。 让我们来创建一个集成测试。保留示例 11-12 中 src/lib.rs 的代码。创建一个 tests 目录,新建一个文件 tests/integration_test.rs 。目录结构应该看起来像这样: adder\n├── Cargo.lock\n├── Cargo.toml\n├── src\n│ └── lib.rs\n└── tests └── integration_test.rs 将示例 11-13 中的代码输入到 tests/integration_test.rs 文件中。 文件名:tests/integration_test.rs use adder::add_two; #[test]\nfn it_adds_two() { let result = add_two(2); assert_eq!(result, 4);\n} 示例 11-13:一个 adder crate 中函数的集成测试 因为每一个 tests 目录中的测试文件都是完全独立的 crate,所以需要在每一个文件中导入库。为此与单元测试不同,我们需要在文件顶部添加 use adder。 并不需要将 tests/integration_test.rs 中的任何代码标注为 #[cfg(test)]。 tests 文件夹在 Cargo 中是一个特殊的文件夹,Cargo 只会在运行 cargo test 时编译这个目录中的文件。现在就运行 cargo test 试试: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 1.31s Running unittests src/lib.rs (target/debug/deps/adder-1082c4b063a8fbe6) running 1 test\ntest tests::internal ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running tests/integration_test.rs (target/debug/deps/integration_test-1082c4b063a8fbe6) running 1 test\ntest it_adds_two ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 现在有了三个部分的输出:单元测试、集成测试和文档测试。注意如果一个部分的任何测试失败,之后的部分都不会运行。例如如果一个单元测试失败,则不会有任何集成测试和文档测试的输出,因为这些测试只会在所有单元测试都通过后才会执行。 第一部分单元测试与我们之前见过的一样:每个单元测试一行(示例 11-12 中有一个叫做 internal 的测试),接着是一个单元测试的摘要行。 集成测试部分以行 Running tests/integration_test.rs开头。接下来每一行是一个集成测试中的测试函数,以及一个位于 Doc-tests adder 部分之前的集成测试的摘要行。 每一个集成测试文件有对应的测试结果部分,所以如果在 tests 目录中增加更多文件,测试结果中就会有更多集成测试结果部分。 我们仍然可以通过指定测试函数的名称作为 cargo test 的参数来运行特定集成测试。也可以使用 cargo test 的 --test 后跟文件的名称来运行某个特定集成测试文件中的所有测试: $ cargo test --test integration_test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.64s Running tests/integration_test.rs (target/debug/deps/integration_test-82e7799c1bc62298) running 1 test\ntest it_adds_two ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 这个命令只运行了 tests 目录中我们指定的文件 integration_test.rs 中的测试。 集成测试中的子模块 随着集成测试的增加,你可能希望在 tests 目录创建更多文件以便更好地组织它们,例如根据测试的功能来将测试分组。如前所述, tests 目录中的每一个文件都被编译成一个单独的 crate,这有助于创建独立的作用域,以便更接近于最终用户使用你的 crate 的方式。但这意味着, tests 目录中的文件的行为,和你在第七章中学习如何将代码分为模块和文件时,学到的 src 中的文件的行为不一样。 当你有一些在多个集成测试文件都会用到的帮助函数,而你尝试按照第七章 “将模块移动到其他文件” 部分的步骤将它们提取到一个通用的模块中时, tests 目录中文件行为的不同就会凸显出来。例如,如果我们可以创建 一个 tests/common.rs 文件并创建一个名叫 setup 的函数,我们希望这个函数能被多个测试文件的测试函数调用: 文件名:tests/common.rs pub fn setup() { // setup code specific to your library's tests would go here\n} 如果再次运行测试,将会在测试结果中看到一个新的对应 common.rs 文件的测试结果部分,即便这个文件并没有包含任何测试函数,也没有任何地方调用了 setup 函数: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.89s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest tests::internal ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running tests/common.rs (target/debug/deps/common-92948b65e88960b4) running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running tests/integration_test.rs (target/debug/deps/integration_test-92948b65e88960b4) running 1 test\ntest it_adds_two ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 我们并不想要common 出现在测试结果中显示 running 0 tests 。我们只是希望其能被其他多个集成测试文件中调用罢了。 为了不让 common 出现在测试输出中,我们将创建 tests/common/mod.rs ,而不是创建 tests/common.rs 。现在项目目录结构看起来像这样: ├── Cargo.lock\n├── Cargo.toml\n├── src\n│ └── lib.rs\n└── tests ├── common │ └── mod.rs └── integration_test.rs 这是一种老的命名规范,正如第七章 “另一种文件路径” 中提到的 Rust 仍然理解它们。这样命名告诉 Rust 不要将 common 看作一个集成测试文件。将 setup 函数代码移动到 tests/common/mod.rs 并删除 tests/common.rs 文件之后,测试输出中将不会出现这一部分。 tests 目录中的子目录不会被作为单独的 crate 编译或作为一个测试结果部分出现在测试输出中。 一旦拥有了 tests/common/mod.rs ,就可以将其作为模块以便在任何集成测试文件中使用。这里是一个 tests/integration_test.rs 中调用 setup 函数的 it_adds_two 测试的例子: 文件名:tests/integration_test.rs use adder::add_two; mod common; #[test]\nfn it_adds_two() { common::setup(); let result = add_two(2); assert_eq!(result, 4);\n} 注意 mod common; 声明与示例 7-21 中展示的模块声明相同。接着在测试函数中就可以调用 common::setup() 了。 二进制 crate 的集成测试 如果项目是二进制 crate 并且只包含 src/main.rs 而没有 src/lib.rs ,这样就不可能在 tests 目录创建集成测试并使用 extern crate 导入 src/main.rs 中定义的函数。只有库 crate 才会向其他 crate 暴露了可供调用和使用的函数;二进制 crate 只意在单独运行。 这就是许多 Rust 二进制项目使用一个简单的 src/main.rs 调用 src/lib.rs 中的逻辑的原因之一。因为通过这种结构,集成测试 就可以 通过 extern crate 测试库 crate 中的主要功能了,而如果这些重要的功能没有问题的话, src/main.rs 中的少量代码也就会正常工作且不需要测试。","breadcrumbs":"编写自动化测试 » 测试的组织结构 » 集成测试","id":"211","title":"集成测试"},"212":{"body":"Rust 的测试功能提供了一个确保即使你改变了函数的实现方式,也能继续以期望的方式运行的途径。单元测试独立地验证库的不同部分,也能够测试私有函数实现细节。集成测试则检查多个部分是否能结合起来正确地工作,并像其他外部代码那样测试库的公有 API。即使 Rust 的类型系统和所有权规则可以帮助避免一些 bug,不过测试对于减少代码中不符合期望行为的逻辑 bug 仍然是很重要的。 让我们将本章和其他之前章节所学的知识组合起来,在下一章一起编写一个项目!","breadcrumbs":"编写自动化测试 » 测试的组织结构 » 总结","id":"212","title":"总结"},"213":{"body":"ch12-00-an-io-project.md commit 02a168ed346042f07010f8b65b4eeed623dd31d1 本章既是一个目前所学的很多技能的概括,也是一个更多标准库功能的探索。我们将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 技能。 Rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择,所以我们的项目将创建一个我们自己版本的经典命令行搜索工具:grep。grep 是 “ G lobally search a R egular E xpression and P rint.” 的首字母缩写。grep 最简单的使用场景是在特定文件中搜索指定字符串。为此,grep 获取一个文件路径和一个字符串作为参数,接着读取文件并找到其中包含字符串参数的行,然后打印出这些行。 在这个过程中,我们会展示如何让我们的命令行工具利用很多命令行工具中用到的终端功能。读取环境变量来使得用户可以配置工具的行为。打印到标准错误控制流(stderr)而不是标准输出(stdout),例如这样用户可以选择将成功输出重定向到文件中的同时仍然在屏幕上显示错误信息。 一位 Rust 社区的成员,Andrew Gallant,已经创建了一个功能完整且非常快速的 grep 版本,叫做 ripgrep。相比之下,我们的版本将非常简单,本章将教会你一些帮助理解像 ripgrep 这样真实项目的背景知识。 我们的 grep 项目将会结合之前所学的一些内容: 代码组织(使用 第七章 学习的模块) vector 和字符串( 第八章 ,集合) 错误处理( 第九章 ) 合理的使用 trait 和生命周期( 第十章 ) 测试( 第十一章 ) 另外还会简要的讲到闭包、迭代器和 trait 对象,它们分别会在 第十三章 和 第十八章 中详细介绍。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 一个 I/O 项目:构建一个命令行程序","id":"213","title":"一个 I/O 项目:构建一个命令行程序"},"214":{"body":"ch12-01-accepting-command-line-arguments.md commit 02a168ed346042f07010f8b65b4eeed623dd31d1 一如既往使用 cargo new 新建一个项目,我们称之为 minigrep 以便与可能已经安装在系统上的 grep 工具相区别: $ cargo new minigrep Created binary (application) `minigrep` project\n$ cd minigrep 第一个任务是让 minigrep 能够接受两个命令行参数:文件路径和要搜索的字符串。也就是说我们希望能够使用 cargo run、要搜索的字符串和被搜索的文件的路径来运行程序,像这样: $ cargo run -- searchstring example-filename.txt 现在 cargo new 生成的程序忽略任何传递给它的参数。 Crates.io 上有一些现成的库可以帮助我们接受命令行参数,不过我们正在学习这些内容,让我们自己来实现一个。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 接受命令行参数 » 接受命令行参数","id":"214","title":"接受命令行参数"},"215":{"body":"为了确保 minigrep 能够获取传递给它的命令行参数的值,我们需要一个 Rust 标准库提供的函数 std::env::args。这个函数返回一个传递给程序的命令行参数的 迭代器 ( iterator )。我们会在 第十三章 全面的介绍它们。但是现在只需理解迭代器的两个细节:迭代器生成一系列的值,可以在迭代器上调用 collect 方法将其转换为一个集合,比如包含所有迭代器产生元素的 vector。 示例 12-1 中允许 minigrep 程序读取任何传递给它的命令行参数并将其收集到一个 vector 中。 文件名:src/main.rs use std::env; fn main() { let args: Vec = env::args().collect(); dbg!(args);\n} 示例 12-1:将命令行参数收集到一个 vector 中并打印出来 首先使用 use 语句来将 std::env 模块引入作用域以便可以使用它的 args 函数。注意 std::env::args 函数被嵌套进了两层模块中。正如 第七章 讲到的,当所需函数嵌套了多于一层模块时,通常将父模块引入作用域,而不是其自身。这便于我们利用 std::env 中的其他函数。这比增加了 use std::env::args; 后仅仅使用 args 调用函数要更明确一些,因为 args 容易被错认成一个定义于当前模块的函数。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 接受命令行参数 » 读取参数值","id":"215","title":"读取参数值"},"216":{"body":"注意 std::env::args 在其任何参数包含无效 Unicode 字符时会 panic。如果你需要接受包含无效 Unicode 字符的参数,使用 std::env::args_os 代替。这个函数返回 OsString 值而不是 String 值。这里出于简单考虑使用了 std::env::args,因为 OsString 值每个平台都不一样而且比 String 值处理起来更为复杂。 在 main 函数的第一行,我们调用了 env::args,并立即使用 collect 来创建了一个包含迭代器所有值的 vector。collect 可以被用来创建很多类型的集合,所以这里显式注明 args 的类型来指定我们需要一个字符串 vector。虽然在 Rust 中我们很少会需要注明类型,然而 collect 是一个经常需要注明类型的函数,因为 Rust 不能推断出你想要什么类型的集合。 最后,我们使用调试宏打印出 vector。让我们尝试分别用两种方式(不包含参数和包含参数)运行代码: $ cargo run Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.61s Running `target/debug/minigrep`\n[src/main.rs:5:5] args = [ \"target/debug/minigrep\",\n] $ cargo run -- needle haystack Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.57s Running `target/debug/minigrep needle haystack`\n[src/main.rs:5:5] args = [ \"target/debug/minigrep\", \"needle\", \"haystack\",\n] 注意 vector 的第一个值是 \"target/debug/minigrep\",它是我们二进制文件的名称。这与 C 中的参数列表的行为相匹配,让程序使用在执行时调用它们的名称。如果要在消息中打印它或者根据用于调用程序的命令行别名更改程序的行为,通常可以方便地访问程序名称,不过考虑到本章的目的,我们将忽略它并只保存所需的两个参数。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 接受命令行参数 » args 函数和无效的 Unicode","id":"216","title":"args 函数和无效的 Unicode"},"217":{"body":"目前程序可以访问指定为命令行参数的值。现在需要将这两个参数的值保存进变量这样就可以在程序的余下部分使用这些值了。让我们如示例 12-2 这样做: 文件名:src/main.rs use std::env; fn main() { let args: Vec = env::args().collect(); let query = &args[1]; let file_path = &args[2]; println!(\"Searching for {query}\"); println!(\"In file {file_path}\");\n} 示例 12-2:创建变量来存放查询参数和文件路径参数 正如之前打印出 vector 时所所看到的,程序的名称占据了 vector 的第一个值 args[0],所以我们从索引为 1 的参数开始。minigrep 获取的第一个参数是需要搜索的字符串,所以将其将第一个参数的引用存放在变量 query 中。第二个参数将是文件路径,所以将第二个参数的引用放入变量 file_path 中。 我们将临时打印出这些变量的值来证明代码如我们期望的那样工作。使用参数 test 和 sample.txt 再次运行这个程序: $ cargo run -- test sample.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep test sample.txt`\nSearching for test\nIn file sample.txt 好的,它可以工作!我们将所需的参数值保存进了对应的变量中。之后会增加一些错误处理来应对类似用户没有提供参数的情况,不过现在我们将忽略它们并开始增加读取文件功能。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 接受命令行参数 » 将参数值保存进变量","id":"217","title":"将参数值保存进变量"},"218":{"body":"ch12-02-reading-a-file.md commit 02a168ed346042f07010f8b65b4eeed623dd31d1 现在我们要增加读取由 file_path 命令行参数指定的文件的功能。首先,需要一个用来测试的示例文件:我们会用一个拥有多行少量文本且有一些重复单词的文件。示例 12-3 是一首艾米莉·狄金森(Emily Dickinson)的诗,它正适合这个工作!在项目根目录创建一个文件 poem.txt,并输入诗 \"I'm nobody! Who are you?\": 文件名:poem.txt I'm nobody! Who are you?\nAre you nobody, too?\nThen there's a pair of us - don't tell!\nThey'd banish us, you know. How dreary to be somebody!\nHow public, like a frog\nTo tell your name the livelong day\nTo an admiring bog! 示例 12-3:艾米莉·狄金森的诗 “I’m nobody! Who are you?”,一个好的测试用例 创建完这个文件之后,修改 src/main.rs 并增加如示例 12-4 所示的打开文件的代码: 文件名:src/main.rs use std::env;\nuse std::fs; fn main() { // --snip--\n# let args: Vec = env::args().collect();\n# # let query = &args[1];\n# let file_path = &args[2];\n# # println!(\"Searching for {query}\"); println!(\"In file {file_path}\"); let contents = fs::read_to_string(file_path) .expect(\"Should have been able to read the file\"); println!(\"With text:\\n{contents}\");\n} 示例 12-4:读取第二个参数所指定的文件内容 首先,我们增加了一个 use 语句来引入标准库中的相关部分:我们需要 std::fs 来处理文件。 在 main 中新增了一行语句:fs::read_to_string 接受 file_path,打开文件,接着返回包含其内容的 std::io::Result。 在这些代码之后,我们再次增加了临时的 println! 打印出读取文件之后 contents 的值,这样就可以检查目前为止的程序能否工作。 尝试运行这些代码,随意指定一个字符串作为第一个命令行参数(因为还未实现搜索功能的部分)而将 poem.txt 文件将作为第二个参数: $ cargo run -- the poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep the poem.txt`\nSearching for the\nIn file poem.txt\nWith text:\nI'm nobody! Who are you?\nAre you nobody, too?\nThen there's a pair of us - don't tell!\nThey'd banish us, you know. How dreary to be somebody!\nHow public, like a frog\nTo tell your name the livelong day\nTo an admiring bog! 好的!代码读取并打印出了文件的内容。虽然它还有一些瑕疵:此时 main 函数有着多个职能,通常函数只负责一个功能的话会更简洁并易于维护。另一个问题是没有尽可能的处理错误。虽然我们的程序还很小,这些瑕疵并不是什么大问题,不过随着程序功能的丰富,将会越来越难以用简单的方法修复它们。在开发程序时,及早开始重构是一个最佳实践,因为重构少量代码时要容易的多,所以让我们现在就开始吧。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 读取文件 » 读取文件","id":"218","title":"读取文件"},"219":{"body":"ch12-03-improving-error-handling-and-modularity.md commit 83788ff212a3281328e2f8f223ce9e0f69220b97 为了改善我们的程序这里有四个问题需要修复,而且它们都与程序的组织方式和如何处理潜在错误有关。第一,main 现在进行了两个任务:它解析了参数并打开了文件。对于一个这样的小函数,这并不是一个大问题。然而如果 main 中的功能持续增加,main 函数处理的独立任务也会增加。当函数承担了更多责任,它就更难以推导,更难以测试,并且更难以在不破坏其他部分的情况下做出修改。最好能分离出功能以便每个函数就负责一个任务。 这同时也关系到第二个问题:query 和 file_path 是程序中的配置变量,而像 contents 则用来执行程序逻辑。随着 main 函数的增长,就需要引入更多的变量到作用域中,而当作用域中有更多的变量时,将更难以追踪每个变量的目的。最好能将配置变量组织进一个结构,这样就能使它们的目的更明确了。 第三个问题是如果打开文件失败我们使用 expect 来打印出错误信息,不过这个错误信息只是说 Should have been able to read the file。读取文件失败的原因有多种:例如文件不存在,或者没有打开此文件的权限。目前,无论处于何种情况,我们只是打印出“文件读取出现错误”的信息,这并没有给予使用者具体的信息! 第四,我们不停地使用 expect 来处理不同的错误,如果用户没有指定足够的参数来运行程序,他们会从 Rust 得到 index out of bounds 错误,而这并不能明确地解释问题。如果所有的错误处理都位于一处,这样将来的维护者在需要修改错误处理逻辑时就只需要考虑这一处代码。将所有的错误处理都放在一处也有助于确保我们打印的错误信息对终端用户来说是有意义的。 让我们通过重构项目来解决这些问题。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 重构改进模块性和错误处理","id":"219","title":"重构改进模块性和错误处理"},"22":{"body":"接下来,新建一个源文件,命名为 main.rs 。Rust 源文件总是以 .rs 扩展名结尾。如果文件名包含多个单词,那么按照命名习惯,应当使用下划线来分隔单词。例如命名为 hello_world.rs ,而不是 helloworld.rs 。 现在打开刚创建的 main.rs 文件,输入示例 1-1 中的代码。 文件名:main.rs fn main() { println!(\"Hello, world!\");\n} 示例 1-1:一个打印 `Hello, world!` 的程序 保存文件,并回到当前目录为“~/projects/hello_world”的终端窗口。在 Linux 或 macOS 上,输入如下命令,编译并运行文件: $ rustc main.rs\n$ ./main\nHello, world! 在 Windows 上,输入命令 .\\main.exe,而不是 ./main: > rustc main.rs\n> .\\main.exe\nHello, world! 不管使用何种操作系统,终端应该打印字符串 Hello, world!。如果没有看到这些输出,回到安装部分的 “故障排除” 小节查找有帮助的方法。 如果 Hello, world! 出现了,恭喜你!你已经正式编写了一个 Rust 程序。现在你成为一名 Rust 程序员,欢迎!","breadcrumbs":"入门指南 » Hello, World! » 编写并运行 Rust 程序","id":"22","title":"编写并运行 Rust 程序"},"220":{"body":"main 函数负责多个任务的组织问题在许多二进制项目中很常见。所以 Rust 社区开发出一类在 main 函数开始变得庞大时进行二进制程序的关注分离的指导。这些过程有如下步骤: 将程序拆分成 main.rs 和 lib.rs 并将程序的逻辑放入 lib.rs 中。 当命令行解析逻辑比较小时,可以保留在 main.rs 中。 当命令行解析开始变得复杂时,也同样将其从 main.rs 提取到 lib.rs 中。 经过这些过程之后保留在 main 函数中的责任应该被限制为: 使用参数值调用命令行解析逻辑 设置任何其他的配置 调用 lib.rs 中的 run 函数 如果 run 返回错误,则处理这个错误 这个模式的一切就是为了关注分离: main.rs 处理程序运行,而 lib.rs 处理所有的真正的任务逻辑。因为不能直接测试 main 函数,这个结构通过将所有的程序逻辑移动到 lib.rs 的函数中使得我们可以测试它们。仅仅保留在 main.rs 中的代码将足够小以便阅读就可以验证其正确性。让我们遵循这些步骤来重构程序。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 二进制项目的关注分离","id":"220","title":"二进制项目的关注分离"},"221":{"body":"首先,我们将解析参数的功能提取到一个 main 将会调用的函数中,为将命令行解析逻辑移动到 src/lib.rs 中做准备。示例 12-5 中展示了新 main 函数的开头,它调用了新函数 parse_config。目前它仍将定义在 src/main.rs 中: 文件名:src/main.rs # use std::env;\n# use std::fs;\n# fn main() { let args: Vec = env::args().collect(); let (query, file_path) = parse_config(&args); // --snip--\n# # println!(\"Searching for {query}\");\n# println!(\"In file {file_path}\");\n# # let contents = fs::read_to_string(file_path)\n# .expect(\"Should have been able to read the file\");\n# # println!(\"With text:\\n{contents}\");\n} fn parse_config(args: &[String]) -> (&str, &str) { let query = &args[1]; let file_path = &args[2]; (query, file_path)\n} 示例 12-5:从 main 中提取出 parse_config 函数 我们仍然将命令行参数收集进一个 vector,不过不同于在 main 函数中将索引 1 的参数值赋值给变量 query 和将索引 2 的值赋值给变量 file_path,我们将整个 vector 传递给 parse_config 函数。接着 parse_config 函数将包含决定哪个参数该放入哪个变量的逻辑,并将这些值返回到 main。仍然在 main 中创建变量 query 和 file_path,不过 main 不再负责处理命令行参数与变量如何对应。 这对重构我们这小程序可能有点大材小用,不过我们将采用小的、增量的步骤进行重构。在做出这些改变之后,再次运行程序并验证参数解析是否仍然正常。经常验证你的进展是一个好习惯,这样在遇到问题时能帮助你定位问题的成因。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 提取参数解析器","id":"221","title":"提取参数解析器"},"222":{"body":"我们可以采取另一个小的步骤来进一步改善这个函数。现在函数返回一个元组,不过立刻又将元组拆成了独立的部分。这是一个我们可能没有进行正确抽象的信号。 另一个表明还有改进空间的迹象是 parse_config 名称的 config 部分,它暗示了我们返回的两个值是相关的并都是一个配置值的一部分。目前除了将这两个值组合进元组之外并没有表达这个数据结构的意义:我们可以将这两个值放入一个结构体并给每个字段一个有意义的名字。这会让未来的维护者更容易理解不同的值如何相互关联以及它们的目的。 注意:一些同学将这种在复杂类型更为合适的场景下使用基本类型的反模式称为 基本类型偏执 ( primitive obsession )。 示例 12-6 展示了 parse_config 函数的改进。 文件名:src/main.rs # use std::env;\n# use std::fs;\n# fn main() { let args: Vec = env::args().collect(); let config = parse_config(&args); println!(\"Searching for {}\", config.query); println!(\"In file {}\", config.file_path); let contents = fs::read_to_string(config.file_path) .expect(\"Should have been able to read the file\"); // --snip--\n# # println!(\"With text:\\n{contents}\");\n} struct Config { query: String, file_path: String,\n} fn parse_config(args: &[String]) -> Config { let query = args[1].clone(); let file_path = args[2].clone(); Config { query, file_path }\n} 示例 12-6:重构 parse_config 返回一个 Config 结构体实例 新定义的结构体 Config 中包含字段 query 和 file_path。 parse_config 的签名表明它现在返回一个 Config 值。在之前的 parse_config 函数体中,我们返回了引用 args 中 String 值的字符串 slice,现在我们定义 Config 来包含拥有所有权的 String 值。main 中的 args 变量是参数值的所有者并只允许 parse_config 函数借用它们,这意味着如果 Config 尝试获取 args 中值的所有权将违反 Rust 的借用规则。 还有许多不同的方式可以处理 String 的数据,而最简单但有些不太高效的方式是调用这些值的 clone 方法。这会生成 Config 实例可以拥有的数据的完整拷贝,不过会比储存字符串数据的引用消耗更多的时间和内存。不过拷贝数据使得代码显得更加直白因为无需管理引用的生命周期,所以在这种情况下牺牲一小部分性能来换取简洁性的取舍是值得的。 使用 clone 的权衡取舍 由于其运行时消耗,许多 Rustacean 之间有一个趋势是倾向于避免使用 clone 来解决所有权问题。在关于迭代器的第十三章中,我们将会学习如何更有效率的处理这种情况,不过现在,复制一些字符串来取得进展是没有问题的,因为只会进行一次这样的拷贝,而且文件路径和要搜索的字符串都比较短。在第一轮编写时拥有一个可以工作但有点低效的程序要比尝试过度优化代码更好一些。随着你对 Rust 更加熟练,将能更轻松的直奔合适的方法,不过现在调用 clone 是完全可以接受的。 我们更新 main 将 parse_config 返回的 Config 实例放入变量 config 中,并将之前分别使用 query 和 file_path 变量的代码更新为现在的使用 Config 结构体的字段的代码。 现在代码更明确的表现了我们的意图,query 和 file_path 是相关联的并且它们的目的是配置程序如何工作。任何使用这些值的代码就知道在 config 实例中对应目的的字段名中寻找它们。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 组合配置值","id":"222","title":"组合配置值"},"223":{"body":"目前为止,我们将负责解析命令行参数的逻辑从 main 提取到了 parse_config 函数中,这有助于我们看清值 query 和 file_path 是相互关联的并应该在代码中表现这种关系。接着我们增加了 Config 结构体来描述 query 和 file_path 的相关性,并能够从 parse_config 函数中将这些值的名称作为结构体字段名称返回。 所以现在 parse_config 函数的目的是创建一个 Config 实例,我们可以将 parse_config 从一个普通函数变为一个叫做 new 的与结构体关联的函数。做出这个改变使得代码更符合习惯:可以像标准库中的 String 调用 String::new 来创建一个该类型的实例那样,将 parse_config 变为一个与 Config 关联的 new 函数。示例 12-7 展示了需要做出的修改: 文件名:src/main.rs # use std::env;\n# use std::fs;\n# fn main() { let args: Vec = env::args().collect(); let config = Config::new(&args);\n# # println!(\"Searching for {}\", config.query);\n# println!(\"In file {}\", config.file_path);\n# # let contents = fs::read_to_string(config.file_path)\n# .expect(\"Should have been able to read the file\");\n# # println!(\"With text:\\n{contents}\"); // --snip--\n} // --snip-- # struct Config {\n# query: String,\n# file_path: String,\n# }\n# impl Config { fn new(args: &[String]) -> Config { let query = args[1].clone(); let file_path = args[2].clone(); Config { query, file_path } }\n} 示例 12-7:将 parse_config 变为 Config::new 这里将 main 中调用 parse_config 的地方更新为调用 Config::new。我们将 parse_config 的名字改为 new 并将其移动到 impl 块中,这使得 new 函数与 Config 相关联。再次尝试编译并确保它可以工作。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 创建一个 Config 的构造函数","id":"223","title":"创建一个 Config 的构造函数"},"224":{"body":"现在我们开始修复错误处理。回忆一下之前提到过如果 args vector 包含少于 3 个项并尝试访问 vector 中索引 1 或索引 2 的值会造成程序 panic。尝试不带任何参数运行程序;这将看起来像这样: $ cargo run Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep`\nthread 'main' panicked at src/main.rs:27:21:\nindex out of bounds: the len is 1 but the index is 1\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace index out of bounds: the len is 1 but the index is 1 是一个针对程序员的错误信息,然而这并不能真正帮助终端用户理解发生了什么和他们应该做什么。现在就让我们修复它吧。 改善错误信息 在示例 12-8 中,在 new 函数中增加了一个检查在访问索引 1 和 2 之前检查 slice 是否足够长。如果 slice 不够长,程序会打印一个更好的错误信息并 panic: 文件名:src/main.rs # use std::env;\n# use std::fs;\n# # fn main() {\n# let args: Vec = env::args().collect();\n# # let config = Config::new(&args);\n# # println!(\"Searching for {}\", config.query);\n# println!(\"In file {}\", config.file_path);\n# # let contents = fs::read_to_string(config.file_path)\n# .expect(\"Should have been able to read the file\");\n# # println!(\"With text:\\n{contents}\");\n# }\n# # struct Config {\n# query: String,\n# file_path: String,\n# }\n# # impl Config { // --snip-- fn new(args: &[String]) -> Config { if args.len() < 3 { panic!(\"not enough arguments\"); } // --snip--\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Config { query, file_path }\n# }\n# } 示例 12-8:增加一个参数数量检查 这类似于 示例 9-13 中的 Guess::new 函数 ,那里如果 value 参数超出了有效值的范围就调用 panic!。不同于检查值的范围,这里检查 args 的长度至少是 3,而函数的剩余部分则可以在假设这个条件成立的基础上运行。如果 args 少于 3 个项,则这个条件将为真,并调用 panic! 立即终止程序。 有了 new 中这几行额外的代码,再次不带任何参数运行程序并看看现在错误看起来像什么: $ cargo run Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep`\nthread 'main' panicked at src/main.rs:26:13:\nnot enough arguments\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 这个输出就好多了,现在有了一个合理的错误信息。然而,还是有一堆额外的信息我们不希望提供给用户。所以在这里使用示例 9-9 中的技术可能不是最好的;正如 第九章 所讲到的一样,panic! 的调用更趋向于程序上的问题而不是使用上的问题。相反我们可以使用第九章学习的另一个技术 —— 返回一个可以表明成功或错误的 Result 。 从 new 中返回 Result 而不是调用 panic! 我们可以选择返回一个 Result 值,它在成功时会包含一个 Config 的实例,而在错误时会描述问题。我们还将把函数名从new改为build,因为许多程序员希望 new 函数永远不会失败。当 Config::new 与 main 交流时,可以使用 Result 类型来表明这里存在问题。接着修改 main 将 Err 成员转换为对用户更友好的错误,而不是 panic! 调用产生的关于 thread 'main' 和 RUST_BACKTRACE 的文本。 示例 12-9 展示了为了返回 Result 在 Config::new 的返回值和函数体中所需的改变。注意这还不能编译,直到下一个示例同时也更新了 main 之后。 文件名:src/main.rs # use std::env;\n# use std::fs;\n# # fn main() {\n# let args: Vec = env::args().collect();\n# # let config = Config::new(&args);\n# # println!(\"Searching for {}\", config.query);\n# println!(\"In file {}\", config.file_path);\n# # let contents = fs::read_to_string(config.file_path)\n# .expect(\"Should have been able to read the file\");\n# # println!(\"With text:\\n{contents}\");\n# }\n# # struct Config {\n# query: String,\n# file_path: String,\n# }\n# impl Config { fn build(args: &[String]) -> Result { if args.len() < 3 { return Err(\"not enough arguments\"); } let query = args[1].clone(); let file_path = args[2].clone(); Ok(Config { query, file_path }) }\n} 示例 12-9:从 Config::build 中返回 Result 现在 build 函数返回一个 Result,在成功时带有一个 Config 实例而在出现错误时带有一个 &'static str。回忆一下第十章 “静态生命周期” 中讲到 &'static str 是字符串字面值的类型,也是目前的错误信息。 build 函数体中有两处修改:当没有足够参数时不再调用 panic!,而是返回 Err 值。同时我们将 Config 返回值包装进 Ok 成员中。这些修改使得函数符合其新的类型签名。 通过让 Config::build 返回一个 Err 值,这就允许 main 函数处理 build 函数返回的 Result 值并在出现错误的情况更明确的结束进程。 调用 Config::build 并处理错误 为了处理错误情况并打印一个对用户友好的信息,我们需要像示例 12-10 那样更新 main 函数来处理现在 Config::build 返回的 Result。另外还需要手动实现原先由 panic!负责的工作,即以非零错误码退出命令行工具的工作。非零的退出状态是一个惯例信号,用来告诉调用程序的进程:该程序以错误状态退出了。 文件名:src/main.rs # use std::env;\n# use std::fs;\nuse std::process; fn main() { let args: Vec = env::args().collect(); let config = Config::build(&args).unwrap_or_else(|err| { println!(\"Problem parsing arguments: {err}\"); process::exit(1); }); // --snip--\n# # println!(\"Searching for {}\", config.query);\n# println!(\"In file {}\", config.file_path);\n# # let contents = fs::read_to_string(config.file_path)\n# .expect(\"Should have been able to read the file\");\n# # println!(\"With text:\\n{contents}\");\n# }\n# # struct Config {\n# query: String,\n# file_path: String,\n# }\n# # impl Config {\n# fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# } 示例 12-10:如果新建 Config 失败则使用错误码退出 在上面的示例中,使用了一个之前没有详细说明的方法:unwrap_or_else,它定义于标准库的 Result 上。使用 unwrap_or_else 可以进行一些自定义的非 panic! 的错误处理。当 Result 是 Ok 时,这个方法的行为类似于 unwrap:它返回 Ok 内部封装的值。然而,当其值是 Err 时,该方法会调用一个 闭包 ( closure ),也就是一个我们定义的作为参数传递给 unwrap_or_else 的匿名函数。 第十三章 会更详细的介绍闭包。现在你需要理解的是 unwrap_or_else 会将 Err 的内部值,也就是示例 12-9 中增加的 not enough arguments 静态字符串的情况,传递给闭包中位于两道竖线间的参数 err。闭包中的代码在其运行时可以使用这个 err 值。 我们新增了一个 use 行来从标准库中导入 process。在错误的情况闭包中将被运行的代码只有两行:我们打印出了 err 值,接着调用了 std::process::exit。process::exit 会立即停止程序并将传递给它的数字作为退出状态码。这类似于示例 12-8 中使用的基于 panic! 的错误处理,除了不会再得到所有的额外输出了。让我们试试: $ cargo run Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s Running `target/debug/minigrep`\nProblem parsing arguments: not enough arguments 非常好!现在输出对于用户来说就友好多了。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 修复错误处理","id":"224","title":"修复错误处理"},"225":{"body":"现在我们完成了配置解析的重构:让我们转向程序的逻辑。正如 “二进制项目的关注分离” 部分所展开的讨论,我们将提取一个叫做 run 的函数来存放目前 main 函数中不属于设置配置或处理错误的所有逻辑。一旦完成这些,main 函数将简明得足以通过观察来验证,而我们将能够为所有其他逻辑编写测试。 示例 12-11 展示了提取出来的 run 函数。目前我们只进行小的增量式的提取函数的改进。我们仍将在 src/main.rs 中定义这个函数: 文件名:src/main.rs # use std::env;\n# use std::fs;\n# use std::process;\n# fn main() { // --snip-- # let args: Vec = env::args().collect();\n# # let config = Config::build(&args).unwrap_or_else(|err| {\n# println!(\"Problem parsing arguments: {err}\");\n# process::exit(1);\n# });\n# println!(\"Searching for {}\", config.query); println!(\"In file {}\", config.file_path); run(config);\n} fn run(config: Config) { let contents = fs::read_to_string(config.file_path) .expect(\"Should have been able to read the file\"); println!(\"With text:\\n{contents}\");\n} // --snip--\n# # struct Config {\n# query: String,\n# file_path: String,\n# }\n# # impl Config {\n# fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# } 示例 12-11:提取 run 函数来包含剩余的程序逻辑 现在 run 函数包含了 main 中从读取文件开始的剩余的所有逻辑。run 函数获取一个 Config 实例作为参数。 从 run 函数中返回错误 通过将剩余的逻辑分离进 run 函数而不是留在 main 中,就可以像示例 12-9 中的 Config::build 那样改进错误处理。不再通过 expect 允许程序 panic,run 函数将会在出错时返回一个 Result。这让我们进一步以一种对用户友好的方式统一 main 中的错误处理。示例 12-12 展示了 run 签名和函数体中的改变: 文件名:src/main.rs # use std::env;\n# use std::fs;\n# use std::process;\nuse std::error::Error; // --snip-- # # fn main() {\n# let args: Vec = env::args().collect();\n# # let config = Config::build(&args).unwrap_or_else(|err| {\n# println!(\"Problem parsing arguments: {err}\");\n# process::exit(1);\n# });\n# # println!(\"Searching for {}\", config.query);\n# println!(\"In file {}\", config.file_path);\n# # run(config);\n# }\n# fn run(config: Config) -> Result<(), Box> { let contents = fs::read_to_string(config.file_path)?; println!(\"With text:\\n{contents}\"); Ok(())\n}\n# # struct Config {\n# query: String,\n# file_path: String,\n# }\n# # impl Config {\n# fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# } 示例 12-12:修改 run 函数返回 Result 这里我们做出了三个明显的修改。首先,将 run 函数的返回类型变为 Result<(), Box>。之前这个函数返回 unit 类型 (),现在它仍然保持作为 Ok 时的返回值。 对于错误类型,使用了 trait 对象 Box(在开头使用了 use 语句将 std::error::Error 引入作用域)。 第十八章 会涉及 trait 对象。目前只需知道 Box 意味着函数会返回实现了 Error trait 的类型,不过无需指定具体将会返回的值的类型。这提供了在不同的错误场景可能有不同类型的错误返回值的灵活性。这也就是 dyn,它是 “动态的”(“dynamic”)的缩写。 第二个改变是去掉了 expect 调用并替换为 第九章 讲到的 ?。不同于遇到错误就 panic!,? 会从函数中返回错误值并让调用者来处理它。 第三个修改是现在成功时这个函数会返回一个 Ok 值。因为 run 函数签名中声明成功类型返回值是 (),这意味着需要将 unit 类型值包装进 Ok 值中。Ok(()) 一开始看起来有点奇怪,不过这样使用 () 是惯用的做法,表明调用 run 函数只是为了它的副作用;函数并没有返回什么有意义的值。 上述代码能够编译,不过会有一个警告: $ cargo run -- the poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep)\nwarning: unused `Result` that must be used --> src/main.rs:19:5 |\n19 | run(config); | ^^^^^^^^^^^ | = note: this `Result` may be an `Err` variant, which should be handled = note: `#[warn(unused_must_use)]` on by default\nhelp: use `let _ = ...` to ignore the resulting value |\n19 | let _ = run(config); | +++++++ warning: `minigrep` (bin \"minigrep\") generated 1 warning Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.71s Running `target/debug/minigrep the poem.txt`\nSearching for the\nIn file poem.txt\nWith text:\nI'm nobody! Who are you?\nAre you nobody, too?\nThen there's a pair of us - don't tell!\nThey'd banish us, you know. How dreary to be somebody!\nHow public, like a frog\nTo tell your name the livelong day\nTo an admiring bog! Rust 提示我们的代码忽略了 Result 值,它可能表明这里存在一个错误。但我们却没有检查这里是否有一个错误,而编译器提醒我们这里应该有一些错误处理代码!现在就让我们修正这个问题。 处理 main 中 run 返回的错误 我们将检查错误并使用类似示例 12-10 中 Config::build 处理错误的技术来处理它们,不过有一些细微的不同: 文件名:src/main.rs # use std::env;\n# use std::error::Error;\n# use std::fs;\n# use std::process;\n# fn main() { // --snip-- # let args: Vec = env::args().collect();\n# # let config = Config::build(&args).unwrap_or_else(|err| {\n# println!(\"Problem parsing arguments: {err}\");\n# process::exit(1);\n# });\n# println!(\"Searching for {}\", config.query); println!(\"In file {}\", config.file_path); if let Err(e) = run(config) { println!(\"Application error: {e}\"); process::exit(1); }\n}\n# # fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # println!(\"With text:\\n{contents}\");\n# # Ok(())\n# }\n# # struct Config {\n# query: String,\n# file_path: String,\n# }\n# # impl Config {\n# fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# } 我们使用 if let 来检查 run 是否返回一个 Err 值,不同于 unwrap_or_else,并在出错时调用 process::exit(1)。run 并不返回像 Config::build 返回的 Config 实例那样需要 unwrap 的值。因为 run 在成功时返回 (),而我们只关心检测错误,所以并不需要 unwrap_or_else 来返回未封装的值,因为它只会是 ()。 不过两个例子中 if let 和 unwrap_or_else 的函数体都一样:打印出错误并退出。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 从 main 提取逻辑","id":"225","title":"从 main 提取逻辑"},"226":{"body":"现在我们的 minigrep 项目看起来好多了!现在我们将要拆分 src/main.rs 并将一些代码放入 src/lib.rs ,这样就能测试它们并拥有一个含有更少功能的 main 函数。 让我们将所有不是 main 函数的代码从 src/main.rs 移动到新文件 src/lib.rs 中: run 函数定义 相关的 use 语句 Config 的定义 Config::build 函数定义 现在 src/lib.rs 的内容应该看起来像示例 12-13(为了简洁省略了函数体)。注意直到下一个示例修改完 src/main.rs 之后,代码还不能编译: 文件名:src/lib.rs use std::error::Error;\nuse std::fs; pub struct Config { pub query: String, pub file_path: String,\n} impl Config { pub fn build(args: &[String]) -> Result { // --snip--\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path }) }\n} pub fn run(config: Config) -> Result<(), Box> { // --snip--\n# let contents = fs::read_to_string(config.file_path)?;\n# # println!(\"With text:\\n{contents}\");\n# # Ok(())\n} 示例 12-13:将 Config 和 run 移动到 src/lib.rs 这里使用了公有的 pub 关键字:在 Config、其字段和其 build 方法,以及 run 函数上。现在我们有了一个拥有可以测试的公有 API 的库 crate 了。 现在需要在 src/main.rs 中将移动到 src/lib.rs 的代码引入二进制 crate 的作用域中,如示例 12-14 所示: 文件名:src/main.rs use std::env;\nuse std::process; use minigrep::Config; fn main() { // --snip--\n# let args: Vec = env::args().collect();\n# # let config = Config::build(&args).unwrap_or_else(|err| {\n# println!(\"Problem parsing arguments: {err}\");\n# process::exit(1);\n# });\n# # println!(\"Searching for {}\", config.query);\n# println!(\"In file {}\", config.file_path);\n# if let Err(e) = minigrep::run(config) { // --snip--\n# println!(\"Application error: {e}\");\n# process::exit(1); }\n} 示例 12-14:将 minigrep crate 引入 src/main.rs 的作用域中 我们添加了一行 use minigrep::Config,它将 Config 类型引入作用域,并使用 crate 名称作为 run 函数的前缀。通过这些重构,所有功能应该能够联系在一起并运行了。运行 cargo run 来确保一切都正确的衔接在一起。 哇哦!我们做了大量的工作,不过我们为将来的成功打下了基础。现在处理错误将更容易,同时代码也更加模块化。从现在开始几乎所有的工作都将在 src/lib.rs 中进行。 让我们利用这些新创建的模块的优势来进行一些在旧代码中难以展开的工作,这些工作在新代码中非常容易实现,那就是:编写测试!","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 将代码拆分到库 crate","id":"226","title":"将代码拆分到库 crate"},"227":{"body":"ch12-04-testing-the-librarys-functionality.md commit 8fd2327e4135876b368cc2793eb4a7e455b691f0 现在我们将逻辑提取到了 src/lib.rs 并将所有的参数解析和错误处理留在了 src/main.rs 中,为代码的核心功能编写测试将更加容易。我们可以直接使用多种参数调用函数并检查返回值而无需从命令行运行二进制文件了。 在这一部分,我们将遵循测试驱动开发(Test Driven Development, TDD)的模式来逐步增加 minigrep 的搜索逻辑。它遵循如下步骤: 编写一个失败的测试,并运行它以确保它失败的原因是你所期望的。 编写或修改足够的代码来使新的测试通过。 重构刚刚增加或修改的代码,并确保测试仍然能通过。 从步骤 1 开始重复! 虽然这只是众多编写软件的方法之一,不过 TDD 有助于驱动代码的设计。在编写能使测试通过的代码之前编写测试有助于在开发过程中保持高测试覆盖率。 我们将测试驱动实现实际在文件内容中搜索查询字符串并返回匹配的行示例的功能。我们将在一个叫做 search 的函数中增加这些功能。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 采用测试驱动开发完善库的功能 » 采用测试驱动开发完善库的功能","id":"227","title":"采用测试驱动开发完善库的功能"},"228":{"body":"去掉 src/lib.rs 和 src/main.rs 中用于检查程序行为的 println! 语句,因为不再真正需要它们了。接着我们会像 第十一章 那样增加一个 test 模块和一个测试函数。测试函数指定了 search 函数期望拥有的行为:它会获取一个需要查询的字符串和用来查询的文本,并只会返回包含请求的文本行。示例 12-15 展示了这个测试,它还不能编译: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # Ok(())\n# }\n# #[cfg(test)]\nmod tests { use super::*; #[test] fn one_result() { let query = \"duct\"; let contents = \"\\\nRust:\nsafe, fast, productive.\nPick three.\"; assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents)); }\n} 示例 12-15:创建一个我们期望的 search 函数的失败测试 这里选择使用 \"duct\" 作为这个测试中需要搜索的字符串。用来搜索的文本有三行,其中只有一行包含 \"duct\"。(注意双引号之后的反斜杠,这告诉 Rust 不要在字符串字面值内容的开头加入换行符)我们断言 search 函数的返回值只包含期望的那一行。 我们还不能运行这个测试并看到它失败,因为它甚至都还不能编译:search 函数还不存在呢!根据 TDD 的原则,我们将增加足够的代码来使其能够编译:一个总是会返回空 vector 的 search 函数定义,如示例 12-16 所示。然后这个测试应该能够编译并因为空 vector 并不匹配一个包含一行 \"safe, fast, productive.\" 的 vector 而失败。 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # Ok(())\n# }\n# pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { vec![]\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn one_result() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# } 示例 12-16:刚好足够使测试通过编译的 search 函数定义 注意需要在 search 的签名中定义一个显式生命周期 'a 并用于 contents 参数和返回值。回忆一下 第十章 中讲到生命周期参数指定哪个参数的生命周期与返回值的生命周期相关联。在这个例子中,我们表明返回的 vector 中应该包含引用参数 contents(而不是参数query)slice 的字符串 slice。 换句话说,我们告诉 Rust 函数 search 返回的数据将与 search 函数中的参数 contents 的数据存在的一样久。这是非常重要的!为了使这个引用有效那么 被 slice 引用的数据也需要保持有效;如果编译器认为我们是在创建 query 而不是 contents 的字符串 slice,那么安全检查将是不正确的。 如果尝试不用生命周期编译的话,我们将得到如下错误: $ cargo build Compiling minigrep v0.1.0 (file:///projects/minigrep)\nerror[E0106]: missing lifetime specifier --> src/lib.rs:28:51 |\n28 | pub fn search(query: &str, contents: &str) -> Vec<&str> { | ---- ---- ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `query` or `contents`\nhelp: consider introducing a named lifetime parameter |\n28 | pub fn search<'a>(query: &'a str, contents: &'a str) -> Vec<&'a str> { | ++++ ++ ++ ++ For more information about this error, try `rustc --explain E0106`.\nerror: could not compile `minigrep` (lib) due to 1 previous error Rust 不可能知道我们需要的是哪一个参数,所以需要告诉它。因为参数 contents 包含了所有的文本而且我们希望返回匹配的那部分文本,所以我们知道 contents 是应该要使用生命周期语法来与返回值相关联的参数。 其他语言中并不需要你在函数签名中将参数与返回值相关联。所以这么做可能仍然感觉有些陌生,随着时间的推移这将会变得越来越容易。你可能想要将这个例子与第十章中 “生命周期确保引用有效” 部分做对比。 现在运行测试: $ cargo test Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.97s Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 1 test\ntest tests::one_result ... FAILED failures: ---- tests::one_result stdout ----\nthread 'tests::one_result' panicked at src/lib.rs:44:9:\nassertion `left == right` failed left: [\"safe, fast, productive.\"] right: []\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::one_result test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 好的,测试失败了,这正是我们所期望的。修改代码来让测试通过吧!","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 采用测试驱动开发完善库的功能 » 编写失败测试","id":"228","title":"编写失败测试"},"229":{"body":"目前测试之所以会失败是因为我们总是返回一个空的 vector。为了修复并实现 search,我们的程序需要遵循如下步骤: 遍历内容的每一行文本。 查看这一行是否包含要搜索的字符串。 如果有,将这一行加入列表返回值中。 如果没有,什么也不做。 返回匹配到的结果列表 让我们一步一步的来,从遍历每行开始。 使用 lines 方法遍历每一行 Rust 有一个有助于一行一行遍历字符串的方法,出于方便它被命名为 lines,它如示例 12-17 这样工作。注意这还不能编译: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # Ok(())\n# }\n# pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { for line in contents.lines() { // do something with line }\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn one_result() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# } 示例 12-17:遍历 contents 的每一行 lines 方法返回一个迭代器。 第十三章 会深入了解迭代器,不过我们已经在 示例 3-5 中见过使用迭代器的方法了,在那里使用了一个 for 循环和迭代器在一个集合的每一项上运行了一些代码。 用查询字符串搜索每一行 接下来将会增加检查当前行是否包含查询字符串的功能。幸运的是,字符串类型为此也有一个叫做 contains 的实用方法!如示例 12-18 所示在 search 函数中加入 contains 方法调用。注意这仍然不能编译: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # Ok(())\n# }\n# pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { for line in contents.lines() { if line.contains(query) { // 对文本行进行操作 } }\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn one_result() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# } 示例 12-18:增加检查文本行是否包含 query 中字符串的功能 存储匹配的行 为了完成这个函数,我们还需要一个方法来存储包含查询字符串的行。为此可以在 for 循环之前创建一个可变的 vector 并调用 push 方法在 vector 中存放一个 line。在 for 循环之后,返回这个 vector,如示例 12-19 所示: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # Ok(())\n# }\n# pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { let mut results = Vec::new(); for line in contents.lines() { if line.contains(query) { results.push(line); } } results\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn one_result() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# } 示例 12-19:储存匹配的行以便可以返回它们 现在 search 函数应该返回只包含 query 的那些行,而测试应该会通过。让我们运行测试: $ cargo test Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `test` profile [unoptimized + debuginfo] target(s) in 1.22s Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 1 test\ntest tests::one_result ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running unittests src/main.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests minigrep running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 测试通过了,它可以工作了! 现在正是可以考虑重构的时机,在保证测试通过,保持功能不变的前提下重构 search 函数。search 函数中的代码并不坏,不过并没有利用迭代器的一些实用功能。第十三章将回到这个例子并深入探索迭代器并看看如何改进代码。 在 run 函数中使用 search 函数 现在 search 函数是可以工作并测试通过了的,我们需要实际在 run 函数中调用 search。需要将 config.query 值和 run 从文件中读取的 contents 传递给 search 函数。接着 run 会打印出 search 返回的每一行: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# pub fn run(config: Config) -> Result<(), Box> { let contents = fs::read_to_string(config.file_path)?; for line in search(&config.query, &contents) { println!(\"{line}\"); } Ok(())\n}\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn one_result() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# } 这里仍然使用了 for 循环获取了 search 返回的每一行并打印出来。 现在整个程序应该可以工作了!让我们试一试,首先使用一个只会在艾米莉·狄金森的诗中返回一行的单词 “frog”: $ cargo run -- frog poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.38s Running `target/debug/minigrep frog poem.txt`\nHow public, like a frog 好的!现在试试一个会匹配多行的单词,比如 “body”: $ cargo run -- body poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep body poem.txt`\nI'm nobody! Who are you?\nAre you nobody, too?\nHow dreary to be somebody! 最后,让我们确保搜索一个在诗中哪里都没有的单词时不会得到任何行,比如 \"monomorphization\": $ cargo run -- monomorphization poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep monomorphization poem.txt` 非常好!我们创建了一个属于自己的迷你版经典工具,并学习了很多如何组织程序的知识。我们还学习了一些文件输入输出、生命周期、测试和命令行解析的内容。 为了使这个项目更丰满,我们将简要的展示如何处理环境变量和打印到标准错误,这两者在编写命令行程序时都很有用。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 采用测试驱动开发完善库的功能 » 编写使测试通过的代码","id":"229","title":"编写使测试通过的代码"},"23":{"body":"现在,让我们回过头来仔细看看这个 “Hello, world!” 程序。这是第一块拼图: fn main() { } 这几行定义了一个名叫 main 的函数。main 函数是一个特殊的函数:在可执行的 Rust 程序中,它总是最先运行的代码。第一行代码声明了一个叫做 main 的函数,它没有参数也没有返回值。如果有参数的话,它们的名称应该出现在小括号 () 中。 函数体被包裹在 {} 中。Rust 要求所有函数体都要用花括号包裹起来。一般来说,将左花括号与函数声明置于同一行并以空格分隔,是良好的代码风格。 注:如果你希望在 Rust 项目中保持一种标准风格,可以使用名为 rustfmt 的自动格式化工具将代码格式化为特定的风格(更多内容详见 附录 D 中的 rustfmt)。Rust 团队已经在标准的 Rust 发行版中包含了这个工具,就像 rustc 一样。所以它应该已经安装在你的电脑中了! 在 main 函数中有如下代码: println!(\"Hello, world!\"); 这行代码完成这个简单程序的所有工作:在屏幕上打印文本。这里有四个重要的细节需要注意。首先 Rust 的缩进风格使用 4 个空格,而不是 1 个制表符(tab)。 第二,println! 调用了一个 Rust 宏(macro)。如果是调用函数,则应输入 println(没有!)。我们将在第二十章详细讨论宏。现在你只需记住,当看到符号 ! 的时候,就意味着调用的是宏而不是普通函数,并且宏并不总是遵循与函数相同的规则。 第三,\"Hello, world!\" 是一个字符串。我们把这个字符串作为一个参数传递给 println!,字符串将被打印到屏幕上。 第四,该行以分号结尾(;),这代表一个表达式的结束和下一个表达式的开始。大部分 Rust 代码行以分号结尾。","breadcrumbs":"入门指南 » Hello, World! » 分析这个 Rust 程序","id":"23","title":"分析这个 Rust 程序"},"230":{"body":"ch12-05-working-with-environment-variables.md commit 9c0fa2714859738ff73cbbb829592e4c037d7e46 我们将增加一个额外的功能来改进 minigrep:用户可以通过设置环境变量来设置搜索是否是大小写敏感的。当然,我们也可以将其设计为一个命令行参数并要求用户每次需要时都加上它,不过在这里我们将使用环境变量。这允许用户设置环境变量一次之后在整个终端会话中所有的搜索都将是大小写不敏感的。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 处理环境变量 » 处理环境变量","id":"230","title":"处理环境变量"},"231":{"body":"首先我们希望增加一个新函数 search_case_insensitive,并将会在环境变量有值时调用它。这里将继续遵循 TDD 过程,其第一步是再次编写一个失败测试。我们将为新的大小写不敏感搜索函数新增一个测试函数,并将老的测试函数从 one_result 改名为 case_sensitive 来更清楚的表明这两个测试的区别,如示例 12-20 所示: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # for line in search(&config.query, &contents) {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# #[cfg(test)]\nmod tests { use super::*; #[test] fn case_sensitive() { let query = \"duct\"; let contents = \"\\\nRust:\nsafe, fast, productive.\nPick three.\nDuct tape.\"; assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents)); } #[test] fn case_insensitive() { let query = \"rUsT\"; let contents = \"\\\nRust:\nsafe, fast, productive.\nPick three.\nTrust me.\"; assert_eq!( vec![\"Rust:\", \"Trust me.\"], search_case_insensitive(query, contents) ); }\n} 示例 12-20:为准备添加的大小写不敏感函数新增失败测试 注意我们也改变了老测试中 contents 的值。还新增了一个含有文本 \"Duct tape.\" 的行,它有一个大写的 D,这在大小写敏感搜索时不应该匹配 \"duct\"。我们修改这个测试以确保不会意外破坏已经实现的大小写敏感搜索功能;这个测试现在应该能通过并在处理大小写不敏感搜索时应该能一直通过。 大小写 不敏感 搜索的新测试使用 \"rUsT\" 作为其查询字符串。在我们将要增加的 search_case_insensitive 函数中,\"rUsT\" 查询应该包含带有一个大写 R 的 \"Rust:\" 还有 \"Trust me.\" 这两行,即便它们与查询的大小写都不同。这个测试现在不能编译,因为还没有定义 search_case_insensitive 函数。请随意增加一个总是返回空 vector 的骨架实现,正如示例 12-16 中 search 函数为了使测试通过编译并失败时所做的那样。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 处理环境变量 » 编写一个大小写不敏感 search 函数的失败测试","id":"231","title":"编写一个大小写不敏感 search 函数的失败测试"},"232":{"body":"search_case_insensitive 函数,如示例 12-21 所示,将与 search 函数基本相同。唯一的区别是它会将 query 变量和每一 line 都变为小写,这样不管输入参数是大写还是小写,在检查该行是否包含查询字符串时都会是小写。 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # for line in search(&config.query, &contents) {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# pub fn search_case_insensitive<'a>( query: &str, contents: &'a str,\n) -> Vec<&'a str> { let query = query.to_lowercase(); let mut results = Vec::new(); for line in contents.lines() { if line.to_lowercase().contains(&query) { results.push(line); } } results\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 12-21:定义 search_case_insensitive 函数,它在比较查询和每一行之前将它们都转换为小写 首先我们将 query 字符串转换为小写,并将其覆盖到同名的变量中。对查询字符串调用 to_lowercase 是必需的,这样不管用户的查询是 \"rust\"、\"RUST\"、\"Rust\" 或者 \"rUsT\",我们都将其当作 \"rust\" 处理并对大小写不敏感。虽然 to_lowercase 可以处理基本的 Unicode,但它不是 100% 准确。如果编写真实的程序的话,我们还需多做一些工作,不过这一部分是关于环境变量而不是 Unicode 的,所以这样就够了。 注意 query 现在是一个 String 而不是字符串 slice,因为调用 to_lowercase 是在创建新数据,而不是引用现有数据。如果查询字符串是 \"rUsT\",这个字符串 slice 并不包含可供我们使用的小写的 u 或 t,所以必需分配一个包含 \"rust\" 的新 String。现在当我们将 query 作为一个参数传递给 contains 方法时,需要增加一个 & 因为 contains 的签名被定义为获取一个字符串 slice。 接下来我们对每一 line 都调用 to_lowercase 将其转为小写。现在我们将 line 和 query 都转换成了小写,这样就可以不管查询的大小写进行匹配了。 让我们看看这个实现能否通过测试: $ cargo test Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `test` profile [unoptimized + debuginfo] target(s) in 1.33s Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 2 tests\ntest tests::case_insensitive ... ok\ntest tests::case_sensitive ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running unittests src/main.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests minigrep running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 好的!现在,让我们在 run 函数中实际调用新 search_case_insensitive 函数。首先,我们将在 Config 结构体中增加一个配置项来切换大小写敏感和大小写不敏感搜索。增加这些字段会导致编译错误,因为我们还没有在任何地方初始化这些字段: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# pub struct Config { pub query: String, pub file_path: String, pub ignore_case: bool,\n}\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # let results = if config.ignore_case {\n# search_case_insensitive(&config.query, &contents)\n# } else {\n# search(&config.query, &contents)\n# };\n# # for line in results {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 这里增加了 ignore_case 字符来存放一个布尔值。接着我们需要 run 函数检查 case_sensitive 字段的值并使用它来决定是否调用 search 函数或 search_case_insensitive 函数,如示例 12-22 所示。注意这还不能编译: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# pub ignore_case: bool,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# pub fn run(config: Config) -> Result<(), Box> { let contents = fs::read_to_string(config.file_path)?; let results = if config.ignore_case { search_case_insensitive(&config.query, &contents) } else { search(&config.query, &contents) }; for line in results { println!(\"{line}\"); } Ok(())\n}\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 12-22:根据 config.ignore_case 的值调用 search 或 search_case_insensitive 最后需要实际检查环境变量。处理环境变量的函数位于标准库的 env 模块中,所以我们需要在 src/lib.rs 的开头将这个模块引入作用域中。接着使用 env 模块的 var 方法来检查一个叫做 IGNORE_CASE 的环境变量,如示例 12-23 所示: 文件名:src/lib.rs use std::env;\n// --snip-- # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# pub ignore_case: bool,\n# }\n# impl Config { pub fn build(args: &[String]) -> Result { if args.len() < 3 { return Err(\"not enough arguments\"); } let query = args[1].clone(); let file_path = args[2].clone(); let ignore_case = env::var(\"IGNORE_CASE\").is_ok(); Ok(Config { query, file_path, ignore_case, }) }\n}\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # let results = if config.ignore_case {\n# search_case_insensitive(&config.query, &contents)\n# } else {\n# search(&config.query, &contents)\n# };\n# # for line in results {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 12-23:检查叫做 IGNORE_CASE 的环境变量 这里创建了一个新变量 ignore_case。为了设置它的值,需要调用 env::var 函数并传递我们需要寻找的环境变量名称,IGNORE_CASE。env::var 返回一个 Result,它在环境变量被设置时返回包含其值的 Ok 成员,并在环境变量未被设置时返回 Err 成员。 我们使用 Result 的 is_ok 方法来检查环境变量是否被设置,这也就意味着我们 需要 进行一个大小写不敏感的搜索。如果IGNORE_CASE 环境变量没有被设置为任何值,is_ok 会返回 false 并将进行大小写敏感的搜索。我们并不关心环境变量所设置的 值 ,只关心它是否被设置了,所以检查 is_ok 而不是 unwrap、expect 或任何我们已经见过的 Result 的方法。 我们将变量 ignore_case 的值传递给 Config 实例,这样 run 函数可以读取其值并决定是否调用 search 或者示例 12-22 中实现的 search_case_insensitive。 让我们试一试吧!首先不设置环境变量并使用查询 to 运行程序,这应该会匹配任何全小写的单词 “to” 的行: $ cargo run -- to poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep to poem.txt`\nAre you nobody, too?\nHow dreary to be somebody! 看起来程序仍然能够工作!现在将 IGNORE_CASE 设置为 1 并仍使用相同的查询 to。 $ IGNORE_CASE=1 cargo run to poem.txt 如果你使用 PowerShell,则需要用两个命令来分别设置环境变量并运行程序: PS> $Env:IGNORE_CASE=1; cargo run to poem.txt 而这会让 IGNORE_CASE 的效果在当前 shell 会话中持续生效。可以通过 Remove-Item 命令来取消设置: PS> Remove-Item Env:IGNORE_CASE 这回应该得到包含可能有大写字母的 “to” 的行: Are you nobody, too?\nHow dreary to be somebody!\nTo tell your name the livelong day\nTo an admiring bog! 好极了,我们也得到了包含 “To” 的行!现在 minigrep 程序可以通过环境变量控制进行大小写不敏感搜索了。现在你知道了如何管理由命令行参数或环境变量设置的选项了! 一些程序允许对相同配置同时使用参数 和 环境变量。在这种情况下,程序来决定参数和环境变量的优先级。作为一个留给你的测试,尝试通过一个命令行参数或一个环境变量来控制大小写敏感搜索。并在运行程序时遇到矛盾值时决定命令行参数和环境变量的优先级。 std::env 模块还包含了更多处理环境变量的实用功能;请查看官方文档来了解其可用的功能。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 处理环境变量 » 实现 search_case_insensitive 函数","id":"232","title":"实现 search_case_insensitive 函数"},"233":{"body":"ch12-06-writing-to-stderr-instead-of-stdout.md commit 02a168ed346042f07010f8b65b4eeed623dd31d1 目前为止,我们将所有的输出都通过 println! 写到了终端。大部分终端都提供了两种输出: 标准输出 ( standard output ,stdout)对应一般信息, 标准错误 ( standard error ,stderr)则用于错误信息。这种区别允许用户选择将程序正常输出定向到一个文件中并仍将错误信息打印到屏幕上。 但是 println! 宏只能够打印到标准输出,所以我们必须使用其他方法来打印到标准错误。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 将错误信息输出到标准错误而不是标准输出 » 将错误信息输出到标准错误而不是标准输出","id":"233","title":"将错误信息输出到标准错误而不是标准输出"},"234":{"body":"首先,让我们观察一下目前 minigrep 打印的所有内容是如何被写入标准输出的,包括那些应该被写入标准错误的错误信息。可以通过将标准输出流重定向到一个文件同时有意产生一个错误来做到这一点。我们没有重定向标准错误流,所以任何发送到标准错误的内容将会继续显示在屏幕上。 命令行程序被期望将错误信息发送到标准错误流,这样即便选择将标准输出流重定向到文件中时仍然能看到错误信息。目前我们的程序并不符合期望;相反我们将看到它将错误信息输出保存到了文件中! 我们通过 > 和文件路径 output.txt 来运行程序,我们期望重定向标准输出流到该文件中。在这里,我们没有传递任何参数,所以会产生一个错误: $ cargo run > output.txt > 语法告诉 shell 将标准输出的内容写入到 output.txt 文件中而不是屏幕上。我们并没有看到期望的错误信息打印到屏幕上,所以这意味着它一定被写入了文件中。如下是 output.txt 所包含的: Problem parsing arguments: not enough arguments 是的,错误信息被打印到了标准输出中。像这样的错误信息被打印到标准错误中将会有用得多,将使得只有成功运行所产生的输出才会写入文件。我们接下来就修改。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 将错误信息输出到标准错误而不是标准输出 » 检查错误应该写入何处","id":"234","title":"检查错误应该写入何处"},"235":{"body":"让我们如示例 12-24 所示的代码改变错误信息是如何被打印的。得益于本章早些时候的重构,所有打印错误信息的代码都位于 main 一个函数中。标准库提供了 eprintln! 宏来打印到标准错误流,所以将两个调用 println! 打印错误信息的位置替换为 eprintln!: 文件名:src/main.rs # use std::env;\n# use std::process;\n# # use minigrep::Config;\n# fn main() { let args: Vec = env::args().collect(); let config = Config::build(&args).unwrap_or_else(|err| { eprintln!(\"Problem parsing arguments: {err}\"); process::exit(1); }); if let Err(e) = minigrep::run(config) { eprintln!(\"Application error: {e}\"); process::exit(1); }\n} 示例 12-24:使用 eprintln! 将错误信息写入标准错误而不是标准输出 现在我们再次尝试用同样的方式运行程序,不使用任何参数并通过 > 重定向标准输出: $ cargo run > output.txt\nProblem parsing arguments: not enough arguments 现在我们看到了屏幕上的错误信息,同时 output.txt 里什么也没有,这正是命令行程序所期望的行为。 如果使用不会造成错误的参数再次运行程序,不过仍然将标准输出重定向到一个文件,像这样: $ cargo run -- to poem.txt > output.txt 我们并不会在终端看到任何输出,同时 output.txt 将会包含其结果: 文件名:output.txt Are you nobody, too?\nHow dreary to be somebody! 这一部分展示了现在我们适当的使用了成功时产生的标准输出和错误时产生的标准错误。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 将错误信息输出到标准错误而不是标准输出 » 将错误打印到标准错误","id":"235","title":"将错误打印到标准错误"},"236":{"body":"在这一章中,我们回顾了目前为止的一些主要章节并涉及了如何在 Rust 环境中进行常规的 I/O 操作。通过使用命令行参数、文件、环境变量和打印错误的 eprintln! 宏,现在你已经准备好编写命令行程序了。通过结合前几章的知识,你的代码将会是组织良好的,并能有效的将数据存储到合适的数据结构中、更好的处理错误,并且还是经过良好测试的。 接下来,让我们探索一些 Rust 中受函数式编程语言影响的功能:闭包和迭代器。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 将错误信息输出到标准错误而不是标准输出 » 总结","id":"236","title":"总结"},"237":{"body":"ch13-00-functional-features.md commit daa268a0cd04ef76a8067a26ed7d28ec2a9336d3 Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是 函数式编程 ( functional programming )。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。 本章我们不会讨论函数式编程是或不是什么的问题,而是展示 Rust 的一些在功能上与其他被认为是函数式语言类似的特性。 更具体的,我们将要涉及: 闭包 ( Closures ),一个可以储存在变量里的类似函数的结构 迭代器 ( Iterators ),一种处理元素序列的方式 如何使用闭包和迭代器来改进第十二章的 I/O 项目。 闭包和迭代器的性能。( 剧透警告: 它们的速度超乎你的想象!) 我们已经介绍了其它受函数式风格影响的 Rust 功能,比如模式匹配和枚举,这些已经在其他章节中讲到过了。因为掌握闭包和迭代器是编写符合语言风格的高性能 Rust 代码的重要一环,所以我们将专门用一整章来讲解它们。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » Rust 中的函数式语言功能:迭代器与闭包","id":"237","title":"Rust 中的函数式语言功能:迭代器与闭包"},"238":{"body":"ch13-01-closures.md commit a2cb72d3ad7584cc1ae3b85f715c877872f5e3ab Rust 的 闭包 ( closures )是可以保存在变量中或作为参数传递给其他函数的匿名函数。你可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获其被定义时所在作用域中的值。我们将展示这些闭包特性如何支持代码复用和行为定制。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 闭包:可以捕获其环境的匿名函数 » 闭包:可以捕获环境的匿名函数","id":"238","title":"闭包:可以捕获环境的匿名函数"},"239":{"body":"我们首先了解如何通过闭包捕获定义它的环境中的值以便之后使用。考虑如下场景:我们的 T 恤公司偶尔会向邮件列表中的某位成员赠送一件限量版的独家 T 恤作为促销。邮件列表中的成员可以选择将他们的喜爱的颜色添加到个人信息中。如果被选中的成员设置了喜爱的颜色,他们将获得那个颜色的 T 恤。如果他没有设置喜爱的颜色,他们会获赠公司当前库存最多的颜色的款式。 有很多种方式来实现这一点。例如,使用有 Red 和 Blue 两个成员的 ShirtColor 枚举(出于简单考虑限定为两种颜色)。我们使用 Inventory 结构体来代表公司的库存,它有一个类型为 Vec 的 shirts 字段表示库存中的衬衫的颜色。Inventory 上定义的 giveaway 方法获取免费衬衫得主所喜爱的颜色(如有),并返回其获得的衬衫的颜色。初始代码如示例 13-1 所示: 文件名:src/main.rs #[derive(Debug, PartialEq, Copy, Clone)]\nenum ShirtColor { Red, Blue,\n} struct Inventory { shirts: Vec,\n} impl Inventory { fn giveaway(&self, user_preference: Option) -> ShirtColor { user_preference.unwrap_or_else(|| self.most_stocked()) } fn most_stocked(&self) -> ShirtColor { let mut num_red = 0; let mut num_blue = 0; for color in &self.shirts { match color { ShirtColor::Red => num_red += 1, ShirtColor::Blue => num_blue += 1, } } if num_red > num_blue { ShirtColor::Red } else { ShirtColor::Blue } }\n} fn main() { let store = Inventory { shirts: vec![ShirtColor::Blue, ShirtColor::Red, ShirtColor::Blue], }; let user_pref1 = Some(ShirtColor::Red); let giveaway1 = store.giveaway(user_pref1); println!( \"The user with preference {:?} gets {:?}\", user_pref1, giveaway1 ); let user_pref2 = None; let giveaway2 = store.giveaway(user_pref2); println!( \"The user with preference {:?} gets {:?}\", user_pref2, giveaway2 );\n} 示例 13-1:衬衫公司赠送场景 main 函数中定义的 store 还剩下两件蓝衬衫和一件红衬衫,可以在限量版促销活动中赠送。我们通过调用 giveaway 方法,为一个期望红衬衫的用户和一个没有特定偏好的用户进行赠送。 再次强调,这段代码有多种实现方式。这里为了专注于闭包,我们继续使用已经学习过的概念,除了 giveaway 方法体中使用了闭包。在 giveaway 方法中,我们将用户偏好作为 Option 类型的参数获取,并在 user_preference 上调用 unwrap_or_else 方法。 Option 上的 unwrap_or_else 方法 由标准库定义。它接受一个无参闭包作为参数,该闭包返回一个 T 类型的值(与 Option 的 Some 变体中存储的值类型相同,这里是 ShirtColor)。如果 Option 是 Some 成员,则 unwrap_or_else 返回 Some 中的值。如果 Option 是 None 成员,则 unwrap_or_else 调用闭包并返回闭包的返回值。 我们将闭包表达式 || self.most_stocked() 作为 unwrap_or_else 的参数。这是一个本身不获取参数的闭包(如果闭包有参数,它们会出现在两道竖杠之间)。闭包体调用了 self.most_stocked()。我们在这里定义了闭包,而 unwrap_or_else 的实现会在之后需要其结果的时候执行闭包。 运行代码会打印出: $ cargo run Compiling shirt-company v0.1.0 (file:///projects/shirt-company) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.27s Running `target/debug/shirt-company`\nThe user with preference Some(Red) gets Red\nThe user with preference None gets Blue 这里有一个有趣的地方是,我们传递了一个闭包,该闭包会在当前的 Inventory 实例上调用 self.most_stocked() 方法。标准库不需要了解我们定义的 Inventory 或 ShirtColor 类型,也不需要了解我们在这个场景中要使用的逻辑。闭包捕获了对 self(即 Inventory 实例)的不可变引用,并将其与我们指定的代码一起传递给 unwrap_or_else 方法。相比之下,函数无法以这种方式捕获其环境。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 闭包:可以捕获其环境的匿名函数 » 闭包会捕获其环境","id":"239","title":"闭包会捕获其环境"},"24":{"body":"你刚刚运行了一个新创建的程序,那么让我们检查此过程中的每一个步骤。 在运行 Rust 程序之前,必须先使用 Rust 编译器编译它,即输入 rustc 命令并传入源文件名称,如下: $ rustc main.rs 如果你有 C 或 C++ 背景,就会发现这与 gcc 和 clang 类似。编译成功后,Rust 会输出一个二进制的可执行文件。 在 Linux、macOS 或 Windows 的 PowerShell 上,在 shell 中输入 ls 命令可以看见这个可执行文件。 $ ls\nmain main.rs 在 Linux 和 macOS,你会看到两个文件。在 Windows PowerShell 中,你会看到同使用 CMD 相同的三个文件。在 Windows 的 CMD 上,则输入如下内容: > dir /B %= the /B option says to only show the file names =%\nmain.exe\nmain.pdb\nmain.rs 这展示了扩展名为 .rs 的源文件、可执行文件(在 Windows 下是 main.exe ,其它平台是 main ),以及当使用 CMD 时会有一个包含调试信息、扩展名为 .pdb 的文件。从这里开始运行 main 或 main.exe 文件,如下: $ ./main # Windows 是 .\\main.exe 如果这里的 main.rs 是上文所述的 “Hello, world!” 程序,那么在终端上就会打印出 Hello, world!。 如果你更熟悉动态语言,如 Ruby、Python 或 JavaScript,则可能不习惯将编译和运行分为两个单独的步骤。Rust 是一种 预编译静态类型 ( ahead-of-time compiled )语言,这意味着你可以编译程序,并将可执行文件送给其他人,他们甚至不需要安装 Rust 就可以运行。如果你给他人一个 .rb 、 .py 或 .js 文件,他们需要先分别安装 Ruby,Python,JavaScript 实现(运行时环境,VM)。不过在这些语言中,只需要一句命令就可以编译和运行程序。这一切都是语言设计上的权衡取舍。 仅仅使用 rustc 编译简单程序是没问题的,不过随着项目的增长,你可能需要管理你项目的方方面面,并让代码易于分享。接下来,我们要介绍一个叫做 Cargo 的工具,它会帮助你编写真实世界中的 Rust 程序。","breadcrumbs":"入门指南 » Hello, World! » 编译和运行是彼此独立的步骤","id":"24","title":"编译和运行是彼此独立的步骤"},"240":{"body":"函数与闭包还有更多区别。闭包通常不要求像 fn 函数那样对参数和返回值进行类型注解。函数需要类型注解是因为这些类型是暴露给用户的显式接口的一部分。严格定义这些接口对于确保所有人对函数使用和返回值的类型达成一致理解非常重要。与此相比,闭包并不用于这样暴露在外的接口:它们储存在变量中并被使用,不用命名它们或暴露给库的用户调用。 闭包通常较短,并且只与特定的上下文相关,而不是适用于任意情境。在这些有限的上下文中,编译器可以推断参数和返回值的类型,类似于它推断大多数变量类型的方式(尽管在某些罕见的情况下,编译器也需要闭包的类型注解)。 类似于变量,如果我们希望增加代码的明确性和清晰度,可以添加类型注解,但代价是是会使代码变得比严格必要的更冗长。为示例 13-1 中定义的闭包标注类型看起来如示例 13-2 中的定义一样。这个例子中,我们定义了一个闭包并将它保存在变量中,而不是像示例 13-1 那样在传参的地方定义它。 文件名:src/main.rs # use std::thread;\n# use std::time::Duration;\n# # fn generate_workout(intensity: u32, random_number: u32) { let expensive_closure = |num: u32| -> u32 { println!(\"calculating slowly...\"); thread::sleep(Duration::from_secs(2)); num };\n# # if intensity < 25 {\n# println!(\"Today, do {} pushups!\", expensive_closure(intensity));\n# println!(\"Next, do {} situps!\", expensive_closure(intensity));\n# } else {\n# if random_number == 3 {\n# println!(\"Take a break today! Remember to stay hydrated!\");\n# } else {\n# println!(\n# \"Today, run for {} minutes!\",\n# expensive_closure(intensity)\n# );\n# }\n# }\n# }\n# # fn main() {\n# let simulated_user_specified_value = 10;\n# let simulated_random_number = 7;\n# # generate_workout(simulated_user_specified_value, simulated_random_number);\n# } 示例 13-2:为闭包的参数和返回值增加可选的类型注解 有了类型注解,闭包的语法看起来就更像函数的语法了。如下是一个对其参数加一的函数的定义与拥有相同行为闭包语法的纵向对比。这里增加了一些空格来对齐相应部分。这展示了除了使用竖线以及一些可选语法外,闭包语法与函数语法有多么地相似: fn add_one_v1 (x: u32) -> u32 { x + 1 }\nlet add_one_v2 = |x: u32| -> u32 { x + 1 };\nlet add_one_v3 = |x| { x + 1 };\nlet add_one_v4 = |x| x + 1 ; 第一行展示了一个函数定义,第二行展示了一个完整标注的闭包定义。第三行闭包定义中省略了类型注解,而第四行去掉了可选的大括号,因为闭包体只有一个表达式,所以大括号是可选的。这些都是有效的闭包定义,并在调用时产生相同的行为。调用闭包是 add_one_v3 和 add_one_v4 能够编译的必要条件,因为类型将从其用法中推断出来。这类似于 let v = Vec::new();,Rust 需要类型注解或是某种类型的值被插入到 Vec 中,才能推断其类型。 对于闭包定义,编译器会为每个参数和返回值推断出一个具体类型。例如,示例 13-3 展示了一个简短的闭包定义,该闭包仅仅返回作为参数接收到的值。除了作为示例用途外,这个闭包并不是很实用。注意这个定义没有增加任何类型注解。因为没有类型注解,我们可以使用任意类型来调用这个闭包,我们在这里第一次调用时使用了 String 类型。但是如果我们接着尝试使用整数来调用 example_closure,就会得到一个错误。 文件名:src/main.rs # fn main() { let example_closure = |x| x; let s = example_closure(String::from(\"hello\")); let n = example_closure(5);\n# } 示例 13-3:尝试调用一个被推断为两个不同类型的闭包 编译器给出如下错误: $ cargo run Compiling closure-example v0.1.0 (file:///projects/closure-example)\nerror[E0308]: mismatched types --> src/main.rs:5:29 |\n5 | let n = example_closure(5); | --------------- ^- help: try using a conversion method: `.to_string()` | | | | | expected `String`, found integer | arguments to this function are incorrect |\nnote: expected because the closure was earlier called with an argument of type `String` --> src/main.rs:4:29 |\n4 | let s = example_closure(String::from(\"hello\")); | --------------- ^^^^^^^^^^^^^^^^^^^^^ expected because this argument is of type `String` | | | in this closure call\nnote: closure parameter defined here --> src/main.rs:2:28 |\n2 | let example_closure = |x| x; | ^ For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `closure-example` (bin \"closure-example\") due to 1 previous error 第一次使用 String 值调用 example_closure 时,编译器推断出 x 的类型以及闭包的返回类型为 String。接着这些类型被锁定进闭包 example_closure 中,如果尝试对同一闭包使用不同类型则就会得到类型错误。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 闭包:可以捕获其环境的匿名函数 » 闭包类型推断和注解","id":"240","title":"闭包类型推断和注解"},"241":{"body":"闭包可以通过三种方式捕获其环境中的值,它们直接对应到函数获取参数的三种方式:不可变借用、可变借用和获取所有权。闭包将根据函数体中对捕获值的操作来决定使用哪种方式。 在示例 13-4 中定义了一个捕获名为 list 的 vector 的不可变引用的闭包,因为只需不可变引用就能打印其值: 文件名:src/main.rs fn main() { let list = vec![1, 2, 3]; println!(\"Before defining closure: {list:?}\"); let only_borrows = || println!(\"From closure: {list:?}\"); println!(\"Before calling closure: {list:?}\"); only_borrows(); println!(\"After calling closure: {list:?}\");\n} 示例 13-4:定义并调用一个捕获不可变引用的闭包 这个示例也展示了变量可以绑定一个闭包定义,并且我们可以像使用函数名一样,使用变量名和括号来调用该闭包。 因为同时可以有多个 list 的不可变引用,所以在闭包定义之前,闭包定义之后调用之前,闭包调用之后代码仍然可以访问 list。该代码可以编译、运行并输出: $ cargo run Locking 1 package to latest compatible version Adding closure-example v0.1.0 (/Users/chris/dev/rust-lang/book/tmp/listings/ch13-functional-features/listing-13-04) Compiling closure-example v0.1.0 (file:///projects/closure-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s Running `target/debug/closure-example`\nBefore defining closure: [1, 2, 3]\nBefore calling closure: [1, 2, 3]\nFrom closure: [1, 2, 3]\nAfter calling closure: [1, 2, 3] 接下来在示例 13-5 中,我们修改闭包体让它向 list vector 增加一个元素。闭包现在捕获一个可变引用: 文件名:src/main.rs fn main() { let mut list = vec![1, 2, 3]; println!(\"Before defining closure: {list:?}\"); let mut borrows_mutably = || list.push(7); borrows_mutably(); println!(\"After calling closure: {list:?}\");\n} 示例 13-5:定义并调用一个捕获可变引用的闭包 代码可以编译、运行并打印: $ cargo run Locking 1 package to latest compatible version Adding closure-example v0.1.0 (/Users/chris/dev/rust-lang/book/tmp/listings/ch13-functional-features/listing-13-05) Compiling closure-example v0.1.0 (file:///projects/closure-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s Running `target/debug/closure-example`\nBefore defining closure: [1, 2, 3]\nAfter calling closure: [1, 2, 3, 7] 注意在 borrows_mutably 闭包的定义和调用之间不再有 println!,这是因为当 borrows_mutably 被定义时,它捕获了对 list 的可变引用。闭包在被调用后就不再被使用,这时可变借用结束。因为当可变借用存在时不允许有其它的借用,所以在闭包定义和调用之间不能有不可变引用来进行打印。可以尝试在这里添加 println! 看看你会得到什么报错信息! 即使闭包体不严格需要所有权,如果希望强制闭包获取它在环境中所使用的值的所有权,可以在参数列表前使用 move 关键字。 当将闭包传递到一个新的线程时,这个技巧特别有用,因为它将数据的所有权移动到新线程中。我们将在第十六章讨论并发时详细讨论线程以及为什么你可能需要使用它们。不过现在,我们先简要探索一下如何使用需要 move 关键字的闭包来生成一个新线程。示例 13-6 展示了如何修改示例 13-4,以便在一个新线程中而不是在主线程中打印 vector: 文件名:src/main.rs use std::thread; fn main() { let list = vec![1, 2, 3]; println!(\"Before defining closure: {list:?}\"); thread::spawn(move || println!(\"From thread: {list:?}\")) .join() .unwrap();\n} 示例 13-6:使用 move 来强制闭包为线程获取 list 的所有权 我们生成了一个新的线程,并给这个线程传递一个闭包作为参数来运行,闭包体打印出列表。在示例 13-4 中,闭包仅通过不可变引用捕获了 list,因为这是打印列表所需的最少的访问权限。这个例子中,尽管闭包体依然只需要不可变引用,我们还是在闭包定义前写上 move 关键字,以确保 list 被移动到闭包中。新线程可能在主线程剩余部分执行完前执行完,也可能在主线程执行完之后执行完。如果主线程维护了 list 的所有权但却在新线程之前结束并且丢弃了 list,则在线程中的不可变引用将失效。因此,编译器要求 list 被移动到在新线程中运行的闭包中,这样引用就是有效的。试着移除 move 关键字,或者在闭包定义后在主线程中使用 list,看看你会得到什么编译器报错!","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 闭包:可以捕获其环境的匿名函数 » 捕获引用或者移动所有权","id":"241","title":"捕获引用或者移动所有权"},"242":{"body":"一旦闭包捕获了定义它的环境中的某个值的引用或所有权(也就影响了什么会被移 进 闭包,如有),闭包体中的代码则决定了在稍后执行闭包时,这些引用或值将如何处理(也就影响了什么会被移 出 闭包,如有)。闭包体可以执行以下任一操作:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获任何值。 闭包捕获和处理环境中的值的方式会影响闭包实现哪些 trait,而 trait 是函数和结构体指定它们可以使用哪些类型闭包的方式。根据闭包体如何处理这些值,闭包会自动、渐进地实现一个、两个或全部三个 Fn trait。 FnOnce 适用于只能被调用一次的闭包。所有闭包至少都实现了这个 trait,因为所有闭包都能被调用。一个会将捕获的值从闭包体中移出的闭包只会实现 FnOnce trait,而不会实现其他 Fn 相关的 trait,因为它只能被调用一次。 FnMut 适用于不会将捕获的值移出闭包体,但可能会修改捕获值的闭包。这类闭包可以被调用多次。 Fn 适用于既不将捕获的值移出闭包体,也不修改捕获值的闭包,同时也包括不从环境中捕获任何值的闭包。这类闭包可以被多次调用而不会改变其环境,这在会多次并发调用闭包的场景中十分重要。 让我们来看示例 13-1 中使用的在 Option 上的 unwrap_or_else 方法的定义: impl Option { pub fn unwrap_or_else(self, f: F) -> T where F: FnOnce() -> T { match self { Some(x) => x, None => f(), } }\n} 回忆一下,T 是表示 Option 中 Some 成员中的值的类型的泛型。类型 T 也是 unwrap_or_else 函数的返回值类型:举例来说,在 Option 上调用 unwrap_or_else 会得到一个 String。 接着注意到 unwrap_or_else 函数有额外的泛型参数 F。F 是参数 f 的类型,f 是调用 unwrap_or_else 时提供的闭包。 泛型 F 的 trait bound 是 FnOnce() -> T,这意味着 F 必须能够被调用一次,没有参数并返回一个 T。在 trait bound 中使用 FnOnce 表示 unwrap_or_else 最多只会调用 f 一次。在 unwrap_or_else 的函数体中可以看到,如果 Option 是 Some,f 不会被调用。如果 Option 是 None,f 将会被调用一次。由于所有的闭包都实现了 FnOnce,unwrap_or_else 接受所有三种类型的闭包,十分灵活。 注意:函数也可以实现所有的三种 Fn traits。如果我们要做的事情不需要从环境中捕获值,则可以在需要某种实现了 Fn trait 的东西时使用函数而不是闭包。举个例子,可以在 Option> 的值上调用 unwrap_or_else(Vec::new),以便在值为 None 时获取一个新的空的 vector。 现在让我们来看定义在 slice 上的标准库方法 sort_by_key,看看它与 unwrap_or_else 的区别,以及为什么 sort_by_key 使用 FnMut 而不是 FnOnce 作为 trait bound。这个闭包以一个 slice 中当前被考虑的元素的引用作为参数,并返回一个可以排序的 K 类型的值。当你想按照 slice 中每个元素的某个属性进行排序时,这个函数非常有用。在示例 13-7 中,我们有一个 Rectangle 实例的列表,并使用 sort_by_key 按 Rectangle 的 width 属性对它们从低到高排序: 文件名:src/main.rs #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} fn main() { let mut list = [ Rectangle { width: 10, height: 1 }, Rectangle { width: 3, height: 5 }, Rectangle { width: 7, height: 12 }, ]; list.sort_by_key(|r| r.width); println!(\"{list:#?}\");\n} 示例 13-7:使用 sort_by_key 对长方形按宽度排序 代码输出: $ cargo run Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.41s Running `target/debug/rectangles`\n[ Rectangle { width: 3, height: 5, }, Rectangle { width: 7, height: 12, }, Rectangle { width: 10, height: 1, },\n] sort_by_key 被定义为接收一个 FnMut 闭包的原因是它会多次调用这个闭包:对 slice 中的每个元素调用一次。闭包 |r| r.width 不捕获、修改或将任何东西移出它的环境,所以它满足 trait bound 的要求。 相比之下,示例 13-8 展示了一个只实现了 FnOnce trait 的闭包的例子,因为它从环境中移出了一个值。编译器不允许我们在 sort_by_key 中使用这个闭包: 文件名:src/main.rs #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} fn main() { let mut list = [ Rectangle { width: 10, height: 1 }, Rectangle { width: 3, height: 5 }, Rectangle { width: 7, height: 12 }, ]; let mut sort_operations = vec![]; let value = String::from(\"closure called\"); list.sort_by_key(|r| { sort_operations.push(value); r.width }); println!(\"{list:#?}\");\n} 示例 13-8:尝试在 sort_by_key 上使用一个 FnOnce 闭包 这是一个刻意构造的、复杂且无效的方式,试图统计在对 list 进行排序时 sort_by_key 调用闭包的次数。该代码试图通过将闭包环境中的 value(一个 String)插入 sort_operations vector 来实现计数。闭包捕获了 value,然后通过将 value 的所有权转移给 sort_operations vector 的方式将其移出闭包。这个闭包只能被调用一次;尝试第二次调用它将无法工作,因为这时 value 已经不在闭包的环境中,无法被再次插入 sort_operations 中!因而,这个闭包只实现了 FnOnce。当我们尝试编译此代码时,会出现错误提示:value 不能从闭包中移出,因为闭包必须实现 FnMut: $ cargo run Compiling rectangles v0.1.0 (file:///projects/rectangles)\nerror[E0507]: cannot move out of `value`, a captured variable in an `FnMut` closure --> src/main.rs:18:30 |\n15 | let value = String::from(\"closure called\"); | ----- captured outer variable\n16 |\n17 | list.sort_by_key(|r| { | --- captured by this `FnMut` closure\n18 | sort_operations.push(value); | ^^^^^ move occurs because `value` has type `String`, which does not implement the `Copy` trait |\nhelp: consider cloning the value if the performance cost is acceptable |\n18 | sort_operations.push(value.clone()); | ++++++++ For more information about this error, try `rustc --explain E0507`.\nerror: could not compile `rectangles` (bin \"rectangles\") due to 1 previous error 报错指向了闭包体中将 value 移出环境的那一行。要修复此问题,我们需要修改闭包体,使其不会将值移出环境。在环境中维护一个计数器,并在闭包体中递增其值,是计算闭包被调用次数的一个更简单直接的方法。示例 13-9 中的闭包可以在 sort_by_key 中使用,因为它只捕获了 num_sort_operations 计数器的可变引用,因此可以被多次调用: 文件名:src/main.rs #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} fn main() { let mut list = [ Rectangle { width: 10, height: 1 }, Rectangle { width: 3, height: 5 }, Rectangle { width: 7, height: 12 }, ]; let mut num_sort_operations = 0; list.sort_by_key(|r| { num_sort_operations += 1; r.width }); println!(\"{list:#?}, sorted in {num_sort_operations} operations\");\n} 示例 13-9:允许在 sort_by_key 上使用一个 FnMut 闭包 当定义或使用涉及闭包的函数或类型时,Fn traits 十分重要。在下个小节中,我们将讨论迭代器。许多迭代器方法都接收闭包参数,因此在继续前,请记住这些闭包的细节!","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 闭包:可以捕获其环境的匿名函数 » 将被捕获的值移出闭包和 Fn trait","id":"242","title":"将被捕获的值移出闭包和 Fn trait"},"243":{"body":"ch13-02-iterators.md commit eabaaaa90ee6937db3690dc56f739116be55ecb2 迭代器模式允许你依次对一个序列中的项执行某些操作。 迭代器 ( iterator )负责遍历序列中的每一项并确定序列何时结束的逻辑。使用迭代器时,你无需自己重新实现这些逻辑。 在 Rust 中,迭代器是 惰性的 ( lazy ),这意味着在调用消费迭代器的方法之前不会执行任何操作。例如,示例 13-10 中的代码通过调用定义于 Vec 上的 iter 方法在一个 vector v1 上创建了一个迭代器。这段代码本身并没有执行任何有用的操作。 # fn main() { let v1 = vec![1, 2, 3]; let v1_iter = v1.iter();\n# } 示例 13-10:创建一个迭代器 迭代器被储存在 v1_iter 变量中。一旦创建迭代器之后,可以选择用多种方式利用它。在第三章的示例 3-5 中,我们使用 for 循环来遍历一个数组并在每一个项上执行了一些代码。在底层它隐式地创建并接着消费了一个迭代器,不过直到现在我们都一笔带过了它具体是如何工作的。 示例 13-11 中的例子将迭代器的创建和 for 循环中的使用分开。当 for 循环使用 v1_iter 中的迭代器时,迭代器中的每一个元素都会用于循环的一次迭代,并打印出每个值。 # fn main() { let v1 = vec![1, 2, 3]; let v1_iter = v1.iter(); for val in v1_iter { println!(\"Got: {val}\"); }\n# } 示例 13-11:在一个 for 循环中使用迭代器 在标准库中没有提供迭代器的语言中,我们可能会使用一个从 0 开始的索引变量,使用这个变量索引 vector 中的值,并循环增加其值直到达到 vector 中的元素总量。 迭代器为我们处理了所有这些逻辑,这减少了重复代码并消除了潜在的混乱。另外,迭代器的实现方式提供了对多种不同的序列使用相同逻辑的灵活性,而不仅仅是像 vector 这样可索引的数据结构。让我们看看迭代器是如何做到这些的。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 使用迭代器处理元素序列 » 使用迭代器处理元素序列","id":"243","title":"使用迭代器处理元素序列"},"244":{"body":"迭代器都实现了一个叫做 Iterator 的定义于标准库的 trait。这个 trait 的定义看起来像这样: pub trait Iterator { type Item; fn next(&mut self) -> Option; // 此处省略了方法的默认实现\n} 注意这里有一个我们还未讲到的新语法:type Item 和 Self::Item,它们定义了 trait 的 关联类型 ( associated type )。第二十章会深入讲解关联类型,不过现在只需知道这段代码表明实现 Iterator trait 要求同时定义一个 Item 类型,这个 Item 类型被用作 next 方法的返回值类型。换句话说,Item 类型将是迭代器返回元素的类型。 next 是 Iterator 实现者被要求定义的唯一方法:next 方法,该方法每次返回迭代器中的一个项,封装在 Some 中,并且当迭代完成时,返回 None。 可以直接调用迭代器的 next 方法;示例 13-12 展示了对由 vector 创建的迭代器重复调用 next 方法时返回的值。 文件名:src/lib.rs # #[cfg(test)]\n# mod tests { #[test] fn iterator_demonstration() { let v1 = vec![1, 2, 3]; let mut v1_iter = v1.iter(); assert_eq!(v1_iter.next(), Some(&1)); assert_eq!(v1_iter.next(), Some(&2)); assert_eq!(v1_iter.next(), Some(&3)); assert_eq!(v1_iter.next(), None); }\n# } 示例 13-12:在迭代器上(直接)调用 next 方法 注意我们需要将 v1_iter 声明为可变的:在迭代器上调用 next 方法会改变迭代器内部的状态,该状态用于跟踪迭代器在序列中的位置。换句话说,代码 消费 (consume)了,或者说用尽了迭代器。每一次 next 调用都会从迭代器中消费一个项。使用 for 循环时无需使 v1_iter 可变因为 for 循环会获取 v1_iter 的所有权并在后台使 v1_iter 可变。 还需要注意的是,从 next 调用中获取的值是对 vector 中值的不可变引用。iter 方法生成一个不可变引用的迭代器。如果我们需要一个获取 v1 所有权并返回拥有所有权的迭代器,则可以调用 into_iter 而不是 iter。类似地,如果我们希望迭代可变引用,可以调用 iter_mut 而不是 iter。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 使用迭代器处理元素序列 » Iterator trait 和 next 方法","id":"244","title":"Iterator trait 和 next 方法"},"245":{"body":"Iterator trait 有一系列不同的由标准库提供默认实现的方法;你可以在 Iterator trait 的标准库 API 文档中找到所有这些方法。一些方法在其定义中调用了 next 方法,这也就是为什么在实现 Iterator trait 时要求实现 next 方法的原因。 这些调用 next 方法的方法被称为 消费适配器 ( consuming adaptors ),因为调用它们会消耗迭代器。一个消费适配器的例子是 sum 方法。这个方法获取迭代器的所有权并反复调用 next 来遍历迭代器,因而会消费迭代器。在遍历过程中,它将每个项累加到一个总和中,并在迭代完成时返回这个总和。示例 13-13 有一个展示 sum 方法使用的测试: 文件名:src/lib.rs # #[cfg(test)]\n# mod tests { #[test] fn iterator_sum() { let v1 = vec![1, 2, 3]; let v1_iter = v1.iter(); let total: i32 = v1_iter.sum(); assert_eq!(total, 6); }\n# } 示例 13-13:调用 sum 方法获取迭代器所有项的总和 调用 sum 之后不再允许使用 v1_iter 因为调用 sum 时它会获取迭代器的所有权。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 使用迭代器处理元素序列 » 消费迭代器的方法","id":"245","title":"消费迭代器的方法"},"246":{"body":"Iterator trait 中定义了另一类方法,被称为 迭代器适配器 ( iterator adaptors ),它们不会消耗当前的迭代器,而是通过改变原始迭代器的某些方面来生成不同的迭代器。 示例 13-14 展示了一个调用迭代器适配器方法 map 的例子,该方法使用一个闭包对每个元素进行操作。map 方法返回一个新的迭代器,该迭代器生成经过修改的元素。这里的闭包创建了一个新的迭代器,其中 vector 中的每个元素都被加 1。 文件名:src/main.rs # fn main() { let v1: Vec = vec![1, 2, 3]; v1.iter().map(|x| x + 1);\n# } 示例 13-14:调用迭代器适配器 map 来创建一个新迭代器 不过这些代码会产生一个警告: $ cargo run Compiling iterators v0.1.0 (file:///projects/iterators)\nwarning: unused `Map` that must be used --> src/main.rs:4:5 |\n4 | v1.iter().map(|x| x + 1); | ^^^^^^^^^^^^^^^^^^^^^^^^ | = note: iterators are lazy and do nothing unless consumed = note: `#[warn(unused_must_use)]` on by default\nhelp: use `let _ = ...` to ignore the resulting value |\n4 | let _ = v1.iter().map(|x| x + 1); | +++++++ warning: `iterators` (bin \"iterators\") generated 1 warning Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.47s Running `target/debug/iterators` 示例 13-14 中的代码实际上并没有做任何事;所指定的闭包从未被调用过。警告提醒了我们原因所在:迭代器适配器是惰性的,因此我们需要在此处消费迭代器。 为了修复这个警告并消费迭代器,我们将使用第十二章示例 12-1 结合 env::args 使用的 collect 方法。这个方法消费迭代器并将结果收集到一个集合数据类型中。 在示例 13-15 中,我们将遍历由 map 调用生成的迭代器结果收集到一个 vector 中。这个 vector 将包含原始 vector 中每个元素加 1 的结果。 文件名:src/main.rs # fn main() { let v1: Vec = vec![1, 2, 3]; let v2: Vec<_> = v1.iter().map(|x| x + 1).collect(); assert_eq!(v2, vec![2, 3, 4]);\n# } 示例 13-15:调用 map 方法创建一个新迭代器,接着调用 collect 方法消费新迭代器并创建一个 vector 由于 map 接受一个闭包,因此我们可以指定希望在每个元素上执行的任何操作。这是一个很好的例子,展示了如何通过闭包来自定义某些行为,同时复用 Iterator trait 提供的迭代行为。 可以链式调用多个迭代器适配器来以一种可读的方式进行复杂的操作。不过因为所有的迭代器都是惰性的,你必须调用一个消费适配器方法,才能从这些迭代器适配器的调用中获取结果。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 使用迭代器处理元素序列 » 产生其他迭代器的方法","id":"246","title":"产生其他迭代器的方法"},"247":{"body":"很多迭代器适配器接受闭包作为参数,而我们通常会指定捕获其环境的闭包作为迭代器适配器的参数。 作为一个例子,我们使用 filter 方法来获取一个闭包。该闭包从迭代器中获取一项并返回一个 bool。如果闭包返回 true,其值将会包含在 filter 提供的新迭代器中。如果闭包返回 false,其值不会被包含。 示例 13-16 中使用 filter 和一个捕获环境中变量 shoe_size 的闭包来遍历一个 Shoe 结构体集合。它只会返回指定鞋码的鞋子。 文件名:src/lib.rs #[derive(PartialEq, Debug)]\nstruct Shoe { size: u32, style: String,\n} fn shoes_in_size(shoes: Vec, shoe_size: u32) -> Vec { shoes.into_iter().filter(|s| s.size == shoe_size).collect()\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn filters_by_size() { let shoes = vec![ Shoe { size: 10, style: String::from(\"sneaker\"), }, Shoe { size: 13, style: String::from(\"sandal\"), }, Shoe { size: 10, style: String::from(\"boot\"), }, ]; let in_my_size = shoes_in_size(shoes, 10); assert_eq!( in_my_size, vec![ Shoe { size: 10, style: String::from(\"sneaker\") }, Shoe { size: 10, style: String::from(\"boot\") }, ] ); }\n} 示例 13-16:使用 filter 方法和一个捕获 shoe_size 的闭包 shoes_in_size 函数获取一个鞋子 vector 的所有权和一个鞋码作为参数。它返回一个只包含指定鞋码的鞋子的 vector。 shoes_in_size 函数体中调用了 into_iter 来创建一个获取 vector 所有权的迭代器。接着调用 filter 将这个迭代器适配成一个只含有那些闭包返回 true 的元素的新迭代器。 闭包从环境中捕获了 shoe_size 变量并使用其值与每一只鞋的大小作比较,只保留指定鞋码的鞋子。最终,调用 collect 将迭代器适配器返回的值收集进一个 vector 并返回。 这个测试展示当调用 shoes_in_size 时,返回的只会是与我们指定的鞋码相同的鞋子。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 使用迭代器处理元素序列 » 使用捕获其环境的闭包","id":"247","title":"使用捕获其环境的闭包"},"248":{"body":"ch13-03-improving-our-io-project.md commit 2cd1b5593d26dc6a03c20f8619187ad4b2485552 掌握了这些关于迭代器的新知识后,我们可以使用迭代器来改进第十二章中 I/O 项目的实现来使得代码更简洁明了。接下来,让我们看看迭代器如何改进 Config::build 函数和 search 函数的实现。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 改进之前的 I/O 项目 » 改进 I/O 项目","id":"248","title":"改进 I/O 项目"},"249":{"body":"在示例 12-6 中,我们增加了一些代码获取一个 String 类型的 slice 并创建一个 Config 结构体的实例,它们索引 slice 中的值并克隆这些值以便 Config 结构体可以拥有这些值。在示例 13-17 中重现了第十二章结尾示例 12-23 中 Config::build 函数的实现: 文件名:src/lib.rs # use std::env;\n# use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# pub ignore_case: bool,\n# }\n# impl Config { pub fn build(args: &[String]) -> Result { if args.len() < 3 { return Err(\"not enough arguments\"); } let query = args[1].clone(); let file_path = args[2].clone(); let ignore_case = env::var(\"IGNORE_CASE\").is_ok(); Ok(Config { query, file_path, ignore_case, }) }\n}\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # let results = if config.ignore_case {\n# search_case_insensitive(&config.query, &contents)\n# } else {\n# search(&config.query, &contents)\n# };\n# # for line in results {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 13-17:重现示例 12-23 的 Config::build 函数 当时我们说过不必担心低效的 clone 调用,因为我们以后会将其移除。好吧,就是现在! 起初这里需要 clone 的原因是参数 args 中有一个 String 元素的 slice,而 build 函数并不拥有 args。为了能够返回 Config 实例的所有权,我们需要克隆 Config 中字段 query 和 file_path 的值,这样 Config 实例就能拥有这些值。 在学习了迭代器之后,我们可以将 build 函数改为获取一个有所有权的迭代器作为参数,而不是借用 slice。我们将使用迭代器功能代替之前检查 slice 长度和索引特定位置的代码。这样可以更清晰地表达 Config::build 函数的操作,因为迭代器会负责访问这些值。 一旦 Config::build 获取了迭代器的所有权并不再使用借用的索引操作,就可以将迭代器中的 String 值移动到 Config 中,而不是调用 clone 分配新的空间。 直接使用返回的迭代器 打开 I/O 项目的 src/main.rs 文件,它看起来应该像这样: 文件名:src/main.rs # use std::env;\n# use std::process;\n# # use minigrep::Config;\n# fn main() { let args: Vec = env::args().collect(); let config = Config::build(&args).unwrap_or_else(|err| { eprintln!(\"Problem parsing arguments: {err}\"); process::exit(1); }); // --snip--\n# # if let Err(e) = minigrep::run(config) {\n# eprintln!(\"Application error: {e}\");\n# process::exit(1);\n# }\n} 首先我们修改第十二章结尾示例 12-24 中的 main 函数的开头为示例 13-18 中的代码。在更新 Config::build 之前这些代码还不能编译: 文件名:src/main.rs # use std::env;\n# use std::process;\n# # use minigrep::Config;\n# fn main() { let config = Config::build(env::args()).unwrap_or_else(|err| { eprintln!(\"Problem parsing arguments: {err}\"); process::exit(1); }); // --snip--\n# # if let Err(e) = minigrep::run(config) {\n# eprintln!(\"Application error: {e}\");\n# process::exit(1);\n# }\n} 示例 13-25:将 env::args 的返回值传递给 Config::build env::args 函数返回一个迭代器!不同于将迭代器的值收集到一个 vector 中接着传递一个 slice 给 Config::build,现在我们直接将 env::args 返回的迭代器的所有权传递给 Config::build。 接下来需要更新 Config::build 的定义。在 I/O 项目的 src/lib.rs 中,将 Config::build 的签名改为如示例 13-19 所示。这仍然不能编译因为我们还需更新函数体。 文件名:src/lib.rs # use std::env;\n# use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# pub ignore_case: bool,\n# }\n# impl Config { pub fn build( mut args: impl Iterator, ) -> Result { // --snip--\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # let ignore_case = env::var(\"IGNORE_CASE\").is_ok();\n# # Ok(Config {\n# query,\n# file_path,\n# ignore_case,\n# })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # let results = if config.ignore_case {\n# search_case_insensitive(&config.query, &contents)\n# } else {\n# search(&config.query, &contents)\n# };\n# # for line in results {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 13-19:以迭代器作为参数更新 Config::build 的签名 env::args 函数的标准库文档显示,它返回的迭代器的类型为 std::env::Args,并且这个类型实现了 Iterator trait 并返回 String 值。 我们已经更新了 Config::build 函数的签名,因此参数 args 有一个带有 trait bounds impl Iterator 的泛型类型,而不是 &[String]。这里用到了第十章 “trait 作为参数” 部分讨论过的 impl Trait 语法,这意味着 args 可以是任何实现了 Iterator trait 并返回 String 项(item)的类型。 由于我们获取了 args 的所有权,并且将通过迭代来修改 args,因此我们可以在 args 参数的声明中添加 mut 关键字,使其可变。 使用 Iterator trait 代替索引 接下来,我们将修改 Config::build 的函数体。因为 args 实现了 Iterator trait,因此我们知道可以对其调用 next 方法!示例 13-20 更新了示例 12-23 中的代码,以使用 next 方法: 文件名:src/lib.rs # use std::env;\n# use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# pub ignore_case: bool,\n# }\n# impl Config { pub fn build( mut args: impl Iterator, ) -> Result { args.next(); let query = match args.next() { Some(arg) => arg, None => return Err(\"Didn't get a query string\"), }; let file_path = match args.next() { Some(arg) => arg, None => return Err(\"Didn't get a file path\"), }; let ignore_case = env::var(\"IGNORE_CASE\").is_ok(); Ok(Config { query, file_path, ignore_case, }) }\n}\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # let results = if config.ignore_case {\n# search_case_insensitive(&config.query, &contents)\n# } else {\n# search(&config.query, &contents)\n# };\n# # for line in results {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 13-20:修改 Config::build 的函数体来使用迭代器方法 请记住 env::args 返回值的第一个值是程序的名称。我们希望忽略它并获取下一个值,所以首先调用 next 且不对其返回值做任何操作。然后,我们再次调用 next 来获取要放入 Config 结构体的 query 字段的值。如果 next 返回 Some,使用 match 来提取其值。如果它返回 None,则意味着没有提供足够的参数并通过 Err 值提早返回。我们对对 file_path 的值也进行同样的操作。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 改进之前的 I/O 项目 » 使用迭代器去除 clone","id":"249","title":"使用迭代器去除 clone"},"25":{"body":"ch01-03-hello-cargo.md commit 299fd1f3e11dd61ca136fb51d713f6b0ba7515ff Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目,因为它可以为你处理很多任务,比如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 依赖 ( dependencies ))。 最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。如果使用 Cargo 来构建 “Hello, world!” 项目,将只会用到 Cargo 构建代码的那部分功能。在编写更复杂的 Rust 程序时,你将添加依赖项,如果使用 Cargo 启动项目,则添加依赖项将更容易。 由于绝大多数 Rust 项目使用 Cargo,本书接下来的部分假设你也使用 Cargo。如果使用 “安装” 部分介绍的官方安装包的话,则自带了 Cargo。如果通过其他方式安装的话,可以在终端输入如下命令检查是否安装了 Cargo: $ cargo --version 如果你看到了版本号,说明已安装!如果看到类似 command not found 的错误,你应该查看相应安装文档以确定如何单独安装 Cargo。","breadcrumbs":"入门指南 » Hello, Cargo! » Hello, Cargo!","id":"25","title":"Hello, Cargo!"},"250":{"body":"I/O 项目中其他可以利用迭代器的地方是 search 函数,示例 13-21 中重现了第十二章结尾示例 12-19 中此函数的定义: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # Ok(())\n# }\n# pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { let mut results = Vec::new(); for line in contents.lines() { if line.contains(query) { results.push(line); } } results\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn one_result() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# } 示例 13-21:示例 12-19 中 search 函数的定义 可以通过使用迭代器适配器方法来编写更简明的代码。这样做还可以避免使用一个可变的中间 results vector。函数式编程风格倾向于最小化可变状态的数量来使代码更简洁。去除可变状态可能会使未来的并行搜索优化变得更容易,因为我们不必管理对 results vector 的并发访问。示例 13-22 展示了这一变化: 文件名:src/lib.rs # use std::env;\n# use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# pub ignore_case: bool,\n# }\n# # impl Config {\n# pub fn build(\n# mut args: impl Iterator,\n# ) -> Result {\n# args.next();\n# # let query = match args.next() {\n# Some(arg) => arg,\n# None => return Err(\"Didn't get a query string\"),\n# };\n# # let file_path = match args.next() {\n# Some(arg) => arg,\n# None => return Err(\"Didn't get a file path\"),\n# };\n# # let ignore_case = env::var(\"IGNORE_CASE\").is_ok();\n# # Ok(Config {\n# query,\n# file_path,\n# ignore_case,\n# })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # let results = if config.ignore_case {\n# search_case_insensitive(&config.query, &contents)\n# } else {\n# search(&config.query, &contents)\n# };\n# # for line in results {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { contents .lines() .filter(|line| line.contains(query)) .collect()\n}\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 13-22:在 search 函数实现中使用迭代器适配器 回忆一下,search 函数的目的是返回所有 contents 中包含 query 的行。类似于示例 13-16 中的 filter 例子,这段代码使用 filter 适配器来保留 line.contains(query) 返回 true 的行。接着使用 collect 将匹配行收集到另一个 vector 中。这样就容易多了!尝试对 search_case_insensitive 函数做出同样的使用迭代器方法的修改吧。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 改进之前的 I/O 项目 » 使用迭代器适配器来使代码更简明","id":"250","title":"使用迭代器适配器来使代码更简明"},"251":{"body":"接下来的逻辑问题就是在代码中应该选择哪种风格,以及原因:是使用示例 13-21 中的原始实现还是使用示例 13-22 中使用迭代器的版本?大部分 Rust 程序员倾向于使用迭代器风格。开始这有点难以掌握,不过一旦你对不同迭代器的工作方式有了感觉之后,迭代器反而更容易理解。相比摆弄不同的循环并创建新 vector,(迭代器)代码则更关注循环的高层次目的。这抽象掉那些老生常谈的代码,这样就更容易看清代码所特有的概念,比如迭代器中每个元素必须满足的过滤条件。 不过这两种实现真的完全等价吗?直觉上的假设是更底层的循环会更快一些。让我们聊聊性能吧。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 改进之前的 I/O 项目 » 选择循环或迭代器","id":"251","title":"选择循环或迭代器"},"252":{"body":"ch13-04-performance.md commit 009fffa4580ffb175f1b8470b5b12e4a63d670e4 为了决定是否使用循环或迭代器,你需要了解哪个实现更快:使用显式 for 循环的 search 函数版本,还是使用迭代器的版本。 我们进行了一个基准测试,将阿瑟·柯南·道尔的《福尔摩斯探案集》的全部内容加载到一个 String 中,并在内容中查找单词 “the”。以下是使用 for 循环版本和使用迭代器版本的 search 函数的基准测试结果: test bench_search_for ... bench: 19,620,300 ns/iter (+/- 915,700)\ntest bench_search_iter ... bench: 19,234,900 ns/iter (+/- 657,200) 结果迭代器版本还要稍微快一点!这里我们不会解释性能测试的代码,我们的目的并不是为了证明它们是完全等同的,而是得出一个怎样比较这两种实现方式性能的基本思路。 对于一个更全面的性能测试,你应该使用不同大小的文本作为 contents,不同的单词以及长度各异的单词作为 query,以及各种其他变化进行检查。关键在于:迭代器,作为一个高级的抽象,被编译成了与手写的底层代码大体一致性能的代码。迭代器是 Rust 的 零成本抽象 ( zero-cost abstractions )之一,它意味着抽象并不会引入额外的运行时开销,它与本贾尼·斯特劳斯特卢普(C++ 的设计和实现者)在 “Foundations of C++”(2012)中所定义的 零开销 ( zero-overhead )如出一辙: In general, C++ implementations obey the zero-overhead principle: What you don't use, you don't pay for. And further: What you do use, you couldn't hand code any better. Bjarne Stroustrup \"Foundations of C++\" 从整体来说,C++ 的实现遵循了零开销原则:你不需要的,无需为它买单。更有甚者的是:你需要的时候,也无法通过手写代码做得更好。 本贾尼·斯特劳斯特卢普 \"Foundations of C++\" 作为另一个例子,以下代码取自一个音频解码器。解码算法使用线性预测数学运算(linear prediction mathematical operation)来根据之前样本的线性函数预测将来的值。这些代码使用迭代器链对作用域中的三个变量进行某种数学计算:一个叫 buffer 的数据 slice、一个有 12 个元素的数组 coefficients、和一个代表位数据位移量的 qlp_shift。我们在这个例子中声明了这些变量,但没有为它们赋值;虽然这些代码在其上下文之外没有太多意义,不过仍是一个简明的现实例子,来展示 Rust 如何将高级概念转换为底层代码。 let buffer: &mut [i32];\nlet coefficients: [i64; 12];\nlet qlp_shift: i16; for i in 12..buffer.len() { let prediction = coefficients.iter() .zip(&buffer[i - 12..i]) .map(|(&c, &s)| c * s as i64) .sum::() >> qlp_shift; let delta = buffer[i]; buffer[i] = prediction as i32 + delta;\n} 为了计算 prediction 的值,这段代码遍历了 coefficients 中的 12 个值,使用 zip 方法将系数与 buffer 的前 12 个值组合在一起。接着将每一对值相乘,再将所有结果相加,然后将总和右移 qlp_shift 位。 像音频解码器这样的程序通常最看重计算的性能。这里,我们创建了一个迭代器,使用了两个适配器,接着消费了其值。那么这段 Rust 代码将会被编译为什么样的汇编代码呢?好吧,在编写本书的这个时候,它被编译成与手写的相同的汇编代码。遍历 coefficients 的值完全用不到循环:Rust 知道这里会迭代 12 次,所以它“展开”(unroll)了循环。展开是一种将循环迭代转换为重复代码,并移除循环控制代码开销的代码优化技术。 所有的系数都被储存在了寄存器中,这意味着访问它们非常快。这里也没有运行时数组访问边界检查。所有这些 Rust 能够提供的优化使得结果代码极为高效。现在你知道了这些,请放心大胆的使用迭代器和闭包吧!它们使得代码看起来更高级,但并不为此引入运行时性能损失。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 性能比较:循环对迭代器 » 性能对比:循环 VS 迭代器","id":"252","title":"性能对比:循环 VS 迭代器"},"253":{"body":"闭包和迭代器是 Rust 受函数式编程语言观念所启发的功能。它们对 Rust 以高性能来明确的表达高级概念的能力有很大贡献。闭包和迭代器的实现达到了不影响运行时性能的程度。这正是 Rust 致力于提供零成本抽象的目标的一部分。 现在我们改进了 I/O 项目的(代码)表现力,那么让我们来看看 cargo 的更多功能,这些功能将帮助我们将项目分享给全世界。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 性能比较:循环对迭代器 » 总结","id":"253","title":"总结"},"254":{"body":"ch14-00-more-about-cargo.md commit 44e31f9f304e0cd9ace01045d17a2aa01a449528 目前为止我们只使用过 Cargo 构建、运行和测试代码这些最基本的功能,不过它还可以做到更多。本章会讨论 Cargo 其他一些更为高级的功能,我们将展示如何: 使用发布配置来自定义构建 将库发布到 crates.io 使用工作空间来组织更大的项目 从 crates.io 安装二进制文件 使用自定义的命令来扩展 Cargo Cargo 的功能不止本章所介绍的,关于其全部功能的详尽解释,请查看 文档","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 进一步认识 Cargo 和 Crates.io","id":"254","title":"进一步认识 Cargo 和 Crates.io"},"255":{"body":"ch14-01-release-profiles.md commit 44e31f9f304e0cd9ace01045d17a2aa01a449528 在 Rust 中 发布配置 ( release profiles )文件是预定义和可定制的,它们包含不同的配置,允许程序员更灵活地控制代码编译的多种选项。每一个配置都相互独立。 Cargo 有两个主要的配置:运行 cargo build 时采用的 dev 配置和运行 cargo build --release 的 release 配置。dev 配置为开发定义了良好的默认配置,release 配置则为发布构建定义了良好的默认配置。 这些配置名称可能很眼熟,因为它们出现在构建的输出中: $ cargo build Finished dev [unoptimized + debuginfo] target(s) in 0.0s\n$ cargo build --release Finished release [optimized] target(s) in 0.0s 构建输出中的 dev 和 release 表明编译器在使用不同的配置。 当项目的 Cargo.toml 文件中没有显式增加任何 [profile.*] 部分的时候,Cargo 会对每一个配置都采用默认设置。通过增加任何希望定制的配置对应的 [profile.*] 部分,我们可以选择覆盖任意默认设置的子集。例如,如下是 dev 和 release 配置的 opt-level 设置的默认值: 文件名:Cargo.toml [profile.dev]\nopt-level = 0 [profile.release]\nopt-level = 3 opt-level 设置控制 Rust 会对代码进行何种程度的优化。这个配置的值从 0 到 3。越高的优化级别需要更多的时间编译,所以如果你在进行开发并经常编译,可能会希望在牺牲一些代码性能的情况下减少优化以便编译得快一些。因此 dev 的 opt-level 默认为 0。当你准备发布时,花费更多时间在编译上则更好。只需要在发布模式编译一次,而编译出来的程序则会运行很多次,所以发布模式用更长的编译时间换取运行更快的代码。这正是为什么 release 配置的 opt-level 默认为 3。 我们可以选择通过在 Cargo.toml 增加不同的值来覆盖任何默认设置。比如,如果我们想要在开发配置中使用级别 1 的优化,则可以在 Cargo.toml 中增加这两行: 文件名:Cargo.toml [profile.dev]\nopt-level = 1 这会覆盖默认的设置 0。现在运行 cargo build 时,Cargo 将会使用 dev 的默认配置加上定制的 opt-level。因为 opt-level 设置为 1,Cargo 会比默认进行更多的优化,但是没有发布构建那么多。 对于每个配置的设置和其默认值的完整列表,请查看 Cargo 的文档 。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 采用发布配置自定义构建 » 采用发布配置自定义构建","id":"255","title":"采用发布配置自定义构建"},"256":{"body":"ch14-02-publishing-to-crates-io.md commit 3f2a6ef48943ade3e9c0eb23d69e2b8b41f057f1 我们曾经在项目中使用 crates.io 上的包作为依赖,不过你也可以通过发布自己的包来向他人分享代码。 crates.io 用来分发包的源代码,所以它主要托管开源代码。 Rust 和 Cargo 有一些帮助他人更方便地找到和使用你发布的包的功能。我们将介绍一些这样的功能,接着讲到如何发布一个包。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 将 crate 发布到 Crates.io","id":"256","title":"将 crate 发布到 Crates.io"},"257":{"body":"准确的包文档有助于其他用户理解如何以及何时使用它们,所以花一些时间编写文档是值得的。第三章中我们讨论了如何使用双斜杠 // 注释 Rust 代码。Rust 也有特定的用于文档的注释类型,通常被称为 文档注释 ( documentation comments ),它们会生成 HTML 文档。这些 HTML 展示公有 API 文档注释的内容,它们意在让对库感兴趣的程序员理解如何 使用 这个 crate,而不是它是如何被 实现 的。 文档注释使用三斜杠 /// 而不是双斜杠以支持 Markdown 注解来格式化文本。文档注释就位于需要文档的项的之前。示例 14-1 展示了一个 my_crate crate 中 add_one 函数的文档注释, 文件名:src/lib.rs /// Adds one to the number given.\n///\n/// # Examples\n///\n/// ```\n/// let arg = 5;\n/// let answer = my_crate::add_one(arg);\n///\n/// assert_eq!(6, answer);\n/// ```\npub fn add_one(x: i32) -> i32 { x + 1\n} 示例 14-1:一个函数的文档注释 这里,我们提供了一个 add_one 函数工作的描述,接着开始了一个标题为 Examples 的部分,和展示如何使用 add_one 函数的代码。可以运行 cargo doc 来生成这个文档注释的 HTML 文档。这个命令运行由 Rust 分发的工具 rustdoc 并将生成的 HTML 文档放入 target/doc 目录。 为了方便起见,运行 cargo doc --open 会构建当前 crate 文档(同时还有所有 crate 依赖的文档)的 HTML 并在浏览器中打开。导航到 add_one 函数将会发现文档注释的文本是如何渲染的,如图 14-1 所示: 图 14-1:add_one 函数的文档注释 HTML 常用(文档注释)部分 示例 14-1 中使用了 # Examples Markdown 标题在 HTML 中创建了一个以 “Examples” 为标题的部分。其他一些 crate 作者经常在文档注释中使用的部分有: Panics :这个函数可能会 panic! 的场景。并不希望程序崩溃的函数调用者应该确保他们不会在这些情况下调用此函数。 Errors :如果这个函数返回 Result,此部分描述可能会出现何种错误以及什么情况会造成这些错误,这有助于调用者编写代码来采用不同的方式处理不同的错误。 Safety :如果这个函数使用 unsafe 代码(这会在第二十章讨论),这一部分应该会涉及到期望函数调用者支持的确保 unsafe 块中代码正常工作的不变条件(invariants)。 大部分文档注释不需要所有这些部分,不过这是一个提醒你检查调用你代码的用户有兴趣了解的内容的列表。 文档注释作为测试 在文档注释中增加示例代码块是一个清楚的表明如何使用库的方法,这么做还有一个额外的好处:cargo test 也会像测试那样运行文档中的示例代码!没有什么比有例子的文档更好的了,但最糟糕的莫过于写完文档后改动了代码,而导致例子不能正常工作。尝试 cargo test 运行像示例 14-1 中 add_one 函数的文档;应该在测试结果中看到像这样的部分: Doc-tests my_crate running 1 test\ntest src/lib.rs - add_one (line 5) ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.27s 现在尝试改变函数或例子来使例子中的 assert_eq! 产生 panic。再次运行 cargo test,你将会看到文档测试捕获到了例子与代码不再同步! 注释包含项的结构 文档注释风格 //! 为包含注释的项,而不是位于注释之后的项增加文档。这通常用于 crate 根文件(通常是 src/lib.rs )或模块的根文件为 crate 或模块整体提供文档。 作为一个例子,为了增加描述包含 add_one 函数的 my_crate crate 目的的文档,可以在 src/lib.rs 开头增加以 //! 开头的注释,如示例 14-2 所示: 文件名:src/lib.rs //! # My Crate\n//!\n//! `my_crate` is a collection of utilities to make performing certain\n//! calculations more convenient. /// Adds one to the number given.\n// --snip--\n# ///\n# /// # Examples\n# ///\n# /// ```\n# /// let arg = 5;\n# /// let answer = my_crate::add_one(arg);\n# ///\n# /// assert_eq!(6, answer);\n# /// ```\n# pub fn add_one(x: i32) -> i32 {\n# x + 1\n# } 示例 14-2:my_crate crate 整体的文档 注意 //! 的最后一行之后没有任何代码。因为它们以 //! 开头而不是 ///,这是属于包含此注释的项而不是注释之后项的文档。在这个情况下时 src/lib.rs 文件,也就是 crate 根文件。这些注释描述了整个 crate。 如果运行 cargo doc --open,将会发现这些注释显示在 my_crate 文档的首页,位于 crate 中公有项列表之上,如图 14-2 所示: 图 14-2:包含 my_crate 整体描述的注释所渲染的文档 位于项之中的文档注释对于描述 crate 和模块特别有用。使用它们描述其容器整体的目的来帮助 crate 用户理解你的代码组织。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 编写有用的文档注释","id":"257","title":"编写有用的文档注释"},"258":{"body":"公有 API 的结构是你发布 crate 时主要需要考虑的。crate 用户没有你那么熟悉其结构,并且如果模块层级过大他们可能会难以找到所需的部分。 第七章介绍了如何使用 mod 关键字来将代码组织进模块中,如何使用 pub 关键字将项变为公有,和如何使用 use 关键字将项引入作用域。然而你开发时候使用的文件架构可能并不方便用户。你的结构可能是一个包含多个层级的分层结构,不过这对于用户来说并不方便。这是因为想要使用被定义在很深层级中的类型的人可能很难发现这些类型的存在。他们也可能会厌烦要使用 use my_crate::some_module::another_module::UsefulType; 而不是 use my_crate::UsefulType; 来使用类型。 好消息是,即使文件结构对于用户来说 不是 很方便,你也无需重新安排内部组织:你可以选择使用 pub use 重导出(re-export)项来使公有结构不同于私有结构。重导出获取位于一个位置的公有项并将其公开到另一个位置,好像它就定义在这个新位置一样。 例如,假设我们创建了一个描述美术信息的库 art。这个库中包含了一个有两个枚举 PrimaryColor 和 SecondaryColor 的模块 kinds,以及一个包含函数 mix 的模块 utils,如示例 14-3 所示: 文件名:src/lib.rs //! # Art\n//!\n//! A library for modeling artistic concepts. pub mod kinds { /// The primary colors according to the RYB color model. pub enum PrimaryColor { Red, Yellow, Blue, } /// The secondary colors according to the RYB color model. pub enum SecondaryColor { Orange, Green, Purple, }\n} pub mod utils { use crate::kinds::*; /// Combines two primary colors in equal amounts to create /// a secondary color. pub fn mix(c1: PrimaryColor, c2: PrimaryColor) -> SecondaryColor { // --snip--\n# unimplemented!(); }\n} 示例 14-3:一个库 art 其组织包含 kinds 和 utils 模块 cargo doc 所生成的 crate 文档首页如图 14-3 所示: 图 14-3:包含 kinds 和 utils 模块的库 art 的文档首页 注意 PrimaryColor 和 SecondaryColor 类型、以及 mix 函数都没有在首页中列出。我们必须点击 kinds 或 utils 才能看到它们。 另一个依赖这个库的 crate 需要 use 语句来导入 art 中的项,这包含指定其当前定义的模块结构。示例 14-4 展示了一个使用 art crate 中 PrimaryColor 和 mix 项的 crate 的例子: 文件名:src/main.rs use art::kinds::PrimaryColor;\nuse art::utils::mix; fn main() { let red = PrimaryColor::Red; let yellow = PrimaryColor::Yellow; mix(red, yellow);\n} 示例 14-4:一个通过导出内部结构使用 art crate 中项的 crate 示例 14-4 中使用 art crate 代码的作者不得不搞清楚 PrimaryColor 位于 kinds 模块而 mix 位于 utils 模块。art crate 的模块结构相比使用它的开发者来说对编写它的开发者更有意义。其内部结构并没有对尝试理解如何使用 art crate 的人提供任何有价值的信息,相反因为不得不搞清楚所需的内容在何处和必须在 use 语句中指定模块名称而显得混乱。 为了从公有 API 中去掉 crate 的内部组织,我们可以采用示例 14-3 中的 art crate 并增加 pub use 语句来重导出项到顶层结构,如示例 14-5 所示: 文件名:src/lib.rs //! # Art\n//!\n//! A library for modeling artistic concepts. pub use self::kinds::PrimaryColor;\npub use self::kinds::SecondaryColor;\npub use self::utils::mix; pub mod kinds { // --snip--\n# /// The primary colors according to the RYB color model.\n# pub enum PrimaryColor {\n# Red,\n# Yellow,\n# Blue,\n# }\n# # /// The secondary colors according to the RYB color model.\n# pub enum SecondaryColor {\n# Orange,\n# Green,\n# Purple,\n# }\n} pub mod utils { // --snip--\n# use crate::kinds::*;\n# # /// Combines two primary colors in equal amounts to create\n# /// a secondary color.\n# pub fn mix(c1: PrimaryColor, c2: PrimaryColor) -> SecondaryColor {\n# SecondaryColor::Orange\n# }\n} 示例 14-5:增加 pub use 语句重导出项 现在此 crate 由 cargo doc 生成的 API 文档会在首页列出重导出的项以及其链接,如图 14-4 所示,这使得 PrimaryColor 和 SecondaryColor 类型和 mix 函数更易于查找。 图 14-10:art 文档的首页,这里列出了重导出的项 art crate 的用户仍然可以看见和选择使用示例 14-4 中的内部结构,或者可以使用示例 14-5 中更为方便的结构,如示例 14-6 所示: 文件名:src/main.rs use art::mix;\nuse art::PrimaryColor; fn main() { // --snip--\n# let red = PrimaryColor::Red;\n# let yellow = PrimaryColor::Yellow;\n# mix(red, yellow);\n} 示例 14-6:一个使用 art crate 中重导出项的程序 对于有很多嵌套模块的情况,使用 pub use 将类型重导出到顶级结构对于使用 crate 的人来说将会是大为不同的体验。pub use 的另一个常见用法是重导出当前 crate 的依赖的定义使其 crate 定义变成你 crate 公有 API 的一部分。 创建一个有用的公有 API 结构更像是一门艺术而非科学,你可以反复检视它们来找出最适合用户的 API。pub use 提供了解耦组织 crate 内部结构和与终端用户体现的灵活性。观察一些你所安装的 crate 的代码来看看其内部结构是否不同于公有 API。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 使用 pub use 导出合适的公有 API","id":"258","title":"使用 pub use 导出合适的公有 API"},"259":{"body":"在你可以发布任何 crate 之前,需要在 crates.io 上注册账号并获取一个 API token。为此,访问位于 crates.io 的首页并使用 GitHub 账号登录。(目前 GitHub 账号是必须的,不过将来该网站可能会支持其他创建账号的方法)一旦登录之后,查看位于 https://crates.io/me/ 的账户设置页面并获取 API token。接着使用该 API token 运行 cargo login 命令,像这样: $ cargo login abcdefghijklmnopqrstuvwxyz012345 这个命令会通知 Cargo 你的 API token 并将其储存在本地的 ~/.cargo/credentials 文件中。注意这个 token 是一个 秘密 ( secret )且不应该与其他人共享。如果因为任何原因与他人共享了这个信息,应该立即到 crates.io 撤销并重新生成一个 token。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 创建 Crates.io 账号","id":"259","title":"创建 Crates.io 账号"},"26":{"body":"我们使用 Cargo 创建一个新项目,然后看看与上面的 “Hello, world!” 项目有什么不同。回到 projects 目录(或者你存放代码的目录)。接着,可在任何操作系统下运行以下命令: $ cargo new hello_cargo\n$ cd hello_cargo 第一行命令新建了名为 hello_cargo 的目录和项目。我们将项目命名为 hello_cargo ,同时 Cargo 在一个同名目录中创建项目文件。 进入 hello_cargo 目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录:一个 Cargo.toml 文件,一个 src 目录,以及位于 src 目录中的 main.rs 文件。 这也会在 hello_cargo 目录初始化了一个 git 仓库,以及一个 .gitignore 文件。如果在一个已经存在的 git 仓库中运行 cargo new,则这些 git 相关文件则不会生成;可以通过运行 cargo new --vcs=git 来覆盖这些行为。 注意:Git 是一个常用的版本控制系统(version control system,VCS)。可以通过 --vcs 参数使 cargo new 切换到其它版本控制系统(VCS),或者不使用 VCS。运行 cargo new --help 参看可用的选项。 请自行选用文本编辑器打开 Cargo.toml 文件。它应该看起来如示例 1-2 所示: 文件名:Cargo.toml [package]\nname = \"hello_cargo\"\nversion = \"0.1.0\"\nedition = \"2021\" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] 示例 1-2:*cargo new* 命令生成的 *Cargo.toml* 的内容 这个文件使用 TOML ( Tom's Obvious, Minimal Language ) 格式,这是 Cargo 配置文件的格式。 第一行,[package],是一个片段(section)标题,表明下面的语句用来配置一个包。随着我们在这个文件增加更多的信息,还将增加其他片段(section)。 接下来的三行设置了 Cargo 编译程序所需的配置:项目的名称、项目的版本以及要使用的 Rust 版本。 附录 E 会介绍 edition 的值。 最后一行,[dependencies],是罗列项目依赖的片段的开始。在 Rust 中,代码包被称为 crates 。这个项目并不需要其他的 crate,不过在第二章的第一个项目会用到依赖,那时会用得上这个片段。 现在打开 src/main.rs 看看: 文件名:src/main.rs fn main() { println!(\"Hello, world!\");\n} Cargo 为你生成了一个 “Hello, world!” 程序,正如我们之前编写的示例 1-1!目前为止,我们的项目与 Cargo 生成项目的区别是 Cargo 将代码放在 src 目录,同时项目根目录包含一个 Cargo.toml 配置文件。 Cargo 期望源文件存放在 src 目录中。项目根目录只存放 README、license 信息、配置文件和其他跟代码无关的文件。使用 Cargo 帮助你保持项目干净整洁,一切井井有条。 如果没有使用 Cargo 开始项目,比如我们创建的 “Hello, world!” 项目,你可以将其转换为使用 Cargo 的项目。将项目代码移入 src 目录,并创建一个合适的 Cargo.toml 文件。一个简单的创建 Cargo.toml 文件的方法是运行 cargo init,它会自动为你创建该文件。","breadcrumbs":"入门指南 » Hello, Cargo! » 使用 Cargo 创建项目","id":"26","title":"使用 Cargo 创建项目"},"260":{"body":"比如说你已经有一个希望发布的 crate。在发布之前,你需要在 crate 的 Cargo.toml 文件的 [package] 部分增加一些本 crate 的元信息(metadata)。 首先 crate 需要一个唯一的名称。虽然在本地开发 crate 时,可以使用任何你喜欢的名称。不过 crates.io 上的 crate 名称遵守先到先得的分配原则。一旦某个 crate 名称被使用,其他人就不能再发布这个名称的 crate 了。请搜索你希望使用的名称来找出它是否已被使用。如果没有,修改 Cargo.toml 中 [package] 里的名称为你希望用于发布的名称,像这样: 文件名:Cargo.toml [package]\nname = \"guessing_game\" 即使你选择了一个唯一的名称,如果此时尝试运行 cargo publish 发布该 crate 的话,会得到一个警告接着是一个错误: $ cargo publish Updating crates.io index\nwarning: manifest has no description, license, license-file, documentation, homepage or repository.\nSee https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info.\n--snip--\nerror: failed to publish to registry at https://crates.io Caused by: the remote server responded with an error: missing or empty metadata fields: description, license. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for how to upload metadata 这个错误是因为我们缺少一些关键信息:关于该 crate 用途的描述和用户可能在何种条款下使用该 crate 的 license。在 Cargo.toml 中添加通常是一两句话的描述,因为它将在搜索结果中和你的 crate 一起显示。对于 license 字段,你需要一个 license 标识符值 ( license identifier value )。 Linux 基金会的 Software Package Data Exchange (SPDX) 列出了可以使用的标识符。例如,为了指定 crate 使用 MIT License,增加 MIT 标识符: 文件名:Cargo.toml [package]\nname = \"guessing_game\"\nlicense = \"MIT\" 如果你希望使用不存在于 SPDX 的 license,则需要将 license 文本放入一个文件,将该文件包含进项目中,接着使用 license-file 来指定文件名而不是使用 license 字段。 关于项目所适用的 license 指导超出了本书的范畴。很多 Rust 社区成员选择与 Rust 自身相同的 license,这是一个双许可的 MIT OR Apache-2.0。这个实践展示了也可以通过 OR 分隔为项目指定多个 license 标识符。 那么,有了唯一的名称、版本号、由 cargo new 新建项目时增加的作者信息、描述和所选择的 license,已经准备好发布的项目的 Cargo.toml 文件可能看起来像这样: 文件名:Cargo.toml [package]\nname = \"guessing_game\"\nversion = \"0.1.0\"\nedition = \"2021\"\ndescription = \"A fun game where you guess what number the computer has chosen.\"\nlicense = \"MIT OR Apache-2.0\" [dependencies] Cargo 的文档 描述了其他可以指定的元信息,它们可以帮助你的 crate 更容易被发现和使用!","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 向新 crate 添加元信息","id":"260","title":"向新 crate 添加元信息"},"261":{"body":"现在我们创建了一个账号,保存了 API token,为 crate 选择了一个名字,并指定了所需的元数据,你已经准备好发布了!发布 crate 会上传特定版本的 crate 到 crates.io 以供他人使用。 发布 crate 时请多加小心,因为发布是 永久性的 ( permanent )。对应版本不可能被覆盖,其代码也不可能被删除。 crates.io 的一个主要目标是作为一个存储代码的永久文档服务器,这样所有依赖 crates.io 中的 crate 的项目都能一直正常工作。而允许删除版本没办法达成这个目标。然而,可以被发布的版本号却没有限制。 再次运行 cargo publish 命令。这次它应该会成功: $ cargo publish Updating crates.io index Packaging guessing_game v0.1.0 (file:///projects/guessing_game) Verifying guessing_game v0.1.0 (file:///projects/guessing_game) Compiling guessing_game v0.1.0\n(file:///projects/guessing_game/target/package/guessing_game-0.1.0) Finished dev [unoptimized + debuginfo] target(s) in 0.19s Uploading guessing_game v0.1.0 (file:///projects/guessing_game) 恭喜!你现在向 Rust 社区分享了代码,而且任何人都可以轻松的将你的 crate 加入他们项目的依赖。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 发布到 Crates.io","id":"261","title":"发布到 Crates.io"},"262":{"body":"当你修改了 crate 并准备好发布新版本时,改变 Cargo.toml 中 version 所指定的值。请使用 语义化版本规则 来根据修改的类型决定下一个版本号。接着运行 cargo publish 来上传新版本。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 发布现存 crate 的新版本","id":"262","title":"发布现存 crate 的新版本"},"263":{"body":"虽然你不能删除之前版本的 crate,但是可以阻止任何将来的项目将它们加入到依赖中。这在某个版本因为这样或那样的原因被破坏的情况很有用。对于这种情况,Cargo 支持 撤回 ( yanking )某个版本。 撤回某个版本会阻止新项目依赖此版本,不过所有现存此依赖的项目仍然能够下载和依赖这个版本。从本质上说,撤回意味着所有带有 Cargo.lock 的项目的依赖不会被破坏,同时任何新生成的 Cargo.lock 将不能使用被撤回的版本。 为了撤回一个版本的 crate,在之前发布 crate 的目录运行 cargo yank 并指定希望撤回的版本。例如,如果我们发布了一个名为 guessing_game 的 crate 的 1.0.1 版本并希望撤回它,在 guessing_game 项目目录运行: $ cargo yank --vers 1.0.1 Updating crates.io index Yank guessing_game@1.0.1 也可以撤销撤回操作,并允许项目可以再次开始依赖某个版本,通过在命令上增加 --undo: $ cargo yank --vers 1.0.1 --undo Updating crates.io index Unyank guessing_game@1.0.1 撤回 并没有 删除任何代码。举例来说,撤回功能并不能删除不小心上传的秘密信息。如果出现了这种情况,请立即重新设置这些秘密信息。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 使用 cargo yank 从 Crates.io 弃用版本","id":"263","title":"使用 cargo yank 从 Crates.io 弃用版本"},"264":{"body":"ch14-03-cargo-workspaces.md commit 704c51eec2f26a0133ae17a2c01986590c05a045 第十二章中,我们构建一个包含二进制 crate 和库 crate 的包。你可能会发现,随着项目开发的深入,库 crate 持续增大,而你希望将其进一步拆分成多个库 crate。Cargo 提供了一个叫 工作空间 ( workspaces )的功能,它可以帮助我们管理多个相关的协同开发的包。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » Cargo 工作空间 » Cargo 工作空间","id":"264","title":"Cargo 工作空间"},"265":{"body":"工作空间 是一系列共享同样的 Cargo.lock 和输出目录的包。让我们使用工作空间创建一个项目 —— 这里采用常见的代码以便可以关注工作空间的结构。有多种组织工作空间的方式,所以我们只展示一个常用方法。我们的工作空间有一个二进制项目和两个库。二进制项目会提供主要功能,并会依赖另两个库。一个库会提供 add_one 方法而第二个会提供 add_two 方法。这三个 crate 将会是相同工作空间的一部分。让我们以新建工作空间目录开始: $ mkdir add\n$ cd add 接着在 add 目录中,创建 Cargo.toml 文件。这个 Cargo.toml 文件配置了整个工作空间。它不会包含 [package] 部分。相反,它以 [workspace] 部分作为开始,并通过指定 adder 的路径来为工作空间增加成员,如下会加入二进制 crate: 文件名:Cargo.toml [workspace] members = [ \"adder\",\n] 接下来,在 add 目录运行 cargo new 新建 adder 二进制 crate: $ cargo new adder Created binary (application) `adder` package 到此为止,可以运行 cargo build 来构建工作空间。 add 目录中的文件应该看起来像这样: ├── Cargo.lock\n├── Cargo.toml\n├── adder\n│ ├── Cargo.toml\n│ └── src\n│ └── main.rs\n└── target 工作空间在顶级目录有一个 target 目录;adder 并没有自己的 target 目录。即使进入 adder 目录运行 cargo build,构建结果也位于 add/target 而不是 add/adder/target 。工作空间中的 crate 之间相互依赖。如果每个 crate 有其自己的 target 目录,为了在自己的 target 目录中生成构建结果,工作空间中的每一个 crate 都不得不相互重新编译其他 crate。通过共享一个 target 目录,工作空间可以避免其他 crate 重复构建。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » Cargo 工作空间 » 创建工作空间","id":"265","title":"创建工作空间"},"266":{"body":"接下来,让我们在工作空间中指定另一个成员 crate。这个 crate 位于 add_one 目录中,所以修改顶级 Cargo.toml 为也包含 add_one 路径: 文件名:Cargo.toml [workspace] members = [ \"adder\", \"add_one\",\n] 接着新生成一个叫做 add_one 的库: $ cargo new add_one --lib Created library `add_one` package 现在 add 目录应该有如下目录和文件: ├── Cargo.lock\n├── Cargo.toml\n├── add_one\n│ ├── Cargo.toml\n│ └── src\n│ └── lib.rs\n├── adder\n│ ├── Cargo.toml\n│ └── src\n│ └── main.rs\n└── target 在 add_one/src/lib.rs 文件中,增加一个 add_one 函数: 文件名:add_one/src/lib.rs pub fn add_one(x: i32) -> i32 { x + 1\n} 现在我们有了二进制 adder 依赖库 crate add_one。首先需要在 adder/Cargo.toml 文件中增加 add_one 作为路径依赖: 文件名:adder/Cargo.toml [dependencies]\nadd_one = { path = \"../add_one\" } cargo 并不假定工作空间中的 Crates 会相互依赖,所以需要明确表明工作空间中 crate 的依赖关系。 接下来,在 adder crate 中使用( add_one crate 中的)函数 add_one。打开 adder/src/main.rs 在顶部增加一行 use 将新 add_one 库 crate 引入作用域。接着修改 main 函数来调用 add_one 函数,如示例 14-7 所示。 文件名:adder/src/main.rs use add_one; fn main() { let num = 10; println!(\"Hello, world! {num} plus one is {}!\", add_one::add_one(num));\n} 示例 14-7:在 adder crate 中使用 add_one 库 crate 在 add 目录中运行 cargo build 来构建工作空间! $ cargo build Compiling add_one v0.1.0 (file:///projects/add/add_one) Compiling adder v0.1.0 (file:///projects/add/adder) Finished dev [unoptimized + debuginfo] target(s) in 0.68s 为了在顶层 add 目录运行二进制 crate,可以通过 -p 参数和包名称来运行 cargo run 指定工作空间中我们希望使用的包: $ cargo run -p adder Finished dev [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/adder`\nHello, world! 10 plus one is 11! 这会运行 adder/src/main.rs 中的代码,其依赖 add_one crate 在工作空间中依赖外部包 还需注意的是工作空间只在根目录有一个 Cargo.lock ,而不是在每一个 crate 目录都有 Cargo.lock 。这确保了所有的 crate 都使用完全相同版本的依赖。如果在 Cargo.toml 和 add_one/Cargo.toml 中都增加 rand crate,则 Cargo 会将其都解析为同一版本并记录到唯一的 Cargo.lock 中。使得工作空间中的所有 crate 都使用相同的依赖意味着其中的 crate 都是相互兼容的。让我们在 add_one/Cargo.toml 中的 [dependencies] 部分增加 rand crate 以便能够在 add_one crate 中使用 rand crate: 文件名:add_one/Cargo.toml [dependencies]\nrand = \"0.8.5\" 现在就可以在 add_one/src/lib.rs 中增加 use rand; 了,接着在 add 目录运行 cargo build 构建整个工作空间就会引入并编译 rand crate: $ cargo build Updating crates.io index Downloaded rand v0.8.5 --snip-- Compiling rand v0.8.5 Compiling add_one v0.1.0 (file:///projects/add/add_one)\nwarning: unused import: `rand` --> add_one/src/lib.rs:1:5 |\n1 | use rand; | ^^^^ | = note: `#[warn(unused_imports)]` on by default warning: `add_one` (lib) generated 1 warning Compiling adder v0.1.0 (file:///projects/add/adder) Finished dev [unoptimized + debuginfo] target(s) in 10.18s 现在顶级的 Cargo.lock 包含了 add_one 的 rand 依赖的信息。然而,即使 rand 被用于工作空间的某处,也不能在其他 crate 中使用它,除非也在它们的 Cargo.toml 中加入 rand。例如,如果在顶级的 adder crate 的 adder/src/main.rs 中增加 use rand;,会得到一个错误: $ cargo build --snip-- Compiling adder v0.1.0 (file:///projects/add/adder)\nerror[E0432]: unresolved import `rand` --> adder/src/main.rs:2:5 |\n2 | use rand; | ^^^^ no external crate `rand` 为了修复这个错误,修改顶级 adder crate 的 Cargo.toml 来表明 rand 也是这个 crate 的依赖。构建 adder crate 会将 rand 加入到 Cargo.lock 中 adder 的依赖列表中,但是这并不会下载 rand 的额外拷贝。Cargo 确保了工作空间中任何使用 rand 的 crate 都采用相同的版本,这节省了空间并确保了工作空间中的 crate 将是相互兼容的。 为工作空间增加测试 作为另一个提升,让我们为 add_one crate 中的 add_one::add_one 函数增加一个测试: 文件名:add_one/src/lib.rs pub fn add_one(x: i32) -> i32 { x + 1\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn it_works() { assert_eq!(3, add_one(2)); }\n} 在顶级 add 目录运行 cargo test。在像这样的工作空间结构中运行 cargo test 会运行工作空间中所有 crate 的测试。: $ cargo test Compiling add_one v0.1.0 (file:///projects/add/add_one) Compiling adder v0.1.0 (file:///projects/add/adder) Finished test [unoptimized + debuginfo] target(s) in 0.27s Running unittests src/lib.rs (target/debug/deps/add_one-f0253159197f7841) running 1 test\ntest tests::it_works ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running unittests src/main.rs (target/debug/deps/adder-49979ff40686fa8e) running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests add_one running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 输出的第一部分显示 add_one crate 的 it_works 测试通过了。下一个部分显示 adder crate 中找到了 0 个测试,最后一部分显示 add_one crate 中有 0 个文档测试。 也可以选择运行工作空间中特定 crate 的测试,通过在根目录使用 -p 参数并指定希望测试的 crate 名称: $ cargo test -p add_one Finished test [unoptimized + debuginfo] target(s) in 0.00s Running unittests src/lib.rs (target/debug/deps/add_one-b3235fea9a156f74) running 1 test\ntest tests::it_works ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests add_one running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 输出显示了 cargo test 只运行了 add_one crate 的测试而没有运行 adder crate 的测试。 如果你选择向 crates.io 发布工作空间中的 crate,每一个工作空间中的 crate 需要单独发布。就像 cargo test 一样,可以通过 -p 参数并指定期望发布的 crate 名来发布工作空间中的某个特定的 crate。 现在尝试以类似 add_one crate 的方式向工作空间增加 add_two crate 来作为更多的练习! 随着项目增长,考虑使用工作空间:每一个更小的组件比一大块代码要容易理解。如果它们经常需要同时被修改的话,将 crate 保持在工作空间中更易于协调 crate 的改变。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » Cargo 工作空间 » 在工作空间中创建第二个包","id":"266","title":"在工作空间中创建第二个包"},"267":{"body":"ch14-04-installing-binaries.md commit 704c51eec2f26a0133ae17a2c01986590c05a045 cargo install 命令用于在本地安装和使用二进制 crate。它并不打算替换系统中的包;它意在作为一个方便 Rust 开发者们安装其他人已经在 crates.io 上共享的工具的手段。只有拥有二进制目标文件的包能够被安装。 二进制目标 文件是在 crate 有 src/main.rs 或者其他指定为二进制文件时所创建的可执行程序,这不同于自身不能执行但适合包含在其他程序中的库目标文件。通常 crate 的 README 文件中有该 crate 是库、二进制目标还是两者兼有的信息。 所有来自 cargo install 的二进制文件都安装到 Rust 安装根目录的 bin 文件夹中。如果你是使用 rustup.rs 来安装 Rust 且没有自定义任何配置,这个目录将是 $HOME/.cargo/bin。确保将这个目录添加到 $PATH 环境变量中就能够运行通过 cargo install 安装的程序了。 例如,第十二章提到的叫做 ripgrep 的用于搜索文件的 grep 的 Rust 实现。为了安装 ripgrep 运行如下: $ cargo install ripgrep Updating crates.io index Downloaded ripgrep v13.0.0 Downloaded 1 crate (243.3 KB) in 0.88s Installing ripgrep v13.0.0\n--snip-- Compiling ripgrep v13.0.0 Finished release [optimized + debuginfo] target(s) in 3m 10s Installing ~/.cargo/bin/rg Installed package `ripgrep v13.0.0` (executable `rg`) 最后一行输出展示了安装的二进制文件的位置和名称,在这里 ripgrep 被命名为 rg。只要你像上面提到的那样将安装目录加入 $PATH,就可以运行 rg --help 并开始使用一个更快更 Rust 的工具来搜索文件了!","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 使用 cargo install 安装二进制文件 » 使用 cargo install 安装二进制文件","id":"267","title":"使用 cargo install 安装二进制文件"},"268":{"body":"ch14-05-extending-cargo.md commit c084bdd9ee328e7e774df19882ccc139532e53d8 Cargo 的设计使得开发者可以通过新的子命令来对 Cargo 进行扩展,而无需修改 Cargo 本身。如果 $PATH 中有类似 cargo-something 的二进制文件,就可以通过 cargo something 来像 Cargo 子命令一样运行它。像这样的自定义命令也可以运行 cargo --list 来展示出来。能够通过 cargo install 向 Cargo 安装扩展并可以如内建 Cargo 工具那样运行它们是 Cargo 设计上的一个非常方便的优点!","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » Cargo 自定义扩展命令 » Cargo 自定义扩展命令","id":"268","title":"Cargo 自定义扩展命令"},"269":{"body":"通过 Cargo 和 crates.io 来分享代码是使得 Rust 生态环境可以用于许多不同的任务的重要组成部分。Rust 的标准库是小而稳定的,不过 crate 易于分享和使用,并采用一个不同语言自身的时间线来提供改进。不要羞于在 crates.io 上共享对你有用的代码,因为它很有可能对别人也很有用!","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » Cargo 自定义扩展命令 » 总结","id":"269","title":"总结"},"27":{"body":"现在让我们看看通过 Cargo 构建和运行 “Hello, world!” 程序有什么不同!在 hello_cargo 目录下,输入下面的命令来构建项目: $ cargo build Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs 这个命令会创建一个可执行文件 target/debug/hello_cargo (在 Windows 上是 target\\debug\\hello_cargo.exe ),而不是放在目前目录下。由于默认的构建方法是调试构建(debug build),Cargo 会将可执行文件放在名为 debug 的目录中。可以通过这个命令运行可执行文件: $ ./target/debug/hello_cargo # 或者在 Windows 下为 .\\target\\debug\\hello_cargo.exe\nHello, world! 如果一切顺利,终端上应该会打印出 Hello, world!。首次运行 cargo build 时,也会使 Cargo 在项目根目录创建一个新文件: Cargo.lock 。这个文件记录项目依赖的实际版本。这个项目并没有依赖,所以其内容比较少。你自己永远也不需要碰这个文件,让 Cargo 处理它就行了。 我们刚刚使用 cargo build 构建了项目,并使用 ./target/debug/hello_cargo 运行了程序,也可以使用 cargo run 在一个命令中同时编译并运行生成的可执行文件: $ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs Running `target/debug/hello_cargo`\nHello, world! 比起要记得运行 cargo build 之后再用可执行文件的完整路径来运行程序,使用 cargo run 可以实现完全相同的效果,而且要方便得多,所以大多数开发者会使用 cargo run。 注意这一次并没有出现表明 Cargo 正在编译 hello_cargo 的输出。Cargo 发现文件并没有被改变,所以它并没有重新编译,而是直接运行了可执行文件。如果修改了源文件的话,Cargo 会在运行之前重新构建项目,并会出现像这样的输出: $ cargo run Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs Running `target/debug/hello_cargo`\nHello, world! Cargo 还提供了一个叫 cargo check 的命令。该命令快速检查代码确保其可以编译,但并不产生可执行文件: $ cargo check Checking hello_cargo v0.1.0 (file:///projects/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs 为什么你会不需要可执行文件呢?通常 cargo check 要比 cargo build 快得多,因为它省略了生成可执行文件的步骤。如果你在编写代码时持续的进行检查,cargo check 可以让你快速了解现在的代码能不能正常通过编译!为此很多 Rustaceans 编写代码时定期运行 cargo check 确保它们可以编译。当准备好使用可执行文件时才运行 cargo build。 我们回顾下已学习的 Cargo 内容: 可以使用 cargo new 创建项目。 可以使用 cargo build 构建项目。 可以使用 cargo run 一步构建并运行项目。 可以使用 cargo check 在不生成二进制文件的情况下构建项目来检查错误。 有别于将构建结果放在与源码相同的目录,Cargo 会将其放到 target/debug 目录。 使用 Cargo 的一个额外的优点是,不管你使用什么操作系统,其命令都是一样的。所以从现在开始本书将不再为 Linux 和 macOS 以及 Windows 提供相应的命令。","breadcrumbs":"入门指南 » Hello, Cargo! » 构建并运行 Cargo 项目","id":"27","title":"构建并运行 Cargo 项目"},"270":{"body":"ch15-00-smart-pointers.md commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e 指针 ( pointer )是一个包含内存地址的变量的通用概念。这个地址引用,或 “指向”(points at)一些其他数据。Rust 中最常见的指针是第四章介绍的 引用 ( reference )。引用以 & 符号为标志并借用了它们所指向的值。除了引用数据没有任何其他特殊功能,也没有额外开销。 另一方面, 智能指针 ( smart pointers )是一类数据结构,它们的表现类似指针,但是也拥有额外的元数据和功能。智能指针的概念并不为 Rust 所独有;其起源于 C++ 并存在于其他语言中。Rust 标准库中定义了多种不同的智能指针,它们提供了多于引用的额外功能。为了探索其基本概念,我们来看看一些智能指针的例子,这包括 引用计数 ( reference counting )智能指针类型。这种指针允许数据有多个所有者,它会记录所有者的数量,当没有所有者时清理数据。在 Rust 中因为引用和借用,普通引用和智能指针的一个额外的区别是引用是一类只借用数据的指针;相反,在大部分情况下,智能指针 拥有 它们指向的数据。 实际上本书中已经出现过一些智能指针,比如第八章的 String 和 Vec,虽然当时并没有这样称呼它们。这些类型都属于智能指针,因为它们拥有一些数据,并允许你修改这些数据。它们也拥有元数据和额外的功能或保证。例如 String 存储了其容量作为元数据,并拥有额外的能力来确保其数据总是有效的 UTF-8 编码。 智能指针通常使用结构体实现。智能指针不同于结构体的地方在于其实现了 Deref 和 Drop trait。Deref trait 允许智能指针结构体实例表现的像引用一样,这样就可以编写既用于引用、又用于智能指针的代码。Drop trait 允许我们自定义当智能指针离开作用域时运行的代码。本章会讨论这些 trait 以及为什么对于智能指针来说它们很重要。 考虑到智能指针是一个在 Rust 经常被使用的通用设计模式,本章并不会覆盖所有现存的智能指针。很多库都有自己的智能指针而你也可以编写属于你自己的智能指针。这里将会讲到的是来自标准库中最常用的一些: Box,用于在堆上分配值 Rc,一个引用计数类型,其数据可以有多个所有者 Ref 和 RefMut,通过 RefCell 访问。( RefCell 是一个在运行时而不是在编译时执行借用规则的类型)。 另外我们会涉及 内部可变性 ( interior mutability )模式,这是不可变类型暴露出改变其内部值的 API。我们也会讨论 引用循环 ( reference cycles )会如何泄漏内存,以及如何避免。 让我们开始吧!","breadcrumbs":"智能指针 » 智能指针","id":"270","title":"智能指针"},"271":{"body":"ch15-01-box.md commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e 最简单直接的智能指针是 box ,其类型是 Box。box 允许你将一个值放在堆上而不是栈上。留在栈上的则是指向堆数据的指针。如果你想回顾一下栈与堆的区别请参考第四章。 除了数据被储存在堆上而不是栈上之外,box 没有性能损失。不过也没有很多额外的功能。它们多用于如下场景: 当有一个在编译时未知大小的类型,而又想要在需要确切大小的上下文中使用这个类型值的时候 当有大量数据并希望在确保数据不被拷贝的情况下转移所有权的时候 当希望拥有一个值并只关心它的类型是否实现了特定 trait 而不是其具体类型的时候 我们会在 “box 允许创建递归类型” 部分展示第一种场景。在第二种情况中,转移大量数据的所有权可能会花费很长的时间,因为数据在栈上进行了拷贝。为了改善这种情况下的性能,可以通过 box 将这些数据储存在堆上。接着,只有少量的指针数据在栈上被拷贝。第三种情况被称为 trait 对象 ( trait object ),第十八章刚好有一整个部分 “顾及不同类型值的 trait 对象” 专门讲解这个主题。所以这里所学的内容会在第十八章再次用上!","breadcrumbs":"智能指针 » 使用 Box 指向堆上数据 » 使用Box指向堆上的数据","id":"271","title":"使用Box指向堆上的数据"},"272":{"body":"在讨论 Box 的堆存储用例之前,让我们熟悉一下语法以及如何与储存在 Box 中的值进行交互。 示例 15-1 展示了如何使用 box 在堆上储存一个 i32: 文件名:src/main.rs fn main() { let b = Box::new(5); println!(\"b = {b}\");\n} 示例 15-1:使用 box 在堆上储存一个 i32 值 这里定义了变量 b,其值是一个指向被分配在堆上的值 5 的 Box。这个程序会打印出 b = 5;在这个例子中,我们可以像数据是储存在栈上的那样访问 box 中的数据。正如任何拥有数据所有权的值那样,当像 b 这样的 box 在 main 的末尾离开作用域时,它将被释放。这个释放过程作用于 box 本身(位于栈上)和它所指向的数据(位于堆上)。 将一个单独的值存放在堆上并不是很有意义,所以像示例 15-1 这样单独使用 box 并不常见。将像单个 i32 这样的值储存在栈上,也就是其默认存放的地方在大部分使用场景中更为合适。让我们看看一个不使用 box 时无法定义的类型的例子。","breadcrumbs":"智能指针 » 使用 Box 指向堆上数据 » 使用 Box 在堆上储存数据","id":"272","title":"使用 Box 在堆上储存数据"},"273":{"body":"递归类型 ( recursive type )的值可以拥有另一个同类型的值作为其自身的一部分。但是这会产生一个问题,因为 Rust 需要在编译时知道类型占用多少空间。递归类型的值嵌套理论上可以无限地进行下去,所以 Rust 不知道递归类型需要多少空间。因为 box 有一个已知的大小,所以通过在循环类型定义中插入 box,就可以创建递归类型了。 作为一个递归类型的例子,让我们探索一下 cons list 。这是一个函数式编程语言中常见的数据类型,来展示这个(递归类型)概念。除了递归之外,我们将要定义的 cons list 类型是很直白的,所以这个例子中的概念,在任何遇到更为复杂的涉及到递归类型的场景时都很实用。 cons list 的更多内容 cons list 是一个来源于 Lisp 编程语言及其方言的数据结构,它由嵌套的列表组成。它的名字来源于 Lisp 中的 cons 函数(“construct function\" 的缩写),它利用两个参数来构造一个新的列表。通过对一个包含值的列表和另一个值调用 cons,可以构建由递归列表组成的 cons list。 例如这里有一个包含列表 1,2,3 的 cons list 的伪代码表示,其每一个列表在一个括号中: (1, (2, (3, Nil))) cons list 的每一项都包含两个元素:当前项的值和下一项。其最后一项值包含一个叫做 Nil 的值且没有下一项。cons list 通过递归调用 cons 函数产生。代表递归的终止条件(base case)的规范名称是 Nil,它宣布列表的终止。注意这不同于第六章中的 “null” 或 “nil” 的概念,它们代表无效或缺失的值。 cons list 并不是一个 Rust 中常见的类型。大部分在 Rust 中需要列表的时候,Vec 是一个更好的选择。其他更为复杂的递归数据类型 确实 在 Rust 的很多场景中很有用,不过通过以 cons list 作为开始,我们可以探索如何使用 box 毫不费力的定义一个递归数据类型。 示例 15-2 包含一个 cons list 的枚举定义。注意这还不能编译因为这个类型没有已知的大小,之后我们会展示: 文件名:src/main.rs enum List { Cons(i32, List), Nil,\n}\n# # fn main() {} 示例 15-2:第一次尝试定义一个代表 i32 值的 cons list 数据结构的枚举 注意:出于示例的需要我们选择实现一个只存放 i32 值的 cons list。也可以用泛型,正如第十章讲到的,来定义一个可以存放任何类型值的 cons list 类型。 使用这个 cons list 来储存列表 1, 2, 3 将看起来如示例 15-3 所示: 文件名:src/main.rs # enum List {\n# Cons(i32, List),\n# Nil,\n# }\n# use crate::List::{Cons, Nil}; fn main() { let list = Cons(1, Cons(2, Cons(3, Nil)));\n} 示例 15-3:使用 List 枚举储存列表 1, 2, 3 第一个 Cons 储存了 1 和另一个 List 值。这个 List 是另一个包含 2 的 Cons 值和下一个 List 值。接着又有另一个存放了 3 的 Cons 值和最后一个值为 Nil 的 List,非递归成员代表了列表的结尾。 如果尝试编译示例 15-3 的代码,会得到如示例 15-4 所示的错误: $ cargo run Compiling cons-list v0.1.0 (file:///projects/cons-list)\nerror[E0072]: recursive type `List` has infinite size --> src/main.rs:1:1 |\n1 | enum List { | ^^^^^^^^^\n2 | Cons(i32, List), | ---- recursive without indirection |\nhelp: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle |\n2 | Cons(i32, Box), | ++++ + error[E0391]: cycle detected when computing when `List` needs drop --> src/main.rs:1:1 |\n1 | enum List { | ^^^^^^^^^ | = note: ...which immediately requires computing when `List` needs drop again = note: cycle used when computing whether `List` needs drop = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information Some errors have detailed explanations: E0072, E0391.\nFor more information about an error, try `rustc --explain E0072`.\nerror: could not compile `cons-list` (bin \"cons-list\") due to 2 previous errors 示例 15-4:尝试定义一个递归枚举时得到的错误 这个错误表明这个类型 “有无限的大小”。其原因是 List 的一个成员被定义为是递归的:它直接存放了另一个相同类型的值。这意味着 Rust 无法计算为了存放 List 值到底需要多少空间。让我们拆开来看为何会得到这个错误。首先了解一下 Rust 如何决定需要多少空间来存放一个非递归类型。","breadcrumbs":"智能指针 » 使用 Box 指向堆上数据 » Box 允许创建递归类型","id":"273","title":"Box 允许创建递归类型"},"274":{"body":"回忆一下第六章讨论枚举定义时示例 6-2 中定义的 Message 枚举: enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(i32, i32, i32),\n}\n# # fn main() {} 当 Rust 需要知道要为 Message 值分配多少空间时,它可以检查每一个成员并发现 Message::Quit 并不需要任何空间,Message::Move 需要足够储存两个 i32 值的空间,依此类推。因为 enum 实际上只会使用其中的一个成员,所以 Message 值所需的空间等于储存其最大成员的空间大小。 与此相对当 Rust 编译器检查像示例 15-2 中的 List 这样的递归类型时会发生什么呢。编译器尝试计算出储存一个 List 枚举需要多少内存,并开始检查 Cons 成员,那么 Cons 需要的空间等于 i32 的大小加上 List 的大小。为了计算 List 需要多少内存,它检查其成员,从 Cons 成员开始。Cons成员储存了一个 i32 值和一个List值,这样的计算将无限进行下去,如图 15-1 所示: 图 15-1:一个包含无限个 Cons 成员的无限 List","breadcrumbs":"智能指针 » 使用 Box 指向堆上数据 » 计算非递归类型的大小","id":"274","title":"计算非递归类型的大小"},"275":{"body":"因为 Rust 无法计算出要为定义为递归的类型分配多少空间,所以编译器给出了一个包括了有用建议的错误: help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `List` representable |\n2 | Cons(i32, Box), | ++++ + 在建议中,“indirection” 意味着不同于直接储存一个值,应该间接的储存一个指向值的指针。 因为 Box 是一个指针,我们总是知道它需要多少空间:指针的大小并不会根据其指向的数据量而改变。这意味着可以将 Box 放入 Cons 成员中而不是直接存放另一个 List 值。Box 会指向另一个位于堆上的 List 值,而不是存放在 Cons 成员中。从概念上讲,我们仍然有一个通过在其中 “存放” 其他列表创建的列表,不过现在实现这个概念的方式更像是一个项挨着另一项,而不是一项包含另一项。 我们可以修改示例 15-2 中 List 枚举的定义和示例 15-3 中对 List 的应用,如示例 15-65 所示,这是可以编译的: 文件名:src/main.rs enum List { Cons(i32, Box), Nil,\n} use crate::List::{Cons, Nil}; fn main() { let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));\n} 示例 15-5:为了拥有已知大小而使用 Box 的 List 定义 Cons 成员将会需要一个 i32 的大小加上储存 box 指针数据的空间。Nil 成员不储存值,所以它比 Cons 成员需要更少的空间。现在我们知道了任何 List 值最多需要一个 i32 加上 box 指针数据的大小。通过使用 box,打破了这无限递归的连锁,这样编译器就能够计算出储存 List 值需要的大小了。图 15-2 展示了现在 Cons 成员看起来像什么: 图 15-2:因为 Cons 存放一个 Box 所以 List 不是无限大小的了 box 只提供了间接存储和堆分配;它们并没有任何其他特殊的功能,比如我们将会见到的其他智能指针。它们也没有这些特殊功能带来的性能损失,所以它们可以用于像 cons list 这样间接存储是唯一所需功能的场景。我们还将在第十八章看到 box 的更多应用场景。 Box 类型是一个智能指针,因为它实现了 Deref trait,它允许 Box 值被当作引用对待。当 Box 值离开作用域时,由于 Box 类型 Drop trait 的实现,box 所指向的堆数据也会被清除。这两个 trait 对于在本章余下讨论的其他智能指针所提供的功能中,将会更为重要。让我们更详细的探索一下这两个 trait。","breadcrumbs":"智能指针 » 使用 Box 指向堆上数据 » 使用 Box 给递归类型一个已知的大小","id":"275","title":"使用 Box 给递归类型一个已知的大小"},"276":{"body":"ch15-02-deref.md commit 0514b1cf34c2eaab8285f43305c10a87f4ce34a0 实现 Deref trait 允许我们重载 解引用运算符 ( dereference operator )*(不要与乘法运算符或通配符相混淆)。通过这种方式实现 Deref trait 的智能指针可以被当作常规引用来对待,可以编写操作引用的代码并用于智能指针。 让我们首先看看解引用运算符如何处理常规引用,接着尝试定义我们自己的类似 Box 的类型并看看为何解引用运算符不能像引用一样工作。我们会探索如何实现 Deref trait 使得智能指针以类似引用的方式工作变为可能。最后,我们会讨论 Rust 的 Deref 强制转换 ( deref coercions )功能以及它是如何处理引用或智能指针的。 我们将要构建的 MyBox 类型与真正的 Box 有一个很大的区别:我们的版本不会在堆上储存数据。这个例子重点关注 Deref,所以其数据实际存放在何处,相比其类似指针的行为来说不算重要。","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » 通过 Deref trait 将智能指针当作常规引用处理","id":"276","title":"通过 Deref trait 将智能指针当作常规引用处理"},"277":{"body":"常规引用是一个指针类型,一种理解指针的方式是将其看成指向储存在其他某处值的箭头。在示例 15-6 中,创建了一个 i32 值的引用,接着使用解引用运算符来跟踪所引用的值: 文件名:src/main.rs fn main() { let x = 5; let y = &x; assert_eq!(5, x); assert_eq!(5, *y);\n} 示例 15-6:使用解引用运算符来跟踪 i32 值的引用 变量 x 存放了一个 i32 值 5。y 等于 x 的一个引用。可以断言 x 等于 5。然而,如果希望对 y 的值做出断言,必须使用 *y 来追踪引用所指向的值(也就是 解引用 ),这样编译器就可以比较实际的值了。一旦解引用了 y,就可以访问 y 所指向的整型值并可以与 5 做比较。 相反如果尝试编写 assert_eq!(5, y);,则会得到如下编译错误: $ cargo run Compiling deref-example v0.1.0 (file:///projects/deref-example)\nerror[E0277]: can't compare `{integer}` with `&{integer}` --> src/main.rs:6:5 |\n6 | assert_eq!(5, y); | ^^^^^^^^^^^^^^^^ no implementation for `{integer} == &{integer}` | = help: the trait `PartialEq<&{integer}>` is not implemented for `{integer}` = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `deref-example` (bin \"deref-example\") due to 1 previous error 不允许比较数字的引用与数字,因为它们是不同的类型。必须使用解引用运算符追踪引用所指向的值。","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » 追踪指针的值","id":"277","title":"追踪指针的值"},"278":{"body":"可以使用 Box 代替引用来重写示例 15-6 中的代码,示例 15-7 中 Box 上使用的解引用运算符与示例 15-6 中引用上使用的解引用运算符有着一样的功能: 文件名:src/main.rs fn main() { let x = 5; let y = Box::new(x); assert_eq!(5, x); assert_eq!(5, *y);\n} 示例 15-7:在 Box 上使用解引用运算符 示例 15-7 相比示例 15-6 主要不同的地方就是将 y 设置为一个指向 x 值拷贝的 Box 实例,而不是指向 x 值的引用。在最后的断言中,可以使用解引用运算符以 y 为引用时相同的方式追踪 Box 的指针。接下来让我们通过实现自己的类型来探索 Box 能这么做有何特殊之处。","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » 像引用一样使用 Box","id":"278","title":"像引用一样使用 Box"},"279":{"body":"为了体会默认情况下智能指针与引用的不同,让我们创建一个类似于标准库提供的 Box 类型的智能指针。接着学习如何增加使用解引用运算符的功能。 从根本上说,Box 被定义为包含一个元素的元组结构体,所以示例 15-8 以相同的方式定义了 MyBox 类型。我们还定义了 new 函数来对应定义于 Box 的 new 函数: 文件名:src/main.rs struct MyBox(T); impl MyBox { fn new(x: T) -> MyBox { MyBox(x) }\n}\n# # fn main() {} 示例 15-8:定义 MyBox 类型 这里定义了一个结构体 MyBox 并声明了一个泛型参数 T,因为我们希望其可以存放任何类型的值。MyBox 是一个包含 T 类型元素的元组结构体。MyBox::new 函数获取一个 T 类型的参数并返回一个存放传入值的 MyBox 实例。 尝试将示例 15-7 中的代码加入示例 15-8 中并修改 main 使用我们定义的 MyBox 类型代替 Box。示例 15-9 中的代码不能编译,因为 Rust 不知道如何解引用 MyBox: 文件名:src/main.rs # struct MyBox(T);\n# # impl MyBox {\n# fn new(x: T) -> MyBox {\n# MyBox(x)\n# }\n# }\n# fn main() { let x = 5; let y = MyBox::new(x); assert_eq!(5, x); assert_eq!(5, *y);\n} 示例 15-9:尝试以使用引用和 Box 相同的方式使用 MyBox 得到的编译错误是: $ cargo run Compiling deref-example v0.1.0 (file:///projects/deref-example)\nerror[E0614]: type `MyBox<{integer}>` cannot be dereferenced --> src/main.rs:14:19 |\n14 | assert_eq!(5, *y); | ^^ For more information about this error, try `rustc --explain E0614`.\nerror: could not compile `deref-example` (bin \"deref-example\") due to 1 previous error MyBox 类型不能解引用,因为我们尚未在该类型实现这个功能。为了启用 * 运算符的解引用功能,需要实现 Deref trait。","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » 自定义智能指针","id":"279","title":"自定义智能指针"},"28":{"body":"当项目最终准备好发布时,可以使用 cargo build --release 来优化编译项目。这会在 target/release 而不是 target/debug 下生成可执行文件。这些优化可以让 Rust 代码运行的更快,不过启用这些优化也需要消耗更长的编译时间。这也就是为什么会有两种不同的配置:一种是为了开发,你需要经常快速重新构建;另一种是为用户构建最终程序,它们不会经常重新构建,并且希望程序运行得越快越好。如果你在测试代码的运行时间,请确保运行 cargo build --release 并使用 target/release 下的可执行文件进行测试。","breadcrumbs":"入门指南 » Hello, Cargo! » 发布(release)构建","id":"28","title":"发布(release)构建"},"280":{"body":"如第十章 “为类型实现 trait” 部分所讨论的,为了实现 trait,需要提供 trait 所需的方法实现。Deref trait,由标准库提供,要求实现名为 deref 的方法,其借用 self 并返回一个内部数据的引用。示例 15-10 包含定义于 MyBox 之上的 Deref 实现: 文件名:src/main.rs use std::ops::Deref; impl Deref for MyBox { type Target = T; fn deref(&self) -> &Self::Target { &self.0 }\n}\n# # struct MyBox(T);\n# # impl MyBox {\n# fn new(x: T) -> MyBox {\n# MyBox(x)\n# }\n# }\n# # fn main() {\n# let x = 5;\n# let y = MyBox::new(x);\n# # assert_eq!(5, x);\n# assert_eq!(5, *y);\n# } 示例 15-10:MyBox 上的 Deref 实现 type Target = T; 语法定义了用于此 trait 的关联类型。关联类型是一个稍有不同的定义泛型参数的方式,现在还无需过多的担心它;第二十章会详细介绍。 deref 方法体中写入了 &self.0,这样 deref 返回了我希望通过 * 运算符访问的值的引用。回忆一下第五章 “使用没有命名字段的元组结构体来创建不同的类型” 部分 .0 用来访问元组结构体的第一个元素。示例 15-9 中的 main 函数中对 MyBox 值的 * 调用现在可以编译并能通过断言了! 没有 Deref trait 的话,编译器只会解引用 & 引用类型。deref 方法向编译器提供了获取任何实现了 Deref trait 的类型的值,并且调用这个类型的 deref 方法来获取一个它知道如何解引用的 & 引用的能力。 当我们在示例 15-9 中输入 *y 时,Rust 事实上在底层运行了如下代码: *(y.deref()) Rust 将 * 运算符替换为先调用 deref 方法再进行普通解引用的操作,如此我们便不用担心是否还需手动调用 deref 方法了。Rust 的这个特性可以让我们写出行为一致的代码,无论是面对的是常规引用还是实现了 Deref 的类型。 deref 方法返回值的引用,以及 *(y.deref()) 括号外边的普通解引用仍为必须的原因在于所有权。如果 deref 方法直接返回值而不是值的引用,其值(的所有权)将被移出 self。在这里以及大部分使用解引用运算符的情况下我们并不希望获取 MyBox 内部值的所有权。 注意,每次当我们在代码中使用 * 时, * 运算符都被替换成了先调用 deref 方法再接着使用 * 解引用的操作,且只会发生一次,不会对 * 操作符无限递归替换,解引用出上面 i32 类型的值就停止了,这个值与示例 15-9 中 assert_eq! 的 5 相匹配。","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » 通过实现 Deref trait 将某类型像引用一样处理","id":"280","title":"通过实现 Deref trait 将某类型像引用一样处理"},"281":{"body":"Deref 强制转换 ( deref coercions )将实现了 Deref trait 的类型的引用转换为另一种类型的引用。例如,Deref 强制转换可以将 &String 转换为 &str,因为 String 实现了 Deref trait 因此可以返回 &str。Deref 强制转换是 Rust 在函数或方法传参上的一种便利操作,并且只能作用于实现了 Deref trait 的类型。当这种特定类型的引用作为实参传递给和形参类型不同的函数或方法时将自动进行。这时会有一系列的 deref 方法被调用,把我们提供的类型转换成了参数所需的类型。 Deref 强制转换的加入使得 Rust 程序员编写函数和方法调用时无需增加过多显式使用 & 和 * 的引用和解引用。这个功能也使得我们可以编写更多同时作用于引用或智能指针的代码。 作为展示 Deref 强制转换的实例,让我们使用示例 15-8 中定义的 MyBox,以及示例 15-10 中增加的 Deref 实现。示例 15-11 展示了一个有着字符串 slice 参数的函数定义: 文件名:src/main.rs fn hello(name: &str) { println!(\"Hello, {name}!\");\n}\n# # fn main() {} 示例 15-11:hello 函数有着 &str 类型的参数 name 可以使用字符串 slice 作为参数调用 hello 函数,比如 hello(\"Rust\");。Deref 强制转换使得用 MyBox 类型值的引用调用 hello 成为可能,如示例 15-12 所示: 文件名:src/main.rs # use std::ops::Deref;\n# # impl Deref for MyBox {\n# type Target = T;\n# # fn deref(&self) -> &T {\n# &self.0\n# }\n# }\n# # struct MyBox(T);\n# # impl MyBox {\n# fn new(x: T) -> MyBox {\n# MyBox(x)\n# }\n# }\n# # fn hello(name: &str) {\n# println!(\"Hello, {name}!\");\n# }\n# fn main() { let m = MyBox::new(String::from(\"Rust\")); hello(&m);\n} 示例 15-12:因为 Deref 强制转换,使用 MyBox 的引用调用 hello 是可行的 这里使用 &m 调用 hello 函数,其为 MyBox 值的引用。因为示例 15-10 中在 MyBox 上实现了 Deref trait,Rust 可以通过 deref 调用将 &MyBox 变为 &String。标准库中提供了 String 上的 Deref 实现,其会返回字符串 slice,这可以在 Deref 的 API 文档中看到。Rust 再次调用 deref 将 &String 变为 &str,这就符合 hello 函数的定义了。 如果 Rust 没有实现 Deref 强制转换,为了使用 &MyBox 类型的值调用 hello,则不得不编写示例 15-13 中的代码来代替示例 15-12: 文件名:src/main.rs # use std::ops::Deref;\n# # impl Deref for MyBox {\n# type Target = T;\n# # fn deref(&self) -> &T {\n# &self.0\n# }\n# }\n# # struct MyBox(T);\n# # impl MyBox {\n# fn new(x: T) -> MyBox {\n# MyBox(x)\n# }\n# }\n# # fn hello(name: &str) {\n# println!(\"Hello, {name}!\");\n# }\n# fn main() { let m = MyBox::new(String::from(\"Rust\")); hello(&(*m)[..]);\n} 示例 15-13:如果 Rust 没有 Deref 强制转换则必须编写的代码 (*m) 将 MyBox 解引用为 String。接着 & 和 [..] 获取了整个 String 的字符串 slice 来匹配 hello 的签名。没有 Deref 强制转换所有这些符号混在一起将更难以读写和理解。Deref 强制转换使得 Rust 自动的帮我们处理这些转换。 当所涉及到的类型定义了 Deref trait,Rust 会分析这些类型并使用任意多次 Deref::deref 调用以获得匹配参数的类型。这些解析都发生在编译时,所以利用 Deref 强制转换并没有运行时损耗!","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » 函数和方法的隐式 Deref 强制转换","id":"281","title":"函数和方法的隐式 Deref 强制转换"},"282":{"body":"类似于如何使用 Deref trait 重载不可变引用的 * 运算符,Rust 提供了 DerefMut trait 用于重载可变引用的 * 运算符。 Rust 在发现类型和 trait 实现满足三种情况时会进行 Deref 强制转换: 当 T: Deref 时从 &T 到 &U。 当 T: DerefMut 时从 &mut T 到 &mut U。 当 T: Deref 时从 &mut T 到 &U。 头两个情况除了第二种实现了可变性之外是相同的:第一种情况表明如果有一个 &T,而 T 实现了返回 U 类型的 Deref,则可以直接得到 &U。第二种情况表明对于可变引用也有着相同的行为。 第三个情况有些微妙:Rust 也会将可变引用强转为不可变引用。但是反之是 不可能 的:不可变引用永远也不能强转为可变引用。因为根据借用规则,如果有一个可变引用,其必须是这些数据的唯一引用(否则程序将无法编译)。将一个可变引用转换为不可变引用永远也不会打破借用规则。将不可变引用转换为可变引用则需要初始的不可变引用是数据唯一的不可变引用,而借用规则无法保证这一点。因此,Rust 无法假设将不可变引用转换为可变引用是可能的。","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » Deref 强制转换如何与可变性交互","id":"282","title":"Deref 强制转换如何与可变性交互"},"283":{"body":"ch15-03-drop.md commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e 对于智能指针模式来说第二个重要的 trait 是 Drop,其允许我们在值要离开作用域时执行一些代码。可以为任何类型提供 Drop trait 的实现,同时所指定的代码被用于释放类似于文件或网络连接的资源。 我们在智能指针上下文中讨论 Drop 是因为其功能几乎总是用于实现智能指针。例如,当 Box 被丢弃时会释放 box 指向的堆空间。 在其他一些语言中的某些类型,我们不得不记住在每次使用完那些类型的智能指针实例后调用清理内存或资源的代码。如果忘记的话,运行代码的系统可能会因为负荷过重而崩溃。在 Rust 中,可以指定每当值离开作用域时被执行的代码,编译器会自动插入这些代码。于是我们就不需要在程序中到处编写在实例结束时清理这些变量的代码 —— 而且还不会泄漏资源。 指定在值离开作用域时应该执行的代码的方式是实现 Drop trait。Drop trait 要求实现一个叫做 drop 的方法,它获取一个 self 的可变引用。为了能够看出 Rust 何时调用 drop,让我们暂时使用 println! 语句实现 drop。 示例 15-14 展示了唯一定制功能就是当其实例离开作用域时,打印出 Dropping CustomSmartPointer! 的结构体 CustomSmartPointer,这会演示 Rust 何时运行 drop 函数: 文件名:src/main.rs struct CustomSmartPointer { data: String,\n} impl Drop for CustomSmartPointer { fn drop(&mut self) { println!(\"Dropping CustomSmartPointer with data `{}`!\", self.data); }\n} fn main() { let c = CustomSmartPointer { data: String::from(\"my stuff\"), }; let d = CustomSmartPointer { data: String::from(\"other stuff\"), }; println!(\"CustomSmartPointers created.\");\n} 示例 15-14:结构体 CustomSmartPointer,其实现了放置清理代码的 Drop trait Drop trait 包含在 prelude 中,所以无需导入它。我们在 CustomSmartPointer 上实现了 Drop trait,并提供了一个调用 println! 的 drop 方法实现。drop 函数体是放置任何当类型实例离开作用域时期望运行的逻辑的地方。这里选择打印一些文本以可视化地展示 Rust 何时调用 drop。 在 main 中,我们新建了两个 CustomSmartPointer 实例并打印出了 CustomSmartPointer created.。在 main 的结尾,CustomSmartPointer 的实例会离开作用域,而 Rust 会调用放置于 drop 方法中的代码,打印出最后的信息。注意无需显式调用 drop 方法: 当运行这个程序,会出现如下输出: $ cargo run Compiling drop-example v0.1.0 (file:///projects/drop-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.60s Running `target/debug/drop-example`\nCustomSmartPointers created.\nDropping CustomSmartPointer with data `other stuff`!\nDropping CustomSmartPointer with data `my stuff`! 当实例离开作用域 Rust 会自动调用 drop,并调用我们指定的代码。变量以被创建时相反的顺序被丢弃,所以 d 在 c 之前被丢弃。这个例子的作用是给了我们一个 drop 方法如何工作的可视化指导,不过通常需要指定类型所需执行的清理代码而不是打印信息。 通过 std::mem::drop 提早丢弃值 不幸的是,我们并不能直截了当的禁用 drop 这个功能。通常也不需要禁用 drop ;整个 Drop trait 存在的意义在于其是自动处理的。然而,有时你可能需要提早清理某个值。一个例子是当使用智能指针管理锁时;你可能希望强制运行 drop 方法来释放锁以便作用域中的其他代码可以获取锁。Rust 并不允许我们主动调用 Drop trait 的 drop 方法;当我们希望在作用域结束之前就强制释放变量的话,我们应该使用的是由标准库提供的 std::mem::drop。 如果我们像是示例 15-14 那样尝试调用 Drop trait 的 drop 方法,就会得到像示例 15-15 那样的编译错误: 文件名:src/main.rs # struct CustomSmartPointer {\n# data: String,\n# }\n# # impl Drop for CustomSmartPointer {\n# fn drop(&mut self) {\n# println!(\"Dropping CustomSmartPointer with data `{}`!\", self.data);\n# }\n# }\n# fn main() { let c = CustomSmartPointer { data: String::from(\"some data\"), }; println!(\"CustomSmartPointer created.\"); c.drop(); println!(\"CustomSmartPointer dropped before the end of main.\");\n} 示例 15-15:尝试手动调用 Drop trait 的 drop 方法提早清理 如果尝试编译代码会得到如下错误: $ cargo run Compiling drop-example v0.1.0 (file:///projects/drop-example)\nerror[E0040]: explicit use of destructor method --> src/main.rs:16:7 |\n16 | c.drop(); | ^^^^ explicit destructor calls not allowed |\nhelp: consider using `drop` function |\n16 | drop(c); | +++++ ~ For more information about this error, try `rustc --explain E0040`.\nerror: could not compile `drop-example` (bin \"drop-example\") due to 1 previous error 错误信息表明不允许显式调用 drop。错误信息使用了术语 析构函数 ( destructor ),这是一个清理实例的函数的通用编程概念。 析构函数 对应创建实例的 构造函数 。Rust 中的 drop 函数就是这么一个析构函数。 Rust 不允许我们显式调用 drop 因为 Rust 仍然会在 main 的结尾对值自动调用 drop,这会导致一个 double free 错误,因为 Rust 会尝试清理相同的值两次。 因为不能禁用当值离开作用域时自动插入的 drop,并且不能显式调用 drop,如果我们需要强制提早清理值,可以使用 std::mem::drop 函数。 std::mem::drop 函数不同于 Drop trait 中的 drop 方法。可以通过传递希望强制丢弃的值作为参数。std::mem::drop 位于 prelude,所以我们可以修改示例 15-15 中的 main 来调用 drop 函数。如示例 15-16 所示: 文件名:src/main.rs # struct CustomSmartPointer {\n# data: String,\n# }\n# # impl Drop for CustomSmartPointer {\n# fn drop(&mut self) {\n# println!(\"Dropping CustomSmartPointer with data `{}`!\", self.data);\n# }\n# }\n# fn main() { let c = CustomSmartPointer { data: String::from(\"some data\"), }; println!(\"CustomSmartPointer created.\"); drop(c); println!(\"CustomSmartPointer dropped before the end of main.\");\n} 示例 15-16: 在值离开作用域之前调用 std::mem::drop 显式清理 运行这段代码会打印出如下: $ cargo run Compiling drop-example v0.1.0 (file:///projects/drop-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.73s Running `target/debug/drop-example`\nCustomSmartPointer created.\nDropping CustomSmartPointer with data `some data`!\nCustomSmartPointer dropped before the end of main. Dropping CustomSmartPointer with data `some data`! 出现在 CustomSmartPointer created. 和 CustomSmartPointer dropped before the end of main. 之间,表明了 drop 方法被调用了并在此丢弃了 c。 Drop trait 实现中指定的代码可以用于许多方面,来使得清理变得方便和安全:比如可以用其创建我们自己的内存分配器!通过 Drop trait 和 Rust 所有权系统,你无需担心之后的代码清理,Rust 会自动考虑这些问题。 我们也无需担心意外的清理掉仍在使用的值,这会造成编译器错误:所有权系统确保引用总是有效的,也会确保 drop 只会在值不再被使用时被调用一次。 现在我们学习了 Box 和一些智能指针的特性,让我们聊聊标准库中定义的其他几种智能指针。","breadcrumbs":"智能指针 » 使用 Drop Trait 运行清理代码 » 使用 Drop Trait 运行清理代码","id":"283","title":"使用 Drop Trait 运行清理代码"},"284":{"body":"ch15-04-rc.md commit 52fafaaa8e432e84beaaf4ea80ccba880624effd 大部分情况下所有权是非常明确的:可以准确地知道哪个变量拥有某个值。然而,有些情况单个值可能会有多个所有者。例如,在图数据结构中,多个边可能指向相同的节点,而这个节点从概念上讲为所有指向它的边所拥有。节点在没有任何边指向它从而没有任何所有者之前,都不应该被清理掉。 为了启用多所有权需要显式地使用 Rust 类型 Rc,其为 引用计数 ( reference counting )的缩写。引用计数意味着记录一个值的引用数量来知晓这个值是否仍在被使用。如果某个值有零个引用,就代表没有任何有效引用并可以被清理。 可以将其想象为客厅中的电视。当一个人进来看电视时,他打开电视。其他人也可以进来看电视。当最后一个人离开房间时,他关掉电视因为它不再被使用了。如果某人在其他人还在看的时候就关掉了电视,正在看电视的人肯定会抓狂的! Rc 用于当我们希望在堆上分配一些内存供程序的多个部分读取,而且无法在编译时确定程序的哪一部分会最后结束使用它的时候。如果确实知道哪部分是最后一个结束使用的话,就可以令其成为数据的所有者,正常的所有权规则就可以在编译时生效。 注意 Rc 只能用于单线程场景;第十六章并发会涉及到如何在多线程程序中进行引用计数。","breadcrumbs":"智能指针 » Rc 引用计数智能指针 » Rc 引用计数智能指针","id":"284","title":"Rc 引用计数智能指针"},"285":{"body":"让我们回到示例 15-5 中使用 Box 定义 cons list 的例子。这一次,我们希望创建两个共享第三个列表所有权的列表,其概念将会看起来如图 15-3 所示: 图 15-3: 两个列表,b 和 c, 共享第三个列表 a 的所有权 列表 a 包含 5 之后是 10,之后是另两个列表:b 从 3 开始而 c 从 4 开始。b 和 c 会接上包含 5 和 10 的列表 a。换句话说,这两个列表会尝试共享第一个列表所包含的 5 和 10。 尝试使用 Box 定义的 List 实现并不能工作,如示例 15-17 所示: 文件名:src/main.rs enum List { Cons(i32, Box), Nil,\n} use crate::List::{Cons, Nil}; fn main() { let a = Cons(5, Box::new(Cons(10, Box::new(Nil)))); let b = Cons(3, Box::new(a)); let c = Cons(4, Box::new(a));\n} 示例 15-17: 展示不能用两个 Box 的列表尝试共享第三个列表的所有权 编译会得出如下错误: $ cargo run Compiling cons-list v0.1.0 (file:///projects/cons-list)\nerror[E0382]: use of moved value: `a` --> src/main.rs:11:30 |\n9 | let a = Cons(5, Box::new(Cons(10, Box::new(Nil)))); | - move occurs because `a` has type `List`, which does not implement the `Copy` trait\n10 | let b = Cons(3, Box::new(a)); | - value moved here\n11 | let c = Cons(4, Box::new(a)); | ^ value used here after move For more information about this error, try `rustc --explain E0382`.\nerror: could not compile `cons-list` (bin \"cons-list\") due to 1 previous error Cons 成员拥有其储存的数据,所以当创建 b 列表时,a 被移动进了 b 这样 b 就拥有了 a。接着当再次尝试使用 a 创建 c 时,这不被允许,因为 a 的所有权已经被移动。 可以改变 Cons 的定义来存放一个引用,不过接着必须指定生命周期参数。通过指定生命周期参数,表明列表中的每一个元素都至少与列表本身存在的一样久。这是示例 15-17 中元素与列表的情况,但并不是所有情况都如此。 相反,我们修改 List 的定义为使用 Rc 代替 Box,如列表 15-18 所示。现在每一个 Cons 变量都包含一个值和一个指向 List 的 Rc。当创建 b 时,不同于获取 a 的所有权,这里会克隆 a 所包含的 Rc,这会将引用计数从 1 增加到 2 并允许 a 和 b 共享 Rc 中数据的所有权。创建 c 时也会克隆 a,这会将引用计数从 2 增加为 3。每次调用 Rc::clone,Rc 中数据的引用计数都会增加,直到有零个引用之前其数据都不会被清理。 文件名:src/main.rs enum List { Cons(i32, Rc), Nil,\n} use crate::List::{Cons, Nil};\nuse std::rc::Rc; fn main() { let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil))))); let b = Cons(3, Rc::clone(&a)); let c = Cons(4, Rc::clone(&a));\n} 示例 15-18: 使用 Rc 定义的 List 需要使用 use 语句将 Rc 引入作用域,因为它不在 prelude 中。在 main 中创建了存放 5 和 10 的列表并将其存放在 a 的新的 Rc 中。接着当创建 b 和 c 时,调用 Rc::clone 函数并传递 a 中 Rc 的引用作为参数。 也可以调用 a.clone() 而不是 Rc::clone(&a),不过在这里 Rust 的习惯是使用 Rc::clone。Rc::clone 的实现并不像大部分类型的 clone 实现那样对所有数据进行深拷贝。Rc::clone 只会增加引用计数,这并不会花费多少时间。深拷贝可能会花费很长时间。通过使用 Rc::clone 进行引用计数,可以明显的区别深拷贝类的克隆和增加引用计数类的克隆。当查找代码中的性能问题时,只需考虑深拷贝类的克隆而无需考虑 Rc::clone 调用。","breadcrumbs":"智能指针 » Rc 引用计数智能指针 » 使用 Rc 共享数据","id":"285","title":"使用 Rc 共享数据"},"286":{"body":"让我们修改示例 15-18 的代码以便观察创建和丢弃 a 中 Rc 的引用时引用计数的变化。 在示例 15-19 中,修改了 main 以便将列表 c 置于内部作用域中,这样就可以观察当 c 离开作用域时引用计数如何变化。 文件名:src/main.rs # enum List {\n# Cons(i32, Rc),\n# Nil,\n# }\n# # use crate::List::{Cons, Nil};\n# use std::rc::Rc;\n# fn main() { let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil))))); println!(\"count after creating a = {}\", Rc::strong_count(&a)); let b = Cons(3, Rc::clone(&a)); println!(\"count after creating b = {}\", Rc::strong_count(&a)); { let c = Cons(4, Rc::clone(&a)); println!(\"count after creating c = {}\", Rc::strong_count(&a)); } println!(\"count after c goes out of scope = {}\", Rc::strong_count(&a));\n} 示例 15-19:打印出引用计数 在程序中每个引用计数变化的点,会打印出引用计数,其值可以通过调用 Rc::strong_count 函数获得。这个函数叫做 strong_count 而不是 count 是因为 Rc 也有 weak_count;在 “避免引用循环:将 Rc 变为 Weak” 部分会讲解 weak_count 的用途。 这段代码会打印出: $ cargo run Compiling cons-list v0.1.0 (file:///projects/cons-list) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.45s Running `target/debug/cons-list`\ncount after creating a = 1\ncount after creating b = 2\ncount after creating c = 3\ncount after c goes out of scope = 2 我们能够看到 a 中 Rc 的初始引用计数为 1,接着每次调用 clone,计数会增加 1。当 c 离开作用域时,计数减 1。不必像调用 Rc::clone 增加引用计数那样调用一个函数来减少计数;Drop trait 的实现当 Rc 值离开作用域时自动减少引用计数。 从这个例子我们所不能看到的是,在 main 的结尾当 b 然后是 a 离开作用域时,此处计数会是 0,同时 Rc 被完全清理。使用 Rc 允许一个值有多个所有者,引用计数则确保只要任何所有者依然存在其值也保持有效。 通过不可变引用, Rc 允许在程序的多个部分之间只读地共享数据。如果 Rc 也允许多个可变引用,则会违反第四章讨论的借用规则之一:相同位置的多个可变借用可能造成数据竞争和不一致。不过可以修改数据是非常有用的!在下一部分,我们将讨论内部可变性模式和 RefCell 类型,它可以与 Rc 结合使用来处理不可变性的限制。","breadcrumbs":"智能指针 » Rc 引用计数智能指针 » 克隆 Rc 会增加引用计数","id":"286","title":"克隆 Rc 会增加引用计数"},"287":{"body":"ch15-05-interior-mutability.md commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e 内部可变性 ( Interior mutability )是 Rust 中的一个设计模式,它允许你即使在有不可变引用时也可以改变数据,这通常是借用规则所不允许的。为了改变数据,该模式在数据结构中使用 unsafe 代码来模糊 Rust 通常的可变性和借用规则。不安全代码表明我们在手动检查这些规则而不是让编译器替我们检查。第二十章会更详细地介绍不安全代码。 当可以确保代码在运行时会遵守借用规则,即使编译器不能保证的情况,可以选择使用那些运用内部可变性模式的类型。所涉及的 unsafe 代码将被封装进安全的 API 中,而外部类型仍然是不可变的。 让我们通过遵循内部可变性模式的 RefCell 类型来开始探索。","breadcrumbs":"智能指针 » RefCell 与内部可变性模式 » RefCell 和内部可变性模式","id":"287","title":"RefCell 和内部可变性模式"},"288":{"body":"不同于 Rc,RefCell 代表其数据的唯一的所有权。那么是什么让 RefCell 不同于像 Box 这样的类型呢?回忆一下第四章所学的借用规则: 在任意给定时刻,只能拥有一个可变引用或任意数量的不可变引用 之一 (而不是两者)。 引用必须总是有效的。 对于引用和 Box,借用规则的不可变性作用于编译时。对于 RefCell,这些不可变性作用于 运行时 。对于引用,如果违反这些规则,会得到一个编译错误。而对于 RefCell,如果违反这些规则程序会 panic 并退出。 在编译时检查借用规则的优势是这些错误将在开发过程的早期被捕获,同时对运行时没有性能影响,因为所有的分析都提前完成了。为此,在编译时检查借用规则是大部分情况的最佳选择,这也正是其为何是 Rust 的默认行为。 相反在运行时检查借用规则的好处则是允许出现特定内存安全的场景,而它们在编译时检查中是不允许的。静态分析,正如 Rust 编译器,是天生保守的。但代码的一些属性不可能通过分析代码发现:其中最著名的就是 停机问题(Halting Problem) ,这超出了本书的范畴,不过如果你感兴趣的话这是一个值得研究的有趣主题。 因为一些分析是不可能的,如果 Rust 编译器不能通过所有权规则编译,它可能会拒绝一个正确的程序;从这种角度考虑它是保守的。如果 Rust 接受不正确的程序,那么用户也就不会相信 Rust 所做的保证了。然而,如果 Rust 拒绝正确的程序,虽然会给程序员带来不便,但不会带来灾难。RefCell 正是用于当你确信代码遵守借用规则,而编译器不能理解和确定的时候。 类似于 Rc,RefCell 只能用于单线程场景。如果尝试在多线程上下文中使用RefCell,会得到一个编译错误。第十六章会介绍如何在多线程程序中使用 RefCell 的功能。 如下为选择 Box,Rc 或 RefCell 的理由: Rc 允许相同数据有多个所有者;Box 和 RefCell 有单一所有者。 Box 允许在编译时执行不可变或可变借用检查;Rc仅允许在编译时执行不可变借用检查;RefCell 允许在运行时执行不可变或可变借用检查。 因为 RefCell 允许在运行时执行可变借用检查,所以我们可以在即便 RefCell 自身是不可变的情况下修改其内部的值。 在不可变值内部改变值就是 内部可变性 模式。让我们看看何时内部可变性是有用的,并讨论这是如何成为可能的。","breadcrumbs":"智能指针 » RefCell 与内部可变性模式 » 通过 RefCell 在运行时检查借用规则","id":"288","title":"通过 RefCell 在运行时检查借用规则"},"289":{"body":"借用规则的一个推论是当有一个不可变值时,不能可变地借用它。例如,如下代码不能编译: fn main() { let x = 5; let y = &mut x;\n} 如果尝试编译,会得到如下错误: $ cargo run Compiling borrowing v0.1.0 (file:///projects/borrowing)\nerror[E0596]: cannot borrow `x` as mutable, as it is not declared as mutable --> src/main.rs:3:13 |\n3 | let y = &mut x; | ^^^^^^ cannot borrow as mutable |\nhelp: consider changing this to be mutable |\n2 | let mut x = 5; | +++ For more information about this error, try `rustc --explain E0596`.\nerror: could not compile `borrowing` (bin \"borrowing\") due to 1 previous error 然而,特定情况下,令一个值在其方法内部能够修改自身,而在其他代码中仍视为不可变,是很有用的。值方法外部的代码就不能修改其值了。RefCell 是一个获得内部可变性的方法。RefCell 并没有完全绕开借用规则,编译器中的借用检查器允许内部可变性并相应地在运行时检查借用规则。如果违反了这些规则,会出现 panic 而不是编译错误。 让我们通过一个实际的例子来探索何处可以使用 RefCell 来修改不可变值并看看为何这么做是有意义的。 内部可变性的用例:mock 对象 有时在测试中程序员会用某个类型替换另一个类型,以便观察特定的行为并断言它是被正确实现的。这个占位符类型被称为 测试替身 ( test double )。就像电影制作中的替身演员 ( stunt double ) 一样,替代演员完成高难度的场景。测试替身在运行测试时替代某个类型。 mock 对象 是特定类型的测试替身,它们记录测试过程中发生了什么以便可以断言操作是正确的。 虽然 Rust 中的对象与其他语言中的对象并不是一回事,Rust 也没有像其他语言那样在标准库中内建 mock 对象功能,不过我们确实可以创建一个与 mock 对象有着相同功能的结构体。 如下是一个我们想要测试的场景:我们在编写一个记录某个值与最大值的差距的库,并根据当前值与最大值的差距来发送消息。例如,这个库可以用于记录用户所允许的 API 调用数量限额。 该库只提供记录与最大值的差距,以及何种情况发送什么消息的功能。使用此库的程序则期望提供实际发送消息的机制:程序可以选择记录一条消息、发送 email、发送短信等等。库本身无需知道这些细节;只需实现其提供的 Messenger trait 即可。示例 15-20 展示了库代码: 文件名:src/lib.rs pub trait Messenger { fn send(&self, msg: &str);\n} pub struct LimitTracker<'a, T: Messenger> { messenger: &'a T, value: usize, max: usize,\n} impl<'a, T> LimitTracker<'a, T>\nwhere T: Messenger,\n{ pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> { LimitTracker { messenger, value: 0, max, } } pub fn set_value(&mut self, value: usize) { self.value = value; let percentage_of_max = self.value as f64 / self.max as f64; if percentage_of_max >= 1.0 { self.messenger.send(\"Error: You are over your quota!\"); } else if percentage_of_max >= 0.9 { self.messenger .send(\"Urgent warning: You've used up over 90% of your quota!\"); } else if percentage_of_max >= 0.75 { self.messenger .send(\"Warning: You've used up over 75% of your quota!\"); } }\n} 示例 15-20:一个记录某个值与最大值差距的库,并根据此值的特定级别发出警告 这些代码中一个重要部分是拥有一个方法 send 的 Messenger trait,其获取一个 self 的不可变引用和文本信息。这个 trait 是 mock 对象所需要实现的接口库,这样 mock 就能像一个真正的对象那样使用了。另一个重要的部分是我们需要测试 LimitTracker 的 set_value 方法的行为。可以改变传递的 value 参数的值,不过 set_value 并没有返回任何可供断言的值。我们希望能够说,如果我们创建一个实现了 Messenger trait 和具有特定 max 值的 LimitTracker 时,当传递不同 value 值时,消息发送者应被告知发送合适的消息。 我们所需的 mock 对象是,调用 send 并不实际发送 email 或消息,而是只记录信息被通知要发送了。可以新建一个 mock 对象实例,用其创建 LimitTracker,调用 LimitTracker 的 set_value 方法,然后检查 mock 对象是否有我们期望的消息。示例 15-21 展示了一个如此尝试的 mock 对象实现,不过借用检查器并不允许: 文件名:src/lib.rs # pub trait Messenger {\n# fn send(&self, msg: &str);\n# }\n# # pub struct LimitTracker<'a, T: Messenger> {\n# messenger: &'a T,\n# value: usize,\n# max: usize,\n# }\n# # impl<'a, T> LimitTracker<'a, T>\n# where\n# T: Messenger,\n# {\n# pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {\n# LimitTracker {\n# messenger,\n# value: 0,\n# max,\n# }\n# }\n# # pub fn set_value(&mut self, value: usize) {\n# self.value = value;\n# # let percentage_of_max = self.value as f64 / self.max as f64;\n# # if percentage_of_max >= 1.0 {\n# self.messenger.send(\"Error: You are over your quota!\");\n# } else if percentage_of_max >= 0.9 {\n# self.messenger\n# .send(\"Urgent warning: You've used up over 90% of your quota!\");\n# } else if percentage_of_max >= 0.75 {\n# self.messenger\n# .send(\"Warning: You've used up over 75% of your quota!\");\n# }\n# }\n# }\n# #[cfg(test)]\nmod tests { use super::*; struct MockMessenger { sent_messages: Vec, } impl MockMessenger { fn new() -> MockMessenger { MockMessenger { sent_messages: vec![], } } } impl Messenger for MockMessenger { fn send(&self, message: &str) { self.sent_messages.push(String::from(message)); } } #[test] fn it_sends_an_over_75_percent_warning_message() { let mock_messenger = MockMessenger::new(); let mut limit_tracker = LimitTracker::new(&mock_messenger, 100); limit_tracker.set_value(80); assert_eq!(mock_messenger.sent_messages.len(), 1); }\n} 示例 15-21:尝试实现 MockMessenger,借用检查器不允许这么做 测试代码定义了一个 MockMessenger 结构体,其 sent_messages 字段为一个 String 值的 Vec 用来记录被告知发送的消息。我们还定义了一个关联函数 new 以便于新建从空消息列表开始的 MockMessenger 值。接着为 MockMessenger 实现 Messenger trait 这样就可以为 LimitTracker 提供一个 MockMessenger。在 send 方法的定义中,获取传入的消息作为参数并储存在 MockMessenger 的 sent_messages 列表中。 在测试中,我们测试了当 LimitTracker 被告知将 value 设置为超过 max 值 75% 的某个值。首先新建一个 MockMessenger,其从空消息列表开始。接着新建一个 LimitTracker 并传递新建 MockMessenger 的引用和 max 值 100。我们使用值 80 调用 LimitTracker 的 set_value 方法,这超过了 100 的 75%。接着断言 MockMessenger 中记录的消息列表应该有一条消息。 然而,这个测试是有问题的: $ cargo test Compiling limit-tracker v0.1.0 (file:///projects/limit-tracker)\nerror[E0596]: cannot borrow `self.sent_messages` as mutable, as it is behind a `&` reference --> src/lib.rs:58:13 |\n58 | self.sent_messages.push(String::from(message)); | ^^^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable |\nhelp: consider changing this to be a mutable reference in the `impl` method and the `trait` definition |\n2 ~ fn send(&mut self, msg: &str);\n3 | }\n...\n56 | impl Messenger for MockMessenger {\n57 ~ fn send(&mut self, message: &str) { | For more information about this error, try `rustc --explain E0596`.\nerror: could not compile `limit-tracker` (lib test) due to 1 previous error 不能修改 MockMessenger 来记录消息,因为 send 方法获取了 self 的不可变引用。我们也不能参考错误文本的建议使用 &mut self 替代,因为这样 send 的签名就不符合 Messenger trait 定义中的签名了(可以试着这么改,看看会出现什么错误信息)。 这正是内部可变性的用武之地!我们将通过 RefCell 来储存 sent_messages,然后 send 将能够修改 sent_messages 并储存消息。示例 15-22 展示了代码: 文件名:src/lib.rs # pub trait Messenger {\n# fn send(&self, msg: &str);\n# }\n# # pub struct LimitTracker<'a, T: Messenger> {\n# messenger: &'a T,\n# value: usize,\n# max: usize,\n# }\n# # impl<'a, T> LimitTracker<'a, T>\n# where\n# T: Messenger,\n# {\n# pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {\n# LimitTracker {\n# messenger,\n# value: 0,\n# max,\n# }\n# }\n# # pub fn set_value(&mut self, value: usize) {\n# self.value = value;\n# # let percentage_of_max = self.value as f64 / self.max as f64;\n# # if percentage_of_max >= 1.0 {\n# self.messenger.send(\"Error: You are over your quota!\");\n# } else if percentage_of_max >= 0.9 {\n# self.messenger\n# .send(\"Urgent warning: You've used up over 90% of your quota!\");\n# } else if percentage_of_max >= 0.75 {\n# self.messenger\n# .send(\"Warning: You've used up over 75% of your quota!\");\n# }\n# }\n# }\n# #[cfg(test)]\nmod tests { use super::*; use std::cell::RefCell; struct MockMessenger { sent_messages: RefCell>, } impl MockMessenger { fn new() -> MockMessenger { MockMessenger { sent_messages: RefCell::new(vec![]), } } } impl Messenger for MockMessenger { fn send(&self, message: &str) { self.sent_messages.borrow_mut().push(String::from(message)); } } #[test] fn it_sends_an_over_75_percent_warning_message() { // --snip--\n# let mock_messenger = MockMessenger::new();\n# let mut limit_tracker = LimitTracker::new(&mock_messenger, 100);\n# # limit_tracker.set_value(80); assert_eq!(mock_messenger.sent_messages.borrow().len(), 1); }\n} 示例 15-22:使用 RefCell 能够在外部值被认为是不可变的情况下修改内部值 现在 sent_messages 字段的类型是 RefCell> 而不是 Vec。在 new 函数中新建了一个 RefCell> 实例替代空 vector。 对于 send 方法的实现,第一个参数仍为 self 的不可变借用,这是符合方法定义的。我们调用 self.sent_messages 中 RefCell 的 borrow_mut 方法来获取 RefCell 中值的可变引用,这是一个 vector。接着可以对 vector 的可变引用调用 push 以便记录测试过程中看到的消息。 最后必须做出的修改位于断言中:为了看到其内部 vector 中有多少个项,需要调用 RefCell 的 borrow 以获取 vector 的不可变引用。 现在我们见识了如何使用 RefCell,让我们研究一下它怎样工作的!","breadcrumbs":"智能指针 » RefCell 与内部可变性模式 » 内部可变性:不可变值的可变借用","id":"289","title":"内部可变性:不可变值的可变借用"},"29":{"body":"对于简单项目,Cargo 并不比 rustc 提供了更多的优势,不过随着开发的深入,终将证明其价值。一旦程序壮大到由多个文件组成,亦或者是需要其他的依赖,让 Cargo 协调构建过程就会简单得多。 即便 hello_cargo 项目十分简单,它现在也使用了很多在你之后的 Rust 生涯将会用到的实用工具。其实,要在任何已存在的项目上工作时,可以使用如下命令通过 Git 检出代码,移动到该项目目录并构建: $ git clone example.org/someproject\n$ cd someproject\n$ cargo build 关于更多 Cargo 的信息,请查阅 其文档 。","breadcrumbs":"入门指南 » Hello, Cargo! » 把 Cargo 当作习惯","id":"29","title":"把 Cargo 当作习惯"},"290":{"body":"当创建不可变和可变引用时,我们分别使用 & 和 &mut 语法。对于 RefCell 来说,则是 borrow 和 borrow_mut 方法,这属于 RefCell 安全 API 的一部分。borrow 方法返回 Ref 类型的智能指针,borrow_mut 方法返回 RefMut 类型的智能指针。这两个类型都实现了 Deref,所以可以当作常规引用对待。 RefCell 记录当前有多少个活动的 Ref 和 RefMut 智能指针。每次调用 borrow,RefCell 将活动的不可变借用计数加一。当 Ref 值离开作用域时,不可变借用计数减一。就像编译时借用规则一样,RefCell 在任何时候只允许有多个不可变借用或一个可变借用。 如果我们尝试违反这些规则,相比引用时的编译时错误,RefCell 的实现会在运行时出现 panic。示例 15-23 展示了对示例 15-22 中 send 实现的修改,这里我们故意尝试在相同作用域创建两个可变借用以便演示 RefCell 不允许我们在运行时这么做: 文件名:src/lib.rs # pub trait Messenger {\n# fn send(&self, msg: &str);\n# }\n# # pub struct LimitTracker<'a, T: Messenger> {\n# messenger: &'a T,\n# value: usize,\n# max: usize,\n# }\n# # impl<'a, T> LimitTracker<'a, T>\n# where\n# T: Messenger,\n# {\n# pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {\n# LimitTracker {\n# messenger,\n# value: 0,\n# max,\n# }\n# }\n# # pub fn set_value(&mut self, value: usize) {\n# self.value = value;\n# # let percentage_of_max = self.value as f64 / self.max as f64;\n# # if percentage_of_max >= 1.0 {\n# self.messenger.send(\"Error: You are over your quota!\");\n# } else if percentage_of_max >= 0.9 {\n# self.messenger\n# .send(\"Urgent warning: You've used up over 90% of your quota!\");\n# } else if percentage_of_max >= 0.75 {\n# self.messenger\n# .send(\"Warning: You've used up over 75% of your quota!\");\n# }\n# }\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# use std::cell::RefCell;\n# # struct MockMessenger {\n# sent_messages: RefCell>,\n# }\n# # impl MockMessenger {\n# fn new() -> MockMessenger {\n# MockMessenger {\n# sent_messages: RefCell::new(vec![]),\n# }\n# }\n# }\n# impl Messenger for MockMessenger { fn send(&self, message: &str) { let mut one_borrow = self.sent_messages.borrow_mut(); let mut two_borrow = self.sent_messages.borrow_mut(); one_borrow.push(String::from(message)); two_borrow.push(String::from(message)); } }\n# # #[test]\n# fn it_sends_an_over_75_percent_warning_message() {\n# let mock_messenger = MockMessenger::new();\n# let mut limit_tracker = LimitTracker::new(&mock_messenger, 100);\n# # limit_tracker.set_value(80);\n# # assert_eq!(mock_messenger.sent_messages.borrow().len(), 1);\n# }\n# } 示例 15-23:在同一作用域中创建两个可变引用并观察 RefCell panic 这里为 borrow_mut 返回的 RefMut 智能指针创建了 one_borrow 变量。接着用相同的方式在变量 two_borrow 创建了另一个可变借用。这会在相同作用域中创建两个可变引用,这是不允许的。当运行库的测试时,示例 15-23 编译时不会有任何错误,不过测试会失败: $ cargo test Compiling limit-tracker v0.1.0 (file:///projects/limit-tracker) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.91s Running unittests src/lib.rs (target/debug/deps/limit_tracker-e599811fa246dbde) running 1 test\ntest tests::it_sends_an_over_75_percent_warning_message ... FAILED failures: ---- tests::it_sends_an_over_75_percent_warning_message stdout ----\nthread 'tests::it_sends_an_over_75_percent_warning_message' panicked at src/lib.rs:60:53:\nalready borrowed: BorrowMutError\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::it_sends_an_over_75_percent_warning_message test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 注意代码 panic 和信息 already borrowed: BorrowMutError。这也就是 RefCell 如何在运行时处理违反借用规则的情况。 像我们这里这样选择在运行时捕获借用错误而不是编译时意味着会发现在开发过程的后期才会发现的潜在错误,甚至有可能发布到生产环境才会发现。还会因为在运行时而不是编译时记录借用而导致少量的运行时性能惩罚。然而,使用 RefCell 使得在只允许不可变值的上下文中编写修改自身以记录消息的 mock 对象成为可能。虽然有取舍,但是我们可以选择使用 RefCell 来获得比常规引用所能提供的更多的功能。","breadcrumbs":"智能指针 » RefCell 与内部可变性模式 » RefCell 在运行时记录借用","id":"290","title":"RefCell 在运行时记录借用"},"291":{"body":"RefCell 的一个常见用法是与 Rc 结合。回忆一下 Rc 允许对相同数据有多个所有者,不过只能提供数据的不可变访问。如果有一个储存了 RefCell 的 Rc 的话,就可以得到有多个所有者 并且 可以修改的值了! 例如,回忆示例 15-18 的 cons list 的例子中使用 Rc 使得多个列表共享另一个列表的所有权。因为 Rc 只存放不可变值,所以一旦创建了这些列表值后就不能修改。让我们加入 RefCell 来获得修改列表中值的能力。示例 15-24 展示了通过在 Cons 定义中使用 RefCell,我们就允许修改所有列表中的值了: 文件名:src/main.rs #[derive(Debug)]\nenum List { Cons(Rc>, Rc), Nil,\n} use crate::List::{Cons, Nil};\nuse std::cell::RefCell;\nuse std::rc::Rc; fn main() { let value = Rc::new(RefCell::new(5)); let a = Rc::new(Cons(Rc::clone(&value), Rc::new(Nil))); let b = Cons(Rc::new(RefCell::new(3)), Rc::clone(&a)); let c = Cons(Rc::new(RefCell::new(4)), Rc::clone(&a)); *value.borrow_mut() += 10; println!(\"a after = {a:?}\"); println!(\"b after = {b:?}\"); println!(\"c after = {c:?}\");\n} 示例 15-24:使用 Rc> 创建可以修改的 List 这里创建了一个 Rc> 实例并储存在变量 value 中以便之后直接访问。接着在 a 中用包含 value 的 Cons 成员创建了一个 List。需要克隆 value 以便 a 和 value 都能拥有其内部值 5 的所有权,而不是将所有权从 value 移动到 a 或者让 a 借用 value。 我们将列表 a 封装进了 Rc 这样当创建列表 b 和 c 时,它们都可以引用 a,正如示例 15-18 一样。 一旦创建了列表 a、b 和 c,我们将 value 的值加 10。为此对 value 调用了 borrow_mut,这里使用了第五章讨论的自动解引用功能( “-> 运算符到哪去了?” 部分)来解引用 Rc 以获取其内部的 RefCell 值。borrow_mut 方法返回 RefMut 智能指针,可以对其使用解引用运算符并修改其内部值。 当我们打印出 a、b 和 c 时,可以看到它们都拥有修改后的值 15 而不是 5: $ cargo run Compiling cons-list v0.1.0 (file:///projects/cons-list) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.63s Running `target/debug/cons-list`\na after = Cons(RefCell { value: 15 }, Nil)\nb after = Cons(RefCell { value: 3 }, Cons(RefCell { value: 15 }, Nil))\nc after = Cons(RefCell { value: 4 }, Cons(RefCell { value: 15 }, Nil)) 这是非常巧妙的!通过使用 RefCell,我们可以拥有一个表面上不可变的 List,不过可以使用 RefCell 中提供内部可变性的方法来在需要时修改数据。RefCell 的运行时借用规则检查也确实保护我们免于出现数据竞争——有时为了数据结构的灵活性而付出一些性能是值得的。注意 RefCell 不能用于多线程代码!Mutex 是一个线程安全版本的 RefCell ,我们会在第十六章讨论 Mutex。","breadcrumbs":"智能指针 » RefCell 与内部可变性模式 » 结合 Rc 和 RefCell 来拥有多个可变数据所有者","id":"291","title":"结合 Rc 和 RefCell 来拥有多个可变数据所有者"},"292":{"body":"ch15-06-reference-cycles.md commit c06006157b14b3d47b5c716fc392b77f3b2e21ce Rust 的内存安全性保证使其难以意外地制造永远也不会被清理的内存(被称为 内存泄漏 ( memory leak )),但并不是不可能。Rust 并不保证完全防止内存泄漏,这意味着内存泄漏在 Rust 中被认为是内存安全的。这一点可以通过 Rc 和 RefCell 看出:创建引用循环的可能性是存在的。这会造成内存泄漏,因为每一项的引用计数永远也到不了 0,持有的数据也就永远不会被释放。","breadcrumbs":"智能指针 » 引用循环会导致内存泄漏 » 引用循环与内存泄漏","id":"292","title":"引用循环与内存泄漏"},"293":{"body":"让我们看看引用循环是如何发生的以及如何避免它。以示例 15-25 中的 List 枚举和 tail 方法的定义开始: 文件名:src/main.rs use crate::List::{Cons, Nil};\nuse std::cell::RefCell;\nuse std::rc::Rc; #[derive(Debug)]\nenum List { Cons(i32, RefCell>), Nil,\n} impl List { fn tail(&self) -> Option<&RefCell>> { match self { Cons(_, item) => Some(item), Nil => None, } }\n} fn main() {} 示例 15-25: 一个存放 RefCell 的 cons list 定义,这样可以修改 Cons 成员所引用的数据 这里采用了示例 15-5 中 List 定义的另一种变体。现在 Cons 成员的第二个元素是 RefCell>,这意味着不同于像示例 15-24 那样能够修改 i32 的值,我们希望能够修改 Cons 成员所指向的 List。这里还增加了一个 tail 方法来方便我们在有 Cons 成员的时候访问其第二项。 在示例 15-26 中增加了一个 main 函数,其使用了示例 15-25 中的定义。这些代码在 a 中创建了一个列表,一个指向 a 中列表的 b 列表,接着修改 a 中的列表指向 b 中的列表,这会创建一个引用循环。在这个过程的多个位置有 println! 语句展示引用计数。 文件:src/main.rs # use crate::List::{Cons, Nil};\n# use std::cell::RefCell;\n# use std::rc::Rc;\n# # #[derive(Debug)]\n# enum List {\n# Cons(i32, RefCell>),\n# Nil,\n# }\n# # impl List {\n# fn tail(&self) -> Option<&RefCell>> {\n# match self {\n# Cons(_, item) => Some(item),\n# Nil => None,\n# }\n# }\n# }\n# fn main() { let a = Rc::new(Cons(5, RefCell::new(Rc::new(Nil)))); println!(\"a initial rc count = {}\", Rc::strong_count(&a)); println!(\"a next item = {:?}\", a.tail()); let b = Rc::new(Cons(10, RefCell::new(Rc::clone(&a)))); println!(\"a rc count after b creation = {}\", Rc::strong_count(&a)); println!(\"b initial rc count = {}\", Rc::strong_count(&b)); println!(\"b next item = {:?}\", b.tail()); if let Some(link) = a.tail() { *link.borrow_mut() = Rc::clone(&b); } println!(\"b rc count after changing a = {}\", Rc::strong_count(&b)); println!(\"a rc count after changing a = {}\", Rc::strong_count(&a)); // Uncomment the next line to see that we have a cycle; // it will overflow the stack // println!(\"a next item = {:?}\", a.tail());\n} 示例 15-26:创建一个引用循环:两个 List 值互相指向彼此 这里在变量 a 中创建了一个 Rc 实例来存放初值为 5, Nil 的 List 值。接着在变量 b 中创建了存放包含值 10 和指向列表 a 的 List 的另一个 Rc 实例。 最后,修改 a 使其指向 b 而不是 Nil,这就创建了一个循环。为此需要使用 tail 方法获取 a 中 RefCell> 的引用,并放入变量 link 中。接着使用 RefCell> 的 borrow_mut 方法将其值从存放 Nil 的 Rc 修改为 b 中的 Rc。 如果保持最后的 println! 行注释并运行代码,会得到如下输出: $ cargo run Compiling cons-list v0.1.0 (file:///projects/cons-list) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.53s Running `target/debug/cons-list`\na initial rc count = 1\na next item = Some(RefCell { value: Nil })\na rc count after b creation = 2\nb initial rc count = 1\nb next item = Some(RefCell { value: Cons(5, RefCell { value: Nil }) })\nb rc count after changing a = 2\na rc count after changing a = 2 可以看到将列表 a 修改为指向 b 之后, a 和 b 中的 Rc 实例的引用计数都是 2。在 main 的结尾,Rust 丢弃 b,这会使 b Rc 实例的引用计数从 2 减为 1。然而,b Rc 不能被回收,因为其引用计数是 1 而不是 0。接下来 Rust 会丢弃 a 将 a Rc 实例的引用计数从 2 减为 1。这个实例也不能被回收,因为 b Rc 实例依然引用它,所以其引用计数是 1。这些列表的内存将永远保持未被回收的状态。为了更形象的展示,我们创建了一个如图 15-4 所示的引用循环: 图 15-4: 列表 a 和 b 彼此互相指向形成引用循环 如果取消最后 println! 的注释并运行程序,Rust 会尝试打印出 a 指向 b 指向 a 这样的循环直到栈溢出。 相比真实世界的程序,这个例子中创建引用循环的结果并不可怕。创建了引用循环之后程序立刻就结束了。如果在更为复杂的程序中并在循环里分配了很多内存并占有很长时间,这个程序会使用多于它所需要的内存,并有可能压垮系统并造成没有内存可供使用。 创建引用循环并不容易,但也不是不可能。如果你有包含 Rc 的 RefCell 值或类似的嵌套结合了内部可变性和引用计数的类型,请务必小心确保你没有形成一个引用循环;你无法指望 Rust 帮你捕获它们。创建引用循环是一个程序上的逻辑 bug,你应该使用自动化测试、代码评审和其他软件开发最佳实践来使其最小化。 另一个解决方案是重新组织数据结构,使得一部分引用拥有所有权而另一部分没有。换句话说,循环将由一些拥有所有权的关系和一些无所有权的关系组成,只有所有权关系才能影响值是否可以被丢弃。在示例 15-25 中,我们总是希望 Cons 成员拥有其列表,所以重新组织数据结构是不可能的。让我们看看一个由父节点和子节点构成的图的例子,观察何时是使用无所有权的关系来避免引用循环的合适时机。","breadcrumbs":"智能指针 » 引用循环会导致内存泄漏 » 制造引用循环","id":"293","title":"制造引用循环"},"294":{"body":"到目前为止,我们已经展示了调用 Rc::clone 会增加 Rc 实例的 strong_count,和只在其 strong_count 为 0 时才会被清理的 Rc 实例。你也可以通过调用 Rc::downgrade 并传递 Rc 实例的引用来创建其值的 弱引用 ( weak reference )。强引用代表如何共享 Rc 实例的所有权。弱引用并不属于所有权关系,当 Rc 实例被清理时其计数没有影响。它们不会造成引用循环,因为任何涉及弱引用的循环会在其相关的值的强引用计数为 0 时被打断。 调用 Rc::downgrade 时会得到 Weak 类型的智能指针。不同于将 Rc 实例的 strong_count 加 1,调用 Rc::downgrade 会将 weak_count 加 1。Rc 类型使用 weak_count 来记录其存在多少个 Weak 引用,类似于 strong_count。其区别在于 weak_count 无需计数为 0 就能使 Rc 实例被清理。 强引用代表如何共享 Rc 实例的所有权,但弱引用并不属于所有权关系。它们不会造成引用循环,因为任何弱引用的循环会在其相关的强引用计数为 0 时被打断。 因为 Weak 引用的值可能已经被丢弃了,为了使用 Weak 所指向的值,我们必须确保其值仍然有效。为此可以调用 Weak 实例的 upgrade 方法,这会返回 Option>。如果 Rc 值还未被丢弃,则结果是 Some;如果 Rc 已被丢弃,则结果是 None。因为 upgrade 返回一个 Option>,Rust 会确保处理 Some 和 None 的情况,所以它不会返回非法指针。 我们会创建一个某项知道其子项和父项的树形结构的例子,而不是只知道其下一项的列表。 创建树形数据结构:带有子节点的 Node 在最开始,我们将会构建一个带有子节点的树。让我们创建一个用于存放其拥有所有权的 i32 值和其子节点引用的 Node: 文件名:src/main.rs use std::cell::RefCell;\nuse std::rc::Rc; #[derive(Debug)]\nstruct Node { value: i32, children: RefCell>>,\n}\n# # fn main() {\n# let leaf = Rc::new(Node {\n# value: 3,\n# children: RefCell::new(vec![]),\n# });\n# # let branch = Rc::new(Node {\n# value: 5,\n# children: RefCell::new(vec![Rc::clone(&leaf)]),\n# });\n# } 我们希望 Node 能够拥有其子节点,同时也希望能将所有权共享给变量,以便可以直接访问树中的每一个 Node,为此 Vec 的项的类型被定义为 Rc。我们还希望能修改其他节点的子节点,所以 children 中 Vec> 被放进了 RefCell。 接下来,使用此结构体定义来创建一个叫做 leaf 的带有值 3 且没有子节点的 Node 实例,和另一个带有值 5 并以 leaf 作为子节点的实例 branch,如示例 15-27 所示: 文件名:src/main.rs # use std::cell::RefCell;\n# use std::rc::Rc;\n# # #[derive(Debug)]\n# struct Node {\n# value: i32,\n# children: RefCell>>,\n# }\n# fn main() { let leaf = Rc::new(Node { value: 3, children: RefCell::new(vec![]), }); let branch = Rc::new(Node { value: 5, children: RefCell::new(vec![Rc::clone(&leaf)]), });\n} 示例 15-27:创建没有子节点的 leaf 节点和以 leaf 作为子节点的 branch 节点 这里克隆了 leaf 中的 Rc 并储存在 branch 中,这意味着 leaf 中的 Node 现在有两个所有者:leaf和branch。可以通过 branch.children 从 branch 中获得 leaf,不过无法从 leaf 到 branch。leaf 没有到 branch 的引用且并不知道它们相互关联。我们希望 leaf 知道 branch 是其父节点。稍后我们会这么做。 增加从子到父的引用 为了使子节点知道其父节点,需要在 Node 结构体定义中增加一个 parent 字段。问题是 parent 的类型应该是什么。我们知道其不能包含 Rc,因为这样 leaf.parent 将会指向 branch 而 branch.children 会包含 leaf 的指针,这会形成引用循环,会造成其 strong_count 永远也不会为 0。 现在换一种方式思考这个关系,父节点应该拥有其子节点:如果父节点被丢弃了,其子节点也应该被丢弃。然而子节点不应该拥有其父节点:如果丢弃子节点,其父节点应该依然存在。这正是弱引用的例子! 所以 parent 使用 Weak 类型而不是 Rc,具体来说是 RefCell>。现在 Node 结构体定义看起来像这样: 文件名:src/main.rs use std::cell::RefCell;\nuse std::rc::{Rc, Weak}; #[derive(Debug)]\nstruct Node { value: i32, parent: RefCell>, children: RefCell>>,\n}\n# # fn main() {\n# let leaf = Rc::new(Node {\n# value: 3,\n# parent: RefCell::new(Weak::new()),\n# children: RefCell::new(vec![]),\n# });\n# # println!(\"leaf parent = {:?}\", leaf.parent.borrow().upgrade());\n# # let branch = Rc::new(Node {\n# value: 5,\n# parent: RefCell::new(Weak::new()),\n# children: RefCell::new(vec![Rc::clone(&leaf)]),\n# });\n# # *leaf.parent.borrow_mut() = Rc::downgrade(&branch);\n# # println!(\"leaf parent = {:?}\", leaf.parent.borrow().upgrade());\n# } 这样,一个节点就能够引用其父节点,但不拥有其父节点。在示例 15-28 中,我们更新 main 来使用新定义以便 leaf 节点可以通过 branch 引用其父节点: 文件名:src/main.rs # use std::cell::RefCell;\n# use std::rc::{Rc, Weak};\n# # #[derive(Debug)]\n# struct Node {\n# value: i32,\n# parent: RefCell>,\n# children: RefCell>>,\n# }\n# fn main() { let leaf = Rc::new(Node { value: 3, parent: RefCell::new(Weak::new()), children: RefCell::new(vec![]), }); println!(\"leaf parent = {:?}\", leaf.parent.borrow().upgrade()); let branch = Rc::new(Node { value: 5, parent: RefCell::new(Weak::new()), children: RefCell::new(vec![Rc::clone(&leaf)]), }); *leaf.parent.borrow_mut() = Rc::downgrade(&branch); println!(\"leaf parent = {:?}\", leaf.parent.borrow().upgrade());\n} 示例 15-28:一个 leaf 节点,其拥有指向其父节点 branch 的 Weak 引用 创建 leaf 节点类似于示例 15-27,除了 parent 字段有所不同:leaf 开始时没有父节点,所以我们新建了一个空的 Weak 引用实例。 此时,当尝试使用 upgrade 方法获取 leaf 的父节点引用时,会得到一个 None 值。如第一个 println! 输出所示: leaf parent = None 当创建 branch 节点时,其也会新建一个 Weak 引用,因为 branch 并没有父节点。leaf 仍然作为 branch 的一个子节点。一旦在 branch 中有了 Node 实例,就可以修改 leaf 使其拥有指向父节点的 Weak 引用。这里使用了 leaf 中 parent 字段里的 RefCell> 的 borrow_mut 方法,接着使用了 Rc::downgrade 函数来从 branch 中的 Rc 值创建了一个指向 branch 的 Weak 引用。 当再次打印出 leaf 的父节点时,这一次将会得到存放了 branch 的 Some 值:现在 leaf 可以访问其父节点了!当打印出 leaf 时,我们也避免了如示例 15-26 中最终会导致栈溢出的循环:Weak 引用被打印为 (Weak): leaf parent = Some(Node { value: 5, parent: RefCell { value: (Weak) },\nchildren: RefCell { value: [Node { value: 3, parent: RefCell { value: (Weak) },\nchildren: RefCell { value: [] } }] } }) 没有无限的输出表明这段代码并没有造成引用循环。这一点也可以从观察 Rc::strong_count 和 Rc::weak_count 调用的结果看出。 可视化 strong_count 和 weak_count 的改变 让我们通过创建了一个新的内部作用域并将 branch 的创建放入其中,来观察 Rc 实例的 strong_count 和 weak_count 值的变化。这会展示当 branch 创建和离开作用域被丢弃时会发生什么。这些修改如示例 15-29 所示: 文件名:src/main.rs # use std::cell::RefCell;\n# use std::rc::{Rc, Weak};\n# # #[derive(Debug)]\n# struct Node {\n# value: i32,\n# parent: RefCell>,\n# children: RefCell>>,\n# }\n# fn main() { let leaf = Rc::new(Node { value: 3, parent: RefCell::new(Weak::new()), children: RefCell::new(vec![]), }); println!( \"leaf strong = {}, weak = {}\", Rc::strong_count(&leaf), Rc::weak_count(&leaf), ); { let branch = Rc::new(Node { value: 5, parent: RefCell::new(Weak::new()), children: RefCell::new(vec![Rc::clone(&leaf)]), }); *leaf.parent.borrow_mut() = Rc::downgrade(&branch); println!( \"branch strong = {}, weak = {}\", Rc::strong_count(&branch), Rc::weak_count(&branch), ); println!( \"leaf strong = {}, weak = {}\", Rc::strong_count(&leaf), Rc::weak_count(&leaf), ); } println!(\"leaf parent = {:?}\", leaf.parent.borrow().upgrade()); println!( \"leaf strong = {}, weak = {}\", Rc::strong_count(&leaf), Rc::weak_count(&leaf), );\n} 示例 15-29:在内部作用域创建 branch 并检查其强弱引用计数 一旦创建了 leaf,其 Rc 的强引用计数为 1,弱引用计数为 0。在内部作用域中创建了 branch 并与 leaf 相关联,此时 branch 中 Rc 的强引用计数为 1,弱引用计数为 1(因为 leaf.parent 通过 Weak 指向 branch)。这里 leaf 的强引用计数为 2,因为现在 branch 的 branch.children 中储存了 leaf 的 Rc 的拷贝,不过弱引用计数仍然为 0。 当内部作用域结束时,branch 离开作用域,Rc 的强引用计数减少为 0,所以其 Node 被丢弃。来自 leaf.parent 的弱引用计数 1 与 Node 是否被丢弃无关,所以并没有产生任何内存泄漏! 如果在内部作用域结束后尝试访问 leaf 的父节点,会再次得到 None。在程序的结尾,leaf 中 Rc 的强引用计数为 1,弱引用计数为 0,因为现在 leaf 又是 Rc 唯一的引用了。 所有这些管理计数和值的逻辑都内建于 Rc 和 Weak 以及它们的 Drop trait 实现中。通过在 Node 定义中指定从子节点到父节点的关系为一个Weak引用,就能够拥有父节点和子节点之间的双向引用而不会造成引用循环和内存泄漏。","breadcrumbs":"智能指针 » 引用循环会导致内存泄漏 » 避免引用循环:将 Rc 变为 Weak","id":"294","title":"避免引用循环:将 Rc 变为 Weak"},"295":{"body":"这一章涵盖了如何使用智能指针来做出不同于 Rust 常规引用默认所提供的保证与取舍。Box 有一个已知的大小并指向分配在堆上的数据。Rc 记录了堆上数据的引用数量以便可以拥有多个所有者。RefCell 和其内部可变性提供了一个可以用于当需要不可变类型但是需要改变其内部值能力的类型,并在运行时而不是编译时检查借用规则。 我们还介绍了提供了很多智能指针功能的 trait Deref 和 Drop。同时探索了会造成内存泄漏的引用循环,以及如何使用 Weak 来避免它们。 如果本章内容引起了你的兴趣并希望现在就实现你自己的智能指针的话,请阅读 “The Rustonomicon” 来获取更多有用的信息。 接下来,让我们谈谈 Rust 的并发。届时甚至还会学习到一些新的对并发有帮助的智能指针。","breadcrumbs":"智能指针 » 引用循环会导致内存泄漏 » 总结","id":"295","title":"总结"},"296":{"body":"ch16-00-concurrency.md commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f 安全且高效地处理并发编程是 Rust 的另一个主要目标。 并发编程 ( Concurrent programming ),代表程序的不同部分相互独立地执行,而 并行编程 ( parallel programming )代表程序不同部分同时执行,这两个概念随着计算机越来越多的利用多处理器的优势而显得愈发重要。由于历史原因,在此类上下文中编程一直是困难且容易出错的:Rust 希望能改变这一点。 起初,Rust 团队认为确保内存安全和防止并发问题是两个分别需要不同方法应对的挑战。随着时间的推移,团队发现所有权和类型系统是一系列解决内存安全 和 并发问题的强有力的工具!通过利用所有权和类型检查,在 Rust 中很多并发错误都是 编译时 错误,而非运行时错误。因此,相比花费大量时间尝试重现运行时并发 bug 出现的特定情况,Rust 会拒绝编译不正确的代码并提供解释问题的错误信息。因此,你可以在开发时修复代码,而不是在部署到生产环境后修复代码。我们给 Rust 的这一部分起了一个绰号 无畏并发 ( fearless concurrency )。无畏并发令你的代码免于出现诡异的 bug 并可以轻松重构且无需担心会引入新的 bug。 注意:出于简洁的考虑,我们将很多问题归类为 并发 ,而不是更准确的区分 并发和(或)并行 。如果这是一本专注于并发和/或并行的书,我们肯定会更加精确的。对于本章,当我们谈到 并发 时,请自行脑内替换为 并发和(或)并行 。 很多语言所提供的处理并发问题的解决方法都非常有特色。例如,Erlang 有着优雅的消息传递并发功能,但只有模糊不清的在线程间共享状态的方法。对于高级语言来说,只实现可能解决方案的子集是一个合理的策略,因为高级语言所许诺的价值来源于牺牲一些控制来换取抽象。然而对于底层语言则期望提供在任何给定的情况下有着最高的性能且对硬件有更少的抽象。因此,Rust 提供了多种工具,以符合实际情况和需求的方式来为问题建模。 如下是本章将要涉及到的内容: 如何创建线程来同时运行多段代码。 消息传递 ( Message passing )并发,其中信道(channel)被用来在线程间传递消息。 共享状态 ( Shared state )并发,其中多个线程可以访问同一片数据。 Sync 和 Send trait,将 Rust 的并发保证扩展到用户定义的以及标准库提供的类型中。","breadcrumbs":"无畏并发 » 无畏并发","id":"296","title":"无畏并发"},"297":{"body":"ch16-01-threads.md commit 8aecae3efe5ca8f79f055b70f05d9a3f990bce7b 在大部分现代操作系统中,已执行程序的代码在一个 进程 ( process )中运行,操作系统则会负责管理多个进程。在程序内部,也可以拥有多个同时运行的独立部分。这些运行这些独立部分的功能被称为 线程 ( threads )。例如,web 服务器可以有多个线程以便可以同时响应多个请求。 将程序中的计算拆分进多个线程可以改善性能,因为程序可以同时进行多个任务,不过这也会增加复杂性。因为线程是同时运行的,所以无法预先保证不同线程中的代码的执行顺序。这会导致诸如此类的问题: 竞态条件(Race conditions),多个线程以不一致的顺序访问数据或资源 死锁(Deadlocks),两个线程相互等待对方,这会阻止两者继续运行 只会发生在特定情况且难以稳定重现和修复的 bug Rust 尝试减轻使用线程的负面影响。不过在多线程上下文中编程仍需格外小心,同时其所要求的代码结构也不同于运行于单线程的程序。 编程语言有一些不同的方法来实现线程,而且很多操作系统提供了创建新线程的 API。Rust 标准库使用 1:1 线程实现,这代表程序的每一个语言级线程使用一个系统线程。有一些 crate 实现了其他有着不同于 1:1 模型取舍的线程模型。","breadcrumbs":"无畏并发 » 使用线程同时地运行代码 » 使用线程同时运行代码","id":"297","title":"使用线程同时运行代码"},"298":{"body":"为了创建一个新线程,需要调用 thread::spawn 函数并传递一个闭包(第十三章学习了闭包),并在其中包含希望在新线程运行的代码。示例 16-1 中的例子在主线程打印了一些文本而另一些文本则由新线程打印: 文件名:src/main.rs use std::thread;\nuse std::time::Duration; fn main() { thread::spawn(|| { for i in 1..10 { println!(\"hi number {i} from the spawned thread!\"); thread::sleep(Duration::from_millis(1)); } }); for i in 1..5 { println!(\"hi number {i} from the main thread!\"); thread::sleep(Duration::from_millis(1)); }\n} 示例 16-1: 创建一个打印某些内容的新线程,但是主线程打印其它内容 注意当 Rust 程序的主线程结束时,新线程也会结束,而不管其是否执行完毕。这个程序的输出可能每次都略有不同,不过它大体上看起来像这样: hi number 1 from the main thread!\nhi number 1 from the spawned thread!\nhi number 2 from the main thread!\nhi number 2 from the spawned thread!\nhi number 3 from the main thread!\nhi number 3 from the spawned thread!\nhi number 4 from the main thread!\nhi number 4 from the spawned thread!\nhi number 5 from the spawned thread! thread::sleep 调用强制线程停止执行一小段时间,这会允许其他不同的线程运行。这些线程可能会轮流运行,不过并不保证如此:这依赖操作系统如何调度线程。在这里,主线程首先打印,即便新创建线程的打印语句位于程序的开头,甚至即便我们告诉新建的线程打印直到 i 等于 9,它在主线程结束之前也只打印到了 5。 如果运行代码只看到了主线程的输出,或没有出现重叠打印的现象,尝试增大区间 (变量 i 的范围) 来增加操作系统切换线程的机会。 使用 join 等待所有线程结束 由于主线程结束,示例 16-1 中的代码大部分时候不光会提早结束新建线程,因为无法保证线程运行的顺序,我们甚至不能实际保证新建线程会被执行! 可以通过将 thread::spawn 的返回值储存在变量中来修复新建线程部分没有执行或者完全没有执行的问题。thread::spawn 的返回值类型是 JoinHandle。JoinHandle 是一个拥有所有权的值,当对其调用 join 方法时,它会等待其线程结束。示例 16-2 展示了如何使用示例 16-1 中创建的线程的 JoinHandle 并调用 join 来确保新建线程在 main 退出前结束运行: 文件名:src/main.rs use std::thread;\nuse std::time::Duration; fn main() { let handle = thread::spawn(|| { for i in 1..10 { println!(\"hi number {i} from the spawned thread!\"); thread::sleep(Duration::from_millis(1)); } }); for i in 1..5 { println!(\"hi number {i} from the main thread!\"); thread::sleep(Duration::from_millis(1)); } handle.join().unwrap();\n} 示例 16-2: 从 thread::spawn 保存一个 JoinHandle 以确保该线程能够运行至结束 通过调用 handle 的 join 会阻塞当前线程直到 handle 所代表的线程结束。 阻塞 ( Blocking )线程意味着阻止该线程执行工作或退出。因为我们将 join 调用放在了主线程的 for 循环之后,运行示例 16-2 应该会产生类似这样的输出: hi number 1 from the main thread!\nhi number 2 from the main thread!\nhi number 1 from the spawned thread!\nhi number 3 from the main thread!\nhi number 2 from the spawned thread!\nhi number 4 from the main thread!\nhi number 3 from the spawned thread!\nhi number 4 from the spawned thread!\nhi number 5 from the spawned thread!\nhi number 6 from the spawned thread!\nhi number 7 from the spawned thread!\nhi number 8 from the spawned thread!\nhi number 9 from the spawned thread! 这两个线程仍然会交替执行,不过主线程会由于 handle.join() 调用会等待直到新建线程执行完毕。 不过让我们看看将 handle.join() 移动到 main 中 for 循环之前会发生什么,如下: 文件名:src/main.rs use std::thread;\nuse std::time::Duration; fn main() { let handle = thread::spawn(|| { for i in 1..10 { println!(\"hi number {i} from the spawned thread!\"); thread::sleep(Duration::from_millis(1)); } }); handle.join().unwrap(); for i in 1..5 { println!(\"hi number {i} from the main thread!\"); thread::sleep(Duration::from_millis(1)); }\n} 主线程会等待直到新建线程执行完毕之后才开始执行 for 循环,所以输出将不会交替出现,如下所示: hi number 1 from the spawned thread!\nhi number 2 from the spawned thread!\nhi number 3 from the spawned thread!\nhi number 4 from the spawned thread!\nhi number 5 from the spawned thread!\nhi number 6 from the spawned thread!\nhi number 7 from the spawned thread!\nhi number 8 from the spawned thread!\nhi number 9 from the spawned thread!\nhi number 1 from the main thread!\nhi number 2 from the main thread!\nhi number 3 from the main thread!\nhi number 4 from the main thread! 诸如将 join 放置于何处这样的小细节,会影响线程是否同时运行。","breadcrumbs":"无畏并发 » 使用线程同时地运行代码 » 使用 spawn 创建新线程","id":"298","title":"使用 spawn 创建新线程"},"299":{"body":"move 关键字经常用于传递给 thread::spawn 的闭包,因为闭包会获取从环境中取得的值的所有权,因此会将这些值的所有权从一个线程传送到另一个线程。在第十三章 “闭包会捕获其环境” 部分讨论了闭包上下文中的 move。现在我们会更专注于 move 和 thread::spawn 之间的交互。 在第十三章中,我们讲到可以在参数列表前使用 move 关键字强制闭包获取其使用的环境值的所有权。这个技巧在创建新线程将值的所有权从一个线程移动到另一个线程时最为实用。 注意示例 16-1 中传递给 thread::spawn 的闭包并没有任何参数:并没有在新建线程代码中使用任何主线程的数据。为了在新建线程中使用来自于主线程的数据,需要新建线程的闭包获取它需要的值。示例 16-3 展示了一个尝试在主线程中创建一个 vector 并用于新建线程的例子,不过这么写还不能工作,如下所示: 文件名:src/main.rs use std::thread; fn main() { let v = vec![1, 2, 3]; let handle = thread::spawn(|| { println!(\"Here's a vector: {v:?}\"); }); handle.join().unwrap();\n} 示例 16-3: 尝试在另一个线程使用主线程创建的 vector 闭包使用了 v,所以闭包会捕获 v 并使其成为闭包环境的一部分。因为 thread::spawn 在一个新线程中运行这个闭包,所以可以在新线程中访问 v。然而当编译这个例子时,会得到如下错误: $ cargo run Compiling threads v0.1.0 (file:///projects/threads)\nerror[E0373]: closure may outlive the current function, but it borrows `v`, which is owned by the current function --> src/main.rs:6:32 |\n6 | let handle = thread::spawn(|| { | ^^ may outlive borrowed value `v`\n7 | println!(\"Here's a vector: {v:?}\"); | - `v` is borrowed here |\nnote: function requires argument type to outlive `'static` --> src/main.rs:6:18 |\n6 | let handle = thread::spawn(|| { | __________________^\n7 | | println!(\"Here's a vector: {v:?}\");\n8 | | }); | |______^\nhelp: to force the closure to take ownership of `v` (and any other referenced variables), use the `move` keyword |\n6 | let handle = thread::spawn(move || { | ++++ For more information about this error, try `rustc --explain E0373`.\nerror: could not compile `threads` (bin \"threads\") due to 1 previous error Rust 会 推断 如何捕获 v,因为 println! 只需要 v 的引用,闭包尝试借用 v。然而这有一个问题:Rust 不知道这个新建线程会执行多久,所以无法知晓对 v 的引用是否一直有效。 示例 16-4 展示了一个 v 的引用很有可能不再有效的场景: 文件名:src/main.rs use std::thread; fn main() { let v = vec![1, 2, 3]; let handle = thread::spawn(|| { println!(\"Here's a vector: {v:?}\"); }); drop(v); // oh no! handle.join().unwrap();\n} 示例 16-4: 一个具有闭包的线程,尝试使用一个在主线程中被回收的引用 v 如果 Rust 允许这段代码运行,则新建线程则可能会立刻被转移到后台并完全没有机会运行。新建线程内部有一个 v 的引用,不过主线程立刻就使用第十五章讨论的 drop 丢弃了 v。接着当新建线程开始执行,v 已不再有效,所以其引用也是无效的。噢,这太糟了! 为了修复示例 16-3 的编译错误,我们可以听取错误信息的建议: help: to force the closure to take ownership of `v` (and any other referenced variables), use the `move` keyword |\n6 | let handle = thread::spawn(move || { | ++++ 通过在闭包之前增加 move 关键字,我们强制闭包获取其使用的值的所有权,而不是任由 Rust 推断它应该借用值。示例 16-5 中展示的对示例 16-3 代码的修改,可以按照我们的预期编译并运行: 文件名:src/main.rs use std::thread; fn main() { let v = vec![1, 2, 3]; let handle = thread::spawn(move || { println!(\"Here's a vector: {v:?}\"); }); handle.join().unwrap();\n} 示例 16-5: 使用 move 关键字强制获取它使用的值的所有权 我们可能希望尝试同样的方法来修复示例 16-4 中的代码,其主线程使用 move 闭包调用了 drop。然而这个修复行不通,因为示例 16-4 所尝试的操作由于一个不同的原因而不被允许。如果为闭包增加 move,将会把 v 移动进闭包的环境中,如此将不能在主线程中对其调用 drop 了。我们会得到如下不同的编译错误: $ cargo run Compiling threads v0.1.0 (file:///projects/threads)\nerror[E0382]: use of moved value: `v` --> src/main.rs:10:10 |\n4 | let v = vec![1, 2, 3]; | - move occurs because `v` has type `Vec`, which does not implement the `Copy` trait\n5 |\n6 | let handle = thread::spawn(move || { | ------- value moved into closure here\n7 | println!(\"Here's a vector: {v:?}\"); | - variable moved due to use in closure\n...\n10 | drop(v); // oh no! | ^ value used here after move For more information about this error, try `rustc --explain E0382`.\nerror: could not compile `threads` (bin \"threads\") due to 1 previous error Rust 的所有权规则又一次帮助了我们!示例 16-3 中的错误是因为 Rust 是保守的并只会为线程借用 v,这意味着主线程理论上可能使新建线程的引用无效。通过告诉 Rust 将 v 的所有权移动到新建线程,我们向 Rust 保证主线程不会再使用 v。如果对示例 16-4 也做出如此修改,那么当在主线程中使用 v 时就会违反所有权规则。 move 关键字覆盖了 Rust 默认保守的借用,但它不允许我们违反所有权规则。 现在我们对线程和线程 API 有了基本的了解,让我们讨论一下使用线程实际可以 做 什么吧。","breadcrumbs":"无畏并发 » 使用线程同时地运行代码 » 将 move 闭包与线程一同使用","id":"299","title":"将 move 闭包与线程一同使用"},"3":{"body":"Rust 因多种原因适合许多人。让我们看看几个最重要的群体。","breadcrumbs":"简介 » Rust 适合哪些人","id":"3","title":"Rust 适合哪些人"},"30":{"body":"你已经准备好开启 Rust 之旅了!在本章中,你学习了如何: 使用 rustup 安装最新稳定版的 Rust 更新到新版的 Rust 打开本地安装的文档 直接通过 rustc 编写并运行 Hello, world! 程序 使用 Cargo 创建并运行新项目 是时候通过构建更实质性的程序来熟悉读写 Rust 代码了。所以在第二章我们会构建一个猜猜看游戏程序。如果你更愿意从学习 Rust 常用的编程概念开始,请阅读第三章,接着再回到第二章。","breadcrumbs":"入门指南 » Hello, Cargo! » 总结","id":"30","title":"总结"},"300":{"body":"ch16-02-message-passing.md commit 36383b4da21dbd0a0781473bc8ad7ef0ed1b6751 一个日益流行的确保安全并发的方式是 消息传递 ( message passing ),这里线程或 actor 通过发送包含数据的消息来相互沟通。这个思想来源于 Go 编程语言文档中 的口号:“不要通过共享内存来通讯;而是通过通讯来共享内存。”(“Do not communicate by sharing memory; instead, share memory by communicating.”) 为了实现消息传递并发,Rust 标准库提供了一个 信道 ( channel )实现。信道是一个通用编程概念,表示数据从一个线程发送到另一个线程。 你可以将编程中的信道想象为一个水流的渠道,比如河流或小溪。如果你将诸如橡皮鸭或小船之类的东西放入其中,它们会顺流而下到达下游。 编程中的信息渠道(信道)有两部分组成,一个发送者(transmitter)和一个接收者(receiver)。发送者位于上游位置,在这里可以将橡皮鸭放入河中,接收者则位于下游,橡皮鸭最终会漂流至此。代码中的一部分调用发送者的方法以及希望发送的数据,另一部分则检查接收端收到的消息。当发送者或接收者任一被丢弃时可以认为信道被 关闭 ( closed )了。 这里,我们将开发一个程序,它会在一个线程生成值向信道发送,而在另一个线程会接收值并打印出来。这里会通过信道在线程间发送简单值来演示这个功能。一旦你熟悉了这项技术,你就可以将信道用于任何相互通信的任何线程,例如一个聊天系统,或利用很多线程进行分布式计算并将部分计算结果发送给一个线程进行聚合。 首先,在示例 16-6 中,创建了一个信道但没有做任何事。注意这还不能编译,因为 Rust 不知道我们想要在信道中发送什么类型: 文件名:src/main.rs use std::sync::mpsc; fn main() { let (tx, rx) = mpsc::channel();\n} 示例 16-6: 创建一个信道,并将其两端赋值给 tx 和 rx 这里使用 mpsc::channel 函数创建一个新的信道;mpsc 是 多个生产者,单个消费者 ( multiple producer, single consumer )的缩写。简而言之,Rust 标准库实现信道的方式意味着一个信道可以有多个产生值的 发送 ( sending )端,但只能有一个消费这些值的 接收 ( receiving )端。想象一下多条小河小溪最终汇聚成大河:所有通过这些小河发出的东西最后都会来到下游的大河。目前我们以单个生产者开始,但是当示例可以工作后会增加多个生产者。 mpsc::channel 函数返回一个元组:第一个元素是发送端 -- 发送者,而第二个元素是接收端 -- 接收者。由于历史原因,tx 和 rx 通常作为 发送者 ( transmitter )和 接收者 ( receiver )的缩写,所以这就是我们将用来绑定这两端变量的名字。这里使用了一个 let 语句和模式来解构了此元组;第十九章会讨论 let 语句中的模式和解构。现在只需知道使用 let 语句是一个方便提取 mpsc::channel 返回的元组中一部分的手段。 让我们将发送端移动到一个新建线程中并发送一个字符串,这样新建线程就可以和主线程通讯了,如示例 16-7 所示。这类似于在河的上游扔下一只橡皮鸭或从一个线程向另一个线程发送聊天信息: 文件名:src/main.rs use std::sync::mpsc;\nuse std::thread; fn main() { let (tx, rx) = mpsc::channel(); thread::spawn(move || { let val = String::from(\"hi\"); tx.send(val).unwrap(); });\n} 示例 16-7: 将 tx 移动到一个新建的线程中并发送 “hi” 这里再次使用 thread::spawn 来创建一个新线程并使用 move 将 tx 移动到闭包中这样新建线程就拥有 tx 了。新建线程需要拥有信道的发送端以便能向信道发送消息。信道的发送端有一个 send 方法用来获取需要放入信道的值。send 方法返回一个 Result 类型,所以如果接收端已经被丢弃了,将没有发送值的目标,所以发送操作会返回错误。在这个例子中,出错的时候调用 unwrap 产生 panic。不过对于一个真实程序,需要合理地处理它:回到第九章复习正确处理错误的策略。 在示例 16-8 中,我们在主线程中从信道的接收者获取值。这类似于在河的下游捞起橡皮鸭或接收聊天信息: 文件名:src/main.rs use std::sync::mpsc;\nuse std::thread; fn main() { let (tx, rx) = mpsc::channel(); thread::spawn(move || { let val = String::from(\"hi\"); tx.send(val).unwrap(); }); let received = rx.recv().unwrap(); println!(\"Got: {received}\");\n} 示例 16-8: 在主线程中接收并打印内容 “hi” 信道的接收者有两个有用的方法:recv 和 try_recv。这里,我们使用了 recv,它是 receive 的缩写。这个方法会阻塞主线程执行直到从信道中接收一个值。一旦发送了一个值,recv 会在一个 Result 中返回它。当信道发送端关闭,recv 会返回一个错误表明不会再有新的值到来了。 try_recv 不会阻塞,相反它立刻返回一个 Result:Ok 值包含可用的信息,而 Err 值代表此时没有任何消息。如果线程在等待消息过程中还有其他工作时使用 try_recv 很有用:可以编写一个循环来频繁调用 try_recv,在有可用消息时进行处理,其余时候则处理一会其他工作直到再次检查。 出于简单的考虑,这个例子使用了 recv;主线程中除了等待消息之外没有任何其他工作,所以阻塞主线程是合适的。 如果运行示例 16-8 中的代码,我们将会看到主线程打印出这个值: Got: hi 完美!","breadcrumbs":"无畏并发 » 使用消息传递在线程间通信 » 使用消息传递在线程间传送数据","id":"300","title":"使用消息传递在线程间传送数据"},"301":{"body":"所有权规则在消息传递中扮演了重要角色,其有助于我们编写安全的并发代码。防止并发编程中的错误是在 Rust 程序中考虑所有权的一大优势。现在让我们做一个试验来看看信道与所有权如何一同协作以避免产生问题:我们将尝试在新建线程中的信道中发送完 val 值 之后 再使用它。尝试编译示例 16-9 中的代码并看看为何这是不允许的: 文件名:src/main.rs use std::sync::mpsc;\nuse std::thread; fn main() { let (tx, rx) = mpsc::channel(); thread::spawn(move || { let val = String::from(\"hi\"); tx.send(val).unwrap(); println!(\"val is {val}\"); }); let received = rx.recv().unwrap(); println!(\"Got: {received}\");\n} 示例 16-9: 在我们已经发送到信道中后,尝试使用 val 引用 这里尝试在通过 tx.send 发送 val 到信道中之后将其打印出来。允许这么做是一个坏主意:一旦将值发送到另一个线程后,那个线程可能会在我们再次使用它之前就将其修改或者丢弃。其他线程对值可能的修改会由于不一致或不存在的数据而导致错误或意外的结果。然而,尝试编译示例 16-9 的代码时,Rust 会给出一个错误: $ cargo run Compiling message-passing v0.1.0 (file:///projects/message-passing)\nerror[E0382]: borrow of moved value: `val` --> src/main.rs:10:26 |\n8 | let val = String::from(\"hi\"); | --- move occurs because `val` has type `String`, which does not implement the `Copy` trait\n9 | tx.send(val).unwrap(); | --- value moved here\n10 | println!(\"val is {val}\"); | ^^^^^ value borrowed here after move | = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info) For more information about this error, try `rustc --explain E0382`.\nerror: could not compile `message-passing` (bin \"message-passing\") due to 1 previous error 我们的并发错误会造成一个编译时错误。send 函数获取其参数的所有权并移动这个值归接收者所有。这可以防止在发送后再次意外地使用这个值;所有权系统检查一切是否合乎规则。","breadcrumbs":"无畏并发 » 使用消息传递在线程间通信 » 信道与所有权转移","id":"301","title":"信道与所有权转移"},"302":{"body":"示例 16-8 中的代码可以编译和运行,不过它并没有明确的告诉我们两个独立的线程通过信道相互通讯。示例 16-10 则有一些改进会证明示例 16-8 中的代码是并发执行的:新建线程现在会发送多个消息并在每个消息之间暂停一秒钟。 文件名:src/main.rs use std::sync::mpsc;\nuse std::thread;\nuse std::time::Duration; fn main() { let (tx, rx) = mpsc::channel(); thread::spawn(move || { let vals = vec![ String::from(\"hi\"), String::from(\"from\"), String::from(\"the\"), String::from(\"thread\"), ]; for val in vals { tx.send(val).unwrap(); thread::sleep(Duration::from_secs(1)); } }); for received in rx { println!(\"Got: {received}\"); }\n} 示例 16-10: 发送多个消息,并在每次发送后暂停一段时间 这一次,在新建线程中有一个字符串 vector 希望发送到主线程。我们遍历它们,单独的发送每一个字符串并通过一个 Duration 值调用 thread::sleep 函数来暂停一秒。 在主线程中,不再显式调用 recv 函数:而是将 rx 当作一个迭代器。对于每一个接收到的值,我们将其打印出来。当信道被关闭时,迭代器也将结束。 当运行示例 16-10 中的代码时,将看到如下输出,每一行都会暂停一秒: Got: hi\nGot: from\nGot: the\nGot: thread 因为主线程中的 for 循环里并没有任何暂停或等待的代码,所以可以说主线程是在等待从新建线程中接收值。","breadcrumbs":"无畏并发 » 使用消息传递在线程间通信 » 发送多个值并观察接收者的等待","id":"302","title":"发送多个值并观察接收者的等待"},"303":{"body":"之前我们提到了mpsc是 multiple producer, single consumer 的缩写。可以运用 mpsc 来扩展示例 16-10 中的代码来创建向同一接收者发送值的多个线程。这可以通过克隆发送者来做到,如示例 16-11 所示: 文件名:src/main.rs # use std::sync::mpsc;\n# use std::thread;\n# use std::time::Duration;\n# # fn main() { // --snip-- let (tx, rx) = mpsc::channel(); let tx1 = tx.clone(); thread::spawn(move || { let vals = vec![ String::from(\"hi\"), String::from(\"from\"), String::from(\"the\"), String::from(\"thread\"), ]; for val in vals { tx1.send(val).unwrap(); thread::sleep(Duration::from_secs(1)); } }); thread::spawn(move || { let vals = vec![ String::from(\"more\"), String::from(\"messages\"), String::from(\"for\"), String::from(\"you\"), ]; for val in vals { tx.send(val).unwrap(); thread::sleep(Duration::from_secs(1)); } }); for received in rx { println!(\"Got: {received}\"); } // --snip--\n# } 示例 16-11: 从多个生产者发送多个消息 这一次,在创建新线程之前,我们对发送者调用了 clone 方法。这会给我们一个可以传递给第一个新建线程的发送端句柄。我们会将原始的信道发送端传递给第二个新建线程。这样就会有两个线程,每个线程将向信道的接收端发送不同的消息。 如果运行这些代码,你 可能 会看到这样的输出: Got: hi\nGot: more\nGot: from\nGot: messages\nGot: for\nGot: the\nGot: thread\nGot: you 虽然你可能会看到这些值以不同的顺序出现;这依赖于你的系统。这也就是并发既有趣又困难的原因。如果通过 thread::sleep 做实验,在不同的线程中提供不同的值,就会发现它们的运行更加不确定,且每次都会产生不同的输出。 现在我们见识过了信道如何工作,再看看另一种不同的并发方式吧。","breadcrumbs":"无畏并发 » 使用消息传递在线程间通信 » 通过克隆发送者来创建多个生产者","id":"303","title":"通过克隆发送者来创建多个生产者"},"304":{"body":"ch16-03-shared-state.md commit 856d89c53a6d69470bb5669c773fdfe6aab6fcc9 消息传递是一个很好的处理并发的方式,但并不是唯一一个。另一种方式是让多个线程访问同一块内存中的数据(共享状态)。再考虑一下 Go 语言文档中的这句口号:“不要通过共享内存来通讯”(“do not communicate by sharing memory.” 通过共享内存进行通信,会是什么样的代码?此外,为什么喜欢消息传递的人会警告:谨慎使用内存共享? 在某种程度上,任何编程语言中的信道都类似于单所有权,因为一旦将一个值传送到信道中,将无法再使用这个值。共享内存类似于多所有权:多个线程可以同时访问相同的内存位置。在 15 章中,我们介绍了智能指针可以实现多所有权,然而这会增加额外的复杂性,因为需要管理多个所有者。Rust 的类型系统和所有权规则在正确管理这些问题上提供了极大的帮助:举个例子,让我们来看看 互斥器 ,一个较常见的共享内存并发原语。","breadcrumbs":"无畏并发 » 共享状态并发 » 共享状态的并发","id":"304","title":"共享状态的并发"},"305":{"body":"互斥器 ( mutex )是 互相排斥( mutual exclusion )的缩写。在同一时刻,其只允许一个线程对数据拥有访问权。为了访问互斥器中的数据,线程首先需要通过获取互斥器的 锁 ( lock )来表明其希望访问数据。锁是一个数据结构,作为互斥器的一部分,它记录谁有数据的专属访问权。因此我们讲,互斥器通过锁系统 保护 ( guarding )其数据。 互斥器以难以使用著称(译注:原文指互斥器在其他编程语言中难以使用),因为你必须记住: 在使用数据之前,必须获取锁。 使用完被互斥器所保护的数据之后,必须解锁数据,这样其他线程才能够获取锁。 作为一个现实中互斥器的例子,想象一下在某个会议的一次小组座谈会中,只有一个麦克风。如果一位成员要发言,他必须请求或表示希望使用麦克风。得到了麦克风后,他可以畅所欲言,讲完后再将麦克风交给下一位希望讲话的成员。如果一位成员结束发言后忘记将麦克风交还,其他人将无法发言。如果对共享麦克风的管理出现了问题,座谈会将无法正常进行! 正确的管理互斥器异常复杂,这也是许多人之所以热衷于信道的原因。然而,在 Rust 中,得益于类型系统和所有权,我们不会在锁和解锁上出错。","breadcrumbs":"无畏并发 » 共享状态并发 » 使用互斥器,实现同一时刻只允许一个线程访问数据","id":"305","title":"使用互斥器,实现同一时刻只允许一个线程访问数据"},"306":{"body":"我们先从在单线程环境中使用互斥器开始,作为展示其用法的一个例子,如示例 16-12 所示: 文件名:src/main.rs use std::sync::Mutex; fn main() { let m = Mutex::new(5); { let mut num = m.lock().unwrap(); *num = 6; } println!(\"m = {m:?}\");\n} 示例 16-12: 出于简单的考虑,在一个单线程上下文中探索 Mutex 的 API 像很多类型一样,我们使用关联函数 new 来创建一个 Mutex。使用 lock 方法来获取锁,从而可以访问互斥器中的数据。这个调用会阻塞当前线程,直到我们拥有锁为止。 如果另一个线程拥有锁,并且那个线程 panic 了,则 lock 调用会失败。在这种情况下,没人能够再获取锁,所以我们调用 unwrap,使当前线程 panic。 一旦获取了锁,就可以将返回值(命名为 num)视为一个其内部数据(i32)的可变引用了。类型系统确保了我们在使用 m 中的值之前获取锁。m 的类型是 Mutex 而不是 i32,所以 必须 获取锁才能使用这个 i32 值。我们是不会忘记这么做的,因为如果没有获取锁,类型系统就不允许访问内部的 i32 值。 正如你所猜想的,Mutex 是一个智能指针。更准确的说,lock 调用 返回 一个叫做 MutexGuard 的智能指针。这个智能指针实现了 Deref 来指向其内部数据;它也实现了 Drop,当 MutexGuard 离开作用域时,自动释放锁(发生在示例 16-12 内部作用域的结尾)。有了这个特性,就不会有忘记释放锁的潜在风险(忘记释放锁会使互斥器无法再被其它线程使用),因为锁的释放是自动发生的。 释放锁之后,我们可以打印出互斥器内部的 i32 值,并发现我们刚刚已经将其值改为 6。 在线程间共享 Mutex 现在让我们尝试使用 Mutex 在多个线程间共享同一个值。我们将启动 10 个线程,并在各个线程中对同一个计数器值加 1,这样计数器将从 0 变为 10。示例 16-13 中的例子会出现编译错误,而我们将通过这些错误来学习如何使用 Mutex,以及 Rust 又是如何帮助我们正确使用的。 文件名:src/main.rs use std::sync::Mutex;\nuse std::thread; fn main() { let counter = Mutex::new(0); let mut handles = vec![]; for _ in 0..10 { let handle = thread::spawn(move || { let mut num = counter.lock().unwrap(); *num += 1; }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } println!(\"Result: {}\", *counter.lock().unwrap());\n} 示例 16-13: 程序启动了 10 个线程,每个线程都通过 Mutex 来增加计数器的值 这里创建了一个 counter 变量来存放内含 i32 的 Mutex,类似示例 16-12 那样。接下来我们遍历整数区间,创建了 10 个线程。我们使用了 thread::spawn,并为所有线程传入了相同的闭包:它们每一个都将调用 lock 方法来获取 Mutex 上的锁,接着将互斥器中的值加一。当一个线程结束执行,num 会离开闭包作用域并释放锁,这样另一个线程就可以获取它了。 在主线程中,我们像示例 16-2 那样收集了所有的 JoinHandle,并调用它们的 join 方法来等待所有线程结束。然后,主线程会获取锁,并打印出程序的结果。 之前提示过,这个例子不能编译,让我们看看为什么! $ cargo run Compiling shared-state v0.1.0 (file:///projects/shared-state)\nerror[E0382]: borrow of moved value: `counter` --> src/main.rs:21:29 |\n5 | let counter = Mutex::new(0); | ------- move occurs because `counter` has type `Mutex`, which does not implement the `Copy` trait\n...\n8 | for _ in 0..10 { | -------------- inside of this loop\n9 | let handle = thread::spawn(move || { | ------- value moved into closure here, in previous iteration of loop\n...\n21 | println!(\"Result: {}\", *counter.lock().unwrap()); | ^^^^^^^ value borrowed here after move |\nhelp: consider moving the expression out of the loop so it is only moved once |\n8 ~ let mut value = counter.lock();\n9 ~ for _ in 0..10 {\n10 | let handle = thread::spawn(move || {\n11 ~ let mut num = value.unwrap(); | For more information about this error, try `rustc --explain E0382`.\nerror: could not compile `shared-state` (bin \"shared-state\") due to 1 previous error 错误信息表明 counter 值在上一次循环中被移动了。所以 Rust 告诉我们,不能将 counter 锁的所有权移动到多个线程中。让我们通过一个第 15 章讨论过的多所有权手段,来修复这个编译错误。 多线程和多所有权 在第 15 章中,我们用智能指针 Rc 来创建引用计数,使得一个值有了多个所有者。让我们做同样的事,看看会发生什么。将示例 16-14 中的 Mutex 封装进 Rc 中,并在将所有权移入线程之前克隆(clone) Rc。 文件名:src/main.rs use std::rc::Rc;\nuse std::sync::Mutex;\nuse std::thread; fn main() { let counter = Rc::new(Mutex::new(0)); let mut handles = vec![]; for _ in 0..10 { let counter = Rc::clone(&counter); let handle = thread::spawn(move || { let mut num = counter.lock().unwrap(); *num += 1; }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } println!(\"Result: {}\", *counter.lock().unwrap());\n} 示例 16-14: 尝试使用 Rc 来允许多个线程拥有 Mutex 再一次编译并...出现了不同的错误!编译器真是教会了我们很多! $ cargo run Compiling shared-state v0.1.0 (file:///projects/shared-state)\nerror[E0277]: `Rc>` cannot be sent between threads safely --> src/main.rs:11:36 |\n11 | let handle = thread::spawn(move || { | ------------- ^------ | | | | ______________________|_____________within this `{closure@src/main.rs:11:36: 11:43}` | | | | | required by a bound introduced by this call\n12 | | let mut num = counter.lock().unwrap();\n13 | |\n14 | | *num += 1;\n15 | | }); | |_________^ `Rc>` cannot be sent between threads safely | = help: within `{closure@src/main.rs:11:36: 11:43}`, the trait `Send` is not implemented for `Rc>`, which is required by `{closure@src/main.rs:11:36: 11:43}: Send`\nnote: required because it's used within this closure --> src/main.rs:11:36 |\n11 | let handle = thread::spawn(move || { | ^^^^^^^\nnote: required by a bound in `spawn` --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/thread/mod.rs:688:1 For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `shared-state` (bin \"shared-state\") due to 1 previous error 哇哦,错误信息太长不看!划重点:第一行错误表明 Rc> 不能在线程间安全传递(`Rc>` cannot be sent between threads safely);编译器也指出了原因:Rc> 没有实现 Send trait(the trait `Send` is not implemented for `Rc>`)。下一节我们会讲到 Send:这是一个确保所使用的类型可以用于并发环境的 trait。 不幸的是,Rc 并不能安全的在线程间共享。当 Rc 管理引用计数时,它必须在每一个 clone 调用时增加计数,并在每一个克隆体被丢弃时减少计数。Rc 并没有使用任何并发原语,无法确保改变计数的操作不会被其他线程打断。这可能使计数出错,并导致诡异的 bug,比如可能会造成内存泄漏,或在使用结束之前就丢弃一个值。我们所需要的是一个与 Rc 完全一致,又以线程安全的方式改变引用计数的类型。 原子引用计数 Arc 所幸 Arc 正是这么一个类似 Rc 并可以安全的用于并发环境的类型。字母 “a” 代表 原子性 ( atomic ),所以这是一个 原子引用计数 ( atomically reference counted )类型。 原子类型 (Atomics) 是另一类这里还未涉及到的并发原语:请查看标准库中 std::sync::atomic 的文档来获取更多细节。目前我们只需要知道:原子类型就像基本类型一样,可以安全的在线程间共享。 你可能会好奇,为什么不是所有的基本类型都是原子性的?为什么标准库中的类型没有全部默认使用 Arc 实现?原因在于,线程安全会造成性能损失,我们希望只在必要时才为此买单。如果只是在单线程中对值进行操作,原子性提供的保证并无必要,而不加入原子性可以使代码运行得更快。 回到之前的例子:Arc 和 Rc 有着相同的 API,所以我们只需修改程序中的 use 行、new 调用和 clone 调用。示例 16-15 中的代码最终可以编译和运行: 文件名:src/main.rs use std::sync::{Arc, Mutex};\nuse std::thread; fn main() { let counter = Arc::new(Mutex::new(0)); let mut handles = vec![]; for _ in 0..10 { let counter = Arc::clone(&counter); let handle = thread::spawn(move || { let mut num = counter.lock().unwrap(); *num += 1; }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } println!(\"Result: {}\", *counter.lock().unwrap());\n} 示例 16-15: 使用 Arc 包装一个 Mutex 能够实现在多线程之间共享所有权 这会打印出: Result: 10 成功了!我们从 0 数到了 10,这好像没啥大不了的,不过一路上我们确实学习了很多关于 Mutex 和线程安全的内容!这个例子中构建的结构可以用于比增加计数更为复杂的操作。使用这个策略,我们可将计算任务分成独立的部分,并分散到多个线程中,接着使用 Mutex 使用各自的运算结果来更新最终的结果。 注意,对于简单的数值运算, 标准库中 std::sync::atomic 模块 提供了比 Mutex 更简单的类型。针对基本类型,这些类型提供了安全、并发、原子的操作。在上面的例子中,为了专注于讲明白 Mutex 的用法,我们才选择在基本类型上使用 Mutex。(译注:对于上面例子中出现的 i32 加法操作,更好的做法是使用 AtomicI32 类型来完成。具体参考文档。)","breadcrumbs":"无畏并发 » 共享状态并发 » Mutex的 API","id":"306","title":"Mutex的 API"},"307":{"body":"你可能注意到了,尽管 counter 是不可变的,我们仍然可以获取其内部值的可变引用;这意味着 Mutex 提供了内部可变性,就像 Cell 系列类型那样。使用 RefCell 可以改变 Rc 中内容(在 15 章中讲到过),同样地,使用 Mutex 我们也可以改变 Arc 中的内容。 另一个值得注意的细节是,Rust 不能完全避免使用 Mutex 所带来的逻辑错误。回忆一下,第 15 章中讲过,使用 Rc 就有造成引用循环的风险:两个 Rc 值相互引用,造成内存泄漏。同理,Mutex 也有造成 死锁 ( deadlock )的风险:当某个操作需要锁住两个资源,而两个线程分别持有两个资源的其中一个锁时,它们会永远相互等待。如果你对这个话题感兴趣,尝试编写一个带有死锁的 Rust 程序,接着研究别的语言中使用互斥器的死锁规避策略,并尝试在 Rust 中实现它们。标准库中 Mutex 和 MutexGuard 的 API 文档会提供有用的信息。 接下来,为了丰富本章的内容,让我们讨论一下 Send和 Sync trait,以及如何对自定义类型使用它们。","breadcrumbs":"无畏并发 » 共享状态并发 » RefCell/Rc 与 Mutex/Arc 的相似性","id":"307","title":"RefCell/Rc 与 Mutex/Arc 的相似性"},"308":{"body":"ch16-04-extensible-concurrency-sync-and-send.md commit 7c7740a5ddef1458d74f1daf85fd49e03aaa97cf Rust 的并发模型中一个有趣的方面是:语言本身对并发知之 甚少 。我们之前讨论的几乎所有内容,都属于标准库,而不是语言本身的内容。由于不需要语言提供并发相关的基础设施,并发方案不受标准库或语言所限:我们可以编写自己的或使用别人编写的并发功能。 然而有两个并发概念是内嵌于语言中的:std::marker 中的 Sync 和 Send trait。","breadcrumbs":"无畏并发 » 使用 Sync 与 Send Traits 的可扩展并发 » 使用 Sync 和 Send trait 的可扩展并发","id":"308","title":"使用 Sync 和 Send trait 的可扩展并发"},"309":{"body":"Send 标记 trait 表明实现了 Send 的类型值的所有权可以在线程间传送。几乎所有的 Rust 类型都是Send 的,不过有一些例外,包括 Rc:这是不能 Send 的,因为如果克隆了 Rc 的值并尝试将克隆的所有权转移到另一个线程,这两个线程都可能同时更新引用计数。为此,Rc 被实现为用于单线程场景,这时不需要为拥有线程安全的引用计数而付出性能代价。 因此,Rust 类型系统和 trait bound 确保永远也不会意外的将不安全的 Rc 在线程间发送。当尝试在示例 16-14 中这么做的时候,会得到错误 the trait Send is not implemented for Rc>。而使用标记为 Send 的 Arc 时,就没有问题了。 任何完全由 Send 的类型组成的类型也会自动被标记为 Send。几乎所有基本类型都是 Send 的,除了第二十章将会讨论的裸指针(raw pointer)。","breadcrumbs":"无畏并发 » 使用 Sync 与 Send Traits 的可扩展并发 » 通过 Send 允许在线程间转移所有权","id":"309","title":"通过 Send 允许在线程间转移所有权"},"31":{"body":"ch02-00-guessing-game-tutorial.md commit 11ca3d508b0a28b03f7d9f16c88726088fafd87e 让我们一起动手完成一个项目来快速上手 Rust!本章将介绍一些 Rust 中常见的概念,并通过真实的程序来展示如何运用它们。你将会学到 let、match、方法(methods)、关联函数(associated functions)、外部 crate 等知识!后续章节会深入探讨这些概念的细节。在这一章,我们将主要练习基础内容。 我们会实现一个经典的新手编程问题:猜数字游戏。游戏的规则如下:程序将会生成一个 1 到 100 之间的随机整数。然后提示玩家输入一个猜测值。输入后,程序会指示该猜测是太低还是太高。如果猜对了,游戏会打印祝贺信息并退出。","breadcrumbs":"写个猜数字游戏 » 写个猜数字游戏","id":"31","title":"写个猜数字游戏"},"310":{"body":"Sync 标记 trait 表明一个实现了 Sync 的类型可以安全的在多个线程中拥有其值的引用。换一种方式来说,对于任意类型 T,如果 &T(T 的不可变引用)是 Send 的话 T 就是 Sync 的,这意味着其引用就可以安全的发送到另一个线程。类似于 Send 的情况,基本类型是 Sync 的,完全由 Sync 的类型组成的类型也是 Sync 的。 智能指针 Rc 也不是 Sync 的,出于其不是 Send 相同的原因。RefCell(第十五章讨论过)和 Cell 系列类型不是 Sync 的。RefCell 在运行时所进行的借用检查也不是线程安全的。Mutex 是 Sync 的,正如 “在线程间共享 Mutex” 部分所讲的它可以被用来在多线程中共享访问。","breadcrumbs":"无畏并发 » 使用 Sync 与 Send Traits 的可扩展并发 » Sync 允许多线程访问","id":"310","title":"Sync 允许多线程访问"},"311":{"body":"通常并不需要手动实现 Send 和 Sync trait,因为由 Send 和 Sync 的类型组成的类型,自动就是 Send 和 Sync 的。因为它们是标记 trait,甚至都不需要实现任何方法。它们只是用来加强并发相关的不可变性的。 手动实现这些标记 trait 涉及到编写不安全的 Rust 代码,第十九章将会讲述具体的方法;当前重要的是,在创建新的由不是 Send 和 Sync 的部分构成的并发类型时需要多加小心,以确保维持其安全保证。 “The Rustonomicon” 中有更多关于这些保证以及如何维持它们的信息。","breadcrumbs":"无畏并发 » 使用 Sync 与 Send Traits 的可扩展并发 » 手动实现 Send 和 Sync 是不安全的","id":"311","title":"手动实现 Send 和 Sync 是不安全的"},"312":{"body":"这不会是本书最后一个出现并发的章节:第二十一章的项目会在更现实的场景中使用这些概念,而不像本章中讨论的这些小例子。 正如之前提到的,因为 Rust 本身很少有处理并发的部分内容,有很多的并发方案都由 crate 实现。它们比标准库要发展的更快;请在网上搜索当前最新的用于多线程场景的 crate。 Rust 提供了用于消息传递的信道,和像 Mutex 和 Arc 这样可以安全的用于并发上下文的智能指针。类型系统和借用检查器会确保这些场景中的代码,不会出现数据竞争和无效的引用。一旦代码可以编译了,我们就可以坚信这些代码可以正确的运行于多线程环境,而不会出现其他语言中经常出现的那些难以追踪的 bug。并发编程不再是什么可怕的概念:无所畏惧地并发吧! 接下来,让我们讨论一下当 Rust 程序变得更大时,有哪些符合语言习惯的问题建模方法和结构化解决方案,以及 Rust 的风格是如何与面向对象编程(Object Oriented Programming)中那些你所熟悉的概念相联系的。","breadcrumbs":"无畏并发 » 使用 Sync 与 Send Traits 的可扩展并发 » 总结","id":"312","title":"总结"},"313":{"body":"ch17-00-async-await.md commit 3111eda07a4a4692bf69e3aaad999d840ac9c138 很多我们要求计算机处理的操作都需要一定的时间才能完成。例如,如果你使用视频编辑器来创建一个家庭聚会的视频,导出视频可能会花费几分钟到几小时不等。同样,从家庭成员那里下载共享的视频也可能需要很长时间。如果我们能在等待这些长时间运行的操作完成期间做点其他事情,那就太好了。 视频导出会尽可能使用所有的 CPU 和 GPU。如果你只有一个 CPU 核,同时操作系统在导出完成前也不会暂停,那么在其运行期间你无法使用计算机进行任何其他操作。这会是一个非常糟糕的体验。相反计算机的操作系统可以(也确实可以)隐式地中断导出过程,频率足够高,使你能够在导出进行的同时完成其他任务。 下载文件则有所不同。它不占用大量的 CPU 时间。相反 CPU 需要等待来自于网络的数据。虽然可以在部分数据就绪时就开始读取,但等待剩余数据可能还需要一段时间。即便数据全部就绪了,视频文件也可能非常大,因此加载所有数据也会花费一些时间。虽然这可能只需要一两秒,不过这对于一个现代处理器来说已经是非常长的时间了,因为它每秒可以执行数十亿次操作。因此,如果能让 CPU 在等待网络调用完成的同时去处理别的工作就再好不过了。所以同上操作系统会隐式地中断你的程序以便其它工作可以在网络操作进行的同时继续进行。 注意:视频导出这类操作通常被称为 “CPU 密集型”(“CPU-bound”)或者 “计算密集型”(“compute-bound”)操作。其受限于计算机 CPU 或 GPU 处理数据的速度,以及它所能利用的计算能力。而下载视频这类操作通常被称为 “IO 密集型”(“IO-bound”)操作,因为其受限于计算机的 输入输出 速度。下载的速度最多只能与通过网络传输数据的速度一致。 在上述两个例子中,操作系统的隐式中断提供了一种形式的并发。不过这种并发仅限于整个程序的级别:操作系统中断一个程序并让其它程序得以执行。在很多场景中,由于我们能比操作系统在更细粒度上理解我们的程序,因此我们可以观察到很多操作系统无法察觉的并发机会。 例如,如果我们在构建一个管理文件下载的工具,我们应当以一种不会因开始一个下载任务而锁定 UI 的方式来编写程序,并且用户应该能够同时开始多个下载任务。不过很多操作系统与网络交互的 API 都是 阻塞 的( blocking )。也就是说这些 API 会阻塞程序的进程,直到它们处理的数据完全就绪。 注意:如果你仔细思索一下,会发现这是 大部分 函数调用的工作方式!不过我们通常将 “阻塞” 这个术语保留给那些与文件、网络或其它计算机资源交互的函数调用,因为这些地方是单个程序可以从 非 阻塞操作中获益的地方。 我们可以新建专用的线程来下载每个文件以免阻塞主线程。然而,我们最终会发现这些线程的开销会成为一个问题。如果这些调用在一开始就是非阻塞的话那就更理想了。最后,如果我们能够像在阻塞代码中一样,以直接的风格编写非阻塞代码,那就更好了。比如这样: let data = fetch_data_from(url).await;\nprintln!(\"{data}\"); 这正是 Rust 的 async 抽象所提供的。不过在讲解它们在实践中如何工作之前,让我们稍微绕个远路来了解一下并行(parallelism)和并发(concurrency)的区别。","breadcrumbs":"Async 和 await » Async 和 await","id":"313","title":"Async 和 await"},"314":{"body":"在上一章中,我们大致将并行和并发视为可以互换的概念。但现在我们需要更加精确地区分它们,因为它们的区别将在实际工作中显现出来。 思考一下不同的团队分割方法来开发一个软件项目。我们可以分配给一个个人多个任务,也可以每个团队成员各自负责一个任务,或者可以采用这两种方法的组合。 当一个个人在任何一个任务完成前同时处理多个任务,这就是 并发 。你可能在计算机上同时运行两个项目,当你对其中一个项目感到厌倦或遇到困难时,可以切换到另一个项目。因为你是单独一个人,所以无法真正同时推进两个任务,但是你可以多任务处理,在不同任务之间切换以取得进展。 图 17-1:一个并发工作流,在任务 A 和任务 B 之间切换 当你同意将一组任务在组员中分配,每一个组员分配一个任务并单独处理它,这就是 并行 。每个组员可以真正同时进行工作。 图 17-2:一个并行流,其中任务 A 和任务 B 的工作同时独立进行 在这两种场景中,你可能需要协调不同的任务。也许你 认为 某个人负责的任务与其他人的工作完全不相关,但实际上它确实依赖于团队中另一位成员的工作完成。一些工作可以并行进行,不过一些工作事实上是 串行 的:它们只能串行地发生,一个接着一个,如图 17-3 所示。 图 17-3:一个部分并行的工作流,其中任务 A 和任务 B 的工作相互独立,直到任务 A3 阻塞在等待任务 B3 的结果 同理,你可能会意识到你自己的一个任务依赖另一个任务。现在并发任务也变成串行的了。 并行与并发也可能相互交叉(阻塞)。如果你得知某个同事卡在等待你的一个任务完成,你可能会集中所有精力在这个任务上来 “解锁” 你的同事。你和你的同事则不再能并行地工作了,同时你也不能够并发地处理自己的任务。 同样的基础动态也作用于软件与硬件。在一个单核的机器上,CPU 一次只能执行一个操作,不过它仍然可以并发工作。借助像线程、进程和异步(async)等工具,计算机可以暂停一个活动,并在最终切换回第一个活动之前切换到其它活动。在一个有多个 CPU 核心的机器上,它也可以并行工作。一个核心可以做一件工作的同时另一个核心可以做一些完全不相关的工作,而且这些工作实际上是同时发生的。 当使用 Rust 中的 async 时,我们总是在处理并发。取决于硬件、操作系统和所使用的异步运行时(async runtime)-- 稍后会介绍更多的异步运行时!并发也可能在底层使用了并行。 现在让我们深入理解 Rust 的异步编程实际上是如何工作的!在接下来的章节中,我们将: 学习如何使用 Rust 的 async 和 await 语法 探索如何使用异步模型来解决第十六章中遇到的一些挑战 了解多线程和异步如何互补,在很多场景中你甚至可以同时使用两者","breadcrumbs":"Async 和 await » 并行与并发","id":"314","title":"并行与并发"},"315":{"body":"ch17-01-futures-and-syntax.md commit e95efa05706c5c4309df9ed47d5e91d8ed342b7d Rust 异步编程的关键元素是 futures 和 Rust 的 async 与 await 关键字。 future 是一个现在可能还没有准备好但将在未来某个时刻准备好的值。(相同的概念也出现在很多语言中,有时被称为 “task” 或者 “promise”。)Rust 提供了 Future trait 作为基础组件,这样不同的异步操作就可以在不同的数据结构上实现。在 Rust 中,我们称实现了 Future trait 的类型为 futures。每一个实现了 Future 的类型会维护自己的进度状态信息和 “ready” 的定义。 async 关键字可以用于代码块和函数,表明它们可以被中断并恢复。在一个 async 块或 async 函数中,可以使用 await 关键字来等待一个 future 准备就绪,这一过程称为 等待一个 future 。async 块或 async 函数中每一个等待 future 的地方都可能是一个 async 块或 async 函数中断并随后恢复的点。检查一个 future 并查看其值是否已经准备就绪的过程被称为 轮询 (polling)。 其它一些语言也使用 async 和 await 关键字进行异步编程。如果你熟悉这些语言,则可能会注意到它们与 Rust 的处理方式有显著不同,包括语法上的差异。我们将看到,这样做是有充分理由的! 在大多数情况下,编写异步 Rust 代码时,我们使用 async 和 await 关键字。Rust 将其编译为等同于使用 Future trait 的代码,这非常类似于将 for 循环编译为等同于使用 Iterator trait 的代码。不过,由于 Rust 提供了 Future trait,你也可以在需要时为你自己的数据类型实现它。在整个章节中你会看到很多函数的返回值类型都有其自己的 Future 实现。我们会在本章结尾回到这个 trait 的定义,并深入了解它的工作原理,但现在这些细节已经足够让我们继续前进了。 这些内容可能有点抽象。让我们来编写第一个异步程序:一个小型网络爬虫。我们会从命令行传递两个 URL,并发地解析它们,并返回第一个完成解析的结果。这个示例会引入不少的新语法,不过不用担心。我们会逐步解释所有你需要了解的内容。","breadcrumbs":"Async 和 await » Futures 和 async 语法 » Futures 和 async 语法","id":"315","title":"Futures 和 async 语法"},"316":{"body":"为了保持本章的内容专注于学习 async,而不是处理生态系统的部分组件,我们已经创建了一个 trpl crate(trpl 是 “The Rust Programming Language” 的缩写)。它重导出了你需要的所有类型、traits 和函数,它们主要来自于 futures 和 tokio crates。 futures crate 是一个 Rust 异步代码实验的官方仓库,也正是 Future 最初设计的地方。 Tokio 是目前 Rust 中应用最广泛的异步运行时(async runtime),特别是(但不仅是!)web 应用。这里还有其他优秀的运行时,它们可能更适合你的需求。我们在 trpl 的底层使用 Tokio 是因为它经过了充分测试且广泛使用。 在一些场景中,trpl 也会重命名或者封装原始 API 以便我们专注于与本章相关的细节。如果你想了解该 crate 的具体功能,我们鼓励你查看 其源码 。你可以看到每个重导出的内容来自哪个 crate,我们留下了大量注释来解释这个 crate 的用途。 创建一个名为 hello-async 的二进制项目并将 trpl crate 作为一个依赖添加: $ cargo new hello-async\n$ cd hello-async\n$ cargo add trpl 现在我们可以利用 trpl 提供的多种组件来编写第一个异步程序。我们构建了一个小的命令行工具来抓取两个网页,拉取各自的 元素,并打印出第一个完成全部过程的标题。 让我们开始编写一个函数,它获取一个网页 URL 作为参数,请求该 URL 并返回标题元素的文本: 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # fn main() {\n# // TODO: we'll add this next!\n# }\n# use trpl::Html; async fn page_title(url: &str) -> Option<String> { let response = trpl::get(url).await; let response_text = response.text().await; Html::parse(&response_text) .select_first(\"title\") .map(|title_element| title_element.inner_html())\n} 示例 17-1:定义一个 async 函数来获取一个 HTML 页面的标题元素 在示例 17-1 中,我们定义了一个名为 page_title 的函数,并使用了 async 关键字标记。接着我们使用 trpl::get 函数来获取传入的任意 URL,然后使用 await 关键字来等待响应。接着我们调用其 text 方法来获取响应的文本,这里再一次使用 await 关键字等待。这两个步骤都是异步的。对于 get 来说,我们需要等待服务器发送回其响应的第一部分,这会包含 HTTP 头(headers)、cookies 等。这部分响应可以独立于响应体发送。特别是在响应体非常大时候,接收完整响应可能会花费一些时间。因此我们不得不等待响应 整体 返回,所以 text 方法也是异步。 我们必须显示地等待这两个 futures,因为 Rust 中的 futures 是 惰性 ( lazy )的:在你使用 await 请求之前它们不会执行任何操作。(事实上,如果你不使用一个 futures,Rust 会显示一个编译警告)这应该会让你想起 之前第十三章 关于迭代器的讨论。直到你调用迭代器的 next 方法(直接调用或者使用 for 循环或者类似 map 这类在底层使用 next 的方法)之前它们什么也不会做。对于 futures 来说,同样的基本理念也是适用的:除非你显式地请求,否则它们不会执行。惰性使得 Rust 可以避免提前运行异步代码,直到真正需要时才执行。 注意:这不同于上一章节中 thread::spawn 的行为,当时传递给另一个线程的闭包会立即开始运行。这也与许多其他语言处理异步的方式不同!但对于 Rust 而言,这一点非常重要。稍后我们会解释原因。 当我们有了 response_text 函数,就可以使用 Html::parse 将其解析为一个 Html 类型的实例。不同于原始字符串,现在我们有了一个可以将 HTML 作为更丰富数据结构来操作的数据类型。特别是我们可以使用 select_first 方法来找出给定 CSS 选择器(selector)中第一个匹配元素。通过传递字符串 \"title\",我们会得到文档中的第一个 <title> 元素,如果它存在的话。由于可能没有任何匹配的元素,select_first 返回一个 Option<ElementRef>。最后我们使用 Option::map 方法,它允许我们在 Option 中有元素时对其进行处理,而在没有时则什么也不做。(这里也可以使用一个 match 表达式,但 map 更符合惯用的写法。)在传递给 map 的函数体中,我们调用了 title_element 上的 inner_html 来获取其内容,这是一个 String。当上面所讲的都完成后,我们会得到一个 Option<String>。 注意 Rust 的 await 关键字出现在需要等待的表达式之后而不是之前。也就是说,这是一个 后缀关键字 ( postfix keyword )。如果你在其它语言中使用过 async 的话,这可能与你所熟悉的有所不同。Rust 如此选择是因为这使得方法的链式调用更加简洁。因此,我们可以修改 page_url_for 的函数体来链式调用 trpl::get 和 text 并在其之间使用 await,如示例 17-2 所示: 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use trpl::Html;\n# # fn main() {\n# // TODO: we'll add this next!\n# }\n# # async fn page_title(url: &str) -> Option<String> { let response_text = trpl::get(url).await.text().await;\n# Html::parse(&response_text)\n# .select_first(\"title\")\n# .map(|title_element| title_element.inner_html())\n# } 示例 17-2:使用 `await` 关键字的链式调用 这样我们就成功编写了第一个异步函数!在我们向 main 加入一些代码调用它之前,让我们再多了解下我们写了什么以及它的意义。 当 Rust 遇到一个 async 关键字标记的代码块时,会将其编译为一个实现了 Future trait 的唯一的、匿名的数据类型。当 Rust 遇到一个被标记为 async 的函数时,会将其编译进一个拥有异步代码块的非异步函数。异步函数的返回值类型是编译器为异步代码块所创建的匿名数据类型。 因此,编写 async fn 就等同于编写一个返回类型的 future 的函数。当编译器遇到类似示例 17-1 中 async fn page_title 的函数定义时,它等价于以下定义的非异步函数: # extern crate trpl; // required for mdbook test\nuse std::future::Future;\nuse trpl::Html; fn page_title(url: &str) -> impl Future<Output = Option<String>> + '_ { async move { let text = trpl::get(url).await.text().await; Html::parse(&text) .select_first(\"title\") .map(|title| title.inner_html()) }\n} 让我们挨个看一下转换后版本的每一个部分: 它使用了之前第十章 “trait 作为参数” 部分讨论过的 impl Trait 语法 它返回的 trait 是一个 Future,它有一个关联类型 Output。注意 Output 的类型是 Option<String>,这与 async fn 版本的 page_title 的原始返回值类型相同。 所有原始函数中被调用的代码被封装进一个 async move 块。回忆一下,代码块是表达式。这整个块就是函数所返回的表达式 如上所述,这个异步代码块产生一个 Option<String> 类型的值。这个值与返回类型中的 Output 类型一致。这正类似于你已经见过的其它代码块。 新版函数的函数体是一个 async move 代码块,因为它如何使用 url 参数决定了这一点。(本章后续部分将更详细地讨论 async 和 async move 之间的区别。) 新版本的函数在返回类型中使用了一种我们之前未见过的生命周期标记:'_。因为函数返回的 Future 指向一个引用(在这个例子中是指向 url 参数的引用)我们需要告诉 Rust 引用的生命周期。这里无需命名该生命周期,因为 Rust 足够智能到能理解这里只涉及到唯一一个引用,不过我们 必须 明确指出返回的 Future 受该生命周期的约束。 现在我们可以在 main 中调用 page_title。首先,我们只会获取一个页面的标题。在示例 17-3 中,我们沿用了第十二章中获取命令行参数的相同模式。接着我们传递第一个 URL 给 page_title,并等待结果。因为 future 产生的值是一个 Option<String>,我们使用 match 表达式来根据页面是否有 <title> 来打印不同的信息。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use trpl::Html;\n# async fn main() { let args: Vec<String> = std::env::args().collect(); let url = &args[1]; match page_title(url).await { Some(title) => println!(\"The title for {url} was {title}\"), None => println!(\"{url} had no title\"), }\n}\n# # async fn page_title(url: &str) -> Option<String> {\n# let response_text = trpl::get(url).await.text().await;\n# Html::parse(&response_text)\n# .select_first(\"title\")\n# .map(|title_element| title_element.inner_html())\n# } 示例 17-3:在 `main` 中通过一个用户提供的参数调用 `page_title` 函数 很不幸的是这还不能编译。唯一可以使用 await 关键字的地方是异步函数或者代码块中,同时 Rust 不允许将特殊的 main 函数标记为 async。 error[E0752]: `main` function is not allowed to be `async` --> src/main.rs:6:1 |\n6 | async fn main() { | ^^^^^^^^^^^^^^^ `main` function is not allowed to be `async` main 不能标记为 async 的原因是异步代码需要一个 运行时 :即一个管理执行异步代码细节的 Rust crate。一个程序的 main 函数可以 初始化 一个运行时,但是其 自身 并不是一个运行时。(稍后我们会进一步解释原因。)每一个执行异步代码的 Rust 程序必须至少有一个设置运行时并执行 futures 的地方。 大部分支持异步的语言会打包一个运行时在语言中。Rust 则不是,相这里有很多不同的异步运行时,每一个都有适合其目标的权衡取舍。例如,一个拥有很多核心和大量内存的高吞吐 web server 与一个单核、少量内存并且没有堆分配能力的微控制器相比有着截然不同的需求。提供这些运行时的 crate 通常也提供了例如文件或者网络 IO 这类常用功能的异步版本。 从这里到本章余下部分,我们会使用 trpl crate 的 run 函数,它获取一个 future 作为参数并运行到结束。在内部,调用 run 会设置一个运行时来运行传递的 future。一旦 future 完成,run 返回 future 返回的任何值。 我们可以将 page_title 返回的 future 直接传递给 run。一旦其完成,我们能够匹配返回的 Option<String>,正如示例 17-3 我们尝试的那样。然而,在本章的大部分示例中(以及大多数实际应用中的异步代码中!),我们会执行不止一次异步函数调用,所以相反我们会传递一个 async 块并显式地等待 page_title 调用的结果,如示例 17-4 所示。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use trpl::Html;\n# fn main() { let args: Vec<String> = std::env::args().collect(); trpl::run(async { let url = &args[1]; match page_title(url).await { Some(title) => println!(\"The title for {url} was {title}\"), None => println!(\"{url} had no title\"), } })\n}\n# # async fn page_title(url: &str) -> Option<String> {\n# let response_text = trpl::get(url).await.text().await;\n# Html::parse(&response_text)\n# .select_first(\"title\")\n# .map(|title_element| title_element.inner_html())\n# } 示例 17-4:等待一个使用异步代码块的 `trpl::run` 当我们运行代码,我们会得到最初预想的行为: $ cargo run \"http://www.rust-lang.org\"\nThe title for http://www.rust-lang.org was Rust Programming Language 我们终于有了一些可以正常工作的异步代码!现在它们可以成功编译并运行。在我们添加代码让两个网址进行竞争之前,让我们简要地回顾一下 future 是如何工作的。 每一个 await point ,也就是代码使用 await 关键字的地方,代表将控制权交还给运行时的地方。为此 Rust 需要记录异步代码块中涉及的状态,这样运行时可以去执行其他工作,并在准备好时回来继续推进当前的任务。这就像你通过编写一个枚举来保存每一个 await point 的状态一样: # extern crate trpl; // required for mdbook test\n# enum PageTitleFuture<'a> { Initial { url: &'a str }, GetAwaitPoint { url: &'a str }, TextAwaitPoint { response: trpl::Response },\n} 编写代码来手动控制不同状态之间的转换是非常乏味且容易出错的,特别是之后增加了更多功能和状态的时候。相反,Rust 编译器自动创建并管理异步代码的状态机数据结构。如果你感兴趣的话:是的,正常的借用和所有权也全部适用于这些数据结构。幸运的是,编译器也会为我们处理这些检查,并提供友好的错误信息。本章稍后会讲解一些相关内容! 最终需要某个组件来执行状态机。这就是运行时。(这也是为什么在了解运行时的时候,你可能会看到 executors 这个词:executor 是运行时中负责执行异步代码的部分。) 现在我们能够理解了之前示例 17-3 中为何编译器阻止我们将 main 本身标记为异步函数了。如果 main 是一个异步函数,需要有其它组件来管理 main futrue 返回的状态机,但是 main 是程序的入口点!为此我们在 main 函数中调用 trpl::run,它设置了一个运行时并运行 async 块返回的 future 并等待它返回 Ready。 注意:一些运行时提供了相关的宏所以你 可以 编写一个异步 main 函数。这些宏将 async fn main() { ... } 重写为正常的 fn main,执行的逻辑与我们在示例 17-5 中手动实现的一样:像 trpl::run 一样调用一个函数运行 future 直到结束。 让我们将这些代码片段整理一下来看看如何编写并发代码,这里通过两个来自命令行的不同 URL 来调用 page_title 并使其相互竞争。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# use trpl::{Either, Html}; fn main() { let args: Vec<String> = std::env::args().collect(); trpl::run(async { let title_fut_1 = page_title(&args[1]); let title_fut_2 = page_title(&args[2]); let (url, maybe_title) = match trpl::race(title_fut_1, title_fut_2).await { Either::Left(left) => left, Either::Right(right) => right, }; println!(\"{url} returned first\"); match maybe_title { Some(title) => println!(\"Its page title is: '{title}'\"), None => println!(\"Its title could not be parsed.\"), } })\n} async fn page_title(url: &str) -> (&str, Option<String>) { let text = trpl::get(url).await.text().await; let title = Html::parse(&text) .select_first(\"title\") .map(|title| title.inner_html()); (url, title)\n} 示例 17-5 示例 17-5 中以分别由用户提供的 URL 调用 page_title 开始。我们将调用 page_title 产生的 future 分别保存为 title_fut_1 和 title_fut_2。请记住,它们还没有进行任何工作,因为 future 是惰性的,并且我们还没有 await 它们。接着我们将 futures 传递给 trpl::race,它返回一个值表明哪个传递的 future 最先返回。 注意:在内部 race 构建在一个更通用的函数 select 之上,你会在真实的 Rust 代码中更常遇到它。select 函数可以做很多 trpl::race 函数做不了的事,不过它也有一些额外的复杂性,所以目前我们先略过介绍。 由于任何一个 future 都可以合理地 “获胜”,所以返回 Result 没有意义。相反 race 返回了一个我们之前没有见过的类型 trpl::Either。Either 类型有点类似于 Result,它也有两个成员。但是不同于 Either,Either 没有内置成功或者失败的概念。相反它使用 Left 和 Right 来表示 “一个或另一个”。 enum Either<A, B> { Left(A), Right(B),\n} race 函数返回 Left,如果第一个参数先完成,并包含该 future 的输出,如果 第二个 future 先完成,则返回 Right 和第二个 future 的输出。这匹配调用函数时参数出现的顺序:第一个参数在第二个参数的左边。 我们还更新了 page_title 来返回与传递时相同的 URL。如此如果首先返回的页面没有可以解析的 <title>,仍然可以打印出有意义的信息。有了这些信息,我们对 println! 的输出进行了封装和更新,以表明哪个 URL 最先完成,并在页面有 <title> 时打印出它的内容。 现在我们完成一个小型网页爬虫的构建了!挑选一对 URL 并运行命令行工具。你会发现某些网站稳定地快于其它网站,而有些情况哪些网站会 赢 则每次都不同。更重要的是,你已经掌握了处理 futures 的基础知识,因此我们现在可以进一步探索更多异步操作的可能性了。","breadcrumbs":"Async 和 await » Futures 和 async 语法 » 第一个异步程序","id":"316","title":"第一个异步程序"},"317":{"body":"ch17-02-concurrency-with-async.md commit 62d441060d66f9a1c3d3cdfffa8eed40f817d1aa 在这一部分,我们将使用异步来应对一些与第十六章中通过线程解决的相同的并发问题。因为之前我们已经讨论了很多关键理念了,这一部分我们会专注于线程与 future 的区别。 在很多情况下,使用异步处理并发的 API 与使用线程的非常相似。在其它的一些情况,它们则非常不同。即便线程与异步的的 API 看起来 很类似,通常它们有着不同的行为,同时它们几乎总是有着不同的性能特点。","breadcrumbs":"Async 和 await » 并发与 async » 并发与 async","id":"317","title":"并发与 async"},"318":{"body":"第十六章中我们应付的第一个任务是在两个不同的线程中计数。让我们用异步来完成相同的任务。trpl crate 提供了一个 spawn_task 函数,它看起来非常像 thread::spawn API,和一个 sleep 函数,这是 thread::sleep API 的异步版本。我们可以将它们结合使用,实现与线程示例相同的计数功能,如示例 17-6 所示。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# use std::time::Duration; fn main() { trpl::run(async { trpl::spawn_task(async { for i in 1..10 { println!(\"hi number {i} from the first task!\"); trpl::sleep(Duration::from_millis(500)).await; } }); for i in 1..5 { println!(\"hi number {i} from the second task!\"); trpl::sleep(Duration::from_millis(500)).await; } });\n} 示例 17-6:使用 `spawn_task` 启动两个计数任务 作为开始,我们在 main 函数中使用 trpl::run,这样我们的顶层函数可以是异步的。 注意:本章从现在开始,每一个示例的 main 中都会包含几乎相同的 trpl::run 封装代码,所以我们经常会连同 main 一同省略。别忘了在你的代码中加入它们! 接着我们在代码块中编写了两个循环,每个其中都有一个 trpl::sleep 调用,每一个都在发送下一个信息之前等待半秒(500 毫秒)。我们将一个循环放到 trpl::spawn_task 中并将另一个放在顶层的 for 循环中。我们也在 sleep 调用之后加入了一个 await。 这个实现与基于线程的版本类似,包括在运行时,你可能会在终端中看到消息以不同顺序出现的情况。 hi number 1 from the second task!\nhi number 1 from the first task!\nhi number 2 from the first task!\nhi number 2 from the second task!\nhi number 3 from the first task!\nhi number 3 from the second task!\nhi number 4 from the first task!\nhi number 4 from the second task!\nhi number 5 from the first task! 这个版本在 main 中的异步代码块中 for 循环结束后就停止了,因为当 main 函数结束时 spawn_task 产生的任务就会关闭。如果运行该任务直到结束,你需要使用一个 join 句柄(join handle)来等待第一个任务完成。对于线程来说,可以使用 join 方法来 “阻塞” 直到线程结束运行。在示例 17-7 中,我们可以使用 await 来实现相同的效果,因为任务句柄本身是一个 future。它的 Output 类型是一个 Result,所以我们还需要 unwrap 来 await 它。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let handle = trpl::spawn_task(async { for i in 1..10 { println!(\"hi number {i} from the first task!\"); trpl::sleep(Duration::from_millis(500)).await; } }); for i in 1..5 { println!(\"hi number {i} from the second task!\"); trpl::sleep(Duration::from_millis(500)).await; } handle.await.unwrap();\n# });\n# } 示例 17-7:在一个 join 句柄上使用 `await` 使得任务运行直到结束 更新后的版本会运行 两个 循环直到结束。 hi number 1 from the second task!\nhi number 1 from the first task!\nhi number 2 from the first task!\nhi number 2 from the second task!\nhi number 3 from the first task!\nhi number 3 from the second task!\nhi number 4 from the first task!\nhi number 4 from the second task!\nhi number 5 from the first task!\nhi number 6 from the first task!\nhi number 7 from the first task!\nhi number 8 from the first task!\nhi number 9 from the first task! 目前为止,看起来异步和线程版本给出了基本一样的输出,它们只是使用了不同的语法:在 join 句柄上使用 await 而不是调用 join,和 await sleep 调用。 最大的区别在于无需再产生另一个操作系统线程来进行工作。事实上,我们甚至不需要产生一个任务。因为异步代码块会编译为匿名 future,我们可以将每一个循环放进一个异步代码块并使用 trpl::join 方法来让运行时将它们两个都运行至完成。 在第十六章中,我们展示了如何在 std::thread::spawn 调用返回的 JoinHandle 类型上调用 join 方法。trpl::join 函数也类似,不过它作用于 future。当你传递两个 future,它会产生单独一个 future 但它的输出是一个元组,当 两者 都完成时其中有每一个传递给它的 future 的输出。因此,在示例 17-8 中,我们使用 trpl::join 来等待 fut1 和 fut2 都结束。我们 没有 await fut1 和 fut2,而是等待 trpl::join 新产生的 future。我们忽略其输出,因为它只是一个包含两个单元值(unit value)的元组。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let fut1 = async { for i in 1..10 { println!(\"hi number {i} from the first task!\"); trpl::sleep(Duration::from_millis(500)).await; } }; let fut2 = async { for i in 1..5 { println!(\"hi number {i} from the second task!\"); trpl::sleep(Duration::from_millis(500)).await; } }; trpl::join(fut1, fut2).await;\n# });\n# } 示例 17-8:使用 `trpl::join` 来 await 两个匿名 future 当运行代码我们会看到两个 future 会运行至结束: hi number 1 from the first task!\nhi number 1 from the second task!\nhi number 2 from the first task!\nhi number 2 from the second task!\nhi number 3 from the first task!\nhi number 3 from the second task!\nhi number 4 from the first task!\nhi number 4 from the second task!\nhi number 5 from the first task!\nhi number 6 from the first task!\nhi number 7 from the first task!\nhi number 8 from the first task!\nhi number 9 from the first task! 这里,你每次都会看到完全相同的顺序,这与我们在线程中看到的情况非常不同。这是因为 trpl::join 函数是 公平的 ( fair ),这意味着它以相同的频率检查每一个 future,使它们交替执行,绝不会让一个任务在另一个任务准备好时抢先执行。对于线程来说,操作系统会决定该检查哪个线程和会让它运行多长时间。对于异步 Rust 来说,运行时决定检查哪一个任务。(在实践中,细节会更为复杂,因为异步运行时可能在底层使用操作系统线程来作为其并发管理的一部分,因此要保证公平性可能会增加运行时的工作量,但这仍然是可行的!)运行时无需为任何操作保证公平性,同时运行时也经常提供不同的 API 来让你选择是否需要公平性。 尝试这些不同的 await future 的变体来观察它们的效果: 去掉一个或者两个循环外的异步代码块。 在定义两个异步代码块后立刻 await 它们。 直将第一个循环封装进异步代码块,并在第二个循环体之后 await 作为结果的 future。 作为额外的挑战,看看你能否在运行代码 之前 想出每个情况下的输出!","breadcrumbs":"Async 和 await » 并发与 async » 计数","id":"318","title":"计数"},"319":{"body":"在 future 之间共享数据也与线程类似:我们会再次使用消息传递,不过这次使用的是异步版本的类型和函数。我们会采用与之前第十六章中使用的稍微不同的方法,来展示一些基于线程的并发与基于 future 的并发之间的关键差异。在示例 17-9 中,我们会从仅有一个异步代码块开始, 不像 之前产生独立线程那样产生一个独立的任务。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # fn main() {\n# trpl::run(async { let (tx, mut rx) = trpl::channel(); let val = String::from(\"hi\"); tx.send(val).unwrap(); let received = rx.recv().await.unwrap(); println!(\"Got: {received}\");\n# });\n# } 示例 17-9:创建一个异步信道(async channel)并赋值其两端为 `tx` 和 `rx` 这里我们使用了 trpl::channel,一个第十六章用于线程的多生产者、单消费者信道 API 的异步版本。异步版本的 API 与基于线程的版本只有一点微小的区别:它使用一个可变的而不是不可变的 rx,并且它的 recv 方法产生一个需要 await 的 future 而不是直接返回值。现在我们可以发送端向接收端发送消息了。注意我们无需产生一个独立的线程或者任务;只需等待(await) rx.recv 调用。 std::mpsc::channel 中的同步 Receiver::recv 方法阻塞执行直到它接收一个消息。trpl::Receiver::recv 则不会阻塞,因为它是异步的。不同于阻塞,它将控制权交还给运行时,直到接收到一个消息或者信道的发送端关闭。相比之下,我们不用 await send,因为它不会阻塞。也无需阻塞,因为信道的发送端的数量是没有限制的。 注意:因为所有这些异步代码都运行在一个 trpl::run 调用的异步代码块中,其中的所有代码可以避免阻塞。然而, 外面 的代码会阻塞到 run 函数返回。这正是 trpl::run 函数的全部意义:它允许你 选择 在何处阻塞一部分异步代码,也就是在何处进行同步和异步代码的转换。这正是在大部分运行时中 run 实际上被命名为 block_on 的原因。 请注意这个示例中的两个地方:首先,消息立刻就会到达!其次,虽然我们使用了 future,但是这里还没有并发。示例中的所有事情都是顺序发生的,就像没涉及到 future 时一样。 让我们通过发送一系列消息并在之间休眠来解决第一个问题,如示例 17-10 所示: 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let (tx, mut rx) = trpl::channel(); let vals = vec![ String::from(\"hi\"), String::from(\"from\"), String::from(\"the\"), String::from(\"future\"), ]; for val in vals { tx.send(val).unwrap(); trpl::sleep(Duration::from_millis(500)).await; } while let Some(value) = rx.recv().await { println!(\"received '{value}'\"); }\n# });\n# } 示例 17-10:通过异步信道发送和接收多个消息并在每个消息之间通过 `await` 休眠 除了发送消息之外,我们还需要接收它们。在这个例子中我们可以手动接收,就是调用四次 rx.recv().await,因为我们知道进来了多少条消息。然而,在现实世界中,我们通常会等待 未知 数量的消息。这时我们需要一直等待直到可以确认没有更多消息了为止。 在示例 16-10 中,我们使用了 for 循坏来处理从异步信道接收的所有消息。然而,Rust 目前还没有在 异步 序列上编写 for 循环的方法。取而代之的是,我们需要一个我们还没有见过的新循环类型,即 while let 条件循环。while let 循环是我们在第六章中见过的 if let 结构的循环版本。只要其指定的模式持续匹配循环就会一直执行。 rx.recv 调用产生一个 Future,我们会 await 它。运行时会暂停 Future 直到它就绪。一旦消息到达,future 会解析为 Some(message),每次消息到达时都会如此。。当信道关闭时,不管是否有 任何 消息到达,future 都会解析为 None 来表明没有更多的值了,我们也就应该停止轮询,也就是停止等待。 while let 循环将上述逻辑整合在一起。如果 rx.recv().await 调用的结果是 Some(message),我们会得到消息并可以在循环体中使用它,就像使用 if let 一样。如果结果是 None,则循环停止。每次循环执行完毕,它会再次触发 await point,如此运行时会再次暂停直到另一条消息到达。 现在代码可以成功发送和接收所有的消息了。不幸的是,这里还有一些问题。首先,消息并不是按照半秒的间隔到达的。它们在程序启动后两秒(2000 毫秒)后立刻一起到达。其次,程序永远也不会退出!相反它会永远等待新消息。你会需要使用 ctrl-c 来关闭它。 让我们开始理解为何消息在全部延迟后立刻一起到达,而不是逐个在延迟后到达。在一个给定的异步代码块,await 关键字在代码中出现的顺序也就是程序执行时其发生的顺序。 示例 17-10 中只有一个异步代码块,所以所有的代码线性地执行。这里仍然没有并发。所有 tx.send 调用与 trpl::sleep 调用及其相关的 await point 是依次进行的。只有在此之后 while let 循环才开始执行 recv 调用上的 await point。 为了得到我们需要的行为,在接收每条消息之间引入休眠延迟,我们需要将 tx 和 rx 操作放置于它们各自的异步代码块中。这样运行时就可以使用 trpl::join 来分别执行它们,就像在计数示例中一样。我们再一次 await trpl::join 调用的结果,而不是它们各自的 future。如果我们顺序地 await 单个 future,则就又回到了一个顺序流,这正是我们 不 希望做的。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# let tx_fut = async { let vals = vec![ String::from(\"hi\"), String::from(\"from\"), String::from(\"the\"), String::from(\"future\"), ]; for val in vals { tx.send(val).unwrap(); trpl::sleep(Duration::from_millis(500)).await; } }; let rx_fut = async { while let Some(value) = rx.recv().await { println!(\"received '{value}'\"); } }; trpl::join(tx_fut, rx_fut).await;\n# });\n# } 示例 17-11:将 `send` 和 `recv` 分隔到其各自的 `async` 代码块中并 await 这些代码块的 future 采用示例 17-11 中的更新后的代码,消息会以 500 毫秒的间隔打印,而不是在两秒后就全部一起打印。 但是程序仍然永远也不会退出,这是由于 while let 循环与 trpl::join 的交互方式所致: trpl::join 返回的 future 只会完成一次,即传递的 两个 future 都完成的时候。 tx future 在发送 vals 中最后一条消息之后的休眠结束后立刻完成。 rx future 直到 while let 循环结束之前都不会完成。 当信道的另一端关闭后 await rx.recv 将只会返回 None。 信道只有在调用 rx.close 或者发送端 tx 被丢弃时才会关闭。 我们没有在任何地方调用 rx.close,并且 tx 直到传递给 trpl::run 的最外层异步代码块结束前都不会被丢弃。 代码块不能结束是因为它阻塞在了等待 trpl::join 完成,这就又回到了列表的开头! 我们可以在代码的某处调用 rx.close 来手动关闭 rx,不过这并没有太多意义。在处理了任意数量的消息后停止可以使程序停止,但是可能会丢失消息。我们需要其它的手段来确保 tx 在函数的结尾 之前 被丢弃。 目前发送消息的异步代码块只是借用了 tx,因为发送消息并不需要其所有权,但是如果我们可以将 tx 移动(move)进异步代码快,它会在代码块结束后立刻被丢弃。在第十三章中我们学习了如何在闭包上使用 move 关键字,在第十六章中,我们知道了使用线程时经常需要移动数据进闭包。同样的基本原理也适用于异步代码块,因此 move 关键字也能像闭包那样作用于异步代码块。 在示例 17-12 中,我们将发送消息的异步代码块从普通的 async 代码块修改为 async move 代码块。当运行 这个 版本的代码时,它会在发送和接收完最后一条消息后优雅地关闭。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let (tx, mut rx) = trpl::channel(); let tx_fut = async move { let vals = vec![ String::from(\"hi\"), String::from(\"from\"), String::from(\"the\"), String::from(\"future\"), ]; for val in vals { tx.send(val).unwrap(); trpl::sleep(Duration::from_millis(500)).await; } }; let rx_fut = async { while let Some(value) = rx.recv().await { eprintln!(\"received '{value}'\"); } }; trpl::join(tx_fut, rx_fut).await;\n# });\n# } 示例 17-12:一个可以工作的在 future 之间接收和发送消息的示例,其在结束后会正确地关闭 这个异步信道也是一个多生产者信道,所以如果希望从多个 future 发送消息可以调用 tx 上的 clone 方法。在示例 17-13 中,我们克隆了 tx,在第一个异步代码块外面创建 tx1。我们像第一个 tx 一样将 tx1 移动进代码块。接下来,将原始的 tx 移动进一个 新的 异步代码块,其中会用一个稍微更长的延迟发送更多的消息。我们碰巧将新代码块放在接收消息的异步代码块之后,不过也可以放在之前。关键在于 future 被 await 的顺序,而不是它们创建的顺序。 两个发送消息的异步代码块需要是 async move 代码块,如此 tx 和 tx1 都会在代码块结束后被丢弃。否则我们就会陷入到开始时同样的无限循环。最后,我们从 trpl::join 切换到 trpl::join3 来处理额外的 future。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let (tx, mut rx) = trpl::channel(); let tx1 = tx.clone(); let tx1_fut = async move { let vals = vec![ String::from(\"hi\"), String::from(\"from\"), String::from(\"the\"), String::from(\"future\"), ]; for val in vals { tx1.send(val).unwrap(); trpl::sleep(Duration::from_millis(500)).await; } }; let rx_fut = async { while let Some(value) = rx.recv().await { println!(\"received '{value}'\"); } }; let tx_fut = async move { let vals = vec![ String::from(\"more\"), String::from(\"messages\"), String::from(\"for\"), String::from(\"you\"), ]; for val in vals { tx.send(val).unwrap(); trpl::sleep(Duration::from_millis(1500)).await; } }; trpl::join3(tx1_fut, tx_fut, rx_fut).await;\n# });\n# } 示例 17-13:通过多个异步代码块使用多个发送者 现在我们会看到所有来在两个发送 future 的消息。因为发送 future 采用了稍微不同的发送延迟,消息也会以这些不同的延迟接收。 received 'hi'\nreceived 'more'\nreceived 'from'\nreceived 'the'\nreceived 'messages'\nreceived 'future'\nreceived 'for'\nreceived 'you' 这是一个良好的开始,不过它将我们限制到少数几个 future:join 两个,或者 join3 三个。让我们看下如何处理更多的 future。","breadcrumbs":"Async 和 await » 并发与 async » 消息传递","id":"319","title":"消息传递"},"32":{"body":"要创建一个新项目,进入第一章中创建的 projects 目录,使用 Cargo 新建一个项目,如下: $ cargo new guessing_game\n$ cd guessing_game 第一个命令,cargo new,它获取项目的名称(guessing_game)作为第一个参数。第二个命令进入到新创建的项目目录。 看看生成的 Cargo.toml 文件: 文件名:Cargo.toml [package]\nname = \"guessing_game\"\nversion = \"0.1.0\"\nedition = \"2021\" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] 正如第一章那样,cargo new 生成了一个 “Hello, world!” 程序。查看 src/main.rs 文件: 文件名:src/main.rs fn main() { println!(\"Hello, world!\");\n} 现在使用 cargo run 命令,一步完成 “Hello, world!” 程序的编译和运行: $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.50s Running `target/debug/guessing_game`\nHello, world! 当你需要在项目中快速迭代时,run 命令就能派上用场,正如我们在这个游戏项目中做的,在下一次迭代之前快速测试每一次迭代。 重新打开 src/main.rs 文件。我们将会在这个文件中编写全部的代码。","breadcrumbs":"写个猜数字游戏 » 准备一个新项目","id":"32","title":"准备一个新项目"},"320":{"body":"ch17-03-more-futures.md commit 9e85fcc9938e8f8c935d0ad8b4db7f45caaa2ca4 当我们在上一部分从使用两个 future 到三个 future 的时候,我们也必须从使用 join 切换到 join3。每次我们想要改变 join 的 future 数量时都不得不调用一个不同的函数是很烦人的。令人高兴的是,我们有一个宏版本的 join 可以传递任意数量的参数。它还会自行处理 await 这些 future。因此,我们可以重写示例 17-13 中的代码来使用 join! 而不是 join3,如示例 17-14 所示: 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# # let tx1 = tx.clone();\n# let tx1_fut = async move {\n# let vals = vec![\n# String::from(\"hi\"),\n# String::from(\"from\"),\n# String::from(\"the\"),\n# String::from(\"future\"),\n# ];\n# # for val in vals {\n# tx1.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# # let rx_fut = async {\n# while let Some(value) = rx.recv().await {\n# println!(\"received '{value}'\");\n# }\n# };\n# # let tx_fut = async move {\n# let vals = vec![\n# String::from(\"more\"),\n# String::from(\"messages\"),\n# String::from(\"for\"),\n# String::from(\"you\"),\n# ];\n# # for val in vals {\n# tx.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# trpl::join!(tx1_fut, tx_fut, rx_fut);\n# });\n# } 示例 17-14:使用 `join!` 来等待多个 future 相比于需要在 join 和 join3 和 join4 等等之间切换来说这绝对是一个进步!然而,即便是这个宏形式也只能用于我们提前知道 future 的数量的情况。不过,在现实世界的 Rust 中,将 futures 放进一个集合并接着等待集合中的一些或者全部 future 完成是一个常见的模式。 为了检查一些集合中的所有 future,我们需要遍历并 join 全部 的 future。trpl::join_all 函数接受任何实现了 Iterator trait 的类型,我们在之前的第十三章中学习过它们,所以这正是我们需要的。让我们将 futures 放进一个向量,并将 join! 替换为 join_all。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# # let tx1 = tx.clone();\n# let tx1_fut = async move {\n# let vals = vec![\n# String::from(\"hi\"),\n# String::from(\"from\"),\n# String::from(\"the\"),\n# String::from(\"future\"),\n# ];\n# # for val in vals {\n# tx1.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# # let rx_fut = async {\n# while let Some(value) = rx.recv().await {\n# println!(\"received '{value}'\");\n# }\n# };\n# # let tx_fut = async move {\n# let vals = vec![\n# String::from(\"more\"),\n# String::from(\"messages\"),\n# String::from(\"for\"),\n# String::from(\"you\"),\n# ];\n# # for val in vals {\n# tx.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# let futures = vec![tx1_fut, rx_fut, tx_fut]; trpl::join_all(futures).await;\n# });\n# } 示例 17-15:将匿名 futures 储存在一个向量中并调用 `join_all` 不幸的是这还不能编译。相反我们会得到这个错误: error[E0308]: mismatched types --> src/main.rs:43:37 |\n8 | let tx1_fut = async move { | _______________________-\n9 | | let vals = vec![\n10 | | String::from(\"hi\"),\n11 | | String::from(\"from\"),\n... |\n19 | | }\n20 | | }; | |_________- the expected `async` block\n21 |\n22 | let rx_fut = async { | ______________________-\n23 | | while let Some(value) = rx.recv().await {\n24 | | println!(\"received '{value}'\");\n25 | | }\n26 | | }; | |_________- the found `async` block\n...\n43 | let futures = vec![tx1_fut, rx_fut, tx_fut]; | ^^^^^^ expected `async` block, found a different `async` block | = note: expected `async` block `{async block@src/main.rs:8:23: 20:10}` found `async` block `{async block@src/main.rs:22:22: 26:10}` = note: no two async blocks, even if identical, have the same type = help: consider pinning your async block and and casting it to a trait object 这可能有点令人惊讶。毕竟没有一个 future 返回了任何值,所以每个代码块都会产生一个 Future<Output = ()>。然而,Future 是一个 trait,而不是一个具体类型。其具体类型是编译器为各个异步代码块生成的(不同的)数据结构。你不能将两个不同的手写的 struct 放进同一个 Vec,同样的原理也适用于编译器生成的不同 struct。 为了使代码能够正常工作,我们需要使用 trait objects ,正如我们在第十二章的 “从 run 函数中返回错误” 中做的那样。(第十八章会详细介绍 trait objects。)使用 trait objects 允许我们将这些类型所产生的不同的匿名 future 视为相同的类型,因为它们都实现了 Future trait。 注意:在第八章中,我们讨论过另一种将多种类型包含进一个 Vec 的方式:使用一个枚举来代表每个可以出现在向量中的不同类型。不过这里我们不能这么做。一方面,没有方法来命名这些不同的类型,因为它们是匿名的。另一方面,我们最开始采用向量和 join_all 的原因是为了处理一个直到运行时之前都不知道是什么的 future 的动态集合。 我们以将 vec! 中的每个 future 用 Box::new 封装来作为开始,如示例 17-16 所示。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# # let tx1 = tx.clone();\n# let tx1_fut = async move {\n# let vals = vec![\n# String::from(\"hi\"),\n# String::from(\"from\"),\n# String::from(\"the\"),\n# String::from(\"future\"),\n# ];\n# # for val in vals {\n# tx1.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# # let rx_fut = async {\n# while let Some(value) = rx.recv().await {\n# println!(\"received '{value}'\");\n# }\n# };\n# # let tx_fut = async move {\n# let vals = vec![\n# String::from(\"more\"),\n# String::from(\"messages\"),\n# String::from(\"for\"),\n# String::from(\"you\"),\n# ];\n# # for val in vals {\n# tx.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# let futures = vec![Box::new(tx1_fut), Box::new(rx_fut), Box::new(tx_fut)]; trpl::join_all(futures).await;\n# });\n# } 示例 17-16:尝试用 `Box::new` 来对齐 `Vec` 中 future 的类型 不幸的是,代码仍然不能编译。事实上,我们遇到了与之前相同的基本错误,不过这次我们会在第二个和第三个 Box::new 调用处各得到一个错误,同时还会得到一个提及 Unpin trait 的新错误。我们一会再回到 Unpin 错误上。首先,让我们通过显式标注 futures 的类型来修复 Box::new 调用的类型错误: 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{future::Future, time::Duration};\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# # let tx1 = tx.clone();\n# let tx1_fut = async move {\n# let vals = vec![\n# String::from(\"hi\"),\n# String::from(\"from\"),\n# String::from(\"the\"),\n# String::from(\"future\"),\n# ];\n# # for val in vals {\n# tx1.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# # let rx_fut = async {\n# while let Some(value) = rx.recv().await {\n# println!(\"received '{value}'\");\n# }\n# };\n# # let tx_fut = async move {\n# let vals = vec![\n# String::from(\"more\"),\n# String::from(\"messages\"),\n# String::from(\"for\"),\n# String::from(\"you\"),\n# ];\n# # for val in vals {\n# tx.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# let futures: Vec<Box<dyn Future<Output = ()>>> = vec![Box::new(tx1_fut), Box::new(rx_fut), Box::new(tx_fut)];\n# # trpl::join_all(futures).await;\n# });\n# } 示例 17-17:通过使用一个显式类型声明来修复余下的类型不匹配错误 这里必须编写的类型有一点复杂,让我们逐步过一遍: 最内层的类型是 future 本身。我们显式地指出 future 的输出类型是单元类型 (),其编写为 Future<Output = ()>。 接着使用 dyn 将 trait 标记为动态的。 整个 trait 引用被封装进一个 Box。 最后,我们显式表明 futures 是一个包含这些项的 Vec。 这已经有了很大的区别。现在当我们运行编译器时,就只会有提到 Unpin 的错误了。虽然这里有三个错误,但请注意它们每个的内容都非常相似。 error[E0277]: `{async block@src/main.rs:8:23: 20:10}` cannot be unpinned --> src/main.rs:46:24 |\n46 | trpl::join_all(futures).await; | -------------- ^^^^^^^ the trait `Unpin` is not implemented for `{async block@src/main.rs:8:23: 20:10}`, which is required by `Box<{async block@src/main.rs:8:23: 20:10}>: std::future::Future` | | | required by a bound introduced by this call | = note: consider using the `pin!` macro consider using `Box::pin` if you need to access the pinned value outside of the current scope = note: required for `Box<{async block@src/main.rs:8:23: 20:10}>` to implement `std::future::Future`\nnote: required by a bound in `join_all` --> /Users/chris/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.30/src/future/join_all.rs:105:14 |\n102 | pub fn join_all<I>(iter: I) -> JoinAll<I::Item> | -------- required by a bound in this function\n...\n105 | I::Item: Future, | ^^^^^^ required by this bound in `join_all` error[E0277]: `{async block@src/main.rs:8:23: 20:10}` cannot be unpinned --> src/main.rs:46:9 |\n46 | trpl::join_all(futures).await; | ^^^^^^^^^^^^^^^^^^^^^^^ the trait `Unpin` is not implemented for `{async block@src/main.rs:8:23: 20:10}`, which is required by `Box<{async block@src/main.rs:8:23: 20:10}>: std::future::Future` | = note: consider using the `pin!` macro consider using `Box::pin` if you need to access the pinned value outside of the current scope = note: required for `Box<{async block@src/main.rs:8:23: 20:10}>` to implement `std::future::Future`\nnote: required by a bound in `JoinAll` --> /Users/chris/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.30/src/future/join_all.rs:29:8 |\n27 | pub struct JoinAll<F> | ------- required by a bound in this struct\n28 | where\n29 | F: Future, | ^^^^^^ required by this bound in `JoinAll` error[E0277]: `{async block@src/main.rs:8:23: 20:10}` cannot be unpinned --> src/main.rs:46:33 |\n46 | trpl::join_all(futures).await; | ^^^^^ the trait `Unpin` is not implemented for `{async block@src/main.rs:8:23: 20:10}`, which is required by `Box<{async block@src/main.rs:8:23: 20:10}>: std::future::Future` | = note: consider using the `pin!` macro consider using `Box::pin` if you need to access the pinned value outside of the current scope = note: required for `Box<{async block@src/main.rs:8:23: 20:10}>` to implement `std::future::Future`\nnote: required by a bound in `JoinAll` --> /Users/chris/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.30/src/future/join_all.rs:29:8 |\n27 | pub struct JoinAll<F> | ------- required by a bound in this struct\n28 | where\n29 | F: Future, | ^^^^^^ required by this bound in `JoinAll` Some errors have detailed explanations: E0277, E0308.\nFor more information about an error, try `rustc --explain E0277`. 这里有 很多 内容需要分析,所以让我们拆开来看。信息的第一部分告诉我们第一个异步代码块(src/main.rs:8:23: 20:10)没有实现 Unpin trait,并建议使用 pin! 或 Box::pin 来修复,在本章的稍后部分我们会深入 Pin 和 Unpin 的一些更多细节。不过现在我们可以仅仅遵循编译器的建议来解困!在示例 17-18 中,我们以更新 futures 的类型声明作为开始,用 Pin 来封装每个 Box。其次,我们使用 Box::pin 来 pin 住 futures 自身。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{\n# future::Future,\n# pin::{pin, Pin},\n# time::Duration,\n# };\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# # let tx1 = tx.clone();\n# let tx1_fut = pin!(async move {\n# let vals = vec![\n# String::from(\"hi\"),\n# String::from(\"from\"),\n# String::from(\"the\"),\n# String::from(\"future\"),\n# ];\n# # for val in vals {\n# tx1.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# });\n# # let rx_fut = pin!(async {\n# while let Some(value) = rx.recv().await {\n# println!(\"received '{value}'\");\n# }\n# });\n# # let tx_fut = pin!(async move {\n# let vals = vec![\n# String::from(\"more\"),\n# String::from(\"messages\"),\n# String::from(\"for\"),\n# String::from(\"you\"),\n# ];\n# # for val in vals {\n# tx.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# });\n# let futures: Vec<Pin<Box<dyn Future<Output = ()>>>> = vec![Box::pin(tx1_fut), Box::pin(rx_fut), Box::pin(tx_fut)];\n# # trpl::join_all(futures).await;\n# });\n# } 示例 17-18:使用 `Pin` 和 `Box::pin` 来约束 `Vec` 的类型 如果编译并运行代码,我们终于会得到我们期望的输出: received 'hi'\nreceived 'more'\nreceived 'from'\nreceived 'messages'\nreceived 'the'\nreceived 'for'\nreceived 'future'\nreceived 'you' (长舒一口气!) 这里还有一些我们可以进一步探索的内容。首先,因为通过 Box 来将这些 futures 放到堆上,使用 Pin<Box<T>> 会带来少量的额外开销,而我们这么做仅仅是为了使类型对齐。毕竟这里实际上并不 需要 堆分配:这些 futures 对于这个特定的函数来说是本地的。如上所述,Pin 本身是一个封装类型,因此我们可以在 Vec 中拥有单一类型的好处(也就是使用 Box 的初始原因)而不用堆分配。我们可以通过 std::pin::pin 宏来直接对每个 future 使用 Pin。 然而,我们仍然必须现实地知道被 pin 的引用的类型:否则 Rust 仍然不知道如何将它们解释为动态 trait objects,这是将它们放进 Vec 所需的。因此我们在定义每个 future 的时候使用 pin!,并将 futures 定义为一个包含被 pin 的动态 Future 类型的可变引用的 Vec,如示例 17-19 所示。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{\n# future::Future,\n# pin::{pin, Pin},\n# time::Duration,\n# };\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# # let tx1 = tx.clone(); let tx1_fut = pin!(async move { // --snip--\n# let vals = vec![\n# String::from(\"hi\"),\n# String::from(\"from\"),\n# String::from(\"the\"),\n# String::from(\"future\"),\n# ];\n# # for val in vals {\n# tx1.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# } }); let rx_fut = pin!(async { // --snip--\n# while let Some(value) = rx.recv().await {\n# println!(\"received '{value}'\");\n# } }); let tx_fut = pin!(async move { // --snip--\n# let vals = vec![\n# String::from(\"more\"),\n# String::from(\"messages\"),\n# String::from(\"for\"),\n# String::from(\"you\"),\n# ];\n# # for val in vals {\n# tx.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# } }); let futures: Vec<Pin<&mut dyn Future<Output = ()>>> = vec![tx1_fut, rx_fut, tx_fut];\n# # trpl::join_all(futures).await;\n# });\n# } 示例 17-19:通过 `pin!` 宏来直接使用 `Pin` 以避免不必要的堆分配 目前为止我们一直忽略了可能有不同 Output 类型的事实。例如,在示例 17-20 中,匿名 future a 实现了 Future<Output = u32>,匿名 future b 实现了 Future<Output = &str>,而匿名 future c 实现了 Future<Output = bool>。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # fn main() {\n# trpl::run(async { let a = async { 1u32 }; let b = async { \"Hello!\" }; let c = async { true }; let (a_result, b_result, c_result) = trpl::join!(a, b, c); println!(\"{a_result}, {b_result}, {c_result}\");\n# });\n# } 示例 17-20:三个不同类型的 futures 我们可以使用 trpl::join! 来 await 它们,因为它允许你传递多个 future 类型并产生一个这些类型的元组。我们 不能 使用 trpl::join_all,因为它要求传递的 future 都拥有相同的类型。请记住,那个错误正是我们开启 Pin 探索之旅的原因! 这是一个基础的权衡取舍:要么我们可以使用 join_all 处理动态数量的 future,只要它们都有相同的类型;要么我们可以使用 join 函数或者 join! 宏来处理固定数量的 future,哪怕它们有着不同的类型。不过这与 Rust 处理任何其它类型是一样的。Future 并不特殊,即便我们采用了一些友好的语法来处理它们,而这其实是好事。","breadcrumbs":"Async 和 await » 使用任意数量的 futures » 使用任意数量的 futures","id":"320","title":"使用任意数量的 futures"},"321":{"body":"当我们使用 join 系列函数和宏来 “join” future 时,我们要求它们 全部 结束才能继续。虽然有时我们只需要 部分 future 结束就能继续,这有点像一个 future 与另一个 future 竞争。 在示例 17-21 中,我们再次使用 trpl::race 来运行 slow 和 fast 两个 future 并相互竞争。它们每一个都会在开始运行时打印一条消息,通过调用并 await sleep 暂停一段时间,接着在其结束时打印另一条消息。然后我们将它们传递给 trpl::race 并等待其中一个结束。(结果不会令人意外:fast 会赢!)不同于我们在 第一个异步程序 中使用 race 的时候,这里忽略了其返回的 Either 实例,因为所有有趣的行为都发生在异步代码块中。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let slow = async { println!(\"'slow' started.\"); trpl::sleep(Duration::from_millis(100)).await; println!(\"'slow' finished.\"); }; let fast = async { println!(\"'fast' started.\"); trpl::sleep(Duration::from_millis(50)).await; println!(\"'fast' finished.\"); }; trpl::race(slow, fast).await;\n# });\n# } 示例 17-21:使用 `race` 来获取哪个 future 最先结束的结果 请注意如果你反转 race 参数的顺序,“started” 消息的顺序会改变,即使 fast future 总是第一个结束。这是因为这个特定的 race 函数实现并不是公平的。它总是以传递的参数的顺序来运行传递的 futures。其它的实现 是 公平的,并且会随机选择首先轮询的 future。不过无论我们使用的 race 实现是否公平,其中 一个 future 会在另一个任务开始之前一直运行到异步代码块中第一个 await 为止。 回忆一下 第一个异步程序 中提到在每一个 await point,如果被 await 的 future 还没有就绪,Rust 会给运行时一个机会来暂停该任务并切换到另一个任务。反过来也是正确的:Rust 只会 在一个 await point 暂停异步代码块并将控制权交还给运行时。await points 之间的一切都是同步。 这意味着如果你在异步代码块中做了一堆工作而没有一个 await point,则那个 future 会阻塞其它任何 future 继续进行。有时你可能会听说这称为一个 future starving 其它 future。在一些情况中,这可能不是什么大问题。不过,如果你在进行某种昂贵的设置或者长时间运行的任务,亦或有一个 future 会无限持续运行某些特定任务的话,你会需要思考在何时何地将控制权交还运行时。 同样地,如果你有长时间运行的阻塞操作,异步可能是一个提供了将程序的不同部分相互关联起来的实用工具。 不过在这种情况下 如何 将控制权交还运行时呢?","breadcrumbs":"Async 和 await » 使用任意数量的 futures » future 竞争","id":"321","title":"future 竞争"},"322":{"body":"让我们模拟一个长时间运行的操作。示例 17-22 引入了一个 slow 函数。它使用 std::thread::sleep 而不是 trpl::sleep 因此 slow 调用会阻塞当前线程若干毫秒。我们可以用 slow 来代表现实世界中的长时间运行并且会阻塞的操作。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{thread, time::Duration};\n# # fn main() {\n# trpl::run(async {\n# // We will call `slow` here later\n# });\n# }\n# fn slow(name: &str, ms: u64) { thread::sleep(Duration::from_millis(ms)); println!(\"'{name}' ran for {ms}ms\");\n} 示例 17-22:使用 `thread::sleep` 来模拟缓慢的操作 在示例 17-22 中,我们使用 slow 在几个 future 中模拟这类 CPU 密集型工作。首先,每个 future 只会在进行了一系列缓慢操作 之后 才将控制权交还给运行时。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{thread, time::Duration};\n# # fn main() {\n# trpl::run(async { let a = async { println!(\"'a' started.\"); slow(\"a\", 30); slow(\"a\", 10); slow(\"a\", 20); trpl::sleep(Duration::from_millis(50)).await; println!(\"'a' finished.\"); }; let b = async { println!(\"'b' started.\"); slow(\"b\", 75); slow(\"b\", 10); slow(\"b\", 15); slow(\"b\", 350); trpl::sleep(Duration::from_millis(50)).await; println!(\"'b' finished.\"); }; trpl::race(a, b).await;\n# });\n# }\n# # fn slow(name: &str, ms: u64) {\n# thread::sleep(Duration::from_millis(ms));\n# println!(\"'{name}' ran for {ms}ms\");\n# } 示例 17-23:使用 `thread::sleep` 来模拟缓慢的操作 如果运行代码,你会看到这些输出: 'a' started.\n'a' ran for 30ms\n'a' ran for 10ms\n'a' ran for 20ms\n'b' started.\n'b' ran for 75ms\n'b' ran for 10ms\n'b' ran for 15ms\n'b' ran for 350ms\n'a' finished. 与上一个示例一样,race 仍然在 a 完成后就立刻结束了。两个 future 之间没有交替运行。a future 一直进行其工作直到 trpl::sleep 调用被 await,然后 b future 一直进行其工作直到它自己的 trpl::sleep 调用被 await,再然后 a future 才完成。为了使两个 future 在各自缓慢任务之间都能有所进展,我们需要 await point 才能将控制权交还给运行时。这意味着我们需要一些可以 await 的东西! 我们已经在示例 17-23 中见过这类交接发生:如果去掉 a future 结尾的 trpl::sleep,那么当它完成时 b future 完全 不会运行。也许我们可以使用 sleep 函数来作为开始呢? 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{thread, time::Duration};\n# # fn main() {\n# trpl::run(async { let one_ms = Duration::from_millis(1); let a = async { println!(\"'a' started.\"); slow(\"a\", 30); trpl::sleep(one_ms).await; slow(\"a\", 10); trpl::sleep(one_ms).await; slow(\"a\", 20); trpl::sleep(one_ms).await; println!(\"'a' finished.\"); }; let b = async { println!(\"'b' started.\"); slow(\"b\", 75); trpl::sleep(one_ms).await; slow(\"b\", 10); trpl::sleep(one_ms).await; slow(\"b\", 15); trpl::sleep(one_ms).await; slow(\"b\", 35); trpl::sleep(one_ms).await; println!(\"'b' finished.\"); };\n# # trpl::race(a, b).await;\n# });\n# }\n# # fn slow(name: &str, ms: u64) {\n# thread::sleep(Duration::from_millis(ms));\n# println!(\"'{name}' ran for {ms}ms\");\n# } 示例 17-24:使用 `sleep` 让操作切换以继续进行 在示例 17-24 中,我们在 slow 调用之间增加了 trpl::sleep 调用和 await points。现在两个 future 的工作会相互交替运行: 'a' started.\n'a' ran for 30ms\n'b' started.\n'b' ran for 75ms\n'a' ran for 10ms\n'b' ran for 10ms\n'a' ran for 20ms\n'b' ran for 15ms\n'a' finished. a future 仍然会在交还控制权给 b 之前运行一会儿,因为它在调用 trpl::sleep 之前就调用了 slow,不过在这之后两个 future 会在触发 await point 时来回切换。在这个例子中,我们在 slow 之后这么做,不过我们可以在任何合适的地方拆分任务。 不过我们并不是真的想在这里 休眠 :我们希望尽可能快地取得进展。我们仅仅是需要交还控制权给运行时。我们可以使用 yield_now 函数来直接这么做。在示例 17-25 中,我们将所有的 sleep 调用替换为 yield_now。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{thread, time::Duration};\n# # fn main() {\n# trpl::run(async { let a = async { println!(\"'a' started.\"); slow(\"a\", 30); trpl::yield_now().await; slow(\"a\", 10); trpl::yield_now().await; slow(\"a\", 20); trpl::yield_now().await; println!(\"'a' finished.\"); }; let b = async { println!(\"'b' started.\"); slow(\"b\", 75); trpl::yield_now().await; slow(\"b\", 10); trpl::yield_now().await; slow(\"b\", 15); trpl::yield_now().await; slow(\"b\", 35); trpl::yield_now().await; println!(\"'b' finished.\"); };\n# # trpl::race(a, b).await;\n# });\n# }\n# # fn slow(name: &str, ms: u64) {\n# thread::sleep(Duration::from_millis(ms));\n# println!(\"'{name}' ran for {ms}ms\");\n# } 示例 17-25:使用 `yield_now` 让操作切换以继续进行 这不仅更为清楚地表明了实际的意图而且更显著地快于使用 sleep,因为像这样使用 sleep 的定时器通常受限于其控制粒度。例如我们使用的 sleep 版本,会至少休眠一毫秒,哪怕我们传递一纳秒的 Duration。而且,现代计算机非常 快速 :它们可以在一毫秒内完成很多工作! 你可以自行设置一些基准测试来验证这一点,例如示例 17-26 中的这个。(这并不是一个特别严谨的进行性能测试的方法,不过用来展示这里的区别是足够的。)这里,我们省略了所有的状态打印,传递一纳秒的 Duration 给 trpl::sleep,并让每一个 future 各自运行,不在 future 之间切换。接着我们运行 1000 次迭代并对比下使用 trpl::sleep 的 future 和使用 trpl::yield_now 的 future 的运行时间。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::{Duration, Instant};\n# # fn main() {\n# trpl::run(async { let one_ns = Duration::from_nanos(1); let start = Instant::now(); async { for _ in 1..1000 { trpl::sleep(one_ns).await; } } .await; let time = Instant::now() - start; println!( \"'sleep' version finished after {} seconds.\", time.as_secs_f32() ); let start = Instant::now(); async { for _ in 1..1000 { trpl::yield_now().await; } } .await; let time = Instant::now() - start; println!( \"'yield' version finished after {} seconds.\", time.as_secs_f32() );\n# });\n# } 示例 17-26:对比 `sleep` 和 `yield_now` 的性能 使用 yield_now 的版本要 快得多 ! 这意味着取决于程序所作的其它工作,异步操作甚至在计算密集型任务中也有用处,因为它提供了一个结构化程序中不同部分之间关系的实用工具。这是一种形式的 协同多任务处理 ( cooperative multitasking ),每个 futrue 有权通过 await point 来决定何时交还控制权。因此每个 future 也有责任避免长时间阻塞。在一些基于 Rust 的嵌入式系统中,这是 唯一 的多任务处理类型! 当然,在真实代码中,你通常不会在每一行上都交替使用 await 点来调用函数。虽然这样控制 yielding 相对来说更为廉价,但也不是毫无代价的!在很多情况下,尝试将计算密集型任务拆分可能会显著降低其速度,所以有时为了 整体 性能简单地让一个操作阻塞是更好的选择。你应该总是通过测量来观察代码真正的性能瓶颈是什么。不过其底层的考量在于重要的是要牢记你是否 确实 观察到了很多期望并发进行的工作在串行地进行。","breadcrumbs":"Async 和 await » 使用任意数量的 futures » Yielding","id":"322","title":"Yielding"},"323":{"body":"我们也可以将 futures 组合起来形成一个新模式。例如,我们可以使用已有的异步代码块构建一个 timeout 函数。当我们完成时,其结果将是另一个可以用来构建进一步异步抽象的代码块。 示例 17-27 展示了我们预期 timeout 如何处理一个缓慢运行的 future。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let slow = async { trpl::sleep(Duration::from_millis(100)).await; \"I finished!\" }; match timeout(slow, Duration::from_millis(10)).await { Ok(message) => println!(\"Succeeded with '{message}'\"), Err(duration) => { println!(\"Failed after {} seconds\", duration.as_secs()) } }\n# });\n# } 示例 17-27:使用假想的 `timeout` 来运行一个缓慢运行的操作并设置一个时限 让我们来实现它!首先,让我们考虑一下 timeout 的 API: 它需要是一个 async 函数以便可以 await。 它的第一个参数应该是需要运行的 future。我们可以使用泛型以便可以处理任意 future。 它的第二个参数将是需要等待的最大时间。如果我们使用 Duration 的话,将会使得将其直接传递给 trpl::sleep 变得简单。 它应该返回一个 Result。如果 future 成功完成,Result 将会是包含 future 所产生的值的 Ok。如果超时先发生,Result 将会是包含超时等待的持续时间的 Err。 示例 17-28 展示了这个抽象。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{future::Future, time::Duration};\n# # fn main() {\n# trpl::run(async {\n# let slow = async {\n# trpl::sleep(Duration::from_secs(5)).await;\n# \"Finally finished\"\n# };\n# # match timeout(slow, Duration::from_millis(10)).await {\n# Ok(message) => println!(\"Succeeded with '{message}'\"),\n# Err(duration) => {\n# println!(\"Failed after {} seconds\", duration.as_secs())\n# }\n# }\n# });\n# }\n# async fn timeout<F: Future>( future_to_try: F, max_time: Duration,\n) -> Result<F::Output, Duration> { // Here is where our implementation will go!\n} 示例 17-28:定义 `timeout` 的签名 这满足了我们对类型的目标。现在让我们思考下所需的 行为 :我们需要传递进来的 future 在持续时间内相互竞争。我们可以使用 trpl::sleep 和 duration 来创建一个定时器 future,并使用 trpl::race 来运行定时器 future 和调用者传递进来的 future。 我们还知道 race 是不公平的,并按照传递的顺序轮询参数。因此,我们首先传递 future_to_try 给 race 以便哪怕 max_time 是一个非常短的持续时间它也能有机会完成。如果 future_to_try 首先完成,race 会返回 Left 和 future 的输出。如果 timer 首先完成,race 会返回 Right 和定时器的输出 ()。 在示例 17-29 中,我们匹配 await trpl::race 的结果。如果 future_to_try 成功并得到一个 Left(output),我们返回 Ok(output)。相反如果休眠定时器超时了并得到一个 Right(()),则我们通过 _ 忽略 () 并返回 Err(max_time)。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{future::Future, time::Duration};\n# use trpl::Either; // --snip-- fn main() { trpl::run(async { let slow = async { trpl::sleep(Duration::from_secs(5)).await; \"Finally finished\" }; match timeout(slow, Duration::from_secs(2)).await { Ok(message) => println!(\"Succeeded with '{message}'\"), Err(duration) => { println!(\"Failed after {} seconds\", duration.as_secs()) } } });\n} async fn timeout<F: Future>( future_to_try: F, max_time: Duration,\n) -> Result<F::Output, Duration> { match trpl::race(future_to_try, trpl::sleep(max_time)).await { Either::Left(output) => Ok(output), Either::Right(_) => Err(max_time), }\n# } 示例 17-29:使用 `race` 和 `sleep` 来定义 `timeout` 于是我们有了一个由另外两个帮助函数构成的可以工作的 timeout。如果我们运行代码,它会在超时之后打印失败模式: Failed after 2 seconds 由于 future 可以和其他 future 组合,你可以使用更小的异步代码块来构建非常强力的工具。例如,可以使用相同的方式来组合超时和重试,并转而将其用于类似网络调用的工作,这正是本章开头的一个示例! 在实践中,你会直接处理 async 和 await,其次才是类似 join、join_all、race 等函数和宏,在使用这些 API 时你只会偶尔遇到 pin。 现在我们见过了一系列同时处理多个 future 的方法了。接下来,我们来看看如何通过( 流 ) streams 处理一个时间序列的多个 future。不过,在此之前,这里有几个你可能想要先考虑的问题: 我们在 Vec 上使用了 join_all 来等待一组中的所有 future 完成。相反该如何使用 Vec 来依次处理一个序列的 future 呢?这么做有哪些权衡取舍呢? 仔细观察 futures crate 中的 futures::stream::FuturesUnordered 类型。使用它与使用 Vec 又有什么区别呢?(不用担心它来自与 crate 的 stream 部分的事实;它刚好能处理任何 future 的集合。)","breadcrumbs":"Async 和 await » 使用任意数量的 futures » 构建我们自己的异步抽象","id":"323","title":"构建我们自己的异步抽象"},"324":{"body":"ch17-04-streams.md commit f04d20fe8d1a49c3bffa10a3086c58e527ff0a90 到本章的目前为止,我们大部分时间停留在独立的 future 上。一个重要的例外就是我们用过的异步信道。回忆一下在本章之前的 “消息传递” 中我们如何使用异步信道接收端的。异步 recv 方法随着时间的推移产生一个序列的项。这是一个通用的多的模式的实例,通常被称为 流 ( stream )。 一个序列的项是我们之前是见过的,回忆一下第十三章的 Iterator trait,不过迭代器和异步信道接收端有两个区别。第一个区别是时间的维度:迭代器是同步的,而信道接收端是异步的。第二个区别是 API。当直接处理 Iterator 时,我们会调用其同步 next 方法。对于这个特定的 trpl::Receiver 流,我们调用一个异步的 recv 方法。不过这两个 API 看起来非常相似。 这种相似性并非巧合。流类似于一种异步形式的迭代器。不过鉴于 trpl::Receiver 专门等待接收消息,多用途的流 API 则更为通用:它像 Iterator 一样提供了下一个项,不过是异步版本的。Rust 中迭代器和流的相似性意味着我们实际上可以从任何迭代器上创建流。就迭代器而言,可以通过调用其 next 方法并 await 输出来使用流,如示例 17-30 所示。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # fn main() {\n# trpl::run(async { let values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let iter = values.iter().map(|n| n * 2); let mut stream = trpl::stream_from_iter(iter); while let Some(value) = stream.next().await { println!(\"The value was: {value}\"); }\n# });\n# } 示例 17-30:从迭代器创建流并打印其值 我们以一组数字作为开始,将其转换为一个迭代器并接着调用 map 将其所有值翻倍。然后使用 trpl::stream_from_iter 函数将迭代器转换为流。再然后在 while let 循环中到达时循环处理流中的项。 不幸的是当我们尝试运行代码时,代码无法编译。相反如果我们观察其输出,它会报告没有可用的 next 方法。 error[E0599]: no method named `next` found for struct `Iter` in the current scope --> src/main.rs:10:40 |\n10 | while let Some(value) = stream.next().await { | ^^^^ | = note: the full type name has been written to 'file:///projects/async_await/target/debug/deps/async_await-9de943556a6001b8.long-type-1281356139287206597.txt' = note: consider using `--verbose` to print the full type name to the console = help: items from traits can only be used if the trait is in scope\nhelp: the following traits which provide `next` are implemented but not in scope; perhaps you want to import one of them |\n1 + use crate::trpl::StreamExt; |\n1 + use futures_util::stream::stream::StreamExt; |\n1 + use std::iter::Iterator; |\n1 + use std::str::pattern::Searcher; |\nhelp: there is a method `try_next` with a similar name |\n10 | while let Some(value) = stream.try_next().await { | ~~~~~~~~ 正如输出中所建议的,编译器错误的原因是我们需要在作用域中有正确的 trait 以便能够使用 next 方法。鉴于目前为止的讨论,你可能会合理地推测是 Stream,不过这里需要的 trait 实际上是 StreamExt。这里的 Ext 是 “extension”:在 Rust 社区中这是用另一个 trait 扩展 trait 的常见模式。 为什么我们需要 StreamExt 而不是 Stream,而 Stream trait 本身又是做什么的呢?简单来说,答案是贯穿整个 Rust 生态系统,Stream trait 定义了一个底层接口用于有效地组合 Iterator 和 Future trait。StreamExt trait 在 Stream 之上提供了一组高层 API,这包括 next 和其它类似于 Iterator trait 提供的工具方法。在本章的最后我们会回到 Stream 和 StreamExt 并介绍更多细节。现在这已经足够我们继续了。 对编译器错误的修复是增加一个 trpl::StreamExt 的 use 语句,如示例 17-31 所示。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# use trpl::StreamExt; fn main() { trpl::run(async { let values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let iter = values.iter().map(|n| n * 2); let mut stream = trpl::stream_from_iter(iter); while let Some(value) = stream.next().await { println!(\"The value was: {value}\"); } });\n} 示例 17-31:成功使用迭代器作为流的基础 将所有这些代码片段拼凑在一起,这段代码如我们预期般运行!更重要的是,现在我们在作用域中拥有 StreamExt,就可以使用所有其工具方法。例如在示例 17-32 中,我们使用 filter 方法来过滤掉所有不是 3 或者 5 的倍数的项。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# use trpl::StreamExt; fn main() { trpl::run(async { let values = 1..101; let iter = values.map(|n| n * 2); let stream = trpl::stream_from_iter(iter); let mut filtered = stream.filter(|value| value % 3 == 0 || value % 5 == 0); while let Some(value) = filtered.next().await { println!(\"The value was: {value}\"); } });\n} 示例 17-32:使用 `StreamExt::filter` 方法来过滤 `Stream` 当然这并不是非常的有趣。我们完全可以使用普通的迭代器而不用任何异步操作来做到这些。所以让我们看看一些其它的只能用流的内容。","breadcrumbs":"Async 和 await » 流(Streams) » 流(Streams)","id":"324","title":"流(Streams)"},"325":{"body":"很多概念天然地可以用流来代表:队列中可用的项;或者处理超过计算机内存的数据,一次只能从文件系统拉取一个块;或者通过网络随着时间推移到达的数据。因为流是 future,我们也可以将其用于任何其它类型的 future,并且我们可以用一种非常有趣的方式来组合它们。例如,我们可以批量处理事件来避免触发过多的网络调用,为一系列的长时间运行的任务设置超时,或者对用户接口事件限速来避免进行无尽的工作。 让我们构建一个小的消息流作为开始,将其作为一个可能从 WebSocket 或者其它现实世界中的通信协议中遇到的数据流的替代。在示例 17-33 中,我们创建了一个返回 impl Stream<Item = String> 的 get_messages 函数。作为其实现,我们创建了一个异步信道,循环英文字母表的前是个字符,并通过信道发送它们。 我们还使用了一个新类型:ReceiverStream,它将 trpl::channel 的 rx 接收端转换为一个带有带有 next 方法的 Stream。回到 main,我们使用了一个 while let 循环来打印来自流中的所有消息。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# use trpl::{ReceiverStream, Stream, StreamExt}; fn main() { trpl::run(async { let mut messages = get_messages(); while let Some(message) = messages.next().await { println!(\"{message}\"); } });\n} fn get_messages() -> impl Stream<Item = String> { let (tx, rx) = trpl::channel(); let messages = [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\"]; for message in messages { tx.send(format!(\"Message: '{message}'\")).unwrap(); } ReceiverStream::new(rx)\n} 示例 17-33:使用 `rx` 接收端作为一个 `ReceiverStream`","breadcrumbs":"Async 和 await » 流(Streams) » 组合流","id":"325","title":"组合流"},"326":{"body":"","breadcrumbs":"Async 和 await » 深入理解 async 相关的 traits » 深入理解 async 相关的 traits","id":"326","title":"深入理解 async 相关的 traits"},"327":{"body":"","breadcrumbs":"Async 和 await » Futures,任务(tasks)和线程(threads) » Futures,任务(tasks)和线程(threads)","id":"327","title":"Futures,任务(tasks)和线程(threads)"},"328":{"body":"ch18-00-oop.md commit 398d6f48d2e6b7b15efd51c4541d446e89de3892 面向对象编程(Object-Oriented Programming,OOP)是一种对程序进行建模方式。对象(Object)作为一个编程概念来源于 20 世纪 60 年代的 Simula 编程语言。这些对象影响了 Alan Kay 的编程架构,该架构中对象之间互相传递消息。他在 1967 年创造了 面向对象编程 ( object-oriented programming )这个术语。关于 OOP 是什么有很多相互矛盾的定义;在一些定义下,Rust 是面向对象的;在其他定义下,Rust 不是。在本章节中,我们会探索一些被普遍认为是面向对象的特性和这些特性是如何体现在 Rust 语言习惯中的。接着会展示如何在 Rust 中实现面向对象设计模式,并讨论这么做与利用 Rust 自身的一些优势实现的方案相比有什么取舍。","breadcrumbs":"Rust 的面向对象编程特性 » Rust 的面向对象特性","id":"328","title":"Rust 的面向对象特性"},"329":{"body":"ch18-01-what-is-oo.md commit 398d6f48d2e6b7b15efd51c4541d446e89de3892 关于一门语言必须具备哪些特征才能被视为面向对象,目前在编程社区中并没有共识。Rust 受到了许多编程范式的影响,包括面向对象编程(OOP);例如,在第 13 章中,我们探讨了来自函数式编程的特性。可以说,面向对象的语言共有一些共同的特征,即对象、封装和继承。我们将会讨论这些特征分别是什么,以及 Rust 是否支持它们。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象语言的特点 » 面向对象语言的特征","id":"329","title":"面向对象语言的特征"},"33":{"body":"猜数字程序的第一部分请求和处理用户输入,并检查输入是否符合预期的格式。首先,我们会允许玩家输入一个猜测。在 src/main.rs 中输入示例 2-1 中的代码。 文件名:src/main.rs use std::io; fn main() { println!(\"Guess the number!\"); println!(\"Please input your guess.\"); let mut guess = String::new(); io::stdin() .read_line(&mut guess) .expect(\"Failed to read line\"); println!(\"You guessed: {}\", guess);\n} 示例 2-1:获取用户猜测并打印的代码 这些代码包含很多信息,我们一行一行地过一遍。为了获取用户输入并打印结果作为输出,我们需要将 io 输入/输出库引入当前作用域。io 库来自于标准库,也被称为 std: use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {}\", guess);\n# } 默认情况下,Rust 设定了若干个会自动导入到每个程序作用域中的标准库内容,这组内容被称为 预导入(prelude) 内容。你可以在 标准库文档 中查看预导入的所有内容。 如果你需要的类型不在预导入内容中,就必须使用 use 语句显式地将其引入作用域。std::io 库提供很多有用的功能,包括接收用户输入的功能。 如第一章所提及,main 函数是程序的入口点: # use std::io;\n# fn main() {\n# println!(\"Guess the number!\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {}\", guess);\n# } fn 语法声明了一个新函数,小括号 () 表明没有参数,大括号 { 作为函数体的开始。 第一章也提及了 println! 是一个在屏幕上打印字符串的宏: # use std::io;\n# # fn main() { println!(\"Guess the number!\"); println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {}\", guess);\n# } 这些代码仅仅打印提示,介绍游戏的内容然后请求用户输入。","breadcrumbs":"写个猜数字游戏 » 处理一次猜测","id":"33","title":"处理一次猜测"},"330":{"body":"由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(Addison-Wesley Professional, 1994)编写的书 Design Patterns: Elements of Reusable Object-Oriented Software ,通称 The Gang of Four (“四人帮”),是一本面向对象设计模式的目录。它这样定义面向对象编程: Object-oriented programs are made up of objects. An object packages both data and the procedures that operate on that data. The procedures are typically called methods or operations . 面向对象的程序由对象组成。一个 对象 包含数据和操作这些数据的过程。这些过程通常被称为 方法 或 操作 。 在这个定义下,Rust 是面向对象的:结构体和枚举包含数据而 impl 块提供了在结构体和枚举之上的方法。虽然带有方法的结构体和枚举并不被 称为 对象,但是它们提供了与对象相同的功能,参考 The Gang of Four 中对象的定义。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象语言的特点 » 对象包含数据和行为","id":"330","title":"对象包含数据和行为"},"331":{"body":"另一个通常与面向对象编程关联的概念是 封装 ( encapsulation ):一个对象的实现细节对使用该对象的代码不可访问。因此,对象交互的唯一方式是通过其公共 API;使用对象的代码不应能直接触及对象的内部并改变数据或行为。这使得程序员能够更改和重构一个对象的内部实现,而无需改变使用该对象的代码。 我们在第 7 章讨论了如何控制封装:我们可以使用 pub 关键字来决定代码中的哪些模块、类型、函数和方法是公有的,而默认情况下其他所有内容都是私有的。例如,我们可以定义一个 AveragedCollection 结构体,其中有一个存有 Vec<i32> 的字段。该结构体还可以有一个字段存储其平均值,以便需要时取用。示例 17-1 给出了 AveragedCollection 结构体的定义: 文件名:src/lib.rs pub struct AveragedCollection { list: Vec<i32>, average: f64,\n} 示例 17-1: AveragedCollection 结构体维护了一个整型列表及其所有元素的平均值。 该结构体被标记为 pub,这样其他代码就可以使用它,但结构体内的字段保持私有。这在这种情况下很重要,因为我们想确保每当列表中添加或删除值时,平均值也会更新。我们通过实现结构体上的 add、remove 和 average 方法来做到这一点,如示例 17-2 所示: 文件名:src/lib.rs # pub struct AveragedCollection {\n# list: Vec<i32>,\n# average: f64,\n# }\n# impl AveragedCollection { pub fn add(&mut self, value: i32) { self.list.push(value); self.update_average(); } pub fn remove(&mut self) -> Option<i32> { let result = self.list.pop(); match result { Some(value) => { self.update_average(); Some(value) } None => None, } } pub fn average(&self) -> f64 { self.average } fn update_average(&mut self) { let total: i32 = self.list.iter().sum(); self.average = total as f64 / self.list.len() as f64; }\n} 示例 17-2: 在 AveragedCollection 结构体上实现了 add、remove 和 average 公有方法 公有方法 add、remove 和 average 是修改 AveragedCollection 实例的唯一方式。当使用 add 方法把一个元素加入到 list 或者使用 remove 方法来删除时,这些方法的实现同时会调用私有的 update_average 方法来更新 average 字段。 list 和 average 是私有的,所以没有其他方式来使得外部的代码直接向 list 增加或者删除元素,否则 list 改变时可能会导致 average 字段不同步。average 方法返回 average 字段的值,这使得外部的代码只能读取 average 而不能修改它。 因为我们已经封装了 AveragedCollection 的实现细节,改动数据结构等内部实现非常简单。例如,可以使用 HashSet<i32> 代替 Vec<i32> 作为 list 字段的类型。只要 add、remove 和 average 这些公有方法的签名保持不变,使用 AveragedCollection 的代码就无需改变。如果我们将 list 设为公有,情况就未必如此: HashSet<i32> 和 Vec<i32> 使用不同的方法增加或移除项,所以如果外部代码直接修改 list ,很可能需要进行更改。 如果封装被认为是面向对象语言所必要的特征,那么 Rust 满足这个要求。在代码中不同的部分控制 pub 的使用来封装实现细节。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象语言的特点 » 封装隐藏了实现细节","id":"331","title":"封装隐藏了实现细节"},"332":{"body":"继承 ( Inheritance )是一种机制:一个对象可以从另一个对象的定义中继承元素,从而获得父对象的数据和行为,无需再次定义。 如果一种语言必须具有继承才能被认为是面向对象语言,那么 Rust 不是其中之一。Rust 不支持定义一个结构体时继承父结构体的字段和方法,除非使用宏。 然而,如果您习惯于在编程过程中使用继承,那么根据运用继承的原因,Rust 提供了其他解决方案。 选择继承有两个主要的原因。其一是代码复用:您可以为一种类型实现特定的行为,继承可将其复用到不同的类型上。在 Rust 代码中可以使用默认 trait 方法实现来进行有限的代码复用,就像示例 10-14 中在 Summary trait 上增加的 summarize 方法的默认实现。任何实现了 Summary trait 的类型都可以使用 summarize 方法而无须进一步实现。这类似于父类有一个方法的实现,继承的子类也拥有这个方法的实现。当实现 Summary trait 时也可以选择覆盖 summarize 的默认实现,这类似于子类覆盖从父类继承方法的实现。 其二与类型系统有关:子类型可以用于父类型被使用的地方。这也被称为 多态 ( polymorphism ):如果多个对象共享某些特征,可以在运行时将它们互相替代。 多态(Polymorphism) 对很多人来说,多态性与继承同义。但它实际上是一个更广义的概念,指的是可以处理多种类型数据的代码。对继承而言,这些类型通常是子类。 Rust 使用泛型来抽象不同可能的类型,并通过 trait bounds 来约束这些类型所必须提供的内容。这有时被称为 bounded parametric polymorphism 。 作为一种语言设计的解决方案,继承在许多新的编程语言中逐渐不被青睐,因为它经常有分享过多代码的风险。子类不应总是共享父类的所有特征,但是继承始终如此。它还引入了在子类上调用方法的可能性,这些方法可能没有意义,或因为方法不适用于子类而导致错误。此外,一些语言只允许单一继承(意味着子类只能从一个类继承),进一步限制了程序设计的灵活性。 出于这些原因,Rust 使用 trait 对象而非继承。接下来我们会讨论 Rust 如何使用 trait 对象实现多态性。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象语言的特点 » 继承,作为类型系统与代码共享","id":"332","title":"继承,作为类型系统与代码共享"},"333":{"body":"ch18-02-trait-objects.md commit 96d4b0ec1c5e019b85604c33ceee68b3e2669d40 在第八章中,我们谈到了 vector 只能存储同种类型元素的局限。示例 8-9 中提供了一个替代方案,通过定义 SpreadsheetCell 枚举,来储存整型、浮点型或文本类型的成员。这意味着,我们可以在每个单元中储存不同类型的数据,并仍能拥有一个代表一排单元的 vector。只要我们需存储的值由一组固定的类型组成,并且在代码编译时就知道具体会有哪些类型,那么这种使用枚举的办法是完全可行的。 然而有时我们希望库用户在特定情况下能够扩展有效的类型集合。为了展示如何实现这一点,这里将创建一个图形用户接口(Graphical User Interface,GUI)工具的例子,它通过遍历列表并调用每一个项目的 draw 方法来将其绘制到屏幕上 —— 此乃一个 GUI 工具的常见技术。我们将要创建一个叫做 gui 的库 crate,它含一个 GUI 库的结构。这个 GUI 库包含一些可供开发者使用的类型,比如 Button 或 TextField。在此之上,gui 的用户希望创建自定义的可以绘制于屏幕上的类型:比如,一个程序员可能会增加 Image,另一个可能会增加 SelectBox。 这个例子中并不会实现一个功能完善的 GUI 库,不过会展示其中各个部分是如何结合在一起的。编写库的时候,我们不可能知晓并定义所有其他程序员希望创建的类型。我们所知晓的是 gui 需要记录一系列不同类型的值,并需要能够对其中每一个值调用 draw 方法。这里无需知道调用 draw 方法时具体会发生什么,只要该值会有那个方法可供我们调用。 在拥有继承的语言中,可以定义一个名为 Component 的类,该类上有一个 draw 方法。其他的类比如 Button、Image 和 SelectBox 会从 Component 派生并因此继承 draw 方法。它们各自都可以覆盖 draw 方法来定义自己的行为,但是框架会把所有这些类型当作是 Component 的实例,并在其上调用 draw。不过 Rust 并没有继承,我们得另寻出路。","breadcrumbs":"Rust 的面向对象编程特性 » 顾及不同类型值的 trait 对象 » 顾及不同类型值的 trait 对象","id":"333","title":"顾及不同类型值的 trait 对象"},"334":{"body":"为了实现 gui 所期望的行为,让我们定义一个 Draw trait,其中包含名为 draw 的方法。接着可以定义一个存放 trait 对象 ( trait object )的 vector。trait 对象指向一个实现了我们指定 trait 的类型的实例,以及一个用于在运行时查找该类型的 trait 方法的表。我们通过指定某种指针来创建 trait 对象,例如 & 引用或 Box<T> 智能指针,还有 dyn keyword,以及指定相关的 trait(第二十章 “动态大小类型和 Sized trait” 部分会介绍 trait 对象必须使用指针的原因)。我们可以使用 trait 对象代替泛型或具体类型。任何使用 trait 对象的位置,Rust 的类型系统会在编译时确保任何在此上下文中使用的值会实现其 trait 对象的 trait。如此便无需在编译时就知晓所有可能的类型。 之前提到过,Rust 刻意不将结构体与枚举称为 “对象”,以便与其他语言中的对象相区别。在结构体或枚举中,结构体字段中的数据和 impl 块中的行为是分开的,不同于其他语言中将数据和行为组合进一个称为对象的概念中。trait 对象将数据和行为两者相结合,从这种意义上说 则 其更类似其他语言中的对象。不过 trait 对象不同于传统的对象,因为不能向 trait 对象增加数据。trait 对象并不像其他语言中的对象那么通用:其(trait 对象)具体的作用是允许对通用行为进行抽象。 示例 17-3 展示了如何定义一个带有 draw 方法的 trait Draw: 文件名:src/lib.rs pub trait Draw { fn draw(&self);\n} 示例 17-3:Draw trait 的定义 因为第十章已经讨论过如何定义 trait,其语法看起来应该比较眼熟。接下来就是新内容了:示例 17-4 定义了一个存放了名叫 components 的 vector 的结构体 Screen。这个 vector 的类型是 Box<dyn Draw>,此为一个 trait 对象:它是 Box 中任何实现了 Draw trait 的类型的替身。 文件名:src/lib.rs # pub trait Draw {\n# fn draw(&self);\n# }\n# pub struct Screen { pub components: Vec<Box<dyn Draw>>,\n} 示例 17-4: 一个 Screen 结构体的定义,它带有一个字段 components,其包含实现了 Draw trait 的 trait 对象的 vector 在 Screen 结构体上,我们将定义一个 run 方法,该方法会对其 components 上的每一个组件调用 draw 方法,如示例 17-5 所示: 文件名:src/lib.rs # pub trait Draw {\n# fn draw(&self);\n# }\n# # pub struct Screen {\n# pub components: Vec<Box<dyn Draw>>,\n# }\n# impl Screen { pub fn run(&self) { for component in self.components.iter() { component.draw(); } }\n} 示例 17-5:在 Screen 上实现一个 run 方法,该方法在每个 component 上调用 draw 方法 这与定义使用了带有 trait bound 的泛型类型参数的结构体不同。泛型类型参数一次只能替代一个具体类型,而 trait 对象则允许在运行时替代多种具体类型。例如,可以定义 Screen 结构体来使用泛型和 trait bound,如示例 17-6 所示: 文件名:src/lib.rs # pub trait Draw {\n# fn draw(&self);\n# }\n# pub struct Screen<T: Draw> { pub components: Vec<T>,\n} impl<T> Screen<T>\nwhere T: Draw,\n{ pub fn run(&self) { for component in self.components.iter() { component.draw(); } }\n} 示例 17-6: 一种 Screen 结构体的替代实现,其 run 方法使用泛型和 trait bound 这限制了 Screen 实例必须拥有一个全是 Button 类型或者全是 TextField 类型的组件列表。如果只需要同质(相同类型)集合,则倾向于使用泛型和 trait bound,因为其定义会在编译时采用具体类型进行单态化。 另一方面,通过使用 trait 对象的方法,一个 Screen 实例可以存放一个既能包含 Box<Button>,也能包含 Box<TextField> 的 Vec<T>。让我们看看它是如何工作的,接着会讲到其运行时性能影响。","breadcrumbs":"Rust 的面向对象编程特性 » 顾及不同类型值的 trait 对象 » 定义通用行为的 trait","id":"334","title":"定义通用行为的 trait"},"335":{"body":"现在来增加一些实现了 Draw trait 的类型。我们将提供 Button 类型。再一次重申,真正实现 GUI 库超出了本书的范畴,所以 draw 方法体中不会有任何有意义的实现。为了想象一下这个实现看起来像什么,一个 Button 结构体可能会拥有 width、height 和 label 字段,如示例 17-7 所示: 文件名:src/lib.rs # pub trait Draw {\n# fn draw(&self);\n# }\n# # pub struct Screen {\n# pub components: Vec<Box<dyn Draw>>,\n# }\n# # impl Screen {\n# pub fn run(&self) {\n# for component in self.components.iter() {\n# component.draw();\n# }\n# }\n# }\n# pub struct Button { pub width: u32, pub height: u32, pub label: String,\n} impl Draw for Button { fn draw(&self) { // code to actually draw a button }\n} 示例 17-7: 一个实现了 Draw trait 的 Button 结构体 在 Button 上的 width、height 和 label 字段会和其他组件不同,比如 TextField 可能有 width、height、label 以及 placeholder 字段。每一个我们希望能在屏幕上绘制的类型都会使用不同的代码来实现 Draw trait 的 draw 方法来定义如何绘制特定的类型,像这里的 Button 类型(如上提到的并不包含任何实际的 GUI 代码)。除了实现 Draw trait 之外,比如 Button 还可能有另一个包含按钮点击如何响应的方法的 impl 块。这类方法并不适用于像 TextField 这样的类型。 如果一些库的使用者决定实现一个包含 width、height 和 options 字段的结构体 SelectBox,并且也为其实现了 Draw trait,如示例 17-8 所示: 文件名:src/main.rs use gui::Draw; struct SelectBox { width: u32, height: u32, options: Vec<String>,\n} impl Draw for SelectBox { fn draw(&self) { // code to actually draw a select box }\n}\n# # fn main() {} 示例 17-8: 另一个使用 gui 的 crate 中,在 SelectBox 结构体上实现 Draw trait 库使用者现在可以在他们的 main 函数中创建一个 Screen 实例。至此可以通过将 SelectBox 和 Button 放入 Box<T> 转变为 trait 对象再放入 Screen 实例中。接着可以调用 Screen 的 run 方法,它会调用每个组件的 draw 方法。示例 17-9 展示了这个实现: 文件名:src/main.rs # use gui::Draw;\n# # struct SelectBox {\n# width: u32,\n# height: u32,\n# options: Vec<String>,\n# }\n# # impl Draw for SelectBox {\n# fn draw(&self) {\n# // code to actually draw a select box\n# }\n# }\n# use gui::{Button, Screen}; fn main() { let screen = Screen { components: vec![ Box::new(SelectBox { width: 75, height: 10, options: vec![ String::from(\"Yes\"), String::from(\"Maybe\"), String::from(\"No\"), ], }), Box::new(Button { width: 50, height: 10, label: String::from(\"OK\"), }), ], }; screen.run();\n} 示例 17-9: 使用 trait 对象来存储实现了相同 trait 的不同类型的值 当编写库的时候,我们不知道何人会在何时增加 SelectBox 类型,不过 Screen 的实现能够操作并绘制这个新类型,因为 SelectBox 实现了 Draw trait,这意味着它实现了 draw 方法。 这个概念 —— 只关心值所反映的信息而不是其具体类型 —— 类似于动态类型语言中称为 鸭子类型 ( duck typing )的概念:如果它走起来像一只鸭子,叫起来像一只鸭子,那么它就是一只鸭子!在示例 17-5 中 Screen 上的 run 实现中,run 并不需要知道各个组件的具体类型是什么。它并不检查组件是 Button 或者 SelectBox 的实例。通过指定 Box<dyn Draw> 作为 components vector 中值的类型,我们就定义了 Screen 为需要可以在其上调用 draw 方法的值。 使用 trait 对象和 Rust 类型系统来进行类似鸭子类型操作的优势是无需在运行时检查一个值是否实现了特定方法或者担心在调用时因为值没有实现方法而产生错误。如果值没有实现 trait 对象所需的 trait 则 Rust 不会编译这些代码。 例如,示例 17-10 展示了当创建一个使用 String 做为其组件的 Screen 时发生的情况: 文件名:src/main.rs use gui::Screen; fn main() { let screen = Screen { components: vec![Box::new(String::from(\"Hi\"))], }; screen.run();\n} 示例 17-10: 尝试使用一种没有实现 trait 对象的 trait 的类型 我们会遇到这个错误,因为 String 没有实现 rust_gui::Draw trait: $ cargo run Compiling gui v0.1.0 (file:///projects/gui)\nerror[E0277]: the trait bound `String: Draw` is not satisfied --> src/main.rs:5:26 |\n5 | components: vec![Box::new(String::from(\"Hi\"))], | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Draw` is not implemented for `String` | = help: the trait `Draw` is implemented for `Button` = note: required for the cast from `Box<String>` to `Box<dyn Draw>` For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `gui` (bin \"gui\") due to 1 previous error 这告诉了我们,要么是我们传递了并不希望传递给 Screen 的类型并应该提供其他类型,要么应该在 String 上实现 Draw 以便 Screen 可以调用其上的 draw。","breadcrumbs":"Rust 的面向对象编程特性 » 顾及不同类型值的 trait 对象 » 实现 trait","id":"335","title":"实现 trait"},"336":{"body":"回忆一下第十章 “泛型代码的性能” 部分讨论过的,当对泛型使用 trait bound 时编译器所执行的单态化处理:编译器为每一个被泛型类型参数代替的具体类型生成了函数和方法的非泛型实现。单态化产生的代码在执行 静态分发 ( static dispatch )。静态分发发生于编译器在编译时就知晓调用了什么方法的时候。这与 动态分发 ( dynamic dispatch )相对,这时编译器在编译时无法知晓调用了什么方法。在动态分发的场景下,编译器会生成负责在运行时确定该调用什么方法的代码。 当使用 trait 对象时,Rust 必须使用动态分发。编译器无法知晓所有可能用于 trait 对象代码的类型,所以它也不知道应该调用哪个类型的哪个方法实现。为此,Rust 在运行时使用 trait 对象中的指针来知晓需要调用哪个方法。动态分发也阻止编译器有选择的内联方法代码,这会相应的禁用一些优化。尽管在编写示例 17-5 和可以支持示例 17-9 中的代码的过程中确实获得了额外的灵活性,但仍然需要权衡取舍。","breadcrumbs":"Rust 的面向对象编程特性 » 顾及不同类型值的 trait 对象 » trait 对象执行动态分发","id":"336","title":"trait 对象执行动态分发"},"337":{"body":"ch18-03-oo-design-patterns.md commit 937784b8708c24314707378ad42faeb12a334bbd 状态模式 ( state pattern )是一个面向对象设计模式。该模式的关键在于定义一系列值的内含状态。这些状态体现为一系列的 状态对象 ,同时值的行为随着其内部状态而改变。我们将编写一个博客发布结构体的例子,它拥有一个包含其状态的字段,这是一个有着 \"draft\"、\"review\" 或 \"published\" 的状态对象 状态对象共享功能:当然,在 Rust 中使用结构体和 trait 而不是对象和继承。每一个状态对象负责其自身的行为,以及该状态何时应当转移至另一个状态。持有一个状态对象的值对于不同状态的行为以及何时状态转移毫不知情。 使用状态模式的优点在于,程序的业务需求改变时,无需改变值持有状态或者使用值的代码。我们只需更新某个状态对象中的代码来改变其规则,或者是增加更多的状态对象。 首先我们将以一种更加传统的面向对象的方式实现状态模式,接着使用一种更 Rust 一点的方式。让我们使用状态模式增量式地实现一个发布博文的工作流以探索这个概念。 这个博客的最终功能看起来像这样: 博文从空白的草案开始。 一旦草案完成,请求审核博文。 一旦博文过审,它将被发表。 只有被发表的博文的内容会被打印,这样就不会意外打印出没有被审核的博文的文本。 任何其他对博文的修改尝试都是没有作用的。例如,如果尝试在请求审核之前通过一个草案博文,博文应该保持未发布的状态。 示例 17-11 展示这个工作流的代码形式:这是一个我们将要在一个叫做 blog 的库 crate 中实现的 API 的示例。这段代码还不能编译,因为还未实现 blog。 文件名:src/main.rs use blog::Post; fn main() { let mut post = Post::new(); post.add_text(\"I ate a salad for lunch today\"); assert_eq!(\"\", post.content()); post.request_review(); assert_eq!(\"\", post.content()); post.approve(); assert_eq!(\"I ate a salad for lunch today\", post.content());\n} 示例 17-11: 展示了 blog crate 期望行为的代码 我们希望允许用户使用 Post::new 创建一个新的博文草案。也希望能在草案阶段为博文编写一些文本。如果在审批之前尝试立刻获取博文的内容,不应该获取到任何文本因为博文仍然是草案。一个好的单元测试将是断言草案博文的 content 方法返回空字符串,不过我们并不准备为这个例子编写单元测试。 接下来,我们希望能够请求审核博文,而在等待审核的阶段 content 应该仍然返回空字符串。最后当博文审核通过,它应该被发表,这意味着当调用 content 时博文的文本将被返回。 注意我们与 crate 交互的唯一的类型是 Post。这个类型会使用状态模式并会存放处于三种博文所可能的状态之一的值 —— 草案,等待审核和发布。状态上的改变由 Post 类型内部进行管理。状态依库用户对 Post 实例调用的方法而改变,但是不能直接管理状态变化。这也意味着用户不会在状态上犯错,比如在过审前发布博文。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 面向对象设计模式的实现","id":"337","title":"面向对象设计模式的实现"},"338":{"body":"让我们开始实现这个库吧!我们知道需要一个公有 Post 结构体来存放一些文本,所以让我们从结构体的定义和一个创建 Post 实例的公有关联函数 new 开始,如示例 17-12 所示。还需定义一个私有 trait State。 Post 将在私有字段 state 中存放一个 Option<T> 类型的 trait 对象 Box<dyn State>。稍后将会看到为何 Option<T> 是必须的。 文件名:src/lib.rs pub struct Post { state: Option<Box<dyn State>>, content: String,\n} impl Post { pub fn new() -> Post { Post { state: Some(Box::new(Draft {})), content: String::new(), } }\n} trait State {} struct Draft {} impl State for Draft {} 示例 17-12: Post 结构体的定义和新建 Post 实例的 new 函数,State trait 和结构体 Draft State trait 定义了所有不同状态的博文所共享的行为,这个状态对象是 Draft、PendingReview 和 Published,它们都会实现 State 状态。现在这个 trait 并没有任何方法,同时开始将只定义 Draft 状态因为这是我们希望博文的初始状态。 当创建新的 Post 时,我们将其 state 字段设置为一个存放了 Box 的 Some 值。这个 Box 指向一个 Draft 结构体新实例。这确保了无论何时新建一个 Post 实例,它都会从草案开始。因为 Post 的 state 字段是私有的,也就无法创建任何其他状态的 Post 了!。Post::new 函数中将 content 设置为新建的空 String。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 定义 Post 并新建一个草案状态的实例","id":"338","title":"定义 Post 并新建一个草案状态的实例"},"339":{"body":"在示例 17-11 中,展示了我们希望能够调用一个叫做 add_text 的方法并向其传递一个 &str 来将文本增加到博文的内容中。选择实现为一个方法而不是将 content 字段暴露为 pub 。这意味着之后可以实现一个方法来控制 content 字段如何被读取。add_text 方法是非常直观的,让我们在示例 17-13 的 impl Post 块中增加一个实现: 文件名:src/lib.rs # pub struct Post {\n# state: Option<Box<dyn State>>,\n# content: String,\n# }\n# impl Post { // --snip--\n# pub fn new() -> Post {\n# Post {\n# state: Some(Box::new(Draft {})),\n# content: String::new(),\n# }\n# }\n# pub fn add_text(&mut self, text: &str) { self.content.push_str(text); }\n}\n# # trait State {}\n# # struct Draft {}\n# # impl State for Draft {} 示例 17-13: 实现方法 add_text 来向博文的 content 增加文本 add_text 获取一个 self 的可变引用,因为需要改变调用 add_text 的 Post 实例。接着调用 content 中的 String 的 push_str 并传递 text 参数来保存到 content 中。这不是状态模式的一部分,因为它的行为并不依赖博文所处的状态。add_text 方法完全不与 state 状态交互,不过这是我们希望支持的行为的一部分。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 存放博文内容的文本","id":"339","title":"存放博文内容的文本"},"34":{"body":"接下来,创建一个 变量 ( variable )来储存用户输入,像这样: # use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # println!(\"Please input your guess.\");\n# let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {}\", guess);\n# } 现在程序开始变得有意思了!这一小行代码发生了很多事。我们使用 let 语句来创建变量。这里是另外一个例子: let apples = 5; 这行代码新建了一个叫做 apples 的变量并把它绑定到值 5 上。在 Rust 中,变量默认是不可变的,这意味着一旦我们给变量赋值,这个值就不再可以修改了。我们将会在第三章的 “变量与可变性” 部分详细讨论这个概念。下面的例子展示了如何在变量名前使用 mut 来使一个变量可变: let apples = 5; // 不可变\nlet mut bananas = 5; // 可变 注意:// 语法开始一个注释,持续到行尾。Rust 忽略注释中的所有内容, 第三章 将会详细介绍注释。 回到猜数字程序中。现在我们知道了 let mut guess 会引入一个叫做 guess 的可变变量。等号(=)告诉 Rust 我们现在想将某个值绑定在变量上。等号的右边是 guess 所绑定的值,它是 String::new 的结果,这个函数会返回一个 String 的新实例。 String 是一个标准库提供的字符串类型,它是 UTF-8 编码的可增长文本块。 ::new 那一行的 :: 语法表明 new 是 String 类型的一个 关联函数 ( associated function )。关联函数是针对某个类型实现的函数,在这个例子中是 String。这个 new 函数创建了一个新的空字符串。你会发现许多类型上都有一个 new 函数,因为这是为某种类型创建新值的常用函数名。 总的来说,let mut guess = String::new(); 这一行创建了一个可变变量,当前它绑定到一个新的 String 空实例上。","breadcrumbs":"写个猜数字游戏 » 使用变量储存值","id":"34","title":"使用变量储存值"},"340":{"body":"即使调用 add_text 并向博文增加一些内容之后,我们仍然希望 content 方法返回一个空字符串 slice,因为博文仍然处于草案状态,如示例 17-11 的第 8 行所示。现在让我们使用能满足要求的最简单的方式来实现 content 方法:总是返回一个空字符串 slice。当实现了将博文状态改为发布的能力之后将改变这一做法。但是目前博文只能是草案状态,这意味着其内容应该总是空的。示例 17-14 展示了这个占位符实现: 文件名:src/lib.rs # pub struct Post {\n# state: Option<Box<dyn State>>,\n# content: String,\n# }\n# impl Post { // --snip--\n# pub fn new() -> Post {\n# Post {\n# state: Some(Box::new(Draft {})),\n# content: String::new(),\n# }\n# }\n# # pub fn add_text(&mut self, text: &str) {\n# self.content.push_str(text);\n# }\n# pub fn content(&self) -> &str { \"\" }\n}\n# # trait State {}\n# # struct Draft {}\n# # impl State for Draft {} 列表 17-14: 增加一个 Post 的 content 方法的占位实现,它总是返回一个空字符串 slice 通过增加这个 content 方法,示例 17-11 中直到第 8 行的代码能如期运行。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 确保博文草案的内容是空的","id":"340","title":"确保博文草案的内容是空的"},"341":{"body":"接下来需要增加请求审核博文的功能,这应当将其状态由 Draft 改为 PendingReview。示例 17-15 展示了这个代码: 文件名:src/lib.rs # pub struct Post {\n# state: Option<Box<dyn State>>,\n# content: String,\n# }\n# impl Post { // --snip--\n# pub fn new() -> Post {\n# Post {\n# state: Some(Box::new(Draft {})),\n# content: String::new(),\n# }\n# }\n# # pub fn add_text(&mut self, text: &str) {\n# self.content.push_str(text);\n# }\n# # pub fn content(&self) -> &str {\n# \"\"\n# }\n# pub fn request_review(&mut self) { if let Some(s) = self.state.take() { self.state = Some(s.request_review()) } }\n} trait State { fn request_review(self: Box<Self>) -> Box<dyn State>;\n} struct Draft {} impl State for Draft { fn request_review(self: Box<Self>) -> Box<dyn State> { Box::new(PendingReview {}) }\n} struct PendingReview {} impl State for PendingReview { fn request_review(self: Box<Self>) -> Box<dyn State> { self }\n} 示例 17-15: 实现 Post 和 State trait 的 request_review 方法 这里为 Post 增加一个获取 self 可变引用的公有方法 request_review。接着在 Post 的当前状态下调用内部的 request_review 方法,并且第二个 request_review 方法会消费当前的状态并返回一个新状态。 这里给 State trait 增加了 request_review 方法;所有实现了这个 trait 的类型现在都需要实现 request_review 方法。注意不同于使用 self、 &self 或者 &mut self 作为方法的第一个参数,这里使用了 self: Box<Self>。这个语法意味着该方法只可在持有这个类型的 Box 上被调用。这个语法获取了 Box<Self> 的所有权使老状态无效化,以便 Post 的状态值可转换为一个新状态。 为了消费老状态,request_review 方法需要获取状态值的所有权。这就是 Post 的 state 字段中 Option 的来历:调用 take 方法将 state 字段中的 Some 值取出并留下一个 None,因为 Rust 不允许结构体实例中存在值为空的字段。这使得我们将 state 的值移出 Post 而不是借用它。接着我们将博文的 state 值设置为这个操作的结果。 我们需要将 state 临时设置为 None 来获取 state 值,即老状态的所有权,而不是使用 self.state = self.state.request_review(); 这样的代码直接更新状态值。这确保了当 Post 被转换为新状态后不能再使用老 state 值。 Draft 的 request_review 方法需要返回一个新的,装箱的 PendingReview 结构体的实例,其用来代表博文处于等待审核状态。结构体 PendingReview 同样也实现了 request_review 方法,不过它不进行任何状态转换。相反它返回自身,因为当我们请求审核一个已经处于 PendingReview 状态的博文,它应该继续保持 PendingReview 状态。 现在我们能看出状态模式的优势了:无论 state 是何值,Post 的 request_review 方法都是一样的。每个状态只负责它自己的规则。 我们将继续保持 Post 的 content 方法实现不变,返回一个空字符串 slice。现在我们可以拥有 PendingReview 状态和 Draft 状态的 Post 了,不过我们希望在 PendingReview 状态下 Post 也有相同的行为。现在示例 17-11 中直到 10 行的代码是可以执行的!","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 请求审核博文来改变其状态","id":"341","title":"请求审核博文来改变其状态"},"342":{"body":"approve 方法将与 request_review 方法类似:它会将 state 设置为审核通过时应处于的状态,如示例 17-16 所示。 文件名:src/lib.rs # pub struct Post {\n# state: Option<Box<dyn State>>,\n# content: String,\n# }\n# impl Post { // --snip--\n# pub fn new() -> Post {\n# Post {\n# state: Some(Box::new(Draft {})),\n# content: String::new(),\n# }\n# }\n# # pub fn add_text(&mut self, text: &str) {\n# self.content.push_str(text);\n# }\n# # pub fn content(&self) -> &str {\n# \"\"\n# }\n# # pub fn request_review(&mut self) {\n# if let Some(s) = self.state.take() {\n# self.state = Some(s.request_review())\n# }\n# }\n# pub fn approve(&mut self) { if let Some(s) = self.state.take() { self.state = Some(s.approve()) } }\n} trait State { fn request_review(self: Box<Self>) -> Box<dyn State>; fn approve(self: Box<Self>) -> Box<dyn State>;\n} struct Draft {} impl State for Draft { // --snip--\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# Box::new(PendingReview {})\n# }\n# fn approve(self: Box<Self>) -> Box<dyn State> { self }\n} struct PendingReview {} impl State for PendingReview { // --snip--\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# fn approve(self: Box<Self>) -> Box<dyn State> { Box::new(Published {}) }\n} struct Published {} impl State for Published { fn request_review(self: Box<Self>) -> Box<dyn State> { self } fn approve(self: Box<Self>) -> Box<dyn State> { self }\n} 示例 17-16: 为 Post 和 State trait 实现 approve 方法 这里为 State trait 增加了 approve 方法,并新增了一个实现了 State 的结构体,Published 状态。 类似于 PendingReview 中 request_review 的工作方式,如果对 Draft 调用 approve 方法,并没有任何效果,因为它会返回 self。当对 PendingReview 调用 approve 时,它返回一个新的、装箱的 Published 结构体的实例。Published 结构体实现了 State trait,同时对于 request_review 和 approve 两方法来说,它返回自身,因为在这两种情况博文应该保持 Published 状态。 现在需要更新 Post 的 content 方法。我们希望 content 根据 Post 的当前状态返回值,所以需要 Post 代理一个定义于 state 上的 content 方法,如实例 17-17 所示: 文件名:src/lib.rs # pub struct Post {\n# state: Option<Box<dyn State>>,\n# content: String,\n# }\n# impl Post { // --snip--\n# pub fn new() -> Post {\n# Post {\n# state: Some(Box::new(Draft {})),\n# content: String::new(),\n# }\n# }\n# # pub fn add_text(&mut self, text: &str) {\n# self.content.push_str(text);\n# }\n# pub fn content(&self) -> &str { self.state.as_ref().unwrap().content(self) } // --snip--\n# # pub fn request_review(&mut self) {\n# if let Some(s) = self.state.take() {\n# self.state = Some(s.request_review())\n# }\n# }\n# # pub fn approve(&mut self) {\n# if let Some(s) = self.state.take() {\n# self.state = Some(s.approve())\n# }\n# }\n}\n# # trait State {\n# fn request_review(self: Box<Self>) -> Box<dyn State>;\n# fn approve(self: Box<Self>) -> Box<dyn State>;\n# }\n# # struct Draft {}\n# # impl State for Draft {\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# Box::new(PendingReview {})\n# }\n# # fn approve(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# }\n# # struct PendingReview {}\n# # impl State for PendingReview {\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# # fn approve(self: Box<Self>) -> Box<dyn State> {\n# Box::new(Published {})\n# }\n# }\n# # struct Published {}\n# # impl State for Published {\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# # fn approve(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# } 示例 17-17: 更新 Post 的 content 方法来委托调用 State 的 content 方法 因为目标是将所有像这样的规则保持在实现了 State 的结构体中,我们将调用 state 中的值的 content 方法并传递博文实例(也就是 self)作为参数。接着返回 state 值的 content 方法的返回值。 这里调用 Option 的 as_ref 方法是因为需要 Option 中值的引用而不是获取其所有权。因为 state 是一个 Option<Box<dyn State>>,调用 as_ref 会返回一个 Option<&Box<dyn State>>。如果不调用 as_ref,将会得到一个错误,因为不能将 state 移动出借用的 &self 函数参数。 接着调用 unwrap 方法,这里我们知道它永远也不会 panic,因为 Post 的所有方法都确保在它们返回时 state 会有一个 Some 值。这就是一个第十二章 “当我们比编译器知道更多的情况” 部分讨论过的我们知道 None 是不可能的而编译器却不能理解的情况。 接着我们就有了一个 &Box<dyn State>,当调用其 content 时,Deref 强制转换会作用于 & 和 Box ,这样最终会调用实现了 State trait 的类型的 content 方法。这意味着需要为 State trait 定义增加 content,这也是放置根据所处状态返回什么内容的逻辑的地方,如示例 17-18 所示: 文件名:src/lib.rs # pub struct Post {\n# state: Option<Box<dyn State>>,\n# content: String,\n# }\n# # impl Post {\n# pub fn new() -> Post {\n# Post {\n# state: Some(Box::new(Draft {})),\n# content: String::new(),\n# }\n# }\n# # pub fn add_text(&mut self, text: &str) {\n# self.content.push_str(text);\n# }\n# # pub fn content(&self) -> &str {\n# self.state.as_ref().unwrap().content(self)\n# }\n# # pub fn request_review(&mut self) {\n# if let Some(s) = self.state.take() {\n# self.state = Some(s.request_review())\n# }\n# }\n# # pub fn approve(&mut self) {\n# if let Some(s) = self.state.take() {\n# self.state = Some(s.approve())\n# }\n# }\n# }\n# trait State { // --snip--\n# fn request_review(self: Box<Self>) -> Box<dyn State>;\n# fn approve(self: Box<Self>) -> Box<dyn State>;\n# fn content<'a>(&self, post: &'a Post) -> &'a str { \"\" }\n} // --snip--\n# # struct Draft {}\n# # impl State for Draft {\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# Box::new(PendingReview {})\n# }\n# # fn approve(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# }\n# # struct PendingReview {}\n# # impl State for PendingReview {\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# # fn approve(self: Box<Self>) -> Box<dyn State> {\n# Box::new(Published {})\n# }\n# }\n# struct Published {} impl State for Published { // --snip--\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# # fn approve(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# fn content<'a>(&self, post: &'a Post) -> &'a str { &post.content }\n} 示例 17-18: 为 State trait 增加 content 方法 这里增加了一个 content 方法的默认实现来返回一个空字符串 slice。这意味着无需为 Draft 和 PendingReview 结构体实现 content 了。Published 结构体会覆盖 content 方法并会返回 post.content 的值。 注意这个方法需要生命周期注解,如第十章所讨论的。这里获取 post 的引用作为参数,并返回 post 一部分的引用,所以返回的引用的生命周期与 post 参数相关。 现在示例完成了 —— 现在示例 17-11 中所有的代码都能工作!我们通过发布博文工作流的规则实现了状态模式。围绕这些规则的逻辑都存在于状态对象中而不是分散在 Post 之中。 为什么不用枚举? 你可能会好奇为什么不用包含不同可能的博文状态的 enum 作为变量。这确实是一个可能的方案,尝试实现并对比最终结果来看看哪一种更适合你!使用枚举的一个缺点是每一个检查枚举值的地方都需要一个 match 表达式或类似的代码来处理所有可能的成员。这相比 trait 对象模式可能显得更重复。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 增加改变 content 行为的 approve 方法","id":"342","title":"增加改变 content 行为的 approve 方法"},"343":{"body":"我们展示了 Rust 是能够实现面向对象的状态模式的,以便能根据博文所处的状态来封装不同类型的行为。Post 的方法并不知道这些不同类型的行为。通过这种组织代码的方式,要找到所有已发布博文的不同行为只需查看一处代码:Published 的 State trait 的实现。 如果要创建一个不使用状态模式的替代实现,则可能会在 Post 的方法中,或者甚至于在 main 代码中用到 match 语句,来检查博文状态并在这里改变其行为。这意味着需要查看很多位置来理解处于发布状态的博文的所有逻辑!这在增加更多状态时会变得更糟:每一个 match 语句都会需要另一个分支。 对于状态模式来说,Post 的方法和使用 Post 的位置无需 match 语句,同时增加新状态只涉及到增加一个新 struct 和为其实现 trait 的方法。 这个实现易于扩展增加更多功能。为了体会使用此模式维护代码的简洁性,请尝试如下一些建议: 增加 reject 方法将博文的状态从 PendingReview 变回 Draft 在将状态变为 Published 之前需要两次 approve 调用 只允许博文处于 Draft 状态时增加文本内容。提示:让状态对象负责内容可能发生什么改变,但不负责修改 Post。 状态模式的一个缺点是因为状态实现了状态之间的转换,一些状态会相互联系。如果在 PendingReview 和 Published 之间增加另一个状态,比如 Scheduled,则不得不修改 PendingReview 中的代码来转移到 Scheduled。如果 PendingReview 无需因为新增的状态而改变就更好了,不过这意味着切换到另一种设计模式。 另一个缺点是我们会发现一些重复的逻辑。为了消除它们,可以尝试为 State trait 中返回 self 的 request_review 和 approve 方法增加默认实现,不过这会违反对象安全性,因为 trait 不知道 self 具体是什么。我们希望能够将 State 作为一个 trait 对象,所以需要其方法是对象安全的。 另一个重复是 Post 中 request_review 和 approve 这两个类似的实现。它们都委托调用了 state 字段中 Option 值的同一方法,并在结果中为 state 字段设置了新值。如果 Post 中的很多方法都遵循这个模式,我们可能会考虑定义一个宏来消除重复(查看第二十章的 “宏” 部分)。 完全按照面向对象语言的定义实现这个模式并没有尽可能地利用 Rust 的优势。让我们看看一些代码中可以做出的修改,来将无效的状态和状态转移变为编译时错误。 将状态和行为编码为类型 我们将展示如何稍微反思状态模式来进行一系列不同的权衡取舍。不同于完全封装状态和状态转移使得外部代码对其毫不知情,我们将状态编码进不同的类型。如此,Rust 的类型检查就会将任何在只能使用发布博文的地方使用草案博文的尝试变为编译时错误。 让我们考虑一下示例 17-11 中 main 的第一部分: 文件名:src/main.rs # use blog::Post;\n# fn main() { let mut post = Post::new(); post.add_text(\"I ate a salad for lunch today\"); assert_eq!(\"\", post.content());\n# # post.request_review();\n# assert_eq!(\"\", post.content());\n# # post.approve();\n# assert_eq!(\"I ate a salad for lunch today\", post.content());\n} 我们仍然希望能够使用 Post::new 创建一个新的草案博文,并能够增加博文的内容。不过不同于存在一个草案博文时返回空字符串的 content 方法,我们将使草案博文完全没有 content 方法。这样如果尝试获取草案博文的内容,将会得到一个方法不存在的编译错误。这使得我们不可能在生产环境意外显示出草案博文的内容,因为这样的代码甚至就不能编译。示例 17-19 展示了 Post 结构体、DraftPost 结构体以及各自的方法的定义: 文件名:src/lib.rs pub struct Post { content: String,\n} pub struct DraftPost { content: String,\n} impl Post { pub fn new() -> DraftPost { DraftPost { content: String::new(), } } pub fn content(&self) -> &str { &self.content }\n} impl DraftPost { pub fn add_text(&mut self, text: &str) { self.content.push_str(text); }\n} 示例 17-19: 带有 content 方法的 Post 和没有 content 方法的 DraftPost Post 和 DraftPost 结构体都有一个私有的 content 字段来储存博文的文本。这些结构体不再有 state 字段因为我们将状态编码改为结构体类型。Post 将代表发布的博文,它有一个返回 content 的 content 方法。 仍然有一个 Post::new 函数,不过不同于返回 Post 实例,它返回 DraftPost 的实例。现在不可能创建一个 Post 实例,因为 content 是私有的同时没有任何函数返回 Post。 DraftPost 上定义了一个 add_text 方法,这样就可以像之前那样向 content 增加文本,不过注意 DraftPost 并没有定义 content 方法!如此现在程序确保了所有博文都从草案开始,同时草案博文没有任何可供展示的内容。任何绕过这些限制的尝试都会产生编译错误。 实现状态转移为不同类型的转换 那么如何得到发布的博文呢?我们希望强制执行的规则是草案博文在可以发布之前必须被审核通过。等待审核状态的博文应该仍然不会显示任何内容。让我们通过增加另一个结构体 PendingReviewPost 来实现这个限制,在 DraftPost 上定义 request_review 方法来返回 PendingReviewPost,并在 PendingReviewPost 上定义 approve 方法来返回 Post,如示例 17-20 所示: 文件名:src/lib.rs # pub struct Post {\n# content: String,\n# }\n# # pub struct DraftPost {\n# content: String,\n# }\n# # impl Post {\n# pub fn new() -> DraftPost {\n# DraftPost {\n# content: String::new(),\n# }\n# }\n# # pub fn content(&self) -> &str {\n# &self.content\n# }\n# }\n# impl DraftPost { // --snip--\n# pub fn add_text(&mut self, text: &str) {\n# self.content.push_str(text);\n# }\n# pub fn request_review(self) -> PendingReviewPost { PendingReviewPost { content: self.content, } }\n} pub struct PendingReviewPost { content: String,\n} impl PendingReviewPost { pub fn approve(self) -> Post { Post { content: self.content, } }\n} 列表 17-20: PendingReviewPost 通过调用 DraftPost 的 request_review 创建,approve 方法将 PendingReviewPost 变为发布的 Post request_review 和 approve 方法获取 self 的所有权,因此会消费 DraftPost 和 PendingReviewPost 实例,并分别转换为 PendingReviewPost 和发布的 Post。这样在调用 request_review 之后就不会遗留任何 DraftPost 实例,后者同理。PendingReviewPost 并没有定义 content 方法,所以尝试读取其内容会导致编译错误,DraftPost 同理。因为唯一得到定义了 content 方法的 Post 实例的途径是调用 PendingReviewPost 的 approve 方法,而得到 PendingReviewPost 的唯一办法是调用 DraftPost 的 request_review 方法,现在我们就将发博文的工作流编码进了类型系统。 这也意味着不得不对 main 做出一些小的修改。因为 request_review 和 approve 返回新实例而不是修改被调用的结构体,所以我们需要增加更多的 let post = 覆盖赋值来保存返回的实例。也不再能断言草案和等待审核的博文的内容为空字符串了,我们也不再需要它们:不能编译尝试使用这些状态下博文内容的代码。更新后的 main 的代码如示例 17-21 所示: 文件名:src/main.rs use blog::Post; fn main() { let mut post = Post::new(); post.add_text(\"I ate a salad for lunch today\"); let post = post.request_review(); let post = post.approve(); assert_eq!(\"I ate a salad for lunch today\", post.content());\n} 示例 17-21: main 中使用新的博文工作流实现的修改 不得不修改 main 来重新赋值 post 使得这个实现不再完全遵守面向对象的状态模式:状态间的转换不再完全封装在 Post 实现中。然而,得益于类型系统和编译时类型检查,我们得到了的是无效状态是不可能的!这确保了某些特定的 bug,比如显示未发布博文的内容,将在部署到生产环境之前被发现。 尝试为示例 17-21 之后的 blog crate 实现这一部分开始所建议的任务来体会使用这个版本的代码是何感觉。注意在这个设计中一些需求可能已经完成了。 即便 Rust 能够实现面向对象设计模式,也有其他像将状态编码进类型这样的模式存在。这些模式有着不同的权衡取舍。虽然你可能非常熟悉面向对象模式,重新思考这些问题来利用 Rust 提供的像在编译时避免一些 bug 这样有益功能。在 Rust 中面向对象模式并不总是最好的解决方案,因为 Rust 拥有像所有权这样的面向对象语言所没有的功能。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 状态模式的权衡取舍","id":"343","title":"状态模式的权衡取舍"},"344":{"body":"阅读本章后,不管你是否认为 Rust 是一个面向对象语言,现在你都见识了 trait 对象是一个 Rust 中获取部分面向对象功能的方法。动态分发可以通过牺牲少量运行时性能来为你的代码提供一些灵活性。这些灵活性可以用来实现有助于代码可维护性的面向对象模式。Rust 也有像所有权这样不同于面向对象语言的功能。面向对象模式并不总是利用 Rust 优势的最好方式,但也是可用的选项。 接下来,让我们看看另一个提供了多样灵活性的 Rust 功能:模式。贯穿全书的模式,我们已经和它们打过照面了,但并没有见识过它们的全部本领。让我们开始探索吧!","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 总结","id":"344","title":"总结"},"345":{"body":"ch19-00-patterns.md commit 6fce661a0938aa0da06526e7b8f98fd7e67a222f 模式 ( Patterns )是 Rust 中特殊的语法,它用来匹配类型中的结构,无论类型是简单还是复杂。结合使用模式和 match 表达式以及其他结构可以提供更多对程序控制流的支配权。模式由如下一些内容组合而成: 字面值 解构的数组、枚举、结构体或者元组 变量 通配符 占位符 一些模式的例子包括x, (a, 3) 和 Some(Color::Red)。在模式为有效的上下文中,这些部分描述了数据的形状。接着可以用其匹配值来决定程序是否拥有正确的数据来运行特定部分的代码。 我们通过将一些值与模式相比较来使用它。如果模式匹配这些值,我们对值部分进行相应处理。回忆一下第六章讨论 match 表达式时像硬币分类器那样使用模式。如果数据符合这个形状,就可以使用这些命名的片段。如果不符合,与该模式相关的代码则不会运行。 本章是所有模式相关内容的参考。我们将涉及到使用模式的有效位置, refutable 与 irrefutable 模式的区别,和你可能会见到的不同类型的模式语法。在最后,你将会看到如何使用模式创建强大而简洁的代码。","breadcrumbs":"模式与模式匹配 » 模式与模式匹配","id":"345","title":"模式与模式匹配"},"346":{"body":"ch19-01-all-the-places-for-patterns.md commit 0c2d41e2afce734825c3a12087d423e8c2f0ae53 模式出现在 Rust 的很多地方。你已经在不经意间使用了很多模式!本部分是一个所有有效模式位置的参考。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » 所有可能会用到模式的位置","id":"346","title":"所有可能会用到模式的位置"},"347":{"body":"如第六章所讨论的,一个模式常用的位置是 match 表达式的分支。在形式上 match 表达式由 match 关键字、用于匹配的值和一个或多个分支构成,这些分支包含一个模式和在值匹配分支的模式时运行的表达式: match VALUE { PATTERN => EXPRESSION, PATTERN => EXPRESSION, PATTERN => EXPRESSION,\n} 例如这是一个来自示例 6-5 中匹配变量 x 中 Option<i32> 值的 match 表达式: match x { None => None, Some(i) => Some(i + 1),\n} 这个 match 表达式中的模式为每个箭头左边的 None 和 Some(i)。 match 表达式必须是 穷尽 ( exhaustive )的,意为 match 表达式所有可能的值都必须被考虑到。一个确保覆盖每个可能值的方法是在最后一个分支使用捕获所有的模式:比如,一个匹配任何值的名称永远也不会失败,因此可以覆盖所有匹配剩下的情况。 有一个特定的模式 _ 可以匹配所有情况,不过它从不绑定任何变量。这在例如希望忽略任何未指定值的情况很有用。本章之后的 “忽略模式中的值” 部分会详细介绍 _ 模式的更多细节。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » match 分支","id":"347","title":"match 分支"},"348":{"body":"第六章讨论过了 if let 表达式,以及它是如何主要用于编写等同于只关心一个情况的 match 语句简写的。if let 可以对应一个可选的带有代码的 else 在 if let 中的模式不匹配时运行。 示例 19-1 展示了也可以组合并匹配 if let、else if 和 else if let 表达式。这相比 match 表达式一次只能将一个值与模式比较提供了更多灵活性。并且 Rust 并不要求一系列 if let、else if、else if let 分支的条件相互关联。 示例 19-1 中的代码展示了一系列针对不同条件的检查来决定背景颜色应该是什么。为了达到这个例子的目的,我们创建了硬编码值的变量,在真实程序中则可能由询问用户获得。 文件名:src/main.rs fn main() { let favorite_color: Option<&str> = None; let is_tuesday = false; let age: Result<u8, _> = \"34\".parse(); if let Some(color) = favorite_color { println!(\"Using your favorite color, {color}, as the background\"); } else if is_tuesday { println!(\"Tuesday is green day!\"); } else if let Ok(age) = age { if age > 30 { println!(\"Using purple as the background color\"); } else { println!(\"Using orange as the background color\"); } } else { println!(\"Using blue as the background color\"); }\n} 示例 19-1: 结合 if let、else if、else if let 以及 else 如果用户指定了中意的颜色,将使用其作为背景颜色。如果没有指定中意的颜色且今天是星期二,背景颜色将是绿色。如果用户指定了他们的年龄字符串并能够成功将其解析为数字的话,我们将根据这个数字使用紫色或者橙色。最后,如果没有一个条件符合,背景颜色将是蓝色。 这个条件结构允许我们支持复杂的需求。使用这里硬编码的值,例子会打印出 Using purple as the background color。 注意 if let 也可以像 match 分支那样引入覆盖变量:if let Ok(age) = age 引入了一个新的覆盖变量 age,它包含 Ok 成员中的值。这意味着 if age > 30 条件需要位于这个代码块内部;不能将两个条件组合为 if let Ok(age) = age && age > 30,因为我们希望与 30 进行比较的被覆盖的 age 直到大括号开始的新作用域才是有效的。 if let 表达式的缺点在于其穷尽性没有为编译器所检查,而 match 表达式则检查了。如果去掉最后的 else 块而遗漏处理一些情况,编译器也不会警告这类可能的逻辑错误。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » if let 条件表达式","id":"348","title":"if let 条件表达式"},"349":{"body":"一个与 if let 结构类似的是 while let 条件循环,它允许只要模式匹配就一直进行 while 循环。我们在第十七章第一次见到 while let 循环,当时我们使用它在流还在产生新值的时候保持循环。同理在示例 19-2 展示了一个 while let 循环等待跨线程发送的消息,不过在这个示例中它检查一个 Result 而不是 Option。 # fn main() { let (tx, rx) = std::sync::mpsc::channel(); std::thread::spawn(move || { for val in [1, 2, 3] { tx.send(val).unwrap(); } }); while let Ok(value) = rx.recv() { println!(\"{value}\"); }\n# } 示例 19-2: 使用 while let 循环只要 rx.recv() 返回 Ok 就打印出其值 这个例子会打印出 1、2 和 3。当在第十六章遇到 recv 时,我们直接 unwrap 了错误,或者使用 for 循环将其视为迭代器处理。不过如示例 19-2 所示,我们也可以使用 while let,因为 recv 方法只要发送端持续产生消息它就一直返回 Ok,并在发送端断开连接后产生一个 Err。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » while let 条件循环","id":"349","title":"while let 条件循环"},"35":{"body":"回忆一下,我们在程序的第一行使用 use std::io; 从标准库中引入了输入/输出功能。现在调用 io 库中的函数 stdin,这允许我们处理用户输入: # use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# io::stdin() .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {}\", guess);\n# } 如果程序的开头没有使用 use std::io; 引入 io 库,我们仍可以通过把函数调用写成 std::io::stdin 来使用该函数。stdin 函数返回一个 std::io::Stdin 的实例,这是一种代表终端标准输入句柄的类型。 接下来,代码中的 .read_line(&mut guess) 调用了标准输入句柄上的 read_line 方法,以获取用户输入。我们还将 &mut guess 作为参数传递给 read_line 函数,让其将用户输入储存到这个字符串中。read_line 的工作是,无论用户在标准输入中键入什么内容,都将其追加(不会覆盖其原有内容)到一个字符串中,因此它需要字符串作为参数。这个字符串参数应该是可变的,以便 read_line 将用户输入附加上去。 & 表示这个参数是一个 引用 ( reference ),它允许多处代码访问同一处数据,而无需在内存中多次拷贝。引用是一个复杂的特性,Rust 的一个主要优势就是安全而简单的操纵引用。完成当前程序并不需要了解如此多细节。现在,我们只需知道它像变量一样,默认是不可变的。因此,需要写成 &mut guess 来使其可变,而不是 &guess。(第四章会更全面的解释引用。)","breadcrumbs":"写个猜数字游戏 » 接收用户输入","id":"35","title":"接收用户输入"},"350":{"body":"在 for 循环中,模式是 for 关键字直接跟随的值,正如 for x in y 中的 x。示例 19-3 中展示了如何使用 for 循环来解构,或拆开一个元组作为 for 循环的一部分: # fn main() { let v = vec!['a', 'b', 'c']; for (index, value) in v.iter().enumerate() { println!(\"{value} is at index {index}\"); }\n# } 列表 19-3: 在 for 循环中使用模式来解构元组 示例 19-3 的代码会打印出: $ cargo run Compiling patterns v0.1.0 (file:///projects/patterns) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.52s Running `target/debug/patterns`\na is at index 0\nb is at index 1\nc is at index 2 这里使用 enumerate 方法适配一个迭代器来产生一个值和其在迭代器中的索引,它们位于一个元组中。第一个产生的值是元组 (0, 'a')。当这个值匹配模式 (index, value),index 将会是 0 而 value 将会是 'a',并打印出第一行输出。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » for 循环","id":"350","title":"for 循环"},"351":{"body":"在本章之前,我们只明确的讨论过通过 match 和 if let 使用模式,不过事实上也在别的地方使用过模式,包括 let 语句。例如,考虑一下这个直白的 let 变量赋值: let x = 5; 不过你可能没有发觉,每一次像这样使用 let 语句就是在使用模式!let 语句更为正式的样子如下: let PATTERN = EXPRESSION; 像 let x = 5; 这样的语句中变量名位于 PATTERN 位置,变量名不过是形式特别朴素的模式。我们将表达式与模式比较,并为任何找到的名称赋值。所以例如 let x = 5; 的情况,x 是一个代表 “将匹配到的值绑定到变量 x” 的模式。同时因为名称 x 是整个模式,这个模式实际上等于 “将任何值绑定到变量 x,不管值是什么”。 为了更清楚的理解 let 的模式匹配方面的内容,考虑示例 19-4 中使用 let 和模式解构一个元组: # fn main() { let (x, y, z) = (1, 2, 3);\n# } 示例 19-4: 使用模式解构元组并一次创建三个变量 这里将一个元组与模式匹配。Rust 会比较值 (1, 2, 3) 与模式 (x, y, z) 并发现此值匹配这个模式。在这个例子中,将会把 1 绑定到 x,2 绑定到 y 并将 3 绑定到 z。你可以将这个元组模式看作是将三个独立的变量模式结合在一起。 如果模式中元素的数量不匹配元组中元素的数量,则整个类型不匹配,并会得到一个编译时错误。例如,示例 19-5 展示了尝试用两个变量解构三个元素的元组,这是不行的: # fn main() { let (x, y) = (1, 2, 3);\n# } 示例 19-5: 一个错误的模式结构,其中变量的数量不符合元组中元素的数量 尝试编译这段代码会给出如下类型错误: $ cargo run Compiling patterns v0.1.0 (file:///projects/patterns)\nerror[E0308]: mismatched types --> src/main.rs:2:9 |\n2 | let (x, y) = (1, 2, 3); | ^^^^^^ --------- this expression has type `({integer}, {integer}, {integer})` | | | expected a tuple with 3 elements, found one with 2 elements | = note: expected tuple `({integer}, {integer}, {integer})` found tuple `(_, _)` For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `patterns` (bin \"patterns\") due to 1 previous error 为了修复这个错误,可以使用 _ 或 .. 来忽略元组中一个或多个值,如 “忽略模式中的值” 部分所示。如果问题是模式中有太多的变量,则解决方法是通过去掉变量使得变量数与元组中元素数相等。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » let 语句","id":"351","title":"let 语句"},"352":{"body":"函数参数也可以是模式。列表 19-6 中的代码声明了一个叫做 foo 的函数,它获取一个 i32 类型的参数 x,现在这看起来应该很熟悉: fn foo(x: i32) { // code goes here\n}\n# # fn main() {} 列表 19-6: 在参数中使用模式的函数签名 x 部分就是一个模式!类似于之前对 let 所做的,可以在函数参数中匹配元组。列表 19-7 将传递给函数的元组拆分为值: 文件名:src/main.rs fn print_coordinates(&(x, y): &(i32, i32)) { println!(\"Current location: ({x}, {y})\");\n} fn main() { let point = (3, 5); print_coordinates(&point);\n} 列表 19-7: 一个在参数中解构元组的函数 这会打印出 Current location: (3, 5)。值 &(3, 5) 会匹配模式 &(x, y),如此 x 得到了值 3,而 y得到了值 5。 因为如第十三章所讲闭包类似于函数,也可以在闭包参数列表中使用模式。 现在我们见过了很多使用模式的方式了,不过模式在每个使用它的地方并不以相同的方式工作;在一些地方,模式必须是 irrefutable 的,意味着它们必须匹配所提供的任何值。在另一些情况,它们则可以是 refutable 的。接下来让我们讨论这两个概念。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » 函数参数","id":"352","title":"函数参数"},"353":{"body":"ch19-02-refutability.md commit 0c2d41e2afce734825c3a12087d423e8c2f0ae53 模式有两种形式:refutable(可反驳的)和 irrefutable(不可反驳的)。能匹配任何传递的可能值的模式被称为是 不可反驳的 ( irrefutable )。一个例子就是 let x = 5; 语句中的 x,因为 x 可以匹配任何值所以不可能会失败。对某些可能的值进行匹配会失败的模式被称为是 可反驳的 ( refutable )。一个这样的例子便是 if let Some(x) = a_value 表达式中的 Some(x);如果变量 a_value 中的值是 None 而不是 Some,那么 Some(x) 模式不能匹配。 函数参数、let 语句和 for 循环只能接受不可反驳的模式,因为当值不匹配时,程序无法进行有意义的操作。if let 和 while let 表达式可以接受可反驳和不可反驳的模式,但编译器会对不可反驳的模式发出警告,因为根据定义它们旨在处理可能的失败:条件表达式的功能在于它能够根据成功或失败来执行不同的操作。 通常我们无需担心可反驳和不可反驳模式的区别,不过确实需要熟悉可反驳性的概念,这样当在错误信息中看到时就知道如何应对。遇到这些情况,根据代码行为的意图,需要修改模式或者使用模式的结构。 让我们看看一个尝试在 Rust 要求不可反驳模式的地方使用可反驳模式以及相反情况的例子。在示例 18-8 中,有一个 let 语句,不过模式被指定为可反驳模式 Some(x)。如你所见,这不能编译: # fn main() {\n# let some_option_value: Option<i32> = None; let Some(x) = some_option_value;\n# } 示例 18-8: 尝试在 let 中使用可反驳模式 如果 some_option_value 的值是 None,其不会成功匹配模式 Some(x),表明这个模式是可反驳的。然而,因为 let 对于 None 匹配不能产生任何合法的代码,所以 let 语句只能接受不可反驳模式。Rust 会在编译时抱怨我们尝试在要求不可反驳模式的地方使用可反驳模式: $ cargo run Compiling patterns v0.1.0 (file:///projects/patterns)\nerror[E0005]: refutable pattern in local binding --> src/main.rs:3:9 |\n3 | let Some(x) = some_option_value; | ^^^^^^^ pattern `None` not covered | = note: `let` bindings require an \"irrefutable pattern\", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch19-02-refutability.html = note: the matched value is of type `Option<i32>`\nhelp: you might want to use `let else` to handle the variant that isn't matched |\n3 | let Some(x) = some_option_value else { todo!() }; | ++++++++++++++++ For more information about this error, try `rustc --explain E0005`.\nerror: could not compile `patterns` (bin \"patterns\") due to 1 previous error 因为我们没有覆盖(也不可能覆盖!)到模式 Some(x) 的每一个可能的值,所以 Rust 会合理地抗议。 为了修复在需要不可反驳模式的地方使用可反驳模式的情况,可以修改使用模式的代码:不同于使用 let,可以使用 if let。如此,如果模式不匹配,大括号中的代码将被忽略,其余代码保持有效。示例 18-9 展示了如何修复示例 18-8 中的代码。 # fn main() {\n# let some_option_value: Option<i32> = None; if let Some(x) = some_option_value { println!(\"{x}\"); }\n# } 示例 18-9: 使用 if let 和一个带有可反驳模式的代码块来代替 let 我们给了代码一个得以继续的出路!虽然我们没办法在避免产生错误的情况下使用不可反驳模式,但这段使用可反驳模式的代码是完全有效的。如果为 if let 提供了一个总是会匹配的模式,比如示例 18-10 中的 x,编译器会给出一个警告: # fn main() { if let x = 5 { println!(\"{x}\"); };\n# } 示例 18-10: 尝试把不可反驳模式用到 if let 上 Rust 会抱怨将不可反驳模式用于 if let 是没有意义的: $ cargo run Compiling patterns v0.1.0 (file:///projects/patterns)\nwarning: irrefutable `if let` pattern --> src/main.rs:2:8 |\n2 | if let x = 5 { | ^^^^^^^^^ | = note: this pattern will always match, so the `if let` is useless = help: consider replacing the `if let` with a `let` = note: `#[warn(irrefutable_let_patterns)]` on by default warning: `patterns` (bin \"patterns\") generated 1 warning Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.39s Running `target/debug/patterns`\n5 基于此,match匹配分支必须使用可反驳模式,除了最后一个分支需要使用能匹配任何剩余值的不可反驳模式。Rust 允许我们在只有一个匹配分支的match中使用不可反驳模式,不过这么做不是特别有用,并可以被更简单的 let 语句替代。 目前我们已经讨论了所有可以使用模式的地方,以及可反驳模式与不可反驳模式的区别,下面让我们一起去把可以用来创建模式的语法过目一遍吧。","breadcrumbs":"模式与模式匹配 » Refutability(可反驳性): 模式是否会匹配失效 » Refutability(可反驳性): 模式是否会匹配失效","id":"353","title":"Refutability(可反驳性): 模式是否会匹配失效"},"354":{"body":"ch19-03-pattern-syntax.md commit 6fce661a0938aa0da06526e7b8f98fd7e67a222f 在本节中,我们收集了模式中所有有效的语法,并讨论为什么以及何时你可能要使用这些语法。","breadcrumbs":"模式与模式匹配 » 模式语法 » 所有的模式语法","id":"354","title":"所有的模式语法"},"355":{"body":"如第六章所示,可以直接匹配字面值模式。如下代码给出了一些例子: # fn main() { let x = 1; match x { 1 => println!(\"one\"), 2 => println!(\"two\"), 3 => println!(\"three\"), _ => println!(\"anything\"), }\n# } 这段代码会打印 one 因为 x 的值是 1。如果希望代码获得特定的具体值,则该语法很有用。","breadcrumbs":"模式与模式匹配 » 模式语法 » 匹配字面值","id":"355","title":"匹配字面值"},"356":{"body":"命名变量是匹配任何值的不可反驳模式,这在之前已经使用过数次。然而当其用于 match 表达式时情况会有些复杂。因为 match 会开始一个新作用域,match 表达式中作为模式的一部分声明的变量会覆盖 match 结构之外的同名变量,与所有变量一样。在示例 18-11 中,声明了一个值为 Some(5) 的变量 x 和一个值为 10 的变量 y。接着在值 x 上创建了一个 match 表达式。观察匹配分支中的模式和结尾的 println!,并在运行此代码或进一步阅读之前推断这段代码会打印什么。 文件名:src/main.rs # fn main() { let x = Some(5); let y = 10; match x { Some(50) => println!(\"Got 50\"), Some(y) => println!(\"Matched, y = {y}\"), _ => println!(\"Default case, x = {x:?}\"), } println!(\"at the end: x = {x:?}, y = {y}\");\n# } 示例 18-11: 一个 match 语句其中一个分支引入了覆盖变量 y 让我们看看当 match 语句运行的时候发生了什么。第一个匹配分支的模式并不匹配 x 中定义的值,所以代码继续执行。 第二个匹配分支中的模式引入了一个新变量 y,它会匹配任何 Some 中的值。因为我们在 match 表达式的新作用域中,这是一个新变量,而不是开头声明为值 10 的那个 y。这个新的 y 绑定会匹配任何 Some 中的值,在这里是 x 中的值。因此这个 y 绑定了 x 中 Some 内部的值。这个值是 5,所以这个分支的表达式将会执行并打印出 Matched, y = 5。 如果 x 的值是 None 而不是 Some(5),头两个分支的模式不会匹配,所以会匹配下划线。这个分支的模式中没有引入变量 x,所以此时表达式中的 x 会是外部没有被覆盖的 x。在这个假想的例子中,match 将会打印 Default case, x = None。 一旦 match 表达式执行完毕,其作用域也就结束了,同理内部 y 的作用域也结束了。最后的 println! 会打印 at the end: x = Some(5), y = 10。 为了创建能够比较外部 x 和 y 的值,而不引入覆盖变量的 match 表达式,我们需要相应地使用带有条件的匹配守卫(match guard)。我们稍后将在 “匹配守卫提供的额外条件” 这一小节讨论匹配守卫。","breadcrumbs":"模式与模式匹配 » 模式语法 » 匹配命名变量","id":"356","title":"匹配命名变量"},"357":{"body":"在 match 表达式中,可以使用 | 语法匹配多个模式,它代表 或 ( or )运算符模式。例如,如下代码将 x 的值与匹配分支相比较,第一个分支有 或 选项,意味着如果 x 的值匹配此分支的任一个值,它就会运行: # fn main() { let x = 1; match x { 1 | 2 => println!(\"one or two\"), 3 => println!(\"three\"), _ => println!(\"anything\"), }\n# } 上面的代码会打印 one or two。","breadcrumbs":"模式与模式匹配 » 模式语法 » 多个模式","id":"357","title":"多个模式"},"358":{"body":"..= 语法允许你匹配一个闭区间范围内的值。在如下代码中,当模式匹配任何在给定范围内的值时,该分支会执行: # fn main() { let x = 5; match x { 1..=5 => println!(\"one through five\"), _ => println!(\"something else\"), }\n# } 如果 x 是 1、2、3、4 或 5,第一个分支就会匹配。这个语法在匹配多个值时相比使用 | 运算符来表达相同的意思更为方便;如果使用 | 则不得不指定 1 | 2 | 3 | 4 | 5。相反指定范围就简短的多,特别是在希望匹配比如从 1 到 1000 的数字的时候! 编译器会在编译时检查范围不为空,而 char 和数字值是 Rust 仅有的可以判断范围是否为空的类型,所以范围只允许用于数字或 char 值。 如下是一个使用 char 类型值范围的例子: # fn main() { let x = 'c'; match x { 'a'..='j' => println!(\"early ASCII letter\"), 'k'..='z' => println!(\"late ASCII letter\"), _ => println!(\"something else\"), }\n# } Rust 知道 'c' 位于第一个模式的范围内,并会打印出 early ASCII letter。","breadcrumbs":"模式与模式匹配 » 模式语法 » 通过 ..= 匹配值的范围","id":"358","title":"通过 ..= 匹配值的范围"},"359":{"body":"也可以使用模式来解构结构体、枚举和元组,以便使用这些值的不同部分。让我们来分别看一看。 解构结构体 示例 18-12 展示带有两个字段 x 和 y 的结构体 Point,可以通过带有模式的 let 语句将其分解: 文件名:src/main.rs struct Point { x: i32, y: i32,\n} fn main() { let p = Point { x: 0, y: 7 }; let Point { x: a, y: b } = p; assert_eq!(0, a); assert_eq!(7, b);\n} 示例 18-12: 解构一个结构体的字段为单独的变量 这段代码创建了变量 a 和 b 来匹配结构体 p 中的 x 和 y 字段。这个例子展示了模式中的变量名不必与结构体中的字段名一致。不过通常希望变量名与字段名一致以便于理解变量来自于哪些字段。因为变量名匹配字段名是常见的,同时因为 let Point { x: x, y: y } = p; 包含了很多重复,所以对于匹配结构体字段的模式存在简写:只需列出结构体字段的名称,则模式创建的变量会有相同的名称。示例 18-13 展示了与示例 18-12 有着相同行为的代码,不过 let 模式创建的变量为 x 和 y 而不是 a 和 b: 文件名:src/main.rs struct Point { x: i32, y: i32,\n} fn main() { let p = Point { x: 0, y: 7 }; let Point { x, y } = p; assert_eq!(0, x); assert_eq!(7, y);\n} 示例 18-13: 使用结构体字段简写来解构结构体字段 这段代码创建了变量 x 和 y,与变量 p 中的 x 和 y 相匹配。其结果是变量 x 和 y 包含结构体 p 中的值。 也可以使用字面值作为结构体模式的一部分进行解构,而不是为所有的字段创建变量。这允许我们测试一些字段为特定值的同时创建其他字段的变量。 示例 18-14 展示了一个 match 语句将 Point 值分成了三种情况:直接位于 x 轴上(此时 y = 0 为真)、位于 y 轴上(x = 0)或不在任何轴上的点。 文件名:src/main.rs # struct Point {\n# x: i32,\n# y: i32,\n# }\n# fn main() { let p = Point { x: 0, y: 7 }; match p { Point { x, y: 0 } => println!(\"On the x axis at {x}\"), Point { x: 0, y } => println!(\"On the y axis at {y}\"), Point { x, y } => { println!(\"On neither axis: ({x}, {y})\"); } }\n} 示例 18-14: 解构和匹配模式中的字面值 第一个分支通过指定字段 y 匹配字面值 0 来匹配任何位于 x 轴上的点。此模式仍然创建了变量 x 以便在分支的代码中使用。 类似的,第二个分支通过指定字段 x 匹配字面值 0 来匹配任何位于 y 轴上的点,并为字段 y 创建了变量 y。第三个分支没有指定任何字面值,所以其会匹配任何其他的 Point 并为 x 和 y 两个字段创建变量。 在这个例子中,值 p 因为其 x 包含 0 而匹配第二个分支,因此会打印出 On the y axis at 7。 记住 match 表达式一旦找到一个匹配的模式就会停止检查其它分支,所以即使 Point { x: 0, y: 0} 在 x 轴上也在 y 轴上,这些代码也只会打印 On the x axis at 0。 解构枚举 本书之前曾经解构过枚举(例如第六章示例 6-5),不过当时没有明确提到解构枚举的模式需要对应枚举所定义的储存数据的方式。让我们以示例 6-2 中的 Message 枚举为例,编写一个 match 使用模式解构每一个内部值,如示例 18-15 所示: 文件名:src/main.rs enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(i32, i32, i32),\n} fn main() { let msg = Message::ChangeColor(0, 160, 255); match msg { Message::Quit => { println!(\"The Quit variant has no data to destructure.\"); } Message::Move { x, y } => { println!(\"Move in the x direction {x} and in the y direction {y}\"); } Message::Write(text) => { println!(\"Text message: {text}\"); } Message::ChangeColor(r, g, b) => { println!(\"Change the color to red {r}, green {g}, and blue {b}\") } }\n} 示例 18-15: 解构包含不同类型值成员的枚举 这段代码会打印出 Change the color to red 0, green 160, and blue 255。尝试改变 msg 的值来观察其他分支代码的运行。 对于像 Message::Quit 这样没有任何数据的枚举成员,不能进一步解构其值。只能匹配其字面值 Message::Quit,因此模式中没有任何变量。 对于像 Message::Move 这样的类结构体枚举成员,可以采用类似于匹配结构体的模式。在成员名称后,使用大括号并列出字段变量以便将其分解以供此分支的代码使用。这里使用了示例 18-13 所展示的简写。 对于像 Message::Write 这样的包含一个元素,以及像 Message::ChangeColor 这样包含三个元素的类元组枚举成员,其模式则类似于用于解构元组的模式。模式中变量的数量必须与成员中元素的数量一致。 解构嵌套的结构体和枚举 目前为止,所有的例子都只匹配了深度为一级的结构体或枚举,不过当然也可以匹配嵌套的项!例如,我们可以重构列表 18-15 的代码在 ChangeColor 消息中同时支持 RGB 和 HSV 色彩模式,如示例 18-16 所示: enum Color { Rgb(i32, i32, i32), Hsv(i32, i32, i32),\n} enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(Color),\n} fn main() { let msg = Message::ChangeColor(Color::Hsv(0, 160, 255)); match msg { Message::ChangeColor(Color::Rgb(r, g, b)) => { println!(\"Change color to red {r}, green {g}, and blue {b}\"); } Message::ChangeColor(Color::Hsv(h, s, v)) => { println!(\"Change color to hue {h}, saturation {s}, value {v}\") } _ => (), }\n} 示例 18-16: 匹配嵌套的枚举 match 表达式第一个分支的模式匹配一个包含 Color::Rgb 枚举成员的 Message::ChangeColor 枚举成员,然后模式绑定了 3 个内部的 i32 值。第二个分支的模式也匹配一个 Message::ChangeColor 枚举成员,但是其内部的枚举会匹配 Color::Hsv 枚举成员。我们可以在一个 match 表达式中指定这些复杂条件,即使会涉及到两个枚举。 解构结构体和元组 甚至可以用复杂的方式来混合、匹配和嵌套解构模式。如下是一个复杂结构体的例子,其中结构体和元组嵌套在元组中,并将所有的原始类型解构出来: # fn main() {\n# struct Point {\n# x: i32,\n# y: i32,\n# }\n# let ((feet, inches), Point { x, y }) = ((3, 10), Point { x: 3, y: -10 });\n# } 这将复杂的类型分解成部分组件以便可以单独使用我们感兴趣的值。 通过模式解构是一个方便利用部分值片段的手段,比如结构体中每个单独字段的值。","breadcrumbs":"模式与模式匹配 » 模式语法 » 解构并分解值","id":"359","title":"解构并分解值"},"36":{"body":"我们还没有完全分析完这行代码。虽然我们已经讲到了第三行代码,但要注意:它仍是逻辑行(虽然换行了但仍是语句)的一部分。后一部分是这个方法(method): # use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess) .expect(\"Failed to read line\");\n# # println!(\"You guessed: {}\", guess);\n# } 我们也可以将代码这样写: io::stdin().read_line(&mut guess).expect(\"Failed to read line\"); 不过,过长的代码行难以阅读,所以最好拆开来写。通常来说,当使用 .method_name() 语法调用方法时引入换行符和空格将长的代码行拆开是明智的。现在来看看这行代码干了什么。 之前提到了 read_line 会将用户输入附加到传递给它的字符串中,不过它也会返回一个类型为 Result 的值。 Result 是一种 枚举类型 ,通常也写作 enum 。枚举类型变量的值可以是多种可能状态中的一个。我们把每种可能的状态称为一种 枚举成员(variant) 。 第六章 将介绍枚举的更多细节。这里的 Result 类型将用来编码错误处理的信息。 Result 的成员是 Ok 和 Err,Ok 成员表示操作成功,内部包含成功时产生的值。Err 成员则意味着操作失败,并且 Err 中包含有关操作失败的原因或方式的信息。 这些 Result 类型的作用是编码错误处理信息。Result 类型的值,像其他类型一样,拥有定义于其上的方法。Result 的实例拥有 expect 方法 。如果 io::Result 实例的值是 Err,expect 会导致程序崩溃,并显示当做参数传递给 expect 的信息。如果 read_line 方法返回 Err,则可能是来源于底层操作系统错误的结果。如果 Result 实例的值是 Ok,expect 会获取 Ok 中的值并原样返回。在本例中,这个值是用户输入到标准输入中的字节数。 如果不调用 expect,程序也能编译,不过会出现一个警告: $ cargo build Compiling guessing_game v0.1.0 (file:///projects/guessing_game)\nwarning: unused `Result` that must be used --> src/main.rs:10:5 |\n10 | io::stdin().read_line(&mut guess); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: this `Result` may be an `Err` variant, which should be handled = note: `#[warn(unused_must_use)]` on by default\nhelp: use `let _ = ...` to ignore the resulting value |\n10 | let _ = io::stdin().read_line(&mut guess); | +++++++ warning: `guessing_game` (bin \"guessing_game\") generated 1 warning Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.59s Rust 警告我们没有使用 read_line 的返回值 Result,说明有一个可能的错误没有处理。 消除警告的正确做法是实际去编写错误处理代码,不过由于我们就是希望程序在出现问题时立即崩溃,所以直接使用 expect。 第九章 会学习如何从错误中恢复。","breadcrumbs":"写个猜数字游戏 » 使用 Result 类型来处理潜在的错误","id":"36","title":"使用 Result 类型来处理潜在的错误"},"360":{"body":"有时忽略模式中的一些值是有用的,比如 match 中最后捕获全部情况的分支实际上没有做任何事,但是它确实对所有剩余情况负责。有一些简单的方法可以忽略模式中全部或部分值:使用 _ 模式(我们已经见过了),在另一个模式中使用 _ 模式,使用一个以下划线开始的名称,或者使用 .. 忽略所剩部分的值。让我们来分别探索如何以及为什么要这么做。 使用 _ 忽略整个值 我们已经使用过下划线作为匹配但不绑定任何值的通配符模式了。虽然这作为 match 表达式最后的分支特别有用,也可以将其用于任意模式,包括函数参数中,如示例 18-17 所示: 文件名:src/main.rs fn foo(_: i32, y: i32) { println!(\"This code only uses the y parameter: {y}\");\n} fn main() { foo(3, 4);\n} 示例 18-17: 在函数签名中使用 _ 这段代码会完全忽略作为第一个参数传递的值 3,并会打印出 This code only uses the y parameter: 4。 大部分情况当你不再需要特定函数参数时,最好修改签名不再包含无用的参数。在一些情况下忽略函数参数会变得特别有用,比如实现 trait 时,当你需要特定类型签名但是函数实现并不需要某个参数时。这样可以避免一个存在未使用的函数参数的编译警告,就跟使用命名参数一样。 使用嵌套的 _ 忽略部分值 也可以在一个模式内部使用_ 忽略部分值,例如,当只需要测试部分值但在期望运行的代码中没有用到其他部分时。示例 18-18 展示了负责管理设置值的代码。业务需求是用户不允许覆盖现有的自定义设置,但是可以取消设置,也可以在当前未设置时为其提供设置。 # fn main() { let mut setting_value = Some(5); let new_setting_value = Some(10); match (setting_value, new_setting_value) { (Some(_), Some(_)) => { println!(\"Can't overwrite an existing customized value\"); } _ => { setting_value = new_setting_value; } } println!(\"setting is {setting_value:?}\");\n# } 示例 18-18: 当不需要 Some 中的值时在模式内使用下划线来匹配 Some 成员 这段代码会打印出 Can't overwrite an existing customized value 接着是 setting is Some(5)。在第一个匹配分支,我们不需要匹配或使用任一个 Some 成员中的值;重要的部分是需要测试 setting_value 和 new_setting_value 都为 Some 成员的情况。在这种情况,我们打印出为何不改变 setting_value,并且不会改变它。 对于所有其他情况(setting_value 或 new_setting_value 任一为 None),这由第二个分支的 _ 模式体现,这时确实希望允许 new_setting_value 变为 setting_value。 也可以在一个模式中的多处使用下划线来忽略特定值,如示例 18-19 所示,这里忽略了一个五元元组中的第二和第四个值: # fn main() { let numbers = (2, 4, 8, 16, 32); match numbers { (first, _, third, _, fifth) => { println!(\"Some numbers: {first}, {third}, {fifth}\") } }\n# } 示例 18-19: 忽略元组的多个部分 这会打印出 Some numbers: 2, 8, 32,值 4 和 16 会被忽略。 通过在名字前以一个 _ 开头来忽略未使用的变量 如果你创建了一个变量却不在任何地方使用它,Rust 通常会给你一个警告,因为未使用的变量可能会是个 bug。但是有时创建一个还未使用的变量是有用的,比如你正在设计原型或刚刚开始一个项目。这时你希望告诉 Rust 不要警告未使用的变量,为此可以用下划线作为变量名的开头。示例 18-20 中创建了两个未使用变量,不过当编译代码时只会得到其中一个的警告: 文件名:src/main.rs fn main() { let _x = 5; let y = 10;\n} 示例 18-20: 以下划线开始变量名以便去掉未使用变量警告 这里得到了警告说未使用变量 y,不过没有警告说使用 _x。 注意,只使用 _ 和使用以下划线开头的名称有些微妙的不同:比如 _x 仍会将值绑定到变量,而 _ 则完全不会绑定。为了展示这个区别的意义,示例 18-21 会产生一个错误。 # fn main() { let s = Some(String::from(\"Hello!\")); if let Some(_s) = s { println!(\"found a string\"); } println!(\"{s:?}\");\n# } 示例 18-21: 以下划线开头的未使用变量仍然会绑定值,它可能会获取值的所有权 我们会得到一个错误,因为 s 的值仍然会移动进 _s,并阻止我们再次使用 s。然而只使用下划线本身,并不会绑定值。示例 18-22 能够无错编译,因为 s 没有被移动进 _: # fn main() { let s = Some(String::from(\"Hello!\")); if let Some(_) = s { println!(\"found a string\"); } println!(\"{s:?}\");\n# } 示例 18-22: 单独使用下划线不会绑定值 上面的代码能很好的运行;因为没有把 s 绑定到任何变量;它没有被移动。 用 .. 忽略剩余值 对于有多个部分的值,可以使用 .. 语法来只使用特定部分并忽略其它值,同时避免不得不每一个忽略值列出下划线。.. 模式会忽略模式中剩余的任何没有显式匹配的值部分。在示例 18-23 中,有一个 Point 结构体存放了三维空间中的坐标。在 match 表达式中,我们希望只操作 x 坐标并忽略 y 和 z 字段的值: # fn main() { struct Point { x: i32, y: i32, z: i32, } let origin = Point { x: 0, y: 0, z: 0 }; match origin { Point { x, .. } => println!(\"x is {x}\"), }\n# } 示例 18-23: 通过使用 .. 来忽略 Point 中除 x 以外的字段 这里列出了 x 值,接着仅仅包含了 .. 模式。这比不得不列出 y: _ 和 z: _ 要来得简单,特别是在处理有很多字段的结构体,但只涉及一到两个字段时的情形。 .. 会扩展为所需要的值的数量。示例 18-24 展示了元组中 .. 的应用: 文件名:src/main.rs fn main() { let numbers = (2, 4, 8, 16, 32); match numbers { (first, .., last) => { println!(\"Some numbers: {first}, {last}\"); } }\n} 示例 18-24: 只匹配元组中的第一个和最后一个值并忽略掉所有其它值 这里用 first 和 last 来匹配第一个和最后一个值。.. 将匹配并忽略中间的所有值。 然而使用 .. 必须是无歧义的。如果期望匹配和忽略的值是不明确的,Rust 会报错。示例 18-25 展示了一个带有歧义的 .. 例子,因此其不能编译: 文件名:src/main.rs fn main() { let numbers = (2, 4, 8, 16, 32); match numbers { (.., second, ..) => { println!(\"Some numbers: {second}\") }, }\n} 示例 18-25: 尝试以有歧义的方式运用 .. 如果编译上面的例子,会得到下面的错误: $ cargo run Compiling patterns v0.1.0 (file:///projects/patterns)\nerror: `..` can only be used once per tuple pattern --> src/main.rs:5:22 |\n5 | (.., second, ..) => { | -- ^^ can only be used once per tuple pattern | | | previously used here error: could not compile `patterns` (bin \"patterns\") due to 1 previous error Rust 不可能决定在元组中匹配 second 值之前应该忽略多少个值,以及在之后忽略多少个值。这段代码可能表明我们意在忽略 2,绑定 second 为 4,接着忽略 8、16 和 32;抑或是意在忽略 2 和 4,绑定 second 为 8,接着忽略 16 和 32,以此类推。变量名 second 对于 Rust 来说并没有任何特殊意义,所以会得到编译错误,因为在这两个地方使用 .. 是有歧义的。","breadcrumbs":"模式与模式匹配 » 模式语法 » 忽略模式中的值","id":"360","title":"忽略模式中的值"},"361":{"body":"匹配守卫 ( match guard )是一个指定于 match 分支模式之后的额外 if 条件,它也必须被满足才能选择此分支。匹配守卫用于表达比单独的模式所能允许的更为复杂的情况。 这个条件可以使用模式中创建的变量。示例 18-26 展示了一个 match,其中第一个分支有模式 Some(x) 还有匹配守卫 if x % 2 == 0 (当 x 是偶数的时候为真): # fn main() { let num = Some(4); match num { Some(x) if x % 2 == 0 => println!(\"The number {x} is even\"), Some(x) => println!(\"The number {x} is odd\"), None => (), }\n# } 示例 18-26: 在模式中加入匹配守卫 上例会打印出 The number 4 is even。当 num 与模式中第一个分支比较时,因为 Some(4) 匹配 Some(x) 所以可以匹配。接着匹配守卫检查 x 除以 2 的余数是否等于 0,因为它等于 0,所以第一个分支被选择。 相反如果 num 为 Some(5),因为 5 除以 2 的余数是 1 不等于 0 所以第一个分支的匹配守卫为假。接着 Rust 会前往第二个分支,这次匹配因为它没有匹配守卫所以会匹配任何 Some 成员。 无法在模式中表达类似 if x % 2 == 0 的条件,所以通过匹配守卫提供了表达类似逻辑的能力。这种替代表达方式的缺点是,编译器不会尝试为包含匹配守卫的模式检查穷尽性。 在示例 18-11 中,我们提到可以使用匹配守卫来解决模式中变量覆盖的问题,那里 match 表达式的模式中新建了一个变量而不是使用 match 之外的同名变量。新变量意味着不能够测试外部变量的值。示例 18-27 展示了如何使用匹配守卫修复这个问题。 文件名:src/main.rs fn main() { let x = Some(5); let y = 10; match x { Some(50) => println!(\"Got 50\"), Some(n) if n == y => println!(\"Matched, n = {n}\"), _ => println!(\"Default case, x = {x:?}\"), } println!(\"at the end: x = {x:?}, y = {y}\");\n} 示例 18-27: 使用匹配守卫来测试与外部变量的相等性 现在这会打印出 Default case, x = Some(5)。现在第二个匹配分支中的模式不会引入一个覆盖外部 y 的新变量 y,这意味着可以在匹配守卫中使用外部的 y。相比指定会覆盖外部 y 的模式 Some(y),这里指定为 Some(n)。此新建的变量 n 并没有覆盖任何值,因为 match 外部没有变量 n。 匹配守卫 if n == y 并不是一个模式所以没有引入新变量。这个 y 正是 外部的 y 而不是新的覆盖变量 y,这样就可以通过比较 n 和 y 来表达寻找一个与外部 y 相同的值的概念了。 也可以在匹配守卫中使用 或 运算符 | 来指定多个模式,同时匹配守卫的条件会作用于所有的模式。示例 18-28 展示了结合匹配守卫与使用了 | 的模式的优先级。这个例子中重要的部分是匹配守卫 if y 作用于 4、5 和 6,即使这看起来好像 if y 只作用于 6: # fn main() { let x = 4; let y = false; match x { 4 | 5 | 6 if y => println!(\"yes\"), _ => println!(\"no\"), }\n# } 示例 18-28: 结合多个模式与匹配守卫 这个匹配条件表明此分支值匹配 x 值为 4、5 或 6 同时 y 为 true 的情况。运行这段代码时会发生的是第一个分支的模式因 x 为 4 而匹配,不过匹配守卫 if y 为假,所以第一个分支不会被选择。代码移动到第二个分支,这会匹配,此程序会打印出 no。这是因为 if 条件作用于整个 4 | 5 | 6 模式,而不仅是最后的值 6。换句话说,匹配守卫与模式的优先级关系看起来像这样: (4 | 5 | 6) if y => ... 而不是: 4 | 5 | (6 if y) => ... 可以通过运行代码时的情况看出这一点:如果匹配守卫只作用于由 | 运算符指定的值列表的最后一个值,这个分支就会匹配且程序会打印出 yes。","breadcrumbs":"模式与模式匹配 » 模式语法 » 匹配守卫提供的额外条件","id":"361","title":"匹配守卫提供的额外条件"},"362":{"body":"at 运算符(@)允许我们在创建一个存放值的变量的同时测试其值是否匹配模式。示例 18-29 展示了一个例子,这里我们希望测试 Message::Hello 的 id 字段是否位于 3..=7 范围内,同时也希望能将其值绑定到 id_variable 变量中以便此分支相关联的代码可以使用它。可以将 id_variable 命名为 id,与字段同名,不过出于示例的目的这里选择了不同的名称。 # fn main() { enum Message { Hello { id: i32 }, } let msg = Message::Hello { id: 5 }; match msg { Message::Hello { id: id_variable @ 3..=7, } => println!(\"Found an id in range: {id_variable}\"), Message::Hello { id: 10..=12 } => { println!(\"Found an id in another range\") } Message::Hello { id } => println!(\"Found some other id: {id}\"), }\n# } 示例 18-29: 使用 @ 在模式中绑定值的同时测试它 上例会打印出 Found an id in range: 5。通过在 3..=7 之前指定 id_variable @,我们捕获了任何匹配此范围的值并同时测试其值匹配这个范围模式。 第二个分支只在模式中指定了一个范围,分支相关代码没有一个包含 id 字段实际值的变量。id 字段的值可以是 10、11 或 12,不过这个模式的代码并不知情也不能使用 id 字段中的值,因为没有将 id 值保存进一个变量。 最后一个分支指定了一个没有范围的变量,此时确实拥有可以用于分支代码的变量 id,因为这里使用了结构体字段简写语法。不过此分支中没有像头两个分支那样对 id 字段的值进行测试:任何值都会匹配此分支。 使用 @ 可以在一个模式中同时测试和保存变量值。","breadcrumbs":"模式与模式匹配 » 模式语法 » @ 绑定","id":"362","title":"@ 绑定"},"363":{"body":"模式是 Rust 中一个很有用的功能,它有助于我们区分不同类型的数据。当用于 match 语句时,Rust 确保模式会包含每一个可能的值,否则程序将不能编译。let 语句和函数参数的模式使得这些结构更强大,可以在将值解构为更小部分的同时为变量赋值。可以创建简单或复杂的模式来满足我们的要求。 接下来,在本书倒数第二章中,我们将介绍一些 Rust 众多功能中较为高级的部分。","breadcrumbs":"模式与模式匹配 » 模式语法 » 总结","id":"363","title":"总结"},"364":{"body":"ch20-00-advanced-features.md commit a8536189d5f1ba2f0b1187bfae787c0d89e2871c 现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十一章开始另一个新项目之前,让我们聊聊一些总有一天你会遇上的部分内容。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下很有用处。虽然很少会碰到它们,我们希望确保你了解 Rust 提供的所有功能。 本章将涉及如下内容: 不安全 Rust:用于当需要舍弃 Rust 的某些保证并负责手动维持这些保证 高级 trait:与 trait 相关的关联类型,默认类型参数,完全限定语法(fully qualified syntax),超(父)trait(supertraits)和 newtype 模式 高级类型:关于 newtype 模式的更多内容,类型别名,never 类型和动态大小类型 高级函数和闭包:函数指针和返回闭包 宏:定义在编译时定义更多代码的方式 对所有人而言,这都是一个介绍 Rust 迷人特性的宝典!让我们翻开它吧!","breadcrumbs":"高级特征 » 高级特征","id":"364","title":"高级特征"},"365":{"body":"ch20-01-unsafe-rust.md commit 057b0d338229b87d06be772346ea0b643bdecdc5 目前为止讨论过的代码都有 Rust 在编译时会强制执行的内存安全保证。然而,Rust 还隐藏有第二种语言,它不会强制执行这类内存安全保证:这被称为 不安全 Rust ( unsafe Rust )。它与常规 Rust 代码无异,但是会提供额外的超能力。 尽管代码可能没问题,但如果 Rust 编译器没有足够的信息可以确定,它将拒绝代码。 不安全 Rust 之所以存在,是因为静态分析本质上是保守的。当编译器尝试确定一段代码是否支持某个保证时,拒绝一些合法的程序比接受无效的程序要好一些。这必然意味着有时代码 可能 是合法的,但如果 Rust 编译器没有足够的信息来确定,它将拒绝该代码。在这种情况下,可以使用不安全代码告诉编译器,“相信我,我知道我在干什么。” 不过千万注意,使用不安全 Rust 风险自担:如果不安全代码出错了,比如解引用空指针,可能会导致不安全的内存使用。 另一个 Rust 存在不安全一面的原因是:底层计算机硬件固有的不安全性。如果 Rust 不允许进行不安全操作,那么有些任务则根本完成不了。Rust 需要能够进行像直接与操作系统交互,甚至于编写你自己的操作系统这样的底层系统编程!这也是 Rust 语言的目标之一。让我们看看不安全 Rust 能做什么,和怎么做。","breadcrumbs":"高级特征 » 不安全的 Rust » 不安全 Rust","id":"365","title":"不安全 Rust"},"366":{"body":"可以通过 unsafe 关键字来切换到不安全 Rust,接着可以开启一个新的存放不安全代码的块。这里有五类可以在不安全 Rust 中进行而不能用于安全 Rust 的操作,它们称之为 “不安全的超能力。( unsafe superpowers )” 这些超能力是: 解引用裸指针 调用不安全的函数或方法 访问或修改可变静态变量 实现不安全 trait 访问 union 的字段 有一点很重要,unsafe 并不会关闭借用检查器或禁用任何其他 Rust 安全检查:如果在不安全代码中使用引用,它仍会被检查。unsafe 关键字只是提供了那五个不会被编译器检查内存安全的功能。你仍然能在不安全块中获得某种程度的安全。 再者,unsafe 不意味着块中的代码就一定是危险的或者必然导致内存安全问题:其意图在于作为程序员你将会确保 unsafe 块中的代码以有效的方式访问内存。 人是会犯错误的,错误总会发生,不过通过要求这五类操作必须位于标记为 unsafe 的块中,就能够知道任何与内存安全相关的错误必定位于 unsafe 块内。保持 unsafe 块尽可能小,如此当之后调查内存 bug 时就会感谢你自己了。 为了尽可能隔离不安全代码,将不安全代码封装进一个安全的抽象并提供安全 API 是一个好主意,当我们学习不安全函数和方法时会讨论到。标准库的一部分被实现为在被评审过的不安全代码之上的安全抽象。这个技术防止了 unsafe 泄露到所有你或者用户希望使用由 unsafe 代码实现的功能的地方,因为使用其安全抽象是安全的。 让我们按顺序依次介绍上述五个超能力,同时我们会看到一些提供不安全代码的安全接口的抽象。","breadcrumbs":"高级特征 » 不安全的 Rust » 不安全的超能力","id":"366","title":"不安全的超能力"},"367":{"body":"回到第四章的 “悬垂引用” 部分,那里提到了编译器会确保引用总是有效的。不安全 Rust 有两个被称为 裸指针 ( raw pointers )的类似于引用的新类型。和引用一样,裸指针是不可变或可变的,分别写作 *const T 和 *mut T。这里的星号不是解引用运算符;它是类型名称的一部分。在裸指针的上下文中, 不可变 意味着指针解引用之后不能直接赋值。 裸指针与引用和智能指针的区别在于 允许忽略借用规则,可以同时拥有不可变和可变的指针,或多个指向相同位置的可变指针 不保证指向有效的内存 允许为空 不能实现任何自动清理功能 通过去掉 Rust 强加的保证,你可以放弃安全保证以换取性能或使用另一个语言或硬件接口的能力,此时 Rust 的保证并不适用。 示例 19-1 展示了如何从引用同时创建不可变和可变裸指针。 # fn main() { let mut num = 5; let r1 = &num as *const i32; let r2 = &mut num as *mut i32;\n# } 示例 19-1: 通过引用创建裸指针 注意这里没有引入 unsafe 关键字。可以在安全代码中 创建 裸指针,只是不能在不安全块之外 解引用 裸指针,稍后便会看到。 这里使用 as 将不可变和可变引用强转为对应的裸指针类型。因为直接从保证安全的引用来创建它们,可以知道这些特定的裸指针是有效,但是不能对任何裸指针做出如此假设。 作为展示接下来会创建一个不能确定其有效性的裸指针,示例 19-2 展示了如何创建一个指向任意内存地址的裸指针。尝试使用任意内存是未定义行为:此地址可能有数据也可能没有,编译器可能会优化掉这个内存访问,或者程序可能会出现段错误(segmentation fault)。通常没有好的理由编写这样的代码,不过却是可行的: # fn main() { let address = 0x012345usize; let r = address as *const i32;\n# } 示例 19-2: 创建指向任意内存地址的裸指针 记得我们说过可以在安全代码中创建裸指针,不过不能 解引用 裸指针和读取其指向的数据。现在我们要做的就是对裸指针使用解引用运算符 *,这需要一个 unsafe 块,如示例 19-3 所示: # fn main() { let mut num = 5; let r1 = &num as *const i32; let r2 = &mut num as *mut i32; unsafe { println!(\"r1 is: {}\", *r1); println!(\"r2 is: {}\", *r2); }\n# } 示例 19-3: 在 unsafe 块中解引用裸指针 创建一个指针不会造成任何危险;只有当访问其指向的值时才有可能遇到无效的值。 还需注意示例 19-1 和 19-3 中创建了同时指向相同内存位置 num 的裸指针 *const i32 和 *mut i32。相反如果尝试同时创建 num 的不可变和可变引用,将无法通过编译,因为 Rust 的所有权规则不允许在拥有任何不可变引用的同时再创建一个可变引用。通过裸指针,就能够同时创建同一地址的可变指针和不可变指针,若通过可变指针修改数据,则可能潜在造成数据竞争。请多加小心! 既然存在这么多的危险,为何还要使用裸指针呢?一个主要的应用场景便是调用 C 代码接口,这在下一部分 “调用不安全函数或方法” 中会讲到。另一个场景是构建借用检查器无法理解的安全抽象。让我们先介绍不安全函数,接着看一看使用不安全代码的安全抽象的例子。","breadcrumbs":"高级特征 » 不安全的 Rust » 解引用裸指针","id":"367","title":"解引用裸指针"},"368":{"body":"第二类可以在不安全块中进行的操作是调用不安全函数。不安全函数和方法与常规函数方法十分类似,除了其开头有一个额外的 unsafe。在此上下文中,关键字unsafe表示该函数具有调用时需要满足的要求,而 Rust 不会保证满足这些要求。通过在 unsafe 块中调用不安全函数,表明我们已经阅读过此函数的文档并对其是否满足函数自身的契约负责。 如下是一个没有做任何操作的不安全函数 dangerous 的例子: # fn main() { unsafe fn dangerous() {} unsafe { dangerous(); }\n# } 必须在一个单独的 unsafe 块中调用 dangerous 函数。如果尝试不使用 unsafe 块调用 dangerous,则会得到一个错误: $ cargo run Compiling unsafe-example v0.1.0 (file:///projects/unsafe-example)\nerror[E0133]: call to unsafe function `dangerous` is unsafe and requires unsafe function or block --> src/main.rs:4:5 |\n4 | dangerous(); | ^^^^^^^^^^^ call to unsafe function | = note: consult the function's documentation for information on how to avoid undefined behavior For more information about this error, try `rustc --explain E0133`.\nerror: could not compile `unsafe-example` (bin \"unsafe-example\") due to 1 previous error 通过 unsafe 块,我们向 Rust 保证了我们已经阅读过函数的文档,理解如何正确使用,并验证过其满足函数的契约。 不安全函数体也是有效的 unsafe 块,所以在不安全函数中进行另一个不安全操作时无需新增额外的 unsafe 块。 创建不安全代码的安全抽象 仅仅因为函数包含不安全代码并不意味着整个函数都需要标记为不安全的。事实上,将不安全代码封装进安全函数是一个常见的抽象。作为一个例子,了解一下标准库中的函数 split_at_mut,它需要一些不安全代码,让我们探索如何可以实现它。这个安全函数定义于可变 slice 之上:它获取一个 slice 并从给定的索引参数开始将其分为两个 slice。split_at_mut 的用法如示例 19-4 所示: # fn main() { let mut v = vec![1, 2, 3, 4, 5, 6]; let r = &mut v[..]; let (a, b) = r.split_at_mut(3); assert_eq!(a, &mut [1, 2, 3]); assert_eq!(b, &mut [4, 5, 6]);\n# } 示例 19-4: 使用安全的 split_at_mut 函数 这个函数无法只通过安全 Rust 实现。一个尝试可能看起来像示例 19-5,它不能编译。出于简单考虑,我们将 split_at_mut 实现为函数而不是方法,并只处理 i32 值而非泛型 T 的 slice。 fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) { let len = values.len(); assert!(mid <= len); (&mut values[..mid], &mut values[mid..])\n}\n# # fn main() {\n# let mut vector = vec![1, 2, 3, 4, 5, 6];\n# let (left, right) = split_at_mut(&mut vector, 3);\n# } 示例 19-5: 尝试只使用安全 Rust 来实现 split_at_mut 此函数首先获取 slice 的长度,然后通过检查参数是否小于或等于这个长度来断言参数所给定的索引位于 slice 当中。该断言意味着如果传入的索引比要分割的 slice 的索引更大,此函数在尝试使用这个索引前 panic。 之后我们在一个元组中返回两个可变的 slice:一个从原始 slice 的开头直到 mid 索引,另一个从 mid 直到原 slice 的结尾。 如果尝试编译示例 19-5 的代码,会得到一个错误: $ cargo run Compiling unsafe-example v0.1.0 (file:///projects/unsafe-example)\nerror[E0499]: cannot borrow `*values` as mutable more than once at a time --> src/main.rs:6:31 |\n1 | fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) { | - let's call the lifetime of this reference `'1`\n...\n6 | (&mut values[..mid], &mut values[mid..]) | --------------------------^^^^^^-------- | | | | | | | second mutable borrow occurs here | | first mutable borrow occurs here | returning this value requires that `*values` is borrowed for `'1` | = help: use `.split_at_mut(position)` to obtain two mutable non-overlapping sub-slices For more information about this error, try `rustc --explain E0499`.\nerror: could not compile `unsafe-example` (bin \"unsafe-example\") due to 1 previous error Rust 的借用检查器不能理解我们要借用这个 slice 的两个不同部分:它只知道我们借用了同一个 slice 两次。本质上借用 slice 的不同部分是可以的,因为结果两个 slice 不会重叠,不过 Rust 还没有智能到能够理解这些。当我们知道某些事是可以的而 Rust 不知道的时候,就是触及不安全代码的时候了 示例 19-6 展示了如何使用 unsafe 块,裸指针和一些不安全函数调用来实现 split_at_mut: use std::slice; fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) { let len = values.len(); let ptr = values.as_mut_ptr(); assert!(mid <= len); unsafe { ( slice::from_raw_parts_mut(ptr, mid), slice::from_raw_parts_mut(ptr.add(mid), len - mid), ) }\n}\n# # fn main() {\n# let mut vector = vec![1, 2, 3, 4, 5, 6];\n# let (left, right) = split_at_mut(&mut vector, 3);\n# } 示例 19-6: 在 split_at_mut 函数的实现中使用不安全代码 回忆第四章的 “Slice 类型” 部分,slice 是一个指向一些数据的指针,并带有该 slice 的长度。可以使用 len 方法获取 slice 的长度,使用 as_mut_ptr 方法访问 slice 的裸指针。在这个例子中,因为有一个 i32 值的可变 slice,as_mut_ptr 返回一个 *mut i32 类型的裸指针,储存在 ptr 变量中。 我们保持索引 mid 位于 slice 中的断言。接着是不安全代码:slice::from_raw_parts_mut 函数获取一个裸指针和一个长度来创建一个 slice。这里使用此函数从 ptr 中创建了一个有 mid 个项的 slice。之后在 ptr 上调用 add 方法并使用 mid 作为参数来获取一个从 mid 开始的裸指针,使用这个裸指针并以 mid 之后项的数量为长度创建一个 slice。 slice::from_raw_parts_mut 函数是不安全的因为它获取一个裸指针,并必须确信这个指针是有效的。裸指针上的 add 方法也是不安全的,因为其必须确信此地址偏移量也是有效的指针。因此必须将 slice::from_raw_parts_mut 和 add 放入 unsafe 块中以便能调用它们。通过观察代码,和增加 mid 必然小于等于 len 的断言,我们可以说 unsafe 块中所有的裸指针将是有效的 slice 中数据的指针。这是一个可以接受的 unsafe 的恰当用法。 注意无需将 split_at_mut 函数的结果标记为 unsafe,并可以在安全 Rust 中调用此函数。我们创建了一个不安全代码的安全抽象,其代码以一种安全的方式使用了 unsafe 代码,因为其只从这个函数访问的数据中创建了有效的指针。 与此相对,示例 19-7 中的 slice::from_raw_parts_mut 在使用 slice 时很有可能会崩溃。这段代码获取任意内存地址并创建了一个长为一万的 slice: # fn main() { use std::slice; let address = 0x01234usize; let r = address as *mut i32; let values: &[i32] = unsafe { slice::from_raw_parts_mut(r, 10000) };\n# } 示例 19-7: 通过任意内存地址创建 slice 我们并不拥有这个任意地址的内存,也不能保证这段代码创建的 slice 包含有效的 i32 值。试图使用臆测为有效的 values 会导致未定义的行为。 使用 extern 函数调用外部代码 有时你的 Rust 代码可能需要与其他语言编写的代码交互。为此 Rust 有一个关键字,extern,有助于创建和使用 外部函数接口 ( Foreign Function Interface ,FFI)。外部函数接口是一个编程语言用以定义函数的方式,其允许不同(外部)编程语言调用这些函数。 示例 19-8 展示了如何集成 C 标准库中的 abs 函数。extern 块中声明的函数在 Rust 代码中总是不安全的。因为其他语言不会强制执行 Rust 的规则且 Rust 无法检查它们,所以确保其安全是程序员的责任: 文件名:src/main.rs extern \"C\" { fn abs(input: i32) -> i32;\n} fn main() { unsafe { println!(\"Absolute value of -3 according to C: {}\", abs(-3)); }\n} 示例 19-8: 声明并调用另一个语言中定义的 extern 函数 在 extern \"C\" 块中,列出了我们希望能够调用的另一个语言中的外部函数的签名和名称。\"C\" 部分定义了外部函数所使用的 应用二进制接口 ( application binary interface ,ABI) —— ABI 定义了如何在汇编语言层面调用此函数。\"C\" ABI 是最常见的,并遵循 C 编程语言的 ABI。 从其它语言调用 Rust 函数 也可以使用 extern 来创建一个允许其他语言调用 Rust 函数的接口。不同于创建整个 extern 块,就在 fn 关键字之前增加 extern 关键字并为相关函数指定所用到的 ABI。还需增加 #[no_mangle] 注解来告诉 Rust 编译器不要 mangle 此函数的名称。 Mangling 发生于当编译器将我们指定的函数名修改为不同的名称时,这会增加用于其他编译过程的额外信息,不过会使其名称更难以阅读。每一个编程语言的编译器都会以稍微不同的方式 mangle 函数名,所以为了使 Rust 函数能在其他语言中指定,必须禁用 Rust 编译器的 name mangling。 在如下的例子中,一旦其编译为动态库并从 C 语言中链接,call_from_c 函数就能够在 C 代码中访问: #[no_mangle]\npub extern \"C\" fn call_from_c() { println!(\"Just called a Rust function from C!\");\n} extern 的使用无需 unsafe。","breadcrumbs":"高级特征 » 不安全的 Rust » 调用不安全函数或方法","id":"368","title":"调用不安全函数或方法"},"369":{"body":"目前为止全书都尽量避免讨论 全局变量 ( global variables ),Rust 确实支持它们,不过这对于 Rust 的所有权规则来说是有问题的。如果有两个线程访问相同的可变全局变量,则可能会造成数据竞争。 全局变量在 Rust 中被称为 静态 ( static )变量。示例 19-9 展示了一个拥有字符串 slice 值的静态变量的声明和应用: 文件名:src/main.rs static HELLO_WORLD: &str = \"Hello, world!\"; fn main() { println!(\"name is: {HELLO_WORLD}\");\n} 示例 19-9: 定义和使用一个不可变静态变量 静态(static)变量类似于第三章 “变量和常量的区别” 部分讨论的常量。通常静态变量的名称采用 SCREAMING_SNAKE_CASE 写法。静态变量只能储存拥有 'static 生命周期的引用,这意味着 Rust 编译器可以自己计算出其生命周期而无需显式标注。访问不可变静态变量是安全的。 常量与不可变静态变量的一个微妙的区别是静态变量中的值有一个固定的内存地址。使用这个值总是会访问相同的地址。另一方面,常量则允许在任何被用到的时候复制其数据。另一个区别在于静态变量可以是可变的。访问和修改可变静态变量都是 不安全 的。示例 19-10 展示了如何声明、访问和修改名为 COUNTER 的可变静态变量: 文件名:src/main.rs static mut COUNTER: u32 = 0; fn add_to_count(inc: u32) { unsafe { COUNTER += inc; }\n} fn main() { add_to_count(3); unsafe { println!(\"COUNTER: {COUNTER}\"); }\n} 示例 19-10: 读取或修改一个可变静态变量是不安全的 就像常规变量一样,我们使用 mut 关键来指定可变性。任何读写 COUNTER 的代码都必须位于 unsafe 块中。这段代码可以编译并如期打印出 COUNTER: 3,因为这是单线程的。拥有多个线程访问 COUNTER 则可能导致数据竞争。 拥有可以全局访问的可变数据,难以保证不存在数据竞争,这就是为何 Rust 认为可变静态变量是不安全的。任何可能的情况,请优先使用第十六章讨论的并发技术和线程安全智能指针,这样编译器就能检测不同线程间的数据访问是否是安全的。","breadcrumbs":"高级特征 » 不安全的 Rust » 访问或修改可变静态变量","id":"369","title":"访问或修改可变静态变量"},"37":{"body":"除了位于结尾的右花括号,目前为止就只有这一行代码值得讨论一下了,就是这一行: # use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# println!(\"You guessed: {}\", guess);\n# } 这行代码现在打印了存储用户输入的字符串。{} 这对大括号是一个占位符:把 {} 想象成小蟹钳,可以夹住合适的值。当打印变量的值时,变量名可以写进大括号中。当打印表达式的执行结果时,格式化字符串(format string)中大括号中留空,格式化字符串后跟逗号分隔的需要打印的表达式列表,其顺序与每一个空大括号占位符的顺序一致。在一个 println! 调用中打印变量和表达式的值看起来像这样: let x = 5;\nlet y = 10; println!(\"x = {x} and y + 2 = {}\", y + 2); 这行代码会打印出 x = 5 and y + 2 = 12。","breadcrumbs":"写个猜数字游戏 » 使用 println! 占位符打印值","id":"37","title":"使用 println! 占位符打印值"},"370":{"body":"unsafe 的另一个操作用例是实现不安全 trait。当 trait 中至少有一个方法中包含编译器无法验证的不变式(invariant)时 trait 是不安全的。可以在 trait 之前增加 unsafe 关键字将 trait 声明为 unsafe,同时 trait 的实现也必须标记为 unsafe,如示例 19-11 所示: unsafe trait Foo { // methods go here\n} unsafe impl Foo for i32 { // method implementations go here\n} fn main() {} 示例 19-11: 定义并实现不安全 trait 通过 unsafe impl,我们承诺将保证编译器所不能验证的不变量。 作为一个例子,回忆第十六章 “使用 Sync 和 Send trait 的可扩展并发” 部分中的 Sync 和 Send 标记 trait,编译器会自动为完全由 Send 和 Sync 类型组成的类型自动实现它们。如果实现了一个包含一些不是 Send 或 Sync 的类型,比如裸指针,并希望将此类型标记为 Send 或 Sync,则必须使用 unsafe。Rust 不能验证我们的类型保证可以安全的跨线程发送或在多线程间访问,所以需要我们自己进行检查并通过 unsafe 表明。","breadcrumbs":"高级特征 » 不安全的 Rust » 实现不安全 trait","id":"370","title":"实现不安全 trait"},"371":{"body":"仅适用于 unsafe 的最后一个操作是访问 联合体 中的字段,union 和 struct 类似,但是在一个实例中同时只能使用一个声明的字段。联合体主要用于和 C 代码中的联合体交互。访问联合体的字段是不安全的,因为 Rust 无法保证当前存储在联合体实例中数据的类型。可以查看 参考 Rust 文档 了解有关联合体的更多信息。","breadcrumbs":"高级特征 » 不安全的 Rust » 访问联合体中的字段","id":"371","title":"访问联合体中的字段"},"372":{"body":"使用 unsafe 来进行这五个操作(超能力)之一是没有问题的,甚至是不需要深思熟虑的,不过使得 unsafe 代码正确也实属不易,因为编译器不能帮助保证内存安全。当有理由使用 unsafe 代码时,是可以这么做的,通过使用显式的 unsafe 标注可以更容易地在错误发生时追踪问题的源头。","breadcrumbs":"高级特征 » 不安全的 Rust » 何时使用不安全代码","id":"372","title":"何时使用不安全代码"},"373":{"body":"ch20-03-advanced-traits.md commit 95e931170404cb98d476b19017cbbdbc00d0834d 第十章 “trait:定义共同行为” 部分,我们第一次涉及到了 trait,不过我们并没有覆盖一些较为高级的细节。现在我们更加了解 Rust 了,可以深入理解其本质了。","breadcrumbs":"高级特征 » 高级 trait » 高级 trait","id":"373","title":"高级 trait"},"374":{"body":"关联类型 ( associated types )让我们可以在 trait 里面增加一个待定义的类型(类型占位符),将类型占位符与 trait 相关联,这样 trait 的方法签名中就可以使用这些占位符类型。trait 的实现者在实现这个 trait 的时候,会指定一个具体类型,来替换掉这个占位符。这样,我们可以在一个 trait 中通过占位符使用不同类型,在实现此 trait 时才需要指定这些类型具体是什么。 我们之前提到,本章所描述的大部分内容都较少使用。关联类型则比较适中;它们比本书其他的内容要少见,不过比本章中的很多内容要更常见。 一个带有关联类型的 trait 的例子是标准库提供的 Iterator trait。它有一个叫做 Item 的关联类型来替代遍历的值的类型。Iterator trait 的定义如示例 19-12 所示: pub trait Iterator { type Item; fn next(&mut self) -> Option<Self::Item>;\n} 示例 19-12: Iterator trait 的定义中带有关联类型 Item Item 是一个占位符类型,同时 next 方法的定义表明它返回 Option<Self::Item> 类型的值。这个 trait 的实现者会指定 Item 的具体类型,无论实现者指定何种类型,next 方法都会返回一个包含了此具体类型值的 Option。 关联类型看起来有点像泛型:后者允许定义一个函数时,暂不指定其可以处理的类型。为了体现这两者的区别,请看下面的例子。 这个例子为 Counter 结构体实现了 Iterator trait,其中指定 Item 的类型为 u32: 文件名:src/lib.rs # struct Counter {\n# count: u32,\n# }\n# # impl Counter {\n# fn new() -> Counter {\n# Counter { count: 0 }\n# }\n# }\n# impl Iterator for Counter { type Item = u32; fn next(&mut self) -> Option<Self::Item> { // --snip--\n# if self.count < 5 {\n# self.count += 1;\n# Some(self.count)\n# } else {\n# None\n# }\n# }\n# } 这个语法类似于泛型。那么为什么 Iterator trait 不像下面示例 19-13 那样,使用泛型来定义呢? pub trait Iterator<T> { fn next(&mut self) -> Option<T>;\n} 示例 19-13: 一个使用泛型的 Iterator trait 假想定义 区别在于当如示例 19-13 那样使用泛型时,则不得不在每一个实现中标注类型。这是因为我们也可以实现为 Iterator<String> for Counter,或任何其他类型,这样就可以有多个 Counter 的 Iterator 的实现。换句话说,当 trait 有泛型参数时,可以多次实现这个 trait,每次需改变泛型参数的具体类型。接着当使用 Counter 的 next 方法时,必须提供类型注解来表明希望使用 Iterator 的哪一个实现。 有了关联类型,在实现时就无需标注类型,因为不能多次实现这个 trait。对于示例 19-12 使用关联类型的定义,我们只能选择一次 Item 会是什么类型,因为只能有一个 impl Iterator for Counter。当调用 Counter 的 next 时不必每次指定我们需要 u32 值的迭代器。 关联类型也会成为 trait 契约的一部分:trait 的实现必须提供一个类型来替代关联类型占位符。关联类型通常以它的用途来命名,并且我们最好在 API 文档中为关联类型编写文档。","breadcrumbs":"高级特征 » 高级 trait » 关联类型在 trait 定义中指定占位符类型","id":"374","title":"关联类型在 trait 定义中指定占位符类型"},"375":{"body":"当使用泛型类型参数时,可以为泛型指定一个默认的具体类型。如果默认类型就足够的话,这消除了为具体类型实现 trait 的需要。为泛型类型指定默认类型的语法是在声明泛型类型时使用 <PlaceholderType=ConcreteType>。 这种情况的一个非常好的例子是使用 运算符重载 ( Operator overloading ),这是指在特定情况下自定义运算符(比如 +)行为的操作。 Rust 并不允许创建自定义运算符或重载任意运算符,不过 std::ops 中所列出的运算符和相应的 trait 可以通过实现运算符相关 trait 来重载。例如,示例 19-14 中展示了如何在 Point 结构体上实现 Add trait 来重载 + 运算符,这样就可以将两个 Point 实例相加了: 文件名:src/main.rs use std::ops::Add; #[derive(Debug, Copy, Clone, PartialEq)]\nstruct Point { x: i32, y: i32,\n} impl Add for Point { type Output = Point; fn add(self, other: Point) -> Point { Point { x: self.x + other.x, y: self.y + other.y, } }\n} fn main() { assert_eq!( Point { x: 1, y: 0 } + Point { x: 2, y: 3 }, Point { x: 3, y: 3 } );\n} 示例 19-14: 实现 Add trait 重载 Point 实例的 + 运算符 add 方法将两个 Point 实例的 x 值和 y 值分别相加来创建一个新的 Point。Add trait 有一个叫做 Output 的关联类型,它用来决定 add 方法的返回值类型。 这里默认泛型类型位于 Add trait 中。这里是其定义: trait Add<Rhs=Self> { type Output; fn add(self, rhs: Rhs) -> Self::Output;\n} 这些代码看来应该很熟悉,这是一个带有一个方法和一个关联类型的 trait。比较陌生的部分是尖括号中的 Rhs=Self:这个语法叫做 默认类型参数 ( default type parameters )。Rhs 是一个泛型类型参数(“right hand side” 的缩写),它用于定义 add 方法中的 rhs 参数。如果实现 Add trait 时不指定 Rhs 的具体类型,Rhs 的类型将是默认的 Self 类型,也就是在其上实现 Add 的类型。 当为 Point 实现 Add 时,使用了默认的 Rhs,因为我们希望将两个 Point 实例相加。让我们看看一个实现 Add trait 时希望自定义 Rhs 类型而不是使用默认类型的例子。 这里有两个存放不同单元值的结构体,Millimeters 和 Meters。(这种将现有类型简单封装进另一个结构体的方式被称为 newtype 模式 ( newtype pattern ,之后的 “为了类型安全和抽象而使用 newtype 模式” 部分会详细介绍。)我们希望能够将毫米值与米值相加,并让 Add 的实现正确处理转换。可以为 Millimeters 实现 Add 并以 Meters 作为 Rhs,如示例 19-15 所示。 文件名:src/lib.rs use std::ops::Add; struct Millimeters(u32);\nstruct Meters(u32); impl Add<Meters> for Millimeters { type Output = Millimeters; fn add(self, other: Meters) -> Millimeters { Millimeters(self.0 + (other.0 * 1000)) }\n} 示例 19-15: 在 Millimeters 上实现 Add,以便能够将 Millimeters 与 Meters 相加 为了使 Millimeters 和 Meters 能够相加,我们指定 impl Add<Meters> 来设定 Rhs 类型参数的值而不是使用默认的 Self。 默认参数类型主要用于如下两个方面: 扩展类型而不破坏现有代码。 在大部分用户都不需要的特定情况进行自定义。 标准库的 Add trait 就是一个第二个目的例子:大部分时候你会将两个相似的类型相加,不过它提供了自定义额外行为的能力。在 Add trait 定义中使用默认类型参数意味着大部分时候无需指定额外的参数。换句话说,一小部分实现的样板代码是不必要的,这样使用 trait 就更容易了。 第一个目的是相似的,但过程是反过来的:如果需要为现有 trait 增加类型参数,为其提供一个默认类型将允许我们在不破坏现有实现代码的基础上扩展 trait 的功能。","breadcrumbs":"高级特征 » 高级 trait » 默认泛型类型参数和运算符重载","id":"375","title":"默认泛型类型参数和运算符重载"},"376":{"body":"Rust 既不能避免一个 trait 与另一个 trait 拥有相同名称的方法,也不能阻止为同一类型同时实现这两个 trait。甚至直接在类型上实现开始已经有的同名方法也是可能的! 不过,当调用这些同名方法时,需要告诉 Rust 我们希望使用哪一个。考虑一下示例 19-16 中的代码,这里定义了 trait Pilot 和 Wizard 都拥有方法 fly。接着在一个本身已经实现了名为 fly 方法的类型 Human 上实现这两个 trait。每一个 fly 方法都进行了不同的操作: 文件名:src/main.rs trait Pilot { fn fly(&self);\n} trait Wizard { fn fly(&self);\n} struct Human; impl Pilot for Human { fn fly(&self) { println!(\"This is your captain speaking.\"); }\n} impl Wizard for Human { fn fly(&self) { println!(\"Up!\"); }\n} impl Human { fn fly(&self) { println!(\"*waving arms furiously*\"); }\n}\n# # fn main() {} 示例 19-16: 两个 trait 定义为拥有 fly 方法,并在直接定义有 fly 方法的 Human 类型上实现这两个 trait 当调用 Human 实例的 fly 时,编译器默认调用直接实现在类型上的方法,如示例 19-17 所示。 文件名:src/main.rs # trait Pilot {\n# fn fly(&self);\n# }\n# # trait Wizard {\n# fn fly(&self);\n# }\n# # struct Human;\n# # impl Pilot for Human {\n# fn fly(&self) {\n# println!(\"This is your captain speaking.\");\n# }\n# }\n# # impl Wizard for Human {\n# fn fly(&self) {\n# println!(\"Up!\");\n# }\n# }\n# # impl Human {\n# fn fly(&self) {\n# println!(\"*waving arms furiously*\");\n# }\n# }\n# fn main() { let person = Human; person.fly();\n} 示例 19-17: 调用 Human 实例的 fly 运行这段代码会打印出 *waving arms furiously*,这表明 Rust 调用了直接实现在 Human 上的 fly 方法。 为了能够调用 Pilot trait 或 Wizard trait 的 fly 方法,我们需要使用更明显的语法以便能指定我们指的是哪个 fly 方法。这个语法展示在示例 19-18 中: 文件名:src/main.rs # trait Pilot {\n# fn fly(&self);\n# }\n# # trait Wizard {\n# fn fly(&self);\n# }\n# # struct Human;\n# # impl Pilot for Human {\n# fn fly(&self) {\n# println!(\"This is your captain speaking.\");\n# }\n# }\n# # impl Wizard for Human {\n# fn fly(&self) {\n# println!(\"Up!\");\n# }\n# }\n# # impl Human {\n# fn fly(&self) {\n# println!(\"*waving arms furiously*\");\n# }\n# }\n# fn main() { let person = Human; Pilot::fly(&person); Wizard::fly(&person); person.fly();\n} 示例 19-18: 指定我们希望调用哪一个 trait 的 fly 方法 在方法名前指定 trait 名向 Rust 澄清了我们希望调用哪个 fly 实现。也可以选择写成 Human::fly(&person),这等同于示例 19-18 中的 person.fly(),不过如果无需消歧义的话这么写就有点长了。 运行这段代码会打印出: $ cargo run Compiling traits-example v0.1.0 (file:///projects/traits-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.46s Running `target/debug/traits-example`\nThis is your captain speaking.\nUp!\n*waving arms furiously* 因为 fly 方法获取一个 self 参数,如果有两个 类型 都实现了同一 trait ,Rust 可以根据 self 的类型计算出应该使用哪一个 trait 实现。 然而,不是方法的关联函数没有 self 参数。当存在多个类型或者 trait 定义了相同函数名的非方法函数时,Rust 就不总是能计算出我们期望的是哪一个类型,除非使用 完全限定语法 ( fully qualified syntax )。例如示例 19-19 中的创建了一个希望将所有小狗叫做 Spot 的动物收容所的 trait。Animal trait 有一个关联非方法函数 baby_name。结构体 Dog 实现了 Animal,同时又直接提供了关联非方法函数 baby_name。 文件名:src/main.rs trait Animal { fn baby_name() -> String;\n} struct Dog; impl Dog { fn baby_name() -> String { String::from(\"Spot\") }\n} impl Animal for Dog { fn baby_name() -> String { String::from(\"puppy\") }\n} fn main() { println!(\"A baby dog is called a {}\", Dog::baby_name());\n} 示例 19-19: 一个带有关联函数的 trait 和一个带有同名关联函数并实现了此 trait 的类型 Dog 上定义的关联函数 baby_name 的实现代码将所有的小狗起名为 Spot。Dog 类型还实现了 Animal trait,它描述了所有动物的共有的特征。小狗被称为 puppy,这表现为 Dog 的 Animal trait 实现中与 Animal trait 相关联的函数 baby_name。 在 main 调用了 Dog::baby_name 函数,它直接调用了定义于 Dog 之上的关联函数。这段代码会打印出: $ cargo run Compiling traits-example v0.1.0 (file:///projects/traits-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.54s Running `target/debug/traits-example`\nA baby dog is called a Spot 这并不是我们需要的。我们希望调用的是 Dog 上 Animal trait 实现那部分的 baby_name 函数,这样能够打印出 A baby dog is called a puppy。示例 19-18 中用到的技术在这并不管用;如果将 main 改为示例 19-20 中的代码,则会得到一个编译错误: 文件名:src/main.rs # trait Animal {\n# fn baby_name() -> String;\n# }\n# # struct Dog;\n# # impl Dog {\n# fn baby_name() -> String {\n# String::from(\"Spot\")\n# }\n# }\n# # impl Animal for Dog {\n# fn baby_name() -> String {\n# String::from(\"puppy\")\n# }\n# }\n# fn main() { println!(\"A baby dog is called a {}\", Animal::baby_name());\n} 示例 19-20: 尝试调用 Animal trait 的 baby_name 函数,不过 Rust 并不知道该使用哪一个实现 因为 Animal::baby_name 没有 self 参数,同时这可能会有其它类型实现了 Animal trait,Rust 无法计算出所需的是哪一个 Animal::baby_name 实现。我们会得到这个编译错误: $ cargo run Compiling traits-example v0.1.0 (file:///projects/traits-example)\nerror[E0790]: cannot call associated function on trait without specifying the corresponding `impl` type --> src/main.rs:20:43 |\n2 | fn baby_name() -> String; | ------------------------- `Animal::baby_name` defined here\n...\n20 | println!(\"A baby dog is called a {}\", Animal::baby_name()); | ^^^^^^^^^^^^^^^^^^^ cannot call associated function of trait |\nhelp: use the fully-qualified path to the only available implementation |\n20 | println!(\"A baby dog is called a {}\", <Dog as Animal>::baby_name()); | +++++++ + For more information about this error, try `rustc --explain E0790`.\nerror: could not compile `traits-example` (bin \"traits-example\") due to 1 previous error 为了消歧义并告诉 Rust 我们希望使用的是 Dog 的 Animal 实现而不是其它类型的 Animal 实现,需要使用 完全限定语法 ,这是调用函数时最为明确的方式。示例 19-21 展示了如何使用完全限定语法: 文件名:src/main.rs # trait Animal {\n# fn baby_name() -> String;\n# }\n# # struct Dog;\n# # impl Dog {\n# fn baby_name() -> String {\n# String::from(\"Spot\")\n# }\n# }\n# # impl Animal for Dog {\n# fn baby_name() -> String {\n# String::from(\"puppy\")\n# }\n# }\n# fn main() { println!(\"A baby dog is called a {}\", <Dog as Animal>::baby_name());\n} 示例 19-21: 使用完全限定语法来指定我们希望调用的是 Dog 上 Animal trait 实现中的 baby_name 函数 我们在尖括号中向 Rust 提供了类型注解,并通过在此函数调用中将 Dog 类型当作 Animal 对待,来指定希望调用的是 Dog 上 Animal trait 实现中的 baby_name 函数。现在这段代码会打印出我们期望的数据: $ cargo run Compiling traits-example v0.1.0 (file:///projects/traits-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s Running `target/debug/traits-example`\nA baby dog is called a puppy 通常,完全限定语法定义为: <Type as Trait>::function(receiver_if_method, next_arg, ...); 对于不是方法的关联函数,其没有一个 receiver,故只会有其他参数的列表。可以选择在任何函数或方法调用处使用完全限定语法。然而,允许省略任何 Rust 能够从程序中的其他信息中计算出的部分。只有当存在多个同名实现而 Rust 需要帮助以便知道我们希望调用哪个实现时,才需要使用这个较为冗长的语法。","breadcrumbs":"高级特征 » 高级 trait » 完全限定语法与消歧义:调用相同名称的方法","id":"376","title":"完全限定语法与消歧义:调用相同名称的方法"},"377":{"body":"有时我们可能会需要编写一个依赖另一个 trait 的 trait 定义:对于一个实现了第一个 trait 的类型,你希望要求这个类型也实现了第二个 trait。如此就可使 trait 定义使用第二个 trait 的关联项。这个所需的 trait 是我们实现的 trait 的 父(超)trait ( supertrait )。 例如我们希望创建一个带有 outline_print 方法的 trait OutlinePrint,它会将给定的值格式化为带有星号框。也就是说,给定一个实现了标准库 Display trait 的并返回 (x, y) 的 Point,当调用以 1 作为 x 和 3 作为 y 的 Point 实例的 outline_print 会显示如下: **********\n* *\n* (1, 3) *\n* *\n********** 在 outline_print 的实现中,因为希望能够使用 Display trait 的功能,则需要说明 OutlinePrint 只能用于同时也实现了 Display 并提供了 OutlinePrint 需要的功能的类型。可以通过在 trait 定义中指定 OutlinePrint: Display 来做到这一点。这类似于为 trait 增加 trait bound。示例 19-22 展示了一个 OutlinePrint trait 的实现: 文件名:src/main.rs use std::fmt; trait OutlinePrint: fmt::Display { fn outline_print(&self) { let output = self.to_string(); let len = output.len(); println!(\"{}\", \"*\".repeat(len + 4)); println!(\"*{}*\", \" \".repeat(len + 2)); println!(\"* {output} *\"); println!(\"*{}*\", \" \".repeat(len + 2)); println!(\"{}\", \"*\".repeat(len + 4)); }\n}\n# # fn main() {} 示例 19-22: 实现 OutlinePrint trait,它要求来自 Display 的功能 因为指定了 OutlinePrint 需要 Display trait,则可以在 outline_print 中使用 to_string,其会为任何实现 Display 的类型自动实现。如果不在 trait 名后增加 : Display 并尝试在 outline_print 中使用 to_string,则会得到一个错误说在当前作用域中没有找到用于 &Self 类型的方法 to_string。 让我们看看如果尝试在一个没有实现 Display 的类型上实现 OutlinePrint 会发生什么,比如 Point 结构体: 文件名:src/main.rs # use std::fmt;\n# # trait OutlinePrint: fmt::Display {\n# fn outline_print(&self) {\n# let output = self.to_string();\n# let len = output.len();\n# println!(\"{}\", \"*\".repeat(len + 4));\n# println!(\"*{}*\", \" \".repeat(len + 2));\n# println!(\"* {output} *\");\n# println!(\"*{}*\", \" \".repeat(len + 2));\n# println!(\"{}\", \"*\".repeat(len + 4));\n# }\n# }\n# struct Point { x: i32, y: i32,\n} impl OutlinePrint for Point {}\n# # fn main() {\n# let p = Point { x: 1, y: 3 };\n# p.outline_print();\n# } 这样会得到一个错误说 Display 是必须的而未被实现: $ cargo run Compiling traits-example v0.1.0 (file:///projects/traits-example)\nerror[E0277]: `Point` doesn't implement `std::fmt::Display` --> src/main.rs:20:23 |\n20 | impl OutlinePrint for Point {} | ^^^^^ `Point` cannot be formatted with the default formatter | = help: the trait `std::fmt::Display` is not implemented for `Point` = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead\nnote: required by a bound in `OutlinePrint` --> src/main.rs:3:21 |\n3 | trait OutlinePrint: fmt::Display { | ^^^^^^^^^^^^ required by this bound in `OutlinePrint` error[E0277]: `Point` doesn't implement `std::fmt::Display` --> src/main.rs:24:7 |\n24 | p.outline_print(); | ^^^^^^^^^^^^^ `Point` cannot be formatted with the default formatter | = help: the trait `std::fmt::Display` is not implemented for `Point` = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead\nnote: required by a bound in `OutlinePrint::outline_print` --> src/main.rs:3:21 |\n3 | trait OutlinePrint: fmt::Display { | ^^^^^^^^^^^^ required by this bound in `OutlinePrint::outline_print`\n4 | fn outline_print(&self) { | ------------- required by a bound in this associated function For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `traits-example` (bin \"traits-example\") due to 2 previous errors 一旦在 Point 上实现 Display 并满足 OutlinePrint 要求的限制,比如这样: 文件名:src/main.rs # trait OutlinePrint: fmt::Display {\n# fn outline_print(&self) {\n# let output = self.to_string();\n# let len = output.len();\n# println!(\"{}\", \"*\".repeat(len + 4));\n# println!(\"*{}*\", \" \".repeat(len + 2));\n# println!(\"* {output} *\");\n# println!(\"*{}*\", \" \".repeat(len + 2));\n# println!(\"{}\", \"*\".repeat(len + 4));\n# }\n# }\n# # struct Point {\n# x: i32,\n# y: i32,\n# }\n# # impl OutlinePrint for Point {}\n# use std::fmt; impl fmt::Display for Point { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, \"({}, {})\", self.x, self.y) }\n}\n# # fn main() {\n# let p = Point { x: 1, y: 3 };\n# p.outline_print();\n# } 那么在 Point 上实现 OutlinePrint trait 将能成功编译,并可以在 Point 实例上调用 outline_print 来显示位于星号框中的点的值。","breadcrumbs":"高级特征 » 高级 trait » 父 trait 用于在另一个 trait 中使用某 trait 的功能","id":"377","title":"父 trait 用于在另一个 trait 中使用某 trait 的功能"},"378":{"body":"在第十章的 “为类型实现 trait” 部分,我们提到了孤儿规则(orphan rule),它说明只要 trait 或类型对于当前 crate 是本地的话就可以在此类型上实现该 trait。一个绕开这个限制的方法是使用 newtype 模式 ( newtype pattern ),它涉及到在一个元组结构体(第五章 “用没有命名字段的元组结构体来创建不同的类型” 部分介绍了元组结构体)中创建一个新类型。这个元组结构体带有一个字段作为希望实现 trait 的类型的简单封装。接着这个封装类型对于 crate 是本地的,这样就可以在这个封装上实现 trait。 Newtype 是一个源自 Haskell 编程语言的概念。使用这个模式没有运行时性能惩罚,这个封装类型在编译时就被省略了。 例如,如果想要在 Vec<T> 上实现 Display,而孤儿规则阻止我们直接这么做,因为 Display trait 和 Vec<T> 都定义于我们的 crate 之外。可以创建一个包含 Vec<T> 实例的 Wrapper 结构体,接着可以如列表 19-23 那样在 Wrapper 上实现 Display 并使用 Vec<T> 的值: 文件名:src/main.rs use std::fmt; struct Wrapper(Vec<String>); impl fmt::Display for Wrapper { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, \"[{}]\", self.0.join(\", \")) }\n} fn main() { let w = Wrapper(vec![String::from(\"hello\"), String::from(\"world\")]); println!(\"w = {w}\");\n} 示例 19-23: 创建 Wrapper 类型封装 Vec<String> 以便能够实现 Display Display 的实现使用 self.0 来访问其内部的 Vec<T>,因为 Wrapper 是元组结构体而 Vec<T> 是结构体总位于索引 0 的项。接着就可以使用 Wrapper 中 Display 的功能了。 此方法的缺点是,因为 Wrapper 是一个新类型,它没有定义于其值之上的方法;必须直接在 Wrapper 上实现 Vec<T> 的所有方法,这样就可以代理到self.0 上 —— 这就允许我们完全像 Vec<T> 那样对待 Wrapper。如果希望新类型拥有其内部类型的每一个方法,为封装类型实现 Deref trait(第十五章 “通过 Deref trait 将智能指针当作常规引用处理” 部分讨论过)并返回其内部类型是一种解决方案。如果不希望封装类型拥有所有内部类型的方法 —— 比如为了限制封装类型的行为 —— 则必须只自行实现所需的方法。 甚至当不涉及 trait 时 newtype 模式也很有用。现在让我们将话题的焦点转移到一些与 Rust 类型系统交互的高级方法上来吧。","breadcrumbs":"高级特征 » 高级 trait » newtype 模式用以在外部类型上实现外部 trait","id":"378","title":"newtype 模式用以在外部类型上实现外部 trait"},"379":{"body":"ch20-04-advanced-types.md commit 95e931170404cb98d476b19017cbbdbc00d0834d Rust 的类型系统有一些我们曾经提到但没有讨论过的功能。首先我们从一个关于为什么 newtype 与类型一样有用的更宽泛的讨论开始。接着会转向类型别名(type aliases),一个类似于 newtype 但有着稍微不同的语义的功能。我们还会讨论 ! 类型和动态大小类型。 这一部分假设你已经阅读了之前的 “newtype 模式用于在外部类型上实现外部 trait” 部分。","breadcrumbs":"高级特征 » 高级类型 » 高级类型","id":"379","title":"高级类型"},"38":{"body":"让我们来测试下猜数字游戏的第一部分。使用 cargo run 运行: $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 6.44s Running `target/debug/guessing_game`\nGuess the number!\nPlease input your guess.\n6\nYou guessed: 6 至此为止,游戏的第一部分已经完成:我们从键盘获取输入并打印了出来。","breadcrumbs":"写个猜数字游戏 » 测试第一部分代码","id":"38","title":"测试第一部分代码"},"380":{"body":"newtype 模式也可以用于一些其他我们还未讨论的功能,包括静态的确保某值不被混淆,和用来表示一个值的单位。实际上示例 19-15 中已经有一个这样的例子:Millimeters 和 Meters 结构体都在 newtype 中封装了 u32 值。如果编写了一个有 Millimeters 类型参数的函数,不小心使用 Meters 或普通的 u32 值来调用该函数的程序是不能编译的。 newtype 模式也可以用于抽象掉一些类型的实现细节:例如,封装类型可以暴露出与直接使用其内部私有类型时所不同的公有 API。 newtype 也可以隐藏其内部的泛型类型。例如,可以提供一个封装了 HashMap<i32, String> 的 People 类型,用来储存人名以及相应的 ID。使用 People 的代码只需与提供的公有 API 交互即可,比如向 People 集合增加名字字符串的方法,这样这些代码就无需知道在内部我们将一个 i32 ID 赋予了这个名字了。newtype 模式是一种实现第十八章 “封装隐藏了实现细节” 部分所讨论的隐藏实现细节的封装的轻量级方法。","breadcrumbs":"高级特征 » 高级类型 » 为了类型安全和抽象而使用 newtype 模式","id":"380","title":"为了类型安全和抽象而使用 newtype 模式"},"381":{"body":"Rust 提供了声明 类型别名 ( type alias )的能力,使用 type 关键字来给予现有类型另一个名字。例如,可以像这样创建 i32 的别名 Kilometers: # fn main() { type Kilometers = i32;\n# # let x: i32 = 5;\n# let y: Kilometers = 5;\n# # println!(\"x + y = {}\", x + y);\n# } 这意味着 Kilometers 是 i32 的 同义词 ( synonym );不同于示例 19-15 中创建的 Millimeters 和 Meters 类型。Kilometers 不是一个新的、单独的类型。Kilometers 类型的值将被完全当作 i32 类型值来对待: # fn main() { type Kilometers = i32; let x: i32 = 5; let y: Kilometers = 5; println!(\"x + y = {}\", x + y);\n# } 因为 Kilometers 是 i32 的别名,它们是同一类型,可以将 i32 与 Kilometers 相加,也可以将 Kilometers 传递给获取 i32 参数的函数。但通过这种手段无法获得上一部分讨论的 newtype 模式所提供的类型检查的好处。换句话说,如果在哪里混用 Kilometers 和 i32 的值,编译器也不会给出一个错误。 类型别名的主要用途是减少重复。例如,可能会有这样很长的类型: Box<dyn Fn() + Send + 'static> 在函数签名或类型注解中每次都书写这个类型将是枯燥且易于出错的。想象一下如示例 19-24 这样全是如此代码的项目: # fn main() { let f: Box<dyn Fn() + Send + 'static> = Box::new(|| println!(\"hi\")); fn takes_long_type(f: Box<dyn Fn() + Send + 'static>) { // --snip-- } fn returns_long_type() -> Box<dyn Fn() + Send + 'static> { // --snip--\n# Box::new(|| ()) }\n# } 示例 19-24: 在很多地方使用名称很长的类型 类型别名通过减少项目中重复代码的数量来使其更加易于控制。这里我们为这个冗长的类型引入了一个叫做 Thunk 的别名,这样就可以如示例 19-25 所示将所有使用这个类型的地方替换为更短的 Thunk: # fn main() { type Thunk = Box<dyn Fn() + Send + 'static>; let f: Thunk = Box::new(|| println!(\"hi\")); fn takes_long_type(f: Thunk) { // --snip-- } fn returns_long_type() -> Thunk { // --snip--\n# Box::new(|| ()) }\n# } 示例 19-25: 引入类型别名 Thunk 来减少重复 这样读写起来就容易多了!为类型别名选择一个好名字也可以帮助你表达意图(单词 thunk 表示会在之后被计算的代码,所以这是一个存放闭包的合适的名字)。 类型别名也经常与 Result<T, E> 结合使用来减少重复。考虑一下标准库中的 std::io 模块。I/O 操作通常会返回一个 Result<T, E>,因为这些操作可能会失败。标准库中的 std::io::Error 结构体代表了所有可能的 I/O 错误。std::io 中大部分函数会返回 Result<T, E>,其中 E 是 std::io::Error,比如 Write trait 中的这些函数: use std::fmt;\nuse std::io::Error; pub trait Write { fn write(&mut self, buf: &[u8]) -> Result<usize, Error>; fn flush(&mut self) -> Result<(), Error>; fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>; fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Error>;\n} 这里出现了很多的 Result<..., Error>。为此,std::io 有这个类型别名声明: # use std::fmt;\n# type Result<T> = std::result::Result<T, std::io::Error>;\n# # pub trait Write {\n# fn write(&mut self, buf: &[u8]) -> Result<usize>;\n# fn flush(&mut self) -> Result<()>;\n# # fn write_all(&mut self, buf: &[u8]) -> Result<()>;\n# fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<()>;\n# } 因为这位于 std::io 中,可用的完全限定的别名是 std::io::Result<T>;也就是说,Result<T, E> 中 E 放入了 std::io::Error。Write trait 中的函数最终看起来像这样: # use std::fmt;\n# # type Result<T> = std::result::Result<T, std::io::Error>;\n# pub trait Write { fn write(&mut self, buf: &[u8]) -> Result<usize>; fn flush(&mut self) -> Result<()>; fn write_all(&mut self, buf: &[u8]) -> Result<()>; fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<()>;\n} 类型别名在两个方面有帮助:易于编写 并 在整个 std::io 中提供了一致的接口。因为这是一个别名,它只是另一个 Result<T, E>,这意味着可以在其上使用 Result<T, E> 的任何方法,以及像 ? 这样的特殊语法。","breadcrumbs":"高级特征 » 高级类型 » 类型别名用来创建类型同义词","id":"381","title":"类型别名用来创建类型同义词"},"382":{"body":"Rust 有一个叫做 ! 的特殊类型。在类型理论术语中,它被称为 empty type ,因为它没有值。我们更倾向于称之为 never type 。这个名字描述了它的作用:在函数从不返回的时候充当返回值。例如: fn bar() -> ! { // --snip--\n# panic!();\n} 这读 “函数 bar 从不返回”,而从不返回的函数被称为 发散函数 ( diverging functions )。不能创建 ! 类型的值,所以 bar 也不可能返回值。 不过一个不能创建值的类型有什么用呢?如果你回想一下示例 2-5 中的代码,曾经有一些看起来像这样的代码,如示例 19-26 所重现的: # use rand::Rng;\n# use std::cmp::Ordering;\n# use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # loop {\n# println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # // --snip--\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, };\n# # println!(\"You guessed: {guess}\");\n# # // --snip--\n# # match guess.cmp(&secret_number) {\n# Ordering::Less => println!(\"Too small!\"),\n# Ordering::Greater => println!(\"Too big!\"),\n# Ordering::Equal => {\n# println!(\"You win!\");\n# break;\n# }\n# }\n# }\n# } 示例 19-26: match 语句和一个以 continue 结束的分支 当时我们忽略了代码中的一些细节。在第六章 “match 控制流运算符” 部分,我们学习了 match 的分支必须返回相同的类型。如下代码不能工作: # fn main() {\n# let guess = \"3\"; let guess = match guess.trim().parse() { Ok(_) => 5, Err(_) => \"hello\", };\n# } 这里的 guess 必须既是整型 也是 字符串,而 Rust 要求 guess 只能是一个类型。那么 continue 返回了什么呢?为什么示例 19-26 中会允许一个分支返回 u32 而另一个分支却以 continue 结束呢? 正如你可能猜到的,continue 的值是 !。也就是说,当 Rust 要计算 guess 的类型时,它查看这两个分支。前者是 u32 值,而后者是 ! 值。因为 ! 并没有一个值,Rust 决定 guess 的类型是 u32。 描述 ! 的行为的正式方式是 never type 可以强转为任何其他类型。允许 match 的分支以 continue 结束是因为 continue 并不真正返回一个值;相反它把控制权交回上层循环,所以在 Err 的情况,事实上并未对 guess 赋值。 never type 的另一个用途是 panic!。还记得 Option<T> 上的 unwrap 函数吗?它产生一个值或 panic。这里是它的定义: # enum Option<T> {\n# Some(T),\n# None,\n# }\n# # use crate::Option::*;\n# impl<T> Option<T> { pub fn unwrap(self) -> T { match self { Some(val) => val, None => panic!(\"called `Option::unwrap()` on a `None` value\"), } }\n} 这里与示例 19-34 中的 match 发生了相同的情况:Rust 知道 val 是 T 类型,panic! 是 ! 类型,所以整个 match 表达式的结果是 T 类型。这能工作是因为 panic! 并不产生一个值;它会终止程序。对于 None 的情况,unwrap 并不返回一个值,所以这些代码是有效的。 最后一个有着 ! 类型的表达式是 loop: # fn main() { print!(\"forever \"); loop { print!(\"and ever \"); }\n# } 这里,循环永远也不结束,所以此表达式的值是 !。但是如果引入 break 这就不为真了,因为循环在执行到 break 后就会终止。","breadcrumbs":"高级特征 » 高级类型 » 从不返回的 never type","id":"382","title":"从不返回的 never type"},"383":{"body":"Rust 需要知道有关类型的某些细节,例如为特定类型的值需要分配多少空间。这便是起初留下的一个类型系统中令人迷惑的角落:即 动态大小类型 ( dynamically sized types )。这有时被称为 “DST” 或 “unsized types”,这些类型允许我们处理只有在运行时才知道大小的类型。 让我们深入研究一个贯穿本书都在使用的动态大小类型的细节:str。没错,不是 &str,而是 str 本身。str 是一个 DST;直到运行时我们都不知道字符串有多长。因为直到运行时都不能知道其大小,也就意味着不能创建 str 类型的变量,也不能获取 str 类型的参数。考虑一下这些代码,它们不能工作: # fn main() { let s1: str = \"Hello there!\"; let s2: str = \"How's it going?\";\n# } Rust 需要知道应该为特定类型的值分配多少内存,同时所有同一类型的值必须使用相同数量的内存。如果允许编写这样的代码,也就意味着这两个 str 需要占用完全相同大小的空间,不过它们有着不同的长度。这也就是为什么不可能创建一个存放动态大小类型的变量的原因。 那么该怎么办呢?你已经知道了这种问题的答案:s1 和 s2 的类型是 &str 而不是 str。如果你回想第四章 “字符串 slice” 部分,slice 数据结构仅仅储存了开始位置和 slice 的长度。所以虽然 &T 是一个储存了 T 所在的内存位置的单个值,&str 则是 两个 值:str 的地址和其长度。这样,&str 就有了一个在编译时可以知道的大小:它是 usize 长度的两倍。也就是说,我们总是知道 &str 的大小,而无论其引用的字符串是多长。这里是 Rust 中动态大小类型的常规用法:它们有一些额外的元信息来储存动态信息的大小。这引出了动态大小类型的黄金规则:必须将动态大小类型的值置于某种指针之后。 可以将 str 与所有类型的指针结合:比如 Box<str> 或 Rc<str>。事实上,之前我们已经见过了,不过是另一个动态大小类型:trait。每一个 trait 都是一个可以通过 trait 名称来引用的动态大小类型。在第十八章 顾及不同类型值的 trait 对象” 部分,我们提到了为了将 trait 用于 trait 对象,必须将它们放入指针之后,比如 &dyn Trait 或 Box<dyn Trait>(Rc<dyn Trait> 也可以)。 为了处理 DST,Rust 提供了 Sized trait 来决定一个类型的大小是否在编译时可知。这个 trait 自动为编译器在编译时就知道大小的类型实现。另外,Rust 隐式的为每一个泛型函数增加了 Sized bound。也就是说,对于如下泛型函数定义: fn generic<T>(t: T) { // --snip--\n} 实际上被当作如下处理: fn generic<T: Sized>(t: T) { // --snip--\n} 泛型函数默认只能用于在编译时已知大小的类型。然而可以使用如下特殊语法来放宽这个限制: fn generic<T: ?Sized>(t: &T) { // --snip--\n} ?Sized 上的 trait bound 意味着 “T 可能是也可能不是 Sized” 同时这个注解会覆盖泛型类型必须在编译时拥有固定大小的默认规则。这种意义的 ?Trait 语法只能用于 Sized ,而不能用于任何其他 trait。 另外注意我们将 t 参数的类型从 T 变为了 &T:因为其类型可能不是 Sized 的,所以需要将其置于某种指针之后。在这个例子中选择了引用。 接下来,让我们讨论一下函数和闭包!","breadcrumbs":"高级特征 » 高级类型 » 动态大小类型和 Sized trait","id":"383","title":"动态大小类型和 Sized trait"},"384":{"body":"ch20-05-advanced-functions-and-closures.md commit 21cf840842bdf768a798869f06373c96c1cc5122 本部分将探索一些有关函数和闭包的高级功能,这包括函数指针以及返回值闭包。","breadcrumbs":"高级特征 » 高级函数与闭包 » 高级函数与闭包","id":"384","title":"高级函数与闭包"},"385":{"body":"我们讨论过了如何向函数传递闭包;也可以向函数传递常规函数!这个技术在我们希望传递已经定义的函数而不是重新定义闭包作为参数时很有用。函数满足类型 fn(小写的 f),不要与闭包 trait 的 Fn 相混淆。fn 被称为 函数指针 ( function pointer )。通过函数指针允许我们使用函数作为另一个函数的参数。 指定参数为函数指针的语法类似于闭包,如示例 19-27 所示,这里定义了一个 add_one 函数将其参数加一。do_twice 函数获取两个参数:一个指向任何获取一个 i32 参数并返回一个 i32 的函数指针,和一个 i32 值。do_twice 函数传递 arg 参数调用 f 函数两次,接着将两次函数调用的结果相加。main 函数使用 add_one 和 5 作为参数调用 do_twice。 文件名:src/main.rs fn add_one(x: i32) -> i32 { x + 1\n} fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 { f(arg) + f(arg)\n} fn main() { let answer = do_twice(add_one, 5); println!(\"The answer is: {answer}\");\n} 示例 19-27: 使用 fn 类型接受函数指针作为参数 这会打印出 The answer is: 12。do_twice 中的 f 被指定为一个接受一个 i32 参数并返回 i32 的 fn。接着就可以在 do_twice 函数体中调用 f。在 main 中,可以将函数名 add_one 作为第一个参数传递给 do_twice。 不同于闭包,fn 是一个类型而不是一个 trait,所以直接指定 fn 作为参数而不是声明一个带有 Fn 作为 trait bound 的泛型参数。 函数指针实现了所有三个闭包 trait(Fn、FnMut 和 FnOnce),所以总是可以在调用期望闭包的函数时传递函数指针作为参数。倾向于编写使用泛型和闭包 trait 的函数,这样它就能接受函数或闭包作为参数。 一个只期望接受 fn 而不接受闭包的情况的例子是与不存在闭包的外部代码交互时:C 语言的函数可以接受函数作为参数,但 C 语言没有闭包。 作为一个既可以使用内联定义的闭包又可以使用命名函数的例子,让我们看看一个 map 的应用。使用 map 函数将一个数字 vector 转换为一个字符串 vector,就可以使用闭包,比如这样: # fn main() { let list_of_numbers = vec![1, 2, 3]; let list_of_strings: Vec<String> = list_of_numbers.iter().map(|i| i.to_string()).collect();\n# } 或者可以将函数作为 map 的参数来代替闭包,像是这样: # fn main() { let list_of_numbers = vec![1, 2, 3]; let list_of_strings: Vec<String> = list_of_numbers.iter().map(ToString::to_string).collect();\n# } 注意这里必须使用 “高级 trait” 部分讲到的完全限定语法,因为存在多个叫做 to_string 的函数;这里使用了定义于 ToString trait 的 to_string 函数,标准库为所有实现了 Display 的类型实现了这个 trait。 回忆一下第六章 “枚举值” 部分中定义的每一个枚举成员也变成了一个构造函数。我们可以使用这些构造函数作为实现了闭包 trait 的函数指针,这意味着可以指定构造函数作为接受闭包的方法的参数,如下: # fn main() { enum Status { Value(u32), Stop, } let list_of_statuses: Vec<Status> = (0u32..20).map(Status::Value).collect();\n# } 这里创建了 Status::Value 实例,它通过 map 用范围的每一个 u32 值调用 Status::Value 的初始化函数。一些人倾向于函数风格,一些人喜欢闭包。这两种形式最终都会产生同样的代码,所以请使用对你来说更明白的形式吧。","breadcrumbs":"高级特征 » 高级函数与闭包 » 函数指针","id":"385","title":"函数指针"},"386":{"body":"闭包表现为 trait,这意味着不能直接返回闭包。对于大部分需要返回 trait 的情况,可以使用实现了期望返回的 trait 的具体类型来替代函数的返回值。但是这不能用于闭包,因为它们没有一个可返回的具体类型;例如不允许使用函数指针 fn 作为返回值类型。 这段代码尝试直接返回闭包,它并不能编译: fn returns_closure() -> dyn Fn(i32) -> i32 { |x| x + 1\n} 编译器给出的错误是: $ cargo build Compiling functions-example v0.1.0 (file:///projects/functions-example)\nerror[E0746]: return type cannot have an unboxed trait object --> src/lib.rs:1:25 |\n1 | fn returns_closure() -> dyn Fn(i32) -> i32 { | ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time |\nhelp: consider returning an `impl Trait` instead of a `dyn Trait` |\n1 | fn returns_closure() -> impl Fn(i32) -> i32 { | ~~~~\nhelp: alternatively, box the return type, and wrap all of the returned values in `Box::new` |\n1 ~ fn returns_closure() -> Box<dyn Fn(i32) -> i32> {\n2 ~ Box::new(|x| x + 1) | For more information about this error, try `rustc --explain E0746`.\nerror: could not compile `functions-example` (lib) due to 1 previous error 错误又一次指向了 Sized trait!Rust 并不知道需要多少空间来储存闭包。不过我们在上一部分见过这种情况的解决办法:可以使用 trait 对象: fn returns_closure() -> Box<dyn Fn(i32) -> i32> { Box::new(|x| x + 1)\n} 这段代码正好可以编译。关于 trait 对象的更多内容,请回顾第十八章的 顾及不同类型值的 trait 对象” 部分。 接下来让我们学习宏!","breadcrumbs":"高级特征 » 高级函数与闭包 » 返回闭包","id":"386","title":"返回闭包"},"387":{"body":"ch20-06-macros.md commit 95e931170404cb98d476b19017cbbdbc00d0834d 我们已经在本书中使用过像 println! 这样的宏了,不过还没完全探索什么是宏以及它是如何工作的。 宏 ( Macro )指的是 Rust 中一系列的功能:使用 macro_rules! 的 声明 ( Declarative )宏,和三种 过程 ( Procedural )宏: 自定义 #[derive] 宏在结构体和枚举上指定通过 derive 属性添加的代码 类属性(Attribute-like)宏定义可用于任意项的自定义属性 类函数宏看起来像函数不过作用于作为参数传递的 token 我们会依次讨论每一种宏,不过首要的是,为什么已经有了函数还需要宏呢?","breadcrumbs":"高级特征 » 宏 » 宏","id":"387","title":"宏"},"388":{"body":"从根本上来说,宏是一种为写其他代码而写代码的方式,即所谓的 元编程 ( metaprogramming )。在附录 C 中会探讨 derive 属性,其生成各种 trait 的实现。我们也在本书中使用过 println! 宏和 vec! 宏。所有的这些宏以 展开 的方式来生成比你所手写出的更多的代码。 元编程对于减少大量编写和维护的代码是非常有用的,它也扮演了函数扮演的角色。但宏有一些函数所没有的附加能力。 一个函数签名必须声明函数参数个数和类型。相比之下,宏能够接收不同数量的参数:用一个参数调用 println!(\"hello\") 或用两个参数调用 println!(\"hello {}\", name) 。而且,宏可以在编译器翻译代码前展开,例如,宏可以在一个给定类型上实现 trait。而函数则不行,因为函数是在运行时被调用,同时 trait 需要在编译时实现。 实现宏不如实现函数的一面是宏定义要比函数定义更复杂,因为你正在编写生成 Rust 代码的 Rust 代码。由于这样的间接性,宏定义通常要比函数定义更难阅读、理解以及维护。 宏和函数的最后一个重要的区别是:在一个文件里调用宏 之前 必须定义它,或将其引入作用域,而函数则可以在任何地方定义和调用。","breadcrumbs":"高级特征 » 宏 » 宏和函数的区别","id":"388","title":"宏和函数的区别"},"389":{"body":"Rust 最常用的宏形式是 声明宏 ( declarative macros )。它们有时也被称为 “macros by example”、“macro_rules! 宏” 或者就是 “macros”。其核心概念是,声明宏允许我们编写一些类似 Rust match 表达式的代码。正如在第六章讨论的那样,match 表达式是控制结构,其接收一个表达式,与表达式的结果进行模式匹配,然后根据模式匹配执行相关代码。宏也将一个值和包含相关代码的模式进行比较;此种情况下,该值是传递给宏的 Rust 源代码字面值,模式用于和前面提到的源代码字面值进行比较,每个模式的相关代码会替换传递给宏的代码。所有这一切都发生于编译时。 可以使用 macro_rules! 来定义宏。让我们通过查看 vec! 宏定义来探索如何使用 macro_rules! 结构。第八章讲述了如何使用 vec! 宏来生成一个给定值的 vector。例如,下面的宏用三个整数创建一个 vector: let v: Vec<u32> = vec![1, 2, 3]; 也可以使用 vec! 宏来构造两个整数的 vector 或五个字符串 slice 的 vector。但却无法使用函数做相同的事情,因为我们无法预先知道参数值的数量和类型。 在示例 19-28 中展示了一个 vec! 稍微简化的定义。 文件名:src/lib.rs #[macro_export]\nmacro_rules! vec { ( $( $x:expr ),* ) => { { let mut temp_vec = Vec::new(); $( temp_vec.push($x); )* temp_vec } };\n} 示例 19-28: 一个 vec! 宏定义的简化版本 注意:标准库中实际定义的 vec! 包括预分配适当量的内存的代码。这部分为代码优化,为了让示例简化,此处并没有包含在内。 #[macro_export] 注解表明只要导入了定义这个宏的 crate,该宏就应该是可用的。如果没有该注解,这个宏不能被引入作用域。 接着使用 macro_rules! 和宏名称开始宏定义,且所定义的宏并 不带 感叹号。名字后跟大括号表示宏定义体,在该例中宏名称是 vec 。 vec! 宏的结构和 match 表达式的结构类似。此处有一个分支模式 ( $( $x:expr ),* ) ,后跟 => 以及和模式相关的代码块。如果模式匹配,该相关代码块将被执行。这里这个宏只有一个模式,那就只有一个有效匹配方向,其他任何模式方向(译者注:不匹配这个模式)都会导致错误。更复杂的宏会有多个分支模式。 宏定义中有效模式语法和在第十九章提及的模式语法是不同的,因为宏模式所匹配的是 Rust 代码结构而不是值。回过头来检查下示例 19-28 中模式片段什么意思。对于全部的宏模式语法,请查阅 Rust 参考 。 首先,一对括号包含了整个模式。我们使用美元符号($)在宏系统中声明一个变量来包含匹配该模式的 Rust 代码。美元符号明确表明这是一个宏变量而不是普通 Rust 变量。之后是一对括号,其捕获了符合括号内模式的值用以在替代代码中使用。$() 内则是 $x:expr ,其匹配 Rust 的任意表达式,并将该表达式命名为 $x。 $() 之后的逗号说明一个可有可无的逗号分隔符可以出现在 $() 所匹配的代码之后。紧随逗号之后的 * 说明该模式匹配零个或更多个 * 之前的任何模式。 当以 vec![1, 2, 3]; 调用宏时,$x 模式与三个表达式 1、2 和 3 进行了三次匹配。 现在让我们来看看与此分支模式相关联的代码块中的模式:匹配到模式中的$()的每一部分,都会在(=>右侧)$()* 里生成temp_vec.push($x),生成零次还是多次取决于模式匹配到多少次。$x 由每个与之相匹配的表达式所替换。当以 vec![1, 2, 3]; 调用该宏时,替换该宏调用所生成的代码会是下面这样: { let mut temp_vec = Vec::new(); temp_vec.push(1); temp_vec.push(2); temp_vec.push(3); temp_vec\n} 我们已经定义了一个宏,其可以接收任意数量和类型的参数,同时可以生成能够创建包含指定元素的 vector 的代码。 请查阅在线文档或其他资源,如 “The Little Book of Rust Macros” 来更多地了解如何写宏,该书由 Daniel Keep 开始编写并由 Lukas Wirth 继续维护。","breadcrumbs":"高级特征 » 宏 » 使用 macro_rules! 的声明宏用于通用元编程","id":"389","title":"使用 macro_rules! 的声明宏用于通用元编程"},"39":{"body":"接下来,需要生成一个秘密数字,好让用户来猜。秘密数字应该每次都不同,这样重复玩才不会乏味;范围应该在 1 到 100 之间,这样才不会太困难。Rust 标准库中尚未包含随机数功能。然而,Rust 团队还是提供了一个包含上述功能的 rand crate 。","breadcrumbs":"写个猜数字游戏 » 生成一个秘密数字","id":"39","title":"生成一个秘密数字"},"390":{"body":"第二种形式的宏被称为 过程宏 ( procedural macros ),因为它们更像函数(一种过程类型)。过程宏接收 Rust 代码作为输入,在这些代码上进行操作,然后产生另一些代码作为输出,而非像声明式宏那样匹配对应模式然后以另一部分代码替换当前代码。有三种类型的过程宏(自定义派生(derive),类属性和类函数),不过它们的工作方式都类似。 创建过程宏时,其定义必须驻留在它们自己的具有特殊 crate 类型的 crate 中。这么做出于复杂的技术原因,将来我们希望能够消除这些限制。在示例 19-29 中展示了如何定义过程宏,其中 some_attribute 是一个使用特定宏变体的占位符。 文件名:src/lib.rs use proc_macro; #[some_attribute]\npub fn some_name(input: TokenStream) -> TokenStream {\n} 示例 19-29: 一个定义过程宏的例子 定义过程宏的函数接收一个 TokenStream 作为输入并生成 TokenStream 作为输出。TokenStream 是定义于proc_macro crate 里代表一系列 token 的类型,Rust 默认携带了proc_macro crate。这就是宏的核心:宏所处理的源代码组成了输入 TokenStream,宏生成的代码是输出 TokenStream。函数上还有一个属性;这个属性指明了我们创建的过程宏的类型。在同一 crate 中可以有多种的过程宏。 让我们看看不同种类的程序宏。我们将从一个自定义的派生宏开始,然后解释使其他形式不同的小差异。","breadcrumbs":"高级特征 » 宏 » 用于从属性生成代码的过程宏","id":"390","title":"用于从属性生成代码的过程宏"},"391":{"body":"让我们创建一个 hello_macro crate,其包含名为 HelloMacro 的 trait 和关联函数 hello_macro。不同于让用户为其每一个类型实现 HelloMacro trait,我们将会提供一个过程式宏以便用户可以使用 #[derive(HelloMacro)] 注解它们的类型来得到 hello_macro 函数的默认实现。该默认实现会打印 Hello, Macro! My name is TypeName!,其中 TypeName 为定义了 trait 的类型名。换言之,我们会创建一个 crate,使程序员能够写类似示例 19-30 中的代码。 文件名:src/main.rs use hello_macro::HelloMacro;\nuse hello_macro_derive::HelloMacro; #[derive(HelloMacro)]\nstruct Pancakes; fn main() { Pancakes::hello_macro();\n} 示例 19-30: crate 用户所写的能够使用过程式宏的代码 运行该代码将会打印 Hello, Macro! My name is Pancakes! 第一步是像下面这样新建一个库 crate: $ cargo new hello_macro --lib 接下来,会定义 HelloMacro trait 以及其关联函数: 文件名:src/lib.rs pub trait HelloMacro { fn hello_macro();\n} 现在有了一个包含函数的 trait。此时,crate 用户可以实现该 trait 以达到其期望的功能,像这样: use hello_macro::HelloMacro; struct Pancakes; impl HelloMacro for Pancakes { fn hello_macro() { println!(\"Hello, Macro! My name is Pancakes!\"); }\n} fn main() { Pancakes::hello_macro();\n} 然而,他们需要为每一个他们想使用 hello_macro 的类型编写实现的代码块。我们希望为其节约这些工作。 另外,我们也无法为 hello_macro 函数提供一个能够打印实现了该 trait 的类型的名字的默认实现:Rust 没有反射的能力,因此其无法在运行时获取类型名。我们需要一个在编译时生成代码的宏。 下一步是定义过程式宏。在编写本部分时,过程式宏必须在其自己的 crate 内。该限制最终可能被取消。构造 crate 和其中宏的惯例如下:对于一个 foo 的包来说,一个自定义的派生过程宏的包被称为 foo_derive 。在 hello_macro 项目中新建名为 hello_macro_derive 的包。 $ cargo new hello_macro_derive --lib 由于两个 crate 紧密相关,因此在 hello_macro 包的目录下创建过程式宏的 crate。如果改变在 hello_macro 中定义的 trait,同时也必须改变在 hello_macro_derive 中实现的过程式宏。这两个包需要分别发布,编程人员如果使用这些包,则需要同时添加这两个依赖并将其引入作用域。我们也可以只用 hello_macro 包而将 hello_macro_derive 作为一个依赖,并重新导出过程式宏的代码。但现在我们组织项目的方式使编程人员在无需 derive 功能时也能够单独使用 hello_macro。 我们需要声明 hello_macro_derive crate 是过程宏 (proc-macro) crate。我们还需要 syn 和 quote crate 中的功能,正如你即将看到的,需要将它们加到依赖中。将下面的代码加入到 hello_macro_derive 的 Cargo.toml 文件中。 文件名:hello_macro_derive/Cargo.toml [lib]\nproc-macro = true [dependencies]\nsyn = \"2.0\"\nquote = \"1.0\" 为定义一个过程式宏,请将示例 19-31 中的代码放在 hello_macro_derive crate 的 src/lib.rs 文件里面。注意这段代码在我们添加 impl_hello_macro 函数的定义之前是无法编译的。 文件名:hello_macro_derive/src/lib.rs use proc_macro::TokenStream;\nuse quote::quote; #[proc_macro_derive(HelloMacro)]\npub fn hello_macro_derive(input: TokenStream) -> TokenStream { // Construct a representation of Rust code as a syntax tree // that we can manipulate let ast = syn::parse(input).unwrap(); // Build the trait implementation impl_hello_macro(&ast)\n} 示例 19-31: 大多数过程式宏处理 Rust 代码时所需的代码 注意我们将代码分成了hello_macro_derive 和 impl_hello_macro 两个函数,前者负责解析 TokenStream,后者负责转换语法树:这使得编写过程宏更方便。几乎你看到或者创建的每一个过程宏的外部函数(这里是hello_macro_derive)中的代码都跟这里是一样的。你放入内部函数(这里是impl_hello_macro)中的代码根据你的过程宏的设计目的会有所不同。 现在,我们已经引入了三个新的 crate:proc_macro 、 syn 和 quote 。Rust 自带 proc_macro crate,因此无需将其加到 Cargo.toml 文件的依赖中。proc_macro crate 是编译器用来读取和操作我们 Rust 代码的 API。 syn crate 将字符串中的 Rust 代码解析成为一个可以操作的数据结构。quote 则将 syn 解析的数据结构转换回 Rust 代码。这些 crate 让解析任何我们所要处理的 Rust 代码变得更简单:为 Rust 编写整个的解析器并不是一件简单的工作。 当用户在一个类型上指定 #[derive(HelloMacro)] 时,hello_macro_derive 函数将会被调用。因为我们已经使用 proc_macro_derive 及其指定名称HelloMacro对 hello_macro_derive 函数进行了注解,指定名称HelloMacro就是 trait 名,这是大多数过程宏遵循的习惯。 该函数首先将来自 TokenStream 的 input 转换为一个我们可以解释和操作的数据结构。这正是 syn 派上用场的地方。syn 中的 parse 函数获取一个 TokenStream 并返回一个表示解析出 Rust 代码的 DeriveInput 结构体。示例 19-32 展示了从字符串 struct Pancakes; 中解析出来的 DeriveInput 结构体的相关部分: DeriveInput { // --snip-- ident: Ident { ident: \"Pancakes\", span: #0 bytes(95..103) }, data: Struct( DataStruct { struct_token: Struct, fields: Unit, semi_token: Some( Semi ) } )\n} 示例 19-32: 解析示例 19-30 中带有宏属性的代码时得到的 DeriveInput 实例 该结构体的字段展示了我们解析的 Rust 代码是一个类单元结构体,其 ident(identifier,表示名字)为 Pancakes。该结构体里面有更多字段描述了所有类型的 Rust 代码,查阅 syn 中 DeriveInput 的文档 以获取更多信息。 很快我们将定义 impl_hello_macro 函数,其用于构建所要包含在内的 Rust 新代码。但在此之前,注意其输出也是 TokenStream。所返回的 TokenStream 会被加到我们的 crate 用户所写的代码中,因此,当用户编译他们的 crate 时,他们会通过修改后的 TokenStream 获取到我们所提供的额外功能。 你可能也注意到了,当调用 syn::parse 函数失败时,我们用 unwrap 来使 hello_macro_derive 函数 panic。在错误时 panic 对过程宏来说是必须的,因为 proc_macro_derive 函数必须返回 TokenStream 而不是 Result,以此来符合过程宏的 API。这里选择用 unwrap 来简化了这个例子;在生产代码中,则应该通过 panic! 或 expect 来提供关于发生何种错误的更加明确的错误信息。 现在我们有了将注解的 Rust 代码从 TokenStream 转换为 DeriveInput 实例的代码,让我们来创建在注解类型上实现 HelloMacro trait 的代码,如示例 19-33 所示。 文件名:hello_macro_derive/src/lib.rs # use proc_macro::TokenStream;\n# use quote::quote;\n# # #[proc_macro_derive(HelloMacro)]\n# pub fn hello_macro_derive(input: TokenStream) -> TokenStream {\n# // Construct a representation of Rust code as a syntax tree\n# // that we can manipulate\n# let ast = syn::parse(input).unwrap();\n# # // Build the trait implementation\n# impl_hello_macro(&ast)\n# }\n# fn impl_hello_macro(ast: &syn::DeriveInput) -> TokenStream { let name = &ast.ident; let gen = quote! { impl HelloMacro for #name { fn hello_macro() { println!(\"Hello, Macro! My name is {}!\", stringify!(#name)); } } }; gen.into()\n} 示例 19-33: 使用解析过的 Rust 代码实现 HelloMacro trait 我们得到一个包含以 ast.ident 作为注解类型名字(标识符)的 Ident 结构体实例。示例 19-32 中的结构体表明当 impl_hello_macro 函数运行于示例 19-30 中的代码上时 ident 字段的值是 \"Pancakes\"。因此,示例 19-33 中 name 变量会包含一个 Ident 结构体的实例,当打印时,会是字符串 \"Pancakes\",也就是示例 19-30 中结构体的名称。 quote! 宏能让我们编写希望返回的 Rust 代码。quote! 宏执行的直接结果并不是编译器所期望的所以需要转换为 TokenStream。为此需要调用 into 方法,它会消费这个中间表示(intermediate representation,IR)并返回所需的 TokenStream 类型值。 这个宏也提供了一些非常酷的模板机制;我们可以写 #name ,然后 quote! 会以名为 name 的变量值来替换它。你甚至可以做一些类似常用宏那样的重复代码的工作。查阅 quote crate 的文档 来获取详尽的介绍。 我们期望我们的过程式宏能够为通过 #name 获取到的用户注解类型生成 HelloMacro trait 的实现。该 trait 的实现有一个函数 hello_macro ,其函数体包括了我们期望提供的功能:打印 Hello, Macro! My name is 和注解的类型名。 此处所使用的 stringify! 为 Rust 内置宏。其接收一个 Rust 表达式,如 1 + 2 ,然后在编译时将表达式转换为一个字符串常量,如 \"1 + 2\" 。这与 format! 或 println! 是不同的,它计算表达式并将结果转换为 String 。有一种可能的情况是,所输入的 #name 可能是一个需要打印的表达式,因此我们用 stringify! 。stringify! 也能通过在编译时将 #name 转换为字符串来节省内存分配。 此时,cargo build 应该都能成功编译 hello_macro 和 hello_macro_derive 。我们将这些 crate 连接到示例 19-30 的代码中来看看过程宏的行为!在 projects 目录下用 cargo new pancakes 命令新建一个二进制项目。需要将 hello_macro 和 hello_macro_derive 作为依赖加到 pancakes 包的 Cargo.toml 文件中去。如果你正将 hello_macro 和 hello_macro_derive 的版本发布到 crates.io 上,其应为常规依赖;如果不是,则可以像下面这样将其指定为 path 依赖: hello_macro = { path = \"../hello_macro\" }\nhello_macro_derive = { path = \"../hello_macro/hello_macro_derive\" } 把示例 19-30 中的代码放在 src/main.rs ,然后执行 cargo run:其应该打印 Hello, Macro! My name is Pancakes!。其包含了该过程宏中 HelloMacro trait 的实现,而无需 pancakes crate 实现它;#[derive(HelloMacro)] 增加了该 trait 实现。 接下来,让我们探索一下其他类型的过程宏与自定义派生宏有何区别。","breadcrumbs":"高级特征 » 宏 » 如何编写自定义 derive 宏","id":"391","title":"如何编写自定义 derive 宏"},"392":{"body":"类属性宏与自定义派生宏相似,不同的是 derive 属性生成代码,它们(类属性宏)能让你创建新的属性。它们也更为灵活;derive 只能用于结构体和枚举;属性还可以用于其它的项,比如函数。作为一个使用类属性宏的例子,可以创建一个名为 route 的属性用于注解 web 应用程序框架(web application framework)的函数: #[route(GET, \"/\")]\nfn index() { #[route] 属性将由框架本身定义为一个过程宏。其宏定义的函数签名看起来像这样: #[proc_macro_attribute]\npub fn route(attr: TokenStream, item: TokenStream) -> TokenStream { 这里有两个 TokenStream 类型的参数;第一个用于属性内容本身,也就是 GET, \"/\" 部分。第二个是属性所标记的项:在本例中,是 fn index() {} 和剩下的函数体。 除此之外,类属性宏与自定义派生宏工作方式一致:创建 proc-macro crate 类型的 crate 并实现希望生成代码的函数!","breadcrumbs":"高级特征 » 宏 » 类属性宏","id":"392","title":"类属性宏"},"393":{"body":"类函数(Function-like)宏的定义看起来像函数调用的宏。类似于 macro_rules!,它们比函数更灵活;例如,可以接受未知数量的参数。然而 macro_rules! 宏只能使用之前 “使用 macro_rules! 的声明宏用于通用元编程” 介绍的类匹配的语法定义。类函数宏获取 TokenStream 参数,其定义使用 Rust 代码操纵 TokenStream,就像另两种过程宏一样。一个类函数宏例子是可以像这样被调用的 sql! 宏: let sql = sql!(SELECT * FROM posts WHERE id=1); 这个宏会解析其中的 SQL 语句并检查其是否是句法正确的,这是比 macro_rules! 可以做到的更为复杂的处理。sql! 宏应该被定义为如此: #[proc_macro]\npub fn sql(input: TokenStream) -> TokenStream { 这类似于自定义派生宏的签名:获取括号中的 token,并返回希望生成的代码。","breadcrumbs":"高级特征 » 宏 » 类函数宏","id":"393","title":"类函数宏"},"394":{"body":"好的!现在我们学习了 Rust 并不常用但在特定情况下你可能用得着的功能。我们介绍了很多复杂的主题,这样若你在错误信息提示或阅读他人代码时遇到它们,至少可以说之前已经见过这些概念和语法了。你可以使用本章作为一个解决方案的参考。 接下来,我们将再开始一个项目,将本书所学的所有内容付与实践!","breadcrumbs":"高级特征 » 宏 » 总结","id":"394","title":"总结"},"395":{"body":"ch21-00-final-project-a-web-server.md commit 5df6909c57b3ba55f156a4122a42b805436de90c 这是一次漫长的旅途,不过我们到达了本书的结束。在本章中,我们将一同构建另一个项目,来展示最后几章所学,同时复习更早的章节。 作为最后的项目,我们将要实现一个返回 “hello” 的 web server,它在浏览器中看起来就如图例 20-1 所示: hello from rust 图例 20-1: 我们最后将一起分享的项目 如下是构建 web server 的计划: 学习一些 TCP 与 HTTP 知识 在套接字(socket)上监听 TCP 请求 解析少量的 HTTP 请求 创建一个合适的 HTTP 响应 通过线程池改善 server 的吞吐量 不过在开始之前,需要提到一点细节:这里使用的方法并不是使用 Rust 构建 web server 最好的方法。 crates.io 上有很多可用于生产环境的 crate,它们提供了比我们所要编写的更为完整的 web server 和线程池实现。然而,本章的目的在于学习,而不是走捷径。因为 Rust 是一个系统编程语言,我们能够选择处理什么层次的抽象,并能够选择比其他语言可能或可用的层次更低的层次。因此我们将自己编写一个基础的 HTTP server 和线程池,以便学习将来可能用到的 crate 背后的通用理念和技术。","breadcrumbs":"最后的项目:构建多线程 web server » 最后的项目:构建多线程 web server","id":"395","title":"最后的项目:构建多线程 web server"},"396":{"body":"ch21-01-single-threaded.md commit 5df6909c57b3ba55f156a4122a42b805436de90c 首先让我们创建一个可运行的单线程 web server,不过在开始之前,我们将快速了解一下构建 web server 所涉及到的协议。这些协议的细节超出了本书的范畴,不过一个简单的概括会提供我们所需的信息。 web server 中涉及到的两个主要协议是 超文本传输协议 ( Hypertext Transfer Protocol , HTTP )和 传输控制协议 ( Transmission Control Protocol , TCP )。这两者都是 请求 - 响应 ( request-response )协议,也就是说,有 客户端 ( client )来初始化请求,并有 服务端 ( server )监听请求并向客户端提供响应。请求与响应的内容由协议本身定义。 TCP 是一个底层协议,它描述了信息如何从一个 server 到另一个的细节,不过其并不指定信息是什么。HTTP 构建于 TCP 之上,它定义了请求和响应的内容。为此,技术上讲可将 HTTP 用于其他协议之上,不过对于绝大部分情况,HTTP 通过 TCP 传输。我们将要做的就是处理 TCP 和 HTTP 请求与响应的原始字节数据。","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 构建单线程 web server","id":"396","title":"构建单线程 web server"},"397":{"body":"我们的 web server 所需做的第一件事,是监听 TCP 连接。标准库提供了 std::net 模块处理这些功能。让我们一如既往新建一个项目: $ cargo new hello Created binary (application) `hello` project\n$ cd hello 现在,在 src/main.rs 输入示例 20-1 中的代码,作为一个开始。这段代码会在地址 127.0.0.1:7878 上监听传入的 TCP 流。当获取到传入的流,它会打印出 Connection established!: 文件名:src/main.rs use std::net::TcpListener; fn main() { let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap(); for stream in listener.incoming() { let stream = stream.unwrap(); println!(\"Connection established!\"); }\n} 示例 20-1: 监听传入的流并在接收到流时打印信息 TcpListener 用于监听 TCP 连接。我们选择监听本地地址 127.0.0.1:7878。将这个地址拆开来看,冒号之前的部分是一个代表本机的 IP 地址(在每台计算机上,这个地址都指本机,并不特指作者的计算机),而 7878 是端口。选择这个端口出于两个原因:通常 HTTP 服务器不在这个端口上接受请求,所以它不太可能与你机器上运行的其它 web server 的端口冲突;而且 7878 在电话上打出来就是 \"rust\"(译者注:九宫格键盘上的英文)。 在这个场景中 bind 函数类似于 new 函数,在这里它返回一个新的 TcpListener 实例。这个函数叫做 bind 是因为,在网络领域,连接到要监听的端口称为“绑定到端口”(“binding to a port”) bind 函数返回 Result<T, E>,这表明绑定可能会失败。例如,监听 80 端口需要管理员权限(非管理员用户只能监听大于 1023 的端口),所以如果尝试监听 80 端口而没有管理员权限,则会绑定失败。再比如,如果我们运行这个程序的两个实例,并因此有两个实例监听同一个端口,那么绑定也将失败。我们是出于学习目的来编写一个基础的服务器,不用关心处理这类错误,而仅仅使用 unwrap 在出现这些情况时直接停止程序。 TcpListener 的 incoming 方法返回一个迭代器,它提供了一系列的流(更准确的说是 TcpStream 类型的流)。 流 ( stream )代表一个客户端和服务端之间打开的连接。 连接 ( connection )代表客户端连接服务端、服务端生成响应以及服务端关闭连接的全部请求 / 响应过程。为此,我们会从 TcpStream 读取客户端发送了什么并接着向流发送响应以向客户端发回数据。总体来说,这个 for 循环会依次处理每个连接并产生一系列的流供我们处理。 目前,处理流的代码中也有一个 unwrap 调用,如果 stream 出现任何错误会终止程序;如果没有任何错误,则打印出信息。下一个例子中,我们将为成功的情况增加更多功能。当客户端连接到服务端时,incoming 方法是可能返回错误的,因为我们实际上不是在遍历连接,而是遍历 连接尝试 ( connection attempts )。连接的尝试可能会因为多种原因不能成功,大部分是操作系统相关的。例如,很多系统限制同时打开的连接数,超出数量限制的新连接尝试会产生错误,直到一些现有的连接关闭为止。 让我们试试这段代码!首先在终端执行 cargo run,接着在浏览器中打开 127.0.0.1:7878。浏览器会显示出看起来类似于“连接重置”(“Connection reset”)的错误信息,因为 server 目前并没响应任何数据。如果我们观察终端,会发现当浏览器连接我们的服务端时,会打印出一系列的信息! Running `target/debug/hello`\nConnection established!\nConnection established!\nConnection established! 有时,对于一次浏览器请求,可能会打印出多条信息;这可能是因为,浏览器在请求页面的同时,还请求了其他资源,比如出现在浏览器标签页开头的图标( favicon.ico )。 这也可能是因为浏览器尝试多次连接服务端,因为服务端没有响应任何数据。作为 drop 实现的一部分,当 stream 在循环的结尾离开作用域并被丢弃,其连接将被关闭。浏览器有时通过重连来处理关闭的连接,因为对于一般网站而言,这些问题可能是暂时的。这些都不重要;现在重要的是,我们成功的处理了 TCP 连接! 记得当运行完特定版本的代码后,使用 ctrl-C 来停止程序。并通过执行 cargo run 命令在做出最新的代码修改之后重启服务。","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 监听 TCP 连接","id":"397","title":"监听 TCP 连接"},"398":{"body":"让我们实现读取来自浏览器请求的功能!为了分离“获取连接”以及“接下来对连接的操作”,我们将开始写一个新函数来处理连接。在这个新的 handle_connection 函数中,我们从 TCP 流中读取数据,并打印出来,以便观察浏览器发送过来的数据。将代码修改为如示例 20-2 所示: 文件名:src/main.rs use std::{ io::{prelude::*, BufReader}, net::{TcpListener, TcpStream},\n}; fn main() { let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap(); for stream in listener.incoming() { let stream = stream.unwrap(); handle_connection(stream); }\n} fn handle_connection(mut stream: TcpStream) { let buf_reader = BufReader::new(&stream); let http_request: Vec<_> = buf_reader .lines() .map(|result| result.unwrap()) .take_while(|line| !line.is_empty()) .collect(); println!(\"Request: {http_request:#?}\");\n} 示例 20-2: 读取 TcpStream 并打印数据 这里将 std::io::prelude 和 std::io::BufReader 引入作用域,来获取读写流所需的特定 trait。在 main 函数的 for 循环中,相比获取到连接时打印信息,现在调用新的 handle_connection 函数并向其传递 stream。 在 handle_connection 中,我们新建了一个 BufReader 实例来封装一个 stream 的可变引用。BufReader 增加了缓存来替我们管理 std::io::Read trait 方法的调用。 我们创建了一个 http_request 变量来收集浏览器发送给服务端的请求行。这里增加了 Vec<_> 类型注解表明希望将这些行收集到一个 vector 中。 BufReader 实现了 std::io::BufRead trait,它提供了 lines 方法。lines 方法通过遇到换行符(newline)字节就切分数据流的方式返回一个 Result<String, std::io::Error> 的迭代器。为了获取每一个 String,通过 map 并 unwrap 每一个 Result。如果数据不是有效的 UTF-8 编码或者读取流遇到问题时,Result 可能是一个错误。一如既往生产环境的程序应该更优雅地处理这些错误,不过出于简单的目的我们选择在错误情况下停止程序。 浏览器通过连续发送两个换行符来代表一个 HTTP 请求的结束,所以为了从流中获取一个请求,我们获取行直到它们不为空。一旦将这些行收集进 vector,就可以使用友好的 debug 格式化打印它们,以便看看 web 浏览器发送给服务端的指令。 让我们试一试!启动程序并再次在浏览器中发起请求。注意浏览器中仍然会出现错误页面,不过终端中程序的输出现在看起来像这样: $ cargo run Compiling hello v0.1.0 (file:///projects/hello) Finished dev [unoptimized + debuginfo] target(s) in 0.42s Running `target/debug/hello`\nRequest: [ \"GET / HTTP/1.1\", \"Host: 127.0.0.1:7878\", \"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:99.0) Gecko/20100101 Firefox/99.0\", \"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\", \"Accept-Language: en-US,en;q=0.5\", \"Accept-Encoding: gzip, deflate, br\", \"DNT: 1\", \"Connection: keep-alive\", \"Upgrade-Insecure-Requests: 1\", \"Sec-Fetch-Dest: document\", \"Sec-Fetch-Mode: navigate\", \"Sec-Fetch-Site: none\", \"Sec-Fetch-User: ?1\", \"Cache-Control: max-age=0\",\n] 根据使用的浏览器不同可能会出现稍微不同的数据。现在我们打印出了请求数据,可以通过观察第一行 GET 之后的路径来解释为何会从浏览器得到多个连接。如果重复的连接都是请求 / ,就知道了浏览器尝试重复获取 / 因为它没有从程序得到响应。 让我们拆开请求数据来理解浏览器向程序请求了什么。 仔细观察 HTTP 请求 HTTP 是一个基于文本的协议,同时一个请求有如下格式: Method Request-URI HTTP-Version CRLF\nheaders CRLF\nmessage-body 第一行叫做 请求行 ( request line ),它存放了客户端请求了什么的信息。请求行的第一部分是所使用的 method ,比如 GET 或 POST,这描述了客户端如何进行请求。这里客户端使用了 GET 请求,表明它在请求信息。 请求行接下来的部分是 / ,它代表客户端请求的 统一资源标识符 ( Uniform Resource Identifier , URI ) —— URI 大体上类似,但也不完全类似于 URL( 统一资源定位符 , Uniform Resource Locators )。URI 和 URL 之间的区别对于本章的目的来说并不重要,不过 HTTP 规范使用术语 URI,所以这里可以简单的将 URL 理解为 URI。 最后一部分是客户端使用的 HTTP 版本,然后请求行以 CRLF 序列 (CRLF 代表回车和换行, carriage return line feed ,这是打字机时代的术语!)结束。CRLF 序列也可以写成\\r\\n,其中\\r是回车符,\\n是换行符。CRLF 序列将请求行与其余请求数据分开。请注意,打印 CRLF 时,我们会看到一个新行,而不是\\r\\n。 观察目前运行程序所接收到的数据的请求行,可以看到 GET 是 method, / 是请求 URI,而 HTTP/1.1 是版本。 从 Host: 开始的其余的行是 headers;GET 请求没有 body。 如果你希望的话,尝试用不同的浏览器发送请求,或请求不同的地址,比如 127.0.0.1:7878/test,来观察请求数据如何变化。 现在我们知道了浏览器请求了什么。让我们返回一些数据!","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 读取请求","id":"398","title":"读取请求"},"399":{"body":"我们将实现在客户端请求的响应中发送数据的功能。响应有如下格式: HTTP-Version Status-Code Reason-Phrase CRLF\nheaders CRLF\nmessage-body 第一行叫做 状态行 ( status line ),它包含响应的 HTTP 版本、一个数字状态码用以总结请求的结果和一个描述之前状态码的文本原因短语。CRLF 序列之后是任意 header,另一个 CRLF 序列,和响应的 body。 这里是一个使用 HTTP 1.1 版本的响应例子,其状态码为 200,原因短语为 OK,没有 header,也没有 body: HTTP/1.1 200 OK\\r\\n\\r\\n 状态码 200 是一个标准的成功响应。这些文本是一个微型的成功 HTTP 响应。让我们将这些文本写入流作为成功请求的响应!在 handle_connection 函数中,我们需要去掉打印请求数据的 println!,并替换为示例 20-3 中的代码: 文件名:src/main.rs # use std::{\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# };\n# # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # handle_connection(stream);\n# }\n# }\n# fn handle_connection(mut stream: TcpStream) { let buf_reader = BufReader::new(&stream); let http_request: Vec<_> = buf_reader .lines() .map(|result| result.unwrap()) .take_while(|line| !line.is_empty()) .collect(); let response = \"HTTP/1.1 200 OK\\r\\n\\r\\n\"; stream.write_all(response.as_bytes()).unwrap();\n} 示例 20-3: 将一个微型成功 HTTP 响应写入流 新代码中的第一行定义了变量 response 来存放将要返回的成功响应的数据。接着,在 response 上调用 as_bytes,因为 stream 的 write_all 方法获取一个 &[u8] 并直接将这些字节发送给连接。因为 write_all 操作可能会失败,所以像之前那样对任何错误结果使用 unwrap。同理,在真实世界的应用中这里需要添加错误处理。 有了这些修改,运行我们的代码并进行请求!我们不再向终端打印任何数据,所以不会再看到除了 Cargo 以外的任何输出。不过当在浏览器中加载 127.0.0.1:7878 时,会得到一个空页面而不是错误。太棒了!我们刚刚手写收发了一个 HTTP 请求与响应。","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 编写响应","id":"399","title":"编写响应"},"4":{"body":"Rust 已证明是一个对于具有不同系统编程知识水平的大型开发团队协作而言,非常高效的工具。底层代码容易出现各种微妙的错误,在大多数其他语言中,这些错误只能通过广泛的测试和经验丰富的开发者的仔细审核代码来捕捉。在 Rust 中,编译器充当了守门员的角色,拒绝编译包含这些难以察觉的错误的代码,包括并发错误。通过与编译器合作,团队可以将时间集中在程序逻辑上,而不是追踪 bug。 Rust 也为系统编程世界带来了现代化的开发工具: Cargo 是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。 Rustfmt 格式化工具确保开发者遵循一致的代码风格。 rust-analyzer 为集成开发环境(IDE)提供了强大的代码补全和内联错误信息功能。 通过使用 Rust 生态系统中丰富的工具,开发者在编写系统级代码时可以更加高效。","breadcrumbs":"简介 » 开发者团队","id":"4","title":"开发者团队"},"40":{"body":"记住,crate 是一组 Rust 源代码文件。我们正在构建的项目是一个 二进制 crate ,它生成一个可执行文件。 rand crate 是一个 库 crate ,库 crate 可以包含任意能被其他程序使用的代码,但是无法独立执行。 Cargo 对外部 crate 的运用是其真正的亮点所在。在我们使用 rand 编写代码之前,需要修改 Cargo.toml 文件,引入一个 rand 依赖。现在打开这个文件并将下面这一行添加到 [dependencies] 片段标题之下。在当前版本下,请确保按照我们这里的方式指定 rand,否则本教程中的示例代码可能无法工作。 文件名:Cargo.toml [dependencies]\nrand = \"0.8.5\" 在 Cargo.toml 文件中,标题以及之后的内容属同一个片段,直到遇到下一个标题才开始新的片段。[dependencies] 片段告诉 Cargo 本项目依赖了哪些外部 crate 及其版本。本例中,我们使用语义化版本 0.8.5 来指定 rand crate。Cargo 理解 语义化版本(Semantic Versioning) (有时也称为 SemVer ),这是一种定义版本号的标准。0.8.5 事实上是 ^0.8.5 的简写,它表示任何至少是 0.8.5 但小于 0.9.0 的版本。 Cargo 认为这些版本与 0.8.5 版本的公有 API 相兼容,这样的版本指定确保了我们可以获取能使本章代码编译的最新的补丁(patch)版本。任何大于等于 0.9.0 的版本不能保证和接下来的示例采用了相同的 API。 现在,不修改任何代码,构建项目,如示例 2-2 所示。 $ cargo build Updating crates.io index Downloaded rand v0.8.5 Downloaded libc v0.2.127 Downloaded getrandom v0.2.7 Downloaded cfg-if v1.0.0 Downloaded ppv-lite86 v0.2.16 Downloaded rand_chacha v0.3.1 Downloaded rand_core v0.6.3 Compiling libc v0.2.127 Compiling getrandom v0.2.7 Compiling cfg-if v1.0.0 Compiling ppv-lite86 v0.2.16 Compiling rand_core v0.6.3 Compiling rand_chacha v0.3.1 Compiling rand v0.8.5 Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 2.53s 示例 2-2:将 rand crate 添加为依赖之后运行 `cargo build` 的输出 可能会出现不同的版本号(多亏了语义化版本,它们与代码是兼容的!),并且显示的行数可能会有所不同(取决于操作系统),行的顺序也可能会不同。 现在我们有了一个外部依赖,Cargo 从 registry 上获取所有包的最新版本信息,这是一份来自 Crates.io 的数据副本。Crates.io 是 Rust 生态系统中,人们发布其开源 Rust 项目的平台,供他人使用。 在更新完 registry 后,Cargo 检查 [dependencies] 片段并下载列表中包含但还未下载的 crates。本例中,虽然只声明了 rand 一个依赖,然而 Cargo 还是额外获取了 rand 所需要的其他 crates,因为 rand 依赖它们来正常工作。下载完成后,Rust 编译依赖,然后使用这些依赖编译项目。 如果不做任何修改,立刻再次运行 cargo build,则不会看到任何除了 Finished 行之外的输出。Cargo 知道它已经下载并编译了依赖,同时 Cargo.toml 文件也没有变动。Cargo 还知道代码也没有任何修改,所以它不会重新编译代码。因为无事可做,它会简单地退出。 如果打开 src/main.rs 文件,做一些无关紧要的修改,保存并再次构建,则会出现两行输出: $ cargo build Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 2.53 secs 这一行表示 Cargo 只针对 src/main.rs 文件的微小修改而更新构建。依赖没有变化,所以 Cargo 知道它可以复用已经为此下载并编译的代码。它只是重新构建了部分(项目)代码。 Cargo.lock 文件确保构建是可重现的 Cargo 有一个机制,确保无论是你还是其他人在任何时候重新构建代码,都会生成相同的构建产物:Cargo 只会使用你指定的依赖版本,除非你明确指定其他版本。例如,如果下周 rand crate 的 0.8.6 版本出来了,该版本包含了一个重要的 bug 修复,但同时也引入了一个会破坏你代码的回归问题。为了解决这个问题,Rust 在你第一次运行 cargo build 时创建了 Cargo.lock 文件,我们现在可以在 guessing_game 目录找到它。 当第一次构建项目时,Cargo 计算出所有符合要求的依赖版本并写入 Cargo.lock 文件。当将来构建项目时,Cargo 会发现 Cargo.lock 已存在并使用其中指定的版本,而不是再次计算所有的版本。这使得你拥有了一个自动化的可重现的构建。换句话说,项目会持续使用 0.8.5 直到你显式升级,多亏有了 Cargo.lock 文件。由于 Cargo.lock 文件对于“可重复构建”非常重要,因此它通常会和项目中的其余代码一样纳入到版本控制系统中。 更新 crate 到一个新版本 当你 确实 需要升级 crate 时,Cargo 提供了这样一个命令,update,它会忽略 Cargo.lock 文件,并计算出所有符合 Cargo.toml 声明的最新版本。Cargo 接下来会把这些版本写入 Cargo.lock 文件。不过,Cargo 默认只会寻找大于 0.8.5 而小于 0.9.0 的版本。如果 rand crate 发布了两个新版本,0.8.6 和 0.9.0,在运行 cargo update 时会出现如下内容: $ cargo update Updating crates.io index Updating rand v0.8.5 -> v0.8.6 Cargo 忽略了 0.9.0 版本。这时,你也会注意到的 Cargo.lock 文件中的变化无外乎现在使用的 rand crate 版本是0.8.6 。如果想要使用 0.9.0 版本的 rand 或是任何 0.9.x 系列的版本,必须像这样更新 Cargo.toml 文件: [dependencies]\nrand = \"0.9.0\" 下一次运行 cargo build 时,Cargo 会更新可用 crate 的 registry,并根据你指定的新版本重新评估 rand 的要求。 第十四章会讲到 Cargo 及其 生态系统 的更多内容,不过目前你只需要了解这么多。通过 Cargo 复用库文件非常容易,因此 Rustacean 能够编写出由很多包组装而成的更轻巧的项目。","breadcrumbs":"写个猜数字游戏 » 使用 crate 来增加更多功能","id":"40","title":"使用 crate 来增加更多功能"},"400":{"body":"让我们实现不只是返回空页面的功能。在项目根目录创建一个新文件, hello.html —— 也就是说,不是在 src 目录。在此可以放入任何你期望的 HTML;列表 20-4 展示了一个可能的文本: 文件名:hello.html <!DOCTYPE html>\n<html lang=\"en\"> <head> <meta charset=\"utf-8\"> <title>Hello!

    Hello!

    Hi from Rust

    \n 示例 20-4: 一个简单的 HTML 文件用来作为响应 这是一个极小化的 HTML5 文档,它有一个标题和一小段文本。为了在 server 接受请求时返回它,需要如示例 20-5 所示修改 handle_connection 来读取 HTML 文件,将其加入到响应的 body 中,并发送: 文件名:src/main.rs use std::{ fs, io::{prelude::*, BufReader}, net::{TcpListener, TcpStream},\n};\n// --snip-- # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # handle_connection(stream);\n# }\n# }\n# fn handle_connection(mut stream: TcpStream) { let buf_reader = BufReader::new(&stream); let http_request: Vec<_> = buf_reader .lines() .map(|result| result.unwrap()) .take_while(|line| !line.is_empty()) .collect(); let status_line = \"HTTP/1.1 200 OK\"; let contents = fs::read_to_string(\"hello.html\").unwrap(); let length = contents.len(); let response = format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\"); stream.write_all(response.as_bytes()).unwrap();\n} 示例 20-5: 将 hello.html 的内容作为响应 body 发送 我们在开头 use 语句将标准库的文件系统模块 fs 引入作用域。打开和读取文件的代码应该看起来很熟悉,因为第十二章 I/O 项目的示例 12-4 中读取文件内容时出现过类似的代码。 接下来,使用 format! 将文件内容加入到将要写入流的成功响应的 body 中。 使用 cargo run 运行程序,在浏览器加载 127.0.0.1:7878 ,你应该会看到渲染出来的 HTML 文件! 目前忽略了 http_request 中的请求数据并无条件的发送了 HTML 文件的内容。这意味着如果尝试在浏览器中请求 127.0.0.1:7878/something-else 也会得到同样的 HTML 响应。目前我们的 server 的作用是非常有限的,也不是大部分 server 所做的;让我们检查请求并只对格式良好(well-formed)的请求 / 发送 HTML 文件。","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 返回真正的 HTML","id":"400","title":"返回真正的 HTML"},"401":{"body":"目前我们的 web server 不管客户端请求什么都会返回相同的 HTML 文件。让我们增加在返回 HTML 文件前检查浏览器是否请求 / ,并在其请求任何其他内容时返回错误的功能。为此需要如示例 20-6 那样修改 handle_connection。新代码接收到的请求的内容与已知的 / 请求的一部分做比较,并增加了 if 和 else 块来区别处理请求: 文件名:src/main.rs # use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# };\n# # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # handle_connection(stream);\n# }\n# }\n// --snip-- fn handle_connection(mut stream: TcpStream) { let buf_reader = BufReader::new(&stream); let request_line = buf_reader.lines().next().unwrap().unwrap(); if request_line == \"GET / HTTP/1.1\" { let status_line = \"HTTP/1.1 200 OK\"; let contents = fs::read_to_string(\"hello.html\").unwrap(); let length = contents.len(); let response = format!( \"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\" ); stream.write_all(response.as_bytes()).unwrap(); } else { // some other request }\n} 示例 20-6: 以不同于其它请求的方式处理 / 请求 我们只看 HTTP 请求的第一行,所以不同于将整个请求读取进 vector 中,这里调用 next 从迭代器中获取第一项。第一个 unwrap 负责处理 Option 并在迭代器没有项时停止程序。第二个 unwrap 处理 Result 并与示例 20-2 中增加的 map 中的 unwrap 有着相同的效果。 接下来检查 request_line 是否等于一个 / 路径的 GET 请求。如果是,if 代码块返回 HTML 文件的内容。 如果 request_line 不 等于一个 / 路径的 GET 请求,就说明接收的是其他请求。我们之后会在 else 块中增加代码来响应所有其他请求。 现在如果运行代码并请求 127.0.0.1:7878 ,就会得到 hello.html 中的 HTML。如果进行任何其他请求,比如 127.0.0.1:7878/something-else ,则会得到像运行示例 20-1 和 20-2 中代码那样的连接错误。 现在向示例 20-7 的 else 块增加代码来返回一个带有 404 状态码的响应,这代表了所请求的内容没有找到。接着也会返回一个 HTML 向浏览器终端用户表明此意: 文件名:src/main.rs # use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# };\n# # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # handle_connection(stream);\n# }\n# }\n# # fn handle_connection(mut stream: TcpStream) {\n# let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap();\n# # if request_line == \"GET / HTTP/1.1\" {\n# let status_line = \"HTTP/1.1 200 OK\";\n# let contents = fs::read_to_string(\"hello.html\").unwrap();\n# let length = contents.len();\n# # let response = format!(\n# \"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\"\n# );\n# # stream.write_all(response.as_bytes()).unwrap(); // --snip-- } else { let status_line = \"HTTP/1.1 404 NOT FOUND\"; let contents = fs::read_to_string(\"404.html\").unwrap(); let length = contents.len(); let response = format!( \"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\" ); stream.write_all(response.as_bytes()).unwrap(); }\n# } 示例 20-7: 对于任何不是 / 的请求返回 404 状态码的响应和错误页面 这里,响应的状态行有状态码 404 和原因短语 NOT FOUND。仍然没有返回任何 header,而其 body 将是 404.html 文件中的 HTML。需要在 hello.html 同级目录创建 404.html 文件作为错误页面;这一次也可以随意使用任何 HTML 或使用示例 20-8 中的示例 HTML: 文件名:404.html \n Hello!

    Oops!

    Sorry, I don't know what you're asking for.

    \n 示例 20-8: 任何 404 响应所返回错误页面内容样例 有了这些修改,再次运行 server。请求 127.0.0.1:7878 应该会返回 hello.html 的内容,而对于任何其他请求,比如 127.0.0.1:7878/foo ,应该会返回 404.html 中的错误 HTML!","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 验证请求并有选择的进行响应","id":"401","title":"验证请求并有选择的进行响应"},"402":{"body":"目前 if 和 else 块中的代码有很多的重复:他们都读取文件并将其内容写入流。唯一的区别是状态行和文件名。为了使代码更为简明,将这些区别分别提取到一行 if 和 else 中,对状态行和文件名变量赋值;然后在读取文件和写入响应的代码中无条件的使用这些变量。重构后取代了大段 if 和 else 块代码后的结果如示例 20-9 所示: 文件名:src/main.rs # use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# };\n# # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # handle_connection(stream);\n# }\n# }\n// --snip-- fn handle_connection(mut stream: TcpStream) { // --snip--\n# let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap(); let (status_line, filename) = if request_line == \"GET / HTTP/1.1\" { (\"HTTP/1.1 200 OK\", \"hello.html\") } else { (\"HTTP/1.1 404 NOT FOUND\", \"404.html\") }; let contents = fs::read_to_string(filename).unwrap(); let length = contents.len(); let response = format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\"); stream.write_all(response.as_bytes()).unwrap();\n} 示例 20-9: 重构使得 if 和 else 块中只包含两个情况所不同的代码 现在 if 和 else 块所做的唯一的事就是在一个元组中返回合适的状态行和文件名的值;接着使用第十九章讲到的使用模式的 let 语句通过解构元组的两部分为 filename 和 header 赋值。 之前读取文件和写入响应的冗余代码现在位于 if 和 else 块之外,并会使用变量 status_line 和 filename。这样更易于观察这两种情况真正有何不同,还意味着如果需要改变如何读取文件或写入响应时只需要更新一处的代码。示例 20-9 中代码的行为与示例 20-8 完全一样。 好极了!我们有了一个 40 行左右 Rust 代码的小而简单的 server,它对一个请求返回页面内容而对所有其他请求返回 404 响应。 目前 server 运行于单线程中,它一次只能处理一个请求。让我们模拟一些慢请求来看看这如何会成为一个问题,并进行修复以便 server 可以一次处理多个请求。","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 少量代码重构","id":"402","title":"少量代码重构"},"403":{"body":"ch21-02-multithreaded.md commit 98c6225e5fb8255349ec0dc235433530ed3fb534 目前 server 会依次处理每一个请求,意味着它在完成第一个连接的处理之前不会处理第二个连接。如果 server 正接收越来越多的请求,这类串行操作会使性能越来越差。如果一个请求花费很长时间来处理,随后而来的请求则不得不等待这个长请求结束,即便这些新请求可以很快就处理完。我们需要修复这种情况,不过首先让我们实际尝试一下这个问题。","breadcrumbs":"最后的项目:构建多线程 web server » 将单线程 server 变为多线程 server » 将单线程 server 变为多线程 server","id":"403","title":"将单线程 server 变为多线程 server"},"404":{"body":"让我们看看一个慢请求如何影响当前 server 实现中的其他请求。示例 20-10 通过模拟慢响应实现了 /sleep 请求处理,它会使 server 在响应之前休眠五秒。 文件名:src/main.rs use std::{ fs, io::{prelude::*, BufReader}, net::{TcpListener, TcpStream}, thread, time::Duration,\n};\n// --snip--\n# # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # handle_connection(stream);\n# }\n# } fn handle_connection(mut stream: TcpStream) { // --snip-- # let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap();\n# let (status_line, filename) = match &request_line[..] { \"GET / HTTP/1.1\" => (\"HTTP/1.1 200 OK\", \"hello.html\"), \"GET /sleep HTTP/1.1\" => { thread::sleep(Duration::from_secs(5)); (\"HTTP/1.1 200 OK\", \"hello.html\") } _ => (\"HTTP/1.1 404 NOT FOUND\", \"404.html\"), }; // --snip--\n# # let contents = fs::read_to_string(filename).unwrap();\n# let length = contents.len();\n# # let response =\n# format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\");\n# # stream.write_all(response.as_bytes()).unwrap();\n} 示例 20-10: 通过休眠五秒来模拟慢请求 从 if 切换到 match 后现在有三个分支了。我们需要显式匹配一个 slice 的 request_line 以匹配字符串字面值的模式。match 不会像相等方法那样自动引用和解引用。 第一个分支与示例 20-9 中的 if 代码块相同。第二个分支匹配一个 /sleep 请求。当接收到这个请求时,server 在渲染成功 HTML 页面之前会先休眠五秒。第三个分支与示例 20-9 中的 else 代码块相同。 现在就可以真切的看出我们的 server 有多么的原始:真实的库将会以更简洁的方式处理多请求识别问题! 使用 cargo run 启动 server,并接着打开两个浏览器窗口:一个请求 http://127.0.0.1:7878/ 而另一个请求 http://127.0.0.1:7878/sleep 。如果像之前一样多次请求 / ,会发现响应的比较快速。不过如果请求 /sleep 之后再请求 / ,就会看到 / 会等待直到 sleep 休眠完五秒之后才出现。 有多种技术可以用来避免所有请求都排在慢请求之后;我们将要实现的一个便是线程池。","breadcrumbs":"最后的项目:构建多线程 web server » 将单线程 server 变为多线程 server » 在当前 server 实现中模拟慢请求","id":"404","title":"在当前 server 实现中模拟慢请求"},"405":{"body":"线程池 ( thread pool )是一组预先分配的等待或准备处理任务的线程。当程序收到一个新任务,线程池中的一个线程会被分配任务,这个线程会离开并处理任务。其余的线程则可用于处理在第一个线程处理任务的同时处理其他接收到的任务。当第一个线程处理完任务时,它会返回空闲线程池中等待处理新任务。线程池允许我们并发处理连接,增加 server 的吞吐量。 我们会将池中线程限制为较少的数量,以防拒绝服务(Denial of Service,DoS)攻击;如果程序为每一个接收的请求都新建一个线程,某人向 server 发起千万级的请求时会耗尽服务器的资源并导致所有请求的处理都被终止。 不同于分配无限的线程,线程池中将有固定数量的等待线程。当新进请求时,将请求发送到线程池中做处理。线程池会维护一个接收请求的队列。每一个线程会从队列中取出一个请求,处理请求,接着向队列索取另一个请求。通过这种设计,则可以并发处理 N 个请求,其中 N 为线程数。如果每一个线程都在响应慢请求,之后的请求仍然会阻塞队列,不过相比之前增加了能处理的慢请求的数量。 这个设计仅仅是多种改善 web server 吞吐量的方法之一。其他可供探索的方法有 fork/join 模型 ( fork/join model )、 单线程异步 I/O 模型 ( single-threaded async I/O model )或者 多线程异步 I/O 模型 ( multi-threaded async I/O model )。如果你对这个主题感兴趣,则可以阅读更多关于其他解决方案的内容并尝试实现它们;对于一个像 Rust 这样的底层语言,所有这些方法都是可能的。 在开始之前,让我们讨论一下线程池应用看起来怎样。当尝试设计代码时,首先编写客户端接口确实有助于指导代码设计。以期望的调用方式来构建 API 代码的结构,接着在这个结构之内实现功能,而不是先实现功能再设计公有 API。 类似于第十二章项目中使用的测试驱动开发。这里将要使用编译器驱动开发(compiler-driven development)。我们将编写调用所期望的函数的代码,接着观察编译器错误告诉我们接下来需要修改什么使得代码可以工作。不过在开始之前,我们将探索不会作为起点的技术。 为每一个请求分配线程 首先,让我们探索一下为每一个连接都创建一个线程的代码看起来如何。这并不是最终方案,因为正如之前讲到的它会潜在的分配无限的线程,不过这是一个可用的多线程 server 的起点。接着我们会增加线程池作为改进,这样比较两个方案将会更容易。示例 20-11 展示了 main 的改变,它在 for 循环中为每一个流分配了一个新线程进行处理: 文件名:src/main.rs # use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# thread,\n# time::Duration,\n# };\n# fn main() { let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap(); for stream in listener.incoming() { let stream = stream.unwrap(); thread::spawn(|| { handle_connection(stream); }); }\n}\n# # fn handle_connection(mut stream: TcpStream) {\n# let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap();\n# # let (status_line, filename) = match &request_line[..] {\n# \"GET / HTTP/1.1\" => (\"HTTP/1.1 200 OK\", \"hello.html\"),\n# \"GET /sleep HTTP/1.1\" => {\n# thread::sleep(Duration::from_secs(5));\n# (\"HTTP/1.1 200 OK\", \"hello.html\")\n# }\n# _ => (\"HTTP/1.1 404 NOT FOUND\", \"404.html\"),\n# };\n# # let contents = fs::read_to_string(filename).unwrap();\n# let length = contents.len();\n# # let response =\n# format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\");\n# # stream.write_all(response.as_bytes()).unwrap();\n# } 示例 20-11: 为每一个流新建一个线程 正如第十六章讲到的,thread::spawn 会创建一个新线程并在其中运行闭包中的代码。如果运行这段代码并在在浏览器中加载 /sleep ,接着在另两个浏览器标签页中加载 / ,确实会发现 / 请求不必等待 /sleep 结束。不过正如之前提到的,这最终会使系统崩溃因为我们无限制的创建新线程。 创建有限数量的线程 我们期望线程池以类似且熟悉的方式工作,以便从线程切换到线程池并不会对使用该 API 的代码做出较大的修改。示例 20-12 展示我们希望用来替换 thread::spawn 的 ThreadPool 结构体的假想接口: 文件名:src/main.rs # use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# thread,\n# time::Duration,\n# };\n# fn main() { let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap(); let pool = ThreadPool::new(4); for stream in listener.incoming() { let stream = stream.unwrap(); pool.execute(|| { handle_connection(stream); }); }\n}\n# # fn handle_connection(mut stream: TcpStream) {\n# let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap();\n# # let (status_line, filename) = match &request_line[..] {\n# \"GET / HTTP/1.1\" => (\"HTTP/1.1 200 OK\", \"hello.html\"),\n# \"GET /sleep HTTP/1.1\" => {\n# thread::sleep(Duration::from_secs(5));\n# (\"HTTP/1.1 200 OK\", \"hello.html\")\n# }\n# _ => (\"HTTP/1.1 404 NOT FOUND\", \"404.html\"),\n# };\n# # let contents = fs::read_to_string(filename).unwrap();\n# let length = contents.len();\n# # let response =\n# format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\");\n# # stream.write_all(response.as_bytes()).unwrap();\n# } 示例 20-12: 假想的 ThreadPool 接口 这里使用 ThreadPool::new 来创建一个新的线程池,它有一个可配置的线程数的参数,在这里是四。这样在 for 循环中,pool.execute 有着类似 thread::spawn 的接口,它获取一个线程池运行于每一个流的闭包。pool.execute 需要实现为获取闭包并传递给池中的线程运行。这段代码还不能编译,不过通过尝试,编译器会指导我们如何修复它。 采用编译器驱动构建 ThreadPool 继续并对示例 20-12 中的 src/main.rs 做出修改,并利用来自 cargo check 的编译器错误来驱动开发。下面是我们得到的第一个错误: $ cargo check Checking hello v0.1.0 (file:///projects/hello)\nerror[E0433]: failed to resolve: use of undeclared type `ThreadPool` --> src/main.rs:11:16 |\n11 | let pool = ThreadPool::new(4); | ^^^^^^^^^^ use of undeclared type `ThreadPool` For more information about this error, try `rustc --explain E0433`.\nerror: could not compile `hello` (bin \"hello\") due to 1 previous error 好的,这告诉我们需要一个 ThreadPool 类型或模块,所以我们将构建一个。ThreadPool 的实现会与 web server 的特定工作相独立,所以让我们从 hello crate 切换到存放 ThreadPool 实现的新库 crate。这也意味着可以在任何工作中使用这个单独的线程池库,而不仅仅是处理网络请求。 创建 src/lib.rs 文件,它包含了目前可用的最简单的 ThreadPool 定义: 文件名:src/lib.rs pub struct ThreadPool; 接着编辑 main.rs 文件通过在 src/main.rs 的开头增加如下代码将 ThreadPool 从库 crate 引入作用域: 文件名:src/main.rs use hello::ThreadPool;\n# use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# thread,\n# time::Duration,\n# };\n# # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# let pool = ThreadPool::new(4);\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # pool.execute(|| {\n# handle_connection(stream);\n# });\n# }\n# }\n# # fn handle_connection(mut stream: TcpStream) {\n# let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap();\n# # let (status_line, filename) = match &request_line[..] {\n# \"GET / HTTP/1.1\" => (\"HTTP/1.1 200 OK\", \"hello.html\"),\n# \"GET /sleep HTTP/1.1\" => {\n# thread::sleep(Duration::from_secs(5));\n# (\"HTTP/1.1 200 OK\", \"hello.html\")\n# }\n# _ => (\"HTTP/1.1 404 NOT FOUND\", \"404.html\"),\n# };\n# # let contents = fs::read_to_string(filename).unwrap();\n# let length = contents.len();\n# # let response =\n# format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\");\n# # stream.write_all(response.as_bytes()).unwrap();\n# } 这仍然不能工作,再次尝试运行来得到下一个需要解决的错误: $ cargo check Checking hello v0.1.0 (file:///projects/hello)\nerror[E0599]: no function or associated item named `new` found for struct `ThreadPool` in the current scope --> src/main.rs:12:28 |\n12 | let pool = ThreadPool::new(4); | ^^^ function or associated item not found in `ThreadPool` For more information about this error, try `rustc --explain E0599`.\nerror: could not compile `hello` (bin \"hello\") due to 1 previous error 这告诉我们下一步是为 ThreadPool 创建一个叫做 new 的关联函数。我们还知道 new 需要有一个参数可以接受 4,而且 new 应该返回 ThreadPool 实例。让我们实现拥有此特征的最小化 new 函数: 文件夹:src/lib.rs pub struct ThreadPool; impl ThreadPool { pub fn new(size: usize) -> ThreadPool { ThreadPool }\n} 这里选择 usize 作为 size 参数的类型,因为我们知道为负的线程数没有意义。我们还知道将使用 4 作为线程集合的元素数量,这也就是使用 usize 类型的原因,如第三章 “整型” 部分所讲。 再次编译检查这段代码: $ cargo check Checking hello v0.1.0 (file:///projects/hello)\nerror[E0599]: no method named `execute` found for struct `ThreadPool` in the current scope --> src/main.rs:17:14 |\n17 | pool.execute(|| { | -----^^^^^^^ method not found in `ThreadPool` For more information about this error, try `rustc --explain E0599`.\nerror: could not compile `hello` (bin \"hello\") due to 1 previous error 现在有了一个警告和一个错误。暂时先忽略警告,发生错误是因为并没有 ThreadPool 上的 execute 方法。回忆 “创建有限数量的线程” 部分我们决定线程池应该有与 thread::spawn 类似的接口,同时我们将实现 execute 函数来获取传递的闭包并将其传递给池中的空闲线程执行。 我们会在 ThreadPool 上定义 execute 函数来获取一个闭包参数。回忆第十三章的 “将被捕获的值移出闭包和 Fn trait” 部分,闭包作为参数时可以使用三个不同的 trait:Fn、FnMut 和 FnOnce。我们需要决定这里应该使用哪种闭包。最终需要实现的类似于标准库的 thread::spawn,所以我们可以观察 thread::spawn 的签名在其参数中使用了何种 bound。查看文档会发现: pub fn spawn(f: F) -> JoinHandle where F: FnOnce() -> T, F: Send + 'static, T: Send + 'static, F 是这里我们关心的参数;T 与返回值有关所以我们并不关心。考虑到 spawn 使用 FnOnce 作为 F 的 trait bound,这可能也是我们需要的,因为最终会将传递给 execute 的参数传给 spawn。因为处理请求的线程只会执行闭包一次,这也进一步确认了 FnOnce 是我们需要的 trait,这里符合 FnOnce 中 Once 的意思。 F 还有 trait bound Send 和生命周期绑定 'static,这对我们的情况也是有意义的:需要 Send 来将闭包从一个线程转移到另一个线程,而 'static 是因为并不知道线程会执行多久。让我们编写一个使用带有这些 bound 的泛型参数 F 的 ThreadPool 的 execute 方法: 文件名:src/lib.rs # pub struct ThreadPool;\n# impl ThreadPool { // --snip--\n# pub fn new(size: usize) -> ThreadPool {\n# ThreadPool\n# }\n# pub fn execute(&self, f: F) where F: FnOnce() + Send + 'static, { }\n} FnOnce trait 仍然需要之后的 (),因为这里的 FnOnce 代表一个没有参数也没有返回值的闭包。正如函数的定义,返回值类型可以从签名中省略,不过即便没有参数也需要括号。 这里再一次增加了 execute 方法的最小化实现:它没有做任何工作,只是尝试让代码能够编译。再次进行检查: $ cargo check Checking hello v0.1.0 (file:///projects/hello) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.24s 现在就只有警告了!这意味着能够编译了!注意如果尝试 cargo run 运行程序并在浏览器中发起请求,仍会在浏览器中出现在本章开始时那样的错误。这个库实际上还没有调用传递给 execute 的闭包! 一个你可能听说过的关于像 Haskell 和 Rust 这样有严格编译器的语言的说法是 “如果代码能够编译,它就能工作”。这是一个提醒大家的好时机,实际上这并不是普适的。我们的项目可以编译,不过它完全没有做任何工作!如果构建一个真实且功能完整的项目,则需花费大量的时间来开始编写单元测试来检查代码能否编译 并且 拥有期望的行为。 在 new 中验证池中线程数量 这里仍然存在警告是因为其并没有对 new 和 execute 的参数做任何操作。让我们用期望的行为来实现这些函数。以考虑 new 作为开始。之前选择使用无符号类型作为 size 参数的类型,因为线程数为负的线程池没有意义。然而,线程数为零的线程池同样没有意义,不过零是一个完全有效的 usize 值。让我们增加在返回 ThreadPool 实例之前检查 size 是否大于零的代码,并使用 assert! 宏在得到零时 panic,如示例 20-13 所示: 文件名:src/lib.rs # pub struct ThreadPool;\n# impl ThreadPool { /// Create a new ThreadPool. /// /// The size is the number of threads in the pool. /// /// # Panics /// /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); ThreadPool } // --snip--\n# pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# }\n} 示例 20-13: 实现 ThreadPool::new 在 size 为零时 panic 这里也用文档注释为 ThreadPool 增加了一些文档。注意这里遵循了良好的文档实践并增加了一个部分来提示函数会 panic 的情况,正如第十四章所讨论的。尝试运行 cargo doc --open 并点击 ThreadPool 结构体来查看生成的 new 的文档看起来如何! 相比像这里使用 assert! 宏,也可以让 new 像之前 I/O 项目中示例 12-9 中 Config::build 那样将 new 更改为 build 并返回一个 Result,不过在这里我们选择创建一个没有任何线程的线程池应该是不可恢复的错误。如果你想做的更好,尝试编写一个采用如下签名的名为 build 的函数来对比一下 new 函数: pub fn build(size: usize) -> Result { 分配空间以储存线程 现在有了一个有效的线程池线程数,就可以实际创建这些线程并在返回结构体之前将它们储存在 ThreadPool 结构体中。不过如何 “储存” 一个线程?让我们再看看 thread::spawn 的签名: pub fn spawn(f: F) -> JoinHandle where F: FnOnce() -> T, F: Send + 'static, T: Send + 'static, spawn 返回 JoinHandle,其中 T 是闭包返回的类型。尝试使用 JoinHandle 来看看会发生什么。在我们的情况中,传递给线程池的闭包会处理连接并不返回任何值,所以 T 将会是单元类型 ()。 示例 20-14 中的代码可以编译,不过实际上还并没有创建任何线程。我们改变了 ThreadPool 的定义来存放一个 thread::JoinHandle<()> 的 vector 实例,使用 size 容量来初始化,并设置一个 for 循环来运行创建线程的代码,并返回包含这些线程的 ThreadPool 实例: 文件名:src/lib.rs use std::thread; pub struct ThreadPool { threads: Vec>,\n} impl ThreadPool { // --snip--\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let mut threads = Vec::with_capacity(size); for _ in 0..size { // create some threads and store them in the vector } ThreadPool { threads } } // --snip--\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# }\n} 示例 20-14: 为 ThreadPool 创建一个 vector 来存放线程 这里将 std::thread 引入库 crate 的作用域,因为使用了 thread::JoinHandle 作为 ThreadPool 中 vector 元素的类型。 在得到了有效的数量之后,ThreadPool 新建一个存放 size 个元素的 vector。with_capacity 函数与 Vec::new 做了同样的工作,不过有一个重要的区别:它为 vector 预先分配空间。因为已经知道了 vector 中需要 size 个元素,预先进行分配比仅仅 Vec::new 要稍微有效率一些,因为 Vec::new 随着插入元素而重新改变大小。 如果再次运行 cargo check,它应该会成功。 Worker 结构体负责从 ThreadPool 中将代码传递给线程 示例 20-14 的 for 循环中留下了一个关于创建线程的注释。如何实际创建线程呢?这是一个难题。标准库提供的创建线程的方法,thread::spawn,它期望获取一些一旦创建线程就应该执行的代码。然而,我们希望开始线程并使其等待稍后传递的代码。标准库的线程实现并没有包含这么做的方法;我们必须自己实现。 我们将要实现的行为是创建线程并稍后发送代码,这会在 ThreadPool 和线程间引入一个新数据类型来管理这种新行为。这个数据结构称为 Worker ,这是一个池实现中的常见概念。想象一下在餐馆厨房工作的员工:员工等待来自客户的订单,他们负责接受这些订单并完成它们。 不同于在线程池中储存一个 JoinHandle<()> 实例的 vector,我们会储存 Worker 结构体的实例。每一个 Worker 会储存一个单独的 JoinHandle<()> 实例。接着会在 Worker 上实现一个方法,该方法将闭包发送到已经运行的线程中执行。我们还会赋予每一个 worker id,这样就可以在日志和调试中区别线程池中的不同 worker。 如下是创建 ThreadPool 时会发生的新过程。在通过如下方式设置完 Worker 之后,我们会实现向线程发送闭包的代码: 定义 Worker 结构体存放 id 和 JoinHandle<()> 修改 ThreadPool 存放一个 Worker 实例的 vector 定义 Worker::new 函数,它获取一个 id 数字并返回一个带有 id 和用空闭包分配的线程的 Worker 实例 在 ThreadPool::new 中,使用 for 循环计数生成 id,使用这个 id 新建 Worker,并储存进 vector 中 如果你渴望挑战,在查示例 20-15 中的代码之前尝试自己实现这些修改。 准备好了吗?示例 20-15 就是一个做出了这些修改的例子: 文件名:src/lib.rs use std::thread; pub struct ThreadPool { workers: Vec,\n} impl ThreadPool { // --snip--\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let mut workers = Vec::with_capacity(size); for id in 0..size { workers.push(Worker::new(id)); } ThreadPool { workers } } // --snip--\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# }\n} struct Worker { id: usize, thread: thread::JoinHandle<()>,\n} impl Worker { fn new(id: usize) -> Worker { let thread = thread::spawn(|| {}); Worker { id, thread } }\n} 示例 20-15: 修改 ThreadPool 存放 Worker 实例而不是直接存放线程 这里将 ThreadPool 中字段名从 threads 改为 workers,因为它现在储存 Worker 而不是 JoinHandle<()>。使用 for 循环中的计数作为 Worker::new 的参数,并将每一个新建的 Worker 储存在叫做 workers 的 vector 中。 Worker 结构体和其 new 函数是私有的,因为外部代码(比如 src/main.rs 中的 server)并不需要知道关于 ThreadPool 中使用 Worker 结构体的实现细节。Worker::new 函数使用 id 参数并储存了使用一个空闭包创建的 JoinHandle<()>。 注意:如果操作系统因为没有足够的系统资源而无法创建线程时,thread::spawn 会 panic。这会导致整个 server panic,即使一些线程可能创建成功了。出于简单的考虑,这个行为是可行的,不过在一个生产级别的线程池实现中,你可能会希望使用 std::thread::Builder 和其 spawn 方法来返回一个 Result。 这段代码能够编译并用指定给 ThreadPool::new 的参数创建储存了一系列的 Worker 实例,不过 仍然 没有处理 execute 中得到的闭包。让我们聊聊接下来怎么做。 使用信道向线程发送请求 下一个需要解决的问题是传递给 thread::spawn 的闭包完全没有做任何工作。目前,我们在 execute 方法中获得期望执行的闭包,不过在创建 ThreadPool 的过程中创建每一个 Worker 时需要向 thread::spawn 传递一个闭包。 我们希望刚创建的 Worker 结构体能够从 ThreadPool 的队列中获取需要执行的代码,并发送到线程中执行它们。 在第十六章,我们学习了 信道 —— 一个沟通两个线程的简单手段 —— 对于这个例子来说则是绝佳的。这里信道将充当任务队列的作用,execute 将通过 ThreadPool 向其中线程正在寻找工作的 Worker 实例发送任务。如下是这个计划: ThreadPool 会创建一个信道并充当发送者。 每个 Worker 将会充当接收者。 新建一个 Job 结构体来存放用于向信道中发送的闭包。 execute 方法会在发送者发出期望执行的任务。 在线程中,Worker 会遍历接收者并执行任何接收到的任务。 让我们以在 ThreadPool::new 中创建信道并让 ThreadPool 实例充当发送者开始,如示例 20-16 所示。Job 是将在信道中发出的类型,目前它是一个没有任何内容的结构体: 文件名:src/lib.rs use std::{sync::mpsc, thread}; pub struct ThreadPool { workers: Vec, sender: mpsc::Sender,\n} struct Job; impl ThreadPool { // --snip--\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let (sender, receiver) = mpsc::channel(); let mut workers = Vec::with_capacity(size); for id in 0..size { workers.push(Worker::new(id)); } ThreadPool { workers, sender } } // --snip--\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# }\n}\n# # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n# # impl Worker {\n# fn new(id: usize) -> Worker {\n# let thread = thread::spawn(|| {});\n# # Worker { id, thread }\n# }\n# } 示例 20-16: 修改 ThreadPool 来储存一个传输 Job 实例的发送者 在 ThreadPool::new 中,新建了一个信道,并接着让线程池在接收端等待。这段代码能够成功编译。 让我们尝试在线程池创建每个 worker 时将接收者传递给它们。须知我们希望在 worker 所分配的线程中使用接收者,所以将在闭包中引用 receiver 参数。示例 20-17 中展示的代码还不能编译: 文件名:src/lib.rs # use std::{sync::mpsc, thread};\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # struct Job;\n# impl ThreadPool { // --snip--\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let (sender, receiver) = mpsc::channel(); let mut workers = Vec::with_capacity(size); for id in 0..size { workers.push(Worker::new(id, receiver)); } ThreadPool { workers, sender } } // --snip--\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# }\n} // --snip-- # # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n# impl Worker { fn new(id: usize, receiver: mpsc::Receiver) -> Worker { let thread = thread::spawn(|| { receiver; }); Worker { id, thread } }\n} 示例 20-17: 将信道的接收端传递给 worker 这是一些小而直观的修改:将接收者传递进了 Worker::new,并接着在闭包中使用它。 如果尝试 check 代码,会得到这个错误: $ cargo check Checking hello v0.1.0 (file:///projects/hello)\nerror[E0382]: use of moved value: `receiver` --> src/lib.rs:26:42 |\n21 | let (sender, receiver) = mpsc::channel(); | -------- move occurs because `receiver` has type `std::sync::mpsc::Receiver`, which does not implement the `Copy` trait\n...\n25 | for id in 0..size { | ----------------- inside of this loop\n26 | workers.push(Worker::new(id, receiver)); | ^^^^^^^^ value moved here, in previous iteration of loop |\nnote: consider changing this parameter type in method `new` to borrow instead if owning the value isn't necessary --> src/lib.rs:47:33 |\n47 | fn new(id: usize, receiver: mpsc::Receiver) -> Worker { | --- in this method ^^^^^^^^^^^^^^^^^^^ this parameter takes ownership of the value\nhelp: consider moving the expression out of the loop so it is only moved once |\n25 ~ let mut value = Worker::new(id, receiver);\n26 ~ for id in 0..size {\n27 ~ workers.push(value); | For more information about this error, try `rustc --explain E0382`.\nerror: could not compile `hello` (lib) due to 1 previous error 这段代码尝试将 receiver 传递给多个 Worker 实例。这是不行的,回忆第十六章:Rust 所提供的信道实现是多 生产者 ,单 消费者 的。这意味着不能简单的克隆信道的消费端来解决问题。我们也不希望将一个消息向多个消费者发送多次;我们希望有一个消息列表和多个 worker 这样每个消息就只会处理一次。 另外,从信道队列中取出任务涉及到修改 receiver,所以这些线程需要一个能安全的共享和修改 receiver 的方式,否则可能导致竞争状态(参考第十六章)。 回忆一下第十六章讨论的线程安全智能指针,为了在多个线程间共享所有权并允许线程修改其值,需要使用 Arc>。Arc 使得多个 worker 拥有接收端,而 Mutex 则确保一次只有一个 worker 能从接收端得到任务。示例 20-18 展示了所需的修改: 文件名:src/lib.rs use std::{ sync::{mpsc, Arc, Mutex}, thread,\n};\n// --snip-- # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # struct Job;\n# impl ThreadPool { // --snip--\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let (sender, receiver) = mpsc::channel(); let receiver = Arc::new(Mutex::new(receiver)); let mut workers = Vec::with_capacity(size); for id in 0..size { workers.push(Worker::new(id, Arc::clone(&receiver))); } ThreadPool { workers, sender } } // --snip--\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# }\n} // --snip-- # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n# impl Worker { fn new(id: usize, receiver: Arc>>) -> Worker { // --snip--\n# let thread = thread::spawn(|| {\n# receiver;\n# });\n# # Worker { id, thread } }\n} 示例 20-18: 使用 Arc 和 Mutex 在 worker 间共享接收者 在 ThreadPool::new 中,将接收者放入一个 Arc 和一个 Mutex 中。对于每一个新 worker,克隆 Arc 来增加引用计数,如此这些 worker 就可以共享接收者的所有权了。 通过这些修改,代码可以编译了!我们做到了! 实现 execute 方法 最后让我们实现 ThreadPool 上的 execute 方法。同时也要修改 Job 结构体:它将不再是结构体,Job 将是一个有着 execute 接收到的闭包类型的 trait 对象的类型别名。第二十章 “类型别名用来创建类型同义词” 部分提到过,类型别名允许将长的类型变短。观察示例 20-19: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# // --snip-- type Job = Box; impl ThreadPool { // --snip--\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# } pub fn execute(&self, f: F) where F: FnOnce() + Send + 'static, { let job = Box::new(f); self.sender.send(job).unwrap(); }\n} // --snip--\n# # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n# # impl Worker {\n# fn new(id: usize, receiver: Arc>>) -> Worker {\n# let thread = thread::spawn(|| {\n# receiver;\n# });\n# # Worker { id, thread }\n# }\n# } 示例 20-19: 为存放每一个闭包的 Box 创建一个 Job 类型别名,接着在信道中发出任务 在使用 execute 得到的闭包新建 Job 实例之后,将这些任务从信道的发送端发出。这里调用 send 上的 unwrap,因为发送可能会失败,这可能发生于例如停止了所有线程执行的情况,这意味着接收端停止接收新消息了。不过目前我们无法停止线程执行;只要线程池存在它们就会一直执行。使用 unwrap 是因为我们知道失败不可能发生,即便编译器不这么认为。 不过到此事情还没有结束!在 worker 中,传递给 thread::spawn 的闭包仍然还只是 引用 了信道的接收端。相反我们需要闭包一直循环,向信道的接收端请求任务,并在得到任务时执行它们。如示例 20-20 对 Worker::new 做出修改: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.send(job).unwrap();\n# }\n# }\n# # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n# // --snip-- impl Worker { fn new(id: usize, receiver: Arc>>) -> Worker { let thread = thread::spawn(move || loop { let job = receiver.lock().unwrap().recv().unwrap(); println!(\"Worker {id} got a job; executing.\"); job(); }); Worker { id, thread } }\n} 示例 20-20: 在 worker 线程中接收并执行任务 这里,首先在 receiver 上调用了 lock 来获取互斥器,接着 unwrap 在出现任何错误时 panic。如果互斥器处于一种叫做 被污染 ( poisoned )的状态时获取锁可能会失败,这可能发生于其他线程在持有锁时 panic 了且没有释放锁。在这种情况下,调用 unwrap 使其 panic 是正确的行为。请随意将 unwrap 改为包含有意义错误信息的 expect。 如果锁定了互斥器,接着调用 recv 从信道中接收 Job。最后的 unwrap 也绕过了一些错误,这可能发生于持有信道发送端的线程停止的情况,类似于如果接收端关闭时 send 方法如何返回 Err 一样。 调用 recv 会阻塞当前线程,所以如果还没有任务,其会等待直到有可用的任务。Mutex 确保一次只有一个 Worker 线程尝试请求任务。 现在线程池处于可以运行的状态了!执行 cargo run 并发起一些请求: $ cargo run Compiling hello v0.1.0 (file:///projects/hello)\nwarning: field is never read: `workers` --> src/lib.rs:7:5 |\n7 | workers: Vec, | ^^^^^^^^^^^^^^^^^^^^ | = note: `#[warn(dead_code)]` on by default warning: field is never read: `id` --> src/lib.rs:48:5 |\n48 | id: usize, | ^^^^^^^^^ warning: field is never read: `thread` --> src/lib.rs:49:5 |\n49 | thread: thread::JoinHandle<()>, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: `hello` (lib) generated 3 warnings Finished dev [unoptimized + debuginfo] target(s) in 1.40s Running `target/debug/hello`\nWorker 0 got a job; executing.\nWorker 2 got a job; executing.\nWorker 1 got a job; executing.\nWorker 3 got a job; executing.\nWorker 0 got a job; executing.\nWorker 2 got a job; executing.\nWorker 1 got a job; executing.\nWorker 3 got a job; executing.\nWorker 0 got a job; executing.\nWorker 2 got a job; executing. 成功了!现在我们有了一个可以异步执行连接的线程池!它绝不会创建超过四个线程,所以当 server 收到大量请求时系统也不会负担过重。如果请求 /sleep ,server 也能够通过另外一个线程处理其他请求。 注意如果同时在多个浏览器窗口打开 /sleep ,它们可能会彼此间隔地加载 5 秒,因为一些浏览器出于缓存的原因会顺序执行相同请求的多个实例。这些限制并不是由于我们的 web server 造成的。 在学习了第十七章和第十八章的 while let 循环之后,你可能会好奇为何不能如此编写 worker 线程,如示例 20-21 所示: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.send(job).unwrap();\n# }\n# }\n# # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n// --snip-- impl Worker { fn new(id: usize, receiver: Arc>>) -> Worker { let thread = thread::spawn(move || { while let Ok(job) = receiver.lock().unwrap().recv() { println!(\"Worker {id} got a job; executing.\"); job(); } }); Worker { id, thread } }\n} 示例 20-21: 一个使用 while let 的 Worker::new 替代实现 这段代码可以编译和运行,但是并不会产生所期望的线程行为:一个慢请求仍然会导致其他请求等待执行。其原因有些微妙:Mutex 结构体没有公有 unlock 方法,因为锁的所有权依赖 lock 方法返回的 LockResult> 中 MutexGuard 的生命周期。这允许借用检查器在编译时确保绝不会在没有持有锁的情况下访问由 Mutex 守护的资源,不过如果没有认真的思考 MutexGuard 的生命周期的话,也可能会导致比预期更久的持有锁。 示例 20-20 中的代码使用的 let job = receiver.lock().unwrap().recv().unwrap(); 之所以可以工作是因为对于 let 来说,当 let 语句结束时任何表达式中等号右侧使用的临时值都会立即被丢弃。然而 while let(if let 和 match)直到相关的代码块结束都不会丢弃临时值。在示例 20-21 中,job() 调用期间锁一直持续,这也意味着其他的 worker 无法接受任务。","breadcrumbs":"最后的项目:构建多线程 web server » 将单线程 server 变为多线程 server » 使用线程池改善吞吐量","id":"405","title":"使用线程池改善吞吐量"},"406":{"body":"ch21-03-graceful-shutdown-and-cleanup.md commit 3e5105b52f7e8d3d95def07ffade4dcb1cfdee27 示例 20-20 中的代码如期通过使用线程池异步的响应请求。这里有一些警告说 workers、id 和 thread 字段没有直接被使用,这提醒了我们并没有清理所有的内容。当使用不那么优雅的 ctrl-c 终止主线程时,所有其他线程也会立刻停止,即便它们正处于处理请求的过程中。 现在我们要为 ThreadPool 实现 Drop trait 对线程池中的每一个线程调用 join,这样这些线程将会执行完它们的请求。接着会为 ThreadPool 实现一个告诉线程它们应该停止接收新请求并结束的方式。为了实践这些代码,修改 server 在优雅停机(graceful shutdown)之前只接受两个请求。","breadcrumbs":"最后的项目:构建多线程 web server » 优雅停机与清理 » 优雅停机与清理","id":"406","title":"优雅停机与清理"},"407":{"body":"现在开始为线程池实现 Drop。当线程池被丢弃时,应该 join 所有线程以确保它们完成其操作。示例 20-22 展示了 Drop 实现的第一次尝试;这些代码还不能够编译: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.send(job).unwrap();\n# }\n# }\n# impl Drop for ThreadPool { fn drop(&mut self) { for worker in &mut self.workers { println!(\"Shutting down worker {}\", worker.id); worker.thread.join().unwrap(); } }\n}\n# # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n# # impl Worker {\n# fn new(id: usize, receiver: Arc>>) -> Worker {\n# let thread = thread::spawn(move || loop {\n# let job = receiver.lock().unwrap().recv().unwrap();\n# # println!(\"Worker {id} got a job; executing.\");\n# # job();\n# });\n# # Worker { id, thread }\n# }\n# } 示例 20-22: 当线程池离开作用域时 join 每个线程 这里首先遍历线程池中的每个 workers。这里使用了 &mut 因为 self 本身是一个可变引用而且也需要能够修改 worker。对于每一个线程,会打印出说明信息表明此特定 worker 正在关闭,接着在 worker 线程上调用 join。如果 join 调用失败,通过 unwrap 使得 panic 并进行不优雅的关闭。 如下是尝试编译代码时得到的错误: $ cargo check Checking hello v0.1.0 (file:///projects/hello)\nerror[E0507]: cannot move out of `worker.thread` which is behind a mutable reference --> src/lib.rs:52:13 |\n52 | worker.thread.join().unwrap(); | ^^^^^^^^^^^^^ ------ `worker.thread` moved due to this method call | | | move occurs because `worker.thread` has type `JoinHandle<()>`, which does not implement the `Copy` trait |\nnote: `JoinHandle::::join` takes ownership of the receiver `self`, which moves `worker.thread` --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/thread/mod.rs:1778:17 For more information about this error, try `rustc --explain E0507`.\nerror: could not compile `hello` (lib) due to 1 previous error 这里的错误告诉我们并不能调用 join,因为我们只有每一个 worker 的可变借用,而 join 需要获取其参数的所有权。为了解决这个问题,需要一个方法将 thread 移动出拥有其所有权的 Worker 实例以便 join 可以消费这个线程。示例 17-15 中我们曾见过这么做的方法:如果 Worker 存放的是 Option,就可以在 Option 上调用 take 方法将值从 Some 成员中移动出来而对 None 成员不做处理。换句话说,正在运行的 Worker 的 thread 将是 Some 成员值,而当需要清理 worker 时,将 Some 替换为 None,这样 worker 就没有可以运行的线程了。 为此需要更新 Worker 的定义为如下: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.send(job).unwrap();\n# }\n# }\n# # impl Drop for ThreadPool {\n# fn drop(&mut self) {\n# for worker in &mut self.workers {\n# println!(\"Shutting down worker {}\", worker.id);\n# # worker.thread.join().unwrap();\n# }\n# }\n# }\n# struct Worker { id: usize, thread: Option>,\n}\n# # impl Worker {\n# fn new(id: usize, receiver: Arc>>) -> Worker {\n# let thread = thread::spawn(move || loop {\n# let job = receiver.lock().unwrap().recv().unwrap();\n# # println!(\"Worker {id} got a job; executing.\");\n# # job();\n# });\n# # Worker { id, thread }\n# }\n# } 现在依靠编译器来找出其他需要修改的地方。check 代码会得到两个错误: $ cargo check Checking hello v0.1.0 (file:///projects/hello)\nerror[E0599]: no method named `join` found for enum `Option` in the current scope --> src/lib.rs:52:27 |\n52 | worker.thread.join().unwrap(); | ^^^^ method not found in `Option>` |\nnote: the method `join` exists on the type `JoinHandle<()>` --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/thread/mod.rs:1778:5\nhelp: consider using `Option::expect` to unwrap the `JoinHandle<()>` value, panicking if the value is an `Option::None` |\n52 | worker.thread.expect(\"REASON\").join().unwrap(); | +++++++++++++++++ error[E0308]: mismatched types --> src/lib.rs:72:22 |\n72 | Worker { id, thread } | ^^^^^^ expected `Option>`, found `JoinHandle<_>` | = note: expected enum `Option>` found struct `JoinHandle<_>`\nhelp: try wrapping the expression in `Some` |\n72 | Worker { id, thread: Some(thread) } | +++++++++++++ + Some errors have detailed explanations: E0308, E0599.\nFor more information about an error, try `rustc --explain E0308`.\nerror: could not compile `hello` (lib) due to 2 previous errors 让我们修复第二个错误,它指向 Worker::new 结尾的代码;当新建 Worker 时需要将 thread 值封装进 Some。做出如下改变以修复问题: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.send(job).unwrap();\n# }\n# }\n# # impl Drop for ThreadPool {\n# fn drop(&mut self) {\n# for worker in &mut self.workers {\n# println!(\"Shutting down worker {}\", worker.id);\n# # worker.thread.join().unwrap();\n# }\n# }\n# }\n# # struct Worker {\n# id: usize,\n# thread: Option>,\n# }\n# impl Worker { fn new(id: usize, receiver: Arc>>) -> Worker { // --snip-- # let thread = thread::spawn(move || loop {\n# let job = receiver.lock().unwrap().recv().unwrap();\n# # println!(\"Worker {id} got a job; executing.\");\n# # job();\n# });\n# Worker { id, thread: Some(thread), } }\n} 第一个错误位于 Drop 实现中。之前提到过要调用 Option 上的 take 将 thread 移动出 worker。如下改变会修复问题: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.send(job).unwrap();\n# }\n# }\n# impl Drop for ThreadPool { fn drop(&mut self) { for worker in &mut self.workers { println!(\"Shutting down worker {}\", worker.id); if let Some(thread) = worker.thread.take() { thread.join().unwrap(); } } }\n}\n# # struct Worker {\n# id: usize,\n# thread: Option>,\n# }\n# # impl Worker {\n# fn new(id: usize, receiver: Arc>>) -> Worker {\n# let thread = thread::spawn(move || loop {\n# let job = receiver.lock().unwrap().recv().unwrap();\n# # println!(\"Worker {id} got a job; executing.\");\n# # job();\n# });\n# # Worker {\n# id,\n# thread: Some(thread),\n# }\n# }\n# } 如第十八章我们见过的,Option 上的 take 方法会取出 Some 而留下 None。使用 if let 解构 Some 并得到线程,接着在线程上调用 join。如果 worker 的线程已然是 None,就知道此时这个 worker 已经清理了其线程所以无需做任何操作。","breadcrumbs":"最后的项目:构建多线程 web server » 优雅停机与清理 » 为 ThreadPool 实现 Drop Trait","id":"407","title":"为 ThreadPool 实现 Drop Trait"},"408":{"body":"有了所有这些修改,代码就能编译且没有任何警告。不过也有坏消息,这些代码还不能以我们期望的方式运行。问题的关键在于 Worker 中分配的线程所运行的闭包中的逻辑:调用 join 并不会关闭线程,因为它们一直 loop 来寻找任务。如果采用这个实现来尝试丢弃 ThreadPool,则主线程会永远阻塞在等待第一个线程结束上。 为了修复这个问题,我们将修改 ThreadPool 的 drop 实现并修改 Worker 循环。 首先修改 ThreadPool 的 drop 实现在等待线程结束前显式丢弃 sender。示例 20-23 展示了 ThreadPool 显式丢弃 sender 所作的修改。我们使用了与之前处理线程时相同的 Option 和 take 技术以便能从 ThreadPool 中移动 sender: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# pub struct ThreadPool { workers: Vec, sender: Option>,\n}\n// --snip--\n# # type Job = Box;\n# impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { // --snip-- # assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# ThreadPool { workers, sender: Some(sender), } } pub fn execute(&self, f: F) where F: FnOnce() + Send + 'static, { let job = Box::new(f); self.sender.as_ref().unwrap().send(job).unwrap(); }\n} impl Drop for ThreadPool { fn drop(&mut self) { drop(self.sender.take()); for worker in &mut self.workers { println!(\"Shutting down worker {}\", worker.id); if let Some(thread) = worker.thread.take() { thread.join().unwrap(); } } }\n}\n# # struct Worker {\n# id: usize,\n# thread: Option>,\n# }\n# # impl Worker {\n# fn new(id: usize, receiver: Arc>>) -> Worker {\n# let thread = thread::spawn(move || loop {\n# let job = receiver.lock().unwrap().recv().unwrap();\n# # println!(\"Worker {id} got a job; executing.\");\n# # job();\n# });\n# # Worker {\n# id,\n# thread: Some(thread),\n# }\n# }\n# } 示例 20-23: 在 join worker 线程之前显式丢弃 sender 丢弃 sender 会关闭信道,这表明不会有更多的消息被发送。这时 worker 中的无限循环中的所有 recv 调用都会返回错误。在示例 20-24 中,我们修改 Worker 循环在这种情况下优雅地退出,这意味着当 ThreadPool 的 drop 实现调用 join 时线程会结束。 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: Option>,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool {\n# workers,\n# sender: Some(sender),\n# }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.as_ref().unwrap().send(job).unwrap();\n# }\n# }\n# # impl Drop for ThreadPool {\n# fn drop(&mut self) {\n# drop(self.sender.take());\n# # for worker in &mut self.workers {\n# println!(\"Shutting down worker {}\", worker.id);\n# # if let Some(thread) = worker.thread.take() {\n# thread.join().unwrap();\n# }\n# }\n# }\n# }\n# # struct Worker {\n# id: usize,\n# thread: Option>,\n# }\n# impl Worker { fn new(id: usize, receiver: Arc>>) -> Worker { let thread = thread::spawn(move || loop { let message = receiver.lock().unwrap().recv(); match message { Ok(job) => { println!(\"Worker {id} got a job; executing.\"); job(); } Err(_) => { println!(\"Worker {id} disconnected; shutting down.\"); break; } } }); Worker { id, thread: Some(thread), } }\n} 示例 20-24:当 recv 返回错误时显式退出循环 为了实践这些代码,如示例 20-25 所示修改 main 在优雅停机 server 之前只接受两个请求: 文件名:src/main.rs # use hello::ThreadPool;\n# use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# thread,\n# time::Duration,\n# };\n# fn main() { let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap(); let pool = ThreadPool::new(4); for stream in listener.incoming().take(2) { let stream = stream.unwrap(); pool.execute(|| { handle_connection(stream); }); } println!(\"Shutting down.\");\n}\n# # fn handle_connection(mut stream: TcpStream) {\n# let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap();\n# # let (status_line, filename) = match &request_line[..] {\n# \"GET / HTTP/1.1\" => (\"HTTP/1.1 200 OK\", \"hello.html\"),\n# \"GET /sleep HTTP/1.1\" => {\n# thread::sleep(Duration::from_secs(5));\n# (\"HTTP/1.1 200 OK\", \"hello.html\")\n# }\n# _ => (\"HTTP/1.1 404 NOT FOUND\", \"404.html\"),\n# };\n# # let contents = fs::read_to_string(filename).unwrap();\n# let length = contents.len();\n# # let response =\n# format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\");\n# # stream.write_all(response.as_bytes()).unwrap();\n# } 示例 20-25: 在处理两个请求之后通过退出循环来停止 server 你不会希望真实世界的 web server 只处理两次请求就停机了,这只是为了展示优雅停机和清理处于正常工作状态。 take 方法定义于 Iterator trait,这里限制循环最多头 2 次。ThreadPool 会在 main 的结尾离开作用域,而且还会看到 drop 实现的运行。 使用 cargo run 启动 server,并发起三个请求。第三个请求应该会失败,而终端的输出应该看起来像这样: $ cargo run Compiling hello v0.1.0 (file:///projects/hello) Finished dev [unoptimized + debuginfo] target(s) in 1.0s Running `target/debug/hello`\nWorker 0 got a job; executing.\nShutting down.\nShutting down worker 0\nWorker 3 got a job; executing.\nWorker 1 disconnected; shutting down.\nWorker 2 disconnected; shutting down.\nWorker 3 disconnected; shutting down.\nWorker 0 disconnected; shutting down.\nShutting down worker 1\nShutting down worker 2\nShutting down worker 3 可能会出现不同顺序的 worker 和信息输出。可以从信息中看到服务是如何运行的:worker 0 和 worker 3 获取了头两个请求。server 会在头第二个请求后停止接受请求,ThreadPool 的 Drop 实现甚至会在 worker 3 开始工作之前就开始执行。丢弃 sender 会断开所有 worker 的连接并让它们关闭。每个 worker 在断开时会打印出一个信息,接着线程池调用 join 来等待每一个 worker 线程结束。 这个特定的运行过程中一个有趣的地方在于:ThreadPool 丢弃 sender,而在任何线程收到消息之前,就尝试 join worker 0 了。worker 0 还没有从 recv 获得一个错误,所以主线程阻塞直到 worker 0 结束。与此同时,worker 3 接收到一个任务接着所有线程会收到一个错误。一旦 worker 0 结束,主线程就等待余下其他 worker 结束。此时它们都退出了循环并停止。 恭喜!现在我们完成了这个项目,也有了一个使用线程池异步响应请求的基础 web server。我们能对 server 执行优雅停机,它会清理线程池中的所有线程。 如下是完整的代码参考: 文件名:src/main.rs use hello::ThreadPool;\nuse std::{ fs, io::{prelude::*, BufReader}, net::{TcpListener, TcpStream}, thread, time::Duration,\n}; fn main() { let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap(); let pool = ThreadPool::new(4); for stream in listener.incoming().take(2) { let stream = stream.unwrap(); pool.execute(|| { handle_connection(stream); }); } println!(\"Shutting down.\");\n} fn handle_connection(mut stream: TcpStream) { let buf_reader = BufReader::new(&stream); let request_line = buf_reader.lines().next().unwrap().unwrap(); let (status_line, filename) = match &request_line[..] { \"GET / HTTP/1.1\" => (\"HTTP/1.1 200 OK\", \"hello.html\"), \"GET /sleep HTTP/1.1\" => { thread::sleep(Duration::from_secs(5)); (\"HTTP/1.1 200 OK\", \"hello.html\") } _ => (\"HTTP/1.1 404 NOT FOUND\", \"404.html\"), }; let contents = fs::read_to_string(filename).unwrap(); let length = contents.len(); let response = format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\"); stream.write_all(response.as_bytes()).unwrap();\n} 文件名:src/lib.rs use std::{ sync::{mpsc, Arc, Mutex}, thread,\n}; pub struct ThreadPool { workers: Vec, sender: Option>,\n} type Job = Box; impl ThreadPool { /// Create a new ThreadPool. /// /// The size is the number of threads in the pool. /// /// # Panics /// /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let (sender, receiver) = mpsc::channel(); let receiver = Arc::new(Mutex::new(receiver)); let mut workers = Vec::with_capacity(size); for id in 0..size { workers.push(Worker::new(id, Arc::clone(&receiver))); } ThreadPool { workers, sender: Some(sender), } } pub fn execute(&self, f: F) where F: FnOnce() + Send + 'static, { let job = Box::new(f); self.sender.as_ref().unwrap().send(job).unwrap(); }\n} impl Drop for ThreadPool { fn drop(&mut self) { drop(self.sender.take()); for worker in &mut self.workers { println!(\"Shutting down worker {}\", worker.id); if let Some(thread) = worker.thread.take() { thread.join().unwrap(); } } }\n} struct Worker { id: usize, thread: Option>,\n} impl Worker { fn new(id: usize, receiver: Arc>>) -> Worker { let thread = thread::spawn(move || loop { let message = receiver.lock().unwrap().recv(); match message { Ok(job) => { println!(\"Worker {id} got a job; executing.\"); job(); } Err(_) => { println!(\"Worker {id} disconnected; shutting down.\"); break; } } }); Worker { id, thread: Some(thread), } }\n} 这里还有很多可以做的事!如果你希望继续增强这个项目,如下是一些点子: 为 ThreadPool 和其公有方法增加更多文档 为库的功能增加测试 将 unwrap 调用改为更健壮的错误处理 使用 ThreadPool 进行其他不同于处理网络请求的任务 在 crates.io 上寻找一个线程池 crate 并使用它实现一个类似的 web server,将其 API 和鲁棒性与我们的实现做对比","breadcrumbs":"最后的项目:构建多线程 web server » 优雅停机与清理 » 向线程发送信号使其停止接收任务","id":"408","title":"向线程发送信号使其停止接收任务"},"409":{"body":"好极了!你结束了本书的学习!由衷感谢你同我们一道加入这次 Rust 之旅。现在你已经准备好出发并实现自己的 Rust 项目并帮助他人了。请不要忘记我们的社区,这里有其他 Rustaceans 正乐于帮助你迎接 Rust 之路上的任何挑战。","breadcrumbs":"最后的项目:构建多线程 web server » 优雅停机与清理 » 总结","id":"409","title":"总结"},"41":{"body":"让我们开始使用 rand 来生成一个猜数字随机数。下一步是更新 src/main.rs ,如示例 2-3 所示。 文件名:src/main.rs use std::io;\nuse rand::Rng; fn main() { println!(\"Guess the number!\"); let secret_number = rand::thread_rng().gen_range(1..=100); println!(\"The secret number is: {secret_number}\"); println!(\"Please input your guess.\"); let mut guess = String::new(); io::stdin() .read_line(&mut guess) .expect(\"Failed to read line\"); println!(\"You guessed: {guess}\");\n} 示例 2-3:添加生成随机数的代码 首先,我们新增了一行 use rand::Rng;。Rng 是一个 trait,它定义了随机数生成器应实现的方法,想使用这些方法的话,此 trait 必须在作用域中。第十章会详细介绍 trait。 接下来,我们在中间还新增加了两行。第一行调用了 rand::thread_rng 函数提供实际使用的随机数生成器:它位于当前执行线程的本地环境中,并从操作系统获取 seed。接着调用随机数生成器的 gen_range 方法。这个方法由 use rand::Rng 语句引入到作用域的 Rng trait 定义。gen_range 方法获取一个范围表达式(range expression)作为参数,并生成一个在此范围之间的随机数。这里使用的这类范围表达式使用了 start..=end 这样的形式,也就是说包含了上下端点,所以需要指定 1..=100 来请求一个 1 和 100 之间的数。 注意:你不可能凭空就知道应该 use 哪个 trait 以及该从 crate 中调用哪个方法,因此每个 crate 有使用说明文档。Cargo 有一个很棒的功能是:运行 cargo doc --open 命令来构建所有本地依赖提供的文档,并在浏览器中打开。例如,假设你对 rand crate 中的其他功能感兴趣,你可以运行 cargo doc --open 并点击左侧导航栏中的 rand。 新增加的第二行代码打印出了秘密数字。这在开发程序时很有用,因为可以测试它,不过在最终版本中会删掉它。如果游戏一开始就打印出结果就没什么可玩的了! 尝试运行程序几次: $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 2.53s Running `target/debug/guessing_game`\nGuess the number!\nThe secret number is: 7\nPlease input your guess.\n4\nYou guessed: 4 $ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.02s Running `target/debug/guessing_game`\nGuess the number!\nThe secret number is: 83\nPlease input your guess.\n5\nYou guessed: 5 你应该能得到不同的随机数,同时它们应该都是在 1 和 100 之间的。干得漂亮!","breadcrumbs":"写个猜数字游戏 » 生成一个随机数","id":"41","title":"生成一个随机数"},"410":{"body":"appendix-00.md commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f 附录部分包含一些在你的 Rust 之旅中可能用到的参考资料。","breadcrumbs":"附录 » 附录","id":"410","title":"附录"},"411":{"body":"appendix-01-keywords.md commit efbafdba3618487fbc9305318fcab9775132ac15 下面的列表包含 Rust 中正在使用或者以后会用到的关键字。因此,这些关键字不能被用作标识符(除了 “ 原始标识符 ” 部分介绍的原始标识符),这包括函数、变量、参数、结构体字段、模块、crate、常量、宏、静态值、属性、类型、trait 或生命周期 的名字。","breadcrumbs":"附录 » A - 关键字 » 附录 A:关键字","id":"411","title":"附录 A:关键字"},"412":{"body":"如下关键字目前有对应其描述的功能。 as - 强制类型转换,消除特定包含项的 trait 的歧义,或者对 use 语句中的项重命名 async - 返回一个 Future 而不是阻塞当前线程 await - 暂停执行直到 Future 的结果就绪 break - 立刻退出循环 const - 定义常量或不变裸指针(constant raw pointer) continue - 继续进入下一次循环迭代 crate - 在模块路径中,代指 crate root dyn - 动态分发 trait 对象 else - 作为 if 和 if let 控制流结构的 fallback enum - 定义一个枚举 extern - 链接一个外部函数或变量 false - 布尔字面值 false fn - 定义一个函数或 函数指针类型 ( function pointer type ) for - 遍历一个迭代器或实现一个 trait 或者指定一个更高级的生命周期 if - 基于条件表达式的结果分支 impl - 实现自有或 trait 功能 in - for 循环语法的一部分 let - 绑定一个变量 loop - 无条件循环 match - 模式匹配 mod - 定义一个模块 move - 使闭包获取其所捕获项的所有权 mut - 表示引用、裸指针或模式绑定的可变性 pub - 表示结构体字段、impl 块或模块的公有可见性 ref - 通过引用绑定 return - 从函数中返回 Self - 定义或实现 trait 的类型的类型别名 self - 表示方法本身或当前模块 static - 表示全局变量或在整个程序执行期间保持其生命周期 struct - 定义一个结构体 super - 表示当前模块的父模块 trait - 定义一个 trait true - 布尔字面值 true type - 定义一个类型别名或关联类型 union - 定义一个 union 并且是 union 声明中唯一用到的关键字 unsafe - 表示不安全的代码、函数、trait 或实现 use - 引入外部空间的符号 where - 表示一个约束类型的从句 while - 基于一个表达式的结果判断是否进行循环","breadcrumbs":"附录 » A - 关键字 » 目前正在使用的关键字","id":"412","title":"目前正在使用的关键字"},"413":{"body":"如下关键字没有任何功能,不过由 Rust 保留以备将来的应用。 abstract become box do final macro override priv try typeof unsized virtual yield","breadcrumbs":"附录 » A - 关键字 » 保留做将来使用的关键字","id":"413","title":"保留做将来使用的关键字"},"414":{"body":"原始标识符(Raw identifiers)允许你使用通常不能使用的关键字,其带有 r# 前缀。 例如,match 是关键字。如果尝试编译如下使用 match 作为名字的函数: fn match(needle: &str, haystack: &str) -> bool { haystack.contains(needle)\n} 会得到这个错误: error: expected identifier, found keyword `match` --> src/main.rs:4:4 |\n4 | fn match(needle: &str, haystack: &str) -> bool { | ^^^^^ expected identifier, found keyword 该错误表示你不能将关键字 match 用作函数标识符。你可以使用原始标识符将 match 作为函数名称使用: 文件名:src/main.rs fn r#match(needle: &str, haystack: &str) -> bool { haystack.contains(needle)\n} fn main() { assert!(r#match(\"foo\", \"foobar\"));\n} 此代码编译没有任何错误。注意 r# 前缀需同时用于函数名定义和 main 函数中的调用。 原始标识符允许使用你选择的任何单词作为标识符,即使该单词恰好是保留关键字。这给予了我们更大的自由来选择名字,这样与其他语言交互式就不用考虑到关键字问题,在要交互的语言中这个名字不是关键字。此外,原始标识符允许你使用以不同于你的 crate 使用的 Rust 版本编写的库。比如,try 在 2015 edition 中不是关键字,而在 2018 edition 则是。所以如果用 2015 edition 编写的库中带有 try 函数,在 2018 edition 中调用时就需要使用原始标识符语法,在这里是 r#try。有关版本的更多信息,请参见 附录 E 。","breadcrumbs":"附录 » A - 关键字 » 原始标识符","id":"414","title":"原始标识符"},"415":{"body":"appendix-02-operators.md commit 396fdb69de7fb18f24b15c7ad13491b1c1fa7231 该附录包含了 Rust 语法的词汇表,包括运算符以及其他的符号,这些符号单独出现或出现在路径、泛型、trait bounds、宏、属性、注释、元组以及大括号上下文中。","breadcrumbs":"附录 » B - 运算符与符号 » 附录 B:运算符与符号","id":"415","title":"附录 B:运算符与符号"},"416":{"body":"表 B-1 包含了 Rust 中的运算符、运算符如何出现在上下文中的示例、简短解释以及该运算符是否可重载。如果一个运算符是可重载的,则该运算符上用于重载的相关 trait 也会列出。 表 B-1: 运算符 运算符 示例 解释 是否可重载 ! ident!(...), ident!{...}, ident![...] 宏展开 ! !expr 按位非或逻辑非 Not != expr != expr 不等比较 PartialEq % expr % expr 算术取余 Rem %= var %= expr 算术取余与赋值 RemAssign & &expr, &mut expr 借用 & &type, &mut type, &'a type, &'a mut type 借用指针类型 & expr & expr 按位与 BitAnd &= var &= expr 按位与及赋值 BitAndAssign && expr && expr 短路(Short-circuiting)逻辑与 * expr * expr 算术乘法 Mul *= var *= expr 算术乘法与赋值 MulAssign * *expr 解引用 Deref * *const type, *mut type 裸指针 + trait + trait, 'a + trait 复合类型限制 + expr + expr 算术加法 Add += var += expr 算术加法与赋值 AddAssign , expr, expr 参数以及元素分隔符 - - expr 算术取负 Neg - expr - expr 算术减法 Sub -= var -= expr 算术减法与赋值 SubAssign -> fn(...) -> type, |...| -> type 函数与闭包,返回类型 . expr.ident 成员访问 .. .., expr.., ..expr, expr..expr 右开区间范围 PartialOrd ..= ..=expr, expr..=expr 右闭区间范围模式 PartialOrd .. ..expr 结构体更新语法 .. variant(x, ..), struct_type { x, .. } “与剩余部分” 的模式绑定 ... expr...expr (Deprecated,请使用 ..=)在模式中:闭区间范围模式 / expr / expr 算术除法 Div /= var /= expr 算术除法与赋值 DivAssign : pat: type, ident: type 约束 : ident: expr 结构体字段初始化 : 'a: loop {...} 循环标志 ; expr; 语句和语句结束符 ; [...; len] 固定大小数组语法的部分 << expr << expr 左移 Shl <<= var <<= expr 左移与赋值 ShlAssign < expr < expr 小于比较 PartialOrd <= expr <= expr 小于等于比较 PartialOrd = var = expr, ident = type 赋值/等值 == expr == expr 等于比较 PartialEq => pat => expr 匹配准备语法的部分 > expr > expr 大于比较 PartialOrd >= expr >= expr 大于等于比较 PartialOrd >> expr >> expr 右移 Shr >>= var >>= expr 右移与赋值 ShrAssign @ ident @ pat 模式绑定 ^ expr ^ expr 按位异或 BitXor ^= var ^= expr 按位异或与赋值 BitXorAssign | pat | pat 模式选择 | expr | expr 按位或 BitOr |= var |= expr 按位或与赋值 BitOrAssign || expr || expr 短路(Short-circuiting)逻辑或 ? expr? 错误传播","breadcrumbs":"附录 » B - 运算符与符号 » 运算符","id":"416","title":"运算符"},"417":{"body":"下面的列表中包含了所有和运算符不一样功能的符号;也就是说,它们并不像函数调用或方法调用一样表现。 表 B-2 展示了以其自身出现以及出现在合法其他各个地方的符号。 表 B-2:独立语法 符号 解释 'ident 命名生命周期或循环标签 ...u8, ...i32, ...f64, ...usize 等 指定类型的数值常量 \"...\" 字符串常量 r\"...\", r#\"...\"#, r##\"...\"##, etc. 原始字符串字面值,未处理的转义字符 b\"...\" 字节字符串字面值; 构造一个字节数组类型而非字符串 br\"...\", br#\"...\"#, br##\"...\"## 等 原始字节字符串字面值,原始和字节字符串字面值的结合 '...' 字符字面值 b'...' ASCII 码字节字面值 |...| expr 闭包 ! 离散函数的总是为空的类型 _ “忽略” 模式绑定;也用于增强整型字面值的可读性 表 B-3 展示了出现在从模块结构到项的路径上下文中的符号 表 B-3:路径相关语法 符号 解释 ident::ident 命名空间路径 ::path 与 crate 根相对的路径(如一个显式绝对路径) self::path 与当前模块相对的路径(如一个显式相对路径) super::path 与父模块相对的路径 type::ident, ::ident 关联常量、函数以及类型 ::... 不可以被直接命名的关联项类型(如 <&T>::...,<[T]>::...,等) trait::method(...) 通过命名定义的 trait 来消除方法调用的二义性 type::method(...) 通过命名定义的类型来消除方法调用的二义性 ::method(...) 通过命名 trait 和类型来消除方法调用的二义性 表 B-4 展示了出现在泛型类型参数上下文中的符号。 表 B-4:泛型 符号 解释 path<...> 为一个类型中的泛型指定具体参数(如 Vec) path::<...>, method::<...> 为一个泛型、函数或表达式中的方法指定具体参数,通常指 turbofish(如 \"42\".parse::()) fn ident<...> ... 泛型函数定义 struct ident<...> ... 泛型结构体定义 enum ident<...> ... 泛型枚举定义 impl<...> ... 定义泛型实现 for<...> type 高级生命周期限制 type 泛型,其一个或多个相关类型必须被指定为特定类型(如 Iterator) 表 B-5 展示了出现在使用 trait bounds 约束泛型参数上下文中的符号。 表 B-5: Trait Bound 约束 符号 解释 T: U 泛型参数 T 约束于实现了 U 的类型 T: 'a 泛型 T 的生命周期必须长于 'a(意味着该类型不能传递包含生命周期短于 'a 的任何引用) T: 'static 泛型 T 不包含除 'static 之外的借用引用 'b: 'a 泛型 'b 生命周期必须长于泛型 'a T: ?Sized 使用一个不定大小的泛型类型 'a + trait, trait + trait 复合类型限制 表 B-6 展示了在调用或定义宏以及在其上指定属性时的上下文中出现的符号。 表 B-6: 宏与属性 符号 解释 #[meta] 外部属性 #![meta] 内部属性 $ident 宏替换 $ident:kind 宏捕获 $(…)… 宏重复 ident!(...), ident!{...}, ident![...] 宏调用 表 B-7 展示了写注释的符号。 表 B-7: 注释 符号 注释 // 行注释 //! 内部行文档注释 /// 外部行文档注释 /*...*/ 块注释 /*!...*/ 内部块文档注释 /**...*/ 外部块文档注释 表 B-8 展示了出现在使用元组时上下文中的符号。 表 B-8: 元组 符号 解释 () 空元组(亦称单元),即是字面值也是类型 (expr) 括号表达式 (expr,) 单一元素元组表达式 (type,) 单一元素元组类型 (expr, ...) 元组表达式 (type, ...) 元组类型 expr(expr, ...) 函数调用表达式;也用于初始化元组结构体 struct 以及元组枚举 enum 变体 expr.0, expr.1, etc. 元组索引 表 B-9 展示了使用大括号的上下文。 表 B-9: 大括号 符号 解释 {...} 块表达式 Type {...} struct 字面值 表 B-10 展示了使用方括号的上下文。 表 B-10: 方括号 符号 解释 [...] 数组 [expr; len] 复制了 len个 expr的数组 [type; len] 包含 len个 type 类型的数组 expr[expr] 集合索引。重载(Index, IndexMut) expr[..], expr[a..], expr[..b], expr[a..b] 集合索引,使用 Range,RangeFrom,RangeTo 或 RangeFull 作为索引来代替集合 slice","breadcrumbs":"附录 » B - 运算符与符号 » 非运算符符号","id":"417","title":"非运算符符号"},"418":{"body":"appendix-03-derivable-traits.md commit c07dddac692848ade6c2112c8e15a7087fbbec45 在本书的各个部分中,我们讨论了可应用于结构体和枚举定义的 derive 属性。derive 属性会在使用 derive 语法标记的类型上生成对应 trait 的默认实现的代码。 在本附录中提供了标准库中所有可以使用 derive 的 trait 的参考。这些部分涉及到: 该 trait 将会派生什么样的操作符和方法 由 derive 提供什么样的 trait 实现 由什么来实现类型的 trait 是否允许实现该 trait 的条件 需要 trait 操作的例子 如果你希望不同于 derive 属性所提供的行为,请查阅 标准库文档 中每个 trait 的细节以了解如何手动实现它们。 这里列出的 trait 是仅有的在标准库中定义且能通过 derive 在类型上实现。标准库中定义的其它 trait 不能通过 derive 在类型上实现。这些 trait 不存在有意义的默认行为,所以由你负责以合理的方式实现它们。 一个无法被派生的 trait 的例子是为终端用户处理格式化的 Display 。你应该时常考虑使用合适的方法来为终端用户显示一个类型。终端用户应该看到类型的什么部分?他们会找出相关部分吗?对他们来说最相关的数据格式是什么样的?Rust 编译器没有这样的洞察力,因此无法为你提供合适的默认行为。 本附录所提供的可派生 trait 列表并不全面:库可以为其自己的 trait 实现 derive,可以使用 derive 的 trait 列表事实上是无限的。实现 derive 涉及到过程宏的应用,这在第二十章的 “宏” 有介绍。","breadcrumbs":"附录 » C - 可派生的 trait » 附录 C:可派生的 trait","id":"418","title":"附录 C:可派生的 trait"},"419":{"body":"Debug trait 用于开启格式化字符串中的调试格式,其通过在 {} 占位符中增加 :? 表明。 Debug trait 允许以调试目的来打印一个类型的实例,所以使用该类型的程序员可以在程序执行的特定时间点观察其实例。 例如,在使用 assert_eq! 宏时,Debug trait 是必须的。如果等式断言失败,这个宏就把给定实例的值作为参数打印出来,如此程序员可以看到两个实例为什么不相等。","breadcrumbs":"附录 » C - 可派生的 trait » 用于程序员输出的 Debug","id":"419","title":"用于程序员输出的 Debug"},"42":{"body":"现在有了用户输入和一个随机数,我们可以比较它们。这个步骤如示例 2-4 所示。注意这段代码还不能通过编译,我们稍后会解释。 文件名:src/main.rs use rand::Rng;\nuse std::cmp::Ordering;\nuse std::io; fn main() { // --snip--\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\"); println!(\"You guessed: {guess}\"); match guess.cmp(&secret_number) { Ordering::Less => println!(\"Too small!\"), Ordering::Greater => println!(\"Too big!\"), Ordering::Equal => println!(\"You win!\"), }\n} 示例 2-4:处理比较两个数字可能的返回值 首先我们增加了另一个 use 声明,从标准库引入了一个叫做 std::cmp::Ordering 的类型到作用域中。 Ordering 也是一个枚举,不过它的成员是 Less、Greater 和 Equal。这是比较两个值时可能出现的三种结果。 接着,底部的五行新代码使用了 Ordering 类型,cmp 方法用来比较两个值并可以在任何可比较的值上调用。它获取一个被比较值的引用:这里是把 guess 与 secret_number 做比较。然后它会返回一个刚才通过 use 引入作用域的 Ordering 枚举的成员。使用一个 match 表达式,根据对 guess 和 secret_number 调用 cmp 返回的 Ordering 成员来决定接下来做什么。 一个 match 表达式由 分支(arms) 构成。一个分支包含一个 模式 ( pattern )和表达式开头的值与分支模式相匹配时应该执行的代码。Rust 获取提供给 match 的值并挨个检查每个分支的模式。match 结构和模式是 Rust 中强大的功能,它体现了代码可能遇到的多种情形,并帮助你确保没有遗漏处理。这些功能将分别在第六章和第十九章详细介绍。 让我们看看使用 match 表达式的例子。假设用户猜了 50,这时随机生成的秘密数字是 38。 比较 50 与 38 时,因为 50 比 38 要大,cmp 方法会返回 Ordering::Greater。Ordering::Greater 是 match 表达式得到的值。它检查第一个分支的模式,Ordering::Less 与 Ordering::Greater并不匹配,所以它忽略了这个分支的代码并来到下一个分支。下一个分支的模式是 Ordering::Greater, 正确 匹配!这个分支关联的代码被执行,在屏幕打印出 Too big!。match 表达式会在第一次成功匹配后终止,因为该场景下没有检查最后一个分支的必要。 然而,示例 2-4 的代码目前并不能编译,可以尝试一下: $ cargo build Downloading crates ... Downloaded rand_core v0.6.2 Downloaded getrandom v0.2.2 Downloaded rand_chacha v0.3.0 Downloaded ppv-lite86 v0.2.10 Downloaded libc v0.2.86 Compiling libc v0.2.86 Compiling getrandom v0.2.2 Compiling cfg-if v1.0.0 Compiling ppv-lite86 v0.2.10 Compiling rand_core v0.6.2 Compiling rand_chacha v0.3.0 Compiling rand v0.8.5 Compiling guessing_game v0.1.0 (file:///projects/guessing_game)\nerror[E0308]: mismatched types --> src/main.rs:22:21 |\n22 | match guess.cmp(&secret_number) { | --- ^^^^^^^^^^^^^^ expected `&String`, found `&{integer}` | | | arguments to this method are incorrect | = note: expected reference `&String` found reference `&{integer}`\nnote: method defined here --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/cmp.rs:839:8 For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `guessing_game` (bin \"guessing_game\") due to 1 previous error 错误的核心表明这里有 不匹配的类型 ( mismatched types )。Rust 有一个静态强类型系统,同时也有类型推断。当我们写出 let guess = String::new() 时,Rust 推断出 guess 应该是 String 类型,并不需要我们写出类型。另一方面,secret_number,是数字类型。几个数字类型拥有 1 到 100 之间的值:32 位数字 i32;32 位无符号数字 u32;64 位数字 i64 等等。Rust 默认使用 i32,所以它是 secret_number 的类型,除非增加类型信息,或任何能让 Rust 推断出不同数值类型的信息。这里错误的原因在于 Rust 不会比较字符串类型和数字类型。 所以我们必须把从输入中读取到的 String 转换为一个真正的数字类型,才好与秘密数字进行比较。这可以通过在 main 函数体中增加如下代码来实现: 文件名:src/main.rs # use rand::Rng;\n# use std::cmp::Ordering;\n# use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # println!(\"Please input your guess.\");\n# // --snip-- let mut guess = String::new(); io::stdin() .read_line(&mut guess) .expect(\"Failed to read line\"); let guess: u32 = guess.trim().parse().expect(\"Please type a number!\"); println!(\"You guessed: {guess}\"); match guess.cmp(&secret_number) { Ordering::Less => println!(\"Too small!\"), Ordering::Greater => println!(\"Too big!\"), Ordering::Equal => println!(\"You win!\"), }\n# } 这行新代码是: let guess: u32 = guess.trim().parse().expect(\"Please type a number!\"); 这里创建了一个叫做 guess 的变量。不过等等,不是已经有了一个叫做 guess 的变量了吗?确实如此,不过 Rust 允许用一个新值来 隐藏 ( Shadowing ) guess 之前的值。这个功能常用在需要转换值类型之类的场景。它允许我们复用 guess 变量的名字,而不是被迫创建两个不同变量,诸如 guess_str 和 guess 之类。 第三章 会介绍 shadowing 的更多细节,现在只需知道这个功能经常用于将一个类型的值转换为另一个类型的值。 我们将这个新变量绑定到 guess.trim().parse() 表达式上。表达式中的 guess 指的是包含输入的字符串类型 guess 变量。String 实例的 trim 方法会去除字符串开头和结尾的空白字符,我们必须执行此方法才能将字符串与 u32 比较,因为 u32 只能包含数值型数据。用户必须输入 enter 键才能让 read_line 返回并输入他们的猜想,这将会在字符串中增加一个换行(newline)符。例如,用户输入 5 并按下 enter(在 Windows 上,按下 enter 键会得到一个回车符和一个换行符,\\r\\n),guess 看起来像这样:5\\n 或者 5\\r\\n。\\n 代表 “换行”,回车键;\\r 代表 “回车”,回车键。trim 方法会消除 \\n 或者 \\r\\n,只留下 5。 字符串的 parse 方法 将字符串转换成其他类型。这里用它来把字符串转换为数值。我们需要告诉 Rust 具体的数字类型,这里通过 let guess: u32 指定。guess 后面的冒号(:)告诉 Rust 我们指定了变量的类型。Rust 有一些内建的数字类型;u32 是一个无符号的 32 位整型。对于不大的正整数来说,它是不错的默认类型, 第三章 还会讲到其他数字类型。 另外,程序中的 u32 注解以及与 secret_number 的比较,意味着 Rust 会推断出 secret_number 也是 u32 类型。现在可以使用相同类型比较两个值了! parse 方法只有在字符逻辑上可以转换为数字的时候才能工作所以非常容易出错。例如,字符串中包含 A👍%,就无法将其转换为一个数字。因此,parse 方法返回一个 Result 类型。像之前 “使用 Result 类型来处理潜在的错误” 讨论的 read_line 方法那样,再次按部就班的用 expect 方法处理即可。如果 parse 不能从字符串生成一个数字,返回一个 Result 的 Err 成员时,expect 会使游戏崩溃并打印附带的信息。如果 parse 成功地将字符串转换为一个数字,它会返回 Result 的 Ok 成员,然后 expect 会返回 Ok 值中的数字。 现在让我们运行程序! $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 0.43s Running `target/debug/guessing_game`\nGuess the number!\nThe secret number is: 58\nPlease input your guess. 76\nYou guessed: 76\nToo big! 漂亮!即便是在猜测之前添加了空格,程序依然能判断出用户猜测了 76。多运行程序几次,输入不同的数字来检验不同的行为:猜一个正确的数字,猜一个过大的数字和猜一个过小的数字。 现在游戏已经大体上能玩了,不过用户只能猜一次。增加一个循环来改变它吧!","breadcrumbs":"写个猜数字游戏 » 比较猜测的数字和秘密数字","id":"42","title":"比较猜测的数字和秘密数字"},"420":{"body":"PartialEq trait 可以比较一个类型的实例以检查是否相等,并开启了 == 和 != 运算符的功能。 派生的 PartialEq 实现了 eq 方法。当 PartialEq 在结构体上派生时,只有 所有 的字段都相等时两个实例才相等,同时只要有任何字段不相等则两个实例就不相等。当在枚举上派生时,每一个成员都和其自身相等,且和其他成员都不相等。 例如,当使用 assert_eq! 宏时,需要比较一个类型的两个实例是否相等,则 PartialEq trait 是必须的。 Eq trait 没有方法。其作用是表明每一个被标记类型的值等于其自身。Eq trait 只能应用于那些实现了 PartialEq 的类型,但并非所有实现了 PartialEq 的类型都可以实现 Eq。浮点类型就是一个例子:浮点数的实现表明两个非数字(NaN,not-a-number)值是互不相等的。 例如,对于一个 HashMap 中的 key 来说, Eq 是必须的,这样 HashMap 就可以知道两个 key 是否一样了。","breadcrumbs":"附录 » C - 可派生的 trait » 等值比较的 PartialEq 和 Eq","id":"420","title":"等值比较的 PartialEq 和 Eq"},"421":{"body":"PartialOrd trait 可以基于排序的目的而比较一个类型的实例。实现了 PartialOrd 的类型可以使用 <、 >、<= 和 >= 操作符。但只能在同时实现了 PartialEq 的类型上使用 PartialOrd。 派生 PartialOrd 实现了 partial_cmp 方法,其返回一个 Option ,但当给定值无法产生顺序时将返回 None。尽管大多数类型的值都可以比较,但一个无法产生顺序的例子是:浮点类型的非数字值。当在浮点数上调用 partial_cmp 时,NaN 的浮点数将返回 None。 当在结构体上派生时,PartialOrd 按照结构体定义中字段出现的顺序,依次比较每个字段的值,以此来比较两个实例。当在枚举上派生时,认为在枚举定义中声明较早的枚举变体小于其后的变体。 例如,对于来自于 rand crate 中的 gen_range 方法来说,当在一个范围表达式指定的范围内生成一个随机值时,PartialOrd trait 是必须的。 Ord trait 也让你明白在一个带注解类型上的任意两个值存在有效顺序。Ord trait 实现了 cmp 方法,它返回一个 Ordering 而不是 Option,因为总存在一个合法的顺序。只可以在实现了 PartialOrd 和 Eq(Eq 依赖 PartialEq)的类型上使用 Ord trait。当在结构体或枚举上派生时, cmp 和以 PartialOrd 派生实现的 partial_cmp 表现一致。 例如,当在 BTreeSet(一种基于有序值存储数据的数据结构)上存值时,Ord 是必须的。","breadcrumbs":"附录 » C - 可派生的 trait » 次序比较的 PartialOrd 和 Ord","id":"421","title":"次序比较的 PartialOrd 和 Ord"},"422":{"body":"Clone trait 可以明确地创建一个值的深拷贝(deep copy),复制过程可能包含任意代码的执行以及堆上数据的复制。查阅第四章 “变量与数据交互的方式(二):克隆” 以获取有关 Clone 的更多信息。 派生 Clone 实现了 clone 方法,其为整个的类型实现时,在类型的每一部分上调用了 clone 方法。这意味着类型中所有字段或值也必须实现了 Clone,这样才能够派生 Clone 。 例如,当在一个切片(slice)上调用 to_vec 方法时,Clone 是必须的。切片并不拥有其包含的实例,但是从 to_vec 中返回的 vector 需要拥有其实例,因此,to_vec 在每个元素上调用 clone。因此,存储在切片中的类型必须实现 Clone。 Copy trait 允许你通过只拷贝存储在栈上的位来复制值而不需要额外的代码。查阅第四章 “只在栈上的数据:拷贝” 的部分来获取有关 Copy 的更多信息。 Copy trait 并未定义任何方法来阻止编程人员重写这些方法或违反不需要执行额外代码的假设。尽管如此,所有的编程人员可以假设复制(copy)一个值非常快。 可以在类型内部全部实现 Copy trait 的任意类型上派生 Copy。一个实现了 Copy 的类型必须也实现了 Clone,因为一个实现了 Copy 的类型也简单地实现了 Clone,其执行和 Copy 相同的任务。 Copy trait 很少使用;实现 Copy 的类型是可以优化的,这意味着你无需调用 clone,这让代码更简洁。 任何使用 Copy 的代码都可以通过 Clone 实现,但代码可能会稍慢,或者不得不在代码中的许多位置上使用 clone。","breadcrumbs":"附录 » C - 可派生的 trait » 复制值的 Clone 和 Copy","id":"422","title":"复制值的 Clone 和 Copy"},"423":{"body":"Hash trait 可以实例化一个任意大小的类型,并且能够用哈希(hash)函数将该实例映射到一个固定大小的值上。派生 Hash 实现了 hash 方法。hash 方法的派生实现结合了在类型的每部分调用 hash 的结果,这意味着所有的字段或值也必须实现了 Hash,这样才能够派生 Hash。 例如,在 HashMap 上存储数据,存放 key 的时候,Hash 是必须的。","breadcrumbs":"附录 » C - 可派生的 trait » 固定大小的值到值映射的 Hash","id":"423","title":"固定大小的值到值映射的 Hash"},"424":{"body":"Default trait 使你创建一个类型的默认值。派生 Default 实现了 default 函数。default 函数的派生实现调用了类型每部分的 default 函数,这意味着类型中所有的字段或值也必须实现了 Default,这样才能够派生 Default 。 Default::default 函数通常结合结构体更新语法一起使用,这在第五章的 “使用结构体更新语法从其他实例中创建实例” 部分有讨论。可以自定义一个结构体的一小部分字段而剩余字段则使用 ..Default::default() 设置为默认值。 例如,当你在 Option 实例上使用 unwrap_or_default 方法时,Default trait 是必须的。如果 Option 是 None的话,unwrap_or_default 方法将返回存储在 Option 中 T 类型的 Default::default 的结果。","breadcrumbs":"附录 » C - 可派生的 trait » 默认值的 Default","id":"424","title":"默认值的 Default"},"425":{"body":"appendix-04-useful-development-tools.md commit 5057f157cd0b35bc7d0dc0af6ef622fa4c480996 本附录,我们将讨论 Rust 项目提供的用于开发 Rust 代码的工具。","breadcrumbs":"附录 » D - 实用开发工具 » 附录 D:实用开发工具","id":"425","title":"附录 D:实用开发工具"},"426":{"body":"rustfmt 工具根据社区代码风格格式化代码。很多项目使用 rustfmt 来避免编写 Rust 风格的争论:所有人都用这个工具格式化代码! 安装 rustfmt: $ rustup component add rustfmt 这会提供 rustfmt 和 cargo-fmt,类似于 Rust 同时安装 rustc 和 cargo。为了格式化整个 Cargo 项目: $ cargo fmt 运行此命令会格式化当前 crate 中所有的 Rust 代码。这应该只会改变代码风格,而不是代码语义。请查看 该文档 了解 rustfmt 的更多信息。","breadcrumbs":"附录 » D - 实用开发工具 » 通过 rustfmt 自动格式化","id":"426","title":"通过 rustfmt 自动格式化"},"427":{"body":"如果你编写过 Rust 代码,那么你可能见过那些有很明显修复方式的编译器警告。例如,考虑如下代码: 文件名:src/main.rs fn do_something() {} fn main() { for i in 0..100 { do_something(); }\n} 这里调用了 do_something 函数 100 次,不过从未在 for 循环体中使用变量 i。Rust 会警告说: $ cargo build Compiling myprogram v0.1.0 (file:///projects/myprogram)\nwarning: unused variable: `i` --> src/main.rs:4:9 |\n4 | for i in 0..100 { | ^ help: consider using `_i` instead | = note: #[warn(unused_variables)] on by default Finished dev [unoptimized + debuginfo] target(s) in 0.50s 警告中建议使用 _i 名称:下划线表明该变量有意不使用。我们可以通过 cargo fix 命令使用 rustfix 工具来自动采用该建议: $ cargo fix Checking myprogram v0.1.0 (file:///projects/myprogram) Fixing src/main.rs (1 fix) Finished dev [unoptimized + debuginfo] target(s) in 0.59s 如果再次查看 src/main.rs ,会发现 cargo fix 修改了代码: 文件名:src/main.rs fn do_something() {} fn main() { for _i in 0..100 { do_something(); }\n} 现在 for 循环变量变为 _i,警告也不再出现。 cargo fix 命令可以用于在不同 Rust 版本间迁移代码。版本在附录 E 中介绍。","breadcrumbs":"附录 » D - 实用开发工具 » 通过 rustfix 修复代码","id":"427","title":"通过 rustfix 修复代码"},"428":{"body":"clippy 工具是一系列 lint 的集合,用于捕捉常见错误和改进 Rust 代码。 安装 clippy: $ rustup component add clippy 对任何 Cargo 项目运行 clippy 的 lint: $ cargo clippy 例如,如果程序使用了如 pi 这样数学常数的近似值,如下: 文件名:src/main.rs fn main() { let x = 3.1415; let r = 8.0; println!(\"the area of the circle is {}\", x * r * r);\n} 在此项目上运行 cargo clippy 会导致这个错误: error: approximate value of `f{32, 64}::consts::PI` found --> src/main.rs:2:13 |\n2 | let x = 3.1415; | ^^^^^^ | = note: `#[deny(clippy::approx_constant)]` on by default = help: consider using the constant directly = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#approx_constant 这告诉我们 Rust 定义了更为精确的常量,而如果使用了这些常量程序将更加准确。如下代码就不会导致 clippy 产生任何错误或警告: 文件名:src/main.rs fn main() { let x = std::f64::consts::PI; let r = 8.0; println!(\"the area of the circle is {}\", x * r * r);\n} 请查看 其文档 来了解 clippy 的更多信息。","breadcrumbs":"附录 » D - 实用开发工具 » 通过 clippy 提供更多 lint 功能","id":"428","title":"通过 clippy 提供更多 lint 功能"},"429":{"body":"为了帮助 IDE 集成,Rust 社区建议使用 rust-analyzer 。这个工具是一组以编译器为中心的实用程序,它实现了 Language Server Protocol (一个 IDE 与编程语言之间的通信规范)。rust-analyzer 可以用于不同的客户端,比如 Visual Studio Code 的 Rust analyzer 插件 。 访问 rust-analyzer 项目的 主页 来了解如何安装它,然后为你的 IDE 安装 language server 支持。如此你的 IDE 便会获得如自动补全、跳转到定义和 inline error 之类的功能。","breadcrumbs":"附录 » D - 实用开发工具 » 使用 rust-analyzer 的 IDE 集成","id":"429","title":"使用 rust-analyzer 的 IDE 集成"},"43":{"body":"loop 关键字创建了一个无限循环。我们会增加循环来给用户更多机会猜数字: 文件名:src/main.rs # use rand::Rng;\n# use std::cmp::Ordering;\n# use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# // --snip-- println!(\"The secret number is: {secret_number}\"); loop { println!(\"Please input your guess.\"); // --snip-- # # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # let guess: u32 = guess.trim().parse().expect(\"Please type a number!\");\n# # println!(\"You guessed: {guess}\");\n# match guess.cmp(&secret_number) { Ordering::Less => println!(\"Too small!\"), Ordering::Greater => println!(\"Too big!\"), Ordering::Equal => println!(\"You win!\"), } }\n} 如上所示,我们将提示用户猜测之后的所有内容移动到了循环中。确保 loop 循环中的代码多缩进四个空格,再次运行程序。注意这里有一个新问题,因为程序忠实地执行了我们的要求:永远地请求另一个猜测,用户好像无法退出啊! 用户总能使用 ctrl-c 终止程序。不过还有另一个方法跳出无限循环,就是 “比较猜测与秘密数字” 部分提到的 parse:如果用户输入的答案不是一个数字,程序会崩溃。我们可以利用这一点来退出,如下所示: $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 1.50s Running `target/debug/guessing_game`\nGuess the number!\nThe secret number is: 59\nPlease input your guess.\n45\nYou guessed: 45\nToo small!\nPlease input your guess.\n60\nYou guessed: 60\nToo big!\nPlease input your guess.\n59\nYou guessed: 59\nYou win!\nPlease input your guess.\nquit\nthread 'main' panicked at 'Please type a number!: ParseIntError { kind: InvalidDigit }', src/main.rs:28:47\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 输入 quit 将会退出程序,同时你会注意到其他任何非数字输入也一样。然而,这并不理想,我们想要当猜测正确的数字时游戏停止。","breadcrumbs":"写个猜数字游戏 » 使用循环来允许多次猜测","id":"43","title":"使用循环来允许多次猜测"},"430":{"body":"appendix-05-editions.md commit 8cf0496bb8e56b683ea3f015871c8631684decf4 早在第一章,我们见过 cargo new 在 Cargo.toml 中增加了一些有关 edition 的元数据。本附录将解释其意义! Rust 语言和编译器有一个为期 6 周的发布循环。这意味着用户会稳定得到新功能的更新。其他编程语言发布大更新但不甚频繁;Rust 选择更为频繁的发布小更新。一段时间之后,所有这些小更新会日积月累。不过随着小更新逐次的发布,或许很难回过头来感叹:“哇,从 Rust 1.10 到 Rust 1.31,Rust 的变化真大!” 每两到三年,Rust 团队会生成一个新的 Rust 版本 ( edition )。每一个版本会结合已经落地的功能,并提供一个清晰的带有完整更新文档和工具的功能包。新版本会作为常规的 6 周发布过程的一部分发布。 这为不同的人群提供了不同的功能: 对于活跃的 Rust 用户,其将增量的修改与易于理解的功能包相结合。 对于非用户,它表明发布了一些重大进展,这意味着 Rust 可能变得值得一试。 对于 Rust 自身开发者,其提供了项目整体的集合点。 在本文档编写时,Rust 有三个可用版本:Rust 2015、Rust 2018 和 Rust 2021。本书基于 Rust 2021 edition 风格编写。 Cargo.toml 中的 edition 字段表明代码应该使用哪个版本编译。如果该字段不存在,其默认为 2015 以提供后向兼容性。 每个项目都可以选择不同于默认的 2015 edition 的版本。这样,版本可能会包含不兼容的修改,比如新增关键字可能会与代码中的标识符冲突并导致错误。不过除非选择兼容这些修改,(旧)代码仍将能够编译,即便升级了 Rust 编译器的版本。 所有 Rust 编译器都支持任何之前存在的编译器版本,并可以链接任何支持版本的 crate。编译器修改只影响最初的解析代码的过程。因此,如果你使用 Rust 2015 而某个依赖使用 Rust 2018,你的项目仍旧能够编译并使用该依赖。反之,若项目使用 Rust 2018 而依赖使用 Rust 2015 亦可工作。 有一点需要明确:大部分功能在所有版本中都能使用。开发者使用任何 Rust 版本将能继续接收最新稳定版的改进。然而在一些情况,主要是增加了新关键字的时候,则可能出现了只能用于新版本的功能。只需切换版本即可利用新版本的功能。 请查看 Edition Guide 了解更多细节,这是一个完全介绍版本的书籍,包括如何通过 cargo fix 自动将代码迁移到新版本。","breadcrumbs":"附录 » E - 版本 » 附录 E:版本","id":"430","title":"附录 E:版本"},"431":{"body":"appendix-06-translation.md commit 4c8d13c52c51f1c62a80b52d7fbd7cc0b63ada43 一些非英语语言的资源。多数仍在翻译中;查阅 翻译标签 来帮助翻译,或者添加译本链接! Português (BR) Português (PT) 简体中文 正體中文 Українська Español , alternate Italiano Русский 한국어 日本語 Français Polski Cebuano Tagalog Esperanto ελληνική Svenska Farsi Deutsch हिंदी ไทย Danske","breadcrumbs":"附录 » F - 本书译本 » 附录 F:本书译本","id":"431","title":"附录 F:本书译本"},"432":{"body":"appendix-07-nightly-rust.md commit d44317c3122b44fb713aba66cc295dee3453b24b 本附录介绍 Rust 是如何开发的以及这如何影响作为 Rust 开发者的你。","breadcrumbs":"附录 » G - Rust 是如何开发的与 “Nightly Rust” » 附录 G:Rust 是如何开发的与 “Nightly Rust”","id":"432","title":"附录 G:Rust 是如何开发的与 “Nightly Rust”"},"433":{"body":"作为一个语言,Rust 十分 注重代码的稳定性。我们希望 Rust 成为你代码坚实的基础,假如持续地有东西在变,这个希望就实现不了。但与此同时,如果不能实验新功能的话,在发布之前我们又无法发现其中重大的缺陷,而一旦发布便再也没有修改的机会了。 对于这个问题我们的解决方案被称为 “无停滞稳定”(“stability without stagnation”),其指导性原则是:无需担心升级到最新的稳定版 Rust。每次升级应该是无痛的,并应带来新功能,更少的 bug 和更快的编译速度。","breadcrumbs":"附录 » G - Rust 是如何开发的与 “Nightly Rust” » 无停滞稳定","id":"433","title":"无停滞稳定"},"434":{"body":"Rust 开发运行于一个 发布时刻表 ( train schedule )之上。也就是说,所有的开发工作都位于 Rust 仓库的 master 分支。发布采用 software release train 模型,其被用于思科 IOS 等其它软件项目。Rust 有三个 发布通道 ( release channel ): Nightly Beta Stable(稳定版) 大部分 Rust 开发者主要采用稳定版通道,不过希望实验新功能的开发者可能会使用 nightly 或 beta 版。 如下是一个开发和发布过程如何运转的例子:假设 Rust 团队正在进行 Rust 1.5 的发布工作。该版本发布于 2015 年 12 月,不过这里只是为了提供一个真实的版本。Rust 新增了一项功能:一个 master 分支的新提交。每天晚上,会产生一个新的 nightly 版本。每天都是发布版本的日子,而这些发布由发布基础设施自动完成。所以随着时间推移,发布轨迹看起来像这样,版本一天一发: nightly: * - - * - - * 每 6 周时间,是准备发布新版本的时候了!Rust 仓库的 beta 分支会从用于 nightly 的 master 分支产生。现在,有了两个发布版本: nightly: * - - * - - * |\nbeta: * 大部分 Rust 用户不会主要使用 beta 版本,不过在 CI 系统中对 beta 版本进行测试能够帮助 Rust 发现可能的回归缺陷(regression)。同时,每天仍产生 nightly 发布: nightly: * - - * - - * - - * - - * |\nbeta: * 比如我们发现了一个回归缺陷。好消息是在这些缺陷流入稳定发布之前还有一些时间来测试 beta 版本!fix 被合并到 master,为此 nightly 版本得到了修复,接着这些 fix 将 backport 到 beta 分支,一个新的 beta 发布就产生了: nightly: * - - * - - * - - * - - * - - * |\nbeta: * - - - - - - - - * 第一个 beta 版的 6 周后,是发布稳定版的时候了!stable 分支从 beta 分支生成: nightly: * - - * - - * - - * - - * - - * - * - * |\nbeta: * - - - - - - - - * |\nstable: * 好的!Rust 1.5 发布了!然而,我们忘了些东西:因为又过了 6 周,我们还需发布 新版 Rust 的 beta 版,Rust 1.6。所以从 beta 生成 stable 分支后,新版的 beta 分支也再次从 nightly 生成: nightly: * - - * - - * - - * - - * - - * - * - * | |\nbeta: * - - - - - - - - * * |\nstable: * 这被称为 “train model”,因为每 6 周,一个版本 “离开车站”(“leaves the station”),不过从 beta 通道到达稳定通道还有一段旅程。 Rust 每 6 周发布一个版本,如时钟般准确。如果你知道了某个 Rust 版本的发布时间,就可以知道下个版本的时间:6 周后。每 6 周发布版本的一个好的方面是下一班车会来得更快。如果特定版本碰巧缺失某个功能也无需担心:另一个版本很快就会到来!这有助于减少因临近发版时间而偷偷释出未经完善的功能的压力。 多亏了这个过程,你总是可以切换到下一版本的 Rust 并验证是否可以轻易的升级:如果 beta 版不能如期工作,你可以向 Rust 团队报告并在发布稳定版之前得到修复!beta 版造成的破坏是非常少见的,不过 rustc 也不过是一个软件,可能会存在 bug。","breadcrumbs":"附录 » G - Rust 是如何开发的与 “Nightly Rust” » Choo, Choo! 发布通道和发布时刻表(Riding the Trains)","id":"434","title":"Choo, Choo! 发布通道和发布时刻表(Riding the Trains)"},"435":{"body":"这个发布模型中另一个值得注意的地方:不稳定功能(unstable features)。Rust 使用一个被称为 “功能标记”(“feature flags”)的技术来确定给定版本的某个功能是否启用。如果新功能正在积极地开发中,其提交到了 master,因此会出现在 nightly 版中,不过会位于一个 功能标记 之后。作为用户,如果你希望尝试这个正在开发的功能,则可以在源码中使用合适的标记来开启,不过必须使用 nightly 版。 如果使用的是 beta 或稳定版 Rust,则不能使用任何功能标记。这是在新功能被宣布为永久稳定之前获得实用价值的关键。这既满足了希望使用最尖端技术的同学,那些坚持稳定版的同学也知道其代码不会被破坏。这就是无停滞稳定。 本书只包含稳定的功能,因为还在开发中的功能仍可能改变,当其进入稳定版时肯定会与编写本书的时候有所不同。你可以在网上获取 nightly 版的文档。","breadcrumbs":"附录 » G - Rust 是如何开发的与 “Nightly Rust” » 不稳定功能","id":"435","title":"不稳定功能"},"436":{"body":"Rustup 使得改变不同发布通道的 Rust 更为简单,其在全局或分项目的层次工作。其默认会安装稳定版 Rust。例如为了安装 nightly: $ rustup toolchain install nightly 你会发现 rustup 也安装了所有的 工具链 ( toolchains ,Rust 和其相关组件)。如下是一位作者的 Windows 计算机上的例子: > rustup toolchain list\nstable-x86_64-pc-windows-msvc (default)\nbeta-x86_64-pc-windows-msvc\nnightly-x86_64-pc-windows-msvc 如你所见,默认是稳定版。大部分 Rust 用户在大部分时间使用稳定版。你可能也会这么做,不过如果你关心最新的功能,可以为特定项目使用 nightly 版。为此,可以在项目目录使用 rustup override 来设置当前目录 rustup 使用 nightly 工具链: $ cd ~/projects/needs-nightly\n$ rustup override set nightly 现在,每次在 ~/projects/needs-nightly 调用 rustc 或 cargo,rustup 会确保使用 nightly 版 Rust。在你有很多 Rust 项目时大有裨益!","breadcrumbs":"附录 » G - Rust 是如何开发的与 “Nightly Rust” » Rustup 和 Rust Nightly 的职责","id":"436","title":"Rustup 和 Rust Nightly 的职责"},"437":{"body":"那么你如何了解这些新功能呢?Rust 开发模式遵循一个 Request For Comments (RFC) 过程 。如果你希望改进 Rust,可以编写一个提议,也就是 RFC。 任何人都可以编写 RFC 来改进 Rust,同时这些 RFC 会被 Rust 团队评审和讨论,他们由很多不同分工的子团队组成。这里是 Rust 官网上 所有团队的总列表,其包含了项目中每个领域的团队:语言设计、编译器实现、基础设施、文档等。各个团队会阅读相应的提议和评论,编写回复,并最终达成接受或回绝功能的一致。 如果功能被接受了,在 Rust 仓库会打开一个 issue,人们就可以实现它。实现功能的人当然可能不是最初提议功能的人!当实现完成后,其会合并到 master 分支并位于一个功能开关(feature gate)之后,正如 “不稳定功能” 部分所讨论的。 在稍后的某个时间,一旦使用 nightly 版的 Rust 团队能够尝试这个功能了,团队成员会讨论这个功能,它如何在 nightly 中工作,并决定是否应该进入稳定版。如果决定继续推进,功能开关会移除,然后这个功能就被认为是稳定的了!乘着“发布的列车”,最终在新的稳定版 Rust 中出现。","breadcrumbs":"附录 » G - Rust 是如何开发的与 “Nightly Rust” » RFC 过程和团队","id":"437","title":"RFC 过程和团队"},"44":{"body":"让我们增加一个 break 语句,在用户猜对时退出游戏: 文件名:src/main.rs # use rand::Rng;\n# use std::cmp::Ordering;\n# use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # loop {\n# println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # let guess: u32 = guess.trim().parse().expect(\"Please type a number!\");\n# # println!(\"You guessed: {guess}\");\n# // --snip-- match guess.cmp(&secret_number) { Ordering::Less => println!(\"Too small!\"), Ordering::Greater => println!(\"Too big!\"), Ordering::Equal => { println!(\"You win!\"); break; } } }\n} 通过在 You win! 之后增加一行 break,用户猜对了神秘数字后会退出循环。退出循环也意味着退出程序,因为循环是 main 的最后一部分。","breadcrumbs":"写个猜数字游戏 » 猜测正确后退出","id":"44","title":"猜测正确后退出"},"45":{"body":"为了进一步改善游戏性,不要在用户输入非数字时崩溃,需要忽略非数字,让用户可以继续猜测。可以通过修改 guess 将 String 转化为 u32 那部分代码来实现,如示例 2-5 所示: 文件名:src/main.rs # use rand::Rng;\n# use std::cmp::Ordering;\n# use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # loop {\n# println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# // --snip-- io::stdin() .read_line(&mut guess) .expect(\"Failed to read line\"); let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; println!(\"You guessed: {guess}\"); // --snip--\n# # match guess.cmp(&secret_number) {\n# Ordering::Less => println!(\"Too small!\"),\n# Ordering::Greater => println!(\"Too big!\"),\n# Ordering::Equal => {\n# println!(\"You win!\");\n# break;\n# }\n# }\n# }\n# } 示例 2-5:忽略非数字的猜测并重新请求数字而不是让程序崩溃 我们将 expect 调用换成 match 语句,以从遇到错误就崩溃转换为处理错误。须知 parse 返回一个 Result 类型,而 Result 是一个拥有 Ok 或 Err 成员的枚举。这里使用的 match 表达式,和之前处理 cmp 方法返回 Ordering 时用的一样。 如果 parse 能够成功的将字符串转换为一个数字,它会返回一个包含结果数字的 Ok。这个 Ok 值与 match 第一个分支的模式相匹配,该分支对应的动作返回 Ok 值中的数字 num,最后如愿变成新创建的 guess 变量。 如果 parse 不 能将字符串转换为一个数字,它会返回一个包含更多错误信息的 Err。Err 值不能匹配第一个 match 分支的 Ok(num) 模式,但是会匹配第二个分支的 Err(_) 模式:_ 是一个通配符值,本例中用来匹配所有 Err 值,不管其中有何种信息。所以程序会执行第二个分支的动作,continue 意味着进入 loop 的下一次循环,请求另一个猜测。这样程序就有效的忽略了 parse 可能遇到的所有错误! 现在程序中的一切都应该如预期般工作了。让我们试试吧: $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 4.45s Running `target/debug/guessing_game`\nGuess the number!\nThe secret number is: 61\nPlease input your guess.\n10\nYou guessed: 10\nToo small!\nPlease input your guess.\n99\nYou guessed: 99\nToo big!\nPlease input your guess.\nfoo\nPlease input your guess.\n61\nYou guessed: 61\nYou win! 太棒了!再有最后一个小的修改,就能完成猜数字游戏了:还记得程序依然会打印出秘密数字。在测试时还好,但正式发布时会毁了游戏。删掉打印秘密数字的 println!。示例 2-6 为最终代码: 文件名:src/main.rs use rand::Rng;\nuse std::cmp::Ordering;\nuse std::io; fn main() { println!(\"Guess the number!\"); let secret_number = rand::thread_rng().gen_range(1..=100); loop { println!(\"Please input your guess.\"); let mut guess = String::new(); io::stdin() .read_line(&mut guess) .expect(\"Failed to read line\"); let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; println!(\"You guessed: {guess}\"); match guess.cmp(&secret_number) { Ordering::Less => println!(\"Too small!\"), Ordering::Greater => println!(\"Too big!\"), Ordering::Equal => { println!(\"You win!\"); break; } } }\n} 示例 2-6:猜数字游戏的完整代码 此时此刻,你顺利完成了猜数字游戏。恭喜!","breadcrumbs":"写个猜数字游戏 » 处理无效输入","id":"45","title":"处理无效输入"},"46":{"body":"本项目通过动手实践,向你介绍了 Rust 新概念:let、match、函数、使用外部 crate 等等,接下来的几章,你会继续深入学习这些概念。第三章介绍大部分编程语言都有的概念,比如变量、数据类型和函数,以及如何在 Rust 中使用它们。第四章探索所有权(ownership),这是一个 Rust 同其他语言大不相同的功能。第五章讨论结构体和方法的语法,而第六章侧重解释枚举。","breadcrumbs":"写个猜数字游戏 » 总结","id":"46","title":"总结"},"47":{"body":"ch03-00-common-programming-concepts.md commit d0acb2595c891de97a133d06635c50ab449dd65c 本章介绍一些几乎所有编程语言都有的概念,以及它们在 Rust 中是如何工作的。很多编程语言的核心概念都是共通的,本章中展示的概念都不是 Rust 所特有的,不过我们会在 Rust 上下文中讨论它们,并解释使用这些概念的惯例。 具体来说,我们将会学习变量、基本类型、函数、注释和控制流。每一个 Rust 程序中都会用到这些基础知识,提早学习这些概念会让你在起步时就打下坚实的基础。","breadcrumbs":"常见编程概念 » 常见编程概念","id":"47","title":"常见编程概念"},"48":{"body":"Rust 语言有一组保留的 关键字 ( keywords ),就像大部分语言一样,它们只能由语言本身使用。记住,你不能使用这些关键字作为变量或函数的名称。大部分关键字有特殊的意义,你将在 Rust 程序中使用它们完成各种任务;一些关键字目前没有相应的功能,是为将来可能添加的功能保留的。可以在 附录 A 中找到关键字的列表。","breadcrumbs":"常见编程概念 » 关键字","id":"48","title":"关键字"},"49":{"body":"ch03-01-variables-and-mutability.md commit 21a2ed14f4480dab62438dcc1130291bebc65379 正如第二章中 “使用变量储存值” 部分提到的那样,变量默认是不可改变的(immutable)。这是 Rust 提供给你的众多优势之一,让你得以充分利用 Rust 提供的安全性和简单并发性来编写代码。不过,你仍然可以使用可变变量。让我们探讨一下 Rust 为何及如何鼓励你利用不可变性,以及何时你会选择不使用不可变性。 当变量不可变时,一旦值被绑定一个名称上,你就不能改变这个值。为了对此进行说明,使用 cargo new variables 命令在 projects 目录生成一个叫做 variables 的新项目。 接着,在新建的 variables 目录,打开 src/main.rs 并将代码替换为如下代码,这些代码还不能编译,我们会首次检查到不可变错误(immutability error)。 文件名:src/main.rs fn main() { let x = 5; println!(\"The value of x is: {x}\"); x = 6; println!(\"The value of x is: {x}\");\n} 保存并使用 cargo run 运行程序。应该会看到一条与不可变性有关的错误信息,如下输出所示: $ cargo run Compiling variables v0.1.0 (file:///projects/variables)\nerror[E0384]: cannot assign twice to immutable variable `x` --> src/main.rs:4:5 |\n2 | let x = 5; | - first assignment to `x`\n3 | println!(\"The value of x is: {x}\");\n4 | x = 6; | ^^^^^ cannot assign twice to immutable variable |\nhelp: consider making this binding mutable |\n2 | let mut x = 5; | +++ For more information about this error, try `rustc --explain E0384`.\nerror: could not compile `variables` (bin \"variables\") due to 1 previous error 这个例子展示了编译器如何帮助你找出程序中的错误。虽然编译错误令人沮丧,但那只是表示程序不能安全的完成你想让它完成的工作;并 不能 说明你不是一个好程序员!经验丰富的 Rustacean 们一样会遇到编译错误。 错误信息指出错误的原因是 不能对不可变变量 x 二次赋值(cannot assign twice to immutable variable `x` ),因为你尝试对不可变变量 x 赋第二个值。 在尝试改变预设为不可变的值时,产生编译时错误是很重要的,因为这种情况可能导致 bug。如果一部分代码假设一个值永远也不会改变,而另一部分代码改变了这个值,第一部分代码就有可能以不可预料的方式运行。不得不承认这种 bug 的起因难以跟踪,尤其是第二部分代码只是 有时 会改变值。 Rust 编译器保证,如果声明一个值不会变,它就真的不会变,所以你不必自己跟踪它。这意味着你的代码更易于推导。 不过可变性也是非常有用的,可以用来更方便地编写代码。尽管变量默认是不可变的,你仍然可以在变量名前添加 mut 来使其可变,正如在 第二章 所做的那样。mut 也向读者表明了其他代码将会改变这个变量值的意图。 例如,让我们将 src/main.rs 修改为如下代码: 文件名:src/main.rs fn main() { let mut x = 5; println!(\"The value of x is: {x}\"); x = 6; println!(\"The value of x is: {x}\");\n} 现在运行这个程序,出现如下内容: $ cargo run Compiling variables v0.1.0 (file:///projects/variables) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s Running `target/debug/variables`\nThe value of x is: 5\nThe value of x is: 6 通过 mut,允许把绑定到 x 的值从 5 改成 6。是否让变量可变的最终决定权仍然在你,取决于在某个特定情况下,你是否认为变量可变会让代码更加清晰明了。","breadcrumbs":"常见编程概念 » 变量与可变性 » 变量和可变性","id":"49","title":"变量和可变性"},"5":{"body":"Rust 适合学生群体,也适合有兴趣学习系统概念的人。许多人通过 Rust 学习了操作系统开发等主题。社区对学生问题非常欢迎并乐于回答。通过类似这本书以及其他内容的努力,Rust 团队希望使系统概念能为更多人所易于理解,特别是编程新手。","breadcrumbs":"简介 » 学生","id":"5","title":"学生"},"50":{"body":"类似于不可变变量, 常量 (constants) 是绑定到一个名称的不允许改变的值,不过常量与变量还是有一些区别。 首先,不允许对常量使用 mut。常量不光默认不可变,它总是不可变。声明常量使用 const 关键字而不是 let,并且 必须 注明值的类型。在下一部分, “数据类型” 中会介绍类型和类型注解,现在无需关心这些细节,记住总是标注类型即可。 常量可以在任何作用域中声明,包括全局作用域,这在一个值需要被很多部分的代码用到时很有用。 最后一个区别是,常量只能被设置为常量表达式,而不可以是其他任何只能在运行时计算出的值。 下面是一个声明常量的例子: const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3; 常量的名称是 THREE_HOURS_IN_SECONDS,它的值被设置为 60(一分钟内的秒数)乘以 60(一小时内的分钟数)再乘以 3(我们在这个程序中要计算的小时数)的结果。Rust 对常量的命名约定是在单词之间使用全大写加下划线。编译器能够在编译时计算一组有限的操作,这使我们可以选择以更容易理解和验证的方式写出此值,而不是将此常量设置为值 10,800。有关声明常量时可以使用哪些操作的详细信息,请参阅 Rust Reference 的常量求值部分 。 在声明它的作用域之中,常量在整个程序生命周期中都有效,此属性使得常量可以作为多处代码使用的全局范围的值,例如一个游戏中所有玩家可以获取的最高分或者光速。 将遍布于应用程序中的硬编码值声明为常量,能帮助后来的代码维护人员了解值的意图。如果将来需要修改硬编码值,也只需修改汇聚于一处的硬编码值。","breadcrumbs":"常见编程概念 » 变量与可变性 » 常量","id":"50","title":"常量"},"51":{"body":"正如在 第二章 猜数字游戏中所讲,我们可以定义一个与之前变量同名的新变量。Rustacean 们称之为第一个变量被第二个 隐藏(Shadowing) 了,这意味着当您使用变量的名称时,编译器将看到第二个变量。实际上,第二个变量“遮蔽”了第一个变量,此时任何使用该变量名的行为中都会视为是在使用第二个变量,直到第二个变量自己也被隐藏或第二个变量的作用域结束。可以用相同变量名称来隐藏一个变量,以及重复使用 let 关键字来多次隐藏,如下所示: 文件名:src/main.rs fn main() { let x = 5; let x = x + 1; { let x = x * 2; println!(\"The value of x in the inner scope is: {x}\"); } println!(\"The value of x is: {x}\");\n} 这个程序首先将 x 绑定到值 5 上。接着通过 let x = 创建了一个新变量 x,获取初始值并加 1,这样 x 的值就变成 6 了。然后,在使用花括号创建的内部作用域内,第三个 let 语句也隐藏了 x 并创建了一个新的变量,将之前的值乘以 2,x 得到的值是 12。当该作用域结束时,内部 shadowing 的作用域也结束了,x 又返回到 6。运行这个程序,它会有如下输出: $ cargo run Compiling variables v0.1.0 (file:///projects/variables) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s Running `target/debug/variables`\nThe value of x in the inner scope is: 12\nThe value of x is: 6 隐藏与将变量标记为 mut 是有区别的。当不小心尝试对变量重新赋值时,如果没有使用 let 关键字,就会导致编译时错误。通过使用 let,我们可以用这个值进行一些计算,不过计算完之后变量仍然是不可变的。 mut 与隐藏的另一个区别是,当再次使用 let 时,实际上创建了一个新变量,我们可以改变值的类型,并且复用这个名字。例如,假设程序请求用户输入空格字符来说明希望在文本之间显示多少个空格,接下来我们想将输入存储成数字(多少个空格): # fn main() { let spaces = \" \"; let spaces = spaces.len();\n# } 第一个 spaces 变量是字符串类型,第二个 spaces 变量是数字类型。隐藏使我们不必使用不同的名字,如 spaces_str 和 spaces_num;相反,我们可以复用 spaces 这个更简单的名字。然而,如果尝试使用 mut,将会得到一个编译时错误,如下所示: # fn main() { let mut spaces = \" \"; spaces = spaces.len();\n# } 这个错误说明,我们不能改变变量的类型: $ cargo run Compiling variables v0.1.0 (file:///projects/variables)\nerror[E0308]: mismatched types --> src/main.rs:3:14 |\n2 | let mut spaces = \" \"; | ----- expected due to this value\n3 | spaces = spaces.len(); | ^^^^^^^^^^^^ expected `&str`, found `usize` For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `variables` (bin \"variables\") due to 1 previous error 现在我们已经了解了变量如何工作,让我们看看变量可以拥有的更多数据类型。","breadcrumbs":"常见编程概念 » 变量与可变性 » 隐藏","id":"51","title":"隐藏"},"52":{"body":"ch03-02-data-types.md commit d0acb2595c891de97a133d06635c50ab449dd65c 在 Rust 中,每一个值都属于某一个 数据类型 ( data type ),这告诉 Rust 它被指定为何种数据,以便明确数据处理方式。我们将看到两类数据类型子集:标量(scalar)和复合(compound)。 记住,Rust 是 静态类型 ( statically typed )语言,也就是说在编译时就必须知道所有变量的类型。根据值及其使用方式,编译器通常可以推断出我们想要用的类型。当多种类型均有可能时,比如第二章的 “比较猜测的数字和秘密数字” 使用 parse 将 String 转换为数字时,必须增加类型注解,像这样: let guess: u32 = \"42\".parse().expect(\"Not a number!\"); 如果不像上面的代码这样添加类型注解 : u32,Rust 会显示如下错误,这说明编译器需要我们提供更多信息,来了解我们想要的类型: $ cargo build Compiling no_type_annotations v0.1.0 (file:///projects/no_type_annotations)\nerror[E0284]: type annotations needed --> src/main.rs:2:9 |\n2 | let guess = \"42\".parse().expect(\"Not a number!\"); | ^^^^^ ----- type must be known at this point | = note: cannot satisfy `<_ as FromStr>::Err == _`\nhelp: consider giving `guess` an explicit type |\n2 | let guess: /* Type */ = \"42\".parse().expect(\"Not a number!\"); | ++++++++++++ For more information about this error, try `rustc --explain E0284`.\nerror: could not compile `no_type_annotations` (bin \"no_type_annotations\") due to 1 previous error 你会看到其它数据类型的各种类型注解。","breadcrumbs":"常见编程概念 » 数据类型 » 数据类型","id":"52","title":"数据类型"},"53":{"body":"标量 ( scalar )类型代表一个单独的值。Rust 有四种基本的标量类型:整型、浮点型、布尔类型和字符类型。你可能在其他语言中见过它们。让我们深入了解它们在 Rust 中是如何工作的。 整型 整数 是一个没有小数部分的数字。我们在第二章使用过 u32 整数类型。该类型声明表明,它关联的值应该是一个占据 32 比特位的无符号整数(有符号整数类型以 i 开头而不是 u)。表格 3-1 展示了 Rust 内建的整数类型。我们可以使用其中的任一个来声明一个整数值的类型。 表格 3-1: Rust 中的整型 长度 有符号 无符号 8-bit i8 u8 16-bit i16 u16 32-bit i32 u32 64-bit i64 u64 128-bit i128 u128 arch isize usize 每一个变体都可以是有符号或无符号的,并有一个明确的大小。 有符号 和 无符号 代表数字能否为负值,换句话说,这个数字是否有可能是负数(有符号数),或者永远为正而不需要符号(无符号数)。这有点像在纸上书写数字:当需要考虑符号的时候,数字以加号或减号作为前缀;然而,可以安全地假设为正数时,加号前缀通常省略。有符号数以 补码形式(two’s complement representation) 存储。 每一个有符号的变体可以储存包含从 -(2n - 1) 到 2n - 1 - 1 在内的数字,这里 n 是变体使用的位数。所以 i8 可以储存从 -(27) 到 27 - 1 在内的数字,也就是从 -128 到 127。无符号的变体可以储存从 0 到 2n - 1 的数字,所以 u8 可以储存从 0 到 28 - 1 的数字,也就是从 0 到 255。 另外,isize 和 usize 类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的,32 位架构上它们是 32 位的。 可以使用表格 3-2 中的任何一种形式编写数字字面值。请注意可以是多种数字类型的数字字面值允许使用类型后缀,例如 57u8 来指定类型,同时也允许使用 _ 做为分隔符以方便读数,例如1_000,它的值与你指定的 1000 相同。 表格 3-2: Rust 中的整型字面值 数字字面值 例子 Decimal (十进制) 98_222 Hex (十六进制) 0xff Octal (八进制) 0o77 Binary (二进制) 0b1111_0000 Byte (单字节字符)(仅限于u8) b'A' 那么该使用哪种类型的数字呢?如果拿不定主意,Rust 的默认类型通常是个不错的起点,数字类型默认是 i32。isize 或 usize 主要作为某些集合的索引。 整型溢出 比方说有一个 u8 ,它可以存放从零到 255 的值。那么当你将其修改为 256 时会发生什么呢?这被称为 “整型溢出”(“integer overflow” ),这会导致以下两种行为之一的发生。当在 debug 模式编译时,Rust 检查这类问题并使程序 panic ,这个术语被 Rust 用来表明程序因错误而退出。第九章 “panic! 与不可恢复的错误” 部分会详细介绍 panic。 使用 --release flag 在 release 模式中构建时,Rust 不会 检测会导致 panic 的整型溢出。相反发生整型溢出时,Rust 会进行一种被称为二进制补码 wrapping( two’s complement wrapping )的操作。简而言之,比此类型能容纳最大值还大的值会回绕到最小值,值 256 变成 0,值 257 变成 1,依此类推。程序不会 panic,不过变量可能也不会是你所期望的值。依赖整型溢出 wrapping 的行为被认为是一种错误。 为了显式地处理溢出的可能性,可以使用这几类标准库提供的原始数字类型方法: 所有模式下都可以使用 wrapping_* 方法进行 wrapping,如 wrapping_add 如果 checked_* 方法出现溢出,则返回 None值 用 overflowing_* 方法返回值和一个布尔值,表示是否出现溢出 用 saturating_* 方法在值的最小值或最大值处进行饱和处理 浮点型 Rust 也有两个原生的 浮点数 ( floating-point numbers )类型,它们是带小数点的数字。Rust 的浮点数类型是 f32 和 f64,分别占 32 位和 64 位。默认类型是 f64,因为在现代 CPU 中,它与 f32 速度几乎一样,不过精度更高。所有的浮点型都是有符号的。 这是一个展示浮点数的实例: 文件名:src/main.rs fn main() { let x = 2.0; // f64 let y: f32 = 3.0; // f32\n} 浮点数采用 IEEE-754 标准表示。f32 是单精度浮点数,f64 是双精度浮点数。 数值运算 Rust 中的所有数字类型都支持基本数学运算:加法、减法、乘法、除法和取余。整数除法会向零舍入到最接近的整数。下面的代码展示了如何在 let 语句中使用它们: 文件名:src/main.rs fn main() { // addition let sum = 5 + 10; // subtraction let difference = 95.5 - 4.3; // multiplication let product = 4 * 30; // division let quotient = 56.7 / 32.2; let truncated = -5 / 3; // 结果为 -1 // remainder let remainder = 43 % 5;\n} 这些语句中的每个表达式使用了一个数学运算符并计算出了一个值,然后绑定给一个变量。 附录 B 包含 Rust 提供的所有运算符的列表。 布尔型 正如其他大部分编程语言一样,Rust 中的布尔类型有两个可能的值:true 和 false。Rust 中的布尔类型使用 bool 表示。例如: 文件名:src/main.rs fn main() { let t = true; let f: bool = false; // with explicit type annotation\n} 使用布尔值的主要场景是条件表达式,例如 if 表达式。在 “控制流”(“Control Flow”) 部分将介绍 if 表达式在 Rust 中如何工作。 字符类型 Rust 的 char 类型是语言中最原生的字母类型。下面是一些声明 char 值的例子: 文件名:src/main.rs fn main() { let c = 'z'; let z: char = 'ℤ'; // with explicit type annotation let heart_eyed_cat = '😻';\n} 注意,我们用单引号声明 char 字面量,而与之相反的是,使用双引号声明字符串字面量。Rust 的 char 类型的大小为四个字节 (four bytes),并代表了一个 Unicode 标量值(Unicode Scalar Value),这意味着它可以比 ASCII 表示更多内容。在 Rust 中,带变音符号的字母(Accented letters),中文、日文、韩文等字符,emoji(绘文字)以及零长度的空白字符都是有效的 char 值。Unicode 标量值包含从 U+0000 到 U+D7FF 和 U+E000 到 U+10FFFF 在内的值。不过,“字符” 并不是一个 Unicode 中的概念,所以人直觉上的 “字符” 可能与 Rust 中的 char 并不符合。第八章的 “使用字符串储存 UTF-8 编码的文本” 中将详细讨论这个主题。","breadcrumbs":"常见编程概念 » 数据类型 » 标量类型","id":"53","title":"标量类型"},"54":{"body":"复合类型 ( Compound types )可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array)。 元组类型 元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定:一旦声明,其长度不会增大或缩小。 我们使用包含在圆括号中的逗号分隔的值列表来创建一个元组。元组中的每一个位置都有一个类型,而且这些不同值的类型也不必是相同的。这个例子中使用了可选的类型注解: 文件名:src/main.rs fn main() { let tup: (i32, f64, u8) = (500, 6.4, 1);\n} tup 变量绑定到整个元组上,因为元组是一个单独的复合元素。为了从元组中获取单个值,可以使用模式匹配(pattern matching)来解构(destructure)元组值,像这样: 文件名:src/main.rs fn main() { let tup = (500, 6.4, 1); let (x, y, z) = tup; println!(\"The value of y is: {y}\");\n} 程序首先创建了一个元组并绑定到 tup 变量上。接着使用了 let 和一个模式将 tup 分成了三个不同的变量,x、y 和 z。这叫做 解构 ( destructuring ),因为它将一个元组拆成了三个部分。最后,程序打印出了 y 的值,也就是 6.4。 我们也可以使用点号(.)后跟值的索引来直接访问它们。例如: 文件名:src/main.rs fn main() { let x: (i32, f64, u8) = (500, 6.4, 1); let five_hundred = x.0; let six_point_four = x.1; let one = x.2;\n} 这个程序创建了一个元组,x,然后使用其各自的索引访问元组中的每个元素。跟大多数编程语言一样,元组的第一个索引值是 0。 不带任何值的元组有个特殊的名称,叫做 单元(unit) 元组。这种值以及对应的类型都写作 (),表示空值或空的返回类型。如果表达式不返回任何其他值,则会隐式返回单元值。 数组类型 另一个包含多个值的方式是 数组 ( array )。与元组不同,数组中的每个元素的类型必须相同。Rust 中的数组与一些其他语言中的数组不同,Rust 中的数组长度是固定的。 我们将数组的值写成在方括号内,用逗号分隔: 文件名:src/main.rs fn main() { let a = [1, 2, 3, 4, 5];\n} 当你想要在栈(stack)而不是在堆(heap)上为数据分配空间( 第四章 将讨论栈与堆的更多内容),或者是想要确保总是有固定数量的元素时,数组非常有用。但是数组并不如 vector 类型灵活。vector 类型是标准库提供的一个 允许 增长和缩小长度的类似数组的集合类型。当不确定是应该使用数组还是 vector 的时候,那么很可能应该使用 vector。 第八章 会详细讨论 vector。 然而,当你确定元素个数不会改变时,数组会更有用。例如,当你在一个程序中使用月份名字时,你更应趋向于使用数组而不是 vector,因为你确定只会有 12 个元素。 let months = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"]; 可以像这样编写数组的类型:在方括号中包含每个元素的类型,后跟分号,再后跟数组元素的数量。 let a: [i32; 5] = [1, 2, 3, 4, 5]; 这里,i32 是每个元素的类型。分号之后,数字 5 表明该数组包含五个元素。 你还可以通过在方括号中指定初始值加分号再加元素个数的方式来创建一个每个元素都为相同值的数组: let a = [3; 5]; 变量名为 a 的数组将包含 5 个元素,这些元素的值最初都将被设置为 3。这种写法与 let a = [3, 3, 3, 3, 3]; 效果相同,但更简洁。 访问数组元素 数组是可以在栈 (stack) 上分配的已知固定大小的单个内存块。可以使用索引来访问数组的元素,像这样: 文件名:src/main.rs fn main() { let a = [1, 2, 3, 4, 5]; let first = a[0]; let second = a[1];\n} 在这个例子中,叫做 first 的变量的值是 1,因为它是数组索引 [0] 的值。变量 second 将会是数组索引 [1] 的值 2。 无效的数组元素访问 让我们看看如果我们访问数组结尾之后的元素会发生什么呢?比如你执行以下代码,它使用类似于第 2 章中的猜数字游戏的代码从用户那里获取数组索引: 文件名:src/main.rs use std::io; fn main() { let a = [1, 2, 3, 4, 5]; println!(\"Please enter an array index.\"); let mut index = String::new(); io::stdin() .read_line(&mut index) .expect(\"Failed to read line\"); let index: usize = index .trim() .parse() .expect(\"Index entered was not a number\"); let element = a[index]; println!(\"The value of the element at index {index} is: {element}\");\n} 此代码编译成功。如果您使用 cargo run 运行此代码并输入 0、1、2、3 或 4,程序将在数组中的索引处打印出相应的值。如果你输入一个超过数组末端的数字,如 10,你会看到这样的输出: thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src/main.rs:19:19\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 程序在索引操作中使用一个无效的值时导致 运行时 错误。程序带着错误信息退出,并且没有执行最后的 println! 语句。当尝试用索引访问一个元素时,Rust 会检查指定的索引是否小于数组的长度。如果索引超出了数组长度,Rust 会 panic ,这是 Rust 术语,它用于程序因为错误而退出的情况。这种检查必须在运行时进行,特别是在这种情况下,因为编译器不可能知道用户在以后运行代码时将输入什么值。 这是第一个在实战中遇到的 Rust 安全原则的例子。在很多底层语言中,并没有进行这类检查,这样当提供了一个不正确的索引时,就会访问无效的内存。通过立即退出而不是允许内存访问并继续执行,Rust 让你避开此类错误。第九章会更详细地讨论 Rust 的错误处理机制,以及如何编写可读性强而又安全的代码,使程序既不会 panic 也不会导致非法内存访问。","breadcrumbs":"常见编程概念 » 数据类型 » 复合类型","id":"54","title":"复合类型"},"55":{"body":"ch03-03-how-functions-work.md commit d0acb2595c891de97a133d06635c50ab449dd65c 函数在 Rust 代码中非常普遍。你已经见过语言中最重要的函数之一:main 函数,它是很多程序的入口点。你也见过 fn 关键字,它用来声明新函数。 Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并使用下划线分隔单词。这是一个包含函数定义示例的程序: 文件名:src/main.rs fn main() { println!(\"Hello, world!\"); another_function();\n} fn another_function() { println!(\"Another function.\");\n} 我们在 Rust 中通过输入 fn 后面跟着函数名和一对圆括号来定义函数。大括号告诉编译器哪里是函数体的开始和结尾。 可以使用函数名后跟圆括号来调用我们定义过的任意函数。因为程序中已定义 another_function 函数,所以可以在 main 函数中调用它。注意,源码中 another_function 定义在 main 函数 之后 ;也可以定义在之前。Rust 不关心函数定义所在的位置,只要函数被调用时出现在调用之处可见的作用域内就行。 让我们新建一个叫做 functions 的二进制项目来进一步探索函数。将上面的 another_function 例子写入 src/main.rs 中并运行。你应该会看到如下输出: $ cargo run Compiling functions v0.1.0 (file:///projects/functions) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.28s Running `target/debug/functions`\nHello, world!\nAnother function. main 函数中的代码会按顺序执行。首先,打印 “Hello, world!” 信息,然后调用 another_function 函数并打印它的信息。","breadcrumbs":"常见编程概念 » 函数 » 函数","id":"55","title":"函数"},"56":{"body":"我们可以定义为拥有 参数 ( parameters )的函数,参数是特殊变量,是函数签名的一部分。当函数拥有参数(形参)时,可以为这些参数提供具体的值(实参)。技术上讲,这些具体值被称为参数( arguments ),但是在日常交流中,人们倾向于不区分使用 parameter 和 argument 来表示函数定义中的变量或调用函数时传入的具体值。 在这版 another_function 中,我们增加了一个参数: 文件名:src/main.rs fn main() { another_function(5);\n} fn another_function(x: i32) { println!(\"The value of x is: {x}\");\n} 尝试运行程序,将会输出如下内容: $ cargo run Compiling functions v0.1.0 (file:///projects/functions) Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.21s Running `target/debug/functions`\nThe value of x is: 5 another_function 的声明中有一个命名为 x 的参数。x 的类型被指定为 i32。当我们将 5 传给 another_function 时,println! 宏会把 5 放在格式字符串中包含 x 的那对花括号的位置。 在函数签名中, 必须 声明每个参数的类型。这是 Rust 设计中一个经过慎重考虑的决定:要求在函数定义中提供类型注解,意味着编译器再也不需要你在代码的其他地方注明类型来指出你的意图。而且,在知道函数需要什么类型后,编译器就能够给出更有用的错误消息。 当定义多个参数时,使用逗号分隔,像这样: 文件名:src/main.rs fn main() { print_labeled_measurement(5, 'h');\n} fn print_labeled_measurement(value: i32, unit_label: char) { println!(\"The measurement is: {value}{unit_label}\");\n} 这个例子创建了一个名为 print_labeled_measurement 的函数,它有两个参数。第一个参数名为 value,类型是 i32。第二个参数是 unit_label ,类型是 char。然后,该函数打印包含 value 和 unit_label 的文本。 尝试运行代码。使用上面的例子替换当前 functions 项目的 src/main.rs 文件,并用 cargo run 运行它: $ cargo run Compiling functions v0.1.0 (file:///projects/functions) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s Running `target/debug/functions`\nThe measurement is: 5h 因为我们使用 5 作为 value 的值,h 作为 unit_label 的值来调用函数,所以程序输出包含这些值。","breadcrumbs":"常见编程概念 » 函数 » 参数","id":"56","title":"参数"},"57":{"body":"函数体由一系列的语句和一个可选的结尾表达式构成。目前为止,我们提到的函数还不包含结尾表达式,不过你已经见过作为语句一部分的表达式。因为 Rust 是一门基于表达式(expression-based)的语言,这是一个需要理解的(不同于其他语言)重要区别。其他语言并没有这样的区别,所以让我们看看语句与表达式有什么区别以及这些区别是如何影响函数体的。 语句 ( Statements )是执行一些操作但不返回值的指令。 表达式 ( Expressions )计算并产生一个值。让我们看一些例子。 实际上,我们已经使用过语句和表达式。使用 let 关键字创建变量并绑定一个值是一个语句。在列表 3-1 中,let y = 6; 是一个语句。 文件名:src/main.rs fn main() { let y = 6;\n} 列表 3-1:包含一个语句的 main 函数定义 函数定义也是语句,上面整个例子本身就是一个语句。 语句不返回值。因此,不能把 let 语句赋值给另一个变量,比如下面的例子尝试做的,会产生一个错误: 文件名:src/main.rs fn main() { let x = (let y = 6);\n} 当运行这个程序时,会得到如下错误: $ cargo run Compiling functions v0.1.0 (file:///projects/functions)\nerror: expected expression, found `let` statement --> src/main.rs:2:14 |\n2 | let x = (let y = 6); | ^^^ | = note: only supported directly in conditions of `if` and `while` expressions warning: unnecessary parentheses around assigned value --> src/main.rs:2:13 |\n2 | let x = (let y = 6); | ^ ^ | = note: `#[warn(unused_parens)]` on by default\nhelp: remove these parentheses |\n2 - let x = (let y = 6);\n2 + let x = let y = 6; | warning: `functions` (bin \"functions\") generated 1 warning\nerror: could not compile `functions` (bin \"functions\") due to 1 previous error; 1 warning emitted let y = 6 语句并不返回值,所以没有可以绑定到 x 上的值。这与其他语言不同,例如 C 和 Ruby,它们的赋值语句会返回所赋的值。在这些语言中,可以这么写 x = y = 6,这样 x 和 y 的值都是 6;Rust 中不能这样写。 表达式会计算出一个值,并且你将编写的大部分 Rust 代码是由表达式组成的。考虑一个数学运算,比如 5 + 6,这是一个表达式并计算出值 11。表达式可以是语句的一部分:在示例 3-1 中,语句 let y = 6; 中的 6 是一个表达式,它计算出的值是 6。函数调用是一个表达式。宏调用是一个表达式。用大括号创建的一个新的块作用域也是一个表达式,例如: 文件名:src/main.rs fn main() { let y = { let x = 3; x + 1 }; println!(\"The value of y is: {y}\");\n} 这个表达式: { let x = 3; x + 1\n} 是一个代码块,它的值是 4。这个值作为 let 语句的一部分被绑定到 y 上。注意 x+1 这一行在结尾没有分号,与你见过的大部分代码行不同。表达式的结尾没有分号。如果在表达式的结尾加上分号,它就变成了语句,而语句不会返回值。在接下来探索具有返回值的函数和表达式时要谨记这一点。","breadcrumbs":"常见编程概念 » 函数 » 语句和表达式","id":"57","title":"语句和表达式"},"58":{"body":"函数可以向调用它的代码返回值。我们并不对返回值命名,但要在箭头(->)后声明它的类型。在 Rust 中,函数的返回值等同于函数体最后一个表达式的值。使用 return 关键字和指定值,可从函数中提前返回;但大部分函数隐式的返回最后的表达式。这是一个有返回值的函数的例子: 文件名:src/main.rs fn five() -> i32 { 5\n} fn main() { let x = five(); println!(\"The value of x is: {x}\");\n} 在 five 函数中没有函数调用、宏、甚至没有 let 语句 —— 只有数字 5。这在 Rust 中是一个完全有效的函数。注意,也指定了函数返回值的类型,就是 -> i32。尝试运行代码;输出应该看起来像这样: $ cargo run Compiling functions v0.1.0 (file:///projects/functions) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s Running `target/debug/functions`\nThe value of x is: 5 five 函数的返回值是 5,所以返回值类型是 i32。让我们仔细检查一下这段代码。有两个重要的部分:首先,let x = five(); 这一行表明我们使用函数的返回值初始化一个变量。因为 five 函数返回 5,这一行与如下代码相同: let x = 5; 其次,five 函数没有参数并定义了返回值类型,不过函数体只有单单一个 5 也没有分号,因为这是一个表达式,我们想要返回它的值。 让我们看看另一个例子: 文件名:src/main.rs fn main() { let x = plus_one(5); println!(\"The value of x is: {x}\");\n} fn plus_one(x: i32) -> i32 { x + 1\n} 运行代码会打印出 The value of x is: 6。但如果在包含 x + 1 的行尾加上一个分号,把它从表达式变成语句,我们将看到一个错误。 文件名:src/main.rs fn main() { let x = plus_one(5); println!(\"The value of x is: {x}\");\n} fn plus_one(x: i32) -> i32 { x + 1;\n} 运行代码会产生一个错误,如下: $ cargo run Compiling functions v0.1.0 (file:///projects/functions)\nerror[E0308]: mismatched types --> src/main.rs:7:24 |\n7 | fn plus_one(x: i32) -> i32 { | -------- ^^^ expected `i32`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression\n8 | x + 1; | - help: remove this semicolon to return this value For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `functions` (bin \"functions\") due to 1 previous error 主要的错误信息,“mismatched types”(类型不匹配),揭示了代码的核心问题。函数 plus_one 的定义说明它要返回一个 i32 类型的值,不过语句并不会返回值,使用单位类型 () 表示不返回值。因为不返回值与函数定义相矛盾,从而出现一个错误。在输出中,Rust 提供了一条信息,可能有助于纠正这个错误:它建议删除分号,这会修复这个错误。","breadcrumbs":"常见编程概念 » 函数 » 具有返回值的函数","id":"58","title":"具有返回值的函数"},"59":{"body":"ch03-04-comments.md commit d0acb2595c891de97a133d06635c50ab449dd65c 所有程序员都力求使其代码易于理解,不过有时还需要提供额外的解释。在这种情况下,程序员在源码中留下 注释 ( comments ),编译器会忽略它们,不过阅读代码的人可能觉得有用。 这是一个简单的注释: // hello, world 在 Rust 中,惯用的注释样式是以两个斜杠开始注释,并持续到本行的结尾。对于超过一行的注释,需要在每一行前都加上 //,像这样: // So we’re doing something complicated here, long enough that we need\n// multiple lines of comments to do it! Whew! Hopefully, this comment will\n// explain what’s going on. 注释也可以放在包含代码的行的末尾: 文件名:src/main.rs fn main() { let lucky_number = 7; // I’m feeling lucky today\n} 不过你更经常看到的是以这种格式使用它们,也就是位于它所解释的代码行的上面一行: 文件名:src/main.rs fn main() { // I’m feeling lucky today let lucky_number = 7;\n} Rust 还有另一种注释,称为文档注释,我们将在 14 章的 “将 crate 发布到 Crates.io” 部分讨论它。","breadcrumbs":"常见编程概念 » 注释 » 注释","id":"59","title":"注释"},"6":{"body":"数百家大小规模的公司在生产环境中使用 Rust 完成各种任务,包括命令行工具、Web 服务、DevOps 工具、嵌入式设备、音视频分析与转码、加密货币、生物信息学、搜索引擎、物联网(IOT)程序、机器学习,甚至是 Firefox 浏览器的重要部分。","breadcrumbs":"简介 » 公司","id":"6","title":"公司"},"60":{"body":"ch03-05-control-flow.md commit d0acb2595c891de97a133d06635c50ab449dd65c 根据条件是否为真来决定是否执行某些代码,以及根据条件是否为真来重复运行一段代码的能力是大部分编程语言的基本组成部分。Rust 代码中最常见的用来控制执行流的结构是 if 表达式和循环。","breadcrumbs":"常见编程概念 » 控制流 » 控制流","id":"60","title":"控制流"},"61":{"body":"if 表达式允许根据条件执行不同的代码分支。你提供一个条件并表示 “如果条件满足,运行这段代码;如果条件不满足,不运行这段代码。 在 projects 目录新建一个叫做 branches 的项目,来学习 if 表达式。在 src/main.rs 文件中,输入如下内容: 文件名:src/main.rs fn main() { let number = 3; if number < 5 { println!(\"condition was true\"); } else { println!(\"condition was false\"); }\n} 所有的 if 表达式都以 if 关键字开头,其后跟一个条件。在这个例子中,条件检查变量 number 的值是否小于 5。在条件为 true 时希望执行的代码块位于紧跟条件之后的大括号中。if 表达式中与条件关联的代码块有时被叫做 arms ,就像第二章 “比较猜测的数字和秘密数字” 部分中讨论到的 match 表达式中的分支一样。 也可以包含一个可选的 else 表达式来提供一个在条件为 false 时应当执行的代码块,这里我们就这么做了。如果不提供 else 表达式并且条件为 false 时,程序会直接忽略 if 代码块并继续执行下面的代码。 尝试运行代码,应该能看到如下输出: $ cargo run Compiling branches v0.1.0 (file:///projects/branches) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s Running `target/debug/branches`\ncondition was true 尝试改变 number 的值使条件为 false 时看看会发生什么: # fn main() { let number = 7;\n# # if number < 5 {\n# println!(\"condition was true\");\n# } else {\n# println!(\"condition was false\");\n# }\n# } 再次运行程序并查看输出: $ cargo run Compiling branches v0.1.0 (file:///projects/branches) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s Running `target/debug/branches`\ncondition was false 另外值得注意的是代码中的条件 必须 是 bool 值。如果条件不是 bool 值,我们将得到一个错误。例如,尝试运行以下代码: 文件名:src/main.rs fn main() { let number = 3; if number { println!(\"number was three\"); }\n} 这里 if 条件的值是 3,Rust 抛出了一个错误: $ cargo run Compiling branches v0.1.0 (file:///projects/branches)\nerror[E0308]: mismatched types --> src/main.rs:4:8 |\n4 | if number { | ^^^^^^ expected `bool`, found integer For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `branches` (bin \"branches\") due to 1 previous error 这个错误表明 Rust 期望一个 bool 却得到了一个整数。不像 Ruby 或 JavaScript 这样的语言,Rust 并不会尝试自动地将非布尔值转换为布尔值。必须总是显式地使用布尔值作为 if 的条件。例如,如果想要 if 代码块只在一个数字不等于 0 时执行,可以把 if 表达式修改成下面这样: 文件名:src/main.rs fn main() { let number = 3; if number != 0 { println!(\"number was something other than zero\"); }\n} 运行代码会打印出 number was something other than zero。 使用 else if 处理多重条件 可以将 else if 表达式与 if 和 else 组合来实现多重条件。例如: 文件名:src/main.rs fn main() { let number = 6; if number % 4 == 0 { println!(\"number is divisible by 4\"); } else if number % 3 == 0 { println!(\"number is divisible by 3\"); } else if number % 2 == 0 { println!(\"number is divisible by 2\"); } else { println!(\"number is not divisible by 4, 3, or 2\"); }\n} 这个程序有四个可能的执行路径。运行后应该能看到如下输出: $ cargo run Compiling branches v0.1.0 (file:///projects/branches) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s Running `target/debug/branches`\nnumber is divisible by 3 当执行这个程序时,它按顺序检查每个 if 表达式并执行第一个条件为 true 的代码块。注意即使 6 可以被 2 整除,也不会输出 number is divisible by 2,更不会输出 else 块中的 number is not divisible by 4, 3, or 2。原因是 Rust 只会执行第一个条件为 true 的代码块,并且一旦它找到一个以后,甚至都不会检查剩下的条件了。 使用过多的 else if 表达式会使代码显得杂乱无章,所以如果有多于一个 else if 表达式,最好重构代码。为此,第六章会介绍一个强大的 Rust 分支结构(branching construct),叫做 match。 在 let 语句中使用 if 因为 if 是一个表达式,我们可以在 let 语句的右侧使用它,例如在示例 3-2 中: 文件名:src/main.rs fn main() { let condition = true; let number = if condition { 5 } else { 6 }; println!(\"The value of number is: {number}\");\n} 示例 3-2:将 if 表达式的返回值赋给一个变量 number 变量将会绑定到表示 if 表达式结果的值上。运行这段代码看看会出现什么: $ cargo run Compiling branches v0.1.0 (file:///projects/branches) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s Running `target/debug/branches`\nThe value of number is: 5 记住,代码块的值是其最后一个表达式的值,而数字本身就是一个表达式。在这个例子中,整个 if 表达式的值取决于哪个代码块被执行。这意味着 if 的每个分支的可能的返回值都必须是相同类型;在示例 3-2 中,if 分支和 else 分支的结果都是 i32 整型。如果它们的类型不匹配,如下面这个例子,则会出现一个错误: 文件名:src/main.rs fn main() { let condition = true; let number = if condition { 5 } else { \"six\" }; println!(\"The value of number is: {number}\");\n} 当编译这段代码时,会得到一个错误。if 和 else 分支的值类型是不相容的,同时 Rust 也准确地指出在程序中的何处发现的这个问题: $ cargo run Compiling branches v0.1.0 (file:///projects/branches)\nerror[E0308]: `if` and `else` have incompatible types --> src/main.rs:4:44 |\n4 | let number = if condition { 5 } else { \"six\" }; | - ^^^^^ expected integer, found `&str` | | | expected because of this For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `branches` (bin \"branches\") due to 1 previous error if 代码块中的表达式返回一个整数,而 else 代码块中的表达式返回一个字符串。这不可行,因为变量必须只有一个类型。Rust 需要在编译时就确切的知道 number 变量的类型,这样它就可以在编译时验证在每处使用的 number 变量的类型是有效的。如果number的类型仅在运行时确定,则 Rust 无法做到这一点;且编译器必须跟踪每一个变量的多种假设类型,那么它就会变得更加复杂,对代码的保证也会减少。","breadcrumbs":"常见编程概念 » 控制流 » if 表达式","id":"61","title":"if 表达式"},"62":{"body":"多次执行同一段代码是很常用的,Rust 为此提供了多种 循环 ( loops )。一个循环执行循环体中的代码直到结尾并紧接着回到开头继续执行。为了实验一下循环,让我们新建一个叫做 loops 的项目。 Rust 有三种循环:loop、while 和 for。我们每一个都试试。 使用 loop 重复执行代码 loop 关键字告诉 Rust 一遍又一遍地执行一段代码直到你明确要求停止。 作为一个例子,将 loops 目录中的 src/main.rs 文件修改为如下: 文件名:src/main.rs fn main() { loop { println!(\"again!\"); }\n} 当运行这个程序时,我们会看到连续的反复打印 again!,直到我们手动停止程序。大部分终端都支持一个快捷键,ctrl-c,来终止一个陷入无限循环的程序。尝试一下: $ cargo run Compiling loops v0.1.0 (file:///projects/loops) Finished dev [unoptimized + debuginfo] target(s) in 0.29s Running `target/debug/loops`\nagain!\nagain!\nagain!\nagain!\n^Cagain! 符号 ^C 代表你在这按下了ctrl-c。在 ^C 之后你可能看到也可能看不到 again! ,这取决于在接收到终止信号时代码执行到了循环的何处。 幸运的是,Rust 提供了一种从代码中跳出循环的方法。可以使用 break 关键字来告诉程序何时停止循环。回忆一下在第二章猜猜看游戏的 “猜测正确后退出” 部分使用过它来在用户猜对数字赢得游戏后退出程序。 我们在猜谜游戏中也使用了 continue。循环中的 continue 关键字告诉程序跳过这个循环迭代中的任何剩余代码,并转到下一个迭代。 从循环返回值 loop 的一个用例是重试可能会失败的操作,比如检查线程是否完成了任务。然而你可能会需要将操作的结果传递给其它的代码。如果将返回值加入你用来停止循环的 break 表达式,它会被停止的循环返回: fn main() { let mut counter = 0; let result = loop { counter += 1; if counter == 10 { break counter * 2; } }; println!(\"The result is {result}\");\n} 在循环之前,我们声明了一个名为 counter 的变量并初始化为 0。接着声明了一个名为 result 来存放循环的返回值。在循环的每一次迭代中,我们将 counter 变量加 1,接着检查计数是否等于 10。当相等时,使用 break 关键字返回值 counter * 2。循环之后,我们通过分号结束赋值给 result 的语句。最后打印出 result 的值,也就是 20。 循环标签:在多个循环之间消除歧义 如果存在嵌套循环,break 和 continue 应用于此时最内层的循环。你可以选择在一个循环上指定一个 循环标签 ( loop label ),然后将标签与 break 或 continue 一起使用,使这些关键字应用于已标记的循环而不是最内层的循环。下面是一个包含两个嵌套循环的示例 fn main() { let mut count = 0; 'counting_up: loop { println!(\"count = {count}\"); let mut remaining = 10; loop { println!(\"remaining = {remaining}\"); if remaining == 9 { break; } if count == 2 { break 'counting_up; } remaining -= 1; } count += 1; } println!(\"End count = {count}\");\n} 外层循环有一个标签 counting_up,它将从 0 数到 2。没有标签的内部循环从 10 向下数到 9。第一个没有指定标签的 break 将只退出内层循环。break 'counting_up; 语句将退出外层循环。这个代码打印: $ cargo run Compiling loops v0.1.0 (file:///projects/loops) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.58s Running `target/debug/loops`\ncount = 0\nremaining = 10\nremaining = 9\ncount = 1\nremaining = 10\nremaining = 9\ncount = 2\nremaining = 10\nEnd count = 2 while 条件循环 在程序中计算循环的条件也很常见。当条件为 true,执行循环。当条件不再为 true,调用 break 停止循环。这个循环类型可以通过组合 loop、if、else 和 break 来实现;如果你喜欢的话,现在就可以在程序中试试。 然而,这个模式太常用了,Rust 为此内置了一个语言结构,它被称为 while 循环。示例 3-3 使用了 while:程序循环三次,每次数字都减一。接着,在循环结束后,打印出另一个信息并退出。 文件名:src/main.rs fn main() { let mut number = 3; while number != 0 { println!(\"{number}!\"); number -= 1; } println!(\"LIFTOFF!!!\");\n} 示例 3-3: 当条件为真时,使用 while 循环运行代码 这种结构消除了很多使用 loop、if、else 和 break 时所必须的嵌套,这样更加清晰。当条件为 true 就执行,否则退出循环。 使用 for 遍历集合 可以使用 while 结构来遍历集合中的元素,比如数组。例如,看看示例 3-4。 文件名:src/main.rs fn main() { let a = [10, 20, 30, 40, 50]; let mut index = 0; while index < 5 { println!(\"the value is: {}\", a[index]); index += 1; }\n} 示例 3-4:使用 while 循环遍历集合中的元素 这里,代码对数组中的元素进行计数。它从索引 0 开始,并接着循环直到遇到数组的最后一个索引(这时,index < 5 不再为真)。运行这段代码会打印出数组中的每一个元素: $ cargo run Compiling loops v0.1.0 (file:///projects/loops) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.32s Running `target/debug/loops`\nthe value is: 10\nthe value is: 20\nthe value is: 30\nthe value is: 40\nthe value is: 50 数组中的所有五个元素都如期被打印出来。尽管 index 在某一时刻会到达值 5,不过循环在其尝试从数组获取第六个值(会越界)之前就停止了。 但这个过程很容易出错;如果索引长度或测试条件不正确会导致程序 panic。例如,如果将 a 数组的定义改为包含 4 个元素而忘记了更新条件 while index < 4,则代码会 panic。这也使程序更慢,因为编译器增加了运行时代码来对每次循环进行条件检查,以确定在循环的每次迭代中索引是否在数组的边界内。 作为更简洁的替代方案,可以使用 for 循环来对一个集合的每个元素执行一些代码。for 循环看起来如示例 3-5 所示: 文件名:src/main.rs fn main() { let a = [10, 20, 30, 40, 50]; for element in a { println!(\"the value is: {element}\"); }\n} 示例 3-5:使用 for 循环遍历集合中的元素 当运行这段代码时,将看到与示例 3-4 一样的输出。更为重要的是,我们增强了代码安全性,并消除了可能由于超出数组的结尾或遍历长度不够而缺少一些元素而导致的 bug。 例如,在示例 3-4 的代码中,如果你将 a 数组的定义改为有四个元素,但忘记将条件更新为 while index < 4,代码将会 panic。使用 for 循环的话,就不需要惦记着在改变数组元素个数时修改其他的代码了。 for 循环的安全性和简洁性使得它成为 Rust 中使用最多的循环结构。即使是在想要循环执行代码特定次数时,例如示例 3-3 中使用 while 循环的倒计时例子,大部分 Rustacean 也会使用 for 循环。这么做的方式是使用 Range,它是标准库提供的类型,用来生成从一个数字开始到另一个数字之前结束的所有数字的序列。 下面是一个使用 for 循环来倒计时的例子,它还使用了一个我们还未讲到的方法,rev,用来反转 range。 注意:以下代码不会踏足到数字 4,仅从一个数字开始到另一个数字之前。 文件名:src/main.rs fn main() { for number in (1..4).rev() { println!(\"{number}!\"); } println!(\"LIFTOFF!!!\");\n} 这段代码看起来更帅气不是吗?","breadcrumbs":"常见编程概念 » 控制流 » 使用循环重复执行","id":"62","title":"使用循环重复执行"},"63":{"body":"你做到了!这是一个大章节:你学习了变量、标量和复合数据类型、函数、注释、 if 表达式和循环!如果你想要实践本章讨论的概念,尝试构建如下程序: 相互转换摄氏与华氏温度。 生成第 n 个斐波那契数。 打印圣诞颂歌 “The Twelve Days of Christmas” 的歌词,并利用歌曲中的重复部分(编写循环)。 当你准备好继续的时候,让我们讨论一个其他语言中 并不 常见的概念:所有权(ownership)。","breadcrumbs":"常见编程概念 » 控制流 » 总结","id":"63","title":"总结"},"64":{"body":"ch04-00-understanding-ownership.md commit a5e0c5b2c5f9054be3b961aea2c7edfeea591de8 所有权(系统)是 Rust 最为与众不同的特性,对语言的其他部分有着深刻含义。它让 Rust 无需垃圾回收(garbage collector)即可保障内存安全,因此理解 Rust 中所有权如何工作是十分重要的。本章,我们将讲到所有权以及相关功能:借用(borrowing)、slice 以及 Rust 如何在内存中布局数据。","breadcrumbs":"认识所有权 » 认识所有权","id":"64","title":"认识所有权"},"65":{"body":"ch04-01-what-is-ownership.md commit 3d51f70c78162faaebcab0da0de2ddd333e7a8ed 所有权 ( ownership )是 Rust 用于如何管理内存的一组规则。所有程序都必须管理其运行时使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时有规律地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则,程序都不能编译。在运行时,所有权系统的任何功能都不会减慢程序。 因为所有权对很多程序员来说都是一个新概念,需要一些时间来适应。好消息是随着你对 Rust 和所有权系统的规则越来越有经验,你就越能自然地编写出安全和高效的代码。持之以恒! 当你理解了所有权,你将有一个坚实的基础来理解那些使 Rust 独特的功能。在本章中,你将通过完成一些示例来学习所有权,这些示例基于一个常用的数据结构:字符串。","breadcrumbs":"认识所有权 » 什么是所有权? » 什么是所有权?","id":"65","title":"什么是所有权?"},"66":{"body":"在很多语言中,你并不需要经常考虑到栈与堆。不过在像 Rust 这样的系统编程语言中,值是位于栈上还是堆上在更大程度上影响了语言的行为以及为何必须做出这样的抉择。我们会在本章的稍后部分描述所有权与栈和堆相关的内容,所以这里只是一个用来预热的简要解释。 栈和堆都是代码在运行时可供使用的内存,但是它们的结构不同。栈以放入值的顺序存储值并以相反顺序取出值。这也被称作 后进先出 ( last in, first out )。想象一下一叠盘子:当增加更多盘子时,把它们放在盘子堆的顶部,当需要盘子时,也从顶部拿走。不能从中间也不能从底部增加或拿走盘子!增加数据叫做 进栈 ( pushing onto the stack ),而移出数据叫做 出栈 ( popping off the stack )。栈中的所有数据都必须占用已知且固定的大小。在编译时大小未知或大小可能变化的数据,要改为存储在堆上。 堆是缺乏组织的:当向堆放入数据时,你要请求一定大小的空间。内存分配器(memory allocator)在堆的某处找到一块足够大的空位,把它标记为已使用,并返回一个表示该位置地址的 指针 ( pointer )。这个过程称作 在堆上分配内存 ( allocating on the heap ),有时简称为 “分配”(allocating)。(将数据推入栈中并不被认为是分配)。因为指向放入堆中数据的指针是已知的并且大小是固定的,你可以将该指针存储在栈上,不过当需要实际数据时,必须访问指针。想象一下去餐馆就座吃饭。当进入时,你说明有几个人,餐馆员工会找到一个够大的空桌子并领你们过去。如果有人来迟了,他们也可以通过询问来找到你们坐在哪。 入栈比在堆上分配内存要快,因为(入栈时)分配器无需为存储新数据去搜索内存空间;其位置总是在栈顶。相比之下,在堆上分配内存则需要更多的工作,这是因为分配器必须首先找到一块足够存放数据的内存空间,并接着做一些记录为下一次分配做准备。 访问堆上的数据比访问栈上的数据慢,因为必须通过指针来访问。现代处理器在内存中跳转越少就越快(缓存)。继续类比,假设有一个服务员在餐厅里处理多个桌子的点菜。在一个桌子报完所有菜后再移动到下一个桌子是最有效率的。从桌子 A 听一个菜,接着桌子 B 听一个菜,然后再桌子 A,然后再桌子 B 这样的流程会更加缓慢。出于同样原因,处理器在处理的数据彼此较近的时候(比如在栈上)比较远的时候(比如可能在堆上)能更好的工作。 当你的代码调用一个函数时,传递给函数的值(包括可能指向堆上数据的指针)和函数的局部变量被压入栈中。当函数结束时,这些值被移出栈。 跟踪哪部分代码正在使用堆上的哪些数据,最大限度的减少堆上的重复数据的数量,以及清理堆上不再使用的数据确保不会耗尽空间,这些问题正是所有权系统要处理的。一旦理解了所有权,你就不需要经常考虑栈和堆了,不过明白了所有权的主要目的就是管理堆数据,能够帮助解释为什么所有权要以这种方式工作。","breadcrumbs":"认识所有权 » 什么是所有权? » 栈(Stack)与堆(Heap)","id":"66","title":"栈(Stack)与堆(Heap)"},"67":{"body":"首先,让我们看一下所有权的规则。当我们通过举例说明时,请谨记这些规则: Rust 中的每一个值都有一个 所有者 ( owner )。 值在任一时刻有且只有一个所有者。 当所有者(变量)离开作用域,这个值将被丢弃。","breadcrumbs":"认识所有权 » 什么是所有权? » 所有权规则","id":"67","title":"所有权规则"},"68":{"body":"既然我们已经掌握了基本语法,将不会在之后的例子中包含 fn main() { 代码,所以如果你是一路跟过来的,必须手动将之后例子的代码放入一个 main 函数中。这样,例子将显得更加简明,使我们可以关注实际细节而不是样板代码。 在所有权的第一个例子中,我们看看一些变量的 作用域 ( scope )。作用域是一个项(item)在程序中有效的范围。假设有这样一个变量: let s = \"hello\"; 变量 s 绑定到了一个字符串字面值,这个字符串值是硬编码进程序代码中的。这个变量从声明的点开始直到当前 作用域 结束时都是有效的。示例 4-1 中的注释标明了变量 s 在何处是有效的。 # fn main() { { // s 在这里无效,它尚未声明 let s = \"hello\"; // 从此处起,s 是有效的 // 使用 s } // 此作用域已结束,s 不再有效\n# } 示例 4-1:一个变量和其有效的作用域 换句话说,这里有两个重要的时间点: 当 s 进入作用域 时,它就是有效的。 这一直持续到它 离开作用域 为止。 目前为止,变量是否有效与作用域的关系跟其他编程语言是类似的。现在我们在此基础上介绍 String 类型。","breadcrumbs":"认识所有权 » 什么是所有权? » 变量作用域","id":"68","title":"变量作用域"},"69":{"body":"为了演示所有权的规则,我们需要一个比第三章 “数据类型” 中讲到的都要复杂的数据类型。前面介绍的类型都是已知大小的,可以存储在栈中,并且当离开作用域时被移出栈,如果代码的另一部分需要在不同的作用域中使用相同的值,可以快速简单地复制它们来创建一个新的独立实例。不过我们需要寻找一个存储在堆上的数据来探索 Rust 是如何知道该在何时清理数据的。 我们会专注于 String 与所有权相关的部分。这些方面也同样适用于标准库提供的或你自己创建的其他复杂数据类型。在 第八章 会更深入地讲解 String。 我们已经见过字符串字面值,即被硬编码进程序里的字符串值。字符串字面值是很方便的,不过它们并不适合使用文本的每一种场景。原因之一就是它们是不可变的。另一个原因是并非所有字符串的值都能在编写代码时就知道:例如,要是想获取用户输入并存储该怎么办呢?为此,Rust 有另一种字符串类型,String。这个类型管理被分配到堆上的数据,所以能够存储在编译时未知大小的文本。可以使用 from 函数基于字符串字面值来创建 String,如下: let s = String::from(\"hello\"); 这两个冒号 :: 是运算符,允许将特定的 from 函数置于 String 类型的命名空间(namespace)下,而不需要使用类似 string_from 这样的名字。在第五章的 “方法语法”(“Method Syntax”) 部分会着重讲解这个语法,而且在第七章的 “路径用于引用模块树中的项” 中会讲到模块的命名空间。 可以 修改此类字符串: # fn main() { let mut s = String::from(\"hello\"); s.push_str(\", world!\"); // push_str() 在字符串后追加字面值 println!(\"{s}\"); // 将打印 `hello, world!`\n# } 那么这里有什么区别呢?为什么 String 可变而字面值却不行呢?区别在于两个类型对内存的处理上。","breadcrumbs":"认识所有权 » 什么是所有权? » String 类型","id":"69","title":"String 类型"},"7":{"body":"Rust 适合那些希望构建 Rust 编程语言、社区、开发工具和库的开发者。我们非常欢迎你为 Rust 语言作出贡献。","breadcrumbs":"简介 » 开源开发者","id":"7","title":"开源开发者"},"70":{"body":"就字符串字面值来说,我们在编译时就知道其内容,所以文本被直接硬编码进最终的可执行文件中。这使得字符串字面值快速且高效。不过这些特性都只得益于字符串字面值的不可变性。不幸的是,我们不能为了每一个在编译时大小未知的文本而将一块内存放入二进制文件中,并且它的大小还可能随着程序运行而改变。 对于 String 类型,为了支持一个可变,可增长的文本片段,需要在堆上分配一块在编译时未知大小的内存来存放内容。这意味着: 必须在运行时向内存分配器(memory allocator)请求内存。 需要一个当我们处理完 String 时将内存返回给分配器的方法。 第一部分由我们完成:当调用 String::from 时,它的实现 ( implementation ) 请求其所需的内存。这在编程语言中是非常通用的。 然而,第二部分实现起来就各有区别了。在有 垃圾回收 ( garbage collector , GC )的语言中,GC 记录并清除不再使用的内存,而我们并不需要关心它。在大部分没有 GC 的语言中,识别出不再使用的内存并调用代码显式释放就是我们的责任了,跟请求内存的时候一样。从历史的角度上说正确处理内存回收曾经是一个困难的编程问题。如果忘记回收了会浪费内存。如果过早回收了,将会出现无效变量。如果重复回收,这也是个 bug。我们需要精确的为一个 allocate 配对一个 free。 Rust 采取了一个不同的策略:内存在拥有它的变量离开作用域后就被自动释放。下面是示例 4-1 中作用域例子的一个使用 String 而不是字符串字面值的版本: # fn main() { { let s = String::from(\"hello\"); // 从此处起,s 是有效的 // 使用 s } // 此作用域已结束, // s 不再有效\n# } 这是一个将 String 需要的内存返回给分配器的很自然的位置:当 s 离开作用域的时候。当变量离开作用域,Rust 为我们调用一个特殊的函数。这个函数叫做 drop ,在这里 String 的作者可以放置释放内存的代码。Rust 在结尾的 } 处自动调用 drop。 注意:在 C++ 中,这种 item 在生命周期结束时释放资源的模式有时被称作 资源获取即初始化 ( Resource Acquisition Is Initialization (RAII) )。如果你使用过 RAII 模式的话应该对 Rust 的 drop 函数并不陌生。 这个模式对编写 Rust 代码的方式有着深远的影响。现在它看起来很简单,不过在更复杂的场景下代码的行为可能是不可预测的,比如当有多个变量使用在堆上分配的内存时。现在让我们探索一些这样的场景。 变量与数据交互的方式(一):移动 在 Rust 中,多个变量可以采取不同的方式与同一数据进行交互。让我们看看示例 4-2 中一个使用整型的例子。 # fn main() { let x = 5; let y = x;\n# } 示例 4-2:将变量 x 的整数值赋给 y 我们大致可以猜到这在干什么:“将 5 绑定到 x;接着生成一个值 x 的拷贝并绑定到 y”。现在有了两个变量,x 和 y,都等于 5。这也正是事实上发生了的,因为整数是有已知固定大小的简单值,所以这两个 5 被放入了栈中。 现在看看这个 String 版本: # fn main() { let s1 = String::from(\"hello\"); let s2 = s1;\n# } 这看起来与上面的代码非常类似,所以我们可能会假设它们的运行方式也是类似的:也就是说,第二行可能会生成一个 s1 的拷贝并绑定到 s2 上。不过,事实上并不完全是这样。 看看图 4-1 以了解 String 的底层会发生什么。String 由三部分组成,如图左侧所示:一个指向存放字符串内容内存的指针,一个长度,和一个容量。这一组数据存储在栈上。右侧则是堆上存放内容的内存部分。 图 4-1:将值 \"hello\" 绑定给 s1 的 String 在内存中的表现形式 长度表示 String 的内容当前使用了多少字节的内存。容量是 String 从分配器总共获取了多少字节的内存。长度与容量的区别是很重要的,不过在当前上下文中并不重要,所以现在可以忽略容量。 当我们将 s1 赋值给 s2,String 的数据被复制了,这意味着我们从栈上拷贝了它的指针、长度和容量。我们并没有复制指针指向的堆上数据。换句话说,内存中数据的表现如图 4-2 所示。 图 4-2:变量 s2 的内存表现,它有一份 s1 指针、长度和容量的拷贝 这个表现形式看起来 并不像 图 4-3 中的那样,如果 Rust 也拷贝了堆上的数据,那么内存看起来就是这样的。如果 Rust 这么做了,那么操作 s2 = s1 在堆上数据比较大的时候会对运行时性能造成非常大的影响。 图 4-3:另一个 s2 = s1 时可能的内存表现,如果 Rust 同时也拷贝了堆上的数据的话 之前我们提到过当变量离开作用域后,Rust 自动调用 drop 函数并清理变量的堆内存。不过图 4-2 展示了两个数据指针指向了同一位置。这就有了一个问题:当 s2 和 s1 离开作用域,它们都会尝试释放相同的内存。这是一个叫做 二次释放 ( double free )的错误,也是之前提到过的内存安全性 bug 之一。两次释放(相同)内存会导致内存污染,它可能会导致潜在的安全漏洞。 为了确保内存安全,在 let s2 = s1; 之后,Rust 认为 s1 不再有效,因此 Rust 不需要在 s1 离开作用域后清理任何东西。看看在 s2 被创建之后尝试使用 s1 会发生什么;这段代码不能运行: # fn main() { let s1 = String::from(\"hello\"); let s2 = s1; println!(\"{s1}, world!\");\n# } 你会得到一个类似如下的错误,因为 Rust 禁止你使用无效的引用。 $ cargo run Compiling ownership v0.1.0 (file:///projects/ownership)\nerror[E0382]: borrow of moved value: `s1` --> src/main.rs:5:15 |\n2 | let s1 = String::from(\"hello\"); | -- move occurs because `s1` has type `String`, which does not implement the `Copy` trait\n3 | let s2 = s1; | -- value moved here\n4 |\n5 | println!(\"{s1}, world!\"); | ^^^^ value borrowed here after move | = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)\nhelp: consider cloning the value if the performance cost is acceptable |\n3 | let s2 = s1.clone(); | ++++++++ For more information about this error, try `rustc --explain E0382`.\nerror: could not compile `ownership` (bin \"ownership\") due to 1 previous error 如果你在其他语言中听说过术语 浅拷贝 ( shallow copy )和 深拷贝 ( deep copy ),那么拷贝指针、长度和容量而不拷贝数据可能听起来像浅拷贝。不过因为 Rust 同时使第一个变量无效了,这个操作被称为 移动 ( move ),而不是叫做浅拷贝。上面的例子可以解读为 s1 被 移动 到了 s2 中。那么具体发生了什么,如图 4-4 所示。 图 4-4:s1 无效之后的内存表现 这样就解决了我们的问题!因为只有 s2 是有效的,当其离开作用域,它就释放自己的内存,完毕。 另外,这里还隐含了一个设计选择:Rust 永远也不会自动创建数据的 “深拷贝”。因此,任何 自动 的复制都可以被认为是对运行时性能影响较小的。 变量与数据交互的方式(二):克隆 如果我们 确实 需要深度复制 String 中堆上的数据,而不仅仅是栈上的数据,可以使用一个叫做 clone 的通用函数。第五章会讨论方法语法,不过因为方法在很多语言中是一个常见功能,所以之前你可能已经见过了。 这是一个实际使用 clone 方法的例子: # fn main() { let s1 = String::from(\"hello\"); let s2 = s1.clone(); println!(\"s1 = {s1}, s2 = {s2}\");\n# } 这段代码能正常运行,并且明确产生图 4-3 中行为,这里堆上的数据 确实 被复制了。 当出现 clone 调用时,你知道一些特定的代码被执行而且这些代码可能相当消耗资源。你很容易察觉到一些不寻常的事情正在发生。 只在栈上的数据:拷贝 这里还有一个没有提到的小窍门。这些代码使用了整型并且是有效的,它们是示例 4-2 中的一部分: # fn main() { let x = 5; let y = x; println!(\"x = {x}, y = {y}\");\n# } 但这段代码似乎与我们刚刚学到的内容相矛盾:没有调用 clone,不过 x 依然有效且没有被移动到 y 中。 原因是像整型这样的在编译时已知大小的类型被整个存储在栈上,所以拷贝其实际的值是快速的。这意味着没有理由在创建变量 y 后使 x 无效。换句话说,这里没有深浅拷贝的区别,所以这里调用 clone 并不会与通常的浅拷贝有什么不同,我们可以不用管它。 Rust 有一个叫做 Copy trait 的特殊注解,可以用在类似整型这样的存储在栈上的类型上( 第十章 将会详细讲解 trait)。如果一个类型实现了 Copy trait,那么一个旧的变量在将其赋值给其他变量后仍然可用。 Rust 不允许自身或其任何部分实现了 Drop trait 的类型使用 Copy trait。如果我们对其值离开作用域时需要特殊处理的类型使用 Copy 注解,将会出现一个编译时错误。要学习如何为你的类型添加 Copy 注解以实现该 trait,请阅读附录 C 中的 “可派生的 trait” 。 那么哪些类型实现了 Copy trait 呢?你可以查看给定类型的文档来确认,不过作为一个通用的规则,任何一组简单标量值的组合都可以实现 Copy,任何不需要分配内存或某种形式资源的类型都可以实现 Copy 。如下是一些 Copy 的类型: 所有整数类型,比如 u32。 布尔类型,bool,它的值是 true 和 false。 所有浮点数类型,比如 f64。 字符类型,char。 元组,当且仅当其包含的类型也都实现 Copy 的时候。比如,(i32, i32) 实现了 Copy,但 (i32, String) 就没有。","breadcrumbs":"认识所有权 » 什么是所有权? » 内存与分配","id":"70","title":"内存与分配"},"71":{"body":"将值传递给函数与给变量赋值的原理相似。向函数传递值可能会移动或者复制,就像赋值语句一样。示例 4-3 使用注释展示变量何时进入和离开作用域: 文件名:src/main.rs fn main() { let s = String::from(\"hello\"); // s 进入作用域 takes_ownership(s); // s 的值移动到函数里 ... // ... 所以到这里不再有效 let x = 5; // x 进入作用域 makes_copy(x); // x 应该移动函数里, // 但 i32 是 Copy 的, // 所以在后面可继续使用 x } // 这里,x 先移出了作用域,然后是 s。但因为 s 的值已被移走, // 没有特殊之处 fn takes_ownership(some_string: String) { // some_string 进入作用域 println!(\"{some_string}\");\n} // 这里,some_string 移出作用域并调用 `drop` 方法。 // 占用的内存被释放 fn makes_copy(some_integer: i32) { // some_integer 进入作用域 println!(\"{some_integer}\");\n} // 这里,some_integer 移出作用域。没有特殊之处 示例 4-3:带有所有权和作用域注释的函数 当尝试在调用 takes_ownership 后使用 s 时,Rust 会抛出一个编译时错误。这些静态检查使我们免于犯错。试试在 main 函数中添加使用 s 和 x 的代码来看看哪里能使用它们,以及所有权规则会在哪里阻止我们这么做。","breadcrumbs":"认识所有权 » 什么是所有权? » 所有权与函数","id":"71","title":"所有权与函数"},"72":{"body":"返回值也可以转移所有权。示例 4-4 展示了一个返回了某些值的示例,与示例 4-3 一样带有类似的注释。 文件名:src/main.rs fn main() { let s1 = gives_ownership(); // gives_ownership 将返回值 // 转移给 s1 let s2 = String::from(\"hello\"); // s2 进入作用域 let s3 = takes_and_gives_back(s2); // s2 被移动到 // takes_and_gives_back 中, // 它也将返回值移给 s3\n} // 这里,s3 移出作用域并被丢弃。s2 也移出作用域,但已被移走, // 所以什么也不会发生。s1 离开作用域并被丢弃 fn gives_ownership() -> String { // gives_ownership 会将 // 返回值移动给 // 调用它的函数 let some_string = String::from(\"yours\"); // some_string 进入作用域。 some_string // 返回 some_string // 并移出给调用的函数 // } // takes_and_gives_back 将传入字符串并返回该值\nfn takes_and_gives_back(a_string: String) -> String { // a_string 进入作用域 // a_string // 返回 a_string 并移出给调用的函数\n} 示例 4-4: 转移返回值的所有权 变量的所有权总是遵循相同的模式:将值赋给另一个变量时移动它。当持有堆中数据值的变量离开作用域时,其值将通过 drop 被清理掉,除非数据被移动为另一个变量所有。 虽然这样是可以的,但是在每一个函数中都获取所有权并接着返回所有权有些啰嗦。如果我们想要函数使用一个值但不获取所有权该怎么办呢?如果我们还要接着使用它的话,每次都传进去再返回来就有点烦人了,除此之外,我们也可能想返回函数体中产生的一些数据。 我们可以使用元组来返回多个值,如示例 4-5 所示。 文件名:src/main.rs fn main() { let s1 = String::from(\"hello\"); let (s2, len) = calculate_length(s1); println!(\"The length of '{s2}' is {len}.\");\n} fn calculate_length(s: String) -> (String, usize) { let length = s.len(); // len() 返回字符串的长度 (s, length)\n} 示例 4-5: 返回参数的所有权 但是这未免有些形式主义,而且这种场景应该很常见。幸运的是,Rust 对此提供了一个不用获取所有权就可以使用值的功能,叫做 引用 ( references )。","breadcrumbs":"认识所有权 » 什么是所有权? » 返回值与作用域","id":"72","title":"返回值与作用域"},"73":{"body":"ch04-02-references-and-borrowing.md commit 3d51f70c78162faaebcab0da0de2ddd333e7a8ed 示例 4-5 中的元组代码有这样一个问题:我们必须将 String 返回给调用函数,以便在调用 calculate_length 后仍能使用 String,因为 String 被移动到了 calculate_length 内。相反我们可以提供一个 String 值的引用(reference)。 引用 ( reference )像一个指针,因为它是一个地址,我们可以由此访问储存于该地址的属于其他变量的数据。 与指针不同,引用确保指向某个特定类型的有效值。 下面是如何定义并使用一个(新的)calculate_length 函数,它以一个对象的引用作为参数而不是获取值的所有权: 文件名:src/main.rs fn main() { let s1 = String::from(\"hello\"); let len = calculate_length(&s1); println!(\"The length of '{s1}' is {len}.\");\n} fn calculate_length(s: &String) -> usize { s.len()\n} 首先,注意变量声明和函数返回值中的所有元组代码都消失了。其次,注意我们传递 &s1 给 calculate_length,同时在函数定义中,我们获取 &String 而不是 String。这些 & 符号就是 引用 ,它们允许你使用值但不获取其所有权。图 4-6 展示了一张示意图。 图 4-6:&String s 指向 String s1 示意图 注意:与使用 & 引用相反的操作是 解引用 ( dereferencing ),它使用解引用运算符,*。我们将会在第八章遇到一些解引用运算符,并在第十五章详细讨论解引用。 仔细看看这个函数调用: # fn main() { let s1 = String::from(\"hello\"); let len = calculate_length(&s1);\n# # println!(\"The length of '{s1}' is {len}.\");\n# }\n# # fn calculate_length(s: &String) -> usize {\n# s.len()\n# } &s1 语法让我们创建一个 指向 值 s1 的引用,但是并不拥有它。因为并不拥有这个值,所以当引用停止使用时,它所指向的值也不会被丢弃。 同理,函数签名使用 & 来表明参数 s 的类型是一个引用。让我们增加一些解释性的注释: # fn main() {\n# let s1 = String::from(\"hello\");\n# # let len = calculate_length(&s1);\n# # println!(\"The length of '{s1}' is {len}.\");\n# }\n# fn calculate_length(s: &String) -> usize { // s 是 String 的引用 s.len()\n} // 这里,s 离开了作用域。但因为它并不拥有引用值的所有权, // 所以什么也不会发生 变量 s 有效的作用域与函数参数的作用域一样,不过当 s 停止使用时并不丢弃引用指向的数据,因为 s 并没有所有权。当函数使用引用而不是实际值作为参数,无需返回值来交还所有权,因为就不曾拥有所有权。 我们将创建一个引用的行为称为 借用 ( borrowing )。正如现实生活中,如果一个人拥有某样东西,你可以从他那里借来。当你使用完毕,必须还回去。我们并不拥有它。 如果我们尝试修改借用的变量呢?尝试示例 4-6 中的代码。剧透:这行不通! 文件名:src/main.rs fn main() { let s = String::from(\"hello\"); change(&s);\n} fn change(some_string: &String) { some_string.push_str(\", world\");\n} 示例 4-6:尝试修改借用的值 这里是错误: $ cargo run Compiling ownership v0.1.0 (file:///projects/ownership)\nerror[E0596]: cannot borrow `*some_string` as mutable, as it is behind a `&` reference --> src/main.rs:8:5 |\n8 | some_string.push_str(\", world\"); | ^^^^^^^^^^^ `some_string` is a `&` reference, so the data it refers to cannot be borrowed as mutable |\nhelp: consider changing this to be a mutable reference |\n7 | fn change(some_string: &mut String) { | +++ For more information about this error, try `rustc --explain E0596`.\nerror: could not compile `ownership` (bin \"ownership\") due to 1 previous error 正如变量默认是不可变的,引用也一样。(默认)不允许修改引用的值。","breadcrumbs":"认识所有权 » 引用与借用 » 引用与借用","id":"73","title":"引用与借用"},"74":{"body":"我们通过一个小调整就能修复示例 4-6 代码中的错误,允许我们修改一个借用的值,这就是 可变引用 ( mutable reference ): 文件名:src/main.rs fn main() { let mut s = String::from(\"hello\"); change(&mut s);\n} fn change(some_string: &mut String) { some_string.push_str(\", world\");\n} 首先,我们必须将 s 改为 mut。然后在调用 change 函数的地方创建一个可变引用 &mut s,并更新函数签名以接受一个可变引用 some_string: &mut String。这就非常清楚地表明,change 函数将改变它所借用的值。 可变引用有一个很大的限制:如果你有一个对该变量的可变引用,你就不能再创建对该变量的引用。这些尝试创建两个 s 的可变引用的代码会失败: 文件名:src/main.rs # fn main() { let mut s = String::from(\"hello\"); let r1 = &mut s; let r2 = &mut s; println!(\"{}, {}\", r1, r2);\n# } 错误如下: $ cargo run Compiling ownership v0.1.0 (file:///projects/ownership)\nerror[E0499]: cannot borrow `s` as mutable more than once at a time --> src/main.rs:5:14 |\n4 | let r1 = &mut s; | ------ first mutable borrow occurs here\n5 | let r2 = &mut s; | ^^^^^^ second mutable borrow occurs here\n6 |\n7 | println!(\"{}, {}\", r1, r2); | -- first borrow later used here For more information about this error, try `rustc --explain E0499`.\nerror: could not compile `ownership` (bin \"ownership\") due to 1 previous error 这个报错说这段代码是无效的,因为我们不能在同一时间多次将 s 作为可变变量借用。第一个可变的借入在 r1 中,并且必须持续到在 println! 中使用它,但是在那个可变引用的创建和它的使用之间,我们又尝试在 r2 中创建另一个可变引用,该引用借用与 r1 相同的数据。 这一限制以一种非常小心谨慎的方式允许可变性,防止同一时间对同一数据存在多个可变引用。新 Rustacean 们经常难以适应这一点,因为大部分语言中变量任何时候都是可变的。这个限制的好处是 Rust 可以在编译时就避免数据竞争。 数据竞争 ( data race )类似于竞态条件,它可由这三个行为造成: 两个或更多指针同时访问同一数据。 至少有一个指针被用来写入数据。 没有同步数据访问的机制。 数据竞争会导致未定义行为,难以在运行时追踪,并且难以诊断和修复;Rust 避免了这种情况的发生,因为它甚至不会编译存在数据竞争的代码! 一如既往,可以使用大括号来创建一个新的作用域,以允许拥有多个可变引用,只是不能 同时 拥有: # fn main() { let mut s = String::from(\"hello\"); { let r1 = &mut s; } // r1 在这里离开了作用域,所以我们完全可以创建一个新的引用 let r2 = &mut s;\n# } Rust 在同时使用可变与不可变引用时也采用的类似的规则。这些代码会导致一个错误: # fn main() { let mut s = String::from(\"hello\"); let r1 = &s; // 没问题 let r2 = &s; // 没问题 let r3 = &mut s; // 大问题 println!(\"{}, {}, and {}\", r1, r2, r3);\n# } 错误如下: $ cargo run Compiling ownership v0.1.0 (file:///projects/ownership)\nerror[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable --> src/main.rs:6:14 |\n4 | let r1 = &s; // no problem | -- immutable borrow occurs here\n5 | let r2 = &s; // no problem\n6 | let r3 = &mut s; // BIG PROBLEM | ^^^^^^ mutable borrow occurs here\n7 |\n8 | println!(\"{}, {}, and {}\", r1, r2, r3); | -- immutable borrow later used here For more information about this error, try `rustc --explain E0502`.\nerror: could not compile `ownership` (bin \"ownership\") due to 1 previous error 哇哦!我们 也 不能在拥有不可变引用的同时拥有可变引用。 不可变引用的用户可不希望在他们的眼皮底下值就被意外的改变了!然而,多个不可变引用是可以的,因为没有哪个只能读取数据的人有能力影响其他人读取到的数据。 注意一个引用的作用域从声明的地方开始一直持续到最后一次使用为止。例如,因为最后一次使用不可变引用(println!),发生在声明可变引用之前,所以如下代码是可以编译的: # fn main() { let mut s = String::from(\"hello\"); let r1 = &s; // 没问题 let r2 = &s; // 没问题 println!(\"{r1} and {r2}\"); // 此位置之后 r1 和 r2 不再使用 let r3 = &mut s; // 没问题 println!(\"{r3}\");\n# } 不可变引用 r1 和 r2 的作用域在 println! 最后一次使用之后结束,这也是创建可变引用 r3 的地方。它们的作用域没有重叠,所以代码是可以编译的。编译器可以在作用域结束之前判断不再使用的引用。 尽管这些错误有时使人沮丧,但请牢记这是 Rust 编译器在提前指出一个潜在的 bug(在编译时而不是在运行时)并精准显示问题所在。这样你就不必去跟踪为何数据并不是你想象中的那样。","breadcrumbs":"认识所有权 » 引用与借用 » 可变引用","id":"74","title":"可变引用"},"75":{"body":"在具有指针的语言中,很容易通过释放内存时保留指向它的指针而错误地生成一个 悬垂指针 ( dangling pointer ),所谓悬垂指针是其指向的内存可能已经被分配给其它持有者。相比之下,在 Rust 中编译器确保引用永远也不会变成悬垂状态:当你拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域。 让我们尝试创建一个悬垂引用,Rust 会通过一个编译时错误来避免: 文件名:src/main.rs fn main() { let reference_to_nothing = dangle();\n} fn dangle() -> &String { let s = String::from(\"hello\"); &s\n} 这里是错误: $ cargo run Compiling ownership v0.1.0 (file:///projects/ownership)\nerror[E0106]: missing lifetime specifier --> src/main.rs:5:16 |\n5 | fn dangle() -> &String { | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from\nhelp: consider using the `'static` lifetime, but this is uncommon unless you're returning a borrowed value from a `const` or a `static` |\n5 | fn dangle() -> &'static String { | +++++++\nhelp: instead, you are more likely to want to return an owned value |\n5 - fn dangle() -> &String {\n5 + fn dangle() -> String { | error[E0515]: cannot return reference to local variable `s` --> src/main.rs:8:5 |\n8 | &s | ^^ returns a reference to data owned by the current function Some errors have detailed explanations: E0106, E0515.\nFor more information about an error, try `rustc --explain E0106`.\nerror: could not compile `ownership` (bin \"ownership\") due to 2 previous errors 错误信息引用了一个我们还未介绍的功能:生命周期(lifetimes)。第十章会详细介绍生命周期。不过,如果你不理会生命周期部分,错误信息中确实包含了为什么这段代码有问题的关键信息: this function's return type contains a borrowed value, but there is no value\nfor it to be borrowed from 让我们仔细看看我们的 dangle 代码的每一步到底发生了什么: 文件名:src/main.rs # fn main() {\n# let reference_to_nothing = dangle();\n# }\n# fn dangle() -> &String { // dangle 返回一个字符串的引用 let s = String::from(\"hello\"); // s 是一个新字符串 &s // 返回字符串 s 的引用\n} // 这里 s 离开作用域并被丢弃。其内存被释放。 // 危险! 因为 s 是在 dangle 函数内创建的,当 dangle 的代码执行完毕后,s 将被释放。不过我们尝试返回它的引用。这意味着这个引用会指向一个无效的 String,这可不对!Rust 不会允许我们这么做。 这里的解决方法是直接返回 String: # fn main() {\n# let string = no_dangle();\n# }\n# fn no_dangle() -> String { let s = String::from(\"hello\"); s\n} 这样就没有任何错误了。所有权被移动出去,所以没有值被释放。","breadcrumbs":"认识所有权 » 引用与借用 » 悬垂引用(Dangling References)","id":"75","title":"悬垂引用(Dangling References)"},"76":{"body":"让我们概括一下之前对引用的讨论: 在任意给定时间, 要么 只能有一个可变引用, 要么 只能有多个不可变引用。 引用必须总是有效的。 接下来,我们来看看另一种不同类型的引用:slice。","breadcrumbs":"认识所有权 » 引用与借用 » 引用的规则","id":"76","title":"引用的规则"},"77":{"body":"ch04-03-slices.md commit 3d51f70c78162faaebcab0da0de2ddd333e7a8ed slice 允许你引用集合中一段连续的元素序列,而不用引用整个集合。slice 是一种引用,所以它没有所有权。 这里有一个编程小习题:编写一个函数,该函数接收一个用空格分隔单词的字符串,并返回在该字符串中找到的第一个单词。如果函数在该字符串中并未找到空格,则整个字符串就是一个单词,所以应该返回整个字符串。 让我们推敲下如何不用 slice 编写这个函数的签名,来理解 slice 能解决的问题: fn first_word(s: &String) -> ? first_word 函数有一个参数 &String。因为我们不需要所有权,所以这没有问题。不过应该返回什么呢?我们并没有一个真正获取 部分 字符串的办法。不过,我们可以返回单词结尾的索引,结尾由一个空格表示。试试如示例 4-7 中的代码。 文件名:src/main.rs fn first_word(s: &String) -> usize { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return i; } } s.len()\n}\n# # fn main() {} 示例 4-7:first_word 函数返回 String 参数的一个字节索引值 因为需要逐个元素的检查 String 中的值是否为空格,需要用 as_bytes 方法将 String 转化为字节数组。 # fn first_word(s: &String) -> usize { let bytes = s.as_bytes();\n# # for (i, &item) in bytes.iter().enumerate() {\n# if item == b' ' {\n# return i;\n# }\n# }\n# # s.len()\n# }\n# # fn main() {} 接下来,使用 iter 方法在字节数组上创建一个迭代器: # fn first_word(s: &String) -> usize {\n# let bytes = s.as_bytes();\n# for (i, &item) in bytes.iter().enumerate() {\n# if item == b' ' {\n# return i;\n# }\n# }\n# # s.len()\n# }\n# # fn main() {} 我们将在 第十三章 详细讨论迭代器。现在,只需知道 iter 方法返回集合中的每一个元素,而 enumerate 包装了 iter 的结果,将这些元素作为元组的一部分来返回。enumerate 返回的元组中,第一个元素是索引,第二个元素是集合中元素的引用。这比我们自己计算索引要方便一些。 因为 enumerate 方法返回一个元组,我们可以使用模式来解构,我们将在 第六章 中进一步讨论有关模式的问题。所以在 for 循环中,我们指定了一个模式,其中元组中的 i 是索引而元组中的 &item 是单个字节。因为我们从 .iter().enumerate() 中获取了集合元素的引用,所以模式中使用了 &。 在 for 循环中,我们通过字节的字面值语法来寻找代表空格的字节。如果找到了一个空格,返回它的位置。否则,使用 s.len() 返回字符串的长度: # fn first_word(s: &String) -> usize {\n# let bytes = s.as_bytes();\n# # for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return i; } } s.len()\n# }\n# # fn main() {} 现在有了一个找到字符串中第一个单词结尾索引的方法,不过这有一个问题。我们返回了一个独立的 usize,不过它只在 &String 的上下文中才是一个有意义的数字。换句话说,因为它是一个与 String 相分离的值,无法保证将来它仍然有效。考虑一下示例 4-8 中使用了示例 4-7 中 first_word 函数的程序。 文件名:src/main.rs # fn first_word(s: &String) -> usize {\n# let bytes = s.as_bytes();\n# # for (i, &item) in bytes.iter().enumerate() {\n# if item == b' ' {\n# return i;\n# }\n# }\n# # s.len()\n# }\n# fn main() { let mut s = String::from(\"hello world\"); let word = first_word(&s); // word 的值为 5 s.clear(); // 这清空了字符串,使其等于 \"\" // word 在此处的值仍然是 5, // 但是没有更多的字符串让我们可以有效地应用数值 5。word 的值现在完全无效!\n} 示例 4-8:存储 first_word 函数调用的返回值并接着改变 String 的内容 这个程序编译时没有任何错误,而且在调用 s.clear() 之后使用 word 也不会出错。因为 word 与 s 状态完全没有联系,所以 word 仍然包含值 5。可以尝试用值 5 来提取变量 s 的第一个单词,不过这是有 bug 的,因为在我们将 5 保存到 word 之后 s 的内容已经改变。 我们不得不时刻担心 word 的索引与 s 中的数据不再同步,这很啰嗦且易出错!如果编写这么一个 second_word 函数的话,管理索引这件事将更加容易出问题。它的签名看起来像这样: fn second_word(s: &String) -> (usize, usize) { 现在我们要跟踪一个开始索引 和 一个结尾索引,同时有了更多从数据的某个特定状态计算而来的值,但都完全没有与这个状态相关联。现在有三个飘忽不定的不相关变量需要保持同步。 幸运的是,Rust 为这个问题提供了一个解决方法:字符串 slice。","breadcrumbs":"认识所有权 » Slice 类型 » Slice 类型","id":"77","title":"Slice 类型"},"78":{"body":"字符串 slice ( string slice )是 String 中一部分值的引用,它看起来像这样: # fn main() { let s = String::from(\"hello world\"); let hello = &s[0..5]; let world = &s[6..11];\n# } 不同于整个 String 的引用,hello 是一个部分 String 的引用,由一个额外的 [0..5] 部分指定。可以使用一个由中括号中的 [starting_index..ending_index] 指定的 range 创建一个 slice,其中 starting_index 是 slice 的第一个位置,ending_index 则是 slice 最后一个位置的后一个值。在其内部,slice 的数据结构存储了 slice 的开始位置和长度,长度对应于 ending_index 减去 starting_index 的值。所以对于 let world = &s[6..11]; 的情况,world 将是一个包含指向 s 索引 6 的指针和长度值 5 的 slice。 图 4-7 展示了一个图例。 图 4-7:引用了部分 String 的字符串 slice 对于 Rust 的 .. range 语法,如果想要从索引 0 开始,可以不写两个点号之前的值。换句话说,如下两个语句是相同的: let s = String::from(\"hello\"); let slice = &s[0..2];\nlet slice = &s[..2]; 依此类推,如果 slice 包含 String 的最后一个字节,也可以舍弃尾部的数字。这意味着如下也是相同的: let s = String::from(\"hello\"); let len = s.len(); let slice = &s[3..len];\nlet slice = &s[3..]; 也可以同时舍弃这两个值来获取整个字符串的 slice。所以如下亦是相同的: let s = String::from(\"hello\"); let len = s.len(); let slice = &s[0..len];\nlet slice = &s[..]; 注意:字符串 slice range 的索引必须位于有效的 UTF-8 字符边界内,如果尝试从一个多字节字符的中间位置创建字符串 slice,则程序将会因错误而退出。出于介绍字符串 slice 的目的,本部分假设只使用 ASCII 字符集;第八章的 “使用字符串储存 UTF-8 编码的文本” 部分会更加全面的讨论 UTF-8 处理问题。 在记住所有这些知识后,让我们重写 first_word 来返回一个 slice。“字符串 slice” 的类型声明写作 &str: 文件名:src/main.rs fn first_word(s: &String) -> &str { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return &s[0..i]; } } &s[..]\n}\n# # fn main() {} 我们使用跟示例 4-7 相同的方式获取单词结尾的索引,通过寻找第一个出现的空格。当找到一个空格,我们返回一个字符串 slice,它使用字符串的开始和空格的索引作为开始和结束的索引。 现在当调用 first_word 时,会返回与底层数据关联的单个值。这个值由一个 slice 开始位置的引用和 slice 中元素的数量组成。 second_word 函数也可以改为返回一个 slice: fn second_word(s: &String) -> &str { 现在我们有了一个不易混淆且直观的 API 了,因为编译器会确保指向 String 的引用持续有效。还记得示例 4-8 程序中,那个当我们获取第一个单词结尾的索引后,接着就清除了字符串导致索引就无效的 bug 吗?那些代码在逻辑上是不正确的,但却没有显示任何直接的错误。问题会在之后尝试对空字符串使用第一个单词的索引时出现。slice 就不可能出现这种 bug 并让我们更早的知道出问题了。使用 slice 版本的 first_word 会抛出一个编译时错误: 文件名:src/main.rs # fn first_word(s: &String) -> &str {\n# let bytes = s.as_bytes();\n# # for (i, &item) in bytes.iter().enumerate() {\n# if item == b' ' {\n# return &s[0..i];\n# }\n# }\n# # &s[..]\n# }\n# fn main() { let mut s = String::from(\"hello world\"); let word = first_word(&s); s.clear(); // 错误! println!(\"the first word is: {word}\");\n} 这里是编译错误: $ cargo run Compiling ownership v0.1.0 (file:///projects/ownership)\nerror[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable --> src/main.rs:18:5 |\n16 | let word = first_word(&s); | -- immutable borrow occurs here\n17 |\n18 | s.clear(); // error! | ^^^^^^^^^ mutable borrow occurs here\n19 |\n20 | println!(\"the first word is: {word}\"); | ------ immutable borrow later used here For more information about this error, try `rustc --explain E0502`.\nerror: could not compile `ownership` (bin \"ownership\") due to 1 previous error 回忆一下借用规则,当拥有某值的不可变引用时,就不能再获取一个可变引用。因为 clear 需要清空 String,它尝试获取一个可变引用。在调用 clear 之后的 println! 使用了 word 中的引用,所以这个不可变的引用在此时必须仍然有效。Rust 不允许 clear 中的可变引用和 word 中的不可变引用同时存在,因此编译失败。Rust 不仅使得我们的 API 简单易用,也在编译时就消除了一整类的错误! 字符串字面值就是 slice 还记得我们讲到过字符串字面值被储存在二进制文件中吗?现在知道 slice 了,我们就可以正确地理解字符串字面值了: let s = \"Hello, world!\"; 这里 s 的类型是 &str:它是一个指向二进制程序特定位置的 slice。这也就是为什么字符串字面值是不可变的;&str 是一个不可变引用。 字符串 slice 作为参数 在知道了能够获取字面值和 String 的 slice 后,我们对 first_word 做了改进,这是它的签名: fn first_word(s: &String) -> &str { 而更有经验的 Rustacean 会编写出示例 4-9 中的签名,因为它使得可以对 &String 值和 &str 值使用相同的函数: fn first_word(s: &str) -> &str {\n# let bytes = s.as_bytes();\n# # for (i, &item) in bytes.iter().enumerate() {\n# if item == b' ' {\n# return &s[0..i];\n# }\n# }\n# # &s[..]\n# }\n# # fn main() {\n# let my_string = String::from(\"hello world\");\n# # // `first_word` 适用于 `String`(的 slice),部分或全部\n# let word = first_word(&my_string[0..6]);\n# let word = first_word(&my_string[..]);\n# // `first_word` 也适用于 `String` 的引用,\n# // 这等价于整个 `String` 的 slice\n# let word = first_word(&my_string);\n# # let my_string_literal = \"hello world\";\n# # // `first_word` 适用于字符串字面值,部分或全部\n# let word = first_word(&my_string_literal[0..6]);\n# let word = first_word(&my_string_literal[..]);\n# # // 因为字符串字面值已经 **是** 字符串 slice 了,\n# // 这也是适用的,无需 slice 语法!\n# let word = first_word(my_string_literal);\n# } 示例 4-9: 通过将 s 参数的类型改为字符串 slice 来改进 first_word 函数 如果有一个字符串 slice,可以直接传递它。如果有一个 String,则可以传递整个 String 的 slice 或对 String 的引用。这种灵活性利用了 deref coercions 的优势,这个特性我们将在 “函数和方法的隐式 Deref 强制转换” 章节中介绍。定义一个获取字符串 slice 而不是 String 引用的函数使得我们的 API 更加通用并且不会丢失任何功能: 文件名:src/main.rs # fn first_word(s: &str) -> &str {\n# let bytes = s.as_bytes();\n# # for (i, &item) in bytes.iter().enumerate() {\n# if item == b' ' {\n# return &s[0..i];\n# }\n# }\n# # &s[..]\n# }\n# fn main() { let my_string = String::from(\"hello world\"); // `first_word` 适用于 `String`(的 slice),部分或全部 let word = first_word(&my_string[0..6]); let word = first_word(&my_string[..]); // `first_word` 也适用于 `String` 的引用, // 这等价于整个 `String` 的 slice let word = first_word(&my_string); let my_string_literal = \"hello world\"; // `first_word` 适用于字符串字面值,部分或全部 let word = first_word(&my_string_literal[0..6]); let word = first_word(&my_string_literal[..]); // 因为字符串字面值已经 **是** 字符串 slice 了, // 这也是适用的,无需 slice 语法! let word = first_word(my_string_literal);\n}","breadcrumbs":"认识所有权 » Slice 类型 » 字符串 slice","id":"78","title":"字符串 slice"},"79":{"body":"字符串 slice,正如你想象的那样,是针对字符串的。不过也有更通用的 slice 类型。考虑一下这个数组: let a = [1, 2, 3, 4, 5]; 就跟我们想要获取字符串的一部分那样,我们也会想要引用数组的一部分。我们可以这样做: let a = [1, 2, 3, 4, 5]; let slice = &a[1..3]; assert_eq!(slice, &[2, 3]); 这个 slice 的类型是 &[i32]。它跟字符串 slice 的工作方式一样,通过存储第一个集合元素的引用和一个集合总长度。你可以对其他所有集合使用这类 slice。第八章讲到 vector 时会详细讨论这些集合。","breadcrumbs":"认识所有权 » Slice 类型 » 其他类型的 slice","id":"79","title":"其他类型的 slice"},"8":{"body":"Rust 适合那些渴望在编程语言中寻求速度与稳定性的开发者。对于速度来说,既是指 Rust 可以运行的多快,也是指编写 Rust 程序的速度。Rust 编译器的检查确保了增加功能和重构代码时的稳定性,这与那些缺乏这些检查的语言中脆弱的祖传代码形成了鲜明对比,开发者往往不敢去修改这些代码。通过追求零成本抽象(zero-cost abstractions)—— 将高级语言特性编译成底层代码,并且与手写的代码运行速度同样快。Rust 努力确保代码又安全又快速。 这里提到的只是几个较大的受益群体,Rust 语言也希望能支持更多其他用户。总的来说,Rust 最重要的目标是消除数十年来程序员习以为常的取舍,让安全和高效、速度和易读易用 可以兼得 。试试看 Rust,说不定它的选择就适合你。","breadcrumbs":"简介 » 重视速度和稳定性的开发者","id":"8","title":"重视速度和稳定性的开发者"},"80":{"body":"所有权、借用和 slice 这些概念让 Rust 程序在编译时确保内存安全。Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码。 所有权系统影响了 Rust 中很多其他部分的工作方式,所以我们还会继续讲到这些概念,这将贯穿本书的余下内容。让我们开始第五章,来看看如何将多份数据组合进一个 struct 中。","breadcrumbs":"认识所有权 » Slice 类型 » 总结","id":"80","title":"总结"},"81":{"body":"ch05-00-structs.md commit 8612c4a5801b61f8d2e952f8bbbb444692ff1ec2 struct ,或者 structure ,是一个自定义数据类型,允许你包装和命名多个相关的值,从而形成一个有意义的组合。如果你熟悉一门面向对象语言, struct 就像对象中的数据属性。在本章中,我们会对元组和结构体进行比较和对比。 我们还将演示如何定义和实例化结构体,并讨论如何定义关联函数,特别是被称为 方法 的那种关联函数,以指定与结构体类型相关的行为。你可以在程序中基于结构体和枚举( enum )(在第六章介绍)创建新类型,以充分利用 Rust 的编译时类型检查。","breadcrumbs":"使用结构体组织相关联的数据 » 使用结构体组织相关联的数据","id":"81","title":"使用结构体组织相关联的数据"},"82":{"body":"ch05-01-defining-structs.md commit a371f82b0916cf21de2d56bd386ca5d72f7699b0 结构体和我们在 “元组类型” 部分论过的元组类似,它们都包含多个相关的值。和元组一样,结构体的每一部分可以是不同类型。但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来指定或访问实例中的值。 定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段 ( field )。例如,示例 5-1 展示了一个存储用户账号信息的结构体: 文件名:src/main.rs struct User { active: bool, username: String, email: String, sign_in_count: u64,\n}\n# # fn main() {} 示例 5-1:User 结构体定义 一旦定义了结构体后,为了使用它,通过为每个字段指定具体值来创建这个结构体的 实例 。创建一个实例需要以结构体的名字开头,接着在大括号中使用 key: value 键 - 值对的形式提供字段,其中 key 是字段的名字,value 是需要存储在字段中的数据值。实例中字段的顺序不需要和它们在结构体中声明的顺序一致。换句话说,结构体的定义就像一个类型的通用模板,而实例则会在这个模板中放入特定数据来创建这个类型的值。例如,可以像示例 5-2 这样来声明一个特定的用户: 文件名:src/main.rs # struct User {\n# active: bool,\n# username: String,\n# email: String,\n# sign_in_count: u64,\n# }\n# fn main() { let user1 = User { active: true, username: String::from(\"someusername123\"), email: String::from(\"someone@example.com\"), sign_in_count: 1, };\n} 示例 5-2:创建 User 结构体的实例 为了从结构体中获取某个特定的值,可以使用点号。举个例子,想要用户的邮箱地址,可以用 user1.email。如果结构体的实例是可变的,我们可以使用点号并为对应的字段赋值。示例 5-3 展示了如何改变一个可变的 User 实例中 email 字段的值: 文件名:src/main.rs # struct User {\n# active: bool,\n# username: String,\n# email: String,\n# sign_in_count: u64,\n# }\n# fn main() { let mut user1 = User { active: true, username: String::from(\"someusername123\"), email: String::from(\"someone@example.com\"), sign_in_count: 1, }; user1.email = String::from(\"anotheremail@example.com\");\n} 示例 5-3:改变 User 实例 email 字段的值 注意整个实例必须是可变的;Rust 并不允许只将某个字段标记为可变。另外需要注意同其他任何表达式一样,我们可以在函数体的最后一个表达式中构造一个结构体的新实例,来隐式地返回这个实例。 示例 5-4 显示了一个 build_user 函数,它返回一个带有给定的 email 和用户名的 User 结构体实例。active 字段的值为 true,并且 sign_in_count 的值为 1。 文件名:src/main.rs # struct User {\n# active: bool,\n# username: String,\n# email: String,\n# sign_in_count: u64,\n# }\n# fn build_user(email: String, username: String) -> User { User { active: true, username: username, email: email, sign_in_count: 1, }\n}\n# # fn main() {\n# let user1 = build_user(\n# String::from(\"someone@example.com\"),\n# String::from(\"someusername123\"),\n# );\n# } 示例 5-4:build_user 函数获取 email 和用户名并返回 User 实例 为函数参数起与结构体字段相同的名字是可以理解的,但是不得不重复 email 和 username 字段名称与变量有些啰嗦。如果结构体有更多字段,重复每个名称就更加烦人了。幸运的是,有一个方便的简写语法!","breadcrumbs":"使用结构体组织相关联的数据 » 结构体的定义和实例化 » 结构体的定义和实例化","id":"82","title":"结构体的定义和实例化"},"83":{"body":"因为示例 5-4 中的参数名与字段名都完全相同,我们可以使用 字段初始化简写语法 ( field init shorthand )来重写 build_user,这样其行为与之前完全相同,不过无需重复 username 和 email 了,如示例 5-5 所示。 文件名:src/main.rs # struct User {\n# active: bool,\n# username: String,\n# email: String,\n# sign_in_count: u64,\n# }\n# fn build_user(email: String, username: String) -> User { User { active: true, username, email, sign_in_count: 1, }\n}\n# # fn main() {\n# let user1 = build_user(\n# String::from(\"someone@example.com\"),\n# String::from(\"someusername123\"),\n# );\n# } 示例 5-5:build_user 函数使用了字段初始化简写语法,因为 username 和 email 参数与结构体字段同名 这里我们创建了一个新的 User 结构体实例,它有一个叫做 email 的字段。我们想要将 email 字段的值设置为 build_user 函数 email 参数的值。因为 email 字段与 email 参数有着相同的名称,则只需编写 email 而不是 email: email。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体的定义和实例化 » 使用字段初始化简写语法","id":"83","title":"使用字段初始化简写语法"},"84":{"body":"使用旧实例的大部分值但改变其部分值来创建一个新的结构体实例通常是很有用的。这可以通过 结构体更新语法 ( struct update syntax )实现。 首先,示例 5-6 展示了不使用更新语法时,如何在 user2 中创建一个新 User 实例。我们为 email 设置了新的值,其他值则使用了实例 5-2 中创建的 user1 中的同名值: 文件名:src/main.rs # struct User {\n# active: bool,\n# username: String,\n# email: String,\n# sign_in_count: u64,\n# }\n# fn main() { // --snip--\n# # let user1 = User {\n# email: String::from(\"someone@example.com\"),\n# username: String::from(\"someusername123\"),\n# active: true,\n# sign_in_count: 1,\n# }; let user2 = User { active: user1.active, username: user1.username, email: String::from(\"another@example.com\"), sign_in_count: user1.sign_in_count, };\n} 示例 5-6:使用 user1 中的一个值创建一个新的 User 实例 使用结构体更新语法,我们可以通过更少的代码来达到相同的效果,如示例 5-7 所示。.. 语法指定了剩余未显式设置值的字段应有与给定实例对应字段相同的值。 文件名:src/main.rs # struct User {\n# active: bool,\n# username: String,\n# email: String,\n# sign_in_count: u64,\n# }\n# fn main() { // --snip--\n# # let user1 = User {\n# email: String::from(\"someone@example.com\"),\n# username: String::from(\"someusername123\"),\n# active: true,\n# sign_in_count: 1,\n# }; let user2 = User { email: String::from(\"another@example.com\"), ..user1 };\n} 示例 5-7:使用结构体更新语法为一个 User 实例设置一个新的 email 值,不过其余值来自 user1 变量中实例的字段 示例 5-7 中的代码也在 user2 中创建了一个新实例,但该实例中 email 字段的值与 user1 不同,而 username、 active 和 sign_in_count 字段的值与 user1 相同。..user1 必须放在最后,以指定其余的字段应从 user1 的相应字段中获取其值,但我们可以选择以任何顺序为任意字段指定值,而不用考虑结构体定义中字段的顺序。 请注意,结构更新语法就像带有 = 的赋值,因为它移动了数据,就像我们在 “变量与数据交互的方式(一):移动” 部分讲到的一样。在这个例子中,总体上说我们在创建 user2 后就不能再使用 user1 了,因为 user1 的 username 字段中的 String 被移到 user2 中。如果我们给 user2 的 email 和 username 都赋予新的 String 值,从而只使用 user1 的 active 和 sign_in_count 值,那么 user1 在创建 user2 后仍然有效。active 和 sign_in_count 的类型是实现 Copy trait 的类型,所以我们在 “变量与数据交互的方式(二):克隆” 部分讨论的行为同样适用。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体的定义和实例化 » 使用结构体更新语法从其他实例创建实例","id":"84","title":"使用结构体更新语法从其他实例创建实例"},"85":{"body":"也可以定义与元组(在第三章讨论过)类似的结构体,称为 元组结构体 ( tuple structs )。元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型。当你想给整个元组取一个名字,并使元组成为与其他元组不同的类型时,元组结构体是很有用的,这时像常规结构体那样为每个字段命名就显得多余和形式化了。 要定义元组结构体,以 struct 关键字和结构体名开头并后跟元组中的类型。例如,下面是两个分别叫做 Color 和 Point 元组结构体的定义和用法: 文件名:src/main.rs struct Color(i32, i32, i32);\nstruct Point(i32, i32, i32); fn main() { let black = Color(0, 0, 0); let origin = Point(0, 0, 0);\n} 注意 black 和 origin 值的类型不同,因为它们是不同的元组结构体的实例。你定义的每一个结构体有其自己的类型,即使结构体中的字段可能有着相同的类型。例如,一个获取 Color 类型参数的函数不能接受 Point 作为参数,即便这两个类型都由三个 i32 值组成。在其他方面,元组结构体实例类似于元组,你可以将它们解构为单独的部分,也可以使用 . 后跟索引来访问单独的值,等等。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体的定义和实例化 » 使用没有命名字段的元组结构体来创建不同的类型","id":"85","title":"使用没有命名字段的元组结构体来创建不同的类型"},"86":{"body":"我们也可以定义一个没有任何字段的结构体!它们被称为 类单元结构体 ( unit-like structs )因为它们类似于 (),即 “元组类型” 一节中提到的 unit 类型。类单元结构体常常在你想要在某个类型上实现 trait 但不需要在类型中存储数据的时候发挥作用。我们将在第十章介绍 trait。下面是一个声明和实例化一个名为 AlwaysEqual 的 unit 结构的例子。 文件名:src/main.rs struct AlwaysEqual; fn main() { let subject = AlwaysEqual;\n} 为了定义 AlwaysEqual,我们使用 struct 关键字,接着是我们想要的名称,然后是一个分号。不需要花括号或圆括号!然后,我们可以以类似的方式在 subject 变量中创建 AlwaysEqual 的实例:只需使用我们定义的名称,无需任何花括号或圆括号。设想我们稍后将为这个类型实现某种行为,使得每个 AlwaysEqual 的实例始终等于任何其它类型的实例,也许是为了获得一个已知的结果以便进行测试。我们不需要任何数据来实现这种行为!在第十章中,你会看到如何定义特征并在任何类型上实现它们,包括类单元结构体。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体的定义和实例化 » 没有任何字段的类单元结构体","id":"86","title":"没有任何字段的类单元结构体"},"87":{"body":"在示例 5-1 中的 User 结构体的定义中,我们使用了自身拥有所有权的 String 类型而不是 &str 字符串 slice 类型。这是一个有意而为之的选择,因为我们想要这个结构体拥有它所有的数据,为此只要整个结构体是有效的话其数据也是有效的。 可以使结构体存储被其他对象拥有的数据的引用,不过这么做的话需要用上 生命周期 ( lifetimes ),这是一个第十章会讨论的 Rust 功能。生命周期确保结构体引用的数据有效性跟结构体本身保持一致。如果你尝试在结构体中存储一个引用而不指定生命周期将是无效的,比如这样: 文件名:src/main.rs struct User { active: bool, username: &str, email: &str, sign_in_count: u64,\n} fn main() { let user1 = User { active: true, username: \"someusername123\", email: \"someone@example.com\", sign_in_count: 1, };\n} 编译器会抱怨它需要生命周期标识符: $ cargo run Compiling structs v0.1.0 (file:///projects/structs)\nerror[E0106]: missing lifetime specifier --> src/main.rs:3:15 |\n3 | username: &str, | ^ expected named lifetime parameter |\nhelp: consider introducing a named lifetime parameter |\n1 ~ struct User<'a> {\n2 | active: bool,\n3 ~ username: &'a str, | error[E0106]: missing lifetime specifier --> src/main.rs:4:12 |\n4 | email: &str, | ^ expected named lifetime parameter |\nhelp: consider introducing a named lifetime parameter |\n1 ~ struct User<'a> {\n2 | active: bool,\n3 | username: &str,\n4 ~ email: &'a str, | For more information about this error, try `rustc --explain E0106`.\nerror: could not compile `structs` due to 2 previous errors 第十章会讲到如何修复这个问题以便在结构体中存储引用,不过现在,我们会使用像 String 这类拥有所有权的类型来替代 &str 这样的引用以修正这个错误。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体的定义和实例化 » 结构体数据的所有权","id":"87","title":"结构体数据的所有权"},"88":{"body":"ch05-02-example-structs.md commit 8612c4a5801b61f8d2e952f8bbbb444692ff1ec2 为了理解何时会需要使用结构体,让我们编写一个计算长方形面积的程序。我们会从单独的变量开始,接着重构程序直到使用结构体替代它们为止。 使用 Cargo 新建一个叫做 rectangles 的二进制程序,它获取以像素为单位的长方形的宽度和高度,并计算出长方形的面积。示例 5-8 显示了位于项目的 src/main.rs 中的小程序,它刚刚好实现此功能: 文件名:src/main.rs fn main() { let width1 = 30; let height1 = 50; println!( \"The area of the rectangle is {} square pixels.\", area(width1, height1) );\n} fn area(width: u32, height: u32) -> u32 { width * height\n} 示例 5-8:通过分别指定长方形的宽和高的变量来计算长方形面积 现在使用 cargo run 运行程序: $ cargo run Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.42s Running `target/debug/rectangles`\nThe area of the rectangle is 1500 square pixels. 这个示例代码在调用 area 函数时传入每个维度,虽然可以正确计算出长方形的面积,但我们仍然可以修改这段代码来使它的意义更加明确,并且增加可读性。 这些代码的问题突显在 area 的签名上: # fn main() {\n# let width1 = 30;\n# let height1 = 50;\n# # println!(\n# \"The area of the rectangle is {} square pixels.\",\n# area(width1, height1)\n# );\n# }\n# fn area(width: u32, height: u32) -> u32 {\n# width * height\n# } 函数 area 本应该计算一个长方形的面积,不过函数却有两个参数。这两个参数是相关联的,不过程序本身却没有表现出这一点。将长度和宽度组合在一起将更易懂也更易处理。第三章的 “元组类型” 部分已经讨论过了一种可行的方法:元组。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体示例程序 » 结构体示例程序","id":"88","title":"结构体示例程序"},"89":{"body":"示例 5-9 展示了使用元组的另一个程序版本。 文件名:src/main.rs fn main() { let rect1 = (30, 50); println!( \"The area of the rectangle is {} square pixels.\", area(rect1) );\n} fn area(dimensions: (u32, u32)) -> u32 { dimensions.0 * dimensions.1\n} 示例 5-9:使用元组来指定长方形的宽高 在某种程度上说,这个程序更好一点了。元组帮助我们增加了一些结构性,并且现在只需传一个参数。不过在另一方面,这个版本却有一点不明确了:元组并没有给出元素的名称,所以计算变得更费解了,因为不得不使用索引来获取元组的每一部分: 在计算面积时将宽和高弄混倒无关紧要,不过当在屏幕上绘制长方形时就有问题了!我们必须牢记 width 的元组索引是 0,height 的元组索引是 1。如果其他人要使用这些代码,他们必须要搞清楚这一点,并也要牢记于心。很容易忘记或者混淆这些值而造成错误,因为我们没有在代码中传达数据的意图。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体示例程序 » 使用元组重构","id":"89","title":"使用元组重构"},"9":{"body":"本书假设你已经有其他编程语言的经验,任何语言均可,我们尽可能让各种语言背景的人都能读懂。本书的重点不是程序设计 本身 ,也不是程序设计思维。如果你完全没学过编程,建议你先阅读专门介绍程序设计的书籍。","breadcrumbs":"简介 » 本书适合哪些人","id":"9","title":"本书适合哪些人"},"90":{"body":"我们使用结构体为数据命名来为其赋予意义。我们可以将我们正在使用的元组转换成一个有整体名称而且每个部分也有对应名字的结构体,如示例 5-10 所示: 文件名:src/main.rs struct Rectangle { width: u32, height: u32,\n} fn main() { let rect1 = Rectangle { width: 30, height: 50, }; println!( \"The area of the rectangle is {} square pixels.\", area(&rect1) );\n} fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height\n} 示例 5-10:定义 Rectangle 结构体 这里我们定义了一个结构体并称其为 Rectangle。在大括号中定义了字段 width 和 height,类型都是 u32。接着在 main 中,我们创建了一个具体的 Rectangle 实例,它的宽是 30,高是 50。 函数 area 现在被定义为接收一个名叫 rectangle 的参数,其类型是一个结构体 Rectangle 实例的不可变借用。第四章讲到过,我们希望借用结构体而不是获取它的所有权,这样 main 函数就可以保持 rect1 的所有权并继续使用它,所以这就是为什么在函数签名和调用的地方会有 &。 area 函数访问 Rectangle 实例的 width 和 height 字段(注意,访问对结构体的引用的字段不会移动字段的所有权,这就是为什么你经常看到对结构体的引用)。area 的函数签名现在明确的阐述了我们的意图:使用 Rectangle 的 width 和 height 字段,计算 Rectangle 的面积。这表明宽高是相互联系的,并为这些值提供了描述性的名称而不是使用元组的索引值 0 和 1 。结构体胜在更清晰明了。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体示例程序 » 使用结构体重构:赋予更多意义","id":"90","title":"使用结构体重构:赋予更多意义"},"91":{"body":"在调试程序时打印出 Rectangle 实例来查看其所有字段的值非常有用。示例 5-11 像前面章节那样尝试使用 println! 宏 。但这并不行。 文件名:src/main.rs struct Rectangle { width: u32, height: u32,\n} fn main() { let rect1 = Rectangle { width: 30, height: 50, }; println!(\"rect1 is {}\", rect1);\n} 示例 5-11:尝试打印出 Rectangle 实例 当我们运行这个代码时,会出现带有如下核心信息的错误: error[E0277]: `Rectangle` doesn't implement `std::fmt::Display` println! 宏能处理很多类型的格式,不过,{} 默认告诉 println! 使用被称为 Display 的格式:意在提供给直接终端用户查看的输出。目前为止见过的基本类型都默认实现了 Display,因为它就是向用户展示 1 或其他任何基本类型的唯一方式。不过对于结构体,println! 应该用来输出的格式是不明确的,因为这有更多显示的可能性:是否需要逗号?需要打印出大括号吗?所有字段都应该显示吗?由于这种不确定性,Rust 不会尝试猜测我们的意图,所以结构体并没有提供一个 Display 实现来使用 println! 与 {} 占位符。 但是如果我们继续阅读错误,将会发现这个有帮助的信息: = help: the trait `std::fmt::Display` is not implemented for `Rectangle` = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead 让我们来试试!现在 println! 宏调用看起来像 println!(\"rect1 is {:?}\", rect1); 这样。在 {} 中加入 :? 指示符告诉 println! 我们想要使用叫做 Debug 的输出格式。Debug 是一个 trait,它允许我们以一种对开发者有帮助的方式打印结构体,以便当我们调试代码时能看到它的值。 这样调整后再次运行程序。见鬼了!仍然能看到一个错误: error[E0277]: `Rectangle` doesn't implement `Debug` 不过编译器又一次给出了一个有帮助的信息: = help: the trait `Debug` is not implemented for `Rectangle` = note: add `#[derive(Debug)]` to `Rectangle` or manually `impl Debug for Rectangle` Rust 确实 包含了打印出调试信息的功能,不过我们必须为结构体显式选择这个功能。为此,在结构体定义之前加上外部属性 #[derive(Debug)],如示例 5-12 所示: 文件名:src/main.rs #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} fn main() { let rect1 = Rectangle { width: 30, height: 50, }; println!(\"rect1 is {rect1:?}\");\n} 示例 5-12:增加属性来派生 Debug trait,并使用调试格式打印 Rectangle 实例 现在我们再运行这个程序时,就不会有任何错误,并会出现如下输出: $ cargo run Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s Running `target/debug/rectangles`\nrect1 is Rectangle { width: 30, height: 50 } 好极了!这并不是最漂亮的输出,不过它显示这个实例的所有字段,毫无疑问这对调试有帮助。当我们有一个更大的结构体时,能有更易读一点的输出就好了,为此可以使用 {:#?} 替换 println! 字符串中的 {:?}。在这个例子中使用 {:#?} 风格将会输出如下: $ cargo run Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s Running `target/debug/rectangles`\nrect1 is Rectangle { width: 30, height: 50,\n} 另一种使用 Debug 格式打印数值的方法是使用 dbg! 宏 。dbg! 宏接收一个表达式的所有权(与 println! 宏相反,后者接收的是引用),打印出代码中调用 dbg! 宏时所在的文件和行号,以及该表达式的结果值,并返回该值的所有权。 注意:调用 dbg! 宏会打印到标准错误控制台流(stderr),与 println! 不同,后者会打印到标准输出控制台流(stdout)。我们将在 第十二章 “将错误信息写入标准错误而不是标准输出” 一节 中更多地讨论 stderr 和 stdout。 下面是一个例子,我们对分配给 width 字段的值以及 rect1 中整个结构的值感兴趣。 #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} fn main() { let scale = 2; let rect1 = Rectangle { width: dbg!(30 * scale), height: 50, }; dbg!(&rect1);\n} 我们可以把 dbg! 放在表达式 30 * scale 周围,因为 dbg! 返回表达式的值的所有权,所以 width 字段将获得相同的值,就像我们在那里没有 dbg! 调用一样。我们不希望 dbg! 拥有 rect1 的所有权,所以我们在下一次调用 dbg! 时传递一个引用。下面是这个例子的输出结果: $ cargo run Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.61s Running `target/debug/rectangles`\n[src/main.rs:10:16] 30 * scale = 60\n[src/main.rs:14:5] &rect1 = Rectangle { width: 60, height: 50,\n} 我们可以看到第一点输出来自 src/main.rs 第 10 行,我们正在调试表达式 30 * scale,其结果值是 60(为整数实现的 Debug 格式化是只打印它们的值)。在 src/main.rs 第 14 行 的 dbg! 调用输出 &rect1 的值,即 Rectangle 结构。这个输出使用了更为易读的 Debug 格式。当你试图弄清楚你的代码在做什么时,dbg! 宏可能真的很有帮助! 除了 Debug trait,Rust 还为我们提供了很多可以通过 derive 属性来使用的 trait,它们可以为我们的自定义类型增加实用的行为。 附录 C 中列出了这些 trait 和行为。第十章会介绍如何通过自定义行为来实现这些 trait,同时还有如何创建你自己的 trait。除了 derive 之外,还有很多属性;更多信息请参见 Rust Reference 的 Attributes 部分。 我们的 area 函数是非常特殊的,它只计算长方形的面积。如果这个行为与 Rectangle 结构体再结合得更紧密一些就更好了,因为它不能用于其他类型。现在让我们看看如何继续重构这些代码,来将 area 函数协调进 Rectangle 类型定义的 area 方法 中。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体示例程序 » 通过派生 trait 增加实用功能","id":"91","title":"通过派生 trait 增加实用功能"},"92":{"body":"ch05-03-method-syntax.md commit d339373a838fd312a8a9bcc9487e1ffbc9e1582f 方法 (method)与函数类似:它们使用 fn 关键字和名称声明,可以拥有参数和返回值,同时包含在某处调用该方法时会执行的代码。不过方法与函数是不同的,因为它们在结构体的上下文中被定义(或者是枚举或 trait 对象的上下文,将分别在 第六章 和 第十八章 讲解),并且它们第一个参数总是 self,它代表调用该方法的结构体实例。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » 方法语法","id":"92","title":"方法语法"},"93":{"body":"让我们把前面实现的获取一个 Rectangle 实例作为参数的 area 函数,改写成一个定义于 Rectangle 结构体上的 area 方法,如示例 5-13 所示: 文件名:src/main.rs #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} impl Rectangle { fn area(&self) -> u32 { self.width * self.height }\n} fn main() { let rect1 = Rectangle { width: 30, height: 50, }; println!( \"The area of the rectangle is {} square pixels.\", rect1.area() );\n} 示例 5-13:在 Rectangle 结构体上定义 area 方法 为了使函数定义于 Rectangle 的上下文中,我们开始了一个 impl 块(impl 是 implementation 的缩写),这个 impl 块中的所有内容都将与 Rectangle 类型相关联。接着将 area 函数移动到 impl 大括号中,并将签名中的第一个(在这里也是唯一一个)参数和函数体中其他地方的对应参数改成 self。然后在 main 中将我们先前调用 area 方法并传递 rect1 作为参数的地方,改成使用 方法语法 ( method syntax )在 Rectangle 实例上调用 area 方法。方法语法获取一个实例并加上一个点号,后跟方法名、圆括号以及任何参数。 在 area 的签名中,使用 &self 来替代 rectangle: &Rectangle,&self 实际上是 self: &Self 的缩写。在一个 impl 块中,Self 类型是 impl 块的类型的别名。方法的第一个参数必须有一个名为 self 的Self 类型的参数,所以 Rust 让你在第一个参数位置上只用 self 这个名字来简化。注意,我们仍然需要在 self 前面使用 & 来表示这个方法借用了 Self 实例,就像我们在 rectangle: &Rectangle 中做的那样。方法可以选择获得 self 的所有权,或者像我们这里一样不可变地借用 self,或者可变地借用 self,就跟其他参数一样。 这里选择 &self 的理由跟在函数版本中使用 &Rectangle 是相同的:我们并不想获取所有权,只希望能够读取结构体中的数据,而不是写入。如果想要在方法中改变调用方法的实例,需要将第一个参数改为 &mut self。通过仅仅使用 self 作为第一个参数来使方法获取实例的所有权是很少见的;这种技术通常用在当方法将 self 转换成别的实例的时候,这时我们想要防止调用者在转换之后使用原始的实例。 使用方法替代函数,除了可使用方法语法和不需要在每个函数签名中重复 self 的类型之外,其主要好处在于组织性。我们将某个类型实例能做的所有事情都一起放入 impl 块中,而不是让将来的用户在我们的库中到处寻找 Rectangle 的功能。 请注意,我们可以选择将方法的名称与结构中的一个字段相同。例如,我们可以在 Rectangle 上定义一个方法,并命名为 width: 文件名:src/main.rs # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# impl Rectangle { fn width(&self) -> bool { self.width > 0 }\n} fn main() { let rect1 = Rectangle { width: 30, height: 50, }; if rect1.width() { println!(\"The rectangle has a nonzero width; it is {}\", rect1.width); }\n} 在这里,我们选择让 width 方法在实例的 width 字段的值大于 0 时返回 true,等于 0 时则返回 false:我们可以出于任何目的,在同名的方法中使用同名的字段。在 main 中,当我们在 rect1.width 后面加上括号时。Rust 知道我们指的是方法 width。当我们不使用圆括号时,Rust 知道我们指的是字段 width。 通常,但并不总是如此,与字段同名的方法将被定义为只返回字段中的值,而不做其他事情。这样的方法被称为 getters ,Rust 并不像其他一些语言那样为结构字段自动实现它们。Getters 很有用,因为你可以把字段变成私有的,但方法是公共的,这样就可以把对字段的只读访问作为该类型公共 API 的一部分。我们将在 第七章 中讨论什么是公有和私有,以及如何将一个字段或方法指定为公有或私有。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » 定义方法","id":"93","title":"定义方法"},"94":{"body":"在 C/C++ 语言中,有两个不同的运算符来调用方法:. 直接在对象上调用方法,而 -> 在一个对象的指针上调用方法,这时需要先解引用(dereference)指针。换句话说,如果 object 是一个指针,那么 object->something() 就像 (*object).something() 一样。 Rust 并没有一个与 -> 等效的运算符;相反,Rust 有一个叫 自动引用和解引用 ( automatic referencing and dereferencing )的功能。方法调用是 Rust 中少数几个拥有这种行为的地方。 它是这样工作的:当使用 object.something() 调用方法时,Rust 会自动为 object 添加 &、&mut 或 * 以便使 object 与方法签名匹配。也就是说,这些代码是等价的: # #[derive(Debug,Copy,Clone)]\n# struct Point {\n# x: f64,\n# y: f64,\n# }\n#\n# impl Point {\n# fn distance(&self, other: &Point) -> f64 {\n# let x_squared = f64::powi(other.x - self.x, 2);\n# let y_squared = f64::powi(other.y - self.y, 2);\n#\n# f64::sqrt(x_squared + y_squared)\n# }\n# }\n# let p1 = Point { x: 0.0, y: 0.0 };\n# let p2 = Point { x: 5.0, y: 6.5 };\np1.distance(&p2);\n(&p1).distance(&p2); 第一行看起来简洁的多。这种自动引用的行为之所以有效,是因为方法有一个明确的接收者———— self 的类型。在给出接收者和方法名的前提下,Rust 可以明确地计算出方法是仅仅读取(&self),做出修改(&mut self)或者是获取所有权(self)。事实上,Rust 对方法接收者的隐式借用让所有权在实践中更友好。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » -> 运算符到哪去了?","id":"94","title":"-> 运算符到哪去了?"},"95":{"body":"让我们通过实现 Rectangle 结构体上的另一方法来练习使用方法。这回,我们让一个 Rectangle 的实例获取另一个 Rectangle 实例,如果 self (第一个 Rectangle)能完全包含第二个长方形则返回 true;否则返回 false。一旦我们定义了 can_hold 方法,就可以编写示例 5-14 中的代码。 文件名:src/main.rs fn main() { let rect1 = Rectangle { width: 30, height: 50, }; let rect2 = Rectangle { width: 10, height: 40, }; let rect3 = Rectangle { width: 60, height: 45, }; println!(\"Can rect1 hold rect2? {}\", rect1.can_hold(&rect2)); println!(\"Can rect1 hold rect3? {}\", rect1.can_hold(&rect3));\n} 示例 5-14:使用还未实现的 can_hold 方法 同时我们希望看到如下输出,因为 rect2 的两个维度都小于 rect1,而 rect3 比 rect1 要宽: Can rect1 hold rect2? true\nCan rect1 hold rect3? false 因为我们想定义一个方法,所以它应该位于 impl Rectangle 块中。方法名是 can_hold,并且它会获取另一个 Rectangle 的不可变借用作为参数。通过观察调用方法的代码可以看出参数是什么类型的:rect1.can_hold(&rect2) 传入了 &rect2,它是一个 Rectangle 的实例 rect2 的不可变借用。这是可以理解的,因为我们只需要读取 rect2(而不是写入,这意味着我们需要一个不可变借用),而且希望 main 保持 rect2 的所有权,这样就可以在调用这个方法后继续使用它。can_hold 的返回值是一个布尔值,其实现会分别检查 self 的宽高是否都大于另一个 Rectangle。让我们在示例 5-13 的 impl 块中增加这个新的 can_hold 方法,如示例 5-15 所示: 文件名:src/main.rs # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# impl Rectangle { fn area(&self) -> u32 { self.width * self.height } fn can_hold(&self, other: &Rectangle) -> bool { self.width > other.width && self.height > other.height }\n}\n# # fn main() {\n# let rect1 = Rectangle {\n# width: 30,\n# height: 50,\n# };\n# let rect2 = Rectangle {\n# width: 10,\n# height: 40,\n# };\n# let rect3 = Rectangle {\n# width: 60,\n# height: 45,\n# };\n# # println!(\"Can rect1 hold rect2? {}\", rect1.can_hold(&rect2));\n# println!(\"Can rect1 hold rect3? {}\", rect1.can_hold(&rect3));\n# } 示例 5-15:在 Rectangle 上实现 can_hold 方法,它获取另一个 Rectangle 实例作为参数 如果结合示例 5-14 的 main 函数来运行,就会看到期望的输出。在方法签名中,可以在 self 后增加多个参数,而且这些参数就像函数中的参数一样工作。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » 带有更多参数的方法","id":"95","title":"带有更多参数的方法"},"96":{"body":"所有在 impl 块中定义的函数被称为 关联函数 ( associated functions ),因为它们与 impl 后面命名的类型相关。我们可以定义不以 self 为第一参数的关联函数(因此不是方法),因为它们并不作用于一个结构体的实例。我们已经使用了一个这样的函数:在 String 类型上定义的 String::from 函数。 不是方法的关联函数经常被用作返回一个结构体新实例的构造函数。这些函数的名称通常为 new ,但 new 并不是一个关键字。例如我们可以提供一个叫做 square 关联函数,它接受一个维度参数并且同时作为宽和高,这样可以更轻松的创建一个正方形 Rectangle 而不必指定两次同样的值: 文件名:src/main.rs # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# impl Rectangle { fn square(size: u32) -> Self { Self { width: size, height: size, } }\n}\n# # fn main() {\n# let sq = Rectangle::square(3);\n# } 关键字 Self 在函数的返回类型中代指在 impl 关键字后出现的类型,在这里是 Rectangle 使用结构体名和 :: 语法来调用这个关联函数:比如 let sq = Rectangle::square(3);。这个函数位于结构体的命名空间中::: 语法用于关联函数和模块创建的命名空间。 第七章 会讲到模块。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » 关联函数","id":"96","title":"关联函数"},"97":{"body":"每个结构体都允许拥有多个 impl 块。例如,示例 5-16 中的代码等同于示例 5-15,但每个方法有其自己的 impl 块。 # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# impl Rectangle { fn area(&self) -> u32 { self.width * self.height }\n} impl Rectangle { fn can_hold(&self, other: &Rectangle) -> bool { self.width > other.width && self.height > other.height }\n}\n# # fn main() {\n# let rect1 = Rectangle {\n# width: 30,\n# height: 50,\n# };\n# let rect2 = Rectangle {\n# width: 10,\n# height: 40,\n# };\n# let rect3 = Rectangle {\n# width: 60,\n# height: 45,\n# };\n# # println!(\"Can rect1 hold rect2? {}\", rect1.can_hold(&rect2));\n# println!(\"Can rect1 hold rect3? {}\", rect1.can_hold(&rect3));\n# } 示例 5-16:使用多个 impl 块重写示例 5-15 这里没有理由将这些方法分散在多个 impl 块中,不过这是有效的语法。第十章讨论泛型和 trait 时会看到实用的多 impl 块的用例。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » 多个 impl 块","id":"97","title":"多个 impl 块"},"98":{"body":"结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,让你指定结构体的实例所具有的行为。 但结构体并不是创建自定义类型的唯一方法:让我们转向 Rust 的枚举功能,为你的工具箱再添一个工具。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » 总结","id":"98","title":"总结"},"99":{"body":"ch06-00-enums.md commit bb7e429ad6b59d9a0c37db7434976364cbb9c6da 本章介绍 枚举 ( enumerations ),也被称作 enums 。枚举允许你通过列举可能的 成员 ( variants )来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做 Option,它代表一个值要么是某个值要么什么都不是。然后会讲到在 match 表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。最后会介绍 if let,另一个简洁方便处理代码中枚举的结构。","breadcrumbs":"枚举和模式匹配 » 枚举和模式匹配","id":"99","title":"枚举和模式匹配"}},"length":438,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{".":{"1":{"0":{"0":{"df":1,"docs":{"427":{"tf":1.7320508075688772}}},"df":1,"docs":{"306":{"tf":2.23606797749979}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"143":{"tf":1.0}}},"5":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"405":{"tf":3.1622776601683795},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"0":{"0":{"df":14,"docs":{"198":{"tf":2.23606797749979},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"266":{"tf":2.449489742783178},"290":{"tf":1.0}}},"2":{"df":1,"docs":{"41":{"tf":1.0}}},"df":10,"docs":{"175":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"232":{"tf":1.0},"255":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"94":{"tf":1.4142135623730951}}},"1":{".":{"0":{"df":4,"docs":{"26":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"32":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"261":{"tf":1.0}}},"df":0,"docs":{}},"2":{"4":{"df":1,"docs":{"405":{"tf":1.0}}},"5":{"df":1,"docs":{"155":{"tf":1.0}}},"7":{"df":4,"docs":{"156":{"tf":1.0},"239":{"tf":1.0},"257":{"tf":1.0},"266":{"tf":1.0}}},"8":{"df":1,"docs":{"55":{"tf":1.0}}},"9":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}},"3":{".":{"3":{"0":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"0":{"5":{":":{"1":{"4":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"9":{":":{"8":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":3,"docs":{"49":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.0}}},"1":{"df":3,"docs":{"51":{"tf":1.0},"56":{"tf":1.0},"61":{"tf":1.7320508075688772}}},"2":{"df":2,"docs":{"27":{"tf":1.0},"62":{"tf":1.0}}},"3":{"df":1,"docs":{"27":{"tf":1.0}}},"8":{"df":1,"docs":{"229":{"tf":1.0}}},"9":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"4":{"1":{"df":1,"docs":{"242":{"tf":1.0}}},"2":{"df":2,"docs":{"398":{"tf":1.0},"88":{"tf":1.0}}},"3":{"df":3,"docs":{"143":{"tf":1.0},"241":{"tf":1.4142135623730951},"42":{"tf":1.0}}},"5":{"df":1,"docs":{"286":{"tf":1.0}}},"6":{"df":1,"docs":{"376":{"tf":1.0}}},"7":{"df":1,"docs":{"246":{"tf":1.0}}},"8":{"df":3,"docs":{"224":{"tf":1.0},"376":{"tf":1.0},"91":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"427":{"tf":1.0}}},"2":{"df":1,"docs":{"350":{"tf":1.0}}},"3":{"df":1,"docs":{"293":{"tf":1.0}}},"4":{"df":1,"docs":{"376":{"tf":1.0}}},"7":{"df":1,"docs":{"198":{"tf":1.0}}},"8":{"df":4,"docs":{"200":{"tf":1.0},"202":{"tf":1.0},"206":{"tf":1.0},"62":{"tf":1.0}}},"9":{"df":3,"docs":{"198":{"tf":1.0},"36":{"tf":1.0},"427":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":3,"docs":{"206":{"tf":1.0},"208":{"tf":1.0},"283":{"tf":1.0}}},"1":{"df":5,"docs":{"200":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"216":{"tf":1.0},"91":{"tf":1.0}}},"2":{"df":2,"docs":{"202":{"tf":1.0},"207":{"tf":1.0}}},"3":{"df":1,"docs":{"291":{"tf":1.0}}},"4":{"df":1,"docs":{"211":{"tf":1.0}}},"6":{"df":2,"docs":{"199":{"tf":1.7320508075688772},"202":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"9":{"df":1,"docs":{"207":{"tf":1.0}}},"df":0,"docs":{}},"7":{"1":{"df":1,"docs":{"225":{"tf":1.0}}},"2":{"df":1,"docs":{"198":{"tf":1.0}}},"3":{"df":2,"docs":{"157":{"tf":1.0},"283":{"tf":1.0}}},"5":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"df":0,"docs":{}},"8":{".":{"5":{"df":3,"docs":{"124":{"tf":1.0},"266":{"tf":1.0},"40":{"tf":2.8284271247461903}}},"6":{"df":1,"docs":{"40":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"267":{"tf":1.0}}},"9":{"df":1,"docs":{"211":{"tf":1.0}}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"40":{"tf":2.6457513110645907}}},"df":0,"docs":{},"x":{"df":1,"docs":{"40":{"tf":1.0}}}},"1":{"df":2,"docs":{"201":{"tf":1.0},"290":{"tf":1.0}}},"3":{"df":1,"docs":{"201":{"tf":1.0}}},"7":{"df":1,"docs":{"228":{"tf":1.0}}},"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"410":{"tf":1.0}}},"df":0,"docs":{}}},"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"4":{"5":{"8":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"b":{"1":{"7":{"5":{"df":0,"docs":{},"f":{"1":{"b":{"8":{"4":{"7":{"0":{"b":{"5":{"b":{"1":{"2":{"df":0,"docs":{},"e":{"4":{"a":{"6":{"3":{"d":{"6":{"7":{"0":{"df":0,"docs":{},"e":{"4":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":22,"docs":{"110":{"tf":1.0},"12":{"tf":1.0},"130":{"tf":1.0},"153":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.0},"2":{"tf":1.0},"213":{"tf":1.0},"237":{"tf":1.0},"254":{"tf":1.0},"270":{"tf":1.0},"296":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"328":{"tf":1.0},"345":{"tf":1.0},"364":{"tf":1.0},"395":{"tf":1.0},"47":{"tf":1.0},"64":{"tf":1.0},"81":{"tf":1.0},"99":{"tf":1.0}}},"1":{"df":21,"docs":{"100":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"131":{"tf":1.0},"154":{"tf":1.0},"171":{"tf":1.0},"197":{"tf":1.0},"214":{"tf":1.0},"238":{"tf":1.0},"255":{"tf":1.0},"271":{"tf":1.0},"297":{"tf":1.0},"315":{"tf":1.0},"329":{"tf":1.0},"346":{"tf":1.0},"365":{"tf":1.0},"396":{"tf":1.0},"411":{"tf":1.0},"49":{"tf":1.0},"65":{"tf":1.0},"82":{"tf":1.0}}},"2":{"a":{"1":{"6":{"8":{"df":0,"docs":{},"e":{"d":{"3":{"4":{"6":{"0":{"4":{"2":{"df":0,"docs":{},"f":{"0":{"7":{"0":{"1":{"0":{"df":0,"docs":{},"f":{"8":{"b":{"6":{"5":{"b":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"6":{"2":{"3":{"d":{"d":{"3":{"1":{"d":{"1":{"df":4,"docs":{"213":{"tf":1.0},"214":{"tf":1.0},"218":{"tf":1.0},"233":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":22,"docs":{"0":{"tf":1.0},"103":{"tf":1.0},"112":{"tf":1.0},"138":{"tf":1.0},"142":{"tf":1.0},"157":{"tf":1.0},"177":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"218":{"tf":1.0},"243":{"tf":1.0},"256":{"tf":1.0},"276":{"tf":1.0},"300":{"tf":1.0},"317":{"tf":1.0},"333":{"tf":1.0},"353":{"tf":1.4142135623730951},"403":{"tf":1.0},"415":{"tf":1.0},"52":{"tf":1.0},"73":{"tf":1.0},"88":{"tf":1.0}}},"3":{"df":21,"docs":{"108":{"tf":1.0},"115":{"tf":1.0},"146":{"tf":1.0},"163":{"tf":1.0},"184":{"tf":1.0},"209":{"tf":1.0},"219":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.0},"264":{"tf":1.0},"283":{"tf":1.0},"304":{"tf":1.0},"320":{"tf":1.0},"337":{"tf":1.0},"354":{"tf":1.0},"373":{"tf":1.0},"406":{"tf":1.0},"418":{"tf":1.0},"55":{"tf":1.0},"77":{"tf":1.0},"92":{"tf":1.0}}},"4":{"df":11,"docs":{"120":{"tf":1.0},"227":{"tf":1.0},"241":{"tf":1.0},"252":{"tf":1.0},"267":{"tf":1.0},"284":{"tf":1.0},"308":{"tf":1.0},"324":{"tf":1.0},"379":{"tf":1.0},"425":{"tf":1.0},"59":{"tf":1.0}}},"5":{"1":{"4":{"b":{"1":{"c":{"df":0,"docs":{},"f":{"3":{"4":{"c":{"2":{"df":0,"docs":{},"e":{"a":{"a":{"b":{"8":{"2":{"8":{"5":{"df":0,"docs":{},"f":{"4":{"3":{"3":{"0":{"5":{"c":{"1":{"0":{"a":{"8":{"7":{"df":0,"docs":{},"f":{"4":{"c":{"df":0,"docs":{},"e":{"3":{"4":{"a":{"0":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"b":{"0":{"d":{"3":{"3":{"8":{"2":{"2":{"9":{"b":{"8":{"7":{"d":{"0":{"6":{"b":{"df":0,"docs":{},"e":{"7":{"7":{"2":{"3":{"4":{"6":{"df":0,"docs":{},"e":{"a":{"0":{"b":{"6":{"4":{"3":{"b":{"d":{"df":0,"docs":{},"e":{"c":{"d":{"c":{"5":{"df":1,"docs":{"365":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":9,"docs":{"0":{"tf":1.0},"127":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"268":{"tf":1.0},"287":{"tf":1.0},"384":{"tf":1.0},"430":{"tf":1.0},"60":{"tf":1.0}}},"6":{"df":4,"docs":{"233":{"tf":1.0},"292":{"tf":1.0},"387":{"tf":1.0},"431":{"tf":1.0}}},"7":{"df":1,"docs":{"432":{"tf":1.0}}},"b":{"1":{"1":{"1":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"2":{"d":{"4":{"1":{"df":0,"docs":{},"e":{"2":{"a":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"7":{"3":{"4":{"8":{"2":{"5":{"c":{"3":{"a":{"1":{"2":{"0":{"8":{"7":{"d":{"4":{"2":{"3":{"df":0,"docs":{},"e":{"8":{"c":{"2":{"df":0,"docs":{},"f":{"0":{"a":{"df":0,"docs":{},"e":{"5":{"3":{"df":2,"docs":{"346":{"tf":1.0},"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":54,"docs":{"101":{"tf":1.7320508075688772},"108":{"tf":1.4142135623730951},"134":{"tf":1.0},"142":{"tf":1.0},"150":{"tf":1.0},"156":{"tf":1.7320508075688772},"162":{"tf":1.7320508075688772},"198":{"tf":5.0990195135927845},"199":{"tf":4.795831523312719},"200":{"tf":3.7416573867739413},"201":{"tf":2.8284271247461903},"202":{"tf":4.242640687119285},"206":{"tf":2.449489742783178},"207":{"tf":4.0},"208":{"tf":4.242640687119285},"211":{"tf":6.244997998398398},"228":{"tf":2.0},"229":{"tf":4.0},"232":{"tf":4.0},"239":{"tf":1.4142135623730951},"242":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.7320508075688772},"257":{"tf":2.0},"266":{"tf":5.291502622129181},"280":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":1.7320508075688772},"290":{"tf":2.23606797749979},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":3.0},"306":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"350":{"tf":1.7320508075688772},"359":{"tf":3.7416573867739413},"360":{"tf":1.7320508075688772},"361":{"tf":2.449489742783178},"369":{"tf":1.0},"374":{"tf":1.0},"375":{"tf":1.0},"378":{"tf":1.0},"391":{"tf":1.0},"405":{"tf":3.4641016151377544},"407":{"tf":2.0},"408":{"tf":3.3166247903554},"53":{"tf":2.0},"54":{"tf":1.4142135623730951},"61":{"tf":2.23606797749979},"62":{"tf":2.8284271247461903},"78":{"tf":1.0},"85":{"tf":2.0},"90":{"tf":1.0},"93":{"tf":1.7320508075688772}},"o":{"7":{"7":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"3":{"2":{".":{".":{"2":{"0":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"x":{"0":{"1":{"2":{"3":{"4":{"5":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"367":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"368":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"53":{"tf":1.0}}}}},"、":{"1":{"df":0,"docs":{},"、":{"2":{"df":0,"docs":{},"、":{"3":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},",":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"89":{"tf":1.0}}}}}}}}}},"1":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"246":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{".":{"1":{"0":{"0":{"0":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"324":{"tf":1.0}}},"df":2,"docs":{"298":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"4":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"62":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":2,"docs":{"298":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772}}},"=":{"1":{"0":{"0":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{"1":{"df":1,"docs":{"263":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":6,"docs":{"173":{"tf":1.4142135623730951},"191":{"tf":1.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"391":{"tf":1.0},"408":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"430":{"tf":1.0}}},"df":1,"docs":{"399":{"tf":1.0}}},"2":{"1":{"df":1,"docs":{"56":{"tf":1.0}}},"2":{"df":1,"docs":{"229":{"tf":1.0}}},"df":0,"docs":{}},"3":{"1":{"df":1,"docs":{"211":{"tf":1.0}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"430":{"tf":1.0}}}}}}}},"3":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"5":{"0":{"df":2,"docs":{"32":{"tf":1.0},"43":{"tf":1.0}}},"7":{"df":1,"docs":{"216":{"tf":1.0}}},"df":1,"docs":{"434":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"434":{"tf":1.0}}},"7":{"8":{".":{"0":{"df":0,"docs":{},"(":{"2":{"0":{"2":{"4":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"=":{"1":{"2":{"df":1,"docs":{"362":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"5":{"df":1,"docs":{"398":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"368":{"tf":1.0}}},"df":4,"docs":{"322":{"tf":1.0},"358":{"tf":1.0},"375":{"tf":1.0},"53":{"tf":1.0}}},"df":14,"docs":{"134":{"tf":1.4142135623730951},"156":{"tf":1.0},"167":{"tf":3.3166247903554},"170":{"tf":2.449489742783178},"172":{"tf":1.7320508075688772},"202":{"tf":4.0},"232":{"tf":1.0},"289":{"tf":2.0},"290":{"tf":1.0},"31":{"tf":1.0},"39":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.0}}},"2":{"3":{"df":1,"docs":{"397":{"tf":1.0}}},"df":2,"docs":{"207":{"tf":1.0},"320":{"tf":1.0}}},"4":{"df":1,"docs":{"142":{"tf":1.0}}},"5":{"df":1,"docs":{"320":{"tf":1.0}}},"8":{"2":{"c":{"4":{"b":{"0":{"6":{"3":{"a":{"8":{"df":0,"docs":{},"f":{"b":{"df":0,"docs":{},"e":{"6":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":73,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":1.0},"137":{"tf":1.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.7320508075688772},"150":{"tf":2.449489742783178},"162":{"tf":1.7320508075688772},"170":{"tf":3.1622776601683795},"172":{"tf":2.23606797749979},"173":{"tf":2.8284271247461903},"175":{"tf":3.4641016151377544},"176":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"183":{"tf":1.4142135623730951},"185":{"tf":3.0},"186":{"tf":2.6457513110645907},"188":{"tf":2.8284271247461903},"190":{"tf":1.4142135623730951},"191":{"tf":2.23606797749979},"192":{"tf":1.4142135623730951},"194":{"tf":1.0},"196":{"tf":1.0},"198":{"tf":1.0},"202":{"tf":1.0},"206":{"tf":2.8284271247461903},"224":{"tf":1.4142135623730951},"225":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":2.0},"243":{"tf":1.4142135623730951},"247":{"tf":2.23606797749979},"266":{"tf":1.4142135623730951},"267":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":2.0},"291":{"tf":1.4142135623730951},"293":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.7320508075688772},"303":{"tf":1.0},"306":{"tf":2.449489742783178},"319":{"tf":2.0},"320":{"tf":1.0},"322":{"tf":2.449489742783178},"324":{"tf":2.0},"332":{"tf":1.0},"335":{"tf":2.0},"341":{"tf":1.0},"353":{"tf":1.4142135623730951},"356":{"tf":2.0},"359":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951},"360":{"tf":1.0},"361":{"tf":1.0},"369":{"tf":1.4142135623730951},"37":{"tf":1.0},"404":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"62":{"tf":3.1622776601683795},"90":{"tf":1.4142135623730951},"91":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":2.0}}},"、":{"1":{"1":{"df":1,"docs":{"362":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"148":{"tf":1.0}}}}}},",":{"df":0,"docs":{},"之":{"df":0,"docs":{},"后":{"df":0,"docs":{},"是":{"df":0,"docs":{},"另":{"df":0,"docs":{},"两":{"df":0,"docs":{},"个":{"df":0,"docs":{},"列":{"df":0,"docs":{},"表":{"df":0,"docs":{},":":{"b":{"df":1,"docs":{"285":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}},":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"280":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"1":{":":{"4":{"3":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"3":{"d":{"5":{"0":{"8":{"b":{"0":{"a":{"2":{"8":{"b":{"0":{"3":{"df":0,"docs":{},"f":{"7":{"d":{"9":{"df":0,"docs":{},"f":{"1":{"6":{"c":{"8":{"8":{"7":{"2":{"6":{"0":{"8":{"8":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"f":{"d":{"8":{"7":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":38,"docs":{"120":{"tf":1.7320508075688772},"121":{"tf":1.7320508075688772},"123":{"tf":1.0},"140":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"189":{"tf":1.0},"192":{"tf":1.0},"198":{"tf":2.8284271247461903},"199":{"tf":2.0},"200":{"tf":1.4142135623730951},"202":{"tf":2.23606797749979},"203":{"tf":1.0},"206":{"tf":1.7320508075688772},"207":{"tf":2.0},"210":{"tf":1.4142135623730951},"211":{"tf":2.0},"225":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"266":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"303":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"337":{"tf":1.4142135623730951},"339":{"tf":1.0},"340":{"tf":1.4142135623730951},"341":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.0},"370":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"57":{"tf":1.0},"91":{"tf":1.4142135623730951}},":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"281":{"tf":1.0}}}}}}}}},"2":{".":{".":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":1.0}}}},"df":0,"docs":{}},"7":{".":{"0":{".":{"0":{".":{"1":{":":{"7":{"8":{"7":{"8":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"401":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}}}},"df":5,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"165":{"tf":1.4142135623730951}},"。":{"df":0,"docs":{},"第":{"df":0,"docs":{},"二":{"df":0,"docs":{},"个":{"df":0,"docs":{},"实":{"df":0,"docs":{},"例":{"df":0,"docs":{},",":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},",":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.0}}},"8":{"1":{"3":{"5":{"6":{"1":{"3":{"9":{"2":{"8":{"7":{"2":{"0":{"6":{"5":{"9":{"7":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":45,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"156":{"tf":1.0},"162":{"tf":1.4142135623730951},"178":{"tf":1.0},"180":{"tf":1.0},"200":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"215":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"218":{"tf":2.0},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.8284271247461903},"225":{"tf":2.8284271247461903},"226":{"tf":2.0},"228":{"tf":2.0},"229":{"tf":2.449489742783178},"231":{"tf":1.7320508075688772},"232":{"tf":2.6457513110645907},"235":{"tf":1.4142135623730951},"242":{"tf":2.0},"244":{"tf":1.4142135623730951},"246":{"tf":1.0},"249":{"tf":2.23606797749979},"250":{"tf":1.4142135623730951},"252":{"tf":2.23606797749979},"281":{"tf":1.7320508075688772},"306":{"tf":2.23606797749979},"319":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"359":{"tf":1.7320508075688772},"362":{"tf":1.0},"37":{"tf":1.0},"374":{"tf":1.7320508075688772},"400":{"tf":1.0},"405":{"tf":2.23606797749979},"434":{"tf":1.0},"51":{"tf":1.4142135623730951},"54":{"tf":1.0},"91":{"tf":1.4142135623730951}},"。":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"385":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"然":{"df":0,"docs":{},"而":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}}}}},":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"178":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"3":{"5":{"df":1,"docs":{"142":{"tf":1.0}}},"df":32,"docs":{"121":{"tf":2.0},"140":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"181":{"tf":1.0},"211":{"tf":1.4142135623730951},"224":{"tf":1.0},"226":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":3.1622776601683795},"242":{"tf":2.6457513110645907},"243":{"tf":2.0},"244":{"tf":1.4142135623730951},"245":{"tf":2.0},"246":{"tf":2.23606797749979},"247":{"tf":1.7320508075688772},"249":{"tf":2.8284271247461903},"250":{"tf":2.23606797749979},"251":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"329":{"tf":1.0},"339":{"tf":1.4142135623730951},"359":{"tf":1.7320508075688772},"374":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"93":{"tf":1.4142135623730951},"95":{"tf":1.0}}},"4":{"1":{"df":1,"docs":{"142":{"tf":1.0}}},"df":22,"docs":{"121":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"142":{"tf":1.0},"180":{"tf":1.0},"226":{"tf":1.4142135623730951},"246":{"tf":1.7320508075688772},"257":{"tf":3.1622776601683795},"258":{"tf":4.0},"266":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":1.7320508075688772},"306":{"tf":1.7320508075688772},"309":{"tf":1.0},"320":{"tf":1.4142135623730951},"332":{"tf":1.0},"340":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"375":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"59":{"tf":1.0},"91":{"tf":1.0},"95":{"tf":1.7320508075688772}},":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"5":{"0":{"0":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"1":{"df":2,"docs":{"142":{"tf":1.0},"144":{"tf":1.0}}},"df":39,"docs":{"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"183":{"tf":1.4142135623730951},"199":{"tf":1.0},"228":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.4142135623730951},"272":{"tf":1.7320508075688772},"273":{"tf":2.6457513110645907},"274":{"tf":1.7320508075688772},"275":{"tf":2.449489742783178},"277":{"tf":1.4142135623730951},"278":{"tf":2.449489742783178},"279":{"tf":2.449489742783178},"280":{"tf":2.23606797749979},"281":{"tf":3.1622776601683795},"283":{"tf":3.3166247903554},"285":{"tf":2.8284271247461903},"286":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":2.0},"291":{"tf":2.8284271247461903},"293":{"tf":3.1622776601683795},"294":{"tf":2.8284271247461903},"304":{"tf":1.0},"306":{"tf":2.23606797749979},"307":{"tf":1.4142135623730951},"320":{"tf":1.0},"322":{"tf":1.7320508075688772},"341":{"tf":1.4142135623730951},"359":{"tf":1.7320508075688772},"375":{"tf":1.4142135623730951},"380":{"tf":1.0},"381":{"tf":1.0},"405":{"tf":1.7320508075688772},"407":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"6":{"0":{"8":{"6":{"9":{"df":0,"docs":{},"f":{"3":{"8":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"9":{"1":{"6":{"6":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"359":{"tf":1.7320508075688772}}},"4":{"df":1,"docs":{"142":{"tf":2.23606797749979}}},"5":{"df":1,"docs":{"142":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"142":{"tf":1.0}}},"df":27,"docs":{"122":{"tf":1.7320508075688772},"141":{"tf":1.4142135623730951},"185":{"tf":1.7320508075688772},"228":{"tf":1.4142135623730951},"231":{"tf":1.0},"242":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"283":{"tf":2.0},"298":{"tf":2.6457513110645907},"299":{"tf":3.605551275463989},"300":{"tf":2.6457513110645907},"301":{"tf":1.7320508075688772},"302":{"tf":2.23606797749979},"303":{"tf":1.7320508075688772},"306":{"tf":3.3166247903554},"309":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.4142135623730951},"342":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"360":{"tf":2.23606797749979},"376":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"53":{"tf":1.0},"78":{"tf":1.0},"97":{"tf":1.4142135623730951}},"、":{"1":{"0":{"df":1,"docs":{"185":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"7":{"0":{"b":{"9":{"4":{"2":{"df":0,"docs":{},"e":{"b":{"5":{"b":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"3":{"a":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"df":1,"docs":{"142":{"tf":1.0}}},"df":36,"docs":{"123":{"tf":1.4142135623730951},"127":{"tf":1.0},"141":{"tf":1.4142135623730951},"185":{"tf":1.4142135623730951},"186":{"tf":1.0},"191":{"tf":1.0},"229":{"tf":1.4142135623730951},"242":{"tf":1.0},"249":{"tf":1.4142135623730951},"285":{"tf":1.7320508075688772},"314":{"tf":2.0},"316":{"tf":3.7416573867739413},"318":{"tf":2.449489742783178},"319":{"tf":3.3166247903554},"320":{"tf":3.7416573867739413},"321":{"tf":1.4142135623730951},"322":{"tf":3.3166247903554},"323":{"tf":2.449489742783178},"324":{"tf":2.449489742783178},"325":{"tf":1.4142135623730951},"331":{"tf":2.0},"334":{"tf":2.8284271247461903},"335":{"tf":3.0},"336":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"339":{"tf":1.7320508075688772},"340":{"tf":2.0},"341":{"tf":1.7320508075688772},"342":{"tf":3.0},"343":{"tf":2.8284271247461903},"360":{"tf":1.4142135623730951},"376":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"407":{"tf":1.0},"78":{"tf":1.0}},":":{"df":0,"docs":{},"r":{"df":1,"docs":{"185":{"tf":1.0}}}}},"8":{"0":{"df":1,"docs":{"144":{"tf":1.0}}},"4":{"df":1,"docs":{"142":{"tf":1.0}}},"df":22,"docs":{"125":{"tf":1.4142135623730951},"141":{"tf":2.0},"142":{"tf":1.0},"185":{"tf":1.4142135623730951},"186":{"tf":1.0},"229":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"249":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"342":{"tf":1.4142135623730951},"353":{"tf":2.6457513110645907},"356":{"tf":1.4142135623730951},"359":{"tf":3.605551275463989},"360":{"tf":4.47213595499958},"361":{"tf":2.6457513110645907},"362":{"tf":1.4142135623730951},"376":{"tf":2.0},"405":{"tf":1.4142135623730951},"78":{"tf":1.0}}},"9":{",":{"2":{"3":{"4":{",":{"9":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"2":{"0":{",":{"3":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"7":{"df":1,"docs":{"328":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}},"9":{"4":{"df":1,"docs":{"330":{"tf":1.0}}},"9":{"df":1,"docs":{"104":{"tf":1.0}}},"c":{"a":{"9":{"9":{"9":{"2":{"6":{"df":0,"docs":{},"f":{"2":{"3":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"f":{"5":{"8":{"1":{"a":{"9":{"1":{"7":{"df":0,"docs":{},"e":{"a":{"d":{"a":{"4":{"b":{"6":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"2":{"1":{"7":{"5":{"4":{"df":1,"docs":{"153":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":35,"docs":{"125":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"188":{"tf":1.0},"225":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"348":{"tf":1.7320508075688772},"349":{"tf":1.7320508075688772},"350":{"tf":1.7320508075688772},"351":{"tf":2.0},"352":{"tf":2.0},"360":{"tf":1.4142135623730951},"367":{"tf":2.8284271247461903},"368":{"tf":3.3166247903554},"369":{"tf":2.0},"370":{"tf":1.4142135623730951},"374":{"tf":2.449489742783178},"375":{"tf":2.0},"376":{"tf":4.0},"377":{"tf":1.4142135623730951},"378":{"tf":1.4142135623730951},"380":{"tf":1.0},"381":{"tf":2.23606797749979},"382":{"tf":2.0},"385":{"tf":1.4142135623730951},"389":{"tf":1.7320508075688772},"390":{"tf":1.4142135623730951},"391":{"tf":3.872983346207417},"405":{"tf":1.4142135623730951},"78":{"tf":1.0}},":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"186":{"tf":1.0}}}}},"df":0,"docs":{}}}},":":{"1":{"df":1,"docs":{"297":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"_":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":138,"docs":{"0":{"tf":1.0},"101":{"tf":2.0},"102":{"tf":1.0},"103":{"tf":1.7320508075688772},"104":{"tf":1.0},"105":{"tf":2.0},"106":{"tf":1.7320508075688772},"108":{"tf":1.4142135623730951},"114":{"tf":2.0},"115":{"tf":1.0},"120":{"tf":1.7320508075688772},"132":{"tf":1.7320508075688772},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"150":{"tf":1.7320508075688772},"151":{"tf":1.0},"156":{"tf":2.0},"162":{"tf":1.0},"167":{"tf":3.3166247903554},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"173":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":3.1622776601683795},"199":{"tf":3.1622776601683795},"200":{"tf":2.0},"201":{"tf":2.0},"202":{"tf":4.358898943540674},"203":{"tf":1.0},"206":{"tf":2.0},"207":{"tf":1.7320508075688772},"208":{"tf":2.23606797749979},"211":{"tf":3.1622776601683795},"215":{"tf":1.4142135623730951},"217":{"tf":1.0},"22":{"tf":2.0},"221":{"tf":1.0},"224":{"tf":2.449489742783178},"225":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":1.4142135623730951},"23":{"tf":1.0},"232":{"tf":1.0},"239":{"tf":2.0},"240":{"tf":2.6457513110645907},"241":{"tf":2.8284271247461903},"242":{"tf":2.6457513110645907},"246":{"tf":2.6457513110645907},"255":{"tf":1.4142135623730951},"257":{"tf":3.0},"26":{"tf":2.0},"266":{"tf":2.8284271247461903},"267":{"tf":1.0},"272":{"tf":1.7320508075688772},"273":{"tf":2.449489742783178},"274":{"tf":1.4142135623730951},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":2.0},"289":{"tf":2.0},"290":{"tf":1.7320508075688772},"293":{"tf":2.0},"294":{"tf":2.449489742783178},"298":{"tf":3.1622776601683795},"299":{"tf":1.7320508075688772},"301":{"tf":1.0},"306":{"tf":2.6457513110645907},"31":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.7320508075688772},"318":{"tf":2.449489742783178},"324":{"tf":2.449489742783178},"33":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"335":{"tf":1.0},"347":{"tf":1.0},"348":{"tf":1.7320508075688772},"349":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":2.449489742783178},"353":{"tf":1.4142135623730951},"355":{"tf":1.7320508075688772},"357":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"361":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":2.449489742783178},"374":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":2.0},"385":{"tf":1.0},"386":{"tf":2.6457513110645907},"39":{"tf":1.0},"391":{"tf":1.4142135623730951},"395":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.7320508075688772},"401":{"tf":1.0},"405":{"tf":2.449489742783178},"407":{"tf":1.0},"408":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"416":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"427":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.7320508075688772},"52":{"tf":1.0},"53":{"tf":3.1622776601683795},"54":{"tf":3.0},"57":{"tf":2.8284271247461903},"58":{"tf":2.23606797749979},"61":{"tf":1.4142135623730951},"62":{"tf":2.6457513110645907},"68":{"tf":1.4142135623730951},"70":{"tf":2.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"78":{"tf":1.0},"79":{"tf":1.4142135623730951},"82":{"tf":2.23606797749979},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":2.0},"90":{"tf":1.0},"91":{"tf":1.0}},"f":{"b":{"7":{"4":{"c":{"3":{"df":0,"docs":{},"f":{"1":{"d":{"8":{"a":{"df":0,"docs":{},"e":{"b":{"a":{"3":{"9":{"3":{"7":{"3":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"4":{"c":{"d":{"b":{"9":{"a":{"4":{"b":{"d":{"c":{"a":{"9":{"5":{"6":{"0":{"4":{"df":0,"docs":{},"f":{"df":2,"docs":{"2":{"tf":1.0},"20":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"8":{"9":{"0":{"0":{"3":{"1":{"3":{"1":{"1":{"6":{"1":{"2":{"df":0,"docs":{},"e":{"5":{"4":{"9":{"6":{"5":{"df":0,"docs":{},"f":{"7":{"df":0,"docs":{},"f":{"8":{"0":{"0":{"a":{"8":{"c":{"8":{"b":{"d":{"4":{"4":{"6":{"4":{"6":{"6":{"3":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"f":{"c":{"4":{"b":{"9":{"6":{"c":{"2":{"0":{"1":{"7":{"df":0,"docs":{},"f":{"6":{"4":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"f":{"4":{"1":{"a":{"0":{"a":{"0":{"7":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"e":{"8":{"1":{"5":{"df":0,"docs":{},"f":{"2":{"4":{"df":0,"docs":{},"f":{"df":4,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"296":{"tf":1.0},"410":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"3":{"2":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"、":{"2":{"df":3,"docs":{"132":{"tf":1.0},"349":{"tf":1.0},"389":{"tf":1.0}},"、":{"3":{"df":0,"docs":{},"、":{"4":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"然":{"df":0,"docs":{},"而":{"df":0,"docs":{},",":{"b":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}}}}},",":{"2":{"df":0,"docs":{},",":{"3":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"82":{"tf":1.0}}}}}}}},"2":{".":{"0":{"df":3,"docs":{"260":{"tf":1.4142135623730951},"391":{"tf":1.0},"53":{"tf":1.0}}},"5":{"3":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0}}},"df":0,"docs":{}},"8":{"5":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"8":{"df":1,"docs":{"104":{"tf":1.0}}},"9":{"df":1,"docs":{"102":{"tf":1.0}}},"df":8,"docs":{"202":{"tf":2.0},"399":{"tf":2.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}},"1":{"5":{"df":3,"docs":{"414":{"tf":1.4142135623730951},"430":{"tf":2.0},"434":{"tf":1.0}},"、":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"430":{"tf":1.0}}}}}}}},"8":{"df":2,"docs":{"414":{"tf":1.4142135623730951},"430":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"1":{"df":4,"docs":{"26":{"tf":1.0},"260":{"tf":1.0},"32":{"tf":1.0},"430":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"8":{"df":2,"docs":{"142":{"tf":2.0},"144":{"tf":1.4142135623730951}}},":":{"1":{"0":{"df":1,"docs":{"320":{"tf":3.7416573867739413}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":28,"docs":{"125":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"289":{"tf":1.0},"320":{"tf":1.7320508075688772},"322":{"tf":1.7320508075688772},"328":{"tf":1.0},"343":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"395":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":2.0},"401":{"tf":3.0},"402":{"tf":2.0},"404":{"tf":2.0},"405":{"tf":5.477225575051661},"406":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951},"408":{"tf":2.449489742783178},"62":{"tf":2.0},"78":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"1":{"a":{"2":{"df":0,"docs":{},"e":{"d":{"1":{"4":{"df":0,"docs":{},"f":{"4":{"4":{"8":{"0":{"d":{"a":{"b":{"6":{"2":{"4":{"3":{"8":{"d":{"c":{"c":{"1":{"1":{"3":{"0":{"2":{"9":{"1":{"b":{"df":0,"docs":{},"e":{"b":{"c":{"6":{"5":{"3":{"7":{"9":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"f":{"8":{"4":{"0":{"8":{"4":{"2":{"b":{"d":{"df":0,"docs":{},"f":{"7":{"6":{"8":{"a":{"7":{"9":{"8":{"8":{"6":{"9":{"df":0,"docs":{},"f":{"0":{"6":{"3":{"7":{"3":{"c":{"9":{"6":{"c":{"1":{"c":{"c":{"5":{"1":{"2":{"2":{"df":1,"docs":{"384":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":16,"docs":{"127":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"188":{"tf":1.0},"194":{"tf":1.0},"211":{"tf":1.0},"232":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"251":{"tf":1.0},"289":{"tf":1.4142135623730951},"306":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.4142135623730951},"343":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"376":{"tf":1.4142135623730951},"405":{"tf":2.0}},":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"188":{"tf":1.0}}}}}}}}}}},"2":{"4":{"df":1,"docs":{"142":{"tf":2.449489742783178}}},"df":14,"docs":{"127":{"tf":1.7320508075688772},"149":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951},"232":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"251":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"377":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951},"42":{"tf":1.0}}},"3":{"df":11,"docs":{"150":{"tf":1.4142135623730951},"185":{"tf":1.0},"188":{"tf":1.7320508075688772},"232":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"290":{"tf":1.7320508075688772},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"378":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951}}},"4":{"3":{".":{"3":{"df":1,"docs":{"267":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"142":{"tf":1.0},"150":{"tf":1.7320508075688772},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"235":{"tf":1.4142135623730951},"249":{"tf":1.0},"291":{"tf":1.4142135623730951},"293":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"377":{"tf":1.0},"381":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951}}},"5":{"5":{"df":3,"docs":{"101":{"tf":1.0},"359":{"tf":1.7320508075688772},"53":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"53":{"tf":1.0}}},"df":16,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":2.449489742783178},"108":{"tf":1.4142135623730951},"150":{"tf":2.0},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"191":{"tf":1.7320508075688772},"240":{"tf":1.0},"249":{"tf":1.0},"293":{"tf":2.0},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"381":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951}}},"6":{":":{"1":{"0":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":7,"docs":{"293":{"tf":1.4142135623730951},"294":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"382":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951}}},"7":{"df":7,"docs":{"294":{"tf":1.7320508075688772},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"385":{"tf":1.4142135623730951},"405":{"tf":1.0},"53":{"tf":1.4142135623730951}}},"8":{"0":{"df":2,"docs":{"178":{"tf":1.0},"179":{"tf":1.0}}},"df":7,"docs":{"228":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"389":{"tf":1.7320508075688772},"53":{"tf":1.0}}},"9":{"2":{"1":{"7":{"4":{"3":{"5":{"1":{"6":{"b":{"3":{"df":0,"docs":{},"e":{"2":{"c":{"0":{"df":0,"docs":{},"f":{"4":{"5":{"a":{"9":{"5":{"3":{"9":{"0":{"df":0,"docs":{},"e":{"7":{"b":{"5":{"3":{"6":{"df":0,"docs":{},"e":{"4":{"2":{"df":0,"docs":{},"f":{"4":{"a":{"df":0,"docs":{},"f":{"7":{"c":{"df":1,"docs":{"154":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"df":0,"docs":{},"f":{"d":{"1":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"e":{"1":{"1":{"d":{"d":{"6":{"1":{"c":{"a":{"1":{"3":{"6":{"df":0,"docs":{},"f":{"b":{"5":{"1":{"d":{"7":{"1":{"3":{"df":0,"docs":{},"f":{"6":{"b":{"0":{"b":{"a":{"7":{"5":{"1":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":5,"docs":{"294":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"362":{"tf":1.4142135623730951},"390":{"tf":1.4142135623730951}}},"b":{"4":{"5":{"6":{"5":{"6":{"6":{"2":{"d":{"1":{"a":{"7":{"9":{"7":{"3":{"d":{"8":{"7":{"0":{"7":{"4":{"4":{"a":{"9":{"2":{"3":{"df":0,"docs":{},"f":{"5":{"8":{"df":0,"docs":{},"f":{"8":{"df":0,"docs":{},"f":{"7":{"d":{"c":{"c":{"df":0,"docs":{},"e":{"9":{"1":{"df":2,"docs":{"115":{"tf":1.0},"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"d":{"1":{"b":{"5":{"5":{"9":{"3":{"d":{"2":{"6":{"d":{"c":{"6":{"a":{"0":{"3":{"c":{"2":{"0":{"df":0,"docs":{},"f":{"8":{"6":{"1":{"9":{"1":{"8":{"7":{"a":{"d":{"4":{"b":{"2":{"4":{"8":{"5":{"5":{"5":{"2":{"df":1,"docs":{"248":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":101,"docs":{"101":{"tf":2.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.7320508075688772},"116":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.0},"132":{"tf":1.7320508075688772},"134":{"tf":2.0},"137":{"tf":1.0},"150":{"tf":1.0},"156":{"tf":2.23606797749979},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"170":{"tf":2.449489742783178},"198":{"tf":2.8284271247461903},"199":{"tf":1.7320508075688772},"200":{"tf":1.0},"203":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.23606797749979},"208":{"tf":1.4142135623730951},"210":{"tf":1.7320508075688772},"217":{"tf":1.4142135623730951},"221":{"tf":1.0},"224":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":3.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.4142135623730951},"257":{"tf":1.7320508075688772},"26":{"tf":1.0},"266":{"tf":1.0},"273":{"tf":3.0},"274":{"tf":1.4142135623730951},"275":{"tf":2.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"289":{"tf":1.4142135623730951},"293":{"tf":2.449489742783178},"294":{"tf":1.0},"298":{"tf":3.0},"299":{"tf":2.0},"306":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"318":{"tf":2.449489742783178},"323":{"tf":1.0},"324":{"tf":2.23606797749979},"33":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"349":{"tf":2.0},"350":{"tf":1.0},"351":{"tf":2.449489742783178},"353":{"tf":1.0},"355":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.0},"360":{"tf":2.449489742783178},"361":{"tf":2.23606797749979},"367":{"tf":1.4142135623730951},"368":{"tf":2.0},"37":{"tf":1.7320508075688772},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":2.6457513110645907},"382":{"tf":1.0},"385":{"tf":1.4142135623730951},"386":{"tf":1.0},"389":{"tf":1.7320508075688772},"391":{"tf":1.4142135623730951},"398":{"tf":1.4142135623730951},"40":{"tf":2.0},"401":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"407":{"tf":1.0},"408":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"42":{"tf":1.7320508075688772},"428":{"tf":1.0},"45":{"tf":2.0},"49":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":2.449489742783178},"57":{"tf":2.0},"61":{"tf":3.0},"62":{"tf":2.449489742783178},"70":{"tf":2.6457513110645907},"75":{"tf":1.0},"79":{"tf":1.7320508075688772},"82":{"tf":1.4142135623730951},"84":{"tf":1.0},"87":{"tf":1.7320508075688772},"91":{"tf":1.0},"94":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"53":{"tf":1.7320508075688772}}},",":{"df":0,"docs":{},"x":{"df":1,"docs":{"51":{"tf":1.0}}}},":":{"*":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"257":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"3":{".":{".":{"=":{"7":{"df":1,"docs":{"362":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":1,"docs":{"53":{"tf":1.0}}},"1":{"4":{"1":{"5":{"df":1,"docs":{"428":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"183":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"0":{"df":13,"docs":{"322":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"348":{"tf":2.0},"391":{"tf":2.6457513110645907},"53":{"tf":1.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":2.6457513110645907},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"1":{"0":{"df":0,"docs":{},"e":{"a":{"6":{"c":{"b":{"0":{"d":{"d":{"8":{"5":{"5":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"5":{"1":{"0":{"c":{"9":{"b":{"a":{"0":{"5":{"6":{"4":{"8":{"b":{"c":{"5":{"8":{"3":{"6":{"df":0,"docs":{},"e":{"a":{"d":{"0":{"c":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"1":{"df":0,"docs":{},"e":{"d":{"a":{"0":{"7":{"a":{"4":{"a":{"4":{"6":{"9":{"2":{"b":{"df":0,"docs":{},"f":{"6":{"9":{"df":0,"docs":{},"e":{"3":{"a":{"a":{"a":{"d":{"9":{"9":{"9":{"d":{"8":{"4":{"0":{"a":{"c":{"9":{"c":{"1":{"3":{"8":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"324":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951}}},"2":{".":{"2":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":6,"docs":{"135":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"360":{"tf":2.449489742783178},"391":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"53":{"tf":2.23606797749979}}},"3":{"df":2,"docs":{"325":{"tf":1.4142135623730951},"391":{"tf":1.7320508075688772}}},"4":{"\"":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"348":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"3":{"1":{"4":{"c":{"1":{"0":{"df":0,"docs":{},"f":{"6":{"9":{"9":{"c":{"c":{"8":{"8":{"2":{"d":{"4":{"df":0,"docs":{},"e":{"0":{"b":{"0":{"6":{"df":0,"docs":{},"f":{"2":{"a":{"2":{"4":{"b":{"d":{"3":{"7":{"a":{"5":{"4":{"3":{"5":{"df":0,"docs":{},"f":{"2":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.4142135623730951},"382":{"tf":1.0}}},"5":{"0":{"df":1,"docs":{"322":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.0}}}},"df":1,"docs":{"322":{"tf":1.4142135623730951}}},"6":{"3":{"8":{"3":{"b":{"4":{"d":{"a":{"2":{"1":{"d":{"b":{"d":{"0":{"a":{"0":{"7":{"8":{"1":{"4":{"7":{"3":{"b":{"c":{"8":{"a":{"d":{"7":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"e":{"d":{"1":{"b":{"6":{"7":{"5":{"1":{"df":1,"docs":{"300":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":1,"docs":{"42":{"tf":1.7320508075688772}}},"9":{"6":{"2":{"c":{"0":{"2":{"2":{"4":{"b":{"2":{"7":{"4":{"df":0,"docs":{},"e":{"2":{"3":{"5":{"8":{"df":0,"docs":{},"e":{"0":{"a":{"c":{"df":0,"docs":{},"f":{"0":{"6":{"4":{"4":{"3":{"a":{"df":0,"docs":{},"f":{"6":{"4":{"d":{"df":0,"docs":{},"f":{"1":{"1":{"5":{"3":{"5":{"9":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"d":{"b":{"6":{"9":{"d":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"f":{"b":{"1":{"8":{"df":0,"docs":{},"f":{"2":{"4":{"b":{"1":{"5":{"c":{"7":{"a":{"d":{"1":{"3":{"4":{"9":{"1":{"b":{"1":{"c":{"1":{"df":0,"docs":{},"f":{"a":{"7":{"2":{"3":{"1":{"df":1,"docs":{"415":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"8":{"d":{"6":{"df":0,"docs":{},"f":{"4":{"8":{"d":{"2":{"df":0,"docs":{},"e":{"6":{"b":{"7":{"b":{"1":{"5":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"d":{"5":{"1":{"c":{"4":{"5":{"4":{"1":{"d":{"4":{"4":{"6":{"df":0,"docs":{},"e":{"8":{"9":{"d":{"df":0,"docs":{},"e":{"3":{"8":{"9":{"2":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"5":{"1":{"df":0,"docs":{},"f":{"7":{"0":{"c":{"7":{"8":{"1":{"6":{"2":{"df":0,"docs":{},"f":{"a":{"a":{"df":0,"docs":{},"e":{"b":{"c":{"a":{"b":{"0":{"d":{"a":{"0":{"d":{"df":0,"docs":{},"e":{"2":{"d":{"d":{"d":{"3":{"3":{"3":{"df":0,"docs":{},"e":{"7":{"a":{"8":{"df":3,"docs":{"65":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":92,"docs":{"103":{"tf":2.23606797749979},"106":{"tf":1.0},"107":{"tf":2.449489742783178},"115":{"tf":2.0},"116":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"134":{"tf":1.7320508075688772},"137":{"tf":1.0},"142":{"tf":1.7320508075688772},"156":{"tf":2.0},"157":{"tf":1.7320508075688772},"162":{"tf":1.4142135623730951},"170":{"tf":1.7320508075688772},"172":{"tf":1.0},"174":{"tf":1.0},"192":{"tf":1.4142135623730951},"196":{"tf":1.0},"198":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"224":{"tf":2.23606797749979},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.23606797749979},"231":{"tf":1.0},"232":{"tf":2.0},"240":{"tf":1.7320508075688772},"241":{"tf":3.0},"242":{"tf":2.0},"243":{"tf":1.7320508075688772},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"273":{"tf":2.6457513110645907},"275":{"tf":1.0},"285":{"tf":2.0},"286":{"tf":1.0},"289":{"tf":1.4142135623730951},"291":{"tf":1.0},"294":{"tf":2.6457513110645907},"298":{"tf":2.449489742783178},"299":{"tf":3.0},"314":{"tf":1.4142135623730951},"316":{"tf":2.0},"318":{"tf":2.449489742783178},"324":{"tf":2.0},"334":{"tf":1.0},"345":{"tf":1.0},"349":{"tf":1.4142135623730951},"350":{"tf":1.7320508075688772},"351":{"tf":2.449489742783178},"352":{"tf":2.0},"353":{"tf":1.4142135623730951},"355":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.7320508075688772},"360":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":2.8284271247461903},"369":{"tf":1.0},"375":{"tf":1.7320508075688772},"377":{"tf":2.449489742783178},"382":{"tf":1.0},"385":{"tf":1.4142135623730951},"389":{"tf":2.0},"399":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"408":{"tf":2.449489742783178},"41":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":2.23606797749979},"54":{"tf":3.3166247903554},"57":{"tf":2.23606797749979},"61":{"tf":3.3166247903554},"62":{"tf":3.605551275463989},"70":{"tf":2.23606797749979},"71":{"tf":1.4142135623730951},"72":{"tf":1.0},"79":{"tf":1.7320508075688772},"82":{"tf":1.4142135623730951},"87":{"tf":1.7320508075688772}},"e":{"5":{"1":{"0":{"5":{"b":{"5":{"2":{"df":0,"docs":{},"f":{"7":{"df":0,"docs":{},"e":{"8":{"d":{"3":{"d":{"9":{"5":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"d":{"df":0,"docs":{},"e":{"4":{"d":{"c":{"b":{"1":{"c":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"2":{"7":{"df":1,"docs":{"406":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"f":{"2":{"a":{"6":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"4":{"8":{"9":{"4":{"3":{"a":{"d":{"df":0,"docs":{},"e":{"3":{"df":0,"docs":{},"e":{"9":{"c":{"0":{"df":0,"docs":{},"e":{"b":{"2":{"3":{"d":{"6":{"9":{"df":0,"docs":{},"e":{"2":{"b":{"8":{"b":{"4":{"1":{"df":0,"docs":{},"f":{"0":{"5":{"7":{"df":0,"docs":{},"f":{"1":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":1,"docs":{"267":{"tf":1.0}}},"(":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"个":{"df":0,"docs":{},"程":{"df":0,"docs":{},"序":{"df":0,"docs":{},"中":{"df":0,"docs":{},"要":{"df":0,"docs":{},"计":{"df":0,"docs":{},"算":{"df":0,"docs":{},"的":{"df":0,"docs":{},"小":{"df":0,"docs":{},"时":{"df":0,"docs":{},"数":{"df":0,"docs":{},")":{"df":0,"docs":{},"的":{"df":0,"docs":{},"结":{"df":0,"docs":{},"果":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"50":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}}}},":":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"334":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"4":{".":{"0":{"df":1,"docs":{"173":{"tf":2.23606797749979}},",":{"df":0,"docs":{},"因":{"df":0,"docs":{},"为":{"df":0,"docs":{},"它":{"df":0,"docs":{},"i":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}},"3":{"df":1,"docs":{"53":{"tf":1.0}}},"4":{"5":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"4":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":5,"docs":{"401":{"tf":2.0},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}}},"df":5,"docs":{"401":{"tf":2.23606797749979},"402":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"df":4,"docs":{"402":{"tf":1.0},"62":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"2":{"\"":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{":":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":3,"docs":{"170":{"tf":1.4142135623730951},"320":{"tf":1.0},"53":{"tf":1.0}}},"4":{"df":0,"docs":{},"e":{"3":{"1":{"df":0,"docs":{},"f":{"9":{"df":0,"docs":{},"f":{"3":{"0":{"4":{"df":0,"docs":{},"e":{"0":{"c":{"d":{"9":{"a":{"c":{"df":0,"docs":{},"e":{"0":{"1":{"0":{"4":{"5":{"d":{"1":{"7":{"a":{"2":{"a":{"a":{"0":{"1":{"a":{"4":{"4":{"9":{"5":{"2":{"8":{"df":2,"docs":{"254":{"tf":1.0},"255":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":3,"docs":{"43":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"6":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}},"7":{"df":1,"docs":{"405":{"tf":1.0}}},"8":{"df":1,"docs":{"405":{"tf":1.0}}},"9":{"9":{"7":{"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"0":{"6":{"8":{"6":{"df":0,"docs":{},"f":{"a":{"8":{"df":0,"docs":{},"e":{"df":1,"docs":{"266":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"405":{"tf":1.0}}},"a":{"a":{"9":{"6":{"a":{"3":{"d":{"2":{"0":{"5":{"7":{"0":{"df":0,"docs":{},"f":{"8":{"6":{"8":{"b":{"d":{"2":{"0":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"e":{"3":{"df":0,"docs":{},"e":{"8":{"6":{"5":{"b":{"0":{"4":{"7":{"2":{"8":{"4":{"b":{"df":0,"docs":{},"e":{"3":{"0":{"df":1,"docs":{"169":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"8":{"d":{"1":{"3":{"c":{"5":{"2":{"c":{"5":{"1":{"df":0,"docs":{},"f":{"1":{"c":{"6":{"2":{"a":{"8":{"0":{"b":{"5":{"2":{"d":{"7":{"df":0,"docs":{},"f":{"b":{"d":{"7":{"c":{"c":{"0":{"b":{"6":{"3":{"a":{"d":{"a":{"4":{"3":{"df":1,"docs":{"431":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":73,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"108":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.0},"125":{"tf":1.0},"134":{"tf":2.449489742783178},"137":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.0},"156":{"tf":1.7320508075688772},"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"160":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"198":{"tf":2.23606797749979},"200":{"tf":2.449489742783178},"203":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"23":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":2.0},"246":{"tf":1.7320508075688772},"258":{"tf":2.23606797749979},"273":{"tf":1.4142135623730951},"285":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"298":{"tf":2.449489742783178},"299":{"tf":2.449489742783178},"316":{"tf":1.4142135623730951},"318":{"tf":2.449489742783178},"324":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"351":{"tf":1.4142135623730951},"358":{"tf":1.0},"360":{"tf":2.8284271247461903},"361":{"tf":2.6457513110645907},"368":{"tf":2.6457513110645907},"377":{"tf":2.6457513110645907},"400":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"414":{"tf":1.0},"417":{"tf":1.4142135623730951},"42":{"tf":1.7320508075688772},"427":{"tf":1.0},"49":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":2.0},"57":{"tf":1.0},"61":{"tf":2.449489742783178},"62":{"tf":2.8284271247461903},"68":{"tf":1.4142135623730951},"70":{"tf":4.0},"71":{"tf":1.4142135623730951},"72":{"tf":2.6457513110645907},"73":{"tf":2.23606797749979},"74":{"tf":1.7320508075688772},"77":{"tf":2.23606797749979},"78":{"tf":2.449489742783178},"79":{"tf":1.4142135623730951},"82":{"tf":1.0},"83":{"tf":1.0},"87":{"tf":1.4142135623730951}},"、":{"5":{"df":1,"docs":{"361":{"tf":1.4142135623730951}}},"df":0,"docs":{}},":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"1":{"df":1,"docs":{"70":{"tf":1.0}}},"df":0,"docs":{}}}},"5":{".":{"0":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"df":3,"docs":{"318":{"tf":1.0},"319":{"tf":1.0},"54":{"tf":1.7320508075688772}}},"5":{"7":{"df":0,"docs":{},"f":{"1":{"5":{"7":{"c":{"d":{"0":{"b":{"3":{"5":{"b":{"c":{"7":{"d":{"0":{"d":{"c":{"0":{"a":{"df":0,"docs":{},"f":{"6":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"6":{"2":{"2":{"df":0,"docs":{},"f":{"a":{"4":{"c":{"4":{"8":{"0":{"9":{"9":{"6":{"df":1,"docs":{"425":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"7":{"7":{"5":{"3":{"6":{"0":{"b":{"a":{"3":{"9":{"0":{"4":{"c":{"4":{"1":{"df":0,"docs":{},"e":{"8":{"4":{"1":{"7":{"6":{"3":{"3":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"7":{"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"e":{"7":{"d":{"6":{"1":{"7":{"7":{"c":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":20,"docs":{"104":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"148":{"tf":1.7320508075688772},"150":{"tf":1.7320508075688772},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"196":{"tf":1.0},"335":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0},"42":{"tf":1.7320508075688772},"62":{"tf":1.7320508075688772},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":2.449489742783178},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"2":{"df":1,"docs":{"407":{"tf":1.7320508075688772}},"f":{"a":{"df":0,"docs":{},"f":{"a":{"a":{"a":{"8":{"df":0,"docs":{},"e":{"4":{"3":{"2":{"df":0,"docs":{},"e":{"8":{"4":{"b":{"df":0,"docs":{},"e":{"a":{"a":{"df":0,"docs":{},"f":{"4":{"df":0,"docs":{},"e":{"a":{"8":{"0":{"c":{"c":{"b":{"a":{"8":{"8":{"0":{"6":{"2":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"d":{"df":1,"docs":{"284":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"4":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}},"6":{".":{"7":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"289":{"tf":1.0}}},"7":{"d":{"7":{"0":{"c":{"3":{"a":{"c":{"b":{"7":{"3":{"8":{"df":0,"docs":{},"f":{"4":{"d":{"df":1,"docs":{"202":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"135":{"tf":1.4142135623730951},"289":{"tf":1.0}},"u":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}},"8":{"df":2,"docs":{"289":{"tf":1.0},"42":{"tf":1.0}}},"9":{"df":1,"docs":{"43":{"tf":1.7320508075688772}}},"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"42":{"tf":1.0}}},"r":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"。":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"a":{"3":{"a":{"6":{"4":{"d":{"6":{"0":{"b":{"0":{"d":{"d":{"7":{"8":{"6":{"c":{"3":{"5":{"c":{"a":{"4":{"d":{"a":{"a":{"d":{"a":{"7":{"a":{"4":{"d":{"2":{"0":{"d":{"a":{"3":{"3":{"df":0,"docs":{},"e":{"5":{"df":4,"docs":{"270":{"tf":1.0},"271":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"f":{"6":{"9":{"0":{"9":{"c":{"5":{"7":{"b":{"3":{"b":{"a":{"5":{"5":{"df":0,"docs":{},"f":{"1":{"5":{"6":{"a":{"4":{"1":{"2":{"2":{"a":{"4":{"2":{"b":{"8":{"0":{"5":{"4":{"3":{"6":{"d":{"df":0,"docs":{},"e":{"9":{"0":{"c":{"df":2,"docs":{"395":{"tf":1.0},"396":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":100,"docs":{"102":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"105":{"tf":2.0},"106":{"tf":1.0},"116":{"tf":2.0},"134":{"tf":2.8284271247461903},"156":{"tf":1.0},"158":{"tf":2.0},"162":{"tf":1.0},"172":{"tf":1.7320508075688772},"173":{"tf":2.449489742783178},"175":{"tf":2.23606797749979},"176":{"tf":1.0},"185":{"tf":2.449489742783178},"188":{"tf":1.0},"199":{"tf":3.1622776601683795},"200":{"tf":1.7320508075688772},"206":{"tf":1.7320508075688772},"207":{"tf":1.0},"221":{"tf":1.4142135623730951},"229":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":2.0},"243":{"tf":1.0},"257":{"tf":1.7320508075688772},"258":{"tf":1.7320508075688772},"272":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.7320508075688772},"278":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"285":{"tf":2.23606797749979},"289":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"294":{"tf":2.6457513110645907},"298":{"tf":2.0},"299":{"tf":1.7320508075688772},"306":{"tf":1.0},"316":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772},"324":{"tf":2.0},"334":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951},"336":{"tf":1.0},"34":{"tf":2.0},"347":{"tf":1.0},"351":{"tf":2.23606797749979},"352":{"tf":2.0},"353":{"tf":2.0},"356":{"tf":1.4142135623730951},"358":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"361":{"tf":2.23606797749979},"362":{"tf":1.4142135623730951},"367":{"tf":1.4142135623730951},"368":{"tf":2.6457513110645907},"37":{"tf":1.4142135623730951},"374":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.4142135623730951},"385":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"49":{"tf":2.449489742783178},"51":{"tf":1.4142135623730951},"53":{"tf":1.7320508075688772},"54":{"tf":3.0},"56":{"tf":2.0},"57":{"tf":1.0},"58":{"tf":2.6457513110645907},"61":{"tf":2.6457513110645907},"62":{"tf":2.0},"70":{"tf":2.23606797749979},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":2.0},"77":{"tf":2.23606797749979},"78":{"tf":1.0},"79":{"tf":1.4142135623730951},"82":{"tf":2.8284271247461903},"83":{"tf":2.0},"84":{"tf":2.449489742783178},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"91":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":2.449489742783178},"97":{"tf":2.0}},"f":{"6":{"7":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"4":{"2":{"3":{"4":{"5":{"b":{"a":{"4":{"4":{"df":0,"docs":{},"f":{"6":{"df":0,"docs":{},"f":{"0":{"8":{"a":{"2":{"2":{"c":{"2":{"1":{"9":{"2":{"1":{"6":{"5":{"df":0,"docs":{},"f":{"4":{"b":{"0":{"df":0,"docs":{},"e":{"9":{"3":{"0":{"df":1,"docs":{"184":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"h":{"df":1,"docs":{"56":{"tf":1.0}}},"。":{"df":0,"docs":{},"i":{"df":1,"docs":{"277":{"tf":1.0}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}}}}},",":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"199":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"6":{".":{"4":{"4":{"df":1,"docs":{"38":{"tf":1.0}}},"df":1,"docs":{"54":{"tf":2.0}}},"5":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":6,"docs":{"328":{"tf":1.0},"43":{"tf":1.4142135623730951},"50":{"tf":2.0},"91":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"1":{"df":1,"docs":{"45":{"tf":1.7320508075688772}}},"2":{"d":{"4":{"4":{"1":{"0":{"6":{"0":{"d":{"6":{"6":{"df":0,"docs":{},"f":{"9":{"a":{"1":{"c":{"3":{"d":{"3":{"c":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"4":{"0":{"df":0,"docs":{},"f":{"8":{"1":{"7":{"d":{"1":{"a":{"a":{"df":1,"docs":{"317":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"df":1,"docs":{"53":{"tf":2.0}},"}":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"4":{"d":{"8":{"9":{"0":{"2":{"d":{"3":{"8":{"0":{"d":{"b":{"b":{"8":{"d":{"d":{"9":{"4":{"df":0,"docs":{},"e":{"d":{"2":{"df":0,"docs":{},"e":{"5":{"4":{"8":{"d":{"df":0,"docs":{},"f":{"c":{"0":{"a":{"a":{"8":{"0":{"c":{"0":{"7":{"c":{"b":{"df":1,"docs":{"209":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{",":{"2":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"4":{"c":{"4":{"5":{"6":{"1":{"df":0,"docs":{},"e":{"4":{"8":{"9":{"4":{"2":{"df":1,"docs":{"199":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"275":{"tf":1.0}}},"6":{"8":{"c":{"6":{"4":{"7":{"6":{"0":{"b":{"5":{"c":{"7":{"df":0,"docs":{},"e":{"a":{"6":{"5":{"4":{"df":0,"docs":{},"f":{"a":{"c":{"b":{"4":{"b":{"a":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"a":{"d":{"d":{"df":0,"docs":{},"f":{"d":{"a":{"2":{"7":{"c":{"c":{"df":1,"docs":{"138":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"9":{"a":{"d":{"c":{"6":{"df":0,"docs":{},"f":{"5":{"c":{"b":{"7":{"6":{"df":0,"docs":{},"f":{"6":{"df":0,"docs":{},"e":{"9":{"d":{"5":{"6":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"a":{"5":{"7":{"d":{"8":{"a":{"8":{"4":{"4":{"a":{"c":{"0":{"7":{"a":{"8":{"8":{"df":1,"docs":{"157":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":53,"docs":{"101":{"tf":2.449489742783178},"103":{"tf":2.23606797749979},"104":{"tf":1.4142135623730951},"105":{"tf":2.0},"108":{"tf":2.449489742783178},"116":{"tf":1.7320508075688772},"134":{"tf":2.0},"135":{"tf":1.0},"156":{"tf":1.0},"160":{"tf":1.4142135623730951},"161":{"tf":2.0},"162":{"tf":1.7320508075688772},"173":{"tf":1.0},"175":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"199":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"245":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.4142135623730951},"274":{"tf":1.0},"277":{"tf":1.7320508075688772},"278":{"tf":1.7320508075688772},"298":{"tf":1.4142135623730951},"299":{"tf":2.23606797749979},"300":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":2.0},"324":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"347":{"tf":1.0},"352":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"361":{"tf":2.8284271247461903},"368":{"tf":2.6457513110645907},"38":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"430":{"tf":1.4142135623730951},"434":{"tf":2.6457513110645907},"45":{"tf":1.4142135623730951},"49":{"tf":2.0},"51":{"tf":1.7320508075688772},"57":{"tf":3.4641016151377544},"58":{"tf":1.0},"61":{"tf":1.7320508075688772},"73":{"tf":1.7320508075688772},"74":{"tf":1.7320508075688772},"78":{"tf":1.0},"84":{"tf":1.4142135623730951}},"e":{"2":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"7":{"c":{"0":{"df":0,"docs":{},"f":{"0":{"8":{"5":{"9":{"8":{"9":{"c":{"c":{"4":{"9":{"8":{"c":{"df":0,"docs":{},"e":{"c":{"1":{"3":{"9":{"df":0,"docs":{},"e":{"7":{"1":{"7":{"df":0,"docs":{},"e":{"2":{"a":{"df":0,"docs":{},"f":{"1":{"7":{"2":{"c":{"b":{"7":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"f":{"1":{"7":{"d":{"2":{"2":{"b":{"b":{"a":{"1":{"5":{"0":{"0":{"1":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"6":{"6":{"1":{"a":{"0":{"9":{"3":{"8":{"a":{"a":{"0":{"d":{"a":{"0":{"6":{"5":{"2":{"6":{"df":0,"docs":{},"e":{"7":{"b":{"8":{"df":0,"docs":{},"f":{"9":{"8":{"df":0,"docs":{},"f":{"d":{"7":{"df":0,"docs":{},"e":{"6":{"7":{"a":{"2":{"2":{"2":{"df":0,"docs":{},"f":{"df":2,"docs":{"345":{"tf":1.0},"354":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"73":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}},";":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.0}}}}}}}},"7":{"0":{"4":{"c":{"5":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"c":{"2":{"df":0,"docs":{},"f":{"2":{"6":{"a":{"0":{"1":{"3":{"3":{"a":{"df":0,"docs":{},"e":{"1":{"7":{"a":{"2":{"c":{"0":{"1":{"9":{"8":{"6":{"5":{"9":{"0":{"c":{"0":{"5":{"a":{"0":{"4":{"5":{"df":2,"docs":{"264":{"tf":1.0},"267":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"407":{"tf":1.4142135623730951}}},"5":{"4":{"df":1,"docs":{"53":{"tf":1.0}}},"df":4,"docs":{"289":{"tf":2.23606797749979},"290":{"tf":1.0},"322":{"tf":1.7320508075688772},"335":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"6":{"5":{"3":{"1":{"8":{"b":{"8":{"4":{"4":{"5":{"6":{"9":{"a":{"6":{"4":{"2":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"7":{"b":{"df":0,"docs":{},"f":{"1":{"a":{"d":{"a":{"b":{"9":{"6":{"3":{"9":{"c":{"b":{"df":0,"docs":{},"f":{"6":{"a":{"df":0,"docs":{},"f":{"3":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"8":{"7":{"8":{"df":1,"docs":{"397":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"7":{"7":{"4":{"0":{"a":{"5":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"1":{"4":{"5":{"8":{"d":{"7":{"4":{"df":0,"docs":{},"f":{"1":{"d":{"a":{"df":0,"docs":{},"f":{"8":{"5":{"df":0,"docs":{},"f":{"d":{"4":{"9":{"df":0,"docs":{},"e":{"0":{"3":{"a":{"a":{"a":{"9":{"7":{"c":{"df":0,"docs":{},"f":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":52,"docs":{"107":{"tf":2.23606797749979},"114":{"tf":2.449489742783178},"115":{"tf":2.6457513110645907},"116":{"tf":3.4641016151377544},"118":{"tf":1.4142135623730951},"119":{"tf":2.0},"120":{"tf":2.6457513110645907},"121":{"tf":3.3166247903554},"122":{"tf":2.23606797749979},"123":{"tf":1.7320508075688772},"125":{"tf":2.6457513110645907},"127":{"tf":2.449489742783178},"134":{"tf":1.0},"135":{"tf":1.7320508075688772},"156":{"tf":1.0},"161":{"tf":2.23606797749979},"162":{"tf":1.0},"173":{"tf":1.7320508075688772},"185":{"tf":1.4142135623730951},"188":{"tf":1.0},"199":{"tf":2.449489742783178},"200":{"tf":1.4142135623730951},"211":{"tf":1.0},"223":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0},"242":{"tf":2.449489742783178},"266":{"tf":1.4142135623730951},"278":{"tf":1.7320508075688772},"279":{"tf":1.0},"298":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"300":{"tf":1.4142135623730951},"318":{"tf":2.0},"324":{"tf":1.4142135623730951},"331":{"tf":1.0},"335":{"tf":1.4142135623730951},"352":{"tf":1.4142135623730951},"359":{"tf":2.0},"368":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.0},"417":{"tf":1.4142135623730951},"58":{"tf":1.0},"59":{"tf":1.4142135623730951},"61":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"78":{"tf":1.7320508075688772},"84":{"tf":1.7320508075688772}},":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"8":{".":{"0":{"df":1,"docs":{"428":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{"df":2,"docs":{"289":{"tf":1.0},"397":{"tf":1.4142135623730951}}},"2":{"df":0,"docs":{},"e":{"7":{"7":{"9":{"9":{"c":{"1":{"b":{"c":{"6":{"2":{"2":{"9":{"8":{"df":1,"docs":{"211":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"3":{"7":{"8":{"8":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"2":{"1":{"2":{"a":{"3":{"2":{"8":{"1":{"3":{"2":{"8":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"f":{"8":{"df":0,"docs":{},"f":{"2":{"2":{"3":{"c":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"0":{"df":0,"docs":{},"f":{"6":{"9":{"2":{"2":{"0":{"b":{"9":{"7":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"41":{"tf":1.0}}},"5":{"6":{"d":{"8":{"9":{"c":{"5":{"3":{"a":{"6":{"d":{"6":{"9":{"4":{"7":{"0":{"b":{"b":{"5":{"6":{"6":{"9":{"c":{"7":{"7":{"3":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"6":{"a":{"a":{"b":{"6":{"df":0,"docs":{},"f":{"c":{"c":{"9":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"1":{"2":{"c":{"4":{"a":{"5":{"8":{"0":{"1":{"b":{"6":{"1":{"df":0,"docs":{},"f":{"8":{"d":{"2":{"df":0,"docs":{},"e":{"9":{"5":{"2":{"df":0,"docs":{},"f":{"8":{"b":{"b":{"b":{"b":{"4":{"4":{"4":{"6":{"9":{"2":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"df":0,"docs":{},"e":{"c":{"2":{"df":2,"docs":{"81":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}},"a":{"df":0,"docs":{},"e":{"c":{"a":{"df":0,"docs":{},"e":{"3":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"5":{"c":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"9":{"df":0,"docs":{},"f":{"0":{"5":{"5":{"b":{"7":{"0":{"df":0,"docs":{},"f":{"0":{"5":{"d":{"9":{"a":{"3":{"df":0,"docs":{},"f":{"9":{"9":{"0":{"b":{"c":{"df":0,"docs":{},"e":{"7":{"b":{"df":1,"docs":{"297":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"f":{"0":{"4":{"9":{"6":{"b":{"b":{"8":{"df":0,"docs":{},"e":{"5":{"6":{"b":{"6":{"8":{"3":{"df":0,"docs":{},"e":{"a":{"3":{"df":0,"docs":{},"f":{"0":{"1":{"5":{"8":{"7":{"1":{"c":{"8":{"6":{"3":{"1":{"6":{"8":{"4":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"4":{"df":1,"docs":{"430":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":60,"docs":{"118":{"tf":1.4142135623730951},"132":{"tf":2.23606797749979},"133":{"tf":1.4142135623730951},"134":{"tf":2.8284271247461903},"135":{"tf":3.1622776601683795},"136":{"tf":1.4142135623730951},"137":{"tf":1.4142135623730951},"138":{"tf":1.0},"139":{"tf":1.7320508075688772},"140":{"tf":3.0},"141":{"tf":3.1622776601683795},"142":{"tf":2.8284271247461903},"145":{"tf":1.7320508075688772},"147":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"149":{"tf":1.4142135623730951},"150":{"tf":2.6457513110645907},"152":{"tf":1.0},"161":{"tf":1.4142135623730951},"170":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"185":{"tf":1.0},"188":{"tf":1.0},"199":{"tf":2.8284271247461903},"202":{"tf":1.7320508075688772},"206":{"tf":1.7320508075688772},"224":{"tf":1.7320508075688772},"242":{"tf":1.4142135623730951},"270":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.0},"298":{"tf":1.4142135623730951},"299":{"tf":1.0},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"318":{"tf":2.0},"320":{"tf":1.0},"324":{"tf":1.4142135623730951},"333":{"tf":1.0},"335":{"tf":1.4142135623730951},"34":{"tf":1.0},"340":{"tf":1.4142135623730951},"353":{"tf":1.7320508075688772},"360":{"tf":2.23606797749979},"368":{"tf":1.4142135623730951},"398":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"417":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"58":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.4142135623730951},"78":{"tf":2.0},"88":{"tf":1.4142135623730951}},"f":{"d":{"2":{"3":{"2":{"7":{"df":0,"docs":{},"e":{"4":{"1":{"3":{"5":{"8":{"7":{"6":{"b":{"3":{"6":{"8":{"c":{"c":{"2":{"7":{"9":{"3":{"df":0,"docs":{},"e":{"b":{"4":{"a":{"7":{"df":0,"docs":{},"e":{"4":{"5":{"5":{"b":{"6":{"9":{"1":{"df":0,"docs":{},"f":{"0":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"、":{"1":{"6":{"df":1,"docs":{"360":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"9":{"0":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"1":{"5":{",":{"7":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"9":{"4":{"8":{"b":{"6":{"5":{"df":0,"docs":{},"e":{"8":{"8":{"9":{"6":{"0":{"b":{"4":{"df":5,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"f":{"b":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"f":{"8":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"9":{"a":{"8":{"1":{"4":{"c":{"df":0,"docs":{},"e":{"a":{"0":{"a":{"5":{"8":{"df":0,"docs":{},"e":{"9":{"c":{"0":{"1":{"9":{"c":{"5":{"2":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"4":{"a":{"df":1,"docs":{"177":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"3":{"7":{"7":{"8":{"4":{"b":{"8":{"7":{"0":{"8":{"c":{"2":{"4":{"3":{"1":{"4":{"7":{"0":{"7":{"3":{"7":{"8":{"a":{"d":{"4":{"2":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"e":{"b":{"1":{"2":{"a":{"3":{"3":{"4":{"b":{"b":{"d":{"df":1,"docs":{"337":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"5":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"9":{"3":{"1":{"1":{"7":{"0":{"4":{"0":{"4":{"c":{"b":{"9":{"8":{"d":{"4":{"7":{"6":{"b":{"1":{"9":{"0":{"1":{"7":{"c":{"b":{"b":{"d":{"b":{"c":{"0":{"0":{"d":{"0":{"8":{"3":{"4":{"d":{"df":3,"docs":{"373":{"tf":1.0},"379":{"tf":1.0},"387":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"6":{"d":{"4":{"b":{"0":{"df":0,"docs":{},"e":{"c":{"1":{"c":{"5":{"df":0,"docs":{},"e":{"0":{"1":{"9":{"b":{"8":{"5":{"6":{"0":{"4":{"c":{"3":{"3":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"6":{"8":{"b":{"3":{"df":0,"docs":{},"e":{"2":{"6":{"6":{"9":{"d":{"4":{"0":{"df":1,"docs":{"333":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"_":{"2":{"2":{"2":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"6":{"2":{"2":{"5":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"b":{"8":{"2":{"5":{"5":{"3":{"4":{"9":{"df":0,"docs":{},"e":{"c":{"0":{"d":{"c":{"2":{"3":{"5":{"4":{"3":{"3":{"5":{"3":{"0":{"df":0,"docs":{},"e":{"d":{"3":{"df":0,"docs":{},"f":{"b":{"5":{"3":{"4":{"df":1,"docs":{"403":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"df":2,"docs":{"156":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951}},"。":{"df":0,"docs":{},"下":{"df":0,"docs":{},"面":{"df":0,"docs":{},"的":{"df":0,"docs":{},"说":{"df":0,"docs":{},"明":{"df":0,"docs":{},"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"156":{"tf":1.0}}}}}}}}}}}}}},"c":{"0":{"df":0,"docs":{},"f":{"a":{"2":{"7":{"1":{"4":{"8":{"5":{"9":{"7":{"3":{"8":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"7":{"3":{"c":{"b":{"b":{"b":{"8":{"2":{"9":{"5":{"9":{"2":{"df":0,"docs":{},"e":{"4":{"c":{"0":{"3":{"7":{"d":{"7":{"df":0,"docs":{},"e":{"4":{"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"d":{"2":{"0":{"0":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"a":{"c":{"0":{"df":0,"docs":{},"f":{"c":{"9":{"4":{"df":3,"docs":{"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"9":{"4":{"3":{"5":{"5":{"6":{"a":{"6":{"0":{"0":{"1":{"b":{"8":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":44,"docs":{"107":{"tf":1.7320508075688772},"115":{"tf":1.0},"116":{"tf":1.0},"119":{"tf":1.4142135623730951},"136":{"tf":1.4142135623730951},"156":{"tf":2.449489742783178},"157":{"tf":2.23606797749979},"158":{"tf":2.449489742783178},"159":{"tf":1.0},"160":{"tf":1.7320508075688772},"161":{"tf":3.872983346207417},"162":{"tf":3.0},"167":{"tf":1.4142135623730951},"174":{"tf":1.0},"175":{"tf":1.7320508075688772},"185":{"tf":1.0},"186":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"224":{"tf":2.449489742783178},"225":{"tf":1.0},"242":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"285":{"tf":1.0},"298":{"tf":1.7320508075688772},"301":{"tf":2.0},"306":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951},"319":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":1.4142135623730951},"333":{"tf":1.0},"335":{"tf":1.4142135623730951},"336":{"tf":1.0},"353":{"tf":1.4142135623730951},"369":{"tf":1.4142135623730951},"402":{"tf":1.7320508075688772},"404":{"tf":1.4142135623730951},"405":{"tf":1.0},"417":{"tf":1.4142135623730951},"62":{"tf":2.0},"78":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}},"e":{"8":{"5":{"df":0,"docs":{},"f":{"c":{"c":{"9":{"9":{"3":{"8":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"f":{"8":{"c":{"9":{"3":{"5":{"d":{"0":{"a":{"d":{"8":{"b":{"4":{"d":{"b":{"7":{"df":0,"docs":{},"f":{"4":{"5":{"c":{"a":{"a":{"a":{"2":{"c":{"a":{"4":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"创":{"df":0,"docs":{},"建":{"df":0,"docs":{},"一":{"df":0,"docs":{},"个":{"df":0,"docs":{},"异":{"df":0,"docs":{},"步":{"df":0,"docs":{},"信":{"df":0,"docs":{},"道":{"df":0,"docs":{},"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"319":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}},"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"df":1,"docs":{"320":{"tf":1.0}}},"df":1,"docs":{"320":{"tf":1.0}},"|":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"306":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"306":{"tf":1.0},"320":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":27,"docs":{"107":{"tf":2.449489742783178},"108":{"tf":2.0},"142":{"tf":1.0},"225":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"306":{"tf":2.23606797749979},"316":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.0},"347":{"tf":1.4142135623730951},"348":{"tf":1.0},"351":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.4142135623730951},"359":{"tf":1.0},"36":{"tf":1.4142135623730951},"360":{"tf":4.0},"361":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":2.0},"408":{"tf":1.4142135623730951},"417":{"tf":1.0},"45":{"tf":1.0},"52":{"tf":1.4142135623730951},"53":{"tf":1.0}},"i":{"df":1,"docs":{"427":{"tf":2.0}}},"s":{"df":1,"docs":{"360":{"tf":1.0}}},"x":{"df":1,"docs":{"360":{"tf":1.7320508075688772}}}},"a":{"'":{".":{".":{"=":{"'":{"df":0,"docs":{},"j":{"df":1,"docs":{"358":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"285":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"2":{"c":{"b":{"7":{"2":{"d":{"3":{"a":{"d":{"7":{"5":{"8":{"4":{"c":{"c":{"1":{"a":{"df":0,"docs":{},"e":{"3":{"b":{"8":{"5":{"df":0,"docs":{},"f":{"7":{"1":{"5":{"c":{"8":{"7":{"7":{"8":{"7":{"2":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"3":{"a":{"b":{"df":1,"docs":{"238":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"7":{"1":{"df":0,"docs":{},"f":{"8":{"2":{"b":{"0":{"9":{"1":{"6":{"c":{"df":0,"docs":{},"f":{"2":{"1":{"d":{"df":0,"docs":{},"e":{"2":{"d":{"5":{"6":{"b":{"d":{"3":{"8":{"6":{"c":{"a":{"5":{"d":{"7":{"2":{"df":0,"docs":{},"f":{"7":{"6":{"9":{"9":{"b":{"0":{"df":1,"docs":{"82":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"314":{"tf":1.0}}},"5":{"df":0,"docs":{},"e":{"0":{"c":{"5":{"b":{"2":{"c":{"5":{"df":0,"docs":{},"f":{"9":{"0":{"5":{"4":{"b":{"df":0,"docs":{},"e":{"3":{"b":{"9":{"6":{"1":{"a":{"df":0,"docs":{},"e":{"a":{"2":{"c":{"7":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"a":{"5":{"9":{"1":{"d":{"df":0,"docs":{},"e":{"8":{"df":1,"docs":{"64":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"8":{"5":{"3":{"6":{"1":{"8":{"9":{"d":{"5":{"df":0,"docs":{},"f":{"1":{"b":{"a":{"2":{"df":0,"docs":{},"f":{"0":{"b":{"1":{"1":{"8":{"7":{"b":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"e":{"7":{"8":{"7":{"c":{"0":{"d":{"8":{"9":{"df":0,"docs":{},"e":{"2":{"8":{"7":{"1":{"c":{"df":1,"docs":{"364":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"0":{"df":1,"docs":{"54":{"tf":1.0}}},"1":{".":{".":{"3":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"54":{"tf":1.0},"62":{"tf":1.0}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"72":{"tf":1.7320508075688772}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"353":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"b":{"c":{"a":{"b":{"c":{"a":{"b":{"c":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":1,"docs":{"186":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"df":0,"docs":{},"k":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"v":{"df":0,"docs":{},"w":{"df":0,"docs":{},"x":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"0":{"1":{"2":{"3":{"4":{"5":{"df":1,"docs":{"259":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"368":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"368":{"tf":2.23606797749979}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"155":{"tf":1.7320508075688772}}}}},"s":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"102":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"115":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"252":{"tf":1.0},"413":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"1":{"6":{"1":{"8":{"4":{"a":{"7":{"df":0,"docs":{},"f":{"5":{"6":{"d":{"1":{"7":{"d":{"a":{"a":{"9":{"c":{"4":{"c":{"7":{"6":{"9":{"0":{"1":{"3":{"7":{"1":{"0":{"8":{"5":{"d":{"c":{"0":{"a":{"c":{"4":{"3":{"df":1,"docs":{"131":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":5,"docs":{"162":{"tf":1.0},"214":{"tf":1.0},"242":{"tf":1.0},"398":{"tf":1.7320508075688772},"70":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"258":{"tf":2.0},"368":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":4,"docs":{"82":{"tf":2.8284271247461903},"83":{"tf":1.4142135623730951},"84":{"tf":2.8284271247461903},"87":{"tf":2.0}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"300":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"200":{"tf":1.0},"335":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"245":{"tf":1.0},"246":{"tf":1.0}}}}}}},"d":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"2":{"df":4,"docs":{"198":{"tf":1.7320508075688772},"203":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":4,"docs":{"198":{"tf":1.7320508075688772},"203":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"141":{"tf":1.0},"375":{"tf":1.7320508075688772}}}}}}},"/":{"a":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"265":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"265":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"<":{"&":{"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"375":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"h":{"df":1,"docs":{"102":{"tf":1.0}},"s":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"375":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"107":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"257":{"tf":2.6457513110645907},"265":{"tf":1.0},"266":{"tf":5.744562646538029},"385":{"tf":1.7320508075688772}},"e":{"(":{"2":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{},"x":{"df":3,"docs":{"257":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"385":{"tf":1.0}}}},"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":2.0}},"s":{":":{"1":{":":{"5":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"266":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"1":{"df":1,"docs":{"240":{"tf":1.0}}},"2":{"df":1,"docs":{"240":{"tf":1.0}}},"3":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"4":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":3,"docs":{"339":{"tf":2.23606797749979},"340":{"tf":1.0},"343":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"3":{"df":1,"docs":{"369":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"369":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"114":{"tf":1.4142135623730951},"115":{"tf":3.605551275463989},"116":{"tf":3.7416573867739413},"120":{"tf":2.23606797749979},"121":{"tf":2.23606797749979},"123":{"tf":1.4142135623730951},"127":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"(":{"1":{"0":{"0":{"df":1,"docs":{"207":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":3,"docs":{"200":{"tf":2.0},"207":{"tf":1.0},"211":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"207":{"tf":1.0}}},"a":{"df":3,"docs":{"200":{"tf":1.4142135623730951},"207":{"tf":1.0},"210":{"tf":1.0}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":5,"docs":{"196":{"tf":1.4142135623730951},"200":{"tf":1.7320508075688772},"207":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":15,"docs":{"102":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"152":{"tf":1.0},"207":{"tf":2.0},"257":{"tf":1.4142135623730951},"265":{"tf":2.23606797749979},"266":{"tf":2.23606797749979},"316":{"tf":1.7320508075688772},"331":{"tf":1.0},"368":{"tf":1.7320508075688772},"375":{"tf":4.0},"416":{"tf":1.0},"426":{"tf":1.0},"428":{"tf":1.0},"91":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":2.0}},"s":{":":{"2":{":":{"5":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":8,"docs":{"198":{"tf":3.3166247903554},"200":{"tf":1.7320508075688772},"207":{"tf":2.0},"208":{"tf":2.0},"210":{"tf":1.0},"211":{"tf":3.0},"265":{"tf":2.8284271247461903},"266":{"tf":4.0}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"101":{"tf":2.23606797749979},"165":{"tf":1.0},"367":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951}}}}}},"、":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"331":{"tf":2.0}}}}}}}}},"df":3,"docs":{"106":{"tf":1.0},"162":{"tf":1.0},"241":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"364":{"tf":1.0},"373":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"180":{"tf":1.0},"182":{"tf":1.0},"273":{"tf":1.0},"62":{"tf":2.23606797749979}}}}},"df":1,"docs":{"348":{"tf":3.0}},"e":{"=":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"180":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"179":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"178":{"tf":1.0},"179":{"tf":2.8284271247461903}}}}}},"o":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"b":{"a":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":1,"docs":{"328":{"tf":1.0}}},"s":{"df":0,"docs":{},"k":{"a":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"183":{"tf":1.0},"381":{"tf":1.0}},"s":{"df":1,"docs":{"379":{"tf":1.0}}}},"df":0,"docs":{},"v":{"df":1,"docs":{"398":{"tf":1.0}}}},"l":{"df":0,"docs":{},"o":{"c":{":":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{":":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"t":{",":{"a":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"66":{"tf":1.0},"70":{"tf":1.4142135623730951}}},"df":0,"docs":{},"w":{"df":2,"docs":{"283":{"tf":1.0},"316":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"191":{"tf":1.0},"290":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"386":{"tf":1.0},"431":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"353":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"86":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"152":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":3,"docs":{"20":{"tf":1.0},"4":{"tf":1.0},"429":{"tf":2.23606797749979}}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"203":{"tf":1.0},"208":{"tf":1.0}}},"df":0,"docs":{}}}},"df":2,"docs":{"203":{"tf":1.0},"208":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"213":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{":":{":":{"b":{"a":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},">":{":":{":":{"b":{"a":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"376":{"tf":4.242640687119285}}}},"n":{"df":1,"docs":{"194":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"52":{"tf":1.0},"53":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"192":{"tf":2.23606797749979}},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"。":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"194":{"tf":1.0}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"162":{"tf":1.0},"198":{"tf":2.0},"362":{"tf":1.0},"55":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"55":{"tf":2.449489742783178},"56":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"5":{"df":1,"docs":{"56":{"tf":1.0}}},"df":0,"docs":{},"x":{"df":1,"docs":{"56":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"142":{"tf":1.7320508075688772},"257":{"tf":2.0},"385":{"tf":2.0}}}}}}},"p":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"260":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":45,"docs":{"109":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.4142135623730951},"123":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"146":{"tf":1.0},"150":{"tf":1.4142135623730951},"152":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"198":{"tf":1.0},"212":{"tf":1.0},"226":{"tf":1.0},"245":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":2.6457513110645907},"259":{"tf":2.0},"261":{"tf":1.0},"270":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"299":{"tf":1.0},"306":{"tf":1.7320508075688772},"307":{"tf":1.0},"313":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.4142135623730951},"318":{"tf":1.7320508075688772},"319":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":2.0},"337":{"tf":1.0},"366":{"tf":1.0},"374":{"tf":1.0},"380":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"408":{"tf":1.0},"78":{"tf":1.7320508075688772},"93":{"tf":1.0}},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"297":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":8,"docs":{"410":{"tf":1.0},"411":{"tf":1.0},"415":{"tf":1.0},"418":{"tf":1.0},"425":{"tf":1.0},"430":{"tf":1.0},"431":{"tf":1.0},"432":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}},"l":{"df":2,"docs":{"152":{"tf":1.0},"34":{"tf":1.7320508075688772}},"i":{"c":{"df":6,"docs":{"111":{"tf":1.0},"214":{"tf":1.0},"265":{"tf":1.0},"368":{"tf":1.0},"392":{"tf":1.0},"397":{"tf":1.0}}},"df":1,"docs":{"172":{"tf":1.0}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"342":{"tf":2.6457513110645907},"343":{"tf":2.8284271247461903}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"342":{"tf":3.4641016151377544},"343":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"428":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"306":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"0":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{">":{">":{"df":0,"docs":{},"。":{"a":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"t":{"df":4,"docs":{"306":{"tf":2.23606797749979},"307":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0}}}},"df":3,"docs":{"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"h":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"93":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"89":{"tf":1.0}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"89":{"tf":1.0}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"1":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":1,"docs":{"88":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":6,"docs":{"428":{"tf":1.4142135623730951},"88":{"tf":2.449489742783178},"89":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"93":{"tf":2.8284271247461903}}},"df":0,"docs":{}},"g":{"df":16,"docs":{"215":{"tf":2.0},"216":{"tf":2.0},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":2.0},"223":{"tf":1.0},"224":{"tf":2.449489742783178},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":3.605551275463989},"250":{"tf":1.7320508075688772},"257":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":9,"docs":{"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"249":{"tf":1.7320508075688772},"250":{"tf":1.7320508075688772}}}}}}},"[":{"0":{"df":1,"docs":{"217":{"tf":1.0}}},"1":{"]":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"2":{"]":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"224":{"tf":2.8284271247461903},"225":{"tf":2.449489742783178},"226":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"234":{"tf":1.4142135623730951},"235":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"249":{"tf":2.0},"250":{"tf":1.0},"299":{"tf":1.0},"42":{"tf":1.0},"56":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"214":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":4,"docs":{"106":{"tf":1.0},"376":{"tf":2.23606797749979},"42":{"tf":1.0},"61":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{":":{":":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":3.7416573867739413}},"i":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"180":{"tf":1.7320508075688772}},"e":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"180":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}}},"s":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":2,"docs":{"399":{"tf":1.0},"77":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":5,"docs":{"145":{"tf":1.0},"358":{"tf":1.7320508075688772},"417":{"tf":1.0},"53":{"tf":1.0},"78":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":1,"docs":{"401":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"113":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"!":{"(":{"!":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"#":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"414":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":3,"docs":{"405":{"tf":3.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"203":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"、":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"201":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"!":{"(":{"\"":{"df":0,"docs":{},"i":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}},"*":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951}}}}}}}}},"0":{"df":1,"docs":{"359":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"266":{"tf":1.0}}},"5":{"df":4,"docs":{"277":{"tf":2.0},"278":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"280":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"359":{"tf":1.4142135623730951}}},"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"(":{"2":{"df":1,"docs":{"200":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"368":{"tf":1.0}}},"b":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}},"e":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"162":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{")":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"289":{"tf":1.0},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"289":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":6,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"245":{"tf":1.0}}}}},"v":{"1":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"246":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"!":{"[":{"\"":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":18,"docs":{"162":{"tf":1.0},"198":{"tf":1.0},"200":{"tf":2.8284271247461903},"201":{"tf":1.0},"203":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":2.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0},"257":{"tf":1.0},"277":{"tf":1.0},"280":{"tf":1.0},"337":{"tf":1.4142135623730951},"343":{"tf":1.4142135623730951},"375":{"tf":1.0},"419":{"tf":1.0},"420":{"tf":1.0}}}},"n":{"df":2,"docs":{"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951}}}},"df":6,"docs":{"199":{"tf":3.0},"200":{"tf":2.23606797749979},"201":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"228":{"tf":1.0},"405":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"49":{"tf":2.0},"57":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":7,"docs":{"244":{"tf":1.0},"34":{"tf":1.0},"374":{"tf":1.0},"376":{"tf":1.4142135623730951},"377":{"tf":1.0},"405":{"tf":1.4142135623730951},"96":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{".":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":1,"docs":{"391":{"tf":1.4142135623730951}}},"y":{"df":0,"docs":{},"n":{"c":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"317":{"tf":1.0}}},"df":0,"docs":{}}},"df":15,"docs":{"10":{"tf":1.0},"313":{"tf":1.7320508075688772},"314":{"tf":1.4142135623730951},"315":{"tf":3.3166247903554},"316":{"tf":5.656854249492381},"317":{"tf":1.0},"318":{"tf":1.4142135623730951},"319":{"tf":3.3166247903554},"320":{"tf":5.744562646538029},"321":{"tf":1.4142135623730951},"322":{"tf":2.8284271247461903},"323":{"tf":2.6457513110645907},"326":{"tf":1.0},"405":{"tf":1.4142135623730951},"412":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":2,"docs":{"337":{"tf":1.4142135623730951},"343":{"tf":2.0}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"306":{"tf":1.7320508075688772}},"i":{"c":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"198":{"tf":1.0},"387":{"tf":1.0},"91":{"tf":1.0}}}}},"df":0,"docs":{}}}},")":{"df":0,"docs":{},"一":{"df":0,"docs":{},"些":{"df":0,"docs":{},"其":{"df":0,"docs":{},"他":{"df":0,"docs":{},"数":{"df":0,"docs":{},"据":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"270":{"tf":1.0}}}}}}}}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"180":{"tf":1.4142135623730951},"376":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":3.4641016151377544}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"331":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":3.1622776601683795}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}}},"df":13,"docs":{"10":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0},"315":{"tf":2.0},"316":{"tf":3.3166247903554},"318":{"tf":3.3166247903554},"319":{"tf":3.4641016151377544},"320":{"tf":1.4142135623730951},"321":{"tf":2.6457513110645907},"322":{"tf":3.1622776601683795},"323":{"tf":1.7320508075688772},"324":{"tf":1.0},"412":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"359":{"tf":2.23606797749979}}}},"y":{"df":1,"docs":{"152":{"tf":1.0}}},"、":{"b":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"👍":{"%":{"df":0,"docs":{},",":{"df":0,"docs":{},"就":{"df":0,"docs":{},"无":{"df":0,"docs":{},"法":{"df":0,"docs":{},"将":{"df":0,"docs":{},"其":{"df":0,"docs":{},"转":{"df":0,"docs":{},"换":{"df":0,"docs":{},"为":{"df":0,"docs":{},"一":{"df":0,"docs":{},"个":{"df":0,"docs":{},"数":{"df":0,"docs":{},"字":{"df":0,"docs":{},"。":{"df":0,"docs":{},"因":{"df":0,"docs":{},"此":{"df":0,"docs":{},",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}}},"b":{"'":{"a":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.0}}}}},"df":0,"docs":{}}},"3":{"2":{"3":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"9":{"a":{"1":{"5":{"6":{"df":0,"docs":{},"f":{"7":{"4":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"314":{"tf":1.0}}},">":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}}}},"a":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":2.8284271247461903}}},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":4.242640687119285}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"118":{"tf":2.0},"119":{"tf":1.4142135623730951}},"e":{":":{":":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"l":{"a":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"114":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"348":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"434":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":18,"docs":{"143":{"tf":1.0},"155":{"tf":1.7320508075688772},"156":{"tf":3.605551275463989},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"277":{"tf":1.0},"290":{"tf":1.0},"301":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0},"70":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"113":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}}}}},"r":{"df":2,"docs":{"141":{"tf":1.0},"382":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"273":{"tf":1.0}}}}},"b":{"7":{"df":0,"docs":{},"e":{"4":{"2":{"9":{"a":{"d":{"6":{"b":{"5":{"9":{"d":{"9":{"a":{"0":{"c":{"3":{"7":{"d":{"b":{"7":{"4":{"3":{"4":{"9":{"7":{"6":{"3":{"6":{"4":{"c":{"b":{"b":{"9":{"c":{"6":{"d":{"a":{"df":3,"docs":{"100":{"tf":1.0},"108":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":26,"docs":{"10":{"tf":1.0},"114":{"tf":1.7320508075688772},"144":{"tf":1.0},"185":{"tf":2.8284271247461903},"191":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"272":{"tf":2.23606797749979},"285":{"tf":3.3166247903554},"286":{"tf":2.0},"291":{"tf":2.0},"293":{"tf":4.242640687119285},"314":{"tf":1.7320508075688772},"316":{"tf":1.0},"320":{"tf":1.7320508075688772},"322":{"tf":3.872983346207417},"325":{"tf":1.0},"350":{"tf":1.4142135623730951},"359":{"tf":2.8284271247461903},"368":{"tf":1.0},"415":{"tf":1.0},"416":{"tf":1.4142135623730951},"417":{"tf":4.69041575982343},"53":{"tf":1.0},"66":{"tf":1.4142135623730951},"77":{"tf":2.23606797749979},"78":{"tf":2.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"413":{"tf":1.0}}}}},"df":1,"docs":{"106":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"241":{"tf":1.7320508075688772},"283":{"tf":2.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"289":{"tf":1.0},"407":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}},"n":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"252":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":1,"docs":{"252":{"tf":1.4142135623730951}},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"198":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}},"t":{"a":{"df":3,"docs":{"434":{"tf":4.58257569495584},"435":{"tf":1.0},"436":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"252":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"167":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772}}}}}}}},"i":{"df":0,"docs":{},"g":{"!":{"df":0,"docs":{},"。":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":8,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"74":{"tf":1.0}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"102":{"tf":1.7320508075688772}}}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":7,"docs":{"111":{"tf":1.0},"172":{"tf":1.0},"214":{"tf":1.0},"265":{"tf":1.0},"368":{"tf":1.0},"397":{"tf":1.0},"53":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"267":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"d":{"df":5,"docs":{"185":{"tf":1.0},"188":{"tf":1.0},"353":{"tf":1.4142135623730951},"397":{"tf":1.7320508075688772},"49":{"tf":1.0}}},"df":46,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"225":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"246":{"tf":1.0},"267":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"405":{"tf":1.7320508075688772},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"194":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"a":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"53":{"tf":2.23606797749979}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}}}}}},"j":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"183":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"@":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"2":{"2":{":":{"2":{"2":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"2":{"3":{"df":1,"docs":{"320":{"tf":3.605551275463989}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"319":{"tf":1.0}}}}},"df":4,"docs":{"298":{"tf":1.0},"313":{"tf":1.0},"320":{"tf":2.8284271247461903},"368":{"tf":1.0}}}},"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"337":{"tf":1.7320508075688772},"343":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":6,"docs":{"148":{"tf":1.0},"150":{"tf":1.4142135623730951},"239":{"tf":1.7320508075688772},"258":{"tf":1.4142135623730951},"348":{"tf":1.0},"359":{"tf":1.7320508075688772}}}}},"o":{"d":{"df":0,"docs":{},"i":{"df":6,"docs":{"229":{"tf":1.7320508075688772},"398":{"tf":1.4142135623730951},"399":{"tf":1.7320508075688772},"400":{"tf":2.23606797749979},"401":{"tf":1.7320508075688772},"58":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0}}},"o":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"0":{"tf":1.4142135623730951},"142":{"tf":1.0},"389":{"tf":1.0}}},"l":{"df":21,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":2.449489742783178},"181":{"tf":1.4142135623730951},"182":{"tf":2.23606797749979},"199":{"tf":2.0},"232":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0},"320":{"tf":1.0},"414":{"tf":1.7320508075688772},"53":{"tf":1.4142135623730951},"61":{"tf":2.0},"70":{"tf":1.0},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.7320508075688772},"93":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"289":{"tf":1.0},"290":{"tf":1.7320508075688772},"291":{"tf":1.4142135623730951},"293":{"tf":1.0},"294":{"tf":1.0}}}}}},"df":18,"docs":{"134":{"tf":2.23606797749979},"185":{"tf":2.0},"186":{"tf":1.4142135623730951},"188":{"tf":1.7320508075688772},"189":{"tf":1.0},"228":{"tf":1.4142135623730951},"289":{"tf":2.8284271247461903},"290":{"tf":2.0},"299":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"368":{"tf":2.0},"405":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.7320508075688772},"74":{"tf":3.0},"75":{"tf":2.23606797749979},"78":{"tf":2.23606797749979}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}}}}}},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":2.0}}}}}},"df":0,"docs":{}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"173":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}},"df":1,"docs":{"330":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":25,"docs":{"156":{"tf":1.4142135623730951},"177":{"tf":1.0},"181":{"tf":3.4641016151377544},"183":{"tf":2.449489742783178},"194":{"tf":1.7320508075688772},"195":{"tf":1.4142135623730951},"219":{"tf":1.0},"224":{"tf":1.4142135623730951},"242":{"tf":2.0},"249":{"tf":1.0},"306":{"tf":1.4142135623730951},"309":{"tf":1.0},"313":{"tf":1.7320508075688772},"320":{"tf":3.1622776601683795},"332":{"tf":1.4142135623730951},"334":{"tf":2.0},"335":{"tf":1.0},"336":{"tf":1.0},"377":{"tf":2.449489742783178},"383":{"tf":1.4142135623730951},"385":{"tf":1.0},"405":{"tf":2.0},"415":{"tf":1.0},"417":{"tf":1.4142135623730951},"54":{"tf":1.0}},",":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"181":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"x":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"5":{"df":1,"docs":{"272":{"tf":1.0}}},"a":{"df":1,"docs":{"285":{"tf":2.0}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"1":{"0":{"df":1,"docs":{"285":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"275":{"tf":1.0}}},"3":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":3,"docs":{"405":{"tf":1.7320508075688772},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"275":{"tf":1.0},"285":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}}}}}}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"335":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"x":{"df":1,"docs":{"278":{"tf":1.0}}},"|":{"df":0,"docs":{},"x":{"df":1,"docs":{"386":{"tf":1.4142135623730951}}}}},"df":3,"docs":{"320":{"tf":2.0},"381":{"tf":2.0},"386":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"320":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"<":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"334":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":20,"docs":{"162":{"tf":2.6457513110645907},"225":{"tf":2.23606797749979},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"334":{"tf":1.0},"335":{"tf":1.4142135623730951},"338":{"tf":1.0},"341":{"tf":1.7320508075688772},"342":{"tf":5.0},"381":{"tf":2.23606797749979},"383":{"tf":1.0},"386":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"278":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"273":{"tf":1.0},"275":{"tf":1.4142135623730951},"285":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"341":{"tf":2.23606797749979},"342":{"tf":4.898979485566356}}}}},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"335":{"tf":1.0},"383":{"tf":1.0}}}}},"t":{">":{"df":0,"docs":{},"。":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"271":{"tf":1.0}}}}},"df":0,"docs":{}},",":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":13,"docs":{"270":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.7320508075688772},"275":{"tf":2.6457513110645907},"276":{"tf":1.4142135623730951},"278":{"tf":2.449489742783178},"279":{"tf":2.23606797749979},"283":{"tf":1.4142135623730951},"285":{"tf":2.0},"288":{"tf":2.0},"295":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"334":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"{":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"320":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":14,"docs":{"271":{"tf":2.0},"272":{"tf":2.8284271247461903},"273":{"tf":2.23606797749979},"275":{"tf":3.0},"283":{"tf":1.0},"320":{"tf":2.0},"334":{"tf":1.0},"335":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"341":{"tf":1.0},"342":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":1.0},"413":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{".":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"294":{"tf":5.477225575051661},"61":{"tf":3.4641016151377544}},"。":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"398":{"tf":1.0},"417":{"tf":1.7320508075688772},"431":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"k":{"df":9,"docs":{"167":{"tf":1.0},"240":{"tf":1.0},"273":{"tf":1.0},"382":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951},"412":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"62":{"tf":3.605551275463989}},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":8,"docs":{"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":5,"docs":{"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"381":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}}},"df":2,"docs":{"156":{"tf":1.0},"252":{"tf":1.7320508075688772}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":8,"docs":{"398":{"tf":2.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":25,"docs":{"102":{"tf":1.0},"106":{"tf":1.7320508075688772},"153":{"tf":1.0},"156":{"tf":1.0},"167":{"tf":1.0},"196":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.7320508075688772},"212":{"tf":1.4142135623730951},"296":{"tf":1.7320508075688772},"297":{"tf":1.0},"312":{"tf":1.0},"343":{"tf":1.0},"366":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"433":{"tf":1.0},"434":{"tf":1.0},"49":{"tf":1.0},"62":{"tf":1.0},"70":{"tf":1.4142135623730951},"77":{"tf":1.0},"78":{"tf":1.4142135623730951}},"!":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"200":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.0},"250":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"405":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"82":{"tf":1.4142135623730951},"83":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"82":{"tf":1.0},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":28,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"15":{"tf":1.0},"156":{"tf":1.0},"210":{"tf":1.0},"224":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.0},"249":{"tf":2.0},"250":{"tf":1.0},"255":{"tf":2.23606797749979},"265":{"tf":1.4142135623730951},"266":{"tf":2.23606797749979},"27":{"tf":2.6457513110645907},"277":{"tf":1.0},"28":{"tf":1.4142135623730951},"29":{"tf":1.0},"301":{"tf":1.0},"36":{"tf":1.0},"386":{"tf":1.0},"391":{"tf":1.7320508075688772},"40":{"tf":2.449489742783178},"405":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.0},"52":{"tf":1.0},"70":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{}},")":{"df":0,"docs":{},",":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"155":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"333":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":3.4641016151377544}},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"333":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":6,"docs":{"143":{"tf":1.4142135623730951},"144":{"tf":1.4142135623730951},"191":{"tf":1.0},"53":{"tf":1.4142135623730951},"77":{"tf":2.23606797749979},"78":{"tf":2.0}},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"df":0,"docs":{}},"9":{"5":{".":{".":{"1":{"0":{"3":{"df":1,"docs":{"391":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"191":{"tf":1.0},"77":{"tf":2.23606797749979},"78":{"tf":2.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"c":{"+":{"+":{"df":0,"docs":{},"”":{"df":0,"docs":{},"(":{"2":{"0":{"1":{"2":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},".":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"/":{"c":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"0":{"6":{"0":{"0":{"6":{"1":{"5":{"7":{"b":{"1":{"4":{"b":{"3":{"d":{"4":{"7":{"b":{"5":{"c":{"7":{"1":{"6":{"df":0,"docs":{},"f":{"c":{"3":{"9":{"2":{"b":{"7":{"7":{"df":0,"docs":{},"f":{"3":{"b":{"2":{"df":0,"docs":{},"e":{"2":{"1":{"c":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"d":{"d":{"d":{"a":{"c":{"6":{"9":{"2":{"8":{"4":{"8":{"a":{"d":{"df":0,"docs":{},"e":{"6":{"c":{"2":{"1":{"1":{"2":{"c":{"8":{"df":0,"docs":{},"e":{"1":{"5":{"a":{"7":{"0":{"8":{"7":{"df":0,"docs":{},"f":{"b":{"b":{"df":0,"docs":{},"e":{"c":{"4":{"5":{"df":1,"docs":{"418":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"4":{"b":{"d":{"d":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"3":{"2":{"8":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"e":{"7":{"7":{"4":{"d":{"df":0,"docs":{},"f":{"1":{"9":{"8":{"8":{"2":{"c":{"c":{"c":{"1":{"3":{"9":{"5":{"3":{"2":{"df":0,"docs":{},"e":{"5":{"3":{"d":{"8":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"7":{"7":{"d":{"7":{"a":{"1":{"2":{"7":{"9":{"d":{"b":{"c":{"7":{"a":{"9":{"d":{"7":{"6":{"df":0,"docs":{},"e":{"8":{"0":{"c":{"5":{"a":{"c":{"9":{"d":{"7":{"4":{"2":{"d":{"d":{"5":{"2":{"9":{"5":{"3":{"8":{"c":{"df":3,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"398":{"tf":1.0}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"62":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"73":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":2,"docs":{"72":{"tf":1.0},"73":{"tf":1.7320508075688772}},"s":{"1":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"73":{"tf":2.0}}}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"c":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":15,"docs":{"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"154":{"tf":1.0},"159":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":2.449489742783178},"242":{"tf":1.4142135623730951},"283":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.0},"330":{"tf":1.0},"368":{"tf":2.0},"376":{"tf":3.1622776601683795},"407":{"tf":1.0}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"277":{"tf":1.0},"360":{"tf":1.0}}}},"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"199":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"199":{"tf":2.8284271247461903},"95":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":2.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":1.7320508075688772}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":7,"docs":{"113":{"tf":1.0},"211":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"266":{"tf":2.449489742783178},"27":{"tf":1.0},"40":{"tf":3.0}}}},"df":0,"docs":{}}},"m":{"d":{"df":3,"docs":{"25":{"tf":1.0},"254":{"tf":1.0},"268":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":15,"docs":{"111":{"tf":2.0},"113":{"tf":1.0},"124":{"tf":2.23606797749979},"155":{"tf":1.0},"211":{"tf":1.4142135623730951},"255":{"tf":2.23606797749979},"26":{"tf":2.6457513110645907},"260":{"tf":2.6457513110645907},"262":{"tf":1.0},"265":{"tf":2.23606797749979},"266":{"tf":2.8284271247461903},"32":{"tf":1.4142135623730951},"391":{"tf":1.7320508075688772},"40":{"tf":2.449489742783178},"430":{"tf":1.4142135623730951}}}}}}},"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"267":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"259":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":141,"docs":{"10":{"tf":1.4142135623730951},"102":{"tf":1.0},"106":{"tf":1.0},"110":{"tf":1.4142135623730951},"111":{"tf":3.3166247903554},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.0},"124":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":2.0},"157":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":3.3166247903554},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"203":{"tf":1.0},"204":{"tf":3.0},"205":{"tf":1.0},"206":{"tf":2.0},"207":{"tf":2.6457513110645907},"208":{"tf":2.6457513110645907},"210":{"tf":2.23606797749979},"211":{"tf":3.1622776601683795},"214":{"tf":2.23606797749979},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"232":{"tf":2.0},"234":{"tf":1.0},"235":{"tf":1.4142135623730951},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"246":{"tf":1.0},"25":{"tf":3.3166247903554},"253":{"tf":1.0},"254":{"tf":2.23606797749979},"255":{"tf":3.0},"256":{"tf":1.0},"257":{"tf":2.23606797749979},"258":{"tf":1.4142135623730951},"259":{"tf":1.7320508075688772},"26":{"tf":4.358898943540674},"260":{"tf":2.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"263":{"tf":2.0},"264":{"tf":1.4142135623730951},"265":{"tf":2.0},"266":{"tf":4.123105625617661},"267":{"tf":2.23606797749979},"268":{"tf":3.4641016151377544},"269":{"tf":1.0},"27":{"tf":5.385164807134504},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.4142135623730951},"283":{"tf":1.7320508075688772},"285":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":1.4142135623730951},"29":{"tf":2.23606797749979},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"32":{"tf":2.449489742783178},"335":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"38":{"tf":1.4142135623730951},"386":{"tf":1.0},"391":{"tf":2.23606797749979},"397":{"tf":1.7320508075688772},"398":{"tf":1.0},"399":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":5.291502622129181},"400":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":3.3166247903554},"407":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951},"41":{"tf":2.23606797749979},"42":{"tf":1.4142135623730951},"426":{"tf":2.0},"427":{"tf":2.23606797749979},"428":{"tf":1.7320508075688772},"43":{"tf":1.0},"430":{"tf":1.4142135623730951},"45":{"tf":1.0},"49":{"tf":2.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.7320508075688772},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":2.449489742783178},"62":{"tf":1.7320508075688772},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"436":{"tf":1.0}}}}}}}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"398":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.4142135623730951},"232":{"tf":2.23606797749979},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}}},"df":5,"docs":{"106":{"tf":1.0},"273":{"tf":1.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951}}},"t":{"df":2,"docs":{"320":{"tf":1.0},"335":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"102":{"tf":1.0},"260":{"tf":1.0}}}}},"d":{"df":10,"docs":{"198":{"tf":1.0},"21":{"tf":2.0},"214":{"tf":1.0},"26":{"tf":1.0},"265":{"tf":1.0},"29":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"397":{"tf":1.0},"436":{"tf":1.0}}},"df":34,"docs":{"10":{"tf":1.0},"144":{"tf":1.0},"15":{"tf":2.23606797749979},"156":{"tf":1.0},"172":{"tf":1.0},"175":{"tf":1.4142135623730951},"200":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.4142135623730951},"252":{"tf":2.23606797749979},"270":{"tf":1.0},"283":{"tf":2.23606797749979},"285":{"tf":3.0},"286":{"tf":2.8284271247461903},"291":{"tf":2.449489742783178},"319":{"tf":1.0},"320":{"tf":1.7320508075688772},"325":{"tf":1.0},"350":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"367":{"tf":1.0},"368":{"tf":3.1622776601683795},"371":{"tf":1.0},"385":{"tf":1.0},"388":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"418":{"tf":1.0},"43":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":1.0},"62":{"tf":2.0},"70":{"tf":1.4142135623730951},"91":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"431":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"310":{"tf":1.0}}}},"df":1,"docs":{"307":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":23,"docs":{"198":{"tf":2.0},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":2.6457513110645907},"211":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"244":{"tf":1.0},"245":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"266":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}},"df":3,"docs":{"210":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"42":{"tf":1.0}}}},"h":{"0":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"1":{"df":4,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":1.0},"25":{"tf":1.0}}},"2":{"df":1,"docs":{"31":{"tf":1.0}}},"3":{"df":6,"docs":{"47":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}},"4":{"df":4,"docs":{"64":{"tf":1.0},"65":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0}}},"5":{"df":4,"docs":{"81":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0}}},"6":{"df":4,"docs":{"100":{"tf":1.0},"103":{"tf":1.0},"108":{"tf":1.0},"99":{"tf":1.0}}},"7":{"df":6,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":1.0}}},"8":{"df":4,"docs":{"130":{"tf":1.0},"131":{"tf":1.0},"138":{"tf":1.0},"146":{"tf":1.0}}},"9":{"df":4,"docs":{"153":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":4,"docs":{"169":{"tf":1.0},"171":{"tf":1.0},"177":{"tf":1.0},"184":{"tf":1.0}}},"1":{"df":4,"docs":{"196":{"tf":1.0},"197":{"tf":1.0},"204":{"tf":1.0},"209":{"tf":1.0}}},"2":{"df":7,"docs":{"213":{"tf":1.0},"214":{"tf":1.0},"218":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0}}},"3":{"df":5,"docs":{"237":{"tf":1.0},"238":{"tf":1.0},"243":{"tf":1.0},"248":{"tf":1.0},"252":{"tf":1.0}}},"4":{"df":6,"docs":{"254":{"tf":1.0},"255":{"tf":1.0},"256":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0}}},"5":{"df":7,"docs":{"270":{"tf":1.0},"271":{"tf":1.0},"276":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0}}},"6":{"df":5,"docs":{"296":{"tf":1.0},"297":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0}}},"7":{"df":5,"docs":{"313":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":1.0}}},"8":{"df":4,"docs":{"328":{"tf":1.0},"329":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0}}},"9":{"df":4,"docs":{"345":{"tf":1.0},"346":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":6,"docs":{"364":{"tf":1.0},"365":{"tf":1.0},"373":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0},"387":{"tf":1.0}}},"1":{"df":4,"docs":{"395":{"tf":1.0},"396":{"tf":1.0},"403":{"tf":1.0},"406":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":6,"docs":{"289":{"tf":1.4142135623730951},"293":{"tf":2.0},"359":{"tf":1.0},"405":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0}},"e":{"(":{"&":{"df":1,"docs":{"73":{"tf":1.0}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"73":{"tf":1.4142135623730951},"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"359":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"274":{"tf":1.0},"359":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"101":{"tf":1.0},"359":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"296":{"tf":1.0},"300":{"tf":1.0},"319":{"tf":1.0},"434":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"1":{"0":{"df":6,"docs":{"172":{"tf":1.7320508075688772},"173":{"tf":1.7320508075688772},"185":{"tf":1.7320508075688772},"186":{"tf":1.7320508075688772},"188":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":1,"docs":{"142":{"tf":1.0}}}}}},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.4142135623730951}}}}}}},"df":11,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":2.0},"162":{"tf":1.0},"170":{"tf":1.0},"172":{"tf":2.449489742783178},"175":{"tf":1.4142135623730951},"358":{"tf":1.7320508075688772},"53":{"tf":2.6457513110645907},"56":{"tf":1.4142135623730951},"70":{"tf":1.0}},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"=":{"\"":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"102":{"tf":1.0},"27":{"tf":2.6457513110645907},"405":{"tf":3.605551275463989},"407":{"tf":2.23606797749979},"427":{"tf":1.0}},"e":{"d":{"_":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"185":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"114":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"294":{"tf":4.242640687119285}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"434":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"260":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"i":{"df":1,"docs":{"434":{"tf":1.0}},"r":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"100":{"tf":1.0},"428":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"416":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"15":{"tf":1.0},"24":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"406":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":1,"docs":{"78":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"396":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":3.0}}},"y":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":14,"docs":{"181":{"tf":2.0},"222":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.0},"249":{"tf":2.0},"285":{"tf":1.0},"286":{"tf":1.0},"29":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":1.7320508075688772},"319":{"tf":1.0},"375":{"tf":1.0},"422":{"tf":4.0},"70":{"tf":2.449489742783178}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"300":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":8,"docs":{"224":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"240":{"tf":2.449489742783178},"241":{"tf":4.123105625617661},"242":{"tf":1.4142135623730951},"299":{"tf":2.23606797749979},"306":{"tf":1.4142135623730951}},"e":{"@":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"1":{":":{"3":{"6":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"238":{"tf":1.0},"384":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"迭":{"df":0,"docs":{},"代":{"df":0,"docs":{},"器":{"df":0,"docs":{},"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}}}}}}}}}}}},"m":{"d":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":3,"docs":{"17":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.7320508075688772}}},"df":0,"docs":{},"p":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"183":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"183":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":3,"docs":{"42":{"tf":1.7320508075688772},"421":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"n":{"df":1,"docs":{"0":{"tf":1.0}}},"o":{"d":{"df":0,"docs":{},"e":{"df":10,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"211":{"tf":1.0},"252":{"tf":1.0},"335":{"tf":1.7320508075688772},"352":{"tf":1.0},"360":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"399":{"tf":1.0},"429":{"tf":1.0}},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"测":{"df":0,"docs":{},"试":{"df":0,"docs":{},"中":{"df":0,"docs":{},",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"163":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"c":{"df":1,"docs":{"141":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"141":{"tf":1.0},"276":{"tf":1.0},"281":{"tf":1.0},"78":{"tf":1.0}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"179":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{":":{":":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":3,"docs":{"103":{"tf":1.7320508075688772},"104":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"这":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"104":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"103":{"tf":3.0},"104":{"tf":2.449489742783178},"105":{"tf":1.0},"108":{"tf":2.6457513110645907}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":13,"docs":{"130":{"tf":1.0},"134":{"tf":1.7320508075688772},"142":{"tf":1.7320508075688772},"143":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"247":{"tf":1.0},"250":{"tf":1.4142135623730951},"257":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"64":{"tf":1.0},"70":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"(":{"0":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":1,"docs":{"359":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"b":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"149":{"tf":1.0},"239":{"tf":1.4142135623730951},"258":{"tf":3.4641016151377544},"348":{"tf":2.449489742783178},"359":{"tf":2.23606797749979},"85":{"tf":1.4142135623730951}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"301":{"tf":1.0},"70":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"214":{"tf":1.0},"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"257":{"tf":1.0},"437":{"tf":1.0},"59":{"tf":1.7320508075688772}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"59":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"t":{"df":110,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"100":{"tf":1.0},"103":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"138":{"tf":1.0},"146":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.0},"177":{"tf":1.0},"184":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"209":{"tf":1.0},"213":{"tf":1.0},"214":{"tf":1.0},"218":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"243":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.0},"252":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.0},"256":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.0},"276":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"297":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"364":{"tf":1.0},"365":{"tf":1.0},"373":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0},"387":{"tf":1.0},"395":{"tf":1.0},"396":{"tf":1.0},"403":{"tf":1.0},"406":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0},"415":{"tf":1.0},"418":{"tf":1.0},"425":{"tf":1.0},"430":{"tf":1.0},"431":{"tf":1.0},"432":{"tf":1.0},"47":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0},"99":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"130":{"tf":1.0},"211":{"tf":2.449489742783178},"47":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"300":{"tf":1.4142135623730951},"304":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}},"r":{"df":1,"docs":{"277":{"tf":1.0}}},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":97,"docs":{"102":{"tf":1.7320508075688772},"106":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"134":{"tf":1.4142135623730951},"142":{"tf":1.4142135623730951},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"185":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951},"189":{"tf":1.4142135623730951},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"242":{"tf":1.7320508075688772},"246":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":2.8284271247461903},"267":{"tf":1.0},"27":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"283":{"tf":2.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"289":{"tf":2.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":2.0},"301":{"tf":1.4142135623730951},"306":{"tf":2.0},"32":{"tf":1.0},"335":{"tf":1.4142135623730951},"350":{"tf":1.0},"351":{"tf":1.4142135623730951},"353":{"tf":1.7320508075688772},"36":{"tf":1.0},"360":{"tf":1.4142135623730951},"368":{"tf":2.0},"376":{"tf":2.23606797749979},"377":{"tf":1.4142135623730951},"38":{"tf":1.0},"386":{"tf":1.7320508075688772},"398":{"tf":1.0},"40":{"tf":3.0},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":3.1622776601683795},"427":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.7320508075688772},"51":{"tf":1.7320508075688772},"52":{"tf":1.4142135623730951},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.4142135623730951},"58":{"tf":1.7320508075688772},"61":{"tf":2.8284271247461903},"62":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":2.0},"75":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":1,"docs":{"59":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"333":{"tf":1.7320508075688772},"334":{"tf":3.0},"335":{"tf":2.449489742783178},"426":{"tf":1.0},"428":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":2,"docs":{"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"102":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"260":{"tf":1.0},"273":{"tf":1.7320508075688772},"313":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"47":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":3,"docs":{"296":{"tf":1.4142135623730951},"308":{"tf":1.0},"317":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"297":{"tf":1.0},"57":{"tf":1.0},"61":{"tf":2.6457513110645907}}}}},"df":7,"docs":{"273":{"tf":4.898979485566356},"274":{"tf":2.23606797749979},"275":{"tf":2.6457513110645907},"285":{"tf":2.6457513110645907},"286":{"tf":1.0},"291":{"tf":2.0},"293":{"tf":2.6457513110645907}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":5,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"229":{"tf":1.0}}}}}}}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":5,"docs":{"224":{"tf":1.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"(":{")":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"249":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":6,"docs":{"224":{"tf":2.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":3.7416573867739413},"405":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"223":{"tf":1.0},"224":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"223":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"108":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"df":12,"docs":{"222":{"tf":3.872983346207417},"223":{"tf":3.1622776601683795},"224":{"tf":3.872983346207417},"225":{"tf":3.7416573867739413},"226":{"tf":2.8284271247461903},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.7416573867739413},"235":{"tf":1.0},"249":{"tf":4.242640687119285},"250":{"tf":2.449489742783178}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"108":{"tf":1.4142135623730951},"210":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"397":{"tf":2.449489742783178},"398":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"(":{"1":{"df":2,"docs":{"273":{"tf":1.0},"275":{"tf":1.0}}},"2":{"df":1,"docs":{"273":{"tf":1.0}}},"3":{"df":3,"docs":{"273":{"tf":1.0},"285":{"tf":1.7320508075688772},"286":{"tf":1.0}}},"4":{"df":2,"docs":{"285":{"tf":1.7320508075688772},"286":{"tf":1.0}}},"5":{"df":2,"docs":{"285":{"tf":1.4142135623730951},"293":{"tf":1.0}}},"_":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}},"df":0,"docs":{},"i":{"3":{"2":{"df":5,"docs":{"273":{"tf":2.0},"275":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"293":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"c":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"3":{"df":1,"docs":{"291":{"tf":1.0}}},"4":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"291":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"d":{"df":23,"docs":{"120":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"186":{"tf":1.0},"228":{"tf":1.0},"242":{"tf":1.0},"283":{"tf":1.0},"289":{"tf":1.4142135623730951},"306":{"tf":1.0},"320":{"tf":2.6457513110645907},"324":{"tf":1.0},"353":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"427":{"tf":1.0},"428":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"412":{"tf":1.0},"428":{"tf":1.0},"50":{"tf":1.0}}}}},"df":5,"docs":{"367":{"tf":2.23606797749979},"412":{"tf":1.0},"416":{"tf":1.0},"50":{"tf":1.4142135623730951},"75":{"tf":1.0}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"273":{"tf":1.0},"391":{"tf":1.4142135623730951},"61":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}},"m":{"df":5,"docs":{"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"300":{"tf":1.0},"303":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"145":{"tf":1.0},"186":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"75":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":4,"docs":{"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"<":{"'":{"a":{">":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"342":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":34,"docs":{"116":{"tf":1.0},"140":{"tf":1.7320508075688772},"179":{"tf":1.7320508075688772},"180":{"tf":2.449489742783178},"181":{"tf":1.4142135623730951},"182":{"tf":2.6457513110645907},"218":{"tf":1.4142135623730951},"219":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":3.872983346207417},"229":{"tf":4.358898943540674},"231":{"tf":2.8284271247461903},"232":{"tf":5.916079783099616},"249":{"tf":5.196152422706632},"250":{"tf":3.872983346207417},"252":{"tf":1.0},"337":{"tf":1.7320508075688772},"338":{"tf":1.7320508075688772},"339":{"tf":2.6457513110645907},"340":{"tf":2.449489742783178},"341":{"tf":1.7320508075688772},"342":{"tf":4.47213595499958},"343":{"tf":4.58257569495584},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"s":{"\"":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"140":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"(":{"df":0,"docs":{},"而":{"df":0,"docs":{},"不":{"df":0,"docs":{},"是":{"df":0,"docs":{},"参":{"df":0,"docs":{},"数":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},")":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"228":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":5,"docs":{"167":{"tf":1.7320508075688772},"382":{"tf":2.6457513110645907},"412":{"tf":1.0},"45":{"tf":1.4142135623730951},"62":{"tf":2.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"166":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":6,"docs":{"112":{"tf":1.0},"26":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"257":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"i":{"df":15,"docs":{"148":{"tf":1.0},"149":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"375":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.0},"422":{"tf":3.4641016151377544},"70":{"tf":3.7416573867739413},"71":{"tf":1.0},"84":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"i":{">":{">":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"156":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"156":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"156":{"tf":1.0}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"[":{"df":0,"docs":{},"t":{"]":{">":{">":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"242":{"tf":1.0},"252":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"252":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":9,"docs":{"108":{"tf":2.0},"150":{"tf":2.0},"270":{"tf":1.0},"284":{"tf":1.0},"286":{"tf":2.23606797749979},"293":{"tf":3.1622776601683795},"306":{"tf":1.0},"374":{"tf":1.4142135623730951},"62":{"tf":3.1622776601683795}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"306":{"tf":2.8284271247461903}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":5,"docs":{"306":{"tf":3.3166247903554},"307":{"tf":1.0},"369":{"tf":2.6457513110645907},"374":{"tf":3.3166247903554},"62":{"tf":2.6457513110645907}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":2.0}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"s":{"df":3,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"106":{"tf":1.7320508075688772},"353":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":4,"docs":{"313":{"tf":2.8284271247461903},"314":{"tf":1.0},"322":{"tf":1.0},"53":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"102":{"tf":1.0},"155":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":2,"docs":{"301":{"tf":1.0},"70":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"120":{"tf":2.449489742783178},"121":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":1.7320508075688772},"121":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{":":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"113":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"{":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"273":{"tf":1.0},"275":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"382":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":69,"docs":{"110":{"tf":2.8284271247461903},"111":{"tf":4.69041575982343},"113":{"tf":3.4641016151377544},"114":{"tf":2.6457513110645907},"115":{"tf":3.4641016151377544},"116":{"tf":2.449489742783178},"117":{"tf":3.872983346207417},"118":{"tf":1.7320508075688772},"120":{"tf":2.0},"121":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"127":{"tf":2.449489742783178},"128":{"tf":1.4142135623730951},"129":{"tf":1.4142135623730951},"144":{"tf":1.0},"156":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":3.4641016151377544},"211":{"tf":3.4641016151377544},"226":{"tf":2.23606797749979},"256":{"tf":1.4142135623730951},"257":{"tf":3.872983346207417},"258":{"tf":4.69041575982343},"259":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":3.872983346207417},"261":{"tf":2.449489742783178},"262":{"tf":1.4142135623730951},"263":{"tf":1.7320508075688772},"264":{"tf":1.7320508075688772},"265":{"tf":2.8284271247461903},"266":{"tf":6.782329983125268},"267":{"tf":2.23606797749979},"269":{"tf":1.0},"297":{"tf":1.0},"31":{"tf":1.0},"312":{"tf":1.4142135623730951},"316":{"tf":4.0},"318":{"tf":2.0},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":2.23606797749979},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"333":{"tf":1.0},"335":{"tf":1.0},"337":{"tf":1.7320508075688772},"343":{"tf":1.0},"378":{"tf":1.7320508075688772},"39":{"tf":1.0},"390":{"tf":2.23606797749979},"391":{"tf":4.58257569495584},"392":{"tf":1.4142135623730951},"395":{"tf":1.4142135623730951},"40":{"tf":4.123105625617661},"405":{"tf":1.7320508075688772},"408":{"tf":1.0},"41":{"tf":1.7320508075688772},"412":{"tf":1.4142135623730951},"414":{"tf":1.0},"417":{"tf":1.0},"42":{"tf":1.0},"421":{"tf":1.0},"426":{"tf":1.0},"46":{"tf":1.0},"59":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":18,"docs":{"124":{"tf":1.4142135623730951},"144":{"tf":1.0},"151":{"tf":1.0},"214":{"tf":1.0},"254":{"tf":1.7320508075688772},"256":{"tf":1.7320508075688772},"259":{"tf":2.0},"260":{"tf":1.4142135623730951},"261":{"tf":2.23606797749979},"263":{"tf":1.7320508075688772},"266":{"tf":1.4142135623730951},"267":{"tf":1.4142135623730951},"269":{"tf":1.4142135623730951},"391":{"tf":1.0},"395":{"tf":1.0},"40":{"tf":2.0},"408":{"tf":1.0},"59":{"tf":1.0}}}},"m":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"111":{"tf":1.0},"264":{"tf":1.0},"40":{"tf":1.0}}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"111":{"tf":1.0},"158":{"tf":1.4142135623730951},"198":{"tf":1.0},"214":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.0},"283":{"tf":2.6457513110645907},"286":{"tf":2.449489742783178},"397":{"tf":1.0},"405":{"tf":3.1622776601683795},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"398":{"tf":2.449489742783178},"399":{"tf":1.7320508075688772}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"316":{"tf":1.0}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":5,"docs":{"319":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"43":{"tf":1.0},"62":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"189":{"tf":1.0},"299":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"324":{"tf":1.0},"352":{"tf":1.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"75":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"120":{"tf":2.23606797749979},"360":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"283":{"tf":5.385164807134504}}}}}}}}}},"df":0,"docs":{}}}}}}}},"y":{"c":{"df":0,"docs":{},"l":{"df":3,"docs":{"270":{"tf":1.0},"273":{"tf":1.7320508075688772},"293":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"d":{"0":{"a":{"c":{"b":{"2":{"5":{"9":{"5":{"c":{"8":{"9":{"1":{"d":{"df":0,"docs":{},"e":{"9":{"7":{"a":{"1":{"3":{"3":{"d":{"0":{"6":{"6":{"3":{"5":{"c":{"5":{"0":{"a":{"b":{"4":{"4":{"9":{"d":{"d":{"6":{"5":{"c":{"df":5,"docs":{"47":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"3":{"9":{"3":{"7":{"3":{"a":{"8":{"3":{"8":{"df":0,"docs":{},"f":{"d":{"3":{"1":{"2":{"a":{"8":{"a":{"9":{"b":{"c":{"c":{"9":{"4":{"8":{"7":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"b":{"c":{"9":{"df":0,"docs":{},"e":{"1":{"5":{"8":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"4":{"3":{"1":{"7":{"c":{"3":{"1":{"2":{"2":{"b":{"4":{"4":{"df":0,"docs":{},"f":{"b":{"7":{"1":{"3":{"a":{"b":{"a":{"6":{"6":{"c":{"c":{"2":{"9":{"5":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"3":{"4":{"5":{"3":{"b":{"2":{"4":{"b":{"df":1,"docs":{"432":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":0,"docs":{},"e":{"b":{"2":{"df":0,"docs":{},"f":{"7":{"a":{"8":{"df":0,"docs":{},"e":{"9":{"c":{"6":{"df":0,"docs":{},"f":{"5":{"1":{"b":{"4":{"4":{"7":{"8":{"df":0,"docs":{},"f":{"9":{"c":{"d":{"4":{"6":{"df":0,"docs":{},"f":{"5":{"5":{"4":{"4":{"8":{"df":0,"docs":{},"e":{"2":{"c":{"a":{"2":{"c":{"1":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"9":{"4":{"df":0,"docs":{},"e":{"0":{"3":{"a":{"1":{"8":{"a":{"2":{"5":{"9":{"0":{"df":0,"docs":{},"e":{"d":{"3":{"df":0,"docs":{},"f":{"1":{"c":{"6":{"7":{"b":{"8":{"5":{"9":{"c":{"b":{"1":{"1":{"5":{"2":{"8":{"d":{"2":{"a":{"2":{"d":{"5":{"c":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"a":{"a":{"2":{"6":{"8":{"a":{"0":{"c":{"d":{"0":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"7":{"6":{"a":{"8":{"0":{"6":{"7":{"a":{"2":{"6":{"df":0,"docs":{},"e":{"d":{"7":{"d":{"2":{"8":{"df":0,"docs":{},"e":{"c":{"2":{"a":{"9":{"3":{"3":{"6":{"d":{"3":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":2.6457513110645907}}}},"l":{"df":2,"docs":{"185":{"tf":1.0},"75":{"tf":3.7416573867739413}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"431":{"tf":1.0}}}}},"t":{"a":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"140":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":13,"docs":{"140":{"tf":1.0},"189":{"tf":1.0},"260":{"tf":1.0},"283":{"tf":4.242640687119285},"289":{"tf":1.0},"313":{"tf":1.0},"330":{"tf":1.4142135623730951},"359":{"tf":1.0},"391":{"tf":1.0},"52":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"y":{"df":5,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0},"348":{"tf":1.0},"63":{"tf":1.0}}}},"b":{"df":0,"docs":{},"g":{"!":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"3":{"0":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"215":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"91":{"tf":3.3166247903554}}}},"d":{"8":{"df":0,"docs":{},"f":{"4":{"7":{"a":{"7":{"4":{"b":{"6":{"7":{"1":{"7":{"8":{"c":{"df":0,"docs":{},"e":{"a":{"8":{"c":{"8":{"3":{"2":{"df":0,"docs":{},"e":{"3":{"b":{"4":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"3":{"b":{"b":{"5":{"1":{"5":{"b":{"d":{"7":{"2":{"df":1,"docs":{"163":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"17":{"tf":1.0}}},"df":8,"docs":{"10":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"23":{"tf":1.0},"231":{"tf":1.0},"283":{"tf":1.4142135623730951},"325":{"tf":1.0},"425":{"tf":1.0}},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.0}}}},"df":0,"docs":{}},"df":9,"docs":{"156":{"tf":1.4142135623730951},"181":{"tf":1.0},"200":{"tf":1.7320508075688772},"247":{"tf":1.0},"27":{"tf":1.0},"398":{"tf":1.0},"419":{"tf":2.0},"53":{"tf":1.0},"91":{"tf":3.1622776601683795}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":59,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":2.23606797749979},"267":{"tf":1.0},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"53":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"185":{"tf":1.0},"188":{"tf":1.0},"289":{"tf":1.0},"387":{"tf":1.0},"389":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"422":{"tf":1.0},"70":{"tf":1.0}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"120":{"tf":1.0},"225":{"tf":1.0},"246":{"tf":1.0},"266":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"36":{"tf":1.0},"361":{"tf":1.0},"375":{"tf":1.0},"377":{"tf":1.4142135623730951},"405":{"tf":1.0},"424":{"tf":3.0},"427":{"tf":1.0},"428":{"tf":1.0},"436":{"tf":1.0},"57":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":10,"docs":{"100":{"tf":1.0},"106":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":2.23606797749979},"376":{"tf":1.0},"42":{"tf":1.0},"82":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"26":{"tf":1.0},"289":{"tf":1.0},"32":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"151":{"tf":1.0},"405":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"(":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{":":{":":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":7,"docs":{"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"260":{"tf":1.0},"266":{"tf":1.7320508075688772},"32":{"tf":1.0},"391":{"tf":1.0},"40":{"tf":2.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"416":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"u":{"df":1,"docs":{"282":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":16,"docs":{"141":{"tf":1.7320508075688772},"270":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":2.449489742783178},"277":{"tf":1.7320508075688772},"279":{"tf":2.0},"280":{"tf":4.242640687119285},"281":{"tf":5.0},"282":{"tf":2.0},"290":{"tf":1.0},"295":{"tf":1.0},"306":{"tf":1.0},"342":{"tf":1.0},"378":{"tf":1.4142135623730951},"416":{"tf":1.0},"78":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"276":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"279":{"tf":1.0},"73":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"u":{"df":1,"docs":{"282":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":1,"docs":{"282":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"v":{"df":7,"docs":{"198":{"tf":1.0},"387":{"tf":1.4142135623730951},"388":{"tf":1.0},"391":{"tf":1.4142135623730951},"392":{"tf":1.0},"418":{"tf":3.4641016151377544},"91":{"tf":1.4142135623730951}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{",":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{",":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":15,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"113":{"tf":1.0},"199":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.7320508075688772},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979},"375":{"tf":1.0},"91":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":2,"docs":{"200":{"tf":1.0},"247":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":2.449489742783178}}}}}}}}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":3,"docs":{"102":{"tf":1.0},"330":{"tf":1.0},"337":{"tf":1.0}}}}},"t":{"df":1,"docs":{"398":{"tf":1.0}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"359":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":5,"docs":{"156":{"tf":1.0},"273":{"tf":1.0},"320":{"tf":1.0},"407":{"tf":1.0},"75":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"431":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":48,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.0},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":2.6457513110645907},"261":{"tf":1.0},"266":{"tf":1.7320508075688772},"27":{"tf":2.0},"273":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"227":{"tf":1.0},"425":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"107":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"127":{"tf":1.0},"320":{"tf":1.0},"53":{"tf":1.0}}}}}},"j":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"e":{"df":3,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"0":{"df":1,"docs":{"89":{"tf":1.0}}},"1":{"df":1,"docs":{"89":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"115":{"tf":1.0}}}},"r":{"df":2,"docs":{"111":{"tf":1.0},"24":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"428":{"tf":1.0},"57":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"408":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"336":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{">":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"181":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":25,"docs":{"140":{"tf":1.0},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"179":{"tf":1.7320508075688772},"181":{"tf":1.7320508075688772},"183":{"tf":2.449489742783178},"194":{"tf":1.7320508075688772},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0},"377":{"tf":3.3166247903554},"378":{"tf":2.449489742783178},"385":{"tf":1.0},"418":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0},"91":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"94":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"175":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"175":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"382":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"53":{"tf":1.0},"61":{"tf":2.6457513110645907}}}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"427":{"tf":2.23606797749979}}}}}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"385":{"tf":2.23606797749979}},"e":{"(":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"385":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"c":{"df":16,"docs":{"0":{"tf":1.0},"19":{"tf":1.0},"198":{"tf":2.0},"199":{"tf":1.4142135623730951},"200":{"tf":1.0},"202":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"229":{"tf":1.0},"232":{"tf":1.0},"257":{"tf":2.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"257":{"tf":1.0},"260":{"tf":1.0},"368":{"tf":1.0},"398":{"tf":1.0}}}}}}}},"df":1,"docs":{"59":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":3,"docs":{"377":{"tf":1.4142135623730951},"386":{"tf":1.0},"91":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"g":{":":{":":{"b":{"a":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":5.291502622129181}}},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"252":{"tf":1.4142135623730951},"401":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"283":{"tf":1.0},"289":{"tf":1.4142135623730951},"70":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":4.0}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":4,"docs":{"266":{"tf":1.0},"267":{"tf":1.4142135623730951},"40":{"tf":2.6457513110645907},"42":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"\"":{"df":0,"docs":{},"、":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"337":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":6,"docs":{"338":{"tf":2.23606797749979},"339":{"tf":1.4142135623730951},"340":{"tf":1.4142135623730951},"341":{"tf":2.23606797749979},"342":{"tf":2.8284271247461903},"343":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":4.47213595499958}}}}}},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"338":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}}}}},"w":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"334":{"tf":2.0},"335":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"333":{"tf":2.6457513110645907},"334":{"tf":4.123105625617661},"335":{"tf":5.196152422706632}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.4142135623730951},"235":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"227":{"tf":1.0},"405":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"283":{"tf":1.7320508075688772},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"c":{"df":1,"docs":{"283":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}},"df":18,"docs":{"185":{"tf":1.0},"188":{"tf":1.0},"270":{"tf":1.0},"273":{"tf":1.7320508075688772},"275":{"tf":1.0},"283":{"tf":7.615773105863909},"286":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"299":{"tf":1.7320508075688772},"306":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":2.8284271247461903},"408":{"tf":2.8284271247461903},"70":{"tf":2.23606797749979},"71":{"tf":1.0},"72":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.0}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.0}}}}}}}}},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"335":{"tf":1.0}}},"t":{"df":6,"docs":{"228":{"tf":2.0},"229":{"tf":2.0},"231":{"tf":1.7320508075688772},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"e":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.7320508075688772},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"302":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":2.449489742783178}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"1":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"(":{"1":{"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"(":{"2":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"225":{"tf":1.0},"336":{"tf":1.0},"383":{"tf":1.0}}}},"df":6,"docs":{"225":{"tf":1.0},"320":{"tf":1.4142135623730951},"334":{"tf":1.0},"383":{"tf":1.0},"386":{"tf":1.7320508075688772},"412":{"tf":1.0}}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":2,"docs":{"273":{"tf":1.0},"275":{"tf":1.0}}}},"0":{"0":{"0":{"4":{"df":1,"docs":{"106":{"tf":1.0}}},"5":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"6":{"df":4,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"75":{"tf":1.4142135623730951},"87":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"7":{"7":{"df":8,"docs":{"102":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"277":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.4142135623730951},"335":{"tf":1.0},"377":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"8":{"df":9,"docs":{"173":{"tf":1.0},"240":{"tf":1.0},"320":{"tf":1.0},"351":{"tf":1.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"51":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"6":{"9":{"df":1,"docs":{"172":{"tf":1.0}}},"df":0,"docs":{}},"7":{"3":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"8":{"2":{"df":6,"docs":{"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0},"70":{"tf":1.0}}},"4":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}},"9":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{"3":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":2,"docs":{"368":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"2":{"df":3,"docs":{"134":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"407":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":2,"docs":{"189":{"tf":1.0},"75":{"tf":1.0}}},"df":0,"docs":{}},"9":{"6":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"7":{"df":2,"docs":{"185":{"tf":1.0},"188":{"tf":1.0}}},"9":{"df":2,"docs":{"405":{"tf":1.4142135623730951},"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"0":{"3":{"df":2,"docs":{"115":{"tf":1.0},"116":{"tf":1.0}}},"df":0,"docs":{}},"1":{"4":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"4":{"6":{"df":1,"docs":{"386":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"9":{"9":{"8":{"1":{"1":{"df":0,"docs":{},"f":{"a":{"2":{"4":{"6":{"d":{"b":{"d":{"df":1,"docs":{"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"5":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"0":{"5":{"7":{"0":{"6":{"c":{"5":{"c":{"4":{"3":{"0":{"9":{"d":{"df":0,"docs":{},"f":{"9":{"df":0,"docs":{},"e":{"d":{"4":{"7":{"d":{"5":{"df":0,"docs":{},"e":{"9":{"1":{"d":{"8":{"df":0,"docs":{},"e":{"d":{"3":{"4":{"2":{"b":{"7":{"d":{"df":1,"docs":{"315":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},">":{"df":0,"docs":{},":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"300":{"tf":1.0}}}}}},"a":{"b":{"a":{"a":{"a":{"a":{"9":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"6":{"9":{"3":{"7":{"d":{"b":{"3":{"6":{"9":{"0":{"d":{"c":{"5":{"6":{"df":0,"docs":{},"f":{"7":{"3":{"9":{"1":{"1":{"6":{"b":{"df":0,"docs":{},"e":{"5":{"5":{"df":0,"docs":{},"e":{"c":{"b":{"2":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"358":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":7,"docs":{"115":{"tf":3.0},"116":{"tf":3.1622776601683795},"119":{"tf":2.6457513110645907},"120":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"123":{"tf":1.0},"127":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":1.7320508075688772}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"26":{"tf":1.4142135623730951},"260":{"tf":1.0},"32":{"tf":1.0},"414":{"tf":2.0},"430":{"tf":2.449489742783178}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"430":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":24,"docs":{"10":{"tf":1.0},"153":{"tf":1.0},"157":{"tf":2.23606797749979},"158":{"tf":2.0},"159":{"tf":1.0},"160":{"tf":1.7320508075688772},"162":{"tf":2.6457513110645907},"169":{"tf":1.0},"174":{"tf":2.0},"203":{"tf":2.449489742783178},"213":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.4142135623730951},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951},"26":{"tf":1.0},"300":{"tf":1.4142135623730951},"325":{"tf":1.0},"381":{"tf":2.8284271247461903},"397":{"tf":1.0},"414":{"tf":1.0},"427":{"tf":1.0},"430":{"tf":1.0}},"f":{"b":{"a":{"df":0,"docs":{},"f":{"d":{"b":{"a":{"3":{"6":{"1":{"8":{"4":{"8":{"7":{"df":0,"docs":{},"f":{"b":{"c":{"9":{"3":{"0":{"5":{"3":{"1":{"8":{"df":0,"docs":{},"f":{"c":{"a":{"b":{"9":{"7":{"7":{"5":{"1":{"3":{"2":{"a":{"c":{"1":{"5":{"df":1,"docs":{"411":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"df":0,"docs":{},"k":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"v":{"df":0,"docs":{},"w":{"df":0,"docs":{},"x":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":1,"docs":{"189":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"(":{"_":{"df":1,"docs":{"323":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"<":{"a":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"134":{"tf":2.23606797749979},"330":{"tf":1.0},"351":{"tf":1.4142135623730951},"54":{"tf":1.7320508075688772},"62":{"tf":1.4142135623730951}}}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"108":{"tf":1.0}}}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":5,"docs":{"289":{"tf":1.0},"82":{"tf":3.605551275463989},"83":{"tf":3.4641016151377544},"84":{"tf":3.1622776601683795},"87":{"tf":2.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"218":{"tf":1.0}}}},"t":{"df":2,"docs":{"120":{"tf":1.0},"57":{"tf":1.0}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"260":{"tf":1.0},"382":{"tf":1.0}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"331":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}}},"d":{"df":4,"docs":{"283":{"tf":2.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.0},"62":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"398":{"tf":1.0}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"152":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":14,"docs":{"185":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951},"224":{"tf":2.449489742783178},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"234":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"59":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"102":{"tf":1.0},"106":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"42":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"150":{"tf":2.23606797749979}}},"y":{"df":0,"docs":{},",":{"df":0,"docs":{},"它":{"df":0,"docs":{},"获":{"df":0,"docs":{},"取":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"想":{"df":0,"docs":{},"要":{"df":0,"docs":{},"检":{"df":0,"docs":{},"查":{"df":0,"docs":{},"的":{"df":0,"docs":{},"键":{"df":0,"docs":{},"作":{"df":0,"docs":{},"为":{"df":0,"docs":{},"参":{"df":0,"docs":{},"数":{"df":0,"docs":{},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"150":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}}}},"u":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"100":{"tf":1.0}}},"df":0,"docs":{}}},"df":34,"docs":{"100":{"tf":1.0},"101":{"tf":3.0},"102":{"tf":2.0},"103":{"tf":1.4142135623730951},"104":{"tf":2.23606797749979},"106":{"tf":1.7320508075688772},"108":{"tf":2.0},"119":{"tf":1.4142135623730951},"136":{"tf":1.0},"157":{"tf":1.0},"174":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"239":{"tf":1.0},"258":{"tf":2.0},"273":{"tf":2.0},"274":{"tf":1.4142135623730951},"275":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"342":{"tf":1.0},"353":{"tf":1.0},"359":{"tf":1.7320508075688772},"36":{"tf":1.0},"362":{"tf":1.0},"382":{"tf":1.0},"385":{"tf":1.0},"407":{"tf":1.4142135623730951},"412":{"tf":1.0},"417":{"tf":1.4142135623730951},"81":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"350":{"tf":1.0},"77":{"tf":1.7320508075688772},"99":{"tf":1.0}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":3,"docs":{"216":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":2.23606797749979}},"s":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"\"":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"232":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"232":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"232":{"tf":1.0}},"e":{"=":{"1":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"232":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":16,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"230":{"tf":1.0},"290":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"235":{"tf":1.7320508075688772},"236":{"tf":1.0}}}}}}}}},"q":{"df":1,"docs":{"420":{"tf":2.0}},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"202":{"tf":3.4641016151377544},"203":{"tf":1.0},"258":{"tf":1.4142135623730951},"42":{"tf":1.0}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"421":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"(":{"\"":{"d":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"_":{"df":4,"docs":{"167":{"tf":1.0},"382":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}},"df":9,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":2.0},"162":{"tf":1.0},"174":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"157":{"tf":1.0},"158":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"203":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":24,"docs":{"157":{"tf":2.23606797749979},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":2.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"165":{"tf":1.4142135623730951},"174":{"tf":1.0},"203":{"tf":2.0},"224":{"tf":3.0},"225":{"tf":2.23606797749979},"226":{"tf":1.0},"232":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.7320508075688772},"300":{"tf":1.0},"323":{"tf":1.0},"349":{"tf":1.0},"36":{"tf":2.0},"382":{"tf":1.0},"405":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":2.0}}},"df":0,"docs":{}}}}},">":{"df":0,"docs":{},"。":{"df":0,"docs":{},"为":{"df":0,"docs":{},"此":{"df":0,"docs":{},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"381":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"[":{"df":0,"docs":{},"e":{"0":{"0":{"0":{"4":{"df":1,"docs":{"106":{"tf":1.0}}},"5":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"6":{"df":4,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"7":{"7":{"df":9,"docs":{"102":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"277":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.7320508075688772},"335":{"tf":1.0},"377":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"8":{"df":9,"docs":{"173":{"tf":1.0},"240":{"tf":1.0},"320":{"tf":1.0},"351":{"tf":1.0},"407":{"tf":1.0},"42":{"tf":1.0},"51":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"6":{"9":{"df":1,"docs":{"172":{"tf":1.0}}},"df":0,"docs":{}},"7":{"3":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"8":{"2":{"df":6,"docs":{"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0},"70":{"tf":1.0}}},"4":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}},"9":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{"2":{"df":1,"docs":{"266":{"tf":1.0}}},"3":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":2,"docs":{"368":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"2":{"df":3,"docs":{"134":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"407":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":2,"docs":{"189":{"tf":1.0},"75":{"tf":1.0}}},"df":0,"docs":{}},"9":{"6":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"7":{"df":2,"docs":{"185":{"tf":1.0},"188":{"tf":1.0}}},"9":{"df":3,"docs":{"324":{"tf":1.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"0":{"3":{"df":2,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"1":{"4":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"4":{"6":{"df":1,"docs":{"386":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":78,"docs":{"102":{"tf":2.0},"106":{"tf":1.7320508075688772},"115":{"tf":1.7320508075688772},"116":{"tf":1.7320508075688772},"120":{"tf":1.7320508075688772},"134":{"tf":1.7320508075688772},"142":{"tf":1.7320508075688772},"153":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.7320508075688772},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"162":{"tf":3.4641016151377544},"172":{"tf":1.7320508075688772},"173":{"tf":1.7320508075688772},"185":{"tf":1.7320508075688772},"186":{"tf":1.7320508075688772},"188":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"219":{"tf":1.0},"225":{"tf":2.6457513110645907},"226":{"tf":1.4142135623730951},"228":{"tf":2.449489742783178},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"233":{"tf":1.0},"235":{"tf":1.0},"240":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"249":{"tf":2.23606797749979},"250":{"tf":1.4142135623730951},"257":{"tf":1.0},"260":{"tf":1.4142135623730951},"273":{"tf":2.0},"277":{"tf":2.0},"279":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"285":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":1.0},"299":{"tf":2.449489742783178},"301":{"tf":2.0},"306":{"tf":2.449489742783178},"320":{"tf":1.4142135623730951},"335":{"tf":1.7320508075688772},"351":{"tf":1.7320508075688772},"353":{"tf":1.7320508075688772},"360":{"tf":1.7320508075688772},"368":{"tf":2.449489742783178},"376":{"tf":1.7320508075688772},"377":{"tf":1.7320508075688772},"381":{"tf":2.0},"386":{"tf":1.7320508075688772},"405":{"tf":3.4641016151377544},"407":{"tf":2.6457513110645907},"414":{"tf":1.0},"42":{"tf":1.7320508075688772},"428":{"tf":1.0},"429":{"tf":1.0},"49":{"tf":2.0},"51":{"tf":1.7320508075688772},"52":{"tf":1.7320508075688772},"57":{"tf":1.7320508075688772},"58":{"tf":1.7320508075688772},"61":{"tf":2.449489742783178},"70":{"tf":2.0},"73":{"tf":1.7320508075688772},"74":{"tf":2.449489742783178},"75":{"tf":2.0},"78":{"tf":2.0},"87":{"tf":1.7320508075688772}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"158":{"tf":1.0}}},"df":0,"docs":{}}}}}},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.0}}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"36":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"ñ":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"431":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"431":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"397":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"c":{"df":1,"docs":{"417":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"320":{"tf":1.0},"361":{"tf":1.4142135623730951}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":12,"docs":{"214":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":2.8284271247461903},"257":{"tf":2.23606797749979},"277":{"tf":2.0},"279":{"tf":2.0},"283":{"tf":3.1622776601683795},"368":{"tf":2.8284271247461903},"376":{"tf":3.605551275463989},"377":{"tf":2.0},"386":{"tf":1.7320508075688772},"88":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}}}},"_":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":2.23606797749979}},"e":{"(":{"5":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"”":{"df":0,"docs":{},"、":{"df":0,"docs":{},"“":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"260":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"305":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"267":{"tf":1.0},"405":{"tf":5.291502622129181},"407":{"tf":2.0},"408":{"tf":2.23606797749979}},"e":{"<":{"df":0,"docs":{},"f":{">":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"405":{"tf":3.1622776601683795},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"347":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"360":{"tf":1.4142135623730951},"407":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"162":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":2,"docs":{"301":{"tf":1.0},"70":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"r":{"d":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"165":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"d":{"df":6,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":27,"docs":{"142":{"tf":1.0},"159":{"tf":2.8284271247461903},"164":{"tf":1.0},"165":{"tf":1.7320508075688772},"173":{"tf":1.0},"186":{"tf":1.0},"200":{"tf":1.0},"202":{"tf":2.8284271247461903},"219":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"228":{"tf":1.0},"240":{"tf":1.7320508075688772},"320":{"tf":1.7320508075688772},"351":{"tf":1.4142135623730951},"36":{"tf":2.0},"391":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.4142135623730951},"414":{"tf":1.4142135623730951},"42":{"tf":2.23606797749979},"45":{"tf":1.0},"51":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.7320508075688772},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"208":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}}},"n":{"df":4,"docs":{"273":{"tf":1.0},"320":{"tf":1.0},"407":{"tf":1.0},"75":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"106":{"tf":1.0},"283":{"tf":1.4142135623730951},"52":{"tf":1.0},"53":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"198":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"123":{"tf":1.0}}}}},"r":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"417":{"tf":1.0}}}}}}},".":{".":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"416":{"tf":1.0}}}}}}},"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"416":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"416":{"tf":1.0}}}}}}},"0":{"df":1,"docs":{"417":{"tf":1.0}}},"1":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"416":{"tf":1.0}}},"df":0,"docs":{}}},"[":{".":{".":{"b":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{".":{".":{"b":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"417":{"tf":1.0}}}}}}},"df":2,"docs":{"416":{"tf":7.874007874011811},"417":{"tf":2.6457513110645907}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":7,"docs":{"306":{"tf":1.0},"347":{"tf":1.7320508075688772},"351":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"57":{"tf":2.0},"58":{"tf":1.0}}}}}}},"t":{"df":1,"docs":{"324":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"308":{"tf":1.0},"324":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"211":{"tf":1.4142135623730951},"266":{"tf":1.0},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"368":{"tf":3.3166247903554},"412":{"tf":1.0}}}}}}},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}}}},"f":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"385":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"0":{"2":{"5":{"3":{"1":{"5":{"9":{"1":{"9":{"7":{"df":0,"docs":{},"f":{"7":{"8":{"4":{"1":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"d":{"2":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"8":{"d":{"1":{"a":{"4":{"9":{"c":{"3":{"b":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"1":{"0":{"a":{"3":{"0":{"8":{"6":{"c":{"5":{"8":{"df":0,"docs":{},"e":{"5":{"2":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"a":{"9":{"0":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"a":{"7":{"8":{"df":0,"docs":{},"f":{"6":{"4":{"b":{"6":{"6":{"8":{"df":0,"docs":{},"f":{"6":{"3":{"df":0,"docs":{},"f":{"5":{"8":{"1":{"2":{"0":{"3":{"c":{"6":{"b":{"a":{"c":{"5":{"0":{"9":{"9":{"0":{"3":{"df":0,"docs":{},"f":{"7":{"c":{"0":{"0":{"df":0,"docs":{},"e":{"df":1,"docs":{"171":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":2,"docs":{"175":{"tf":1.4142135623730951},"53":{"tf":2.23606797749979}}},"df":0,"docs":{}},"6":{"4":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"94":{"tf":1.0}}},"x":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":10,"docs":{"175":{"tf":1.0},"176":{"tf":1.4142135623730951},"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951},"331":{"tf":2.23606797749979},"417":{"tf":1.0},"53":{"tf":2.0},"54":{"tf":1.4142135623730951},"70":{"tf":1.0},"94":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":19,"docs":{"120":{"tf":1.0},"198":{"tf":3.7416573867739413},"199":{"tf":3.0},"200":{"tf":3.0},"201":{"tf":3.0},"202":{"tf":3.1622776601683795},"206":{"tf":3.1622776601683795},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":2.23606797749979},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"257":{"tf":1.0},"260":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":2.0},"323":{"tf":1.0},"405":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":8,"docs":{"198":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":2.0},"202":{"tf":2.0},"206":{"tf":2.0},"228":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"318":{"tf":1.0}}}},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"412":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":14,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.4142135623730951},"182":{"tf":2.0},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"232":{"tf":1.0},"247":{"tf":1.0},"348":{"tf":1.0},"361":{"tf":1.0},"412":{"tf":1.4142135623730951},"53":{"tf":1.0},"61":{"tf":2.449489742783178},"70":{"tf":1.0},"95":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},",":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"431":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":7,"docs":{"228":{"tf":2.449489742783178},"229":{"tf":2.8284271247461903},"231":{"tf":1.7320508075688772},"232":{"tf":3.4641016151377544},"249":{"tf":3.0},"250":{"tf":2.23606797749979},"321":{"tf":2.0}}}},"v":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"397":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"348":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"348":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"y":{"df":1,"docs":{"152":{"tf":1.0}}}},"c":{"df":1,"docs":{"158":{"tf":1.0}}},"df":14,"docs":{"10":{"tf":1.0},"242":{"tf":3.0},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"325":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0},"381":{"tf":1.4142135623730951},"385":{"tf":2.0},"405":{"tf":6.324555320336759},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"431":{"tf":1.0},"53":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"296":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"435":{"tf":1.0},"437":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"237":{"tf":1.0},"364":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"435":{"tf":1.0}}}}}}}}}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"59":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"359":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"t":{"c":{"df":0,"docs":{},"h":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"398":{"tf":2.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"149":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"149":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":5,"docs":{"260":{"tf":1.0},"391":{"tf":1.0},"405":{"tf":1.7320508075688772},"82":{"tf":1.0},"83":{"tf":1.0}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}}}},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}}},":":{"/":{"/":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"a":{"d":{"d":{"/":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.7320508075688772}}}}},"df":1,"docs":{"266":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"_":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"/":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"_":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"289":{"tf":1.0}}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"61":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"1":{"0":{"df":6,"docs":{"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"240":{"tf":1.0},"241":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":5,"docs":{"273":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"277":{"tf":1.0},"279":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"102":{"tf":1.0},"106":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"157":{"tf":1.0},"162":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":5,"docs":{"386":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":10,"docs":{"202":{"tf":1.7320508075688772},"261":{"tf":1.7320508075688772},"32":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"261":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"i":{"df":1,"docs":{"335":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"398":{"tf":1.0},"405":{"tf":2.449489742783178},"407":{"tf":1.4142135623730951},"408":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"246":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"289":{"tf":1.0},"290":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":1.7320508075688772}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"301":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":8,"docs":{"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"232":{"tf":1.4142135623730951}}}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"427":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":5,"docs":{"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0}}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"350":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"360":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":4,"docs":{"199":{"tf":1.7320508075688772},"242":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"239":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"376":{"tf":2.0},"377":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"49":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"c":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"158":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"?":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"161":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":6,"docs":{"157":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":2.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"157":{"tf":2.449489742783178},"158":{"tf":2.0},"160":{"tf":2.23606797749979},"161":{"tf":1.4142135623730951},"162":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":15,"docs":{"217":{"tf":1.7320508075688772},"218":{"tf":2.0},"219":{"tf":1.0},"221":{"tf":2.449489742783178},"222":{"tf":2.449489742783178},"223":{"tf":2.23606797749979},"224":{"tf":3.0},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.4641016151377544},"249":{"tf":3.3166247903554},"250":{"tf":2.449489742783178}}}}},"df":0,"docs":{}}},"df":16,"docs":{"157":{"tf":2.23606797749979},"158":{"tf":2.23606797749979},"159":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"218":{"tf":1.7320508075688772},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.449489742783178},"225":{"tf":2.23606797749979},"226":{"tf":1.0},"24":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"260":{"tf":1.4142135623730951}},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"402":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"214":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"250":{"tf":1.0}}}}}}},"df":18,"docs":{"198":{"tf":2.449489742783178},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.23606797749979},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"247":{"tf":2.23606797749979},"250":{"tf":1.4142135623730951},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"324":{"tf":1.4142135623730951}},"e":{"d":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"247":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"323":{"tf":1.4142135623730951},"395":{"tf":1.0},"413":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":63,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":2.8284271247461903},"199":{"tf":2.8284271247461903},"200":{"tf":2.23606797749979},"201":{"tf":2.0},"202":{"tf":2.6457513110645907},"206":{"tf":2.0},"207":{"tf":2.6457513110645907},"208":{"tf":2.449489742783178},"211":{"tf":3.3166247903554},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.6457513110645907},"232":{"tf":2.23606797749979},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.4142135623730951},"257":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":3.1622776601683795},"267":{"tf":1.0},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.4142135623730951},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":3.1622776601683795},"323":{"tf":1.7320508075688772},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"/":{"9":{"9":{".":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"6":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"190":{"tf":1.4142135623730951},"192":{"tf":2.0}}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"(":{"&":{"df":2,"docs":{"77":{"tf":1.0},"78":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"[":{"0":{".":{".":{"6":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"[":{"0":{".":{".":{"6":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"191":{"tf":1.4142135623730951},"77":{"tf":2.449489742783178},"78":{"tf":2.23606797749979}},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"<":{"'":{"a":{">":{"(":{"df":1,"docs":{"191":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"191":{"tf":1.7320508075688772},"77":{"tf":1.7320508075688772},"78":{"tf":3.3166247903554}}},"df":0,"docs":{}}}}},"df":13,"docs":{"102":{"tf":1.0},"134":{"tf":2.449489742783178},"152":{"tf":1.0},"187":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":5.0990195135927845},"360":{"tf":2.23606797749979},"368":{"tf":1.0},"49":{"tf":1.0},"54":{"tf":1.4142135623730951},"66":{"tf":1.0},"74":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":4,"docs":{"105":{"tf":2.0},"106":{"tf":1.0},"358":{"tf":1.0},"58":{"tf":2.6457513110645907}}}},"x":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"427":{"tf":2.449489742783178},"430":{"tf":1.0},"434":{"tf":1.4142135623730951}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":3.605551275463989}}},"o":{"a":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"6":{"4":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"173":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"53":{"tf":1.0}}}},"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"53":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"376":{"tf":3.872983346207417}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"377":{"tf":1.0},"378":{"tf":1.0}}}}}}},"df":0,"docs":{}},":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":2,"docs":{"377":{"tf":2.449489742783178},"378":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"377":{"tf":1.0},"378":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":3,"docs":{"121":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"381":{"tf":1.7320508075688772},"426":{"tf":1.4142135623730951}}}},"n":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"385":{"tf":1.0},"386":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":245,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":3.605551275463989},"102":{"tf":1.4142135623730951},"103":{"tf":2.0},"104":{"tf":1.7320508075688772},"105":{"tf":2.8284271247461903},"106":{"tf":1.4142135623730951},"107":{"tf":3.3166247903554},"108":{"tf":2.0},"113":{"tf":1.0},"114":{"tf":2.23606797749979},"115":{"tf":1.4142135623730951},"116":{"tf":2.6457513110645907},"118":{"tf":1.7320508075688772},"119":{"tf":1.7320508075688772},"120":{"tf":2.0},"121":{"tf":2.23606797749979},"122":{"tf":1.4142135623730951},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":2.0},"141":{"tf":2.6457513110645907},"142":{"tf":1.7320508075688772},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":2.449489742783178},"165":{"tf":1.0},"167":{"tf":1.7320508075688772},"170":{"tf":2.0},"172":{"tf":2.6457513110645907},"173":{"tf":1.7320508075688772},"175":{"tf":2.8284271247461903},"176":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":2.0},"180":{"tf":3.1622776601683795},"181":{"tf":3.3166247903554},"182":{"tf":2.8284271247461903},"183":{"tf":1.4142135623730951},"185":{"tf":1.7320508075688772},"186":{"tf":2.23606797749979},"188":{"tf":2.449489742783178},"189":{"tf":2.0},"190":{"tf":1.0},"191":{"tf":3.0},"192":{"tf":2.449489742783178},"194":{"tf":1.4142135623730951},"198":{"tf":3.0},"199":{"tf":3.0},"200":{"tf":2.0},"201":{"tf":2.449489742783178},"202":{"tf":2.8284271247461903},"203":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"207":{"tf":2.0},"208":{"tf":1.7320508075688772},"210":{"tf":2.23606797749979},"211":{"tf":1.7320508075688772},"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"22":{"tf":1.0},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.449489742783178},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":3.0},"229":{"tf":4.0},"23":{"tf":1.0},"231":{"tf":2.23606797749979},"232":{"tf":4.898979485566356},"235":{"tf":1.0},"239":{"tf":1.7320508075688772},"240":{"tf":2.23606797749979},"241":{"tf":1.7320508075688772},"242":{"tf":3.3166247903554},"243":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"245":{"tf":1.0},"246":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"249":{"tf":4.47213595499958},"250":{"tf":3.1622776601683795},"257":{"tf":1.4142135623730951},"258":{"tf":2.0},"26":{"tf":1.0},"266":{"tf":2.0},"272":{"tf":1.0},"273":{"tf":1.4142135623730951},"274":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":2.0},"280":{"tf":1.7320508075688772},"281":{"tf":3.1622776601683795},"283":{"tf":2.449489742783178},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"289":{"tf":4.242640687119285},"290":{"tf":2.449489742783178},"291":{"tf":1.0},"293":{"tf":2.0},"294":{"tf":2.23606797749979},"298":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":4.123105625617661},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"32":{"tf":1.0},"320":{"tf":2.8284271247461903},"321":{"tf":1.0},"322":{"tf":3.0},"323":{"tf":2.23606797749979},"324":{"tf":1.7320508075688772},"325":{"tf":1.4142135623730951},"33":{"tf":2.23606797749979},"331":{"tf":2.0},"334":{"tf":2.449489742783178},"335":{"tf":2.8284271247461903},"337":{"tf":1.0},"338":{"tf":1.0},"339":{"tf":1.4142135623730951},"34":{"tf":1.0},"340":{"tf":1.7320508075688772},"341":{"tf":2.6457513110645907},"342":{"tf":6.4031242374328485},"343":{"tf":3.1622776601683795},"348":{"tf":1.0},"349":{"tf":1.0},"35":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.4142135623730951},"352":{"tf":2.0},"353":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.4142135623730951},"359":{"tf":2.449489742783178},"36":{"tf":1.0},"360":{"tf":3.1622776601683795},"361":{"tf":1.7320508075688772},"362":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":3.605551275463989},"369":{"tf":1.7320508075688772},"37":{"tf":1.0},"370":{"tf":1.0},"374":{"tf":2.0},"375":{"tf":2.0},"376":{"tf":5.5677643628300215},"377":{"tf":2.8284271247461903},"378":{"tf":1.4142135623730951},"381":{"tf":5.0},"382":{"tf":2.23606797749979},"383":{"tf":2.0},"385":{"tf":3.872983346207417},"386":{"tf":2.449489742783178},"390":{"tf":1.0},"391":{"tf":2.8284271247461903},"392":{"tf":1.7320508075688772},"393":{"tf":1.0},"397":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":2.0},"402":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"405":{"tf":6.244997998398398},"407":{"tf":4.0},"408":{"tf":4.0},"41":{"tf":1.0},"412":{"tf":1.0},"414":{"tf":2.0},"416":{"tf":1.0},"417":{"tf":1.0},"42":{"tf":1.4142135623730951},"427":{"tf":2.0},"428":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772},"53":{"tf":2.0},"54":{"tf":2.449489742783178},"55":{"tf":2.0},"56":{"tf":2.0},"57":{"tf":1.7320508075688772},"58":{"tf":2.6457513110645907},"59":{"tf":1.4142135623730951},"61":{"tf":2.6457513110645907},"62":{"tf":2.6457513110645907},"68":{"tf":1.4142135623730951},"69":{"tf":1.0},"70":{"tf":2.449489742783178},"71":{"tf":1.7320508075688772},"72":{"tf":2.23606797749979},"73":{"tf":3.0},"74":{"tf":2.449489742783178},"75":{"tf":3.1622776601683795},"77":{"tf":3.4641016151377544},"78":{"tf":3.3166247903554},"82":{"tf":2.23606797749979},"83":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":2.0},"89":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"91":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":2.0},"94":{"tf":1.0},"95":{"tf":2.0},"96":{"tf":1.4142135623730951},"97":{"tf":1.7320508075688772}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"242":{"tf":2.6457513110645907}}}}},"o":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"242":{"tf":2.8284271247461903},"405":{"tf":4.47213595499958},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"当":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"尝":{"df":0,"docs":{},"试":{"df":0,"docs":{},"编":{"df":0,"docs":{},"译":{"df":0,"docs":{},"此":{"df":0,"docs":{},"代":{"df":0,"docs":{},"码":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"会":{"df":0,"docs":{},"出":{"df":0,"docs":{},"现":{"df":0,"docs":{},"错":{"df":0,"docs":{},"误":{"df":0,"docs":{},"提":{"df":0,"docs":{},"示":{"df":0,"docs":{},":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"242":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"242":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"102":{"tf":1.0},"324":{"tf":1.0}}}}}},"o":{"(":{"3":{"df":1,"docs":{"360":{"tf":1.0}}},"_":{"df":1,"docs":{"360":{"tf":1.0}}},"df":0,"docs":{},"x":{"df":1,"docs":{"352":{"tf":1.0}}}},"<":{"'":{"a":{">":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"191":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"414":{"tf":1.0}},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"352":{"tf":1.0},"370":{"tf":1.4142135623730951},"391":{"tf":1.0},"45":{"tf":1.0}}},"r":{".":{"<":{"/":{"df":0,"docs":{},"p":{"df":1,"docs":{"401":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"368":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"180":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"201":{"tf":1.0}}}}}}},"{":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"400":{"tf":1.0},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"141":{"tf":2.0},"179":{"tf":1.4142135623730951},"180":{"tf":1.7320508075688772},"181":{"tf":1.4142135623730951},"182":{"tf":2.0},"201":{"tf":1.4142135623730951},"377":{"tf":2.0},"391":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"91":{"tf":1.0}},"t":{"df":1,"docs":{"377":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"400":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.7320508075688772}}}},"df":21,"docs":{"142":{"tf":1.0},"173":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"320":{"tf":1.7320508075688772},"324":{"tf":1.0},"351":{"tf":1.4142135623730951},"362":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":1.4142135623730951},"414":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"428":{"tf":1.0},"51":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"r":{"df":5,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.7320508075688772},"203":{"tf":1.0},"330":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"392":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"ç":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"431":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"137":{"tf":1.0}}},"df":2,"docs":{"283":{"tf":1.0},"70":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"g":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":2.0}}},"m":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"162":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":1,"docs":{"162":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{">":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":8,"docs":{"114":{"tf":2.23606797749979},"115":{"tf":1.7320508075688772},"116":{"tf":3.1622776601683795},"120":{"tf":1.7320508075688772},"121":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":3.0},"128":{"tf":1.4142135623730951}},"e":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"/":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"114":{"tf":1.0}}}}}},"s":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"161":{"tf":1.7320508075688772},"218":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"\"":{"4":{"0":{"4":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"401":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"161":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":11,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"218":{"tf":1.0},"221":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":4,"docs":{"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.4142135623730951}},"i":{"df":2,"docs":{"364":{"tf":1.0},"376":{"tf":1.4142135623730951}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"'":{"df":4,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"368":{"tf":1.0},"75":{"tf":1.4142135623730951}}},"1":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}},"2":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":34,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":2.449489742783178},"146":{"tf":1.0},"162":{"tf":1.7320508075688772},"189":{"tf":1.0},"206":{"tf":2.0},"237":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"273":{"tf":1.0},"283":{"tf":1.0},"299":{"tf":1.7320508075688772},"31":{"tf":1.0},"316":{"tf":1.4142135623730951},"320":{"tf":1.0},"34":{"tf":1.0},"368":{"tf":2.23606797749979},"376":{"tf":1.4142135623730951},"377":{"tf":1.0},"382":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"386":{"tf":1.4142135623730951},"393":{"tf":1.0},"405":{"tf":3.3166247903554},"407":{"tf":2.0},"408":{"tf":1.7320508075688772},"412":{"tf":1.0},"55":{"tf":2.23606797749979},"56":{"tf":1.7320508075688772},"57":{"tf":2.23606797749979},"58":{"tf":2.0},"75":{"tf":1.0},"96":{"tf":1.0}}}}}}},"df":1,"docs":{"260":{"tf":1.0}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"376":{"tf":2.23606797749979}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"252":{"tf":1.0},"428":{"tf":1.0}}}}}}},"t":{"1":{"df":1,"docs":{"318":{"tf":1.7320508075688772}}},"2":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"318":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"318":{"tf":1.7320508075688772}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":2,"docs":{"316":{"tf":1.0},"322":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"315":{"tf":3.872983346207417},"316":{"tf":5.477225575051661},"317":{"tf":1.0},"318":{"tf":3.1622776601683795},"319":{"tf":4.795831523312719},"320":{"tf":7.0710678118654755},"321":{"tf":4.0},"322":{"tf":4.123105625617661},"323":{"tf":4.47213595499958},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"412":{"tf":1.4142135623730951}},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"316":{"tf":1.0},"320":{"tf":2.8284271247461903}}}}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"323":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"323":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"任":{"df":0,"docs":{},"务":{"df":0,"docs":{},"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"线":{"df":0,"docs":{},"程":{"df":0,"docs":{},"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"327":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}},"df":0,"docs":{}}}}}}},"。":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"319":{"tf":1.0}}}}}}}}}}}},"{":{"3":{"2":{"df":1,"docs":{"428":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}}}},"g":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"213":{"tf":1.0}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"260":{"tf":1.0},"31":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"、":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"330":{"tf":1.4142135623730951}}}},"r":{"b":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"64":{"tf":1.0},"70":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":1,"docs":{"113":{"tf":2.23606797749979}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"437":{"tf":1.0}}}}},"c":{"c":{"df":2,"docs":{"15":{"tf":1.0},"24":{"tf":1.0}}},"df":1,"docs":{"70":{"tf":1.7320508075688772}}},"df":4,"docs":{"10":{"tf":1.0},"213":{"tf":1.0},"325":{"tf":1.0},"359":{"tf":2.0}},"e":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"/":{"2":{"0":{"1":{"0":{"0":{"1":{"0":{"1":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"41":{"tf":1.4142135623730951},"421":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"391":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":10,"docs":{"120":{"tf":1.0},"169":{"tf":1.0},"225":{"tf":1.0},"246":{"tf":1.0},"252":{"tf":1.0},"266":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"405":{"tf":1.0},"57":{"tf":1.0}},"i":{"c":{"<":{"df":0,"docs":{},"t":{">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"383":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"169":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"12":{"tf":1.0},"239":{"tf":2.0}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"167":{"tf":1.0},"93":{"tf":1.4142135623730951}}}}}}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":2.0},"29":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"u":{"b":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"259":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.0}}}}}}}},"v":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"239":{"tf":1.0}}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"df":1,"docs":{"239":{"tf":2.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"52":{"tf":1.0}},"n":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"72":{"tf":2.0}}}}}}}}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":3,"docs":{"112":{"tf":1.0},"126":{"tf":2.449489742783178},"199":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":7,"docs":{"211":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"323":{"tf":1.0},"370":{"tf":1.4142135623730951},"383":{"tf":1.0},"59":{"tf":1.0}},"e":{"df":3,"docs":{"137":{"tf":1.0},"286":{"tf":1.4142135623730951},"352":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":1,"docs":{"313":{"tf":1.4142135623730951}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"406":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"_":{"1":{"0":{"0":{"df":1,"docs":{"202":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":1,"docs":{"202":{"tf":2.23606797749979}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"258":{"tf":1.4142135623730951},"348":{"tf":1.0},"359":{"tf":1.7320508075688772}}},"t":{"df":1,"docs":{"201":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"201":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"201":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"201":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":4,"docs":{"157":{"tf":1.0},"158":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"162":{"tf":2.0}},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"157":{"tf":2.23606797749979},"158":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"157":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"p":{"df":4,"docs":{"10":{"tf":1.0},"213":{"tf":1.7320508075688772},"214":{"tf":1.0},"267":{"tf":1.0}}}},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"110":{"tf":1.0},"113":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"305":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},".":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"(":{")":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":4,"docs":{"167":{"tf":1.0},"382":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}},"e":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":4,"docs":{"125":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"2":{"0":{"0":{"df":1,"docs":{"202":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"167":{"tf":2.0},"202":{"tf":1.4142135623730951},"224":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":19,"docs":{"124":{"tf":2.23606797749979},"125":{"tf":3.3166247903554},"167":{"tf":5.0},"202":{"tf":5.477225575051661},"260":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":4.47213595499958},"34":{"tf":3.0},"35":{"tf":3.0},"36":{"tf":2.6457513110645907},"37":{"tf":2.23606797749979},"38":{"tf":1.7320508075688772},"382":{"tf":3.605551275463989},"41":{"tf":3.3166247903554},"42":{"tf":5.291502622129181},"43":{"tf":3.7416573867739413},"44":{"tf":2.449489742783178},"45":{"tf":4.69041575982343},"52":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":12,"docs":{"202":{"tf":2.0},"260":{"tf":1.7320508075688772},"261":{"tf":2.0},"263":{"tf":1.4142135623730951},"32":{"tf":2.0},"36":{"tf":1.7320508075688772},"38":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0}},"e":{"@":{"1":{".":{"0":{".":{"1":{"df":1,"docs":{"263":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"。":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"167":{"tf":1.0}}}}}}}}},"i":{":":{":":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}},"df":0,"docs":{}},"{":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":1,"docs":{"430":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"116":{"tf":1.0}}}}}}},"df":3,"docs":{"333":{"tf":2.449489742783178},"334":{"tf":1.0},"335":{"tf":2.449489742783178}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"398":{"tf":1.0}}}}},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"432":{"tf":1.0}}}}}}}},"h":{"1":{">":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"!":{"<":{"/":{"df":0,"docs":{},"h":{"1":{"df":1,"docs":{"400":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"!":{"<":{"/":{"df":0,"docs":{},"h":{"1":{"df":1,"docs":{"401":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"288":{"tf":1.0}}}},"n":{"d":{"df":2,"docs":{"252":{"tf":1.0},"375":{"tf":1.0}},"l":{"df":11,"docs":{"106":{"tf":1.0},"157":{"tf":1.7320508075688772},"162":{"tf":2.0},"219":{"tf":1.0},"225":{"tf":1.0},"298":{"tf":2.0},"299":{"tf":2.8284271247461903},"306":{"tf":4.0},"318":{"tf":1.4142135623730951},"353":{"tf":1.0},"36":{"tf":1.0}},"e":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"318":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"298":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"306":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"298":{"tf":1.4142135623730951}}}}}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"398":{"tf":1.7320508075688772},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"153":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":6,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"146":{"tf":2.0},"151":{"tf":1.0},"17":{"tf":1.0},"423":{"tf":3.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"151":{"tf":2.0}}}},"m":{"a":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"121":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"380":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"k":{"df":4,"docs":{"146":{"tf":1.4142135623730951},"169":{"tf":1.0},"420":{"tf":1.4142135623730951},"423":{"tf":1.0}}}},"df":4,"docs":{"121":{"tf":1.4142135623730951},"124":{"tf":1.0},"147":{"tf":1.7320508075688772},"151":{"tf":1.0}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"三":{"df":0,"docs":{},"个":{"df":0,"docs":{},"常":{"df":0,"docs":{},"用":{"df":0,"docs":{},"集":{"df":0,"docs":{},"合":{"df":0,"docs":{},"中":{"df":0,"docs":{},",":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"147":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"331":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"378":{"tf":1.0},"405":{"tf":1.0}}}}}},"y":{"df":1,"docs":{"152":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"414":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"216":{"tf":1.7320508075688772},"414":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"”":{"df":0,"docs":{},"(":{"df":0,"docs":{},"“":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"152":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":4,"docs":{"142":{"tf":1.7320508075688772},"325":{"tf":1.0},"359":{"tf":1.0},"56":{"tf":1.4142135623730951}},"e":{"a":{"d":{"df":2,"docs":{"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"398":{"tf":1.0},"399":{"tf":1.7320508075688772},"401":{"tf":1.0},"402":{"tf":1.0}},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"、":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},"df":0,"docs":{}}},";":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"p":{"df":1,"docs":{"66":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"88":{"tf":2.0}}},"df":11,"docs":{"100":{"tf":1.0},"199":{"tf":3.7416573867739413},"242":{"tf":3.872983346207417},"335":{"tf":2.23606797749979},"88":{"tf":2.0},"90":{"tf":2.23606797749979},"91":{"tf":3.0},"93":{"tf":2.0},"95":{"tf":2.6457513110645907},"96":{"tf":1.4142135623730951},"97":{"tf":2.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"\"":{"[":{"0":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"\"":{")":{";":{"df":0,"docs":{},"。":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"&":{"(":{"*":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":6,"docs":{"400":{"tf":1.7320508075688772},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951}}}}}},":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"405":{"tf":1.0},"408":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"[":{"0":{".":{".":{"1":{"df":1,"docs":{"143":{"tf":1.0}}},"4":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"26":{"tf":2.6457513110645907},"27":{"tf":2.23606797749979},"29":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":3.872983346207417}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}}}}},"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"391":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"391":{"tf":4.47213595499958}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":2,"docs":{"21":{"tf":2.0},"369":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":41,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"140":{"tf":3.3166247903554},"141":{"tf":1.0},"142":{"tf":4.795831523312719},"143":{"tf":1.0},"150":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"191":{"tf":1.0},"20":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"21":{"tf":1.0},"22":{"tf":2.23606797749979},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"26":{"tf":1.7320508075688772},"266":{"tf":1.0},"27":{"tf":2.23606797749979},"281":{"tf":2.6457513110645907},"30":{"tf":1.0},"316":{"tf":1.7320508075688772},"32":{"tf":1.7320508075688772},"320":{"tf":1.0},"362":{"tf":1.0},"369":{"tf":1.0},"382":{"tf":1.0},"383":{"tf":1.0},"391":{"tf":2.0},"395":{"tf":1.4142135623730951},"397":{"tf":1.7320508075688772},"398":{"tf":1.0},"405":{"tf":3.872983346207417},"407":{"tf":2.0},"408":{"tf":1.0},"55":{"tf":1.4142135623730951},"59":{"tf":1.0},"68":{"tf":1.4142135623730951},"69":{"tf":1.0},"70":{"tf":1.0},"78":{"tf":2.23606797749979}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"m":{"df":0,"docs":{},"、":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"p":{"df":44,"docs":{"102":{"tf":1.4142135623730951},"106":{"tf":1.0},"120":{"tf":1.0},"142":{"tf":1.7320508075688772},"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"186":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"240":{"tf":1.0},"242":{"tf":1.0},"246":{"tf":1.0},"26":{"tf":1.0},"267":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"283":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"324":{"tf":1.7320508075688772},"335":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"368":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.4142135623730951},"386":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.4142135623730951},"427":{"tf":1.0},"428":{"tf":1.4142135623730951},"49":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.7320508075688772},"87":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"e":{"df":29,"docs":{"106":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"134":{"tf":1.7320508075688772},"137":{"tf":1.0},"185":{"tf":1.7320508075688772},"188":{"tf":1.7320508075688772},"189":{"tf":1.0},"203":{"tf":1.4142135623730951},"208":{"tf":1.4142135623730951},"211":{"tf":1.0},"240":{"tf":1.0},"285":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"322":{"tf":1.0},"323":{"tf":1.0},"352":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"370":{"tf":1.4142135623730951},"376":{"tf":1.0},"405":{"tf":1.0},"42":{"tf":1.0},"59":{"tf":1.0},"70":{"tf":1.4142135623730951},"74":{"tf":2.449489742783178},"78":{"tf":1.7320508075688772}}}},"x":{"df":1,"docs":{"53":{"tf":1.0}}}},"i":{"df":7,"docs":{"298":{"tf":5.916079783099616},"300":{"tf":1.7320508075688772},"302":{"tf":1.0},"303":{"tf":1.0},"318":{"tf":5.916079783099616},"319":{"tf":1.0},"320":{"tf":1.0}},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"167":{"tf":1.0}}}}},"o":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},",":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"102":{"tf":1.0}}}}}}}}},"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"142":{"tf":1.0}}},"d":{"df":2,"docs":{"95":{"tf":2.449489742783178},"97":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"267":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"101":{"tf":2.0},"165":{"tf":1.0},"21":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"260":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"59":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"196":{"tf":1.0}}}}}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"179":{"tf":1.0},"180":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":9,"docs":{"114":{"tf":2.0},"115":{"tf":3.0},"116":{"tf":3.4641016151377544},"120":{"tf":2.449489742783178},"121":{"tf":1.0},"123":{"tf":1.4142135623730951},"127":{"tf":3.0},"128":{"tf":1.0},"398":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.7320508075688772}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"120":{"tf":2.0},"121":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"。":{"df":0,"docs":{},"最":{"df":0,"docs":{},"后":{"df":0,"docs":{},",":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"116":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"w":{"'":{"df":1,"docs":{"383":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"v":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"359":{"tf":1.0}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"5":{"df":1,"docs":{"400":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"316":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":6,"docs":{"0":{"tf":1.0},"257":{"tf":2.6457513110645907},"316":{"tf":2.0},"400":{"tf":3.3166247903554},"401":{"tf":3.4641016151377544},"404":{"tf":1.0}}}},"t":{"df":0,"docs":{},"p":{"/":{"1":{".":{"1":{"df":8,"docs":{"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":1.0},"401":{"tf":2.23606797749979},"402":{"tf":1.7320508075688772},"404":{"tf":2.23606797749979},"405":{"tf":3.872983346207417},"408":{"tf":3.1622776601683795}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"/":{"/":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{":":{"7":{"8":{"7":{"8":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"404":{"tf":1.0}}}}}}}},"df":1,"docs":{"404":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"398":{"tf":1.7320508075688772},"399":{"tf":1.0},"400":{"tf":1.4142135623730951}}}}}}}}}},"df":9,"docs":{"15":{"tf":1.0},"166":{"tf":1.0},"316":{"tf":1.0},"395":{"tf":2.0},"396":{"tf":2.23606797749979},"397":{"tf":1.0},"398":{"tf":2.449489742783178},"399":{"tf":2.449489742783178},"401":{"tf":1.0}},"s":{":":{"/":{"/":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"m":{"df":1,"docs":{"259":{"tf":1.0}}}},"df":1,"docs":{"260":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"c":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":6,"docs":{"0":{"tf":1.0},"142":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.4142135623730951},"32":{"tf":1.0},"353":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"c":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":3,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"428":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"359":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":4.358898943540674}}}},"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"196":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"396":{"tf":1.0}}}}}}}}}}},"i":{"'":{"df":0,"docs":{},"m":{"df":3,"docs":{"218":{"tf":1.7320508075688772},"225":{"tf":1.0},"229":{"tf":1.0}}}},".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{")":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"/":{"df":0,"docs":{},"o":{"df":10,"docs":{"213":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"248":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"253":{"tf":1.0},"381":{"tf":1.4142135623730951},"400":{"tf":1.0},"405":{"tf":2.23606797749979}}}},"1":{"2":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":2,"docs":{"252":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"3":{"2":{"df":57,"docs":{"101":{"tf":3.605551275463989},"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"147":{"tf":1.0},"149":{"tf":1.0},"167":{"tf":3.0},"169":{"tf":1.0},"170":{"tf":2.449489742783178},"172":{"tf":2.0},"175":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"181":{"tf":1.7320508075688772},"187":{"tf":2.8284271247461903},"191":{"tf":2.0},"192":{"tf":1.7320508075688772},"202":{"tf":2.8284271247461903},"206":{"tf":1.4142135623730951},"245":{"tf":1.0},"252":{"tf":1.4142135623730951},"257":{"tf":2.0},"266":{"tf":2.0},"272":{"tf":1.7320508075688772},"273":{"tf":1.4142135623730951},"274":{"tf":2.6457513110645907},"275":{"tf":1.4142135623730951},"277":{"tf":1.7320508075688772},"280":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":2.449489742783178},"306":{"tf":2.449489742783178},"331":{"tf":1.4142135623730951},"352":{"tf":2.0},"359":{"tf":4.358898943540674},"360":{"tf":2.23606797749979},"362":{"tf":1.0},"367":{"tf":2.6457513110645907},"368":{"tf":4.123105625617661},"370":{"tf":1.0},"375":{"tf":1.4142135623730951},"377":{"tf":2.0},"380":{"tf":1.0},"381":{"tf":3.3166247903554},"385":{"tf":3.1622776601683795},"386":{"tf":2.23606797749979},"417":{"tf":1.0},"42":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":2.0},"56":{"tf":2.0},"58":{"tf":3.1622776601683795},"61":{"tf":1.0},"70":{"tf":1.7320508075688772},"71":{"tf":1.4142135623730951},"79":{"tf":1.0},"85":{"tf":2.23606797749979}},"。":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"53":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"172":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},";":{"3":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"6":{"4":{"df":3,"docs":{"252":{"tf":1.4142135623730951},"42":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":2,"docs":{"102":{"tf":3.3166247903554},"53":{"tf":1.4142135623730951}}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"=":{"1":{"df":1,"docs":{"393":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"362":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":7,"docs":{"20":{"tf":2.0},"362":{"tf":4.0},"380":{"tf":1.4142135623730951},"405":{"tf":5.830951894845301},"407":{"tf":4.242640687119285},"408":{"tf":3.7416573867739413},"429":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":4,"docs":{"320":{"tf":1.0},"391":{"tf":2.449489742783178},"416":{"tf":2.6457513110645907},"417":{"tf":2.8284271247461903}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":3,"docs":{"260":{"tf":1.0},"398":{"tf":1.0},"414":{"tf":1.7320508075688772}}}}},"(":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}}},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"348":{"tf":1.4142135623730951}}}}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":18,"docs":{"198":{"tf":2.23606797749979},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.0},"208":{"tf":3.605551275463989},"211":{"tf":2.8284271247461903},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"246":{"tf":1.0},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"36":{"tf":1.0}},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"232":{"tf":3.605551275463989},"249":{"tf":3.0},"250":{"tf":1.7320508075688772}},"e":{"=":{"1":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"232":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"。":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"也":{"df":0,"docs":{},"没":{"df":0,"docs":{},"有":{"df":0,"docs":{},"过":{"df":0,"docs":{},"滤":{"df":0,"docs":{},"需":{"df":0,"docs":{},"要":{"df":0,"docs":{},"运":{"df":0,"docs":{},"行":{"df":0,"docs":{},"的":{"df":0,"docs":{},"测":{"df":0,"docs":{},"试":{"df":0,"docs":{},",":{"df":0,"docs":{},"所":{"df":0,"docs":{},"以":{"df":0,"docs":{},"摘":{"df":0,"docs":{},"要":{"df":0,"docs":{},"中":{"df":0,"docs":{},"会":{"df":0,"docs":{},"显":{"df":0,"docs":{},"示":{"0":{"df":1,"docs":{"198":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"333":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"134":{"tf":1.7320508075688772},"49":{"tf":2.0},"74":{"tf":1.7320508075688772},"78":{"tf":1.7320508075688772}}}}},"p":{"df":0,"docs":{},"l":{"<":{"'":{"a":{"df":3,"docs":{"192":{"tf":2.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":8,"docs":{"175":{"tf":1.4142135623730951},"183":{"tf":1.7320508075688772},"242":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"281":{"tf":2.0},"334":{"tf":1.0},"382":{"tf":1.0}}},"x":{"1":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"(":{"&":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"391":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":61,"docs":{"101":{"tf":1.4142135623730951},"119":{"tf":1.0},"161":{"tf":1.0},"167":{"tf":1.0},"175":{"tf":3.1622776601683795},"179":{"tf":2.0},"180":{"tf":2.449489742783178},"181":{"tf":3.3166247903554},"182":{"tf":3.1622776601683795},"183":{"tf":2.0},"191":{"tf":1.0},"192":{"tf":1.7320508075688772},"199":{"tf":2.0},"202":{"tf":2.0},"223":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"239":{"tf":1.0},"249":{"tf":2.6457513110645907},"250":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"330":{"tf":1.0},"331":{"tf":1.0},"334":{"tf":1.4142135623730951},"335":{"tf":2.23606797749979},"338":{"tf":1.4142135623730951},"339":{"tf":1.7320508075688772},"340":{"tf":1.4142135623730951},"341":{"tf":1.7320508075688772},"342":{"tf":3.4641016151377544},"343":{"tf":2.23606797749979},"370":{"tf":1.4142135623730951},"374":{"tf":1.7320508075688772},"375":{"tf":1.7320508075688772},"376":{"tf":4.0},"377":{"tf":2.0},"378":{"tf":1.0},"386":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"405":{"tf":4.242640687119285},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"412":{"tf":1.4142135623730951},"417":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":3.0},"94":{"tf":1.0},"95":{"tf":1.7320508075688772},"96":{"tf":2.0},"97":{"tf":2.8284271247461903},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":25,"docs":{"102":{"tf":2.8284271247461903},"142":{"tf":2.0},"162":{"tf":1.4142135623730951},"183":{"tf":2.0},"242":{"tf":1.0},"252":{"tf":1.0},"277":{"tf":1.4142135623730951},"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.7320508075688772},"309":{"tf":1.0},"320":{"tf":2.449489742783178},"323":{"tf":1.0},"324":{"tf":1.0},"335":{"tf":1.4142135623730951},"370":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":2.0},"391":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"70":{"tf":1.4142135623730951},"91":{"tf":2.0},"93":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"58":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"<":{"'":{"a":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":2.6457513110645907},"192":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"120":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"324":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"219":{"tf":1.0},"248":{"tf":1.0}}}}}}},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}},"c":{"df":1,"docs":{"369":{"tf":1.0}},"h":{"df":1,"docs":{"359":{"tf":1.0}}},"l":{"df":0,"docs":{},"u":{"d":{"df":3,"docs":{"127":{"tf":1.0},"159":{"tf":1.4142135623730951},"208":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"397":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"_":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"142":{"tf":1.0}}}}}}}}},"df":16,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"156":{"tf":2.0},"219":{"tf":1.0},"224":{"tf":2.0},"260":{"tf":1.0},"261":{"tf":1.0},"263":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"350":{"tf":2.6457513110645907},"392":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"417":{"tf":1.0},"54":{"tf":3.0},"62":{"tf":2.6457513110645907}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"417":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"273":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}}},"o":{"df":4,"docs":{"260":{"tf":1.0},"277":{"tf":1.0},"301":{"tf":1.0},"70":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.4142135623730951},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.4142135623730951},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"368":{"tf":1.7320508075688772},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"428":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"332":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"83":{"tf":1.0}},"i":{"df":4,"docs":{"140":{"tf":1.7320508075688772},"293":{"tf":2.0},"316":{"tf":1.0},"70":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"429":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},"df":1,"docs":{"51":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":17,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"191":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"382":{"tf":1.0},"391":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.7320508075688772},"43":{"tf":2.23606797749979},"44":{"tf":1.0},"45":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"398":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":5,"docs":{"147":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"143":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"15":{"tf":1.4142135623730951},"267":{"tf":3.0},"268":{"tf":1.0},"436":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"322":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":8,"docs":{"233":{"tf":1.0},"300":{"tf":1.0},"377":{"tf":1.4142135623730951},"386":{"tf":1.0},"405":{"tf":1.0},"427":{"tf":1.0},"75":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":9,"docs":{"142":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"240":{"tf":1.0},"277":{"tf":2.23606797749979},"351":{"tf":2.449489742783178},"42":{"tf":1.4142135623730951},"53":{"tf":1.0},"61":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"173":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":1.7320508075688772}}}},"df":1,"docs":{"211":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"209":{"tf":1.0}}}},"l":{"df":1,"docs":{"398":{"tf":1.0}}},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}},"r":{"df":0,"docs":{},"f":{"a":{"c":{"df":2,"docs":{"177":{"tf":1.0},"368":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},",":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"270":{"tf":1.0},"287":{"tf":1.4142135623730951}}}}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"_":{"a":{"d":{"d":{"df":1,"docs":{"210":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"2":{"df":1,"docs":{"210":{"tf":1.0}}},"a":{"df":1,"docs":{"210":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"210":{"tf":1.0}}}}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"如":{"df":0,"docs":{},"果":{"df":0,"docs":{},"你":{"df":0,"docs":{},"并":{"df":0,"docs":{},"不":{"df":0,"docs":{},"认":{"df":0,"docs":{},"为":{"df":0,"docs":{},"应":{"df":0,"docs":{},"该":{"df":0,"docs":{},"测":{"df":0,"docs":{},"试":{"df":0,"docs":{},"私":{"df":0,"docs":{},"有":{"df":0,"docs":{},"函":{"df":0,"docs":{},"数":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"210":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"210":{"tf":1.0},"211":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"247":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":5,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"87":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"239":{"tf":2.8284271247461903}}}}}}}}}},"o":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"160":{"tf":2.449489742783178},"161":{"tf":2.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"121":{"tf":1.0},"36":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}},"df":0,"docs":{}}},"{":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":9,"docs":{"125":{"tf":1.0},"158":{"tf":1.0},"213":{"tf":1.0},"248":{"tf":1.0},"313":{"tf":1.4142135623730951},"316":{"tf":1.0},"33":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"434":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"122":{"tf":1.7320508075688772}}}}}}}}},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"v":{"4":{"(":{"1":{"2":{"7":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"6":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{":":{":":{"1":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"101":{"tf":3.0},"165":{"tf":1.4142135623730951}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"v":{"4":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":2.449489742783178}}},"6":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"100":{"tf":2.0},"101":{"tf":3.605551275463989}}},"df":0,"docs":{}}}},":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"100":{"tf":2.8284271247461903},"101":{"tf":2.449489742783178},"165":{"tf":2.449489742783178},"397":{"tf":1.0}},"v":{"4":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"100":{"tf":1.0}},"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"100":{"tf":1.0}}}}}}}},"6":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"100":{"tf":1.4142135623730951}},"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"100":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"345":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.7320508075688772}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"152":{"tf":1.0}}}}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"232":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"348":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"353":{"tf":1.0},"405":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}},"t":{"'":{"df":1,"docs":{"306":{"tf":1.0}}},"_":{"a":{"d":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":2,"docs":{"200":{"tf":1.4142135623730951},"211":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"7":{"5":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":5,"docs":{"198":{"tf":1.7320508075688772},"203":{"tf":1.4142135623730951},"208":{"tf":1.4142135623730951},"210":{"tf":1.0},"266":{"tf":1.4142135623730951}}}}}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"431":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"181":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"1":{"df":1,"docs":{"181":{"tf":1.7320508075688772}}},"2":{"df":1,"docs":{"181":{"tf":2.23606797749979}}},"df":16,"docs":{"115":{"tf":1.0},"170":{"tf":1.7320508075688772},"172":{"tf":3.1622776601683795},"181":{"tf":2.23606797749979},"191":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"244":{"tf":2.23606797749979},"249":{"tf":1.0},"293":{"tf":2.6457513110645907},"324":{"tf":1.0},"374":{"tf":2.8284271247461903},"392":{"tf":1.0},"405":{"tf":1.4142135623730951},"70":{"tf":1.0},"77":{"tf":3.3166247903554},"78":{"tf":2.8284271247461903}}},"r":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"77":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"=":{"df":0,"docs":{},"t":{"df":1,"docs":{"417":{"tf":1.0}}}},"df":2,"docs":{"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"374":{"tf":1.0}}}}},"t":{"df":1,"docs":{"374":{"tf":1.0}}}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"245":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":16,"docs":{"182":{"tf":1.0},"215":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":2.8284271247461903},"245":{"tf":1.7320508075688772},"246":{"tf":2.6457513110645907},"249":{"tf":2.0},"306":{"tf":1.0},"315":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":3.0},"374":{"tf":3.3166247903554},"405":{"tf":1.0},"408":{"tf":1.0},"77":{"tf":1.7320508075688772}}}}},"’":{"df":0,"docs":{},"m":{"df":2,"docs":{"218":{"tf":1.0},"59":{"tf":1.4142135623730951}}}},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"427":{"tf":1.0}}}}}}}},"j":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"325":{"tf":1.0}},"o":{"b":{"df":3,"docs":{"405":{"tf":5.830951894845301},"407":{"tf":4.47213595499958},"408":{"tf":3.872983346207417}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"3":{"df":2,"docs":{"319":{"tf":1.0},"320":{"tf":1.7320508075688772}}},"4":{"df":1,"docs":{"320":{"tf":1.0}}},"_":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"320":{"tf":2.449489742783178},"323":{"tf":1.0}},"l":{"<":{"df":0,"docs":{},"i":{">":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"320":{"tf":2.0}},"l":{"<":{"df":0,"docs":{},"f":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}},"i":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":9,"docs":{"241":{"tf":1.0},"298":{"tf":2.449489742783178},"306":{"tf":1.0},"318":{"tf":2.6457513110645907},"320":{"tf":3.1622776601683795},"321":{"tf":1.4142135623730951},"406":{"tf":1.0},"407":{"tf":3.1622776601683795},"408":{"tf":2.23606797749979}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":5,"docs":{"298":{"tf":1.4142135623730951},"306":{"tf":1.0},"318":{"tf":1.0},"405":{"tf":2.449489742783178},"407":{"tf":1.7320508075688772}},"e":{":":{":":{"<":{"df":0,"docs":{},"t":{">":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"407":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"_":{"df":1,"docs":{"407":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"298":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"、":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"、":{"df":0,"docs":{},"r":{"a":{"c":{"df":1,"docs":{"323":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"s":{"df":1,"docs":{"24":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"k":{"'":{".":{".":{"=":{"'":{"df":0,"docs":{},"z":{"df":1,"docs":{"358":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"328":{"tf":1.0}}}},"b":{"df":1,"docs":{"267":{"tf":1.0}}},"df":2,"docs":{"146":{"tf":1.0},"242":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"389":{"tf":1.0},"398":{"tf":1.0}}}},"y":{"df":6,"docs":{"148":{"tf":1.0},"26":{"tf":1.0},"32":{"tf":1.0},"420":{"tf":1.4142135623730951},"423":{"tf":1.0},"82":{"tf":1.4142135623730951}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}}},"df":5,"docs":{"299":{"tf":1.4142135623730951},"316":{"tf":1.0},"334":{"tf":1.0},"414":{"tf":1.4142135623730951},"48":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"411":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":3.4641016151377544}}}}}}},"n":{"d":{"df":6,"docs":{"101":{"tf":2.449489742783178},"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"258":{"tf":2.6457513110645907},"43":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"a":{"b":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":6,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"401":{"tf":1.0}},"n":{"df":2,"docs":{"386":{"tf":1.0},"52":{"tf":1.0}}}}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"335":{"tf":2.0},"62":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"c":{"df":0,"docs":{},"h":{"0":{"8":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"1":{"9":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"260":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"26":{"tf":1.0},"260":{"tf":1.0},"32":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"273":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}},"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"h":{"1":{"3":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"=":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":6,"docs":{"102":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.0},"316":{"tf":1.4142135623730951},"398":{"tf":1.0},"429":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}}},"_":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":2.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"199":{"tf":2.23606797749979}}},"s":{"df":0,"docs":{},"t":{"(":{"&":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.4142135623730951},"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}}}}},"<":{"df":0,"docs":{},"t":{">":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"172":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"(":{"&":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"3":{"2":{"(":{"&":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":1,"docs":{"172":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"170":{"tf":5.291502622129181},"172":{"tf":4.898979485566356},"183":{"tf":1.4142135623730951}}}}}}},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}},"e":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"102":{"tf":1.0},"162":{"tf":1.0},"360":{"tf":1.7320508075688772},"66":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"134":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"322":{"tf":1.0},"74":{"tf":1.4142135623730951},"78":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}},"z":{"df":0,"docs":{},"i":{"df":3,"docs":{"243":{"tf":1.0},"246":{"tf":1.0},"316":{"tf":1.0}}}}},"df":1,"docs":{"141":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"294":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":1,"docs":{"294":{"tf":6.082762530298219}},"和":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"k":{"df":1,"docs":{"292":{"tf":1.0}}},"v":{"df":1,"docs":{"434":{"tf":1.0}}}},"d":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}}}}},"df":10,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":2.6457513110645907},"203":{"tf":1.0},"206":{"tf":2.0},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"323":{"tf":1.0},"368":{"tf":1.4142135623730951}}}},"n":{"df":11,"docs":{"142":{"tf":1.0},"156":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"368":{"tf":2.6457513110645907},"377":{"tf":1.7320508075688772},"416":{"tf":1.0},"417":{"tf":2.0},"54":{"tf":1.0},"72":{"tf":1.7320508075688772},"73":{"tf":2.449489742783178},"78":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":8,"docs":{"400":{"tf":1.4142135623730951},"401":{"tf":2.449489742783178},"402":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0},"72":{"tf":1.7320508075688772},"73":{"tf":1.7320508075688772}},"}":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":6,"docs":{"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"202":{"tf":2.6457513110645907}},"、":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"t":{"'":{"df":1,"docs":{"368":{"tf":1.0}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"358":{"tf":1.7320508075688772}}}}},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"348":{"tf":1.7320508075688772}}}}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"46":{"tf":1.0}},"、":{"df":0,"docs":{},"方":{"df":0,"docs":{},"法":{"df":0,"docs":{},"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"关":{"df":0,"docs":{},"联":{"df":0,"docs":{},"函":{"df":0,"docs":{},"数":{"df":0,"docs":{},"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"405":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"192":{"tf":1.0},"255":{"tf":3.0}}}}}},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":3,"docs":{"211":{"tf":1.4142135623730951},"220":{"tf":2.449489742783178},"266":{"tf":1.0}}}},"c":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}},"df":18,"docs":{"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.4142135623730951},"198":{"tf":1.4142135623730951},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"289":{"tf":1.0},"290":{"tf":1.0},"386":{"tf":1.0},"391":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"111":{"tf":1.0},"198":{"tf":1.0},"227":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0}}},"y":{"'":{"df":1,"docs":{"211":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"260":{"tf":4.242640687119285}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":10,"docs":{"169":{"tf":1.0},"184":{"tf":1.4142135623730951},"186":{"tf":1.7320508075688772},"188":{"tf":1.0},"191":{"tf":2.0},"193":{"tf":1.0},"228":{"tf":1.7320508075688772},"368":{"tf":1.0},"75":{"tf":1.7320508075688772},"87":{"tf":2.6457513110645907}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"8":{"0":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"289":{"tf":3.3166247903554},"290":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"'":{"a":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"229":{"tf":1.7320508075688772},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":28,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"162":{"tf":1.0},"167":{"tf":1.0},"214":{"tf":1.0},"229":{"tf":3.1622776601683795},"231":{"tf":1.4142135623730951},"232":{"tf":3.872983346207417},"249":{"tf":3.0},"250":{"tf":2.0},"257":{"tf":1.0},"293":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"382":{"tf":1.0},"398":{"tf":2.23606797749979},"399":{"tf":1.4142135623730951},"400":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0},"59":{"tf":1.0}}},"k":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"120":{"tf":1.0},"293":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}},"t":{"df":1,"docs":{"428":{"tf":1.7320508075688772}}},"u":{"df":0,"docs":{},"x":{"df":7,"docs":{"111":{"tf":1.0},"15":{"tf":1.7320508075688772},"17":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"260":{"tf":1.0},"27":{"tf":1.0}},"、":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"o":{"df":3,"docs":{"12":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"t":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"7":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":2.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"[":{"0":{"df":2,"docs":{"170":{"tf":1.0},"172":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"385":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"|":{"df":0,"docs":{},"i":{"df":1,"docs":{"385":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"385":{"tf":1.0}}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"385":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":14,"docs":{"170":{"tf":2.0},"172":{"tf":2.0},"241":{"tf":4.69041575982343},"242":{"tf":2.0},"268":{"tf":1.0},"273":{"tf":6.082762530298219},"274":{"tf":2.449489742783178},"275":{"tf":3.4641016151377544},"285":{"tf":3.4641016151377544},"286":{"tf":2.0},"291":{"tf":2.8284271247461903},"293":{"tf":3.7416573867739413},"331":{"tf":3.0},"436":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":9,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":8,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{")":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"2":{"df":1,"docs":{"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"e":{"8":{"6":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"185":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0}}}}}}}}},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"189":{"tf":1.0},"353":{"tf":1.0},"75":{"tf":1.0}}},"t":{"df":6,"docs":{"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.7320508075688772},"352":{"tf":1.4142135623730951},"398":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":4,"docs":{"241":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":2.0},"405":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"d":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"259":{"tf":1.4142135623730951}}}}},"l":{"df":1,"docs":{"141":{"tf":1.0}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"185":{"tf":1.4142135623730951},"188":{"tf":2.449489742783178},"189":{"tf":1.0},"59":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"1":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":2.0},"189":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"186":{"tf":1.4142135623730951},"191":{"tf":1.0}}}},"<":{"'":{"a":{">":{"(":{"df":0,"docs":{},"x":{"df":3,"docs":{"186":{"tf":1.0},"188":{"tf":1.7320508075688772},"189":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"191":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"a":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"194":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"<":{"'":{"a":{"df":1,"docs":{"194":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":6,"docs":{"186":{"tf":2.8284271247461903},"187":{"tf":1.0},"188":{"tf":3.4641016151377544},"189":{"tf":2.23606797749979},"191":{"tf":1.0},"194":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"p":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"101":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"167":{"tf":1.0},"306":{"tf":1.7320508075688772},"382":{"tf":1.7320508075688772},"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":2.0},"412":{"tf":1.0},"416":{"tf":1.0},"43":{"tf":1.7320508075688772},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"62":{"tf":3.7416573867739413}},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"62":{"tf":1.0}}}}}}}}},"w":{"df":1,"docs":{"167":{"tf":1.0}}}},"s":{"df":2,"docs":{"111":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"103":{"tf":1.0},"59":{"tf":1.4142135623730951}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"59":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"k":{"a":{"df":1,"docs":{"389":{"tf":1.0}}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"337":{"tf":1.4142135623730951},"343":{"tf":2.0}}}},"df":0,"docs":{}}}},"m":{".":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"a":{"c":{"df":1,"docs":{"398":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"398":{"tf":1.0}}}}}}}},"o":{"df":5,"docs":{"15":{"tf":1.7320508075688772},"17":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0}}},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"389":{"tf":1.4142135623730951}}}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"387":{"tf":1.0},"389":{"tf":2.23606797749979},"393":{"tf":1.7320508075688772}}}}}},"df":11,"docs":{"23":{"tf":1.0},"277":{"tf":1.4142135623730951},"301":{"tf":1.7320508075688772},"320":{"tf":1.7320508075688772},"387":{"tf":1.0},"389":{"tf":2.0},"390":{"tf":1.0},"391":{"tf":2.8284271247461903},"392":{"tf":1.0},"413":{"tf":1.0},"70":{"tf":1.7320508075688772}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"387":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"22":{"tf":1.4142135623730951},"24":{"tf":2.0}}}},"p":{"d":{"b":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":10,"docs":{"111":{"tf":1.0},"113":{"tf":1.0},"156":{"tf":1.0},"22":{"tf":2.23606797749979},"220":{"tf":2.23606797749979},"24":{"tf":2.0},"26":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"405":{"tf":1.0}}}},"df":197,"docs":{"100":{"tf":1.0},"101":{"tf":3.0},"102":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"105":{"tf":2.0},"106":{"tf":1.0},"107":{"tf":1.7320508075688772},"108":{"tf":2.0},"111":{"tf":1.4142135623730951},"113":{"tf":1.0},"121":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":2.0},"141":{"tf":2.449489742783178},"142":{"tf":1.7320508075688772},"143":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772},"155":{"tf":1.4142135623730951},"156":{"tf":1.7320508075688772},"157":{"tf":1.7320508075688772},"158":{"tf":1.4142135623730951},"159":{"tf":2.0},"162":{"tf":4.47213595499958},"165":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"175":{"tf":2.0},"176":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"185":{"tf":1.7320508075688772},"186":{"tf":1.4142135623730951},"188":{"tf":2.0},"189":{"tf":1.4142135623730951},"190":{"tf":1.4142135623730951},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"194":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.7320508075688772},"219":{"tf":1.7320508075688772},"22":{"tf":1.7320508075688772},"220":{"tf":2.0},"221":{"tf":2.8284271247461903},"222":{"tf":1.7320508075688772},"223":{"tf":1.7320508075688772},"224":{"tf":3.3166247903554},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"23":{"tf":2.23606797749979},"235":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"24":{"tf":2.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"258":{"tf":1.4142135623730951},"26":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"274":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.4142135623730951},"281":{"tf":1.7320508075688772},"283":{"tf":3.3166247903554},"285":{"tf":1.7320508075688772},"286":{"tf":1.7320508075688772},"289":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":2.0},"294":{"tf":2.449489742783178},"298":{"tf":4.47213595499958},"299":{"tf":1.7320508075688772},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":4.69041575982343},"318":{"tf":2.8284271247461903},"319":{"tf":2.23606797749979},"32":{"tf":1.0},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.4142135623730951},"33":{"tf":2.23606797749979},"335":{"tf":2.0},"337":{"tf":1.0},"34":{"tf":1.0},"343":{"tf":2.8284271247461903},"348":{"tf":1.0},"349":{"tf":1.0},"35":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.4142135623730951},"352":{"tf":1.4142135623730951},"353":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.4142135623730951},"359":{"tf":2.449489742783178},"36":{"tf":1.0},"360":{"tf":3.0},"361":{"tf":1.7320508075688772},"362":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":2.449489742783178},"369":{"tf":1.4142135623730951},"37":{"tf":1.0},"370":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":2.8284271247461903},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.7320508075688772},"383":{"tf":1.0},"385":{"tf":2.449489742783178},"391":{"tf":1.4142135623730951},"397":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.0},"408":{"tf":2.0},"41":{"tf":1.0},"414":{"tf":1.4142135623730951},"42":{"tf":1.7320508075688772},"427":{"tf":1.4142135623730951},"428":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772},"53":{"tf":2.0},"54":{"tf":2.6457513110645907},"55":{"tf":2.23606797749979},"56":{"tf":1.4142135623730951},"57":{"tf":2.0},"58":{"tf":1.7320508075688772},"59":{"tf":1.4142135623730951},"61":{"tf":2.6457513110645907},"62":{"tf":2.6457513110645907},"68":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":2.449489742783178},"71":{"tf":1.4142135623730951},"72":{"tf":1.4142135623730951},"73":{"tf":2.0},"74":{"tf":2.23606797749979},"75":{"tf":1.7320508075688772},"77":{"tf":2.23606797749979},"78":{"tf":2.23606797749979},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"93":{"tf":2.0},"95":{"tf":2.0},"96":{"tf":1.0},"97":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"df":4,"docs":{"198":{"tf":1.4142135623730951},"257":{"tf":1.0},"275":{"tf":1.0},"49":{"tf":1.0}},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"71":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"x":{"df":1,"docs":{"71":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"110":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"368":{"tf":2.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"(":{"df":0,"docs":{},"|":{"(":{"&":{"c":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.0}}}}},"df":0,"docs":{}}}}}}}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"1":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"149":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":16,"docs":{"10":{"tf":1.0},"121":{"tf":1.0},"130":{"tf":2.0},"145":{"tf":1.0},"146":{"tf":2.449489742783178},"147":{"tf":2.0},"148":{"tf":2.23606797749979},"149":{"tf":3.0},"150":{"tf":3.7416573867739413},"152":{"tf":1.7320508075688772},"246":{"tf":2.6457513110645907},"316":{"tf":1.7320508075688772},"324":{"tf":1.0},"385":{"tf":2.0},"398":{"tf":1.0},"401":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"434":{"tf":2.0},"435":{"tf":1.0},"437":{"tf":1.0}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"414":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}},"df":55,"docs":{"102":{"tf":1.0},"103":{"tf":3.872983346207417},"104":{"tf":1.0},"105":{"tf":3.3166247903554},"106":{"tf":2.23606797749979},"107":{"tf":2.23606797749979},"108":{"tf":3.7416573867739413},"109":{"tf":1.0},"125":{"tf":1.4142135623730951},"134":{"tf":1.4142135623730951},"136":{"tf":1.0},"157":{"tf":2.23606797749979},"158":{"tf":3.4641016151377544},"159":{"tf":1.4142135623730951},"160":{"tf":2.449489742783178},"161":{"tf":1.4142135623730951},"162":{"tf":2.0},"167":{"tf":1.4142135623730951},"239":{"tf":1.0},"242":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"316":{"tf":2.449489742783178},"323":{"tf":2.0},"331":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.7320508075688772},"345":{"tf":1.4142135623730951},"347":{"tf":3.1622776601683795},"348":{"tf":2.0},"351":{"tf":1.0},"353":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":3.605551275463989},"357":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"359":{"tf":2.8284271247461903},"360":{"tf":2.8284271247461903},"361":{"tf":3.0},"362":{"tf":1.0},"363":{"tf":1.0},"382":{"tf":3.1622776601683795},"389":{"tf":1.7320508075688772},"404":{"tf":1.7320508075688772},"405":{"tf":2.0},"408":{"tf":2.0},"412":{"tf":1.0},"414":{"tf":2.23606797749979},"42":{"tf":3.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":2.8284271247461903},"61":{"tf":1.4142135623730951},"99":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},")":{"df":0,"docs":{},"来":{"df":0,"docs":{},"解":{"df":0,"docs":{},"构":{"df":0,"docs":{},"(":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}}},"!":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"158":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"x":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}}},"df":4,"docs":{"108":{"tf":2.0},"289":{"tf":3.4641016151377544},"290":{"tf":1.7320508075688772},"398":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"108":{"tf":1.4142135623730951}}}}}}},"y":{"b":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":9,"docs":{"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":4,"docs":{"101":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951},"281":{"tf":2.0},"306":{"tf":2.0}},"e":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"119":{"tf":1.0}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":16,"docs":{"198":{"tf":2.449489742783178},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"56":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"183":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"292":{"tf":1.0},"300":{"tf":1.4142135623730951},"304":{"tf":1.0},"70":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":20,"docs":{"101":{"tf":2.6457513110645907},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"202":{"tf":1.0},"274":{"tf":2.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"296":{"tf":1.0},"300":{"tf":1.4142135623730951},"301":{"tf":1.7320508075688772},"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.0},"323":{"tf":1.7320508075688772},"325":{"tf":2.0},"359":{"tf":2.0},"362":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"408":{"tf":2.0}},"e":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"0":{"df":1,"docs":{"359":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"(":{"0":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{},"h":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"b":{"(":{"df":0,"docs":{},"r":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":1,"docs":{"359":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"362":{"tf":2.23606797749979}}}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"274":{"tf":1.0},"359":{"tf":1.4142135623730951}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"274":{"tf":1.0},"359":{"tf":1.7320508075688772}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"}":{"'":{"\"":{")":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":4.795831523312719},"290":{"tf":2.449489742783178}}}}}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"260":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"400":{"tf":1.0},"401":{"tf":1.0},"417":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"388":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"375":{"tf":2.0},"380":{"tf":1.4142135623730951},"381":{"tf":1.0}},"s":{"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":15,"docs":{"191":{"tf":1.0},"240":{"tf":1.0},"283":{"tf":1.0},"289":{"tf":1.0},"324":{"tf":1.4142135623730951},"330":{"tf":1.0},"370":{"tf":1.4142135623730951},"398":{"tf":1.7320508075688772},"405":{"tf":2.0},"407":{"tf":2.0},"417":{"tf":1.0},"42":{"tf":1.4142135623730951},"69":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"df":1,"docs":{"368":{"tf":3.605551275463989}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"375":{"tf":2.8284271247461903},"380":{"tf":1.4142135623730951},"381":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"3":{"2":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"226":{"tf":1.4142135623730951},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":13,"docs":{"214":{"tf":2.23606797749979},"215":{"tf":1.4142135623730951},"216":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.4142135623730951},"227":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":2.23606797749979},"232":{"tf":2.0},"234":{"tf":1.0}}}}}},"m":{"df":1,"docs":{"26":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":9,"docs":{"173":{"tf":1.0},"240":{"tf":1.0},"320":{"tf":1.0},"351":{"tf":1.0},"407":{"tf":1.0},"42":{"tf":1.4142135623730951},"51":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":5,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"260":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}},"t":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"t":{"df":1,"docs":{"260":{"tf":2.23606797749979}}},"x":{"(":{"c":{"1":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}},"df":1,"docs":{"258":{"tf":2.23606797749979}},"u":{"df":0,"docs":{},"p":{"<":{"df":0,"docs":{},"x":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"175":{"tf":1.7320508075688772}}}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"21":{"tf":2.0},"265":{"tf":1.0}}}}},"df":0,"docs":{}},"m":{"df":1,"docs":{"17":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}}}}},"df":2,"docs":{"289":{"tf":3.1622776601683795},"290":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":4.58257569495584},"290":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}},"d":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"128":{"tf":1.4142135623730951},"211":{"tf":1.0}}}},"df":36,"docs":{"113":{"tf":2.8284271247461903},"114":{"tf":2.0},"115":{"tf":2.0},"116":{"tf":2.449489742783178},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"123":{"tf":1.4142135623730951},"127":{"tf":2.6457513110645907},"128":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"244":{"tf":1.0},"245":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"266":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"412":{"tf":1.0}},"e":{"df":1,"docs":{"398":{"tf":1.0}},"l":{"df":3,"docs":{"258":{"tf":2.449489742783178},"405":{"tf":1.7320508075688772},"434":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":2.6457513110645907},"120":{"tf":1.7320508075688772},"127":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"110":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"176":{"tf":1.0},"229":{"tf":1.7320508075688772}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"54":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":56,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.4142135623730951},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"180":{"tf":2.23606797749979},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.0},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"303":{"tf":1.0},"306":{"tf":1.4142135623730951},"319":{"tf":1.0},"32":{"tf":1.0},"320":{"tf":1.7320508075688772},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"368":{"tf":1.7320508075688772},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951},"78":{"tf":1.0},"87":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"239":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"107":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"107":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":17,"docs":{"101":{"tf":1.7320508075688772},"241":{"tf":2.23606797749979},"242":{"tf":1.4142135623730951},"274":{"tf":1.0},"285":{"tf":2.0},"299":{"tf":4.123105625617661},"300":{"tf":1.0},"301":{"tf":2.0},"306":{"tf":2.449489742783178},"316":{"tf":2.0},"319":{"tf":2.6457513110645907},"320":{"tf":3.605551275463989},"359":{"tf":1.4142135623730951},"405":{"tf":2.23606797749979},"407":{"tf":2.0},"412":{"tf":1.0},"70":{"tf":2.23606797749979}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"/":{"5":{".":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":7,"docs":{"300":{"tf":2.449489742783178},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":2,"docs":{"405":{"tf":2.449489742783178},"407":{"tf":2.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"300":{"tf":1.0},"303":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"322":{"tf":2.0}},"g":{"df":4,"docs":{"289":{"tf":2.0},"290":{"tf":1.0},"359":{"tf":2.23606797749979},"362":{"tf":1.4142135623730951}}},"v":{"c":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":1,"docs":{"436":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"}":{"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"405":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"300":{"tf":1.0},"303":{"tf":1.0},"53":{"tf":1.0},"59":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"403":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"287":{"tf":1.0},"49":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"l":{"df":10,"docs":{"134":{"tf":1.4142135623730951},"270":{"tf":1.0},"287":{"tf":1.0},"289":{"tf":2.6457513110645907},"368":{"tf":2.0},"407":{"tf":1.0},"49":{"tf":1.0},"73":{"tf":1.7320508075688772},"74":{"tf":2.449489742783178},"78":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":78,"docs":{"108":{"tf":1.4142135623730951},"119":{"tf":1.0},"121":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.7320508075688772},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":2.0},"160":{"tf":1.4142135623730951},"161":{"tf":1.7320508075688772},"167":{"tf":1.0},"170":{"tf":2.0},"172":{"tf":1.7320508075688772},"187":{"tf":1.0},"191":{"tf":1.0},"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"239":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"242":{"tf":2.23606797749979},"244":{"tf":1.0},"249":{"tf":3.0},"250":{"tf":1.7320508075688772},"252":{"tf":1.0},"282":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":2.0},"306":{"tf":3.1622776601683795},"319":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"33":{"tf":2.0},"337":{"tf":1.0},"34":{"tf":2.23606797749979},"341":{"tf":1.0},"343":{"tf":1.4142135623730951},"35":{"tf":1.7320508075688772},"36":{"tf":1.0},"360":{"tf":1.0},"367":{"tf":2.8284271247461903},"368":{"tf":4.58257569495584},"369":{"tf":1.4142135623730951},"37":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0},"382":{"tf":1.0},"389":{"tf":1.4142135623730951},"405":{"tf":3.0},"407":{"tf":3.0},"408":{"tf":2.449489742783178},"41":{"tf":1.0},"412":{"tf":1.0},"416":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":2.23606797749979},"50":{"tf":1.0},"51":{"tf":2.23606797749979},"54":{"tf":1.0},"62":{"tf":2.23606797749979},"69":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":4.242640687119285},"77":{"tf":1.0},"78":{"tf":1.0},"82":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"0":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}},"5":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{">":{"/":{"a":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"291":{"tf":1.4142135623730951},"306":{"tf":4.242640687119285},"307":{"tf":2.23606797749979},"310":{"tf":1.4142135623730951},"312":{"tf":1.0}}}},"df":5,"docs":{"305":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"d":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}},"df":2,"docs":{"306":{"tf":1.4142135623730951},"307":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"305":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"_":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"257":{"tf":2.449489742783178}},"e":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{":":{":":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"(":{"df":0,"docs":{},"x":{"df":3,"docs":{"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"279":{"tf":1.0},"280":{"tf":1.0}}}},"df":1,"docs":{"279":{"tf":1.0}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"281":{"tf":2.449489742783178}}}}},"t":{">":{"(":{"df":0,"docs":{},"t":{"df":3,"docs":{"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":4,"docs":{"276":{"tf":1.0},"279":{"tf":3.0},"280":{"tf":2.23606797749979},"281":{"tf":2.8284271247461903}}},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"279":{"tf":1.0}}}}}}}}},"df":2,"docs":{"279":{"tf":1.7320508075688772},"280":{"tf":1.0}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"427":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":19,"docs":{"186":{"tf":1.4142135623730951},"201":{"tf":2.0},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"232":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.7320508075688772},"281":{"tf":2.0},"32":{"tf":1.0},"324":{"tf":2.0},"368":{"tf":1.0},"388":{"tf":1.0},"391":{"tf":3.7416573867739413},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":2.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":1,"docs":{"421":{"tf":1.0}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"398":{"tf":1.0}}}}}},"df":7,"docs":{"240":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"361":{"tf":2.6457513110645907},"405":{"tf":1.4142135623730951},"42":{"tf":1.0},"53":{"tf":1.0},"63":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"405":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":4,"docs":{"273":{"tf":1.7320508075688772},"320":{"tf":1.7320508075688772},"52":{"tf":1.0},"59":{"tf":1.0}},"l":{"df":1,"docs":{"216":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"g":{"df":1,"docs":{"416":{"tf":1.0}}},"t":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"364":{"tf":1.0},"382":{"tf":2.0},"405":{"tf":1.7320508075688772}}}}},"w":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"223":{"tf":1.0},"224":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"405":{"tf":3.3166247903554},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"167":{"tf":1.0},"202":{"tf":2.0}}}}},"df":0,"docs":{}},"x":{"df":4,"docs":{"183":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"360":{"tf":2.449489742783178}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":41,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.0},"140":{"tf":1.0},"147":{"tf":1.0},"167":{"tf":1.7320508075688772},"179":{"tf":1.4142135623730951},"180":{"tf":1.7320508075688772},"181":{"tf":1.4142135623730951},"183":{"tf":1.0},"198":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"214":{"tf":1.7320508075688772},"223":{"tf":2.0},"224":{"tf":2.0},"26":{"tf":2.449489742783178},"260":{"tf":1.0},"265":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.4142135623730951},"289":{"tf":2.0},"290":{"tf":1.0},"306":{"tf":1.4142135623730951},"316":{"tf":1.0},"32":{"tf":1.4142135623730951},"338":{"tf":1.7320508075688772},"339":{"tf":1.0},"34":{"tf":2.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"374":{"tf":1.0},"391":{"tf":1.7320508075688772},"397":{"tf":1.4142135623730951},"405":{"tf":5.656854249492381},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178},"430":{"tf":1.0},"49":{"tf":1.0},"96":{"tf":1.4142135623730951}},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"l":{"df":5,"docs":{"178":{"tf":1.4142135623730951},"179":{"tf":2.449489742783178},"180":{"tf":3.0},"181":{"tf":2.0},"182":{"tf":2.6457513110645907}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":6,"docs":{"364":{"tf":1.4142135623730951},"375":{"tf":1.7320508075688772},"378":{"tf":2.23606797749979},"379":{"tf":1.7320508075688772},"380":{"tf":2.449489742783178},"381":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"374":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"376":{"tf":1.0}}}}},"df":0,"docs":{}},"df":10,"docs":{"162":{"tf":1.7320508075688772},"244":{"tf":3.1622776601683795},"245":{"tf":2.0},"249":{"tf":2.23606797749979},"293":{"tf":2.449489742783178},"316":{"tf":2.0},"324":{"tf":2.6457513110645907},"325":{"tf":1.0},"374":{"tf":2.0},"401":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"162":{"tf":1.0}}},"l":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":1,"docs":{"0":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":10,"docs":{"10":{"tf":1.0},"198":{"tf":1.0},"277":{"tf":1.0},"301":{"tf":1.0},"432":{"tf":1.4142135623730951},"434":{"tf":3.605551275463989},"435":{"tf":1.7320508075688772},"436":{"tf":3.1622776601683795},"437":{"tf":1.4142135623730951},"70":{"tf":1.0}}}}}}},"l":{"df":6,"docs":{"273":{"tf":3.0},"275":{"tf":1.7320508075688772},"285":{"tf":2.0},"286":{"tf":1.4142135623730951},"291":{"tf":2.23606797749979},"293":{"tf":3.3166247903554}}}},"o":{"_":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"75":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"218":{"tf":2.449489742783178},"225":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"235":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"294":{"tf":4.242640687119285}}}},"df":0,"docs":{},"n":{"df":2,"docs":{"106":{"tf":1.0},"368":{"tf":1.0}},"e":{"df":34,"docs":{"102":{"tf":2.6457513110645907},"105":{"tf":4.0},"106":{"tf":2.449489742783178},"108":{"tf":1.0},"134":{"tf":2.0},"148":{"tf":1.0},"162":{"tf":2.449489742783178},"166":{"tf":1.0},"174":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"239":{"tf":1.7320508075688772},"242":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"294":{"tf":2.0},"316":{"tf":1.7320508075688772},"319":{"tf":1.7320508075688772},"331":{"tf":1.4142135623730951},"341":{"tf":1.4142135623730951},"342":{"tf":1.0},"347":{"tf":1.7320508075688772},"348":{"tf":1.0},"353":{"tf":2.449489742783178},"356":{"tf":1.4142135623730951},"360":{"tf":1.0},"361":{"tf":1.0},"374":{"tf":1.0},"382":{"tf":2.0},"398":{"tf":1.0},"407":{"tf":2.0},"421":{"tf":1.0},"53":{"tf":1.0}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"程":{"df":0,"docs":{},"序":{"df":0,"docs":{},"的":{"df":0,"docs":{},"结":{"df":0,"docs":{},"尾":{"df":0,"docs":{},",":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"的":{"df":0,"docs":{},"话":{"df":0,"docs":{},",":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},",":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":46,"docs":{"106":{"tf":1.7320508075688772},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"120":{"tf":1.0},"142":{"tf":1.4142135623730951},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"228":{"tf":1.0},"240":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"266":{"tf":1.0},"273":{"tf":1.7320508075688772},"277":{"tf":1.0},"290":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":3.3166247903554},"324":{"tf":1.4142135623730951},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"368":{"tf":1.0},"377":{"tf":2.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"427":{"tf":1.0},"428":{"tf":1.0},"43":{"tf":1.0},"52":{"tf":1.0},"54":{"tf":1.0},"57":{"tf":1.4142135623730951},"70":{"tf":1.0},"91":{"tf":1.4142135623730951}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0}}},"df":0,"docs":{}}}}},"h":{"df":1,"docs":{"246":{"tf":1.0}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"181":{"tf":2.0}}},"y":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"1":{"df":1,"docs":{"181":{"tf":1.0}}},"df":1,"docs":{"181":{"tf":1.4142135623730951}}}}}}},"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"'":{".":{"'":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"190":{"tf":2.0},"192":{"tf":1.4142135623730951}}},"m":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"df":1,"docs":{"15":{"tf":1.0}}}},"s":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"102":{"tf":1.7320508075688772},"273":{"tf":1.0}}}},"m":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"[":{"0":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":3.0},"172":{"tf":1.4142135623730951}}}}}}},"df":33,"docs":{"124":{"tf":1.4142135623730951},"125":{"tf":2.23606797749979},"167":{"tf":1.4142135623730951},"170":{"tf":3.7416573867739413},"172":{"tf":1.4142135623730951},"173":{"tf":1.0},"257":{"tf":1.4142135623730951},"260":{"tf":1.0},"298":{"tf":6.4031242374328485},"318":{"tf":6.4031242374328485},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"360":{"tf":3.1622776601683795},"361":{"tf":1.7320508075688772},"37":{"tf":1.0},"38":{"tf":1.0},"382":{"tf":1.4142135623730951},"405":{"tf":3.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772},"41":{"tf":2.449489742783178},"42":{"tf":2.8284271247461903},"420":{"tf":1.0},"43":{"tf":2.449489742783178},"44":{"tf":1.7320508075688772},"45":{"tf":2.23606797749979},"52":{"tf":1.7320508075688772},"53":{"tf":1.0},"54":{"tf":1.0},"61":{"tf":5.5677643628300215},"62":{"tf":2.0}}}}},"df":8,"docs":{"167":{"tf":1.0},"240":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"306":{"tf":3.3166247903554},"361":{"tf":2.0},"367":{"tf":2.8284271247461903},"382":{"tf":1.0},"45":{"tf":1.7320508075688772}}}}},"o":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"252":{"tf":1.0}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"94":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"94":{"tf":1.0}}}}}}}}},"df":10,"docs":{"102":{"tf":1.0},"162":{"tf":1.0},"271":{"tf":1.0},"312":{"tf":1.0},"320":{"tf":2.23606797749979},"328":{"tf":1.4142135623730951},"330":{"tf":2.0},"334":{"tf":1.0},"386":{"tf":1.0},"94":{"tf":2.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"333":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"368":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"26":{"tf":1.0}}}}}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"134":{"tf":1.4142135623730951},"242":{"tf":1.0},"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"368":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":2.0},"78":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{"d":{"df":1,"docs":{"361":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}},"k":{"(":{"_":{"df":2,"docs":{"160":{"tf":1.0},"382":{"tf":1.0}}},"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"348":{"tf":1.7320508075688772}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"f":{"c":{"df":1,"docs":{"158":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":1.0}}}}},"j":{"df":0,"docs":{},"o":{"b":{"df":2,"docs":{"405":{"tf":1.0},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"167":{"tf":1.0},"382":{"tf":1.0},"45":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}}}}},"t":{"df":2,"docs":{"157":{"tf":1.0},"174":{"tf":1.0}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"160":{"tf":1.0},"161":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"349":{"tf":1.0}}}}},"df":0,"docs":{}}},"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"399":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"162":{"tf":1.0}}}}},"df":41,"docs":{"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"157":{"tf":2.449489742783178},"159":{"tf":1.0},"160":{"tf":1.7320508075688772},"161":{"tf":2.0},"162":{"tf":2.23606797749979},"165":{"tf":1.0},"174":{"tf":1.0},"198":{"tf":3.0},"199":{"tf":2.8284271247461903},"200":{"tf":2.23606797749979},"202":{"tf":1.7320508075688772},"203":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"207":{"tf":3.1622776601683795},"208":{"tf":2.449489742783178},"211":{"tf":3.605551275463989},"224":{"tf":1.7320508075688772},"225":{"tf":2.449489742783178},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.8284271247461903},"231":{"tf":1.0},"232":{"tf":3.1622776601683795},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"266":{"tf":2.6457513110645907},"348":{"tf":1.0},"349":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0},"42":{"tf":1.4142135623730951},"45":{"tf":2.0}},"。":{"df":0,"docs":{},"如":{"df":0,"docs":{},"果":{"df":0,"docs":{},"超":{"df":0,"docs":{},"时":{"df":0,"docs":{},"先":{"df":0,"docs":{},"发":{"df":0,"docs":{},"生":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}},"n":{"c":{"df":7,"docs":{"180":{"tf":1.0},"182":{"tf":1.0},"306":{"tf":1.0},"360":{"tf":1.4142135623730951},"368":{"tf":1.0},"405":{"tf":1.4142135623730951},"74":{"tf":1.0}}},"df":8,"docs":{"257":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"324":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"355":{"tf":1.0},"357":{"tf":1.0},"54":{"tf":1.0}},"e":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"207":{"tf":2.0}}}},"df":0,"docs":{}}}},"m":{"df":1,"docs":{"322":{"tf":1.0}}},"n":{"df":1,"docs":{"322":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"250":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"y":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"66":{"tf":1.0}}}}},"o":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"337":{"tf":1.0}},"p":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"328":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"10":{"tf":1.0},"328":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"415":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"242":{"tf":1.0},"276":{"tf":1.0},"330":{"tf":1.4142135623730951},"375":{"tf":1.0}}}},"t":{"df":1,"docs":{"255":{"tf":3.0}},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"255":{"tf":1.0},"267":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"407":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"382":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"<":{"&":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"342":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"134":{"tf":1.0},"148":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"348":{"tf":1.0}}}}},"t":{"df":1,"docs":{"134":{"tf":1.0}}},"v":{"df":1,"docs":{"148":{"tf":1.0}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":5,"docs":{"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{">":{"df":0,"docs":{},",":{"df":0,"docs":{},"是":{"df":0,"docs":{},"不":{"df":0,"docs":{},"同":{"df":0,"docs":{},"于":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}},"df":1,"docs":{"162":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}}}},"i":{"3":{"2":{">":{"df":0,"docs":{},"。":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":7,"docs":{"102":{"tf":1.4142135623730951},"105":{"tf":3.1622776601683795},"106":{"tf":2.0},"148":{"tf":1.0},"331":{"tf":1.0},"347":{"tf":1.0},"353":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"102":{"tf":2.23606797749979}}},"df":0,"docs":{}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"407":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"421":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"c":{"<":{"df":0,"docs":{},"t":{">":{">":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"244":{"tf":1.0},"374":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"242":{"tf":1.0},"316":{"tf":3.3166247903554}}}}},"t":{"df":14,"docs":{"102":{"tf":3.872983346207417},"105":{"tf":2.0},"106":{"tf":1.0},"109":{"tf":1.0},"162":{"tf":1.7320508075688772},"169":{"tf":1.0},"174":{"tf":2.23606797749979},"176":{"tf":2.0},"239":{"tf":2.0},"242":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"374":{"tf":1.0},"382":{"tf":1.7320508075688772},"424":{"tf":1.7320508075688772}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"8":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"242":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"6":{"4":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"5":{".":{"0":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"3":{"2":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"5":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":18,"docs":{"102":{"tf":2.8284271247461903},"157":{"tf":1.0},"162":{"tf":3.1622776601683795},"166":{"tf":1.0},"168":{"tf":1.0},"176":{"tf":1.0},"24":{"tf":1.0},"242":{"tf":1.7320508075688772},"316":{"tf":1.0},"335":{"tf":2.0},"341":{"tf":1.0},"342":{"tf":1.4142135623730951},"343":{"tf":1.0},"349":{"tf":1.0},"374":{"tf":1.0},"401":{"tf":1.0},"407":{"tf":2.0},"408":{"tf":1.0}}}}}}},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}}}}}}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"348":{"tf":1.0}}}}},"d":{"df":1,"docs":{"421":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"119":{"tf":1.0}}},"2":{"df":1,"docs":{"119":{"tf":1.0}}},"df":3,"docs":{"42":{"tf":2.0},"421":{"tf":1.0},"45":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"。":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"209":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"102":{"tf":1.0},"312":{"tf":1.0},"328":{"tf":1.4142135623730951},"330":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"277":{"tf":1.0},"301":{"tf":1.0},"360":{"tf":1.4142135623730951},"70":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"179":{"tf":1.0},"378":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":3,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"398":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"0":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"199":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}}}}},"i":{"df":2,"docs":{"175":{"tf":1.0},"375":{"tf":1.0}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"199":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}}},"x":{"df":1,"docs":{"375":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.7320508075688772}}}}}}}},"t":{"df":26,"docs":{"137":{"tf":1.0},"156":{"tf":1.4142135623730951},"198":{"tf":2.449489742783178},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.23606797749979},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"219":{"tf":1.0},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"242":{"tf":1.0},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"286":{"tf":1.4142135623730951},"290":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.0},"54":{"tf":1.0},"66":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"377":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"377":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"377":{"tf":4.358898943540674}}}}}}}}},"v":{"df":1,"docs":{"299":{"tf":1.7320508075688772}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"377":{"tf":1.7320508075688772}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"205":{"tf":1.0},"234":{"tf":2.0},"235":{"tf":2.23606797749979}}}}}},"df":8,"docs":{"191":{"tf":1.0},"206":{"tf":2.0},"233":{"tf":1.0},"316":{"tf":1.7320508075688772},"318":{"tf":1.0},"320":{"tf":1.0},"375":{"tf":2.0},"377":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.7320508075688772}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"293":{"tf":1.0},"53":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"368":{"tf":1.0}}}},"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"d":{"df":2,"docs":{"413":{"tf":1.0},"436":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}}}}}}}},"w":{"df":0,"docs":{},"n":{"df":4,"docs":{"189":{"tf":1.0},"299":{"tf":1.0},"405":{"tf":1.0},"75":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"67":{"tf":1.0}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"64":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"299":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"46":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"70":{"tf":1.7320508075688772},"73":{"tf":1.7320508075688772},"74":{"tf":2.449489742783178},"75":{"tf":1.7320508075688772},"78":{"tf":1.7320508075688772}}}}}}}}}}},"p":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}}}},"x":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}},"1":{")":{".":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"175":{"tf":1.7320508075688772},"94":{"tf":1.0}}},"2":{"df":2,"docs":{"175":{"tf":1.4142135623730951},"94":{"tf":1.0}},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"175":{"tf":1.0}}}}}}}}}}},"3":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"175":{"tf":1.7320508075688772}}},"x":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}},"df":1,"docs":{"175":{"tf":1.4142135623730951}}},">":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"400":{"tf":1.0}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"401":{"tf":1.0}}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":12,"docs":{"110":{"tf":1.4142135623730951},"111":{"tf":1.7320508075688772},"117":{"tf":1.0},"241":{"tf":1.4142135623730951},"26":{"tf":1.0},"260":{"tf":2.449489742783178},"261":{"tf":1.0},"265":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"32":{"tf":1.0},"330":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}},"g":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":3.4641016151377544}},"e":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"[":{"1":{"df":1,"docs":{"316":{"tf":1.0}}},"2":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"316":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"<":{"'":{"a":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"102":{"tf":1.0}}},"r":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"183":{"tf":2.6457513110645907}}}},"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}}},"n":{"c":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"391":{"tf":3.7416573867739413}},"e":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"c":{"!":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"382":{"tf":1.0}}}},"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"155":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"167":{"tf":1.0},"202":{"tf":1.4142135623730951}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"198":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"224":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"157":{"tf":1.0},"158":{"tf":2.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"154":{"tf":1.0},"163":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":39,"docs":{"10":{"tf":1.0},"134":{"tf":1.4142135623730951},"143":{"tf":1.0},"153":{"tf":1.4142135623730951},"154":{"tf":3.0},"155":{"tf":3.872983346207417},"156":{"tf":3.605551275463989},"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"159":{"tf":2.8284271247461903},"160":{"tf":1.4142135623730951},"162":{"tf":1.0},"163":{"tf":2.6457513110645907},"164":{"tf":1.7320508075688772},"166":{"tf":2.8284271247461903},"167":{"tf":1.7320508075688772},"168":{"tf":1.4142135623730951},"198":{"tf":2.23606797749979},"199":{"tf":1.0},"202":{"tf":5.0990195135927845},"203":{"tf":1.4142135623730951},"216":{"tf":1.0},"224":{"tf":3.1622776601683795},"225":{"tf":1.0},"257":{"tf":1.7320508075688772},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"342":{"tf":1.0},"368":{"tf":1.0},"382":{"tf":2.23606797749979},"391":{"tf":1.7320508075688772},"405":{"tf":5.0},"407":{"tf":3.0},"408":{"tf":2.449489742783178},"53":{"tf":2.23606797749979},"54":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951}},"k":{"df":17,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"198":{"tf":1.4142135623730951},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0},"407":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"225":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"296":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":10,"docs":{"172":{"tf":1.0},"186":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"240":{"tf":1.0},"360":{"tf":1.4142135623730951},"375":{"tf":1.0},"405":{"tf":1.4142135623730951},"56":{"tf":1.4142135623730951},"75":{"tf":1.0},"87":{"tf":2.0}},"r":{"df":1,"docs":{"332":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"114":{"tf":1.0},"294":{"tf":4.795831523312719}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}}},"s":{"df":13,"docs":{"165":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"316":{"tf":1.0},"391":{"tf":1.0},"42":{"tf":2.0},"45":{"tf":2.0},"52":{"tf":1.0},"54":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"221":{"tf":1.0},"222":{"tf":1.0}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"221":{"tf":1.0},"222":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"221":{"tf":2.0},"222":{"tf":2.6457513110645907},"223":{"tf":2.8284271247461903}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"43":{"tf":1.0}}}}}}}}}}}},"t":{"df":2,"docs":{"190":{"tf":2.0},"192":{"tf":2.0}},"i":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"421":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"<":{"&":{"df":0,"docs":{},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":6,"docs":{"200":{"tf":1.4142135623730951},"239":{"tf":1.0},"375":{"tf":1.0},"416":{"tf":1.4142135623730951},"420":{"tf":2.6457513110645907},"421":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"172":{"tf":1.4142135623730951},"183":{"tf":1.4142135623730951},"416":{"tf":2.449489742783178},"421":{"tf":2.8284271247461903}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":18,"docs":{"198":{"tf":2.6457513110645907},"199":{"tf":2.449489742783178},"200":{"tf":2.0},"201":{"tf":2.0},"202":{"tf":2.449489742783178},"206":{"tf":2.0},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.4142135623730951},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951},"296":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"300":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"t":{"df":1,"docs":{"416":{"tf":2.23606797749979}},"h":{"df":13,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.7320508075688772},"120":{"tf":1.0},"17":{"tf":1.7320508075688772},"249":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.4142135623730951},"268":{"tf":1.0},"376":{"tf":1.0},"391":{"tf":1.7320508075688772},"417":{"tf":1.7320508075688772}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"106":{"tf":2.0},"330":{"tf":1.0},"337":{"tf":1.0},"345":{"tf":1.0},"347":{"tf":1.7320508075688772},"350":{"tf":1.0},"351":{"tf":2.23606797749979},"353":{"tf":3.3166247903554},"354":{"tf":1.0},"360":{"tf":2.23606797749979},"375":{"tf":1.0},"378":{"tf":1.0},"42":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":3,"docs":{"337":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"y":{"df":1,"docs":{"252":{"tf":1.0}}}},"c":{"df":1,"docs":{"436":{"tf":1.7320508075688772}}},"d":{"b":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"175":{"tf":1.4142135623730951},"213":{"tf":1.0},"266":{"tf":2.23606797749979},"359":{"tf":3.3166247903554},"377":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":3,"docs":{"341":{"tf":3.0},"342":{"tf":3.0},"343":{"tf":2.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":3.7416573867739413}}}}}}}}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}},"n":{"df":0,"docs":{},"i":{"df":3,"docs":{"103":{"tf":1.7320508075688772},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}},"y":{"!":{"df":0,"docs":{},"”":{"df":0,"docs":{},",":{"df":0,"docs":{},"同":{"df":0,"docs":{},"时":{"df":0,"docs":{},"仍":{"df":0,"docs":{},"然":{"df":0,"docs":{},"返":{"df":0,"docs":{},"回":{"df":0,"docs":{},"代":{"df":0,"docs":{},"码":{"df":0,"docs":{},"块":{"df":0,"docs":{},"最":{"df":0,"docs":{},"后":{"df":0,"docs":{},"的":{"df":0,"docs":{},"值":{"df":0,"docs":{},",":{"1":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"380":{"tf":1.7320508075688772}}}}},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":2,"docs":{"289":{"tf":3.4641016151377544},"290":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"360":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":4,"docs":{"102":{"tf":1.0},"242":{"tf":1.0},"257":{"tf":1.0},"70":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"261":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}}},"df":1,"docs":{"376":{"tf":1.4142135623730951}}}}}}},"h":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"399":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772}}}},"df":2,"docs":{"1":{"tf":1.0},"428":{"tf":1.0}},"g":{"df":1,"docs":{"152":{"tf":1.0}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":2.8284271247461903}}}}},"n":{"!":{"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"320":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"<":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"320":{"tf":4.69041575982343},"323":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"88":{"tf":1.7320508075688772},"89":{"tf":1.0},"90":{"tf":1.0},"93":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"346":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"335":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"=":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"375":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"113":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":8,"docs":{"119":{"tf":1.0},"192":{"tf":1.4142135623730951},"260":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":2.23606797749979},"45":{"tf":2.0}}}},"df":0,"docs":{}},"u":{"df":2,"docs":{"203":{"tf":1.0},"266":{"tf":1.4142135623730951}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"105":{"tf":1.7320508075688772},"106":{"tf":1.0},"58":{"tf":1.0}},"e":{"(":{"5":{"df":1,"docs":{"58":{"tf":1.4142135623730951}}},"df":0,"docs":{},"f":{"df":2,"docs":{"105":{"tf":2.23606797749979},"106":{"tf":1.0}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"105":{"tf":2.0},"106":{"tf":1.0}}}}},"x":{"df":3,"docs":{"105":{"tf":2.0},"106":{"tf":1.0},"58":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":5,"docs":{"218":{"tf":2.449489742783178},"225":{"tf":1.7320508075688772},"229":{"tf":2.449489742783178},"232":{"tf":2.0},"235":{"tf":1.0}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"<":{"df":0,"docs":{},"f":{"3":{"2":{"df":1,"docs":{"175":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":2,"docs":{"173":{"tf":2.6457513110645907},"175":{"tf":3.1622776601683795}}},"x":{"1":{"df":1,"docs":{"175":{"tf":1.7320508075688772}}},"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"df":16,"docs":{"173":{"tf":3.605551275463989},"175":{"tf":3.4641016151377544},"270":{"tf":1.0},"316":{"tf":1.4142135623730951},"319":{"tf":1.7320508075688772},"321":{"tf":2.0},"322":{"tf":2.0},"352":{"tf":1.0},"359":{"tf":4.358898943540674},"360":{"tf":2.23606797749979},"375":{"tf":3.872983346207417},"377":{"tf":4.47213595499958},"52":{"tf":1.0},"53":{"tf":1.0},"85":{"tf":1.4142135623730951},"94":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"270":{"tf":1.4142135623730951},"309":{"tf":1.0},"367":{"tf":1.0},"385":{"tf":1.0},"412":{"tf":1.4142135623730951},"66":{"tf":1.0},"75":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"。":{"a":{"d":{"d":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"405":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"315":{"tf":1.0}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"431":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":1,"docs":{"332":{"tf":1.7320508075688772}}}}}}}}},"o":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"405":{"tf":2.0},"408":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"405":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"405":{"tf":3.7416573867739413},"407":{"tf":2.0},"408":{"tf":2.23606797749979}}}},"p":{"df":2,"docs":{"136":{"tf":1.0},"66":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"ê":{"df":1,"docs":{"431":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{".":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"i":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"337":{"tf":1.7320508075688772},"342":{"tf":1.4142135623730951},"343":{"tf":2.0}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":3,"docs":{"337":{"tf":1.4142135623730951},"338":{"tf":1.0},"343":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":9,"docs":{"337":{"tf":1.7320508075688772},"338":{"tf":3.7416573867739413},"339":{"tf":2.449489742783178},"340":{"tf":2.23606797749979},"341":{"tf":3.872983346207417},"342":{"tf":5.0990195135927845},"343":{"tf":5.477225575051661},"393":{"tf":1.0},"398":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"14":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.4142135623730951}}}}}}}}}},"p":{"df":0,"docs":{},"v":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"11":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":2.0}}}}},"l":{"df":0,"docs":{},"u":{"d":{"df":7,"docs":{"102":{"tf":1.0},"126":{"tf":1.0},"147":{"tf":1.0},"157":{"tf":1.0},"283":{"tf":1.4142135623730951},"285":{"tf":1.0},"33":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"377":{"tf":1.4142135623730951},"91":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.7320508075688772},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}},"s":{"df":1,"docs":{"360":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":3.3166247903554}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"222":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"!":{"(":{"\"":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"382":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"382":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{"&":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"352":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"352":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"56":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"5":{"df":1,"docs":{"56":{"tf":1.0}}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"56":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"324":{"tf":1.0},"377":{"tf":1.4142135623730951},"91":{"tf":1.0}},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"'":{"a":{"df":1,"docs":{"322":{"tf":2.449489742783178}}},"b":{"df":1,"docs":{"322":{"tf":2.449489742783178}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}}}}},"{":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}},"df":0,"docs":{}}}},"*":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"1":{"df":2,"docs":{"179":{"tf":1.0},"180":{"tf":1.0}}},"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}}}},"df":3,"docs":{"291":{"tf":1.0},"293":{"tf":2.23606797749979},"376":{"tf":2.23606797749979}},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"62":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"194":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"355":{"tf":1.0},"357":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"225":{"tf":1.0},"226":{"tf":1.0}}}}},"t":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}}}}},"b":{"df":3,"docs":{"272":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"241":{"tf":2.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"181":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"360":{"tf":1.0}}}},"df":2,"docs":{"95":{"tf":2.0},"97":{"tf":1.4142135623730951}}}},"df":1,"docs":{"291":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"359":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":2.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"286":{"tf":2.0},"369":{"tf":1.0},"62":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"352":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"283":{"tf":2.23606797749979}}}}}}}}}},"df":0,"docs":{}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"358":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"360":{"tf":1.4142135623730951},"362":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":8,"docs":{"243":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":14,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":9,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"281":{"tf":1.7320508075688772},"32":{"tf":1.0},"388":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"55":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"299":{"tf":2.449489742783178}}},"df":0,"docs":{}}}},"i":{"df":3,"docs":{"298":{"tf":2.449489742783178},"318":{"tf":2.449489742783178},"381":{"tf":1.4142135623730951}}}},"i":{"'":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":1,"docs":{"206":{"tf":1.0}},"n":{"df":8,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"358":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}}}}}}},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"103":{"tf":1.0}}}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"306":{"tf":1.0}},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"359":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"180":{"tf":1.0}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"o":{"df":1,"docs":{"361":{"tf":1.0}}},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"61":{"tf":2.449489742783178}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"355":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.7320508075688772}}}},"p":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}},"3":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"175":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"224":{"tf":1.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"1":{"df":1,"docs":{"367":{"tf":1.0}}},"2":{"df":1,"docs":{"367":{"tf":1.0}}},"df":1,"docs":{"185":{"tf":2.0}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"319":{"tf":1.7320508075688772},"320":{"tf":2.6457513110645907}}}}},"t":{"1":{"df":1,"docs":{"91":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"62":{"tf":1.0}}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"306":{"tf":2.0}}}}}}}},"s":{"1":{"df":1,"docs":{"70":{"tf":1.0}}},"2":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":8,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":1,"docs":{"360":{"tf":1.0}}}},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"360":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"358":{"tf":1.4142135623730951}}}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"108":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"u":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.0}}}}},"h":{"df":36,"docs":{"108":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"134":{"tf":2.0},"167":{"tf":1.0},"170":{"tf":2.23606797749979},"172":{"tf":2.0},"183":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"188":{"tf":2.0},"189":{"tf":1.4142135623730951},"194":{"tf":1.0},"316":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"359":{"tf":1.0},"361":{"tf":1.4142135623730951},"382":{"tf":1.0},"385":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"428":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":2.23606797749979},"51":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.7320508075688772},"61":{"tf":1.4142135623730951},"62":{"tf":1.7320508075688772},"72":{"tf":1.0},"73":{"tf":1.7320508075688772},"78":{"tf":1.4142135623730951},"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"134":{"tf":1.0}}}},"i":{"df":2,"docs":{"360":{"tf":1.0},"376":{"tf":1.7320508075688772}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"355":{"tf":1.0},"357":{"tf":1.0}}}}},"o":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":7,"docs":{"125":{"tf":2.0},"167":{"tf":1.4142135623730951},"382":{"tf":1.4142135623730951},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.0}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"348":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"355":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}},"s":{"df":1,"docs":{"348":{"tf":2.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"301":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"w":{"df":1,"docs":{"378":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":7,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"405":{"tf":1.4142135623730951},"407":{"tf":2.0},"408":{"tf":2.23606797749979}}}}}},"x":{"df":4,"docs":{"360":{"tf":1.0},"37":{"tf":1.0},"381":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"y":{"df":1,"docs":{"361":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":14,"docs":{"124":{"tf":1.0},"125":{"tf":2.0},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.0}}}}},"{":{"a":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"144":{"tf":1.0}}},"c":{"df":1,"docs":{"144":{"tf":1.0}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"360":{"tf":1.4142135623730951},"69":{"tf":1.0}},"i":{"df":1,"docs":{"135":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"148":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"229":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"242":{"tf":1.7320508075688772}}}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"150":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"r":{"1":{"df":1,"docs":{"74":{"tf":1.0}}},"3":{"df":1,"docs":{"74":{"tf":1.0}}},"df":0,"docs":{}},"s":{"1":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"71":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"71":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"349":{"tf":1.0},"350":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"353":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":38,"docs":{"104":{"tf":1.0},"141":{"tf":1.0},"188":{"tf":1.7320508075688772},"206":{"tf":1.7320508075688772},"218":{"tf":1.0},"228":{"tf":1.0},"23":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"235":{"tf":1.0},"239":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"293":{"tf":1.7320508075688772},"294":{"tf":2.23606797749979},"299":{"tf":1.0},"301":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.4142135623730951},"33":{"tf":1.0},"356":{"tf":1.0},"37":{"tf":1.4142135623730951},"377":{"tf":3.872983346207417},"387":{"tf":1.0},"388":{"tf":1.0},"391":{"tf":1.0},"399":{"tf":1.0},"45":{"tf":1.0},"54":{"tf":1.0},"56":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":2.449489742783178},"78":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":3.1622776601683795},"93":{"tf":1.0}}}},"s":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"1":{"0":{"(":{"4":{"df":1,"docs":{"206":{"tf":1.0}}},"8":{"df":1,"docs":{"206":{"tf":1.0}}},"a":{"df":1,"docs":{"206":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":2.0},"116":{"tf":2.0}}}},"df":1,"docs":{"413":{"tf":1.0}}}},"o":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"102":{"tf":1.0},"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":6,"docs":{"157":{"tf":1.0},"224":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"288":{"tf":1.0},"74":{"tf":1.7320508075688772}}}}}},"c":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"392":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"390":{"tf":1.7320508075688772},"391":{"tf":1.4142135623730951},"393":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"391":{"tf":1.4142135623730951},"392":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"330":{"tf":1.4142135623730951},"387":{"tf":1.0},"390":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"1":{")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"225":{"tf":1.0}}}}}}},"df":5,"docs":{"224":{"tf":1.0},"225":{"tf":2.0},"226":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"249":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"297":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"300":{"tf":1.0},"303":{"tf":1.0}},"t":{"df":7,"docs":{"228":{"tf":2.449489742783178},"229":{"tf":2.8284271247461903},"231":{"tf":1.7320508075688772},"232":{"tf":3.4641016151377544},"249":{"tf":3.0},"250":{"tf":2.23606797749979},"53":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"l":{"df":46,"docs":{"143":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.7320508075688772},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"405":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}},"e":{".":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"255":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"155":{"tf":1.0},"255":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":9,"docs":{"19":{"tf":1.0},"2":{"tf":1.0},"237":{"tf":1.0},"296":{"tf":1.4142135623730951},"312":{"tf":1.0},"316":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.0},"47":{"tf":1.0}},"m":{"df":1,"docs":{"196":{"tf":1.0}}}}},"df":0,"docs":{}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"213":{"tf":1.0},"248":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}},"df":13,"docs":{"110":{"tf":1.0},"111":{"tf":2.0},"159":{"tf":1.4142135623730951},"198":{"tf":1.0},"21":{"tf":2.23606797749979},"214":{"tf":1.0},"26":{"tf":1.0},"32":{"tf":1.0},"391":{"tf":1.0},"395":{"tf":1.0},"397":{"tf":1.0},"49":{"tf":1.0},"61":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"436":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"”":{"df":0,"docs":{},"。":{"df":0,"docs":{},")":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"160":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"396":{"tf":1.4142135623730951},"429":{"tf":1.0}}}}},"df":1,"docs":{"15":{"tf":1.0}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"163":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":1,"docs":{"232":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"431":{"tf":1.0}},"r":{"df":1,"docs":{"368":{"tf":2.0}}}},"u":{"b":{"df":62,"docs":{"112":{"tf":1.0},"113":{"tf":2.23606797749979},"115":{"tf":2.23606797749979},"116":{"tf":3.872983346207417},"119":{"tf":3.7416573867739413},"120":{"tf":2.449489742783178},"121":{"tf":1.7320508075688772},"123":{"tf":3.4641016151377544},"127":{"tf":2.449489742783178},"128":{"tf":1.0},"129":{"tf":1.0},"167":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"179":{"tf":3.3166247903554},"180":{"tf":4.795831523312719},"181":{"tf":4.123105625617661},"182":{"tf":4.69041575982343},"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.8284271247461903},"203":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.7320508075688772},"211":{"tf":1.0},"226":{"tf":2.449489742783178},"228":{"tf":3.605551275463989},"229":{"tf":4.898979485566356},"231":{"tf":2.449489742783178},"232":{"tf":5.5677643628300215},"242":{"tf":1.0},"244":{"tf":1.0},"249":{"tf":4.898979485566356},"250":{"tf":3.7416573867739413},"257":{"tf":1.4142135623730951},"258":{"tf":4.47213595499958},"266":{"tf":1.4142135623730951},"289":{"tf":3.4641016151377544},"290":{"tf":2.0},"320":{"tf":1.7320508075688772},"331":{"tf":2.6457513110645907},"334":{"tf":3.4641016151377544},"335":{"tf":2.8284271247461903},"338":{"tf":1.4142135623730951},"339":{"tf":2.0},"340":{"tf":2.0},"341":{"tf":2.23606797749979},"342":{"tf":4.242640687119285},"343":{"tf":3.605551275463989},"368":{"tf":1.0},"374":{"tf":1.4142135623730951},"381":{"tf":1.7320508075688772},"382":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.7320508075688772},"392":{"tf":1.0},"393":{"tf":1.0},"405":{"tf":6.0},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"412":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"120":{"tf":1.0},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":8,"docs":{"256":{"tf":1.0},"260":{"tf":1.7320508075688772},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"337":{"tf":1.0},"338":{"tf":1.0},"342":{"tf":3.3166247903554},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"348":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"141":{"tf":2.0},"339":{"tf":1.0},"69":{"tf":1.0}}}}}},"df":6,"docs":{"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":2.0},"229":{"tf":1.0},"289":{"tf":1.0},"66":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"102":{"tf":1.0}}}},"y":{"df":1,"docs":{"24":{"tf":1.0}}}},"q":{"df":1,"docs":{"172":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"364":{"tf":1.0},"376":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}}}}}},"df":3,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.7320508075688772},"108":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":15,"docs":{"217":{"tf":1.7320508075688772},"218":{"tf":1.4142135623730951},"219":{"tf":1.0},"221":{"tf":2.449489742783178},"222":{"tf":2.449489742783178},"223":{"tf":2.23606797749979},"224":{"tf":3.0},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":3.1622776601683795},"229":{"tf":4.242640687119285},"231":{"tf":2.23606797749979},"232":{"tf":5.744562646538029},"249":{"tf":4.898979485566356},"250":{"tf":3.605551275463989}}},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"101":{"tf":1.7320508075688772},"274":{"tf":1.0},"359":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.7320508075688772}}},"df":1,"docs":{"391":{"tf":3.0}},"e":{":":{":":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}}}}}}}},"r":{"#":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"414":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"414":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"3":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"242":{"tf":2.0}}}}},"df":0,"docs":{}}}},"1":{"df":2,"docs":{"367":{"tf":1.7320508075688772},"74":{"tf":3.872983346207417}}},"2":{"df":2,"docs":{"367":{"tf":1.7320508075688772},"74":{"tf":3.7416573867739413}}},"3":{"df":1,"docs":{"74":{"tf":2.449489742783178}}},"\\":{"df":0,"docs":{},"n":{"df":2,"docs":{"398":{"tf":1.0},"42":{"tf":1.0}},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}}},",":{"df":0,"docs":{},"其":{"df":0,"docs":{},"中":{"\\":{"df":0,"docs":{},"r":{"df":0,"docs":{},"是":{"df":0,"docs":{},"回":{"df":0,"docs":{},"车":{"df":0,"docs":{},"符":{"df":0,"docs":{},",":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"是":{"df":0,"docs":{},"换":{"df":0,"docs":{},"行":{"df":0,"docs":{},"符":{"df":0,"docs":{},"。":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"398":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"c":{"df":0,"docs":{},"e":{"df":6,"docs":{"297":{"tf":1.0},"316":{"tf":1.7320508075688772},"321":{"tf":2.23606797749979},"322":{"tf":1.0},"323":{"tf":2.23606797749979},"74":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}},"n":{"d":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{";":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"df":9,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{")":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"1":{".":{".":{"=":{"1":{"0":{"0":{"df":9,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"124":{"tf":1.0},"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"c":{"df":0,"docs":{},"h":{"a":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":8,"docs":{"111":{"tf":1.0},"124":{"tf":2.449489742783178},"266":{"tf":4.58257569495584},"39":{"tf":1.0},"40":{"tf":4.358898943540674},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"421":{"tf":1.0}},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"322":{"tf":4.123105625617661}},"g":{"df":6,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"362":{"tf":1.7320508075688772},"41":{"tf":1.0},"62":{"tf":1.0},"78":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"417":{"tf":1.0}}}}},",":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"417":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"w":{"df":4,"docs":{"309":{"tf":1.0},"367":{"tf":1.0},"412":{"tf":1.0},"414":{"tf":1.0}}}},"b":{"df":1,"docs":{"24":{"tf":1.0}}},"c":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"284":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"a":{"df":3,"docs":{"285":{"tf":1.7320508075688772},"286":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951}}},"b":{"df":1,"docs":{"293":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"306":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"285":{"tf":2.0},"286":{"tf":1.0},"294":{"tf":1.0}},"。":{"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"285":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},",":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"285":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"294":{"tf":2.0}},"e":{"(":{"&":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"1":{"0":{"df":3,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"293":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":3,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"293":{"tf":1.0}}},"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"291":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"0":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0}}}},"o":{"d":{"df":1,"docs":{"294":{"tf":3.1622776601683795}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"5":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"a":{"df":2,"docs":{"286":{"tf":2.0},"293":{"tf":1.7320508075688772}}},"b":{"df":1,"docs":{"293":{"tf":1.4142135623730951}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"286":{"tf":1.0},"294":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"285":{"tf":2.23606797749979},"286":{"tf":2.0},"291":{"tf":1.0},"293":{"tf":3.0}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"306":{"tf":2.449489742783178},"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"294":{"tf":3.1622776601683795}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"t":{">":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"288":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"270":{"tf":1.0},"284":{"tf":2.0},"285":{"tf":2.23606797749979},"286":{"tf":2.8284271247461903},"288":{"tf":1.0},"291":{"tf":2.8284271247461903},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":3.7416573867739413},"295":{"tf":1.0},"306":{"tf":3.1622776601683795},"307":{"tf":1.7320508075688772},"309":{"tf":1.7320508075688772},"310":{"tf":1.0}}}},"df":3,"docs":{"273":{"tf":1.0},"275":{"tf":1.0},"293":{"tf":3.1622776601683795}}},"df":11,"docs":{"185":{"tf":4.58257569495584},"213":{"tf":1.0},"231":{"tf":1.0},"242":{"tf":1.0},"359":{"tf":1.4142135623730951},"367":{"tf":1.0},"368":{"tf":1.4142135623730951},"414":{"tf":1.4142135623730951},"417":{"tf":1.7320508075688772},"42":{"tf":1.0},"428":{"tf":2.449489742783178}},"e":{"a":{"d":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"35":{"tf":2.0},"36":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.4142135623730951},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"160":{"tf":2.0},"161":{"tf":2.0}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"160":{"tf":1.0},"161":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":26,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"167":{"tf":1.0},"180":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"219":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"382":{"tf":1.0},"405":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}},"i":{"df":2,"docs":{"315":{"tf":1.0},"316":{"tf":1.0}}},"m":{"df":1,"docs":{"267":{"tf":1.0}},"e":{"df":0,"docs":{},"、":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"399":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":9,"docs":{"300":{"tf":2.23606797749979},"301":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"319":{"tf":3.1622776601683795},"320":{"tf":2.8284271247461903},"405":{"tf":5.477225575051661},"407":{"tf":3.605551275463989},"408":{"tf":3.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"405":{"tf":1.4142135623730951},"407":{"tf":2.0},"408":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"405":{"tf":1.0},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"x":{"df":1,"docs":{"325":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"325":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"153":{"tf":1.0},"157":{"tf":1.0}}}}}},"t":{"1":{".":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"2":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"3":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"93":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"df":6,"docs":{"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":3.4641016151377544},"93":{"tf":1.7320508075688772},"95":{"tf":3.1622776601683795},"97":{"tf":1.7320508075688772}}},"2":{"df":2,"docs":{"95":{"tf":3.0},"97":{"tf":1.4142135623730951}}},"3":{"df":2,"docs":{"95":{"tf":2.449489742783178},"97":{"tf":1.4142135623730951}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":11,"docs":{"100":{"tf":1.4142135623730951},"199":{"tf":5.656854249492381},"242":{"tf":4.58257569495584},"88":{"tf":2.23606797749979},"89":{"tf":1.0},"90":{"tf":3.4641016151377544},"91":{"tf":4.898979485566356},"93":{"tf":4.47213595499958},"95":{"tf":4.358898943540674},"96":{"tf":2.0},"97":{"tf":2.6457513110645907}},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"90":{"tf":1.0}}}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"3":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},",":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"273":{"tf":1.7320508075688772}}}}},"v":{"df":7,"docs":{"300":{"tf":1.7320508075688772},"302":{"tf":1.0},"319":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"349":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.7320508075688772}}}},"d":{"df":3,"docs":{"239":{"tf":1.7320508075688772},"258":{"tf":2.0},"359":{"tf":1.7320508075688772}}},"df":4,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"123":{"tf":1.0},"258":{"tf":1.0}},"f":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"270":{"tf":1.0},"290":{"tf":1.7320508075688772}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"289":{"tf":2.0},"290":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.0}},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"a":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"289":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"294":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{">":{"/":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":12,"docs":{"270":{"tf":1.4142135623730951},"286":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":3.0},"289":{"tf":2.0},"290":{"tf":2.8284271247461903},"291":{"tf":3.3166247903554},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"307":{"tf":1.0},"310":{"tf":1.4142135623730951}}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"412":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":20,"docs":{"102":{"tf":2.0},"115":{"tf":1.0},"185":{"tf":1.0},"195":{"tf":1.0},"270":{"tf":1.7320508075688772},"284":{"tf":1.0},"289":{"tf":2.0},"292":{"tf":1.0},"294":{"tf":1.0},"306":{"tf":1.0},"35":{"tf":1.0},"368":{"tf":1.0},"407":{"tf":1.0},"42":{"tf":1.4142135623730951},"50":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":2.6457513110645907},"74":{"tf":1.0},"75":{"tf":1.7320508075688772},"91":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"189":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"94":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"75":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":3,"docs":{"270":{"tf":1.0},"290":{"tf":1.4142135623730951},"291":{"tf":1.0}}}},"df":1,"docs":{"290":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"353":{"tf":1.0}}}}}},"m":{"d":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"345":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":2.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"260":{"tf":1.0},"40":{"tf":1.7320508075688772}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"434":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":1,"docs":{"115":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":7,"docs":{"155":{"tf":1.0},"156":{"tf":1.0},"255":{"tf":3.1622776601683795},"267":{"tf":1.0},"28":{"tf":1.7320508075688772},"434":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":1,"docs":{"62":{"tf":3.0}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}},"v":{"df":4,"docs":{"232":{"tf":1.4142135623730951},"331":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"107":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"377":{"tf":3.4641016151377544}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"l":{"a":{"c":{"df":2,"docs":{"145":{"tf":1.0},"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":4,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":2.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"260":{"tf":1.0}}}}}}}}},"r":{"df":1,"docs":{"159":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},",":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}}}},"df":3,"docs":{"275":{"tf":1.0},"391":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"401":{"tf":2.449489742783178},"402":{"tf":1.4142135623730951},"404":{"tf":1.7320508075688772},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"341":{"tf":1.7320508075688772},"342":{"tf":3.4641016151377544},"343":{"tf":1.0}}}}}}},"df":3,"docs":{"341":{"tf":3.1622776601683795},"342":{"tf":1.7320508075688772},"343":{"tf":2.8284271247461903}}}}}}}}},"df":4,"docs":{"396":{"tf":1.0},"398":{"tf":2.0},"401":{"tf":1.0},"437":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":17,"docs":{"142":{"tf":1.4142135623730951},"273":{"tf":1.0},"299":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":4.795831523312719},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"335":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"377":{"tf":2.23606797749979}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"107":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"n":{"df":8,"docs":{"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"398":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"260":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":9,"docs":{"316":{"tf":1.4142135623730951},"396":{"tf":1.0},"399":{"tf":1.7320508075688772},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}}}}},"t":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"114":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"120":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"189":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"157":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"<":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"160":{"tf":1.0},"161":{"tf":1.7320508075688772},"398":{"tf":1.0}}}}},"t":{"df":13,"docs":{"153":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"158":{"tf":1.7320508075688772},"160":{"tf":1.0},"162":{"tf":2.0},"169":{"tf":1.0},"174":{"tf":1.0},"203":{"tf":2.449489742783178},"224":{"tf":1.0},"225":{"tf":1.0},"300":{"tf":1.7320508075688772},"381":{"tf":2.6457513110645907},"397":{"tf":1.0}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"405":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"8":{"df":1,"docs":{"348":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}},"df":58,"docs":{"121":{"tf":2.0},"122":{"tf":1.7320508075688772},"156":{"tf":1.0},"157":{"tf":3.3166247903554},"159":{"tf":1.4142135623730951},"160":{"tf":1.7320508075688772},"161":{"tf":1.7320508075688772},"162":{"tf":4.58257569495584},"163":{"tf":2.0},"165":{"tf":2.23606797749979},"166":{"tf":1.4142135623730951},"168":{"tf":2.0},"170":{"tf":2.0},"172":{"tf":2.8284271247461903},"174":{"tf":1.7320508075688772},"186":{"tf":2.0},"188":{"tf":4.123105625617661},"189":{"tf":3.0},"194":{"tf":1.4142135623730951},"198":{"tf":3.0},"199":{"tf":2.23606797749979},"200":{"tf":2.23606797749979},"201":{"tf":2.449489742783178},"202":{"tf":2.0},"203":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.6457513110645907},"208":{"tf":2.23606797749979},"210":{"tf":1.4142135623730951},"211":{"tf":3.1622776601683795},"224":{"tf":3.1622776601683795},"225":{"tf":2.8284271247461903},"226":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":3.3166247903554},"231":{"tf":1.7320508075688772},"232":{"tf":5.656854249492381},"246":{"tf":1.0},"249":{"tf":4.58257569495584},"250":{"tf":3.1622776601683795},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"306":{"tf":1.0},"316":{"tf":1.4142135623730951},"318":{"tf":1.0},"323":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"349":{"tf":1.0},"36":{"tf":3.605551275463989},"381":{"tf":3.1622776601683795},"391":{"tf":1.0},"398":{"tf":1.4142135623730951},"401":{"tf":1.0},"405":{"tf":1.0},"42":{"tf":2.0},"45":{"tf":1.4142135623730951},"62":{"tf":2.449489742783178}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":24,"docs":{"160":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":2.23606797749979},"186":{"tf":1.0},"189":{"tf":1.4142135623730951},"191":{"tf":1.0},"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":2.0},"250":{"tf":1.7320508075688772},"316":{"tf":1.0},"368":{"tf":1.0},"386":{"tf":2.0},"398":{"tf":1.0},"412":{"tf":1.0},"58":{"tf":2.0},"75":{"tf":2.449489742783178},"77":{"tf":2.23606797749979},"78":{"tf":2.0}},"s":{"_":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"386":{"tf":2.23606797749979}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"381":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"182":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"182":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":2.0}}}}}}},"u":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"f":{"c":{"df":1,"docs":{"437":{"tf":2.23606797749979}}},"df":0,"docs":{}},"g":{"b":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"359":{"tf":1.0}}},"df":1,"docs":{"267":{"tf":1.7320508075688772}}},"h":{"df":1,"docs":{"375":{"tf":3.1622776601683795}},"s":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"375":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"434":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"(":{"b":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":11,"docs":{"198":{"tf":2.449489742783178},"200":{"tf":2.449489742783178},"203":{"tf":1.4142135623730951},"206":{"tf":2.0},"208":{"tf":1.4142135623730951},"210":{"tf":2.0},"228":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"323":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"375":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"213":{"tf":1.0}}}},"p":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"213":{"tf":1.0},"267":{"tf":2.8284271247461903}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"124":{"tf":1.0},"41":{"tf":1.0}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"111":{"tf":1.0},"115":{"tf":1.0},"412":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"392":{"tf":1.4142135623730951}},"e":{"(":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"392":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"392":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"v":{"4":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772}}},"6":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"w":{"df":1,"docs":{"136":{"tf":1.0}}}},"s":{"df":2,"docs":{"22":{"tf":1.0},"24":{"tf":1.0}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"61":{"tf":1.0}}},"y":{"df":0,"docs":{},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}},",":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},",":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"179":{"tf":1.0},"191":{"tf":1.0},"378":{"tf":1.0}}}},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":8,"docs":{"225":{"tf":2.8284271247461903},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":101,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.7320508075688772},"155":{"tf":1.7320508075688772},"156":{"tf":2.449489742783178},"157":{"tf":1.7320508075688772},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":3.1622776601683795},"199":{"tf":3.0},"200":{"tf":2.449489742783178},"201":{"tf":2.449489742783178},"202":{"tf":2.8284271247461903},"204":{"tf":1.4142135623730951},"206":{"tf":2.449489742783178},"207":{"tf":2.6457513110645907},"208":{"tf":2.449489742783178},"211":{"tf":4.0},"214":{"tf":1.0},"216":{"tf":2.0},"217":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"220":{"tf":1.4142135623730951},"224":{"tf":2.8284271247461903},"225":{"tf":4.123105625617661},"226":{"tf":2.23606797749979},"228":{"tf":1.7320508075688772},"229":{"tf":3.872983346207417},"232":{"tf":3.4641016151377544},"234":{"tf":1.0},"235":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"241":{"tf":2.0},"242":{"tf":1.7320508075688772},"246":{"tf":1.4142135623730951},"257":{"tf":1.0},"266":{"tf":3.3166247903554},"27":{"tf":2.8284271247461903},"273":{"tf":1.0},"277":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":2.23606797749979},"285":{"tf":1.0},"286":{"tf":1.4142135623730951},"289":{"tf":1.0},"290":{"tf":1.7320508075688772},"291":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"316":{"tf":2.23606797749979},"319":{"tf":1.4142135623730951},"32":{"tf":2.0},"320":{"tf":1.0},"334":{"tf":1.7320508075688772},"335":{"tf":2.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.0},"353":{"tf":1.7320508075688772},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":2.6457513110645907},"377":{"tf":1.0},"38":{"tf":1.7320508075688772},"391":{"tf":1.0},"397":{"tf":1.7320508075688772},"398":{"tf":1.4142135623730951},"400":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.0},"408":{"tf":1.7320508075688772},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"49":{"tf":2.0},"51":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"56":{"tf":2.23606797749979},"57":{"tf":1.0},"58":{"tf":1.7320508075688772},"61":{"tf":3.1622776601683795},"62":{"tf":2.449489742783178},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.7320508075688772},"91":{"tf":2.449489742783178}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"314":{"tf":1.0}},"e":{"df":0,"docs":{},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"特":{"df":0,"docs":{},"别":{"df":0,"docs":{},"是":{"df":0,"docs":{},"(":{"df":0,"docs":{},"但":{"df":0,"docs":{},"不":{"df":0,"docs":{},"仅":{"df":0,"docs":{},"是":{"df":0,"docs":{},"!":{"df":0,"docs":{},")":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"b":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"\"":{"df":0,"docs":{},"、":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"\"":{"df":0,"docs":{},"、":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"365":{"tf":1.0},"432":{"tf":1.0}}},"df":0,"docs":{}}},"<":{"/":{"df":0,"docs":{},"p":{"df":1,"docs":{"400":{"tf":1.0}}}},"df":0,"docs":{}},"_":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":2,"docs":{"156":{"tf":1.7320508075688772},"224":{"tf":1.0}},"e":{"=":{"1":{"df":15,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{":":{":":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"335":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"a":{"c":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":14,"docs":{"111":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"145":{"tf":1.0},"159":{"tf":1.0},"222":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.0},"40":{"tf":1.0},"409":{"tf":1.0},"49":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}},"s":{"df":0,"docs":{},"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"9":{"0":{"c":{"d":{"a":{"1":{"9":{"6":{"9":{"3":{"8":{"3":{"df":0,"docs":{},"f":{"5":{"6":{"a":{"2":{"6":{"3":{"7":{"c":{"b":{"d":{"3":{"0":{"3":{"7":{"b":{"d":{"df":0,"docs":{},"f":{"5":{"9":{"8":{"8":{"4":{"1":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"8":{"3":{"9":{":":{"8":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"5":{"7":{"4":{":":{"1":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"5":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":58,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"111":{"tf":1.4142135623730951},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"17":{"tf":1.4142135623730951},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"22":{"tf":1.4142135623730951},"228":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"29":{"tf":1.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"426":{"tf":1.0},"434":{"tf":1.0},"436":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}},"d":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}}},"df":262,"docs":{"0":{"tf":2.6457513110645907},"1":{"tf":3.4641016151377544},"10":{"tf":4.58257569495584},"100":{"tf":1.0},"102":{"tf":3.0},"103":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":2.0},"108":{"tf":1.0},"109":{"tf":1.4142135623730951},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"115":{"tf":2.23606797749979},"116":{"tf":1.0},"12":{"tf":1.7320508075688772},"121":{"tf":1.7320508075688772},"124":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"13":{"tf":3.0},"130":{"tf":1.4142135623730951},"132":{"tf":2.23606797749979},"133":{"tf":1.0},"134":{"tf":1.4142135623730951},"136":{"tf":1.7320508075688772},"138":{"tf":1.0},"139":{"tf":2.0},"142":{"tf":3.1622776601683795},"143":{"tf":1.4142135623730951},"145":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"153":{"tf":1.7320508075688772},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":2.23606797749979},"157":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.4142135623730951},"161":{"tf":1.0},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":2.0},"172":{"tf":1.4142135623730951},"176":{"tf":2.0},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"181":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":2.6457513110645907},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":2.0},"189":{"tf":1.0},"191":{"tf":3.1622776601683795},"192":{"tf":1.0},"195":{"tf":1.4142135623730951},"196":{"tf":1.7320508075688772},"197":{"tf":1.4142135623730951},"198":{"tf":2.449489742783178},"2":{"tf":2.23606797749979},"20":{"tf":2.449489742783178},"200":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"210":{"tf":1.7320508075688772},"211":{"tf":2.0},"212":{"tf":1.4142135623730951},"213":{"tf":1.7320508075688772},"215":{"tf":1.0},"216":{"tf":1.4142135623730951},"219":{"tf":1.0},"22":{"tf":2.0},"220":{"tf":1.0},"222":{"tf":1.4142135623730951},"225":{"tf":1.0},"228":{"tf":2.23606797749979},"229":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"231":{"tf":2.449489742783178},"232":{"tf":4.0},"236":{"tf":1.4142135623730951},"237":{"tf":2.23606797749979},"238":{"tf":1.0},"24":{"tf":2.23606797749979},"243":{"tf":1.0},"249":{"tf":3.0},"25":{"tf":2.23606797749979},"250":{"tf":2.0},"251":{"tf":1.0},"252":{"tf":2.23606797749979},"253":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"256":{"tf":1.0},"257":{"tf":1.7320508075688772},"26":{"tf":1.4142135623730951},"260":{"tf":1.4142135623730951},"261":{"tf":1.0},"267":{"tf":2.23606797749979},"269":{"tf":1.4142135623730951},"270":{"tf":2.0},"273":{"tf":2.6457513110645907},"274":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"280":{"tf":1.7320508075688772},"281":{"tf":2.449489742783178},"282":{"tf":1.7320508075688772},"283":{"tf":3.605551275463989},"284":{"tf":1.0},"285":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":2.449489742783178},"289":{"tf":1.4142135623730951},"29":{"tf":1.0},"292":{"tf":1.7320508075688772},"293":{"tf":2.0},"295":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":2.8284271247461903},"3":{"tf":1.4142135623730951},"30":{"tf":2.23606797749979},"300":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"307":{"tf":1.7320508075688772},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"311":{"tf":1.0},"312":{"tf":2.0},"313":{"tf":1.0},"314":{"tf":1.7320508075688772},"315":{"tf":2.6457513110645907},"316":{"tf":4.358898943540674},"318":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":1.0},"324":{"tf":1.7320508075688772},"328":{"tf":2.449489742783178},"329":{"tf":1.0},"33":{"tf":1.0},"330":{"tf":1.0},"331":{"tf":1.0},"332":{"tf":2.449489742783178},"333":{"tf":1.0},"334":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951},"336":{"tf":1.0},"337":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"341":{"tf":1.0},"343":{"tf":2.449489742783178},"344":{"tf":2.0},"345":{"tf":1.0},"346":{"tf":1.0},"348":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":2.0},"358":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":2.23606797749979},"361":{"tf":1.0},"363":{"tf":1.7320508075688772},"364":{"tf":2.23606797749979},"365":{"tf":3.872983346207417},"366":{"tf":1.7320508075688772},"367":{"tf":2.0},"368":{"tf":4.358898943540674},"369":{"tf":2.23606797749979},"371":{"tf":1.4142135623730951},"373":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":3.3166247903554},"378":{"tf":1.0},"379":{"tf":1.0},"381":{"tf":1.0},"382":{"tf":2.23606797749979},"383":{"tf":2.0},"387":{"tf":1.0},"388":{"tf":1.4142135623730951},"389":{"tf":3.0},"39":{"tf":1.4142135623730951},"390":{"tf":1.4142135623730951},"391":{"tf":4.358898943540674},"393":{"tf":1.0},"394":{"tf":1.0},"395":{"tf":1.7320508075688772},"397":{"tf":1.0},"4":{"tf":2.449489742783178},"40":{"tf":2.0},"402":{"tf":1.0},"405":{"tf":1.7320508075688772},"409":{"tf":1.7320508075688772},"410":{"tf":1.0},"411":{"tf":1.0},"413":{"tf":1.0},"414":{"tf":1.0},"415":{"tf":1.0},"416":{"tf":1.0},"42":{"tf":3.3166247903554},"425":{"tf":1.4142135623730951},"426":{"tf":1.7320508075688772},"427":{"tf":1.4142135623730951},"428":{"tf":1.4142135623730951},"429":{"tf":2.449489742783178},"430":{"tf":4.358898943540674},"432":{"tf":1.7320508075688772},"433":{"tf":1.7320508075688772},"434":{"tf":4.123105625617661},"436":{"tf":2.6457513110645907},"437":{"tf":2.8284271247461903},"46":{"tf":1.7320508075688772},"47":{"tf":2.0},"48":{"tf":1.4142135623730951},"49":{"tf":2.0},"5":{"tf":1.4142135623730951},"50":{"tf":1.0},"52":{"tf":1.7320508075688772},"53":{"tf":4.358898943540674},"54":{"tf":2.6457513110645907},"55":{"tf":2.0},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.4142135623730951},"59":{"tf":1.4142135623730951},"6":{"tf":1.0},"61":{"tf":2.449489742783178},"62":{"tf":2.449489742783178},"64":{"tf":2.0},"65":{"tf":1.7320508075688772},"66":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.7320508075688772},"70":{"tf":4.123105625617661},"71":{"tf":1.0},"74":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951},"77":{"tf":1.0},"78":{"tf":1.7320508075688772},"8":{"tf":2.6457513110645907},"80":{"tf":1.7320508075688772},"81":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"91":{"tf":1.4142135623730951},"93":{"tf":1.7320508075688772},"94":{"tf":2.23606797749979},"98":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"427":{"tf":1.4142135623730951}}}},"m":{"df":0,"docs":{},"t":{"df":3,"docs":{"23":{"tf":1.0},"4":{"tf":1.0},"426":{"tf":2.6457513110645907}},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"134":{"tf":1.0},"295":{"tf":1.0},"311":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"267":{"tf":1.0}}}},"df":10,"docs":{"0":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"18":{"tf":2.0},"19":{"tf":1.0},"30":{"tf":1.0},"426":{"tf":1.0},"428":{"tf":1.0},"436":{"tf":2.8284271247461903}}}},"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"v":{":":{"9":{"9":{".":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"x":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"319":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"300":{"tf":1.0},"301":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"319":{"tf":1.7320508075688772},"349":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"319":{"tf":1.7320508075688772},"320":{"tf":3.3166247903554}}}}}},"df":8,"docs":{"300":{"tf":2.23606797749979},"301":{"tf":1.0},"302":{"tf":1.7320508075688772},"303":{"tf":1.4142135623730951},"319":{"tf":3.0},"320":{"tf":2.449489742783178},"325":{"tf":1.7320508075688772},"349":{"tf":1.0}}},"y":{"b":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}}},"s":{".":{"a":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":3,"docs":{"191":{"tf":1.0},"77":{"tf":2.23606797749979},"78":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"77":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"72":{"tf":1.0},"73":{"tf":1.7320508075688772},"77":{"tf":2.449489742783178},"78":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"'":{"df":0,"docs":{},"l":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"69":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"247":{"tf":1.0}}}}}}},"1":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"2":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"[":{"0":{"df":1,"docs":{"142":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":6,"docs":{"141":{"tf":3.3166247903554},"142":{"tf":1.0},"383":{"tf":1.4142135623730951},"70":{"tf":4.69041575982343},"72":{"tf":2.0},"73":{"tf":3.1622776601683795}}},"2":{"df":4,"docs":{"141":{"tf":4.358898943540674},"383":{"tf":1.4142135623730951},"70":{"tf":4.0},"72":{"tf":2.449489742783178}},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}}}},"3":{"df":2,"docs":{"141":{"tf":2.6457513110645907},"72":{"tf":1.7320508075688772}}},"[":{".":{".":{"2":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"2":{"df":1,"docs":{"78":{"tf":1.0}}},"5":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":2.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"78":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"78":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"78":{"tf":1.0}}},"6":{".":{".":{"1":{"1":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":8,"docs":{"102":{"tf":1.0},"228":{"tf":2.0},"229":{"tf":2.0},"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},")":{"df":0,"docs":{},";":{"df":0,"docs":{},"编":{"df":0,"docs":{},"译":{"df":0,"docs":{},"器":{"df":0,"docs":{},"也":{"df":0,"docs":{},"指":{"df":0,"docs":{},"出":{"df":0,"docs":{},"了":{"df":0,"docs":{},"原":{"df":0,"docs":{},"因":{"df":0,"docs":{},":":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"257":{"tf":1.0}}}}}},"l":{"a":{"d":{"df":3,"docs":{"119":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"343":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"152":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"320":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":2.0}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"335":{"tf":1.0},"52":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"359":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"91":{"tf":2.23606797749979}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"343":{"tf":1.4142135623730951},"434":{"tf":1.0}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":11,"docs":{"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"120":{"tf":1.0},"137":{"tf":1.0},"286":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"51":{"tf":1.4142135623730951},"68":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"147":{"tf":1.0},"148":{"tf":2.449489742783178},"150":{"tf":1.7320508075688772}},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"\"":{")":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"5":{"0":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"\"":{")":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"5":{"0":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"0":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"150":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"147":{"tf":1.0},"148":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}}}},"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"334":{"tf":1.4142135623730951}}}},"df":2,"docs":{"334":{"tf":3.3166247903554},"335":{"tf":4.0}}}}}}},"df":20,"docs":{"140":{"tf":2.23606797749979},"141":{"tf":3.1622776601683795},"143":{"tf":1.7320508075688772},"183":{"tf":1.0},"191":{"tf":1.0},"193":{"tf":1.0},"240":{"tf":1.4142135623730951},"252":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"360":{"tf":2.8284271247461903},"68":{"tf":3.0},"69":{"tf":1.4142135623730951},"70":{"tf":2.23606797749979},"71":{"tf":2.6457513110645907},"72":{"tf":1.0},"73":{"tf":2.8284271247461903},"74":{"tf":5.196152422706632},"75":{"tf":3.605551275463989},"77":{"tf":2.23606797749979},"78":{"tf":3.872983346207417}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"229":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"228":{"tf":1.7320508075688772},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"<":{"'":{"a":{">":{"(":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"231":{"tf":1.4142135623730951},"232":{"tf":2.6457513110645907},"250":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"232":{"tf":1.7320508075688772},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"<":{"'":{"a":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"213":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"225":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":2.8284271247461903},"229":{"tf":3.3166247903554},"231":{"tf":1.4142135623730951},"232":{"tf":2.0},"248":{"tf":1.0},"250":{"tf":2.0},"252":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"214":{"tf":1.0}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":3,"docs":{"27":{"tf":2.0},"398":{"tf":2.0},"40":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"(":{"df":2,"docs":{"77":{"tf":1.0},"78":{"tf":1.0}}},"df":2,"docs":{"77":{"tf":1.0},"78":{"tf":1.0}}},"df":0,"docs":{}}}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}}}},"df":8,"docs":{"187":{"tf":1.4142135623730951},"318":{"tf":3.872983346207417},"322":{"tf":1.4142135623730951},"323":{"tf":2.0},"360":{"tf":2.6457513110645907},"368":{"tf":1.0},"54":{"tf":1.4142135623730951},"74":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":9,"docs":{"124":{"tf":1.4142135623730951},"125":{"tf":2.0},"167":{"tf":1.0},"382":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"42":{"tf":3.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"df":10,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"259":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":6,"docs":{"142":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.4142135623730951},"273":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":2,"docs":{"333":{"tf":1.4142135623730951},"335":{"tf":3.1622776601683795}}}}},"df":3,"docs":{"15":{"tf":1.0},"316":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}},"f":{".":{"0":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"378":{"tf":1.0}}}}}}},"df":3,"docs":{"280":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"378":{"tf":1.4142135623730951}}},"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951},"343":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":5,"docs":{"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"374":{"tf":1.4142135623730951}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":4,"docs":{"199":{"tf":2.0},"93":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}}}}}}},"i":{"df":4,"docs":{"183":{"tf":1.4142135623730951},"375":{"tf":1.0},"377":{"tf":1.0},"94":{"tf":1.0}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"331":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"331":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"331":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"o":{"c":{"df":3,"docs":{"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"x":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"239":{"tf":2.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"405":{"tf":1.7320508075688772},"407":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"289":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"289":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"239":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"341":{"tf":1.4142135623730951},"342":{"tf":2.449489742783178}},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"342":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"341":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"180":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"377":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"179":{"tf":1.0},"180":{"tf":1.7320508075688772},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"167":{"tf":1.0},"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"199":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"x":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"(":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":5,"docs":{"175":{"tf":1.7320508075688772},"183":{"tf":1.4142135623730951},"375":{"tf":1.0},"377":{"tf":1.0},"94":{"tf":1.0}}},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"(":{"2":{")":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"175":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"244":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"375":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"417":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"280":{"tf":1.0}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":37,"docs":{"101":{"tf":1.4142135623730951},"125":{"tf":1.0},"141":{"tf":1.4142135623730951},"167":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":1.0},"183":{"tf":1.7320508075688772},"191":{"tf":2.0},"192":{"tf":2.23606797749979},"239":{"tf":1.0},"242":{"tf":1.0},"244":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":2.0},"289":{"tf":3.1622776601683795},"290":{"tf":1.0},"293":{"tf":1.4142135623730951},"331":{"tf":1.7320508075688772},"339":{"tf":1.4142135623730951},"340":{"tf":1.0},"341":{"tf":2.8284271247461903},"342":{"tf":4.898979485566356},"343":{"tf":2.23606797749979},"374":{"tf":1.7320508075688772},"375":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"381":{"tf":3.4641016151377544},"382":{"tf":1.0},"407":{"tf":2.449489742783178},"408":{"tf":1.7320508075688772},"412":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":4.242640687119285},"94":{"tf":1.0},"95":{"tf":1.7320508075688772},"96":{"tf":2.0}},"、":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"115":{"tf":1.0}}}}}},")":{"df":0,"docs":{},"或":{"df":0,"docs":{},"者":{"df":0,"docs":{},"是":{"df":0,"docs":{},"获":{"df":0,"docs":{},"取":{"df":0,"docs":{},"所":{"df":0,"docs":{},"有":{"df":0,"docs":{},"权":{"df":0,"docs":{},"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"事":{"df":0,"docs":{},"实":{"df":0,"docs":{},"上":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"94":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"做":{"df":0,"docs":{},"出":{"df":0,"docs":{},"修":{"df":0,"docs":{},"改":{"df":0,"docs":{},"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"58":{"tf":1.0}}}}}}},"df":1,"docs":{"391":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"n":{"d":{"(":{"\"":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}},"df":0,"docs":{}}},"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"289":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"289":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"289":{"tf":2.6457513110645907},"290":{"tf":1.0},"296":{"tf":1.0},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"306":{"tf":2.23606797749979},"307":{"tf":1.0},"308":{"tf":1.4142135623730951},"309":{"tf":3.1622776601683795},"310":{"tf":1.7320508075688772},"311":{"tf":2.23606797749979},"319":{"tf":1.0},"370":{"tf":2.23606797749979},"381":{"tf":2.23606797749979},"405":{"tf":4.58257569495584},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"405":{"tf":4.358898943540674},"407":{"tf":3.4641016151377544},"408":{"tf":4.0}}}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"306":{"tf":1.7320508075688772}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"114":{"tf":2.0}},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"395":{"tf":1.0}}},"df":0,"docs":{}}},"df":15,"docs":{"111":{"tf":1.0},"260":{"tf":1.0},"316":{"tf":1.0},"395":{"tf":2.6457513110645907},"396":{"tf":2.449489742783178},"397":{"tf":1.7320508075688772},"400":{"tf":1.7320508075688772},"401":{"tf":1.4142135623730951},"402":{"tf":1.7320508075688772},"403":{"tf":2.0},"404":{"tf":2.449489742783178},"405":{"tf":3.1622776601683795},"406":{"tf":1.0},"408":{"tf":2.6457513110645907},"429":{"tf":1.4142135623730951}}}},"i":{"c":{"df":1,"docs":{"151":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"289":{"tf":2.0}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":2,"docs":{"360":{"tf":1.0},"436":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"360":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"211":{"tf":2.449489742783178}}}}}},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"70":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":4,"docs":{"296":{"tf":1.0},"300":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951},"306":{"tf":2.449489742783178}}}}},"df":1,"docs":{"15":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":4,"docs":{"115":{"tf":1.0},"232":{"tf":1.0},"234":{"tf":1.0},"24":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":1,"docs":{"239":{"tf":2.449489742783178}}}}}}},"df":1,"docs":{"239":{"tf":2.0}}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}},"o":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"247":{"tf":2.0}},"e":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"247":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"247":{"tf":2.8284271247461903}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":1,"docs":{"247":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"247":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"416":{"tf":1.4142135623730951}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"83":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"197":{"tf":1.0},"202":{"tf":3.605551275463989},"203":{"tf":1.0}},"i":{"c":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"202":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":3,"docs":{"196":{"tf":1.4142135623730951},"206":{"tf":2.0},"24":{"tf":1.0}},"n":{"df":1,"docs":{"106":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"406":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"408":{"tf":3.3166247903554}}}}},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"114":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"375":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"82":{"tf":2.8284271247461903},"83":{"tf":1.4142135623730951},"84":{"tf":2.8284271247461903},"87":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"186":{"tf":1.0},"228":{"tf":1.0}}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"328":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":4,"docs":{"300":{"tf":1.0},"303":{"tf":1.0},"396":{"tf":1.0},"405":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"398":{"tf":1.0}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"240":{"tf":1.0}}}}},"x":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"54":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":5,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.7320508075688772},"105":{"tf":2.0},"106":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"z":{"df":0,"docs":{},"e":{"d":{">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"247":{"tf":2.449489742783178},"273":{"tf":1.0},"334":{"tf":1.0},"383":{"tf":2.8284271247461903},"386":{"tf":1.4142135623730951},"405":{"tf":5.0},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178},"417":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"318":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":2.8284271247461903},"323":{"tf":1.0},"404":{"tf":2.23606797749979},"405":{"tf":2.6457513110645907},"408":{"tf":1.4142135623730951}}}}},"i":{"c":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"368":{"tf":1.0}}}}},"r":{"df":1,"docs":{"368":{"tf":1.0}}}},"df":1,"docs":{"368":{"tf":2.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":39,"docs":{"139":{"tf":2.23606797749979},"141":{"tf":2.0},"143":{"tf":2.23606797749979},"145":{"tf":1.4142135623730951},"150":{"tf":1.0},"162":{"tf":2.0},"170":{"tf":1.7320508075688772},"172":{"tf":2.23606797749979},"175":{"tf":1.0},"186":{"tf":2.6457513110645907},"188":{"tf":1.4142135623730951},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":2.0},"194":{"tf":1.0},"222":{"tf":1.0},"224":{"tf":1.4142135623730951},"228":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"242":{"tf":2.0},"249":{"tf":2.449489742783178},"252":{"tf":1.0},"281":{"tf":2.0},"340":{"tf":1.4142135623730951},"341":{"tf":1.0},"342":{"tf":1.0},"368":{"tf":5.291502622129181},"369":{"tf":1.0},"383":{"tf":1.7320508075688772},"389":{"tf":1.0},"404":{"tf":1.0},"417":{"tf":1.0},"422":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":2.23606797749979},"78":{"tf":6.557438524302},"79":{"tf":2.449489742783178},"80":{"tf":1.0},"87":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"[":{"_":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"这":{"df":0,"docs":{},"也":{"df":0,"docs":{},"就":{"df":0,"docs":{},"是":{"df":0,"docs":{},"为":{"df":0,"docs":{},"什":{"df":0,"docs":{},"么":{"df":0,"docs":{},"字":{"df":0,"docs":{},"符":{"df":0,"docs":{},"串":{"df":0,"docs":{},"字":{"df":0,"docs":{},"面":{"df":0,"docs":{},"值":{"df":0,"docs":{},"是":{"df":0,"docs":{},"不":{"df":0,"docs":{},"可":{"df":0,"docs":{},"变":{"df":0,"docs":{},"的":{"df":0,"docs":{},";":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"78":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}},",":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"w":{"(":{"\"":{"a":{"df":1,"docs":{"322":{"tf":3.0}}},"b":{"df":1,"docs":{"322":{"tf":3.4641016151377544}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}},"df":0,"docs":{}}},"df":3,"docs":{"321":{"tf":1.4142135623730951},"322":{"tf":2.8284271247461903},"323":{"tf":1.7320508075688772}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}}},"_":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"199":{"tf":2.23606797749979}}}}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":50,"docs":{"101":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"125":{"tf":2.0},"167":{"tf":1.4142135623730951},"183":{"tf":1.0},"199":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":2.0},"226":{"tf":2.0},"232":{"tf":1.0},"249":{"tf":1.7320508075688772},"257":{"tf":1.0},"258":{"tf":2.0},"260":{"tf":1.0},"266":{"tf":1.4142135623730951},"267":{"tf":1.0},"289":{"tf":1.0},"303":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"323":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":2.8284271247461903},"343":{"tf":1.0},"374":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.7320508075688772},"383":{"tf":1.7320508075688772},"391":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.4142135623730951},"404":{"tf":1.7320508075688772},"405":{"tf":4.58257569495584},"407":{"tf":1.0},"408":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"395":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"260":{"tf":1.0},"330":{"tf":1.0},"434":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"(":{"&":{"1":{"df":1,"docs":{"244":{"tf":1.0}}},"2":{"df":1,"docs":{"244":{"tf":1.0}}},"3":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"134":{"tf":1.0}}}}},"'":{"d":{"df":1,"docs":{"162":{"tf":1.0}}},"df":1,"docs":{"102":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"360":{"tf":1.0}}},"df":0,"docs":{}},"3":{"df":0,"docs":{},"u":{"8":{"df":1,"docs":{"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"4":{"df":1,"docs":{"361":{"tf":1.4142135623730951}}},"5":{".":{"0":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"0":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}}},"df":7,"docs":{"102":{"tf":1.4142135623730951},"105":{"tf":2.6457513110645907},"106":{"tf":1.0},"176":{"tf":1.0},"356":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"361":{"tf":1.7320508075688772}}},"_":{"df":1,"docs":{"360":{"tf":2.0}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":5,"docs":{"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"348":{"tf":1.0}}}}}}},"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":2.449489742783178}},"f":{"6":{"4":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"3":{"2":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"105":{"tf":3.0},"106":{"tf":2.0},"347":{"tf":1.7320508075688772},"356":{"tf":1.0},"361":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"x":{")":{"df":0,"docs":{},",":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":1,"docs":{"108":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":1,"docs":{"361":{"tf":1.4142135623730951}},"o":{"d":{"df":1,"docs":{"294":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"239":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"s":{".":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"374":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":4,"docs":{"102":{"tf":1.7320508075688772},"105":{"tf":1.0},"174":{"tf":1.0},"382":{"tf":1.0}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"319":{"tf":2.0},"320":{"tf":2.6457513110645907},"324":{"tf":2.23606797749979},"331":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"382":{"tf":1.0}}},"x":{"df":3,"docs":{"242":{"tf":1.0},"353":{"tf":3.1622776601683795},"361":{"tf":2.0}}}},"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"390":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"71":{"tf":1.4142135623730951}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"390":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"353":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":4,"docs":{"71":{"tf":1.4142135623730951},"72":{"tf":2.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"73":{"tf":1.4142135623730951},"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.4142135623730951},"235":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"194":{"tf":1.0}}},"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"87":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"df":5,"docs":{"229":{"tf":1.0},"268":{"tf":1.4142135623730951},"59":{"tf":1.0},"61":{"tf":1.4142135623730951},"94":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"1":{"2":{"3":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},",":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"242":{"tf":3.1622776601683795}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"242":{"tf":1.4142135623730951}},"e":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":1,"docs":{"242":{"tf":2.0}}}}}}},"df":1,"docs":{"242":{"tf":1.0}}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"51":{"tf":3.0}},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"51":{"tf":1.7320508075688772}}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"51":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":1,"docs":{"391":{"tf":1.0}}},"w":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"f":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}},"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"318":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":3,"docs":{"298":{"tf":5.196152422706632},"306":{"tf":1.0},"405":{"tf":1.7320508075688772}}}}},"d":{"df":0,"docs":{},"x":{"df":1,"docs":{"260":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"376":{"tf":2.0}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"211":{"tf":1.0}},"i":{"df":5,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"376":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"368":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":1,"docs":{"368":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"376":{"tf":1.4142135623730951}},"。":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"376":{"tf":1.0}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"136":{"tf":1.0},"333":{"tf":1.0}},"l":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"(":{"1":{"0":{".":{"1":{"2":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"3":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"136":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"q":{"df":1,"docs":{"96":{"tf":1.4142135623730951}},"l":{"!":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"393":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"393":{"tf":1.0}}}}}}}},"df":1,"docs":{"393":{"tf":2.0}}},"u":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"88":{"tf":1.7320508075688772},"89":{"tf":1.0},"90":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"c":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"111":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"127":{"tf":2.6457513110645907},"128":{"tf":1.0}}}},"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"127":{"tf":1.0},"128":{"tf":1.0}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":2.0}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.4142135623730951}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":64,"docs":{"111":{"tf":1.7320508075688772},"113":{"tf":1.0},"114":{"tf":1.7320508075688772},"115":{"tf":1.0},"116":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"128":{"tf":1.0},"167":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"191":{"tf":1.0},"198":{"tf":3.0},"199":{"tf":2.6457513110645907},"200":{"tf":1.7320508075688772},"201":{"tf":1.7320508075688772},"202":{"tf":2.23606797749979},"206":{"tf":1.7320508075688772},"207":{"tf":2.0},"208":{"tf":1.7320508075688772},"210":{"tf":1.4142135623730951},"211":{"tf":2.23606797749979},"221":{"tf":1.0},"226":{"tf":2.6457513110645907},"227":{"tf":1.0},"228":{"tf":2.0},"229":{"tf":2.23606797749979},"231":{"tf":1.0},"232":{"tf":2.449489742783178},"244":{"tf":1.0},"245":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":2.0},"250":{"tf":1.4142135623730951},"257":{"tf":2.449489742783178},"258":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"289":{"tf":1.7320508075688772},"290":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"334":{"tf":2.0},"335":{"tf":1.0},"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"374":{"tf":1.0},"375":{"tf":1.0},"389":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.4142135623730951},"405":{"tf":3.605551275463989},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"s":{":":{"1":{"1":{":":{"9":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"1":{"3":{"df":1,"docs":{"202":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":2,"docs":{"200":{"tf":1.0},"201":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"9":{"df":1,"docs":{"198":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"9":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"2":{"5":{"df":1,"docs":{"386":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"6":{":":{"4":{"2":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"5":{"1":{"df":1,"docs":{"228":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"199":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"5":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{":":{"9":{"df":1,"docs":{"116":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"4":{":":{"9":{"df":1,"docs":{"228":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"3":{"3":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"5":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"5":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"2":{":":{"1":{"3":{"df":1,"docs":{"407":{"tf":1.0}}},"df":0,"docs":{}},"2":{"7":{"df":1,"docs":{"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"1":{"3":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"0":{":":{"5":{"3":{"df":1,"docs":{"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"2":{":":{"2":{"2":{"df":1,"docs":{"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"5":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"2":{"8":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"3":{"7":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"9":{"0":{"6":{":":{"4":{"df":1,"docs":{"159":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":148,"docs":{"111":{"tf":2.0},"113":{"tf":1.7320508075688772},"114":{"tf":1.0},"117":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.4142135623730951},"127":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"175":{"tf":1.7320508075688772},"176":{"tf":1.0},"186":{"tf":1.4142135623730951},"188":{"tf":1.7320508075688772},"189":{"tf":1.4142135623730951},"190":{"tf":1.0},"211":{"tf":2.0},"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":2.0},"226":{"tf":2.449489742783178},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"235":{"tf":1.0},"239":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"246":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"258":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979},"298":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":2.23606797749979},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"32":{"tf":1.7320508075688772},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"33":{"tf":1.4142135623730951},"335":{"tf":1.7320508075688772},"337":{"tf":1.0},"343":{"tf":1.4142135623730951},"348":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":2.0},"360":{"tf":2.0},"361":{"tf":1.0},"368":{"tf":1.0},"369":{"tf":1.4142135623730951},"375":{"tf":1.0},"376":{"tf":2.449489742783178},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"385":{"tf":1.0},"391":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"40":{"tf":1.4142135623730951},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.449489742783178},"408":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"414":{"tf":1.0},"42":{"tf":1.4142135623730951},"427":{"tf":2.0},"428":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":2.0},"51":{"tf":1.0},"53":{"tf":2.0},"54":{"tf":2.449489742783178},"55":{"tf":1.4142135623730951},"56":{"tf":1.7320508075688772},"57":{"tf":1.7320508075688772},"58":{"tf":1.7320508075688772},"59":{"tf":1.4142135623730951},"61":{"tf":2.6457513110645907},"62":{"tf":2.449489742783178},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"75":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"78":{"tf":1.7320508075688772},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"96":{"tf":1.0}},"s":{":":{"1":{"0":{":":{"1":{"0":{"df":1,"docs":{"299":{"tf":1.0}}},"6":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"2":{"6":{"df":1,"docs":{"301":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{":":{"1":{"6":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"285":{"tf":1.0}}},"6":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"189":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"2":{"8":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{":":{"1":{"9":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"7":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"1":{"4":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"3":{"0":{"df":1,"docs":{"242":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"1":{"9":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"225":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{":":{"2":{"3":{"df":1,"docs":{"377":{"tf":1.0}}},"df":0,"docs":{}},"4":{"3":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{":":{"2":{"9":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"2":{"1":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{":":{"7":{"df":1,"docs":{"377":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"1":{"3":{"df":1,"docs":{"224":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"2":{"1":{"df":1,"docs":{"224":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"4":{"7":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"3":{"df":2,"docs":{"428":{"tf":1.0},"57":{"tf":1.0}}},"4":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"2":{"8":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"155":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"353":{"tf":1.0}}},"9":{"df":2,"docs":{"351":{"tf":1.0},"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{":":{"1":{"3":{"df":1,"docs":{"289":{"tf":1.0}}},"4":{"df":1,"docs":{"51":{"tf":1.0}}},"5":{"df":2,"docs":{"106":{"tf":1.0},"87":{"tf":1.0}}},"6":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"377":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{":":{"3":{"7":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"2":{"4":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"2":{"df":1,"docs":{"87":{"tf":1.0}}},"9":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}},"2":{"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"61":{"tf":1.0}}},"8":{"df":1,"docs":{"162":{"tf":1.0}}},"9":{"df":1,"docs":{"159":{"tf":1.0}}},"df":1,"docs":{"414":{"tf":1.0}}},"5":{"df":4,"docs":{"156":{"tf":1.4142135623730951},"246":{"tf":1.0},"368":{"tf":1.0},"49":{"tf":1.0}}},"6":{"df":1,"docs":{"156":{"tf":1.0}}},"8":{"df":1,"docs":{"61":{"tf":1.0}}},"9":{"df":1,"docs":{"427":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{":":{"1":{"4":{"df":1,"docs":{"74":{"tf":1.0}}},"5":{"df":1,"docs":{"70":{"tf":1.0}}},"6":{"df":1,"docs":{"75":{"tf":1.0}}},"7":{"df":2,"docs":{"102":{"tf":1.0},"172":{"tf":1.0}}},"df":0,"docs":{}},"2":{"2":{"df":1,"docs":{"360":{"tf":1.0}}},"6":{"df":1,"docs":{"335":{"tf":1.0}}},"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"1":{"3":{"df":1,"docs":{"185":{"tf":1.0}}},"4":{"df":1,"docs":{"74":{"tf":1.0}}},"8":{"df":1,"docs":{"299":{"tf":1.0}}},"df":1,"docs":{"316":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"368":{"tf":1.0}}},"2":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"188":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":2,"docs":{"134":{"tf":1.0},"277":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"2":{"4":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}},"3":{"8":{"df":1,"docs":{"173":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"2":{"3":{"df":1,"docs":{"157":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":2,"docs":{"73":{"tf":1.0},"75":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"3":{"3":{"df":1,"docs":{"186":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":9,"docs":{"111":{"tf":1.0},"113":{"tf":1.0},"127":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":2.0},"26":{"tf":2.23606797749979},"265":{"tf":1.0},"266":{"tf":1.4142135623730951},"400":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"433":{"tf":1.0}}}},"l":{"df":2,"docs":{"434":{"tf":2.23606797749979},"436":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"154":{"tf":1.0},"156":{"tf":1.0},"293":{"tf":1.0},"54":{"tf":1.0},"66":{"tf":1.4142135623730951}},")":{"df":0,"docs":{},"与":{"df":0,"docs":{},"堆":{"df":0,"docs":{},"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"66":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"233":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{},"t":{".":{".":{"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"321":{"tf":1.7320508075688772},"322":{"tf":3.7416573867739413}},"e":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"78":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"321":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"104":{"tf":2.23606797749979},"108":{"tf":1.4142135623730951},"296":{"tf":1.0},"306":{"tf":2.8284271247461903},"337":{"tf":1.0},"338":{"tf":3.605551275463989},"339":{"tf":2.449489742783178},"340":{"tf":2.23606797749979},"341":{"tf":4.358898943540674},"342":{"tf":8.0},"343":{"tf":2.449489742783178}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":21,"docs":{"193":{"tf":3.0},"224":{"tf":2.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"299":{"tf":1.0},"336":{"tf":1.0},"369":{"tf":2.23606797749979},"381":{"tf":2.23606797749979},"405":{"tf":4.358898943540674},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178},"412":{"tf":1.0},"417":{"tf":1.4142135623730951},"52":{"tf":1.0},"75":{"tf":1.7320508075688772}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"434":{"tf":1.0}}}}},"u":{"df":2,"docs":{"385":{"tf":1.0},"399":{"tf":1.4142135623730951}},"s":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"385":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"401":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"y":{"df":1,"docs":{"240":{"tf":1.0}}}},"d":{":":{":":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"125":{"tf":1.0},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{">":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"172":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":6,"docs":{"121":{"tf":1.0},"124":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":3,"docs":{"215":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"249":{"tf":1.0}},"s":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"215":{"tf":1.7320508075688772},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"232":{"tf":1.4142135623730951},"235":{"tf":1.0},"249":{"tf":2.23606797749979},"250":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"162":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"f":{"6":{"4":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"161":{"tf":1.0},"218":{"tf":1.4142135623730951},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":4,"docs":{"183":{"tf":1.0},"194":{"tf":1.0},"377":{"tf":2.0},"91":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"121":{"tf":1.0},"122":{"tf":1.0},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"381":{"tf":1.7320508075688772}}}},"s":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":7,"docs":{"157":{"tf":1.7320508075688772},"158":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"174":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"316":{"tf":1.0},"320":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"398":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"157":{"tf":1.0},"162":{"tf":1.4142135623730951},"174":{"tf":1.0},"381":{"tf":2.23606797749979},"398":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"。":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.0}}}}}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"218":{"tf":1.0}}}}},"t":{">":{"df":0,"docs":{},";":{"df":0,"docs":{},"也":{"df":0,"docs":{},"就":{"df":0,"docs":{},"是":{"df":0,"docs":{},"说":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.7320508075688772}}}}}},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"125":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"121":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":2.23606797749979},"161":{"tf":1.0},"167":{"tf":1.0},"33":{"tf":2.23606797749979},"34":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.0},"37":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{":":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"319":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"165":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"397":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"397":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"375":{"tf":1.0}},"s":{":":{":":{"a":{"d":{"d":{"df":1,"docs":{"375":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"224":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"224":{"tf":1.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"r":{"c":{":":{":":{"df":0,"docs":{},"r":{"c":{"df":6,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"306":{"tf":1.0}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"n":{"c":{":":{":":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"349":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}}}}}},"{":{"a":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"349":{"tf":1.0}}}}}},"df":1,"docs":{"318":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"240":{"tf":1.0},"241":{"tf":1.0},"298":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.4142135623730951},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":1.7320508075688772},"405":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{":":{":":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":9,"docs":{"240":{"tf":1.0},"298":{"tf":1.7320508075688772},"302":{"tf":1.0},"303":{"tf":1.0},"318":{"tf":1.7320508075688772},"319":{"tf":2.0},"320":{"tf":1.7320508075688772},"321":{"tf":1.0},"323":{"tf":1.0}}}}},"df":0,"docs":{},"{":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"{":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"125":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"320":{"tf":1.0},"323":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"322":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":13,"docs":{"124":{"tf":1.7320508075688772},"125":{"tf":1.0},"320":{"tf":1.4142135623730951},"33":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":2,"docs":{"233":{"tf":1.0},"91":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"233":{"tf":1.0}}},"df":0,"docs":{}}},"df":10,"docs":{"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"228":{"tf":1.0},"233":{"tf":1.0},"290":{"tf":1.0},"91":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"0":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"185":{"tf":1.0},"188":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"385":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"1":{"df":1,"docs":{"239":{"tf":1.0}}},"2":{"df":1,"docs":{"239":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"239":{"tf":1.4142135623730951},"405":{"tf":1.0}}}}},"r":{"df":43,"docs":{"119":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"145":{"tf":1.4142135623730951},"162":{"tf":1.0},"186":{"tf":3.0},"188":{"tf":3.0},"189":{"tf":2.449489742783178},"190":{"tf":1.0},"191":{"tf":4.0},"192":{"tf":2.449489742783178},"193":{"tf":1.0},"194":{"tf":1.7320508075688772},"201":{"tf":1.7320508075688772},"221":{"tf":1.4142135623730951},"224":{"tf":2.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":3.1622776601683795},"229":{"tf":4.0},"231":{"tf":2.0},"232":{"tf":5.291502622129181},"249":{"tf":4.58257569495584},"250":{"tf":3.3166247903554},"281":{"tf":2.449489742783178},"289":{"tf":2.6457513110645907},"290":{"tf":1.4142135623730951},"316":{"tf":3.0},"320":{"tf":1.0},"322":{"tf":2.0},"339":{"tf":1.4142135623730951},"340":{"tf":1.4142135623730951},"341":{"tf":1.4142135623730951},"342":{"tf":2.8284271247461903},"343":{"tf":2.0},"369":{"tf":1.0},"383":{"tf":3.872983346207417},"414":{"tf":2.449489742783178},"51":{"tf":1.0},"61":{"tf":1.0},"78":{"tf":3.3166247903554},"87":{"tf":3.0}},"e":{"a":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":9,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{")":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":7,"docs":{"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"325":{"tf":1.4142135623730951}}}}}}},"df":12,"docs":{"323":{"tf":1.4142135623730951},"324":{"tf":3.4641016151377544},"325":{"tf":1.4142135623730951},"397":{"tf":2.23606797749979},"398":{"tf":2.23606797749979},"399":{"tf":2.0},"400":{"tf":1.7320508075688772},"401":{"tf":2.449489742783178},"402":{"tf":1.7320508075688772},"404":{"tf":1.7320508075688772},"405":{"tf":3.0},"408":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"324":{"tf":2.0},"325":{"tf":1.0}}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"1":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"194":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":2.8284271247461903},"189":{"tf":1.4142135623730951},"194":{"tf":1.0}}},"2":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"188":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"186":{"tf":2.0},"188":{"tf":3.4641016151377544},"189":{"tf":2.0},"194":{"tf":1.4142135623730951}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"180":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{":":{"1":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"c":{"d":{"df":4,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":1.0},"189":{"tf":1.4142135623730951},"194":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"148":{"tf":1.0},"149":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":1.4142135623730951}}}}}}}},"d":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"r":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"149":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"r":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":4,"docs":{"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":2.6457513110645907}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"319":{"tf":2.0},"320":{"tf":2.449489742783178}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":14,"docs":{"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.7320508075688772},"191":{"tf":1.0},"201":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"70":{"tf":2.23606797749979},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":2.0},"74":{"tf":2.23606797749979},"75":{"tf":1.7320508075688772},"77":{"tf":1.0},"78":{"tf":2.6457513110645907}}}}}},"i":{"df":6,"docs":{"300":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907}}},"o":{"df":0,"docs":{},"l":{"a":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"179":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"140":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"141":{"tf":1.0}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"188":{"tf":1.4142135623730951}}}}}},"m":{"a":{"df":0,"docs":{},"y":{"b":{"df":1,"docs":{"335":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}},"i":{"df":1,"docs":{"283":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}}},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"335":{"tf":1.0}}}},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"335":{"tf":1.0}}},"l":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"283":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"180":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}}}},"r":{"df":1,"docs":{"189":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"247":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"82":{"tf":1.7320508075688772},"83":{"tf":1.0},"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"1":{"2":{"3":{"df":3,"docs":{"82":{"tf":1.7320508075688772},"83":{"tf":1.0},"84":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}}},"t":{"a":{"c":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"141":{"tf":1.4142135623730951}},"h":{"df":4,"docs":{"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":2.449489742783178}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"302":{"tf":1.0},"303":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"141":{"tf":1.0},"378":{"tf":1.0}}},"df":0,"docs":{}}}}},"x":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":1,"docs":{"188":{"tf":1.7320508075688772}}}}},"y":{"df":4,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178},"335":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"72":{"tf":1.0}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":7,"docs":{"140":{"tf":3.0},"142":{"tf":3.7416573867739413},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"182":{"tf":2.0},"70":{"tf":1.0},"96":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":25,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"140":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"167":{"tf":1.0},"223":{"tf":1.0},"33":{"tf":2.0},"338":{"tf":1.0},"339":{"tf":1.0},"34":{"tf":1.7320508075688772},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"`":{"df":1,"docs":{"191":{"tf":1.0}}},"df":89,"docs":{"101":{"tf":2.23606797749979},"119":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"137":{"tf":1.0},"138":{"tf":2.0},"139":{"tf":2.23606797749979},"140":{"tf":2.8284271247461903},"141":{"tf":4.242640687119285},"142":{"tf":2.8284271247461903},"144":{"tf":1.0},"145":{"tf":2.449489742783178},"147":{"tf":1.0},"149":{"tf":1.0},"160":{"tf":1.7320508075688772},"161":{"tf":1.4142135623730951},"169":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":3.0},"180":{"tf":4.242640687119285},"181":{"tf":3.1622776601683795},"182":{"tf":4.242640687119285},"183":{"tf":1.0},"186":{"tf":1.7320508075688772},"188":{"tf":3.0},"189":{"tf":1.7320508075688772},"190":{"tf":1.0},"191":{"tf":1.7320508075688772},"194":{"tf":1.0},"196":{"tf":1.0},"201":{"tf":1.7320508075688772},"202":{"tf":1.0},"203":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"221":{"tf":1.0},"222":{"tf":2.449489742783178},"223":{"tf":2.0},"224":{"tf":3.0},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.7416573867739413},"240":{"tf":2.449489742783178},"242":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":4.123105625617661},"250":{"tf":2.6457513110645907},"252":{"tf":1.0},"270":{"tf":1.4142135623730951},"281":{"tf":2.6457513110645907},"283":{"tf":1.7320508075688772},"289":{"tf":1.0},"301":{"tf":1.0},"316":{"tf":1.0},"325":{"tf":1.4142135623730951},"335":{"tf":2.449489742783178},"338":{"tf":1.4142135623730951},"339":{"tf":1.4142135623730951},"34":{"tf":2.23606797749979},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":2.23606797749979},"360":{"tf":1.4142135623730951},"376":{"tf":3.1622776601683795},"377":{"tf":1.4142135623730951},"380":{"tf":1.0},"391":{"tf":1.0},"398":{"tf":1.0},"42":{"tf":2.23606797749979},"45":{"tf":1.0},"52":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":2.449489742783178},"70":{"tf":3.7416573867739413},"71":{"tf":1.0},"72":{"tf":2.23606797749979},"73":{"tf":3.605551275463989},"74":{"tf":1.0},"75":{"tf":3.0},"77":{"tf":3.605551275463989},"78":{"tf":4.898979485566356},"82":{"tf":3.1622776601683795},"83":{"tf":2.0},"84":{"tf":2.449489742783178},"87":{"tf":1.4142135623730951},"91":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"391":{"tf":1.7320508075688772}}},"y":{"!":{"(":{"#":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"142":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"m":{"d":{"df":1,"docs":{"138":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"这":{"df":0,"docs":{},"就":{"df":0,"docs":{},"非":{"df":0,"docs":{},"常":{"df":0,"docs":{},"清":{"df":0,"docs":{},"楚":{"df":0,"docs":{},"地":{"df":0,"docs":{},"表":{"df":0,"docs":{},"明":{"df":0,"docs":{},",":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"74":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},",":{"df":0,"docs":{},"这":{"df":0,"docs":{},"可":{"df":0,"docs":{},"不":{"df":0,"docs":{},"对":{"df":0,"docs":{},"!":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"75":{"tf":1.0}}}}}}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"286":{"tf":1.0},"294":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":2.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"252":{"tf":1.0}}}}}}}}},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"391":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"416":{"tf":1.0}}}}}},"df":77,"docs":{"101":{"tf":3.0},"113":{"tf":1.0},"119":{"tf":1.0},"167":{"tf":1.0},"173":{"tf":1.7320508075688772},"175":{"tf":1.7320508075688772},"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.4142135623730951},"182":{"tf":2.0},"183":{"tf":1.0},"190":{"tf":1.0},"192":{"tf":1.4142135623730951},"199":{"tf":2.0},"202":{"tf":2.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.7320508075688772},"289":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"324":{"tf":1.0},"331":{"tf":1.4142135623730951},"334":{"tf":1.7320508075688772},"335":{"tf":2.0},"338":{"tf":1.4142135623730951},"339":{"tf":1.4142135623730951},"340":{"tf":1.4142135623730951},"341":{"tf":1.7320508075688772},"342":{"tf":3.4641016151377544},"343":{"tf":2.449489742783178},"353":{"tf":1.0},"359":{"tf":2.0},"360":{"tf":1.0},"371":{"tf":1.0},"374":{"tf":1.0},"375":{"tf":1.7320508075688772},"376":{"tf":2.449489742783178},"377":{"tf":1.4142135623730951},"378":{"tf":1.0},"391":{"tf":2.23606797749979},"405":{"tf":4.898979485566356},"407":{"tf":3.0},"408":{"tf":2.449489742783178},"412":{"tf":1.0},"417":{"tf":1.7320508075688772},"80":{"tf":1.0},"81":{"tf":1.4142135623730951},"82":{"tf":2.23606797749979},"83":{"tf":1.0},"84":{"tf":1.7320508075688772},"85":{"tf":2.0},"86":{"tf":1.7320508075688772},"87":{"tf":2.23606797749979},"90":{"tf":1.0},"91":{"tf":1.7320508075688772},"93":{"tf":1.4142135623730951},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":3,"docs":{"81":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"81":{"tf":1.0}}}},",":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"137":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"。":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":0,"docs":{},"当":{"a":{"d":{"d":{"df":0,"docs":{},"函":{"df":0,"docs":{},"数":{"df":0,"docs":{},"被":{"df":0,"docs":{},"调":{"df":0,"docs":{},"用":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},",":{"df":0,"docs":{},"它":{"df":0,"docs":{},"通":{"df":0,"docs":{},"常":{"df":0,"docs":{},"以":{"df":0,"docs":{},"被":{"df":0,"docs":{},"借":{"df":0,"docs":{},"用":{"df":0,"docs":{},"的":{"df":0,"docs":{},"形":{"df":0,"docs":{},"式":{"df":0,"docs":{},"出":{"df":0,"docs":{},"现":{"df":0,"docs":{},",":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"429":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":2,"docs":{"137":{"tf":1.0},"283":{"tf":2.0}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"289":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"247":{"tf":2.449489742783178}}}}}},"u":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":2,"docs":{"368":{"tf":1.0},"416":{"tf":1.0}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"86":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"202":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"h":{"df":2,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{":":{":":{"<":{"df":0,"docs":{},"i":{"6":{"4":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"102":{"tf":1.4142135623730951},"245":{"tf":2.23606797749979},"53":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"178":{"tf":1.7320508075688772},"179":{"tf":1.4142135623730951},"180":{"tf":3.0},"181":{"tf":2.0},"332":{"tf":1.7320508075688772}},"i":{"df":6,"docs":{"178":{"tf":2.0},"179":{"tf":3.1622776601683795},"180":{"tf":3.872983346207417},"181":{"tf":3.7416573867739413},"182":{"tf":3.3166247903554},"332":{"tf":1.7320508075688772}},"z":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":5,"docs":{"178":{"tf":1.4142135623730951},"179":{"tf":1.7320508075688772},"180":{"tf":2.0},"181":{"tf":1.7320508075688772},"182":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"180":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"180":{"tf":2.23606797749979}},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{">":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"1":{"df":1,"docs":{"181":{"tf":1.0}}},"df":1,"docs":{"181":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"119":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"*":{";":{"df":0,"docs":{},"。":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"417":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":22,"docs":{"118":{"tf":2.449489742783178},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.7320508075688772},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"266":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"412":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"366":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.0}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"a":{"df":1,"docs":{"431":{"tf":1.0}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"182":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"120":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"391":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":6,"docs":{"296":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":1.7320508075688772},"310":{"tf":3.1622776601683795},"311":{"tf":2.23606797749979},"370":{"tf":2.23606797749979}}},"df":1,"docs":{"391":{"tf":2.8284271247461903}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"381":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"d":{"df":5,"docs":{"171":{"tf":1.0},"184":{"tf":1.0},"315":{"tf":1.0},"354":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}}},"df":6,"docs":{"191":{"tf":1.0},"376":{"tf":1.0},"391":{"tf":1.4142135623730951},"69":{"tf":1.0},"84":{"tf":1.0},"93":{"tf":1.0}},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"超":{"df":0,"docs":{},"(":{"df":0,"docs":{},"父":{"df":0,"docs":{},")":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"364":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"102":{"tf":1.4142135623730951},"110":{"tf":1.0}},",":{"df":0,"docs":{},"v":{"c":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"t":{">":{"(":{"df":0,"docs":{},"f":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}},":":{":":{".":{".":{".":{"df":0,"docs":{},",":{"<":{"[":{"df":0,"docs":{},"t":{"df":1,"docs":{"417":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"]":{">":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":1,"docs":{"23":{"tf":1.0}},"l":{"df":1,"docs":{"151":{"tf":1.0}}}},"c":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"431":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"293":{"tf":1.7320508075688772},"58":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":5,"docs":{"299":{"tf":1.4142135623730951},"341":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":2.0},"408":{"tf":1.4142135623730951}},"s":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"(":{"a":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"72":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"2":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"72":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"f":{"df":1,"docs":{"381":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"(":{"df":1,"docs":{"71":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"71":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"71":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"df":4,"docs":{"231":{"tf":1.4142135623730951},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"df":59,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.4142135623730951},"261":{"tf":1.0},"266":{"tf":2.23606797749979},"267":{"tf":1.0},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}},"/":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"/":{"a":{"d":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"61":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":3,"docs":{"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"/":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.4142135623730951}}}}},"df":6,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"211":{"tf":1.0}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"202":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"211":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":3,"docs":{"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"157":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":6,"docs":{"32":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"405":{"tf":1.0},"408":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"246":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":1.7320508075688772}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"216":{"tf":2.23606797749979},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.0}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"350":{"tf":1.0},"353":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":3,"docs":{"242":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"239":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"49":{"tf":1.0},"51":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"27":{"tf":1.0},"28":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"c":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"28":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"\\":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"\\":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"265":{"tf":2.449489742783178},"266":{"tf":1.0},"280":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951}}}}}},"s":{"df":0,"docs":{},"k":{"df":2,"docs":{"315":{"tf":1.0},"318":{"tf":6.4031242374328485}}}}},"c":{"df":0,"docs":{},"p":{"df":4,"docs":{"395":{"tf":1.4142135623730951},"396":{"tf":2.23606797749979},"397":{"tf":2.23606797749979},"398":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"397":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"\"":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{":":{"7":{"8":{"7":{"8":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":9,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":9,"docs":{"397":{"tf":1.4142135623730951},"398":{"tf":1.7320508075688772},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":2.0},"402":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}}},"df":0,"docs":{}}}}}}},"d":{"d":{"df":3,"docs":{"227":{"tf":1.4142135623730951},"228":{"tf":1.0},"231":{"tf":1.0}}},"df":0,"docs":{}},"df":30,"docs":{"102":{"tf":2.8284271247461903},"105":{"tf":1.0},"157":{"tf":1.7320508075688772},"160":{"tf":1.0},"172":{"tf":4.0},"173":{"tf":3.3166247903554},"174":{"tf":2.449489742783178},"175":{"tf":3.4641016151377544},"181":{"tf":2.8284271247461903},"183":{"tf":2.449489742783178},"194":{"tf":2.23606797749979},"232":{"tf":1.0},"239":{"tf":2.0},"242":{"tf":2.449489742783178},"279":{"tf":2.0},"280":{"tf":1.7320508075688772},"281":{"tf":2.449489742783178},"282":{"tf":2.8284271247461903},"289":{"tf":4.58257569495584},"290":{"tf":2.6457513110645907},"310":{"tf":1.4142135623730951},"334":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"382":{"tf":1.7320508075688772},"383":{"tf":3.0},"405":{"tf":2.6457513110645907},"417":{"tf":2.6457513110645907},"424":{"tf":1.0},"53":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"148":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"218":{"tf":2.0},"225":{"tf":1.4142135623730951},"232":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"$":{"df":0,"docs":{},"x":{"df":1,"docs":{"389":{"tf":1.0}}}},"1":{"df":1,"docs":{"389":{"tf":1.0}}},"2":{"df":1,"docs":{"389":{"tf":1.0}}},"3":{"df":1,"docs":{"389":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"389":{"tf":2.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":42,"docs":{"126":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":6.708203932499369},"199":{"tf":5.830951894845301},"200":{"tf":4.358898943540674},"201":{"tf":4.242640687119285},"202":{"tf":5.477225575051661},"203":{"tf":1.7320508075688772},"204":{"tf":2.6457513110645907},"205":{"tf":2.0},"206":{"tf":4.358898943540674},"207":{"tf":5.385164807134504},"208":{"tf":5.0990195135927845},"209":{"tf":1.7320508075688772},"210":{"tf":3.3166247903554},"211":{"tf":7.483314773547883},"217":{"tf":2.0},"227":{"tf":1.4142135623730951},"228":{"tf":3.3166247903554},"229":{"tf":4.242640687119285},"231":{"tf":1.7320508075688772},"232":{"tf":4.795831523312719},"244":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"249":{"tf":3.0},"250":{"tf":2.23606797749979},"252":{"tf":1.4142135623730951},"257":{"tf":2.6457513110645907},"266":{"tf":4.898979485566356},"289":{"tf":2.6457513110645907},"290":{"tf":2.8284271247461903},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"197":{"tf":1.0},"204":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":2.23606797749979}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":3.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"o":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"198":{"tf":2.23606797749979}}}}}}},"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"208":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"198":{"tf":1.4142135623730951}}}}}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"_":{"1":{"0":{"0":{"df":1,"docs":{"202":{"tf":2.8284271247461903}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"201":{"tf":2.8284271247461903}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}}},"t":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"200":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"7":{"5":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"198":{"tf":1.0},"208":{"tf":1.0},"266":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"207":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"228":{"tf":2.0},"229":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"206":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"206":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"136":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{"?":{".":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}}},":":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":11,"docs":{"150":{"tf":1.4142135623730951},"162":{"tf":2.23606797749979},"218":{"tf":1.0},"225":{"tf":1.0},"316":{"tf":2.23606797749979},"339":{"tf":1.4142135623730951},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"359":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"334":{"tf":1.0},"335":{"tf":1.4142135623730951}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"此":{"df":0,"docs":{},"之":{"df":0,"docs":{},"上":{"df":0,"docs":{},",":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"333":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"'":{"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}},"df":0,"docs":{}}},"y":{"'":{"d":{"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"134":{"tf":2.8284271247461903},"360":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"206":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"206":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"407":{"tf":1.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"405":{"tf":3.1622776601683795},"407":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"1":{"df":1,"docs":{"298":{"tf":2.449489742783178}}},"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"(":{"1":{"df":2,"docs":{"302":{"tf":1.0},"303":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"240":{"tf":1.0}}},"5":{"df":3,"docs":{"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"298":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"318":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":10,"docs":{"241":{"tf":1.0},"299":{"tf":2.0},"300":{"tf":1.4142135623730951},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.4142135623730951},"306":{"tf":2.6457513110645907},"405":{"tf":1.4142135623730951},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"df":6,"docs":{"298":{"tf":2.449489742783178},"299":{"tf":2.8284271247461903},"300":{"tf":1.0},"316":{"tf":1.0},"318":{"tf":1.0},"405":{"tf":4.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":29,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"228":{"tf":1.0},"241":{"tf":1.0},"290":{"tf":1.0},"297":{"tf":1.0},"298":{"tf":6.4031242374328485},"299":{"tf":2.449489742783178},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":1.7320508075688772},"404":{"tf":1.0},"405":{"tf":7.0},"406":{"tf":1.0},"407":{"tf":5.0990195135927845},"408":{"tf":4.123105625617661},"43":{"tf":1.0},"54":{"tf":1.0}},"e":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"396":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"4":{"df":2,"docs":{"405":{"tf":2.0},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"405":{"tf":2.6457513110645907}}}}}},"df":0,"docs":{}},"df":4,"docs":{"405":{"tf":9.797958971132712},"406":{"tf":1.4142135623730951},"407":{"tf":5.0},"408":{"tf":5.385164807134504}}}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"297":{"tf":1.0}}},"df":0,"docs":{}}},"=":{"1":{"df":1,"docs":{"205":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"50":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":7,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772},"61":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"120":{"tf":1.0},"358":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"381":{"tf":2.8284271247461903}}}}}},"i":{"c":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"f":{"3":{"2":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"320":{"tf":1.7320508075688772},"322":{"tf":2.0},"323":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":6,"docs":{"102":{"tf":1.0},"24":{"tf":1.0},"322":{"tf":1.4142135623730951},"368":{"tf":1.0},"386":{"tf":1.0},"74":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}}}},"<":{"df":0,"docs":{},"f":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}},"df":1,"docs":{"323":{"tf":2.6457513110645907}}}}},"r":{"df":1,"docs":{"323":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"316":{"tf":4.123105625617661}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}},">":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"!":{"<":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"1":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"2":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"1":{".":{"2":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"232":{"tf":2.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":5,"docs":{"140":{"tf":2.0},"183":{"tf":1.0},"240":{"tf":1.0},"377":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"422":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":2.449489742783178}}}}},"d":{"a":{"df":0,"docs":{},"y":{"df":6,"docs":{"162":{"tf":1.0},"194":{"tf":1.0},"240":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"343":{"tf":2.0},"59":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"o":{"df":3,"docs":{"106":{"tf":1.0},"316":{"tf":1.4142135623730951},"353":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"141":{"tf":1.0}},"”":{"df":0,"docs":{},"。":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"259":{"tf":2.449489742783178},"261":{"tf":1.0},"387":{"tf":1.0},"390":{"tf":1.0},"393":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"390":{"tf":2.449489742783178},"391":{"tf":3.7416573867739413},"392":{"tf":2.0},"393":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}},"m":{"'":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"26":{"tf":1.0}}}},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"436":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"425":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"183":{"tf":1.7320508075688772},"385":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"245":{"tf":1.0},"331":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"434":{"tf":2.0}}},"t":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},">":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"(":{"df":0,"docs":{},"r":{"c":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"383":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":111,"docs":{"10":{"tf":1.4142135623730951},"102":{"tf":1.4142135623730951},"124":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"142":{"tf":1.7320508075688772},"149":{"tf":1.0},"151":{"tf":1.4142135623730951},"161":{"tf":1.0},"162":{"tf":2.449489742783178},"169":{"tf":1.7320508075688772},"172":{"tf":2.0},"177":{"tf":2.23606797749979},"178":{"tf":3.4641016151377544},"179":{"tf":4.58257569495584},"180":{"tf":3.7416573867739413},"181":{"tf":5.291502622129181},"182":{"tf":3.1622776601683795},"183":{"tf":4.123105625617661},"194":{"tf":2.0},"195":{"tf":2.23606797749979},"200":{"tf":2.449489742783178},"213":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"242":{"tf":3.7416573867739413},"244":{"tf":2.449489742783178},"245":{"tf":1.7320508075688772},"246":{"tf":1.4142135623730951},"249":{"tf":2.6457513110645907},"270":{"tf":1.7320508075688772},"271":{"tf":2.0},"275":{"tf":2.0},"276":{"tf":2.0},"277":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":2.8284271247461903},"281":{"tf":1.7320508075688772},"282":{"tf":1.7320508075688772},"283":{"tf":3.7416573867739413},"285":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":3.1622776601683795},"290":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":2.0},"307":{"tf":1.0},"308":{"tf":1.4142135623730951},"309":{"tf":1.7320508075688772},"310":{"tf":1.0},"311":{"tf":1.4142135623730951},"315":{"tf":2.23606797749979},"316":{"tf":2.23606797749979},"320":{"tf":3.7416573867739413},"324":{"tf":3.3166247903554},"326":{"tf":1.0},"332":{"tf":2.6457513110645907},"333":{"tf":1.4142135623730951},"334":{"tf":5.830951894845301},"335":{"tf":4.58257569495584},"336":{"tf":2.23606797749979},"337":{"tf":1.0},"338":{"tf":2.449489742783178},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":2.0},"342":{"tf":3.1622776601683795},"343":{"tf":2.23606797749979},"344":{"tf":1.0},"360":{"tf":1.0},"364":{"tf":1.4142135623730951},"366":{"tf":1.0},"370":{"tf":3.3166247903554},"373":{"tf":1.4142135623730951},"374":{"tf":4.795831523312719},"375":{"tf":4.0},"376":{"tf":6.324555320336759},"377":{"tf":5.744562646538029},"378":{"tf":3.1622776601683795},"379":{"tf":1.0},"381":{"tf":2.23606797749979},"383":{"tf":3.605551275463989},"385":{"tf":2.8284271247461903},"386":{"tf":3.0},"388":{"tf":1.7320508075688772},"391":{"tf":4.123105625617661},"398":{"tf":1.7320508075688772},"405":{"tf":2.6457513110645907},"406":{"tf":1.0},"407":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":2.0},"412":{"tf":2.8284271247461903},"416":{"tf":2.0},"417":{"tf":2.6457513110645907},"418":{"tf":4.0},"419":{"tf":1.7320508075688772},"420":{"tf":2.0},"421":{"tf":2.23606797749979},"422":{"tf":2.23606797749979},"423":{"tf":1.0},"424":{"tf":1.4142135623730951},"70":{"tf":3.0},"84":{"tf":1.0},"86":{"tf":1.4142135623730951},"91":{"tf":2.8284271247461903},"92":{"tf":1.0},"97":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":3,"docs":{"177":{"tf":1.0},"373":{"tf":1.0},"418":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"270":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"此":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"!":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"386":{"tf":1.0}}}}}}},"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"、":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"306":{"tf":1.0}}}}},",":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"179":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"281":{"tf":1.4142135623730951},"376":{"tf":1.0},"91":{"tf":1.0}}}}}}},":":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"181":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"、":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.0}}}}}}}}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"396":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"431":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"396":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"300":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"114":{"tf":1.0},"391":{"tf":1.4142135623730951}}}},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"100":{"tf":1.0}}}}}},"df":50,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.4142135623730951},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.7320508075688772},"413":{"tf":1.0},"414":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}},"m":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"54":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"319":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"325":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"323":{"tf":1.0}},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.23606797749979}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"!":{"(":{"a":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"318":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"3":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"319":{"tf":1.0}}},"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"320":{"tf":1.0}},"l":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"318":{"tf":2.449489742783178},"319":{"tf":2.449489742783178},"320":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"(":{"a":{"df":1,"docs":{"322":{"tf":1.7320508075688772}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"1":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":3,"docs":{"316":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"324":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"n":{"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":9,"docs":{"316":{"tf":1.4142135623730951},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":3,"docs":{"316":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951},"319":{"tf":1.7320508075688772}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"1":{"0":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"318":{"tf":2.449489742783178},"319":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"(":{"1":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":4,"docs":{"318":{"tf":1.0},"319":{"tf":1.0},"322":{"tf":2.8284271247461903},"323":{"tf":1.4142135623730951}}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"318":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"318":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"{":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":9,"docs":{"316":{"tf":3.7416573867739413},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":17,"docs":{"199":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"320":{"tf":1.0},"361":{"tf":1.0},"391":{"tf":1.0},"412":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"61":{"tf":2.8284271247461903},"62":{"tf":1.7320508075688772},"70":{"tf":1.0},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.4142135623730951}},",":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.7320508075688772},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951}}}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"300":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"54":{"tf":2.449489742783178}},"l":{"df":3,"docs":{"351":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"85":{"tf":1.0}},"e":{"df":0,"docs":{},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"数":{"df":0,"docs":{},"组":{"df":0,"docs":{},"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"417":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"179":{"tf":1.0},"180":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":5,"docs":{"178":{"tf":1.4142135623730951},"179":{"tf":3.605551275463989},"180":{"tf":3.605551275463989},"181":{"tf":2.0},"182":{"tf":3.0}}}},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"63":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"49":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"o":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"203":{"tf":1.0},"258":{"tf":1.4142135623730951},"320":{"tf":1.0},"357":{"tf":1.4142135623730951},"368":{"tf":1.0}},"’":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}}},"x":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":7,"docs":{"300":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"349":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"301":{"tf":1.0},"319":{"tf":1.0}}},"df":0,"docs":{}}}}},"1":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"319":{"tf":1.0},"320":{"tf":2.6457513110645907}}}}}},"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":2.449489742783178}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"319":{"tf":2.0},"320":{"tf":3.1622776601683795}}}}}},"df":8,"docs":{"300":{"tf":2.8284271247461903},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":4.242640687119285},"320":{"tf":2.449489742783178},"325":{"tf":1.0},"349":{"tf":1.0}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"417":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":51,"docs":{"102":{"tf":1.4142135623730951},"106":{"tf":1.0},"125":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.7320508075688772},"173":{"tf":1.0},"183":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.7320508075688772},"242":{"tf":1.0},"244":{"tf":1.7320508075688772},"273":{"tf":1.4142135623730951},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"335":{"tf":1.0},"351":{"tf":1.4142135623730951},"353":{"tf":1.0},"374":{"tf":1.7320508075688772},"375":{"tf":2.0},"376":{"tf":1.4142135623730951},"381":{"tf":2.6457513110645907},"382":{"tf":2.23606797749979},"383":{"tf":1.0},"386":{"tf":1.4142135623730951},"405":{"tf":2.6457513110645907},"407":{"tf":2.6457513110645907},"408":{"tf":1.7320508075688772},"412":{"tf":1.4142135623730951},"416":{"tf":3.3166247903554},"417":{"tf":3.0},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":2.449489742783178},"53":{"tf":1.4142135623730951},"54":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"75":{"tf":1.4142135623730951}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"413":{"tf":1.0}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"379":{"tf":1.0},"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"i":{"c":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}}}},"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"310":{"tf":1.0}}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"175":{"tf":1.0}}}}}},"x":{"df":1,"docs":{"175":{"tf":1.0}}},"因":{"df":0,"docs":{},"为":{"df":0,"docs":{},"传":{"df":0,"docs":{},"统":{"df":0,"docs":{},"上":{"df":0,"docs":{},"来":{"df":0,"docs":{},"说":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}}}}}}},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"希":{"df":0,"docs":{},"望":{"df":0,"docs":{},"其":{"df":0,"docs":{},"可":{"df":0,"docs":{},"以":{"df":0,"docs":{},"存":{"df":0,"docs":{},"放":{"df":0,"docs":{},"任":{"df":0,"docs":{},"何":{"df":0,"docs":{},"类":{"df":0,"docs":{},"型":{"df":0,"docs":{},"的":{"df":0,"docs":{},"值":{"df":0,"docs":{},"。":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}},"u":{"+":{"0":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"53":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"2":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"3":{"2":{"df":30,"docs":{"125":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"199":{"tf":2.8284271247461903},"240":{"tf":2.8284271247461903},"242":{"tf":2.449489742783178},"247":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":2.449489742783178},"369":{"tf":1.4142135623730951},"374":{"tf":2.0},"380":{"tf":1.4142135623730951},"382":{"tf":2.0},"385":{"tf":1.0},"42":{"tf":2.8284271247461903},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"50":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"70":{"tf":1.0},"88":{"tf":2.449489742783178},"89":{"tf":1.7320508075688772},"90":{"tf":2.0},"91":{"tf":2.449489742783178},"93":{"tf":2.23606797749979},"95":{"tf":1.7320508075688772},"96":{"tf":1.7320508075688772},"97":{"tf":1.7320508075688772}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},";":{"6":{"4":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"6":{"4":{"df":6,"docs":{"322":{"tf":2.0},"53":{"tf":1.0},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":10,"docs":{"101":{"tf":2.0},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"107":{"tf":1.4142135623730951},"142":{"tf":1.0},"381":{"tf":2.449489742783178},"399":{"tf":1.0},"417":{"tf":1.0},"53":{"tf":2.0},"54":{"tf":1.4142135623730951}}},">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.0}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"df":6,"docs":{"173":{"tf":2.0},"181":{"tf":2.449489742783178},"232":{"tf":1.0},"282":{"tf":2.23606797749979},"417":{"tf":1.4142135623730951},"53":{"tf":1.0}},"i":{"df":1,"docs":{"313":{"tf":1.0}}},"n":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"386":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"293":{"tf":1.0}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"75":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"120":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"156":{"tf":1.0},"368":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"64":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":1,"docs":{"263":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"d":{"df":5,"docs":{"142":{"tf":1.7320508075688772},"144":{"tf":1.4142135623730951},"216":{"tf":1.7320508075688772},"232":{"tf":1.4142135623730951},"53":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"398":{"tf":1.4142135623730951}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"181":{"tf":1.0},"258":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"366":{"tf":1.0},"371":{"tf":1.0},"412":{"tf":1.7320508075688772}}}},"t":{"_":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"56":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":5,"docs":{"209":{"tf":1.0},"225":{"tf":1.4142135623730951},"391":{"tf":1.0},"54":{"tf":1.0},"86":{"tf":1.7320508075688772}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":14,"docs":{"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"266":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"246":{"tf":1.0},"75":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"405":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"57":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":58,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":2.23606797749979},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":3.3166247903554}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"153":{"tf":1.0},"154":{"tf":1.0}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}},"s":{"a":{"df":0,"docs":{},"f":{"df":11,"docs":{"257":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"365":{"tf":1.4142135623730951},"366":{"tf":3.1622776601683795},"367":{"tf":2.0},"368":{"tf":5.291502622129181},"369":{"tf":1.7320508075688772},"370":{"tf":2.8284271247461903},"371":{"tf":1.0},"372":{"tf":2.0},"412":{"tf":1.0}},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"370":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"383":{"tf":1.0},"413":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"435":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":6,"docs":{"120":{"tf":1.0},"225":{"tf":1.0},"246":{"tf":1.0},"266":{"tf":1.0},"36":{"tf":1.0},"427":{"tf":1.0}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"155":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"382":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":5,"docs":{"158":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"239":{"tf":2.6457513110645907},"242":{"tf":2.8284271247461903}},"e":{"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"242":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"<":{"df":0,"docs":{},"f":{">":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"148":{"tf":1.0}}}}},"df":20,"docs":{"159":{"tf":3.0},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"224":{"tf":1.0},"225":{"tf":1.0},"241":{"tf":1.0},"300":{"tf":1.0},"306":{"tf":1.0},"318":{"tf":1.0},"342":{"tf":1.0},"349":{"tf":1.0},"382":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"401":{"tf":1.7320508075688772},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"408":{"tf":1.0}},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"263":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":8,"docs":{"18":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"263":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"40":{"tf":2.449489742783178},"84":{"tf":1.0}},"e":{"_":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951},"330":{"tf":1.0},"376":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":2,"docs":{"294":{"tf":1.7320508075688772},"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":2,"docs":{"260":{"tf":1.0},"261":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"398":{"tf":2.6457513110645907}}},"l":{"df":2,"docs":{"316":{"tf":4.358898943540674},"398":{"tf":1.7320508075688772}}}},"s":{",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{";":{"df":0,"docs":{},"q":{"=":{"0":{".":{"5":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"a":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}},"df":141,"docs":{"102":{"tf":1.0},"110":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.7320508075688772},"119":{"tf":1.4142135623730951},"120":{"tf":4.358898943540674},"121":{"tf":3.7416573867739413},"122":{"tf":2.0},"123":{"tf":3.1622776601683795},"124":{"tf":2.449489742783178},"125":{"tf":4.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772},"157":{"tf":1.4142135623730951},"158":{"tf":2.0},"159":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"161":{"tf":2.449489742783178},"162":{"tf":2.23606797749979},"165":{"tf":1.0},"167":{"tf":1.7320508075688772},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"183":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"194":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":2.0},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.7320508075688772},"211":{"tf":1.7320508075688772},"215":{"tf":1.7320508075688772},"217":{"tf":1.0},"218":{"tf":1.7320508075688772},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.8284271247461903},"225":{"tf":3.7416573867739413},"226":{"tf":2.6457513110645907},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.605551275463989},"235":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"246":{"tf":1.4142135623730951},"247":{"tf":1.0},"249":{"tf":4.242640687119285},"250":{"tf":2.6457513110645907},"252":{"tf":1.4142135623730951},"258":{"tf":4.58257569495584},"266":{"tf":2.6457513110645907},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"285":{"tf":2.449489742783178},"286":{"tf":1.4142135623730951},"289":{"tf":3.0},"290":{"tf":2.0},"291":{"tf":1.7320508075688772},"293":{"tf":2.449489742783178},"294":{"tf":3.1622776601683795},"298":{"tf":2.449489742783178},"299":{"tf":2.8284271247461903},"300":{"tf":2.23606797749979},"301":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"303":{"tf":1.7320508075688772},"306":{"tf":3.1622776601683795},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.0},"320":{"tf":3.4641016151377544},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":2.0},"324":{"tf":3.0},"325":{"tf":1.0},"33":{"tf":2.23606797749979},"335":{"tf":2.0},"337":{"tf":1.0},"34":{"tf":1.0},"343":{"tf":1.4142135623730951},"348":{"tf":1.0},"35":{"tf":1.7320508075688772},"353":{"tf":1.0},"36":{"tf":1.7320508075688772},"360":{"tf":2.23606797749979},"368":{"tf":1.7320508075688772},"37":{"tf":1.0},"375":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":2.23606797749979},"378":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":2.0},"390":{"tf":1.0},"391":{"tf":2.6457513110645907},"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":3.872983346207417},"407":{"tf":2.23606797749979},"408":{"tf":2.6457513110645907},"41":{"tf":2.23606797749979},"412":{"tf":1.4142135623730951},"42":{"tf":2.8284271247461903},"425":{"tf":1.0},"427":{"tf":1.0},"428":{"tf":1.0},"43":{"tf":1.7320508075688772},"44":{"tf":1.7320508075688772},"45":{"tf":2.449489742783178},"54":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"91":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"353":{"tf":1.0}}}}}},"r":{"1":{".":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":4,"docs":{"82":{"tf":1.7320508075688772},"83":{"tf":1.0},"84":{"tf":3.7416573867739413},"87":{"tf":1.0}}},"2":{"df":1,"docs":{"84":{"tf":2.8284271247461903}}},"<":{"'":{"a":{"df":1,"docs":{"87":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"1":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"239":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":7,"docs":{"239":{"tf":2.0},"333":{"tf":1.0},"398":{"tf":1.4142135623730951},"82":{"tf":3.605551275463989},"83":{"tf":2.0},"84":{"tf":3.0},"87":{"tf":1.7320508075688772}},"n":{"a":{"df":0,"docs":{},"m":{"df":10,"docs":{"160":{"tf":2.0},"161":{"tf":2.449489742783178},"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":2.0},"82":{"tf":3.1622776601683795},"83":{"tf":2.23606797749979},"84":{"tf":2.8284271247461903},"87":{"tf":2.23606797749979}},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"160":{"tf":2.0},"161":{"tf":1.7320508075688772}},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"160":{"tf":1.0},"161":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"160":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"%":{"\\":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"21":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"s":{"/":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"z":{"df":22,"docs":{"142":{"tf":1.4142135623730951},"156":{"tf":1.0},"198":{"tf":3.0},"200":{"tf":2.0},"203":{"tf":1.7320508075688772},"207":{"tf":1.4142135623730951},"208":{"tf":1.7320508075688772},"210":{"tf":2.8284271247461903},"289":{"tf":3.4641016151377544},"290":{"tf":2.0},"368":{"tf":1.7320508075688772},"383":{"tf":1.0},"405":{"tf":5.5677643628300215},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"417":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.7320508075688772},"54":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.7320508075688772},"77":{"tf":2.8284271247461903}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.7320508075688772},"108":{"tf":1.7320508075688772}},"e":{":":{":":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"a":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"f":{"df":11,"docs":{"138":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"140":{"tf":1.0},"142":{"tf":2.0},"145":{"tf":1.4142135623730951},"152":{"tf":1.0},"270":{"tf":1.0},"34":{"tf":1.0},"398":{"tf":1.0},"53":{"tf":1.0},"78":{"tf":1.7320508075688772}}},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"257":{"tf":1.0},"258":{"tf":2.6457513110645907},"320":{"tf":1.7320508075688772}}}}}},"v":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"350":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"5":{"df":1,"docs":{"133":{"tf":1.0}}},"6":{"df":2,"docs":{"133":{"tf":1.0},"134":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"133":{"tf":1.0}}},"8":{"df":1,"docs":{"133":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"0":{".":{"1":{".":{"0":{"df":95,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":2.0},"242":{"tf":1.4142135623730951},"246":{"tf":1.0},"261":{"tf":2.0},"266":{"tf":2.6457513110645907},"27":{"tf":1.7320508075688772},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.7320508075688772},"285":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"32":{"tf":1.0},"335":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"38":{"tf":1.0},"386":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"407":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":2.449489742783178},"62":{"tf":1.7320508075688772},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"1":{"0":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"2":{"7":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"8":{"6":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"2":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"5":{"df":3,"docs":{"266":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"42":{"tf":1.0}}},"6":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{".":{"0":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"x":{"df":1,"docs":{"246":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0}}}}}}},"3":{".":{"0":{".":{"0":{"df":1,"docs":{"267":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"245":{"tf":1.0}}}}}},"df":3,"docs":{"243":{"tf":2.23606797749979},"244":{"tf":2.23606797749979},"245":{"tf":1.4142135623730951}}}}}}},"df":4,"docs":{"243":{"tf":1.7320508075688772},"244":{"tf":1.4142135623730951},"245":{"tf":1.0},"246":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"246":{"tf":1.0}}},"4":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"v":{"4":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.0}}}}}}}},"u":{"8":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":2.449489742783178}}},"6":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"v":{"6":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}}}}}},"df":2,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":2.6457513110645907}}},"[":{"0":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}},"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"134":{"tf":1.0}}},"9":{"9":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":9,"docs":{"243":{"tf":1.4142135623730951},"300":{"tf":1.4142135623730951},"301":{"tf":3.0},"302":{"tf":1.7320508075688772},"303":{"tf":2.449489742783178},"319":{"tf":4.123105625617661},"320":{"tf":6.082762530298219},"349":{"tf":1.0},"382":{"tf":1.4142135623730951}},"i":{"d":{"df":1,"docs":{"165":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":55,"docs":{"106":{"tf":1.0},"148":{"tf":1.4142135623730951},"159":{"tf":1.0},"167":{"tf":4.242640687119285},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":5.916079783099616},"206":{"tf":2.8284271247461903},"224":{"tf":1.0},"225":{"tf":1.0},"228":{"tf":1.0},"242":{"tf":3.1622776601683795},"246":{"tf":1.0},"260":{"tf":1.0},"285":{"tf":1.7320508075688772},"289":{"tf":3.872983346207417},"290":{"tf":2.0},"291":{"tf":3.7416573867739413},"293":{"tf":1.7320508075688772},"294":{"tf":4.58257569495584},"299":{"tf":2.0},"301":{"tf":1.7320508075688772},"306":{"tf":2.0},"318":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":3.1622776601683795},"324":{"tf":3.3166247903554},"331":{"tf":1.0},"347":{"tf":1.0},"350":{"tf":1.4142135623730951},"353":{"tf":1.0},"359":{"tf":1.0},"36":{"tf":1.0},"360":{"tf":1.4142135623730951},"368":{"tf":2.449489742783178},"382":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"428":{"tf":1.0},"49":{"tf":2.6457513110645907},"51":{"tf":2.23606797749979},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"56":{"tf":2.23606797749979},"57":{"tf":1.4142135623730951},"58":{"tf":2.449489742783178},"61":{"tf":1.7320508075688772},"62":{"tf":2.6457513110645907},"70":{"tf":2.0},"75":{"tf":2.449489742783178},"82":{"tf":1.4142135623730951}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"167":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"385":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"350":{"tf":1.0}}}}},"df":0,"docs":{}}}}},".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"df":1,"docs":{"103":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"a":{")":{")":{"df":0,"docs":{},",":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}}},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"[":{".":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"}":{"df":0,"docs":{},"{":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"56":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"r":{"df":2,"docs":{"232":{"tf":1.0},"416":{"tf":3.3166247903554}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":24,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"242":{"tf":1.4142135623730951},"290":{"tf":1.0},"299":{"tf":1.7320508075688772},"34":{"tf":1.0},"369":{"tf":1.0},"427":{"tf":1.0},"43":{"tf":1.0},"49":{"tf":3.3166247903554},"51":{"tf":2.0},"54":{"tf":1.0},"75":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"416":{"tf":1.0}}}},"df":6,"docs":{"100":{"tf":1.0},"225":{"tf":1.0},"353":{"tf":1.4142135623730951},"359":{"tf":1.0},"36":{"tf":1.4142135623730951},"99":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":1,"docs":{"26":{"tf":1.7320508075688772}},"s":{"=":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":17,"docs":{"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":2.0},"135":{"tf":2.0},"137":{"tf":1.7320508075688772},"146":{"tf":1.7320508075688772},"150":{"tf":1.0},"156":{"tf":1.0},"169":{"tf":1.0},"240":{"tf":1.0},"299":{"tf":5.477225575051661},"350":{"tf":1.0},"359":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"389":{"tf":1.0},"420":{"tf":1.4142135623730951},"423":{"tf":1.0}},"e":{"c":{"!":{"[":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}},"'":{"a":{"df":1,"docs":{"350":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":1,"docs":{"172":{"tf":1.4142135623730951}}}},"1":{"0":{"0":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":13,"docs":{"132":{"tf":1.0},"134":{"tf":1.7320508075688772},"137":{"tf":1.0},"156":{"tf":1.0},"241":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.4142135623730951},"299":{"tf":2.0},"368":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951},"389":{"tf":1.7320508075688772}}},"2":{"df":1,"docs":{"246":{"tf":1.0}}},"3":{"4":{"df":2,"docs":{"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"239":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{")":{";":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":9,"docs":{"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951},"389":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"<":{"&":{"'":{"a":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"228":{"tf":1.0}}}}}},"_":{"df":4,"docs":{"246":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.0},"400":{"tf":1.0}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":3,"docs":{"320":{"tf":1.0},"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":5,"docs":{"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"246":{"tf":1.4142135623730951},"299":{"tf":1.0},"331":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"<":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"c":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"o":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"385":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":16,"docs":{"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0},"289":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"335":{"tf":1.4142135623730951},"378":{"tf":1.0},"385":{"tf":1.4142135623730951}}}}},"t":{"df":11,"docs":{"131":{"tf":1.0},"132":{"tf":1.7320508075688772},"134":{"tf":1.0},"140":{"tf":1.0},"169":{"tf":1.0},"179":{"tf":1.7320508075688772},"243":{"tf":1.0},"273":{"tf":1.0},"294":{"tf":1.0},"334":{"tf":1.0},"378":{"tf":2.8284271247461903}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"405":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"3":{"2":{"df":1,"docs":{"389":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":2,"docs":{"142":{"tf":1.0},"417":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"df":19,"docs":{"132":{"tf":1.4142135623730951},"136":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"247":{"tf":1.4142135623730951},"289":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":4.69041575982343},"323":{"tf":1.7320508075688772},"335":{"tf":1.4142135623730951},"388":{"tf":1.0},"389":{"tf":3.0}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":49,"docs":{"10":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.7320508075688772},"132":{"tf":2.6457513110645907},"133":{"tf":1.7320508075688772},"134":{"tf":4.0},"135":{"tf":3.0},"136":{"tf":3.3166247903554},"137":{"tf":2.23606797749979},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.0},"152":{"tf":1.4142135623730951},"156":{"tf":2.0},"213":{"tf":1.0},"215":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":2.0},"229":{"tf":2.0},"231":{"tf":1.0},"241":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"243":{"tf":2.0},"244":{"tf":1.4142135623730951},"246":{"tf":2.23606797749979},"247":{"tf":2.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"289":{"tf":2.23606797749979},"299":{"tf":2.8284271247461903},"302":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.7320508075688772},"335":{"tf":1.0},"368":{"tf":2.0},"385":{"tf":1.4142135623730951},"389":{"tf":2.0},"398":{"tf":1.4142135623730951},"401":{"tf":1.0},"405":{"tf":3.1622776601683795},"422":{"tf":1.0},"54":{"tf":2.449489742783178},"79":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"131":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"334":{"tf":1.0}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"113":{"tf":2.0}}}}},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"156":{"tf":1.0},"324":{"tf":1.0}}}}},"df":1,"docs":{"263":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"196":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"261":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"17":{"tf":1.0},"241":{"tf":1.4142135623730951},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"260":{"tf":1.0},"262":{"tf":1.0},"32":{"tf":1.0},"322":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"40":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"413":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"353":{"tf":1.0},"428":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"429":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"(":{"a":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"s":{"df":2,"docs":{"113":{"tf":1.0},"252":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"。":{"df":0,"docs":{},"接":{"df":0,"docs":{},"着":{"df":0,"docs":{},"当":{"df":0,"docs":{},"新":{"df":0,"docs":{},"建":{"df":0,"docs":{},"线":{"df":0,"docs":{},"程":{"df":0,"docs":{},"开":{"df":0,"docs":{},"始":{"df":0,"docs":{},"执":{"df":0,"docs":{},"行":{"df":0,"docs":{},",":{"df":0,"docs":{},"v":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}}}}}}}}},"然":{"df":0,"docs":{},"而":{"df":0,"docs":{},"这":{"df":0,"docs":{},"有":{"df":0,"docs":{},"一":{"df":0,"docs":{},"个":{"df":0,"docs":{},"问":{"df":0,"docs":{},"题":{"df":0,"docs":{},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}}}}}}}}}}},"w":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"324":{"tf":1.0},"353":{"tf":1.0},"75":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"353":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"120":{"tf":1.0},"266":{"tf":1.0}}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"225":{"tf":1.0},"246":{"tf":1.0},"36":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"57":{"tf":1.0}}}}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"427":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":12,"docs":{"120":{"tf":2.0},"225":{"tf":1.7320508075688772},"246":{"tf":1.7320508075688772},"260":{"tf":1.0},"266":{"tf":1.7320508075688772},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"353":{"tf":1.7320508075688772},"36":{"tf":1.7320508075688772},"405":{"tf":2.23606797749979},"427":{"tf":1.0},"57":{"tf":2.0}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"376":{"tf":1.4142135623730951}}}},"y":{"df":1,"docs":{"196":{"tf":1.0}}}},"df":2,"docs":{"196":{"tf":1.0},"378":{"tf":1.4142135623730951}},"e":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}},"a":{"df":0,"docs":{},"k":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"t":{"df":3,"docs":{"286":{"tf":1.0},"294":{"tf":2.8284271247461903},"295":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"286":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":3.605551275463989}}}},"b":{"df":13,"docs":{"10":{"tf":1.0},"111":{"tf":1.0},"297":{"tf":1.0},"316":{"tf":1.0},"392":{"tf":1.4142135623730951},"395":{"tf":2.449489742783178},"396":{"tf":2.0},"397":{"tf":1.4142135623730951},"398":{"tf":1.0},"401":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.7320508075688772},"6":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"400":{"tf":1.0}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"’":{"df":0,"docs":{},"r":{"df":1,"docs":{"59":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"’":{"df":1,"docs":{"59":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"273":{"tf":1.0}}}}}},"w":{"df":1,"docs":{"59":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":12,"docs":{"100":{"tf":1.0},"199":{"tf":3.7416573867739413},"242":{"tf":4.0},"335":{"tf":2.23606797749979},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":2.23606797749979},"91":{"tf":3.3166247903554},"93":{"tf":3.0},"95":{"tf":2.6457513110645907},"96":{"tf":1.4142135623730951},"97":{"tf":2.0}},"、":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"335":{"tf":1.7320508075688772}},"、":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"335":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"。":{"df":0,"docs":{},"当":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"不":{"df":0,"docs":{},"使":{"df":0,"docs":{},"用":{"df":0,"docs":{},"圆":{"df":0,"docs":{},"括":{"df":0,"docs":{},"号":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{},"l":{"d":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":10,"docs":{"111":{"tf":1.0},"12":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.0},"24":{"tf":2.23606797749979},"27":{"tf":1.7320508075688772},"42":{"tf":1.0},"436":{"tf":2.0}}}}},"df":9,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"389":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"191":{"tf":1.0},"273":{"tf":1.0},"376":{"tf":1.0},"433":{"tf":1.0}}}}}}},"z":{"a":{"df":0,"docs":{},"r":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"r":{"d":{"df":4,"docs":{"150":{"tf":1.0},"191":{"tf":1.7320508075688772},"77":{"tf":2.8284271247461903},"78":{"tf":4.47213595499958}}},"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"191":{"tf":1.7320508075688772},"230":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\"":{")":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"407":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"407":{"tf":1.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":1,"docs":{"407":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"405":{"tf":2.449489742783178},"407":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"405":{"tf":10.099504938362077},"407":{"tf":7.280109889280518},"408":{"tf":7.416198487095663}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"405":{"tf":1.0}}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"406":{"tf":1.0}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":4,"docs":{"110":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.4142135623730951},"266":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"264":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"!":{"df":0,"docs":{},"。":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}}},"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"162":{"tf":1.0}}}}}}},"df":24,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"150":{"tf":1.7320508075688772},"191":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"21":{"tf":1.0},"22":{"tf":2.449489742783178},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"26":{"tf":2.0},"266":{"tf":1.4142135623730951},"27":{"tf":2.23606797749979},"30":{"tf":1.0},"32":{"tf":2.0},"369":{"tf":1.0},"55":{"tf":1.7320508075688772},"59":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":3.1622776601683795}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"386":{"tf":1.0},"407":{"tf":1.0},"53":{"tf":2.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"378":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"378":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"378":{"tf":2.8284271247461903}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"a":{"d":{"d":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"df":2,"docs":{"377":{"tf":1.0},"378":{"tf":1.0}}}},"df":0,"docs":{}},"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"274":{"tf":1.0},"359":{"tf":1.4142135623730951}}}}}},"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"399":{"tf":1.4142135623730951}},"l":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":5,"docs":{"101":{"tf":1.0},"125":{"tf":1.0},"197":{"tf":1.0},"233":{"tf":1.0},"381":{"tf":2.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"x":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"+":{"1":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},".":{"0":{"df":1,"docs":{"54":{"tf":1.0}}},"1":{"df":1,"docs":{"54":{"tf":1.0}}},"2":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"186":{"tf":1.0},"188":{"tf":1.7320508075688772},"194":{"tf":1.0}}}}},"y":{".":{"df":0,"docs":{},"z":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}},"1":{"df":1,"docs":{"175":{"tf":2.0}}},"2":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"8":{"6":{"_":{"6":{"4":{"df":1,"docs":{"436":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"389":{"tf":1.7320508075688772}}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}},"df":56,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"105":{"tf":2.449489742783178},"106":{"tf":1.4142135623730951},"173":{"tf":4.358898943540674},"175":{"tf":4.358898943540674},"183":{"tf":1.7320508075688772},"185":{"tf":4.47213595499958},"186":{"tf":2.23606797749979},"188":{"tf":2.6457513110645907},"189":{"tf":1.7320508075688772},"194":{"tf":1.4142135623730951},"240":{"tf":3.605551275463989},"242":{"tf":1.0},"246":{"tf":2.0},"257":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"274":{"tf":1.0},"277":{"tf":2.449489742783178},"278":{"tf":2.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"289":{"tf":2.23606797749979},"345":{"tf":1.0},"347":{"tf":1.4142135623730951},"350":{"tf":1.4142135623730951},"351":{"tf":3.3166247903554},"352":{"tf":2.23606797749979},"353":{"tf":2.449489742783178},"355":{"tf":1.7320508075688772},"356":{"tf":4.123105625617661},"357":{"tf":2.0},"358":{"tf":2.23606797749979},"359":{"tf":6.4031242374328485},"360":{"tf":2.6457513110645907},"361":{"tf":4.242640687119285},"37":{"tf":1.7320508075688772},"375":{"tf":2.449489742783178},"377":{"tf":2.449489742783178},"381":{"tf":2.0},"385":{"tf":1.0},"386":{"tf":2.0},"389":{"tf":1.4142135623730951},"398":{"tf":1.0},"416":{"tf":1.0},"428":{"tf":2.23606797749979},"49":{"tf":5.0},"51":{"tf":4.123105625617661},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"56":{"tf":2.449489742783178},"57":{"tf":3.4641016151377544},"58":{"tf":4.123105625617661},"70":{"tf":3.1622776601683795},"71":{"tf":2.449489742783178},"94":{"tf":1.7320508075688772}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"213":{"tf":1.0}}}}}}}}}},"y":{"df":0,"docs":{},"z":{"df":4,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":1.0},"189":{"tf":1.0},"194":{"tf":1.0}}}},"、":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"个":{"df":0,"docs":{},"假":{"df":0,"docs":{},"想":{"df":0,"docs":{},"的":{"df":0,"docs":{},"例":{"df":0,"docs":{},"子":{"df":0,"docs":{},"中":{"df":0,"docs":{},",":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"356":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}}},",":{"2":{"df":1,"docs":{"351":{"tf":1.0}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"185":{"tf":1.0}}}}}}}},"y":{".":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"186":{"tf":1.0},"188":{"tf":1.7320508075688772},"194":{"tf":1.0}}}}}},"1":{"df":1,"docs":{"175":{"tf":2.449489742783178}}},"2":{">":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"175":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"175":{"tf":2.23606797749979}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"94":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"263":{"tf":2.449489742783178}}}}},"df":33,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"172":{"tf":1.0},"173":{"tf":4.242640687119285},"175":{"tf":3.4641016151377544},"183":{"tf":2.0},"186":{"tf":2.8284271247461903},"188":{"tf":3.1622776601683795},"189":{"tf":2.23606797749979},"191":{"tf":1.7320508075688772},"194":{"tf":1.4142135623730951},"274":{"tf":1.0},"277":{"tf":2.8284271247461903},"278":{"tf":2.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.7320508075688772},"289":{"tf":1.4142135623730951},"350":{"tf":1.0},"351":{"tf":2.23606797749979},"352":{"tf":2.0},"356":{"tf":3.872983346207417},"359":{"tf":6.324555320336759},"360":{"tf":3.1622776601683795},"361":{"tf":4.69041575982343},"37":{"tf":2.0},"375":{"tf":2.449489742783178},"377":{"tf":2.449489742783178},"381":{"tf":2.449489742783178},"53":{"tf":1.0},"54":{"tf":2.0},"57":{"tf":3.872983346207417},"70":{"tf":2.8284271247461903},"94":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"102":{"tf":1.0},"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"df":1,"docs":{"361":{"tf":1.0}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"148":{"tf":1.0},"150":{"tf":1.0},"258":{"tf":2.449489742783178}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"322":{"tf":2.23606797749979}}}}}},"df":2,"docs":{"322":{"tf":1.7320508075688772},"413":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"u":{"'":{"df":0,"docs":{},"r":{"df":2,"docs":{"401":{"tf":1.0},"75":{"tf":1.0}}},"v":{"df":2,"docs":{"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"y":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}},"”":{"df":0,"docs":{},"。":{"df":0,"docs":{},"现":{"df":0,"docs":{},"在":{"df":0,"docs":{},"有":{"df":0,"docs":{},"了":{"df":0,"docs":{},"两":{"df":0,"docs":{},"个":{"df":0,"docs":{},"变":{"df":0,"docs":{},"量":{"df":0,"docs":{},",":{"df":0,"docs":{},"x":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}}}}}}}},"(":{"df":0,"docs":{},"其":{"df":0,"docs":{},"值":{"df":0,"docs":{},"为":{"c":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}}},"z":{"df":7,"docs":{"277":{"tf":1.0},"301":{"tf":1.0},"351":{"tf":1.4142135623730951},"360":{"tf":2.0},"53":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951},"70":{"tf":1.0}},"e":{"df":1,"docs":{"142":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"o":{"df":5,"docs":{"252":{"tf":1.7320508075688772},"405":{"tf":3.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772},"61":{"tf":1.4142135623730951}}}}},"h":{"df":1,"docs":{"0":{"tf":1.0}}},"i":{"df":0,"docs":{},"p":{"(":{"&":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"252":{"tf":1.0}}}}}}},"breadcrumbs":{"root":{"0":{".":{".":{"1":{"0":{"0":{"df":1,"docs":{"427":{"tf":1.7320508075688772}}},"df":1,"docs":{"306":{"tf":2.23606797749979}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"143":{"tf":1.0}}},"5":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"405":{"tf":3.1622776601683795},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"0":{"0":{"df":14,"docs":{"198":{"tf":2.23606797749979},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"266":{"tf":2.449489742783178},"290":{"tf":1.0}}},"2":{"df":1,"docs":{"41":{"tf":1.0}}},"df":10,"docs":{"175":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"232":{"tf":1.0},"255":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"94":{"tf":1.4142135623730951}}},"1":{".":{"0":{"df":4,"docs":{"26":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"32":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"261":{"tf":1.0}}},"df":0,"docs":{}},"2":{"4":{"df":1,"docs":{"405":{"tf":1.0}}},"5":{"df":1,"docs":{"155":{"tf":1.0}}},"7":{"df":4,"docs":{"156":{"tf":1.0},"239":{"tf":1.0},"257":{"tf":1.0},"266":{"tf":1.0}}},"8":{"df":1,"docs":{"55":{"tf":1.0}}},"9":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}},"3":{".":{"3":{"0":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"0":{"5":{":":{"1":{"4":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"9":{":":{"8":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":3,"docs":{"49":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.0}}},"1":{"df":3,"docs":{"51":{"tf":1.0},"56":{"tf":1.0},"61":{"tf":1.7320508075688772}}},"2":{"df":2,"docs":{"27":{"tf":1.0},"62":{"tf":1.0}}},"3":{"df":1,"docs":{"27":{"tf":1.0}}},"8":{"df":1,"docs":{"229":{"tf":1.0}}},"9":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"4":{"1":{"df":1,"docs":{"242":{"tf":1.0}}},"2":{"df":2,"docs":{"398":{"tf":1.0},"88":{"tf":1.0}}},"3":{"df":3,"docs":{"143":{"tf":1.0},"241":{"tf":1.4142135623730951},"42":{"tf":1.0}}},"5":{"df":1,"docs":{"286":{"tf":1.0}}},"6":{"df":1,"docs":{"376":{"tf":1.0}}},"7":{"df":1,"docs":{"246":{"tf":1.0}}},"8":{"df":3,"docs":{"224":{"tf":1.0},"376":{"tf":1.0},"91":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"427":{"tf":1.0}}},"2":{"df":1,"docs":{"350":{"tf":1.0}}},"3":{"df":1,"docs":{"293":{"tf":1.0}}},"4":{"df":1,"docs":{"376":{"tf":1.0}}},"7":{"df":1,"docs":{"198":{"tf":1.0}}},"8":{"df":4,"docs":{"200":{"tf":1.0},"202":{"tf":1.0},"206":{"tf":1.0},"62":{"tf":1.0}}},"9":{"df":3,"docs":{"198":{"tf":1.0},"36":{"tf":1.0},"427":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":3,"docs":{"206":{"tf":1.0},"208":{"tf":1.0},"283":{"tf":1.0}}},"1":{"df":5,"docs":{"200":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"216":{"tf":1.0},"91":{"tf":1.0}}},"2":{"df":2,"docs":{"202":{"tf":1.0},"207":{"tf":1.0}}},"3":{"df":1,"docs":{"291":{"tf":1.0}}},"4":{"df":1,"docs":{"211":{"tf":1.0}}},"6":{"df":2,"docs":{"199":{"tf":1.7320508075688772},"202":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"9":{"df":1,"docs":{"207":{"tf":1.0}}},"df":0,"docs":{}},"7":{"1":{"df":1,"docs":{"225":{"tf":1.0}}},"2":{"df":1,"docs":{"198":{"tf":1.0}}},"3":{"df":2,"docs":{"157":{"tf":1.0},"283":{"tf":1.0}}},"5":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"df":0,"docs":{}},"8":{".":{"5":{"df":3,"docs":{"124":{"tf":1.0},"266":{"tf":1.0},"40":{"tf":2.8284271247461903}}},"6":{"df":1,"docs":{"40":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"267":{"tf":1.0}}},"9":{"df":1,"docs":{"211":{"tf":1.0}}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"40":{"tf":2.6457513110645907}}},"df":0,"docs":{},"x":{"df":1,"docs":{"40":{"tf":1.0}}}},"1":{"df":2,"docs":{"201":{"tf":1.0},"290":{"tf":1.0}}},"3":{"df":1,"docs":{"201":{"tf":1.0}}},"7":{"df":1,"docs":{"228":{"tf":1.0}}},"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"410":{"tf":1.0}}},"df":0,"docs":{}}},"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"4":{"5":{"8":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"b":{"1":{"7":{"5":{"df":0,"docs":{},"f":{"1":{"b":{"8":{"4":{"7":{"0":{"b":{"5":{"b":{"1":{"2":{"df":0,"docs":{},"e":{"4":{"a":{"6":{"3":{"d":{"6":{"7":{"0":{"df":0,"docs":{},"e":{"4":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":22,"docs":{"110":{"tf":1.0},"12":{"tf":1.0},"130":{"tf":1.0},"153":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.0},"2":{"tf":1.0},"213":{"tf":1.0},"237":{"tf":1.0},"254":{"tf":1.0},"270":{"tf":1.0},"296":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"328":{"tf":1.0},"345":{"tf":1.0},"364":{"tf":1.0},"395":{"tf":1.0},"47":{"tf":1.0},"64":{"tf":1.0},"81":{"tf":1.0},"99":{"tf":1.0}}},"1":{"df":21,"docs":{"100":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"131":{"tf":1.0},"154":{"tf":1.0},"171":{"tf":1.0},"197":{"tf":1.0},"214":{"tf":1.0},"238":{"tf":1.0},"255":{"tf":1.0},"271":{"tf":1.0},"297":{"tf":1.0},"315":{"tf":1.0},"329":{"tf":1.0},"346":{"tf":1.0},"365":{"tf":1.0},"396":{"tf":1.0},"411":{"tf":1.0},"49":{"tf":1.0},"65":{"tf":1.0},"82":{"tf":1.0}}},"2":{"a":{"1":{"6":{"8":{"df":0,"docs":{},"e":{"d":{"3":{"4":{"6":{"0":{"4":{"2":{"df":0,"docs":{},"f":{"0":{"7":{"0":{"1":{"0":{"df":0,"docs":{},"f":{"8":{"b":{"6":{"5":{"b":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"6":{"2":{"3":{"d":{"d":{"3":{"1":{"d":{"1":{"df":4,"docs":{"213":{"tf":1.0},"214":{"tf":1.0},"218":{"tf":1.0},"233":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":22,"docs":{"0":{"tf":1.0},"103":{"tf":1.0},"112":{"tf":1.0},"138":{"tf":1.0},"142":{"tf":1.0},"157":{"tf":1.0},"177":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"218":{"tf":1.0},"243":{"tf":1.0},"256":{"tf":1.0},"276":{"tf":1.0},"300":{"tf":1.0},"317":{"tf":1.0},"333":{"tf":1.0},"353":{"tf":1.4142135623730951},"403":{"tf":1.0},"415":{"tf":1.0},"52":{"tf":1.0},"73":{"tf":1.0},"88":{"tf":1.0}}},"3":{"df":21,"docs":{"108":{"tf":1.0},"115":{"tf":1.0},"146":{"tf":1.0},"163":{"tf":1.0},"184":{"tf":1.0},"209":{"tf":1.0},"219":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.0},"264":{"tf":1.0},"283":{"tf":1.0},"304":{"tf":1.0},"320":{"tf":1.0},"337":{"tf":1.0},"354":{"tf":1.0},"373":{"tf":1.0},"406":{"tf":1.0},"418":{"tf":1.0},"55":{"tf":1.0},"77":{"tf":1.0},"92":{"tf":1.0}}},"4":{"df":11,"docs":{"120":{"tf":1.0},"227":{"tf":1.0},"241":{"tf":1.0},"252":{"tf":1.0},"267":{"tf":1.0},"284":{"tf":1.0},"308":{"tf":1.0},"324":{"tf":1.0},"379":{"tf":1.0},"425":{"tf":1.0},"59":{"tf":1.0}}},"5":{"1":{"4":{"b":{"1":{"c":{"df":0,"docs":{},"f":{"3":{"4":{"c":{"2":{"df":0,"docs":{},"e":{"a":{"a":{"b":{"8":{"2":{"8":{"5":{"df":0,"docs":{},"f":{"4":{"3":{"3":{"0":{"5":{"c":{"1":{"0":{"a":{"8":{"7":{"df":0,"docs":{},"f":{"4":{"c":{"df":0,"docs":{},"e":{"3":{"4":{"a":{"0":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"b":{"0":{"d":{"3":{"3":{"8":{"2":{"2":{"9":{"b":{"8":{"7":{"d":{"0":{"6":{"b":{"df":0,"docs":{},"e":{"7":{"7":{"2":{"3":{"4":{"6":{"df":0,"docs":{},"e":{"a":{"0":{"b":{"6":{"4":{"3":{"b":{"d":{"df":0,"docs":{},"e":{"c":{"d":{"c":{"5":{"df":1,"docs":{"365":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":9,"docs":{"0":{"tf":1.0},"127":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"268":{"tf":1.0},"287":{"tf":1.0},"384":{"tf":1.0},"430":{"tf":1.0},"60":{"tf":1.0}}},"6":{"df":4,"docs":{"233":{"tf":1.0},"292":{"tf":1.0},"387":{"tf":1.0},"431":{"tf":1.0}}},"7":{"df":1,"docs":{"432":{"tf":1.0}}},"b":{"1":{"1":{"1":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"2":{"d":{"4":{"1":{"df":0,"docs":{},"e":{"2":{"a":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"7":{"3":{"4":{"8":{"2":{"5":{"c":{"3":{"a":{"1":{"2":{"0":{"8":{"7":{"d":{"4":{"2":{"3":{"df":0,"docs":{},"e":{"8":{"c":{"2":{"df":0,"docs":{},"f":{"0":{"a":{"df":0,"docs":{},"e":{"5":{"3":{"df":2,"docs":{"346":{"tf":1.0},"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":54,"docs":{"101":{"tf":1.7320508075688772},"108":{"tf":1.4142135623730951},"134":{"tf":1.0},"142":{"tf":1.0},"150":{"tf":1.0},"156":{"tf":1.7320508075688772},"162":{"tf":1.7320508075688772},"198":{"tf":5.0990195135927845},"199":{"tf":4.795831523312719},"200":{"tf":3.7416573867739413},"201":{"tf":2.8284271247461903},"202":{"tf":4.242640687119285},"206":{"tf":2.449489742783178},"207":{"tf":4.0},"208":{"tf":4.242640687119285},"211":{"tf":6.244997998398398},"228":{"tf":2.0},"229":{"tf":4.0},"232":{"tf":4.0},"239":{"tf":1.4142135623730951},"242":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.7320508075688772},"257":{"tf":2.0},"266":{"tf":5.291502622129181},"280":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":1.7320508075688772},"290":{"tf":2.23606797749979},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":3.0},"306":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"350":{"tf":1.7320508075688772},"359":{"tf":3.7416573867739413},"360":{"tf":1.7320508075688772},"361":{"tf":2.449489742783178},"369":{"tf":1.0},"374":{"tf":1.0},"375":{"tf":1.0},"378":{"tf":1.0},"391":{"tf":1.0},"405":{"tf":3.4641016151377544},"407":{"tf":2.0},"408":{"tf":3.3166247903554},"53":{"tf":2.0},"54":{"tf":1.4142135623730951},"61":{"tf":2.23606797749979},"62":{"tf":2.8284271247461903},"78":{"tf":1.0},"85":{"tf":2.0},"90":{"tf":1.0},"93":{"tf":1.7320508075688772}},"o":{"7":{"7":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"3":{"2":{".":{".":{"2":{"0":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"x":{"0":{"1":{"2":{"3":{"4":{"5":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"367":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"368":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"53":{"tf":1.0}}}}},"、":{"1":{"df":0,"docs":{},"、":{"2":{"df":0,"docs":{},"、":{"3":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},",":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"89":{"tf":1.0}}}}}}}}}},"1":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"246":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{".":{"1":{"0":{"0":{"0":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"324":{"tf":1.0}}},"df":2,"docs":{"298":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"4":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"62":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":2,"docs":{"298":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772}}},"=":{"1":{"0":{"0":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{"1":{"df":1,"docs":{"263":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":6,"docs":{"173":{"tf":1.4142135623730951},"191":{"tf":1.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"391":{"tf":1.0},"408":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"430":{"tf":1.0}}},"df":1,"docs":{"399":{"tf":1.0}}},"2":{"1":{"df":1,"docs":{"56":{"tf":1.0}}},"2":{"df":1,"docs":{"229":{"tf":1.0}}},"df":0,"docs":{}},"3":{"1":{"df":1,"docs":{"211":{"tf":1.0}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"430":{"tf":1.0}}}}}}}},"3":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"5":{"0":{"df":2,"docs":{"32":{"tf":1.0},"43":{"tf":1.0}}},"7":{"df":1,"docs":{"216":{"tf":1.0}}},"df":1,"docs":{"434":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"434":{"tf":1.0}}},"7":{"8":{".":{"0":{"df":0,"docs":{},"(":{"2":{"0":{"2":{"4":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"=":{"1":{"2":{"df":1,"docs":{"362":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"5":{"df":1,"docs":{"398":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"368":{"tf":1.0}}},"df":4,"docs":{"322":{"tf":1.0},"358":{"tf":1.0},"375":{"tf":1.0},"53":{"tf":1.0}}},"df":14,"docs":{"134":{"tf":1.4142135623730951},"156":{"tf":1.0},"167":{"tf":3.3166247903554},"170":{"tf":2.449489742783178},"172":{"tf":1.7320508075688772},"202":{"tf":4.0},"232":{"tf":1.0},"289":{"tf":2.0},"290":{"tf":1.0},"31":{"tf":1.0},"39":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.0}}},"2":{"3":{"df":1,"docs":{"397":{"tf":1.0}}},"df":2,"docs":{"207":{"tf":1.0},"320":{"tf":1.0}}},"4":{"df":1,"docs":{"142":{"tf":1.0}}},"5":{"df":1,"docs":{"320":{"tf":1.0}}},"8":{"2":{"c":{"4":{"b":{"0":{"6":{"3":{"a":{"8":{"df":0,"docs":{},"f":{"b":{"df":0,"docs":{},"e":{"6":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":73,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":1.0},"137":{"tf":1.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.7320508075688772},"150":{"tf":2.449489742783178},"162":{"tf":1.7320508075688772},"170":{"tf":3.1622776601683795},"172":{"tf":2.23606797749979},"173":{"tf":2.8284271247461903},"175":{"tf":3.4641016151377544},"176":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"183":{"tf":1.4142135623730951},"185":{"tf":3.0},"186":{"tf":2.6457513110645907},"188":{"tf":2.8284271247461903},"190":{"tf":1.4142135623730951},"191":{"tf":2.23606797749979},"192":{"tf":1.4142135623730951},"194":{"tf":1.0},"196":{"tf":1.0},"198":{"tf":1.0},"202":{"tf":1.0},"206":{"tf":2.8284271247461903},"224":{"tf":1.4142135623730951},"225":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":2.0},"243":{"tf":1.4142135623730951},"247":{"tf":2.23606797749979},"266":{"tf":1.4142135623730951},"267":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":2.0},"291":{"tf":1.4142135623730951},"293":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.7320508075688772},"303":{"tf":1.0},"306":{"tf":2.449489742783178},"319":{"tf":2.0},"320":{"tf":1.0},"322":{"tf":2.449489742783178},"324":{"tf":2.0},"332":{"tf":1.0},"335":{"tf":2.0},"341":{"tf":1.0},"353":{"tf":1.4142135623730951},"356":{"tf":2.0},"359":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951},"360":{"tf":1.0},"361":{"tf":1.0},"369":{"tf":1.4142135623730951},"37":{"tf":1.0},"404":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"62":{"tf":3.1622776601683795},"90":{"tf":1.4142135623730951},"91":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":2.0}}},"、":{"1":{"1":{"df":1,"docs":{"362":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"148":{"tf":1.0}}}}}},",":{"df":0,"docs":{},"之":{"df":0,"docs":{},"后":{"df":0,"docs":{},"是":{"df":0,"docs":{},"另":{"df":0,"docs":{},"两":{"df":0,"docs":{},"个":{"df":0,"docs":{},"列":{"df":0,"docs":{},"表":{"df":0,"docs":{},":":{"b":{"df":1,"docs":{"285":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}},":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"280":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"1":{":":{"4":{"3":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"3":{"d":{"5":{"0":{"8":{"b":{"0":{"a":{"2":{"8":{"b":{"0":{"3":{"df":0,"docs":{},"f":{"7":{"d":{"9":{"df":0,"docs":{},"f":{"1":{"6":{"c":{"8":{"8":{"7":{"2":{"6":{"0":{"8":{"8":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"f":{"d":{"8":{"7":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":38,"docs":{"120":{"tf":1.7320508075688772},"121":{"tf":1.7320508075688772},"123":{"tf":1.0},"140":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"189":{"tf":1.0},"192":{"tf":1.0},"198":{"tf":2.8284271247461903},"199":{"tf":2.0},"200":{"tf":1.4142135623730951},"202":{"tf":2.23606797749979},"203":{"tf":1.0},"206":{"tf":1.7320508075688772},"207":{"tf":2.0},"210":{"tf":1.4142135623730951},"211":{"tf":2.0},"225":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"266":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"303":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"337":{"tf":1.4142135623730951},"339":{"tf":1.0},"340":{"tf":1.4142135623730951},"341":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.0},"370":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"57":{"tf":1.0},"91":{"tf":1.4142135623730951}},":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"281":{"tf":1.0}}}}}}}}},"2":{".":{".":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":1.0}}}},"df":0,"docs":{}},"7":{".":{"0":{".":{"0":{".":{"1":{":":{"7":{"8":{"7":{"8":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"401":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}}}},"df":5,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"165":{"tf":1.4142135623730951}},"。":{"df":0,"docs":{},"第":{"df":0,"docs":{},"二":{"df":0,"docs":{},"个":{"df":0,"docs":{},"实":{"df":0,"docs":{},"例":{"df":0,"docs":{},",":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},",":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.0}}},"8":{"1":{"3":{"5":{"6":{"1":{"3":{"9":{"2":{"8":{"7":{"2":{"0":{"6":{"5":{"9":{"7":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":45,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"156":{"tf":1.0},"162":{"tf":1.4142135623730951},"178":{"tf":1.0},"180":{"tf":1.0},"200":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"215":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"218":{"tf":2.0},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.8284271247461903},"225":{"tf":2.8284271247461903},"226":{"tf":2.0},"228":{"tf":2.0},"229":{"tf":2.449489742783178},"231":{"tf":1.7320508075688772},"232":{"tf":2.6457513110645907},"235":{"tf":1.4142135623730951},"242":{"tf":2.0},"244":{"tf":1.4142135623730951},"246":{"tf":1.0},"249":{"tf":2.23606797749979},"250":{"tf":1.4142135623730951},"252":{"tf":2.23606797749979},"281":{"tf":1.7320508075688772},"306":{"tf":2.23606797749979},"319":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"359":{"tf":1.7320508075688772},"362":{"tf":1.0},"37":{"tf":1.0},"374":{"tf":1.7320508075688772},"400":{"tf":1.0},"405":{"tf":2.23606797749979},"434":{"tf":1.0},"51":{"tf":1.4142135623730951},"54":{"tf":1.0},"91":{"tf":1.4142135623730951}},"。":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"385":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"然":{"df":0,"docs":{},"而":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}}}}},":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"178":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"3":{"5":{"df":1,"docs":{"142":{"tf":1.0}}},"df":32,"docs":{"121":{"tf":2.0},"140":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"181":{"tf":1.0},"211":{"tf":1.4142135623730951},"224":{"tf":1.0},"226":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":3.1622776601683795},"242":{"tf":2.6457513110645907},"243":{"tf":2.0},"244":{"tf":1.4142135623730951},"245":{"tf":2.0},"246":{"tf":2.23606797749979},"247":{"tf":1.7320508075688772},"249":{"tf":2.8284271247461903},"250":{"tf":2.23606797749979},"251":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"329":{"tf":1.0},"339":{"tf":1.4142135623730951},"359":{"tf":1.7320508075688772},"374":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"93":{"tf":1.4142135623730951},"95":{"tf":1.0}}},"4":{"1":{"df":1,"docs":{"142":{"tf":1.0}}},"df":22,"docs":{"121":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"142":{"tf":1.0},"180":{"tf":1.0},"226":{"tf":1.4142135623730951},"246":{"tf":1.7320508075688772},"257":{"tf":3.1622776601683795},"258":{"tf":4.0},"266":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":1.7320508075688772},"306":{"tf":1.7320508075688772},"309":{"tf":1.0},"320":{"tf":1.4142135623730951},"332":{"tf":1.0},"340":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"375":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"59":{"tf":1.0},"91":{"tf":1.0},"95":{"tf":1.7320508075688772}},":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"5":{"0":{"0":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"1":{"df":2,"docs":{"142":{"tf":1.0},"144":{"tf":1.0}}},"df":39,"docs":{"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"183":{"tf":1.4142135623730951},"199":{"tf":1.0},"228":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.4142135623730951},"272":{"tf":1.7320508075688772},"273":{"tf":2.6457513110645907},"274":{"tf":1.7320508075688772},"275":{"tf":2.449489742783178},"277":{"tf":1.4142135623730951},"278":{"tf":2.449489742783178},"279":{"tf":2.449489742783178},"280":{"tf":2.23606797749979},"281":{"tf":3.1622776601683795},"283":{"tf":3.3166247903554},"285":{"tf":2.8284271247461903},"286":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":2.0},"291":{"tf":2.8284271247461903},"293":{"tf":3.1622776601683795},"294":{"tf":2.8284271247461903},"304":{"tf":1.0},"306":{"tf":2.23606797749979},"307":{"tf":1.4142135623730951},"320":{"tf":1.0},"322":{"tf":1.7320508075688772},"341":{"tf":1.4142135623730951},"359":{"tf":1.7320508075688772},"375":{"tf":1.4142135623730951},"380":{"tf":1.0},"381":{"tf":1.0},"405":{"tf":1.7320508075688772},"407":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"6":{"0":{"8":{"6":{"9":{"df":0,"docs":{},"f":{"3":{"8":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"9":{"1":{"6":{"6":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"359":{"tf":1.7320508075688772}}},"4":{"df":1,"docs":{"142":{"tf":2.23606797749979}}},"5":{"df":1,"docs":{"142":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"142":{"tf":1.0}}},"df":27,"docs":{"122":{"tf":1.7320508075688772},"141":{"tf":1.4142135623730951},"185":{"tf":1.7320508075688772},"228":{"tf":1.4142135623730951},"231":{"tf":1.0},"242":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"283":{"tf":2.0},"298":{"tf":2.6457513110645907},"299":{"tf":3.605551275463989},"300":{"tf":2.6457513110645907},"301":{"tf":1.7320508075688772},"302":{"tf":2.23606797749979},"303":{"tf":1.7320508075688772},"306":{"tf":3.3166247903554},"309":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.4142135623730951},"342":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"360":{"tf":2.23606797749979},"376":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"53":{"tf":1.0},"78":{"tf":1.0},"97":{"tf":1.4142135623730951}},"、":{"1":{"0":{"df":1,"docs":{"185":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"7":{"0":{"b":{"9":{"4":{"2":{"df":0,"docs":{},"e":{"b":{"5":{"b":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"3":{"a":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"df":1,"docs":{"142":{"tf":1.0}}},"df":36,"docs":{"123":{"tf":1.4142135623730951},"127":{"tf":1.0},"141":{"tf":1.4142135623730951},"185":{"tf":1.4142135623730951},"186":{"tf":1.0},"191":{"tf":1.0},"229":{"tf":1.4142135623730951},"242":{"tf":1.0},"249":{"tf":1.4142135623730951},"285":{"tf":1.7320508075688772},"314":{"tf":2.0},"316":{"tf":3.7416573867739413},"318":{"tf":2.449489742783178},"319":{"tf":3.3166247903554},"320":{"tf":3.7416573867739413},"321":{"tf":1.4142135623730951},"322":{"tf":3.3166247903554},"323":{"tf":2.449489742783178},"324":{"tf":2.449489742783178},"325":{"tf":1.4142135623730951},"331":{"tf":2.0},"334":{"tf":2.8284271247461903},"335":{"tf":3.0},"336":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"339":{"tf":1.7320508075688772},"340":{"tf":2.0},"341":{"tf":1.7320508075688772},"342":{"tf":3.0},"343":{"tf":2.8284271247461903},"360":{"tf":1.4142135623730951},"376":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"407":{"tf":1.0},"78":{"tf":1.0}},":":{"df":0,"docs":{},"r":{"df":1,"docs":{"185":{"tf":1.0}}}}},"8":{"0":{"df":1,"docs":{"144":{"tf":1.0}}},"4":{"df":1,"docs":{"142":{"tf":1.0}}},"df":22,"docs":{"125":{"tf":1.4142135623730951},"141":{"tf":2.0},"142":{"tf":1.0},"185":{"tf":1.4142135623730951},"186":{"tf":1.0},"229":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"249":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"342":{"tf":1.4142135623730951},"353":{"tf":2.6457513110645907},"356":{"tf":1.4142135623730951},"359":{"tf":3.605551275463989},"360":{"tf":4.47213595499958},"361":{"tf":2.6457513110645907},"362":{"tf":1.4142135623730951},"376":{"tf":2.0},"405":{"tf":1.4142135623730951},"78":{"tf":1.0}}},"9":{",":{"2":{"3":{"4":{",":{"9":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"2":{"0":{",":{"3":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"7":{"df":1,"docs":{"328":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}},"9":{"4":{"df":1,"docs":{"330":{"tf":1.0}}},"9":{"df":1,"docs":{"104":{"tf":1.0}}},"c":{"a":{"9":{"9":{"9":{"2":{"6":{"df":0,"docs":{},"f":{"2":{"3":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"f":{"5":{"8":{"1":{"a":{"9":{"1":{"7":{"df":0,"docs":{},"e":{"a":{"d":{"a":{"4":{"b":{"6":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"2":{"1":{"7":{"5":{"4":{"df":1,"docs":{"153":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":35,"docs":{"125":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"188":{"tf":1.0},"225":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"348":{"tf":1.7320508075688772},"349":{"tf":1.7320508075688772},"350":{"tf":1.7320508075688772},"351":{"tf":2.0},"352":{"tf":2.0},"360":{"tf":1.4142135623730951},"367":{"tf":2.8284271247461903},"368":{"tf":3.3166247903554},"369":{"tf":2.0},"370":{"tf":1.4142135623730951},"374":{"tf":2.449489742783178},"375":{"tf":2.0},"376":{"tf":4.0},"377":{"tf":1.4142135623730951},"378":{"tf":1.4142135623730951},"380":{"tf":1.0},"381":{"tf":2.23606797749979},"382":{"tf":2.0},"385":{"tf":1.4142135623730951},"389":{"tf":1.7320508075688772},"390":{"tf":1.4142135623730951},"391":{"tf":3.872983346207417},"405":{"tf":1.4142135623730951},"78":{"tf":1.0}},":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"186":{"tf":1.0}}}}},"df":0,"docs":{}}}},":":{"1":{"df":1,"docs":{"297":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"_":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":138,"docs":{"0":{"tf":1.0},"101":{"tf":2.0},"102":{"tf":1.0},"103":{"tf":1.7320508075688772},"104":{"tf":1.0},"105":{"tf":2.0},"106":{"tf":1.7320508075688772},"108":{"tf":1.4142135623730951},"114":{"tf":2.0},"115":{"tf":1.0},"120":{"tf":1.7320508075688772},"132":{"tf":1.7320508075688772},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"150":{"tf":1.7320508075688772},"151":{"tf":1.0},"156":{"tf":2.0},"162":{"tf":1.0},"167":{"tf":3.3166247903554},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"173":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":3.1622776601683795},"199":{"tf":3.1622776601683795},"200":{"tf":2.0},"201":{"tf":2.0},"202":{"tf":4.358898943540674},"203":{"tf":1.0},"206":{"tf":2.0},"207":{"tf":1.7320508075688772},"208":{"tf":2.23606797749979},"211":{"tf":3.1622776601683795},"215":{"tf":1.4142135623730951},"217":{"tf":1.0},"22":{"tf":2.0},"221":{"tf":1.0},"224":{"tf":2.449489742783178},"225":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":1.4142135623730951},"23":{"tf":1.0},"232":{"tf":1.0},"239":{"tf":2.0},"240":{"tf":2.6457513110645907},"241":{"tf":2.8284271247461903},"242":{"tf":2.6457513110645907},"246":{"tf":2.6457513110645907},"255":{"tf":1.4142135623730951},"257":{"tf":3.0},"26":{"tf":2.0},"266":{"tf":2.8284271247461903},"267":{"tf":1.0},"272":{"tf":1.7320508075688772},"273":{"tf":2.449489742783178},"274":{"tf":1.4142135623730951},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":2.0},"289":{"tf":2.0},"290":{"tf":1.7320508075688772},"293":{"tf":2.0},"294":{"tf":2.449489742783178},"298":{"tf":3.1622776601683795},"299":{"tf":1.7320508075688772},"301":{"tf":1.0},"306":{"tf":2.6457513110645907},"31":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.7320508075688772},"318":{"tf":2.449489742783178},"324":{"tf":2.449489742783178},"33":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"335":{"tf":1.0},"347":{"tf":1.0},"348":{"tf":1.7320508075688772},"349":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":2.449489742783178},"353":{"tf":1.4142135623730951},"355":{"tf":1.7320508075688772},"357":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"361":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":2.449489742783178},"374":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":2.0},"385":{"tf":1.0},"386":{"tf":2.6457513110645907},"39":{"tf":1.0},"391":{"tf":1.4142135623730951},"395":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.7320508075688772},"401":{"tf":1.0},"405":{"tf":2.449489742783178},"407":{"tf":1.0},"408":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"416":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"427":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.7320508075688772},"52":{"tf":1.0},"53":{"tf":3.1622776601683795},"54":{"tf":3.0},"57":{"tf":2.8284271247461903},"58":{"tf":2.23606797749979},"61":{"tf":1.4142135623730951},"62":{"tf":2.6457513110645907},"68":{"tf":1.4142135623730951},"70":{"tf":2.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"78":{"tf":1.0},"79":{"tf":1.4142135623730951},"82":{"tf":2.23606797749979},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":2.0},"90":{"tf":1.0},"91":{"tf":1.0}},"f":{"b":{"7":{"4":{"c":{"3":{"df":0,"docs":{},"f":{"1":{"d":{"8":{"a":{"df":0,"docs":{},"e":{"b":{"a":{"3":{"9":{"3":{"7":{"3":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"4":{"c":{"d":{"b":{"9":{"a":{"4":{"b":{"d":{"c":{"a":{"9":{"5":{"6":{"0":{"4":{"df":0,"docs":{},"f":{"df":2,"docs":{"2":{"tf":1.0},"20":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"8":{"9":{"0":{"0":{"3":{"1":{"3":{"1":{"1":{"6":{"1":{"2":{"df":0,"docs":{},"e":{"5":{"4":{"9":{"6":{"5":{"df":0,"docs":{},"f":{"7":{"df":0,"docs":{},"f":{"8":{"0":{"0":{"a":{"8":{"c":{"8":{"b":{"d":{"4":{"4":{"6":{"4":{"6":{"6":{"3":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"f":{"c":{"4":{"b":{"9":{"6":{"c":{"2":{"0":{"1":{"7":{"df":0,"docs":{},"f":{"6":{"4":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"f":{"4":{"1":{"a":{"0":{"a":{"0":{"7":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"e":{"8":{"1":{"5":{"df":0,"docs":{},"f":{"2":{"4":{"df":0,"docs":{},"f":{"df":4,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"296":{"tf":1.0},"410":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"3":{"2":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"、":{"2":{"df":3,"docs":{"132":{"tf":1.0},"349":{"tf":1.0},"389":{"tf":1.0}},"、":{"3":{"df":0,"docs":{},"、":{"4":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"然":{"df":0,"docs":{},"而":{"df":0,"docs":{},",":{"b":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}}}}},",":{"2":{"df":0,"docs":{},",":{"3":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"82":{"tf":1.0}}}}}}}},"2":{".":{"0":{"df":3,"docs":{"260":{"tf":1.4142135623730951},"391":{"tf":1.0},"53":{"tf":1.0}}},"5":{"3":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0}}},"df":0,"docs":{}},"8":{"5":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"8":{"df":1,"docs":{"104":{"tf":1.0}}},"9":{"df":1,"docs":{"102":{"tf":1.0}}},"df":8,"docs":{"202":{"tf":2.0},"399":{"tf":2.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}},"1":{"5":{"df":3,"docs":{"414":{"tf":1.4142135623730951},"430":{"tf":2.0},"434":{"tf":1.0}},"、":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"430":{"tf":1.0}}}}}}}},"8":{"df":2,"docs":{"414":{"tf":1.4142135623730951},"430":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"1":{"df":4,"docs":{"26":{"tf":1.0},"260":{"tf":1.0},"32":{"tf":1.0},"430":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"8":{"df":2,"docs":{"142":{"tf":2.0},"144":{"tf":1.4142135623730951}}},":":{"1":{"0":{"df":1,"docs":{"320":{"tf":3.7416573867739413}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":28,"docs":{"125":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"289":{"tf":1.0},"320":{"tf":1.7320508075688772},"322":{"tf":1.7320508075688772},"328":{"tf":1.0},"343":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"395":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":2.0},"401":{"tf":3.0},"402":{"tf":2.0},"404":{"tf":2.0},"405":{"tf":5.477225575051661},"406":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951},"408":{"tf":2.449489742783178},"62":{"tf":2.0},"78":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"1":{"a":{"2":{"df":0,"docs":{},"e":{"d":{"1":{"4":{"df":0,"docs":{},"f":{"4":{"4":{"8":{"0":{"d":{"a":{"b":{"6":{"2":{"4":{"3":{"8":{"d":{"c":{"c":{"1":{"1":{"3":{"0":{"2":{"9":{"1":{"b":{"df":0,"docs":{},"e":{"b":{"c":{"6":{"5":{"3":{"7":{"9":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"f":{"8":{"4":{"0":{"8":{"4":{"2":{"b":{"d":{"df":0,"docs":{},"f":{"7":{"6":{"8":{"a":{"7":{"9":{"8":{"8":{"6":{"9":{"df":0,"docs":{},"f":{"0":{"6":{"3":{"7":{"3":{"c":{"9":{"6":{"c":{"1":{"c":{"c":{"5":{"1":{"2":{"2":{"df":1,"docs":{"384":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":16,"docs":{"127":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"188":{"tf":1.0},"194":{"tf":1.0},"211":{"tf":1.0},"232":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"251":{"tf":1.0},"289":{"tf":1.4142135623730951},"306":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.4142135623730951},"343":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"376":{"tf":1.4142135623730951},"405":{"tf":2.0}},":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"188":{"tf":1.0}}}}}}}}}}},"2":{"4":{"df":1,"docs":{"142":{"tf":2.449489742783178}}},"df":14,"docs":{"127":{"tf":1.7320508075688772},"149":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951},"232":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"251":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"377":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951},"42":{"tf":1.0}}},"3":{"df":11,"docs":{"150":{"tf":1.4142135623730951},"185":{"tf":1.0},"188":{"tf":1.7320508075688772},"232":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"290":{"tf":1.7320508075688772},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"378":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951}}},"4":{"3":{".":{"3":{"df":1,"docs":{"267":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"142":{"tf":1.0},"150":{"tf":1.7320508075688772},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"235":{"tf":1.4142135623730951},"249":{"tf":1.0},"291":{"tf":1.4142135623730951},"293":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"377":{"tf":1.0},"381":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951}}},"5":{"5":{"df":3,"docs":{"101":{"tf":1.0},"359":{"tf":1.7320508075688772},"53":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"53":{"tf":1.0}}},"df":16,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":2.449489742783178},"108":{"tf":1.4142135623730951},"150":{"tf":2.0},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"191":{"tf":1.7320508075688772},"240":{"tf":1.0},"249":{"tf":1.0},"293":{"tf":2.0},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"381":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951}}},"6":{":":{"1":{"0":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":7,"docs":{"293":{"tf":1.4142135623730951},"294":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"382":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951}}},"7":{"df":7,"docs":{"294":{"tf":1.7320508075688772},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"385":{"tf":1.4142135623730951},"405":{"tf":1.0},"53":{"tf":1.4142135623730951}}},"8":{"0":{"df":2,"docs":{"178":{"tf":1.0},"179":{"tf":1.0}}},"df":7,"docs":{"228":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"389":{"tf":1.7320508075688772},"53":{"tf":1.0}}},"9":{"2":{"1":{"7":{"4":{"3":{"5":{"1":{"6":{"b":{"3":{"df":0,"docs":{},"e":{"2":{"c":{"0":{"df":0,"docs":{},"f":{"4":{"5":{"a":{"9":{"5":{"3":{"9":{"0":{"df":0,"docs":{},"e":{"7":{"b":{"5":{"3":{"6":{"df":0,"docs":{},"e":{"4":{"2":{"df":0,"docs":{},"f":{"4":{"a":{"df":0,"docs":{},"f":{"7":{"c":{"df":1,"docs":{"154":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"df":0,"docs":{},"f":{"d":{"1":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"e":{"1":{"1":{"d":{"d":{"6":{"1":{"c":{"a":{"1":{"3":{"6":{"df":0,"docs":{},"f":{"b":{"5":{"1":{"d":{"7":{"1":{"3":{"df":0,"docs":{},"f":{"6":{"b":{"0":{"b":{"a":{"7":{"5":{"1":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":5,"docs":{"294":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"362":{"tf":1.4142135623730951},"390":{"tf":1.4142135623730951}}},"b":{"4":{"5":{"6":{"5":{"6":{"6":{"2":{"d":{"1":{"a":{"7":{"9":{"7":{"3":{"d":{"8":{"7":{"0":{"7":{"4":{"4":{"a":{"9":{"2":{"3":{"df":0,"docs":{},"f":{"5":{"8":{"df":0,"docs":{},"f":{"8":{"df":0,"docs":{},"f":{"7":{"d":{"c":{"c":{"df":0,"docs":{},"e":{"9":{"1":{"df":2,"docs":{"115":{"tf":1.0},"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"d":{"1":{"b":{"5":{"5":{"9":{"3":{"d":{"2":{"6":{"d":{"c":{"6":{"a":{"0":{"3":{"c":{"2":{"0":{"df":0,"docs":{},"f":{"8":{"6":{"1":{"9":{"1":{"8":{"7":{"a":{"d":{"4":{"b":{"2":{"4":{"8":{"5":{"5":{"5":{"2":{"df":1,"docs":{"248":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":101,"docs":{"101":{"tf":2.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.7320508075688772},"116":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.0},"132":{"tf":1.7320508075688772},"134":{"tf":2.0},"137":{"tf":1.0},"150":{"tf":1.0},"156":{"tf":2.23606797749979},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"170":{"tf":2.449489742783178},"198":{"tf":2.8284271247461903},"199":{"tf":1.7320508075688772},"200":{"tf":1.0},"203":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.23606797749979},"208":{"tf":1.4142135623730951},"210":{"tf":1.7320508075688772},"217":{"tf":1.4142135623730951},"221":{"tf":1.0},"224":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":3.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.4142135623730951},"257":{"tf":1.7320508075688772},"26":{"tf":1.0},"266":{"tf":1.0},"273":{"tf":3.0},"274":{"tf":1.4142135623730951},"275":{"tf":2.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"289":{"tf":1.4142135623730951},"293":{"tf":2.449489742783178},"294":{"tf":1.0},"298":{"tf":3.0},"299":{"tf":2.0},"306":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"318":{"tf":2.449489742783178},"323":{"tf":1.0},"324":{"tf":2.23606797749979},"33":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"349":{"tf":2.0},"350":{"tf":1.0},"351":{"tf":2.449489742783178},"353":{"tf":1.0},"355":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.0},"360":{"tf":2.449489742783178},"361":{"tf":2.23606797749979},"367":{"tf":1.4142135623730951},"368":{"tf":2.0},"37":{"tf":1.7320508075688772},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":2.6457513110645907},"382":{"tf":1.0},"385":{"tf":1.4142135623730951},"386":{"tf":1.0},"389":{"tf":1.7320508075688772},"391":{"tf":1.4142135623730951},"398":{"tf":1.4142135623730951},"40":{"tf":2.0},"401":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"407":{"tf":1.0},"408":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"42":{"tf":1.7320508075688772},"428":{"tf":1.0},"45":{"tf":2.0},"49":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":2.449489742783178},"57":{"tf":2.0},"61":{"tf":3.0},"62":{"tf":2.449489742783178},"70":{"tf":2.6457513110645907},"75":{"tf":1.0},"79":{"tf":1.7320508075688772},"82":{"tf":1.4142135623730951},"84":{"tf":1.0},"87":{"tf":1.7320508075688772},"91":{"tf":1.0},"94":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"53":{"tf":1.7320508075688772}}},",":{"df":0,"docs":{},"x":{"df":1,"docs":{"51":{"tf":1.0}}}},":":{"*":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"257":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"3":{".":{".":{"=":{"7":{"df":1,"docs":{"362":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":1,"docs":{"53":{"tf":1.0}}},"1":{"4":{"1":{"5":{"df":1,"docs":{"428":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"183":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"0":{"df":13,"docs":{"322":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"348":{"tf":2.0},"391":{"tf":2.6457513110645907},"53":{"tf":1.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":2.6457513110645907},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"1":{"0":{"df":0,"docs":{},"e":{"a":{"6":{"c":{"b":{"0":{"d":{"d":{"8":{"5":{"5":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"5":{"1":{"0":{"c":{"9":{"b":{"a":{"0":{"5":{"6":{"4":{"8":{"b":{"c":{"5":{"8":{"3":{"6":{"df":0,"docs":{},"e":{"a":{"d":{"0":{"c":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"1":{"df":0,"docs":{},"e":{"d":{"a":{"0":{"7":{"a":{"4":{"a":{"4":{"6":{"9":{"2":{"b":{"df":0,"docs":{},"f":{"6":{"9":{"df":0,"docs":{},"e":{"3":{"a":{"a":{"a":{"d":{"9":{"9":{"9":{"d":{"8":{"4":{"0":{"a":{"c":{"9":{"c":{"1":{"3":{"8":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"324":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951}}},"2":{".":{"2":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":6,"docs":{"135":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"360":{"tf":2.449489742783178},"391":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"53":{"tf":2.23606797749979}}},"3":{"df":2,"docs":{"325":{"tf":1.4142135623730951},"391":{"tf":1.7320508075688772}}},"4":{"\"":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"348":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"3":{"1":{"4":{"c":{"1":{"0":{"df":0,"docs":{},"f":{"6":{"9":{"9":{"c":{"c":{"8":{"8":{"2":{"d":{"4":{"df":0,"docs":{},"e":{"0":{"b":{"0":{"6":{"df":0,"docs":{},"f":{"2":{"a":{"2":{"4":{"b":{"d":{"3":{"7":{"a":{"5":{"4":{"3":{"5":{"df":0,"docs":{},"f":{"2":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.4142135623730951},"382":{"tf":1.0}}},"5":{"0":{"df":1,"docs":{"322":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.0}}}},"df":1,"docs":{"322":{"tf":1.4142135623730951}}},"6":{"3":{"8":{"3":{"b":{"4":{"d":{"a":{"2":{"1":{"d":{"b":{"d":{"0":{"a":{"0":{"7":{"8":{"1":{"4":{"7":{"3":{"b":{"c":{"8":{"a":{"d":{"7":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"e":{"d":{"1":{"b":{"6":{"7":{"5":{"1":{"df":1,"docs":{"300":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":1,"docs":{"42":{"tf":1.7320508075688772}}},"9":{"6":{"2":{"c":{"0":{"2":{"2":{"4":{"b":{"2":{"7":{"4":{"df":0,"docs":{},"e":{"2":{"3":{"5":{"8":{"df":0,"docs":{},"e":{"0":{"a":{"c":{"df":0,"docs":{},"f":{"0":{"6":{"4":{"4":{"3":{"a":{"df":0,"docs":{},"f":{"6":{"4":{"d":{"df":0,"docs":{},"f":{"1":{"1":{"5":{"3":{"5":{"9":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"d":{"b":{"6":{"9":{"d":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"f":{"b":{"1":{"8":{"df":0,"docs":{},"f":{"2":{"4":{"b":{"1":{"5":{"c":{"7":{"a":{"d":{"1":{"3":{"4":{"9":{"1":{"b":{"1":{"c":{"1":{"df":0,"docs":{},"f":{"a":{"7":{"2":{"3":{"1":{"df":1,"docs":{"415":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"8":{"d":{"6":{"df":0,"docs":{},"f":{"4":{"8":{"d":{"2":{"df":0,"docs":{},"e":{"6":{"b":{"7":{"b":{"1":{"5":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"d":{"5":{"1":{"c":{"4":{"5":{"4":{"1":{"d":{"4":{"4":{"6":{"df":0,"docs":{},"e":{"8":{"9":{"d":{"df":0,"docs":{},"e":{"3":{"8":{"9":{"2":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"5":{"1":{"df":0,"docs":{},"f":{"7":{"0":{"c":{"7":{"8":{"1":{"6":{"2":{"df":0,"docs":{},"f":{"a":{"a":{"df":0,"docs":{},"e":{"b":{"c":{"a":{"b":{"0":{"d":{"a":{"0":{"d":{"df":0,"docs":{},"e":{"2":{"d":{"d":{"d":{"3":{"3":{"3":{"df":0,"docs":{},"e":{"7":{"a":{"8":{"df":3,"docs":{"65":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":92,"docs":{"103":{"tf":2.23606797749979},"106":{"tf":1.0},"107":{"tf":2.449489742783178},"115":{"tf":2.0},"116":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"134":{"tf":1.7320508075688772},"137":{"tf":1.0},"142":{"tf":1.7320508075688772},"156":{"tf":2.0},"157":{"tf":1.7320508075688772},"162":{"tf":1.4142135623730951},"170":{"tf":1.7320508075688772},"172":{"tf":1.0},"174":{"tf":1.0},"192":{"tf":1.4142135623730951},"196":{"tf":1.0},"198":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"224":{"tf":2.23606797749979},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.23606797749979},"231":{"tf":1.0},"232":{"tf":2.0},"240":{"tf":1.7320508075688772},"241":{"tf":3.0},"242":{"tf":2.0},"243":{"tf":1.7320508075688772},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"273":{"tf":2.6457513110645907},"275":{"tf":1.0},"285":{"tf":2.0},"286":{"tf":1.0},"289":{"tf":1.4142135623730951},"291":{"tf":1.0},"294":{"tf":2.6457513110645907},"298":{"tf":2.449489742783178},"299":{"tf":3.0},"314":{"tf":1.4142135623730951},"316":{"tf":2.0},"318":{"tf":2.449489742783178},"324":{"tf":2.0},"334":{"tf":1.0},"345":{"tf":1.0},"349":{"tf":1.4142135623730951},"350":{"tf":1.7320508075688772},"351":{"tf":2.449489742783178},"352":{"tf":2.0},"353":{"tf":1.4142135623730951},"355":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.7320508075688772},"360":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":2.8284271247461903},"369":{"tf":1.0},"375":{"tf":1.7320508075688772},"377":{"tf":2.449489742783178},"382":{"tf":1.0},"385":{"tf":1.4142135623730951},"389":{"tf":2.0},"399":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"408":{"tf":2.449489742783178},"41":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":2.23606797749979},"54":{"tf":3.3166247903554},"57":{"tf":2.23606797749979},"61":{"tf":3.3166247903554},"62":{"tf":3.605551275463989},"70":{"tf":2.23606797749979},"71":{"tf":1.4142135623730951},"72":{"tf":1.0},"79":{"tf":1.7320508075688772},"82":{"tf":1.4142135623730951},"87":{"tf":1.7320508075688772}},"e":{"5":{"1":{"0":{"5":{"b":{"5":{"2":{"df":0,"docs":{},"f":{"7":{"df":0,"docs":{},"e":{"8":{"d":{"3":{"d":{"9":{"5":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"d":{"df":0,"docs":{},"e":{"4":{"d":{"c":{"b":{"1":{"c":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"2":{"7":{"df":1,"docs":{"406":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"f":{"2":{"a":{"6":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"4":{"8":{"9":{"4":{"3":{"a":{"d":{"df":0,"docs":{},"e":{"3":{"df":0,"docs":{},"e":{"9":{"c":{"0":{"df":0,"docs":{},"e":{"b":{"2":{"3":{"d":{"6":{"9":{"df":0,"docs":{},"e":{"2":{"b":{"8":{"b":{"4":{"1":{"df":0,"docs":{},"f":{"0":{"5":{"7":{"df":0,"docs":{},"f":{"1":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":1,"docs":{"267":{"tf":1.0}}},"(":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"个":{"df":0,"docs":{},"程":{"df":0,"docs":{},"序":{"df":0,"docs":{},"中":{"df":0,"docs":{},"要":{"df":0,"docs":{},"计":{"df":0,"docs":{},"算":{"df":0,"docs":{},"的":{"df":0,"docs":{},"小":{"df":0,"docs":{},"时":{"df":0,"docs":{},"数":{"df":0,"docs":{},")":{"df":0,"docs":{},"的":{"df":0,"docs":{},"结":{"df":0,"docs":{},"果":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"50":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}}}},":":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"334":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"4":{".":{"0":{"df":1,"docs":{"173":{"tf":2.23606797749979}},",":{"df":0,"docs":{},"因":{"df":0,"docs":{},"为":{"df":0,"docs":{},"它":{"df":0,"docs":{},"i":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}},"3":{"df":1,"docs":{"53":{"tf":1.0}}},"4":{"5":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"4":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":5,"docs":{"401":{"tf":2.0},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}}},"df":5,"docs":{"401":{"tf":2.23606797749979},"402":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"df":4,"docs":{"402":{"tf":1.0},"62":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"2":{"\"":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{":":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":3,"docs":{"170":{"tf":1.4142135623730951},"320":{"tf":1.0},"53":{"tf":1.0}}},"4":{"df":0,"docs":{},"e":{"3":{"1":{"df":0,"docs":{},"f":{"9":{"df":0,"docs":{},"f":{"3":{"0":{"4":{"df":0,"docs":{},"e":{"0":{"c":{"d":{"9":{"a":{"c":{"df":0,"docs":{},"e":{"0":{"1":{"0":{"4":{"5":{"d":{"1":{"7":{"a":{"2":{"a":{"a":{"0":{"1":{"a":{"4":{"4":{"9":{"5":{"2":{"8":{"df":2,"docs":{"254":{"tf":1.0},"255":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":3,"docs":{"43":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"6":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}},"7":{"df":1,"docs":{"405":{"tf":1.0}}},"8":{"df":1,"docs":{"405":{"tf":1.0}}},"9":{"9":{"7":{"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"0":{"6":{"8":{"6":{"df":0,"docs":{},"f":{"a":{"8":{"df":0,"docs":{},"e":{"df":1,"docs":{"266":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"405":{"tf":1.0}}},"a":{"a":{"9":{"6":{"a":{"3":{"d":{"2":{"0":{"5":{"7":{"0":{"df":0,"docs":{},"f":{"8":{"6":{"8":{"b":{"d":{"2":{"0":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"e":{"3":{"df":0,"docs":{},"e":{"8":{"6":{"5":{"b":{"0":{"4":{"7":{"2":{"8":{"4":{"b":{"df":0,"docs":{},"e":{"3":{"0":{"df":1,"docs":{"169":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"8":{"d":{"1":{"3":{"c":{"5":{"2":{"c":{"5":{"1":{"df":0,"docs":{},"f":{"1":{"c":{"6":{"2":{"a":{"8":{"0":{"b":{"5":{"2":{"d":{"7":{"df":0,"docs":{},"f":{"b":{"d":{"7":{"c":{"c":{"0":{"b":{"6":{"3":{"a":{"d":{"a":{"4":{"3":{"df":1,"docs":{"431":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":73,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"108":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.0},"125":{"tf":1.0},"134":{"tf":2.449489742783178},"137":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.0},"156":{"tf":1.7320508075688772},"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"160":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"198":{"tf":2.23606797749979},"200":{"tf":2.449489742783178},"203":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"23":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":2.0},"246":{"tf":1.7320508075688772},"258":{"tf":2.23606797749979},"273":{"tf":1.4142135623730951},"285":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"298":{"tf":2.449489742783178},"299":{"tf":2.449489742783178},"316":{"tf":1.4142135623730951},"318":{"tf":2.449489742783178},"324":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"351":{"tf":1.4142135623730951},"358":{"tf":1.0},"360":{"tf":2.8284271247461903},"361":{"tf":2.6457513110645907},"368":{"tf":2.6457513110645907},"377":{"tf":2.6457513110645907},"400":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"414":{"tf":1.0},"417":{"tf":1.4142135623730951},"42":{"tf":1.7320508075688772},"427":{"tf":1.0},"49":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":2.0},"57":{"tf":1.0},"61":{"tf":2.449489742783178},"62":{"tf":2.8284271247461903},"68":{"tf":1.4142135623730951},"70":{"tf":4.0},"71":{"tf":1.4142135623730951},"72":{"tf":2.6457513110645907},"73":{"tf":2.23606797749979},"74":{"tf":1.7320508075688772},"77":{"tf":2.23606797749979},"78":{"tf":2.449489742783178},"79":{"tf":1.4142135623730951},"82":{"tf":1.0},"83":{"tf":1.0},"87":{"tf":1.4142135623730951}},"、":{"5":{"df":1,"docs":{"361":{"tf":1.4142135623730951}}},"df":0,"docs":{}},":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"1":{"df":1,"docs":{"70":{"tf":1.0}}},"df":0,"docs":{}}}},"5":{".":{"0":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"df":3,"docs":{"318":{"tf":1.0},"319":{"tf":1.0},"54":{"tf":1.7320508075688772}}},"5":{"7":{"df":0,"docs":{},"f":{"1":{"5":{"7":{"c":{"d":{"0":{"b":{"3":{"5":{"b":{"c":{"7":{"d":{"0":{"d":{"c":{"0":{"a":{"df":0,"docs":{},"f":{"6":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"6":{"2":{"2":{"df":0,"docs":{},"f":{"a":{"4":{"c":{"4":{"8":{"0":{"9":{"9":{"6":{"df":1,"docs":{"425":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"7":{"7":{"5":{"3":{"6":{"0":{"b":{"a":{"3":{"9":{"0":{"4":{"c":{"4":{"1":{"df":0,"docs":{},"e":{"8":{"4":{"1":{"7":{"6":{"3":{"3":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"7":{"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"e":{"7":{"d":{"6":{"1":{"7":{"7":{"c":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":20,"docs":{"104":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"148":{"tf":1.7320508075688772},"150":{"tf":1.7320508075688772},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"196":{"tf":1.0},"335":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0},"42":{"tf":1.7320508075688772},"62":{"tf":1.7320508075688772},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":2.449489742783178},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"2":{"df":1,"docs":{"407":{"tf":1.7320508075688772}},"f":{"a":{"df":0,"docs":{},"f":{"a":{"a":{"a":{"8":{"df":0,"docs":{},"e":{"4":{"3":{"2":{"df":0,"docs":{},"e":{"8":{"4":{"b":{"df":0,"docs":{},"e":{"a":{"a":{"df":0,"docs":{},"f":{"4":{"df":0,"docs":{},"e":{"a":{"8":{"0":{"c":{"c":{"b":{"a":{"8":{"8":{"0":{"6":{"2":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"d":{"df":1,"docs":{"284":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"4":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}},"6":{".":{"7":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"289":{"tf":1.0}}},"7":{"d":{"7":{"0":{"c":{"3":{"a":{"c":{"b":{"7":{"3":{"8":{"df":0,"docs":{},"f":{"4":{"d":{"df":1,"docs":{"202":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"135":{"tf":1.4142135623730951},"289":{"tf":1.0}},"u":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}},"8":{"df":2,"docs":{"289":{"tf":1.0},"42":{"tf":1.0}}},"9":{"df":1,"docs":{"43":{"tf":1.7320508075688772}}},"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"42":{"tf":1.0}}},"r":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"。":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"a":{"3":{"a":{"6":{"4":{"d":{"6":{"0":{"b":{"0":{"d":{"d":{"7":{"8":{"6":{"c":{"3":{"5":{"c":{"a":{"4":{"d":{"a":{"a":{"d":{"a":{"7":{"a":{"4":{"d":{"2":{"0":{"d":{"a":{"3":{"3":{"df":0,"docs":{},"e":{"5":{"df":4,"docs":{"270":{"tf":1.0},"271":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"f":{"6":{"9":{"0":{"9":{"c":{"5":{"7":{"b":{"3":{"b":{"a":{"5":{"5":{"df":0,"docs":{},"f":{"1":{"5":{"6":{"a":{"4":{"1":{"2":{"2":{"a":{"4":{"2":{"b":{"8":{"0":{"5":{"4":{"3":{"6":{"d":{"df":0,"docs":{},"e":{"9":{"0":{"c":{"df":2,"docs":{"395":{"tf":1.0},"396":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":100,"docs":{"102":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"105":{"tf":2.0},"106":{"tf":1.0},"116":{"tf":2.0},"134":{"tf":2.8284271247461903},"156":{"tf":1.0},"158":{"tf":2.0},"162":{"tf":1.0},"172":{"tf":1.7320508075688772},"173":{"tf":2.449489742783178},"175":{"tf":2.23606797749979},"176":{"tf":1.0},"185":{"tf":2.449489742783178},"188":{"tf":1.0},"199":{"tf":3.1622776601683795},"200":{"tf":1.7320508075688772},"206":{"tf":1.7320508075688772},"207":{"tf":1.0},"221":{"tf":1.4142135623730951},"229":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":2.0},"243":{"tf":1.0},"257":{"tf":1.7320508075688772},"258":{"tf":1.7320508075688772},"272":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.7320508075688772},"278":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"285":{"tf":2.23606797749979},"289":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"294":{"tf":2.6457513110645907},"298":{"tf":2.0},"299":{"tf":1.7320508075688772},"306":{"tf":1.0},"316":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772},"324":{"tf":2.0},"334":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951},"336":{"tf":1.0},"34":{"tf":2.0},"347":{"tf":1.0},"351":{"tf":2.23606797749979},"352":{"tf":2.0},"353":{"tf":2.0},"356":{"tf":1.4142135623730951},"358":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"361":{"tf":2.23606797749979},"362":{"tf":1.4142135623730951},"367":{"tf":1.4142135623730951},"368":{"tf":2.6457513110645907},"37":{"tf":1.4142135623730951},"374":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.4142135623730951},"385":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"49":{"tf":2.449489742783178},"51":{"tf":1.4142135623730951},"53":{"tf":1.7320508075688772},"54":{"tf":3.0},"56":{"tf":2.0},"57":{"tf":1.0},"58":{"tf":2.6457513110645907},"61":{"tf":2.6457513110645907},"62":{"tf":2.0},"70":{"tf":2.23606797749979},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":2.0},"77":{"tf":2.23606797749979},"78":{"tf":1.0},"79":{"tf":1.4142135623730951},"82":{"tf":2.8284271247461903},"83":{"tf":2.0},"84":{"tf":2.449489742783178},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"91":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":2.449489742783178},"97":{"tf":2.0}},"f":{"6":{"7":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"4":{"2":{"3":{"4":{"5":{"b":{"a":{"4":{"4":{"df":0,"docs":{},"f":{"6":{"df":0,"docs":{},"f":{"0":{"8":{"a":{"2":{"2":{"c":{"2":{"1":{"9":{"2":{"1":{"6":{"5":{"df":0,"docs":{},"f":{"4":{"b":{"0":{"df":0,"docs":{},"e":{"9":{"3":{"0":{"df":1,"docs":{"184":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"h":{"df":1,"docs":{"56":{"tf":1.0}}},"。":{"df":0,"docs":{},"i":{"df":1,"docs":{"277":{"tf":1.0}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}}}}},",":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"199":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"6":{".":{"4":{"4":{"df":1,"docs":{"38":{"tf":1.0}}},"df":1,"docs":{"54":{"tf":2.0}}},"5":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":6,"docs":{"328":{"tf":1.0},"43":{"tf":1.4142135623730951},"50":{"tf":2.0},"91":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"1":{"df":1,"docs":{"45":{"tf":1.7320508075688772}}},"2":{"d":{"4":{"4":{"1":{"0":{"6":{"0":{"d":{"6":{"6":{"df":0,"docs":{},"f":{"9":{"a":{"1":{"c":{"3":{"d":{"3":{"c":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"4":{"0":{"df":0,"docs":{},"f":{"8":{"1":{"7":{"d":{"1":{"a":{"a":{"df":1,"docs":{"317":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"df":1,"docs":{"53":{"tf":2.0}},"}":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"4":{"d":{"8":{"9":{"0":{"2":{"d":{"3":{"8":{"0":{"d":{"b":{"b":{"8":{"d":{"d":{"9":{"4":{"df":0,"docs":{},"e":{"d":{"2":{"df":0,"docs":{},"e":{"5":{"4":{"8":{"d":{"df":0,"docs":{},"f":{"c":{"0":{"a":{"a":{"8":{"0":{"c":{"0":{"7":{"c":{"b":{"df":1,"docs":{"209":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{",":{"2":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"4":{"c":{"4":{"5":{"6":{"1":{"df":0,"docs":{},"e":{"4":{"8":{"9":{"4":{"2":{"df":1,"docs":{"199":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"275":{"tf":1.0}}},"6":{"8":{"c":{"6":{"4":{"7":{"6":{"0":{"b":{"5":{"c":{"7":{"df":0,"docs":{},"e":{"a":{"6":{"5":{"4":{"df":0,"docs":{},"f":{"a":{"c":{"b":{"4":{"b":{"a":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"a":{"d":{"d":{"df":0,"docs":{},"f":{"d":{"a":{"2":{"7":{"c":{"c":{"df":1,"docs":{"138":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"9":{"a":{"d":{"c":{"6":{"df":0,"docs":{},"f":{"5":{"c":{"b":{"7":{"6":{"df":0,"docs":{},"f":{"6":{"df":0,"docs":{},"e":{"9":{"d":{"5":{"6":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"a":{"5":{"7":{"d":{"8":{"a":{"8":{"4":{"4":{"a":{"c":{"0":{"7":{"a":{"8":{"8":{"df":1,"docs":{"157":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":53,"docs":{"101":{"tf":2.449489742783178},"103":{"tf":2.23606797749979},"104":{"tf":1.4142135623730951},"105":{"tf":2.0},"108":{"tf":2.449489742783178},"116":{"tf":1.7320508075688772},"134":{"tf":2.0},"135":{"tf":1.0},"156":{"tf":1.0},"160":{"tf":1.4142135623730951},"161":{"tf":2.0},"162":{"tf":1.7320508075688772},"173":{"tf":1.0},"175":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"199":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"245":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.4142135623730951},"274":{"tf":1.0},"277":{"tf":1.7320508075688772},"278":{"tf":1.7320508075688772},"298":{"tf":1.4142135623730951},"299":{"tf":2.23606797749979},"300":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":2.0},"324":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"347":{"tf":1.0},"352":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"361":{"tf":2.8284271247461903},"368":{"tf":2.6457513110645907},"38":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"430":{"tf":1.4142135623730951},"434":{"tf":2.6457513110645907},"45":{"tf":1.4142135623730951},"49":{"tf":2.0},"51":{"tf":1.7320508075688772},"57":{"tf":3.4641016151377544},"58":{"tf":1.0},"61":{"tf":1.7320508075688772},"73":{"tf":1.7320508075688772},"74":{"tf":1.7320508075688772},"78":{"tf":1.0},"84":{"tf":1.4142135623730951}},"e":{"2":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"7":{"c":{"0":{"df":0,"docs":{},"f":{"0":{"8":{"5":{"9":{"8":{"9":{"c":{"c":{"4":{"9":{"8":{"c":{"df":0,"docs":{},"e":{"c":{"1":{"3":{"9":{"df":0,"docs":{},"e":{"7":{"1":{"7":{"df":0,"docs":{},"e":{"2":{"a":{"df":0,"docs":{},"f":{"1":{"7":{"2":{"c":{"b":{"7":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"f":{"1":{"7":{"d":{"2":{"2":{"b":{"b":{"a":{"1":{"5":{"0":{"0":{"1":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"6":{"6":{"1":{"a":{"0":{"9":{"3":{"8":{"a":{"a":{"0":{"d":{"a":{"0":{"6":{"5":{"2":{"6":{"df":0,"docs":{},"e":{"7":{"b":{"8":{"df":0,"docs":{},"f":{"9":{"8":{"df":0,"docs":{},"f":{"d":{"7":{"df":0,"docs":{},"e":{"6":{"7":{"a":{"2":{"2":{"2":{"df":0,"docs":{},"f":{"df":2,"docs":{"345":{"tf":1.0},"354":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"73":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}},";":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.0}}}}}}}},"7":{"0":{"4":{"c":{"5":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"c":{"2":{"df":0,"docs":{},"f":{"2":{"6":{"a":{"0":{"1":{"3":{"3":{"a":{"df":0,"docs":{},"e":{"1":{"7":{"a":{"2":{"c":{"0":{"1":{"9":{"8":{"6":{"5":{"9":{"0":{"c":{"0":{"5":{"a":{"0":{"4":{"5":{"df":2,"docs":{"264":{"tf":1.0},"267":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"407":{"tf":1.4142135623730951}}},"5":{"4":{"df":1,"docs":{"53":{"tf":1.0}}},"df":4,"docs":{"289":{"tf":2.23606797749979},"290":{"tf":1.0},"322":{"tf":1.7320508075688772},"335":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"6":{"5":{"3":{"1":{"8":{"b":{"8":{"4":{"4":{"5":{"6":{"9":{"a":{"6":{"4":{"2":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"7":{"b":{"df":0,"docs":{},"f":{"1":{"a":{"d":{"a":{"b":{"9":{"6":{"3":{"9":{"c":{"b":{"df":0,"docs":{},"f":{"6":{"a":{"df":0,"docs":{},"f":{"3":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"8":{"7":{"8":{"df":1,"docs":{"397":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"7":{"7":{"4":{"0":{"a":{"5":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"1":{"4":{"5":{"8":{"d":{"7":{"4":{"df":0,"docs":{},"f":{"1":{"d":{"a":{"df":0,"docs":{},"f":{"8":{"5":{"df":0,"docs":{},"f":{"d":{"4":{"9":{"df":0,"docs":{},"e":{"0":{"3":{"a":{"a":{"a":{"9":{"7":{"c":{"df":0,"docs":{},"f":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":52,"docs":{"107":{"tf":2.23606797749979},"114":{"tf":2.449489742783178},"115":{"tf":2.6457513110645907},"116":{"tf":3.4641016151377544},"118":{"tf":1.4142135623730951},"119":{"tf":2.0},"120":{"tf":2.6457513110645907},"121":{"tf":3.3166247903554},"122":{"tf":2.23606797749979},"123":{"tf":1.7320508075688772},"125":{"tf":2.6457513110645907},"127":{"tf":2.449489742783178},"134":{"tf":1.0},"135":{"tf":1.7320508075688772},"156":{"tf":1.0},"161":{"tf":2.23606797749979},"162":{"tf":1.0},"173":{"tf":1.7320508075688772},"185":{"tf":1.4142135623730951},"188":{"tf":1.0},"199":{"tf":2.449489742783178},"200":{"tf":1.4142135623730951},"211":{"tf":1.0},"223":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0},"242":{"tf":2.449489742783178},"266":{"tf":1.4142135623730951},"278":{"tf":1.7320508075688772},"279":{"tf":1.0},"298":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"300":{"tf":1.4142135623730951},"318":{"tf":2.0},"324":{"tf":1.4142135623730951},"331":{"tf":1.0},"335":{"tf":1.4142135623730951},"352":{"tf":1.4142135623730951},"359":{"tf":2.0},"368":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.0},"417":{"tf":1.4142135623730951},"58":{"tf":1.0},"59":{"tf":1.4142135623730951},"61":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"78":{"tf":1.7320508075688772},"84":{"tf":1.7320508075688772}},":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"8":{".":{"0":{"df":1,"docs":{"428":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{"df":2,"docs":{"289":{"tf":1.0},"397":{"tf":1.4142135623730951}}},"2":{"df":0,"docs":{},"e":{"7":{"7":{"9":{"9":{"c":{"1":{"b":{"c":{"6":{"2":{"2":{"9":{"8":{"df":1,"docs":{"211":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"3":{"7":{"8":{"8":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"2":{"1":{"2":{"a":{"3":{"2":{"8":{"1":{"3":{"2":{"8":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"f":{"8":{"df":0,"docs":{},"f":{"2":{"2":{"3":{"c":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"0":{"df":0,"docs":{},"f":{"6":{"9":{"2":{"2":{"0":{"b":{"9":{"7":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"41":{"tf":1.0}}},"5":{"6":{"d":{"8":{"9":{"c":{"5":{"3":{"a":{"6":{"d":{"6":{"9":{"4":{"7":{"0":{"b":{"b":{"5":{"6":{"6":{"9":{"c":{"7":{"7":{"3":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"6":{"a":{"a":{"b":{"6":{"df":0,"docs":{},"f":{"c":{"c":{"9":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"1":{"2":{"c":{"4":{"a":{"5":{"8":{"0":{"1":{"b":{"6":{"1":{"df":0,"docs":{},"f":{"8":{"d":{"2":{"df":0,"docs":{},"e":{"9":{"5":{"2":{"df":0,"docs":{},"f":{"8":{"b":{"b":{"b":{"b":{"4":{"4":{"4":{"6":{"9":{"2":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"df":0,"docs":{},"e":{"c":{"2":{"df":2,"docs":{"81":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}},"a":{"df":0,"docs":{},"e":{"c":{"a":{"df":0,"docs":{},"e":{"3":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"5":{"c":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"9":{"df":0,"docs":{},"f":{"0":{"5":{"5":{"b":{"7":{"0":{"df":0,"docs":{},"f":{"0":{"5":{"d":{"9":{"a":{"3":{"df":0,"docs":{},"f":{"9":{"9":{"0":{"b":{"c":{"df":0,"docs":{},"e":{"7":{"b":{"df":1,"docs":{"297":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"f":{"0":{"4":{"9":{"6":{"b":{"b":{"8":{"df":0,"docs":{},"e":{"5":{"6":{"b":{"6":{"8":{"3":{"df":0,"docs":{},"e":{"a":{"3":{"df":0,"docs":{},"f":{"0":{"1":{"5":{"8":{"7":{"1":{"c":{"8":{"6":{"3":{"1":{"6":{"8":{"4":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"4":{"df":1,"docs":{"430":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":62,"docs":{"118":{"tf":1.4142135623730951},"132":{"tf":2.23606797749979},"133":{"tf":1.4142135623730951},"134":{"tf":2.8284271247461903},"135":{"tf":3.1622776601683795},"136":{"tf":1.4142135623730951},"137":{"tf":1.4142135623730951},"138":{"tf":1.7320508075688772},"139":{"tf":2.0},"140":{"tf":3.1622776601683795},"141":{"tf":3.3166247903554},"142":{"tf":3.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":2.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"149":{"tf":1.4142135623730951},"150":{"tf":2.6457513110645907},"152":{"tf":1.0},"161":{"tf":1.4142135623730951},"170":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"185":{"tf":1.0},"188":{"tf":1.0},"199":{"tf":2.8284271247461903},"202":{"tf":1.7320508075688772},"206":{"tf":1.7320508075688772},"224":{"tf":1.7320508075688772},"242":{"tf":1.4142135623730951},"270":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.0},"298":{"tf":1.4142135623730951},"299":{"tf":1.0},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"318":{"tf":2.0},"320":{"tf":1.0},"324":{"tf":1.4142135623730951},"333":{"tf":1.0},"335":{"tf":1.4142135623730951},"34":{"tf":1.0},"340":{"tf":1.4142135623730951},"353":{"tf":1.7320508075688772},"360":{"tf":2.23606797749979},"368":{"tf":1.4142135623730951},"398":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"417":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"58":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.4142135623730951},"78":{"tf":2.0},"88":{"tf":1.4142135623730951}},"f":{"d":{"2":{"3":{"2":{"7":{"df":0,"docs":{},"e":{"4":{"1":{"3":{"5":{"8":{"7":{"6":{"b":{"3":{"6":{"8":{"c":{"c":{"2":{"7":{"9":{"3":{"df":0,"docs":{},"e":{"b":{"4":{"a":{"7":{"df":0,"docs":{},"e":{"4":{"5":{"5":{"b":{"6":{"9":{"1":{"df":0,"docs":{},"f":{"0":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"、":{"1":{"6":{"df":1,"docs":{"360":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"9":{"0":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"1":{"5":{",":{"7":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"9":{"4":{"8":{"b":{"6":{"5":{"df":0,"docs":{},"e":{"8":{"8":{"9":{"6":{"0":{"b":{"4":{"df":5,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"f":{"b":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"f":{"8":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"9":{"a":{"8":{"1":{"4":{"c":{"df":0,"docs":{},"e":{"a":{"0":{"a":{"5":{"8":{"df":0,"docs":{},"e":{"9":{"c":{"0":{"1":{"9":{"c":{"5":{"2":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"4":{"a":{"df":1,"docs":{"177":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"3":{"7":{"7":{"8":{"4":{"b":{"8":{"7":{"0":{"8":{"c":{"2":{"4":{"3":{"1":{"4":{"7":{"0":{"7":{"3":{"7":{"8":{"a":{"d":{"4":{"2":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"e":{"b":{"1":{"2":{"a":{"3":{"3":{"4":{"b":{"b":{"d":{"df":1,"docs":{"337":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"5":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"9":{"3":{"1":{"1":{"7":{"0":{"4":{"0":{"4":{"c":{"b":{"9":{"8":{"d":{"4":{"7":{"6":{"b":{"1":{"9":{"0":{"1":{"7":{"c":{"b":{"b":{"d":{"b":{"c":{"0":{"0":{"d":{"0":{"8":{"3":{"4":{"d":{"df":3,"docs":{"373":{"tf":1.0},"379":{"tf":1.0},"387":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"6":{"d":{"4":{"b":{"0":{"df":0,"docs":{},"e":{"c":{"1":{"c":{"5":{"df":0,"docs":{},"e":{"0":{"1":{"9":{"b":{"8":{"5":{"6":{"0":{"4":{"c":{"3":{"3":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"6":{"8":{"b":{"3":{"df":0,"docs":{},"e":{"2":{"6":{"6":{"9":{"d":{"4":{"0":{"df":1,"docs":{"333":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"_":{"2":{"2":{"2":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"6":{"2":{"2":{"5":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"b":{"8":{"2":{"5":{"5":{"3":{"4":{"9":{"df":0,"docs":{},"e":{"c":{"0":{"d":{"c":{"2":{"3":{"5":{"4":{"3":{"3":{"5":{"3":{"0":{"df":0,"docs":{},"e":{"d":{"3":{"df":0,"docs":{},"f":{"b":{"5":{"3":{"4":{"df":1,"docs":{"403":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"df":2,"docs":{"156":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951}},"。":{"df":0,"docs":{},"下":{"df":0,"docs":{},"面":{"df":0,"docs":{},"的":{"df":0,"docs":{},"说":{"df":0,"docs":{},"明":{"df":0,"docs":{},"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"156":{"tf":1.0}}}}}}}}}}}}}},"c":{"0":{"df":0,"docs":{},"f":{"a":{"2":{"7":{"1":{"4":{"8":{"5":{"9":{"7":{"3":{"8":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"7":{"3":{"c":{"b":{"b":{"b":{"8":{"2":{"9":{"5":{"9":{"2":{"df":0,"docs":{},"e":{"4":{"c":{"0":{"3":{"7":{"d":{"7":{"df":0,"docs":{},"e":{"4":{"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"d":{"2":{"0":{"0":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"a":{"c":{"0":{"df":0,"docs":{},"f":{"c":{"9":{"4":{"df":3,"docs":{"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"9":{"4":{"3":{"5":{"5":{"6":{"a":{"6":{"0":{"0":{"1":{"b":{"8":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":44,"docs":{"107":{"tf":1.7320508075688772},"115":{"tf":1.0},"116":{"tf":1.0},"119":{"tf":1.4142135623730951},"136":{"tf":1.4142135623730951},"156":{"tf":2.449489742783178},"157":{"tf":2.23606797749979},"158":{"tf":2.449489742783178},"159":{"tf":1.0},"160":{"tf":1.7320508075688772},"161":{"tf":3.872983346207417},"162":{"tf":3.0},"167":{"tf":1.4142135623730951},"174":{"tf":1.0},"175":{"tf":1.7320508075688772},"185":{"tf":1.0},"186":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"224":{"tf":2.449489742783178},"225":{"tf":1.0},"242":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"285":{"tf":1.0},"298":{"tf":1.7320508075688772},"301":{"tf":2.0},"306":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951},"319":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":1.4142135623730951},"333":{"tf":1.0},"335":{"tf":1.4142135623730951},"336":{"tf":1.0},"353":{"tf":1.4142135623730951},"369":{"tf":1.4142135623730951},"402":{"tf":1.7320508075688772},"404":{"tf":1.4142135623730951},"405":{"tf":1.0},"417":{"tf":1.4142135623730951},"62":{"tf":2.0},"78":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}},"e":{"8":{"5":{"df":0,"docs":{},"f":{"c":{"c":{"9":{"9":{"3":{"8":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"f":{"8":{"c":{"9":{"3":{"5":{"d":{"0":{"a":{"d":{"8":{"b":{"4":{"d":{"b":{"7":{"df":0,"docs":{},"f":{"4":{"5":{"c":{"a":{"a":{"a":{"2":{"c":{"a":{"4":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"创":{"df":0,"docs":{},"建":{"df":0,"docs":{},"一":{"df":0,"docs":{},"个":{"df":0,"docs":{},"异":{"df":0,"docs":{},"步":{"df":0,"docs":{},"信":{"df":0,"docs":{},"道":{"df":0,"docs":{},"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"319":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}},"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"df":1,"docs":{"320":{"tf":1.0}}},"df":1,"docs":{"320":{"tf":1.0}},"|":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"306":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"306":{"tf":1.0},"320":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":27,"docs":{"107":{"tf":2.6457513110645907},"108":{"tf":2.0},"142":{"tf":1.0},"225":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"306":{"tf":2.23606797749979},"316":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.0},"347":{"tf":1.4142135623730951},"348":{"tf":1.0},"351":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.4142135623730951},"359":{"tf":1.0},"36":{"tf":1.4142135623730951},"360":{"tf":4.0},"361":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":2.0},"408":{"tf":1.4142135623730951},"417":{"tf":1.0},"45":{"tf":1.0},"52":{"tf":1.4142135623730951},"53":{"tf":1.0}},"i":{"df":1,"docs":{"427":{"tf":2.0}}},"s":{"df":1,"docs":{"360":{"tf":1.0}}},"x":{"df":1,"docs":{"360":{"tf":1.7320508075688772}}}},"a":{"'":{".":{".":{"=":{"'":{"df":0,"docs":{},"j":{"df":1,"docs":{"358":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"285":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"2":{"c":{"b":{"7":{"2":{"d":{"3":{"a":{"d":{"7":{"5":{"8":{"4":{"c":{"c":{"1":{"a":{"df":0,"docs":{},"e":{"3":{"b":{"8":{"5":{"df":0,"docs":{},"f":{"7":{"1":{"5":{"c":{"8":{"7":{"7":{"8":{"7":{"2":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"3":{"a":{"b":{"df":1,"docs":{"238":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"7":{"1":{"df":0,"docs":{},"f":{"8":{"2":{"b":{"0":{"9":{"1":{"6":{"c":{"df":0,"docs":{},"f":{"2":{"1":{"d":{"df":0,"docs":{},"e":{"2":{"d":{"5":{"6":{"b":{"d":{"3":{"8":{"6":{"c":{"a":{"5":{"d":{"7":{"2":{"df":0,"docs":{},"f":{"7":{"6":{"9":{"9":{"b":{"0":{"df":1,"docs":{"82":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"314":{"tf":1.0}}},"5":{"df":0,"docs":{},"e":{"0":{"c":{"5":{"b":{"2":{"c":{"5":{"df":0,"docs":{},"f":{"9":{"0":{"5":{"4":{"b":{"df":0,"docs":{},"e":{"3":{"b":{"9":{"6":{"1":{"a":{"df":0,"docs":{},"e":{"a":{"2":{"c":{"7":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"a":{"5":{"9":{"1":{"d":{"df":0,"docs":{},"e":{"8":{"df":1,"docs":{"64":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"8":{"5":{"3":{"6":{"1":{"8":{"9":{"d":{"5":{"df":0,"docs":{},"f":{"1":{"b":{"a":{"2":{"df":0,"docs":{},"f":{"0":{"b":{"1":{"1":{"8":{"7":{"b":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"e":{"7":{"8":{"7":{"c":{"0":{"d":{"8":{"9":{"df":0,"docs":{},"e":{"2":{"8":{"7":{"1":{"c":{"df":1,"docs":{"364":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"0":{"df":1,"docs":{"54":{"tf":1.0}}},"1":{".":{".":{"3":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"54":{"tf":1.0},"62":{"tf":1.0}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"72":{"tf":1.7320508075688772}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"353":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"b":{"c":{"a":{"b":{"c":{"a":{"b":{"c":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":1,"docs":{"186":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"df":0,"docs":{},"k":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"v":{"df":0,"docs":{},"w":{"df":0,"docs":{},"x":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"0":{"1":{"2":{"3":{"4":{"5":{"df":1,"docs":{"259":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"368":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"368":{"tf":2.23606797749979}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"155":{"tf":1.7320508075688772}}}}},"s":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"102":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"115":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"252":{"tf":1.0},"413":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"1":{"6":{"1":{"8":{"4":{"a":{"7":{"df":0,"docs":{},"f":{"5":{"6":{"d":{"1":{"7":{"d":{"a":{"a":{"9":{"c":{"4":{"c":{"7":{"6":{"9":{"0":{"1":{"3":{"7":{"1":{"0":{"8":{"5":{"d":{"c":{"0":{"a":{"c":{"4":{"3":{"df":1,"docs":{"131":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":5,"docs":{"162":{"tf":1.0},"214":{"tf":1.0},"242":{"tf":1.0},"398":{"tf":1.7320508075688772},"70":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"258":{"tf":2.0},"368":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":4,"docs":{"82":{"tf":2.8284271247461903},"83":{"tf":1.4142135623730951},"84":{"tf":2.8284271247461903},"87":{"tf":2.0}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"300":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"200":{"tf":1.0},"335":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"245":{"tf":1.0},"246":{"tf":1.0}}}}}}},"d":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"2":{"df":4,"docs":{"198":{"tf":1.7320508075688772},"203":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":4,"docs":{"198":{"tf":1.7320508075688772},"203":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"141":{"tf":1.0},"375":{"tf":1.7320508075688772}}}}}}},"/":{"a":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"265":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"265":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"<":{"&":{"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"375":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"h":{"df":1,"docs":{"102":{"tf":1.0}},"s":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"375":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"107":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"257":{"tf":2.6457513110645907},"265":{"tf":1.0},"266":{"tf":5.744562646538029},"385":{"tf":1.7320508075688772}},"e":{"(":{"2":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{},"x":{"df":3,"docs":{"257":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"385":{"tf":1.0}}}},"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":2.0}},"s":{":":{"1":{":":{"5":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"266":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"1":{"df":1,"docs":{"240":{"tf":1.0}}},"2":{"df":1,"docs":{"240":{"tf":1.0}}},"3":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"4":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":3,"docs":{"339":{"tf":2.23606797749979},"340":{"tf":1.0},"343":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"3":{"df":1,"docs":{"369":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"369":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"114":{"tf":1.4142135623730951},"115":{"tf":3.605551275463989},"116":{"tf":3.7416573867739413},"120":{"tf":2.23606797749979},"121":{"tf":2.23606797749979},"123":{"tf":1.4142135623730951},"127":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"(":{"1":{"0":{"0":{"df":1,"docs":{"207":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":3,"docs":{"200":{"tf":2.0},"207":{"tf":1.0},"211":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"207":{"tf":1.0}}},"a":{"df":3,"docs":{"200":{"tf":1.4142135623730951},"207":{"tf":1.0},"210":{"tf":1.0}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":5,"docs":{"196":{"tf":1.4142135623730951},"200":{"tf":1.7320508075688772},"207":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":15,"docs":{"102":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"152":{"tf":1.0},"207":{"tf":2.0},"257":{"tf":1.4142135623730951},"265":{"tf":2.23606797749979},"266":{"tf":2.23606797749979},"316":{"tf":1.7320508075688772},"331":{"tf":1.0},"368":{"tf":1.7320508075688772},"375":{"tf":4.0},"416":{"tf":1.0},"426":{"tf":1.0},"428":{"tf":1.0},"91":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":2.0}},"s":{":":{"2":{":":{"5":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":8,"docs":{"198":{"tf":3.3166247903554},"200":{"tf":1.7320508075688772},"207":{"tf":2.0},"208":{"tf":2.0},"210":{"tf":1.0},"211":{"tf":3.0},"265":{"tf":2.8284271247461903},"266":{"tf":4.0}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"101":{"tf":2.23606797749979},"165":{"tf":1.0},"367":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951}}}}}},"、":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"331":{"tf":2.0}}}}}}}}},"df":3,"docs":{"106":{"tf":1.0},"162":{"tf":1.0},"241":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"364":{"tf":1.0},"373":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"180":{"tf":1.0},"182":{"tf":1.0},"273":{"tf":1.0},"62":{"tf":2.23606797749979}}}}},"df":1,"docs":{"348":{"tf":3.0}},"e":{"=":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"180":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"179":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"178":{"tf":1.0},"179":{"tf":2.8284271247461903}}}}}},"o":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"b":{"a":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":1,"docs":{"328":{"tf":1.0}}},"s":{"df":0,"docs":{},"k":{"a":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"183":{"tf":1.0},"381":{"tf":1.0}},"s":{"df":1,"docs":{"379":{"tf":1.0}}}},"df":0,"docs":{},"v":{"df":1,"docs":{"398":{"tf":1.0}}}},"l":{"df":0,"docs":{},"o":{"c":{":":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{":":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"t":{",":{"a":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"66":{"tf":1.0},"70":{"tf":1.4142135623730951}}},"df":0,"docs":{},"w":{"df":2,"docs":{"283":{"tf":1.0},"316":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"191":{"tf":1.0},"290":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"386":{"tf":1.0},"431":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"353":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"86":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"152":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":3,"docs":{"20":{"tf":1.0},"4":{"tf":1.0},"429":{"tf":2.449489742783178}}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"203":{"tf":1.0},"208":{"tf":1.0}}},"df":0,"docs":{}}}},"df":2,"docs":{"203":{"tf":1.0},"208":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"213":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{":":{":":{"b":{"a":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},">":{":":{":":{"b":{"a":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"376":{"tf":4.242640687119285}}}},"n":{"df":1,"docs":{"194":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"52":{"tf":1.0},"53":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"192":{"tf":2.23606797749979}},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"。":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"194":{"tf":1.0}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"162":{"tf":1.0},"198":{"tf":2.0},"362":{"tf":1.0},"55":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"55":{"tf":2.449489742783178},"56":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"5":{"df":1,"docs":{"56":{"tf":1.0}}},"df":0,"docs":{},"x":{"df":1,"docs":{"56":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"142":{"tf":1.7320508075688772},"257":{"tf":2.0},"385":{"tf":2.0}}}}}}},"p":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"260":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":45,"docs":{"109":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.4142135623730951},"123":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"146":{"tf":1.0},"150":{"tf":1.4142135623730951},"152":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"198":{"tf":1.0},"212":{"tf":1.0},"226":{"tf":1.0},"245":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":2.8284271247461903},"259":{"tf":2.0},"261":{"tf":1.0},"270":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"299":{"tf":1.0},"306":{"tf":2.0},"307":{"tf":1.0},"313":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.4142135623730951},"318":{"tf":1.7320508075688772},"319":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":2.0},"337":{"tf":1.0},"366":{"tf":1.0},"374":{"tf":1.0},"380":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"408":{"tf":1.0},"78":{"tf":1.7320508075688772},"93":{"tf":1.0}},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"297":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":8,"docs":{"410":{"tf":1.0},"411":{"tf":1.0},"415":{"tf":1.0},"418":{"tf":1.0},"425":{"tf":1.0},"430":{"tf":1.0},"431":{"tf":1.0},"432":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}},"l":{"df":2,"docs":{"152":{"tf":1.0},"34":{"tf":1.7320508075688772}},"i":{"c":{"df":6,"docs":{"111":{"tf":1.0},"214":{"tf":1.0},"265":{"tf":1.0},"368":{"tf":1.0},"392":{"tf":1.0},"397":{"tf":1.0}}},"df":1,"docs":{"172":{"tf":1.0}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"342":{"tf":2.8284271247461903},"343":{"tf":2.8284271247461903}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"342":{"tf":3.4641016151377544},"343":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"428":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"306":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"0":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{">":{">":{"df":0,"docs":{},"。":{"a":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"t":{"df":4,"docs":{"306":{"tf":2.23606797749979},"307":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0}}}},"df":3,"docs":{"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"h":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"93":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"89":{"tf":1.0}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"89":{"tf":1.0}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"1":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":1,"docs":{"88":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":6,"docs":{"428":{"tf":1.4142135623730951},"88":{"tf":2.449489742783178},"89":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"93":{"tf":2.8284271247461903}}},"df":0,"docs":{}},"g":{"df":16,"docs":{"215":{"tf":2.0},"216":{"tf":2.23606797749979},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":2.0},"223":{"tf":1.0},"224":{"tf":2.449489742783178},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":3.605551275463989},"250":{"tf":1.7320508075688772},"257":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":9,"docs":{"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"249":{"tf":1.7320508075688772},"250":{"tf":1.7320508075688772}}}}}}},"[":{"0":{"df":1,"docs":{"217":{"tf":1.0}}},"1":{"]":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"2":{"]":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"224":{"tf":2.8284271247461903},"225":{"tf":2.449489742783178},"226":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"234":{"tf":1.4142135623730951},"235":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"249":{"tf":2.0},"250":{"tf":1.0},"299":{"tf":1.0},"42":{"tf":1.0},"56":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"214":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":4,"docs":{"106":{"tf":1.0},"376":{"tf":2.23606797749979},"42":{"tf":1.0},"61":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{":":{":":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":3.7416573867739413}},"i":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"180":{"tf":1.7320508075688772}},"e":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"180":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}}},"s":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":2,"docs":{"399":{"tf":1.0},"77":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":5,"docs":{"145":{"tf":1.0},"358":{"tf":1.7320508075688772},"417":{"tf":1.0},"53":{"tf":1.0},"78":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":1,"docs":{"401":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"113":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"!":{"(":{"!":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"#":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"414":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":3,"docs":{"405":{"tf":3.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"203":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"、":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"201":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"!":{"(":{"\"":{"df":0,"docs":{},"i":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}},"*":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951}}}}}}}}},"0":{"df":1,"docs":{"359":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"266":{"tf":1.0}}},"5":{"df":4,"docs":{"277":{"tf":2.0},"278":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"280":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"359":{"tf":1.4142135623730951}}},"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"(":{"2":{"df":1,"docs":{"200":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"368":{"tf":1.0}}},"b":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}},"e":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"162":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{")":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"289":{"tf":1.0},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"289":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":6,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"245":{"tf":1.0}}}}},"v":{"1":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"246":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"!":{"[":{"\"":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":18,"docs":{"162":{"tf":1.0},"198":{"tf":1.0},"200":{"tf":3.0},"201":{"tf":1.0},"203":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":2.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0},"257":{"tf":1.0},"277":{"tf":1.0},"280":{"tf":1.0},"337":{"tf":1.4142135623730951},"343":{"tf":1.4142135623730951},"375":{"tf":1.0},"419":{"tf":1.0},"420":{"tf":1.0}}}},"n":{"df":2,"docs":{"200":{"tf":2.0},"201":{"tf":1.4142135623730951}}}},"df":6,"docs":{"199":{"tf":3.1622776601683795},"200":{"tf":2.23606797749979},"201":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"228":{"tf":1.0},"405":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"49":{"tf":2.0},"57":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":7,"docs":{"244":{"tf":1.0},"34":{"tf":1.0},"374":{"tf":1.0},"376":{"tf":1.4142135623730951},"377":{"tf":1.0},"405":{"tf":1.4142135623730951},"96":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{".":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":1,"docs":{"391":{"tf":1.4142135623730951}}},"y":{"df":0,"docs":{},"n":{"c":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"317":{"tf":1.0}}},"df":0,"docs":{}}},"df":18,"docs":{"10":{"tf":1.0},"313":{"tf":2.23606797749979},"314":{"tf":1.7320508075688772},"315":{"tf":3.7416573867739413},"316":{"tf":5.830951894845301},"317":{"tf":2.0},"318":{"tf":2.0},"319":{"tf":3.605551275463989},"320":{"tf":5.830951894845301},"321":{"tf":1.7320508075688772},"322":{"tf":3.0},"323":{"tf":2.8284271247461903},"324":{"tf":1.0},"325":{"tf":1.0},"326":{"tf":2.0},"327":{"tf":1.0},"405":{"tf":1.4142135623730951},"412":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":2,"docs":{"337":{"tf":1.4142135623730951},"343":{"tf":2.0}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"306":{"tf":1.7320508075688772}},"i":{"c":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"198":{"tf":1.0},"387":{"tf":1.0},"91":{"tf":1.0}}}}},"df":0,"docs":{}}}},")":{"df":0,"docs":{},"一":{"df":0,"docs":{},"些":{"df":0,"docs":{},"其":{"df":0,"docs":{},"他":{"df":0,"docs":{},"数":{"df":0,"docs":{},"据":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"270":{"tf":1.0}}}}}}}}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"180":{"tf":1.4142135623730951},"376":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":3.4641016151377544}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"331":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":3.1622776601683795}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"10":{"tf":1.0},"313":{"tf":1.7320508075688772},"314":{"tf":1.4142135623730951},"315":{"tf":2.23606797749979},"316":{"tf":3.4641016151377544},"317":{"tf":1.0},"318":{"tf":3.4641016151377544},"319":{"tf":3.605551275463989},"320":{"tf":1.7320508075688772},"321":{"tf":2.8284271247461903},"322":{"tf":3.3166247903554},"323":{"tf":2.0},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"412":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"359":{"tf":2.23606797749979}}}},"y":{"df":1,"docs":{"152":{"tf":1.0}}},"、":{"b":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"👍":{"%":{"df":0,"docs":{},",":{"df":0,"docs":{},"就":{"df":0,"docs":{},"无":{"df":0,"docs":{},"法":{"df":0,"docs":{},"将":{"df":0,"docs":{},"其":{"df":0,"docs":{},"转":{"df":0,"docs":{},"换":{"df":0,"docs":{},"为":{"df":0,"docs":{},"一":{"df":0,"docs":{},"个":{"df":0,"docs":{},"数":{"df":0,"docs":{},"字":{"df":0,"docs":{},"。":{"df":0,"docs":{},"因":{"df":0,"docs":{},"此":{"df":0,"docs":{},",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}}},"b":{"'":{"a":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.0}}}}},"df":0,"docs":{}}},"3":{"2":{"3":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"9":{"a":{"1":{"5":{"6":{"df":0,"docs":{},"f":{"7":{"4":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"314":{"tf":1.0}}},">":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}}}},"a":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":2.8284271247461903}}},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":4.242640687119285}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"118":{"tf":2.0},"119":{"tf":1.4142135623730951}},"e":{":":{":":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"l":{"a":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"114":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"348":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"434":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":18,"docs":{"143":{"tf":1.0},"155":{"tf":1.7320508075688772},"156":{"tf":3.7416573867739413},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"277":{"tf":1.0},"290":{"tf":1.0},"301":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0},"70":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"113":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}}}}},"r":{"df":2,"docs":{"141":{"tf":1.0},"382":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"273":{"tf":1.0}}}}},"b":{"7":{"df":0,"docs":{},"e":{"4":{"2":{"9":{"a":{"d":{"6":{"b":{"5":{"9":{"d":{"9":{"a":{"0":{"c":{"3":{"7":{"d":{"b":{"7":{"4":{"3":{"4":{"9":{"7":{"6":{"3":{"6":{"4":{"c":{"b":{"b":{"9":{"c":{"6":{"d":{"a":{"df":3,"docs":{"100":{"tf":1.0},"108":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":26,"docs":{"10":{"tf":1.0},"114":{"tf":1.7320508075688772},"144":{"tf":1.0},"185":{"tf":2.8284271247461903},"191":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"272":{"tf":2.23606797749979},"285":{"tf":3.3166247903554},"286":{"tf":2.0},"291":{"tf":2.0},"293":{"tf":4.242640687119285},"314":{"tf":1.7320508075688772},"316":{"tf":1.0},"320":{"tf":1.7320508075688772},"322":{"tf":3.872983346207417},"325":{"tf":1.0},"350":{"tf":1.4142135623730951},"359":{"tf":2.8284271247461903},"368":{"tf":1.0},"415":{"tf":1.7320508075688772},"416":{"tf":1.7320508075688772},"417":{"tf":4.795831523312719},"53":{"tf":1.0},"66":{"tf":1.4142135623730951},"77":{"tf":2.23606797749979},"78":{"tf":2.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"413":{"tf":1.0}}}}},"df":1,"docs":{"106":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"241":{"tf":1.7320508075688772},"283":{"tf":2.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"289":{"tf":1.0},"407":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}},"n":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"252":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":1,"docs":{"252":{"tf":1.4142135623730951}},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"198":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}},"t":{"a":{"df":3,"docs":{"434":{"tf":4.58257569495584},"435":{"tf":1.0},"436":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"252":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"167":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772}}}}}}}},"i":{"df":0,"docs":{},"g":{"!":{"df":0,"docs":{},"。":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":8,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"74":{"tf":1.0}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"102":{"tf":1.7320508075688772}}}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":7,"docs":{"111":{"tf":1.0},"172":{"tf":1.0},"214":{"tf":1.0},"265":{"tf":1.0},"368":{"tf":1.0},"397":{"tf":1.0},"53":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"267":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"d":{"df":5,"docs":{"185":{"tf":1.0},"188":{"tf":1.0},"353":{"tf":1.4142135623730951},"397":{"tf":1.7320508075688772},"49":{"tf":1.0}}},"df":46,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"225":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"246":{"tf":1.0},"267":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"405":{"tf":1.7320508075688772},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"194":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"a":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"53":{"tf":2.23606797749979}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}}}}}},"j":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"183":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"@":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"2":{"2":{":":{"2":{"2":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"2":{"3":{"df":1,"docs":{"320":{"tf":3.605551275463989}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"319":{"tf":1.0}}}}},"df":4,"docs":{"298":{"tf":1.0},"313":{"tf":1.0},"320":{"tf":2.8284271247461903},"368":{"tf":1.0}}}},"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"337":{"tf":1.7320508075688772},"343":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":6,"docs":{"148":{"tf":1.0},"150":{"tf":1.4142135623730951},"239":{"tf":1.7320508075688772},"258":{"tf":1.4142135623730951},"348":{"tf":1.0},"359":{"tf":1.7320508075688772}}}}},"o":{"d":{"df":0,"docs":{},"i":{"df":6,"docs":{"229":{"tf":1.7320508075688772},"398":{"tf":1.4142135623730951},"399":{"tf":1.7320508075688772},"400":{"tf":2.23606797749979},"401":{"tf":1.7320508075688772},"58":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0}}},"o":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"0":{"tf":1.4142135623730951},"142":{"tf":1.0},"389":{"tf":1.0}}},"l":{"df":21,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":2.449489742783178},"181":{"tf":1.4142135623730951},"182":{"tf":2.23606797749979},"199":{"tf":2.0},"232":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0},"320":{"tf":1.0},"414":{"tf":1.7320508075688772},"53":{"tf":1.4142135623730951},"61":{"tf":2.0},"70":{"tf":1.0},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.7320508075688772},"93":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"289":{"tf":1.0},"290":{"tf":1.7320508075688772},"291":{"tf":1.4142135623730951},"293":{"tf":1.0},"294":{"tf":1.0}}}}}},"df":18,"docs":{"134":{"tf":2.23606797749979},"185":{"tf":2.0},"186":{"tf":1.4142135623730951},"188":{"tf":1.7320508075688772},"189":{"tf":1.0},"228":{"tf":1.4142135623730951},"289":{"tf":2.8284271247461903},"290":{"tf":2.0},"299":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"368":{"tf":2.0},"405":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.7320508075688772},"74":{"tf":3.0},"75":{"tf":2.23606797749979},"78":{"tf":2.23606797749979}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}}}}}},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":2.0}}}}}},"df":0,"docs":{}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"173":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}},"df":1,"docs":{"330":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":25,"docs":{"156":{"tf":1.4142135623730951},"177":{"tf":1.0},"181":{"tf":3.4641016151377544},"183":{"tf":2.6457513110645907},"194":{"tf":2.0},"195":{"tf":1.4142135623730951},"219":{"tf":1.0},"224":{"tf":1.4142135623730951},"242":{"tf":2.0},"249":{"tf":1.0},"306":{"tf":1.4142135623730951},"309":{"tf":1.0},"313":{"tf":1.7320508075688772},"320":{"tf":3.1622776601683795},"332":{"tf":1.4142135623730951},"334":{"tf":2.0},"335":{"tf":1.0},"336":{"tf":1.0},"377":{"tf":2.449489742783178},"383":{"tf":1.4142135623730951},"385":{"tf":1.0},"405":{"tf":2.0},"415":{"tf":1.0},"417":{"tf":1.4142135623730951},"54":{"tf":1.0}},",":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"181":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"x":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"5":{"df":1,"docs":{"272":{"tf":1.0}}},"a":{"df":1,"docs":{"285":{"tf":2.0}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"1":{"0":{"df":1,"docs":{"285":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"275":{"tf":1.0}}},"3":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":3,"docs":{"405":{"tf":1.7320508075688772},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"275":{"tf":1.0},"285":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}}}}}}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"335":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"x":{"df":1,"docs":{"278":{"tf":1.0}}},"|":{"df":0,"docs":{},"x":{"df":1,"docs":{"386":{"tf":1.4142135623730951}}}}},"df":3,"docs":{"320":{"tf":2.0},"381":{"tf":2.0},"386":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"320":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"<":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"334":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":20,"docs":{"162":{"tf":2.6457513110645907},"225":{"tf":2.23606797749979},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"334":{"tf":1.0},"335":{"tf":1.4142135623730951},"338":{"tf":1.0},"341":{"tf":1.7320508075688772},"342":{"tf":5.0},"381":{"tf":2.23606797749979},"383":{"tf":1.0},"386":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"278":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"273":{"tf":1.0},"275":{"tf":1.4142135623730951},"285":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"341":{"tf":2.23606797749979},"342":{"tf":4.898979485566356}}}}},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"335":{"tf":1.0},"383":{"tf":1.0}}}}},"t":{">":{"df":0,"docs":{},"。":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"271":{"tf":1.0}}}}},"df":0,"docs":{}},",":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":15,"docs":{"270":{"tf":1.0},"271":{"tf":1.7320508075688772},"272":{"tf":2.23606797749979},"273":{"tf":1.0},"274":{"tf":1.0},"275":{"tf":3.0},"276":{"tf":1.4142135623730951},"278":{"tf":2.6457513110645907},"279":{"tf":2.23606797749979},"283":{"tf":1.4142135623730951},"285":{"tf":2.0},"288":{"tf":2.0},"295":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"334":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"{":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"320":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":14,"docs":{"271":{"tf":2.0},"272":{"tf":2.8284271247461903},"273":{"tf":2.449489742783178},"275":{"tf":3.0},"283":{"tf":1.0},"320":{"tf":2.0},"334":{"tf":1.0},"335":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"341":{"tf":1.0},"342":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":1.0},"413":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{".":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"294":{"tf":5.477225575051661},"61":{"tf":3.4641016151377544}},"。":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"398":{"tf":1.0},"417":{"tf":1.7320508075688772},"431":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"k":{"df":9,"docs":{"167":{"tf":1.0},"240":{"tf":1.0},"273":{"tf":1.0},"382":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951},"412":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"62":{"tf":3.605551275463989}},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":8,"docs":{"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":5,"docs":{"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"381":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}}},"df":2,"docs":{"156":{"tf":1.0},"252":{"tf":1.7320508075688772}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":8,"docs":{"398":{"tf":2.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":25,"docs":{"102":{"tf":1.0},"106":{"tf":1.7320508075688772},"153":{"tf":1.0},"156":{"tf":1.0},"167":{"tf":1.0},"196":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.7320508075688772},"212":{"tf":1.4142135623730951},"296":{"tf":1.7320508075688772},"297":{"tf":1.0},"312":{"tf":1.0},"343":{"tf":1.0},"366":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"433":{"tf":1.0},"434":{"tf":1.0},"49":{"tf":1.0},"62":{"tf":1.0},"70":{"tf":1.4142135623730951},"77":{"tf":1.0},"78":{"tf":1.4142135623730951}},"!":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"200":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.0},"250":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"405":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"82":{"tf":1.4142135623730951},"83":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"82":{"tf":1.0},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":28,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"15":{"tf":1.0},"156":{"tf":1.0},"210":{"tf":1.0},"224":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.0},"249":{"tf":2.0},"250":{"tf":1.0},"255":{"tf":2.23606797749979},"265":{"tf":1.4142135623730951},"266":{"tf":2.23606797749979},"27":{"tf":2.6457513110645907},"277":{"tf":1.0},"28":{"tf":1.4142135623730951},"29":{"tf":1.0},"301":{"tf":1.0},"36":{"tf":1.0},"386":{"tf":1.0},"391":{"tf":1.7320508075688772},"40":{"tf":2.449489742783178},"405":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.0},"52":{"tf":1.0},"70":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{}},")":{"df":0,"docs":{},",":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"155":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"333":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":3.4641016151377544}},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"333":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":6,"docs":{"143":{"tf":1.4142135623730951},"144":{"tf":1.4142135623730951},"191":{"tf":1.0},"53":{"tf":1.4142135623730951},"77":{"tf":2.23606797749979},"78":{"tf":2.0}},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"df":0,"docs":{}},"9":{"5":{".":{".":{"1":{"0":{"3":{"df":1,"docs":{"391":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"191":{"tf":1.0},"77":{"tf":2.23606797749979},"78":{"tf":2.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"c":{"+":{"+":{"df":0,"docs":{},"”":{"df":0,"docs":{},"(":{"2":{"0":{"1":{"2":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},".":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"/":{"c":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"0":{"6":{"0":{"0":{"6":{"1":{"5":{"7":{"b":{"1":{"4":{"b":{"3":{"d":{"4":{"7":{"b":{"5":{"c":{"7":{"1":{"6":{"df":0,"docs":{},"f":{"c":{"3":{"9":{"2":{"b":{"7":{"7":{"df":0,"docs":{},"f":{"3":{"b":{"2":{"df":0,"docs":{},"e":{"2":{"1":{"c":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"d":{"d":{"d":{"a":{"c":{"6":{"9":{"2":{"8":{"4":{"8":{"a":{"d":{"df":0,"docs":{},"e":{"6":{"c":{"2":{"1":{"1":{"2":{"c":{"8":{"df":0,"docs":{},"e":{"1":{"5":{"a":{"7":{"0":{"8":{"7":{"df":0,"docs":{},"f":{"b":{"b":{"df":0,"docs":{},"e":{"c":{"4":{"5":{"df":1,"docs":{"418":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"4":{"b":{"d":{"d":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"3":{"2":{"8":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"e":{"7":{"7":{"4":{"d":{"df":0,"docs":{},"f":{"1":{"9":{"8":{"8":{"2":{"c":{"c":{"c":{"1":{"3":{"9":{"5":{"3":{"2":{"df":0,"docs":{},"e":{"5":{"3":{"d":{"8":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"7":{"7":{"d":{"7":{"a":{"1":{"2":{"7":{"9":{"d":{"b":{"c":{"7":{"a":{"9":{"d":{"7":{"6":{"df":0,"docs":{},"e":{"8":{"0":{"c":{"5":{"a":{"c":{"9":{"d":{"7":{"4":{"2":{"d":{"d":{"5":{"2":{"9":{"5":{"3":{"8":{"c":{"df":3,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"398":{"tf":1.0}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"62":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"73":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":2,"docs":{"72":{"tf":1.0},"73":{"tf":1.7320508075688772}},"s":{"1":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"73":{"tf":2.0}}}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"c":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":15,"docs":{"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"154":{"tf":1.0},"159":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":2.449489742783178},"242":{"tf":1.4142135623730951},"283":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.0},"330":{"tf":1.0},"368":{"tf":2.0},"376":{"tf":3.1622776601683795},"407":{"tf":1.0}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"277":{"tf":1.0},"360":{"tf":1.0}}}},"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"199":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"199":{"tf":2.8284271247461903},"95":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":2.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":1.7320508075688772}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":7,"docs":{"113":{"tf":1.0},"211":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"266":{"tf":2.449489742783178},"27":{"tf":1.0},"40":{"tf":3.0}}}},"df":0,"docs":{}}},"m":{"d":{"df":3,"docs":{"25":{"tf":1.0},"254":{"tf":1.0},"268":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":15,"docs":{"111":{"tf":2.0},"113":{"tf":1.0},"124":{"tf":2.23606797749979},"155":{"tf":1.0},"211":{"tf":1.4142135623730951},"255":{"tf":2.23606797749979},"26":{"tf":2.6457513110645907},"260":{"tf":2.6457513110645907},"262":{"tf":1.0},"265":{"tf":2.23606797749979},"266":{"tf":2.8284271247461903},"32":{"tf":1.4142135623730951},"391":{"tf":1.7320508075688772},"40":{"tf":2.449489742783178},"430":{"tf":1.4142135623730951}}}}}}},"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"267":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"259":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":141,"docs":{"10":{"tf":1.4142135623730951},"102":{"tf":1.0},"106":{"tf":1.0},"110":{"tf":1.4142135623730951},"111":{"tf":3.3166247903554},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.0},"124":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":2.0},"157":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":3.3166247903554},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"203":{"tf":1.0},"204":{"tf":3.0},"205":{"tf":1.0},"206":{"tf":2.0},"207":{"tf":2.6457513110645907},"208":{"tf":2.6457513110645907},"210":{"tf":2.23606797749979},"211":{"tf":3.1622776601683795},"214":{"tf":2.23606797749979},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"232":{"tf":2.0},"234":{"tf":1.0},"235":{"tf":1.4142135623730951},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"246":{"tf":1.0},"25":{"tf":3.605551275463989},"253":{"tf":1.0},"254":{"tf":2.6457513110645907},"255":{"tf":3.1622776601683795},"256":{"tf":1.4142135623730951},"257":{"tf":2.449489742783178},"258":{"tf":1.7320508075688772},"259":{"tf":2.0},"26":{"tf":4.58257569495584},"260":{"tf":2.23606797749979},"261":{"tf":1.7320508075688772},"262":{"tf":1.4142135623730951},"263":{"tf":2.449489742783178},"264":{"tf":2.23606797749979},"265":{"tf":2.449489742783178},"266":{"tf":4.358898943540674},"267":{"tf":2.8284271247461903},"268":{"tf":3.872983346207417},"269":{"tf":1.7320508075688772},"27":{"tf":5.5677643628300215},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"285":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":1.4142135623730951},"29":{"tf":2.6457513110645907},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"32":{"tf":2.449489742783178},"335":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"38":{"tf":1.4142135623730951},"386":{"tf":1.0},"391":{"tf":2.23606797749979},"397":{"tf":1.7320508075688772},"398":{"tf":1.0},"399":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":5.291502622129181},"400":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":3.3166247903554},"407":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951},"41":{"tf":2.23606797749979},"42":{"tf":1.4142135623730951},"426":{"tf":2.0},"427":{"tf":2.23606797749979},"428":{"tf":1.7320508075688772},"43":{"tf":1.0},"430":{"tf":1.4142135623730951},"45":{"tf":1.0},"49":{"tf":2.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.7320508075688772},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":2.449489742783178},"62":{"tf":1.7320508075688772},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"436":{"tf":1.0}}}}}}}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"398":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.4142135623730951},"232":{"tf":2.23606797749979},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}}},"df":5,"docs":{"106":{"tf":1.0},"273":{"tf":1.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951}}},"t":{"df":2,"docs":{"320":{"tf":1.0},"335":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"102":{"tf":1.0},"260":{"tf":1.0}}}}},"d":{"df":10,"docs":{"198":{"tf":1.0},"21":{"tf":2.0},"214":{"tf":1.0},"26":{"tf":1.0},"265":{"tf":1.0},"29":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"397":{"tf":1.0},"436":{"tf":1.0}}},"df":40,"docs":{"10":{"tf":1.0},"144":{"tf":1.0},"15":{"tf":2.23606797749979},"156":{"tf":1.0},"172":{"tf":1.0},"175":{"tf":1.4142135623730951},"200":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.4142135623730951},"252":{"tf":2.23606797749979},"270":{"tf":1.0},"283":{"tf":2.23606797749979},"285":{"tf":3.0},"286":{"tf":2.8284271247461903},"291":{"tf":2.449489742783178},"319":{"tf":1.0},"320":{"tf":1.7320508075688772},"325":{"tf":1.0},"350":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"367":{"tf":1.0},"368":{"tf":3.1622776601683795},"371":{"tf":1.0},"385":{"tf":1.0},"388":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"418":{"tf":1.7320508075688772},"419":{"tf":1.0},"420":{"tf":1.0},"421":{"tf":1.0},"422":{"tf":1.0},"423":{"tf":1.0},"424":{"tf":1.0},"43":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":1.0},"62":{"tf":2.0},"70":{"tf":1.4142135623730951},"91":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"431":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"310":{"tf":1.0}}}},"df":1,"docs":{"307":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":23,"docs":{"198":{"tf":2.0},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":2.6457513110645907},"211":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"244":{"tf":1.0},"245":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"266":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}},"df":3,"docs":{"210":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"42":{"tf":1.0}}}},"h":{"0":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"1":{"df":4,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":1.0},"25":{"tf":1.0}}},"2":{"df":1,"docs":{"31":{"tf":1.0}}},"3":{"df":6,"docs":{"47":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}},"4":{"df":4,"docs":{"64":{"tf":1.0},"65":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0}}},"5":{"df":4,"docs":{"81":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0}}},"6":{"df":4,"docs":{"100":{"tf":1.0},"103":{"tf":1.0},"108":{"tf":1.0},"99":{"tf":1.0}}},"7":{"df":6,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":1.0}}},"8":{"df":4,"docs":{"130":{"tf":1.0},"131":{"tf":1.0},"138":{"tf":1.0},"146":{"tf":1.0}}},"9":{"df":4,"docs":{"153":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":4,"docs":{"169":{"tf":1.0},"171":{"tf":1.0},"177":{"tf":1.0},"184":{"tf":1.0}}},"1":{"df":4,"docs":{"196":{"tf":1.0},"197":{"tf":1.0},"204":{"tf":1.0},"209":{"tf":1.0}}},"2":{"df":7,"docs":{"213":{"tf":1.0},"214":{"tf":1.0},"218":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0}}},"3":{"df":5,"docs":{"237":{"tf":1.0},"238":{"tf":1.0},"243":{"tf":1.0},"248":{"tf":1.0},"252":{"tf":1.0}}},"4":{"df":6,"docs":{"254":{"tf":1.0},"255":{"tf":1.0},"256":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0}}},"5":{"df":7,"docs":{"270":{"tf":1.0},"271":{"tf":1.0},"276":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0}}},"6":{"df":5,"docs":{"296":{"tf":1.0},"297":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0}}},"7":{"df":5,"docs":{"313":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":1.0}}},"8":{"df":4,"docs":{"328":{"tf":1.0},"329":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0}}},"9":{"df":4,"docs":{"345":{"tf":1.0},"346":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":6,"docs":{"364":{"tf":1.0},"365":{"tf":1.0},"373":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0},"387":{"tf":1.0}}},"1":{"df":4,"docs":{"395":{"tf":1.0},"396":{"tf":1.0},"403":{"tf":1.0},"406":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":6,"docs":{"289":{"tf":1.4142135623730951},"293":{"tf":2.0},"359":{"tf":1.0},"405":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0}},"e":{"(":{"&":{"df":1,"docs":{"73":{"tf":1.0}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"73":{"tf":1.4142135623730951},"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"359":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"274":{"tf":1.0},"359":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"101":{"tf":1.0},"359":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"296":{"tf":1.0},"300":{"tf":1.0},"319":{"tf":1.0},"434":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"1":{"0":{"df":6,"docs":{"172":{"tf":1.7320508075688772},"173":{"tf":1.7320508075688772},"185":{"tf":1.7320508075688772},"186":{"tf":1.7320508075688772},"188":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":1,"docs":{"142":{"tf":1.0}}}}}},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.4142135623730951}}}}}}},"df":11,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":2.0},"162":{"tf":1.0},"170":{"tf":1.0},"172":{"tf":2.449489742783178},"175":{"tf":1.4142135623730951},"358":{"tf":1.7320508075688772},"53":{"tf":2.6457513110645907},"56":{"tf":1.4142135623730951},"70":{"tf":1.0}},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"=":{"\"":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"102":{"tf":1.0},"27":{"tf":2.6457513110645907},"405":{"tf":3.605551275463989},"407":{"tf":2.23606797749979},"427":{"tf":1.0}},"e":{"d":{"_":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"185":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"114":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"294":{"tf":4.242640687119285}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"434":{"tf":2.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"260":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"i":{"df":1,"docs":{"434":{"tf":1.0}},"r":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"100":{"tf":1.0},"428":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"416":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"15":{"tf":1.0},"24":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"406":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":1,"docs":{"78":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"396":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":3.1622776601683795}}},"y":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":14,"docs":{"181":{"tf":2.0},"222":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.0},"249":{"tf":2.23606797749979},"285":{"tf":1.0},"286":{"tf":1.0},"29":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":1.7320508075688772},"319":{"tf":1.0},"375":{"tf":1.0},"422":{"tf":4.123105625617661},"70":{"tf":2.449489742783178}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"300":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":8,"docs":{"224":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"240":{"tf":2.449489742783178},"241":{"tf":4.123105625617661},"242":{"tf":1.4142135623730951},"299":{"tf":2.23606797749979},"306":{"tf":1.4142135623730951}},"e":{"@":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"1":{":":{"3":{"6":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"238":{"tf":1.0},"384":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"迭":{"df":0,"docs":{},"代":{"df":0,"docs":{},"器":{"df":0,"docs":{},"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}}}}}}}}}}}},"m":{"d":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":3,"docs":{"17":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.7320508075688772}}},"df":0,"docs":{},"p":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"183":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"183":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":3,"docs":{"42":{"tf":1.7320508075688772},"421":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"n":{"df":1,"docs":{"0":{"tf":1.0}}},"o":{"d":{"df":0,"docs":{},"e":{"df":10,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"211":{"tf":1.0},"252":{"tf":1.0},"335":{"tf":1.7320508075688772},"352":{"tf":1.0},"360":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"399":{"tf":1.0},"429":{"tf":1.0}},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"测":{"df":0,"docs":{},"试":{"df":0,"docs":{},"中":{"df":0,"docs":{},",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"163":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"c":{"df":1,"docs":{"141":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"141":{"tf":1.0},"276":{"tf":1.0},"281":{"tf":1.0},"78":{"tf":1.0}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"179":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{":":{":":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":3,"docs":{"103":{"tf":1.7320508075688772},"104":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"这":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"104":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"103":{"tf":3.0},"104":{"tf":2.449489742783178},"105":{"tf":1.0},"108":{"tf":2.6457513110645907}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":13,"docs":{"130":{"tf":1.0},"134":{"tf":1.7320508075688772},"142":{"tf":1.7320508075688772},"143":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"247":{"tf":1.0},"250":{"tf":1.4142135623730951},"257":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"64":{"tf":1.0},"70":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"(":{"0":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":1,"docs":{"359":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"b":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"149":{"tf":1.0},"239":{"tf":1.4142135623730951},"258":{"tf":3.4641016151377544},"348":{"tf":2.449489742783178},"359":{"tf":2.23606797749979},"85":{"tf":1.4142135623730951}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"301":{"tf":1.0},"70":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"214":{"tf":1.0},"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"257":{"tf":1.0},"437":{"tf":1.0},"59":{"tf":1.7320508075688772}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"59":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"t":{"df":110,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"100":{"tf":1.0},"103":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"138":{"tf":1.0},"146":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.0},"177":{"tf":1.0},"184":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"209":{"tf":1.0},"213":{"tf":1.0},"214":{"tf":1.0},"218":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"243":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.0},"252":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.0},"256":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.0},"276":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"297":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"364":{"tf":1.0},"365":{"tf":1.0},"373":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0},"387":{"tf":1.0},"395":{"tf":1.0},"396":{"tf":1.0},"403":{"tf":1.0},"406":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0},"415":{"tf":1.0},"418":{"tf":1.0},"425":{"tf":1.0},"430":{"tf":1.0},"431":{"tf":1.0},"432":{"tf":1.0},"47":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0},"99":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"130":{"tf":1.0},"211":{"tf":2.449489742783178},"47":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"300":{"tf":1.4142135623730951},"304":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}},"r":{"df":1,"docs":{"277":{"tf":1.0}}},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":97,"docs":{"102":{"tf":1.7320508075688772},"106":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"134":{"tf":1.4142135623730951},"142":{"tf":1.4142135623730951},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"185":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951},"189":{"tf":1.4142135623730951},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"242":{"tf":1.7320508075688772},"246":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":2.8284271247461903},"267":{"tf":1.0},"27":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"283":{"tf":2.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"289":{"tf":2.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":2.0},"301":{"tf":1.4142135623730951},"306":{"tf":2.0},"32":{"tf":1.0},"335":{"tf":1.4142135623730951},"350":{"tf":1.0},"351":{"tf":1.4142135623730951},"353":{"tf":1.7320508075688772},"36":{"tf":1.0},"360":{"tf":1.4142135623730951},"368":{"tf":2.0},"376":{"tf":2.23606797749979},"377":{"tf":1.4142135623730951},"38":{"tf":1.0},"386":{"tf":1.7320508075688772},"398":{"tf":1.0},"40":{"tf":3.0},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":3.1622776601683795},"427":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.7320508075688772},"51":{"tf":1.7320508075688772},"52":{"tf":1.4142135623730951},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.4142135623730951},"58":{"tf":1.7320508075688772},"61":{"tf":2.8284271247461903},"62":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":2.0},"75":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":1,"docs":{"59":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"333":{"tf":1.7320508075688772},"334":{"tf":3.0},"335":{"tf":2.449489742783178},"426":{"tf":1.0},"428":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":2,"docs":{"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"102":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"260":{"tf":1.0},"273":{"tf":1.7320508075688772},"313":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"47":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":3,"docs":{"296":{"tf":1.4142135623730951},"308":{"tf":1.0},"317":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"297":{"tf":1.0},"57":{"tf":1.0},"61":{"tf":2.6457513110645907}}}}},"df":7,"docs":{"273":{"tf":4.898979485566356},"274":{"tf":2.23606797749979},"275":{"tf":2.6457513110645907},"285":{"tf":2.6457513110645907},"286":{"tf":1.0},"291":{"tf":2.0},"293":{"tf":2.6457513110645907}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":5,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"229":{"tf":1.0}}}}}}}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":5,"docs":{"224":{"tf":1.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"(":{")":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"249":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":6,"docs":{"224":{"tf":2.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":3.7416573867739413},"405":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"223":{"tf":1.0},"224":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"223":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"108":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"df":12,"docs":{"222":{"tf":3.872983346207417},"223":{"tf":3.3166247903554},"224":{"tf":3.872983346207417},"225":{"tf":3.7416573867739413},"226":{"tf":2.8284271247461903},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.7416573867739413},"235":{"tf":1.0},"249":{"tf":4.242640687119285},"250":{"tf":2.449489742783178}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"108":{"tf":1.4142135623730951},"210":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"397":{"tf":2.449489742783178},"398":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"(":{"1":{"df":2,"docs":{"273":{"tf":1.0},"275":{"tf":1.0}}},"2":{"df":1,"docs":{"273":{"tf":1.0}}},"3":{"df":3,"docs":{"273":{"tf":1.0},"285":{"tf":1.7320508075688772},"286":{"tf":1.0}}},"4":{"df":2,"docs":{"285":{"tf":1.7320508075688772},"286":{"tf":1.0}}},"5":{"df":2,"docs":{"285":{"tf":1.4142135623730951},"293":{"tf":1.0}}},"_":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}},"df":0,"docs":{},"i":{"3":{"2":{"df":5,"docs":{"273":{"tf":2.0},"275":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"293":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"c":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"3":{"df":1,"docs":{"291":{"tf":1.0}}},"4":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"291":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"d":{"df":23,"docs":{"120":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"186":{"tf":1.0},"228":{"tf":1.0},"242":{"tf":1.0},"283":{"tf":1.0},"289":{"tf":1.4142135623730951},"306":{"tf":1.0},"320":{"tf":2.6457513110645907},"324":{"tf":1.0},"353":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"427":{"tf":1.0},"428":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"412":{"tf":1.0},"428":{"tf":1.0},"50":{"tf":1.0}}}}},"df":5,"docs":{"367":{"tf":2.23606797749979},"412":{"tf":1.0},"416":{"tf":1.0},"50":{"tf":1.4142135623730951},"75":{"tf":1.0}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"273":{"tf":1.0},"391":{"tf":1.4142135623730951},"61":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}},"m":{"df":5,"docs":{"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"300":{"tf":1.0},"303":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"145":{"tf":1.0},"186":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"75":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":4,"docs":{"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"<":{"'":{"a":{">":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"342":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":34,"docs":{"116":{"tf":1.0},"140":{"tf":1.7320508075688772},"179":{"tf":1.7320508075688772},"180":{"tf":2.449489742783178},"181":{"tf":1.4142135623730951},"182":{"tf":2.6457513110645907},"218":{"tf":1.4142135623730951},"219":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":3.872983346207417},"229":{"tf":4.358898943540674},"231":{"tf":2.8284271247461903},"232":{"tf":5.916079783099616},"249":{"tf":5.196152422706632},"250":{"tf":3.872983346207417},"252":{"tf":1.0},"337":{"tf":1.7320508075688772},"338":{"tf":1.7320508075688772},"339":{"tf":2.6457513110645907},"340":{"tf":2.449489742783178},"341":{"tf":1.7320508075688772},"342":{"tf":4.58257569495584},"343":{"tf":4.58257569495584},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"s":{"\"":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"140":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"(":{"df":0,"docs":{},"而":{"df":0,"docs":{},"不":{"df":0,"docs":{},"是":{"df":0,"docs":{},"参":{"df":0,"docs":{},"数":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},")":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"228":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":5,"docs":{"167":{"tf":1.7320508075688772},"382":{"tf":2.6457513110645907},"412":{"tf":1.0},"45":{"tf":1.4142135623730951},"62":{"tf":2.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"166":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":6,"docs":{"112":{"tf":1.0},"26":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"257":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"i":{"df":15,"docs":{"148":{"tf":1.0},"149":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"375":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.0},"422":{"tf":3.605551275463989},"70":{"tf":3.7416573867739413},"71":{"tf":1.0},"84":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"i":{">":{">":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"156":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"156":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"156":{"tf":1.0}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"[":{"df":0,"docs":{},"t":{"]":{">":{">":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"242":{"tf":1.0},"252":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"252":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":9,"docs":{"108":{"tf":2.0},"150":{"tf":2.0},"270":{"tf":1.0},"284":{"tf":1.0},"286":{"tf":2.23606797749979},"293":{"tf":3.1622776601683795},"306":{"tf":1.0},"374":{"tf":1.4142135623730951},"62":{"tf":3.1622776601683795}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"306":{"tf":2.8284271247461903}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":5,"docs":{"306":{"tf":3.3166247903554},"307":{"tf":1.0},"369":{"tf":2.6457513110645907},"374":{"tf":3.3166247903554},"62":{"tf":2.6457513110645907}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":2.0}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"s":{"df":3,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"106":{"tf":1.7320508075688772},"353":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":4,"docs":{"313":{"tf":2.8284271247461903},"314":{"tf":1.0},"322":{"tf":1.0},"53":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"102":{"tf":1.0},"155":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":2,"docs":{"301":{"tf":1.0},"70":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"120":{"tf":2.449489742783178},"121":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":1.7320508075688772},"121":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{":":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"113":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"{":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"273":{"tf":1.0},"275":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"382":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":74,"docs":{"110":{"tf":3.1622776601683795},"111":{"tf":5.0},"112":{"tf":1.0},"113":{"tf":3.605551275463989},"114":{"tf":2.8284271247461903},"115":{"tf":3.605551275463989},"116":{"tf":2.6457513110645907},"117":{"tf":4.123105625617661},"118":{"tf":2.0},"119":{"tf":1.0},"120":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":1.4142135623730951},"124":{"tf":1.7320508075688772},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":2.6457513110645907},"128":{"tf":1.7320508075688772},"129":{"tf":1.7320508075688772},"144":{"tf":1.0},"156":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":3.4641016151377544},"211":{"tf":3.4641016151377544},"226":{"tf":2.449489742783178},"256":{"tf":2.0},"257":{"tf":4.0},"258":{"tf":4.795831523312719},"259":{"tf":1.4142135623730951},"26":{"tf":1.0},"260":{"tf":4.123105625617661},"261":{"tf":2.6457513110645907},"262":{"tf":2.0},"263":{"tf":2.0},"264":{"tf":1.7320508075688772},"265":{"tf":2.8284271247461903},"266":{"tf":6.782329983125268},"267":{"tf":2.23606797749979},"269":{"tf":1.0},"297":{"tf":1.0},"31":{"tf":1.0},"312":{"tf":1.4142135623730951},"316":{"tf":4.0},"318":{"tf":2.0},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":2.23606797749979},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"333":{"tf":1.0},"335":{"tf":1.0},"337":{"tf":1.7320508075688772},"343":{"tf":1.0},"378":{"tf":1.7320508075688772},"39":{"tf":1.0},"390":{"tf":2.23606797749979},"391":{"tf":4.58257569495584},"392":{"tf":1.4142135623730951},"395":{"tf":1.4142135623730951},"40":{"tf":4.242640687119285},"405":{"tf":1.7320508075688772},"408":{"tf":1.0},"41":{"tf":1.7320508075688772},"412":{"tf":1.4142135623730951},"414":{"tf":1.0},"417":{"tf":1.0},"42":{"tf":1.0},"421":{"tf":1.0},"426":{"tf":1.0},"46":{"tf":1.0},"59":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":25,"docs":{"124":{"tf":1.4142135623730951},"144":{"tf":1.0},"151":{"tf":1.0},"214":{"tf":1.0},"254":{"tf":2.23606797749979},"255":{"tf":1.0},"256":{"tf":2.449489742783178},"257":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"259":{"tf":2.6457513110645907},"260":{"tf":2.0},"261":{"tf":2.8284271247461903},"262":{"tf":1.4142135623730951},"263":{"tf":2.449489742783178},"264":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.7320508075688772},"267":{"tf":1.7320508075688772},"268":{"tf":1.0},"269":{"tf":1.7320508075688772},"391":{"tf":1.0},"395":{"tf":1.0},"40":{"tf":2.0},"408":{"tf":1.0},"59":{"tf":1.0}}}},"m":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"111":{"tf":1.0},"264":{"tf":1.0},"40":{"tf":1.0}}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"111":{"tf":1.0},"158":{"tf":1.4142135623730951},"198":{"tf":1.0},"214":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.0},"283":{"tf":2.6457513110645907},"286":{"tf":2.449489742783178},"397":{"tf":1.0},"405":{"tf":3.1622776601683795},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"398":{"tf":2.449489742783178},"399":{"tf":1.7320508075688772}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"316":{"tf":1.0}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":5,"docs":{"319":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"43":{"tf":1.0},"62":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"189":{"tf":1.0},"299":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"324":{"tf":1.0},"352":{"tf":1.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"75":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"120":{"tf":2.23606797749979},"360":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"283":{"tf":5.385164807134504}}}}}}}}}},"df":0,"docs":{}}}}}}}},"y":{"c":{"df":0,"docs":{},"l":{"df":3,"docs":{"270":{"tf":1.0},"273":{"tf":1.7320508075688772},"293":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"d":{"0":{"a":{"c":{"b":{"2":{"5":{"9":{"5":{"c":{"8":{"9":{"1":{"d":{"df":0,"docs":{},"e":{"9":{"7":{"a":{"1":{"3":{"3":{"d":{"0":{"6":{"6":{"3":{"5":{"c":{"5":{"0":{"a":{"b":{"4":{"4":{"9":{"d":{"d":{"6":{"5":{"c":{"df":5,"docs":{"47":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"3":{"9":{"3":{"7":{"3":{"a":{"8":{"3":{"8":{"df":0,"docs":{},"f":{"d":{"3":{"1":{"2":{"a":{"8":{"a":{"9":{"b":{"c":{"c":{"9":{"4":{"8":{"7":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"b":{"c":{"9":{"df":0,"docs":{},"e":{"1":{"5":{"8":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"4":{"3":{"1":{"7":{"c":{"3":{"1":{"2":{"2":{"b":{"4":{"4":{"df":0,"docs":{},"f":{"b":{"7":{"1":{"3":{"a":{"b":{"a":{"6":{"6":{"c":{"c":{"2":{"9":{"5":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"3":{"4":{"5":{"3":{"b":{"2":{"4":{"b":{"df":1,"docs":{"432":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":0,"docs":{},"e":{"b":{"2":{"df":0,"docs":{},"f":{"7":{"a":{"8":{"df":0,"docs":{},"e":{"9":{"c":{"6":{"df":0,"docs":{},"f":{"5":{"1":{"b":{"4":{"4":{"7":{"8":{"df":0,"docs":{},"f":{"9":{"c":{"d":{"4":{"6":{"df":0,"docs":{},"f":{"5":{"5":{"4":{"4":{"8":{"df":0,"docs":{},"e":{"2":{"c":{"a":{"2":{"c":{"1":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"9":{"4":{"df":0,"docs":{},"e":{"0":{"3":{"a":{"1":{"8":{"a":{"2":{"5":{"9":{"0":{"df":0,"docs":{},"e":{"d":{"3":{"df":0,"docs":{},"f":{"1":{"c":{"6":{"7":{"b":{"8":{"5":{"9":{"c":{"b":{"1":{"1":{"5":{"2":{"8":{"d":{"2":{"a":{"2":{"d":{"5":{"c":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"a":{"a":{"2":{"6":{"8":{"a":{"0":{"c":{"d":{"0":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"7":{"6":{"a":{"8":{"0":{"6":{"7":{"a":{"2":{"6":{"df":0,"docs":{},"e":{"d":{"7":{"d":{"2":{"8":{"df":0,"docs":{},"e":{"c":{"2":{"a":{"9":{"3":{"3":{"6":{"d":{"3":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":2.6457513110645907}}}},"l":{"df":2,"docs":{"185":{"tf":1.0},"75":{"tf":3.872983346207417}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"431":{"tf":1.0}}}}},"t":{"a":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"140":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":13,"docs":{"140":{"tf":1.0},"189":{"tf":1.0},"260":{"tf":1.0},"283":{"tf":4.242640687119285},"289":{"tf":1.0},"313":{"tf":1.0},"330":{"tf":1.4142135623730951},"359":{"tf":1.0},"391":{"tf":1.0},"52":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"y":{"df":5,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0},"348":{"tf":1.0},"63":{"tf":1.0}}}},"b":{"df":0,"docs":{},"g":{"!":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"3":{"0":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"215":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"91":{"tf":3.3166247903554}}}},"d":{"8":{"df":0,"docs":{},"f":{"4":{"7":{"a":{"7":{"4":{"b":{"6":{"7":{"1":{"7":{"8":{"c":{"df":0,"docs":{},"e":{"a":{"8":{"c":{"8":{"3":{"2":{"df":0,"docs":{},"e":{"3":{"b":{"4":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"3":{"b":{"b":{"5":{"1":{"5":{"b":{"d":{"7":{"2":{"df":1,"docs":{"163":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"17":{"tf":1.0}}},"df":12,"docs":{"10":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"23":{"tf":1.0},"231":{"tf":1.0},"283":{"tf":1.4142135623730951},"325":{"tf":1.0},"425":{"tf":1.7320508075688772},"426":{"tf":1.0},"427":{"tf":1.0},"428":{"tf":1.0},"429":{"tf":1.0}},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.0}}}},"df":0,"docs":{}},"df":9,"docs":{"156":{"tf":1.4142135623730951},"181":{"tf":1.0},"200":{"tf":1.7320508075688772},"247":{"tf":1.0},"27":{"tf":1.0},"398":{"tf":1.0},"419":{"tf":2.23606797749979},"53":{"tf":1.0},"91":{"tf":3.1622776601683795}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":59,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":2.23606797749979},"267":{"tf":1.0},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"53":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"185":{"tf":1.0},"188":{"tf":1.0},"289":{"tf":1.0},"387":{"tf":1.0},"389":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"422":{"tf":1.0},"70":{"tf":1.0}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"120":{"tf":1.0},"225":{"tf":1.0},"246":{"tf":1.0},"266":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"36":{"tf":1.0},"361":{"tf":1.0},"375":{"tf":1.0},"377":{"tf":1.4142135623730951},"405":{"tf":1.0},"424":{"tf":3.1622776601683795},"427":{"tf":1.0},"428":{"tf":1.0},"436":{"tf":1.0},"57":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":10,"docs":{"100":{"tf":1.0},"106":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":2.23606797749979},"376":{"tf":1.0},"42":{"tf":1.0},"82":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"26":{"tf":1.0},"289":{"tf":1.0},"32":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"151":{"tf":1.0},"405":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"(":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{":":{":":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":7,"docs":{"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"260":{"tf":1.0},"266":{"tf":1.7320508075688772},"32":{"tf":1.0},"391":{"tf":1.0},"40":{"tf":2.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"416":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"u":{"df":1,"docs":{"282":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":17,"docs":{"141":{"tf":1.7320508075688772},"270":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":2.8284271247461903},"277":{"tf":2.0},"278":{"tf":1.0},"279":{"tf":2.23606797749979},"280":{"tf":4.47213595499958},"281":{"tf":5.196152422706632},"282":{"tf":2.449489742783178},"290":{"tf":1.0},"295":{"tf":1.0},"306":{"tf":1.0},"342":{"tf":1.0},"378":{"tf":1.4142135623730951},"416":{"tf":1.0},"78":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"276":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"279":{"tf":1.0},"73":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"u":{"df":1,"docs":{"282":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":1,"docs":{"282":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"v":{"df":7,"docs":{"198":{"tf":1.0},"387":{"tf":1.4142135623730951},"388":{"tf":1.0},"391":{"tf":1.7320508075688772},"392":{"tf":1.0},"418":{"tf":3.4641016151377544},"91":{"tf":1.4142135623730951}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{",":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{",":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":15,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"113":{"tf":1.0},"199":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.7320508075688772},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979},"375":{"tf":1.0},"91":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":2,"docs":{"200":{"tf":1.0},"247":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":2.449489742783178}}}}}}}}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":3,"docs":{"102":{"tf":1.0},"330":{"tf":1.0},"337":{"tf":1.0}}}}},"t":{"df":1,"docs":{"398":{"tf":1.0}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"359":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":5,"docs":{"156":{"tf":1.0},"273":{"tf":1.0},"320":{"tf":1.0},"407":{"tf":1.0},"75":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"431":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":48,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.0},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":2.6457513110645907},"261":{"tf":1.0},"266":{"tf":1.7320508075688772},"27":{"tf":2.0},"273":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"227":{"tf":1.0},"425":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"107":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"127":{"tf":1.0},"320":{"tf":1.0},"53":{"tf":1.0}}}}}},"j":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"e":{"df":3,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"0":{"df":1,"docs":{"89":{"tf":1.0}}},"1":{"df":1,"docs":{"89":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"115":{"tf":1.0}}}},"r":{"df":2,"docs":{"111":{"tf":1.0},"24":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"428":{"tf":1.0},"57":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"408":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"336":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{">":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"181":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":25,"docs":{"140":{"tf":1.0},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"179":{"tf":1.7320508075688772},"181":{"tf":1.7320508075688772},"183":{"tf":2.449489742783178},"194":{"tf":1.7320508075688772},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0},"377":{"tf":3.3166247903554},"378":{"tf":2.449489742783178},"385":{"tf":1.0},"418":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0},"91":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"94":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"175":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"175":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"382":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"53":{"tf":1.0},"61":{"tf":2.6457513110645907}}}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"427":{"tf":2.23606797749979}}}}}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"385":{"tf":2.23606797749979}},"e":{"(":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"385":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"c":{"df":16,"docs":{"0":{"tf":1.0},"19":{"tf":1.0},"198":{"tf":2.0},"199":{"tf":1.4142135623730951},"200":{"tf":1.0},"202":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"229":{"tf":1.0},"232":{"tf":1.0},"257":{"tf":2.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"257":{"tf":1.0},"260":{"tf":1.0},"368":{"tf":1.0},"398":{"tf":1.0}}}}}}}},"df":1,"docs":{"59":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":3,"docs":{"377":{"tf":1.4142135623730951},"386":{"tf":1.0},"91":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"g":{":":{":":{"b":{"a":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":5.291502622129181}}},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"252":{"tf":1.4142135623730951},"401":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"283":{"tf":1.0},"289":{"tf":1.4142135623730951},"70":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":4.0}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":4,"docs":{"266":{"tf":1.0},"267":{"tf":1.4142135623730951},"40":{"tf":2.6457513110645907},"42":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"\"":{"df":0,"docs":{},"、":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"337":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":6,"docs":{"338":{"tf":2.23606797749979},"339":{"tf":1.4142135623730951},"340":{"tf":1.4142135623730951},"341":{"tf":2.23606797749979},"342":{"tf":2.8284271247461903},"343":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":4.47213595499958}}}}}},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"338":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}}}}},"w":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"334":{"tf":2.0},"335":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"333":{"tf":2.6457513110645907},"334":{"tf":4.123105625617661},"335":{"tf":5.196152422706632}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.4142135623730951},"235":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"227":{"tf":1.0},"405":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"283":{"tf":1.7320508075688772},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"c":{"df":1,"docs":{"283":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}},"df":18,"docs":{"185":{"tf":1.0},"188":{"tf":1.0},"270":{"tf":1.0},"273":{"tf":1.7320508075688772},"275":{"tf":1.0},"283":{"tf":7.745966692414834},"286":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"299":{"tf":1.7320508075688772},"306":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":3.0},"408":{"tf":2.8284271247461903},"70":{"tf":2.23606797749979},"71":{"tf":1.0},"72":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.0}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.0}}}}}}}}},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"335":{"tf":1.0}}},"t":{"df":6,"docs":{"228":{"tf":2.0},"229":{"tf":2.0},"231":{"tf":1.7320508075688772},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"e":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.7320508075688772},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"302":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":2.449489742783178}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"1":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"(":{"1":{"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"(":{"2":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"225":{"tf":1.0},"336":{"tf":1.0},"383":{"tf":1.0}}}},"df":6,"docs":{"225":{"tf":1.0},"320":{"tf":1.4142135623730951},"334":{"tf":1.0},"383":{"tf":1.0},"386":{"tf":1.7320508075688772},"412":{"tf":1.0}}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":2,"docs":{"273":{"tf":1.0},"275":{"tf":1.0}}}},"0":{"0":{"0":{"4":{"df":1,"docs":{"106":{"tf":1.0}}},"5":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"6":{"df":4,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"75":{"tf":1.4142135623730951},"87":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"7":{"7":{"df":8,"docs":{"102":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"277":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.4142135623730951},"335":{"tf":1.0},"377":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"8":{"df":9,"docs":{"173":{"tf":1.0},"240":{"tf":1.0},"320":{"tf":1.0},"351":{"tf":1.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"51":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"6":{"9":{"df":1,"docs":{"172":{"tf":1.0}}},"df":0,"docs":{}},"7":{"3":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"8":{"2":{"df":6,"docs":{"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0},"70":{"tf":1.0}}},"4":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}},"9":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{"3":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":2,"docs":{"368":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"2":{"df":3,"docs":{"134":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"407":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":2,"docs":{"189":{"tf":1.0},"75":{"tf":1.0}}},"df":0,"docs":{}},"9":{"6":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"7":{"df":2,"docs":{"185":{"tf":1.0},"188":{"tf":1.0}}},"9":{"df":2,"docs":{"405":{"tf":1.4142135623730951},"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"0":{"3":{"df":2,"docs":{"115":{"tf":1.0},"116":{"tf":1.0}}},"df":0,"docs":{}},"1":{"4":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"4":{"6":{"df":1,"docs":{"386":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"9":{"9":{"8":{"1":{"1":{"df":0,"docs":{},"f":{"a":{"2":{"4":{"6":{"d":{"b":{"d":{"df":1,"docs":{"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"5":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"0":{"5":{"7":{"0":{"6":{"c":{"5":{"c":{"4":{"3":{"0":{"9":{"d":{"df":0,"docs":{},"f":{"9":{"df":0,"docs":{},"e":{"d":{"4":{"7":{"d":{"5":{"df":0,"docs":{},"e":{"9":{"1":{"d":{"8":{"df":0,"docs":{},"e":{"d":{"3":{"4":{"2":{"b":{"7":{"d":{"df":1,"docs":{"315":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},">":{"df":0,"docs":{},":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"300":{"tf":1.0}}}}}},"a":{"b":{"a":{"a":{"a":{"a":{"9":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"6":{"9":{"3":{"7":{"d":{"b":{"3":{"6":{"9":{"0":{"d":{"c":{"5":{"6":{"df":0,"docs":{},"f":{"7":{"3":{"9":{"1":{"1":{"6":{"b":{"df":0,"docs":{},"e":{"5":{"5":{"df":0,"docs":{},"e":{"c":{"b":{"2":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"358":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":7,"docs":{"115":{"tf":3.0},"116":{"tf":3.1622776601683795},"119":{"tf":2.6457513110645907},"120":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"123":{"tf":1.0},"127":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":1.7320508075688772}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"26":{"tf":1.4142135623730951},"260":{"tf":1.0},"32":{"tf":1.0},"414":{"tf":2.0},"430":{"tf":2.449489742783178}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"430":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":24,"docs":{"10":{"tf":1.0},"153":{"tf":1.0},"157":{"tf":2.23606797749979},"158":{"tf":2.0},"159":{"tf":1.0},"160":{"tf":1.7320508075688772},"162":{"tf":2.6457513110645907},"169":{"tf":1.0},"174":{"tf":2.0},"203":{"tf":2.6457513110645907},"213":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.4142135623730951},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951},"26":{"tf":1.0},"300":{"tf":1.4142135623730951},"325":{"tf":1.0},"381":{"tf":2.8284271247461903},"397":{"tf":1.0},"414":{"tf":1.0},"427":{"tf":1.0},"430":{"tf":1.7320508075688772}},"f":{"b":{"a":{"df":0,"docs":{},"f":{"d":{"b":{"a":{"3":{"6":{"1":{"8":{"4":{"8":{"7":{"df":0,"docs":{},"f":{"b":{"c":{"9":{"3":{"0":{"5":{"3":{"1":{"8":{"df":0,"docs":{},"f":{"c":{"a":{"b":{"9":{"7":{"7":{"5":{"1":{"3":{"2":{"a":{"c":{"1":{"5":{"df":1,"docs":{"411":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"df":0,"docs":{},"k":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"v":{"df":0,"docs":{},"w":{"df":0,"docs":{},"x":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":1,"docs":{"189":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"(":{"_":{"df":1,"docs":{"323":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"<":{"a":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"134":{"tf":2.23606797749979},"330":{"tf":1.0},"351":{"tf":1.4142135623730951},"54":{"tf":1.7320508075688772},"62":{"tf":1.4142135623730951}}}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"191":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"108":{"tf":1.0}}}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":5,"docs":{"289":{"tf":1.0},"82":{"tf":3.605551275463989},"83":{"tf":3.4641016151377544},"84":{"tf":3.1622776601683795},"87":{"tf":2.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"218":{"tf":1.0}}}},"t":{"df":2,"docs":{"120":{"tf":1.0},"57":{"tf":1.0}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"260":{"tf":1.0},"382":{"tf":1.0}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"331":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}}},"d":{"df":4,"docs":{"283":{"tf":2.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.0},"62":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"398":{"tf":1.0}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"152":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":14,"docs":{"185":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951},"224":{"tf":2.449489742783178},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"234":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"59":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"102":{"tf":1.0},"106":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"42":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"150":{"tf":2.23606797749979}}},"y":{"df":0,"docs":{},",":{"df":0,"docs":{},"它":{"df":0,"docs":{},"获":{"df":0,"docs":{},"取":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"想":{"df":0,"docs":{},"要":{"df":0,"docs":{},"检":{"df":0,"docs":{},"查":{"df":0,"docs":{},"的":{"df":0,"docs":{},"键":{"df":0,"docs":{},"作":{"df":0,"docs":{},"为":{"df":0,"docs":{},"参":{"df":0,"docs":{},"数":{"df":0,"docs":{},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"150":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}}}},"u":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"100":{"tf":1.0}}},"df":0,"docs":{}}},"df":34,"docs":{"100":{"tf":1.0},"101":{"tf":3.0},"102":{"tf":2.0},"103":{"tf":1.4142135623730951},"104":{"tf":2.23606797749979},"106":{"tf":1.7320508075688772},"108":{"tf":2.0},"119":{"tf":1.4142135623730951},"136":{"tf":1.0},"157":{"tf":1.0},"174":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"239":{"tf":1.0},"258":{"tf":2.0},"273":{"tf":2.0},"274":{"tf":1.4142135623730951},"275":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"342":{"tf":1.0},"353":{"tf":1.0},"359":{"tf":1.7320508075688772},"36":{"tf":1.0},"362":{"tf":1.0},"382":{"tf":1.0},"385":{"tf":1.0},"407":{"tf":1.4142135623730951},"412":{"tf":1.0},"417":{"tf":1.4142135623730951},"81":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"350":{"tf":1.0},"77":{"tf":1.7320508075688772},"99":{"tf":1.0}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":3,"docs":{"216":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":2.23606797749979}},"s":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"\"":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"232":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"232":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"232":{"tf":1.0}},"e":{"=":{"1":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"232":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":16,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"230":{"tf":1.0},"290":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"235":{"tf":1.7320508075688772},"236":{"tf":1.0}}}}}}}}},"q":{"df":1,"docs":{"420":{"tf":2.23606797749979}},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"202":{"tf":3.4641016151377544},"203":{"tf":1.0},"258":{"tf":1.4142135623730951},"42":{"tf":1.0}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"421":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"(":{"\"":{"d":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"_":{"df":4,"docs":{"167":{"tf":1.0},"382":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}},"df":9,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":2.0},"162":{"tf":1.0},"174":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"157":{"tf":1.0},"158":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"203":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":24,"docs":{"157":{"tf":2.23606797749979},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":2.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"165":{"tf":1.4142135623730951},"174":{"tf":1.0},"203":{"tf":2.0},"224":{"tf":3.0},"225":{"tf":2.23606797749979},"226":{"tf":1.0},"232":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.7320508075688772},"300":{"tf":1.0},"323":{"tf":1.0},"349":{"tf":1.0},"36":{"tf":2.0},"382":{"tf":1.0},"405":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":2.0}}},"df":0,"docs":{}}}}},">":{"df":0,"docs":{},"。":{"df":0,"docs":{},"为":{"df":0,"docs":{},"此":{"df":0,"docs":{},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"381":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"[":{"df":0,"docs":{},"e":{"0":{"0":{"0":{"4":{"df":1,"docs":{"106":{"tf":1.0}}},"5":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"6":{"df":4,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"7":{"7":{"df":9,"docs":{"102":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"277":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.7320508075688772},"335":{"tf":1.0},"377":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"8":{"df":9,"docs":{"173":{"tf":1.0},"240":{"tf":1.0},"320":{"tf":1.0},"351":{"tf":1.0},"407":{"tf":1.0},"42":{"tf":1.0},"51":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"6":{"9":{"df":1,"docs":{"172":{"tf":1.0}}},"df":0,"docs":{}},"7":{"3":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"8":{"2":{"df":6,"docs":{"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0},"70":{"tf":1.0}}},"4":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}},"9":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{"2":{"df":1,"docs":{"266":{"tf":1.0}}},"3":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":2,"docs":{"368":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"2":{"df":3,"docs":{"134":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"407":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":2,"docs":{"189":{"tf":1.0},"75":{"tf":1.0}}},"df":0,"docs":{}},"9":{"6":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"7":{"df":2,"docs":{"185":{"tf":1.0},"188":{"tf":1.0}}},"9":{"df":3,"docs":{"324":{"tf":1.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"0":{"3":{"df":2,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"1":{"4":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"4":{"6":{"df":1,"docs":{"386":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":78,"docs":{"102":{"tf":2.0},"106":{"tf":1.7320508075688772},"115":{"tf":1.7320508075688772},"116":{"tf":1.7320508075688772},"120":{"tf":1.7320508075688772},"134":{"tf":1.7320508075688772},"142":{"tf":1.7320508075688772},"153":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.7320508075688772},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"162":{"tf":3.4641016151377544},"172":{"tf":1.7320508075688772},"173":{"tf":1.7320508075688772},"185":{"tf":1.7320508075688772},"186":{"tf":1.7320508075688772},"188":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"219":{"tf":1.0},"225":{"tf":2.6457513110645907},"226":{"tf":1.4142135623730951},"228":{"tf":2.449489742783178},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"233":{"tf":1.0},"235":{"tf":1.0},"240":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"249":{"tf":2.23606797749979},"250":{"tf":1.4142135623730951},"257":{"tf":1.0},"260":{"tf":1.4142135623730951},"273":{"tf":2.0},"277":{"tf":2.0},"279":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"285":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":1.0},"299":{"tf":2.449489742783178},"301":{"tf":2.0},"306":{"tf":2.449489742783178},"320":{"tf":1.4142135623730951},"335":{"tf":1.7320508075688772},"351":{"tf":1.7320508075688772},"353":{"tf":1.7320508075688772},"360":{"tf":1.7320508075688772},"368":{"tf":2.449489742783178},"376":{"tf":1.7320508075688772},"377":{"tf":1.7320508075688772},"381":{"tf":2.0},"386":{"tf":1.7320508075688772},"405":{"tf":3.4641016151377544},"407":{"tf":2.6457513110645907},"414":{"tf":1.0},"42":{"tf":1.7320508075688772},"428":{"tf":1.0},"429":{"tf":1.0},"49":{"tf":2.0},"51":{"tf":1.7320508075688772},"52":{"tf":1.7320508075688772},"57":{"tf":1.7320508075688772},"58":{"tf":1.7320508075688772},"61":{"tf":2.449489742783178},"70":{"tf":2.0},"73":{"tf":1.7320508075688772},"74":{"tf":2.449489742783178},"75":{"tf":2.0},"78":{"tf":2.0},"87":{"tf":1.7320508075688772}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"158":{"tf":1.0}}},"df":0,"docs":{}}}}}},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.0}}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"36":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"ñ":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"431":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"431":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"397":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"c":{"df":1,"docs":{"417":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"320":{"tf":1.0},"361":{"tf":1.4142135623730951}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":12,"docs":{"214":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":2.8284271247461903},"257":{"tf":2.23606797749979},"277":{"tf":2.0},"279":{"tf":2.0},"283":{"tf":3.1622776601683795},"368":{"tf":2.8284271247461903},"376":{"tf":3.605551275463989},"377":{"tf":2.0},"386":{"tf":1.7320508075688772},"88":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}}}},"_":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":2.23606797749979}},"e":{"(":{"5":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"”":{"df":0,"docs":{},"、":{"df":0,"docs":{},"“":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"260":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"305":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"267":{"tf":1.0},"405":{"tf":5.291502622129181},"407":{"tf":2.0},"408":{"tf":2.23606797749979}},"e":{"<":{"df":0,"docs":{},"f":{">":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"405":{"tf":3.1622776601683795},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"347":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"360":{"tf":1.4142135623730951},"407":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"162":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":2,"docs":{"301":{"tf":1.0},"70":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"r":{"d":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"165":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"d":{"df":6,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":27,"docs":{"142":{"tf":1.0},"159":{"tf":3.0},"164":{"tf":1.0},"165":{"tf":1.7320508075688772},"173":{"tf":1.0},"186":{"tf":1.0},"200":{"tf":1.0},"202":{"tf":2.8284271247461903},"219":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"228":{"tf":1.0},"240":{"tf":1.7320508075688772},"320":{"tf":1.7320508075688772},"351":{"tf":1.4142135623730951},"36":{"tf":2.0},"391":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.4142135623730951},"414":{"tf":1.4142135623730951},"42":{"tf":2.23606797749979},"45":{"tf":1.0},"51":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.7320508075688772},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"208":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}}},"n":{"df":4,"docs":{"273":{"tf":1.0},"320":{"tf":1.0},"407":{"tf":1.0},"75":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"106":{"tf":1.0},"283":{"tf":1.4142135623730951},"52":{"tf":1.0},"53":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"198":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"123":{"tf":1.0}}}}},"r":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"417":{"tf":1.0}}}}}}},".":{".":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"416":{"tf":1.0}}}}}}},"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"416":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"416":{"tf":1.0}}}}}}},"0":{"df":1,"docs":{"417":{"tf":1.0}}},"1":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"416":{"tf":1.0}}},"df":0,"docs":{}}},"[":{".":{".":{"b":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{".":{".":{"b":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"417":{"tf":1.0}}}}}}},"df":2,"docs":{"416":{"tf":7.874007874011811},"417":{"tf":2.6457513110645907}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":7,"docs":{"306":{"tf":1.0},"347":{"tf":1.7320508075688772},"351":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"57":{"tf":2.0},"58":{"tf":1.0}}}}}}},"t":{"df":1,"docs":{"324":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"308":{"tf":1.0},"324":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"211":{"tf":1.4142135623730951},"266":{"tf":1.0},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"368":{"tf":3.3166247903554},"412":{"tf":1.0}}}}}}},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}}}},"f":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"385":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"0":{"2":{"5":{"3":{"1":{"5":{"9":{"1":{"9":{"7":{"df":0,"docs":{},"f":{"7":{"8":{"4":{"1":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"d":{"2":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"8":{"d":{"1":{"a":{"4":{"9":{"c":{"3":{"b":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"1":{"0":{"a":{"3":{"0":{"8":{"6":{"c":{"5":{"8":{"df":0,"docs":{},"e":{"5":{"2":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"a":{"9":{"0":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"a":{"7":{"8":{"df":0,"docs":{},"f":{"6":{"4":{"b":{"6":{"6":{"8":{"df":0,"docs":{},"f":{"6":{"3":{"df":0,"docs":{},"f":{"5":{"8":{"1":{"2":{"0":{"3":{"c":{"6":{"b":{"a":{"c":{"5":{"0":{"9":{"9":{"0":{"3":{"df":0,"docs":{},"f":{"7":{"c":{"0":{"0":{"df":0,"docs":{},"e":{"df":1,"docs":{"171":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":2,"docs":{"175":{"tf":1.4142135623730951},"53":{"tf":2.23606797749979}}},"df":0,"docs":{}},"6":{"4":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"94":{"tf":1.0}}},"x":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":10,"docs":{"175":{"tf":1.0},"176":{"tf":1.4142135623730951},"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951},"331":{"tf":2.23606797749979},"417":{"tf":1.0},"53":{"tf":2.0},"54":{"tf":1.4142135623730951},"70":{"tf":1.0},"94":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":19,"docs":{"120":{"tf":1.0},"198":{"tf":3.7416573867739413},"199":{"tf":3.0},"200":{"tf":3.0},"201":{"tf":3.0},"202":{"tf":3.1622776601683795},"206":{"tf":3.1622776601683795},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":2.23606797749979},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"257":{"tf":1.0},"260":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":2.0},"323":{"tf":1.0},"405":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":8,"docs":{"198":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":2.0},"202":{"tf":2.0},"206":{"tf":2.0},"228":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"318":{"tf":1.0}}}},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"412":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":14,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.4142135623730951},"182":{"tf":2.0},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"232":{"tf":1.0},"247":{"tf":1.0},"348":{"tf":1.0},"361":{"tf":1.0},"412":{"tf":1.4142135623730951},"53":{"tf":1.0},"61":{"tf":2.449489742783178},"70":{"tf":1.0},"95":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},",":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"431":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":7,"docs":{"228":{"tf":2.449489742783178},"229":{"tf":2.8284271247461903},"231":{"tf":1.7320508075688772},"232":{"tf":3.4641016151377544},"249":{"tf":3.0},"250":{"tf":2.23606797749979},"321":{"tf":2.0}}}},"v":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"397":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"348":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"348":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"y":{"df":1,"docs":{"152":{"tf":1.0}}}},"c":{"df":1,"docs":{"158":{"tf":1.0}}},"df":14,"docs":{"10":{"tf":1.0},"242":{"tf":3.0},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"325":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0},"381":{"tf":1.4142135623730951},"385":{"tf":2.0},"405":{"tf":6.324555320336759},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"431":{"tf":1.7320508075688772},"53":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"296":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"435":{"tf":1.0},"437":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"237":{"tf":1.0},"364":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"435":{"tf":1.0}}}}}}}}}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"59":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"359":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"t":{"c":{"df":0,"docs":{},"h":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"398":{"tf":2.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"149":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"149":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":5,"docs":{"260":{"tf":1.0},"391":{"tf":1.0},"405":{"tf":1.7320508075688772},"82":{"tf":1.0},"83":{"tf":1.0}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}}}},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}}},":":{"/":{"/":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"a":{"d":{"d":{"/":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.7320508075688772}}}}},"df":1,"docs":{"266":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"_":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"/":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"_":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"289":{"tf":1.0}}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"61":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"1":{"0":{"df":6,"docs":{"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"240":{"tf":1.0},"241":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":5,"docs":{"273":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"277":{"tf":1.0},"279":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"102":{"tf":1.0},"106":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"157":{"tf":1.0},"162":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":5,"docs":{"386":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":10,"docs":{"202":{"tf":1.7320508075688772},"261":{"tf":1.7320508075688772},"32":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"261":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"i":{"df":1,"docs":{"335":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"398":{"tf":1.0},"405":{"tf":2.449489742783178},"407":{"tf":1.4142135623730951},"408":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"246":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"289":{"tf":1.0},"290":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":1.7320508075688772}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"301":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":8,"docs":{"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"232":{"tf":1.4142135623730951}}}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"427":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":5,"docs":{"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0}}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"350":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"360":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":4,"docs":{"199":{"tf":1.7320508075688772},"242":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"239":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"376":{"tf":2.0},"377":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"49":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"c":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"158":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"?":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"161":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":6,"docs":{"157":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":2.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"157":{"tf":2.449489742783178},"158":{"tf":2.0},"160":{"tf":2.23606797749979},"161":{"tf":1.4142135623730951},"162":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":15,"docs":{"217":{"tf":1.7320508075688772},"218":{"tf":2.0},"219":{"tf":1.0},"221":{"tf":2.449489742783178},"222":{"tf":2.449489742783178},"223":{"tf":2.23606797749979},"224":{"tf":3.0},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.4641016151377544},"249":{"tf":3.3166247903554},"250":{"tf":2.449489742783178}}}}},"df":0,"docs":{}}},"df":16,"docs":{"157":{"tf":2.23606797749979},"158":{"tf":2.23606797749979},"159":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"218":{"tf":1.7320508075688772},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.449489742783178},"225":{"tf":2.23606797749979},"226":{"tf":1.0},"24":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"260":{"tf":1.4142135623730951}},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"402":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"214":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"250":{"tf":1.0}}}}}}},"df":18,"docs":{"198":{"tf":2.449489742783178},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.23606797749979},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"247":{"tf":2.23606797749979},"250":{"tf":1.4142135623730951},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"324":{"tf":1.4142135623730951}},"e":{"d":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"247":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"323":{"tf":1.4142135623730951},"395":{"tf":1.0},"413":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":63,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":2.8284271247461903},"199":{"tf":2.8284271247461903},"200":{"tf":2.23606797749979},"201":{"tf":2.0},"202":{"tf":2.6457513110645907},"206":{"tf":2.0},"207":{"tf":2.6457513110645907},"208":{"tf":2.449489742783178},"211":{"tf":3.3166247903554},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.6457513110645907},"232":{"tf":2.23606797749979},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.4142135623730951},"257":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":3.1622776601683795},"267":{"tf":1.0},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.4142135623730951},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":3.1622776601683795},"323":{"tf":1.7320508075688772},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"/":{"9":{"9":{".":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"6":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"190":{"tf":1.4142135623730951},"192":{"tf":2.0}}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"(":{"&":{"df":2,"docs":{"77":{"tf":1.0},"78":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"[":{"0":{".":{".":{"6":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"[":{"0":{".":{".":{"6":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"191":{"tf":1.4142135623730951},"77":{"tf":2.449489742783178},"78":{"tf":2.23606797749979}},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"<":{"'":{"a":{">":{"(":{"df":1,"docs":{"191":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"191":{"tf":1.7320508075688772},"77":{"tf":1.7320508075688772},"78":{"tf":3.3166247903554}}},"df":0,"docs":{}}}}},"df":13,"docs":{"102":{"tf":1.0},"134":{"tf":2.449489742783178},"152":{"tf":1.0},"187":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":5.0990195135927845},"360":{"tf":2.23606797749979},"368":{"tf":1.0},"49":{"tf":1.0},"54":{"tf":1.4142135623730951},"66":{"tf":1.0},"74":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":4,"docs":{"105":{"tf":2.0},"106":{"tf":1.0},"358":{"tf":1.0},"58":{"tf":2.6457513110645907}}}},"x":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"427":{"tf":2.449489742783178},"430":{"tf":1.0},"434":{"tf":1.4142135623730951}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":3.605551275463989}}},"o":{"a":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"6":{"4":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"173":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"53":{"tf":1.0}}}},"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"53":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"376":{"tf":3.872983346207417}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"377":{"tf":1.0},"378":{"tf":1.0}}}}}}},"df":0,"docs":{}},":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":2,"docs":{"377":{"tf":2.449489742783178},"378":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"377":{"tf":1.0},"378":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":3,"docs":{"121":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"381":{"tf":1.7320508075688772},"426":{"tf":1.4142135623730951}}}},"n":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"385":{"tf":1.0},"386":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":245,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":3.605551275463989},"102":{"tf":1.4142135623730951},"103":{"tf":2.0},"104":{"tf":1.7320508075688772},"105":{"tf":2.8284271247461903},"106":{"tf":1.4142135623730951},"107":{"tf":3.3166247903554},"108":{"tf":2.0},"113":{"tf":1.0},"114":{"tf":2.23606797749979},"115":{"tf":1.4142135623730951},"116":{"tf":2.6457513110645907},"118":{"tf":1.7320508075688772},"119":{"tf":1.7320508075688772},"120":{"tf":2.0},"121":{"tf":2.23606797749979},"122":{"tf":1.4142135623730951},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":2.0},"141":{"tf":2.6457513110645907},"142":{"tf":1.7320508075688772},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":2.449489742783178},"165":{"tf":1.0},"167":{"tf":1.7320508075688772},"170":{"tf":2.0},"172":{"tf":2.6457513110645907},"173":{"tf":1.7320508075688772},"175":{"tf":2.8284271247461903},"176":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":2.0},"180":{"tf":3.1622776601683795},"181":{"tf":3.3166247903554},"182":{"tf":2.8284271247461903},"183":{"tf":1.4142135623730951},"185":{"tf":1.7320508075688772},"186":{"tf":2.23606797749979},"188":{"tf":2.449489742783178},"189":{"tf":2.0},"190":{"tf":1.0},"191":{"tf":3.0},"192":{"tf":2.449489742783178},"194":{"tf":1.4142135623730951},"198":{"tf":3.0},"199":{"tf":3.0},"200":{"tf":2.0},"201":{"tf":2.449489742783178},"202":{"tf":2.8284271247461903},"203":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"207":{"tf":2.0},"208":{"tf":1.7320508075688772},"210":{"tf":2.23606797749979},"211":{"tf":1.7320508075688772},"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"22":{"tf":1.0},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.449489742783178},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":3.0},"229":{"tf":4.0},"23":{"tf":1.0},"231":{"tf":2.23606797749979},"232":{"tf":4.898979485566356},"235":{"tf":1.0},"239":{"tf":1.7320508075688772},"240":{"tf":2.23606797749979},"241":{"tf":1.7320508075688772},"242":{"tf":3.4641016151377544},"243":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"245":{"tf":1.0},"246":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"249":{"tf":4.47213595499958},"250":{"tf":3.1622776601683795},"257":{"tf":1.4142135623730951},"258":{"tf":2.0},"26":{"tf":1.0},"266":{"tf":2.0},"272":{"tf":1.0},"273":{"tf":1.4142135623730951},"274":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":2.0},"280":{"tf":1.7320508075688772},"281":{"tf":3.1622776601683795},"283":{"tf":2.449489742783178},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"289":{"tf":4.242640687119285},"290":{"tf":2.449489742783178},"291":{"tf":1.0},"293":{"tf":2.0},"294":{"tf":2.23606797749979},"298":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":4.123105625617661},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"32":{"tf":1.0},"320":{"tf":2.8284271247461903},"321":{"tf":1.0},"322":{"tf":3.0},"323":{"tf":2.23606797749979},"324":{"tf":1.7320508075688772},"325":{"tf":1.4142135623730951},"33":{"tf":2.23606797749979},"331":{"tf":2.0},"334":{"tf":2.449489742783178},"335":{"tf":2.8284271247461903},"337":{"tf":1.0},"338":{"tf":1.0},"339":{"tf":1.4142135623730951},"34":{"tf":1.0},"340":{"tf":1.7320508075688772},"341":{"tf":2.6457513110645907},"342":{"tf":6.4031242374328485},"343":{"tf":3.1622776601683795},"348":{"tf":1.0},"349":{"tf":1.0},"35":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.4142135623730951},"352":{"tf":2.0},"353":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.4142135623730951},"359":{"tf":2.449489742783178},"36":{"tf":1.0},"360":{"tf":3.1622776601683795},"361":{"tf":1.7320508075688772},"362":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":3.605551275463989},"369":{"tf":1.7320508075688772},"37":{"tf":1.0},"370":{"tf":1.0},"374":{"tf":2.0},"375":{"tf":2.0},"376":{"tf":5.5677643628300215},"377":{"tf":2.8284271247461903},"378":{"tf":1.4142135623730951},"381":{"tf":5.0},"382":{"tf":2.23606797749979},"383":{"tf":2.0},"385":{"tf":3.872983346207417},"386":{"tf":2.449489742783178},"390":{"tf":1.0},"391":{"tf":2.8284271247461903},"392":{"tf":1.7320508075688772},"393":{"tf":1.0},"397":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":2.0},"402":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"405":{"tf":6.244997998398398},"407":{"tf":4.0},"408":{"tf":4.0},"41":{"tf":1.0},"412":{"tf":1.0},"414":{"tf":2.0},"416":{"tf":1.0},"417":{"tf":1.0},"42":{"tf":1.4142135623730951},"427":{"tf":2.0},"428":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772},"53":{"tf":2.0},"54":{"tf":2.449489742783178},"55":{"tf":2.0},"56":{"tf":2.0},"57":{"tf":1.7320508075688772},"58":{"tf":2.6457513110645907},"59":{"tf":1.4142135623730951},"61":{"tf":2.6457513110645907},"62":{"tf":2.6457513110645907},"68":{"tf":1.4142135623730951},"69":{"tf":1.0},"70":{"tf":2.449489742783178},"71":{"tf":1.7320508075688772},"72":{"tf":2.23606797749979},"73":{"tf":3.0},"74":{"tf":2.449489742783178},"75":{"tf":3.1622776601683795},"77":{"tf":3.4641016151377544},"78":{"tf":3.3166247903554},"82":{"tf":2.23606797749979},"83":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":2.0},"89":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"91":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":2.0},"94":{"tf":1.0},"95":{"tf":2.0},"96":{"tf":1.4142135623730951},"97":{"tf":1.7320508075688772}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"242":{"tf":2.6457513110645907}}}}},"o":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"242":{"tf":2.8284271247461903},"405":{"tf":4.47213595499958},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"当":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"尝":{"df":0,"docs":{},"试":{"df":0,"docs":{},"编":{"df":0,"docs":{},"译":{"df":0,"docs":{},"此":{"df":0,"docs":{},"代":{"df":0,"docs":{},"码":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"会":{"df":0,"docs":{},"出":{"df":0,"docs":{},"现":{"df":0,"docs":{},"错":{"df":0,"docs":{},"误":{"df":0,"docs":{},"提":{"df":0,"docs":{},"示":{"df":0,"docs":{},":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"242":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"242":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"102":{"tf":1.0},"324":{"tf":1.0}}}}}},"o":{"(":{"3":{"df":1,"docs":{"360":{"tf":1.0}}},"_":{"df":1,"docs":{"360":{"tf":1.0}}},"df":0,"docs":{},"x":{"df":1,"docs":{"352":{"tf":1.0}}}},"<":{"'":{"a":{">":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"191":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"414":{"tf":1.0}},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"352":{"tf":1.0},"370":{"tf":1.4142135623730951},"391":{"tf":1.0},"45":{"tf":1.0}}},"r":{".":{"<":{"/":{"df":0,"docs":{},"p":{"df":1,"docs":{"401":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"368":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"180":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"201":{"tf":1.0}}}}}}},"{":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"400":{"tf":1.0},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"141":{"tf":2.0},"179":{"tf":1.4142135623730951},"180":{"tf":1.7320508075688772},"181":{"tf":1.4142135623730951},"182":{"tf":2.0},"201":{"tf":1.4142135623730951},"377":{"tf":2.0},"391":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"91":{"tf":1.0}},"t":{"df":1,"docs":{"377":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"400":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.7320508075688772}}}},"df":21,"docs":{"142":{"tf":1.0},"173":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"320":{"tf":1.7320508075688772},"324":{"tf":1.0},"351":{"tf":1.4142135623730951},"362":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":1.4142135623730951},"414":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"428":{"tf":1.0},"51":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"r":{"df":5,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.7320508075688772},"203":{"tf":1.0},"330":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"392":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"ç":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"431":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"137":{"tf":1.0}}},"df":2,"docs":{"283":{"tf":1.0},"70":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"g":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":2.0}}},"m":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"162":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":1,"docs":{"162":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{">":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":8,"docs":{"114":{"tf":2.23606797749979},"115":{"tf":1.7320508075688772},"116":{"tf":3.1622776601683795},"120":{"tf":1.7320508075688772},"121":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":3.0},"128":{"tf":1.4142135623730951}},"e":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"/":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"114":{"tf":1.0}}}}}},"s":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"161":{"tf":1.7320508075688772},"218":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"\"":{"4":{"0":{"4":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"401":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"161":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":11,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"218":{"tf":1.0},"221":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":4,"docs":{"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.4142135623730951}},"i":{"df":2,"docs":{"364":{"tf":1.0},"376":{"tf":1.4142135623730951}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"'":{"df":4,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"368":{"tf":1.0},"75":{"tf":1.4142135623730951}}},"1":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}},"2":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":34,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":2.449489742783178},"146":{"tf":1.0},"162":{"tf":1.7320508075688772},"189":{"tf":1.0},"206":{"tf":2.0},"237":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"273":{"tf":1.0},"283":{"tf":1.0},"299":{"tf":1.7320508075688772},"31":{"tf":1.0},"316":{"tf":1.4142135623730951},"320":{"tf":1.0},"34":{"tf":1.0},"368":{"tf":2.23606797749979},"376":{"tf":1.4142135623730951},"377":{"tf":1.0},"382":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"386":{"tf":1.4142135623730951},"393":{"tf":1.0},"405":{"tf":3.3166247903554},"407":{"tf":2.0},"408":{"tf":1.7320508075688772},"412":{"tf":1.0},"55":{"tf":2.23606797749979},"56":{"tf":1.7320508075688772},"57":{"tf":2.23606797749979},"58":{"tf":2.0},"75":{"tf":1.0},"96":{"tf":1.0}}}}}}},"df":1,"docs":{"260":{"tf":1.0}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"376":{"tf":2.23606797749979}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"252":{"tf":1.0},"428":{"tf":1.0}}}}}}},"t":{"1":{"df":1,"docs":{"318":{"tf":1.7320508075688772}}},"2":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"318":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"318":{"tf":1.7320508075688772}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":2,"docs":{"316":{"tf":1.0},"322":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"315":{"tf":4.123105625617661},"316":{"tf":5.5677643628300215},"317":{"tf":1.0},"318":{"tf":3.1622776601683795},"319":{"tf":4.795831523312719},"320":{"tf":7.211102550927978},"321":{"tf":4.242640687119285},"322":{"tf":4.242640687119285},"323":{"tf":4.58257569495584},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"412":{"tf":1.4142135623730951}},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"316":{"tf":1.0},"320":{"tf":2.8284271247461903}}}}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"323":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"323":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"任":{"df":0,"docs":{},"务":{"df":0,"docs":{},"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"线":{"df":0,"docs":{},"程":{"df":0,"docs":{},"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"327":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}},"df":0,"docs":{}}}}}}},"。":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"319":{"tf":1.0}}}}}}}}}}}},"{":{"3":{"2":{"df":1,"docs":{"428":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}}}},"g":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"213":{"tf":1.0}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"260":{"tf":1.0},"31":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"、":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"330":{"tf":1.4142135623730951}}}},"r":{"b":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"64":{"tf":1.0},"70":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":1,"docs":{"113":{"tf":2.23606797749979}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"437":{"tf":1.0}}}}},"c":{"c":{"df":2,"docs":{"15":{"tf":1.0},"24":{"tf":1.0}}},"df":1,"docs":{"70":{"tf":1.7320508075688772}}},"df":10,"docs":{"10":{"tf":1.0},"213":{"tf":1.0},"325":{"tf":1.0},"359":{"tf":2.0},"432":{"tf":1.0},"433":{"tf":1.0},"434":{"tf":1.0},"435":{"tf":1.0},"436":{"tf":1.0},"437":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"/":{"2":{"0":{"1":{"0":{"0":{"1":{"0":{"1":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"41":{"tf":1.4142135623730951},"421":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"391":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":10,"docs":{"120":{"tf":1.0},"169":{"tf":1.0},"225":{"tf":1.0},"246":{"tf":1.0},"252":{"tf":1.0},"266":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"405":{"tf":1.0},"57":{"tf":1.0}},"i":{"c":{"<":{"df":0,"docs":{},"t":{">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"383":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"169":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"12":{"tf":1.0},"239":{"tf":2.0}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"167":{"tf":1.0},"93":{"tf":1.4142135623730951}}}}}}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":2.0},"29":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"u":{"b":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"259":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.0}}}}}}}},"v":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"239":{"tf":1.0}}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"df":1,"docs":{"239":{"tf":2.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"52":{"tf":1.0}},"n":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"72":{"tf":2.0}}}}}}}}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":3,"docs":{"112":{"tf":1.0},"126":{"tf":2.6457513110645907},"199":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":7,"docs":{"211":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"323":{"tf":1.0},"370":{"tf":1.4142135623730951},"383":{"tf":1.0},"59":{"tf":1.0}},"e":{"df":3,"docs":{"137":{"tf":1.0},"286":{"tf":1.4142135623730951},"352":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":1,"docs":{"313":{"tf":1.4142135623730951}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"406":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"_":{"1":{"0":{"0":{"df":1,"docs":{"202":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":1,"docs":{"202":{"tf":2.23606797749979}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"258":{"tf":1.4142135623730951},"348":{"tf":1.0},"359":{"tf":1.7320508075688772}}},"t":{"df":1,"docs":{"201":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"201":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"201":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"201":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":4,"docs":{"157":{"tf":1.0},"158":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"162":{"tf":2.0}},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"157":{"tf":2.23606797749979},"158":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"157":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"p":{"df":4,"docs":{"10":{"tf":1.0},"213":{"tf":1.7320508075688772},"214":{"tf":1.0},"267":{"tf":1.0}}}},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"110":{"tf":1.0},"113":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"305":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},".":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"(":{")":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":4,"docs":{"167":{"tf":1.0},"382":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}},"e":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":4,"docs":{"125":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"2":{"0":{"0":{"df":1,"docs":{"202":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"167":{"tf":2.0},"202":{"tf":1.4142135623730951},"224":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":19,"docs":{"124":{"tf":2.23606797749979},"125":{"tf":3.3166247903554},"167":{"tf":5.0},"202":{"tf":5.477225575051661},"260":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":4.47213595499958},"34":{"tf":3.0},"35":{"tf":3.0},"36":{"tf":2.6457513110645907},"37":{"tf":2.23606797749979},"38":{"tf":1.7320508075688772},"382":{"tf":3.605551275463989},"41":{"tf":3.3166247903554},"42":{"tf":5.291502622129181},"43":{"tf":3.7416573867739413},"44":{"tf":2.449489742783178},"45":{"tf":4.69041575982343},"52":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":12,"docs":{"202":{"tf":2.0},"260":{"tf":1.7320508075688772},"261":{"tf":2.0},"263":{"tf":1.4142135623730951},"32":{"tf":2.0},"36":{"tf":1.7320508075688772},"38":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0}},"e":{"@":{"1":{".":{"0":{".":{"1":{"df":1,"docs":{"263":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"。":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"167":{"tf":1.0}}}}}}}}},"i":{":":{":":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}},"df":0,"docs":{}},"{":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":1,"docs":{"430":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"116":{"tf":1.0}}}}}}},"df":3,"docs":{"333":{"tf":2.449489742783178},"334":{"tf":1.0},"335":{"tf":2.449489742783178}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"398":{"tf":1.0}}}}},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"432":{"tf":1.4142135623730951}}}}}}}},"h":{"1":{">":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"!":{"<":{"/":{"df":0,"docs":{},"h":{"1":{"df":1,"docs":{"400":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"!":{"<":{"/":{"df":0,"docs":{},"h":{"1":{"df":1,"docs":{"401":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"288":{"tf":1.0}}}},"n":{"d":{"df":2,"docs":{"252":{"tf":1.0},"375":{"tf":1.0}},"l":{"df":11,"docs":{"106":{"tf":1.0},"157":{"tf":1.7320508075688772},"162":{"tf":2.0},"219":{"tf":1.0},"225":{"tf":1.0},"298":{"tf":2.0},"299":{"tf":2.8284271247461903},"306":{"tf":4.0},"318":{"tf":1.4142135623730951},"353":{"tf":1.0},"36":{"tf":1.0}},"e":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"318":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"298":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"306":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"298":{"tf":1.4142135623730951}}}}}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"398":{"tf":1.7320508075688772},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"153":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":11,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"146":{"tf":2.449489742783178},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.4142135623730951},"152":{"tf":1.0},"17":{"tf":1.0},"423":{"tf":3.1622776601683795}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"151":{"tf":2.0}}}},"m":{"a":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"121":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"380":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"k":{"df":4,"docs":{"146":{"tf":1.4142135623730951},"169":{"tf":1.0},"420":{"tf":1.4142135623730951},"423":{"tf":1.0}}}},"df":4,"docs":{"121":{"tf":1.4142135623730951},"124":{"tf":1.0},"147":{"tf":1.7320508075688772},"151":{"tf":1.0}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"三":{"df":0,"docs":{},"个":{"df":0,"docs":{},"常":{"df":0,"docs":{},"用":{"df":0,"docs":{},"集":{"df":0,"docs":{},"合":{"df":0,"docs":{},"中":{"df":0,"docs":{},",":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"147":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"331":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"378":{"tf":1.0},"405":{"tf":1.0}}}}}},"y":{"df":1,"docs":{"152":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"414":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"216":{"tf":1.7320508075688772},"414":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"”":{"df":0,"docs":{},"(":{"df":0,"docs":{},"“":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"152":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":4,"docs":{"142":{"tf":1.7320508075688772},"325":{"tf":1.0},"359":{"tf":1.0},"56":{"tf":1.4142135623730951}},"e":{"a":{"d":{"df":2,"docs":{"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"398":{"tf":1.0},"399":{"tf":1.7320508075688772},"401":{"tf":1.0},"402":{"tf":1.0}},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"、":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},"df":0,"docs":{}}},";":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"p":{"df":1,"docs":{"66":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"88":{"tf":2.0}}},"df":11,"docs":{"100":{"tf":1.0},"199":{"tf":3.7416573867739413},"242":{"tf":3.872983346207417},"335":{"tf":2.23606797749979},"88":{"tf":2.0},"90":{"tf":2.23606797749979},"91":{"tf":3.0},"93":{"tf":2.0},"95":{"tf":2.6457513110645907},"96":{"tf":1.4142135623730951},"97":{"tf":2.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"\"":{"[":{"0":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"\"":{")":{";":{"df":0,"docs":{},"。":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"&":{"(":{"*":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":6,"docs":{"400":{"tf":1.7320508075688772},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951}}}}}},":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"405":{"tf":1.0},"408":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"[":{"0":{".":{".":{"1":{"df":1,"docs":{"143":{"tf":1.0}}},"4":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"26":{"tf":2.6457513110645907},"27":{"tf":2.23606797749979},"29":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":3.872983346207417}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}}}}},"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"391":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"391":{"tf":4.47213595499958}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":2,"docs":{"21":{"tf":2.0},"369":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":43,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"140":{"tf":3.3166247903554},"141":{"tf":1.0},"142":{"tf":4.795831523312719},"143":{"tf":1.0},"150":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"191":{"tf":1.0},"20":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"22":{"tf":2.449489742783178},"23":{"tf":1.7320508075688772},"24":{"tf":1.7320508075688772},"25":{"tf":2.23606797749979},"26":{"tf":2.0},"266":{"tf":1.0},"27":{"tf":2.449489742783178},"28":{"tf":1.0},"281":{"tf":2.6457513110645907},"29":{"tf":1.0},"30":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"32":{"tf":1.7320508075688772},"320":{"tf":1.0},"362":{"tf":1.0},"369":{"tf":1.0},"382":{"tf":1.0},"383":{"tf":1.0},"391":{"tf":2.0},"395":{"tf":1.4142135623730951},"397":{"tf":1.7320508075688772},"398":{"tf":1.0},"405":{"tf":3.872983346207417},"407":{"tf":2.0},"408":{"tf":1.0},"55":{"tf":1.4142135623730951},"59":{"tf":1.0},"68":{"tf":1.4142135623730951},"69":{"tf":1.0},"70":{"tf":1.0},"78":{"tf":2.23606797749979}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"m":{"df":0,"docs":{},"、":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"p":{"df":44,"docs":{"102":{"tf":1.4142135623730951},"106":{"tf":1.0},"120":{"tf":1.0},"142":{"tf":1.7320508075688772},"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"186":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"240":{"tf":1.0},"242":{"tf":1.0},"246":{"tf":1.0},"26":{"tf":1.0},"267":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"283":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"324":{"tf":1.7320508075688772},"335":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"368":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.4142135623730951},"386":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.4142135623730951},"427":{"tf":1.0},"428":{"tf":1.4142135623730951},"49":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.7320508075688772},"87":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"e":{"df":29,"docs":{"106":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"134":{"tf":1.7320508075688772},"137":{"tf":1.0},"185":{"tf":1.7320508075688772},"188":{"tf":1.7320508075688772},"189":{"tf":1.0},"203":{"tf":1.4142135623730951},"208":{"tf":1.4142135623730951},"211":{"tf":1.0},"240":{"tf":1.0},"285":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"322":{"tf":1.0},"323":{"tf":1.0},"352":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"370":{"tf":1.4142135623730951},"376":{"tf":1.0},"405":{"tf":1.0},"42":{"tf":1.0},"59":{"tf":1.0},"70":{"tf":1.4142135623730951},"74":{"tf":2.449489742783178},"78":{"tf":1.7320508075688772}}}},"x":{"df":1,"docs":{"53":{"tf":1.0}}}},"i":{"df":7,"docs":{"298":{"tf":5.916079783099616},"300":{"tf":1.7320508075688772},"302":{"tf":1.0},"303":{"tf":1.0},"318":{"tf":5.916079783099616},"319":{"tf":1.0},"320":{"tf":1.0}},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"167":{"tf":1.0}}}}},"o":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},",":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"102":{"tf":1.0}}}}}}}}},"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"142":{"tf":1.0}}},"d":{"df":2,"docs":{"95":{"tf":2.449489742783178},"97":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"267":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"101":{"tf":2.0},"165":{"tf":1.0},"21":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"260":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"59":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"196":{"tf":1.0}}}}}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"179":{"tf":1.0},"180":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":9,"docs":{"114":{"tf":2.0},"115":{"tf":3.0},"116":{"tf":3.4641016151377544},"120":{"tf":2.449489742783178},"121":{"tf":1.0},"123":{"tf":1.4142135623730951},"127":{"tf":3.0},"128":{"tf":1.0},"398":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.7320508075688772}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"120":{"tf":2.0},"121":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"。":{"df":0,"docs":{},"最":{"df":0,"docs":{},"后":{"df":0,"docs":{},",":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"116":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"w":{"'":{"df":1,"docs":{"383":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"v":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"359":{"tf":1.0}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"5":{"df":1,"docs":{"400":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"316":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":6,"docs":{"0":{"tf":1.0},"257":{"tf":2.6457513110645907},"316":{"tf":2.0},"400":{"tf":3.4641016151377544},"401":{"tf":3.4641016151377544},"404":{"tf":1.0}}}},"t":{"df":0,"docs":{},"p":{"/":{"1":{".":{"1":{"df":8,"docs":{"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":1.0},"401":{"tf":2.23606797749979},"402":{"tf":1.7320508075688772},"404":{"tf":2.23606797749979},"405":{"tf":3.872983346207417},"408":{"tf":3.1622776601683795}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"/":{"/":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{":":{"7":{"8":{"7":{"8":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"404":{"tf":1.0}}}}}}}},"df":1,"docs":{"404":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"398":{"tf":1.7320508075688772},"399":{"tf":1.0},"400":{"tf":1.4142135623730951}}}}}}}}}},"df":9,"docs":{"15":{"tf":1.0},"166":{"tf":1.0},"316":{"tf":1.0},"395":{"tf":2.0},"396":{"tf":2.23606797749979},"397":{"tf":1.0},"398":{"tf":2.449489742783178},"399":{"tf":2.449489742783178},"401":{"tf":1.0}},"s":{":":{"/":{"/":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"m":{"df":1,"docs":{"259":{"tf":1.0}}}},"df":1,"docs":{"260":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"c":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":6,"docs":{"0":{"tf":1.0},"142":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.4142135623730951},"32":{"tf":1.0},"353":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"c":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":3,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"428":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"359":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":4.358898943540674}}}},"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"196":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"396":{"tf":1.0}}}}}}}}}}},"i":{"'":{"df":0,"docs":{},"m":{"df":3,"docs":{"218":{"tf":1.7320508075688772},"225":{"tf":1.0},"229":{"tf":1.0}}}},".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{")":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"/":{"df":0,"docs":{},"o":{"df":33,"docs":{"213":{"tf":1.7320508075688772},"214":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"236":{"tf":1.4142135623730951},"237":{"tf":1.0},"248":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"251":{"tf":1.0},"253":{"tf":1.0},"381":{"tf":1.4142135623730951},"400":{"tf":1.0},"405":{"tf":2.23606797749979}}}},"1":{"2":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":2,"docs":{"252":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"3":{"2":{"df":57,"docs":{"101":{"tf":3.605551275463989},"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"147":{"tf":1.0},"149":{"tf":1.0},"167":{"tf":3.0},"169":{"tf":1.0},"170":{"tf":2.449489742783178},"172":{"tf":2.0},"175":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"181":{"tf":1.7320508075688772},"187":{"tf":2.8284271247461903},"191":{"tf":2.0},"192":{"tf":1.7320508075688772},"202":{"tf":2.8284271247461903},"206":{"tf":1.4142135623730951},"245":{"tf":1.0},"252":{"tf":1.4142135623730951},"257":{"tf":2.0},"266":{"tf":2.0},"272":{"tf":1.7320508075688772},"273":{"tf":1.4142135623730951},"274":{"tf":2.6457513110645907},"275":{"tf":1.4142135623730951},"277":{"tf":1.7320508075688772},"280":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":2.449489742783178},"306":{"tf":2.449489742783178},"331":{"tf":1.4142135623730951},"352":{"tf":2.0},"359":{"tf":4.358898943540674},"360":{"tf":2.23606797749979},"362":{"tf":1.0},"367":{"tf":2.6457513110645907},"368":{"tf":4.123105625617661},"370":{"tf":1.0},"375":{"tf":1.4142135623730951},"377":{"tf":2.0},"380":{"tf":1.0},"381":{"tf":3.3166247903554},"385":{"tf":3.1622776601683795},"386":{"tf":2.23606797749979},"417":{"tf":1.0},"42":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":2.0},"56":{"tf":2.0},"58":{"tf":3.1622776601683795},"61":{"tf":1.0},"70":{"tf":1.7320508075688772},"71":{"tf":1.4142135623730951},"79":{"tf":1.0},"85":{"tf":2.23606797749979}},"。":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"53":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"172":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},";":{"3":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"6":{"4":{"df":3,"docs":{"252":{"tf":1.4142135623730951},"42":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":2,"docs":{"102":{"tf":3.3166247903554},"53":{"tf":1.4142135623730951}}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"=":{"1":{"df":1,"docs":{"393":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"362":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":7,"docs":{"20":{"tf":2.0},"362":{"tf":4.0},"380":{"tf":1.4142135623730951},"405":{"tf":5.830951894845301},"407":{"tf":4.242640687119285},"408":{"tf":3.7416573867739413},"429":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":4,"docs":{"320":{"tf":1.0},"391":{"tf":2.449489742783178},"416":{"tf":2.6457513110645907},"417":{"tf":2.8284271247461903}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":3,"docs":{"260":{"tf":1.0},"398":{"tf":1.0},"414":{"tf":1.7320508075688772}}}}},"(":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}}},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"348":{"tf":1.4142135623730951}}}}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":18,"docs":{"198":{"tf":2.23606797749979},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.0},"208":{"tf":3.605551275463989},"211":{"tf":2.8284271247461903},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"246":{"tf":1.0},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"36":{"tf":1.0}},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"232":{"tf":3.605551275463989},"249":{"tf":3.0},"250":{"tf":1.7320508075688772}},"e":{"=":{"1":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"232":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"。":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"也":{"df":0,"docs":{},"没":{"df":0,"docs":{},"有":{"df":0,"docs":{},"过":{"df":0,"docs":{},"滤":{"df":0,"docs":{},"需":{"df":0,"docs":{},"要":{"df":0,"docs":{},"运":{"df":0,"docs":{},"行":{"df":0,"docs":{},"的":{"df":0,"docs":{},"测":{"df":0,"docs":{},"试":{"df":0,"docs":{},",":{"df":0,"docs":{},"所":{"df":0,"docs":{},"以":{"df":0,"docs":{},"摘":{"df":0,"docs":{},"要":{"df":0,"docs":{},"中":{"df":0,"docs":{},"会":{"df":0,"docs":{},"显":{"df":0,"docs":{},"示":{"0":{"df":1,"docs":{"198":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"333":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"134":{"tf":1.7320508075688772},"49":{"tf":2.0},"74":{"tf":1.7320508075688772},"78":{"tf":1.7320508075688772}}}}},"p":{"df":0,"docs":{},"l":{"<":{"'":{"a":{"df":3,"docs":{"192":{"tf":2.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":8,"docs":{"175":{"tf":1.4142135623730951},"183":{"tf":1.7320508075688772},"242":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"281":{"tf":2.0},"334":{"tf":1.0},"382":{"tf":1.0}}},"x":{"1":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"(":{"&":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"391":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":61,"docs":{"101":{"tf":1.4142135623730951},"119":{"tf":1.0},"161":{"tf":1.0},"167":{"tf":1.0},"175":{"tf":3.1622776601683795},"179":{"tf":2.0},"180":{"tf":2.449489742783178},"181":{"tf":3.3166247903554},"182":{"tf":3.1622776601683795},"183":{"tf":2.0},"191":{"tf":1.0},"192":{"tf":1.7320508075688772},"199":{"tf":2.0},"202":{"tf":2.0},"223":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"239":{"tf":1.0},"249":{"tf":2.6457513110645907},"250":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"330":{"tf":1.0},"331":{"tf":1.0},"334":{"tf":1.4142135623730951},"335":{"tf":2.23606797749979},"338":{"tf":1.4142135623730951},"339":{"tf":1.7320508075688772},"340":{"tf":1.4142135623730951},"341":{"tf":1.7320508075688772},"342":{"tf":3.4641016151377544},"343":{"tf":2.23606797749979},"370":{"tf":1.4142135623730951},"374":{"tf":1.7320508075688772},"375":{"tf":1.7320508075688772},"376":{"tf":4.0},"377":{"tf":2.0},"378":{"tf":1.0},"386":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"405":{"tf":4.242640687119285},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"412":{"tf":1.4142135623730951},"417":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":3.0},"94":{"tf":1.0},"95":{"tf":1.7320508075688772},"96":{"tf":2.0},"97":{"tf":3.0},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":25,"docs":{"102":{"tf":2.8284271247461903},"142":{"tf":2.0},"162":{"tf":1.4142135623730951},"183":{"tf":2.0},"242":{"tf":1.0},"252":{"tf":1.0},"277":{"tf":1.4142135623730951},"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.7320508075688772},"309":{"tf":1.0},"320":{"tf":2.449489742783178},"323":{"tf":1.0},"324":{"tf":1.0},"335":{"tf":1.4142135623730951},"370":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":2.0},"391":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"70":{"tf":1.4142135623730951},"91":{"tf":2.0},"93":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"58":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"<":{"'":{"a":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":2.6457513110645907},"192":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"120":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"324":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"219":{"tf":1.0},"248":{"tf":1.0}}}}}}},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}},"c":{"df":1,"docs":{"369":{"tf":1.0}},"h":{"df":1,"docs":{"359":{"tf":1.0}}},"l":{"df":0,"docs":{},"u":{"d":{"df":3,"docs":{"127":{"tf":1.0},"159":{"tf":1.4142135623730951},"208":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"397":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"_":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"142":{"tf":1.0}}}}}}}}},"df":16,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"156":{"tf":2.0},"219":{"tf":1.0},"224":{"tf":2.0},"260":{"tf":1.0},"261":{"tf":1.0},"263":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"350":{"tf":2.6457513110645907},"392":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"417":{"tf":1.0},"54":{"tf":3.0},"62":{"tf":2.6457513110645907}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"417":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"273":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}}},"o":{"df":4,"docs":{"260":{"tf":1.0},"277":{"tf":1.0},"301":{"tf":1.0},"70":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.4142135623730951},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.4142135623730951},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"368":{"tf":1.7320508075688772},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"428":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"332":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"83":{"tf":1.0}},"i":{"df":4,"docs":{"140":{"tf":1.7320508075688772},"293":{"tf":2.0},"316":{"tf":1.0},"70":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"429":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},"df":1,"docs":{"51":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":17,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"191":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"382":{"tf":1.0},"391":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.7320508075688772},"43":{"tf":2.23606797749979},"44":{"tf":1.0},"45":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"398":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":5,"docs":{"147":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"143":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"15":{"tf":1.4142135623730951},"267":{"tf":3.3166247903554},"268":{"tf":1.0},"436":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"322":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":8,"docs":{"233":{"tf":1.0},"300":{"tf":1.0},"377":{"tf":1.4142135623730951},"386":{"tf":1.0},"405":{"tf":1.0},"427":{"tf":1.0},"75":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":9,"docs":{"142":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"240":{"tf":1.0},"277":{"tf":2.23606797749979},"351":{"tf":2.449489742783178},"42":{"tf":1.4142135623730951},"53":{"tf":1.0},"61":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"173":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":1.7320508075688772}}}},"df":1,"docs":{"211":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"209":{"tf":1.0}}}},"l":{"df":1,"docs":{"398":{"tf":1.0}}},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}},"r":{"df":0,"docs":{},"f":{"a":{"c":{"df":2,"docs":{"177":{"tf":1.0},"368":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},",":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"270":{"tf":1.0},"287":{"tf":1.4142135623730951}}}}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"_":{"a":{"d":{"d":{"df":1,"docs":{"210":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"2":{"df":1,"docs":{"210":{"tf":1.0}}},"a":{"df":1,"docs":{"210":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"210":{"tf":1.0}}}}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"如":{"df":0,"docs":{},"果":{"df":0,"docs":{},"你":{"df":0,"docs":{},"并":{"df":0,"docs":{},"不":{"df":0,"docs":{},"认":{"df":0,"docs":{},"为":{"df":0,"docs":{},"应":{"df":0,"docs":{},"该":{"df":0,"docs":{},"测":{"df":0,"docs":{},"试":{"df":0,"docs":{},"私":{"df":0,"docs":{},"有":{"df":0,"docs":{},"函":{"df":0,"docs":{},"数":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"210":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"210":{"tf":1.0},"211":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"247":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":5,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"87":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"239":{"tf":2.8284271247461903}}}}}}}}}},"o":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"160":{"tf":2.449489742783178},"161":{"tf":2.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"121":{"tf":1.0},"36":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}},"df":0,"docs":{}}},"{":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":9,"docs":{"125":{"tf":1.0},"158":{"tf":1.0},"213":{"tf":1.0},"248":{"tf":1.0},"313":{"tf":1.4142135623730951},"316":{"tf":1.0},"33":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"434":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"122":{"tf":1.7320508075688772}}}}}}}}},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"v":{"4":{"(":{"1":{"2":{"7":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"6":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{":":{":":{"1":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"101":{"tf":3.0},"165":{"tf":1.4142135623730951}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"v":{"4":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":2.449489742783178}}},"6":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"100":{"tf":2.0},"101":{"tf":3.605551275463989}}},"df":0,"docs":{}}}},":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"100":{"tf":2.8284271247461903},"101":{"tf":2.449489742783178},"165":{"tf":2.449489742783178},"397":{"tf":1.0}},"v":{"4":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"100":{"tf":1.0}},"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"100":{"tf":1.0}}}}}}}},"6":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"100":{"tf":1.4142135623730951}},"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"100":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"345":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.7320508075688772}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"152":{"tf":1.0}}}}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"232":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"348":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"353":{"tf":1.0},"405":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}},"t":{"'":{"df":1,"docs":{"306":{"tf":1.0}}},"_":{"a":{"d":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":2,"docs":{"200":{"tf":1.4142135623730951},"211":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"7":{"5":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":5,"docs":{"198":{"tf":1.7320508075688772},"203":{"tf":1.4142135623730951},"208":{"tf":1.4142135623730951},"210":{"tf":1.0},"266":{"tf":1.4142135623730951}}}}}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"431":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"181":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"1":{"df":1,"docs":{"181":{"tf":1.7320508075688772}}},"2":{"df":1,"docs":{"181":{"tf":2.23606797749979}}},"df":16,"docs":{"115":{"tf":1.0},"170":{"tf":1.7320508075688772},"172":{"tf":3.1622776601683795},"181":{"tf":2.23606797749979},"191":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"244":{"tf":2.23606797749979},"249":{"tf":1.0},"293":{"tf":2.6457513110645907},"324":{"tf":1.0},"374":{"tf":2.8284271247461903},"392":{"tf":1.0},"405":{"tf":1.4142135623730951},"70":{"tf":1.0},"77":{"tf":3.3166247903554},"78":{"tf":2.8284271247461903}}},"r":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"77":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"=":{"df":0,"docs":{},"t":{"df":1,"docs":{"417":{"tf":1.0}}}},"df":2,"docs":{"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"374":{"tf":1.0}}}}},"t":{"df":1,"docs":{"374":{"tf":1.0}}}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"245":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":16,"docs":{"182":{"tf":1.0},"215":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":3.0},"245":{"tf":1.7320508075688772},"246":{"tf":2.6457513110645907},"249":{"tf":2.0},"306":{"tf":1.0},"315":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":3.0},"374":{"tf":3.3166247903554},"405":{"tf":1.0},"408":{"tf":1.0},"77":{"tf":1.7320508075688772}}}}},"’":{"df":0,"docs":{},"m":{"df":2,"docs":{"218":{"tf":1.0},"59":{"tf":1.4142135623730951}}}},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"427":{"tf":1.0}}}}}}}},"j":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"325":{"tf":1.0}},"o":{"b":{"df":3,"docs":{"405":{"tf":5.830951894845301},"407":{"tf":4.47213595499958},"408":{"tf":3.872983346207417}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"3":{"df":2,"docs":{"319":{"tf":1.0},"320":{"tf":1.7320508075688772}}},"4":{"df":1,"docs":{"320":{"tf":1.0}}},"_":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"320":{"tf":2.449489742783178},"323":{"tf":1.0}},"l":{"<":{"df":0,"docs":{},"i":{">":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"320":{"tf":2.0}},"l":{"<":{"df":0,"docs":{},"f":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}},"i":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":9,"docs":{"241":{"tf":1.0},"298":{"tf":2.449489742783178},"306":{"tf":1.0},"318":{"tf":2.6457513110645907},"320":{"tf":3.1622776601683795},"321":{"tf":1.4142135623730951},"406":{"tf":1.0},"407":{"tf":3.1622776601683795},"408":{"tf":2.23606797749979}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":5,"docs":{"298":{"tf":1.4142135623730951},"306":{"tf":1.0},"318":{"tf":1.0},"405":{"tf":2.449489742783178},"407":{"tf":1.7320508075688772}},"e":{":":{":":{"<":{"df":0,"docs":{},"t":{">":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"407":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"_":{"df":1,"docs":{"407":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"298":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"、":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"、":{"df":0,"docs":{},"r":{"a":{"c":{"df":1,"docs":{"323":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"s":{"df":1,"docs":{"24":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"k":{"'":{".":{".":{"=":{"'":{"df":0,"docs":{},"z":{"df":1,"docs":{"358":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"328":{"tf":1.0}}}},"b":{"df":1,"docs":{"267":{"tf":1.0}}},"df":2,"docs":{"146":{"tf":1.0},"242":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"389":{"tf":1.0},"398":{"tf":1.0}}}},"y":{"df":6,"docs":{"148":{"tf":1.0},"26":{"tf":1.0},"32":{"tf":1.0},"420":{"tf":1.4142135623730951},"423":{"tf":1.0},"82":{"tf":1.4142135623730951}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}}},"df":5,"docs":{"299":{"tf":1.4142135623730951},"316":{"tf":1.0},"334":{"tf":1.0},"414":{"tf":1.4142135623730951},"48":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"411":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":3.4641016151377544}}}}}}},"n":{"d":{"df":6,"docs":{"101":{"tf":2.449489742783178},"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"258":{"tf":2.6457513110645907},"43":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"a":{"b":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":6,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"401":{"tf":1.0}},"n":{"df":2,"docs":{"386":{"tf":1.0},"52":{"tf":1.0}}}}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"335":{"tf":2.0},"62":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"c":{"df":0,"docs":{},"h":{"0":{"8":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"1":{"9":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"260":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"26":{"tf":1.0},"260":{"tf":1.0},"32":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"273":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}},"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"h":{"1":{"3":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"=":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":6,"docs":{"102":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.0},"316":{"tf":1.4142135623730951},"398":{"tf":1.0},"429":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}}},"_":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":2.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"199":{"tf":2.23606797749979}}},"s":{"df":0,"docs":{},"t":{"(":{"&":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.4142135623730951},"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}}}}},"<":{"df":0,"docs":{},"t":{">":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"172":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"(":{"&":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"3":{"2":{"(":{"&":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":1,"docs":{"172":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"170":{"tf":5.291502622129181},"172":{"tf":4.898979485566356},"183":{"tf":1.4142135623730951}}}}}}},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}},"e":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"102":{"tf":1.0},"162":{"tf":1.0},"360":{"tf":1.7320508075688772},"66":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"134":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"322":{"tf":1.0},"74":{"tf":1.4142135623730951},"78":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}},"z":{"df":0,"docs":{},"i":{"df":3,"docs":{"243":{"tf":1.0},"246":{"tf":1.0},"316":{"tf":1.0}}}}},"df":1,"docs":{"141":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"294":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":1,"docs":{"294":{"tf":6.082762530298219}},"和":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"k":{"df":1,"docs":{"292":{"tf":1.0}}},"v":{"df":1,"docs":{"434":{"tf":1.0}}}},"d":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}}}}},"df":10,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":2.6457513110645907},"203":{"tf":1.0},"206":{"tf":2.0},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"323":{"tf":1.0},"368":{"tf":1.4142135623730951}}}},"n":{"df":11,"docs":{"142":{"tf":1.0},"156":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"368":{"tf":2.6457513110645907},"377":{"tf":1.7320508075688772},"416":{"tf":1.0},"417":{"tf":2.0},"54":{"tf":1.0},"72":{"tf":1.7320508075688772},"73":{"tf":2.449489742783178},"78":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":8,"docs":{"400":{"tf":1.4142135623730951},"401":{"tf":2.449489742783178},"402":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0},"72":{"tf":1.7320508075688772},"73":{"tf":1.7320508075688772}},"}":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":6,"docs":{"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"202":{"tf":2.6457513110645907}},"、":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"t":{"'":{"df":1,"docs":{"368":{"tf":1.0}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"358":{"tf":1.7320508075688772}}}}},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"348":{"tf":1.7320508075688772}}}}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"46":{"tf":1.0}},"、":{"df":0,"docs":{},"方":{"df":0,"docs":{},"法":{"df":0,"docs":{},"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"关":{"df":0,"docs":{},"联":{"df":0,"docs":{},"函":{"df":0,"docs":{},"数":{"df":0,"docs":{},"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"405":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"192":{"tf":1.0},"255":{"tf":3.0}}}}}},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":3,"docs":{"211":{"tf":1.4142135623730951},"220":{"tf":2.449489742783178},"266":{"tf":1.0}}}},"c":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}},"df":18,"docs":{"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.4142135623730951},"198":{"tf":1.4142135623730951},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"289":{"tf":1.0},"290":{"tf":1.0},"386":{"tf":1.0},"391":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"111":{"tf":1.0},"198":{"tf":1.0},"227":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0}}},"y":{"'":{"df":1,"docs":{"211":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"260":{"tf":4.242640687119285}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":10,"docs":{"169":{"tf":1.0},"184":{"tf":1.4142135623730951},"186":{"tf":1.7320508075688772},"188":{"tf":1.0},"191":{"tf":2.23606797749979},"193":{"tf":1.0},"228":{"tf":1.7320508075688772},"368":{"tf":1.0},"75":{"tf":1.7320508075688772},"87":{"tf":2.6457513110645907}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"8":{"0":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"289":{"tf":3.3166247903554},"290":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"'":{"a":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"229":{"tf":1.7320508075688772},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":28,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"162":{"tf":1.0},"167":{"tf":1.0},"214":{"tf":1.0},"229":{"tf":3.1622776601683795},"231":{"tf":1.4142135623730951},"232":{"tf":3.872983346207417},"249":{"tf":3.0},"250":{"tf":2.0},"257":{"tf":1.0},"293":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"382":{"tf":1.0},"398":{"tf":2.23606797749979},"399":{"tf":1.4142135623730951},"400":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0},"59":{"tf":1.0}}},"k":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"120":{"tf":1.0},"293":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}},"t":{"df":1,"docs":{"428":{"tf":2.0}}},"u":{"df":0,"docs":{},"x":{"df":7,"docs":{"111":{"tf":1.0},"15":{"tf":2.0},"17":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"260":{"tf":1.0},"27":{"tf":1.0}},"、":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"o":{"df":3,"docs":{"12":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"t":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"7":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":2.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"[":{"0":{"df":2,"docs":{"170":{"tf":1.0},"172":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"385":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"|":{"df":0,"docs":{},"i":{"df":1,"docs":{"385":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"385":{"tf":1.0}}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"385":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":14,"docs":{"170":{"tf":2.0},"172":{"tf":2.0},"241":{"tf":4.69041575982343},"242":{"tf":2.0},"268":{"tf":1.0},"273":{"tf":6.082762530298219},"274":{"tf":2.449489742783178},"275":{"tf":3.4641016151377544},"285":{"tf":3.4641016151377544},"286":{"tf":2.0},"291":{"tf":2.8284271247461903},"293":{"tf":3.7416573867739413},"331":{"tf":3.0},"436":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":9,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":8,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{")":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"2":{"df":1,"docs":{"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"e":{"8":{"6":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"185":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0}}}}}}}}},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"189":{"tf":1.0},"353":{"tf":1.0},"75":{"tf":1.0}}},"t":{"df":6,"docs":{"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.7320508075688772},"352":{"tf":1.4142135623730951},"398":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":4,"docs":{"241":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":2.0},"405":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"d":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"259":{"tf":1.4142135623730951}}}}},"l":{"df":1,"docs":{"141":{"tf":1.0}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"185":{"tf":1.4142135623730951},"188":{"tf":2.449489742783178},"189":{"tf":1.0},"59":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"1":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":2.0},"189":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"186":{"tf":1.4142135623730951},"191":{"tf":1.0}}}},"<":{"'":{"a":{">":{"(":{"df":0,"docs":{},"x":{"df":3,"docs":{"186":{"tf":1.0},"188":{"tf":1.7320508075688772},"189":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"191":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"a":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"194":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"<":{"'":{"a":{"df":1,"docs":{"194":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":6,"docs":{"186":{"tf":2.8284271247461903},"187":{"tf":1.0},"188":{"tf":3.4641016151377544},"189":{"tf":2.23606797749979},"191":{"tf":1.0},"194":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"p":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"101":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"167":{"tf":1.0},"306":{"tf":1.7320508075688772},"382":{"tf":1.7320508075688772},"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":2.0},"412":{"tf":1.0},"416":{"tf":1.0},"43":{"tf":1.7320508075688772},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"62":{"tf":3.7416573867739413}},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"62":{"tf":1.0}}}}}}}}},"w":{"df":1,"docs":{"167":{"tf":1.0}}}},"s":{"df":2,"docs":{"111":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"103":{"tf":1.0},"59":{"tf":1.4142135623730951}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"59":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"k":{"a":{"df":1,"docs":{"389":{"tf":1.0}}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"337":{"tf":1.4142135623730951},"343":{"tf":2.0}}}},"df":0,"docs":{}}}},"m":{".":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"a":{"c":{"df":1,"docs":{"398":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"398":{"tf":1.0}}}}}}}},"o":{"df":5,"docs":{"15":{"tf":2.0},"17":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0}}},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"389":{"tf":1.4142135623730951}}}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"387":{"tf":1.0},"389":{"tf":2.449489742783178},"393":{"tf":1.7320508075688772}}}}}},"df":11,"docs":{"23":{"tf":1.0},"277":{"tf":1.4142135623730951},"301":{"tf":1.7320508075688772},"320":{"tf":1.7320508075688772},"387":{"tf":1.0},"389":{"tf":2.0},"390":{"tf":1.0},"391":{"tf":2.8284271247461903},"392":{"tf":1.0},"413":{"tf":1.0},"70":{"tf":1.7320508075688772}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"387":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"22":{"tf":1.4142135623730951},"24":{"tf":2.0}}}},"p":{"d":{"b":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":10,"docs":{"111":{"tf":1.0},"113":{"tf":1.0},"156":{"tf":1.0},"22":{"tf":2.23606797749979},"220":{"tf":2.23606797749979},"24":{"tf":2.0},"26":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"405":{"tf":1.0}}}},"df":197,"docs":{"100":{"tf":1.0},"101":{"tf":3.0},"102":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"105":{"tf":2.0},"106":{"tf":1.0},"107":{"tf":1.7320508075688772},"108":{"tf":2.0},"111":{"tf":1.4142135623730951},"113":{"tf":1.0},"121":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":2.0},"141":{"tf":2.449489742783178},"142":{"tf":1.7320508075688772},"143":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772},"155":{"tf":1.4142135623730951},"156":{"tf":1.7320508075688772},"157":{"tf":1.7320508075688772},"158":{"tf":1.4142135623730951},"159":{"tf":2.0},"162":{"tf":4.47213595499958},"165":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"175":{"tf":2.0},"176":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"185":{"tf":1.7320508075688772},"186":{"tf":1.4142135623730951},"188":{"tf":2.0},"189":{"tf":1.4142135623730951},"190":{"tf":1.4142135623730951},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"194":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.7320508075688772},"219":{"tf":1.7320508075688772},"22":{"tf":1.7320508075688772},"220":{"tf":2.0},"221":{"tf":2.8284271247461903},"222":{"tf":1.7320508075688772},"223":{"tf":1.7320508075688772},"224":{"tf":3.3166247903554},"225":{"tf":3.1622776601683795},"226":{"tf":1.7320508075688772},"23":{"tf":2.23606797749979},"235":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"24":{"tf":2.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"258":{"tf":1.4142135623730951},"26":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"274":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.4142135623730951},"281":{"tf":1.7320508075688772},"283":{"tf":3.3166247903554},"285":{"tf":1.7320508075688772},"286":{"tf":1.7320508075688772},"289":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":2.0},"294":{"tf":2.449489742783178},"298":{"tf":4.47213595499958},"299":{"tf":1.7320508075688772},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":4.69041575982343},"318":{"tf":2.8284271247461903},"319":{"tf":2.23606797749979},"32":{"tf":1.0},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.4142135623730951},"33":{"tf":2.23606797749979},"335":{"tf":2.0},"337":{"tf":1.0},"34":{"tf":1.0},"343":{"tf":2.8284271247461903},"348":{"tf":1.0},"349":{"tf":1.0},"35":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.4142135623730951},"352":{"tf":1.4142135623730951},"353":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.4142135623730951},"359":{"tf":2.449489742783178},"36":{"tf":1.0},"360":{"tf":3.0},"361":{"tf":1.7320508075688772},"362":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":2.449489742783178},"369":{"tf":1.4142135623730951},"37":{"tf":1.0},"370":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":2.8284271247461903},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.7320508075688772},"383":{"tf":1.0},"385":{"tf":2.449489742783178},"391":{"tf":1.4142135623730951},"397":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.0},"408":{"tf":2.0},"41":{"tf":1.0},"414":{"tf":1.4142135623730951},"42":{"tf":1.7320508075688772},"427":{"tf":1.4142135623730951},"428":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772},"53":{"tf":2.0},"54":{"tf":2.6457513110645907},"55":{"tf":2.23606797749979},"56":{"tf":1.4142135623730951},"57":{"tf":2.0},"58":{"tf":1.7320508075688772},"59":{"tf":1.4142135623730951},"61":{"tf":2.6457513110645907},"62":{"tf":2.6457513110645907},"68":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":2.449489742783178},"71":{"tf":1.4142135623730951},"72":{"tf":1.4142135623730951},"73":{"tf":2.0},"74":{"tf":2.23606797749979},"75":{"tf":1.7320508075688772},"77":{"tf":2.23606797749979},"78":{"tf":2.23606797749979},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"93":{"tf":2.0},"95":{"tf":2.0},"96":{"tf":1.0},"97":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"df":4,"docs":{"198":{"tf":1.4142135623730951},"257":{"tf":1.0},"275":{"tf":1.0},"49":{"tf":1.0}},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"71":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"x":{"df":1,"docs":{"71":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"110":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"368":{"tf":2.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"(":{"df":0,"docs":{},"|":{"(":{"&":{"c":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.0}}}}},"df":0,"docs":{}}}}}}}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"1":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"149":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":17,"docs":{"10":{"tf":1.0},"121":{"tf":1.0},"130":{"tf":2.0},"145":{"tf":1.0},"146":{"tf":2.8284271247461903},"147":{"tf":2.449489742783178},"148":{"tf":2.6457513110645907},"149":{"tf":3.3166247903554},"150":{"tf":4.0},"151":{"tf":1.0},"152":{"tf":2.0},"246":{"tf":2.6457513110645907},"316":{"tf":1.7320508075688772},"324":{"tf":1.0},"385":{"tf":2.0},"398":{"tf":1.0},"401":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"434":{"tf":2.0},"435":{"tf":1.0},"437":{"tf":1.0}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"414":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}},"df":55,"docs":{"102":{"tf":1.0},"103":{"tf":4.123105625617661},"104":{"tf":1.4142135623730951},"105":{"tf":3.4641016151377544},"106":{"tf":2.449489742783178},"107":{"tf":2.449489742783178},"108":{"tf":3.7416573867739413},"109":{"tf":1.0},"125":{"tf":1.4142135623730951},"134":{"tf":1.4142135623730951},"136":{"tf":1.0},"157":{"tf":2.23606797749979},"158":{"tf":3.4641016151377544},"159":{"tf":1.4142135623730951},"160":{"tf":2.449489742783178},"161":{"tf":1.4142135623730951},"162":{"tf":2.0},"167":{"tf":1.4142135623730951},"239":{"tf":1.0},"242":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"316":{"tf":2.449489742783178},"323":{"tf":2.0},"331":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.7320508075688772},"345":{"tf":1.4142135623730951},"347":{"tf":3.3166247903554},"348":{"tf":2.0},"351":{"tf":1.0},"353":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":3.605551275463989},"357":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"359":{"tf":2.8284271247461903},"360":{"tf":2.8284271247461903},"361":{"tf":3.0},"362":{"tf":1.0},"363":{"tf":1.0},"382":{"tf":3.1622776601683795},"389":{"tf":1.7320508075688772},"404":{"tf":1.7320508075688772},"405":{"tf":2.0},"408":{"tf":2.0},"412":{"tf":1.0},"414":{"tf":2.23606797749979},"42":{"tf":3.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":2.8284271247461903},"61":{"tf":1.4142135623730951},"99":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},")":{"df":0,"docs":{},"来":{"df":0,"docs":{},"解":{"df":0,"docs":{},"构":{"df":0,"docs":{},"(":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}}},"!":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"158":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"x":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}}},"df":4,"docs":{"108":{"tf":2.0},"289":{"tf":3.4641016151377544},"290":{"tf":1.7320508075688772},"398":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"108":{"tf":1.4142135623730951}}}}}}},"y":{"b":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":9,"docs":{"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":4,"docs":{"101":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951},"281":{"tf":2.0},"306":{"tf":2.0}},"e":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"119":{"tf":1.0}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":16,"docs":{"198":{"tf":2.449489742783178},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"56":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"183":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"292":{"tf":1.0},"300":{"tf":1.4142135623730951},"304":{"tf":1.0},"70":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":20,"docs":{"101":{"tf":2.6457513110645907},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"202":{"tf":1.0},"274":{"tf":2.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"296":{"tf":1.0},"300":{"tf":1.4142135623730951},"301":{"tf":1.7320508075688772},"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.0},"323":{"tf":1.7320508075688772},"325":{"tf":2.0},"359":{"tf":2.0},"362":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"408":{"tf":2.0}},"e":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"0":{"df":1,"docs":{"359":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"(":{"0":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{},"h":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"b":{"(":{"df":0,"docs":{},"r":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":1,"docs":{"359":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"362":{"tf":2.23606797749979}}}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"274":{"tf":1.0},"359":{"tf":1.4142135623730951}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"274":{"tf":1.0},"359":{"tf":1.7320508075688772}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"}":{"'":{"\"":{")":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":4.795831523312719},"290":{"tf":2.449489742783178}}}}}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"260":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"400":{"tf":1.0},"401":{"tf":1.0},"417":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"388":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"375":{"tf":2.0},"380":{"tf":1.4142135623730951},"381":{"tf":1.0}},"s":{"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":15,"docs":{"191":{"tf":1.0},"240":{"tf":1.0},"283":{"tf":1.0},"289":{"tf":1.0},"324":{"tf":1.4142135623730951},"330":{"tf":1.0},"370":{"tf":1.4142135623730951},"398":{"tf":1.7320508075688772},"405":{"tf":2.0},"407":{"tf":2.0},"417":{"tf":1.0},"42":{"tf":1.4142135623730951},"69":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"df":1,"docs":{"368":{"tf":3.605551275463989}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"375":{"tf":2.8284271247461903},"380":{"tf":1.4142135623730951},"381":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"3":{"2":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"226":{"tf":1.4142135623730951},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":13,"docs":{"214":{"tf":2.23606797749979},"215":{"tf":1.4142135623730951},"216":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.4142135623730951},"227":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":2.23606797749979},"232":{"tf":2.0},"234":{"tf":1.0}}}}}},"m":{"df":1,"docs":{"26":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":9,"docs":{"173":{"tf":1.0},"240":{"tf":1.0},"320":{"tf":1.0},"351":{"tf":1.0},"407":{"tf":1.0},"42":{"tf":1.4142135623730951},"51":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":5,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"260":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}},"t":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"t":{"df":1,"docs":{"260":{"tf":2.23606797749979}}},"x":{"(":{"c":{"1":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}},"df":1,"docs":{"258":{"tf":2.23606797749979}},"u":{"df":0,"docs":{},"p":{"<":{"df":0,"docs":{},"x":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"175":{"tf":1.7320508075688772}}}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"21":{"tf":2.0},"265":{"tf":1.0}}}}},"df":0,"docs":{}},"m":{"df":1,"docs":{"17":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}}}}},"df":2,"docs":{"289":{"tf":3.1622776601683795},"290":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":4.58257569495584},"290":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}},"d":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"128":{"tf":1.4142135623730951},"211":{"tf":1.0}}}},"df":36,"docs":{"113":{"tf":2.8284271247461903},"114":{"tf":2.0},"115":{"tf":2.0},"116":{"tf":2.449489742783178},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"123":{"tf":1.4142135623730951},"127":{"tf":2.6457513110645907},"128":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"244":{"tf":1.0},"245":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"266":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"412":{"tf":1.0}},"e":{"df":1,"docs":{"398":{"tf":1.0}},"l":{"df":3,"docs":{"258":{"tf":2.449489742783178},"405":{"tf":1.7320508075688772},"434":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":2.6457513110645907},"120":{"tf":1.7320508075688772},"127":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"110":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"176":{"tf":1.0},"229":{"tf":1.7320508075688772}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"54":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":56,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.4142135623730951},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"180":{"tf":2.23606797749979},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.0},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"303":{"tf":1.0},"306":{"tf":1.4142135623730951},"319":{"tf":1.0},"32":{"tf":1.0},"320":{"tf":1.7320508075688772},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"368":{"tf":1.7320508075688772},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951},"78":{"tf":1.0},"87":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"239":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"107":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"107":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":17,"docs":{"101":{"tf":1.7320508075688772},"241":{"tf":2.23606797749979},"242":{"tf":1.4142135623730951},"274":{"tf":1.0},"285":{"tf":2.0},"299":{"tf":4.242640687119285},"300":{"tf":1.0},"301":{"tf":2.0},"306":{"tf":2.449489742783178},"316":{"tf":2.0},"319":{"tf":2.6457513110645907},"320":{"tf":3.605551275463989},"359":{"tf":1.4142135623730951},"405":{"tf":2.23606797749979},"407":{"tf":2.0},"412":{"tf":1.0},"70":{"tf":2.23606797749979}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"/":{"5":{".":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":7,"docs":{"300":{"tf":2.449489742783178},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":2,"docs":{"405":{"tf":2.449489742783178},"407":{"tf":2.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"300":{"tf":1.0},"303":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"322":{"tf":2.0}},"g":{"df":4,"docs":{"289":{"tf":2.0},"290":{"tf":1.0},"359":{"tf":2.23606797749979},"362":{"tf":1.4142135623730951}}},"v":{"c":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":1,"docs":{"436":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"}":{"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"405":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"300":{"tf":1.0},"303":{"tf":1.0},"53":{"tf":1.0},"59":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"403":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"287":{"tf":1.0},"49":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"l":{"df":10,"docs":{"134":{"tf":1.4142135623730951},"270":{"tf":1.0},"287":{"tf":1.0},"289":{"tf":2.6457513110645907},"368":{"tf":2.0},"407":{"tf":1.0},"49":{"tf":1.0},"73":{"tf":1.7320508075688772},"74":{"tf":2.449489742783178},"78":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":78,"docs":{"108":{"tf":1.4142135623730951},"119":{"tf":1.0},"121":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.7320508075688772},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":2.0},"160":{"tf":1.4142135623730951},"161":{"tf":1.7320508075688772},"167":{"tf":1.0},"170":{"tf":2.0},"172":{"tf":1.7320508075688772},"187":{"tf":1.0},"191":{"tf":1.0},"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"239":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"242":{"tf":2.23606797749979},"244":{"tf":1.0},"249":{"tf":3.0},"250":{"tf":1.7320508075688772},"252":{"tf":1.0},"282":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":2.0},"306":{"tf":3.1622776601683795},"319":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"33":{"tf":2.0},"337":{"tf":1.0},"34":{"tf":2.23606797749979},"341":{"tf":1.0},"343":{"tf":1.4142135623730951},"35":{"tf":1.7320508075688772},"36":{"tf":1.0},"360":{"tf":1.0},"367":{"tf":2.8284271247461903},"368":{"tf":4.58257569495584},"369":{"tf":1.4142135623730951},"37":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0},"382":{"tf":1.0},"389":{"tf":1.4142135623730951},"405":{"tf":3.0},"407":{"tf":3.0},"408":{"tf":2.449489742783178},"41":{"tf":1.0},"412":{"tf":1.0},"416":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":2.23606797749979},"50":{"tf":1.0},"51":{"tf":2.23606797749979},"54":{"tf":1.0},"62":{"tf":2.23606797749979},"69":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":4.242640687119285},"77":{"tf":1.0},"78":{"tf":1.0},"82":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"0":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}},"5":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{">":{"/":{"a":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"291":{"tf":1.4142135623730951},"306":{"tf":4.358898943540674},"307":{"tf":2.23606797749979},"310":{"tf":1.4142135623730951},"312":{"tf":1.0}}}},"df":5,"docs":{"305":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"d":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}},"df":2,"docs":{"306":{"tf":1.4142135623730951},"307":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"305":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"_":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"257":{"tf":2.449489742783178}},"e":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{":":{":":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"(":{"df":0,"docs":{},"x":{"df":3,"docs":{"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"279":{"tf":1.0},"280":{"tf":1.0}}}},"df":1,"docs":{"279":{"tf":1.0}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"281":{"tf":2.449489742783178}}}}},"t":{">":{"(":{"df":0,"docs":{},"t":{"df":3,"docs":{"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":4,"docs":{"276":{"tf":1.0},"279":{"tf":3.0},"280":{"tf":2.23606797749979},"281":{"tf":2.8284271247461903}}},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"279":{"tf":1.0}}}}}}}}},"df":2,"docs":{"279":{"tf":1.7320508075688772},"280":{"tf":1.0}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"427":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":19,"docs":{"186":{"tf":1.4142135623730951},"201":{"tf":2.0},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"232":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.7320508075688772},"281":{"tf":2.0},"32":{"tf":1.0},"324":{"tf":2.0},"368":{"tf":1.0},"388":{"tf":1.0},"391":{"tf":3.7416573867739413},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":2.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":1,"docs":{"421":{"tf":1.0}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"398":{"tf":1.0}}}}}},"df":7,"docs":{"240":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"361":{"tf":2.6457513110645907},"405":{"tf":1.4142135623730951},"42":{"tf":1.0},"53":{"tf":1.0},"63":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"405":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":4,"docs":{"273":{"tf":1.7320508075688772},"320":{"tf":1.7320508075688772},"52":{"tf":1.0},"59":{"tf":1.0}},"l":{"df":1,"docs":{"216":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"g":{"df":1,"docs":{"416":{"tf":1.0}}},"t":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"364":{"tf":1.0},"382":{"tf":2.23606797749979},"405":{"tf":1.7320508075688772}}}}},"w":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"223":{"tf":1.0},"224":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"405":{"tf":3.3166247903554},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"167":{"tf":1.0},"202":{"tf":2.0}}}}},"df":0,"docs":{}},"x":{"df":4,"docs":{"183":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"360":{"tf":2.449489742783178}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":41,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.0},"140":{"tf":1.0},"147":{"tf":1.0},"167":{"tf":1.7320508075688772},"179":{"tf":1.4142135623730951},"180":{"tf":1.7320508075688772},"181":{"tf":1.4142135623730951},"183":{"tf":1.0},"198":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"214":{"tf":1.7320508075688772},"223":{"tf":2.0},"224":{"tf":2.0},"26":{"tf":2.449489742783178},"260":{"tf":1.0},"265":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.4142135623730951},"289":{"tf":2.0},"290":{"tf":1.0},"306":{"tf":1.4142135623730951},"316":{"tf":1.0},"32":{"tf":1.4142135623730951},"338":{"tf":1.7320508075688772},"339":{"tf":1.0},"34":{"tf":2.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"374":{"tf":1.0},"391":{"tf":1.7320508075688772},"397":{"tf":1.4142135623730951},"405":{"tf":5.656854249492381},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178},"430":{"tf":1.0},"49":{"tf":1.0},"96":{"tf":1.4142135623730951}},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"l":{"df":5,"docs":{"178":{"tf":1.4142135623730951},"179":{"tf":2.449489742783178},"180":{"tf":3.0},"181":{"tf":2.0},"182":{"tf":2.6457513110645907}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":6,"docs":{"364":{"tf":1.4142135623730951},"375":{"tf":1.7320508075688772},"378":{"tf":2.449489742783178},"379":{"tf":1.7320508075688772},"380":{"tf":2.6457513110645907},"381":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"374":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"376":{"tf":1.0}}}}},"df":0,"docs":{}},"df":10,"docs":{"162":{"tf":1.7320508075688772},"244":{"tf":3.3166247903554},"245":{"tf":2.0},"249":{"tf":2.23606797749979},"293":{"tf":2.449489742783178},"316":{"tf":2.0},"324":{"tf":2.6457513110645907},"325":{"tf":1.0},"374":{"tf":2.0},"401":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"162":{"tf":1.0}}},"l":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":1,"docs":{"0":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":11,"docs":{"10":{"tf":1.0},"198":{"tf":1.0},"277":{"tf":1.0},"301":{"tf":1.0},"432":{"tf":2.0},"433":{"tf":1.0},"434":{"tf":3.7416573867739413},"435":{"tf":2.0},"436":{"tf":3.4641016151377544},"437":{"tf":1.7320508075688772},"70":{"tf":1.0}}}}}}},"l":{"df":6,"docs":{"273":{"tf":3.0},"275":{"tf":1.7320508075688772},"285":{"tf":2.0},"286":{"tf":1.4142135623730951},"291":{"tf":2.23606797749979},"293":{"tf":3.3166247903554}}}},"o":{"_":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"75":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"218":{"tf":2.449489742783178},"225":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"235":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"294":{"tf":4.242640687119285}}}},"df":0,"docs":{},"n":{"df":2,"docs":{"106":{"tf":1.0},"368":{"tf":1.0}},"e":{"df":34,"docs":{"102":{"tf":2.6457513110645907},"105":{"tf":4.0},"106":{"tf":2.449489742783178},"108":{"tf":1.0},"134":{"tf":2.0},"148":{"tf":1.0},"162":{"tf":2.449489742783178},"166":{"tf":1.0},"174":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"239":{"tf":1.7320508075688772},"242":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"294":{"tf":2.0},"316":{"tf":1.7320508075688772},"319":{"tf":1.7320508075688772},"331":{"tf":1.4142135623730951},"341":{"tf":1.4142135623730951},"342":{"tf":1.0},"347":{"tf":1.7320508075688772},"348":{"tf":1.0},"353":{"tf":2.449489742783178},"356":{"tf":1.4142135623730951},"360":{"tf":1.0},"361":{"tf":1.0},"374":{"tf":1.0},"382":{"tf":2.0},"398":{"tf":1.0},"407":{"tf":2.0},"421":{"tf":1.0},"53":{"tf":1.0}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"程":{"df":0,"docs":{},"序":{"df":0,"docs":{},"的":{"df":0,"docs":{},"结":{"df":0,"docs":{},"尾":{"df":0,"docs":{},",":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"的":{"df":0,"docs":{},"话":{"df":0,"docs":{},",":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},",":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":46,"docs":{"106":{"tf":1.7320508075688772},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"120":{"tf":1.0},"142":{"tf":1.4142135623730951},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"228":{"tf":1.0},"240":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"266":{"tf":1.0},"273":{"tf":1.7320508075688772},"277":{"tf":1.0},"290":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":3.3166247903554},"324":{"tf":1.4142135623730951},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"368":{"tf":1.0},"377":{"tf":2.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"427":{"tf":1.0},"428":{"tf":1.0},"43":{"tf":1.0},"52":{"tf":1.0},"54":{"tf":1.0},"57":{"tf":1.4142135623730951},"70":{"tf":1.0},"91":{"tf":1.4142135623730951}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0}}},"df":0,"docs":{}}}}},"h":{"df":1,"docs":{"246":{"tf":1.0}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"181":{"tf":2.0}}},"y":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"1":{"df":1,"docs":{"181":{"tf":1.0}}},"df":1,"docs":{"181":{"tf":1.4142135623730951}}}}}}},"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"'":{".":{"'":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"190":{"tf":2.0},"192":{"tf":1.4142135623730951}}},"m":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"df":1,"docs":{"15":{"tf":1.0}}}},"s":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"102":{"tf":1.7320508075688772},"273":{"tf":1.0}}}},"m":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"[":{"0":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":3.0},"172":{"tf":1.4142135623730951}}}}}}},"df":33,"docs":{"124":{"tf":1.4142135623730951},"125":{"tf":2.23606797749979},"167":{"tf":1.4142135623730951},"170":{"tf":3.7416573867739413},"172":{"tf":1.4142135623730951},"173":{"tf":1.0},"257":{"tf":1.4142135623730951},"260":{"tf":1.0},"298":{"tf":6.4031242374328485},"318":{"tf":6.4031242374328485},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"360":{"tf":3.1622776601683795},"361":{"tf":1.7320508075688772},"37":{"tf":1.0},"38":{"tf":1.0},"382":{"tf":1.4142135623730951},"405":{"tf":3.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772},"41":{"tf":2.449489742783178},"42":{"tf":2.8284271247461903},"420":{"tf":1.0},"43":{"tf":2.449489742783178},"44":{"tf":1.7320508075688772},"45":{"tf":2.23606797749979},"52":{"tf":1.7320508075688772},"53":{"tf":1.0},"54":{"tf":1.0},"61":{"tf":5.5677643628300215},"62":{"tf":2.0}}}}},"df":8,"docs":{"167":{"tf":1.0},"240":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"306":{"tf":3.3166247903554},"361":{"tf":2.0},"367":{"tf":2.8284271247461903},"382":{"tf":1.0},"45":{"tf":1.7320508075688772}}}}},"o":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"252":{"tf":1.0}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"94":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"94":{"tf":1.0}}}}}}}}},"df":10,"docs":{"102":{"tf":1.0},"162":{"tf":1.0},"271":{"tf":1.0},"312":{"tf":1.0},"320":{"tf":2.23606797749979},"328":{"tf":1.4142135623730951},"330":{"tf":2.0},"334":{"tf":1.0},"386":{"tf":1.0},"94":{"tf":2.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"333":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"368":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"26":{"tf":1.0}}}}}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"134":{"tf":1.4142135623730951},"242":{"tf":1.0},"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"368":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":2.0},"78":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{"d":{"df":1,"docs":{"361":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}},"k":{"(":{"_":{"df":2,"docs":{"160":{"tf":1.0},"382":{"tf":1.0}}},"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"348":{"tf":1.7320508075688772}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"f":{"c":{"df":1,"docs":{"158":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":1.0}}}}},"j":{"df":0,"docs":{},"o":{"b":{"df":2,"docs":{"405":{"tf":1.0},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"167":{"tf":1.0},"382":{"tf":1.0},"45":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}}}}},"t":{"df":2,"docs":{"157":{"tf":1.0},"174":{"tf":1.0}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"160":{"tf":1.0},"161":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"349":{"tf":1.0}}}}},"df":0,"docs":{}}},"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"399":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"162":{"tf":1.0}}}}},"df":41,"docs":{"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"157":{"tf":2.449489742783178},"159":{"tf":1.0},"160":{"tf":1.7320508075688772},"161":{"tf":2.0},"162":{"tf":2.23606797749979},"165":{"tf":1.0},"174":{"tf":1.0},"198":{"tf":3.0},"199":{"tf":2.8284271247461903},"200":{"tf":2.23606797749979},"202":{"tf":1.7320508075688772},"203":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"207":{"tf":3.1622776601683795},"208":{"tf":2.449489742783178},"211":{"tf":3.605551275463989},"224":{"tf":1.7320508075688772},"225":{"tf":2.449489742783178},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.8284271247461903},"231":{"tf":1.0},"232":{"tf":3.1622776601683795},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"266":{"tf":2.6457513110645907},"348":{"tf":1.0},"349":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0},"42":{"tf":1.4142135623730951},"45":{"tf":2.0}},"。":{"df":0,"docs":{},"如":{"df":0,"docs":{},"果":{"df":0,"docs":{},"超":{"df":0,"docs":{},"时":{"df":0,"docs":{},"先":{"df":0,"docs":{},"发":{"df":0,"docs":{},"生":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}},"n":{"c":{"df":7,"docs":{"180":{"tf":1.0},"182":{"tf":1.0},"306":{"tf":1.0},"360":{"tf":1.4142135623730951},"368":{"tf":1.0},"405":{"tf":1.4142135623730951},"74":{"tf":1.0}}},"df":8,"docs":{"257":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"324":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"355":{"tf":1.0},"357":{"tf":1.0},"54":{"tf":1.0}},"e":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"207":{"tf":2.0}}}},"df":0,"docs":{}}}},"m":{"df":1,"docs":{"322":{"tf":1.0}}},"n":{"df":1,"docs":{"322":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"250":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"y":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"66":{"tf":1.0}}}}},"o":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"337":{"tf":1.0}},"p":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"328":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"10":{"tf":1.0},"328":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"415":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"242":{"tf":1.0},"276":{"tf":1.0},"330":{"tf":1.4142135623730951},"375":{"tf":1.0}}}},"t":{"df":1,"docs":{"255":{"tf":3.0}},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"255":{"tf":1.0},"267":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"407":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"382":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"<":{"&":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"342":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"134":{"tf":1.0},"148":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"348":{"tf":1.0}}}}},"t":{"df":1,"docs":{"134":{"tf":1.0}}},"v":{"df":1,"docs":{"148":{"tf":1.0}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":5,"docs":{"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{">":{"df":0,"docs":{},",":{"df":0,"docs":{},"是":{"df":0,"docs":{},"不":{"df":0,"docs":{},"同":{"df":0,"docs":{},"于":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}},"df":1,"docs":{"162":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}}}},"i":{"3":{"2":{">":{"df":0,"docs":{},"。":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":7,"docs":{"102":{"tf":1.4142135623730951},"105":{"tf":3.1622776601683795},"106":{"tf":2.0},"148":{"tf":1.0},"331":{"tf":1.0},"347":{"tf":1.0},"353":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"102":{"tf":2.23606797749979}}},"df":0,"docs":{}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"407":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"421":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"c":{"<":{"df":0,"docs":{},"t":{">":{">":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"244":{"tf":1.0},"374":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"242":{"tf":1.0},"316":{"tf":3.3166247903554}}}}},"t":{"df":14,"docs":{"102":{"tf":3.872983346207417},"105":{"tf":2.23606797749979},"106":{"tf":1.0},"109":{"tf":1.0},"162":{"tf":1.7320508075688772},"169":{"tf":1.0},"174":{"tf":2.23606797749979},"176":{"tf":2.0},"239":{"tf":2.0},"242":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"374":{"tf":1.0},"382":{"tf":1.7320508075688772},"424":{"tf":1.7320508075688772}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"8":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"242":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"6":{"4":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"5":{".":{"0":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"3":{"2":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"5":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":18,"docs":{"102":{"tf":3.0},"157":{"tf":1.0},"162":{"tf":3.1622776601683795},"166":{"tf":1.0},"168":{"tf":1.0},"176":{"tf":1.0},"24":{"tf":1.0},"242":{"tf":1.7320508075688772},"316":{"tf":1.0},"335":{"tf":2.0},"341":{"tf":1.0},"342":{"tf":1.4142135623730951},"343":{"tf":1.0},"349":{"tf":1.0},"374":{"tf":1.0},"401":{"tf":1.0},"407":{"tf":2.0},"408":{"tf":1.0}}}}}}},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}}}}}}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"348":{"tf":1.0}}}}},"d":{"df":1,"docs":{"421":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"119":{"tf":1.0}}},"2":{"df":1,"docs":{"119":{"tf":1.0}}},"df":3,"docs":{"42":{"tf":2.0},"421":{"tf":1.0},"45":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"。":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"209":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"102":{"tf":1.0},"312":{"tf":1.0},"328":{"tf":1.4142135623730951},"330":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"277":{"tf":1.0},"301":{"tf":1.0},"360":{"tf":1.4142135623730951},"70":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"179":{"tf":1.0},"378":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":3,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"398":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"0":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"199":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}}}}},"i":{"df":2,"docs":{"175":{"tf":1.0},"375":{"tf":1.0}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"199":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}}},"x":{"df":1,"docs":{"375":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.7320508075688772}}}}}}}},"t":{"df":26,"docs":{"137":{"tf":1.0},"156":{"tf":1.4142135623730951},"198":{"tf":2.449489742783178},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.23606797749979},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"219":{"tf":1.0},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"242":{"tf":1.0},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"286":{"tf":1.4142135623730951},"290":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.0},"54":{"tf":1.0},"66":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"377":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"377":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"377":{"tf":4.358898943540674}}}}}}}}},"v":{"df":1,"docs":{"299":{"tf":1.7320508075688772}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"377":{"tf":1.7320508075688772}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"205":{"tf":1.0},"234":{"tf":2.0},"235":{"tf":2.23606797749979}}}}}},"df":8,"docs":{"191":{"tf":1.0},"206":{"tf":2.0},"233":{"tf":1.0},"316":{"tf":1.7320508075688772},"318":{"tf":1.0},"320":{"tf":1.0},"375":{"tf":2.0},"377":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.7320508075688772}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"293":{"tf":1.0},"53":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"368":{"tf":1.0}}}},"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"d":{"df":2,"docs":{"413":{"tf":1.0},"436":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}}}}}}}},"w":{"df":0,"docs":{},"n":{"df":4,"docs":{"189":{"tf":1.0},"299":{"tf":1.0},"405":{"tf":1.0},"75":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"67":{"tf":1.0}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"64":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"299":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"46":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"70":{"tf":1.7320508075688772},"73":{"tf":1.7320508075688772},"74":{"tf":2.449489742783178},"75":{"tf":1.7320508075688772},"78":{"tf":1.7320508075688772}}}}}}}}}}},"p":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}}}},"x":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}},"1":{")":{".":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"175":{"tf":1.7320508075688772},"94":{"tf":1.0}}},"2":{"df":2,"docs":{"175":{"tf":1.4142135623730951},"94":{"tf":1.0}},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"175":{"tf":1.0}}}}}}}}}}},"3":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"175":{"tf":1.7320508075688772}}},"x":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}},"df":1,"docs":{"175":{"tf":1.4142135623730951}}},">":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"400":{"tf":1.0}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"401":{"tf":1.0}}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":12,"docs":{"110":{"tf":1.4142135623730951},"111":{"tf":1.7320508075688772},"117":{"tf":1.0},"241":{"tf":1.4142135623730951},"26":{"tf":1.0},"260":{"tf":2.449489742783178},"261":{"tf":1.0},"265":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"32":{"tf":1.0},"330":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}},"g":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":3.4641016151377544}},"e":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"[":{"1":{"df":1,"docs":{"316":{"tf":1.0}}},"2":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"316":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"<":{"'":{"a":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"102":{"tf":1.0}}},"r":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"183":{"tf":2.6457513110645907}}}},"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}}},"n":{"c":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"391":{"tf":3.7416573867739413}},"e":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"c":{"!":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"382":{"tf":1.0}}}},"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"155":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"167":{"tf":1.0},"202":{"tf":1.4142135623730951}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"198":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"224":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"157":{"tf":1.0},"158":{"tf":2.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"154":{"tf":1.0},"163":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":40,"docs":{"10":{"tf":1.0},"134":{"tf":1.4142135623730951},"143":{"tf":1.0},"153":{"tf":1.4142135623730951},"154":{"tf":3.3166247903554},"155":{"tf":4.123105625617661},"156":{"tf":3.872983346207417},"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"159":{"tf":3.0},"160":{"tf":1.4142135623730951},"162":{"tf":1.0},"163":{"tf":3.0},"164":{"tf":2.23606797749979},"165":{"tf":1.0},"166":{"tf":3.0},"167":{"tf":2.0},"168":{"tf":1.7320508075688772},"198":{"tf":2.23606797749979},"199":{"tf":1.0},"202":{"tf":5.196152422706632},"203":{"tf":1.4142135623730951},"216":{"tf":1.0},"224":{"tf":3.1622776601683795},"225":{"tf":1.0},"257":{"tf":1.7320508075688772},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"342":{"tf":1.0},"368":{"tf":1.0},"382":{"tf":2.23606797749979},"391":{"tf":1.7320508075688772},"405":{"tf":5.0},"407":{"tf":3.0},"408":{"tf":2.449489742783178},"53":{"tf":2.23606797749979},"54":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951}},"k":{"df":17,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"198":{"tf":1.4142135623730951},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0},"407":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"225":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"296":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":10,"docs":{"172":{"tf":1.0},"186":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"240":{"tf":1.0},"360":{"tf":1.4142135623730951},"375":{"tf":1.0},"405":{"tf":1.4142135623730951},"56":{"tf":1.4142135623730951},"75":{"tf":1.0},"87":{"tf":2.0}},"r":{"df":1,"docs":{"332":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"114":{"tf":1.0},"294":{"tf":4.795831523312719}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}}},"s":{"df":13,"docs":{"165":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"316":{"tf":1.0},"391":{"tf":1.0},"42":{"tf":2.0},"45":{"tf":2.0},"52":{"tf":1.0},"54":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"221":{"tf":1.0},"222":{"tf":1.0}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"221":{"tf":1.0},"222":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"221":{"tf":2.0},"222":{"tf":2.6457513110645907},"223":{"tf":2.8284271247461903}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"43":{"tf":1.0}}}}}}}}}}}},"t":{"df":2,"docs":{"190":{"tf":2.0},"192":{"tf":2.0}},"i":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"421":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"<":{"&":{"df":0,"docs":{},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":6,"docs":{"200":{"tf":1.4142135623730951},"239":{"tf":1.0},"375":{"tf":1.0},"416":{"tf":1.4142135623730951},"420":{"tf":2.8284271247461903},"421":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"172":{"tf":1.4142135623730951},"183":{"tf":1.4142135623730951},"416":{"tf":2.449489742783178},"421":{"tf":3.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":18,"docs":{"198":{"tf":2.6457513110645907},"199":{"tf":2.449489742783178},"200":{"tf":2.0},"201":{"tf":2.0},"202":{"tf":2.449489742783178},"206":{"tf":2.0},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.4142135623730951},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951},"296":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"300":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"t":{"df":1,"docs":{"416":{"tf":2.23606797749979}},"h":{"df":13,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.7320508075688772},"120":{"tf":1.0},"17":{"tf":1.7320508075688772},"249":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.4142135623730951},"268":{"tf":1.0},"376":{"tf":1.0},"391":{"tf":1.7320508075688772},"417":{"tf":1.7320508075688772}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"106":{"tf":2.0},"330":{"tf":1.0},"337":{"tf":1.0},"345":{"tf":1.0},"347":{"tf":1.7320508075688772},"350":{"tf":1.0},"351":{"tf":2.23606797749979},"353":{"tf":3.3166247903554},"354":{"tf":1.0},"360":{"tf":2.23606797749979},"375":{"tf":1.0},"378":{"tf":1.0},"42":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":3,"docs":{"337":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"y":{"df":1,"docs":{"252":{"tf":1.0}}}},"c":{"df":1,"docs":{"436":{"tf":1.7320508075688772}}},"d":{"b":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"175":{"tf":1.4142135623730951},"213":{"tf":1.0},"266":{"tf":2.23606797749979},"359":{"tf":3.3166247903554},"377":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":3,"docs":{"341":{"tf":3.0},"342":{"tf":3.0},"343":{"tf":2.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":3.7416573867739413}}}}}}}}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}},"n":{"df":0,"docs":{},"i":{"df":3,"docs":{"103":{"tf":1.7320508075688772},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}},"y":{"!":{"df":0,"docs":{},"”":{"df":0,"docs":{},",":{"df":0,"docs":{},"同":{"df":0,"docs":{},"时":{"df":0,"docs":{},"仍":{"df":0,"docs":{},"然":{"df":0,"docs":{},"返":{"df":0,"docs":{},"回":{"df":0,"docs":{},"代":{"df":0,"docs":{},"码":{"df":0,"docs":{},"块":{"df":0,"docs":{},"最":{"df":0,"docs":{},"后":{"df":0,"docs":{},"的":{"df":0,"docs":{},"值":{"df":0,"docs":{},",":{"1":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"380":{"tf":1.7320508075688772}}}}},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":2,"docs":{"289":{"tf":3.4641016151377544},"290":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"360":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":4,"docs":{"102":{"tf":1.0},"242":{"tf":1.0},"257":{"tf":1.0},"70":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"261":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}}},"df":1,"docs":{"376":{"tf":1.4142135623730951}}}}}}},"h":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"399":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772}}}},"df":2,"docs":{"1":{"tf":1.0},"428":{"tf":1.0}},"g":{"df":1,"docs":{"152":{"tf":1.0}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":2.8284271247461903}}}}},"n":{"!":{"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"320":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"<":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"320":{"tf":4.69041575982343},"323":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"88":{"tf":1.7320508075688772},"89":{"tf":1.0},"90":{"tf":1.0},"93":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"346":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"335":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"=":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"375":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"113":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":8,"docs":{"119":{"tf":1.0},"192":{"tf":1.4142135623730951},"260":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":2.23606797749979},"45":{"tf":2.0}}}},"df":0,"docs":{}},"u":{"df":2,"docs":{"203":{"tf":1.0},"266":{"tf":1.4142135623730951}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"105":{"tf":1.7320508075688772},"106":{"tf":1.0},"58":{"tf":1.0}},"e":{"(":{"5":{"df":1,"docs":{"58":{"tf":1.4142135623730951}}},"df":0,"docs":{},"f":{"df":2,"docs":{"105":{"tf":2.23606797749979},"106":{"tf":1.0}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"105":{"tf":2.0},"106":{"tf":1.0}}}}},"x":{"df":3,"docs":{"105":{"tf":2.0},"106":{"tf":1.0},"58":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":5,"docs":{"218":{"tf":2.449489742783178},"225":{"tf":1.7320508075688772},"229":{"tf":2.449489742783178},"232":{"tf":2.0},"235":{"tf":1.0}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"<":{"df":0,"docs":{},"f":{"3":{"2":{"df":1,"docs":{"175":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":2,"docs":{"173":{"tf":2.6457513110645907},"175":{"tf":3.1622776601683795}}},"x":{"1":{"df":1,"docs":{"175":{"tf":1.7320508075688772}}},"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"df":16,"docs":{"173":{"tf":3.605551275463989},"175":{"tf":3.4641016151377544},"270":{"tf":1.0},"316":{"tf":1.4142135623730951},"319":{"tf":1.7320508075688772},"321":{"tf":2.0},"322":{"tf":2.0},"352":{"tf":1.0},"359":{"tf":4.358898943540674},"360":{"tf":2.23606797749979},"375":{"tf":3.872983346207417},"377":{"tf":4.47213595499958},"52":{"tf":1.0},"53":{"tf":1.0},"85":{"tf":1.4142135623730951},"94":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"270":{"tf":1.4142135623730951},"309":{"tf":1.0},"367":{"tf":1.0},"385":{"tf":1.0},"412":{"tf":1.4142135623730951},"66":{"tf":1.0},"75":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"。":{"a":{"d":{"d":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"405":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"315":{"tf":1.0}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"431":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":1,"docs":{"332":{"tf":1.7320508075688772}}}}}}}}},"o":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"405":{"tf":2.0},"408":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"405":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"405":{"tf":3.7416573867739413},"407":{"tf":2.0},"408":{"tf":2.23606797749979}}}},"p":{"df":2,"docs":{"136":{"tf":1.0},"66":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"ê":{"df":1,"docs":{"431":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{".":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"i":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"337":{"tf":1.7320508075688772},"342":{"tf":1.4142135623730951},"343":{"tf":2.0}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":3,"docs":{"337":{"tf":1.4142135623730951},"338":{"tf":1.0},"343":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":9,"docs":{"337":{"tf":1.7320508075688772},"338":{"tf":3.872983346207417},"339":{"tf":2.449489742783178},"340":{"tf":2.23606797749979},"341":{"tf":3.872983346207417},"342":{"tf":5.0990195135927845},"343":{"tf":5.477225575051661},"393":{"tf":1.0},"398":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"14":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.4142135623730951}}}}}}}}}},"p":{"df":0,"docs":{},"v":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"11":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":2.0}}}}},"l":{"df":0,"docs":{},"u":{"d":{"df":7,"docs":{"102":{"tf":1.0},"126":{"tf":1.0},"147":{"tf":1.0},"157":{"tf":1.0},"283":{"tf":1.4142135623730951},"285":{"tf":1.0},"33":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"377":{"tf":1.4142135623730951},"91":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.7320508075688772},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}},"s":{"df":1,"docs":{"360":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":3.3166247903554}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"222":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"!":{"(":{"\"":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"382":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"382":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{"&":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"352":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"352":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"56":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"5":{"df":1,"docs":{"56":{"tf":1.0}}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"56":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"324":{"tf":1.0},"377":{"tf":1.4142135623730951},"91":{"tf":1.0}},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"'":{"a":{"df":1,"docs":{"322":{"tf":2.449489742783178}}},"b":{"df":1,"docs":{"322":{"tf":2.449489742783178}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}}}}},"{":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}},"df":0,"docs":{}}}},"*":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"1":{"df":2,"docs":{"179":{"tf":1.0},"180":{"tf":1.0}}},"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}}}},"df":3,"docs":{"291":{"tf":1.0},"293":{"tf":2.23606797749979},"376":{"tf":2.23606797749979}},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"62":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"194":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"355":{"tf":1.0},"357":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"225":{"tf":1.0},"226":{"tf":1.0}}}}},"t":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}}}}},"b":{"df":3,"docs":{"272":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"241":{"tf":2.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"181":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"360":{"tf":1.0}}}},"df":2,"docs":{"95":{"tf":2.0},"97":{"tf":1.4142135623730951}}}},"df":1,"docs":{"291":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"359":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":2.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"286":{"tf":2.0},"369":{"tf":1.0},"62":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"352":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"283":{"tf":2.23606797749979}}}}}}}}}},"df":0,"docs":{}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"358":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"360":{"tf":1.4142135623730951},"362":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":8,"docs":{"243":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":14,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":9,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"281":{"tf":1.7320508075688772},"32":{"tf":1.0},"388":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"55":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"299":{"tf":2.449489742783178}}},"df":0,"docs":{}}}},"i":{"df":3,"docs":{"298":{"tf":2.449489742783178},"318":{"tf":2.449489742783178},"381":{"tf":1.4142135623730951}}}},"i":{"'":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":1,"docs":{"206":{"tf":1.0}},"n":{"df":8,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"358":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}}}}}}},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"103":{"tf":1.0}}}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"306":{"tf":1.0}},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"359":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"180":{"tf":1.0}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"o":{"df":1,"docs":{"361":{"tf":1.0}}},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"61":{"tf":2.449489742783178}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"355":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.7320508075688772}}}},"p":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}},"3":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"175":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"224":{"tf":1.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"1":{"df":1,"docs":{"367":{"tf":1.0}}},"2":{"df":1,"docs":{"367":{"tf":1.0}}},"df":1,"docs":{"185":{"tf":2.0}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"319":{"tf":1.7320508075688772},"320":{"tf":2.6457513110645907}}}}},"t":{"1":{"df":1,"docs":{"91":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"62":{"tf":1.0}}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"306":{"tf":2.0}}}}}}}},"s":{"1":{"df":1,"docs":{"70":{"tf":1.0}}},"2":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":8,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":1,"docs":{"360":{"tf":1.0}}}},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"360":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"358":{"tf":1.4142135623730951}}}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"108":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"u":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.0}}}}},"h":{"df":36,"docs":{"108":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"134":{"tf":2.0},"167":{"tf":1.0},"170":{"tf":2.23606797749979},"172":{"tf":2.0},"183":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"188":{"tf":2.0},"189":{"tf":1.4142135623730951},"194":{"tf":1.0},"316":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"359":{"tf":1.0},"361":{"tf":1.4142135623730951},"382":{"tf":1.0},"385":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"428":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":2.23606797749979},"51":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.7320508075688772},"61":{"tf":1.4142135623730951},"62":{"tf":1.7320508075688772},"72":{"tf":1.0},"73":{"tf":1.7320508075688772},"78":{"tf":1.4142135623730951},"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"134":{"tf":1.0}}}},"i":{"df":2,"docs":{"360":{"tf":1.0},"376":{"tf":1.7320508075688772}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"355":{"tf":1.0},"357":{"tf":1.0}}}}},"o":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":7,"docs":{"125":{"tf":2.0},"167":{"tf":1.4142135623730951},"382":{"tf":1.4142135623730951},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.0}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"348":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"355":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}},"s":{"df":1,"docs":{"348":{"tf":2.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"301":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"w":{"df":1,"docs":{"378":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":7,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"405":{"tf":1.4142135623730951},"407":{"tf":2.0},"408":{"tf":2.23606797749979}}}}}},"x":{"df":4,"docs":{"360":{"tf":1.0},"37":{"tf":1.0},"381":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"y":{"df":1,"docs":{"361":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":14,"docs":{"124":{"tf":1.0},"125":{"tf":2.0},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.0}}}}},"{":{"a":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"144":{"tf":1.0}}},"c":{"df":1,"docs":{"144":{"tf":1.0}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"360":{"tf":1.4142135623730951},"69":{"tf":1.0}},"i":{"df":1,"docs":{"135":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"148":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"229":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"242":{"tf":1.7320508075688772}}}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"150":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"r":{"1":{"df":1,"docs":{"74":{"tf":1.0}}},"3":{"df":1,"docs":{"74":{"tf":1.0}}},"df":0,"docs":{}},"s":{"1":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"71":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"71":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"349":{"tf":1.0},"350":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"353":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":38,"docs":{"104":{"tf":1.0},"141":{"tf":1.0},"188":{"tf":1.7320508075688772},"206":{"tf":1.7320508075688772},"218":{"tf":1.0},"228":{"tf":1.0},"23":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"235":{"tf":1.0},"239":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"293":{"tf":1.7320508075688772},"294":{"tf":2.23606797749979},"299":{"tf":1.0},"301":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.4142135623730951},"33":{"tf":1.0},"356":{"tf":1.0},"37":{"tf":1.7320508075688772},"377":{"tf":3.872983346207417},"387":{"tf":1.0},"388":{"tf":1.0},"391":{"tf":1.0},"399":{"tf":1.0},"45":{"tf":1.0},"54":{"tf":1.0},"56":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":2.449489742783178},"78":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":3.1622776601683795},"93":{"tf":1.0}}}},"s":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"1":{"0":{"(":{"4":{"df":1,"docs":{"206":{"tf":1.0}}},"8":{"df":1,"docs":{"206":{"tf":1.0}}},"a":{"df":1,"docs":{"206":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":2.0},"116":{"tf":2.0}}}},"df":1,"docs":{"413":{"tf":1.0}}}},"o":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"102":{"tf":1.0},"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":6,"docs":{"157":{"tf":1.0},"224":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"288":{"tf":1.0},"74":{"tf":1.7320508075688772}}}}}},"c":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"392":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"390":{"tf":1.7320508075688772},"391":{"tf":1.4142135623730951},"393":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"391":{"tf":1.4142135623730951},"392":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"330":{"tf":1.4142135623730951},"387":{"tf":1.0},"390":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"1":{")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"225":{"tf":1.0}}}}}}},"df":5,"docs":{"224":{"tf":1.0},"225":{"tf":2.0},"226":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"249":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"297":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"300":{"tf":1.0},"303":{"tf":1.0}},"t":{"df":7,"docs":{"228":{"tf":2.449489742783178},"229":{"tf":2.8284271247461903},"231":{"tf":1.7320508075688772},"232":{"tf":3.4641016151377544},"249":{"tf":3.0},"250":{"tf":2.23606797749979},"53":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"l":{"df":46,"docs":{"143":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.7320508075688772},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"405":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}},"e":{".":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"255":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"155":{"tf":1.0},"255":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":9,"docs":{"19":{"tf":1.0},"2":{"tf":1.0},"237":{"tf":1.0},"296":{"tf":1.4142135623730951},"312":{"tf":1.0},"316":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.0},"47":{"tf":1.0}},"m":{"df":1,"docs":{"196":{"tf":1.0}}}}},"df":0,"docs":{}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"213":{"tf":1.0},"248":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}},"df":13,"docs":{"110":{"tf":1.0},"111":{"tf":2.0},"159":{"tf":1.4142135623730951},"198":{"tf":1.0},"21":{"tf":2.23606797749979},"214":{"tf":1.0},"26":{"tf":1.0},"32":{"tf":1.0},"391":{"tf":1.0},"395":{"tf":1.0},"397":{"tf":1.0},"49":{"tf":1.0},"61":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"436":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"”":{"df":0,"docs":{},"。":{"df":0,"docs":{},")":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"160":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"396":{"tf":1.4142135623730951},"429":{"tf":1.0}}}}},"df":1,"docs":{"15":{"tf":1.0}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"163":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":1,"docs":{"232":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"431":{"tf":1.0}},"r":{"df":1,"docs":{"368":{"tf":2.0}}}},"u":{"b":{"df":62,"docs":{"112":{"tf":1.0},"113":{"tf":2.23606797749979},"115":{"tf":2.23606797749979},"116":{"tf":4.0},"119":{"tf":3.7416573867739413},"120":{"tf":2.449489742783178},"121":{"tf":1.7320508075688772},"123":{"tf":3.605551275463989},"127":{"tf":2.449489742783178},"128":{"tf":1.0},"129":{"tf":1.0},"167":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"179":{"tf":3.3166247903554},"180":{"tf":4.795831523312719},"181":{"tf":4.123105625617661},"182":{"tf":4.69041575982343},"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.8284271247461903},"203":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.7320508075688772},"211":{"tf":1.0},"226":{"tf":2.449489742783178},"228":{"tf":3.605551275463989},"229":{"tf":4.898979485566356},"231":{"tf":2.449489742783178},"232":{"tf":5.5677643628300215},"242":{"tf":1.0},"244":{"tf":1.0},"249":{"tf":4.898979485566356},"250":{"tf":3.7416573867739413},"257":{"tf":1.4142135623730951},"258":{"tf":4.58257569495584},"266":{"tf":1.4142135623730951},"289":{"tf":3.4641016151377544},"290":{"tf":2.0},"320":{"tf":1.7320508075688772},"331":{"tf":2.6457513110645907},"334":{"tf":3.4641016151377544},"335":{"tf":2.8284271247461903},"338":{"tf":1.4142135623730951},"339":{"tf":2.0},"340":{"tf":2.0},"341":{"tf":2.23606797749979},"342":{"tf":4.242640687119285},"343":{"tf":3.605551275463989},"368":{"tf":1.0},"374":{"tf":1.4142135623730951},"381":{"tf":1.7320508075688772},"382":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.7320508075688772},"392":{"tf":1.0},"393":{"tf":1.0},"405":{"tf":6.0},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"412":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"120":{"tf":1.0},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":8,"docs":{"256":{"tf":1.0},"260":{"tf":1.7320508075688772},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"337":{"tf":1.0},"338":{"tf":1.0},"342":{"tf":3.3166247903554},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"348":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"141":{"tf":2.0},"339":{"tf":1.0},"69":{"tf":1.0}}}}}},"df":6,"docs":{"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":2.0},"229":{"tf":1.0},"289":{"tf":1.0},"66":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"102":{"tf":1.0}}}},"y":{"df":1,"docs":{"24":{"tf":1.0}}}},"q":{"df":1,"docs":{"172":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"364":{"tf":1.0},"376":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}}}}}},"df":3,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.7320508075688772},"108":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":15,"docs":{"217":{"tf":1.7320508075688772},"218":{"tf":1.4142135623730951},"219":{"tf":1.0},"221":{"tf":2.449489742783178},"222":{"tf":2.449489742783178},"223":{"tf":2.23606797749979},"224":{"tf":3.0},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":3.1622776601683795},"229":{"tf":4.242640687119285},"231":{"tf":2.23606797749979},"232":{"tf":5.744562646538029},"249":{"tf":4.898979485566356},"250":{"tf":3.605551275463989}}},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"101":{"tf":1.7320508075688772},"274":{"tf":1.0},"359":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.7320508075688772}}},"df":1,"docs":{"391":{"tf":3.0}},"e":{":":{":":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}}}}}}}},"r":{"#":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"414":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"414":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"3":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"242":{"tf":2.0}}}}},"df":0,"docs":{}}}},"1":{"df":2,"docs":{"367":{"tf":1.7320508075688772},"74":{"tf":3.872983346207417}}},"2":{"df":2,"docs":{"367":{"tf":1.7320508075688772},"74":{"tf":3.7416573867739413}}},"3":{"df":1,"docs":{"74":{"tf":2.449489742783178}}},"\\":{"df":0,"docs":{},"n":{"df":2,"docs":{"398":{"tf":1.0},"42":{"tf":1.0}},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}}},",":{"df":0,"docs":{},"其":{"df":0,"docs":{},"中":{"\\":{"df":0,"docs":{},"r":{"df":0,"docs":{},"是":{"df":0,"docs":{},"回":{"df":0,"docs":{},"车":{"df":0,"docs":{},"符":{"df":0,"docs":{},",":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"是":{"df":0,"docs":{},"换":{"df":0,"docs":{},"行":{"df":0,"docs":{},"符":{"df":0,"docs":{},"。":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"398":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"c":{"df":0,"docs":{},"e":{"df":6,"docs":{"297":{"tf":1.0},"316":{"tf":1.7320508075688772},"321":{"tf":2.23606797749979},"322":{"tf":1.0},"323":{"tf":2.23606797749979},"74":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}},"n":{"d":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{";":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"df":9,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{")":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"1":{".":{".":{"=":{"1":{"0":{"0":{"df":9,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"124":{"tf":1.0},"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"c":{"df":0,"docs":{},"h":{"a":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":8,"docs":{"111":{"tf":1.0},"124":{"tf":2.449489742783178},"266":{"tf":4.58257569495584},"39":{"tf":1.0},"40":{"tf":4.358898943540674},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"421":{"tf":1.0}},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"322":{"tf":4.123105625617661}},"g":{"df":6,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"362":{"tf":1.7320508075688772},"41":{"tf":1.0},"62":{"tf":1.0},"78":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"417":{"tf":1.0}}}}},",":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"417":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"w":{"df":4,"docs":{"309":{"tf":1.0},"367":{"tf":1.0},"412":{"tf":1.0},"414":{"tf":1.0}}}},"b":{"df":1,"docs":{"24":{"tf":1.0}}},"c":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"284":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"a":{"df":3,"docs":{"285":{"tf":1.7320508075688772},"286":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951}}},"b":{"df":1,"docs":{"293":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"306":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"285":{"tf":2.0},"286":{"tf":1.0},"294":{"tf":1.0}},"。":{"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"285":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},",":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"285":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"294":{"tf":2.0}},"e":{"(":{"&":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"1":{"0":{"df":3,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"293":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":3,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"293":{"tf":1.0}}},"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"291":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"0":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0}}}},"o":{"d":{"df":1,"docs":{"294":{"tf":3.1622776601683795}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"5":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"a":{"df":2,"docs":{"286":{"tf":2.0},"293":{"tf":1.7320508075688772}}},"b":{"df":1,"docs":{"293":{"tf":1.4142135623730951}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"286":{"tf":1.0},"294":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"285":{"tf":2.23606797749979},"286":{"tf":2.0},"291":{"tf":1.0},"293":{"tf":3.0}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"306":{"tf":2.449489742783178},"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"294":{"tf":3.1622776601683795}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"t":{">":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"288":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"270":{"tf":1.0},"284":{"tf":2.449489742783178},"285":{"tf":2.6457513110645907},"286":{"tf":3.1622776601683795},"288":{"tf":1.0},"291":{"tf":3.0},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":3.872983346207417},"295":{"tf":1.0},"306":{"tf":3.1622776601683795},"307":{"tf":1.7320508075688772},"309":{"tf":1.7320508075688772},"310":{"tf":1.0}}}},"df":3,"docs":{"273":{"tf":1.0},"275":{"tf":1.0},"293":{"tf":3.1622776601683795}}},"df":11,"docs":{"185":{"tf":4.58257569495584},"213":{"tf":1.0},"231":{"tf":1.0},"242":{"tf":1.0},"359":{"tf":1.4142135623730951},"367":{"tf":1.0},"368":{"tf":1.4142135623730951},"414":{"tf":1.4142135623730951},"417":{"tf":1.7320508075688772},"42":{"tf":1.0},"428":{"tf":2.449489742783178}},"e":{"a":{"d":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"35":{"tf":2.0},"36":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.4142135623730951},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"160":{"tf":2.0},"161":{"tf":2.0}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"160":{"tf":1.0},"161":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":26,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"167":{"tf":1.0},"180":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"219":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"382":{"tf":1.0},"405":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}},"i":{"df":2,"docs":{"315":{"tf":1.0},"316":{"tf":1.0}}},"m":{"df":1,"docs":{"267":{"tf":1.0}},"e":{"df":0,"docs":{},"、":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"399":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":9,"docs":{"300":{"tf":2.23606797749979},"301":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"319":{"tf":3.1622776601683795},"320":{"tf":2.8284271247461903},"405":{"tf":5.477225575051661},"407":{"tf":3.605551275463989},"408":{"tf":3.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"405":{"tf":1.4142135623730951},"407":{"tf":2.0},"408":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"405":{"tf":1.0},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"x":{"df":1,"docs":{"325":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"325":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"153":{"tf":1.0},"157":{"tf":1.0}}}}}},"t":{"1":{".":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"2":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"3":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"93":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"df":6,"docs":{"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":3.4641016151377544},"93":{"tf":1.7320508075688772},"95":{"tf":3.1622776601683795},"97":{"tf":1.7320508075688772}}},"2":{"df":2,"docs":{"95":{"tf":3.0},"97":{"tf":1.4142135623730951}}},"3":{"df":2,"docs":{"95":{"tf":2.449489742783178},"97":{"tf":1.4142135623730951}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":11,"docs":{"100":{"tf":1.4142135623730951},"199":{"tf":5.656854249492381},"242":{"tf":4.58257569495584},"88":{"tf":2.23606797749979},"89":{"tf":1.0},"90":{"tf":3.4641016151377544},"91":{"tf":4.898979485566356},"93":{"tf":4.47213595499958},"95":{"tf":4.358898943540674},"96":{"tf":2.0},"97":{"tf":2.6457513110645907}},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"90":{"tf":1.0}}}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"3":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},",":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"273":{"tf":1.7320508075688772}}}}},"v":{"df":7,"docs":{"300":{"tf":1.7320508075688772},"302":{"tf":1.0},"319":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"349":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.7320508075688772}}}},"d":{"df":3,"docs":{"239":{"tf":1.7320508075688772},"258":{"tf":2.0},"359":{"tf":1.7320508075688772}}},"df":4,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"123":{"tf":1.0},"258":{"tf":1.0}},"f":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"270":{"tf":1.0},"290":{"tf":1.7320508075688772}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"289":{"tf":2.0},"290":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.0}},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"a":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"289":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"294":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{">":{"/":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":12,"docs":{"270":{"tf":1.4142135623730951},"286":{"tf":1.0},"287":{"tf":2.0},"288":{"tf":3.3166247903554},"289":{"tf":2.23606797749979},"290":{"tf":3.1622776601683795},"291":{"tf":3.605551275463989},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"307":{"tf":1.0},"310":{"tf":1.4142135623730951}}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"412":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":20,"docs":{"102":{"tf":2.0},"115":{"tf":1.0},"185":{"tf":1.0},"195":{"tf":1.0},"270":{"tf":1.7320508075688772},"284":{"tf":1.0},"289":{"tf":2.0},"292":{"tf":1.0},"294":{"tf":1.0},"306":{"tf":1.0},"35":{"tf":1.0},"368":{"tf":1.0},"407":{"tf":1.0},"42":{"tf":1.4142135623730951},"50":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":2.6457513110645907},"74":{"tf":1.0},"75":{"tf":2.0},"91":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"189":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"94":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"75":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":3,"docs":{"270":{"tf":1.0},"290":{"tf":1.4142135623730951},"291":{"tf":1.0}}}},"df":1,"docs":{"290":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"353":{"tf":1.0}}}}}},"m":{"d":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"345":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":2.449489742783178}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"260":{"tf":1.0},"40":{"tf":1.7320508075688772}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"434":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":1,"docs":{"115":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":7,"docs":{"155":{"tf":1.0},"156":{"tf":1.0},"255":{"tf":3.1622776601683795},"267":{"tf":1.0},"28":{"tf":2.0},"434":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":1,"docs":{"62":{"tf":3.0}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}},"v":{"df":4,"docs":{"232":{"tf":1.4142135623730951},"331":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"107":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"377":{"tf":3.4641016151377544}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"l":{"a":{"c":{"df":2,"docs":{"145":{"tf":1.0},"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":4,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":2.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"260":{"tf":1.0}}}}}}}}},"r":{"df":1,"docs":{"159":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},",":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}}}},"df":3,"docs":{"275":{"tf":1.0},"391":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"401":{"tf":2.449489742783178},"402":{"tf":1.4142135623730951},"404":{"tf":1.7320508075688772},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"341":{"tf":1.7320508075688772},"342":{"tf":3.4641016151377544},"343":{"tf":1.0}}}}}}},"df":3,"docs":{"341":{"tf":3.1622776601683795},"342":{"tf":1.7320508075688772},"343":{"tf":2.8284271247461903}}}}}}}}},"df":4,"docs":{"396":{"tf":1.0},"398":{"tf":2.0},"401":{"tf":1.0},"437":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":17,"docs":{"142":{"tf":1.4142135623730951},"273":{"tf":1.0},"299":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":4.795831523312719},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"335":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"377":{"tf":2.23606797749979}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"107":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"n":{"df":8,"docs":{"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"398":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"260":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":9,"docs":{"316":{"tf":1.4142135623730951},"396":{"tf":1.0},"399":{"tf":1.7320508075688772},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}}}}},"t":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"114":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"120":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"189":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"157":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"<":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"160":{"tf":1.0},"161":{"tf":1.7320508075688772},"398":{"tf":1.0}}}}},"t":{"df":13,"docs":{"153":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"158":{"tf":1.7320508075688772},"160":{"tf":1.0},"162":{"tf":2.0},"169":{"tf":1.0},"174":{"tf":1.0},"203":{"tf":2.6457513110645907},"224":{"tf":1.0},"225":{"tf":1.0},"300":{"tf":1.7320508075688772},"381":{"tf":2.6457513110645907},"397":{"tf":1.0}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"405":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"8":{"df":1,"docs":{"348":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}},"df":59,"docs":{"121":{"tf":2.0},"122":{"tf":1.7320508075688772},"156":{"tf":1.0},"157":{"tf":3.605551275463989},"158":{"tf":1.0},"159":{"tf":1.7320508075688772},"160":{"tf":2.0},"161":{"tf":2.0},"162":{"tf":4.69041575982343},"163":{"tf":2.0},"165":{"tf":2.23606797749979},"166":{"tf":1.4142135623730951},"168":{"tf":2.0},"170":{"tf":2.0},"172":{"tf":2.8284271247461903},"174":{"tf":1.7320508075688772},"186":{"tf":2.0},"188":{"tf":4.123105625617661},"189":{"tf":3.0},"194":{"tf":1.4142135623730951},"198":{"tf":3.0},"199":{"tf":2.23606797749979},"200":{"tf":2.23606797749979},"201":{"tf":2.449489742783178},"202":{"tf":2.0},"203":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.6457513110645907},"208":{"tf":2.23606797749979},"210":{"tf":1.4142135623730951},"211":{"tf":3.1622776601683795},"224":{"tf":3.1622776601683795},"225":{"tf":2.8284271247461903},"226":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":3.3166247903554},"231":{"tf":1.7320508075688772},"232":{"tf":5.656854249492381},"246":{"tf":1.0},"249":{"tf":4.58257569495584},"250":{"tf":3.1622776601683795},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"306":{"tf":1.0},"316":{"tf":1.4142135623730951},"318":{"tf":1.0},"323":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"349":{"tf":1.0},"36":{"tf":3.7416573867739413},"381":{"tf":3.1622776601683795},"391":{"tf":1.0},"398":{"tf":1.4142135623730951},"401":{"tf":1.0},"405":{"tf":1.0},"42":{"tf":2.0},"45":{"tf":1.4142135623730951},"62":{"tf":2.449489742783178}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":24,"docs":{"160":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":2.23606797749979},"186":{"tf":1.0},"189":{"tf":1.4142135623730951},"191":{"tf":1.0},"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":2.0},"250":{"tf":1.7320508075688772},"316":{"tf":1.0},"368":{"tf":1.0},"386":{"tf":2.0},"398":{"tf":1.0},"412":{"tf":1.0},"58":{"tf":2.0},"75":{"tf":2.449489742783178},"77":{"tf":2.23606797749979},"78":{"tf":2.0}},"s":{"_":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"386":{"tf":2.23606797749979}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"381":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"182":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"182":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":2.0}}}}}}},"u":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"f":{"c":{"df":1,"docs":{"437":{"tf":2.449489742783178}}},"df":0,"docs":{}},"g":{"b":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"359":{"tf":1.0}}},"df":1,"docs":{"267":{"tf":1.7320508075688772}}},"h":{"df":1,"docs":{"375":{"tf":3.1622776601683795}},"s":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"375":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"434":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"(":{"b":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":11,"docs":{"198":{"tf":2.449489742783178},"200":{"tf":2.449489742783178},"203":{"tf":1.4142135623730951},"206":{"tf":2.0},"208":{"tf":1.4142135623730951},"210":{"tf":2.0},"228":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"323":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"375":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"213":{"tf":1.0}}}},"p":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"213":{"tf":1.0},"267":{"tf":2.8284271247461903}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"124":{"tf":1.0},"41":{"tf":1.0}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"111":{"tf":1.0},"115":{"tf":1.0},"412":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"392":{"tf":1.4142135623730951}},"e":{"(":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"392":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"392":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"v":{"4":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772}}},"6":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"w":{"df":1,"docs":{"136":{"tf":1.0}}}},"s":{"df":2,"docs":{"22":{"tf":1.0},"24":{"tf":1.0}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"61":{"tf":1.0}}},"y":{"df":0,"docs":{},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}},",":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},",":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"179":{"tf":1.0},"191":{"tf":1.0},"378":{"tf":1.0}}}},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":8,"docs":{"225":{"tf":2.8284271247461903},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":101,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.7320508075688772},"155":{"tf":1.7320508075688772},"156":{"tf":2.449489742783178},"157":{"tf":1.7320508075688772},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":3.1622776601683795},"199":{"tf":3.0},"200":{"tf":2.449489742783178},"201":{"tf":2.449489742783178},"202":{"tf":2.8284271247461903},"204":{"tf":1.4142135623730951},"206":{"tf":2.449489742783178},"207":{"tf":2.6457513110645907},"208":{"tf":2.449489742783178},"211":{"tf":4.0},"214":{"tf":1.0},"216":{"tf":2.0},"217":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"220":{"tf":1.4142135623730951},"224":{"tf":2.8284271247461903},"225":{"tf":4.123105625617661},"226":{"tf":2.23606797749979},"228":{"tf":1.7320508075688772},"229":{"tf":3.872983346207417},"232":{"tf":3.4641016151377544},"234":{"tf":1.0},"235":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"241":{"tf":2.0},"242":{"tf":1.7320508075688772},"246":{"tf":1.4142135623730951},"257":{"tf":1.0},"266":{"tf":3.3166247903554},"27":{"tf":2.8284271247461903},"273":{"tf":1.0},"277":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":2.23606797749979},"285":{"tf":1.0},"286":{"tf":1.4142135623730951},"289":{"tf":1.0},"290":{"tf":1.7320508075688772},"291":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"316":{"tf":2.23606797749979},"319":{"tf":1.4142135623730951},"32":{"tf":2.0},"320":{"tf":1.0},"334":{"tf":1.7320508075688772},"335":{"tf":2.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.0},"353":{"tf":1.7320508075688772},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":2.6457513110645907},"377":{"tf":1.0},"38":{"tf":1.7320508075688772},"391":{"tf":1.0},"397":{"tf":1.7320508075688772},"398":{"tf":1.4142135623730951},"400":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.0},"408":{"tf":1.7320508075688772},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"49":{"tf":2.0},"51":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"56":{"tf":2.23606797749979},"57":{"tf":1.0},"58":{"tf":1.7320508075688772},"61":{"tf":3.1622776601683795},"62":{"tf":2.449489742783178},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.7320508075688772},"91":{"tf":2.449489742783178}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"314":{"tf":1.0}},"e":{"df":0,"docs":{},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"特":{"df":0,"docs":{},"别":{"df":0,"docs":{},"是":{"df":0,"docs":{},"(":{"df":0,"docs":{},"但":{"df":0,"docs":{},"不":{"df":0,"docs":{},"仅":{"df":0,"docs":{},"是":{"df":0,"docs":{},"!":{"df":0,"docs":{},")":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"b":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"\"":{"df":0,"docs":{},"、":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"\"":{"df":0,"docs":{},"、":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"365":{"tf":1.0},"432":{"tf":1.0}}},"df":0,"docs":{}}},"<":{"/":{"df":0,"docs":{},"p":{"df":1,"docs":{"400":{"tf":1.0}}}},"df":0,"docs":{}},"_":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":2,"docs":{"156":{"tf":1.7320508075688772},"224":{"tf":1.0}},"e":{"=":{"1":{"df":15,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{":":{":":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"335":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"a":{"c":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":14,"docs":{"111":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"145":{"tf":1.0},"159":{"tf":1.0},"222":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.0},"40":{"tf":1.0},"409":{"tf":1.0},"49":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}},"s":{"df":0,"docs":{},"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"9":{"0":{"c":{"d":{"a":{"1":{"9":{"6":{"9":{"3":{"8":{"3":{"df":0,"docs":{},"f":{"5":{"6":{"a":{"2":{"6":{"3":{"7":{"c":{"b":{"d":{"3":{"0":{"3":{"7":{"b":{"d":{"df":0,"docs":{},"f":{"5":{"9":{"8":{"8":{"4":{"1":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"8":{"3":{"9":{":":{"8":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"5":{"7":{"4":{":":{"1":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"5":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":58,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"111":{"tf":1.4142135623730951},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"17":{"tf":1.4142135623730951},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"22":{"tf":1.4142135623730951},"228":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"29":{"tf":1.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"426":{"tf":1.0},"434":{"tf":1.0},"436":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}},"d":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}}},"df":278,"docs":{"0":{"tf":3.0},"1":{"tf":3.4641016151377544},"10":{"tf":4.58257569495584},"100":{"tf":1.0},"102":{"tf":3.0},"103":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":2.0},"108":{"tf":1.0},"109":{"tf":1.4142135623730951},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"115":{"tf":2.23606797749979},"116":{"tf":1.0},"12":{"tf":1.7320508075688772},"121":{"tf":1.7320508075688772},"124":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"13":{"tf":3.0},"130":{"tf":1.4142135623730951},"132":{"tf":2.23606797749979},"133":{"tf":1.0},"134":{"tf":1.4142135623730951},"136":{"tf":1.7320508075688772},"138":{"tf":1.0},"139":{"tf":2.0},"142":{"tf":3.1622776601683795},"143":{"tf":1.4142135623730951},"145":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"153":{"tf":1.7320508075688772},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":2.23606797749979},"157":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.4142135623730951},"161":{"tf":1.0},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":2.0},"172":{"tf":1.4142135623730951},"176":{"tf":2.0},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"181":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":2.6457513110645907},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":2.0},"189":{"tf":1.0},"191":{"tf":3.1622776601683795},"192":{"tf":1.0},"195":{"tf":1.4142135623730951},"196":{"tf":1.7320508075688772},"197":{"tf":1.4142135623730951},"198":{"tf":2.449489742783178},"2":{"tf":2.23606797749979},"20":{"tf":2.449489742783178},"200":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"210":{"tf":1.7320508075688772},"211":{"tf":2.0},"212":{"tf":1.4142135623730951},"213":{"tf":1.7320508075688772},"215":{"tf":1.0},"216":{"tf":1.4142135623730951},"219":{"tf":1.0},"22":{"tf":2.23606797749979},"220":{"tf":1.0},"222":{"tf":1.4142135623730951},"225":{"tf":1.0},"228":{"tf":2.23606797749979},"229":{"tf":2.23606797749979},"23":{"tf":3.0},"231":{"tf":2.449489742783178},"232":{"tf":4.0},"236":{"tf":1.4142135623730951},"237":{"tf":2.6457513110645907},"238":{"tf":1.4142135623730951},"239":{"tf":1.0},"24":{"tf":2.23606797749979},"240":{"tf":1.0},"241":{"tf":1.0},"242":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":3.1622776601683795},"25":{"tf":2.23606797749979},"250":{"tf":2.23606797749979},"251":{"tf":1.4142135623730951},"252":{"tf":2.449489742783178},"253":{"tf":2.0},"255":{"tf":1.4142135623730951},"256":{"tf":1.0},"257":{"tf":1.7320508075688772},"26":{"tf":1.4142135623730951},"260":{"tf":1.4142135623730951},"261":{"tf":1.0},"267":{"tf":2.23606797749979},"269":{"tf":1.4142135623730951},"270":{"tf":2.0},"273":{"tf":2.6457513110645907},"274":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"280":{"tf":1.7320508075688772},"281":{"tf":2.449489742783178},"282":{"tf":1.7320508075688772},"283":{"tf":3.605551275463989},"284":{"tf":1.0},"285":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":2.449489742783178},"289":{"tf":1.4142135623730951},"29":{"tf":1.0},"292":{"tf":1.7320508075688772},"293":{"tf":2.0},"295":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":2.8284271247461903},"3":{"tf":1.7320508075688772},"30":{"tf":2.23606797749979},"300":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"307":{"tf":1.7320508075688772},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"311":{"tf":1.0},"312":{"tf":2.0},"313":{"tf":1.0},"314":{"tf":1.7320508075688772},"315":{"tf":2.6457513110645907},"316":{"tf":4.358898943540674},"318":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":1.0},"324":{"tf":1.7320508075688772},"328":{"tf":2.8284271247461903},"329":{"tf":1.4142135623730951},"33":{"tf":1.0},"330":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"332":{"tf":2.6457513110645907},"333":{"tf":1.4142135623730951},"334":{"tf":1.7320508075688772},"335":{"tf":1.7320508075688772},"336":{"tf":1.4142135623730951},"337":{"tf":1.7320508075688772},"338":{"tf":1.0},"339":{"tf":1.0},"34":{"tf":1.7320508075688772},"340":{"tf":1.0},"341":{"tf":1.4142135623730951},"342":{"tf":1.0},"343":{"tf":2.6457513110645907},"344":{"tf":2.23606797749979},"345":{"tf":1.0},"346":{"tf":1.0},"348":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":2.0},"358":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":2.23606797749979},"361":{"tf":1.0},"363":{"tf":1.7320508075688772},"364":{"tf":2.23606797749979},"365":{"tf":4.123105625617661},"366":{"tf":2.0},"367":{"tf":2.23606797749979},"368":{"tf":4.47213595499958},"369":{"tf":2.449489742783178},"370":{"tf":1.0},"371":{"tf":1.7320508075688772},"372":{"tf":1.0},"373":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":3.3166247903554},"378":{"tf":1.0},"379":{"tf":1.0},"381":{"tf":1.0},"382":{"tf":2.23606797749979},"383":{"tf":2.0},"387":{"tf":1.0},"388":{"tf":1.4142135623730951},"389":{"tf":3.0},"39":{"tf":1.4142135623730951},"390":{"tf":1.4142135623730951},"391":{"tf":4.358898943540674},"393":{"tf":1.0},"394":{"tf":1.0},"395":{"tf":1.7320508075688772},"397":{"tf":1.0},"4":{"tf":2.449489742783178},"40":{"tf":2.0},"402":{"tf":1.0},"405":{"tf":1.7320508075688772},"409":{"tf":1.7320508075688772},"410":{"tf":1.0},"411":{"tf":1.0},"413":{"tf":1.0},"414":{"tf":1.0},"415":{"tf":1.0},"416":{"tf":1.0},"42":{"tf":3.3166247903554},"425":{"tf":1.4142135623730951},"426":{"tf":1.7320508075688772},"427":{"tf":1.4142135623730951},"428":{"tf":1.4142135623730951},"429":{"tf":2.6457513110645907},"430":{"tf":4.358898943540674},"432":{"tf":2.449489742783178},"433":{"tf":2.23606797749979},"434":{"tf":4.358898943540674},"435":{"tf":1.4142135623730951},"436":{"tf":3.1622776601683795},"437":{"tf":3.1622776601683795},"46":{"tf":1.7320508075688772},"47":{"tf":2.0},"48":{"tf":1.4142135623730951},"49":{"tf":2.0},"5":{"tf":1.4142135623730951},"50":{"tf":1.0},"52":{"tf":1.7320508075688772},"53":{"tf":4.358898943540674},"54":{"tf":2.6457513110645907},"55":{"tf":2.0},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.4142135623730951},"59":{"tf":1.4142135623730951},"6":{"tf":1.0},"61":{"tf":2.449489742783178},"62":{"tf":2.449489742783178},"64":{"tf":2.0},"65":{"tf":1.7320508075688772},"66":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.7320508075688772},"70":{"tf":4.123105625617661},"71":{"tf":1.0},"74":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951},"77":{"tf":1.0},"78":{"tf":1.7320508075688772},"8":{"tf":2.6457513110645907},"80":{"tf":1.7320508075688772},"81":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"91":{"tf":1.4142135623730951},"93":{"tf":1.7320508075688772},"94":{"tf":2.23606797749979},"98":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"427":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"t":{"df":3,"docs":{"23":{"tf":1.0},"4":{"tf":1.0},"426":{"tf":2.8284271247461903}},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"134":{"tf":1.0},"295":{"tf":1.0},"311":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"267":{"tf":1.0}}}},"df":10,"docs":{"0":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"18":{"tf":2.0},"19":{"tf":1.0},"30":{"tf":1.0},"426":{"tf":1.0},"428":{"tf":1.0},"436":{"tf":3.0}}}},"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"v":{":":{"9":{"9":{".":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"x":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"319":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"300":{"tf":1.0},"301":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"319":{"tf":1.7320508075688772},"349":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"319":{"tf":1.7320508075688772},"320":{"tf":3.3166247903554}}}}}},"df":8,"docs":{"300":{"tf":2.23606797749979},"301":{"tf":1.0},"302":{"tf":1.7320508075688772},"303":{"tf":1.4142135623730951},"319":{"tf":3.0},"320":{"tf":2.449489742783178},"325":{"tf":1.7320508075688772},"349":{"tf":1.0}}},"y":{"b":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}}},"s":{".":{"a":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":3,"docs":{"191":{"tf":1.0},"77":{"tf":2.23606797749979},"78":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"77":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"72":{"tf":1.0},"73":{"tf":1.7320508075688772},"77":{"tf":2.449489742783178},"78":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"'":{"df":0,"docs":{},"l":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"69":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"247":{"tf":1.0}}}}}}},"1":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"2":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"[":{"0":{"df":1,"docs":{"142":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":6,"docs":{"141":{"tf":3.3166247903554},"142":{"tf":1.0},"383":{"tf":1.4142135623730951},"70":{"tf":4.69041575982343},"72":{"tf":2.0},"73":{"tf":3.1622776601683795}}},"2":{"df":4,"docs":{"141":{"tf":4.358898943540674},"383":{"tf":1.4142135623730951},"70":{"tf":4.0},"72":{"tf":2.449489742783178}},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}}}},"3":{"df":2,"docs":{"141":{"tf":2.6457513110645907},"72":{"tf":1.7320508075688772}}},"[":{".":{".":{"2":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"2":{"df":1,"docs":{"78":{"tf":1.0}}},"5":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":2.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"78":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"78":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"78":{"tf":1.0}}},"6":{".":{".":{"1":{"1":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":8,"docs":{"102":{"tf":1.0},"228":{"tf":2.0},"229":{"tf":2.0},"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},")":{"df":0,"docs":{},";":{"df":0,"docs":{},"编":{"df":0,"docs":{},"译":{"df":0,"docs":{},"器":{"df":0,"docs":{},"也":{"df":0,"docs":{},"指":{"df":0,"docs":{},"出":{"df":0,"docs":{},"了":{"df":0,"docs":{},"原":{"df":0,"docs":{},"因":{"df":0,"docs":{},":":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"257":{"tf":1.0}}}}}},"l":{"a":{"d":{"df":3,"docs":{"119":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"343":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"152":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"320":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":2.0}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"335":{"tf":1.0},"52":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"359":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"91":{"tf":2.23606797749979}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"343":{"tf":1.4142135623730951},"434":{"tf":1.0}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":11,"docs":{"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"120":{"tf":1.0},"137":{"tf":1.0},"286":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"51":{"tf":1.4142135623730951},"68":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"147":{"tf":1.0},"148":{"tf":2.449489742783178},"150":{"tf":1.7320508075688772}},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"\"":{")":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"5":{"0":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"\"":{")":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"5":{"0":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"0":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"150":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"147":{"tf":1.0},"148":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}}}},"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"334":{"tf":1.4142135623730951}}}},"df":2,"docs":{"334":{"tf":3.3166247903554},"335":{"tf":4.0}}}}}}},"df":20,"docs":{"140":{"tf":2.23606797749979},"141":{"tf":3.1622776601683795},"143":{"tf":1.7320508075688772},"183":{"tf":1.0},"191":{"tf":1.0},"193":{"tf":1.0},"240":{"tf":1.4142135623730951},"252":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"360":{"tf":2.8284271247461903},"68":{"tf":3.0},"69":{"tf":1.4142135623730951},"70":{"tf":2.23606797749979},"71":{"tf":2.6457513110645907},"72":{"tf":1.0},"73":{"tf":2.8284271247461903},"74":{"tf":5.196152422706632},"75":{"tf":3.605551275463989},"77":{"tf":2.23606797749979},"78":{"tf":3.872983346207417}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"229":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"228":{"tf":1.7320508075688772},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"<":{"'":{"a":{">":{"(":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"250":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"232":{"tf":1.7320508075688772},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"<":{"'":{"a":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"213":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"225":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":2.8284271247461903},"229":{"tf":3.3166247903554},"231":{"tf":1.7320508075688772},"232":{"tf":2.0},"248":{"tf":1.0},"250":{"tf":2.0},"252":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"214":{"tf":1.0}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":3,"docs":{"27":{"tf":2.0},"398":{"tf":2.0},"40":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"(":{"df":2,"docs":{"77":{"tf":1.0},"78":{"tf":1.0}}},"df":2,"docs":{"77":{"tf":1.0},"78":{"tf":1.0}}},"df":0,"docs":{}}}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}}}},"df":8,"docs":{"187":{"tf":1.4142135623730951},"318":{"tf":3.872983346207417},"322":{"tf":1.4142135623730951},"323":{"tf":2.0},"360":{"tf":2.6457513110645907},"368":{"tf":1.0},"54":{"tf":1.4142135623730951},"74":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":9,"docs":{"124":{"tf":1.4142135623730951},"125":{"tf":2.0},"167":{"tf":1.0},"382":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"42":{"tf":3.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"df":10,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"259":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":6,"docs":{"142":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.4142135623730951},"273":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":2,"docs":{"333":{"tf":1.4142135623730951},"335":{"tf":3.1622776601683795}}}}},"df":3,"docs":{"15":{"tf":1.0},"316":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}},"f":{".":{"0":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"378":{"tf":1.0}}}}}}},"df":3,"docs":{"280":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"378":{"tf":1.4142135623730951}}},"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951},"343":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":5,"docs":{"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"374":{"tf":1.4142135623730951}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":4,"docs":{"199":{"tf":2.0},"93":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}}}}}}},"i":{"df":4,"docs":{"183":{"tf":1.4142135623730951},"375":{"tf":1.0},"377":{"tf":1.0},"94":{"tf":1.0}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"331":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"331":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"331":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"o":{"c":{"df":3,"docs":{"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"x":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"239":{"tf":2.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"405":{"tf":1.7320508075688772},"407":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"289":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"289":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"239":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"341":{"tf":1.4142135623730951},"342":{"tf":2.449489742783178}},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"342":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"341":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"180":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"377":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"179":{"tf":1.0},"180":{"tf":1.7320508075688772},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"167":{"tf":1.0},"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"199":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"x":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"(":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":5,"docs":{"175":{"tf":1.7320508075688772},"183":{"tf":1.4142135623730951},"375":{"tf":1.0},"377":{"tf":1.0},"94":{"tf":1.0}}},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"(":{"2":{")":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"175":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"244":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"375":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"417":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"280":{"tf":1.0}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":37,"docs":{"101":{"tf":1.4142135623730951},"125":{"tf":1.0},"141":{"tf":1.4142135623730951},"167":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":1.0},"183":{"tf":1.7320508075688772},"191":{"tf":2.0},"192":{"tf":2.23606797749979},"239":{"tf":1.0},"242":{"tf":1.0},"244":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":2.0},"289":{"tf":3.1622776601683795},"290":{"tf":1.0},"293":{"tf":1.4142135623730951},"331":{"tf":1.7320508075688772},"339":{"tf":1.4142135623730951},"340":{"tf":1.0},"341":{"tf":2.8284271247461903},"342":{"tf":4.898979485566356},"343":{"tf":2.23606797749979},"374":{"tf":1.7320508075688772},"375":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"381":{"tf":3.4641016151377544},"382":{"tf":1.0},"407":{"tf":2.449489742783178},"408":{"tf":1.7320508075688772},"412":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":4.242640687119285},"94":{"tf":1.0},"95":{"tf":1.7320508075688772},"96":{"tf":2.0}},"、":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"115":{"tf":1.0}}}}}},")":{"df":0,"docs":{},"或":{"df":0,"docs":{},"者":{"df":0,"docs":{},"是":{"df":0,"docs":{},"获":{"df":0,"docs":{},"取":{"df":0,"docs":{},"所":{"df":0,"docs":{},"有":{"df":0,"docs":{},"权":{"df":0,"docs":{},"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"事":{"df":0,"docs":{},"实":{"df":0,"docs":{},"上":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"94":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"做":{"df":0,"docs":{},"出":{"df":0,"docs":{},"修":{"df":0,"docs":{},"改":{"df":0,"docs":{},"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"58":{"tf":1.0}}}}}}},"df":1,"docs":{"391":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"n":{"d":{"(":{"\"":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}},"df":0,"docs":{}}},"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"289":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"289":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}}},"df":18,"docs":{"289":{"tf":2.6457513110645907},"290":{"tf":1.0},"296":{"tf":1.0},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"306":{"tf":2.23606797749979},"307":{"tf":1.0},"308":{"tf":2.0},"309":{"tf":3.4641016151377544},"310":{"tf":2.0},"311":{"tf":2.6457513110645907},"312":{"tf":1.0},"319":{"tf":1.0},"370":{"tf":2.23606797749979},"381":{"tf":2.23606797749979},"405":{"tf":4.58257569495584},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"405":{"tf":4.358898943540674},"407":{"tf":3.4641016151377544},"408":{"tf":4.0}}}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"306":{"tf":1.7320508075688772}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"114":{"tf":2.0}},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"395":{"tf":1.0}}},"df":0,"docs":{}}},"df":19,"docs":{"111":{"tf":1.0},"260":{"tf":1.0},"316":{"tf":1.0},"395":{"tf":3.0},"396":{"tf":3.0},"397":{"tf":2.23606797749979},"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":2.23606797749979},"401":{"tf":2.0},"402":{"tf":2.23606797749979},"403":{"tf":3.0},"404":{"tf":3.1622776601683795},"405":{"tf":3.605551275463989},"406":{"tf":1.4142135623730951},"407":{"tf":1.0},"408":{"tf":2.8284271247461903},"409":{"tf":1.0},"429":{"tf":1.4142135623730951}}}},"i":{"c":{"df":1,"docs":{"151":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"289":{"tf":2.0}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":2,"docs":{"360":{"tf":1.0},"436":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"360":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"211":{"tf":2.449489742783178}}}}}},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"70":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":4,"docs":{"296":{"tf":1.0},"300":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951},"306":{"tf":2.449489742783178}}}}},"df":1,"docs":{"15":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":4,"docs":{"115":{"tf":1.0},"232":{"tf":1.0},"234":{"tf":1.0},"24":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":1,"docs":{"239":{"tf":2.449489742783178}}}}}}},"df":1,"docs":{"239":{"tf":2.0}}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}},"o":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"247":{"tf":2.0}},"e":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"247":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"247":{"tf":2.8284271247461903}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":1,"docs":{"247":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"247":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"416":{"tf":1.4142135623730951}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"83":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"197":{"tf":1.0},"202":{"tf":3.7416573867739413},"203":{"tf":1.0}},"i":{"c":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"202":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":3,"docs":{"196":{"tf":1.4142135623730951},"206":{"tf":2.0},"24":{"tf":1.0}},"n":{"df":1,"docs":{"106":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"406":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"408":{"tf":3.3166247903554}}}}},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"114":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"375":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"82":{"tf":2.8284271247461903},"83":{"tf":1.4142135623730951},"84":{"tf":2.8284271247461903},"87":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"186":{"tf":1.0},"228":{"tf":1.0}}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"328":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":4,"docs":{"300":{"tf":1.0},"303":{"tf":1.0},"396":{"tf":1.0},"405":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"398":{"tf":1.0}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"240":{"tf":1.0}}}}},"x":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"54":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":5,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.7320508075688772},"105":{"tf":2.0},"106":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"z":{"df":0,"docs":{},"e":{"d":{">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"247":{"tf":2.449489742783178},"273":{"tf":1.0},"334":{"tf":1.0},"383":{"tf":3.0},"386":{"tf":1.4142135623730951},"405":{"tf":5.0},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178},"417":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"318":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":2.8284271247461903},"323":{"tf":1.0},"404":{"tf":2.23606797749979},"405":{"tf":2.6457513110645907},"408":{"tf":1.4142135623730951}}}}},"i":{"c":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"368":{"tf":1.0}}}}},"r":{"df":1,"docs":{"368":{"tf":1.0}}}},"df":1,"docs":{"368":{"tf":2.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":39,"docs":{"139":{"tf":2.23606797749979},"141":{"tf":2.0},"143":{"tf":2.449489742783178},"145":{"tf":1.4142135623730951},"150":{"tf":1.0},"162":{"tf":2.0},"170":{"tf":1.7320508075688772},"172":{"tf":2.23606797749979},"175":{"tf":1.0},"186":{"tf":2.6457513110645907},"188":{"tf":1.4142135623730951},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":2.0},"194":{"tf":1.0},"222":{"tf":1.0},"224":{"tf":1.4142135623730951},"228":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"242":{"tf":2.0},"249":{"tf":2.449489742783178},"252":{"tf":1.0},"281":{"tf":2.0},"340":{"tf":1.4142135623730951},"341":{"tf":1.0},"342":{"tf":1.0},"368":{"tf":5.291502622129181},"369":{"tf":1.0},"383":{"tf":1.7320508075688772},"389":{"tf":1.0},"404":{"tf":1.0},"417":{"tf":1.0},"422":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":2.6457513110645907},"78":{"tf":6.708203932499369},"79":{"tf":2.8284271247461903},"80":{"tf":1.4142135623730951},"87":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"[":{"_":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"这":{"df":0,"docs":{},"也":{"df":0,"docs":{},"就":{"df":0,"docs":{},"是":{"df":0,"docs":{},"为":{"df":0,"docs":{},"什":{"df":0,"docs":{},"么":{"df":0,"docs":{},"字":{"df":0,"docs":{},"符":{"df":0,"docs":{},"串":{"df":0,"docs":{},"字":{"df":0,"docs":{},"面":{"df":0,"docs":{},"值":{"df":0,"docs":{},"是":{"df":0,"docs":{},"不":{"df":0,"docs":{},"可":{"df":0,"docs":{},"变":{"df":0,"docs":{},"的":{"df":0,"docs":{},";":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"78":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}},",":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"w":{"(":{"\"":{"a":{"df":1,"docs":{"322":{"tf":3.0}}},"b":{"df":1,"docs":{"322":{"tf":3.4641016151377544}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}},"df":0,"docs":{}}},"df":3,"docs":{"321":{"tf":1.4142135623730951},"322":{"tf":2.8284271247461903},"323":{"tf":1.7320508075688772}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}}},"_":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"199":{"tf":2.23606797749979}}}}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":50,"docs":{"101":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"125":{"tf":2.0},"167":{"tf":1.4142135623730951},"183":{"tf":1.0},"199":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":2.0},"226":{"tf":2.0},"232":{"tf":1.0},"249":{"tf":1.7320508075688772},"257":{"tf":1.0},"258":{"tf":2.0},"260":{"tf":1.0},"266":{"tf":1.4142135623730951},"267":{"tf":1.0},"289":{"tf":1.0},"303":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"323":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":2.8284271247461903},"343":{"tf":1.0},"374":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.7320508075688772},"383":{"tf":1.7320508075688772},"391":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.4142135623730951},"404":{"tf":1.7320508075688772},"405":{"tf":4.58257569495584},"407":{"tf":1.0},"408":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"395":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"260":{"tf":1.0},"330":{"tf":1.0},"434":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"(":{"&":{"1":{"df":1,"docs":{"244":{"tf":1.0}}},"2":{"df":1,"docs":{"244":{"tf":1.0}}},"3":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"134":{"tf":1.0}}}}},"'":{"d":{"df":1,"docs":{"162":{"tf":1.0}}},"df":1,"docs":{"102":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"360":{"tf":1.0}}},"df":0,"docs":{}},"3":{"df":0,"docs":{},"u":{"8":{"df":1,"docs":{"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"4":{"df":1,"docs":{"361":{"tf":1.4142135623730951}}},"5":{".":{"0":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"0":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}}},"df":7,"docs":{"102":{"tf":1.4142135623730951},"105":{"tf":2.6457513110645907},"106":{"tf":1.0},"176":{"tf":1.0},"356":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"361":{"tf":1.7320508075688772}}},"_":{"df":1,"docs":{"360":{"tf":2.0}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":5,"docs":{"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"348":{"tf":1.0}}}}}}},"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":2.449489742783178}},"f":{"6":{"4":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"3":{"2":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"105":{"tf":3.0},"106":{"tf":2.0},"347":{"tf":1.7320508075688772},"356":{"tf":1.0},"361":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"x":{")":{"df":0,"docs":{},",":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":1,"docs":{"108":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":1,"docs":{"361":{"tf":1.4142135623730951}},"o":{"d":{"df":1,"docs":{"294":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"239":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"s":{".":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"374":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":4,"docs":{"102":{"tf":1.7320508075688772},"105":{"tf":1.0},"174":{"tf":1.0},"382":{"tf":1.0}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"319":{"tf":2.0},"320":{"tf":2.6457513110645907},"324":{"tf":2.23606797749979},"331":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"382":{"tf":1.0}}},"x":{"df":3,"docs":{"242":{"tf":1.0},"353":{"tf":3.1622776601683795},"361":{"tf":2.0}}}},"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"390":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"71":{"tf":1.4142135623730951}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"390":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"353":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":4,"docs":{"71":{"tf":1.4142135623730951},"72":{"tf":2.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"73":{"tf":1.4142135623730951},"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.4142135623730951},"235":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"194":{"tf":1.0}}},"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"87":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"df":5,"docs":{"229":{"tf":1.0},"268":{"tf":1.4142135623730951},"59":{"tf":1.0},"61":{"tf":1.4142135623730951},"94":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"1":{"2":{"3":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},",":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"242":{"tf":3.1622776601683795}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"242":{"tf":1.4142135623730951}},"e":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":1,"docs":{"242":{"tf":2.0}}}}}}},"df":1,"docs":{"242":{"tf":1.0}}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"51":{"tf":3.0}},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"51":{"tf":1.7320508075688772}}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"51":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":1,"docs":{"391":{"tf":1.0}}},"w":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"f":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}},"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"318":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":3,"docs":{"298":{"tf":5.291502622129181},"306":{"tf":1.0},"405":{"tf":1.7320508075688772}}}}},"d":{"df":0,"docs":{},"x":{"df":1,"docs":{"260":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"376":{"tf":2.0}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"211":{"tf":1.0}},"i":{"df":5,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"376":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"368":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":1,"docs":{"368":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"376":{"tf":1.4142135623730951}},"。":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"376":{"tf":1.0}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"136":{"tf":1.0},"333":{"tf":1.0}},"l":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"(":{"1":{"0":{".":{"1":{"2":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"3":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"136":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"q":{"df":1,"docs":{"96":{"tf":1.4142135623730951}},"l":{"!":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"393":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"393":{"tf":1.0}}}}}}}},"df":1,"docs":{"393":{"tf":2.0}}},"u":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"88":{"tf":1.7320508075688772},"89":{"tf":1.0},"90":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"c":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"111":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"127":{"tf":2.6457513110645907},"128":{"tf":1.0}}}},"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"127":{"tf":1.0},"128":{"tf":1.0}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":2.0}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.4142135623730951}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":64,"docs":{"111":{"tf":1.7320508075688772},"113":{"tf":1.0},"114":{"tf":1.7320508075688772},"115":{"tf":1.0},"116":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"128":{"tf":1.0},"167":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"191":{"tf":1.0},"198":{"tf":3.0},"199":{"tf":2.6457513110645907},"200":{"tf":1.7320508075688772},"201":{"tf":1.7320508075688772},"202":{"tf":2.23606797749979},"206":{"tf":1.7320508075688772},"207":{"tf":2.0},"208":{"tf":1.7320508075688772},"210":{"tf":1.4142135623730951},"211":{"tf":2.23606797749979},"221":{"tf":1.0},"226":{"tf":2.6457513110645907},"227":{"tf":1.0},"228":{"tf":2.0},"229":{"tf":2.23606797749979},"231":{"tf":1.0},"232":{"tf":2.449489742783178},"244":{"tf":1.0},"245":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":2.0},"250":{"tf":1.4142135623730951},"257":{"tf":2.449489742783178},"258":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"289":{"tf":1.7320508075688772},"290":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"334":{"tf":2.0},"335":{"tf":1.0},"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"374":{"tf":1.0},"375":{"tf":1.0},"389":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.4142135623730951},"405":{"tf":3.605551275463989},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"s":{":":{"1":{"1":{":":{"9":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"1":{"3":{"df":1,"docs":{"202":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":2,"docs":{"200":{"tf":1.0},"201":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"9":{"df":1,"docs":{"198":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"9":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"2":{"5":{"df":1,"docs":{"386":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"6":{":":{"4":{"2":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"5":{"1":{"df":1,"docs":{"228":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"199":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"5":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{":":{"9":{"df":1,"docs":{"116":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"4":{":":{"9":{"df":1,"docs":{"228":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"3":{"3":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"5":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"5":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"2":{":":{"1":{"3":{"df":1,"docs":{"407":{"tf":1.0}}},"df":0,"docs":{}},"2":{"7":{"df":1,"docs":{"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"1":{"3":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"0":{":":{"5":{"3":{"df":1,"docs":{"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"2":{":":{"2":{"2":{"df":1,"docs":{"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"5":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"2":{"8":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"3":{"7":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"9":{"0":{"6":{":":{"4":{"df":1,"docs":{"159":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":148,"docs":{"111":{"tf":2.0},"113":{"tf":1.7320508075688772},"114":{"tf":1.0},"117":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.4142135623730951},"127":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"175":{"tf":1.7320508075688772},"176":{"tf":1.0},"186":{"tf":1.4142135623730951},"188":{"tf":1.7320508075688772},"189":{"tf":1.4142135623730951},"190":{"tf":1.0},"211":{"tf":2.0},"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":2.0},"226":{"tf":2.449489742783178},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"235":{"tf":1.0},"239":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"246":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"258":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979},"298":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":2.23606797749979},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"32":{"tf":1.7320508075688772},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"33":{"tf":1.4142135623730951},"335":{"tf":1.7320508075688772},"337":{"tf":1.0},"343":{"tf":1.4142135623730951},"348":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":2.0},"360":{"tf":2.0},"361":{"tf":1.0},"368":{"tf":1.0},"369":{"tf":1.4142135623730951},"375":{"tf":1.0},"376":{"tf":2.449489742783178},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"385":{"tf":1.0},"391":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"40":{"tf":1.4142135623730951},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.449489742783178},"408":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"414":{"tf":1.0},"42":{"tf":1.4142135623730951},"427":{"tf":2.0},"428":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":2.0},"51":{"tf":1.0},"53":{"tf":2.0},"54":{"tf":2.449489742783178},"55":{"tf":1.4142135623730951},"56":{"tf":1.7320508075688772},"57":{"tf":1.7320508075688772},"58":{"tf":1.7320508075688772},"59":{"tf":1.4142135623730951},"61":{"tf":2.6457513110645907},"62":{"tf":2.449489742783178},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"75":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"78":{"tf":1.7320508075688772},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"96":{"tf":1.0}},"s":{":":{"1":{"0":{":":{"1":{"0":{"df":1,"docs":{"299":{"tf":1.0}}},"6":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"2":{"6":{"df":1,"docs":{"301":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{":":{"1":{"6":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"285":{"tf":1.0}}},"6":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"189":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"2":{"8":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{":":{"1":{"9":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"7":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"1":{"4":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"3":{"0":{"df":1,"docs":{"242":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"1":{"9":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"225":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{":":{"2":{"3":{"df":1,"docs":{"377":{"tf":1.0}}},"df":0,"docs":{}},"4":{"3":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{":":{"2":{"9":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"2":{"1":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{":":{"7":{"df":1,"docs":{"377":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"1":{"3":{"df":1,"docs":{"224":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"2":{"1":{"df":1,"docs":{"224":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"4":{"7":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"3":{"df":2,"docs":{"428":{"tf":1.0},"57":{"tf":1.0}}},"4":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"2":{"8":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"155":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"353":{"tf":1.0}}},"9":{"df":2,"docs":{"351":{"tf":1.0},"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{":":{"1":{"3":{"df":1,"docs":{"289":{"tf":1.0}}},"4":{"df":1,"docs":{"51":{"tf":1.0}}},"5":{"df":2,"docs":{"106":{"tf":1.0},"87":{"tf":1.0}}},"6":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"377":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{":":{"3":{"7":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"2":{"4":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"2":{"df":1,"docs":{"87":{"tf":1.0}}},"9":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}},"2":{"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"61":{"tf":1.0}}},"8":{"df":1,"docs":{"162":{"tf":1.0}}},"9":{"df":1,"docs":{"159":{"tf":1.0}}},"df":1,"docs":{"414":{"tf":1.0}}},"5":{"df":4,"docs":{"156":{"tf":1.4142135623730951},"246":{"tf":1.0},"368":{"tf":1.0},"49":{"tf":1.0}}},"6":{"df":1,"docs":{"156":{"tf":1.0}}},"8":{"df":1,"docs":{"61":{"tf":1.0}}},"9":{"df":1,"docs":{"427":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{":":{"1":{"4":{"df":1,"docs":{"74":{"tf":1.0}}},"5":{"df":1,"docs":{"70":{"tf":1.0}}},"6":{"df":1,"docs":{"75":{"tf":1.0}}},"7":{"df":2,"docs":{"102":{"tf":1.0},"172":{"tf":1.0}}},"df":0,"docs":{}},"2":{"2":{"df":1,"docs":{"360":{"tf":1.0}}},"6":{"df":1,"docs":{"335":{"tf":1.0}}},"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"1":{"3":{"df":1,"docs":{"185":{"tf":1.0}}},"4":{"df":1,"docs":{"74":{"tf":1.0}}},"8":{"df":1,"docs":{"299":{"tf":1.0}}},"df":1,"docs":{"316":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"368":{"tf":1.0}}},"2":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"188":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":2,"docs":{"134":{"tf":1.0},"277":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"2":{"4":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}},"3":{"8":{"df":1,"docs":{"173":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"2":{"3":{"df":1,"docs":{"157":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":2,"docs":{"73":{"tf":1.0},"75":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"3":{"3":{"df":1,"docs":{"186":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":9,"docs":{"111":{"tf":1.0},"113":{"tf":1.0},"127":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":2.0},"26":{"tf":2.23606797749979},"265":{"tf":1.0},"266":{"tf":1.4142135623730951},"400":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"433":{"tf":1.0}}}},"l":{"df":2,"docs":{"434":{"tf":2.23606797749979},"436":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"154":{"tf":1.0},"156":{"tf":1.0},"293":{"tf":1.0},"54":{"tf":1.0},"66":{"tf":1.4142135623730951}},")":{"df":0,"docs":{},"与":{"df":0,"docs":{},"堆":{"df":0,"docs":{},"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"66":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"233":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{},"t":{".":{".":{"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"321":{"tf":1.7320508075688772},"322":{"tf":3.7416573867739413}},"e":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"78":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"321":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"104":{"tf":2.23606797749979},"108":{"tf":1.4142135623730951},"296":{"tf":1.0},"306":{"tf":2.8284271247461903},"337":{"tf":1.0},"338":{"tf":3.605551275463989},"339":{"tf":2.449489742783178},"340":{"tf":2.23606797749979},"341":{"tf":4.358898943540674},"342":{"tf":8.0},"343":{"tf":2.449489742783178}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":21,"docs":{"193":{"tf":3.0},"224":{"tf":2.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"299":{"tf":1.0},"336":{"tf":1.0},"369":{"tf":2.23606797749979},"381":{"tf":2.23606797749979},"405":{"tf":4.358898943540674},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178},"412":{"tf":1.0},"417":{"tf":1.4142135623730951},"52":{"tf":1.0},"75":{"tf":1.7320508075688772}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"434":{"tf":1.0}}}}},"u":{"df":2,"docs":{"385":{"tf":1.0},"399":{"tf":1.4142135623730951}},"s":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"385":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"401":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"y":{"df":1,"docs":{"240":{"tf":1.0}}}},"d":{":":{":":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"125":{"tf":1.0},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{">":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"172":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":6,"docs":{"121":{"tf":1.0},"124":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":3,"docs":{"215":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"249":{"tf":1.0}},"s":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"215":{"tf":1.7320508075688772},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"232":{"tf":1.4142135623730951},"235":{"tf":1.0},"249":{"tf":2.23606797749979},"250":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"162":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"f":{"6":{"4":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"161":{"tf":1.0},"218":{"tf":1.4142135623730951},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":4,"docs":{"183":{"tf":1.0},"194":{"tf":1.0},"377":{"tf":2.0},"91":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"121":{"tf":1.0},"122":{"tf":1.0},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"381":{"tf":1.7320508075688772}}}},"s":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":7,"docs":{"157":{"tf":1.7320508075688772},"158":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"174":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"316":{"tf":1.0},"320":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"398":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"157":{"tf":1.0},"162":{"tf":1.4142135623730951},"174":{"tf":1.0},"381":{"tf":2.23606797749979},"398":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"。":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.0}}}}}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"218":{"tf":1.0}}}}},"t":{">":{"df":0,"docs":{},";":{"df":0,"docs":{},"也":{"df":0,"docs":{},"就":{"df":0,"docs":{},"是":{"df":0,"docs":{},"说":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.7320508075688772}}}}}},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"125":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"121":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":2.23606797749979},"161":{"tf":1.0},"167":{"tf":1.0},"33":{"tf":2.23606797749979},"34":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.0},"37":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{":":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"319":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"165":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"397":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"397":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"375":{"tf":1.0}},"s":{":":{":":{"a":{"d":{"d":{"df":1,"docs":{"375":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"224":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"224":{"tf":1.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"r":{"c":{":":{":":{"df":0,"docs":{},"r":{"c":{"df":6,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"306":{"tf":1.0}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"n":{"c":{":":{":":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"349":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}}}}}},"{":{"a":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"349":{"tf":1.0}}}}}},"df":1,"docs":{"318":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"240":{"tf":1.0},"241":{"tf":1.0},"298":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.4142135623730951},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":1.7320508075688772},"405":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{":":{":":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":9,"docs":{"240":{"tf":1.0},"298":{"tf":1.7320508075688772},"302":{"tf":1.0},"303":{"tf":1.0},"318":{"tf":1.7320508075688772},"319":{"tf":2.0},"320":{"tf":1.7320508075688772},"321":{"tf":1.0},"323":{"tf":1.0}}}}},"df":0,"docs":{},"{":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"{":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"125":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"320":{"tf":1.0},"323":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"322":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":13,"docs":{"124":{"tf":1.7320508075688772},"125":{"tf":1.0},"320":{"tf":1.4142135623730951},"33":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":2,"docs":{"233":{"tf":1.0},"91":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"233":{"tf":1.0}}},"df":0,"docs":{}}},"df":10,"docs":{"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"228":{"tf":1.0},"233":{"tf":1.0},"290":{"tf":1.0},"91":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"0":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"185":{"tf":1.0},"188":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"385":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"1":{"df":1,"docs":{"239":{"tf":1.0}}},"2":{"df":1,"docs":{"239":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"239":{"tf":1.4142135623730951},"405":{"tf":1.0}}}}},"r":{"df":43,"docs":{"119":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"145":{"tf":1.4142135623730951},"162":{"tf":1.0},"186":{"tf":3.0},"188":{"tf":3.0},"189":{"tf":2.449489742783178},"190":{"tf":1.0},"191":{"tf":4.0},"192":{"tf":2.449489742783178},"193":{"tf":1.0},"194":{"tf":1.7320508075688772},"201":{"tf":1.7320508075688772},"221":{"tf":1.4142135623730951},"224":{"tf":2.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":3.1622776601683795},"229":{"tf":4.0},"231":{"tf":2.0},"232":{"tf":5.291502622129181},"249":{"tf":4.58257569495584},"250":{"tf":3.3166247903554},"281":{"tf":2.449489742783178},"289":{"tf":2.6457513110645907},"290":{"tf":1.4142135623730951},"316":{"tf":3.0},"320":{"tf":1.0},"322":{"tf":2.0},"339":{"tf":1.4142135623730951},"340":{"tf":1.4142135623730951},"341":{"tf":1.4142135623730951},"342":{"tf":2.8284271247461903},"343":{"tf":2.0},"369":{"tf":1.0},"383":{"tf":3.872983346207417},"414":{"tf":2.449489742783178},"51":{"tf":1.0},"61":{"tf":1.0},"78":{"tf":3.3166247903554},"87":{"tf":3.0}},"e":{"a":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":9,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{")":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":7,"docs":{"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"325":{"tf":1.4142135623730951}}}}}}},"df":12,"docs":{"323":{"tf":1.4142135623730951},"324":{"tf":3.7416573867739413},"325":{"tf":1.7320508075688772},"397":{"tf":2.23606797749979},"398":{"tf":2.23606797749979},"399":{"tf":2.0},"400":{"tf":1.7320508075688772},"401":{"tf":2.449489742783178},"402":{"tf":1.7320508075688772},"404":{"tf":1.7320508075688772},"405":{"tf":3.0},"408":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"324":{"tf":2.0},"325":{"tf":1.0}}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"1":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"194":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":2.8284271247461903},"189":{"tf":1.4142135623730951},"194":{"tf":1.0}}},"2":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"188":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"186":{"tf":2.0},"188":{"tf":3.4641016151377544},"189":{"tf":2.0},"194":{"tf":1.4142135623730951}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"180":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{":":{"1":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"c":{"d":{"df":4,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":1.0},"189":{"tf":1.4142135623730951},"194":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"148":{"tf":1.0},"149":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":1.4142135623730951}}}}}}}},"d":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"r":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"149":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"r":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":4,"docs":{"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":2.6457513110645907}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"319":{"tf":2.0},"320":{"tf":2.449489742783178}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":14,"docs":{"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.7320508075688772},"191":{"tf":1.0},"201":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"70":{"tf":2.23606797749979},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":2.0},"74":{"tf":2.23606797749979},"75":{"tf":1.7320508075688772},"77":{"tf":1.0},"78":{"tf":2.6457513110645907}}}}}},"i":{"df":6,"docs":{"300":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907}}},"o":{"df":0,"docs":{},"l":{"a":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"179":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"140":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"141":{"tf":1.0}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"188":{"tf":1.4142135623730951}}}}}},"m":{"a":{"df":0,"docs":{},"y":{"b":{"df":1,"docs":{"335":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}},"i":{"df":1,"docs":{"283":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}}},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"335":{"tf":1.0}}}},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"335":{"tf":1.0}}},"l":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"283":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"180":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}}}},"r":{"df":1,"docs":{"189":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"247":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"82":{"tf":1.7320508075688772},"83":{"tf":1.0},"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"1":{"2":{"3":{"df":3,"docs":{"82":{"tf":1.7320508075688772},"83":{"tf":1.0},"84":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}}},"t":{"a":{"c":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"141":{"tf":1.4142135623730951}},"h":{"df":4,"docs":{"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":2.449489742783178}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"302":{"tf":1.0},"303":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"141":{"tf":1.0},"378":{"tf":1.0}}},"df":0,"docs":{}}}}},"x":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":1,"docs":{"188":{"tf":1.7320508075688772}}}}},"y":{"df":4,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178},"335":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"72":{"tf":1.0}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":7,"docs":{"140":{"tf":3.0},"142":{"tf":3.7416573867739413},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"182":{"tf":2.0},"70":{"tf":1.0},"96":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":25,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"140":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"167":{"tf":1.0},"223":{"tf":1.0},"33":{"tf":2.0},"338":{"tf":1.0},"339":{"tf":1.0},"34":{"tf":1.7320508075688772},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"`":{"df":1,"docs":{"191":{"tf":1.0}}},"df":89,"docs":{"101":{"tf":2.23606797749979},"119":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"137":{"tf":1.0},"138":{"tf":2.0},"139":{"tf":2.23606797749979},"140":{"tf":2.8284271247461903},"141":{"tf":4.242640687119285},"142":{"tf":2.8284271247461903},"144":{"tf":1.0},"145":{"tf":2.449489742783178},"147":{"tf":1.0},"149":{"tf":1.0},"160":{"tf":1.7320508075688772},"161":{"tf":1.4142135623730951},"169":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":3.0},"180":{"tf":4.242640687119285},"181":{"tf":3.1622776601683795},"182":{"tf":4.242640687119285},"183":{"tf":1.0},"186":{"tf":1.7320508075688772},"188":{"tf":3.0},"189":{"tf":1.7320508075688772},"190":{"tf":1.0},"191":{"tf":1.7320508075688772},"194":{"tf":1.0},"196":{"tf":1.0},"201":{"tf":1.7320508075688772},"202":{"tf":1.0},"203":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"221":{"tf":1.0},"222":{"tf":2.449489742783178},"223":{"tf":2.0},"224":{"tf":3.0},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.7416573867739413},"240":{"tf":2.449489742783178},"242":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":4.123105625617661},"250":{"tf":2.6457513110645907},"252":{"tf":1.0},"270":{"tf":1.4142135623730951},"281":{"tf":2.6457513110645907},"283":{"tf":1.7320508075688772},"289":{"tf":1.0},"301":{"tf":1.0},"316":{"tf":1.0},"325":{"tf":1.4142135623730951},"335":{"tf":2.449489742783178},"338":{"tf":1.4142135623730951},"339":{"tf":1.4142135623730951},"34":{"tf":2.23606797749979},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":2.23606797749979},"360":{"tf":1.4142135623730951},"376":{"tf":3.1622776601683795},"377":{"tf":1.4142135623730951},"380":{"tf":1.0},"391":{"tf":1.0},"398":{"tf":1.0},"42":{"tf":2.23606797749979},"45":{"tf":1.0},"52":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":2.6457513110645907},"70":{"tf":3.7416573867739413},"71":{"tf":1.0},"72":{"tf":2.23606797749979},"73":{"tf":3.605551275463989},"74":{"tf":1.0},"75":{"tf":3.0},"77":{"tf":3.605551275463989},"78":{"tf":4.898979485566356},"82":{"tf":3.1622776601683795},"83":{"tf":2.0},"84":{"tf":2.449489742783178},"87":{"tf":1.4142135623730951},"91":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"391":{"tf":1.7320508075688772}}},"y":{"!":{"(":{"#":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"142":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"m":{"d":{"df":1,"docs":{"138":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"这":{"df":0,"docs":{},"就":{"df":0,"docs":{},"非":{"df":0,"docs":{},"常":{"df":0,"docs":{},"清":{"df":0,"docs":{},"楚":{"df":0,"docs":{},"地":{"df":0,"docs":{},"表":{"df":0,"docs":{},"明":{"df":0,"docs":{},",":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"74":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},",":{"df":0,"docs":{},"这":{"df":0,"docs":{},"可":{"df":0,"docs":{},"不":{"df":0,"docs":{},"对":{"df":0,"docs":{},"!":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"75":{"tf":1.0}}}}}}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"286":{"tf":1.0},"294":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":2.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"252":{"tf":1.0}}}}}}}}},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"391":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"416":{"tf":1.0}}}}}},"df":77,"docs":{"101":{"tf":3.0},"113":{"tf":1.0},"119":{"tf":1.0},"167":{"tf":1.0},"173":{"tf":1.7320508075688772},"175":{"tf":1.7320508075688772},"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.4142135623730951},"182":{"tf":2.0},"183":{"tf":1.0},"190":{"tf":1.0},"192":{"tf":1.4142135623730951},"199":{"tf":2.0},"202":{"tf":2.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.7320508075688772},"289":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"324":{"tf":1.0},"331":{"tf":1.4142135623730951},"334":{"tf":1.7320508075688772},"335":{"tf":2.0},"338":{"tf":1.4142135623730951},"339":{"tf":1.4142135623730951},"340":{"tf":1.4142135623730951},"341":{"tf":1.7320508075688772},"342":{"tf":3.4641016151377544},"343":{"tf":2.449489742783178},"353":{"tf":1.0},"359":{"tf":2.0},"360":{"tf":1.0},"371":{"tf":1.0},"374":{"tf":1.0},"375":{"tf":1.7320508075688772},"376":{"tf":2.449489742783178},"377":{"tf":1.4142135623730951},"378":{"tf":1.0},"391":{"tf":2.23606797749979},"405":{"tf":4.898979485566356},"407":{"tf":3.0},"408":{"tf":2.449489742783178},"412":{"tf":1.0},"417":{"tf":1.7320508075688772},"80":{"tf":1.0},"81":{"tf":1.4142135623730951},"82":{"tf":2.23606797749979},"83":{"tf":1.0},"84":{"tf":1.7320508075688772},"85":{"tf":2.0},"86":{"tf":1.7320508075688772},"87":{"tf":2.23606797749979},"90":{"tf":1.0},"91":{"tf":1.7320508075688772},"93":{"tf":1.4142135623730951},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":3,"docs":{"81":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"81":{"tf":1.0}}}},",":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"137":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"。":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":0,"docs":{},"当":{"a":{"d":{"d":{"df":0,"docs":{},"函":{"df":0,"docs":{},"数":{"df":0,"docs":{},"被":{"df":0,"docs":{},"调":{"df":0,"docs":{},"用":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},",":{"df":0,"docs":{},"它":{"df":0,"docs":{},"通":{"df":0,"docs":{},"常":{"df":0,"docs":{},"以":{"df":0,"docs":{},"被":{"df":0,"docs":{},"借":{"df":0,"docs":{},"用":{"df":0,"docs":{},"的":{"df":0,"docs":{},"形":{"df":0,"docs":{},"式":{"df":0,"docs":{},"出":{"df":0,"docs":{},"现":{"df":0,"docs":{},",":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"429":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":2,"docs":{"137":{"tf":1.0},"283":{"tf":2.0}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"289":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"247":{"tf":2.449489742783178}}}}}},"u":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":2,"docs":{"368":{"tf":1.0},"416":{"tf":1.0}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"86":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"202":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"h":{"df":2,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{":":{":":{"<":{"df":0,"docs":{},"i":{"6":{"4":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"102":{"tf":1.4142135623730951},"245":{"tf":2.23606797749979},"53":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"178":{"tf":1.7320508075688772},"179":{"tf":1.4142135623730951},"180":{"tf":3.0},"181":{"tf":2.0},"332":{"tf":1.7320508075688772}},"i":{"df":6,"docs":{"178":{"tf":2.0},"179":{"tf":3.1622776601683795},"180":{"tf":3.872983346207417},"181":{"tf":3.7416573867739413},"182":{"tf":3.3166247903554},"332":{"tf":1.7320508075688772}},"z":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":5,"docs":{"178":{"tf":1.4142135623730951},"179":{"tf":1.7320508075688772},"180":{"tf":2.0},"181":{"tf":1.7320508075688772},"182":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"180":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"180":{"tf":2.23606797749979}},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{">":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"1":{"df":1,"docs":{"181":{"tf":1.0}}},"df":1,"docs":{"181":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"119":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"*":{";":{"df":0,"docs":{},"。":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"417":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":22,"docs":{"118":{"tf":2.6457513110645907},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.7320508075688772},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"266":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"412":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"366":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.0}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"a":{"df":1,"docs":{"431":{"tf":1.0}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"182":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"120":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"391":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":8,"docs":{"296":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":2.23606797749979},"309":{"tf":1.0},"310":{"tf":3.4641016151377544},"311":{"tf":2.6457513110645907},"312":{"tf":1.0},"370":{"tf":2.23606797749979}}},"df":1,"docs":{"391":{"tf":2.8284271247461903}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"381":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"d":{"df":5,"docs":{"171":{"tf":1.0},"184":{"tf":1.0},"315":{"tf":1.0},"354":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}}},"df":6,"docs":{"191":{"tf":1.0},"376":{"tf":1.0},"391":{"tf":1.4142135623730951},"69":{"tf":1.0},"84":{"tf":1.0},"93":{"tf":1.0}},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"超":{"df":0,"docs":{},"(":{"df":0,"docs":{},"父":{"df":0,"docs":{},")":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"364":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"102":{"tf":1.4142135623730951},"110":{"tf":1.0}},",":{"df":0,"docs":{},"v":{"c":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"t":{">":{"(":{"df":0,"docs":{},"f":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}},":":{":":{".":{".":{".":{"df":0,"docs":{},",":{"<":{"[":{"df":0,"docs":{},"t":{"df":1,"docs":{"417":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"]":{">":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":1,"docs":{"23":{"tf":1.0}},"l":{"df":1,"docs":{"151":{"tf":1.0}}}},"c":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"431":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"293":{"tf":1.7320508075688772},"58":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":5,"docs":{"299":{"tf":1.4142135623730951},"341":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":2.0},"408":{"tf":1.4142135623730951}},"s":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"(":{"a":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"72":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"2":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"72":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"f":{"df":1,"docs":{"381":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"(":{"df":1,"docs":{"71":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"71":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"71":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"df":4,"docs":{"231":{"tf":1.4142135623730951},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"df":59,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.4142135623730951},"261":{"tf":1.0},"266":{"tf":2.23606797749979},"267":{"tf":1.0},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}},"/":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"/":{"a":{"d":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"61":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":3,"docs":{"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"/":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.4142135623730951}}}}},"df":6,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"211":{"tf":1.0}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"202":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"211":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":3,"docs":{"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"157":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":6,"docs":{"32":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"405":{"tf":1.0},"408":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"246":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":1.7320508075688772}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"216":{"tf":2.23606797749979},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.0}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"350":{"tf":1.0},"353":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":3,"docs":{"242":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"239":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"49":{"tf":1.0},"51":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"27":{"tf":1.0},"28":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"c":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"28":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"\\":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"\\":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"265":{"tf":2.449489742783178},"266":{"tf":1.0},"280":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951}}}}}},"s":{"df":0,"docs":{},"k":{"df":2,"docs":{"315":{"tf":1.0},"318":{"tf":6.4031242374328485}}}}},"c":{"df":0,"docs":{},"p":{"df":4,"docs":{"395":{"tf":1.4142135623730951},"396":{"tf":2.23606797749979},"397":{"tf":2.449489742783178},"398":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"397":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"\"":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{":":{"7":{"8":{"7":{"8":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":9,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":9,"docs":{"397":{"tf":1.4142135623730951},"398":{"tf":1.7320508075688772},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":2.0},"402":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}}},"df":0,"docs":{}}}}}}},"d":{"d":{"df":3,"docs":{"227":{"tf":1.4142135623730951},"228":{"tf":1.0},"231":{"tf":1.0}}},"df":0,"docs":{}},"df":30,"docs":{"102":{"tf":2.8284271247461903},"105":{"tf":1.0},"157":{"tf":1.7320508075688772},"160":{"tf":1.0},"172":{"tf":4.0},"173":{"tf":3.3166247903554},"174":{"tf":2.449489742783178},"175":{"tf":3.4641016151377544},"181":{"tf":2.8284271247461903},"183":{"tf":2.449489742783178},"194":{"tf":2.23606797749979},"232":{"tf":1.0},"239":{"tf":2.0},"242":{"tf":2.449489742783178},"279":{"tf":2.0},"280":{"tf":1.7320508075688772},"281":{"tf":2.449489742783178},"282":{"tf":2.8284271247461903},"289":{"tf":4.58257569495584},"290":{"tf":2.6457513110645907},"310":{"tf":1.4142135623730951},"334":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"382":{"tf":1.7320508075688772},"383":{"tf":3.0},"405":{"tf":2.6457513110645907},"417":{"tf":2.6457513110645907},"424":{"tf":1.0},"53":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"148":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"218":{"tf":2.0},"225":{"tf":1.4142135623730951},"232":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"$":{"df":0,"docs":{},"x":{"df":1,"docs":{"389":{"tf":1.0}}}},"1":{"df":1,"docs":{"389":{"tf":1.0}}},"2":{"df":1,"docs":{"389":{"tf":1.0}}},"3":{"df":1,"docs":{"389":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"389":{"tf":2.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":42,"docs":{"126":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":6.708203932499369},"199":{"tf":5.830951894845301},"200":{"tf":4.358898943540674},"201":{"tf":4.242640687119285},"202":{"tf":5.477225575051661},"203":{"tf":1.7320508075688772},"204":{"tf":2.6457513110645907},"205":{"tf":2.0},"206":{"tf":4.358898943540674},"207":{"tf":5.385164807134504},"208":{"tf":5.0990195135927845},"209":{"tf":1.7320508075688772},"210":{"tf":3.3166247903554},"211":{"tf":7.483314773547883},"217":{"tf":2.0},"227":{"tf":1.4142135623730951},"228":{"tf":3.3166247903554},"229":{"tf":4.242640687119285},"231":{"tf":1.7320508075688772},"232":{"tf":4.795831523312719},"244":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"249":{"tf":3.0},"250":{"tf":2.23606797749979},"252":{"tf":1.4142135623730951},"257":{"tf":2.6457513110645907},"266":{"tf":4.898979485566356},"289":{"tf":2.6457513110645907},"290":{"tf":2.8284271247461903},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"197":{"tf":1.0},"204":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":2.23606797749979}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":3.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"o":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"198":{"tf":2.23606797749979}}}}}}},"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"208":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"198":{"tf":1.4142135623730951}}}}}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"_":{"1":{"0":{"0":{"df":1,"docs":{"202":{"tf":2.8284271247461903}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"201":{"tf":2.8284271247461903}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}}},"t":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"200":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"7":{"5":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"198":{"tf":1.0},"208":{"tf":1.0},"266":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"207":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"228":{"tf":2.0},"229":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"206":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"206":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"136":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{"?":{".":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}}},":":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":11,"docs":{"150":{"tf":1.4142135623730951},"162":{"tf":2.23606797749979},"218":{"tf":1.0},"225":{"tf":1.0},"316":{"tf":2.23606797749979},"339":{"tf":1.4142135623730951},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"359":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"334":{"tf":1.0},"335":{"tf":1.4142135623730951}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"此":{"df":0,"docs":{},"之":{"df":0,"docs":{},"上":{"df":0,"docs":{},",":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"333":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"'":{"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}},"df":0,"docs":{}}},"y":{"'":{"d":{"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"134":{"tf":2.8284271247461903},"360":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"206":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"206":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"407":{"tf":1.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"405":{"tf":3.1622776601683795},"407":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"1":{"df":1,"docs":{"298":{"tf":2.449489742783178}}},"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"(":{"1":{"df":2,"docs":{"302":{"tf":1.0},"303":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"240":{"tf":1.0}}},"5":{"df":3,"docs":{"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"298":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"318":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":10,"docs":{"241":{"tf":1.0},"299":{"tf":2.0},"300":{"tf":1.4142135623730951},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.4142135623730951},"306":{"tf":2.6457513110645907},"405":{"tf":1.4142135623730951},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"df":6,"docs":{"298":{"tf":2.449489742783178},"299":{"tf":2.8284271247461903},"300":{"tf":1.0},"316":{"tf":1.0},"318":{"tf":1.0},"405":{"tf":4.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":29,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"228":{"tf":1.0},"241":{"tf":1.0},"290":{"tf":1.0},"297":{"tf":1.0},"298":{"tf":6.4031242374328485},"299":{"tf":2.449489742783178},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":1.7320508075688772},"404":{"tf":1.0},"405":{"tf":7.0},"406":{"tf":1.0},"407":{"tf":5.0990195135927845},"408":{"tf":4.123105625617661},"43":{"tf":1.0},"54":{"tf":1.0}},"e":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"396":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"4":{"df":2,"docs":{"405":{"tf":2.0},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"405":{"tf":2.6457513110645907}}}}}},"df":0,"docs":{}},"df":4,"docs":{"405":{"tf":9.797958971132712},"406":{"tf":1.4142135623730951},"407":{"tf":5.0990195135927845},"408":{"tf":5.385164807134504}}}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"297":{"tf":1.0}}},"df":0,"docs":{}}},"=":{"1":{"df":1,"docs":{"205":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"50":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":7,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772},"61":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"120":{"tf":1.0},"358":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"381":{"tf":2.8284271247461903}}}}}},"i":{"c":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"f":{"3":{"2":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"320":{"tf":1.7320508075688772},"322":{"tf":2.0},"323":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":6,"docs":{"102":{"tf":1.0},"24":{"tf":1.0},"322":{"tf":1.4142135623730951},"368":{"tf":1.0},"386":{"tf":1.0},"74":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}}}},"<":{"df":0,"docs":{},"f":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}},"df":1,"docs":{"323":{"tf":2.6457513110645907}}}}},"r":{"df":1,"docs":{"323":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"316":{"tf":4.123105625617661}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}},">":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"!":{"<":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"1":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"2":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"1":{".":{"2":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"232":{"tf":2.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":5,"docs":{"140":{"tf":2.0},"183":{"tf":1.0},"240":{"tf":1.0},"377":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"422":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":2.449489742783178}}}}},"d":{"a":{"df":0,"docs":{},"y":{"df":6,"docs":{"162":{"tf":1.0},"194":{"tf":1.0},"240":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"343":{"tf":2.0},"59":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"o":{"df":3,"docs":{"106":{"tf":1.0},"316":{"tf":1.4142135623730951},"353":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"141":{"tf":1.0}},"”":{"df":0,"docs":{},"。":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"259":{"tf":2.449489742783178},"261":{"tf":1.0},"387":{"tf":1.0},"390":{"tf":1.0},"393":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"390":{"tf":2.449489742783178},"391":{"tf":3.7416573867739413},"392":{"tf":2.0},"393":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}},"m":{"'":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"26":{"tf":1.0}}}},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"436":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"425":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"183":{"tf":1.7320508075688772},"385":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"245":{"tf":1.0},"331":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"434":{"tf":2.23606797749979}}},"t":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},">":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"(":{"df":0,"docs":{},"r":{"c":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"383":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":129,"docs":{"10":{"tf":1.4142135623730951},"102":{"tf":1.4142135623730951},"124":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"142":{"tf":1.7320508075688772},"149":{"tf":1.0},"151":{"tf":1.4142135623730951},"161":{"tf":1.0},"162":{"tf":2.449489742783178},"169":{"tf":2.23606797749979},"170":{"tf":1.0},"171":{"tf":1.0},"172":{"tf":2.23606797749979},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":2.8284271247461903},"178":{"tf":3.872983346207417},"179":{"tf":4.898979485566356},"180":{"tf":4.0},"181":{"tf":5.5677643628300215},"182":{"tf":3.605551275463989},"183":{"tf":4.47213595499958},"184":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":2.449489742783178},"195":{"tf":2.449489742783178},"200":{"tf":2.449489742783178},"213":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"242":{"tf":3.872983346207417},"244":{"tf":2.6457513110645907},"245":{"tf":1.7320508075688772},"246":{"tf":1.4142135623730951},"249":{"tf":2.6457513110645907},"270":{"tf":1.7320508075688772},"271":{"tf":2.0},"275":{"tf":2.0},"276":{"tf":2.449489742783178},"277":{"tf":1.4142135623730951},"278":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":3.1622776601683795},"281":{"tf":2.0},"282":{"tf":2.0},"283":{"tf":4.0},"285":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":3.1622776601683795},"290":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":2.0},"307":{"tf":1.0},"308":{"tf":2.0},"309":{"tf":2.0},"310":{"tf":1.4142135623730951},"311":{"tf":1.7320508075688772},"312":{"tf":1.0},"315":{"tf":2.23606797749979},"316":{"tf":2.23606797749979},"320":{"tf":3.7416573867739413},"324":{"tf":3.3166247903554},"326":{"tf":1.7320508075688772},"332":{"tf":2.6457513110645907},"333":{"tf":2.0},"334":{"tf":6.0},"335":{"tf":4.795831523312719},"336":{"tf":2.6457513110645907},"337":{"tf":1.0},"338":{"tf":2.449489742783178},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":2.0},"342":{"tf":3.1622776601683795},"343":{"tf":2.23606797749979},"344":{"tf":1.0},"360":{"tf":1.0},"364":{"tf":1.4142135623730951},"366":{"tf":1.0},"370":{"tf":3.4641016151377544},"373":{"tf":2.0},"374":{"tf":5.0},"375":{"tf":4.123105625617661},"376":{"tf":6.4031242374328485},"377":{"tf":6.082762530298219},"378":{"tf":3.4641016151377544},"379":{"tf":1.0},"381":{"tf":2.23606797749979},"383":{"tf":3.7416573867739413},"385":{"tf":2.8284271247461903},"386":{"tf":3.0},"388":{"tf":1.7320508075688772},"391":{"tf":4.123105625617661},"398":{"tf":1.7320508075688772},"405":{"tf":2.6457513110645907},"406":{"tf":1.0},"407":{"tf":1.7320508075688772},"408":{"tf":1.0},"41":{"tf":2.0},"412":{"tf":2.8284271247461903},"416":{"tf":2.0},"417":{"tf":2.6457513110645907},"418":{"tf":4.242640687119285},"419":{"tf":2.0},"420":{"tf":2.23606797749979},"421":{"tf":2.449489742783178},"422":{"tf":2.449489742783178},"423":{"tf":1.4142135623730951},"424":{"tf":1.7320508075688772},"70":{"tf":3.0},"84":{"tf":1.0},"86":{"tf":1.4142135623730951},"91":{"tf":3.0},"92":{"tf":1.0},"97":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":3,"docs":{"177":{"tf":1.0},"373":{"tf":1.0},"418":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"270":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"此":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"!":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"386":{"tf":1.0}}}}}}},"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"、":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"306":{"tf":1.0}}}}},",":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"179":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"281":{"tf":1.4142135623730951},"376":{"tf":1.0},"91":{"tf":1.0}}}}}}},":":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"181":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"、":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.0}}}}}}}}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"396":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"431":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"396":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"300":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"114":{"tf":1.0},"391":{"tf":1.4142135623730951}}}},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"100":{"tf":1.0}}}}}},"df":50,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.4142135623730951},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.7320508075688772},"413":{"tf":1.0},"414":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}},"m":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"54":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"319":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"325":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"323":{"tf":1.0}},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.23606797749979}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"!":{"(":{"a":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"318":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"3":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"319":{"tf":1.0}}},"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"320":{"tf":1.0}},"l":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"318":{"tf":2.449489742783178},"319":{"tf":2.449489742783178},"320":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"(":{"a":{"df":1,"docs":{"322":{"tf":1.7320508075688772}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"1":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":3,"docs":{"316":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"324":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"n":{"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":9,"docs":{"316":{"tf":1.4142135623730951},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":3,"docs":{"316":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951},"319":{"tf":1.7320508075688772}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"1":{"0":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"318":{"tf":2.449489742783178},"319":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"(":{"1":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":4,"docs":{"318":{"tf":1.0},"319":{"tf":1.0},"322":{"tf":2.8284271247461903},"323":{"tf":1.4142135623730951}}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"318":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"318":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"{":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":9,"docs":{"316":{"tf":3.7416573867739413},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":17,"docs":{"199":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"320":{"tf":1.0},"361":{"tf":1.0},"391":{"tf":1.0},"412":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"61":{"tf":2.8284271247461903},"62":{"tf":1.7320508075688772},"70":{"tf":1.0},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.4142135623730951}},",":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.7320508075688772},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951}}}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"300":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"54":{"tf":2.449489742783178}},"l":{"df":3,"docs":{"351":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"85":{"tf":1.0}},"e":{"df":0,"docs":{},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"数":{"df":0,"docs":{},"组":{"df":0,"docs":{},"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"417":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"179":{"tf":1.0},"180":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":5,"docs":{"178":{"tf":1.4142135623730951},"179":{"tf":3.605551275463989},"180":{"tf":3.605551275463989},"181":{"tf":2.0},"182":{"tf":3.0}}}},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"63":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"49":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"o":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"203":{"tf":1.0},"258":{"tf":1.4142135623730951},"320":{"tf":1.0},"357":{"tf":1.4142135623730951},"368":{"tf":1.0}},"’":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}}},"x":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":7,"docs":{"300":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"349":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"301":{"tf":1.0},"319":{"tf":1.0}}},"df":0,"docs":{}}}}},"1":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"319":{"tf":1.0},"320":{"tf":2.6457513110645907}}}}}},"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":2.449489742783178}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"319":{"tf":2.0},"320":{"tf":3.1622776601683795}}}}}},"df":8,"docs":{"300":{"tf":2.8284271247461903},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":4.242640687119285},"320":{"tf":2.449489742783178},"325":{"tf":1.0},"349":{"tf":1.0}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"417":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":51,"docs":{"102":{"tf":1.4142135623730951},"106":{"tf":1.0},"125":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.7320508075688772},"173":{"tf":1.0},"183":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.7320508075688772},"242":{"tf":1.0},"244":{"tf":1.7320508075688772},"273":{"tf":1.4142135623730951},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"335":{"tf":1.0},"351":{"tf":1.4142135623730951},"353":{"tf":1.0},"374":{"tf":1.7320508075688772},"375":{"tf":2.0},"376":{"tf":1.4142135623730951},"381":{"tf":2.6457513110645907},"382":{"tf":2.449489742783178},"383":{"tf":1.0},"386":{"tf":1.4142135623730951},"405":{"tf":2.6457513110645907},"407":{"tf":2.6457513110645907},"408":{"tf":1.7320508075688772},"412":{"tf":1.4142135623730951},"416":{"tf":3.3166247903554},"417":{"tf":3.0},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":2.449489742783178},"53":{"tf":1.4142135623730951},"54":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"75":{"tf":1.4142135623730951}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"413":{"tf":1.0}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"379":{"tf":1.0},"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"i":{"c":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}}}},"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"310":{"tf":1.0}}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"175":{"tf":1.0}}}}}},"x":{"df":1,"docs":{"175":{"tf":1.0}}},"因":{"df":0,"docs":{},"为":{"df":0,"docs":{},"传":{"df":0,"docs":{},"统":{"df":0,"docs":{},"上":{"df":0,"docs":{},"来":{"df":0,"docs":{},"说":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}}}}}}},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"希":{"df":0,"docs":{},"望":{"df":0,"docs":{},"其":{"df":0,"docs":{},"可":{"df":0,"docs":{},"以":{"df":0,"docs":{},"存":{"df":0,"docs":{},"放":{"df":0,"docs":{},"任":{"df":0,"docs":{},"何":{"df":0,"docs":{},"类":{"df":0,"docs":{},"型":{"df":0,"docs":{},"的":{"df":0,"docs":{},"值":{"df":0,"docs":{},"。":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}},"u":{"+":{"0":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"53":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"2":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"3":{"2":{"df":30,"docs":{"125":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"199":{"tf":2.8284271247461903},"240":{"tf":2.8284271247461903},"242":{"tf":2.449489742783178},"247":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":2.449489742783178},"369":{"tf":1.4142135623730951},"374":{"tf":2.0},"380":{"tf":1.4142135623730951},"382":{"tf":2.0},"385":{"tf":1.0},"42":{"tf":2.8284271247461903},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"50":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"70":{"tf":1.0},"88":{"tf":2.449489742783178},"89":{"tf":1.7320508075688772},"90":{"tf":2.0},"91":{"tf":2.449489742783178},"93":{"tf":2.23606797749979},"95":{"tf":1.7320508075688772},"96":{"tf":1.7320508075688772},"97":{"tf":1.7320508075688772}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},";":{"6":{"4":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"6":{"4":{"df":6,"docs":{"322":{"tf":2.0},"53":{"tf":1.0},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":10,"docs":{"101":{"tf":2.0},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"107":{"tf":1.4142135623730951},"142":{"tf":1.0},"381":{"tf":2.449489742783178},"399":{"tf":1.0},"417":{"tf":1.0},"53":{"tf":2.0},"54":{"tf":1.4142135623730951}}},">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.0}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"df":6,"docs":{"173":{"tf":2.0},"181":{"tf":2.449489742783178},"232":{"tf":1.0},"282":{"tf":2.23606797749979},"417":{"tf":1.4142135623730951},"53":{"tf":1.0}},"i":{"df":1,"docs":{"313":{"tf":1.0}}},"n":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"386":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"293":{"tf":1.0}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"75":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"120":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"156":{"tf":1.0},"368":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"64":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":1,"docs":{"263":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"d":{"df":5,"docs":{"142":{"tf":1.7320508075688772},"144":{"tf":1.4142135623730951},"216":{"tf":2.0},"232":{"tf":1.4142135623730951},"53":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"398":{"tf":1.4142135623730951}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"181":{"tf":1.0},"258":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"366":{"tf":1.0},"371":{"tf":1.0},"412":{"tf":1.7320508075688772}}}},"t":{"_":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"56":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":5,"docs":{"209":{"tf":1.0},"225":{"tf":1.4142135623730951},"391":{"tf":1.0},"54":{"tf":1.0},"86":{"tf":1.7320508075688772}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":14,"docs":{"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"266":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"246":{"tf":1.0},"75":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"405":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"57":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":58,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":2.23606797749979},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":3.3166247903554}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"153":{"tf":1.0},"154":{"tf":1.0}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}},"s":{"a":{"df":0,"docs":{},"f":{"df":11,"docs":{"257":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"365":{"tf":1.4142135623730951},"366":{"tf":3.1622776601683795},"367":{"tf":2.0},"368":{"tf":5.291502622129181},"369":{"tf":1.7320508075688772},"370":{"tf":2.8284271247461903},"371":{"tf":1.0},"372":{"tf":2.0},"412":{"tf":1.0}},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"370":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"383":{"tf":1.0},"413":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"435":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":6,"docs":{"120":{"tf":1.0},"225":{"tf":1.0},"246":{"tf":1.0},"266":{"tf":1.0},"36":{"tf":1.0},"427":{"tf":1.0}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"155":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"382":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":5,"docs":{"158":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"239":{"tf":2.6457513110645907},"242":{"tf":2.8284271247461903}},"e":{"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"242":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"<":{"df":0,"docs":{},"f":{">":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"148":{"tf":1.0}}}}},"df":20,"docs":{"159":{"tf":3.1622776601683795},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"224":{"tf":1.0},"225":{"tf":1.0},"241":{"tf":1.0},"300":{"tf":1.0},"306":{"tf":1.0},"318":{"tf":1.0},"342":{"tf":1.0},"349":{"tf":1.0},"382":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"401":{"tf":1.7320508075688772},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"408":{"tf":1.0}},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"263":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":8,"docs":{"18":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"263":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"40":{"tf":2.449489742783178},"84":{"tf":1.0}},"e":{"_":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951},"330":{"tf":1.0},"376":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":2,"docs":{"294":{"tf":1.7320508075688772},"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":2,"docs":{"260":{"tf":1.0},"261":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"398":{"tf":2.6457513110645907}}},"l":{"df":2,"docs":{"316":{"tf":4.358898943540674},"398":{"tf":1.7320508075688772}}}},"s":{",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{";":{"df":0,"docs":{},"q":{"=":{"0":{".":{"5":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"a":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}},"df":141,"docs":{"102":{"tf":1.0},"110":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.7320508075688772},"119":{"tf":1.4142135623730951},"120":{"tf":4.58257569495584},"121":{"tf":4.0},"122":{"tf":2.23606797749979},"123":{"tf":3.4641016151377544},"124":{"tf":2.6457513110645907},"125":{"tf":4.242640687119285},"126":{"tf":1.7320508075688772},"127":{"tf":1.0},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772},"157":{"tf":1.4142135623730951},"158":{"tf":2.0},"159":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"161":{"tf":2.449489742783178},"162":{"tf":2.23606797749979},"165":{"tf":1.0},"167":{"tf":1.7320508075688772},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"183":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"194":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":2.0},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.7320508075688772},"211":{"tf":1.7320508075688772},"215":{"tf":1.7320508075688772},"217":{"tf":1.0},"218":{"tf":1.7320508075688772},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.8284271247461903},"225":{"tf":3.7416573867739413},"226":{"tf":2.6457513110645907},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.605551275463989},"235":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"246":{"tf":1.4142135623730951},"247":{"tf":1.0},"249":{"tf":4.242640687119285},"250":{"tf":2.6457513110645907},"252":{"tf":1.4142135623730951},"258":{"tf":4.69041575982343},"266":{"tf":2.6457513110645907},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"285":{"tf":2.449489742783178},"286":{"tf":1.4142135623730951},"289":{"tf":3.0},"290":{"tf":2.0},"291":{"tf":1.7320508075688772},"293":{"tf":2.449489742783178},"294":{"tf":3.1622776601683795},"298":{"tf":2.449489742783178},"299":{"tf":2.8284271247461903},"300":{"tf":2.23606797749979},"301":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"303":{"tf":1.7320508075688772},"306":{"tf":3.1622776601683795},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.0},"320":{"tf":3.4641016151377544},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":2.0},"324":{"tf":3.0},"325":{"tf":1.0},"33":{"tf":2.23606797749979},"335":{"tf":2.0},"337":{"tf":1.0},"34":{"tf":1.0},"343":{"tf":1.4142135623730951},"348":{"tf":1.0},"35":{"tf":1.7320508075688772},"353":{"tf":1.0},"36":{"tf":1.7320508075688772},"360":{"tf":2.23606797749979},"368":{"tf":1.7320508075688772},"37":{"tf":1.0},"375":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":2.23606797749979},"378":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":2.0},"390":{"tf":1.0},"391":{"tf":2.6457513110645907},"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":3.872983346207417},"407":{"tf":2.23606797749979},"408":{"tf":2.6457513110645907},"41":{"tf":2.23606797749979},"412":{"tf":1.4142135623730951},"42":{"tf":2.8284271247461903},"425":{"tf":1.0},"427":{"tf":1.0},"428":{"tf":1.0},"43":{"tf":1.7320508075688772},"44":{"tf":1.7320508075688772},"45":{"tf":2.449489742783178},"54":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"91":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"353":{"tf":1.0}}}}}},"r":{"1":{".":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":4,"docs":{"82":{"tf":1.7320508075688772},"83":{"tf":1.0},"84":{"tf":3.7416573867739413},"87":{"tf":1.0}}},"2":{"df":1,"docs":{"84":{"tf":2.8284271247461903}}},"<":{"'":{"a":{"df":1,"docs":{"87":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"1":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"239":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":7,"docs":{"239":{"tf":2.0},"333":{"tf":1.0},"398":{"tf":1.4142135623730951},"82":{"tf":3.605551275463989},"83":{"tf":2.0},"84":{"tf":3.0},"87":{"tf":1.7320508075688772}},"n":{"a":{"df":0,"docs":{},"m":{"df":10,"docs":{"160":{"tf":2.0},"161":{"tf":2.449489742783178},"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":2.0},"82":{"tf":3.1622776601683795},"83":{"tf":2.23606797749979},"84":{"tf":2.8284271247461903},"87":{"tf":2.23606797749979}},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"160":{"tf":2.0},"161":{"tf":1.7320508075688772}},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"160":{"tf":1.0},"161":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"160":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"%":{"\\":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"21":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"s":{"/":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"z":{"df":22,"docs":{"142":{"tf":1.4142135623730951},"156":{"tf":1.0},"198":{"tf":3.0},"200":{"tf":2.0},"203":{"tf":1.7320508075688772},"207":{"tf":1.4142135623730951},"208":{"tf":1.7320508075688772},"210":{"tf":2.8284271247461903},"289":{"tf":3.4641016151377544},"290":{"tf":2.0},"368":{"tf":1.7320508075688772},"383":{"tf":1.0},"405":{"tf":5.5677643628300215},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"417":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.7320508075688772},"54":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.7320508075688772},"77":{"tf":2.8284271247461903}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.7320508075688772},"108":{"tf":1.7320508075688772}},"e":{":":{":":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"a":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"f":{"df":14,"docs":{"138":{"tf":2.0},"139":{"tf":1.7320508075688772},"140":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":2.23606797749979},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.7320508075688772},"152":{"tf":1.0},"270":{"tf":1.0},"34":{"tf":1.0},"398":{"tf":1.0},"53":{"tf":1.0},"78":{"tf":1.7320508075688772}}},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"257":{"tf":1.0},"258":{"tf":2.6457513110645907},"320":{"tf":1.7320508075688772}}}}}},"v":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"350":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"5":{"df":1,"docs":{"133":{"tf":1.0}}},"6":{"df":2,"docs":{"133":{"tf":1.0},"134":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"133":{"tf":1.0}}},"8":{"df":1,"docs":{"133":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"0":{".":{"1":{".":{"0":{"df":95,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":2.0},"242":{"tf":1.4142135623730951},"246":{"tf":1.0},"261":{"tf":2.0},"266":{"tf":2.6457513110645907},"27":{"tf":1.7320508075688772},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.7320508075688772},"285":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"32":{"tf":1.0},"335":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"38":{"tf":1.0},"386":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"407":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":2.449489742783178},"62":{"tf":1.7320508075688772},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"1":{"0":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"2":{"7":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"8":{"6":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"2":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"5":{"df":3,"docs":{"266":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"42":{"tf":1.0}}},"6":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{".":{"0":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"x":{"df":1,"docs":{"246":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0}}}}}}},"3":{".":{"0":{".":{"0":{"df":1,"docs":{"267":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"245":{"tf":1.0}}}}}},"df":3,"docs":{"243":{"tf":2.23606797749979},"244":{"tf":2.23606797749979},"245":{"tf":1.4142135623730951}}}}}}},"df":4,"docs":{"243":{"tf":1.7320508075688772},"244":{"tf":1.4142135623730951},"245":{"tf":1.0},"246":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"246":{"tf":1.0}}},"4":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"v":{"4":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.0}}}}}}}},"u":{"8":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":2.449489742783178}}},"6":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"v":{"6":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}}}}}},"df":2,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":2.6457513110645907}}},"[":{"0":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}},"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"134":{"tf":1.0}}},"9":{"9":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":9,"docs":{"243":{"tf":1.4142135623730951},"300":{"tf":1.4142135623730951},"301":{"tf":3.0},"302":{"tf":1.7320508075688772},"303":{"tf":2.449489742783178},"319":{"tf":4.123105625617661},"320":{"tf":6.082762530298219},"349":{"tf":1.0},"382":{"tf":1.4142135623730951}},"i":{"d":{"df":1,"docs":{"165":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":55,"docs":{"106":{"tf":1.0},"148":{"tf":1.4142135623730951},"159":{"tf":1.0},"167":{"tf":4.242640687119285},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":5.916079783099616},"206":{"tf":2.8284271247461903},"224":{"tf":1.0},"225":{"tf":1.0},"228":{"tf":1.0},"242":{"tf":3.1622776601683795},"246":{"tf":1.0},"260":{"tf":1.0},"285":{"tf":1.7320508075688772},"289":{"tf":3.872983346207417},"290":{"tf":2.0},"291":{"tf":3.7416573867739413},"293":{"tf":1.7320508075688772},"294":{"tf":4.58257569495584},"299":{"tf":2.0},"301":{"tf":1.7320508075688772},"306":{"tf":2.0},"318":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":3.1622776601683795},"324":{"tf":3.3166247903554},"331":{"tf":1.0},"347":{"tf":1.0},"350":{"tf":1.4142135623730951},"353":{"tf":1.0},"359":{"tf":1.0},"36":{"tf":1.0},"360":{"tf":1.4142135623730951},"368":{"tf":2.449489742783178},"382":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"428":{"tf":1.0},"49":{"tf":2.6457513110645907},"51":{"tf":2.23606797749979},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"56":{"tf":2.23606797749979},"57":{"tf":1.4142135623730951},"58":{"tf":2.449489742783178},"61":{"tf":1.7320508075688772},"62":{"tf":2.6457513110645907},"70":{"tf":2.0},"75":{"tf":2.449489742783178},"82":{"tf":1.4142135623730951}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"167":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"385":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"350":{"tf":1.0}}}}},"df":0,"docs":{}}}}},".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"df":1,"docs":{"103":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"a":{")":{")":{"df":0,"docs":{},",":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}}},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"[":{".":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"}":{"df":0,"docs":{},"{":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"56":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"r":{"df":2,"docs":{"232":{"tf":1.0},"416":{"tf":3.3166247903554}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":24,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"242":{"tf":1.4142135623730951},"290":{"tf":1.0},"299":{"tf":1.7320508075688772},"34":{"tf":1.0},"369":{"tf":1.0},"427":{"tf":1.0},"43":{"tf":1.0},"49":{"tf":3.3166247903554},"51":{"tf":2.0},"54":{"tf":1.0},"75":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"416":{"tf":1.0}}}},"df":6,"docs":{"100":{"tf":1.0},"225":{"tf":1.0},"353":{"tf":1.4142135623730951},"359":{"tf":1.0},"36":{"tf":1.4142135623730951},"99":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":1,"docs":{"26":{"tf":1.7320508075688772}},"s":{"=":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":17,"docs":{"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":2.0},"135":{"tf":2.0},"137":{"tf":1.7320508075688772},"146":{"tf":1.7320508075688772},"150":{"tf":1.0},"156":{"tf":1.0},"169":{"tf":1.0},"240":{"tf":1.0},"299":{"tf":5.477225575051661},"350":{"tf":1.0},"359":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"389":{"tf":1.0},"420":{"tf":1.4142135623730951},"423":{"tf":1.0}},"e":{"c":{"!":{"[":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}},"'":{"a":{"df":1,"docs":{"350":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":1,"docs":{"172":{"tf":1.4142135623730951}}}},"1":{"0":{"0":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":13,"docs":{"132":{"tf":1.0},"134":{"tf":1.7320508075688772},"137":{"tf":1.0},"156":{"tf":1.0},"241":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.4142135623730951},"299":{"tf":2.0},"368":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951},"389":{"tf":1.7320508075688772}}},"2":{"df":1,"docs":{"246":{"tf":1.0}}},"3":{"4":{"df":2,"docs":{"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"239":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{")":{";":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":9,"docs":{"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951},"389":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"<":{"&":{"'":{"a":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"228":{"tf":1.0}}}}}},"_":{"df":4,"docs":{"246":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.0},"400":{"tf":1.0}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":3,"docs":{"320":{"tf":1.0},"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":5,"docs":{"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"246":{"tf":1.4142135623730951},"299":{"tf":1.0},"331":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"<":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"c":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"o":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"385":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":16,"docs":{"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0},"289":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"335":{"tf":1.4142135623730951},"378":{"tf":1.0},"385":{"tf":1.4142135623730951}}}}},"t":{"df":11,"docs":{"131":{"tf":1.0},"132":{"tf":1.7320508075688772},"134":{"tf":1.0},"140":{"tf":1.0},"169":{"tf":1.0},"179":{"tf":1.7320508075688772},"243":{"tf":1.0},"273":{"tf":1.0},"294":{"tf":1.0},"334":{"tf":1.0},"378":{"tf":2.8284271247461903}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"405":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"3":{"2":{"df":1,"docs":{"389":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":2,"docs":{"142":{"tf":1.0},"417":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"df":19,"docs":{"132":{"tf":1.4142135623730951},"136":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"247":{"tf":1.4142135623730951},"289":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":4.69041575982343},"323":{"tf":1.7320508075688772},"335":{"tf":1.4142135623730951},"388":{"tf":1.0},"389":{"tf":3.0}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":49,"docs":{"10":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":2.23606797749979},"132":{"tf":3.0},"133":{"tf":2.23606797749979},"134":{"tf":4.242640687119285},"135":{"tf":3.3166247903554},"136":{"tf":3.4641016151377544},"137":{"tf":2.6457513110645907},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.0},"152":{"tf":1.4142135623730951},"156":{"tf":2.0},"213":{"tf":1.0},"215":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":2.0},"229":{"tf":2.0},"231":{"tf":1.0},"241":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"243":{"tf":2.0},"244":{"tf":1.4142135623730951},"246":{"tf":2.23606797749979},"247":{"tf":2.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"289":{"tf":2.23606797749979},"299":{"tf":2.8284271247461903},"302":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.7320508075688772},"335":{"tf":1.0},"368":{"tf":2.0},"385":{"tf":1.4142135623730951},"389":{"tf":2.0},"398":{"tf":1.4142135623730951},"401":{"tf":1.0},"405":{"tf":3.1622776601683795},"422":{"tf":1.0},"54":{"tf":2.449489742783178},"79":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"131":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"334":{"tf":1.0}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"113":{"tf":2.0}}}}},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"156":{"tf":1.0},"324":{"tf":1.0}}}}},"df":1,"docs":{"263":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"196":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"261":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"17":{"tf":1.0},"241":{"tf":1.4142135623730951},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"260":{"tf":1.0},"262":{"tf":1.0},"32":{"tf":1.0},"322":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"40":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"413":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"353":{"tf":1.0},"428":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"429":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"(":{"a":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"s":{"df":2,"docs":{"113":{"tf":1.0},"252":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"。":{"df":0,"docs":{},"接":{"df":0,"docs":{},"着":{"df":0,"docs":{},"当":{"df":0,"docs":{},"新":{"df":0,"docs":{},"建":{"df":0,"docs":{},"线":{"df":0,"docs":{},"程":{"df":0,"docs":{},"开":{"df":0,"docs":{},"始":{"df":0,"docs":{},"执":{"df":0,"docs":{},"行":{"df":0,"docs":{},",":{"df":0,"docs":{},"v":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}}}}}}}}},"然":{"df":0,"docs":{},"而":{"df":0,"docs":{},"这":{"df":0,"docs":{},"有":{"df":0,"docs":{},"一":{"df":0,"docs":{},"个":{"df":0,"docs":{},"问":{"df":0,"docs":{},"题":{"df":0,"docs":{},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}}}}}}}}}}},"w":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"324":{"tf":1.0},"353":{"tf":1.0},"75":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"353":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"120":{"tf":1.0},"266":{"tf":1.0}}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"225":{"tf":1.0},"246":{"tf":1.0},"36":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"57":{"tf":1.0}}}}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"427":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":12,"docs":{"120":{"tf":2.0},"225":{"tf":1.7320508075688772},"246":{"tf":1.7320508075688772},"260":{"tf":1.0},"266":{"tf":1.7320508075688772},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"353":{"tf":1.7320508075688772},"36":{"tf":1.7320508075688772},"405":{"tf":2.23606797749979},"427":{"tf":1.0},"57":{"tf":2.0}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"376":{"tf":1.4142135623730951}}}},"y":{"df":1,"docs":{"196":{"tf":1.0}}}},"df":2,"docs":{"196":{"tf":1.0},"378":{"tf":1.4142135623730951}},"e":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}},"a":{"df":0,"docs":{},"k":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"t":{"df":3,"docs":{"286":{"tf":1.0},"294":{"tf":3.0},"295":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"286":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":3.605551275463989}}}},"b":{"df":21,"docs":{"10":{"tf":1.0},"111":{"tf":1.0},"297":{"tf":1.0},"316":{"tf":1.0},"392":{"tf":1.4142135623730951},"395":{"tf":2.8284271247461903},"396":{"tf":2.6457513110645907},"397":{"tf":2.0},"398":{"tf":1.7320508075688772},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":1.7320508075688772},"402":{"tf":1.4142135623730951},"403":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.0},"406":{"tf":1.0},"407":{"tf":1.0},"408":{"tf":2.0},"409":{"tf":1.0},"6":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"400":{"tf":1.0}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"’":{"df":0,"docs":{},"r":{"df":1,"docs":{"59":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"’":{"df":1,"docs":{"59":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"273":{"tf":1.0}}}}}},"w":{"df":1,"docs":{"59":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":12,"docs":{"100":{"tf":1.0},"199":{"tf":3.7416573867739413},"242":{"tf":4.0},"335":{"tf":2.23606797749979},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":2.23606797749979},"91":{"tf":3.3166247903554},"93":{"tf":3.0},"95":{"tf":2.6457513110645907},"96":{"tf":1.4142135623730951},"97":{"tf":2.0}},"、":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"335":{"tf":1.7320508075688772}},"、":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"335":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"。":{"df":0,"docs":{},"当":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"不":{"df":0,"docs":{},"使":{"df":0,"docs":{},"用":{"df":0,"docs":{},"圆":{"df":0,"docs":{},"括":{"df":0,"docs":{},"号":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{},"l":{"d":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":10,"docs":{"111":{"tf":1.0},"12":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.0},"24":{"tf":2.23606797749979},"27":{"tf":1.7320508075688772},"42":{"tf":1.0},"436":{"tf":2.0}}}}},"df":9,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"389":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"191":{"tf":1.0},"273":{"tf":1.0},"376":{"tf":1.0},"433":{"tf":1.0}}}}}}},"z":{"a":{"df":0,"docs":{},"r":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"r":{"d":{"df":4,"docs":{"150":{"tf":1.0},"191":{"tf":1.7320508075688772},"77":{"tf":2.8284271247461903},"78":{"tf":4.47213595499958}}},"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"191":{"tf":1.7320508075688772},"230":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\"":{")":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"407":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"407":{"tf":1.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":1,"docs":{"407":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"405":{"tf":2.449489742783178},"407":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"405":{"tf":10.099504938362077},"407":{"tf":7.280109889280518},"408":{"tf":7.416198487095663}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"405":{"tf":1.0}}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"406":{"tf":1.0}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":4,"docs":{"110":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.4142135623730951},"266":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"264":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"!":{"df":0,"docs":{},"。":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}}},"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"162":{"tf":1.0}}}}}}},"df":24,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"150":{"tf":1.7320508075688772},"191":{"tf":1.4142135623730951},"20":{"tf":2.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.6457513110645907},"23":{"tf":2.0},"24":{"tf":1.7320508075688772},"25":{"tf":1.0},"26":{"tf":2.0},"266":{"tf":1.4142135623730951},"27":{"tf":2.23606797749979},"30":{"tf":1.0},"32":{"tf":2.0},"369":{"tf":1.0},"55":{"tf":1.7320508075688772},"59":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":3.1622776601683795}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"386":{"tf":1.0},"407":{"tf":1.0},"53":{"tf":2.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"378":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"378":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"378":{"tf":2.8284271247461903}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"a":{"d":{"d":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"df":2,"docs":{"377":{"tf":1.0},"378":{"tf":1.0}}}},"df":0,"docs":{}},"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"274":{"tf":1.0},"359":{"tf":1.4142135623730951}}}}}},"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"399":{"tf":1.4142135623730951}},"l":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":5,"docs":{"101":{"tf":1.0},"125":{"tf":1.0},"197":{"tf":1.0},"233":{"tf":1.0},"381":{"tf":2.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"x":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"+":{"1":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},".":{"0":{"df":1,"docs":{"54":{"tf":1.0}}},"1":{"df":1,"docs":{"54":{"tf":1.0}}},"2":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"186":{"tf":1.0},"188":{"tf":1.7320508075688772},"194":{"tf":1.0}}}}},"y":{".":{"df":0,"docs":{},"z":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}},"1":{"df":1,"docs":{"175":{"tf":2.0}}},"2":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"8":{"6":{"_":{"6":{"4":{"df":1,"docs":{"436":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"389":{"tf":1.7320508075688772}}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}},"df":56,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"105":{"tf":2.449489742783178},"106":{"tf":1.4142135623730951},"173":{"tf":4.358898943540674},"175":{"tf":4.358898943540674},"183":{"tf":1.7320508075688772},"185":{"tf":4.47213595499958},"186":{"tf":2.23606797749979},"188":{"tf":2.6457513110645907},"189":{"tf":1.7320508075688772},"194":{"tf":1.4142135623730951},"240":{"tf":3.605551275463989},"242":{"tf":1.0},"246":{"tf":2.0},"257":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"274":{"tf":1.0},"277":{"tf":2.449489742783178},"278":{"tf":2.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"289":{"tf":2.23606797749979},"345":{"tf":1.0},"347":{"tf":1.4142135623730951},"350":{"tf":1.4142135623730951},"351":{"tf":3.3166247903554},"352":{"tf":2.23606797749979},"353":{"tf":2.449489742783178},"355":{"tf":1.7320508075688772},"356":{"tf":4.123105625617661},"357":{"tf":2.0},"358":{"tf":2.23606797749979},"359":{"tf":6.4031242374328485},"360":{"tf":2.6457513110645907},"361":{"tf":4.242640687119285},"37":{"tf":1.7320508075688772},"375":{"tf":2.449489742783178},"377":{"tf":2.449489742783178},"381":{"tf":2.0},"385":{"tf":1.0},"386":{"tf":2.0},"389":{"tf":1.4142135623730951},"398":{"tf":1.0},"416":{"tf":1.0},"428":{"tf":2.23606797749979},"49":{"tf":5.0},"51":{"tf":4.123105625617661},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"56":{"tf":2.449489742783178},"57":{"tf":3.4641016151377544},"58":{"tf":4.123105625617661},"70":{"tf":3.1622776601683795},"71":{"tf":2.449489742783178},"94":{"tf":1.7320508075688772}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"213":{"tf":1.0}}}}}}}}}},"y":{"df":0,"docs":{},"z":{"df":4,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":1.0},"189":{"tf":1.0},"194":{"tf":1.0}}}},"、":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"个":{"df":0,"docs":{},"假":{"df":0,"docs":{},"想":{"df":0,"docs":{},"的":{"df":0,"docs":{},"例":{"df":0,"docs":{},"子":{"df":0,"docs":{},"中":{"df":0,"docs":{},",":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"356":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}}},",":{"2":{"df":1,"docs":{"351":{"tf":1.0}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"185":{"tf":1.0}}}}}}}},"y":{".":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"186":{"tf":1.0},"188":{"tf":1.7320508075688772},"194":{"tf":1.0}}}}}},"1":{"df":1,"docs":{"175":{"tf":2.449489742783178}}},"2":{">":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"175":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"175":{"tf":2.23606797749979}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"94":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"263":{"tf":2.6457513110645907}}}}},"df":33,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"172":{"tf":1.0},"173":{"tf":4.242640687119285},"175":{"tf":3.4641016151377544},"183":{"tf":2.0},"186":{"tf":2.8284271247461903},"188":{"tf":3.1622776601683795},"189":{"tf":2.23606797749979},"191":{"tf":1.7320508075688772},"194":{"tf":1.4142135623730951},"274":{"tf":1.0},"277":{"tf":2.8284271247461903},"278":{"tf":2.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.7320508075688772},"289":{"tf":1.4142135623730951},"350":{"tf":1.0},"351":{"tf":2.23606797749979},"352":{"tf":2.0},"356":{"tf":3.872983346207417},"359":{"tf":6.324555320336759},"360":{"tf":3.1622776601683795},"361":{"tf":4.69041575982343},"37":{"tf":2.0},"375":{"tf":2.449489742783178},"377":{"tf":2.449489742783178},"381":{"tf":2.449489742783178},"53":{"tf":1.0},"54":{"tf":2.0},"57":{"tf":3.872983346207417},"70":{"tf":2.8284271247461903},"94":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"102":{"tf":1.0},"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"df":1,"docs":{"361":{"tf":1.0}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"148":{"tf":1.0},"150":{"tf":1.0},"258":{"tf":2.449489742783178}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"322":{"tf":2.23606797749979}}}}}},"df":2,"docs":{"322":{"tf":2.0},"413":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"u":{"'":{"df":0,"docs":{},"r":{"df":2,"docs":{"401":{"tf":1.0},"75":{"tf":1.0}}},"v":{"df":2,"docs":{"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"y":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}},"”":{"df":0,"docs":{},"。":{"df":0,"docs":{},"现":{"df":0,"docs":{},"在":{"df":0,"docs":{},"有":{"df":0,"docs":{},"了":{"df":0,"docs":{},"两":{"df":0,"docs":{},"个":{"df":0,"docs":{},"变":{"df":0,"docs":{},"量":{"df":0,"docs":{},",":{"df":0,"docs":{},"x":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}}}}}}}},"(":{"df":0,"docs":{},"其":{"df":0,"docs":{},"值":{"df":0,"docs":{},"为":{"c":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}}},"z":{"df":7,"docs":{"277":{"tf":1.0},"301":{"tf":1.0},"351":{"tf":1.4142135623730951},"360":{"tf":2.0},"53":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951},"70":{"tf":1.0}},"e":{"df":1,"docs":{"142":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"o":{"df":5,"docs":{"252":{"tf":1.7320508075688772},"405":{"tf":3.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772},"61":{"tf":1.4142135623730951}}}}},"h":{"df":1,"docs":{"0":{"tf":1.0}}},"i":{"df":0,"docs":{},"p":{"(":{"&":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"252":{"tf":1.0}}}}}}},"title":{"root":{"8":{"df":1,"docs":{"138":{"tf":1.0}}},"_":{"df":1,"docs":{"107":{"tf":1.0}}},"a":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":1,"docs":{"429":{"tf":1.0}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":2,"docs":{"258":{"tf":1.0},"306":{"tf":1.0}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"342":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"216":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"200":{"tf":1.0}}}},"n":{"df":1,"docs":{"200":{"tf":1.0}}}},"df":1,"docs":{"199":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"313":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"326":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"415":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"183":{"tf":1.0},"194":{"tf":1.0}}},"df":0,"docs":{}}},"x":{"<":{"df":0,"docs":{},"t":{"df":4,"docs":{"271":{"tf":1.0},"272":{"tf":1.0},"275":{"tf":1.0},"278":{"tf":1.0}}}},"df":1,"docs":{"273":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":9,"docs":{"25":{"tf":1.0},"254":{"tf":1.0},"26":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":1.0}}}}}},"df":1,"docs":{"418":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"434":{"tf":1.4142135623730951}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"249":{"tf":1.0},"422":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"223":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"342":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"422":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":8,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"117":{"tf":1.0},"226":{"tf":1.0},"256":{"tf":1.0},"260":{"tf":1.0},"262":{"tf":1.0},"40":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":5,"docs":{"254":{"tf":1.0},"256":{"tf":1.0},"259":{"tf":1.0},"261":{"tf":1.0},"263":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"75":{"tf":1.0}}}}}},"df":1,"docs":{"425":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"419":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":4,"docs":{"276":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.0}}}},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"391":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"283":{"tf":1.0},"407":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"203":{"tf":1.0},"430":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"191":{"tf":1.0}}}}},"q":{"df":1,"docs":{"420":{"tf":1.0}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}},"f":{"df":1,"docs":{"431":{"tf":1.0}},"n":{"df":1,"docs":{"242":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"315":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},",":{"df":0,"docs":{},"任":{"df":0,"docs":{},"务":{"df":0,"docs":{},"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"线":{"df":0,"docs":{},"程":{"df":0,"docs":{},"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"327":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}},"df":0,"docs":{}}}}}}}}}}}}},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}}},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"432":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"146":{"tf":1.0},"423":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"20":{"tf":1.0},"25":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"400":{"tf":1.0}}}}}},"i":{"/":{"df":0,"docs":{},"o":{"df":2,"docs":{"213":{"tf":1.0},"248":{"tf":1.0}}}},"d":{"df":1,"docs":{"429":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"97":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"267":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"191":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"m":{"a":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"15":{"tf":1.0}}},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"225":{"tf":1.0}}}},"p":{"df":5,"docs":{"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"103":{"tf":1.0},"347":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"299":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"t":{">":{"/":{"a":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"382":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"378":{"tf":1.0},"380":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"432":{"tf":1.0},"436":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":1,"docs":{"102":{"tf":1.0}}}}}}},"r":{"d":{"df":1,"docs":{"421":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":7,"docs":{"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"202":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"420":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"421":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"338":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}}}}},"u":{"b":{"df":3,"docs":{"116":{"tf":1.0},"123":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":5,"docs":{"284":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"294":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{">":{"/":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"287":{"tf":1.0},"288":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"75":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"353":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"203":{"tf":1.0}}}},"df":2,"docs":{"157":{"tf":1.0},"36":{"tf":1.0}}}}}}},"f":{"c":{"df":1,"docs":{"437":{"tf":1.0}}},"df":0,"docs":{}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"434":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":10,"docs":{"0":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"237":{"tf":1.0},"3":{"tf":1.0},"328":{"tf":1.0},"365":{"tf":1.0},"429":{"tf":1.0},"432":{"tf":1.0},"436":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"427":{"tf":1.0}}}},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"426":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"436":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"308":{"tf":1.0},"309":{"tf":1.0},"311":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"395":{"tf":1.0},"396":{"tf":1.0},"403":{"tf":1.4142135623730951},"404":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"202":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"383":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"143":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"298":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},")":{"df":0,"docs":{},"与":{"df":0,"docs":{},"堆":{"df":0,"docs":{},"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"66":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"308":{"tf":1.0},"310":{"tf":1.0},"311":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"c":{"df":0,"docs":{},"p":{"df":1,"docs":{"397":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"407":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"434":{"tf":1.0}}},"t":{"df":28,"docs":{"169":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"194":{"tf":1.0},"242":{"tf":1.0},"244":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":1.0},"308":{"tf":1.0},"326":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0},"336":{"tf":1.0},"370":{"tf":1.0},"373":{"tf":1.0},"374":{"tf":1.0},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"383":{"tf":1.0},"407":{"tf":1.0},"418":{"tf":1.0},"91":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"382":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"216":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":5,"docs":{"120":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":1.0},"258":{"tf":1.0}}},"t":{"df":0,"docs":{},"f":{"df":1,"docs":{"138":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0}}}}}},"df":0,"docs":{}},"s":{"df":1,"docs":{"252":{"tf":1.0}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"b":{"df":2,"docs":{"395":{"tf":1.0},"396":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}}}}},"y":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"263":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}}); \ No newline at end of file diff --git a/searchindex.json b/searchindex.json new file mode 100644 index 000000000..3c4869eb5 --- /dev/null +++ b/searchindex.json @@ -0,0 +1 @@ +{"doc_urls":["title-page.html#rust-程序设计语言","foreword.html#前言","ch00-00-introduction.html#简介","ch00-00-introduction.html#rust-适合哪些人","ch00-00-introduction.html#开发者团队","ch00-00-introduction.html#学生","ch00-00-introduction.html#公司","ch00-00-introduction.html#开源开发者","ch00-00-introduction.html#重视速度和稳定性的开发者","ch00-00-introduction.html#本书适合哪些人","ch00-00-introduction.html#如何阅读本书","ch00-00-introduction.html#源代码","ch01-00-getting-started.html#入门指南","ch01-01-installation.html#安装","ch01-01-installation.html#命令行标记","ch01-01-installation.html#在-linux-或-macos-上安装-rustup","ch01-01-installation.html#在-windows-上安装-rustup","ch01-01-installation.html#故障排除troubleshooting","ch01-01-installation.html#更新与卸载","ch01-01-installation.html#本地文档","ch01-02-hello-world.html#hello-world","ch01-02-hello-world.html#创建项目目录","ch01-02-hello-world.html#编写并运行-rust-程序","ch01-02-hello-world.html#分析这个-rust-程序","ch01-02-hello-world.html#编译和运行是彼此独立的步骤","ch01-03-hello-cargo.html#hello-cargo","ch01-03-hello-cargo.html#使用-cargo-创建项目","ch01-03-hello-cargo.html#构建并运行-cargo-项目","ch01-03-hello-cargo.html#发布release构建","ch01-03-hello-cargo.html#把-cargo-当作习惯","ch01-03-hello-cargo.html#总结","ch02-00-guessing-game-tutorial.html#写个猜数字游戏","ch02-00-guessing-game-tutorial.html#准备一个新项目","ch02-00-guessing-game-tutorial.html#处理一次猜测","ch02-00-guessing-game-tutorial.html#使用变量储存值","ch02-00-guessing-game-tutorial.html#接收用户输入","ch02-00-guessing-game-tutorial.html#使用-result-类型来处理潜在的错误","ch02-00-guessing-game-tutorial.html#使用-println-占位符打印值","ch02-00-guessing-game-tutorial.html#测试第一部分代码","ch02-00-guessing-game-tutorial.html#生成一个秘密数字","ch02-00-guessing-game-tutorial.html#使用-crate-来增加更多功能","ch02-00-guessing-game-tutorial.html#生成一个随机数","ch02-00-guessing-game-tutorial.html#比较猜测的数字和秘密数字","ch02-00-guessing-game-tutorial.html#使用循环来允许多次猜测","ch02-00-guessing-game-tutorial.html#猜测正确后退出","ch02-00-guessing-game-tutorial.html#处理无效输入","ch02-00-guessing-game-tutorial.html#总结","ch03-00-common-programming-concepts.html#常见编程概念","ch03-00-common-programming-concepts.html#关键字","ch03-01-variables-and-mutability.html#变量和可变性","ch03-01-variables-and-mutability.html#常量","ch03-01-variables-and-mutability.html#隐藏","ch03-02-data-types.html#数据类型","ch03-02-data-types.html#标量类型","ch03-02-data-types.html#复合类型","ch03-03-how-functions-work.html#函数","ch03-03-how-functions-work.html#参数","ch03-03-how-functions-work.html#语句和表达式","ch03-03-how-functions-work.html#具有返回值的函数","ch03-04-comments.html#注释","ch03-05-control-flow.html#控制流","ch03-05-control-flow.html#if-表达式","ch03-05-control-flow.html#使用循环重复执行","ch03-05-control-flow.html#总结","ch04-00-understanding-ownership.html#认识所有权","ch04-01-what-is-ownership.html#什么是所有权","ch04-01-what-is-ownership.html#栈stack与堆heap","ch04-01-what-is-ownership.html#所有权规则","ch04-01-what-is-ownership.html#变量作用域","ch04-01-what-is-ownership.html#string-类型","ch04-01-what-is-ownership.html#内存与分配","ch04-01-what-is-ownership.html#所有权与函数","ch04-01-what-is-ownership.html#返回值与作用域","ch04-02-references-and-borrowing.html#引用与借用","ch04-02-references-and-borrowing.html#可变引用","ch04-02-references-and-borrowing.html#悬垂引用dangling-references","ch04-02-references-and-borrowing.html#引用的规则","ch04-03-slices.html#slice-类型","ch04-03-slices.html#字符串-slice","ch04-03-slices.html#其他类型的-slice","ch04-03-slices.html#总结","ch05-00-structs.html#使用结构体组织相关联的数据","ch05-01-defining-structs.html#结构体的定义和实例化","ch05-01-defining-structs.html#使用字段初始化简写语法","ch05-01-defining-structs.html#使用结构体更新语法从其他实例创建实例","ch05-01-defining-structs.html#使用没有命名字段的元组结构体来创建不同的类型","ch05-01-defining-structs.html#没有任何字段的类单元结构体","ch05-01-defining-structs.html#结构体数据的所有权","ch05-02-example-structs.html#结构体示例程序","ch05-02-example-structs.html#使用元组重构","ch05-02-example-structs.html#使用结构体重构赋予更多意义","ch05-02-example-structs.html#通过派生-trait-增加实用功能","ch05-03-method-syntax.html#方法语法","ch05-03-method-syntax.html#定义方法","ch05-03-method-syntax.html#--运算符到哪去了","ch05-03-method-syntax.html#带有更多参数的方法","ch05-03-method-syntax.html#关联函数","ch05-03-method-syntax.html#多个-impl-块","ch05-03-method-syntax.html#总结","ch06-00-enums.html#枚举和模式匹配","ch06-01-defining-an-enum.html#枚举的定义","ch06-01-defining-an-enum.html#枚举值","ch06-01-defining-an-enum.html#option-枚举和其相对于空值的优势","ch06-02-match.html#match-控制流结构","ch06-02-match.html#绑定值的模式","ch06-02-match.html#匹配-option","ch06-02-match.html#匹配是穷尽的","ch06-02-match.html#通配模式和-_-占位符","ch06-03-if-let.html#if-let-简洁控制流","ch06-03-if-let.html#总结","ch07-00-managing-growing-projects-with-packages-crates-and-modules.html#使用包crate-和模块管理不断增长的项目","ch07-01-packages-and-crates.html#包和-crate","ch07-02-defining-modules-to-control-scope-and-privacy.html#定义模块来控制作用域与私有性","ch07-02-defining-modules-to-control-scope-and-privacy.html#模块小抄","ch07-02-defining-modules-to-control-scope-and-privacy.html#在模块中对相关代码进行分组","ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html#引用模块项目的路径","ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html#使用-pub-关键字暴露路径","ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html#二进制和库-crate-包的最佳实践","ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html#super-开始的相对路径","ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html#创建公有的结构体和枚举","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#使用-use-关键字将路径引入作用域","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#创建惯用的-use-路径","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#使用-as-关键字提供新的名称","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#使用-pub-use-重导出名称","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#使用外部包","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#嵌套路径来消除大量的-use-行","ch07-04-bringing-paths-into-scope-with-the-use-keyword.html#通过-glob-运算符将所有的公有定义引入作用域","ch07-05-separating-modules-into-different-files.html#将模块拆分成多个文件","ch07-05-separating-modules-into-different-files.html#另一种文件路径","ch07-05-separating-modules-into-different-files.html#总结","ch08-00-common-collections.html#常见集合","ch08-01-vectors.html#使用-vector-储存列表","ch08-01-vectors.html#新建-vector","ch08-01-vectors.html#更新-vector","ch08-01-vectors.html#读取-vector-的元素","ch08-01-vectors.html#遍历-vector-中的元素","ch08-01-vectors.html#使用枚举来储存多种类型","ch08-01-vectors.html#丢弃-vector-时也会丢弃其所有元素","ch08-02-strings.html#使用字符串储存-utf-8-编码的文本","ch08-02-strings.html#什么是字符串","ch08-02-strings.html#新建字符串","ch08-02-strings.html#更新字符串","ch08-02-strings.html#索引字符串","ch08-02-strings.html#字符串-slice","ch08-02-strings.html#遍历字符串的方法","ch08-02-strings.html#字符串并不简单","ch08-03-hash-maps.html#使用-hash-map-储存键值对","ch08-03-hash-maps.html#新建一个哈希-map","ch08-03-hash-maps.html#访问哈希-map-中的值","ch08-03-hash-maps.html#哈希-map-和所有权","ch08-03-hash-maps.html#更新哈希-map","ch08-03-hash-maps.html#哈希函数","ch08-03-hash-maps.html#总结","ch09-00-error-handling.html#错误处理","ch09-01-unrecoverable-errors-with-panic.html#用-panic-处理不可恢复的错误","ch09-01-unrecoverable-errors-with-panic.html#对应-panic-时的栈展开或终止","ch09-01-unrecoverable-errors-with-panic.html#使用-panic-的-backtrace","ch09-02-recoverable-errors-with-result.html#用-result-处理可恢复的错误","ch09-02-recoverable-errors-with-result.html#匹配不同的错误","ch09-02-recoverable-errors-with-result.html#失败时-panic-的简写unwrap-和-expect","ch09-02-recoverable-errors-with-result.html#传播错误","ch09-02-recoverable-errors-with-result.html#传播错误的简写-运算符","ch09-02-recoverable-errors-with-result.html#哪里可以使用--运算符","ch09-03-to-panic-or-not-to-panic.html#要不要-panic","ch09-03-to-panic-or-not-to-panic.html#示例代码原型和测试都非常适合-panic","ch09-03-to-panic-or-not-to-panic.html#当我们比编译器知道更多的情况","ch09-03-to-panic-or-not-to-panic.html#错误处理指导原则","ch09-03-to-panic-or-not-to-panic.html#创建自定义类型进行有效性验证","ch09-03-to-panic-or-not-to-panic.html#总结","ch10-00-generics.html#泛型trait-和生命周期","ch10-00-generics.html#提取函数来减少重复","ch10-01-syntax.html#泛型数据类型","ch10-01-syntax.html#在函数定义中使用泛型","ch10-01-syntax.html#结构体定义中的泛型","ch10-01-syntax.html#枚举定义中的泛型","ch10-01-syntax.html#方法定义中的泛型","ch10-01-syntax.html#泛型代码的性能","ch10-02-traits.html#trait定义共同行为","ch10-02-traits.html#定义-trait","ch10-02-traits.html#为类型实现-trait","ch10-02-traits.html#默认实现","ch10-02-traits.html#trait-作为参数","ch10-02-traits.html#返回实现了-trait-的类型","ch10-02-traits.html#使用-trait-bound-有条件地实现方法","ch10-03-lifetime-syntax.html#生命周期确保引用有效","ch10-03-lifetime-syntax.html#生命周期避免了悬垂引用","ch10-03-lifetime-syntax.html#函数中的泛型生命周期","ch10-03-lifetime-syntax.html#生命周期注解语法","ch10-03-lifetime-syntax.html#函数签名中的生命周期注解","ch10-03-lifetime-syntax.html#深入理解生命周期","ch10-03-lifetime-syntax.html#结构体定义中的生命周期注解","ch10-03-lifetime-syntax.html#生命周期省略lifetime-elision","ch10-03-lifetime-syntax.html#方法定义中的生命周期注解","ch10-03-lifetime-syntax.html#静态生命周期","ch10-03-lifetime-syntax.html#结合泛型类型参数trait-bounds-和生命周期","ch10-03-lifetime-syntax.html#总结","ch11-00-testing.html#编写自动化测试","ch11-01-writing-tests.html#如何编写测试","ch11-01-writing-tests.html#测试函数剖析","ch11-01-writing-tests.html#使用-assert-宏来检查结果","ch11-01-writing-tests.html#使用-assert_eq-和-assert_ne-宏来测试相等","ch11-01-writing-tests.html#自定义失败信息","ch11-01-writing-tests.html#使用-should_panic-检查-panic","ch11-01-writing-tests.html#将-result-用于测试","ch11-02-running-tests.html#控制测试如何运行","ch11-02-running-tests.html#并行或连续的运行测试","ch11-02-running-tests.html#显示函数输出","ch11-02-running-tests.html#通过指定名字来运行部分测试","ch11-02-running-tests.html#除非特别指定否则忽略某些测试","ch11-03-test-organization.html#测试的组织结构","ch11-03-test-organization.html#单元测试","ch11-03-test-organization.html#集成测试","ch11-03-test-organization.html#总结","ch12-00-an-io-project.html#一个-io-项目构建一个命令行程序","ch12-01-accepting-command-line-arguments.html#接受命令行参数","ch12-01-accepting-command-line-arguments.html#读取参数值","ch12-01-accepting-command-line-arguments.html#args-函数和无效的-unicode","ch12-01-accepting-command-line-arguments.html#将参数值保存进变量","ch12-02-reading-a-file.html#读取文件","ch12-03-improving-error-handling-and-modularity.html#重构改进模块性和错误处理","ch12-03-improving-error-handling-and-modularity.html#二进制项目的关注分离","ch12-03-improving-error-handling-and-modularity.html#提取参数解析器","ch12-03-improving-error-handling-and-modularity.html#组合配置值","ch12-03-improving-error-handling-and-modularity.html#创建一个-config-的构造函数","ch12-03-improving-error-handling-and-modularity.html#修复错误处理","ch12-03-improving-error-handling-and-modularity.html#从-main-提取逻辑","ch12-03-improving-error-handling-and-modularity.html#将代码拆分到库-crate","ch12-04-testing-the-librarys-functionality.html#采用测试驱动开发完善库的功能","ch12-04-testing-the-librarys-functionality.html#编写失败测试","ch12-04-testing-the-librarys-functionality.html#编写使测试通过的代码","ch12-05-working-with-environment-variables.html#处理环境变量","ch12-05-working-with-environment-variables.html#编写一个大小写不敏感-search-函数的失败测试","ch12-05-working-with-environment-variables.html#实现-search_case_insensitive-函数","ch12-06-writing-to-stderr-instead-of-stdout.html#将错误信息输出到标准错误而不是标准输出","ch12-06-writing-to-stderr-instead-of-stdout.html#检查错误应该写入何处","ch12-06-writing-to-stderr-instead-of-stdout.html#将错误打印到标准错误","ch12-06-writing-to-stderr-instead-of-stdout.html#总结","ch13-00-functional-features.html#rust-中的函数式语言功能迭代器与闭包","ch13-01-closures.html#闭包可以捕获环境的匿名函数","ch13-01-closures.html#闭包会捕获其环境","ch13-01-closures.html#闭包类型推断和注解","ch13-01-closures.html#捕获引用或者移动所有权","ch13-01-closures.html#将被捕获的值移出闭包和-fn-trait","ch13-02-iterators.html#使用迭代器处理元素序列","ch13-02-iterators.html#iterator-trait-和-next-方法","ch13-02-iterators.html#消费迭代器的方法","ch13-02-iterators.html#产生其他迭代器的方法","ch13-02-iterators.html#使用捕获其环境的闭包","ch13-03-improving-our-io-project.html#改进-io-项目","ch13-03-improving-our-io-project.html#使用迭代器去除-clone","ch13-03-improving-our-io-project.html#使用迭代器适配器来使代码更简明","ch13-03-improving-our-io-project.html#选择循环或迭代器","ch13-04-performance.html#性能对比循环-vs-迭代器","ch13-04-performance.html#总结","ch14-00-more-about-cargo.html#进一步认识-cargo-和-cratesio","ch14-01-release-profiles.html#采用发布配置自定义构建","ch14-02-publishing-to-crates-io.html#将-crate-发布到-cratesio","ch14-02-publishing-to-crates-io.html#编写有用的文档注释","ch14-02-publishing-to-crates-io.html#使用-pub-use-导出合适的公有-api","ch14-02-publishing-to-crates-io.html#创建-cratesio-账号","ch14-02-publishing-to-crates-io.html#向新-crate-添加元信息","ch14-02-publishing-to-crates-io.html#发布到-cratesio","ch14-02-publishing-to-crates-io.html#发布现存-crate-的新版本","ch14-02-publishing-to-crates-io.html#使用-cargo-yank-从-cratesio-弃用版本","ch14-03-cargo-workspaces.html#cargo-工作空间","ch14-03-cargo-workspaces.html#创建工作空间","ch14-03-cargo-workspaces.html#在工作空间中创建第二个包","ch14-04-installing-binaries.html#使用-cargo-install-安装二进制文件","ch14-05-extending-cargo.html#cargo-自定义扩展命令","ch14-05-extending-cargo.html#总结","ch15-00-smart-pointers.html#智能指针","ch15-01-box.html#使用box指向堆上的数据","ch15-01-box.html#使用-box-在堆上储存数据","ch15-01-box.html#box-允许创建递归类型","ch15-01-box.html#计算非递归类型的大小","ch15-01-box.html#使用-box-给递归类型一个已知的大小","ch15-02-deref.html#通过-deref-trait-将智能指针当作常规引用处理","ch15-02-deref.html#追踪指针的值","ch15-02-deref.html#像引用一样使用-box","ch15-02-deref.html#自定义智能指针","ch15-02-deref.html#通过实现-deref-trait-将某类型像引用一样处理","ch15-02-deref.html#函数和方法的隐式-deref-强制转换","ch15-02-deref.html#deref-强制转换如何与可变性交互","ch15-03-drop.html#使用-drop-trait-运行清理代码","ch15-04-rc.html#rc-引用计数智能指针","ch15-04-rc.html#使用-rc-共享数据","ch15-04-rc.html#克隆-rc-会增加引用计数","ch15-05-interior-mutability.html#refcell-和内部可变性模式","ch15-05-interior-mutability.html#通过-refcell-在运行时检查借用规则","ch15-05-interior-mutability.html#内部可变性不可变值的可变借用","ch15-05-interior-mutability.html#refcell-在运行时记录借用","ch15-05-interior-mutability.html#结合-rc-和-refcell-来拥有多个可变数据所有者","ch15-06-reference-cycles.html#引用循环与内存泄漏","ch15-06-reference-cycles.html#制造引用循环","ch15-06-reference-cycles.html#避免引用循环将-rc-变为-weak","ch15-06-reference-cycles.html#总结","ch16-00-concurrency.html#无畏并发","ch16-01-threads.html#使用线程同时运行代码","ch16-01-threads.html#使用-spawn-创建新线程","ch16-01-threads.html#将-move-闭包与线程一同使用","ch16-02-message-passing.html#使用消息传递在线程间传送数据","ch16-02-message-passing.html#信道与所有权转移","ch16-02-message-passing.html#发送多个值并观察接收者的等待","ch16-02-message-passing.html#通过克隆发送者来创建多个生产者","ch16-03-shared-state.html#共享状态的并发","ch16-03-shared-state.html#使用互斥器实现同一时刻只允许一个线程访问数据","ch16-03-shared-state.html#mutex的-api","ch16-03-shared-state.html#refcellrc-与-mutexarc-的相似性","ch16-04-extensible-concurrency-sync-and-send.html#使用-sync-和-send-trait-的可扩展并发","ch16-04-extensible-concurrency-sync-and-send.html#通过-send-允许在线程间转移所有权","ch16-04-extensible-concurrency-sync-and-send.html#sync-允许多线程访问","ch16-04-extensible-concurrency-sync-and-send.html#手动实现-send-和-sync-是不安全的","ch16-04-extensible-concurrency-sync-and-send.html#总结","ch17-00-async-await.html#async-和-await","ch17-00-async-await.html#并行与并发","ch17-01-futures-and-syntax.html#futures-和-async-语法","ch17-01-futures-and-syntax.html#第一个异步程序","ch17-02-concurrency-with-async.html#并发与-async","ch17-02-concurrency-with-async.html#计数","ch17-02-concurrency-with-async.html#消息传递","ch17-03-more-futures.html#使用任意数量的-futures","ch17-03-more-futures.html#future-竞争","ch17-03-more-futures.html#yielding","ch17-03-more-futures.html#构建我们自己的异步抽象","ch17-04-streams.html#流streams","ch17-04-streams.html#组合流","ch17-05-traits-for-async.html#深入理解-async-相关的-traits","ch17-06-futures-tasks-threads.html#futures任务tasks和线程threads","ch18-00-oop.html#rust-的面向对象特性","ch18-01-what-is-oo.html#面向对象语言的特征","ch18-01-what-is-oo.html#对象包含数据和行为","ch18-01-what-is-oo.html#封装隐藏了实现细节","ch18-01-what-is-oo.html#继承作为类型系统与代码共享","ch18-02-trait-objects.html#顾及不同类型值的-trait-对象","ch18-02-trait-objects.html#定义通用行为的-trait","ch18-02-trait-objects.html#实现-trait","ch18-02-trait-objects.html#trait-对象执行动态分发","ch18-03-oo-design-patterns.html#面向对象设计模式的实现","ch18-03-oo-design-patterns.html#定义-post-并新建一个草案状态的实例","ch18-03-oo-design-patterns.html#存放博文内容的文本","ch18-03-oo-design-patterns.html#确保博文草案的内容是空的","ch18-03-oo-design-patterns.html#请求审核博文来改变其状态","ch18-03-oo-design-patterns.html#增加改变-content-行为的-approve-方法","ch18-03-oo-design-patterns.html#状态模式的权衡取舍","ch18-03-oo-design-patterns.html#总结","ch19-00-patterns.html#模式与模式匹配","ch19-01-all-the-places-for-patterns.html#所有可能会用到模式的位置","ch19-01-all-the-places-for-patterns.html#match-分支","ch19-01-all-the-places-for-patterns.html#if-let-条件表达式","ch19-01-all-the-places-for-patterns.html#while-let-条件循环","ch19-01-all-the-places-for-patterns.html#for-循环","ch19-01-all-the-places-for-patterns.html#let-语句","ch19-01-all-the-places-for-patterns.html#函数参数","ch19-02-refutability.html#refutability可反驳性-模式是否会匹配失效","ch19-03-pattern-syntax.html#所有的模式语法","ch19-03-pattern-syntax.html#匹配字面值","ch19-03-pattern-syntax.html#匹配命名变量","ch19-03-pattern-syntax.html#多个模式","ch19-03-pattern-syntax.html#通过--匹配值的范围","ch19-03-pattern-syntax.html#解构并分解值","ch19-03-pattern-syntax.html#忽略模式中的值","ch19-03-pattern-syntax.html#匹配守卫提供的额外条件","ch19-03-pattern-syntax.html#-绑定","ch19-03-pattern-syntax.html#总结","ch20-00-advanced-features.html#高级特征","ch20-01-unsafe-rust.html#不安全-rust","ch20-01-unsafe-rust.html#不安全的超能力","ch20-01-unsafe-rust.html#解引用裸指针","ch20-01-unsafe-rust.html#调用不安全函数或方法","ch20-01-unsafe-rust.html#访问或修改可变静态变量","ch20-01-unsafe-rust.html#实现不安全-trait","ch20-01-unsafe-rust.html#访问联合体中的字段","ch20-01-unsafe-rust.html#何时使用不安全代码","ch20-03-advanced-traits.html#高级-trait","ch20-03-advanced-traits.html#关联类型在-trait-定义中指定占位符类型","ch20-03-advanced-traits.html#默认泛型类型参数和运算符重载","ch20-03-advanced-traits.html#完全限定语法与消歧义调用相同名称的方法","ch20-03-advanced-traits.html#父-trait-用于在另一个-trait-中使用某-trait-的功能","ch20-03-advanced-traits.html#newtype-模式用以在外部类型上实现外部-trait","ch20-04-advanced-types.html#高级类型","ch20-04-advanced-types.html#为了类型安全和抽象而使用-newtype-模式","ch20-04-advanced-types.html#类型别名用来创建类型同义词","ch20-04-advanced-types.html#从不返回的-never-type","ch20-04-advanced-types.html#动态大小类型和-sized-trait","ch20-05-advanced-functions-and-closures.html#高级函数与闭包","ch20-05-advanced-functions-and-closures.html#函数指针","ch20-05-advanced-functions-and-closures.html#返回闭包","ch20-06-macros.html#宏","ch20-06-macros.html#宏和函数的区别","ch20-06-macros.html#使用-macro_rules-的声明宏用于通用元编程","ch20-06-macros.html#用于从属性生成代码的过程宏","ch20-06-macros.html#如何编写自定义-derive-宏","ch20-06-macros.html#类属性宏","ch20-06-macros.html#类函数宏","ch20-06-macros.html#总结","ch21-00-final-project-a-web-server.html#最后的项目构建多线程-web-server","ch21-01-single-threaded.html#构建单线程-web-server","ch21-01-single-threaded.html#监听-tcp-连接","ch21-01-single-threaded.html#读取请求","ch21-01-single-threaded.html#编写响应","ch21-01-single-threaded.html#返回真正的-html","ch21-01-single-threaded.html#验证请求并有选择的进行响应","ch21-01-single-threaded.html#少量代码重构","ch21-02-multithreaded.html#将单线程-server-变为多线程-server","ch21-02-multithreaded.html#在当前-server-实现中模拟慢请求","ch21-02-multithreaded.html#使用线程池改善吞吐量","ch21-03-graceful-shutdown-and-cleanup.html#优雅停机与清理","ch21-03-graceful-shutdown-and-cleanup.html#为-threadpool-实现-drop-trait","ch21-03-graceful-shutdown-and-cleanup.html#向线程发送信号使其停止接收任务","ch21-03-graceful-shutdown-and-cleanup.html#总结","appendix-00.html#附录","appendix-01-keywords.html#附录-a关键字","appendix-01-keywords.html#目前正在使用的关键字","appendix-01-keywords.html#保留做将来使用的关键字","appendix-01-keywords.html#原始标识符","appendix-02-operators.html#附录-b运算符与符号","appendix-02-operators.html#运算符","appendix-02-operators.html#非运算符符号","appendix-03-derivable-traits.html#附录-c可派生的-trait","appendix-03-derivable-traits.html#用于程序员输出的-debug","appendix-03-derivable-traits.html#等值比较的-partialeq-和-eq","appendix-03-derivable-traits.html#次序比较的-partialord-和-ord","appendix-03-derivable-traits.html#复制值的-clone-和-copy","appendix-03-derivable-traits.html#固定大小的值到值映射的-hash","appendix-03-derivable-traits.html#默认值的-default","appendix-04-useful-development-tools.html#附录-d实用开发工具","appendix-04-useful-development-tools.html#通过-rustfmt-自动格式化","appendix-04-useful-development-tools.html#通过-rustfix-修复代码","appendix-04-useful-development-tools.html#通过-clippy-提供更多-lint-功能","appendix-04-useful-development-tools.html#使用-rust-analyzer-的-ide-集成","appendix-05-editions.html#附录-e版本","appendix-06-translation.html#附录-f本书译本","appendix-07-nightly-rust.html#附录-grust-是如何开发的与-nightly-rust","appendix-07-nightly-rust.html#无停滞稳定","appendix-07-nightly-rust.html#choo-choo-发布通道和发布时刻表riding-the-trains","appendix-07-nightly-rust.html#不稳定功能","appendix-07-nightly-rust.html#rustup-和-rust-nightly-的职责","appendix-07-nightly-rust.html#rfc-过程和团队"],"index":{"documentStore":{"docInfo":{"0":{"body":33,"breadcrumbs":2,"title":1},"1":{"body":22,"breadcrumbs":0,"title":0},"10":{"body":47,"breadcrumbs":0,"title":0},"100":{"body":48,"breadcrumbs":0,"title":0},"101":{"body":225,"breadcrumbs":0,"title":0},"102":{"body":197,"breadcrumbs":1,"title":1},"103":{"body":82,"breadcrumbs":2,"title":1},"104":{"body":75,"breadcrumbs":1,"title":0},"105":{"body":114,"breadcrumbs":2,"title":1},"106":{"body":98,"breadcrumbs":1,"title":0},"107":{"body":67,"breadcrumbs":2,"title":1},"108":{"body":116,"breadcrumbs":0,"title":0},"109":{"body":5,"breadcrumbs":0,"title":0},"11":{"body":4,"breadcrumbs":0,"title":0},"110":{"body":28,"breadcrumbs":2,"title":1},"111":{"body":87,"breadcrumbs":3,"title":1},"112":{"body":13,"breadcrumbs":1,"title":0},"113":{"body":70,"breadcrumbs":1,"title":0},"114":{"body":72,"breadcrumbs":1,"title":0},"115":{"body":156,"breadcrumbs":1,"title":0},"116":{"body":161,"breadcrumbs":2,"title":1},"117":{"body":20,"breadcrumbs":2,"title":1},"118":{"body":32,"breadcrumbs":2,"title":1},"119":{"body":93,"breadcrumbs":1,"title":0},"12":{"body":14,"breadcrumbs":0,"title":0},"120":{"body":151,"breadcrumbs":3,"title":1},"121":{"body":89,"breadcrumbs":3,"title":1},"122":{"body":33,"breadcrumbs":2,"title":0},"123":{"body":45,"breadcrumbs":4,"title":2},"124":{"body":60,"breadcrumbs":2,"title":0},"125":{"body":133,"breadcrumbs":3,"title":1},"126":{"body":11,"breadcrumbs":3,"title":1},"127":{"body":85,"breadcrumbs":1,"title":0},"128":{"body":19,"breadcrumbs":1,"title":0},"129":{"body":5,"breadcrumbs":1,"title":0},"13":{"body":16,"breadcrumbs":0,"title":0},"130":{"body":18,"breadcrumbs":0,"title":0},"131":{"body":8,"breadcrumbs":2,"title":1},"132":{"body":47,"breadcrumbs":2,"title":1},"133":{"body":21,"breadcrumbs":2,"title":1},"134":{"body":158,"breadcrumbs":2,"title":1},"135":{"body":42,"breadcrumbs":2,"title":1},"136":{"body":36,"breadcrumbs":1,"title":0},"137":{"body":25,"breadcrumbs":2,"title":1},"138":{"body":12,"breadcrumbs":4,"title":2},"139":{"body":22,"breadcrumbs":2,"title":0},"14":{"body":1,"breadcrumbs":0,"title":0},"140":{"body":87,"breadcrumbs":2,"title":0},"141":{"body":167,"breadcrumbs":2,"title":0},"142":{"body":210,"breadcrumbs":2,"title":0},"143":{"body":49,"breadcrumbs":3,"title":1},"144":{"body":20,"breadcrumbs":2,"title":0},"145":{"body":23,"breadcrumbs":2,"title":0},"146":{"body":22,"breadcrumbs":4,"title":2},"147":{"body":32,"breadcrumbs":3,"title":1},"148":{"body":53,"breadcrumbs":3,"title":1},"149":{"body":34,"breadcrumbs":3,"title":1},"15":{"body":33,"breadcrumbs":3,"title":3},"150":{"body":106,"breadcrumbs":3,"title":1},"151":{"body":16,"breadcrumbs":2,"title":0},"152":{"body":20,"breadcrumbs":2,"title":0},"153":{"body":17,"breadcrumbs":0,"title":0},"154":{"body":18,"breadcrumbs":2,"title":1},"155":{"body":59,"breadcrumbs":2,"title":1},"156":{"body":153,"breadcrumbs":3,"title":2},"157":{"body":138,"breadcrumbs":2,"title":1},"158":{"body":99,"breadcrumbs":1,"title":0},"159":{"body":84,"breadcrumbs":4,"title":3},"16":{"body":10,"breadcrumbs":2,"title":2},"160":{"body":87,"breadcrumbs":1,"title":0},"161":{"body":110,"breadcrumbs":1,"title":0},"162":{"body":246,"breadcrumbs":1,"title":0},"163":{"body":18,"breadcrumbs":2,"title":1},"164":{"body":5,"breadcrumbs":2,"title":1},"165":{"body":33,"breadcrumbs":1,"title":0},"166":{"body":17,"breadcrumbs":1,"title":0},"167":{"body":160,"breadcrumbs":1,"title":0},"168":{"body":8,"breadcrumbs":1,"title":0},"169":{"body":18,"breadcrumbs":2,"title":1},"17":{"body":28,"breadcrumbs":1,"title":1},"170":{"body":156,"breadcrumbs":1,"title":0},"171":{"body":5,"breadcrumbs":1,"title":0},"172":{"body":195,"breadcrumbs":1,"title":0},"173":{"body":151,"breadcrumbs":1,"title":0},"174":{"body":33,"breadcrumbs":1,"title":0},"175":{"body":200,"breadcrumbs":1,"title":0},"176":{"body":35,"breadcrumbs":1,"title":0},"177":{"body":11,"breadcrumbs":3,"title":1},"178":{"body":39,"breadcrumbs":3,"title":1},"179":{"body":165,"breadcrumbs":3,"title":1},"18":{"body":9,"breadcrumbs":0,"title":0},"180":{"body":240,"breadcrumbs":2,"title":0},"181":{"body":203,"breadcrumbs":3,"title":1},"182":{"body":194,"breadcrumbs":3,"title":1},"183":{"body":100,"breadcrumbs":4,"title":2},"184":{"body":9,"breadcrumbs":1,"title":0},"185":{"body":144,"breadcrumbs":1,"title":0},"186":{"body":137,"breadcrumbs":1,"title":0},"187":{"body":15,"breadcrumbs":1,"title":0},"188":{"body":202,"breadcrumbs":1,"title":0},"189":{"body":100,"breadcrumbs":1,"title":0},"19":{"body":4,"breadcrumbs":0,"title":0},"190":{"body":35,"breadcrumbs":1,"title":0},"191":{"body":129,"breadcrumbs":3,"title":2},"192":{"body":83,"breadcrumbs":1,"title":0},"193":{"body":12,"breadcrumbs":1,"title":0},"194":{"body":51,"breadcrumbs":3,"title":2},"195":{"body":10,"breadcrumbs":1,"title":0},"196":{"body":32,"breadcrumbs":0,"title":0},"197":{"body":10,"breadcrumbs":0,"title":0},"198":{"body":374,"breadcrumbs":0,"title":0},"199":{"body":421,"breadcrumbs":1,"title":1},"2":{"body":14,"breadcrumbs":0,"title":0},"20":{"body":20,"breadcrumbs":4,"title":2},"200":{"body":234,"breadcrumbs":2,"title":2},"201":{"body":205,"breadcrumbs":0,"title":0},"202":{"body":448,"breadcrumbs":2,"title":2},"203":{"body":62,"breadcrumbs":2,"title":2},"204":{"body":25,"breadcrumbs":0,"title":0},"205":{"body":9,"breadcrumbs":0,"title":0},"206":{"body":216,"breadcrumbs":0,"title":0},"207":{"body":207,"breadcrumbs":0,"title":0},"208":{"body":180,"breadcrumbs":0,"title":0},"209":{"body":10,"breadcrumbs":0,"title":0},"21":{"body":30,"breadcrumbs":2,"title":0},"210":{"body":88,"breadcrumbs":0,"title":0},"211":{"body":387,"breadcrumbs":0,"title":0},"212":{"body":5,"breadcrumbs":0,"title":0},"213":{"body":27,"breadcrumbs":2,"title":1},"214":{"body":32,"breadcrumbs":1,"title":0},"215":{"body":31,"breadcrumbs":1,"title":0},"216":{"body":64,"breadcrumbs":3,"title":2},"217":{"body":53,"breadcrumbs":1,"title":0},"218":{"body":121,"breadcrumbs":1,"title":0},"219":{"body":21,"breadcrumbs":1,"title":0},"22":{"body":38,"breadcrumbs":3,"title":1},"220":{"body":18,"breadcrumbs":1,"title":0},"221":{"body":62,"breadcrumbs":1,"title":0},"222":{"body":88,"breadcrumbs":1,"title":0},"223":{"body":76,"breadcrumbs":2,"title":1},"224":{"body":354,"breadcrumbs":1,"title":0},"225":{"body":347,"breadcrumbs":2,"title":1},"226":{"body":126,"breadcrumbs":2,"title":1},"227":{"body":17,"breadcrumbs":1,"title":0},"228":{"body":324,"breadcrumbs":1,"title":0},"229":{"body":530,"breadcrumbs":1,"title":0},"23":{"body":29,"breadcrumbs":3,"title":1},"230":{"body":7,"breadcrumbs":1,"title":0},"231":{"body":130,"breadcrumbs":2,"title":1},"232":{"body":759,"breadcrumbs":2,"title":1},"233":{"body":15,"breadcrumbs":1,"title":0},"234":{"body":13,"breadcrumbs":1,"title":0},"235":{"body":52,"breadcrumbs":1,"title":0},"236":{"body":4,"breadcrumbs":1,"title":0},"237":{"body":15,"breadcrumbs":2,"title":1},"238":{"body":7,"breadcrumbs":1,"title":0},"239":{"body":145,"breadcrumbs":1,"title":0},"24":{"body":63,"breadcrumbs":2,"title":0},"240":{"body":177,"breadcrumbs":1,"title":0},"241":{"body":203,"breadcrumbs":1,"title":0},"242":{"body":328,"breadcrumbs":3,"title":2},"243":{"body":48,"breadcrumbs":1,"title":0},"244":{"body":73,"breadcrumbs":4,"title":3},"245":{"body":41,"breadcrumbs":1,"title":0},"246":{"body":113,"breadcrumbs":1,"title":0},"247":{"body":85,"breadcrumbs":1,"title":0},"248":{"body":10,"breadcrumbs":3,"title":1},"249":{"body":603,"breadcrumbs":3,"title":1},"25":{"body":28,"breadcrumbs":4,"title":2},"250":{"body":267,"breadcrumbs":2,"title":0},"251":{"body":5,"breadcrumbs":2,"title":0},"252":{"body":98,"breadcrumbs":2,"title":1},"253":{"body":5,"breadcrumbs":1,"title":0},"254":{"body":12,"breadcrumbs":4,"title":2},"255":{"body":84,"breadcrumbs":2,"title":0},"256":{"body":11,"breadcrumbs":6,"title":2},"257":{"body":166,"breadcrumbs":4,"title":0},"258":{"body":270,"breadcrumbs":7,"title":3},"259":{"body":25,"breadcrumbs":5,"title":1},"26":{"body":103,"breadcrumbs":3,"title":1},"260":{"body":130,"breadcrumbs":5,"title":1},"261":{"body":43,"breadcrumbs":5,"title":1},"262":{"body":5,"breadcrumbs":5,"title":1},"263":{"body":31,"breadcrumbs":7,"title":3},"264":{"body":11,"breadcrumbs":4,"title":1},"265":{"body":58,"breadcrumbs":3,"title":0},"266":{"body":458,"breadcrumbs":3,"title":0},"267":{"body":73,"breadcrumbs":6,"title":2},"268":{"body":22,"breadcrumbs":4,"title":1},"269":{"body":6,"breadcrumbs":3,"title":0},"27":{"body":119,"breadcrumbs":3,"title":1},"270":{"body":40,"breadcrumbs":0,"title":0},"271":{"body":15,"breadcrumbs":2,"title":1},"272":{"body":32,"breadcrumbs":2,"title":1},"273":{"body":217,"breadcrumbs":2,"title":1},"274":{"body":44,"breadcrumbs":1,"title":0},"275":{"body":81,"breadcrumbs":2,"title":1},"276":{"body":20,"breadcrumbs":4,"title":2},"277":{"body":86,"breadcrumbs":2,"title":0},"278":{"body":33,"breadcrumbs":3,"title":1},"279":{"body":101,"breadcrumbs":2,"title":0},"28":{"body":10,"breadcrumbs":3,"title":1},"280":{"body":84,"breadcrumbs":4,"title":2},"281":{"body":162,"breadcrumbs":3,"title":1},"282":{"body":29,"breadcrumbs":3,"title":1},"283":{"body":322,"breadcrumbs":4,"title":2},"284":{"body":11,"breadcrumbs":2,"title":1},"285":{"body":177,"breadcrumbs":2,"title":1},"286":{"body":111,"breadcrumbs":2,"title":1},"287":{"body":14,"breadcrumbs":2,"title":1},"288":{"body":25,"breadcrumbs":2,"title":1},"289":{"body":539,"breadcrumbs":1,"title":0},"29":{"body":14,"breadcrumbs":3,"title":1},"290":{"body":231,"breadcrumbs":2,"title":1},"291":{"body":128,"breadcrumbs":3,"title":2},"292":{"body":14,"breadcrumbs":0,"title":0},"293":{"body":252,"breadcrumbs":0,"title":0},"294":{"body":412,"breadcrumbs":2,"title":2},"295":{"body":9,"breadcrumbs":0,"title":0},"296":{"body":28,"breadcrumbs":0,"title":0},"297":{"body":16,"breadcrumbs":0,"title":0},"298":{"body":276,"breadcrumbs":1,"title":1},"299":{"body":274,"breadcrumbs":1,"title":1},"3":{"body":1,"breadcrumbs":1,"title":1},"30":{"body":10,"breadcrumbs":2,"title":0},"300":{"body":117,"breadcrumbs":0,"title":0},"301":{"body":105,"breadcrumbs":0,"title":0},"302":{"body":44,"breadcrumbs":0,"title":0},"303":{"body":60,"breadcrumbs":0,"title":0},"304":{"body":11,"breadcrumbs":0,"title":0},"305":{"body":6,"breadcrumbs":0,"title":0},"306":{"body":396,"breadcrumbs":2,"title":2},"307":{"body":23,"breadcrumbs":2,"title":2},"308":{"body":13,"breadcrumbs":6,"title":3},"309":{"body":25,"breadcrumbs":4,"title":1},"31":{"body":14,"breadcrumbs":0,"title":0},"310":{"body":22,"breadcrumbs":4,"title":1},"311":{"body":12,"breadcrumbs":5,"title":2},"312":{"body":12,"breadcrumbs":3,"title":0},"313":{"body":31,"breadcrumbs":4,"title":2},"314":{"body":21,"breadcrumbs":2,"title":0},"315":{"body":50,"breadcrumbs":6,"title":2},"316":{"body":532,"breadcrumbs":4,"title":0},"317":{"body":9,"breadcrumbs":4,"title":1},"318":{"body":338,"breadcrumbs":3,"title":0},"319":{"body":321,"breadcrumbs":3,"title":0},"32":{"body":57,"breadcrumbs":0,"title":0},"320":{"body":839,"breadcrumbs":4,"title":1},"321":{"body":75,"breadcrumbs":4,"title":1},"322":{"body":374,"breadcrumbs":4,"title":1},"323":{"body":201,"breadcrumbs":3,"title":0},"324":{"body":242,"breadcrumbs":4,"title":1},"325":{"body":60,"breadcrumbs":3,"title":0},"326":{"body":0,"breadcrumbs":6,"title":2},"327":{"body":0,"breadcrumbs":4,"title":1},"328":{"body":22,"breadcrumbs":2,"title":1},"329":{"body":7,"breadcrumbs":1,"title":0},"33":{"body":100,"breadcrumbs":0,"title":0},"330":{"body":40,"breadcrumbs":1,"title":0},"331":{"body":105,"breadcrumbs":1,"title":0},"332":{"body":28,"breadcrumbs":1,"title":0},"333":{"body":35,"breadcrumbs":3,"title":1},"334":{"body":155,"breadcrumbs":3,"title":1},"335":{"body":273,"breadcrumbs":3,"title":1},"336":{"body":14,"breadcrumbs":3,"title":1},"337":{"body":56,"breadcrumbs":1,"title":0},"338":{"body":68,"breadcrumbs":2,"title":1},"339":{"body":61,"breadcrumbs":1,"title":0},"34":{"body":56,"breadcrumbs":0,"title":0},"340":{"body":57,"breadcrumbs":1,"title":0},"341":{"body":138,"breadcrumbs":1,"title":0},"342":{"body":453,"breadcrumbs":3,"title":2},"343":{"body":272,"breadcrumbs":1,"title":0},"344":{"body":5,"breadcrumbs":1,"title":0},"345":{"body":13,"breadcrumbs":0,"title":0},"346":{"body":7,"breadcrumbs":0,"title":0},"347":{"body":31,"breadcrumbs":1,"title":1},"348":{"body":71,"breadcrumbs":0,"title":0},"349":{"body":31,"breadcrumbs":0,"title":0},"35":{"body":43,"breadcrumbs":0,"title":0},"350":{"body":50,"breadcrumbs":0,"title":0},"351":{"body":104,"breadcrumbs":0,"title":0},"352":{"body":50,"breadcrumbs":0,"title":0},"353":{"body":171,"breadcrumbs":2,"title":1},"354":{"body":6,"breadcrumbs":0,"title":0},"355":{"body":17,"breadcrumbs":0,"title":0},"356":{"body":79,"breadcrumbs":0,"title":0},"357":{"body":19,"breadcrumbs":0,"title":0},"358":{"body":47,"breadcrumbs":0,"title":0},"359":{"body":323,"breadcrumbs":0,"title":0},"36":{"body":100,"breadcrumbs":1,"title":1},"360":{"body":288,"breadcrumbs":0,"title":0},"361":{"body":156,"breadcrumbs":0,"title":0},"362":{"body":55,"breadcrumbs":0,"title":0},"363":{"body":4,"breadcrumbs":0,"title":0},"364":{"body":19,"breadcrumbs":0,"title":0},"365":{"body":21,"breadcrumbs":2,"title":1},"366":{"body":18,"breadcrumbs":1,"title":0},"367":{"body":76,"breadcrumbs":1,"title":0},"368":{"body":433,"breadcrumbs":1,"title":0},"369":{"body":55,"breadcrumbs":1,"title":0},"37":{"body":37,"breadcrumbs":1,"title":1},"370":{"body":47,"breadcrumbs":2,"title":1},"371":{"body":6,"breadcrumbs":1,"title":0},"372":{"body":4,"breadcrumbs":1,"title":0},"373":{"body":8,"breadcrumbs":2,"title":1},"374":{"body":112,"breadcrumbs":2,"title":1},"375":{"body":161,"breadcrumbs":1,"title":0},"376":{"body":473,"breadcrumbs":1,"title":0},"377":{"body":305,"breadcrumbs":4,"title":3},"378":{"body":75,"breadcrumbs":3,"title":2},"379":{"body":12,"breadcrumbs":0,"title":0},"38":{"body":24,"breadcrumbs":0,"title":0},"380":{"body":23,"breadcrumbs":1,"title":1},"381":{"body":239,"breadcrumbs":0,"title":0},"382":{"body":157,"breadcrumbs":2,"title":2},"383":{"body":82,"breadcrumbs":2,"title":2},"384":{"body":7,"breadcrumbs":0,"title":0},"385":{"body":114,"breadcrumbs":0,"title":0},"386":{"body":100,"breadcrumbs":0,"title":0},"387":{"body":15,"breadcrumbs":0,"title":0},"388":{"body":13,"breadcrumbs":0,"title":0},"389":{"body":81,"breadcrumbs":1,"title":1},"39":{"body":6,"breadcrumbs":0,"title":0},"390":{"body":30,"breadcrumbs":0,"title":0},"391":{"body":378,"breadcrumbs":1,"title":1},"392":{"body":25,"breadcrumbs":0,"title":0},"393":{"body":20,"breadcrumbs":0,"title":0},"394":{"body":1,"breadcrumbs":0,"title":0},"395":{"body":37,"breadcrumbs":4,"title":2},"396":{"body":33,"breadcrumbs":6,"title":2},"397":{"body":87,"breadcrumbs":5,"title":1},"398":{"body":191,"breadcrumbs":4,"title":0},"399":{"body":82,"breadcrumbs":4,"title":0},"4":{"body":10,"breadcrumbs":0,"title":0},"40":{"body":207,"breadcrumbs":1,"title":1},"400":{"body":102,"breadcrumbs":5,"title":1},"401":{"body":179,"breadcrumbs":4,"title":0},"402":{"body":65,"breadcrumbs":4,"title":0},"403":{"body":7,"breadcrumbs":6,"title":2},"404":{"body":86,"breadcrumbs":5,"title":1},"405":{"body":1638,"breadcrumbs":4,"title":0},"406":{"body":21,"breadcrumbs":2,"title":0},"407":{"body":637,"breadcrumbs":5,"title":3},"408":{"body":649,"breadcrumbs":2,"title":0},"409":{"body":4,"breadcrumbs":2,"title":0},"41":{"body":115,"breadcrumbs":0,"title":0},"410":{"body":5,"breadcrumbs":0,"title":0},"411":{"body":6,"breadcrumbs":0,"title":0},"412":{"body":55,"breadcrumbs":0,"title":0},"413":{"body":13,"breadcrumbs":0,"title":0},"414":{"body":60,"breadcrumbs":0,"title":0},"415":{"body":7,"breadcrumbs":2,"title":1},"416":{"body":155,"breadcrumbs":1,"title":0},"417":{"body":144,"breadcrumbs":1,"title":0},"418":{"body":33,"breadcrumbs":4,"title":2},"419":{"body":7,"breadcrumbs":3,"title":1},"42":{"body":333,"breadcrumbs":0,"title":0},"420":{"body":21,"breadcrumbs":4,"title":2},"421":{"body":30,"breadcrumbs":4,"title":2},"422":{"body":37,"breadcrumbs":4,"title":2},"423":{"body":12,"breadcrumbs":3,"title":1},"424":{"body":19,"breadcrumbs":3,"title":1},"425":{"body":9,"breadcrumbs":2,"title":1},"426":{"body":20,"breadcrumbs":2,"title":1},"427":{"body":73,"breadcrumbs":2,"title":1},"428":{"body":70,"breadcrumbs":3,"title":2},"429":{"body":23,"breadcrumbs":4,"title":3},"43":{"body":117,"breadcrumbs":0,"title":0},"430":{"body":50,"breadcrumbs":2,"title":1},"431":{"body":21,"breadcrumbs":2,"title":1},"432":{"body":8,"breadcrumbs":7,"title":3},"433":{"body":6,"breadcrumbs":4,"title":0},"434":{"body":91,"breadcrumbs":8,"title":4},"435":{"body":8,"breadcrumbs":4,"title":0},"436":{"body":51,"breadcrumbs":7,"title":3},"437":{"body":19,"breadcrumbs":5,"title":1},"44":{"body":54,"breadcrumbs":0,"title":0},"45":{"body":186,"breadcrumbs":0,"title":0},"46":{"body":6,"breadcrumbs":0,"title":0},"47":{"body":11,"breadcrumbs":0,"title":0},"48":{"body":3,"breadcrumbs":0,"title":0},"49":{"body":144,"breadcrumbs":0,"title":0},"5":{"body":2,"breadcrumbs":0,"title":0},"50":{"body":15,"breadcrumbs":0,"title":0},"51":{"body":116,"breadcrumbs":0,"title":0},"52":{"body":70,"breadcrumbs":0,"title":0},"53":{"body":232,"breadcrumbs":0,"title":0},"54":{"body":192,"breadcrumbs":0,"title":0},"55":{"body":57,"breadcrumbs":0,"title":0},"56":{"body":89,"breadcrumbs":0,"title":0},"57":{"body":125,"breadcrumbs":0,"title":0},"58":{"body":134,"breadcrumbs":0,"title":0},"59":{"body":48,"breadcrumbs":0,"title":0},"6":{"body":4,"breadcrumbs":0,"title":0},"60":{"body":6,"breadcrumbs":0,"title":0},"61":{"body":285,"breadcrumbs":0,"title":0},"62":{"body":269,"breadcrumbs":0,"title":0},"63":{"body":5,"breadcrumbs":0,"title":0},"64":{"body":12,"breadcrumbs":0,"title":0},"65":{"body":9,"breadcrumbs":0,"title":0},"66":{"body":14,"breadcrumbs":1,"title":1},"67":{"body":2,"breadcrumbs":0,"title":0},"68":{"body":22,"breadcrumbs":0,"title":0},"69":{"body":23,"breadcrumbs":1,"title":1},"7":{"body":3,"breadcrumbs":0,"title":0},"70":{"body":287,"breadcrumbs":0,"title":0},"71":{"body":42,"breadcrumbs":0,"title":0},"72":{"body":69,"breadcrumbs":0,"title":0},"73":{"body":148,"breadcrumbs":0,"title":0},"74":{"body":222,"breadcrumbs":0,"title":0},"75":{"body":152,"breadcrumbs":2,"title":2},"76":{"body":1,"breadcrumbs":0,"title":0},"77":{"body":147,"breadcrumbs":2,"title":1},"78":{"body":335,"breadcrumbs":2,"title":1},"79":{"body":21,"breadcrumbs":2,"title":1},"8":{"body":9,"breadcrumbs":0,"title":0},"80":{"body":5,"breadcrumbs":1,"title":0},"81":{"body":10,"breadcrumbs":0,"title":0},"82":{"body":139,"breadcrumbs":0,"title":0},"83":{"body":54,"breadcrumbs":0,"title":0},"84":{"body":115,"breadcrumbs":0,"title":0},"85":{"body":29,"breadcrumbs":0,"title":0},"86":{"body":19,"breadcrumbs":0,"title":0},"87":{"body":110,"breadcrumbs":0,"title":0},"88":{"body":81,"breadcrumbs":0,"title":0},"89":{"body":25,"breadcrumbs":0,"title":0},"9":{"body":0,"breadcrumbs":0,"title":0},"90":{"body":55,"breadcrumbs":0,"title":0},"91":{"body":240,"breadcrumbs":1,"title":1},"92":{"body":10,"breadcrumbs":0,"title":0},"93":{"body":129,"breadcrumbs":0,"title":0},"94":{"body":57,"breadcrumbs":0,"title":0},"95":{"body":136,"breadcrumbs":0,"title":0},"96":{"body":39,"breadcrumbs":0,"title":0},"97":{"body":68,"breadcrumbs":1,"title":1},"98":{"body":2,"breadcrumbs":0,"title":0},"99":{"body":9,"breadcrumbs":0,"title":0}},"docs":{"0":{"body":"title-page.md commit d94e03a18a2590ed3f1c67b859cb11528d2a2d5c 本书的英文原版作者为 Steve Klabnik 和 Carol Nichols,并由 Rust 社区补充完善。本简体中文译本由 Rust 中文社区翻译。 本书假设你使用 Rust 1.78.0(2024-05-02 发布)或更新的版本。请查看 第 1 章的 “安装” 部分 了解如何安装和升级 Rust。 本书的英文原版 HTML 格式可以在 https://doc.rust-lang.org/stable/book/ 在线阅读;使用 rustup 安装的 Rust 也包含一份英文离线版,运行 rustup docs --book 即可打开。 本书还有一些社区 翻译版本 。简体中文译本可以在 https://kaisery.github.io/trpl-zh-cn/ 在线阅读。 本书也有 由 No Starch Press 出版的纸质版和电子版 。 🚨 想要具有互动性的学习体验吗?试试 Rust Book 的另一个版本,其中包括测验、高亮、可视化等功能 : https://rust-book.cs.brown.edu","breadcrumbs":"Rust 程序设计语言 » Rust 程序设计语言","id":"0","title":"Rust 程序设计语言"},"1":{"body":"foreword.md commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f Rust 程序设计语言的本质实际在于 赋能 ( empowerment ):无论你现在编写的是何种代码,Rust 能让你在更为广泛的编程领域走得更远,写出自信。(这一点并不显而易见) 举例来说,那些“系统层面”的工作涉及内存管理、数据表示和并发等底层细节。从传统角度来看,这是一个神秘的编程领域,只为浸润多年的极少数人所触及,也只有他们能避开那些臭名昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。 Rust 破除了这些障碍:它消除了旧的陷阱,并提供了伴你一路同行的友好、精良的工具。想要 “深入” 底层控制的程序员可以使用 Rust,无需时刻担心出现崩溃或安全漏洞,也无需因为工具链不靠谱而被迫去了解其中的细节。更妙的是,语言设计本身会自然而然地引导你编写出可靠的代码,并且运行速度和内存使用上都十分高效。 已经在从事编写底层代码的程序员可以使用 Rust 来提升信心。例如,在 Rust 中引入并行是相对低风险的操作,因为编译器会替你找到经典的错误。同时你可以自信地采取更加激进的优化,而不会意外引入崩溃或漏洞。 但 Rust 并不局限于底层系统编程。它表达力强、写起来舒适,让人能够轻松地编写出命令行应用、网络服务器等各种类型的代码——在本书中就有这两者的简单示例。使用 Rust 能让你把在一个领域中学习的技能延伸到另一个领域:你可以通过编写网页应用来学习 Rust,接着将同样的技能应用到你的 Raspberry Pi(树莓派)上。 本书全面介绍了 Rust 为用户赋予的能力。其内容平易近人,致力于帮助你提升 Rust 的知识,并且提升你作为程序员整体的理解与自信。欢迎你加入 Rust 社区,让我们准备深入学习 Rust 吧! —— Nicholas Matsakis 和 Aaron Turon","breadcrumbs":"前言 » 前言","id":"1","title":"前言"},"10":{"body":"本书大体上假设您按从头到尾的顺序阅读。后面的章节建立在前面章节概念的基础上。前面的章节可能不会深入介绍部分主题,而是留待后续章节重新讨论。 本书分为两类章节:概念章节和项目章节。在概念章节中,我们学习 Rust 的某个方面。在项目章节中,我们应用目前所学的知识一同构建小型程序。第二、十二和二十章是项目章节;其余都是概念章节。 第一章介绍如何安装 Rust,如何编写一个 “Hello, world!” 程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第二章是一个编写 Rust 语言的实战介绍,我们会构建一个猜数字游戏。我们会站在较高的层次介绍一些概念,而后续章节将提供更多细节。如果你希望立刻就动手实践一下,第二章是开始的好地方。第三章介绍 Rust 中类似其他编程语言的特性,第四章会学习 Rust 的所有权系统。如果你是一个特别细致的学习者,喜欢在进入下一环节之前学习每一个细节,你可能会想要跳过第二章,直接阅读第三章,等到你想要通过项目应用所学到的细节时再回到第二章。 第五章讨论结构体(struct)和方法,第六章介绍枚举(enum)、match 表达式和 if let 控制流结构。在 Rust 中,创建自定义类型需要用到结构体和枚举。 第七章介绍 Rust 的模块(module)系统,其中的私有性规则用来组织代码和公开的 API(应用程序接口)。第八章讨论标准库提供的常见集合数据结构,例如 Vector(向量)、字符串和 Hash Map(散列表)。第九章探索 Rust 的错误处理的理念与技术。 第十章深入介绍泛型(generic)、Trait 和生命周期(lifetime),这些功能让你能够定义适用于多种类型的代码。第十一章全面讲述了测试,因为就算 Rust 有安全保证,也需要测试确保程序逻辑正确。第十二章中将会构建我们自己的 grep 命令行工具的功能子集实现,用于在文件中搜索文本。为此会用到之前章节讨论的很多概念。 第十三章探索闭包(closure)和迭代器(iterator),这两个 Rust 特性来自函数式编程语言。第十四章会深入探讨 Cargo 并介绍分享代码库的最佳实践。第十五章讨论标准库提供的智能指针以及相关的 Trait。 第十六章将引导我们了解不同的并发编程模型,并探讨 Rust 如何帮助你无畏地进行多线程编程。第十七章将在此基础上进一步探索 Rust 的 async 和 await 语法,以及它们所支持的轻量级并发模型。 第十八章着眼于 Rust 风格与你可能比较熟悉的 OOP(面向对象编程)原则之间的比较。 第十九章介绍模式和模式匹配,它是在 Rust 程序中表达思想的有效方式。第二十章是一个高级主题大杂烩,包括不安全 Rust(unsafe Rust)、宏(macro)和更多关于生命周期、Trait、类型、函数和闭包的内容。 第二十一章我们将会完成一个项目,实现一个底层的、多线程的 Web 服务器! 最后的附录包含了一些关于该语言的实用信息,其格式更像是参考资料。附录 A 涵盖了 Rust 的关键字,附录 B 涵盖了 Rust 的运算符和符号,附录 C 涵盖了标准库提供的可派生 Trait,附录 D 涵盖了一些有用的开发工具,而附录 E 解释了 Rust 版本。在附录 F 中,你可以找到本书的翻译版本,而在附录 G 中,我们将讨论 Rust 是如何制作的以及什么是 nightly Rust。 阅读本书没有错误的方式:如果你想跳过前面的内容,尽管跳过!如果你遇到任何困惑,可能需要回到前面的章节。请采取对你最有效的方式。 学习 Rust 的一个重要部分是学会如何阅读编译器显示的错误信息:它们会指引你编写出能运行的代码。为此,我们将提供许多不能编译的示例,以及在每种情况下编译器将显示的错误信息。请知悉,如果你输入并运行一个随机示例,它可能无法编译!确保你阅读了示例周围的文本,以判断你尝试运行的示例是否出错。Ferris 也将帮助你区分那些不是意在工作的代码: Ferris 含义 这段代码无法通过编译! 这段代码会 Panic! 这段代码的运行结果不符合预期。 在大部分情况,我们会指导你将无法通过编译的代码修改为正确版本。","breadcrumbs":"简介 » 如何阅读本书","id":"10","title":"如何阅读本书"},"100":{"body":"ch06-01-defining-an-enum.md commit bb7e429ad6b59d9a0c37db7434976364cbb9c6da 结构体给予你将字段和数据聚合在一起的方法,像 Rectangle 结构体有 width 和 height 两个字段。而枚举给予你一个途径去声明某个值是一个集合中的一员。比如,我们想让 Rectangle 是一些形状的集合,包含 Circle 和 Triangle 。为了做到这个,Rust 提供了枚举类型。 让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4(version four)和 IPv6(version six)。这是我们的程序可能会遇到的所有可能的 IP 地址类型:所以可以 枚举 出所有可能的值,这也正是此枚举名字的由来。 任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能两者都是。IP 地址的这个特性使得枚举数据结构非常适合这个场景,因为枚举值只可能是其中一个成员。IPv4 和 IPv6 从根本上讲仍是 IP 地址,所以当代码在处理适用于任何类型的 IP 地址的场景时应该把它们当作相同的类型。 可以通过在代码中定义一个 IpAddrKind 枚举来表现这个概念并列出可能的 IP 地址类型,V4 和 V6。这被称为枚举的 成员 ( variants ): enum IpAddrKind { V4, V6,\n}\n# # fn main() {\n# let four = IpAddrKind::V4;\n# let six = IpAddrKind::V6;\n# # route(IpAddrKind::V4);\n# route(IpAddrKind::V6);\n# }\n# # fn route(ip_kind: IpAddrKind) {} 现在 IpAddrKind 就是一个可以在代码中使用的自定义数据类型了。","breadcrumbs":"枚举和模式匹配 » 枚举的定义 » 枚举的定义","id":"100","title":"枚举的定义"},"101":{"body":"可以像这样创建 IpAddrKind 两个不同成员的实例: # enum IpAddrKind {\n# V4,\n# V6,\n# }\n# # fn main() { let four = IpAddrKind::V4; let six = IpAddrKind::V6;\n# # route(IpAddrKind::V4);\n# route(IpAddrKind::V6);\n# }\n# # fn route(ip_kind: IpAddrKind) {} 注意枚举的成员位于其标识符的命名空间中,并使用两个冒号分开。这么设计的益处是现在 IpAddrKind::V4 和 IpAddrKind::V6 都是 IpAddrKind 类型的。例如,接着可以定义一个函数来接收任何 IpAddrKind类型的参数: # enum IpAddrKind {\n# V4,\n# V6,\n# }\n# # fn main() {\n# let four = IpAddrKind::V4;\n# let six = IpAddrKind::V6;\n# # route(IpAddrKind::V4);\n# route(IpAddrKind::V6);\n# }\n# fn route(ip_kind: IpAddrKind) {} 现在可以使用任一成员来调用这个函数: # enum IpAddrKind {\n# V4,\n# V6,\n# }\n# # fn main() {\n# let four = IpAddrKind::V4;\n# let six = IpAddrKind::V6;\n# route(IpAddrKind::V4); route(IpAddrKind::V6);\n# }\n# # fn route(ip_kind: IpAddrKind) {} 使用枚举甚至还有更多优势。进一步考虑一下我们的 IP 地址类型,目前没有一个存储实际 IP 地址 数据 的方法;只知道它是什么 类型 的。考虑到已经在第五章学习过结构体了,你可能会像示例 6-1 那样处理这个问题: # fn main() { enum IpAddrKind { V4, V6, } struct IpAddr { kind: IpAddrKind, address: String, } let home = IpAddr { kind: IpAddrKind::V4, address: String::from(\"127.0.0.1\"), }; let loopback = IpAddr { kind: IpAddrKind::V6, address: String::from(\"::1\"), };\n# } 示例 6-1:将 IP 地址的数据和 IpAddrKind 成员存储在一个 struct 中 这里我们定义了一个有两个字段的结构体 IpAddr:IpAddrKind(之前定义的枚举)类型的 kind 字段和 String 类型 address 字段。我们有这个结构体的两个实例。第一个,home,它的 kind 的值是 IpAddrKind::V4 与之相关联的地址数据是 127.0.0.1。第二个实例,loopback,kind 的值是 IpAddrKind 的另一个成员,V6,关联的地址是 ::1。我们使用了一个结构体来将 kind 和 address 打包在一起,现在枚举成员就与值相关联了。 我们可以使用一种更简洁的方式来表达相同的概念,仅仅使用枚举并将数据直接放进每一个枚举成员而不是将枚举作为结构体的一部分。IpAddr 枚举的新定义表明了 V4 和 V6 成员都关联了 String 值: # fn main() { enum IpAddr { V4(String), V6(String), } let home = IpAddr::V4(String::from(\"127.0.0.1\")); let loopback = IpAddr::V6(String::from(\"::1\"));\n# } 我们直接将数据附加到枚举的每个成员上,这样就不需要一个额外的结构体了。这里也很容易看出枚举工作的另一个细节:每一个我们定义的枚举成员的名字也变成了一个构建枚举的实例的函数。也就是说,IpAddr::V4() 是一个获取 String 参数并返回 IpAddr 类型实例的函数调用。作为定义枚举的结果,这些构造函数会自动被定义。 用枚举替代结构体还有另一个优势:每个成员可以处理不同类型和数量的数据。IPv4 版本的 IP 地址总是含有四个值在 0 和 255 之间的数字部分。如果我们想要将 V4 地址存储为四个 u8 值而 V6 地址仍然表现为一个 String,这就不能使用结构体了。枚举则可以轻易的处理这个情况: # fn main() { enum IpAddr { V4(u8, u8, u8, u8), V6(String), } let home = IpAddr::V4(127, 0, 0, 1); let loopback = IpAddr::V6(String::from(\"::1\"));\n# } 这些代码展示了使用枚举来存储两种不同 IP 地址的几种可能的选择。然而,事实证明存储和编码 IP 地址实在是太常见了 以致标准库提供了一个开箱即用的定义! 让我们看看标准库是如何定义 IpAddr 的:它正有着跟我们定义和使用的一样的枚举和成员,不过它将成员中的地址数据嵌入到了两个不同形式的结构体中,它们对不同的成员的定义是不同的: struct Ipv4Addr { // --snip--\n} struct Ipv6Addr { // --snip--\n} enum IpAddr { V4(Ipv4Addr), V6(Ipv6Addr),\n} 这些代码展示了可以将任意类型的数据放入枚举成员中:例如字符串、数字类型或者结构体。甚至可以包含另一个枚举!另外,标准库中的类型通常并不比你设想出来的要复杂多少。 注意虽然标准库中包含一个 IpAddr 的定义,仍然可以创建和使用我们自己的定义而不会有冲突,因为我们并没有将标准库中的定义引入作用域。第七章会讲到如何导入类型。 来看看示例 6-2 中的另一个枚举的例子:它的成员中内嵌了多种多样的类型: enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(i32, i32, i32),\n}\n# # fn main() {} 示例 6-2:一个 Message 枚举,其每个成员都存储了不同数量和类型的值 这个枚举有四个含有不同类型的成员: Quit 没有关联任何数据。 Move 类似结构体包含命名字段。 Write 包含单独一个 String。 ChangeColor 包含三个 i32。 定义一个如示例 6-2 中所示那样的有关联值的枚举的方式和定义多个不同类型的结构体的方式很相像,除了枚举不使用 struct 关键字以及其所有成员都被组合在一起位于 Message 类型下。如下这些结构体可以包含与之前枚举成员中相同的数据: struct QuitMessage; // 类单元结构体\nstruct MoveMessage { x: i32, y: i32,\n}\nstruct WriteMessage(String); // 元组结构体\nstruct ChangeColorMessage(i32, i32, i32); // 元组结构体\n# # fn main() {} 不过,如果我们使用不同的结构体,由于它们都有不同的类型,我们将不能像使用示例 6-2 中定义的 Message 枚举那样,轻易的定义一个能够处理这些不同类型的结构体的函数,因为枚举是单独一个类型。 结构体和枚举还有另一个相似点:就像可以使用 impl 来为结构体定义方法那样,也可以在枚举上定义方法。这是一个定义于我们 Message 枚举上的叫做 call 的方法: # fn main() {\n# enum Message {\n# Quit,\n# Move { x: i32, y: i32 },\n# Write(String),\n# ChangeColor(i32, i32, i32),\n# }\n# impl Message { fn call(&self) { // 在这里定义方法体 } } let m = Message::Write(String::from(\"hello\")); m.call();\n# } 方法体使用了 self 来获取调用方法的值。这个例子中,创建了一个值为 Message::Write(String::from(\"hello\")) 的变量 m,而且这就是当 m.call() 运行时 call 方法中的 self 的值。 让我们看看标准库中的另一个非常常见且实用的枚举:Option。","breadcrumbs":"枚举和模式匹配 » 枚举的定义 » 枚举值","id":"101","title":"枚举值"},"102":{"body":"这一部分会分析一个 Option 的案例,Option 是标准库定义的另一个枚举。Option 类型应用广泛因为它编码了一个非常普遍的场景,即一个值要么有值要么没值。 例如,如果请求一个非空列表的第一项,会得到一个值,如果请求一个空的列表,就什么也不会得到。从类型系统的角度来表达这个概念就意味着编译器需要检查是否处理了所有应该处理的情况,这样就可以避免在其他编程语言中非常常见的 bug。 编程语言的设计经常要考虑包含哪些功能,但考虑排除哪些功能也很重要。Rust 并没有很多其他语言中有的空值功能。 空值 ( Null )是一个值,它代表没有值。在有空值的语言中,变量总是这两种状态之一:空值和非空值。 Tony Hoare,null 的发明者,在他 2009 年的演讲 “Null References: The Billion Dollar Mistake” 中曾经说到: I call it my billion-dollar mistake. At that time, I was designing the first comprehensive type system for references in an object-oriented language. My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years. 我称之为我十亿美元的错误。当时,我在为一个面向对象语言设计第一个综合性的面向引用的类型系统。我的目标是通过编译器的自动检查来保证所有引用的使用都应该是绝对安全的。不过我未能抵抗住引入一个空引用的诱惑,仅仅是因为它是这么的容易实现。这引发了无数错误、漏洞和系统崩溃,在之后的四十多年中造成了数十亿美元的苦痛和伤害。 空值的问题在于当你尝试像一个非空值那样使用一个空值,会出现某种形式的错误。因为空和非空的属性无处不在,非常容易出现这类错误。 然而,空值尝试表达的概念仍然是有意义的:空值是一个因为某种原因目前无效或缺失的值。 问题不在于概念而在于具体的实现。为此,Rust 并没有空值,不过它确实拥有一个可以编码存在或不存在概念的枚举。这个枚举是 Option,而且它 定义于标准库中 ,如下: enum Option { None, Some(T),\n} Option 枚举是如此有用以至于它甚至被包含在了 prelude 之中,你不需要将其显式引入作用域。另外,它的成员也是如此,可以不需要 Option:: 前缀来直接使用 Some 和 None。即便如此 Option 也仍是常规的枚举,Some(T) 和 None 仍是 Option 的成员。 语法是一个我们还未讲到的 Rust 功能。它是一个泛型类型参数,第十章会更详细的讲解泛型。目前,所有你需要知道的就是 意味着 Option 枚举的 Some 成员可以包含任意类型的数据,同时每一个用于 T 位置的具体类型使得 Option 整体作为不同的类型。这里是一些包含数字类型和字符串类型 Option 值的例子: # fn main() { let some_number = Some(5); let some_char = Some('e'); let absent_number: Option = None;\n# } some_number 的类型是 Option。some_char 的类型是 Option,是不同于some_number的类型。因为我们在 Some 成员中指定了值,Rust 可以推断其类型。对于 absent_number,Rust 需要我们指定 Option 整体的类型,因为编译器只通过 None 值无法推断出 Some 成员保存的值的类型。这里我们告诉 Rust 希望 absent_number 是 Option 类型的。 当有一个 Some 值时,我们就知道存在一个值,而这个值保存在 Some 中。当有个 None 值时,在某种意义上,它跟空值具有相同的意义:并没有一个有效的值。那么,Option 为什么就比空值要好呢? 简而言之,因为 Option 和 T(这里 T 可以是任何类型)是不同的类型,编译器不允许像一个肯定有效的值那样使用 Option。例如,这段代码不能编译,因为它尝试将 Option 与 i8 相加: # fn main() { let x: i8 = 5; let y: Option = Some(5); let sum = x + y;\n# } 如果运行这些代码,将得到类似这样的错误信息: $ cargo run Compiling enums v0.1.0 (file:///projects/enums)\nerror[E0277]: cannot add `Option` to `i8` --> src/main.rs:5:17 |\n5 | let sum = x + y; | ^ no implementation for `i8 + Option` | = help: the trait `Add>` is not implemented for `i8` = help: the following other types implement trait `Add`: `&'a i8` implements `Add` `&i8` implements `Add<&i8>` `i8` implements `Add<&i8>` `i8` implements `Add` For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `enums` (bin \"enums\") due to 1 previous error 很好!事实上,错误信息意味着 Rust 不知道该如何将 Option 与 i8 相加,因为它们的类型不同。当在 Rust 中拥有一个像 i8 这样类型的值时,编译器确保它总是有一个有效的值。我们可以自信使用而无需做空值检查。只有当使用 Option(或者任何用到的类型)的时候需要担心可能没有值,而编译器会确保我们在使用值之前处理了为空的情况。 换句话说,在对 Option 进行运算之前必须将其转换为 T。通常这能帮助我们捕获到空值最常见的问题之一:假设某值不为空但实际上为空的情况。 消除了错误地假设一个非空值的风险,会让你对代码更加有信心。为了拥有一个可能为空的值,你必须要显式的将其放入对应类型的 Option 中。接着,当使用这个值时,必须明确的处理值为空的情况。只要一个值不是 Option 类型,你就 可以 安全的认定它的值不为空。这是 Rust 的一个经过深思熟虑的设计决策,来限制空值的泛滥以增加 Rust 代码的安全性。 那么当有一个 Option 的值时,如何从 Some 成员中取出 T 的值来使用它呢?Option 枚举拥有大量用于各种情况的方法:你可以查看 它的文档 。熟悉 Option 的方法将对你的 Rust 之旅非常有用。 总的来说,为了使用 Option 值,需要编写处理每个成员的代码。你想要一些代码只当拥有 Some(T) 值时运行,允许这些代码使用其中的 T。也希望一些代码只在值为 None 时运行,这些代码并没有一个可用的 T 值。match 表达式就是这么一个处理枚举的控制流结构:它会根据枚举的成员运行不同的代码,这些代码可以使用匹配到的值中的数据。","breadcrumbs":"枚举和模式匹配 » 枚举的定义 » Option 枚举和其相对于空值的优势","id":"102","title":"Option 枚举和其相对于空值的优势"},"103":{"body":"ch06-02-match.md commit 3962c0224b274e2358e0acf06443af64df115359 Rust 有一个叫做 match 的极为强大的控制流运算符,它允许我们将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。模式可由字面值、变量、通配符和许多其他内容构成; 第十九章 会涉及到所有不同种类的模式以及它们的作用。match 的力量来源于模式的表现力以及编译器检查,它确保了所有可能的情况都得到处理。 可以把 match 表达式想象成某种硬币分类器:硬币滑入有着不同大小孔洞的轨道,每一个硬币都会掉入符合它大小的孔洞。同样地,值也会通过 match 的每一个模式,并且在遇到第一个 “符合” 的模式时,值会进入相关联的代码块并在执行中被使用。 因为刚刚提到了硬币,让我们用它们来作为一个使用 match 的例子!我们可以编写一个函数来获取一个未知的硬币,并以一种类似验钞机的方式,确定它是何种硬币并返回它的美分值,如示例 6-3 中所示。 enum Coin { Penny, Nickel, Dime, Quarter,\n} fn value_in_cents(coin: Coin) -> u8 { match coin { Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter => 25, }\n}\n# # fn main() {} 示例 6-3:一个枚举和一个以枚举成员作为模式的 match 表达式 拆开 value_in_cents 函数中的 match 来看。首先,我们列出 match 关键字后跟一个表达式,在这个例子中是 coin 的值。这看起来非常像 if 所使用的条件表达式,不过这里有一个非常大的区别:对于 if,表达式必须返回一个布尔值,而这里它可以是任何类型的。例子中的 coin 的类型是示例 6-3 中定义的 Coin 枚举。 接下来是 match 的分支。一个分支有两个部分:一个模式和一些代码。第一个分支的模式是值 Coin::Penny 而之后的 => 运算符将模式和将要运行的代码分开。这里的代码就仅仅是值 1。每一个分支之间使用逗号分隔。 当 match 表达式执行时,它将结果值按顺序与每一个分支的模式相比较。如果模式匹配了这个值,这个模式相关联的代码将被执行。如果模式并不匹配这个值,将继续执行下一个分支,非常类似一个硬币分类器。可以拥有任意多的分支:示例 6-3 中的 match 有四个分支。 每个分支相关联的代码是一个表达式,而表达式的结果值将作为整个 match 表达式的返回值。 如果分支代码较短的话通常不使用大括号,正如示例 6-3 中的每个分支都只是返回一个值。如果想要在分支中运行多行代码,可以使用大括号,而分支后的逗号是可选的。例如,如下代码在每次使用Coin::Penny 调用时都会打印出 “Lucky penny!”,同时仍然返回代码块最后的值,1: # enum Coin {\n# Penny,\n# Nickel,\n# Dime,\n# Quarter,\n# }\n# fn value_in_cents(coin: Coin) -> u8 { match coin { Coin::Penny => { println!(\"Lucky penny!\"); 1 } Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter => 25, }\n}\n# # fn main() {}","breadcrumbs":"枚举和模式匹配 » match 控制流结构 » match 控制流结构","id":"103","title":"match 控制流结构"},"104":{"body":"匹配分支的另一个有用的功能是可以绑定匹配的模式的部分值。这也就是如何从枚举成员中提取值的。 作为一个例子,让我们修改枚举的一个成员来存放数据。1999 年到 2008 年间,美国在 25 美分的硬币的一侧为 50 个州的每一个都印刷了不同的设计。其他的硬币都没有这种区分州的设计,所以只有这些 25 美分硬币有特殊的价值。可以将这些信息加入我们的 enum,通过改变 Quarter 成员来包含一个 State 值,示例 6-4 中完成了这些修改: #[derive(Debug)] // 这样可以立刻看到州的名称\nenum UsState { Alabama, Alaska, // --snip--\n} enum Coin { Penny, Nickel, Dime, Quarter(UsState),\n}\n# # fn main() {} 示例 6-4:Quarter 成员也存放了一个 UsState 值的 Coin 枚举 想象一下我们的一个朋友尝试收集所有 50 个州的 25 美分硬币。在根据硬币类型分类零钱的同时,也可以报告出每个 25 美分硬币所对应的州名称,这样如果我们的朋友没有的话,他可以将其加入收藏。 在这些代码的匹配表达式中,我们在匹配 Coin::Quarter 成员的分支的模式中增加了一个叫做 state 的变量。当匹配到 Coin::Quarter 时,变量 state 将会绑定 25 美分硬币所对应州的值。接着在那个分支的代码中使用 state,如下: # #[derive(Debug)]\n# enum UsState {\n# Alabama,\n# Alaska,\n# // --snip--\n# }\n# # enum Coin {\n# Penny,\n# Nickel,\n# Dime,\n# Quarter(UsState),\n# }\n# fn value_in_cents(coin: Coin) -> u8 { match coin { Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter(state) => { println!(\"State quarter from {state:?}!\"); 25 } }\n}\n# # fn main() {\n# value_in_cents(Coin::Quarter(UsState::Alaska));\n# } 如果调用 value_in_cents(Coin::Quarter(UsState::Alaska)),coin 将是 Coin::Quarter(UsState::Alaska)。当将值与每个分支相比较时,没有分支会匹配,直到遇到 Coin::Quarter(state)。这时,state 绑定的将会是值 UsState::Alaska。接着就可以在 println! 表达式中使用这个绑定了,像这样就可以获取 Coin 枚举的 Quarter 成员中内部的州的值。","breadcrumbs":"枚举和模式匹配 » match 控制流结构 » 绑定值的模式","id":"104","title":"绑定值的模式"},"105":{"body":"我们在之前的部分中使用 Option 时,是为了从 Some 中取出其内部的 T 值;我们还可以像处理 Coin 枚举那样使用 match 处理 Option!只不过这回比较的不再是硬币,而是 Option 的成员,但 match 表达式的工作方式保持不变。 比如我们想要编写一个函数,它获取一个 Option ,如果其中含有一个值,将其加一。如果其中没有值,函数应该返回 None 值,而不尝试执行任何操作。 得益于 match,编写这个函数非常简单,它将看起来像示例 6-5 中这样: # fn main() { fn plus_one(x: Option) -> Option { match x { None => None, Some(i) => Some(i + 1), } } let five = Some(5); let six = plus_one(five); let none = plus_one(None);\n# } 示例 6-5:一个在 Option 上使用 match 表达式的函数 匹配 Some(T) 让我们更仔细地检查 plus_one 的第一行操作。当调用 plus_one(five) 时,plus_one 函数体中的 x 将会是值 Some(5)。接着将其与每个分支比较。 # fn main() {\n# fn plus_one(x: Option) -> Option {\n# match x { None => None,\n# Some(i) => Some(i + 1),\n# }\n# }\n# # let five = Some(5);\n# let six = plus_one(five);\n# let none = plus_one(None);\n# } 值 Some(5) 并不匹配模式 None,所以继续进行下一个分支。 # fn main() {\n# fn plus_one(x: Option) -> Option {\n# match x {\n# None => None, Some(i) => Some(i + 1),\n# }\n# }\n# # let five = Some(5);\n# let six = plus_one(five);\n# let none = plus_one(None);\n# } Some(5) 与 Some(i) 匹配吗?当然匹配!它们是相同的成员。i 绑定了 Some 中包含的值,所以 i 的值是 5。接着匹配分支的代码被执行,所以我们将 i 的值加一并返回一个含有值 6 的新 Some。 接着考虑下示例 6-5 中 plus_one 的第二个调用,这里 x 是 None。我们进入 match 并与第一个分支相比较。 # fn main() {\n# fn plus_one(x: Option) -> Option {\n# match x { None => None,\n# Some(i) => Some(i + 1),\n# }\n# }\n# # let five = Some(5);\n# let six = plus_one(five);\n# let none = plus_one(None);\n# } 匹配上了!这里没有值来加一,所以程序结束并返回 => 右侧的值 None,因为第一个分支就匹配到了,其他的分支将不再比较。 将 match 与枚举相结合在很多场景中都是有用的。你会在 Rust 代码中看到很多这样的模式:match 一个枚举,绑定其中的值到一个变量,接着根据其值执行代码。这在一开始有点复杂,不过一旦习惯了,你会希望所有语言都拥有它!这一直是用户的最爱。","breadcrumbs":"枚举和模式匹配 » match 控制流结构 » 匹配 Option","id":"105","title":"匹配 Option"},"106":{"body":"match 还有另一方面需要讨论:这些分支必须覆盖了所有的可能性。考虑一下 plus_one 函数的这个版本,它有一个 bug 并不能编译: # fn main() { fn plus_one(x: Option) -> Option { match x { Some(i) => Some(i + 1), } }\n# # let five = Some(5);\n# let six = plus_one(five);\n# let none = plus_one(None);\n# } 我们没有处理 None 的情况,所以这些代码会造成一个 bug。幸运的是,这是一个 Rust 知道如何处理的 bug。如果尝试编译这段代码,会得到这个错误: $ cargo run Compiling enums v0.1.0 (file:///projects/enums)\nerror[E0004]: non-exhaustive patterns: `None` not covered --> src/main.rs:3:15 |\n3 | match x { | ^ pattern `None` not covered |\nnote: `Option` defined here --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/option.rs:574:1 ::: /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/option.rs:578:5 | = note: not covered = note: the matched value is of type `Option`\nhelp: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown |\n4 ~ Some(i) => Some(i + 1),\n5 ~ None => todo!(), | For more information about this error, try `rustc --explain E0004`.\nerror: could not compile `enums` (bin \"enums\") due to 1 previous error Rust 知道我们没有覆盖所有可能的情况甚至知道哪些模式被忘记了!Rust 中的匹配是 穷尽的 ( exhaustive ):必须穷举到最后的可能性来使代码有效。特别的在这个 Option 的例子中,Rust 防止我们忘记明确的处理 None 的情况,这让我们免于假设拥有一个实际上为空的值,从而使之前提到的价值亿万的错误不可能发生。","breadcrumbs":"枚举和模式匹配 » match 控制流结构 » 匹配是穷尽的","id":"106","title":"匹配是穷尽的"},"107":{"body":"让我们看一个例子,我们希望对一些特定的值采取特殊操作,而对其他的值采取默认操作。想象我们正在玩一个游戏,如果你掷出骰子的值为 3,角色不会移动,而是会得到一顶新奇的帽子。如果你掷出了 7,你的角色将失去新奇的帽子。对于其他的数值,你的角色会在棋盘上移动相应的格子。这是一个实现了上述逻辑的 match,骰子的结果是硬编码而不是一个随机值,其他的逻辑部分使用了没有函数体的函数来表示,实现它们超出了本例的范围: # fn main() { let dice_roll = 9; match dice_roll { 3 => add_fancy_hat(), 7 => remove_fancy_hat(), other => move_player(other), } fn add_fancy_hat() {} fn remove_fancy_hat() {} fn move_player(num_spaces: u8) {}\n# } 对于前两个分支,匹配模式是字面值 3 和 7,最后一个分支则涵盖了所有其他可能的值,模式是我们命名为 other 的一个变量。other 分支的代码通过将其传递给 move_player 函数来使用这个变量。 即使我们没有列出 u8 所有可能的值,这段代码依然能够编译,因为最后一个模式将匹配所有未被特殊列出的值。这种通配模式满足了 match 必须被穷尽的要求。请注意,我们必须将通配分支放在最后,因为模式是按顺序匹配的。如果我们在通配分支后添加其他分支,Rust 将会警告我们,因为此后的分支永远不会被匹配到。 Rust 还提供了一个模式,当我们不想使用通配模式获取的值时,请使用 _ ,这是一个特殊的模式,可以匹配任意值而不绑定到该值。这告诉 Rust 我们不会使用这个值,所以 Rust 也不会警告我们存在未使用的变量。 让我们改变游戏规则:现在,当你掷出的值不是 3 或 7 的时候,你必须再次掷出。这种情况下我们不需要使用这个值,所以我们改动代码使用 _ 来替代变量 other : # fn main() { let dice_roll = 9; match dice_roll { 3 => add_fancy_hat(), 7 => remove_fancy_hat(), _ => reroll(), } fn add_fancy_hat() {} fn remove_fancy_hat() {} fn reroll() {}\n# } 这个例子也满足穷举性要求,因为我们在最后一个分支中明确地忽略了其他的值。我们没有忘记处理任何东西。 最后,让我们再次改变游戏规则,如果你掷出 3 或 7 以外的值,你的回合将无事发生。我们可以使用单元值(在 “元组类型” 一节中提到的空元组)作为 _ 分支的代码: # fn main() { let dice_roll = 9; match dice_roll { 3 => add_fancy_hat(), 7 => remove_fancy_hat(), _ => (), } fn add_fancy_hat() {} fn remove_fancy_hat() {}\n# } 在这里,我们明确告诉 Rust 我们不会使用与前面模式不匹配的值,并且这种情况下我们不想运行任何代码。 我们将在 第十九章 中介绍更多关于模式和匹配的内容。现在,让我们继续讨论 if let 语法,这在 match 表达式有点啰嗦的情况下很有用。","breadcrumbs":"枚举和模式匹配 » match 控制流结构 » 通配模式和 _ 占位符","id":"107","title":"通配模式和 _ 占位符"},"108":{"body":"ch06-03-if-let.md commit bb7e429ad6b59d9a0c37db7434976364cbb9c6da if let 语法让我们以一种不那么冗长的方式结合 if 和 let,来处理只匹配一个模式的值而忽略其他模式的情况。考虑示例 6-6 中的程序,它匹配一个 config_max 变量中的 Option 值并只希望当值为 Some 成员时执行代码: # fn main() { let config_max = Some(3u8); match config_max { Some(max) => println!(\"The maximum is configured to be {max}\"), _ => (), }\n# } 示例 6-6:match 只关心当值为 Some 时执行代码 如果值是 Some,我们希望打印出 Some 成员中的值,这个值被绑定到模式中的 max 变量里。对于 None 值我们不希望做任何操作。为了满足 match 表达式(穷尽性)的要求,必须在处理完这唯一的成员后加上 _ => (),这样也要增加很多烦人的样板代码。 不过我们可以使用 if let 这种更短的方式编写。如下代码与示例 6-6 中的 match 行为一致: # fn main() { let config_max = Some(3u8); if let Some(max) = config_max { println!(\"The maximum is configured to be {max}\"); }\n# } if let 语法获取通过等号分隔的一个模式和一个表达式。它的工作方式与 match 相同,这里的表达式对应 match 而模式则对应第一个分支。在这个例子中,模式是 Some(max),max 绑定为 Some 中的值。接着可以在 if let 代码块中使用 max 了,就跟在对应的 match 分支中一样。模式不匹配时 if let 块中的代码不会执行。 使用 if let 意味着编写更少代码,更少的缩进和更少的样板代码。然而,这样会失去 match 强制要求的穷尽性检查。match 和 if let 之间的选择依赖特定的环境以及增加简洁度和失去穷尽性检查的权衡取舍。 换句话说,可以认为 if let 是 match 的一个语法糖,它当值匹配某一模式时执行代码而忽略所有其他值。 可以在 if let 中包含一个 else。else 块中的代码与 match 表达式中的 _ 分支块中的代码相同,这样的 match 表达式就等同于 if let 和 else。回忆一下示例 6-4 中 Coin 枚举的定义,其 Quarter 成员也包含一个 UsState 值。如果想要计数所有不是 25 美分的硬币的同时也报告 25 美分硬币所属的州,可以使用这样一个 match 表达式: # #[derive(Debug)]\n# enum UsState {\n# Alabama,\n# Alaska,\n# // --snip--\n# }\n# # enum Coin {\n# Penny,\n# Nickel,\n# Dime,\n# Quarter(UsState),\n# }\n# # fn main() {\n# let coin = Coin::Penny; let mut count = 0; match coin { Coin::Quarter(state) => println!(\"State quarter from {state:?}!\"), _ => count += 1, }\n# } 或者可以使用这样的 if let 和 else 表达式: # #[derive(Debug)]\n# enum UsState {\n# Alabama,\n# Alaska,\n# // --snip--\n# }\n# # enum Coin {\n# Penny,\n# Nickel,\n# Dime,\n# Quarter(UsState),\n# }\n# # fn main() {\n# let coin = Coin::Penny; let mut count = 0; if let Coin::Quarter(state) = coin { println!(\"State quarter from {state:?}!\"); } else { count += 1; }\n# } 如果你的程序遇到一个使用 match 表达起来过于啰嗦的逻辑,记住 if let 也在你的 Rust 工具箱中。","breadcrumbs":"枚举和模式匹配 » if let 简洁控制流 » if let 简洁控制流","id":"108","title":"if let 简洁控制流"},"109":{"body":"现在我们涉及到了如何使用枚举来创建有一系列可列举值的自定义类型。我们也展示了标准库的 Option 类型是如何帮助你利用类型系统来避免出错的。当枚举值包含数据时,你可以根据需要处理多少情况来选择使用 match 或 if let 来获取并使用这些值。 你的 Rust 程序现在能够使用结构体和枚举在自己的作用域内表现其内容了。在你的 API 中使用自定义类型保证了类型安全:编译器会确保你的函数只会得到它期望的类型的值。 为了向你的用户提供一个组织良好的 API,它使用起来很直观并且只向用户暴露他们确实需要的部分,那么现在就让我们转向 Rust 的模块系统吧。","breadcrumbs":"枚举和模式匹配 » if let 简洁控制流 » 总结","id":"109","title":"总结"},"11":{"body":"生成本书的源码可以在 GitHub 上找到。 译者注:此译本也有 GitHub 仓库 ,欢迎提交 Issue 和 PR :)","breadcrumbs":"简介 » 源代码","id":"11","title":"源代码"},"110":{"body":"ch07-00-managing-growing-projects-with-packages-crates-and-modules.md commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c 当你编写大型程序时,组织你的代码显得尤为重要。通过对相关功能进行分组和划分不同功能的代码,你可以清楚在哪里可以找到实现了特定功能的代码,以及在哪里可以改变一个功能的工作方式。 到目前为止,我们编写的程序都在一个文件的一个模块中。伴随着项目的增长,你应该通过将代码分解为多个模块和多个文件来组织代码。一个包可以包含多个二进制 crate 项和一个可选的 crate 库。伴随着包的增长,你可以将包中的部分代码提取出来,做成独立的 crate,这些 crate 则作为外部依赖项。本章将会涵盖所有这些概念。对于一个由一系列相互关联的包组成的超大型项目,Cargo 提供了 “工作空间” 这一功能,我们将在第十四章的 “Cargo Workspaces” 对此进行讲解。 我们也会讨论封装来实现细节,这可以使你更高级地重用代码:你实现了一个操作后,其他的代码可以通过该代码的公共接口来进行调用,而不需要知道它是如何实现的。你在编写代码时可以定义哪些部分是其他代码可以使用的公共部分,以及哪些部分是你有权更改实现细节的私有部分。这是另一种减少你在脑海中记住项目内容数量的方法。 这里有一个需要说明的概念 “作用域(scope)”:代码所在的嵌套上下文有一组定义为 “in scope” 的名称。当阅读、编写和编译代码时,程序员和编译器需要知道特定位置的特定名称是否引用了变量、函数、结构体、枚举、模块、常量或者其他有意义的项。你可以创建作用域,以及改变哪些名称在作用域内还是作用域外。同一个作用域内不能拥有两个相同名称的项;可以使用一些工具来解决名称冲突。 Rust 有许多功能可以让你管理代码的组织,包括哪些内容可以被公开,哪些内容作为私有部分,以及程序每个作用域中的名字。这些功能,有时被统称为 “模块系统(the module system)”,包括: 包 ( Packages ):Cargo 的一个功能,它允许你构建、测试和分享 crate。 Crates :一个模块的树形结构,它形成了库或二进制项目。 模块 ( Modules )和 use :允许你控制作用域和路径的私有性。 路径 ( path ):一个命名例如结构体、函数或模块等项的方式。 本章将会涵盖所有这些概念,讨论它们如何交互,并说明如何使用它们来管理作用域。到最后,你会对模块系统有深入的了解,并且能够像专业人士一样使用作用域!","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用包、Crate 和模块管理不断增长的项目","id":"110","title":"使用包、Crate 和模块管理不断增长的项目"},"111":{"body":"ch07-01-packages-and-crates.md commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c 模块系统的第一部分,我们将介绍包和 crate。 crate 是 Rust 在编译时最小的代码单位。如果你用 rustc 而不是 cargo 来编译一个文件(第一章我们这么做过),编译器还是会将那个文件认作一个 crate。crate 可以包含模块,模块可以定义在其他文件,然后和 crate 一起编译,我们会在接下来的章节中遇到。 crate 有两种形式:二进制项和库。 二进制项 可以被编译为可执行程序,比如一个命令行程序或者一个 web server。它们必须有一个 main 函数来定义当程序被执行的时候所需要做的事情。目前我们所创建的 crate 都是二进制项。 库 并没有 main 函数,它们也不会编译为可执行程序,它们提供一些诸如函数之类的东西,使其他项目也能使用这些东西。比如 第二章 的 rand crate 就提供了生成随机数的东西。大多数时间 Rustaceans 说的 crate 指的都是库,这与其他编程语言中 library 概念一致。 crate root 是一个源文件,Rust 编译器以它为起始点,并构成你的 crate 的根模块(我们将在 “定义模块来控制作用域与私有性” 一节深入解读)。 包 ( package )是提供一系列功能的一个或者多个 crate。一个包会包含一个 Cargo.toml 文件,阐述如何去构建这些 crate。Cargo 就是一个包含构建你代码的二进制项的包。Cargo 也包含这些二进制项所依赖的库。其他项目也能用 Cargo 库来实现与 Cargo 命令行程序一样的逻辑。 包中可以包含至多一个库 crate(library crate)。包中可以包含任意多个二进制 crate(binary crate),但是必须至少包含一个 crate(无论是库的还是二进制的)。 让我们来看看创建包的时候会发生什么。首先,我们输入命令 cargo new: $ cargo new my-project Created binary (application) `my-project` package\n$ ls my-project\nCargo.toml\nsrc\n$ ls my-project/src\nmain.rs 运行了这条命令后,我们先用 ls (译者注:此命令为 Linux 平台的指令,Windows 下可用 dir)来看看 Cargo 给我们创建了什么,Cargo 会给我们的包创建一个 Cargo.toml 文件。查看 Cargo.toml 的内容,会发现并没有提到 src/main.rs ,因为 Cargo 遵循的一个约定: src/main.rs 就是一个与包同名的二进制 crate 的 crate 根。同样的,Cargo 知道如果包目录中包含 src/lib.rs ,则包带有与其同名的库 crate,且 src/lib.rs 是 crate 根。crate 根文件将由 Cargo 传递给 rustc 来实际构建库或者二进制项目。 在此,我们有了一个只包含 src/main.rs 的包,意味着它只含有一个名为 my-project 的二进制 crate。如果一个包同时含有 src/main.rs 和 src/lib.rs ,则它有两个 crate:一个二进制的和一个库的,且名字都与包相同。通过将文件放在 src/bin 目录下,一个包可以拥有多个二进制 crate:每个 src/bin 下的文件都会被编译成一个独立的二进制 crate。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 包和 Crate » 包和 Crate","id":"111","title":"包和 Crate"},"112":{"body":"ch07-02-defining-modules-to-control-scope-and-privacy.md commit 310ea6cb0dd855eaf510c9ba05648bc5836ead0c 在本节,我们将讨论模块和其它一些关于模块系统的部分,如允许你命名项的 路径 ( paths );用来将路径引入作用域的 use 关键字;以及使项变为公有的 pub 关键字。我们还将讨论 as 关键字、外部包和 glob 运算符。现在,让我们把注意力放在模块上! 首先,我们将从一系列的规则开始,在你未来组织代码的时候,这些规则可被用作简单的参考。接下来我们将会详细的解释每条规则。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 定义模块来控制作用域与私有性 » 定义模块来控制作用域与私有性","id":"112","title":"定义模块来控制作用域与私有性"},"113":{"body":"这里我们提供一个简单的参考,用来解释模块、路径、use关键词和pub关键词如何在编译器中工作,以及大部分开发者如何组织他们的代码。我们将在本章节中举例说明每条规则,不过这是一个解释模块工作方式的良好参考。 从 crate 根节点开始 : 当编译一个 crate, 编译器首先在 crate 根文件(通常,对于一个库 crate 而言是 src/lib.rs ,对于一个二进制 crate 而言是 src/main.rs )中寻找需要被编译的代码。 声明模块 : 在 crate 根文件中,你可以声明一个新模块;比如,你用mod garden;声明了一个叫做garden的模块。编译器会在下列路径中寻找模块代码: 内联,在大括号中,当mod garden后方不是一个分号而是一个大括号 在文件 src/garden.rs 在文件 src/garden/mod.rs 声明子模块 : 在除了 crate 根节点以外的其他文件中,你可以定义子模块。比如,你可能在 src/garden.rs 中定义了mod vegetables;。编译器会在以父模块命名的目录中寻找子模块代码: 内联,在大括号中,当mod vegetables后方不是一个分号而是一个大括号 在文件 src/garden/vegetables.rs 在文件 src/garden/vegetables/mod.rs 模块中的代码路径 : 一旦一个模块是你 crate 的一部分,你可以在隐私规则允许的前提下,从同一个 crate 内的任意地方,通过代码路径引用该模块的代码。举例而言,一个 garden vegetables 模块下的Asparagus类型可以在crate::garden::vegetables::Asparagus被找到。 私有 vs 公用 : 一个模块里的代码默认对其父模块私有。为了使一个模块公用,应当在声明时使用pub mod替代mod。为了使一个公用模块内部的成员公用,应当在声明前使用pub。 use 关键字 : 在一个作用域内,use关键字创建了一个成员的快捷方式,用来减少长路径的重复。在任何可以引用crate::garden::vegetables::Asparagus的作用域,你可以通过 use crate::garden::vegetables::Asparagus;创建一个快捷方式,然后你就可以在作用域中只写Asparagus来使用该类型。 这里我们创建一个名为backyard的二进制 crate 来说明这些规则。该 crate 的路径同样命名为backyard,该路径包含了这些文件和目录: backyard\n├── Cargo.lock\n├── Cargo.toml\n└── src ├── garden │ └── vegetables.rs ├── garden.rs └── main.rs 这个例子中的 crate 根文件是 src/main.rs ,该文件包括了: 文件名:src/main.rs use crate::garden::vegetables::Asparagus; pub mod garden; fn main() { let plant = Asparagus {}; println!(\"I'm growing {plant:?}!\");\n} pub mod garden;行告诉编译器应该包含在 src/garden.rs 文件中发现的代码: 文件名:src/garden.rs pub mod vegetables; 在此处, pub mod vegetables;意味着在 src/garden/vegetables.rs 中的代码也应该被包括。这些代码是: #[derive(Debug)]\npub struct Asparagus {} 现在让我们深入了解这些规则的细节并在实际中演示它们!","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 定义模块来控制作用域与私有性 » 模块小抄","id":"113","title":"模块小抄"},"114":{"body":"模块 让我们可以将一个 crate 中的代码进行分组,以提高可读性与重用性。因为一个模块中的代码默认是私有的,所以还可以利用模块控制项的 私有性 。私有项是不可为外部使用的内在详细实现。我们也可以将模块和它其中的项标记为公开的,这样,外部代码就可以使用并依赖于它们。 在餐饮业,餐馆中会有一些地方被称之为 前台 ( front of house ),还有另外一些地方被称之为 后台 ( back of house )。前台是招待顾客的地方,在这里,店主可以为顾客安排座位,服务员接受顾客下单和付款,调酒师会制作饮品。后台则是由厨师工作的厨房,洗碗工的工作地点,以及经理做行政工作的地方组成。 我们可以将函数放置到嵌套的模块中,来使我们的 crate 结构与实际的餐厅结构相同。通过执行 cargo new --lib restaurant,来创建一个新的名为 restaurant 的库。然后将示例 7-1 中所罗列出来的代码放入 src/lib.rs 中,来定义一些模块和函数。 文件名:src/lib.rs mod front_of_house { mod hosting { fn add_to_waitlist() {} fn seat_at_table() {} } mod serving { fn take_order() {} fn serve_order() {} fn take_payment() {} }\n} 示例 7-1:一个包含了其他内置了函数的模块的 front_of_house 模块 我们定义一个模块,是以 mod 关键字为起始,然后指定模块的名字(本例中叫做 front_of_house),并且用花括号包围模块的主体。在模块内,我们还可以定义其他的模块,就像本例中的 hosting 和 serving 模块。模块还可以保存一些定义的其他项,比如结构体、枚举、常量、特性、或者函数。 通过使用模块,我们可以将相关的定义分组到一起,并指出它们为什么相关。程序员可以通过使用这段代码,更加容易地找到他们想要的定义,因为他们可以基于分组来对代码进行导航,而不需要阅读所有的定义。程序员向这段代码中添加一个新的功能时,他们也会知道代码应该放置在何处,可以保持程序的组织性。 在前面我们提到了,src/main.rs 和 src/lib.rs 叫做 crate 根。之所以这样叫它们是因为这两个文件的内容都分别在 crate 模块结构的根组成了一个名为 crate 的模块,该结构被称为 模块树 ( module tree )。 示例 7-2 展示了示例 7-1 中的模块树的结构。 crate └── front_of_house ├── hosting │ ├── add_to_waitlist │ └── seat_at_table └── serving ├── take_order ├── serve_order └── take_payment 示例 7-2: 示例 7-1 中代码的模块树 这个树展示了一些模块是如何被嵌入到另一个模块的(例如,hosting 嵌套在 front_of_house 中)。这个树还展示了一些模块是互为 兄弟 ( siblings )的,这意味着它们定义在同一模块中(hosting 和 serving 被一起定义在 front_of_house 中)。继续沿用家庭关系的比喻,如果一个模块 A 被包含在模块 B 中,我们将模块 A 称为模块 B 的 子 ( child ),模块 B 则是模块 A 的 父 ( parent )。注意,整个模块树都植根于名为 crate 的隐式模块下。 这个模块树可能会令你想起电脑上文件系统的目录树;这是一个非常恰当的类比!就像文件系统的目录,你可以使用模块来组织你的代码。并且,就像目录中的文件,我们需要一种方法来找到模块。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 定义模块来控制作用域与私有性 » 在模块中对相关代码进行分组","id":"114","title":"在模块中对相关代码进行分组"},"115":{"body":"ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md commit 2b4565662d1a7973d870744a923f58f8f7dcce91 来看一下 Rust 如何在模块树中找到一个项的位置,我们使用路径的方式,就像在文件系统使用路径一样。为了调用一个函数,我们需要知道它的路径。 路径有两种形式: 绝对路径 ( absolute path )是以 crate 根(root)开头的全路径;对于外部 crate 的代码,是以 crate 名开头的绝对路径,对于当前 crate 的代码,则以字面值 crate 开头。 相对路径 ( relative path )从当前模块开始,以 self、super 或定义在当前模块中的标识符开头。 绝对路径和相对路径都后跟一个或多个由双冒号(::)分割的标识符。 回到示例 7-1,假设我们希望调用 add_to_waitlist 函数。还是同样的问题,add_to_waitlist 函数的路径是什么?在示例 7-3 中删除了一些模块和函数。 我们在 crate 根定义了一个新函数 eat_at_restaurant,并在其中展示调用 add_to_waitlist 函数的两种方法。eat_at_restaurant 函数是我们 crate 库的一个公共 API,所以我们使用 pub 关键字来标记它。在 “使用 pub 关键字暴露路径” 一节,我们将详细介绍 pub。注意,这个例子无法编译通过,我们稍后会解释原因。 文件名:src/lib.rs mod front_of_house { mod hosting { fn add_to_waitlist() {} }\n} pub fn eat_at_restaurant() { // 绝对路径 crate::front_of_house::hosting::add_to_waitlist(); // 相对路径 front_of_house::hosting::add_to_waitlist();\n} 示例 7-3: 使用绝对路径和相对路径来调用 add_to_waitlist 函数 第一种方式,我们在 eat_at_restaurant 中调用 add_to_waitlist 函数,使用的是绝对路径。add_to_waitlist 函数与 eat_at_restaurant 被定义在同一 crate 中,这意味着我们可以使用 crate 关键字为起始的绝对路径。 在 crate 后面,我们持续地嵌入模块,直到我们找到 add_to_waitlist。你可以想象出一个相同结构的文件系统,我们通过指定路径 /front_of_house/hosting/add_to_waitlist 来执行 add_to_waitlist 程序。我们使用 crate 从 crate 根开始就类似于在 shell 中使用 / 从文件系统根开始。 第二种方式,我们在 eat_at_restaurant 中调用 add_to_waitlist,使用的是相对路径。这个路径以 front_of_house 为起始,这个模块在模块树中,与 eat_at_restaurant 定义在同一层级。与之等价的文件系统路径就是 front_of_house/hosting/add_to_waitlist。以模块名开头意味着该路径是相对路径。 选择使用相对路径还是绝对路径,要取决于你的项目,也取决于你是更倾向于将项的定义代码与使用该项的代码分开来移动,还是一起移动。举一个例子,如果我们要将 front_of_house 模块和 eat_at_restaurant 函数一起移动到一个名为 customer_experience 的模块中,我们需要更新 add_to_waitlist 的绝对路径,但是相对路径还是可用的。然而,如果我们要将 eat_at_restaurant 函数单独移到一个名为 dining 的模块中,还是可以使用原本的绝对路径来调用 add_to_waitlist,但是相对路径必须要更新。我们更倾向于使用绝对路径,因为把代码定义和项调用各自独立地移动是更常见的。 让我们试着编译一下示例 7-3,并查明为何不能编译!示例 7-4 展示了这个错误。 $ cargo build Compiling restaurant v0.1.0 (file:///projects/restaurant)\nerror[E0603]: module `hosting` is private --> src/lib.rs:9:28 |\n9 | crate::front_of_house::hosting::add_to_waitlist(); | ^^^^^^^ --------------- function `add_to_waitlist` is not publicly re-exported | | | private module |\nnote: the module `hosting` is defined here --> src/lib.rs:2:5 |\n2 | mod hosting { | ^^^^^^^^^^^ error[E0603]: module `hosting` is private --> src/lib.rs:12:21 |\n12 | front_of_house::hosting::add_to_waitlist(); | ^^^^^^^ --------------- function `add_to_waitlist` is not publicly re-exported | | | private module |\nnote: the module `hosting` is defined here --> src/lib.rs:2:5 |\n2 | mod hosting { | ^^^^^^^^^^^ For more information about this error, try `rustc --explain E0603`.\nerror: could not compile `restaurant` (lib) due to 2 previous errors 示例 7-4: 构建示例 7-3 出现的编译器错误 错误信息说 hosting 模块是私有的。换句话说,我们拥有 hosting 模块和 add_to_waitlist 函数的正确路径,但是 Rust 不让我们使用,因为它不能访问私有片段。在 Rust 中,默认所有项(函数、方法、结构体、枚举、模块和常量)对父模块都是私有的。如果希望创建一个私有函数或结构体,你可以将其放入一个模块。 父模块中的项不能使用子模块中的私有项,但是子模块中的项可以使用它们父模块中的项。这是因为子模块封装并隐藏了它们的实现详情,但是子模块可以看到它们定义的上下文。继续拿餐馆作比喻,把私有性规则想象成餐馆的后台办公室:餐馆内的事务对餐厅顾客来说是不可知的,但办公室经理可以洞悉其经营的餐厅并在其中做任何事情。 Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你就知道可以更改内部代码的哪些部分而不会破坏外部代码。不过 Rust 也确实提供了通过使用 pub 关键字来创建公共项,使子模块的内部部分暴露给上级模块。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 引用模块项目的路径 » 引用模块项目的路径","id":"115","title":"引用模块项目的路径"},"116":{"body":"让我们回头看一下示例 7-4 的错误,它告诉我们 hosting 模块是私有的。我们想让父模块中的 eat_at_restaurant 函数可以访问子模块中的 add_to_waitlist 函数,因此我们使用 pub 关键字来标记 hosting 模块,如示例 7-5 所示。 文件名:src/lib.rs mod front_of_house { pub mod hosting { fn add_to_waitlist() {} }\n} pub fn eat_at_restaurant() { // 绝对路径 crate::front_of_house::hosting::add_to_waitlist(); // 相对路径 front_of_house::hosting::add_to_waitlist();\n} 示例 7-5: 使用 pub 关键字声明 hosting 模块使其可在 eat_at_restaurant 使用 不幸的是,示例 7-5 的代码编译仍然有错误,如示例 7-6 所示。 $ cargo build Compiling restaurant v0.1.0 (file:///projects/restaurant)\nerror[E0603]: function `add_to_waitlist` is private --> src/lib.rs:9:37 |\n9 | crate::front_of_house::hosting::add_to_waitlist(); | ^^^^^^^^^^^^^^^ private function |\nnote: the function `add_to_waitlist` is defined here --> src/lib.rs:3:9 |\n3 | fn add_to_waitlist() {} | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: function `add_to_waitlist` is private --> src/lib.rs:12:30 |\n12 | front_of_house::hosting::add_to_waitlist(); | ^^^^^^^^^^^^^^^ private function |\nnote: the function `add_to_waitlist` is defined here --> src/lib.rs:3:9 |\n3 | fn add_to_waitlist() {} | ^^^^^^^^^^^^^^^^^^^^ For more information about this error, try `rustc --explain E0603`.\nerror: could not compile `restaurant` (lib) due to 2 previous errors 示例 7-6: 构建示例 7-5 出现的编译器错误 发生了什么?在 mod hosting 前添加了 pub 关键字,使其变成公有的。伴随着这种变化,如果我们可以访问 front_of_house,那我们也可以访问 hosting。但是 hosting 的 内容 ( contents )仍然是私有的;这表明使模块公有并不使其内容也是公有的。模块上的 pub 关键字只允许其父模块引用它,而不允许访问内部代码。因为模块是一个容器,只是将模块变为公有能做的其实并不太多;同时需要更深入地选择将一个或多个项变为公有。 示例 7-6 中的错误说,add_to_waitlist 函数是私有的。私有性规则不但应用于模块,还应用于结构体、枚举、函数和方法。 让我们继续将 pub 关键字放置在 add_to_waitlist 函数的定义之前,使其变成公有。如示例 7-7 所示。 文件名:src/lib.rs mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} }\n} pub fn eat_at_restaurant() { // 绝对路径 crate::front_of_house::hosting::add_to_waitlist(); // 相对路径 front_of_house::hosting::add_to_waitlist();\n} 示例 7-7: 为 mod hosting 和 fn add_to_waitlist 添加 pub 关键字使它们可以在 eat_at_restaurant 函数中被调用 现在代码可以编译通过了!为了了解为何增加 pub 关键字使得我们可以在 add_to_waitlist 中调用这些路径与私有性规则有关,让我们看看绝对路径和相对路径。 在绝对路径,我们从 crate 也就是 crate 根开始。crate 根中定义了 front_of_house 模块。虽然 front_of_house 模块不是公有的,不过因为 eat_at_restaurant 函数与 front_of_house 定义于同一模块中(即,eat_at_restaurant 和 front_of_house 是兄弟),我们可以从 eat_at_restaurant 中引用 front_of_house。接下来是使用 pub 标记的 hosting 模块。我们可以访问 hosting 的父模块,所以可以访问 hosting。最后,add_to_waitlist 函数被标记为 pub ,我们可以访问其父模块,所以这个函数调用是有效的! 在相对路径,其逻辑与绝对路径相同,除了第一步:不同于从 crate 根开始,路径从 front_of_house 开始。front_of_house 模块与 eat_at_restaurant 定义于同一模块,所以从 eat_at_restaurant 中开始定义的该模块相对路径是有效的。接下来因为 hosting 和 add_to_waitlist 被标记为 pub,路径其余的部分也是有效的,因此函数调用也是有效的! 如果你计划共享你的库 crate 以便其它项目可以使用你的代码,公有 API 将是决定 crate 用户如何与你代码交互的契约。关于管理公有 API 的修改以便被人更容易依赖你的库有着很多考量。这些考量超出了本书的范畴;如果你对这些话题感兴趣,请查阅 The Rust API Guidelines","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 引用模块项目的路径 » 使用 pub 关键字暴露路径","id":"116","title":"使用 pub 关键字暴露路径"},"117":{"body":"我们提到过包(package)可以同时包含一个 src/main.rs 二进制 crate 根和一个 src/lib.rs 库 crate 根,并且这两个 crate 默认以包名来命名。通常,这种包含二进制 crate 和库 crate 的模式的包,在二进制 crate 中只保留足以生成一个可执行文件的代码,并由可执行文件调用库 crate 的代码。又因为库 crate 可以共享,这使得其它项目从包提供的大部分功能中受益。 模块树应该定义在 src/lib.rs 中。这样通过以包名开头的路径,公有项就可以在二进制 crate 中使用。二进制 crate 就变得同其它在该 crate 之外的、使用库 crate 的用户一样:二者都只能使用公有 API。这有助于你设计一个好的 API;你不仅仅是作者,也是用户! 在 第十二章 我们会通过一个同时包含二进制 crate 和库 crate 的命令行程序来展示这些包组织上的实践。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 引用模块项目的路径 » 二进制和库 crate 包的最佳实践","id":"117","title":"二进制和库 crate 包的最佳实践"},"118":{"body":"我们可以通过在路径的开头使用 super ,从父模块开始构建相对路径,而不是从当前模块或者 crate 根开始。这类似以 .. 语法开始一个文件系统路径。使用 super 允许我们引用父模块中的已知项,这使得重新组织模块树变得更容易 —— 当模块与父模块关联的很紧密,但某天父模块可能要移动到模块树的其它位置。 考虑一下示例 7-8 中的代码,它模拟了厨师更正了一个错误订单,并亲自将其提供给客户的情况。back_of_house 模块中的定义的 fix_incorrect_order 函数通过指定的 super 起始的 deliver_order 路径,来调用父模块中的 deliver_order 函数: 文件名:src/lib.rs fn deliver_order() {} mod back_of_house { fn fix_incorrect_order() { cook_order(); super::deliver_order(); } fn cook_order() {}\n} 示例 7-8: 使用以 super 开头的相对路径从父目录开始调用函数 fix_incorrect_order 函数在 back_of_house 模块中,所以我们可以使用 super 进入 back_of_house 父模块,也就是本例中的 crate 根。在这里,我们可以找到 deliver_order。成功!我们认为 back_of_house 模块和 deliver_order 函数之间可能具有某种关联关系,并且,如果我们要重新组织这个 crate 的模块树,需要一起移动它们。因此,我们使用 super,这样一来,如果这些代码被移动到了其他模块,我们只需要更新很少的代码。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 引用模块项目的路径 » super 开始的相对路径","id":"118","title":"super 开始的相对路径"},"119":{"body":"我们还可以使用 pub 来设计公有的结构体和枚举,不过关于在结构体和枚举上使用 pub 还有一些额外的细节需要注意。如果我们在一个结构体定义的前面使用了 pub ,这个结构体会变成公有的,但是这个结构体的字段仍然是私有的。我们可以根据情况决定每个字段是否公有。在示例 7-9 中,我们定义了一个公有结构体 back_of_house:Breakfast,其中有一个公有字段 toast 和私有字段 seasonal_fruit。这个例子模拟的情况是,在一家餐馆中,顾客可以选择随餐附赠的面包类型,但是厨师会根据季节和库存情况来决定随餐搭配的水果。餐馆可用的水果变化是很快的,所以顾客不能选择水果,甚至无法看到他们将会得到什么水果。 文件名:src/lib.rs mod back_of_house { pub struct Breakfast { pub toast: String, seasonal_fruit: String, } impl Breakfast { pub fn summer(toast: &str) -> Breakfast { Breakfast { toast: String::from(toast), seasonal_fruit: String::from(\"peaches\"), } } }\n} pub fn eat_at_restaurant() { // 在夏天订购一个黑麦土司作为早餐 let mut meal = back_of_house::Breakfast::summer(\"Rye\"); // 改变主意更换想要面包的类型 meal.toast = String::from(\"Wheat\"); println!(\"I'd like {} toast please\", meal.toast); // 如果取消下一行的注释代码不能编译; // 不允许查看或修改早餐附带的季节水果 // meal.seasonal_fruit = String::from(\"blueberries\");\n} 示例 7-9: 带有公有和私有字段的结构体 因为 back_of_house::Breakfast 结构体的 toast 字段是公有的,所以我们可以在 eat_at_restaurant 中使用点号来随意的读写 toast 字段。注意,我们不能在 eat_at_restaurant 中使用 seasonal_fruit 字段,因为 seasonal_fruit 是私有的。尝试去除那一行修改 seasonal_fruit 字段值的代码的注释,看看你会得到什么错误! 还请注意一点,因为 back_of_house::Breakfast 具有私有字段,所以这个结构体需要提供一个公共的关联函数来构造 Breakfast 的实例 (这里我们命名为 summer)。如果 Breakfast 没有这样的函数,我们将无法在 eat_at_restaurant 中创建 Breakfast 实例,因为我们不能在 eat_at_restaurant 中设置私有字段 seasonal_fruit 的值。 与之相反,如果我们将枚举设为公有,则它的所有成员都将变为公有。我们只需要在 enum 关键字前面加上 pub,就像示例 7-10 展示的那样。 文件名:src/lib.rs mod back_of_house { pub enum Appetizer { Soup, Salad, }\n} pub fn eat_at_restaurant() { let order1 = back_of_house::Appetizer::Soup; let order2 = back_of_house::Appetizer::Salad;\n} 示例 7-10: 设计公有枚举,使其所有成员公有 因为我们创建了名为 Appetizer 的公有枚举,所以我们可以在 eat_at_restaurant 中使用 Soup 和 Salad 成员。 如果枚举成员不是公有的,那么枚举会显得用处不大;给枚举的所有成员挨个添加 pub 是很令人恼火的,因此枚举成员默认就是公有的。结构体通常使用时,不必将它们的字段公有化,因此结构体遵循常规,内容全部是私有的,除非使用 pub 关键字。 还有一种使用 pub 的场景我们还没有涉及到,那就是我们最后要讲的模块功能:use 关键字。我们将先单独介绍 use,然后展示如何结合使用 pub 和 use。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 引用模块项目的路径 » 创建公有的结构体和枚举","id":"119","title":"创建公有的结构体和枚举"},"12":{"body":"ch01-00-getting-started.md commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f 让我们开始 Rust 之旅!有很多内容需要学习,但每次旅程总有起点。在本章中,我们会讨论: 在 Linux、macOS 和 Windows 上安装 Rust 编写一个打印 Hello, world! 的程序 使用 Rust 的包管理器和构建系统 cargo","breadcrumbs":"入门指南 » 入门指南","id":"12","title":"入门指南"},"120":{"body":"ch07-04-bringing-paths-into-scope-with-the-use-keyword.md commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c 不得不编写路径来调用函数显得不便且重复。在示例 7-7 中,无论我们选择 add_to_waitlist 函数的绝对路径还是相对路径,每次我们想要调用 add_to_waitlist 时,都必须指定front_of_house 和 hosting。幸运的是,有一种方法可以简化这个过程。我们可以使用 use 关键字创建一个短路径,然后就可以在作用域中的任何地方使用这个更短的名字。 在示例 7-11 中,我们将 crate::front_of_house::hosting 模块引入了 eat_at_restaurant 函数的作用域,而我们只需要指定 hosting::add_to_waitlist 即可在 eat_at_restaurant 中调用 add_to_waitlist 函数。 文件名:src/lib.rs mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} }\n} use crate::front_of_house::hosting; pub fn eat_at_restaurant() { hosting::add_to_waitlist();\n} 示例 7-11: 使用 use 将模块引入作用域 在作用域中增加 use 和路径类似于在文件系统中创建软连接(符号连接,symbolic link)。通过在 crate 根增加 use crate::front_of_house::hosting,现在 hosting 在作用域中就是有效的名称了,如同 hosting 模块被定义于 crate 根一样。通过 use 引入作用域的路径也会检查私有性,同其它路径一样。 注意 use 只能创建 use 所在的特定作用域内的短路径。示例 7-12 将 eat_at_restaurant 函数移动到了一个叫 customer 的子模块,这又是一个不同于 use 语句的作用域,所以函数体不能编译。 文件名:src/lib.rs mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} }\n} use crate::front_of_house::hosting; mod customer { pub fn eat_at_restaurant() { hosting::add_to_waitlist(); }\n} 示例 7-12: use 语句只适用于其所在的作用域 编译器错误显示短路径不再适用于 customer 模块中: $ cargo build Compiling restaurant v0.1.0 (file:///projects/restaurant)\nerror[E0433]: failed to resolve: use of undeclared crate or module `hosting` --> src/lib.rs:11:9 |\n11 | hosting::add_to_waitlist(); | ^^^^^^^ use of undeclared crate or module `hosting` |\nhelp: consider importing this module through its public re-export |\n10 + use crate::hosting; | warning: unused import: `crate::front_of_house::hosting` --> src/lib.rs:7:5 |\n7 | use crate::front_of_house::hosting; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default For more information about this error, try `rustc --explain E0433`.\nwarning: `restaurant` (lib) generated 1 warning\nerror: could not compile `restaurant` (lib) due to 1 previous error; 1 warning emitted 注意这里还有一个警告说 use 在其作用域内不再被使用!为了修复这个问题,可以将 use 移动到 customer 模块内,或者在子模块 customer 内通过 super::hosting 引用父模块中的这个短路径。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 使用 use 关键字将路径引入作用域","id":"120","title":"使用 use 关键字将路径引入作用域"},"121":{"body":"在示例 7-11 中,你可能会比较疑惑,为什么我们是指定 use crate::front_of_house::hosting ,然后在 eat_at_restaurant 中调用 hosting::add_to_waitlist ,而不是通过指定一直到 add_to_waitlist 函数的 use 路径来得到相同的结果,如示例 7-13 所示。 文件名:src/lib.rs mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} }\n} use crate::front_of_house::hosting::add_to_waitlist; pub fn eat_at_restaurant() { add_to_waitlist();\n} 示例 7-13: 使用 use 将 add_to_waitlist 函数引入作用域,这并不符合习惯 虽然示例 7-11 和 7-13 都完成了相同的任务,但示例 7-11 是使用 use 将函数引入作用域的习惯用法。要想使用 use 将函数的父模块引入作用域,我们必须在调用函数时指定父模块,这样可以清晰地表明函数不是在本地定义的,同时使完整路径的重复度最小化。示例 7-13 中的代码不清楚 add_to_waitlist 是在哪里被定义的。 另一方面,使用 use 引入结构体、枚举和其他项时,习惯是指定它们的完整路径。示例 7-14 展示了将 HashMap 结构体引入二进制 crate 作用域的习惯用法。 文件名:src/main.rs use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert(1, 2);\n} 示例 7-14: 将 HashMap 引入作用域的习惯用法 这种习惯用法背后没有什么硬性要求:它只是一种惯例,人们已经习惯了以这种方式阅读和编写 Rust 代码。 这个习惯用法有一个例外,那就是我们想使用 use 语句将两个具有相同名称的项带入作用域,因为 Rust 不允许这样做。示例 7-15 展示了如何将两个具有相同名称但不同父模块的 Result 类型引入作用域,以及如何引用它们。 文件名:src/lib.rs use std::fmt;\nuse std::io; fn function1() -> fmt::Result { // --snip--\n# Ok(())\n} fn function2() -> io::Result<()> { // --snip--\n# Ok(())\n} 示例 7-15: 使用父模块将两个具有相同名称的类型引入同一作用域 如你所见,使用父模块可以区分这两个 Result 类型。如果我们是指定 use std::fmt::Result 和 use std::io::Result,我们将在同一作用域拥有了两个 Result 类型,当我们使用 Result 时,Rust 则不知道我们要用的是哪个。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 创建惯用的 use 路径","id":"121","title":"创建惯用的 use 路径"},"122":{"body":"使用 use 将两个同名类型引入同一作用域这个问题还有另一个解决办法:在这个类型的路径后面,我们使用 as 指定一个新的本地名称或者别名。示例 7-16 展示了另一个编写示例 7-15 中代码的方法,通过 as 重命名其中一个 Result 类型。 文件名:src/lib.rs use std::fmt::Result;\nuse std::io::Result as IoResult; fn function1() -> Result { // --snip--\n# Ok(())\n} fn function2() -> IoResult<()> { // --snip--\n# Ok(())\n} 示例 7-16: 使用 as 关键字重命名引入作用域的类型 在第二个 use 语句中,我们选择 IoResult 作为 std::io::Result 的新名称,它与从 std::fmt 引入作用域的 Result 并不冲突。示例 7-15 和示例 7-16 都是惯用的,如何选择都取决于你!","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 使用 as 关键字提供新的名称","id":"122","title":"使用 as 关键字提供新的名称"},"123":{"body":"使用 use 关键字,将某个名称导入当前作用域后,这个名称在此作用域中就可以使用了,但它对此作用域之外还是私有的。如果想让其他人调用我们的代码时,也能够正常使用这个名称,就好像它本来就在当前作用域一样,那我们可以将 pub 和 use 合起来使用。这种技术被称为 “ 重导出 ( re-exporting )”:我们不仅将一个名称导入了当前作用域,还允许别人把它导入他们自己的作用域。 示例 7-17 将示例 7-11 根模块中的 use 改为 pub use 。 文件名:src/lib.rs mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} }\n} pub use crate::front_of_house::hosting; pub fn eat_at_restaurant() { hosting::add_to_waitlist();\n} 示例 7-17: 通过 pub use 使名称可从新作用域中被导入至任何代码 在这个修改之前,外部代码需要使用路径 restaurant::front_of_house::hosting::add_to_waitlist() 来调用 add_to_waitlist 函数。现在这个 pub use 从根模块重导出了 hosting 模块,外部代码现在可以使用路径 restaurant::hosting::add_to_waitlist。 当你代码的内部结构与调用你代码的程序员所想象的结构不同时,重导出会很有用。例如,在这个餐馆的比喻中,经营餐馆的人会想到“前台”和“后台”。但顾客在光顾一家餐馆时,可能不会以这些术语来考虑餐馆的各个部分。使用 pub use,我们可以使用一种结构编写代码,却将不同的结构形式暴露出来。这样做使我们的库井井有条,也使开发这个库的程序员和调用这个库的程序员都更加方便。在 “使用 pub use 导出合适的公有 API” 部分让我们再看另一个 pub use 的例子来了解这如何影响 crate 的文档。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 使用 pub use 重导出名称","id":"123","title":"使用 pub use 重导出名称"},"124":{"body":"在第二章中我们编写了一个猜猜看游戏。那个项目使用了一个外部包,rand,来生成随机数。为了在项目中使用 rand,在 Cargo.toml 中加入了如下行: 文件名:Cargo.toml rand = \"0.8.5\" 在 Cargo.toml 中加入 rand 依赖告诉了 Cargo 要从 crates.io 下载 rand 和其依赖,并使其可在项目代码中使用。 接着,为了将 rand 定义引入项目包的作用域,我们加入一行 use 起始的包名,它以 rand 包名开头并列出了需要引入作用域的项。回忆一下第二章的 “生成一个随机数” 部分,我们曾将 Rng trait 引入作用域并调用了 rand::thread_rng 函数: # use std::io;\nuse rand::Rng; fn main() {\n# println!(\"Guess the number!\");\n# let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {guess}\");\n} crates.io 上有很多 Rust 社区成员发布的包,将其引入你自己的项目都需要一道相同的步骤:在 Cargo.toml 列出它们并通过 use 将其中定义的项引入项目包的作用域中。 注意 std 标准库对于你的包来说也是外部 crate。因为标准库随 Rust 语言一同分发,无需修改 Cargo.toml 来引入 std,不过需要通过 use 将标准库中定义的项引入项目包的作用域中来引用它们,比如我们使用的 HashMap: use std::collections::HashMap; 这是一个以标准库 crate 名 std 开头的绝对路径。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 使用外部包","id":"124","title":"使用外部包"},"125":{"body":"当需要引入很多定义于相同包或相同模块的项时,为每一项单独列出一行会占用源码很大的空间。例如猜猜看章节示例 2-4 中有两行 use 语句都从 std 引入项到作用域: 文件名:src/main.rs # use rand::Rng;\n// --snip--\nuse std::cmp::Ordering;\nuse std::io;\n// --snip--\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {guess}\");\n# # match guess.cmp(&secret_number) {\n# Ordering::Less => println!(\"Too small!\"),\n# Ordering::Greater => println!(\"Too big!\"),\n# Ordering::Equal => println!(\"You win!\"),\n# }\n# } 相反,我们可以使用嵌套路径将相同的项在一行中引入作用域。这么做需要指定路径的相同部分,接着是两个冒号,接着是大括号中的各自不同的路径部分,如示例 7-18 所示。 文件名:src/main.rs # use rand::Rng;\n// --snip--\nuse std::{cmp::Ordering, io};\n// --snip--\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # let guess: u32 = guess.trim().parse().expect(\"Please type a number!\");\n# # println!(\"You guessed: {guess}\");\n# # match guess.cmp(&secret_number) {\n# Ordering::Less => println!(\"Too small!\"),\n# Ordering::Greater => println!(\"Too big!\"),\n# Ordering::Equal => println!(\"You win!\"),\n# }\n# } 示例 7-18: 指定嵌套的路径在一行中将多个带有相同前缀的项引入作用域 在较大的程序中,使用嵌套路径从相同包或模块中引入很多项,可以显著减少所需的独立 use 语句的数量! 我们可以在路径的任何层级使用嵌套路径,这在组合两个共享子路径的 use 语句时非常有用。例如,示例 7-19 中展示了两个 use 语句:一个将 std::io 引入作用域,另一个将 std::io::Write 引入作用域: 文件名:src/lib.rs use std::io;\nuse std::io::Write; 示例 7-19: 通过两行 use 语句引入两个路径,其中一个是另一个的子路径 两个路径的相同部分是 std::io,这正是第一个路径。为了在一行 use 语句中引入这两个路径,可以在嵌套路径中使用 self,如示例 7-20 所示。 文件名:src/lib.rs use std::io::{self, Write}; 示例 7-20: 将示例 7-19 中部分重复的路径合并为一个 use 语句 这一行便将 std::io 和 std::io::Write 同时引入作用域。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 嵌套路径来消除大量的 use 行","id":"125","title":"嵌套路径来消除大量的 use 行"},"126":{"body":"如果希望将一个路径下 所有 公有项引入作用域,可以指定路径后跟 *,glob 运算符: use std::collections::*; 这个 use 语句将 std::collections 中定义的所有公有项引入当前作用域。使用 glob 运算符时请多加小心!Glob 会使得我们难以推导作用域中有什么名称和它们是在何处定义的。 glob 运算符经常用于测试模块 tests 中,这时会将所有内容引入作用域;我们将在第十一章 “如何编写测试” 部分讲解。glob 运算符有时也用于 prelude 模式;查看 标准库中的文档 了解这个模式的更多细节。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 使用 use 关键字将路径引入作用域 » 通过 glob 运算符将所有的公有定义引入作用域","id":"126","title":"通过 glob 运算符将所有的公有定义引入作用域"},"127":{"body":"ch07-05-separating-modules-into-different-files.md commit 2b4565662d1a7973d870744a923f58f8f7dcce91 到目前为止,本章所有的例子都在一个文件中定义多个模块。当模块变得更大时,你可能想要将它们的定义移动到单独的文件中,从而使代码更容易阅读。 例如,我们从示例 7-17 中包含多个餐厅模块的代码开始。我们会将模块提取到各自的文件中,而不是将所有模块都定义到 crate 根文件中。在这里,crate 根文件是 src/lib.rs ,不过这个过程也适用于 crate 根文件是 src/main.rs 的二进制 crate。 首先将 front_of_house 模块提取到其自己的文件中。删除 front_of_house 模块的大括号中的代码,只留下 mod front_of_house; 声明,这样 src/lib.rs 会包含如示例 7-21 所示的代码。注意直到创建示例 7-22 中的 src/front_of_house.rs 文件之前代码都不能编译。 文件名:src/lib.rs mod front_of_house; pub use crate::front_of_house::hosting; pub fn eat_at_restaurant() { hosting::add_to_waitlist();\n} 示例 7-21: 声明 front_of_house 模块,其内容将位于 src/front_of_house.rs 接下来将之前大括号内的代码放入一个名叫 src/front_of_house.rs 的新文件中,如示例 7-22 所示。因为编译器找到了 crate 根中名叫 front_of_house 的模块声明,它就知道去搜寻这个文件。 文件名:src/front_of_house.rs pub mod hosting { pub fn add_to_waitlist() {}\n} 示例 7-22: 在 src/front_of_house.rs 中定义 front_of_house 模块 注意你只需在模块树中的某处使用一次 mod 声明就可以加载这个文件。一旦编译器知道了这个文件是项目的一部分(并且通过 mod 语句的位置知道了代码在模块树中的位置),项目中的其他文件应该使用其所声明的位置的路径来引用那个文件的代码,这在 “引用模块项目的路径” 部分有讲到。换句话说,mod 不是 你可能会在其他编程语言中看到的 \"include\" 操作。 接下来我们同样将 hosting 模块提取到自己的文件中。这个过程会有所不同,因为 hosting 是 front_of_house 的子模块而不是根模块。我们将 hosting 的文件放在与模块树中它的父级模块同名的目录中,在这里是 src/front_of_house/ 。 为了移动 hosting,修改 src/front_of_house.rs 使之仅包含 hosting 模块的声明。 文件名:src/front_of_house.rs pub mod hosting; 接着我们创建一个 src/front_of_house 目录和一个包含 hosting 模块定义的 hosting.rs 文件: 文件名:src/front_of_house/hosting.rs pub fn add_to_waitlist() {} 如果将 hosting.rs 放在 src 目录,编译器会认为 hosting 模块中的 hosting.rs 的代码声明于 crate 根,而不是声明为 front_of_house 的子模块。编译器所遵循的哪些文件对应哪些模块的代码的规则,意味着目录和文件更接近于模块树。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 将模块拆分成多个文件 » 将模块拆分成多个文件","id":"127","title":"将模块拆分成多个文件"},"128":{"body":"目前为止我们介绍了 Rust 编译器所最常用的文件路径;不过一种更老的文件路径也仍然是支持的。 对于声明于 crate 根的 front_of_house 模块,编译器会在如下位置查找模块代码: src/front_of_house.rs (我们所介绍的) src/front_of_house/mod.rs (老风格,不过仍然支持) 对于 front_of_house 的子模块 hosting,编译器会在如下位置查找模块代码: src/front_of_house/hosting.rs (我们所介绍的) src/front_of_house/hosting/mod.rs (老风格,不过仍然支持) 如果你对同一模块同时使用这两种路径风格,会得到一个编译错误。在同一项目中的不同模块混用不同的路径风格是允许的,不过这会使他人感到疑惑。 使用 mod.rs 这一文件名的风格的主要缺点是会导致项目中出现很多 mod.rs 文件,当你在编辑器中同时打开它们时会感到疑惑。 我们将各个模块的代码移动到独立文件了,同时模块树依旧相同。eat_at_restaurant 中的函数调用也无需修改继续保持有效,即便其定义存在于不同的文件中。这个技巧让你可以在模块代码增长时,将它们移动到新文件中。 注意, src/lib.rs 中的 pub use crate::front_of_house::hosting 语句也并未发生改变。use 也不会对哪些文件会被编译为 crate 的一部分有任何影响。mod 关键字声明了模块,而 Rust 会在与模块同名的文件中查找模块的代码。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 将模块拆分成多个文件 » 另一种文件路径","id":"128","title":"另一种文件路径"},"129":{"body":"Rust 提供了将包分成多个 crate,将 crate 分成模块,以及通过指定绝对或相对路径从一个模块引用另一个模块中定义的项的方式。你可以通过使用 use 语句将路径引入作用域,这样在多次使用时可以使用更短的路径。模块定义的代码默认是私有的,不过可以选择增加 pub 关键字使其定义变为公有。 接下来,让我们看看一些标准库提供的集合数据类型,你可以利用它们编写出漂亮整洁的代码。","breadcrumbs":"使用包、Crate 和模块管理不断增长的项目 » 将模块拆分成多个文件 » 总结","id":"129","title":"总结"},"13":{"body":"ch01-01-installation.md commit d5eb2f7a8e9c6f51b4478f9cd46f55448e2ca2c1 第一步是安装 Rust。我们会通过 rustup 下载 Rust,这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要联网。 注意:如果你出于某些理由倾向于不使用 rustup,请到 Rust 的其他安装方法页面 查看其它安装选项。 接下来的步骤会安装最新的稳定版 Rust 编译器。Rust 的稳定性确保本书所有示例在最新版本的 Rust 中能够继续编译。不同版本的输出可能略有不同,因为 Rust 经常改进错误信息和警告。也就是说,任何通过这些步骤安装的最新稳定版 Rust,都应该能正常运行本书中的内容。","breadcrumbs":"入门指南 » 安装 » 安装","id":"13","title":"安装"},"130":{"body":"ch08-00-common-collections.md commit 1fd890031311612e54965f7f800a8c8bd4464663 Rust 标准库中包含一系列被称为 集合 ( collections )的非常有用的数据结构。大部分其他数据类型都代表一个特定的值,不过集合可以包含多个值。不同于内建的数组和元组类型,这些集合指向的数据是储存在堆上的,这意味着数据的数量不必在编译时就已知,并且还可以随着程序的运行增长或缩小。每种集合都有着不同功能和成本,而根据当前情况选择合适的集合,这是一项应当逐渐掌握的技能。在这一章里,我们将详细的了解三个在 Rust 程序中被广泛使用的集合: vector 允许我们一个挨着一个地储存一系列数量可变的值 字符串 ( string )是字符的集合。我们之前见过 String 类型,不过在本章我们将深入了解。 哈希 map ( hash map )允许我们将值与一个特定的键(key)相关联。这是一个叫做 map 的更通用的数据结构的特定实现。 对于标准库提供的其他类型的集合,请查看 文档 。 我们将讨论如何创建和更新 vector、字符串和哈希 map,以及它们有什么特别之处。","breadcrumbs":"常见集合 » 常见集合","id":"130","title":"常见集合"},"131":{"body":"ch08-01-vectors.md commit ac16184a7f56d17daa9c4c76901371085dc0ac43 我们要讲到的第一个类型是 Vec,也被称为 vector 。vector 允许我们在一个单独的数据结构中储存多于一个的值,它在内存中彼此相邻地排列所有的值。vector 只能储存相同类型的值。它们在拥有一系列项的场景下非常实用,例如文件中的文本行或是购物车中商品的价格。","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 使用 Vector 储存列表","id":"131","title":"使用 Vector 储存列表"},"132":{"body":"为了创建一个新的空 vector,可以调用 Vec::new 函数,如示例 8-1 所示: # fn main() { let v: Vec = Vec::new();\n# } 示例 8-1:新建一个空的 vector 来储存 i32 类型的值 注意这里我们增加了一个类型注解。因为没有向这个 vector 中插入任何值,Rust 并不知道我们想要储存什么类型的元素。这是一个非常重要的点。vector 是用泛型实现的,第十章会涉及到如何对你自己的类型使用它们。现在,所有你需要知道的就是 Vec 是一个由标准库提供的类型,它可以存放任何类型,而当 Vec 存放某个特定类型时,那个类型位于尖括号中。在示例 8-1 中,我们告诉 Rust v 这个 Vec 将存放 i32 类型的元素。 通常,我们会用初始值来创建一个 Vec 而 Rust 会推断出储存值的类型,所以很少会需要这些类型注解。为了方便 Rust 提供了 vec! 宏,这个宏会根据我们提供的值来创建一个新的 vector。示例 8-2 新建一个拥有值 1、2 和 3 的 Vec。推断为 i32 是因为这是默认整型类型,第三章的 “数据类型” 讨论过: # fn main() { let v = vec![1, 2, 3];\n# } 示例 8-2:新建一个包含初值的 vector 因为我们提供了 i32 类型的初始值,Rust 可以推断出 v 的类型是 Vec,因此类型注解就不是必须的。接下来让我们看看如何修改一个 vector。","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 新建 vector","id":"132","title":"新建 vector"},"133":{"body":"对于新建一个 vector 并向其增加元素,可以使用 push 方法,如示例 8-3 所示: # fn main() { let mut v = Vec::new(); v.push(5); v.push(6); v.push(7); v.push(8);\n# } 示例 8-3:使用 push 方法向 vector 增加值 如第三章中讨论的任何变量一样,如果想要能够改变它的值,必须使用 mut 关键字使其可变。放入其中的所有值都是 i32 类型的,而且 Rust 也根据数据做出如此判断,所以不需要 Vec 注解。","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 更新 vector","id":"133","title":"更新 vector"},"134":{"body":"有两种方法引用 vector 中储存的值:通过索引或使用 get 方法。在接下来的示例中,为了更加清楚的说明,我们已经标注了这些函数返回的值的类型。 示例 8-4 展示了访问 vector 中一个值的两种方式,索引语法或者 get 方法: # fn main() { let v = vec![1, 2, 3, 4, 5]; let third: &i32 = &v[2]; println!(\"The third element is {third}\"); let third: Option<&i32> = v.get(2); match third { Some(third) => println!(\"The third element is {third}\"), None => println!(\"There is no third element.\"), }\n# } 列表 8-4:使用索引语法或 get 方法来访问 vector 中的项 这里有几个细节需要注意。我们使用索引值 2 来获取第三个元素,因为索引是从数字 0 开始的。使用 & 和 [] 会得到一个索引位置元素的引用。当使用索引作为参数调用 get 方法时,会得到一个可以用于 match 的 Option<&T>。 Rust 提供了两种引用元素的方法的原因是当尝试使用现有元素范围之外的索引值时可以选择让程序如何运行。举个例子,让我们看看使用这个技术,尝试在当有一个 5 个元素的 vector 接着访问索引 100 位置的元素会发生什么,如示例 8-5 所示: # fn main() { let v = vec![1, 2, 3, 4, 5]; let does_not_exist = &v[100]; let does_not_exist = v.get(100);\n# } 示例 8-5:尝试访问一个包含 5 个元素的 vector 的索引 100 处的元素 当运行这段代码,你会发现对于第一个 [] 方法,当引用一个不存在的元素时 Rust 会造成 panic。这个方法更适合当程序认为尝试访问超过 vector 结尾的元素是一个严重错误的情况,这时应该使程序崩溃。 当 get 方法被传递了一个数组外的索引时,它不会 panic 而是返回 None。当偶尔出现超过 vector 范围的访问属于正常情况的时候可以考虑使用它。接着你的代码可以有处理 Some(&element) 或 None 的逻辑,如第六章讨论的那样。例如,索引可能来源于用户输入的数字。如果它们不慎输入了一个过大的数字那么程序就会得到 None 值,你可以告诉用户当前 vector 元素的数量并再请求它们输入一个有效的值。这就比因为输入错误而使程序崩溃要友好的多! 一旦程序获取了一个有效的引用,借用检查器将会执行所有权和借用规则(第四章讲到)来确保 vector 内容的这个引用和任何其他引用保持有效。回忆一下不能在相同作用域中同时存在可变和不可变引用的规则。这个规则适用于示例 8-6,当我们获取了 vector 的第一个元素的不可变引用并尝试在 vector 末尾增加一个元素的时候,如果尝试在函数的后面引用这个元素是行不通的: # fn main() { let mut v = vec![1, 2, 3, 4, 5]; let first = &v[0]; v.push(6); println!(\"The first element is: {first}\");\n# } 示例 8-6:在拥有 vector 中项的引用的同时向其增加一个元素 编译会给出这个错误: $ cargo run Compiling collections v0.1.0 (file:///projects/collections)\nerror[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable --> src/main.rs:6:5 |\n4 | let first = &v[0]; | - immutable borrow occurs here\n5 |\n6 | v.push(6); | ^^^^^^^^^ mutable borrow occurs here\n7 |\n8 | println!(\"The first element is: {first}\"); | ------- immutable borrow later used here For more information about this error, try `rustc --explain E0502`.\nerror: could not compile `collections` (bin \"collections\") due to 1 previous error 示例 8-6 中的代码看起来应该能够运行:为什么第一个元素的引用会关心 vector 结尾的变化?不能这么做的原因是由于 vector 的工作方式:在 vector 的结尾增加新元素时,在没有足够空间将所有元素依次相邻存放的情况下,可能会要求分配新内存并将老的元素拷贝到新的空间中。这时,第一个元素的引用就指向了被释放的内存。借用规则阻止程序陷入这种状况。 注意:关于 Vec 类型的更多实现细节,请查看 “The Rustonomicon”","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 读取 vector 的元素","id":"134","title":"读取 vector 的元素"},"135":{"body":"如果想要依次访问 vector 中的每一个元素,我们可以遍历其所有的元素而无需通过索引一次一个的访问。示例 8-7 展示了如何使用 for 循环来获取 i32 值的 vector 中的每一个元素的不可变引用并将其打印: # fn main() { let v = vec![100, 32, 57]; for i in &v { println!(\"{i}\"); }\n# } 示例 8-7:通过 for 循环遍历 vector 的元素并打印 我们也可以遍历可变 vector 的每一个元素的可变引用以便能改变它们。示例 8-8 中的 for 循环会给每一个元素加 50: # fn main() { let mut v = vec![100, 32, 57]; for i in &mut v { *i += 50; }\n# } 示例 8-8:遍历 vector 中元素的可变引用 为了修改可变引用所指向的值,在使用 += 运算符之前必须使用解引用运算符(*)获取 i 中的值。第十五章的 “通过解引用运算符追踪指针的值” 部分会详细介绍解引用运算符。 因为借用检查器的规则,无论可变还是不可变地遍历一个 vector 都是安全的。如果尝试在示例 8-7 和 示例 8-8 的 for 循环体内插入或删除项,都会得到一个类似示例 8-6 代码中类似的编译错误。for 循环中获取的 vector 引用阻止了同时对 vector 整体的修改。","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 遍历 vector 中的元素","id":"135","title":"遍历 vector 中的元素"},"136":{"body":"vector 只能储存相同类型的值。这是很不方便的;绝对会有需要储存一系列不同类型的值的用例。幸运的是,枚举的成员都被定义为相同的枚举类型,所以当需要在 vector 中储存不同类型值时,我们可以定义并使用一个枚举! 例如,假如我们想要从电子表格的一行中获取值,而这一行的有些列包含数字,有些包含浮点值,还有些是字符串。我们可以定义一个枚举,其成员会存放这些不同类型的值,同时所有这些枚举成员都会被当作相同类型:那个枚举的类型。接着可以创建一个储存枚举值的 vector,这样最终就能够储存不同类型的值了。示例 8-9 展示了其用例: # fn main() { enum SpreadsheetCell { Int(i32), Float(f64), Text(String), } let row = vec![ SpreadsheetCell::Int(3), SpreadsheetCell::Text(String::from(\"blue\")), SpreadsheetCell::Float(10.12), ];\n# } 示例 8-9:定义一个枚举,以便能在 vector 中存放不同类型的数据 Rust 在编译时必须确切知道 vector 中的类型,这样它才能确定在堆上需要为每个元素分配多少内存。我们还必须明确这个 vector 中允许的类型。如果 Rust 允许 vector 存储任意类型,那么可能会因为一个或多个类型在对 vector 元素执行操作时导致(类型相关)错误。使用枚举加上 match 表达式意味着 Rust 会在编译时确保每种可能的情况都得到处理,正如第六章讲到的那样。 如果在编写程序时不能确切无遗地知道运行时会储存进 vector 的所有类型,枚举技术就行不通了。相反,你可以使用 trait 对象,第十八章会讲到它。 现在我们了解了一些使用 vector 的最常见的方式,请一定去看看标准库中 Vec 定义的很多其他实用方法的 API 文档 。例如,除了 push 之外还有一个 pop 方法,它会移除并返回 vector 的最后一个元素。","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 使用枚举来储存多种类型","id":"136","title":"使用枚举来储存多种类型"},"137":{"body":"类似于任何其他的 struct,vector 在其离开作用域时会被释放,如示例 8-4 所标注的: # fn main() { { let v = vec![1, 2, 3, 4]; // do stuff with v } // <- v goes out of scope and is freed here\n# } 示例 8-10:展示 vector 和其元素于何处被丢弃 当 vector 被丢弃时,所有其内容也会被丢弃,这意味着这里它包含的整数将被清理。借用检查器确保了任何 vector 中内容的引用仅在 vector 本身有效时才可用。 让我们继续下一个集合类型:String!","breadcrumbs":"常见集合 » 使用 Vector 储存列表 » 丢弃 vector 时也会丢弃其所有元素","id":"137","title":"丢弃 vector 时也会丢弃其所有元素"},"138":{"body":"ch08-02-strings.md commit 668c64760b5c7ea654facb4ba5fe9faddfda27cc 第四章已经讲过一些字符串的内容,不过现在让我们更深入地了解它。字符串是新晋 Rustacean 们通常会被困住的领域,这是由于三方面理由的结合:Rust 倾向于确保暴露出可能的错误,字符串是比很多程序员所想象的要更为复杂的数据结构,以及 UTF-8。所有这些要素结合起来对于来自其他语言背景的程序员就可能显得很困难了。 在集合章节中讨论字符串的原因是,字符串就是作为字节的集合外加一些方法实现的,当这些字节被解释为文本时,这些方法提供了实用的功能。在这一部分,我们会讲到 String 中那些任何集合类型都有的操作,比如创建、更新和读取。也会讨论 String 与其他集合不一样的地方,例如索引 String 是很复杂的,由于人和计算机理解 String 数据方式的不同。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 使用字符串储存 UTF-8 编码的文本","id":"138","title":"使用字符串储存 UTF-8 编码的文本"},"139":{"body":"在开始深入这些方面之前,我们需要讨论一下术语 字符串 的具体意义。Rust 的核心语言中只有一种字符串类型:字符串 slice str,它通常以被借用的形式出现,&str。第四章讲到了 字符串 slices :它们是一些对储存在别处的 UTF-8 编码字符串数据的引用。举例来说,由于字符串字面值被储存在程序的二进制输出中,因此字符串字面值也是字符串 slices。 字符串(String)类型由 Rust 标准库提供,而不是编入核心语言,它是一种可增长、可变、可拥有、UTF-8 编码的字符串类型。当 Rustaceans 提及 Rust 中的 \"字符串 \"时,他们可能指的是 String 或 string slice &str 类型,而不仅仅是其中一种类型。虽然本节主要讨论 String,但这两种类型在 Rust 的标准库中都有大量使用,而且 String 和 字符串 slices 都是 UTF-8 编码的。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 什么是字符串?","id":"139","title":"什么是字符串?"},"14":{"body":"本章和全书中,我们会展示一些在终端中使用的命令。所有需要输入到终端的行都以 $ 开头。你不需要输入$字符;这里显示的$字符表示命令行提示符,仅用于提示每行命令的起点。不以 $ 起始的行通常展示前一个命令的输出。另外,PowerShell 专用的示例会采用 > 而不是 $。","breadcrumbs":"入门指南 » 安装 » 命令行标记","id":"14","title":"命令行标记"},"140":{"body":"很多 Vec 可用的操作在 String 中同样可用,事实上 String 被实现为一个带有一些额外保证、限制和功能的字节 vector 的封装。其中一个同样作用于 Vec 和 String 函数的例子是用来新建一个实例的 new 函数,如示例 8-11 所示。 # fn main() { let mut s = String::new();\n# } 示例 8-11:新建一个空的 String 这新建了一个叫做 s 的空的字符串,接着我们可以向其中装载数据。通常字符串会有初始数据,因为我们希望一开始就有这个字符串。为此,可以使用 to_string 方法,它能用于任何实现了 Display trait 的类型,比如字符串字面值。示例 8-12 展示了两个例子。 # fn main() { let data = \"initial contents\"; let s = data.to_string(); // 该方法也可直接用于字符串字面值: let s = \"initial contents\".to_string();\n# } 示例 8-12:使用 to_string 方法从字符串字面值创建 String 这些代码会创建包含 initial contents 的字符串。 也可以使用 String::from 函数来从字符串字面值创建 String。示例 8-13 中的代码等同于使用 to_string。 # fn main() { let s = String::from(\"initial contents\");\n# } 示例 8-13:使用 String::from 函数从字符串字面值创建 String 因为字符串应用广泛,这里有很多不同的用于字符串的通用 API 可供选择。其中一些可能看起来多余,不过都有其用武之地!在这个例子中,String::from 和 .to_string 最终做了完全相同的工作,所以如何选择就是代码风格与可读性的问题了。 记住字符串是 UTF-8 编码的,所以可以包含任何可以正确编码的数据,如示例 8-14 所示。 # fn main() { let hello = String::from(\"السلام عليكم\"); let hello = String::from(\"Dobrý den\"); let hello = String::from(\"Hello\"); let hello = String::from(\"שלום\"); let hello = String::from(\"नमस्ते\"); let hello = String::from(\"こんにちは\"); let hello = String::from(\"안녕하세요\"); let hello = String::from(\"你好\"); let hello = String::from(\"Olá\"); let hello = String::from(\"Здравствуйте\"); let hello = String::from(\"Hola\");\n# } 示例 8-14:在字符串中储存不同语言的问候语 所有这些都是有效的 String 值。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 新建字符串","id":"140","title":"新建字符串"},"141":{"body":"String 的大小可以增加,其内容也可以改变,就像可以放入更多数据来改变 Vec 的内容一样。另外,可以方便的使用 + 运算符或 format! 宏来拼接 String 值。 使用 push_str 和 push 附加字符串 可以通过 push_str 方法来附加字符串 slice,从而使 String 变长,如示例 8-15 所示。 # fn main() { let mut s = String::from(\"foo\"); s.push_str(\"bar\");\n# } 示例 8-15:使用 push_str 方法向 String 附加字符串 slice 执行这两行代码之后,s 将会包含 foobar。push_str 方法采用字符串 slice,因为我们并不需要获取参数的所有权。例如,示例 8-16 中我们希望在将 s2 的内容附加到 s1 之后还能使用它。 # fn main() { let mut s1 = String::from(\"foo\"); let s2 = \"bar\"; s1.push_str(s2); println!(\"s2 is {s2}\");\n# } 示例 8-16:将字符串 slice 的内容附加到 String 后使用它 如果 push_str 方法获取了 s2 的所有权,就不能在最后一行打印出其值了。好在代码如我们期望那样工作! push 方法被定义为获取一个单独的字符作为参数,并附加到 String 中。示例 8-17 展示了使用 push 方法将字母 \"l\" 加入 String 的代码。 # fn main() { let mut s = String::from(\"lo\"); s.push('l');\n# } 示例 8-17:使用 push 将一个字符加入 String 值中 执行这些代码之后,s 将会包含 “lol”。 使用 + 运算符或 format! 宏拼接字符串 通常你会希望将两个已知的字符串合并在一起。一种办法是像这样使用 + 运算符,如示例 8-18 所示。 # fn main() { let s1 = String::from(\"Hello, \"); let s2 = String::from(\"world!\"); let s3 = s1 + &s2; // 注意 s1 被移动了,不能继续使用\n# } 示例 8-18:使用 + 运算符将两个 String 值合并到一个新的 String 值中 执行完这些代码之后,字符串 s3 将会包含 Hello, world!。s1 在相加后不再有效的原因,和使用 s2 的引用的原因,与使用 + 运算符时调用的函数签名有关。+ 运算符使用了 add 函数,这个函数签名看起来像这样: fn add(self, s: &str) -> String { 在标准库中你会发现,add 的定义使用了泛型和关联类型。在这里我们替换为了具体类型,这也正是当使用 String 值调用这个方法会发生的。第十章会讨论泛型。这个签名提供了理解 + 运算那微妙部分的线索。 首先,s2 使用了 &,意味着我们使用第二个字符串的 引用 与第一个字符串相加。这是因为 add 函数的 s 参数:只能将 &str 和 String 相加,不能将两个 String 值相加。不过等一下 —— &s2 的类型是 &String, 而不是 add 第二个参数所指定的 &str。那么为什么示例 8-18 还能编译呢? 之所以能够在 add 调用中使用 &s2 是因为 &String 可以被 强转 ( coerced )成 &str。当add函数被调用时,Rust 使用了一个被称为 Deref 强制转换 ( deref coercion )的技术,你可以将其理解为它把 &s2 变成了 &s2[..]。第十五章会更深入的讨论 Deref 强制转换。因为 add 没有获取参数的所有权,所以 s2 在这个操作后仍然是有效的 String。 其次,可以发现签名中 add 获取了 self 的所有权,因为 self 没有 使用 &。这意味着示例 8-18 中的 s1 的所有权将被移动到 add 调用中,之后就不再有效。所以虽然 let s3 = s1 + &s2; 看起来就像它会复制两个字符串并创建一个新的字符串,而实际上这个语句会获取 s1 的所有权,附加上从 s2 中拷贝的内容,并返回结果的所有权。换句话说,它看起来好像生成了很多拷贝,不过实际上并没有:这个实现比拷贝要更高效。 如果想要级联多个字符串,+ 的行为就显得笨重了: # fn main() { let s1 = String::from(\"tic\"); let s2 = String::from(\"tac\"); let s3 = String::from(\"toe\"); let s = s1 + \"-\" + &s2 + \"-\" + &s3;\n# } 这时 s 的内容会是 “tic-tac-toe”。在有这么多 + 和 \" 字符的情况下,很难理解具体发生了什么。对于更为复杂的字符串链接,可以使用 format! 宏: # fn main() { let s1 = String::from(\"tic\"); let s2 = String::from(\"tac\"); let s3 = String::from(\"toe\"); let s = format!(\"{s1}-{s2}-{s3}\");\n# } 这些代码也会将 s 设置为 “tic-tac-toe”。format! 与 println! 的工作原理相同,不过不同于将输出打印到屏幕上,它返回一个带有结果内容的 String。这个版本就好理解的多,宏 format! 生成的代码使用引用所以不会获取任何参数的所有权。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 更新字符串","id":"141","title":"更新字符串"},"142":{"body":"在很多语言中,通过索引来引用字符串中的单独字符是有效且常见的操作。然而在 Rust 中,如果你尝试使用索引语法访问 String 的一部分,会出现一个错误。考虑一下如示例 8-19 中所示的无效代码。 # fn main() { let s1 = String::from(\"hello\"); let h = s1[0];\n# } 示例 8-19:尝试对字符串使用索引语法 这段代码会导致如下错误: $ cargo run Compiling collections v0.1.0 (file:///projects/collections)\nerror[E0277]: the type `str` cannot be indexed by `{integer}` --> src/main.rs:3:16 |\n3 | let h = s1[0]; | ^ string indices are ranges of `usize` | = help: the trait `SliceIndex` is not implemented for `{integer}`, which is required by `String: Index<_>` = note: you can use `.chars().nth()` or `.bytes().nth()` for more information, see chapter 8 in The Book: = help: the trait `SliceIndex<[_]>` is implemented for `usize` = help: for that trait implementation, expected `[_]`, found `str` = note: required for `String` to implement `Index<{integer}>` For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `collections` (bin \"collections\") due to 1 previous error 错误和提示说明了全部问题:Rust 的字符串不支持索引。那么接下来的问题是,为什么不支持呢?为了回答这个问题,我们必须先聊一聊 Rust 是如何在内存中储存字符串的。 内部表现 String 是一个 Vec 的封装。让我们看看示例 8-14 中一些正确编码的字符串的例子。首先是这一个: # fn main() {\n# let hello = String::from(\"السلام عليكم\");\n# let hello = String::from(\"Dobrý den\");\n# let hello = String::from(\"Hello\");\n# let hello = String::from(\"שלום\");\n# let hello = String::from(\"नमस्ते\");\n# let hello = String::from(\"こんにちは\");\n# let hello = String::from(\"안녕하세요\");\n# let hello = String::from(\"你好\");\n# let hello = String::from(\"Olá\");\n# let hello = String::from(\"Здравствуйте\"); let hello = String::from(\"Hola\");\n# } 在这里,len 的值是 4,这意味着储存字符串 “Hola” 的 Vec 的长度是四个字节:这里每一个字母的 UTF-8 编码都占用一个字节。那下面这个例子又如何呢?(注意这个字符串中的首字母是西里尔字母的 Ze 而不是数字 3。) # fn main() {\n# let hello = String::from(\"السلام عليكم\");\n# let hello = String::from(\"Dobrý den\");\n# let hello = String::from(\"Hello\");\n# let hello = String::from(\"שלום\");\n# let hello = String::from(\"नमस्ते\");\n# let hello = String::from(\"こんにちは\");\n# let hello = String::from(\"안녕하세요\");\n# let hello = String::from(\"你好\");\n# let hello = String::from(\"Olá\"); let hello = String::from(\"Здравствуйте\");\n# let hello = String::from(\"Hola\");\n# } 当问及这个字符是多长的时候有人可能会说是 12。然而,Rust 的回答是 24。这是使用 UTF-8 编码 “Здравствуйте” 所需要的字节数,这是因为每个 Unicode 标量值需要两个字节存储。因此一个字符串字节值的索引并不总是对应一个有效的 Unicode 标量值。作为演示,考虑如下无效的 Rust 代码: let hello = \"Здравствуйте\";\nlet answer = &hello[0]; 我们已经知道 answer 不是第一个字符 3。当使用 UTF-8 编码时,(西里尔字母的 Ze)З 的第一个字节是 208,第二个是 151,所以 answer 实际上应该是 208,不过 208 自身并不是一个有效的字母。返回 208 可不是一个请求字符串第一个字母的人所希望看到的,不过它是 Rust 在字节索引 0 位置所能提供的唯一数据。用户通常不会想要一个字节值被返回。即使这个字符串只有拉丁字母,如果 &\"hello\"[0] 是返回字节值的有效代码,它也会返回 104 而不是 h。 为了避免返回意外的值并造成不能立刻发现的 bug,Rust 根本不会编译这些代码,并在开发过程中及早杜绝了误会的发生。 字节、标量值和字形簇!天呐! 这引起了关于 UTF-8 的另外一个问题:从 Rust 的角度来讲,事实上有三种相关方式可以理解字符串:字节、标量值和字形簇(最接近人们眼中 字母 的概念)。 比如这个用梵文书写的印度语单词 “नमस्ते”,最终它储存在 vector 中的 u8 值看起来像这样: [224, 164, 168, 224, 164, 174, 224, 164, 184, 224, 165, 141, 224, 164, 164,\n224, 165, 135] 这里有 18 个字节,也就是计算机最终会储存的数据。如果从 Unicode 标量值的角度理解它们,也就像 Rust 的 char 类型那样,这些字节看起来像这样: ['न', 'म', 'स', '्', 'त', 'े'] 这里有六个 char,不过第四个和第六个都不是字母,它们是发音符号本身并没有任何意义。最后,如果以字形簇的角度理解,就会得到人们所说的构成这个单词的四个字母: [\"न\", \"म\", \"स्\", \"ते\"] Rust 提供了多种不同的方式来解释计算机储存的原始字符串数据,这样程序就可以选择它需要的表现方式,而无所谓是何种人类语言。 最后一个 Rust 不允许使用索引获取 String 字符的原因是,索引操作预期总是需要常数时间(O(1))。但是对于 String 不可能保证这样的性能,因为 Rust 必须从开头到索引位置遍历来确定有多少有效的字符。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 索引字符串","id":"142","title":"索引字符串"},"143":{"body":"索引字符串通常是一个坏点子,因为字符串索引应该返回的类型是不明确的:字节值、字符、字形簇或者字符串 slice。因此,如果你真的希望使用索引创建字符串 slice 时,Rust 会要求你更明确一些。为了更明确索引并表明你需要一个字符串 slice,相比使用 [] 和单个值的索引,可以使用 [] 和一个 range 来创建含特定字节的字符串 slice: let hello = \"Здравствуйте\"; let s = &hello[0..4]; 这里,s 会是一个 &str,它包含字符串的头四个字节。早些时候,我们提到了这些字母都是两个字节长的,所以这意味着 s 将会是 “Зд”。 如果获取 &hello[0..1] 会发生什么呢?答案是:Rust 在运行时会 panic,就跟访问 vector 中的无效索引时一样: $ cargo run Compiling collections v0.1.0 (file:///projects/collections) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s Running `target/debug/collections`\nthread 'main' panicked at src/main.rs:4:19:\nbyte index 1 is not a char boundary; it is inside 'З' (bytes 0..2) of `Здравствуйте`\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 你应该小心谨慎地使用这个操作,因为这么做可能会使你的程序崩溃。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 字符串 slice","id":"143","title":"字符串 slice"},"144":{"body":"操作字符串每一部分的最好的方法是明确表示需要字符还是字节。对于单独的 Unicode 标量值使用 chars 方法。对 “Зд” 调用 chars 方法会将其分开并返回两个 char 类型的值,接着就可以遍历其结果来访问每一个元素了: for c in \"Зд\".chars() { println!(\"{c}\");\n} 这些代码会打印出如下内容: З\nд 另外 bytes 方法返回每一个原始字节,这可能会适合你的使用场景: for b in \"Зд\".bytes() { println!(\"{b}\");\n} 这些代码会打印出组成 String 的 4 个字节: 208\n151\n208\n180 不过请记住有效的 Unicode 标量值可能会由不止一个字节组成。 从字符串中获取如同天城文这样的字形簇是很复杂的,所以标准库并没有提供这个功能。 crates.io 上有些提供这样功能的 crate。","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 遍历字符串的方法","id":"144","title":"遍历字符串的方法"},"145":{"body":"总而言之,字符串还是很复杂的。不同的语言选择了不同的向程序员展示其复杂性的方式。Rust 选择了以准确的方式处理 String 数据作为所有 Rust 程序的默认行为,这意味着程序员们必须更多的思考如何预先处理 UTF-8 数据。这种权衡取舍相比其他语言更多的暴露出了字符串的复杂性,不过也使你在开发周期后期免于处理涉及非 ASCII 字符的错误。 好消息是标准库提供了很多围绕 String 和 &str 构建的功能,来帮助我们正确处理这些复杂场景。请务必查看这些使用方法的文档,例如 contains 来搜索一个字符串,和 replace 将字符串的一部分替换为另一个字符串。 称作 String 的类型是由标准库提供的,而没有写进核心语言部分,它是可增长的、可变的、有所有权的、UTF-8 编码的字符串类型。当 Rustacean 们谈到 Rust 的 “字符串”时,它们通常指的是 String 或字符串 slice &str 类型,而不特指其中某一个。虽然本部分内容大多是关于 String 的,不过这两个类型在 Rust 标准库中都被广泛使用,String 和字符串 slices 都是 UTF-8 编码的。 现在让我们转向一些不太复杂的集合:哈希 map!","breadcrumbs":"常见集合 » 使用字符串储存 UTF-8 编码的文本 » 字符串并不简单","id":"145","title":"字符串并不简单"},"146":{"body":"ch08-03-hash-maps.md commit 50775360ba3904c41e84176337ff47e6e7d6177c 最后介绍的常用集合类型是 哈希 map ( hash map )。HashMap 类型储存了一个键类型 K 对应一个值类型 V 的映射。它通过一个 哈希函数 ( hashing function )来实现映射,决定如何将键和值放入内存中。很多编程语言支持这种数据结构,不过通常有不同的名字:哈希、map、对象、哈希表或者关联数组,仅举几例。 哈希 map 可以用于需要任何类型作为键来寻找数据的情况,而不是像 vector 那样通过索引。例如,在一个游戏中,你可以将每个团队的分数记录到哈希 map 中,其中键是队伍的名字而值是每个队伍的分数。给出一个队名,就能得到他们的得分。 本章我们会介绍哈希 map 的基本 API,不过还有更多吸引人的功能隐藏于标准库在 HashMap 上定义的函数中。一如既往请查看标准库文档来了解更多信息。","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 使用 Hash Map 储存键值对","id":"146","title":"使用 Hash Map 储存键值对"},"147":{"body":"可以使用 new 创建一个空的 HashMap,并使用 insert 增加元素。在示例 8-20 中我们记录两支队伍的分数,分别是蓝队和黄队。蓝队开始有 10 分而黄队开始有 50 分: # fn main() { use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert(String::from(\"Blue\"), 10); scores.insert(String::from(\"Yellow\"), 50);\n# } 示例 8-20:新建一个哈希 map 并插入一些键值对 注意必须首先 use 标准库中集合部分的 HashMap。在这三个常用集合中,HashMap 是最不常用的,所以并没有被 prelude 自动引用。标准库中对 HashMap 的支持也相对较少,例如,并没有内建的构建宏。 像 vector 一样,哈希 map 将它们的数据储存在堆上,这个 HashMap 的键类型是 String 而值类型是 i32。类似于 vector,哈希 map 是同质的:所有的键必须是相同类型,值也必须都是相同类型。","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 新建一个哈希 map","id":"147","title":"新建一个哈希 map"},"148":{"body":"可以通过 get 方法并提供对应的键来从哈希 map 中获取值,如示例 8-21 所示: # fn main() { use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert(String::from(\"Blue\"), 10); scores.insert(String::from(\"Yellow\"), 50); let team_name = String::from(\"Blue\"); let score = scores.get(&team_name).copied().unwrap_or(0);\n# } 示例 8-21:访问哈希 map 中储存的蓝队分数 这里,score 是与蓝队分数相关的值,应为 10。get 方法返回 Option<&V>,如果某个键在哈希 map 中没有对应的值,get 会返回 None。程序中通过调用 copied 方法来获取一个 Option 而不是 Option<&i32>,接着调用 unwrap_or 在 scores 中没有该键所对应的项时将其设置为零。 可以使用与 vector 类似的方式来遍历哈希 map 中的每一个键值对,也就是 for 循环: # fn main() { use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert(String::from(\"Blue\"), 10); scores.insert(String::from(\"Yellow\"), 50); for (key, value) in &scores { println!(\"{key}: {value}\"); }\n# } 这会以任意顺序打印出每一个键值对: Yellow: 50\nBlue: 10","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 访问哈希 map 中的值","id":"148","title":"访问哈希 map 中的值"},"149":{"body":"对于像 i32 这样的实现了 Copy trait 的类型,其值可以拷贝进哈希 map。对于像 String 这样拥有所有权的值,其值将被移动而哈希 map 会成为这些值的所有者,如示例 8-22 所示: # fn main() { use std::collections::HashMap; let field_name = String::from(\"Favorite color\"); let field_value = String::from(\"Blue\"); let mut map = HashMap::new(); map.insert(field_name, field_value); // 这里 field_name 和 field_value 不再有效, // 尝试使用它们看看会出现什么编译错误!\n# } 示例 8-22:展示一旦键值对被插入后就为哈希 map 所拥有 当 insert 调用将 field_name 和 field_value 移动到哈希 map 中后,将不能使用这两个绑定。 如果将值的引用插入哈希 map,这些值本身将不会被移动进哈希 map。但是这些引用指向的值必须至少在哈希 map 有效时也是有效的。第十章 “生命周期确保引用有效” 部分将会更多的讨论这个问题。","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 哈希 map 和所有权","id":"149","title":"哈希 map 和所有权"},"15":{"body":"如果你使用 Linux 或 macOS,打开终端并输入如下命令: $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh 此命令下载一个脚本并开始安装 rustup 工具,这会安装最新稳定版 Rust。过程中可能会提示你输入密码。如果安装成功,将会出现如下内容: Rust is installed now. Great! 另外,你还需要一个 链接器(linker) ,这是 Rust 用来将其编译的输出连接到一个文件中的程序。很可能你已经有一个了。如果你遇到了链接器错误,请尝试安装一个 C 编译器,它通常包括一个链接器。C 编译器也很有用,因为一些常见的 Rust 包依赖于 C 代码,因此需要安装一个 C 编译器。 在 macOS 上,你可以通过运行以下命令获得 C 语言编译器: $ xcode-select --install Linux 用户通常需要根据发行版(distribution)文档安装 GCC 或 Clang。比如,如果你使用 Ubuntu,可以安装 build-essential 包。","breadcrumbs":"入门指南 » 安装 » 在 Linux 或 macOS 上安装 rustup","id":"15","title":"在 Linux 或 macOS 上安装 rustup"},"150":{"body":"尽管键值对的数量是可以增长的,每个唯一的键只能同时关联一个值(反之不一定成立:比如蓝队和黄队的 scores 哈希 map 中都可能存储有 10 这个值)。 当我们想要改变哈希 map 中的数据时,必须决定如何处理一个键已经有值了的情况。可以选择完全无视旧值并用新值代替旧值。可以选择保留旧值而忽略新值,并只在键 没有 对应值时增加新值。或者可以结合新旧两值。让我们看看这分别该如何处理! 覆盖一个值 如果我们插入了一个键值对,接着用相同的键插入一个不同的值,与这个键相关联的旧值将被替换。即便示例 8-23 中的代码调用了两次 insert,哈希 map 也只会包含一个键值对,因为两次都是对蓝队的键插入的值: # fn main() { use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert(String::from(\"Blue\"), 10); scores.insert(String::from(\"Blue\"), 25); println!(\"{scores:?}\");\n# } 示例 8-23:替换以特定键储存的值 这会打印出 {\"Blue\": 25}。原始的值 10 则被覆盖了。 只在键没有对应值时插入键值对 我们经常会检查某个特定的键是否已经存在于哈希 map 中并进行如下操作:如果哈希 map 中键已经存在则不做任何操作。如果不存在则连同值一块插入。 为此哈希 map 有一个特有的 API,叫做 entry,它获取我们想要检查的键作为参数。entry 函数的返回值是一个枚举,Entry,它代表了可能存在也可能不存在的值。比如说我们想要检查黄队的键是否关联了一个值。如果没有,就插入值 50,对于蓝队也是如此。使用 entry API 的代码看起来像示例 8-24 这样: # fn main() { use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert(String::from(\"Blue\"), 10); scores.entry(String::from(\"Yellow\")).or_insert(50); scores.entry(String::from(\"Blue\")).or_insert(50); println!(\"{scores:?}\");\n# } 示例 8-24:使用 entry 方法只在键没有对应一个值时插入 Entry 的 or_insert 方法在键对应的值存在时就返回这个值的可变引用,如果不存在则将参数作为新值插入并返回新值的可变引用。这比编写自己的逻辑要简明的多,另外也与借用检查器结合得更好。 运行示例 8-24 的代码会打印出 {\"Yellow\": 50, \"Blue\": 10}。第一个 entry 调用会插入黄队的键和值 50,因为黄队并没有一个值。第二个 entry 调用不会改变哈希 map 因为蓝队已经有了值 10。 根据旧值更新一个值 另一个常见的哈希 map 的应用场景是找到一个键对应的值并根据旧的值更新它。例如,示例 8-25 中的代码计数一些文本中每一个单词分别出现了多少次。我们使用哈希 map 以单词作为键并递增其值来记录我们遇到过几次这个单词。如果是第一次看到某个单词,就插入值 0。 # fn main() { use std::collections::HashMap; let text = \"hello world wonderful world\"; let mut map = HashMap::new(); for word in text.split_whitespace() { let count = map.entry(word).or_insert(0); *count += 1; } println!(\"{map:?}\");\n# } 示例 8-25:通过哈希 map 储存单词和计数来统计出现次数 这会打印出 {\"world\": 2, \"hello\": 1, \"wonderful\": 1}。你可能会看到相同的键值对以不同的顺序打印:回忆一下 “访问哈希 map 中的值” 部分中遍历哈希 map 会以任意顺序进行。 split_whitespace 方法返回一个由空格分隔 text 值子 slice 的迭代器。or_insert 方法返回这个键的值的一个可变引用(&mut V)。这里我们将这个可变引用储存在 count 变量中,所以为了赋值必须首先使用星号(*)解引用 count。这个可变引用在 for 循环的结尾离开作用域,这样所有这些改变都是安全的并符合借用规则。","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 更新哈希 map","id":"150","title":"更新哈希 map"},"151":{"body":"HashMap 默认使用一种叫做 SipHash 的哈希函数,它可以抵御涉及哈希表(hash table) [1] 的拒绝服务(Denial of Service, DoS)攻击。然而这并不是可用的最快的算法,不过为了更高的安全性值得付出一些性能的代价。如果性能监测显示此哈希函数非常慢,以致于你无法接受,你可以指定一个不同的 hasher 来切换为其它函数。hasher 是一个实现了 BuildHasher trait 的类型。第十章会讨论 trait 和如何实现它们。你并不需要从头开始实现你自己的 hasher; crates.io 有其他人分享的实现了许多常用哈希算法的 hasher 的库。 https://en.wikipedia.org/wiki/SipHash","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 哈希函数","id":"151","title":"哈希函数"},"152":{"body":"vector、字符串和哈希 map 会在你的程序需要储存、访问和修改数据时帮助你。这里有一些你应该能够解决的练习问题: 给定一系列数字,使用 vector 并返回这个列表的中位数(排列数组后位于中间的值)和众数(出现次数最多的值;在这里哈希 map 会很有帮助)。 将字符串转换为 Pig Latin,也就是每一个单词的第一个辅音字母被移动到单词的结尾并增加 “ay”,所以 “first” 会变成 “irst-fay”。元音字母开头的单词则在结尾增加 “hay”(“apple” 会变成 “apple-hay”)。牢记 UTF-8 编码! 使用哈希 map 和 vector,创建一个文本接口来允许用户向公司的部门中增加员工的名字。例如,“Add Sally to Engineering” 或 “Add Amir to Sales”。接着让用户获取一个部门的所有员工的列表,或者公司每个部门的所有员工按照字典序排列的列表。 标准库 API 文档中描述的这些类型的方法将有助于你进行这些练习! 我们已经开始接触可能会有失败操作的复杂程序了,这也意味着接下来是一个了解错误处理的绝佳时机!","breadcrumbs":"常见集合 » 使用 Hash Map 储存键值对 » 总结","id":"152","title":"总结"},"153":{"body":"ch09-00-error-handling.md commit 199ca99926f232ee7f581a917eada4b65ff21754 错误是软件中不可否认的事实,所以 Rust 有一些处理出错情况的特性。在许多情况下,Rust 要求你承认错误的可能性,并在你的代码编译前采取一些行动。这一要求使你的程序更加健壮,因为它可以确保你在将代码部署到生产环境之前就能发现错误并进行适当的处理。 Rust 将错误分为两大类: 可恢复的 ( recoverable )和 不可恢复的 ( unrecoverable )错误。对于一个可恢复的错误,比如文件未找到的错误,我们很可能只想向用户报告问题并重试操作。不可恢复的错误总是 bug 出现的征兆,比如试图访问一个超过数组末端的位置,因此我们要立即停止程序。 大多数语言并不区分这两种错误,并采用类似异常这样方式统一处理它们。Rust 没有异常。相反,它有 Result 类型,用于处理可恢复的错误,还有 panic! 宏,在程序遇到不可恢复的错误时停止执行。本章首先介绍 panic! 调用,接着会讲到如何返回 Result。此外,我们将探讨在决定是尝试从错误中恢复还是停止执行时的注意事项。","breadcrumbs":"错误处理 » 错误处理","id":"153","title":"错误处理"},"154":{"body":"ch09-01-unrecoverable-errors-with-panic.md commit 2921743516b3e2c0f45a95390e7b536e42f4af7c 突然有一天,代码出问题了,而你对此束手无策。对于这种情况,Rust 有 panic!宏。在实践中有两种方法造成 panic:执行会造成代码 panic 的操作(比如访问超过数组结尾的内容)或者显式调用 panic! 宏。这两种情况都会使程序 panic。通常情况下这些 panic 会打印出一个错误信息,展开并清理栈数据,然后退出。通过一个环境变量,你也可以让 Rust 在 panic 发生时打印调用堆栈(call stack)以便于定位 panic 的原因。","breadcrumbs":"错误处理 » 用 panic! 处理不可恢复的错误 » 用 panic! 处理不可恢复的错误","id":"154","title":"用 panic! 处理不可恢复的错误"},"155":{"body":"当出现 panic 时,程序默认会开始 展开 ( unwinding ),这意味着 Rust 会回溯栈并清理它遇到的每一个函数的数据,不过这个回溯并清理的过程有很多工作。另一种选择是直接 终止 ( abort ),这会不清理数据就退出程序。 那么程序所使用的内存需要由操作系统来清理。如果你需要项目的最终二进制文件越小越好,panic 时通过在 Cargo.toml 的 [profile] 部分增加 panic = 'abort',可以由展开切换为终止。例如,如果你想要在 release 模式中 panic 时直接终止: [profile.release]\npanic = 'abort' 让我们在一个简单的程序中调用 panic!: 文件名:src/main.rs fn main() { panic!(\"crash and burn\");\n} 运行程序将会出现类似这样的输出: $ cargo run Compiling panic v0.1.0 (file:///projects/panic) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.25s Running `target/debug/panic`\nthread 'main' panicked at src/main.rs:2:5:\ncrash and burn\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 最后两行包含 panic! 调用造成的错误信息。第一行显示了 panic 提供的信息并指明了源码中 panic 出现的位置: src/main.rs:2:5 表明这是 src/main.rs 文件的第二行第五个字符。 在这个例子中,被指明的那一行是我们代码的一部分,而且查看这一行的话就会发现 panic! 宏的调用。在其他情况下,panic! 可能会出现在我们的代码所调用的代码中。错误信息报告的文件名和行号可能指向别人代码中的 panic! 宏调用,而不是我们代码中最终导致 panic! 的那一行。我们可以使用 panic! 被调用的函数的 backtrace 来寻找代码中出问题的地方。下面我们会详细介绍 backtrace 是什么。","breadcrumbs":"错误处理 » 用 panic! 处理不可恢复的错误 » 对应 panic 时的栈展开或终止","id":"155","title":"对应 panic 时的栈展开或终止"},"156":{"body":"让我们来看看另一个因为我们代码中的 bug 引起的别的库中 panic! 的例子,而不是直接的宏调用。示例 9-1 有一些尝试通过索引访问 vector 中元素的例子: 文件名:src/main.rs fn main() { let v = vec![1, 2, 3]; v[99];\n} 示例 9-1:尝试访问超越 vector 结尾的元素,这会造成 panic! 这里尝试访问 vector 的第一百个元素(这里的索引是 99 因为索引从 0 开始),不过它只有三个元素。这种情况下 Rust 会 panic。[] 应当返回一个元素,不过如果传递了一个无效索引,就没有可供 Rust 返回的正确的元素。 C 语言中,尝试读取数据结构之后的值是未定义行为(undefined behavior)。你会得到任何对应数据结构中这个元素的内存位置的值,甚至是这些内存并不属于这个数据结构的情况。这被称为 缓冲区溢出 ( buffer overread ),并可能会导致安全漏洞,比如攻击者可以像这样操作索引来读取储存在数据结构之后不被允许的数据。 为了保护程序远离这类漏洞,如果尝试读取一个索引不存在的元素,Rust 会停止执行并拒绝继续。尝试运行上面的程序会出现如下输出: $ cargo run Compiling panic v0.1.0 (file:///projects/panic) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.27s Running `target/debug/panic`\nthread 'main' panicked at src/main.rs:4:6:\nindex out of bounds: the len is 3 but the index is 99\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 错误指向 main.rs 的第 4 行,这里我们尝试访问索引 99。下面的说明(note)行提醒我们可以设置 RUST_BACKTRACE 环境变量来得到一个 backtrace。 backtrace 是一个执行到目前位置所有被调用的函数的列表。Rust 的 backtrace 跟其他语言中的一样:阅读 backtrace 的关键是从头开始读直到发现你编写的文件。这就是问题的发源地。这一行往上是你的代码所调用的代码;往下则是调用你的代码的代码。这些行可能包含核心 Rust 代码,标准库代码或用到的 crate 代码。让我们将 RUST_BACKTRACE 环境变量设置为任何不是 0 的值来获取 backtrace 看看。示例 9-2 展示了与你看到类似的输出: $ RUST_BACKTRACE=1 cargo run\nthread 'main' panicked at 'index out of bounds: the len is 3 but the index is 99', src/main.rs:4:5\nstack backtrace: 0: rust_begin_unwind at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/std/src/panicking.rs:584:5 1: core::panicking::panic_fmt at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/panicking.rs:142:14 2: core::panicking::panic_bounds_check at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/panicking.rs:84:5 3: >::index at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/slice/index.rs:242:10 4: core::slice::index:: for [T]>::index at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/slice/index.rs:18:9 5: as core::ops::index::Index>::index at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/alloc/src/vec/mod.rs:2591:9 6: panic::main at ./src/main.rs:4:5 7: core::ops::function::FnOnce::call_once at /rustc/e092d0b6b43f2de967af0887873151bb1c0b18d3/library/core/src/ops/function.rs:248:5\nnote: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. 示例 9-2:当设置 RUST_BACKTRACE 环境变量时 panic! 调用所生成的 backtrace 信息 这里有大量的输出!你实际看到的输出可能因不同的操作系统和 Rust 版本而有所不同。为了获取带有这些信息的 backtrace,必须启用 debug 标识。当不使用 --release 参数运行 cargo build 或 cargo run 时 debug 标识会默认启用,就像这里一样。 示例 9-2 的输出中,backtrace 的 12 行指向了我们项目中造成问题的行: src/main.rs 的第 4 行。如果你不希望程序 panic,第一个提到我们编写的代码行的位置是你应该开始调查的,以便查明是什么值如何在这个地方引起了 panic。在示例 9-1 中,我们故意编写会 panic 的代码来演示如何使用 backtrace,修复这个 panic 的方法就是不要尝试在一个只包含三个项的 vector 中请求索引是 100 的元素。当将来你的代码出现了 panic,你需要搞清楚在这特定的场景下代码中执行了什么操作和什么值导致了 panic,以及应当如何处理才能避免这个问题。 本章后面的小节 “要不要 panic!” 会再次回到 panic! 并讲解何时应该、何时不应该使用 panic! 来处理错误情况。接下来,我们来看看如何使用 Result 来从错误中恢复。","breadcrumbs":"错误处理 » 用 panic! 处理不可恢复的错误 » 使用 panic! 的 backtrace","id":"156","title":"使用 panic! 的 backtrace"},"157":{"body":"ch09-02-recoverable-errors-with-result.md commit 699adc6f5cb76f6e9d567ff0a57d8a844ac07a88 大部分错误并没有严重到需要程序完全停止执行。有时候,一个函数失败,仅仅就是因为一个容易理解和响应的原因。例如,如果因为打开一个并不存在的文件而失败,此时我们可能想要创建这个文件,而不是终止进程。 回忆一下第二章 “使用 Result 类型来处理潜在的错误” 部分中的那个 Result 枚举,它定义有如下两个成员,Ok 和 Err: enum Result { Ok(T), Err(E),\n} T 和 E 是泛型类型参数;第十章会详细介绍泛型。现在你需要知道的就是 T 代表成功时返回的 Ok 成员中的数据的类型,而 E 代表失败时返回的 Err 成员中的错误的类型。因为 Result 有这些泛型类型参数,我们可以将 Result 类型和标准库中为其定义的函数用于很多不同的场景,这些情况中需要返回的成功值和失败值可能会各不相同。 让我们调用一个返回 Result 的函数,因为它可能会失败:如示例 9-3 所示打开一个文件: 文件名:src/main.rs use std::fs::File; fn main() { let greeting_file_result = File::open(\"hello.txt\");\n} 示例 9-3:打开文件 File::open 的返回值是 Result。泛型参数 T 会被 File::open 的实现放入成功返回值的类型 std::fs::File,这是一个文件句柄。错误返回值使用的 E 的类型是 std::io::Error。这些返回类型意味着 File::open 调用可能成功并返回一个可以读写的文件句柄。这个函数调用也可能会失败:例如,也许文件不存在,或者可能没有权限访问这个文件。File::open 函数需要一个方法在告诉我们成功与否的同时返回文件句柄或者错误信息。这些信息正好是 Result 枚举所代表的。 当 File::open 成功时,greeting_file_result 变量将会是一个包含文件句柄的 Ok 实例。当失败时,greeting_file_result 变量将会是一个包含了更多关于发生了何种错误的信息的 Err 实例。 我们需要在示例 9-3 的代码中增加根据 File::open 返回值进行不同处理的逻辑。示例 9-4 展示了一个使用基本工具处理 Result 的例子:第六章学习过的 match 表达式。 文件名:src/main.rs use std::fs::File; fn main() { let greeting_file_result = File::open(\"hello.txt\"); let greeting_file = match greeting_file_result { Ok(file) => file, Err(error) => panic!(\"Problem opening the file: {error:?}\"), };\n} 示例 9-4:使用 match 表达式处理可能会返回的 Result 成员 注意与 Option 枚举一样,Result 枚举和其成员也被导入到了 prelude 中,所以就不需要在 match 分支中的 Ok 和 Err 之前指定 Result::。 这里我们告诉 Rust 当结果是 Ok 时,返回 Ok 成员中的 file 值,然后将这个文件句柄赋值给变量 greeting_file。match 之后,我们可以利用这个文件句柄来进行读写。 match 的另一个分支处理从 File::open 得到 Err 值的情况。在这种情况下,我们选择调用 panic! 宏。如果当前目录没有一个叫做 hello.txt 的文件,当运行这段代码时会看到如下来自 panic! 宏的输出: $ cargo run Compiling error-handling v0.1.0 (file:///projects/error-handling) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.73s Running `target/debug/error-handling`\nthread 'main' panicked at src/main.rs:8:23:\nProblem opening the file: Os { code: 2, kind: NotFound, message: \"No such file or directory\" }\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 一如既往,此输出准确地告诉了我们到底出了什么错。","breadcrumbs":"错误处理 » 用 Result 处理可恢复的错误 » 用 Result 处理可恢复的错误","id":"157","title":"用 Result 处理可恢复的错误"},"158":{"body":"示例 9-4 中的代码不管 File::open 是因为什么原因失败都会 panic!。我们真正希望的是对不同的错误原因采取不同的行为:如果 File::open 因为文件不存在而失败,我们希望创建这个文件并返回新文件的句柄。如果 File::open 因为任何其他原因失败,例如没有打开文件的权限,我们仍然希望像示例 9-4 那样 panic!。让我们看看示例 9-5,其中 match 增加了另一个分支: 文件名:src/main.rs use std::fs::File;\nuse std::io::ErrorKind; fn main() { let greeting_file_result = File::open(\"hello.txt\"); let greeting_file = match greeting_file_result { Ok(file) => file, Err(error) => match error.kind() { ErrorKind::NotFound => match File::create(\"hello.txt\") { Ok(fc) => fc, Err(e) => panic!(\"Problem creating the file: {e:?}\"), }, other_error => { panic!(\"Problem opening the file: {other_error:?}\"); } }, };\n} 示例 9-5:使用不同的方式处理不同类型的错误 File::open 返回的 Err 成员中的值类型 io::Error,它是一个标准库中提供的结构体。这个结构体有一个返回 io::ErrorKind 值的 kind 方法可供调用。io::ErrorKind 是一个标准库提供的枚举,它的成员对应 io 操作可能导致的不同错误类型。我们感兴趣的成员是 ErrorKind::NotFound,它代表尝试打开的文件并不存在。这样,match 就匹配完 greeting_file_result 了,不过对于 error.kind() 还有一个内层 match。 我们希望在内层 match 中检查的条件是 error.kind() 的返回值是否为 ErrorKind的 NotFound 成员。如果是,则尝试通过 File::create 创建文件。然而因为 File::create 也可能会失败,还需要增加一个内层 match 语句。当文件不能被创建,会打印出一个不同的错误信息。外层 match 的最后一个分支保持不变,这样对任何除了文件不存在的错误会使程序 panic。 不同于使用 match 和 Result 这里有好多 match!match 确实很强大,不过也非常的原始。第十三章我们会介绍闭包(closure),它会和定义在 Result 中的很多方法一起使用。在处理代码中的 Result 值时,相比于使用 match ,使用这些方法会更加简洁。 例如,这是另一个编写与示例 9-5 逻辑相同但是使用闭包和 unwrap_or_else 方法的例子: use std::fs::File;\nuse std::io::ErrorKind; fn main() { let greeting_file = File::open(\"hello.txt\").unwrap_or_else(|error| { if error.kind() == ErrorKind::NotFound { File::create(\"hello.txt\").unwrap_or_else(|error| { panic!(\"Problem creating the file: {:?}\", error); }) } else { panic!(\"Problem opening the file: {:?}\", error); } });\n} 虽然这段代码有着如示例 9-5 一样的行为,但并没有包含任何 match 表达式且更容易阅读。在阅读完第十三章后再回到这个例子,并查看标准库文档 unwrap_or_else 方法都做了什么操作。在处理错误时,还有很多这类方法可以消除大量嵌套的 match 表达式。","breadcrumbs":"错误处理 » 用 Result 处理可恢复的错误 » 匹配不同的错误","id":"158","title":"匹配不同的错误"},"159":{"body":"match 能够胜任它的工作,不过它可能有点冗长并且不总是能很好的表明其意图。Result 类型定义了很多辅助方法来处理各种情况。其中之一叫做 unwrap,它的实现就类似于示例 9-4 中的 match 语句。如果 Result 值是成员 Ok,unwrap 会返回 Ok 中的值。如果 Result 是成员 Err,unwrap 会为我们调用 panic!。这里是一个实践 unwrap 的例子: 文件名:src/main.rs use std::fs::File; fn main() { let greeting_file = File::open(\"hello.txt\").unwrap();\n} 如果调用这段代码时不存在 hello.txt 文件,我们将会看到一个 unwrap 调用 panic! 时提供的错误信息: thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os {\ncode: 2, kind: NotFound, message: \"No such file or directory\" }',\nsrc/main.rs:4:49 还有另一个类似于 unwrap 的方法它还允许我们选择 panic! 的错误信息:expect。使用 expect 而不是 unwrap 并提供一个好的错误信息可以表明你的意图并更易于追踪 panic 的根源。expect 的语法看起来像这样: 文件名:src/main.rs use std::fs::File; fn main() { let greeting_file = File::open(\"hello.txt\") .expect(\"hello.txt should be included in this project\");\n} expect 与 unwrap 的使用方式一样:返回文件句柄或调用 panic! 宏。expect 在调用 panic! 时使用的错误信息将是我们传递给 expect 的参数,而不像 unwrap 那样使用默认的 panic! 信息。它看起来像这样: thread 'main' panicked at 'hello.txt should be included in this project: Error\n{ repr: Os { code: 2, message: \"No such file or directory\" } }',\nsrc/libcore/result.rs:906:4 在生产级别的代码中,大部分 Rustaceans 选择 expect 而不是 unwrap 并提供更多关于为何操作期望是一直成功的上下文。如此如果该假设真的被证明是错的,你也有更多的信息来用于调试。","breadcrumbs":"错误处理 » 用 Result 处理可恢复的错误 » 失败时 panic 的简写:unwrap 和 expect","id":"159","title":"失败时 panic 的简写:unwrap 和 expect"},"16":{"body":"在 Windows 上,前往 https://www.rust-lang.org/install.html 并按照说明安装 Rust。在安装过程的某个步骤,你会被提示要安装 Visual Studio。它提供了一个链接器和编译程序所需的原生库。如果你在此步骤需要更多帮助,请访问 https://rust-lang.github.io/rustup/installation/windows-msvc.html 。 本书的余下部分会使用能同时运行于 cmd.exe 和 PowerShell 的命令。如果存在特定差异,我们会解释使用哪一个。","breadcrumbs":"入门指南 » 安装 » 在 Windows 上安装 rustup","id":"16","title":"在 Windows 上安装 rustup"},"160":{"body":"当编写一个其实先会调用一些可能会失败的操作的函数时,除了在这个函数中处理错误外,还可以选择让调用者知道这个错误并决定该如何处理。这被称为 传播 ( propagating )错误,这样能更好的控制代码调用,因为比起你代码所拥有的上下文,调用者可能拥有更多信息或逻辑来决定应该如何处理错误。 例如,示例 9-6 展示了一个从文件中读取用户名的函数。如果文件不存在或不能读取,这个函数会将这些错误返回给调用它的代码: 文件名:src/main.rs use std::fs::File;\nuse std::io::{self, Read}; fn read_username_from_file() -> Result { let username_file_result = File::open(\"hello.txt\"); let mut username_file = match username_file_result { Ok(file) => file, Err(e) => return Err(e), }; let mut username = String::new(); match username_file.read_to_string(&mut username) { Ok(_) => Ok(username), Err(e) => Err(e), }\n} 示例 9-6:一个函数使用 match 将错误返回给代码调用者 这个函数可以编写成更加简短的形式,不过我们以大量手动处理开始以便探索错误处理;在最后我们会展示更短的形式。让我们看看函数的返回值:Result。这意味着函数返回一个 Result 类型的值,其中泛型参数 T 的具体类型是 String,而 E 的具体类型是 io::Error。 如果这个函数没有出任何错误成功返回,函数的调用者会收到一个包含 String 的 Ok 值 —— 函数从文件中读取到的用户名。如果函数遇到任何错误,函数的调用者会收到一个 Err 值,它储存了一个包含更多这个问题相关信息的 io::Error 实例。这里选择 io::Error 作为函数的返回值是因为它正好是函数体中那两个可能会失败的操作的错误返回值:File::open 函数和 read_to_string 方法。 函数体以调用 File::open 函数开始。接着使用 match 处理返回值 Result,类似示例 9-4,如果 File::open 成功了,模式变量 file 中的文件句柄就变成了可变变量 username_file 中的值,接着函数继续执行。在 Err 的情况下,我们没有调用 panic!,而是使用 return 关键字提前结束整个函数,并将来自 File::open 的错误值(现在在模式变量 e 中)作为函数的错误值传回给调用者。 所以,如果在 username_file 中有一个文件句柄,该函数随后会在变量 username 中创建一个新的 String 并调用文件句柄 username_file 上的 read_to_string 方法,以将文件的内容读入 username。read_to_string 方法也返回一个 Result,因为它可能会失败,哪怕是 File::open 已经成功了。因此,我们需要另一个 match 来处理这个 Result:如果 read_to_string 执行成功,那么这个函数也就成功了,我们将从文件中读取的用户名返回,此时用户名位于被封装进 Ok 的 username 中。如果 read_to_string 执行失败,则像之前处理 File::open 的返回值的 match 那样返回错误值。然而,我们无需显式调用 return 语句,因为这是函数的最后一个表达式。 调用这个函数的代码最终会得到一个包含用户名的 Ok 值,或者一个包含 io::Error 的 Err 值。我们无从得知调用者会如何处理这些值。例如,如果他们得到了一个 Err 值,他们可能会选择 panic! 并使程序崩溃、使用一个默认的用户名或者从文件之外的地方寻找用户名。我们没有足够的信息知晓调用者具体会如何尝试,所以将所有的成功或失败信息向上传播,让他们选择合适的处理方法。 这种传播错误的模式在 Rust 是如此的常见,以至于 Rust 提供了 ? 问号运算符来使其更易于处理。","breadcrumbs":"错误处理 » 用 Result 处理可恢复的错误 » 传播错误","id":"160","title":"传播错误"},"161":{"body":"示例 9-7 展示了一个 read_username_from_file 的实现,它实现了与示例 9-6 中的代码相同的功能,不过这个实现使用了 ? 运算符: 文件名:src/main.rs use std::fs::File;\nuse std::io::{self, Read}; fn read_username_from_file() -> Result { let mut username_file = File::open(\"hello.txt\")?; let mut username = String::new(); username_file.read_to_string(&mut username)?; Ok(username)\n} 示例 9-7:一个使用 ? 运算符向调用者返回错误的函数 Result 值之后的 ? 被定义为与示例 9-6 中定义的处理 Result 值的 match 表达式有着完全相同的工作方式。如果 Result 的值是 Ok,这个表达式将会返回 Ok 中的值而程序将继续执行。如果值是 Err,Err 将作为整个函数的返回值,就好像使用了 return 关键字一样,这样错误值就被传播给了调用者。 示例 9-6 中的 match 表达式与 ? 运算符所做的有一点不同:? 运算符所使用的错误值被传递给了 from 函数,它定义于标准库的 From trait 中,其用来将错误从一种类型转换为另一种类型。当 ? 运算符调用 from 函数时,收到的错误类型被转换为由当前函数返回类型所指定的错误类型。这在当函数返回单个错误类型来代表所有可能失败的方式时很有用,即使其可能会因很多种原因失败。 例如,我们可以将示例 9-7 中的 read_username_from_file 函数修改为返回一个自定义的 OurError 错误类型。如果我们也定义了 impl From for OurError 来从 io::Error 构造一个 OurError 实例,那么 read_username_from_file 函数体中的 ? 运算符调用会调用 from 并转换错误而无需在函数中增加任何额外的代码。 在示例 9-7 的上下文中,File::open 调用结尾的 ? 会将 Ok 中的值返回给变量 username_file。如果发生了错误,? 运算符会使整个函数提前返回并将任何 Err 值返回给调用代码。同理也适用于 read_to_string 调用结尾的 ?。 ? 运算符消除了大量样板代码并使得函数的实现更简单。我们甚至可以在 ? 之后直接使用链式方法调用来进一步缩短代码,如示例 9-8 所示: 文件名:src/main.rs use std::fs::File;\nuse std::io::{self, Read}; fn read_username_from_file() -> Result { let mut username = String::new(); File::open(\"hello.txt\")?.read_to_string(&mut username)?; Ok(username)\n} 示例 9-8:问号运算符之后的链式方法调用 在 username 中创建新的 String 被放到了函数开头;这一部分没有变化。我们对 File::open(\"hello.txt\")? 的结果直接链式调用了 read_to_string,而不再创建变量 username_file。仍然需要 read_to_string 调用结尾的 ?,而且当 File::open 和 read_to_string 都成功没有失败时返回包含用户名 username 的 Ok 值。其功能再一次与示例 9-6 和示例 9-7 保持一致,不过这是一个与众不同且更符合工程学(ergonomic)的写法。 示例 9-9 展示了一个使用 fs::read_to_string 的更为简短的写法: 文件名:src/main.rs use std::fs;\nuse std::io; fn read_username_from_file() -> Result { fs::read_to_string(\"hello.txt\")\n} 示例 9-9: 使用 fs::read_to_string 而不是打开后读取文件 将文件读取到一个字符串是相当常见的操作,所以 Rust 提供了名为 fs::read_to_string 的函数,它会打开文件、新建一个 String、读取文件的内容,并将内容放入 String,接着返回它。当然,这样做就没有展示所有这些错误处理的机会了,所以我们最初就选择了艰苦的道路。","breadcrumbs":"错误处理 » 用 Result 处理可恢复的错误 » 传播错误的简写:? 运算符","id":"161","title":"传播错误的简写:? 运算符"},"162":{"body":"? 运算符只能被用于返回值与 ? 作用的值相兼容的函数。因为 ? 运算符被定义为从函数中提早返回一个值,这与示例 9-6 中的 match 表达式有着完全相同的工作方式。示例 9-6 中 match 作用于一个 Result 值,提早返回的分支返回了一个 Err(e) 值。函数的返回值必须是 Result 才能与这个 return 相兼容。 在示例 9-10 中,让我们看看在返回值不兼容的 main 函数中使用 ? 运算符会得到什么错误: 文件名:src/main.rs use std::fs::File; fn main() { let greeting_file = File::open(\"hello.txt\")?;\n} 示例 9-10: 尝试在返回 () 的 main 函数中使用 ? 的代码不能编译 这段代码打开一个文件,这可能会失败。? 运算符作用于 File::open 返回的 Result 值,不过 main 函数的返回类型是 () 而不是 Result。当编译这些代码,会得到如下错误信息: $ cargo run Compiling error-handling v0.1.0 (file:///projects/error-handling)\nerror[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`) --> src/main.rs:4:48 |\n3 | fn main() { | --------- this function should return `Result` or `Option` to accept `?`\n4 | let greeting_file = File::open(\"hello.txt\")?; | ^ cannot use the `?` operator in a function that returns `()` | = help: the trait `FromResidual>` is not implemented for `()`\nhelp: consider adding return type |\n3 ~ fn main() -> Result<(), Box> {\n4 | let greeting_file = File::open(\"hello.txt\")?;\n5 + 6 + Ok(())\n7 + } | For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `error-handling` (bin \"error-handling\") due to 1 previous error 这个错误指出只能在返回 Result 或者其它实现了 FromResidual 的类型的函数中使用 ? 运算符。 为了修复这个错误,有两个选择。一个是,如果没有限制的话将函数的返回值改为 Result。另一个是使用 match 或 Result 的方法中合适的一个来处理 Result。 错误信息也提到 ? 也可用于 Option 值。如同对 Result 使用 ? 一样,只能在返回 Option 的函数中对 Option 使用 ?。在 Option 上调用 ? 运算符的行为与 Result 类似:如果值是 None,此时 None 会从函数中提前返回。如果值是 Some,Some 中的值作为表达式的返回值同时函数继续。示例 9-11 中有一个从给定文本中返回第一行最后一个字符的函数的例子: fn last_char_of_first_line(text: &str) -> Option { text.lines().next()?.chars().last()\n}\n# # fn main() {\n# assert_eq!(\n# last_char_of_first_line(\"Hello, world\\nHow are you today?\"),\n# Some('d')\n# );\n# # assert_eq!(last_char_of_first_line(\"\"), None);\n# assert_eq!(last_char_of_first_line(\"\\nhi\"), None);\n# } 示例 9-11: 在 Option 值上使用 ? 运算符 这个函数返回 Option 因为它可能会在这个位置找到一个字符,也可能没有字符。这段代码获取 text 字符串 slice 作为参数并调用其 lines 方法,这会返回一个字符串中每一行的迭代器。因为函数希望检查第一行,所以调用了迭代器 next 来获取迭代器中第一个值。如果 text 是空字符串,next 调用会返回 None,此时我们可以使用 ? 来停止并从 last_char_of_first_line 返回 None。如果 text 不是空字符串,next 会返回一个包含 text 中第一行的字符串 slice 的 Some 值。 ? 会提取这个字符串 slice,然后可以在字符串 slice 上调用 chars 来获取字符的迭代器。我们感兴趣的是第一行的最后一个字符,所以可以调用 last 来返回迭代器的最后一项。这是一个 Option,因为有可能第一行是一个空字符串,例如 text 以一个空行开头而后面的行有文本,像是 \"\\nhi\"。不过,如果第一行有最后一个字符,它会返回在一个 Some 成员中。? 运算符作用于其中给了我们一个简洁的表达这种逻辑的方式。如果我们不能在 Option 上使用 ? 运算符,则不得不使用更多的方法调用或者 match 表达式来实现这些逻辑。 注意你可以在返回 Result 的函数中对 Result 使用 ? 运算符,可以在返回 Option 的函数中对 Option 使用 ? 运算符,但是不可以混合搭配。? 运算符不会自动将 Result 转化为 Option,反之亦然;在这些情况下,可以使用类似 Result 的 ok 方法或者 Option 的 ok_or 方法来显式转换。 目前为止,我们所使用的所有 main 函数都返回 ()。main 函数是特殊的因为它是可执行程序的入口点和退出点,为了使程序能正常工作,其可以返回的类型是有限制的。 幸运的是 main 函数也可以返回 Result<(), E>,示例 9-12 中的代码来自示例 9-10 不过修改了 main 的返回值为 Result<(), Box> 并在结尾增加了一个 Ok(()) 作为返回值。这段代码可以编译: use std::error::Error;\nuse std::fs::File; fn main() -> Result<(), Box> { let greeting_file = File::open(\"hello.txt\")?; Ok(())\n} 示例 9-12: 修改 main 返回 Result<(), E> 允许对 Result 值使用 ? 运算符 Box 类型是一个 trait 对象 ( trait object )第十八章 顾及不同类型值的 trait 对象” 部分会做介绍。目前可以将 Box 理解为 “任何类型的错误”。在返回 Box 错误类型 main 函数中对 Result 使用 ? 是允许的,因为它允许任何 Err 值提前返回。即便 main 函数体从来只会返回 std::io::Error 错误类型,通过指定 Box,这个签名也仍是正确的,甚至当 main 函数体中增加更多返回其他错误类型的代码时也是如此。 当 main 函数返回 Result<(), E>,如果 main 返回 Ok(()) 可执行程序会以 0 值退出,而如果 main 返回 Err 值则会以非零值退出;成功退出的程序会返回整数 0,运行错误的程序会返回非 0 的整数。Rust 也会从二进制程序中返回与这个惯例相兼容的整数。 main 函数也可以返回任何实现了 std::process::Termination trait 的类型,它包含了一个返回 ExitCode 的 report 函数。请查阅标准库文档了解更多为自定义类型实现 Termination trait 的细节。 现在我们讨论过了调用 panic! 或返回 Result 的细节,是时候回到它们各自适合哪些场景的话题了。","breadcrumbs":"错误处理 » 用 Result 处理可恢复的错误 » 哪里可以使用 ? 运算符","id":"162","title":"哪里可以使用 ? 运算符"},"163":{"body":"ch09-03-to-panic-or-not-to-panic.md commit dd8f47a74b67178cea8c832e3b4eaf3bb515bd72 那么,该如何决定何时应该 panic! 以及何时应该返回 Result 呢?如果代码 panic,就没有恢复的可能。你可以选择对任何错误场景都调用 panic!,不管是否有可能恢复,不过这样就是你代替调用者决定了这是不可恢复的。选择返回 Result 值的话,就将选择权交给了调用者,而不是代替他们做出决定。调用者可能会选择以符合他们场景的方式尝试恢复,或者也可能干脆就认为 Err 是不可恢复的,所以他们也可能会调用 panic! 并将可恢复的错误变成了不可恢复的错误。因此返回 Result 是定义可能会失败的函数的一个好的默认选择。 在一些类似示例、原型代码(prototype code)和测试中,panic 比返回 Result 更为合适,下文中会讨论合适的原因,紧接着讨论另外一种特殊情况,即有些场景编译器无法认识这个分支代码是不可能走到的,但是程序员可以判断出来的,这种场景也可以用 panic!。另外章节最后会总结一些在库代码中如何决定是否要 panic 的通用指导原则。","breadcrumbs":"错误处理 » 要不要 panic! » 要不要 panic!","id":"163","title":"要不要 panic!"},"164":{"body":"当你编写一个示例来展示一些概念时,在拥有健壮的错误处理代码的同时也会使得例子不那么明确。例如,调用一个类似 unwrap 这样可能 panic! 的方法可以被理解为一个你实际希望程序处理错误方式的占位符,它根据其余代码运行方式可能会各不相同。 类似地,在我们准备好决定如何处理错误之前,unwrap和expect方法在原型设计时非常方便。当我们准备好让程序更加健壮时,它们会在代码中留下清晰的标记。 如果方法调用在测试中失败了,我们希望这个测试都失败,即便这个方法并不是需要测试的功能。因为 panic! 会将测试标记为失败,此时调用 unwrap 或 expect 是恰当的。","breadcrumbs":"错误处理 » 要不要 panic! » 示例、代码原型和测试都非常适合 panic","id":"164","title":"示例、代码原型和测试都非常适合 panic"},"165":{"body":"当你有一些其他的逻辑来确保 Result 会是 Ok 值时,调用 unwrap 或者 expect 也是合适的,虽然编译器无法理解这种逻辑。你仍然需要处理一个 Result 值:即使在你的特定情况下逻辑上是不可能的,你所调用的任何操作仍然有可能失败。如果通过人工检查代码来确保永远也不会出现 Err 值,那么调用 unwrap 也是完全可以接受的,这里是一个例子: # fn main() { use std::net::IpAddr; let home: IpAddr = \"127.0.0.1\" .parse() .expect(\"Hardcoded IP address should be valid\");\n# } 我们通过解析一个硬编码的字符来创建一个 IpAddr 实例。可以看出 127.0.0.1 是一个有效的 IP 地址,所以这里使用 expect 是可以接受的。然而,拥有一个硬编码的有效的字符串也不能改变 parse 方法的返回值类型:它仍然是一个 Result 值,而编译器仍然会要求我们处理这个 Result,好像还是有可能出现 Err 成员那样。这是因为编译器还没有智能到可以识别出这个字符串总是一个有效的 IP 地址。如果 IP 地址字符串来源于用户而不是硬编码进程序中的话,那么就 确实 有失败的可能性,这时就绝对需要我们以一种更健壮的方式处理 Result 了。提及这个 IP 地址是硬编码的假设会促使我们将来把 expect 替换为更好的错误处理,我们应该从其它代码获取 IP 地址。","breadcrumbs":"错误处理 » 要不要 panic! » 当我们比编译器知道更多的情况","id":"165","title":"当我们比编译器知道更多的情况"},"166":{"body":"在当有可能会导致有害状态的情况下建议使用 panic! —— 在这里,有害状态是指当一些假设、保证、协议或不可变性被打破的状态,例如无效的值、自相矛盾的值或者被传递了不存在的值 —— 外加如下几种情况: 有害状态是非预期的行为,与偶尔会发生的行为相对,比如用户输入了错误格式的数据。 在此之后代码的运行依赖于不处于这种有害状态,而不是在每一步都检查是否有问题。 没有可行的手段来将有害状态信息编码进所使用的类型中的情况。我们会在第十八章 “将状态和行为编码为类型” 部分通过一个例子来说明我们的意思。 如果别人调用你的代码并传递了一个没有意义的值,尽最大可能返回一个错误,如此库的用户就可以决定在这种情况下该如何处理。然而在继续执行代码是不安全或有害的情况下,最好的选择可能是调用 panic! 并警告库的用户他们的代码中有 bug,这样他们就会在开发时进行修复。类似的,如果你正在调用不受你控制的外部代码,并且它返回了一个你无法修复的无效状态,那么 panic! 往往是合适的。 然而当错误预期会出现时,返回 Result 仍要比调用 panic! 更为合适。这样的例子包括解析器接收到格式错误的数据,或者 HTTP 请求返回了一个表明触发了限流的状态。在这些例子中,应该通过返回 Result 来表明失败预期是可能的,这样将有害状态向上传播,调用者就可以决定该如何处理这个问题。使用 panic! 来处理这些情况就不是最好的选择。 当你的代码在进行一个使用无效值进行调用时可能将用户置于风险中的操作时,代码应该首先验证值是有效的,并在其无效时 panic!。这主要是出于安全的原因:尝试操作无效数据会暴露代码漏洞,这就是标准库在尝试越界访问数组时会 panic! 的主要原因:尝试访问不属于当前数据结构的内存是一个常见的安全隐患。函数通常都遵循 契约 ( contracts ):它们的行为只有在输入满足特定条件时才能得到保证。当违反契约时 panic 是有道理的,因为这通常代表调用方的 bug,而且这也不是那种你希望所调用的代码必须处理的错误。事实上所调用的代码也没有合理的方式来恢复,而是需要调用方的 程序员 修复其代码。函数的契约,尤其是当违反它会造成 panic 的契约,应该在函数的 API 文档中得到解释。 虽然在所有函数中都拥有许多错误检查是冗长而烦人的。幸运的是,可以利用 Rust 的类型系统(以及编译器的类型检查)为你进行很多检查。如果函数有一个特定类型的参数,可以在知晓编译器已经确保其拥有一个有效值的前提下进行你的代码逻辑。例如,如果你使用了一个并不是 Option 的类型,则程序期望它是 有值 的并且不是 空值 。你的代码无需处理 Some 和 None 这两种情况,它只会有一种情况就是绝对会有一个值。尝试向函数传递空值的代码甚至根本不能编译,所以你的函数在运行时没有必要判空。另外一个例子是使用像 u32 这样的无符号整型,也会确保它永远不为负。","breadcrumbs":"错误处理 » 要不要 panic! » 错误处理指导原则","id":"166","title":"错误处理指导原则"},"167":{"body":"让我们使用 Rust 类型系统的思想来进一步确保值的有效性,并尝试创建一个自定义类型以进行验证。回忆一下第二章的猜猜看游戏,我们的代码要求用户猜测一个 1 到 100 之间的数字,在将其与秘密数字做比较之前我们从未验证用户的猜测是位于这两个数字之间的,我们只验证它是否为正。在这种情况下,其影响并不是很严重:“Too high” 或 “Too low” 的输出仍然是正确的。但是这是一个很好的引导用户得出有效猜测的辅助,例如当用户猜测一个超出范围的数字或者输入字母时采取不同的行为。 一种实现方式是将猜测解析成 i32 而不仅仅是 u32,来默许输入负数,接着检查数字是否在范围内: 文件名:src/main.rs # use rand::Rng;\n# use std::cmp::Ordering;\n# use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# loop { // --snip-- # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# let guess: i32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; if guess < 1 || guess > 100 { println!(\"The secret number will be between 1 and 100.\"); continue; } match guess.cmp(&secret_number) { // --snip--\n# Ordering::Less => println!(\"Too small!\"),\n# Ordering::Greater => println!(\"Too big!\"),\n# Ordering::Equal => {\n# println!(\"You win!\");\n# break;\n# }\n# } }\n# } if 表达式检查了值是否超出范围,告诉用户出了什么问题,并调用 continue 开始下一次循环,请求另一个猜测。if 表达式之后,就可以在知道 guess 在 1 到 100 之间的情况下与秘密数字作比较了。 然而,这并不是一个理想的解决方案:如果让程序仅仅处理 1 到 100 之间的值是一个绝对需要满足的要求,而且程序中的很多函数都有这样的要求,在每个函数中都有这样的检查将是非常冗余的(并可能潜在的影响性能)。 相反我们可以创建一个新类型来将验证放入创建其实例的函数中,而不是到处重复这些检查。这样就可以安全地在函数签名中使用新类型并相信它们接收到的值。示例 9-13 中展示了一个定义 Guess 类型的方法,只有在 new 函数接收到 1 到 100 之间的值时才会创建 Guess 的实例: 文件名:src/lib.rs pub struct Guess { value: i32,\n} impl Guess { pub fn new(value: i32) -> Guess { if value < 1 || value > 100 { panic!(\"Guess value must be between 1 and 100, got {value}.\"); } Guess { value } } pub fn value(&self) -> i32 { self.value }\n} 示例 9-13:一个 Guess 类型,它只在值位于 1 和 100 之间时才继续 首先,我们定义了一个包含 i32 类型字段 value 的结构体 Guess。这里是储存猜测值的地方。 接着在 Guess 上实现了一个叫做 new 的关联函数来创建 Guess 的实例。new 定义为接收一个 i32 类型的参数 value 并返回一个 Guess。new 函数中代码的测试确保了其值是在 1 到 100 之间的。如果 value 没有通过测试则调用 panic!,这会警告调用这个函数的程序员有一个需要修改的 bug,因为创建一个 value 超出范围的 Guess 将会违反 Guess::new 所遵循的契约。Guess::new 会出现 panic 的条件应该在其公有 API 文档中被提及;第十四章会涉及到在 API 文档中表明 panic! 可能性的相关规则。如果 value 通过了测试,我们新建一个 Guess,其字段 value 将被设置为参数 value 的值,接着返回这个 Guess。 接着,我们实现了一个借用了 self 的方法 value,它没有任何其他参数并返回一个 i32。这类方法有时被称为 getter ,因为它的目的就是返回对应字段的数据。这样的公有方法是必要的,因为 Guess 结构体的 value 字段是私有的。私有的字段 value 是很重要的,这样使用 Guess 结构体的代码将不允许直接设置 value 的值:调用者 必须 使用 Guess::new 方法来创建一个 Guess 的实例,这就确保了不会存在一个 value 没有通过 Guess::new 函数的条件检查的 Guess。 于是,一个接收(或返回)1 到 100 之间数字的函数就可以声明为接收(或返回) Guess的实例,而不是 i32,同时其函数体中也无需进行任何额外的检查。","breadcrumbs":"错误处理 » 要不要 panic! » 创建自定义类型进行有效性验证","id":"167","title":"创建自定义类型进行有效性验证"},"168":{"body":"Rust 的错误处理功能被设计为帮助你编写更加健壮的代码。panic! 宏代表一个程序无法处理的状态,并停止执行而不是使用无效或不正确的值继续处理。Rust 类型系统的 Result 枚举代表操作可能会在一种可以恢复的情况下失败。可以使用 Result 来告诉代码调用者他需要处理潜在的成功或失败。在适当的场景使用 panic! 和 Result 将会使你的代码在面对不可避免的错误时显得更加可靠。 现在我们已经见识过了标准库中 Option 和 Result 泛型枚举的能力了,在下一章让我们聊聊泛型是如何工作的,以及如何在你的代码中使用它们。","breadcrumbs":"错误处理 » 要不要 panic! » 总结","id":"168","title":"总结"},"169":{"body":"ch10-00-generics.md commit 4aa96a3d20570f868bd20e8e3e865b047284be30 每一个编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是 泛型 ( generics )。泛型是具体类型或其他属性的抽象替代。我们可以表达泛型的属性,比如它们的行为或如何与其他泛型相关联,而不需要在编写和编译代码时知道它们在这里实际上代表什么。 函数可以获取一些不同于 i32 或 String 这样具体类型的泛型参数,就像一个获取未知类型值的函数可以对多种具体类型的值运行同一段代码一样。事实上我们已经使用过第六章的 Option,第八章的 Vec 和 HashMap,以及第九章的 Result 这些泛型了。本章会探索如何使用泛型定义我们自己的类型、函数和方法! 首先,我们将回顾一下提取函数以减少代码重复的机制。接下来,我们将使用相同的技术,从两个仅参数类型不同的函数中创建一个泛型函数。我们也会讲到结构体和枚举定义中的泛型。 之后,我们讨论 trait ,这是一个定义泛型行为的方法。trait 可以与泛型结合来将泛型限制为只接受拥有特定行为的类型,而不是任意类型。 最后介绍 生命周期 ( lifetimes ),它是一类允许我们向编译器提供引用如何相互关联的泛型。Rust 的生命周期功能允许在很多场景下借用值的同时仍然使编译器能够检查这些引用的有效性。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型、Trait 和生命周期","id":"169","title":"泛型、Trait 和生命周期"},"17":{"body":"要检查是否正确安装了 Rust,打开命令行并输入: $ rustc --version 你应该可以看到按照以下格式显示的最新稳定版本的版本号、对应的 Commit Hash 和 Commit 日期: rustc x.y.z (abcabcabc yyyy-mm-dd) 如果看到了这样的信息,就说明 Rust 已经安装成功了! 译者:恭喜入坑!(此处应该有掌声!) 如果没看到,请按照下面说明的方法检查 Rust 是否在您的 %PATH% 系统变量中。 在 Windows CMD 中,请使用命令: > echo %PATH% 在 PowerShell 中,请使用命令: > echo $env:Path 在 Linux 和 macOS 中,请使用命令: $ echo $PATH 如果一切正确但 Rust 仍不能使用,有许多地方可以求助。您可以在 社区页面 查看如何与其他 Rustaceans(Rust 用户的称号,有自嘲意味)联系。","breadcrumbs":"入门指南 » 安装 » 故障排除(Troubleshooting)","id":"17","title":"故障排除(Troubleshooting)"},"170":{"body":"泛型允许我们使用一个可以代表多种类型的占位符来替换特定类型,以此来减少代码冗余。在深入了解泛型的语法之前,我们首先来看一种没有使用泛型的减少冗余的方法,即提取一个函数。在这个函数中,我们用一个可以代表多种值的占位符来替换具体的值。接着我们使用相同的技术来提取一个泛型函数!!通过学习如何识别并提取可以整合进一个函数的重复代码,你也会开始识别出可以使用泛型的重复代码。 让我们从下面这个寻找列表中最大值的小程序开始,如示例 10-1 所示: 文件名:src/main.rs fn main() { let number_list = vec![34, 50, 25, 100, 65]; let mut largest = &number_list[0]; for number in &number_list { if number > largest { largest = number; } } println!(\"The largest number is {largest}\");\n# assert_eq!(*largest, 100);\n} 示例 10-1:在一个数字列表中寻找最大值的函数 这段代码获取一个整型列表,存放在变量 number_list 中。它将列表的第一个数字的引用放入了变量 largest 中。接着遍历了列表中的所有数字,如果当前值大于 largest 中储存的值,将 largest 替换为这个值。如果当前值小于或者等于目前为止的最大值,largest 保持不变。当列表中所有值都被考虑到之后,largest 将会指向最大值,在这里也就是 100。 我们的任务是在两个不同的数字列表中寻找最大值。为此我们可以选择重复示例 10-1 中的代码在程序的两个不同位置使用相同的逻辑,如示例 10-2 所示: 文件名:src/main.rs fn main() { let number_list = vec![34, 50, 25, 100, 65]; let mut largest = &number_list[0]; for number in &number_list { if number > largest { largest = number; } } println!(\"The largest number is {largest}\"); let number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8]; let mut largest = &number_list[0]; for number in &number_list { if number > largest { largest = number; } } println!(\"The largest number is {largest}\");\n} 示例 10-2:寻找 两个 数字列表最大值的代码 虽然代码能够执行,但是重复的代码是冗余且容易出错的,更新逻辑时我们不得不记住需要修改多处地方的代码。 为了消除重复,我们要创建一层抽象,定义一个处理任意整型列表作为参数的函数。这个方案使得代码更简洁,并且表现了寻找任意列表中最大值这一概念。 在示例 10-3 的程序中将寻找最大值的代码提取到了一个叫做 largest 的函数中。接着我们调用该函数来寻找示例 10-2 中两个列表中的最大值。之后也可以将该函数用于任何可能的 i32 值的列表。 文件名:src/main.rs fn largest(list: &[i32]) -> &i32 { let mut largest = &list[0]; for item in list { if item > largest { largest = item; } } largest\n} fn main() { let number_list = vec![34, 50, 25, 100, 65]; let result = largest(&number_list); println!(\"The largest number is {result}\");\n# assert_eq!(*result, 100); let number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8]; let result = largest(&number_list); println!(\"The largest number is {result}\");\n# assert_eq!(*result, 6000);\n} 示例 10-3:抽象后的寻找两个数字列表最大值的代码 largest 函数有一个参数 list,它代表会传递给函数的任何具体的 i32值的 slice。函数定义中的 list 代表任何 &[i32]。当调用 largest 函数时,其代码实际上运行于我们传递的特定值上。 总的来说,从示例 10-2 到示例 10-3 中涉及的机制经历了如下几步: 找出重复代码。 将重复代码提取到了一个函数中,并在函数签名中指定了代码中的输入和返回值。 将重复代码的两个实例,改为调用函数。 接下来我们会使用相同的步骤通过泛型来减少重复。与函数体可以处理任意的 list 而不是具体的值一样,泛型也允许代码处理任意类型。 如果我们有两个函数,一个寻找一个 i32 值的 slice 中的最大项而另一个寻找 char 值的 slice 中的最大项该怎么办?该如何消除重复呢?让我们拭目以待!","breadcrumbs":"泛型、Trait 和生命周期 » 提取函数来减少重复","id":"170","title":"提取函数来减少重复"},"171":{"body":"ch10-01-syntax.md commit f2a78f64b668f63f581203c6bac509903f7c00ee 我们可以使用泛型为像函数签名或结构体这样的项创建定义,这样它们就可以用于多种不同的具体数据类型。让我们看看如何使用泛型定义函数、结构体、枚举和方法,然后我们将讨论泛型如何影响代码性能。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型数据类型 » 泛型数据类型","id":"171","title":"泛型数据类型"},"172":{"body":"当使用泛型定义函数时,本来在函数签名中指定参数和返回值的类型的地方,会改用泛型来表示。采用这种技术,使得代码适应性更强,从而为函数的调用者提供更多的功能,同时也避免了代码的重复。 回到 largest 函数,示例 10-4 中展示了两个函数,它们的功能都是寻找 slice 中最大值。接着我们使用泛型将其合并为一个函数。 文件名:src/main.rs fn largest_i32(list: &[i32]) -> &i32 { let mut largest = &list[0]; for item in list { if item > largest { largest = item; } } largest\n} fn largest_char(list: &[char]) -> &char { let mut largest = &list[0]; for item in list { if item > largest { largest = item; } } largest\n} fn main() { let number_list = vec![34, 50, 25, 100, 65]; let result = largest_i32(&number_list); println!(\"The largest number is {result}\");\n# assert_eq!(*result, 100); let char_list = vec!['y', 'm', 'a', 'q']; let result = largest_char(&char_list); println!(\"The largest char is {result}\");\n# assert_eq!(*result, 'y');\n} 示例 10-4:两个函数,不同点只是名称和签名类型 largest_i32 函数是从示例 10-3 中摘出来的,它用来寻找 slice 中最大的 i32。largest_char 函数寻找 slice 中最大的 char。因为两者函数体的代码是一样的,我们可以定义一个函数,再引进泛型参数来消除这种重复。 为了参数化这个新函数中的这些类型,我们需要为类型参数命名,道理和给函数的形参起名一样。任何标识符都可以作为类型参数的名字。这里选用 T,因为传统上来说,Rust 的类型参数名字都比较短,通常仅为一个字母,同时,Rust 类型名的命名规范是首字母大写驼峰式命名法(UpperCamelCase)。T 作为 “type” 的缩写是大部分 Rust 程序员的首选。 如果要在函数体中使用参数,就必须在函数签名中声明它的名字,好让编译器知道这个名字指代的是什么。同理,当在函数签名中使用一个类型参数时,必须在使用它之前就声明它。为了定义泛型版本的 largest 函数,类型参数声明位于函数名称与参数列表中间的尖括号 <> 中,像这样: fn largest(list: &[T]) -> &T { 可以这样理解这个定义:函数 largest 有泛型类型 T。它有个参数 list,其类型是元素为 T 的 slice。largest 函数会返回一个与 T 相同类型的引用。 示例 10-5 中的 largest 函数在它的签名中使用了泛型,统一了两个实现。该示例也展示了如何调用 largest 函数,把 i32 值的 slice 或 char 值的 slice 传给它。请注意这些代码还不能编译,不过稍后在本章会解决这个问题。 文件名:src/main.rs fn largest(list: &[T]) -> &T { let mut largest = &list[0]; for item in list { if item > largest { largest = item; } } largest\n} fn main() { let number_list = vec![34, 50, 25, 100, 65]; let result = largest(&number_list); println!(\"The largest number is {result}\"); let char_list = vec!['y', 'm', 'a', 'q']; let result = largest(&char_list); println!(\"The largest char is {result}\");\n} 示例 10-5:一个使用泛型参数的 largest 函数定义,尚不能编译 如果现在就编译这个代码,会出现如下错误: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10)\nerror[E0369]: binary operation `>` cannot be applied to type `&T` --> src/main.rs:5:17 |\n5 | if item > largest { | ---- ^ ------- &T | | | &T |\nhelp: consider restricting type parameter `T` |\n1 | fn largest(list: &[T]) -> &T { | ++++++++++++++++++++++ For more information about this error, try `rustc --explain E0369`.\nerror: could not compile `chapter10` (bin \"chapter10\") due to 1 previous error 帮助说明中提到了 std::cmp::PartialOrd,这是一个 trait 。下一部分会讲到 trait。不过简单来说,这个错误表明 largest 的函数体不能适用于 T 的所有可能的类型。因为在函数体需要比较 T 类型的值,不过它只能用于我们知道如何排序的类型。为了开启比较功能,标准库中定义的 std::cmp::PartialOrd trait 可以实现类型的比较功能(查看附录 C 获取该 trait 的更多信息)。依照帮助说明中的建议,我们限制 T 只对实现了 PartialOrd 的类型有效后代码就可以编译了,因为标准库为 i32 和 char 实现了 PartialOrd。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型数据类型 » 在函数定义中使用泛型","id":"172","title":"在函数定义中使用泛型"},"173":{"body":"同样也可以用 <> 语法来定义结构体,它包含一个或多个泛型参数类型字段。示例 10-6 定义了一个可以存放任何类型的 x 和 y 坐标值的结构体 Point: 文件名:src/main.rs struct Point { x: T, y: T,\n} fn main() { let integer = Point { x: 5, y: 10 }; let float = Point { x: 1.0, y: 4.0 };\n} 示例 10-6:Point 结构体存放了两个 T 类型的值 x 和 y 其语法类似于函数定义中使用泛型。首先,必须在结构体名称后面的尖括号中声明泛型参数的名称。接着在结构体定义中可以指定具体数据类型的位置使用泛型类型。 注意 Point 的定义中只使用了一个泛型类型,这个定义表明结构体 Point 对于一些类型 T 是泛型的,而且字段 x 和 y 都是 相同类型的,无论它具体是何类型。如果尝试创建一个有不同类型值的 Point 的实例,像示例 10-7 中的代码就不能编译: 文件名:src/main.rs struct Point { x: T, y: T,\n} fn main() { let wont_work = Point { x: 5, y: 4.0 };\n} 示例 10-7:字段 x 和 y 的类型必须相同,因为它们都有相同的泛型类型 T 在这个例子中,当把整型值 5 赋值给 x 时,就告诉了编译器这个 Point 实例中的泛型 T 全是整型。接着指定 y 为浮点值 4.0,因为它y被定义为与 x 相同类型,所以将会得到一个像这样的类型不匹配错误: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10)\nerror[E0308]: mismatched types --> src/main.rs:7:38 |\n7 | let wont_work = Point { x: 5, y: 4.0 }; | ^^^ expected integer, found floating-point number For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `chapter10` (bin \"chapter10\") due to 1 previous error 如果想要定义一个 x 和 y 可以有不同类型且仍然是泛型的 Point 结构体,我们可以使用多个泛型类型参数。在示例 10-8 中,我们修改 Point 的定义为拥有两个泛型类型 T 和 U。其中字段 x 是 T 类型的,而字段 y 是 U 类型的: 文件名:src/main.rs struct Point { x: T, y: U,\n} fn main() { let both_integer = Point { x: 5, y: 10 }; let both_float = Point { x: 1.0, y: 4.0 }; let integer_and_float = Point { x: 5, y: 4.0 };\n} 示例 10-8:使用两个泛型的 Point,这样 x 和 y 可能是不同类型 现在所有这些 Point 实例都合法了!你可以在定义中使用任意多的泛型类型参数,不过太多的话,代码将难以阅读和理解。当你发现代码中需要很多泛型时,这可能表明你的代码需要重构分解成更小的结构。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型数据类型 » 结构体定义中的泛型","id":"173","title":"结构体定义中的泛型"},"174":{"body":"和结构体类似,枚举也可以在成员中存放泛型数据类型。第六章我们曾用过标准库提供的 Option 枚举,这里再回顾一下: enum Option { Some(T), None,\n} 现在这个定义应该更容易理解了。如你所见 Option 是一个拥有泛型 T 的枚举,它有两个成员:Some,它存放了一个类型 T 的值,和不存在任何值的None。通过 Option 枚举可以表达有一个可能的值的抽象概念,同时因为 Option 是泛型的,无论这个可能的值是什么类型都可以使用这个抽象。 枚举也可以拥有多个泛型类型。第九章使用过的 Result 枚举定义就是一个这样的例子: enum Result { Ok(T), Err(E),\n} Result 枚举有两个泛型类型,T 和 E。Result 有两个成员:Ok,它存放一个类型 T 的值,而 Err 则存放一个类型 E 的值。这个定义使得 Result 枚举能很方便的表达任何可能成功(返回 T 类型的值)也可能失败(返回 E 类型的值)的操作。实际上,这就是我们在示例 9-3 用来打开文件的方式:当成功打开文件的时候,T 对应的是 std::fs::File 类型;而当打开文件出现问题时,E 的值则是 std::io::Error 类型。 当你意识到代码中定义了多个结构体或枚举,它们不一样的地方只是其中的值的类型的时候,不妨通过泛型类型来避免重复。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型数据类型 » 枚举定义中的泛型","id":"174","title":"枚举定义中的泛型"},"175":{"body":"在为结构体和枚举实现方法时(像第五章那样),一样也可以用泛型。示例 10-9 中展示了示例 10-6 中定义的结构体 Point,和在其上实现的名为 x 的方法。 文件名:src/main.rs struct Point { x: T, y: T,\n} impl Point { fn x(&self) -> &T { &self.x }\n} fn main() { let p = Point { x: 5, y: 10 }; println!(\"p.x = {}\", p.x());\n} 示例 10-9:在 Point 结构体上实现方法 x,它返回 T 类型的字段 x 的引用 这里在 Point 上定义了一个叫做 x 的方法来返回字段 x 中数据的引用: 注意必须在 impl 后面声明 T,这样就可以在 Point 上实现的方法中使用 T 了。通过在 impl 之后声明泛型 T,Rust 就知道 Point 的尖括号中的类型是泛型而不是具体类型。我们可以为泛型参数选择一个与结构体定义中声明的泛型参数所不同的名称,不过依照惯例使用了相同的名称。在声明泛型类型参数的 impl 中编写的方法将会定义在该类型的任何实例上,无论最终替换泛型类型参数的是何具体类型。(译者注:以示例 10-9 为例,impl 中声明了泛型类型参数 T,x 是编写在 impl 中的方法,x 方法将会定义在 Point 的任何实例上,无论最终替换泛型类型参数 T 的是何具体类型)。 定义方法时也可以为泛型指定限制(constraint)。例如,可以选择为 Point 实例实现方法,而不是为泛型 Point 实例。示例 10-10 展示了一个没有在 impl 之后(的尖括号)声明泛型的例子,这里使用了一个具体类型,f32: 文件名:src/main.rs # struct Point {\n# x: T,\n# y: T,\n# }\n# # impl Point {\n# fn x(&self) -> &T {\n# &self.x\n# }\n# }\n# impl Point { fn distance_from_origin(&self) -> f32 { (self.x.powi(2) + self.y.powi(2)).sqrt() }\n}\n# # fn main() {\n# let p = Point { x: 5, y: 10 };\n# # println!(\"p.x = {}\", p.x());\n# } 示例 10-10:构建一个只用于拥有泛型参数 T 的结构体的具体类型的 impl 块 这段代码意味着 Point 类型会有一个方法 distance_from_origin,而其他 T 不是 f32 类型的 Point 实例则没有定义此方法。这个方法计算点实例与坐标 (0.0, 0.0) 之间的距离,并使用了只能用于浮点型的数学运算符。 结构体定义中的泛型类型参数并不总是与结构体方法签名中使用的泛型是同一类型。示例 10-11 中为 Point 结构体使用了泛型类型 X1 和 Y1,为 mixup 方法签名使用了 X2 和 Y2 来使得示例更加清楚。这个方法用 self 的 Point 类型的 x 值(类型 X1)和参数的 Point 类型的 y 值(类型 Y2)来创建一个新 Point 类型的实例: 文件名:src/main.rs struct Point { x: X1, y: Y1,\n} impl Point { fn mixup(self, other: Point) -> Point { Point { x: self.x, y: other.y, } }\n} fn main() { let p1 = Point { x: 5, y: 10.4 }; let p2 = Point { x: \"Hello\", y: 'c' }; let p3 = p1.mixup(p2); println!(\"p3.x = {}, p3.y = {}\", p3.x, p3.y);\n} 示例 10-11:方法使用了与结构体定义中不同类型的泛型 在 main 函数中,定义了一个有 i32 类型的 x(其值为 5)和 f64 的 y(其值为 10.4)的 Point。p2 则是一个有着字符串 slice 类型的 x(其值为 \"Hello\")和 char 类型的 y(其值为c)的 Point。在 p1 上以 p2 作为参数调用 mixup 会返回一个 p3,它会有一个 i32 类型的 x,因为 x 来自 p1,并拥有一个 char 类型的 y,因为 y 来自 p2。println! 会打印出 p3.x = 5, p3.y = c。 这个例子的目的是展示一些泛型通过 impl 声明而另一些通过方法定义声明的情况。这里泛型参数 X1 和 Y1 声明于 impl 之后,因为它们与结构体定义相对应。而泛型参数 X2 和 Y2 声明于 fn mixup 之后,因为它们只是相对于方法本身的。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型数据类型 » 方法定义中的泛型","id":"175","title":"方法定义中的泛型"},"176":{"body":"在阅读本部分内容的同时,你可能会好奇使用泛型类型参数是否会有运行时消耗。好消息是泛型并不会使程序比具体类型运行得慢。 Rust 通过在编译时进行泛型代码的 单态化 ( monomorphization )来保证效率。单态化是一个通过填充编译时使用的具体类型,将通用代码转换为特定代码的过程。 在这个过程中,编译器所做的工作正好与示例 10-5 中我们创建泛型函数的步骤相反。编译器寻找所有泛型代码被调用的位置并使用泛型代码针对具体类型生成代码。 让我们看看这如何用于标准库中的 Option 枚举: let integer = Some(5);\nlet float = Some(5.0); 当 Rust 编译这些代码的时候,它会进行单态化。编译器会读取传递给 Option 的值并发现有两种 Option:一个对应 i32 另一个对应 f64。为此,它会将泛型定义 Option 展开为两个针对 i32 和 f64 的定义,接着将泛型定义替换为这两个具体的定义。 编译器生成的单态化版本的代码看起来像这样(编译器会使用不同于如下假想的名字): 文件名:src/main.rs enum Option_i32 { Some(i32), None,\n} enum Option_f64 { Some(f64), None,\n} fn main() { let integer = Option_i32::Some(5); let float = Option_f64::Some(5.0);\n} 泛型 Option 被编译器替换为了具体的定义。因为 Rust 会将每种情况下的泛型代码编译为具体类型,使用泛型没有运行时开销。当代码运行时,它的执行效率就跟好像手写每个具体定义的重复代码一样。这个单态化过程正是 Rust 泛型在运行时极其高效的原因。","breadcrumbs":"泛型、Trait 和生命周期 » 泛型数据类型 » 泛型代码的性能","id":"176","title":"泛型代码的性能"},"177":{"body":"ch10-02-traits.md commit 92bfbfacf88ee9a814cea0a58e9c019c529ef4ae trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 trait 以一种抽象的方式定义共同行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。 注意: trait 类似于其他语言中的常被称为 接口 ( interfaces )的功能,虽然有一些不同。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » Trait:定义共同行为","id":"177","title":"Trait:定义共同行为"},"178":{"body":"一个类型的行为由其可供调用的方法构成。如果可以对不同类型调用相同的方法的话,这些类型就可以共享相同的行为了。trait 定义是一种将方法签名组合起来的方法,目的是定义一个实现某些目的所必需的行为的集合。 例如,这里有多个存放了不同类型和属性文本的结构体:结构体 NewsArticle 用于存放发生于世界各地的新闻故事,而结构体 Tweet 最多只能存放 280 个字符的内容,以及像是否转推或是否是对推友的回复这样的元数据。 我们想要创建一个名为 aggregator 的多媒体聚合库用来显示可能储存在 NewsArticle 或 Tweet 实例中的数据摘要。为了实现功能,每个结构体都要能够获取摘要,这样的话就可以调用实例的 summarize 方法来请求摘要。示例 10-12 中展示了一个表现这个概念的公有 Summary trait 的定义: 文件名:src/lib.rs pub trait Summary { fn summarize(&self) -> String;\n} 示例 10-12:Summary trait 定义,它包含由 summarize 方法提供的行为 这里使用 trait 关键字来声明一个 trait,后面是 trait 的名字,在这个例子中是 Summary。我们也声明 trait 为 pub 以便依赖这个 crate 的 crate 也可以使用这个 trait,正如我们见过的一些示例一样。在大括号中声明描述实现这个 trait 的类型所需要的行为的方法签名,在这个例子中是 fn summarize(&self) -> String。 在方法签名后跟分号,而不是在大括号中提供其实现。接着每一个实现这个 trait 的类型都需要提供其自定义行为的方法体,编译器也会确保任何实现 Summary trait 的类型都拥有与这个签名的定义完全一致的 summarize 方法。 trait 体中可以有多个方法:一行一个方法签名且都以分号结尾。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » 定义 trait","id":"178","title":"定义 trait"},"179":{"body":"现在我们定义了 Summary trait 的签名,接着就可以在多媒体聚合库中实现这个类型了。示例 10-13 中展示了 NewsArticle 结构体上 Summary trait 的一个实现,它使用标题、作者和创建的位置作为 summarize 的返回值。对于 Tweet 结构体,我们选择将 summarize 定义为用户名后跟推文的全部文本作为返回值,并假设推文内容已经被限制为 280 字符以内。 文件名:src/lib.rs # pub trait Summary {\n# fn summarize(&self) -> String;\n# }\n# pub struct NewsArticle { pub headline: String, pub location: String, pub author: String, pub content: String,\n} impl Summary for NewsArticle { fn summarize(&self) -> String { format!(\"{}, by {} ({})\", self.headline, self.author, self.location) }\n} pub struct Tweet { pub username: String, pub content: String, pub reply: bool, pub retweet: bool,\n} impl Summary for Tweet { fn summarize(&self) -> String { format!(\"{}: {}\", self.username, self.content) }\n} 示例 10-13:在 NewsArticle 和 Tweet 类型上实现 Summary trait 在类型上实现 trait 类似于实现常规方法。区别在于 impl 关键字之后,我们提供需要实现 trait 的名称,接着是 for 和需要实现 trait 的类型的名称。在 impl 块中,使用 trait 定义中的方法签名,不过不再后跟分号,而是需要在大括号中编写函数体来为特定类型实现 trait 方法所拥有的行为。 现在库在 NewsArticle 和 Tweet 上实现了Summary trait,crate 的用户可以像调用常规方法一样调用 NewsArticle 和 Tweet 实例的 trait 方法了。唯一的区别是 trait 必须和类型一起引入作用域以便使用额外的 trait 方法。这是一个二进制 crate 如何利用 aggregator 库 crate 的例子: use aggregator::{Summary, Tweet}; fn main() { let tweet = Tweet { username: String::from(\"horse_ebooks\"), content: String::from( \"of course, as you probably already know, people\", ), reply: false, retweet: false, }; println!(\"1 new tweet: {}\", tweet.summarize());\n} 这会打印出 1 new tweet: horse_ebooks: of course, as you probably already know, people。 其他依赖 aggregator crate 的 crate 也可以将 Summary 引入作用域以便为其自己的类型实现该 trait。需要注意的限制是,只有在 trait 或类型至少有一个属于当前 crate 时,我们才能对类型实现该 trait。例如,可以为 aggregator crate 的自定义类型 Tweet 实现如标准库中的 Display trait,这是因为 Tweet 类型位于 aggregator crate 本地的作用域中。类似地,也可以在 aggregator crate 中为 Vec 实现 Summary,这是因为 Summary trait 位于 aggregator crate 本地作用域中。 但是不能为外部类型实现外部 trait。例如,不能在 aggregator crate 中为 Vec 实现 Display trait。这是因为 Display 和 Vec 都定义于标准库中,它们并不位于 aggregator crate 本地作用域中。这个限制是被称为 相干性 ( coherence )的程序属性的一部分,或者更具体的说是 孤儿规则 ( orphan rule ),其得名于不存在父类型。这条规则确保了其他人编写的代码不会破坏你代码,反之亦然。没有这条规则的话,两个 crate 可以分别对相同类型实现相同的 trait,而 Rust 将无从得知应该使用哪一个实现。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » 为类型实现 trait","id":"179","title":"为类型实现 trait"},"18":{"body":"通过 rustup 安装了 Rust 之后,更新到最新版本就很简单了,只需要在您对应的命令行中运行如下更新脚本: $ rustup update 若要卸载 Rust 和 rustup,请在命令行中运行如下卸载脚本: $ rustup self uninstall","breadcrumbs":"入门指南 » 安装 » 更新与卸载","id":"18","title":"更新与卸载"},"180":{"body":"有时为 trait 中的某些或全部方法提供默认的行为,而不是在每个类型的每个实现中都定义自己的行为是很有用的。这样当为某个特定类型实现 trait 时,可以选择保留或重载每个方法的默认行为。 示例 10-14 中我们为 Summary trait 的 summarize 方法指定一个默认的字符串值,而不是像示例 10-12 中那样只是定义方法签名: 文件名:src/lib.rs pub trait Summary { fn summarize(&self) -> String { String::from(\"(Read more...)\") }\n}\n# # pub struct NewsArticle {\n# pub headline: String,\n# pub location: String,\n# pub author: String,\n# pub content: String,\n# }\n# # impl Summary for NewsArticle {}\n# # pub struct Tweet {\n# pub username: String,\n# pub content: String,\n# pub reply: bool,\n# pub retweet: bool,\n# }\n# # impl Summary for Tweet {\n# fn summarize(&self) -> String {\n# format!(\"{}: {}\", self.username, self.content)\n# }\n# } 示例 10-14:Summary trait 的定义,带有一个 summarize 方法的默认实现 如果想要对 NewsArticle 实例使用这个默认实现,可以通过 impl Summary for NewsArticle {} 指定一个空的 impl 块。 虽然我们不再直接为 NewsArticle 定义 summarize 方法了,但是我们提供了一个默认实现并且指定 NewsArticle 实现 Summary trait。因此,我们仍然可以对 NewsArticle 实例调用 summarize 方法,如下所示: # use aggregator::{self, NewsArticle, Summary};\n# # fn main() { let article = NewsArticle { headline: String::from(\"Penguins win the Stanley Cup Championship!\"), location: String::from(\"Pittsburgh, PA, USA\"), author: String::from(\"Iceburgh\"), content: String::from( \"The Pittsburgh Penguins once again are the best \\ hockey team in the NHL.\", ), }; println!(\"New article available! {}\", article.summarize());\n# } 这段代码会打印 New article available! (Read more...)。 为 summarize 创建默认实现并不要求对示例 10-13 中 Tweet 上的 Summary 实现做任何改变。其原因是重载一个默认实现的语法与实现没有默认实现的 trait 方法的语法一样。 默认实现允许调用相同 trait 中的其他方法,哪怕这些方法没有默认实现。如此,trait 可以提供很多有用的功能而只需要实现指定一小部分内容。例如,我们可以定义 Summary trait,使其具有一个需要实现的 summarize_author 方法,然后定义一个 summarize 方法,此方法的默认实现调用 summarize_author 方法: pub trait Summary { fn summarize_author(&self) -> String; fn summarize(&self) -> String { format!(\"(Read more from {}...)\", self.summarize_author()) }\n}\n# # pub struct Tweet {\n# pub username: String,\n# pub content: String,\n# pub reply: bool,\n# pub retweet: bool,\n# }\n# # impl Summary for Tweet {\n# fn summarize_author(&self) -> String {\n# format!(\"@{}\", self.username)\n# }\n# } 为了使用这个版本的 Summary,只需在实现 trait 时定义 summarize_author 即可: # pub trait Summary {\n# fn summarize_author(&self) -> String;\n# # fn summarize(&self) -> String {\n# format!(\"(Read more from {}...)\", self.summarize_author())\n# }\n# }\n# # pub struct Tweet {\n# pub username: String,\n# pub content: String,\n# pub reply: bool,\n# pub retweet: bool,\n# }\n# impl Summary for Tweet { fn summarize_author(&self) -> String { format!(\"@{}\", self.username) }\n} 一旦定义了 summarize_author,我们就可以对 Tweet 结构体的实例调用 summarize 了,而 summarize 的默认实现会调用我们提供的 summarize_author 定义。因为实现了 summarize_author,Summary trait 就提供了 summarize 方法的功能,且无需编写更多的代码。 # use aggregator::{self, Summary, Tweet};\n# # fn main() { let tweet = Tweet { username: String::from(\"horse_ebooks\"), content: String::from( \"of course, as you probably already know, people\", ), reply: false, retweet: false, }; println!(\"1 new tweet: {}\", tweet.summarize());\n# } 这会打印出 1 new tweet: (Read more from @horse_ebooks...)。 注意无法从相同方法的重载实现中调用默认方法。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » 默认实现","id":"180","title":"默认实现"},"181":{"body":"知道了如何定义 trait 和在类型上实现这些 trait 之后,我们可以探索一下如何使用 trait 来接受多种不同类型的参数。示例 10-13 中为 NewsArticle 和 Tweet 类型实现了 Summary trait,用其来定义了一个函数 notify 来调用其参数 item 上的 summarize 方法,该参数是实现了 Summary trait 的某种类型。为此可以使用 impl Trait 语法,像这样: # pub trait Summary {\n# fn summarize(&self) -> String;\n# }\n# # pub struct NewsArticle {\n# pub headline: String,\n# pub location: String,\n# pub author: String,\n# pub content: String,\n# }\n# # impl Summary for NewsArticle {\n# fn summarize(&self) -> String {\n# format!(\"{}, by {} ({})\", self.headline, self.author, self.location)\n# }\n# }\n# # pub struct Tweet {\n# pub username: String,\n# pub content: String,\n# pub reply: bool,\n# pub retweet: bool,\n# }\n# # impl Summary for Tweet {\n# fn summarize(&self) -> String {\n# format!(\"{}: {}\", self.username, self.content)\n# }\n# }\n# pub fn notify(item: &impl Summary) { println!(\"Breaking news! {}\", item.summarize());\n} 对于 item 参数,我们指定了 impl 关键字和 trait 名称,而不是具体的类型。该参数支持任何实现了指定 trait 的类型。在 notify 函数体中,可以调用任何来自 Summary trait 的方法,比如 summarize。我们可以传递任何 NewsArticle 或 Tweet 的实例来调用 notify。任何用其它如 String 或 i32 的类型调用该函数的代码都不能编译,因为它们没有实现 Summary。 Trait Bound 语法 impl Trait 语法更直观,但它实际上是更长形式的 trait bound 语法的语法糖。它看起来像: pub fn notify(item: &T) { println!(\"Breaking news! {}\", item.summarize());\n} 这与之前的例子相同,不过稍微冗长了一些。trait bound 与泛型参数声明在一起,位于尖括号中的冒号后面。 impl Trait 很方便,适用于短小的例子。更长的 trait bound 则适用于更复杂的场景。例如,可以获取两个实现了 Summary 的参数。使用 impl Trait 的语法看起来像这样: pub fn notify(item1: &impl Summary, item2: &impl Summary) { 这适用于 item1 和 item2 允许是不同类型的情况(只要它们都实现了 Summary)。不过如果你希望强制它们都是相同类型呢?这只有在使用 trait bound 时才有可能: pub fn notify(item1: &T, item2: &T) { 泛型 T 被指定为 item1 和 item2 的参数限制,如此传递给参数 item1 和 item2 值的具体类型必须一致。 通过 + 指定多个 trait bound 如果 notify 需要显示 item 的格式化形式,同时也要使用 summarize 方法,那么 item 就需要同时实现两个不同的 trait:Display 和 Summary。这可以通过 + 语法实现: pub fn notify(item: &(impl Summary + Display)) { + 语法也适用于泛型的 trait bound: pub fn notify(item: &T) { 通过指定这两个 trait bound,notify 的函数体可以调用 summarize 并使用 {} 来格式化 item。 通过 where 简化 trait bound 然而,使用过多的 trait bound 也有缺点。每个泛型有其自己的 trait bound,所以有多个泛型参数的函数在名称和参数列表之间会有很长的 trait bound 信息,这使得函数签名难以阅读。为此,Rust 有另一个在函数签名之后的 where 从句中指定 trait bound 的语法。所以除了这么写: fn some_function(t: &T, u: &U) -> i32 { 还可以像这样使用 where 从句: fn some_function(t: &T, u: &U) -> i32\nwhere T: Display + Clone, U: Clone + Debug,\n{\n# unimplemented!()\n# } 这个函数签名就显得不那么杂乱,函数名、参数列表和返回值类型都离得很近,看起来跟没有那么多 trait bounds 的函数很像。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » trait 作为参数","id":"181","title":"trait 作为参数"},"182":{"body":"也可以在返回值中使用 impl Trait 语法,来返回实现了某个 trait 的类型: # pub trait Summary {\n# fn summarize(&self) -> String;\n# }\n# # pub struct NewsArticle {\n# pub headline: String,\n# pub location: String,\n# pub author: String,\n# pub content: String,\n# }\n# # impl Summary for NewsArticle {\n# fn summarize(&self) -> String {\n# format!(\"{}, by {} ({})\", self.headline, self.author, self.location)\n# }\n# }\n# # pub struct Tweet {\n# pub username: String,\n# pub content: String,\n# pub reply: bool,\n# pub retweet: bool,\n# }\n# # impl Summary for Tweet {\n# fn summarize(&self) -> String {\n# format!(\"{}: {}\", self.username, self.content)\n# }\n# }\n# fn returns_summarizable() -> impl Summary { Tweet { username: String::from(\"horse_ebooks\"), content: String::from( \"of course, as you probably already know, people\", ), reply: false, retweet: false, }\n} 通过使用 impl Summary 作为返回值类型,我们指定了 returns_summarizable 函数返回某个实现了 Summary trait 的类型,但是不确定其具体的类型。在这个例子中 returns_summarizable 返回了一个 Tweet,不过调用方并不知情。 返回一个只是指定了需要实现的 trait 的类型的能力在闭包和迭代器场景十分的有用,第十三章会介绍它们。闭包和迭代器创建只有编译器知道的类型,或者是非常非常长的类型。impl Trait 允许你简单的指定函数返回一个 Iterator 而无需写出实际的冗长的类型。 不过这只适用于返回单一类型的情况。例如,这段代码的返回值类型指定为返回 impl Summary,但是返回了 NewsArticle 或 Tweet 就行不通: # pub trait Summary {\n# fn summarize(&self) -> String;\n# }\n# # pub struct NewsArticle {\n# pub headline: String,\n# pub location: String,\n# pub author: String,\n# pub content: String,\n# }\n# # impl Summary for NewsArticle {\n# fn summarize(&self) -> String {\n# format!(\"{}, by {} ({})\", self.headline, self.author, self.location)\n# }\n# }\n# # pub struct Tweet {\n# pub username: String,\n# pub content: String,\n# pub reply: bool,\n# pub retweet: bool,\n# }\n# # impl Summary for Tweet {\n# fn summarize(&self) -> String {\n# format!(\"{}: {}\", self.username, self.content)\n# }\n# }\n# fn returns_summarizable(switch: bool) -> impl Summary { if switch { NewsArticle { headline: String::from( \"Penguins win the Stanley Cup Championship!\", ), location: String::from(\"Pittsburgh, PA, USA\"), author: String::from(\"Iceburgh\"), content: String::from( \"The Pittsburgh Penguins once again are the best \\ hockey team in the NHL.\", ), } } else { Tweet { username: String::from(\"horse_ebooks\"), content: String::from( \"of course, as you probably already know, people\", ), reply: false, retweet: false, } }\n} 这里尝试返回 NewsArticle 或 Tweet。这不能编译,因为 impl Trait 工作方式的限制。第十八章的 “顾及不同类型值的 trait 对象” 部分会介绍如何编写这样一个函数。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » 返回实现了 trait 的类型","id":"182","title":"返回实现了 trait 的类型"},"183":{"body":"通过使用带有 trait bound 的泛型参数的 impl 块,可以有条件地只为那些实现了特定 trait 的类型实现方法。例如,示例 10-15 中的类型 Pair 总是实现了 new 方法并返回一个 Pair 的实例(回忆一下第五章的 “定义方法” 部分,Self 是一个 impl 块类型的类型别名(type alias),在这里是 Pair)。不过在下一个 impl 块中,只有那些为 T 类型实现了 PartialOrd trait(来允许比较) 和 Display trait(来启用打印)的 Pair 才会实现 cmp_display 方法: use std::fmt::Display; struct Pair { x: T, y: T,\n} impl Pair { fn new(x: T, y: T) -> Self { Self { x, y } }\n} impl Pair { fn cmp_display(&self) { if self.x >= self.y { println!(\"The largest member is x = {}\", self.x); } else { println!(\"The largest member is y = {}\", self.y); } }\n} 示例 10-15:根据 trait bound 在泛型上有条件的实现方法 也可以对任何实现了特定 trait 的类型有条件地实现 trait。对任何满足特定 trait bound 的类型实现 trait 被称为 blanket implementations ,它们被广泛的用于 Rust 标准库中。例如,标准库为任何实现了 Display trait 的类型实现了 ToString trait。这个 impl 块看起来像这样: impl ToString for T { // --snip--\n} 因为标准库有了这些 blanket implementation,我们可以对任何实现了 Display trait 的类型调用由 ToString 定义的 to_string 方法。例如,可以将整型转换为对应的 String 值,因为整型实现了 Display: let s = 3.to_string(); blanket implementation 会出现在 trait 文档的 “Implementers” 部分。 trait 和 trait bound 让我们能够使用泛型类型参数来减少重复,而且能够向编译器明确指定泛型类型需要拥有哪些行为。然后编译器可以利用 trait bound 信息检查代码中所用到的具体类型是否提供了正确的行为。在动态类型语言中,如果我们调用了一个未定义的方法,会在运行时出现错误。Rust 将这些错误移动到了编译时,甚至在代码能够运行之前就强迫我们修复问题。另外,我们也无需编写运行时检查行为的代码,因为在编译时就已经检查过了。这样既提升了性能又不必放弃泛型的灵活性。","breadcrumbs":"泛型、Trait 和生命周期 » Trait:定义共同行为 » 使用 trait bound 有条件地实现方法","id":"183","title":"使用 trait bound 有条件地实现方法"},"184":{"body":"ch10-03-lifetime-syntax.md commit 5f67eee42345ba44f6f08a22c2192165f4b0e930 生命周期是另一类我们已经使用过的泛型。不同于确保类型有期望的行为,生命周期确保引用如预期一直有效。 当在第四章讨论 “引用和借用” 部分时,我们遗漏了一个重要的细节:Rust 中的每一个引用都有其 生命周期 ( lifetime ),也就是引用保持有效的作用域。大部分时候生命周期是隐含并可以推断的,正如大部分时候类型也是可以推断的一样。类似于当因为有多种可能类型的时候必须注明类型,也会出现引用的生命周期以一些不同方式相关联的情况,所以 Rust 需要我们使用泛型生命周期参数来注明它们的关系,这样就能确保运行时实际使用的引用绝对是有效的。 生命周期注解甚至不是一个大部分语言都有的概念,所以这可能感觉起来有些陌生。虽然本章不可能涉及到它全部的内容,我们会讲到一些通常你可能会遇到的生命周期语法以便你熟悉这个概念。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 生命周期确保引用有效","id":"184","title":"生命周期确保引用有效"},"185":{"body":"生命周期的主要目标是避免 悬垂引用 ( dangling references ),后者会导致程序引用了非预期引用的数据。考虑一下示例 10-16 中的程序,它有一个外部作用域和一个内部作用域。 fn main() { let r; { let x = 5; r = &x; } println!(\"r: {r}\");\n} 示例 10-16:尝试使用离开作用域的值的引用 注意:示例 10-16、10-17 和 10-23 中声明了没有初始值的变量,所以这些变量存在于外部作用域。这乍看之下好像和 Rust 不允许存在空值相冲突。然而如果尝试在给它一个值之前使用这个变量,会出现一个编译时错误,这就说明了 Rust 确实不允许空值。 外部作用域声明了一个没有初值的变量 r,而内部作用域声明了一个初值为 5 的变量x。在内部作用域中,我们尝试将 r 的值设置为一个 x 的引用。接着在内部作用域结束后,尝试打印出 r 的值。这段代码不能编译因为 r 引用的值在尝试使用之前就离开了作用域。如下是错误信息: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10)\nerror[E0597]: `x` does not live long enough --> src/main.rs:6:13 |\n5 | let x = 5; | - binding `x` declared here\n6 | r = &x; | ^^ borrowed value does not live long enough\n7 | } | - `x` dropped here while still borrowed\n8 |\n9 | println!(\"r: {r}\"); | --- borrow later used here For more information about this error, try `rustc --explain E0597`.\nerror: could not compile `chapter10` (bin \"chapter10\") due to 1 previous error 变量 x 并没有 “存在的足够久”。其原因是 x 在到达第 7 行内部作用域结束时就离开了作用域。不过 r 在外部作用域仍是有效的;作用域越大我们就说它 “存在的越久”。如果 Rust 允许这段代码工作,r 将会引用在 x 离开作用域时被释放的内存,这时尝试对 r 做任何操作都不能正常工作。那么 Rust 是如何决定这段代码是不被允许的呢?这得益于借用检查器。 借用检查器 Rust 编译器有一个 借用检查器 ( borrow checker ),它比较作用域来确保所有的借用都是有效的。示例 10-17 展示了与示例 10-16 相同的例子不过带有变量生命周期的注释: fn main() { let r; // ---------+-- 'a // | { // | let x = 5; // -+-- 'b | r = &x; // | | } // -+ | // | println!(\"r: {r}\"); // |\n} // ---------+ 示例 10-17:r 和 x 的生命周期注解,分别叫做 'a 和 'b 这里将 r 的生命周期标记为 'a 并将 x 的生命周期标记为 'b。如你所见,内部的 'b 块要比外部的生命周期 'a 小得多。在编译时,Rust 比较这两个生命周期的大小,并发现 r 拥有生命周期 'a,不过它引用了一个拥有生命周期 'b 的对象。程序被拒绝编译,因为生命周期 'b 比生命周期 'a 要小:被引用的对象比它的引用者存在的时间更短。 让我们看看示例 10-18 中这个并没有产生悬垂引用且可以正确编译的例子: fn main() { let x = 5; // ----------+-- 'b // | let r = &x; // --+-- 'a | // | | println!(\"r: {r}\"); // | | // --+ |\n} // ----------+ 示例 10-18:一个有效的引用,因为数据比引用有着更长的生命周期 这里 x 拥有生命周期 'b,比 'a 要大。这就意味着 r 可以引用 x:Rust 知道 r 中的引用在 x 有效的时候也总是有效的。 现在我们已经在一个具体的例子中展示了引用的生命周期位于何处,并讨论了 Rust 如何分析生命周期来保证引用总是有效的,接下来让我们聊聊在函数的上下文中参数和返回值的泛型生命周期。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 生命周期避免了悬垂引用","id":"185","title":"生命周期避免了悬垂引用"},"186":{"body":"让我们来编写一个返回两个字符串 slice 中较长者的函数。这个函数获取两个字符串 slice 并返回一个字符串 slice。一旦我们实现了 longest 函数,示例 10-19 中的代码应该会打印出 The longest string is abcd: 文件名:src/main.rs fn main() { let string1 = String::from(\"abcd\"); let string2 = \"xyz\"; let result = longest(string1.as_str(), string2); println!(\"The longest string is {result}\");\n} 示例 10-19:main 函数调用 longest 函数来寻找两个字符串 slice 中较长的一个 注意这个函数获取作为引用的字符串 slice,而不是字符串,因为我们不希望 longest 函数获取参数的所有权。参考之前第四章中的 “字符串 slice 作为参数” 部分中更多关于为什么示例 10-19 的参数正符合我们期望的讨论。 如果尝试像示例 10-20 中那样实现 longest 函数,它并不能编译: 文件名:src/main.rs # fn main() {\n# let string1 = String::from(\"abcd\");\n# let string2 = \"xyz\";\n# # let result = longest(string1.as_str(), string2);\n# println!(\"The longest string is {result}\");\n# }\n# fn longest(x: &str, y: &str) -> &str { if x.len() > y.len() { x } else { y }\n} 示例 10-20:一个 longest 函数的实现,它返回两个字符串 slice 中较长者,现在还不能编译 相应地会出现如下有关生命周期的错误: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10)\nerror[E0106]: missing lifetime specifier --> src/main.rs:9:33 |\n9 | fn longest(x: &str, y: &str) -> &str { | ---- ---- ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `x` or `y`\nhelp: consider introducing a named lifetime parameter |\n9 | fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { | ++++ ++ ++ ++ For more information about this error, try `rustc --explain E0106`.\nerror: could not compile `chapter10` (bin \"chapter10\") due to 1 previous error 提示文本揭示了返回值需要一个泛型生命周期参数,因为 Rust 并不知道将要返回的引用是指向 x 或 y。事实上我们也不知道,因为函数体中 if 块返回一个 x 的引用而 else 块返回一个 y 的引用! 当我们定义这个函数的时候,并不知道传递给函数的具体值,所以也不知道到底是 if 还是 else 会被执行。我们也不知道传入的引用的具体生命周期,所以也就不能像示例 10-17 和 10-18 那样通过观察作用域来确定返回的引用是否总是有效。借用检查器自身同样也无法确定,因为它不知道 x 和 y 的生命周期是如何与返回值的生命周期相关联的。为了修复这个错误,我们将增加泛型生命周期参数来定义引用间的关系以便借用检查器可以进行分析。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 函数中的泛型生命周期","id":"186","title":"函数中的泛型生命周期"},"187":{"body":"生命周期注解并不改变任何引用的生命周期的长短。相反它们描述了多个引用生命周期相互的关系,而不影响其生命周期。与当函数签名中指定了泛型类型参数后就可以接受任何类型一样,当指定了泛型生命周期后函数也能接受任何生命周期的引用。 生命周期注解有着一个不太常见的语法:生命周期参数名称必须以撇号(')开头,其名称通常全是小写,类似于泛型其名称非常短。大多数人使用 'a 作为第一个生命周期注解。生命周期参数注解位于引用的 & 之后,并有一个空格来将引用类型与生命周期注解分隔开。 这里有一些例子:我们有一个没有生命周期参数的 i32 的引用,一个有叫做 'a 的生命周期参数的 i32 的引用,和一个生命周期也是 'a 的 i32 的可变引用: &i32 // 引用\n&'a i32 // 带有显式生命周期的引用\n&'a mut i32 // 带有显式生命周期的可变引用 单个的生命周期注解本身没有多少意义,因为生命周期注解告诉 Rust 多个引用的泛型生命周期参数如何相互联系的。让我们在 longest 函数的上下文中理解生命周期注解如何相互联系。 例如如果函数有一个生命周期 'a 的 i32 的引用的参数 first。还有另一个同样是生命周期 'a 的 i32 的引用的参数 second。这两个生命周期注解意味着引用 first 和 second 必须与这泛型生命周期存在得一样久。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 生命周期注解语法","id":"187","title":"生命周期注解语法"},"188":{"body":"为了在函数签名中使用生命周期注解,需要在函数名和参数列表间的尖括号中声明泛型生命周期( lifetime )参数,就像泛型类型( type )参数一样。 我们希望函数签名表达如下限制:也就是这两个参数和返回的引用存活的一样久。(两个)参数和返回的引用的生命周期是相关的。就像示例 10-21 中在每个引用中都加上了 'a 那样。 文件名:src/main.rs # fn main() {\n# let string1 = String::from(\"abcd\");\n# let string2 = \"xyz\";\n# # let result = longest(string1.as_str(), string2);\n# println!(\"The longest string is {result}\");\n# }\n# fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { if x.len() > y.len() { x } else { y }\n} 示例 10-21:longest 函数定义指定了签名中所有的引用必须有相同的生命周期 'a 这段代码能够编译并会产生我们希望得到的示例 10-19 中的 main 函数的结果。 现在函数签名表明对于某些生命周期 'a,函数会获取两个参数,它们都是与生命周期 'a 存在的至少一样长的字符串 slice。函数会返回一个同样也与生命周期 'a 存在的至少一样长的字符串 slice。它的实际含义是 longest 函数返回的引用的生命周期与函数参数所引用的值的生命周期的较小者一致。这些关系就是我们希望 Rust 分析代码时所使用的。 记住通过在函数签名中指定生命周期参数时,我们并没有改变任何传入值或返回值的生命周期,而是指出任何不满足这个约束条件的值都将被借用检查器拒绝。注意 longest 函数并不需要知道 x 和 y 具体会存在多久,而只需要知道有某个可以被 'a 替代的作用域将会满足这个签名。 当在函数中使用生命周期注解时,这些注解出现在函数签名中,而不存在于函数体中的任何代码中。生命周期注解成为了函数约定的一部分,非常像签名中的类型。让函数签名包含生命周期约定意味着 Rust 编译器的工作变得更简单了。如果函数注解有误或者调用方法不对,编译器错误可以更准确地指出代码和限制的部分。如果不这么做的话,Rust 编译会对我们期望的生命周期关系做更多的推断,这样编译器可能只能指出离出问题地方很多步之外的代码。 当具体的引用被传递给 longest 时,被 'a 所替代的具体生命周期是 x 的作用域与 y 的作用域相重叠的那一部分。换一种说法就是泛型生命周期 'a 的具体生命周期等同于 x 和 y 的生命周期中较小的那一个。因为我们用相同的生命周期参数 'a 标注了返回的引用值,所以返回的引用值就能保证在 x 和 y 中较短的那个生命周期结束之前保持有效。 让我们看看如何通过传递拥有不同具体生命周期的引用来限制 longest 函数的使用。示例 10-22 是一个很直观的例子。 文件名:src/main.rs fn main() { let string1 = String::from(\"long string is long\"); { let string2 = String::from(\"xyz\"); let result = longest(string1.as_str(), string2.as_str()); println!(\"The longest string is {result}\"); }\n}\n# # fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {\n# if x.len() > y.len() {\n# x\n# } else {\n# y\n# }\n# } 示例 10-22:通过拥有不同的具体生命周期的 String 值调用 longest 函数 在这个例子中,string1 直到外部作用域结束都是有效的,string2 则在内部作用域中是有效的,而 result 则引用了一些直到内部作用域结束都是有效的值。借用检查器认可这些代码;它能够编译和运行,并打印出 The longest string is long string is long。 接下来,让我们尝试另外一个例子,该例子揭示了 result 的引用的生命周期必须是两个参数中较短的那个。以下代码将 result 变量的声明移动出内部作用域,但是将 result 和 string2 变量的赋值语句一同留在内部作用域中。接着,使用了变量 result 的 println! 也被移动到内部作用域之外。注意示例 10-23 中的代码不能通过编译: 文件名:src/main.rs fn main() { let string1 = String::from(\"long string is long\"); let result; { let string2 = String::from(\"xyz\"); result = longest(string1.as_str(), string2.as_str()); } println!(\"The longest string is {result}\");\n}\n# # fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {\n# if x.len() > y.len() {\n# x\n# } else {\n# y\n# }\n# } 示例 10-23:尝试在 string2 离开作用域之后使用 result 如果尝试编译会出现如下错误: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10)\nerror[E0597]: `string2` does not live long enough --> src/main.rs:6:44 |\n5 | let string2 = String::from(\"xyz\"); | ------- binding `string2` declared here\n6 | result = longest(string1.as_str(), string2.as_str()); | ^^^^^^^ borrowed value does not live long enough\n7 | } | - `string2` dropped here while still borrowed\n8 | println!(\"The longest string is {result}\"); | -------- borrow later used here For more information about this error, try `rustc --explain E0597`.\nerror: could not compile `chapter10` (bin \"chapter10\") due to 1 previous error 错误表明为了保证 println! 中的 result 是有效的,string2 需要直到外部作用域结束都是有效的。Rust 知道这些是因为(longest)函数的参数和返回值都使用了相同的生命周期参数 'a。 如果从人的角度读上述代码,我们可能会觉得这个代码是正确的。 string1 更长,因此 result 会包含指向 string1 的引用。因为 string1 尚未离开作用域,对于 println! 来说 string1 的引用仍然是有效的。然而,我们通过生命周期参数告诉 Rust 的是: longest 函数返回的引用的生命周期应该与传入参数的生命周期中较短那个保持一致。因此,借用检查器不允许示例 10-23 中的代码,因为它可能会存在无效的引用。 请尝试更多采用不同的值和不同生命周期的引用作为 longest 函数的参数和返回值的实验。并在开始编译前猜想你的实验能否通过借用检查器,接着编译一下看看你的理解是否正确!","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 函数签名中的生命周期注解","id":"188","title":"函数签名中的生命周期注解"},"189":{"body":"指定生命周期参数的正确方式依赖函数实现的具体功能。例如,如果将 longest 函数的实现修改为总是返回第一个参数而不是最长的字符串 slice,就不需要为参数 y 指定一个生命周期。如下代码将能够编译: 文件名:src/main.rs # fn main() {\n# let string1 = String::from(\"abcd\");\n# let string2 = \"efghijklmnopqrstuvwxyz\";\n# # let result = longest(string1.as_str(), string2);\n# println!(\"The longest string is {result}\");\n# }\n# fn longest<'a>(x: &'a str, y: &str) -> &'a str { x\n} 我们为参数 x 和返回值指定了生命周期参数 'a,不过没有为参数 y 指定,因为 y 的生命周期与参数 x 和返回值的生命周期没有任何关系。 当从函数返回一个引用,返回值的生命周期参数需要与一个参数的生命周期参数相匹配。如果返回的引用 没有 指向任何一个参数,那么唯一的可能就是它指向一个函数内部创建的值。然而它将会是一个悬垂引用,因为它将会在函数结束时离开作用域。尝试考虑这个并不能编译的 longest 函数实现: 文件名:src/main.rs # fn main() {\n# let string1 = String::from(\"abcd\");\n# let string2 = \"xyz\";\n# # let result = longest(string1.as_str(), string2);\n# println!(\"The longest string is {result}\");\n# }\n# fn longest<'a>(x: &str, y: &str) -> &'a str { let result = String::from(\"really long string\"); result.as_str()\n} 即便我们为返回值指定了生命周期参数 'a,这个实现却编译失败了,因为返回值的生命周期与参数完全没有关联。这里是会出现的错误信息: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10)\nerror[E0515]: cannot return value referencing local variable `result` --> src/main.rs:11:5 |\n11 | result.as_str() | ------^^^^^^^^^ | | | returns a value referencing data owned by the current function | `result` is borrowed here For more information about this error, try `rustc --explain E0515`.\nerror: could not compile `chapter10` (bin \"chapter10\") due to 1 previous error 出现的问题是 result 在 longest 函数的结尾将离开作用域并被清理,而我们尝试从函数返回一个 result 的引用。无法指定生命周期参数来改变悬垂引用,而且 Rust 也不允许我们创建一个悬垂引用。在这种情况,最好的解决方案是返回一个有所有权的数据类型而不是一个引用,这样函数调用者就需要负责清理这个值了。 综上,生命周期语法是用于将函数的多个参数与其返回值的生命周期进行关联的。一旦它们形成了某种关联,Rust 就有了足够的信息来允许内存安全的操作并阻止会产生悬垂指针亦或是违反内存安全的行为。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 深入理解生命周期","id":"189","title":"深入理解生命周期"},"19":{"body":"安装程序也自带一份文档的本地拷贝,可以离线阅读。运行 rustup doc 在浏览器中查看本地文档。 任何时候,如果你拿不准标准库中的类型或函数的用途和用法,请查阅应用程序接口(application programming interface,API)文档!","breadcrumbs":"入门指南 » 安装 » 本地文档","id":"19","title":"本地文档"},"190":{"body":"目前为止,我们定义的结构体全都包含拥有所有权的类型。也可以定义包含引用的结构体,不过这需要为结构体定义中的每一个引用添加生命周期注解。示例 10-24 中有一个存放了一个字符串 slice 的结构体 ImportantExcerpt。 文件名:src/main.rs struct ImportantExcerpt<'a> { part: &'a str,\n} fn main() { let novel = String::from(\"Call me Ishmael. Some years ago...\"); let first_sentence = novel.split('.').next().unwrap(); let i = ImportantExcerpt { part: first_sentence, };\n} 示例 10-24:一个存放引用的结构体,所以其定义需要生命周期注解 这个结构体有唯一一个字段 part,它存放了一个字符串 slice,这是一个引用。类似于泛型参数类型,必须在结构体名称后面的尖括号中声明泛型生命周期参数,以便在结构体定义中使用生命周期参数。这个注解意味着 ImportantExcerpt 的实例不能比其 part 字段中的引用存在的更久。 这里的 main 函数创建了一个 ImportantExcerpt 的实例,它存放了变量 novel 所拥有的 String 的第一个句子的引用。novel 的数据在 ImportantExcerpt 实例创建之前就存在。另外,直到 ImportantExcerpt 离开作用域之后 novel 都不会离开作用域,所以 ImportantExcerpt 实例中的引用是有效的。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 结构体定义中的生命周期注解","id":"190","title":"结构体定义中的生命周期注解"},"191":{"body":"现在我们已经知道了每一个引用都有一个生命周期,而且我们需要为那些使用了引用的函数或结构体指定生命周期。然而,第四章的示例 4-9 中有一个函数,如示例 10-25 所示,它没有生命周期注解却能编译成功: 文件名:src/lib.rs fn first_word(s: &str) -> &str { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return &s[0..i]; } } &s[..]\n}\n# # fn main() {\n# let my_string = String::from(\"hello world\");\n# # // first_word works on slices of `String`s\n# let word = first_word(&my_string[..]);\n# # let my_string_literal = \"hello world\";\n# # // first_word works on slices of string literals\n# let word = first_word(&my_string_literal[..]);\n# # // Because string literals *are* string slices already,\n# // this works too, without the slice syntax!\n# let word = first_word(my_string_literal);\n# } 示例 10-25:示例 4-9 定义了一个没有使用生命周期注解的函数,即便其参数和返回值都是引用 这个函数没有生命周期注解却能编译是由于一些历史原因:在早期版本(pre-1.0)的 Rust 中,这的确是不能编译的。每一个引用都必须有明确的生命周期。那时的函数签名将会写成这样: fn first_word<'a>(s: &'a str) -> &'a str { 在编写了很多 Rust 代码后,Rust 团队发现在特定情况下 Rust 程序员们总是重复地编写一模一样的生命周期注解。这些场景是可预测的并且遵循几个明确的模式。接着 Rust 团队就把这些模式编码进了 Rust 编译器中,如此借用检查器在这些情况下就能推断出生命周期而不再强制程序员显式的增加注解。 这里我们提到一些 Rust 的历史是因为更多的明确的模式被合并和添加到编译器中是完全可能的。未来只会需要更少的生命周期注解。 被编码进 Rust 引用分析的模式被称为 生命周期省略规则 ( lifetime elision rules )。这并不是需要程序员遵守的规则;这些规则是一系列特定的场景,此时编译器会考虑,如果代码符合这些场景,就无需明确指定生命周期。 省略规则并不提供完整的推断:如果 Rust 在明确遵守这些规则的前提下变量的生命周期仍然是模棱两可的话,它不会猜测剩余引用的生命周期应该是什么。编译器会在可以通过增加生命周期注解来解决错误问题的地方给出一个错误提示,而不是进行推断或猜测。 函数或方法的参数的生命周期被称为 输入生命周期 ( input lifetimes ),而返回值的生命周期被称为 输出生命周期 ( output lifetimes )。 编译器采用三条规则来判断引用何时不需要明确的注解。第一条规则适用于输入生命周期,后两条规则适用于输出生命周期。如果编译器检查完这三条规则后仍然存在没有计算出生命周期的引用,编译器将会停止并生成错误。这些规则适用于 fn 定义,以及 impl 块。 第一条规则是编译器为每一个引用参数都分配一个生命周期参数。换句话说就是,函数有一个引用参数的就有一个生命周期参数:fn foo<'a>(x: &'a i32),有两个引用参数的函数就有两个不同的生命周期参数,fn foo<'a, 'b>(x: &'a i32, y: &'b i32),依此类推。 第二条规则是如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数:fn foo<'a>(x: &'a i32) -> &'a i32。 第三条规则是如果方法有多个输入生命周期参数并且其中一个参数是 &self 或 &mut self,说明是个对象的方法 (method)(译者注:这里涉及 rust 的面向对象参见 17 章),那么所有输出生命周期参数被赋予 self 的生命周期。第三条规则使得方法更容易读写,因为只需更少的符号。 假设我们自己就是编译器。并应用这些规则来计算示例 10-25 中 first_word 函数签名中的引用的生命周期。开始时签名中的引用并没有关联任何生命周期: fn first_word(s: &str) -> &str { 接着编译器应用第一条规则,也就是每个引用参数都有其自己的生命周期。我们像往常一样称之为 'a,所以现在签名看起来像这样: fn first_word<'a>(s: &'a str) -> &str { 对于第二条规则,因为这里正好只有一个输入生命周期参数所以是适用的。第二条规则表明输入参数的生命周期将被赋予输出生命周期参数,所以现在签名看起来像这样: fn first_word<'a>(s: &'a str) -> &'a str { 现在这个函数签名中的所有引用都有了生命周期,如此编译器可以继续它的分析而无须程序员标记这个函数签名中的生命周期。 让我们再看看另一个例子,这次我们从示例 10-20 中没有生命周期参数的 longest 函数开始: fn longest(x: &str, y: &str) -> &str { 再次假设我们自己就是编译器并应用第一条规则:每个引用参数都有其自己的生命周期。这次有两个参数,所以就有两个(不同的)生命周期: fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &str { 再来应用第二条规则,因为函数存在多个输入生命周期,它并不适用于这种情况。再来看第三条规则,它同样也不适用,这是因为没有 self 参数。应用了三个规则之后编译器还没有计算出返回值类型的生命周期。这就是在编译示例 10-20 的代码时会出现错误的原因:编译器使用所有已知的生命周期省略规则,仍不能计算出签名中所有引用的生命周期。 因为第三条规则真正能够适用的就只有方法签名,现在就让我们看看那种情况中的生命周期,并看看为什么这条规则意味着我们经常不需要在方法签名中标注生命周期。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 生命周期省略(Lifetime Elision)","id":"191","title":"生命周期省略(Lifetime Elision)"},"192":{"body":"当为带有生命周期的结构体实现方法时,其语法依然类似示例 10-11 中展示的泛型类型参数的语法。我们在哪里声明和使用生命周期参数,取决于它们是与结构体字段相关还是与方法参数和返回值相关。 (实现方法时)结构体字段的生命周期必须总是在 impl 关键字之后声明并在结构体名称之后被使用,因为这些生命周期是结构体类型的一部分。 impl 块里的方法签名中,引用可能与结构体字段中的引用相关联,也可能是独立的。另外,生命周期省略规则也经常让我们无需在方法签名中使用生命周期注解。让我们看看一些使用示例 10-24 中定义的结构体 ImportantExcerpt 的例子。 首先,这里有一个方法 level。其唯一的参数是 self 的引用,而且返回值只是一个 i32,并不引用任何值: # struct ImportantExcerpt<'a> {\n# part: &'a str,\n# }\n# impl<'a> ImportantExcerpt<'a> { fn level(&self) -> i32 { 3 }\n}\n# # impl<'a> ImportantExcerpt<'a> {\n# fn announce_and_return_part(&self, announcement: &str) -> &str {\n# println!(\"Attention please: {announcement}\");\n# self.part\n# }\n# }\n# # fn main() {\n# let novel = String::from(\"Call me Ishmael. Some years ago...\");\n# let first_sentence = novel.split('.').next().unwrap();\n# let i = ImportantExcerpt {\n# part: first_sentence,\n# };\n# } impl 之后和类型名称之后的生命周期参数是必要的,不过因为第一条生命周期规则我们并不必须标注 self 引用的生命周期。 这里是一个适用于第三条生命周期省略规则的例子: # struct ImportantExcerpt<'a> {\n# part: &'a str,\n# }\n# # impl<'a> ImportantExcerpt<'a> {\n# fn level(&self) -> i32 {\n# 3\n# }\n# }\n# impl<'a> ImportantExcerpt<'a> { fn announce_and_return_part(&self, announcement: &str) -> &str { println!(\"Attention please: {announcement}\"); self.part }\n}\n# # fn main() {\n# let novel = String::from(\"Call me Ishmael. Some years ago...\");\n# let first_sentence = novel.split('.').next().unwrap();\n# let i = ImportantExcerpt {\n# part: first_sentence,\n# };\n# } 这里有两个输入生命周期,所以 Rust 应用第一条生命周期省略规则并给予 &self 和 announcement 它们各自的生命周期。接着,因为其中一个参数是 &self,返回值类型被赋予了 &self 的生命周期,这样所有的生命周期都被计算出来了。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 方法定义中的生命周期注解","id":"192","title":"方法定义中的生命周期注解"},"193":{"body":"这里有一种特殊的生命周期值得讨论:'static,其生命周期 能够 存活于整个程序期间。所有的字符串字面值都拥有 'static 生命周期,我们也可以选择像下面这样标注出来: let s: &'static str = \"I have a static lifetime.\"; 这个字符串的文本被直接储存在程序的二进制文件中而这个文件总是可用的。因此所有的字符串字面值都是 'static 的。 你可能在错误信息的帮助文本中见过使用 'static 生命周期的建议,不过将引用指定为 'static 之前,思考一下这个引用是否真的在整个程序的生命周期里都有效,以及你是否希望它存在得这么久。大部分情况中,推荐 'static 生命周期的错误信息都是尝试创建一个悬垂引用或者可用的生命周期不匹配的结果。在这种情况下的解决方案是修复这些问题而不是指定一个 'static 的生命周期。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 静态生命周期","id":"193","title":"静态生命周期"},"194":{"body":"让我们简要的看一下在同一函数中指定泛型类型参数、trait bounds 和生命周期的语法! # fn main() {\n# let string1 = String::from(\"abcd\");\n# let string2 = \"xyz\";\n# # let result = longest_with_an_announcement(\n# string1.as_str(),\n# string2,\n# \"Today is someone's birthday!\",\n# );\n# println!(\"The longest string is {result}\");\n# }\n# use std::fmt::Display; fn longest_with_an_announcement<'a, T>( x: &'a str, y: &'a str, ann: T,\n) -> &'a str\nwhere T: Display,\n{ println!(\"Announcement! {ann}\"); if x.len() > y.len() { x } else { y }\n} 这个是示例 10-21 中那个返回两个字符串 slice 中较长者的 longest 函数,不过带有一个额外的参数 ann。ann 的类型是泛型 T,它可以被放入任何实现了 where 从句中指定的 Display trait 的类型。这个额外的参数会使用 {} 打印,这也就是为什么 Display trait bound 是必须的。因为生命周期也是泛型,所以生命周期参数 'a 和泛型类型参数 T 都位于函数名后的同一尖括号列表中。","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 结合泛型类型参数、trait bounds 和生命周期","id":"194","title":"结合泛型类型参数、trait bounds 和生命周期"},"195":{"body":"这一章介绍了很多的内容!现在你知道了泛型类型参数、trait 和 trait bounds 以及泛型生命周期类型,你已经准备好编写既不重复又能适用于多种场景的代码了。泛型类型参数意味着代码可以适用于不同的类型。trait 和 trait bounds 保证了即使类型是泛型的,这些类型也会拥有所需要的行为。由生命周期注解所指定的引用生命周期之间的关系保证了这些灵活多变的代码不会出现悬垂引用。而所有的这一切发生在编译时所以不会影响运行时效率! 你可能不会相信,这个话题还有更多需要学习的内容:第十八章会讨论 trait 对象,这是另一种使用 trait 的方式。还有更多更复杂的涉及生命周期注解的场景,只有在非常高级的情况下才会需要它们;对于这些内容,请阅读 Rust Reference 。不过接下来,让我们聊聊如何在 Rust 中编写测试,来确保代码的所有功能能像我们希望的那样工作!","breadcrumbs":"泛型、Trait 和生命周期 » 生命周期确保引用有效 » 总结","id":"195","title":"总结"},"196":{"body":"ch11-00-testing.md commit 765318b844569a642ceef7bf1adab9639cbf6af3 Edsger W. Dijkstra 在其 1972 年的文章【谦卑的程序员】(“The Humble Programmer”)中说到 “软件测试是证明 bug 存在的有效方法,而证明其不存在时则显得令人绝望的不足。”(“Program testing can be a very effective way to show the presence of bugs, but it is hopelessly inadequate for showing their absence.”)这并不意味着我们不该尽可能地测试软件! 程序的正确性意味着代码如我们期望的那样运行。Rust 是一个相当注重正确性的编程语言,不过正确性是一个难以证明的复杂主题。Rust 的类型系统在此问题上下了很大的功夫,不过类型系统不可能捕获所有问题。为此,Rust 包含了编写自动化软件测试的功能支持。 假设我们可以编写一个叫做 add_two 的将传递给它的值加二的函数。它的签名有一个整型参数并返回一个整型值。当实现和编译这个函数时,Rust 会进行所有目前我们已经见过的类型检查和借用检查,例如,这些检查会确保我们不会传递 String 或无效的引用给这个函数。Rust 所 不能 检查的是这个函数是否会准确的完成我们期望的工作:返回参数加二后的值,而不是比如说参数加 10 或减 50 的值!这也就是测试出场的地方。 我们可以编写测试断言,比如说,当传递 3 给 add_two 函数时,返回值是 5。无论何时对代码进行修改,都可以运行测试来确保任何现存的正确行为没有被改变。 测试是一项复杂的技能:虽然不能在一个章节的篇幅中介绍如何编写好的测试的每个细节,但我们还是会讨论 Rust 测试功能的机制。我们会讲到编写测试时会用到的注解和宏,运行测试的默认行为和选项,以及如何将测试组织成单元测试和集成测试。","breadcrumbs":"编写自动化测试 » 编写自动化测试","id":"196","title":"编写自动化测试"},"197":{"body":"ch11-01-writing-tests.md commit 6e2fe7c0f085989cc498cec139e717e2af172cb7 Rust 中的测试函数是用来验证非测试代码是否是按照期望的方式运行的。测试函数体通常执行如下三种操作: 设置任何所需的数据或状态 运行需要测试的代码 断言其结果是我们所期望的 让我们看看 Rust 提供的专门用来编写测试的功能:test 属性、一些宏和 should_panic 属性。","breadcrumbs":"编写自动化测试 » 如何编写测试 » 如何编写测试","id":"197","title":"如何编写测试"},"198":{"body":"作为最简单例子,Rust 中的测试就是一个带有 test 属性注解的函数。属性(attribute)是关于 Rust 代码片段的元数据;第五章中结构体中用到的 derive 属性就是一个例子。为了将一个函数变成测试函数,需要在 fn 行之前加上 #[test]。当使用 cargo test 命令运行测试时,Rust 会构建一个测试执行程序用来调用被标注的函数,并报告每一个测试是通过还是失败。 每次使用 Cargo 新建一个库项目时,它会自动为我们生成一个测试模块和一个测试函数。这个模块提供了一个编写测试的模板,为此每次开始新项目时不必去查找测试函数的具体结构和语法了。当然你也可以额外增加任意多的测试函数以及测试模块! 在实际编写测试代码之前,让我们先通过尝试那些自动生成的测试模版来探索测试是如何工作的。接着,我们会写一些真正的测试,调用我们编写的代码并断言它们的行为的正确性。 让我们创建一个新的库项目 adder,它会将两个数字相加: $ cargo new adder --lib Created library `adder` project\n$ cd adder adder 库中 src/lib.rs 的内容应该看起来如示例 11-1 所示: 文件名:src/lib.rs pub fn add(left: usize, right: usize) -> usize { left + right\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn it_works() { let result = add(2, 2); assert_eq!(result, 4); }\n} 示例 11-1:由 cargo new 自动生成的测试模块和函数 现在让我们暂时忽略 tests 模块和 #[cfg(test)] 注解并只关注函数本身。注意 fn 行之前的 #[test]:这个属性表明这是一个测试函数,这样测试执行者就知道将其作为测试处理。tests 模块中也可以有非测试的函数来帮助我们建立通用场景或进行常见操作,必须每次都标明哪些函数是测试。 示例函数体通过使用 assert_eq! 宏来断言 2 加 2 等于 4。一个典型的测试的格式,就是像这个例子中的断言一样。接下来运行就可以看到测试通过。 cargo test 命令会运行项目中所有的测试,如示例 11-2 所示: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.57s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest tests::it_works ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 示例 11-2:运行自动生成测试的输出 Cargo 编译并运行了测试。可以看到 running 1 test 这一行。下一行显示了生成的测试函数的名称,它是 it_works,以及测试的运行结果,ok。接着可以看到全体测试运行结果的摘要:test result: ok. 意味着所有测试都通过了。1 passed; 0 failed 表示通过或失败的测试数量。 可以将一个测试标记为忽略这样在特定情况下它就不会运行;本章之后的 “除非特别指定否则忽略某些测试” 部分会介绍它。因为之前我们并没有将任何测试标记为忽略,所以摘要中会显示 0 ignored。我们也没有过滤需要运行的测试,所以摘要中会显示0 filtered out。在下一部分 “控制测试如何运行” 会讨论忽略和过滤测试。 0 measured 统计是针对性能测试的。性能测试(benchmark tests)在编写本书时,仍只能用于 Rust 开发版(nightly Rust)。请查看 性能测试的文档 了解更多。 测试输出中的以 Doc-tests adder 开头的这一部分是所有文档测试的结果。我们现在并没有任何文档测试,不过 Rust 会编译任何在 API 文档中的代码示例。这个功能帮助我们使文档和代码保持同步!在第十四章的 “文档注释作为测试” 部分会讲到如何编写文档测试。现在我们将忽略 Doc-tests 部分的输出。 让我们开始自定义测试来满足我们的需求。首先给 it_works 函数起个不同的名字,比如 exploration,像这样: 文件名:src/lib.rs pub fn add(left: usize, right: usize) -> usize { left + right\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn exploration() { let result = add(2, 2); assert_eq!(result, 4); }\n} 并再次运行 cargo test。现在输出中将出现 exploration 而不是 it_works: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.59s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest tests::exploration ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 现在让我们增加另一个测试,不过这一次是一个会失败的测试!当测试函数中出现 panic 时测试就失败了。每一个测试都在一个新线程中运行,当主线程发现测试线程异常了,就将对应测试标记为失败。第九章讲到了最简单的造成 panic 的方法:调用 panic! 宏。写入新测试 another 后, src/lib.rs 现在看起来如示例 11-3 所示: 文件名:src/lib.rs pub fn add(left: usize, right: usize) -> usize { left + right\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn exploration() { let result = add(2, 2); assert_eq!(result, 4); } #[test] fn another() { panic!(\"Make this test fail\"); }\n} 示例 11-3:增加第二个因调用了 panic! 而失败的测试 再次 cargo test 运行测试。输出应该看起来像示例 11-4,它表明 exploration 测试通过了而 another 失败了: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.72s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 2 tests\ntest tests::another ... FAILED\ntest tests::exploration ... ok failures: ---- tests::another stdout ----\nthread 'tests::another' panicked at src/lib.rs:17:9:\nMake this test fail\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::another test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 示例 11-4:一个测试通过和一个测试失败的测试结果 test tests::another 这一行是 FAILED 而不是 ok 了。在单独测试结果和摘要之间多了两个新的部分:第一个部分显示了测试失败的详细原因。在这个例子中,我们看到 another 因为在 src/lib.rs 的第 10 行 panicked at 'Make this test fail' 而失败的详细信息。下一部分列出了所有失败的测试,这在有很多测试和很多失败测试的详细输出时很有帮助。我们可以通过使用失败测试的名称来只运行这个测试,以便调试;下一部分 “控制测试如何运行” 会讲到更多运行测试的方法。 最后是摘要行:总体上讲,测试结果是 FAILED。有一个测试通过和一个测试失败。 现在我们见过不同场景中测试结果是什么样子的了,再来看看除 panic! 之外的一些在测试中有帮助的宏吧。","breadcrumbs":"编写自动化测试 » 如何编写测试 » 测试函数剖析","id":"198","title":"测试函数剖析"},"199":{"body":"assert! 宏由标准库提供,在希望确保测试中一些条件为 true 时非常有用。需要向 assert! 宏提供一个求值为布尔值的参数。如果值是 true,assert! 什么也不做,同时测试会通过。如果值为 false,assert! 调用 panic! 宏,这会导致测试失败。assert! 宏帮助我们检查代码是否以期望的方式运行。 回忆一下第五章中,示例 5-15 中有一个 Rectangle 结构体和一个 can_hold 方法,在示例 11-5 中再次使用它们。将它们放进 src/lib.rs 并使用 assert! 宏编写一些测试。 文件名:src/lib.rs #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} impl Rectangle { fn can_hold(&self, other: &Rectangle) -> bool { self.width > other.width && self.height > other.height }\n} 示例 11-5:第五章中 Rectangle 结构体和其 can_hold 方法 can_hold 方法返回一个布尔值,这意味着它完美符合 assert! 宏的使用场景。在示例 11-6 中,让我们编写一个 can_hold 方法的测试来作为练习,这里创建一个长为 8 宽为 7 的 Rectangle 实例,并假设它可以放得下另一个长为 5 宽为 1 的 Rectangle 实例: 文件名:src/lib.rs # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# # impl Rectangle {\n# fn can_hold(&self, other: &Rectangle) -> bool {\n# self.width > other.width && self.height > other.height\n# }\n# }\n# #[cfg(test)]\nmod tests { use super::*; #[test] fn larger_can_hold_smaller() { let larger = Rectangle { width: 8, height: 7, }; let smaller = Rectangle { width: 5, height: 1, }; assert!(larger.can_hold(&smaller)); }\n} 示例 11-6:一个 can_hold 的测试,检查一个较大的矩形确实能放得下一个较小的矩形 注意在 tests 模块中新增加了一行:use super::*;。tests 是一个普通的模块,它遵循第七章 “路径用于引用模块树中的项” 部分介绍的可见性规则。因为这是一个内部模块,要测试外部模块中的代码,需要将其引入到内部模块的作用域中。这里选择使用 glob 全局导入,以便在 tests 模块中使用所有在外部模块定义的内容。 我们将测试命名为 larger_can_hold_smaller,并创建所需的两个 Rectangle 实例。接着调用 assert! 宏并传递 larger.can_hold(&smaller) 调用的结果作为参数。这个表达式预期会返回 true,所以测试应该通过。让我们拭目以待! $ cargo test Compiling rectangle v0.1.0 (file:///projects/rectangle) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e) running 1 test\ntest tests::larger_can_hold_smaller ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests rectangle running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 它确实通过了!再来增加另一个测试,这一回断言一个更小的矩形不能放下一个更大的矩形: 文件名:src/lib.rs # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# # impl Rectangle {\n# fn can_hold(&self, other: &Rectangle) -> bool {\n# self.width > other.width && self.height > other.height\n# }\n# }\n# #[cfg(test)]\nmod tests { use super::*; #[test] fn larger_can_hold_smaller() { // --snip--\n# let larger = Rectangle {\n# width: 8,\n# height: 7,\n# };\n# let smaller = Rectangle {\n# width: 5,\n# height: 1,\n# };\n# # assert!(larger.can_hold(&smaller)); } #[test] fn smaller_cannot_hold_larger() { let larger = Rectangle { width: 8, height: 7, }; let smaller = Rectangle { width: 5, height: 1, }; assert!(!smaller.can_hold(&larger)); }\n} 因为这里 can_hold 函数的正确结果是 false ,我们需要将这个结果取反后传递给 assert! 宏。因此 can_hold 返回 false 时测试就会通过: $ cargo test Compiling rectangle v0.1.0 (file:///projects/rectangle) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e) running 2 tests\ntest tests::larger_can_hold_smaller ... ok\ntest tests::smaller_cannot_hold_larger ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests rectangle running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 两个通过的测试!现在让我们看看如果引入一个 bug 的话测试结果会发生什么。将 can_hold 方法中比较长度时本应使用大于号的地方改成小于号: # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# // --snip--\nimpl Rectangle { fn can_hold(&self, other: &Rectangle) -> bool { self.width < other.width && self.height > other.height }\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn larger_can_hold_smaller() {\n# let larger = Rectangle {\n# width: 8,\n# height: 7,\n# };\n# let smaller = Rectangle {\n# width: 5,\n# height: 1,\n# };\n# # assert!(larger.can_hold(&smaller));\n# }\n# # #[test]\n# fn smaller_cannot_hold_larger() {\n# let larger = Rectangle {\n# width: 8,\n# height: 7,\n# };\n# let smaller = Rectangle {\n# width: 5,\n# height: 1,\n# };\n# # assert!(!smaller.can_hold(&larger));\n# }\n# } 现在运行测试会产生: $ cargo test Compiling rectangle v0.1.0 (file:///projects/rectangle) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e) running 2 tests\ntest tests::larger_can_hold_smaller ... FAILED\ntest tests::smaller_cannot_hold_larger ... ok failures: ---- tests::larger_can_hold_smaller stdout ----\nthread 'tests::larger_can_hold_smaller' panicked at src/lib.rs:28:9:\nassertion failed: larger.can_hold(&smaller)\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::larger_can_hold_smaller test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 我们的测试捕获了 bug!因为 larger.length 是 8 而 smaller.length 是 5,can_hold 中的长度比较现在因为 8 不小于 5 而返回 false。","breadcrumbs":"编写自动化测试 » 如何编写测试 » 使用 assert! 宏来检查结果","id":"199","title":"使用 assert! 宏来检查结果"},"2":{"body":"ch00-00-introduction.md commit 1fb74c3f1d8aeba39373e9f4cdb9a4bdca95604f 注意:此书的英文原版与 No Starch Press 出版的《 The Rust Programming Language 》纸质版和电子版一致。 欢迎阅读《Rust 程序设计语言》,这是一本关于 Rust 的入门书籍。Rust 程序设计语言能帮助你编写更快、更可靠的软件。在编程语言设计中,高层的工程学与底层的控制往往是难以兼得的;而 Rust 则试图挑战这一矛盾。通过平衡强大的技术能力与优秀的开发者体验,Rust 为你提供了控制底层细节(如内存使用)的选项,而无需承受通常与此类控制相关的所有繁琐细节。","breadcrumbs":"简介 » 简介","id":"2","title":"简介"},"20":{"body":"ch01-02-hello-world.md commit 1fb74c3f1d8aeba39373e9f4cdb9a4bdca95604f 既然安装好了 Rust,是时候来编写第一个 Rust 程序了。当学习一门新语言的时候,使用该语言在屏幕上打印 Hello, world! 是一项传统,我们将沿用这一传统! 注意:本书假设你熟悉基本的命令行操作。Rust 对于你的编辑器、工具,以及代码位于何处并没有特定的要求,如果你更倾向于使用集成开发环境(IDE),而不是命令行,请尽管使用你喜欢的 IDE。目前很多 IDE 都在一定程度上支持 Rust;查看 IDE 文档以了解更多细节。Rust 团队一直致力于借助 rust-analyzer 提供强大的 IDE 支持。详见 附录 D 。","breadcrumbs":"入门指南 » Hello, World! » Hello, World!","id":"20","title":"Hello, World!"},"200":{"body":"测试功能的一个常用方法是将需要测试代码的值与期望值做比较,并检查是否相等。可以通过向 assert! 宏传递一个使用 == 运算符的表达式来做到。不过这个操作实在是太常见了,以至于标准库提供了一对宏来更方便的处理这些操作 —— assert_eq! 和 assert_ne!。这两个宏分别比较两个值是相等还是不相等。当断言失败时它们也会打印出这两个值具体是什么,以便于观察测试 为什么 失败,而 assert! 只会打印出它从 == 表达式中得到了 false 值,而不是打印导致 false 的两个值。 示例 11-7 中,让我们编写一个对其参数加二并返回结果的函数 add_two。接着使用 assert_eq! 宏测试这个函数。 文件名:src/lib.rs pub fn add_two(a: usize) -> usize { a + 2\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn it_adds_two() { let result = add_two(2); assert_eq!(result, 4); }\n} 示例 11-7:使用 assert_eq! 宏测试 add_two 函数 测试通过了! $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest tests::it_adds_two ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 我们传递给 assert_eq! 宏的第一个参数 4 ,它等于调用 add_two(2) 的结果。测试中的这一行 test tests::it_adds_two ... ok 中 ok 表明测试通过! 在代码中引入一个 bug 来看看使用 assert_eq! 的测试失败是什么样的。修改 add_two 函数的实现使其加 3: pub fn add_two(a: usize) -> usize { a + 3\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn it_adds_two() {\n# let result = add_two(2);\n# assert_eq!(result, 4);\n# }\n# } 再次运行测试: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.61s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest tests::it_adds_two ... FAILED failures: ---- tests::it_adds_two stdout ----\nthread 'tests::it_adds_two' panicked at src/lib.rs:12:9:\nassertion `left == right` failed left: 5 right: 4\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::it_adds_two test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 测试捕获到了 bug!it_adds_two 测试失败,错误信息告诉我们断言失败了,它告诉我们 assertion failed: `(left == right)` 以及 left 和 right 的值是什么。这个错误信息有助于我们开始调试:它说 assert_eq! 的 left 参数是 4,而 right 参数,也就是 add_two(2) 的结果,是 5。可以想象当有很多测试在运行时这些信息是多么的有用。 需要注意的是,在一些语言和测试框架中,断言两个值相等的函数的参数被称为 expected 和 actual,而且指定参数的顺序非常重要。然而在 Rust 中,它们则叫做 left 和 right,同时指定期望的值和被测试代码产生的值的顺序并不重要。这个测试中的断言也可以写成 assert_eq!(add_two(2), 4),这时失败信息仍同样是 assertion failed: `(left == right)`。 assert_ne! 宏在传递给它的两个值不相等时通过,而在相等时失败。在代码按预期运行,我们不确定值 会 是什么,不过能确定值绝对 不会 是什么的时候,这个宏最有用处。例如,如果一个函数保证会以某种方式改变其输出,不过这种改变方式是由运行测试时是星期几来决定的,这时最好的断言可能就是函数的输出不等于其输入。 assert_eq! 和 assert_ne! 宏在底层分别使用了 == 和 !=。当断言失败时,这些宏会使用调试格式打印出其参数,这意味着被比较的值必须实现了 PartialEq 和 Debug trait。所有的基本类型和大部分标准库类型都实现了这些 trait。对于自定义的结构体和枚举,需要实现 PartialEq 才能断言它们的值是否相等。需要实现 Debug 才能在断言失败时打印它们的值。因为这两个 trait 都是派生 trait,如第五章示例 5-12 所提到的,通常可以直接在结构体或枚举上添加 #[derive(PartialEq, Debug)] 注解。附录 C “可派生 trait” 中有更多关于这些和其他派生 trait 的详细信息。","breadcrumbs":"编写自动化测试 » 如何编写测试 » 使用 assert_eq! 和 assert_ne! 宏来测试相等","id":"200","title":"使用 assert_eq! 和 assert_ne! 宏来测试相等"},"201":{"body":"你也可以向 assert!、assert_eq! 和 assert_ne! 宏传递一个可选的失败信息参数,可以在测试失败时将自定义失败信息一同打印出来。任何在 assert! 的一个必需参数和 assert_eq! 和 assert_ne! 的两个必需参数之后指定的参数都会传递给 format! 宏(在第八章的 “使用 + 运算符或 format! 宏拼接字符串” 部分讨论过),所以可以传递一个包含 {} 占位符的格式字符串和需要放入占位符的值。自定义信息有助于记录断言的意义;当测试失败时就能更好的理解代码出了什么问题。 例如,比如说有一个根据人名进行问候的函数,而我们希望测试将传递给函数的人名显示在输出中: 文件名:src/lib.rs pub fn greeting(name: &str) -> String { format!(\"Hello {name}!\")\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn greeting_contains_name() { let result = greeting(\"Carol\"); assert!(result.contains(\"Carol\")); }\n} 这个程序的需求还没有被确定,因此问候文本开头的 Hello 文本很可能会改变。然而我们并不想在需求改变时不得不更新测试,所以相比检查 greeting 函数返回的确切值,我们将仅仅断言输出的文本中包含输入参数。 让我们通过将 greeting 改为不包含 name 在代码中引入一个 bug 来测试失败时是怎样的: pub fn greeting(name: &str) -> String { String::from(\"Hello!\")\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn greeting_contains_name() {\n# let result = greeting(\"Carol\");\n# assert!(result.contains(\"Carol\"));\n# }\n# } 运行测试会产生: $ cargo test Compiling greeter v0.1.0 (file:///projects/greeter) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.91s Running unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a) running 1 test\ntest tests::greeting_contains_name ... FAILED failures: ---- tests::greeting_contains_name stdout ----\nthread 'tests::greeting_contains_name' panicked at src/lib.rs:12:9:\nassertion failed: result.contains(\"Carol\")\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::greeting_contains_name test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 结果仅仅告诉了我们断言失败了和失败的行号。一个更有用的失败信息应该打印出 greeting 函数的值。让我们为测试函数增加一个自定义失败信息参数:带占位符的格式字符串,以及 greeting 函数的值: # pub fn greeting(name: &str) -> String {\n# String::from(\"Hello!\")\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# #[test] fn greeting_contains_name() { let result = greeting(\"Carol\"); assert!( result.contains(\"Carol\"), \"Greeting did not contain name, value was `{result}`\" ); }\n# } 现在如果再次运行测试,将会看到更有价值的信息: $ cargo test Compiling greeter v0.1.0 (file:///projects/greeter) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.93s Running unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a) running 1 test\ntest tests::greeting_contains_name ... FAILED failures: ---- tests::greeting_contains_name stdout ----\nthread 'tests::greeting_contains_name' panicked at src/lib.rs:12:9:\nGreeting did not contain name, value was `Hello!`\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::greeting_contains_name test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 可以在测试输出中看到所取得的确切的值,这会帮助我们理解真正发生了什么,而不是期望发生什么。","breadcrumbs":"编写自动化测试 » 如何编写测试 » 自定义失败信息","id":"201","title":"自定义失败信息"},"202":{"body":"除了检查返回值之外,检查代码是否按照期望处理错误也是很重要的。例如,考虑第九章示例 9-10 创建的 Guess 类型。其他使用 Guess 的代码都是基于 Guess 实例仅有的值范围在 1 到 100 的前提。可以编写一个测试来确保创建一个超出范围的值的 Guess 实例会 panic。 可以通过对函数增加另一个属性 should_panic 来实现这些。这个属性在函数中的代码 panic 时会通过,而在其中的代码没有 panic 时失败。 示例 11-8 展示了一个检查 Guess::new 是否按照我们的期望出错的测试: 文件名:src/lib.rs pub struct Guess { value: i32,\n} impl Guess { pub fn new(value: i32) -> Guess { if value < 1 || value > 100 { panic!(\"Guess value must be between 1 and 100, got {value}.\"); } Guess { value } }\n} #[cfg(test)]\nmod tests { use super::*; #[test] #[should_panic] fn greater_than_100() { Guess::new(200); }\n} 示例 11-8:测试会造成 panic! 的条件 #[should_panic] 属性位于 #[test] 之后,对应的测试函数之前。让我们看看测试通过时它是什么样子: $ cargo test Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d) running 1 test\ntest tests::greater_than_100 - should panic ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests guessing_game running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 看起来不错!现在在代码中引入 bug,移除 new 函数在值大于 100 时会 panic 的条件: # pub struct Guess {\n# value: i32,\n# }\n# // --snip--\nimpl Guess { pub fn new(value: i32) -> Guess { if value < 1 { panic!(\"Guess value must be between 1 and 100, got {value}.\"); } Guess { value } }\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# #[should_panic]\n# fn greater_than_100() {\n# Guess::new(200);\n# }\n# } 如果运行示例 11-8 的测试,它会失败: $ cargo test Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.62s Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d) running 1 test\ntest tests::greater_than_100 - should panic ... FAILED failures: ---- tests::greater_than_100 stdout ----\nnote: test did not panic as expected failures: tests::greater_than_100 test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 这回并没有得到非常有用的信息,不过一旦我们观察测试函数,会发现它标注了 #[should_panic]。这个错误意味着代码中测试函数 Guess::new(200) 并没有产生 panic。 然而 should_panic 测试结果可能会非常含糊不清。should_panic 甚至在一些不是我们期望的原因而导致 panic 时也会通过。为了使 should_panic 测试结果更精确,我们可以给 should_panic 属性增加一个可选的 expected 参数。测试工具会确保错误信息中包含其提供的文本。例如,考虑示例 11-9 中修改过的 Guess,这里 new 函数根据其值是过大还或者过小而提供不同的 panic 信息: 文件名:src/lib.rs # pub struct Guess {\n# value: i32,\n# }\n# // --snip-- impl Guess { pub fn new(value: i32) -> Guess { if value < 1 { panic!( \"Guess value must be greater than or equal to 1, got {value}.\" ); } else if value > 100 { panic!( \"Guess value must be less than or equal to 100, got {value}.\" ); } Guess { value } }\n} #[cfg(test)]\nmod tests { use super::*; #[test] #[should_panic(expected = \"less than or equal to 100\")] fn greater_than_100() { Guess::new(200); }\n} 示例 11-9:一个会带有特定错误信息的 panic! 条件的测试 这个测试会通过,因为 should_panic 属性中 expected 参数提供的值是 Guess::new 函数 panic 信息的子串。我们可以指定期望的整个 panic 信息,在这个例子中是 Guess value must be less than or equal to 100, got 200. 。 expected 信息的选择取决于 panic 信息有多独特或动态,和你希望测试有多准确。在这个例子中,错误信息的子字符串足以确保函数在 else if value > 100 的情况下运行。 为了观察带有 expected 信息的 should_panic 测试失败时会发生什么,让我们再次引入一个 bug,将 if value < 1 和 else if value > 100 的代码块对换: # pub struct Guess {\n# value: i32,\n# }\n# # impl Guess {\n# pub fn new(value: i32) -> Guess { if value < 1 { panic!( \"Guess value must be less than or equal to 100, got {value}.\" ); } else if value > 100 { panic!( \"Guess value must be greater than or equal to 1, got {value}.\" ); }\n# # Guess { value }\n# }\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# #[should_panic(expected = \"less than or equal to 100\")]\n# fn greater_than_100() {\n# Guess::new(200);\n# }\n# } 这一次运行 should_panic 测试,它会失败: $ cargo test Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.66s Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d) running 1 test\ntest tests::greater_than_100 - should panic ... FAILED failures: ---- tests::greater_than_100 stdout ----\nthread 'tests::greater_than_100' panicked at src/lib.rs:12:13:\nGuess value must be greater than or equal to 1, got 200.\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\nnote: panic did not contain expected string panic message: `\"Guess value must be greater than or equal to 1, got 200.\"`, expected substring: `\"less than or equal to 100\"` failures: tests::greater_than_100 test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 失败信息表明测试确实如期望 panic 了,不过 panic 信息中并没有包含 expected 信息 'Guess value must be less than or equal to 100'。而我们得到的 panic 信息是 'Guess value must be greater than or equal to 1, got 200.'。这样就可以开始寻找 bug 在哪了!","breadcrumbs":"编写自动化测试 » 如何编写测试 » 使用 should_panic 检查 panic","id":"202","title":"使用 should_panic 检查 panic"},"203":{"body":"目前为止,我们编写的测试在失败时都会 panic。我们也可以使用 Result 编写测试!这是一个延伸自示例 11-1 的测试,使用 Result 重写,并在失败时返回 Err 而非 panic: pub fn add(left: usize, right: usize) -> usize { left + right\n} #[cfg(test)]\nmod tests { use super::*; // ANCHOR: here #[test] fn it_works() -> Result<(), String> { let result = add(2, 2); if result == 4 { Ok(()) } else { Err(String::from(\"two plus two does not equal four\")) } } // ANCHOR_END: here\n} 现在 it_works 函数的返回值类型为 Result<(), String>。在函数体中,不同于调用 assert_eq! 宏,而是在测试通过时返回 Ok(()),在测试失败时返回带有 String 的 Err。 这样编写测试来返回 Result 就可以在函数体中使用问号运算符,如此可以方便的编写任何运算符会返回 Err 成员的测试。 不能对这些使用 Result 的测试使用 #[should_panic] 注解。为了断言一个操作返回 Err 成员, 不要 使用对 Result 值使用问号表达式(?)。而是使用 assert!(value.is_err())。 现在你知道了几种编写测试的方法,让我们看看运行测试时会发生什么,以及可以用于 cargo test 的不同选项。","breadcrumbs":"编写自动化测试 » 如何编写测试 » 将 Result 用于测试","id":"203","title":"将 Result 用于测试"},"204":{"body":"ch11-02-running-tests.md commit 34314c10f699cc882d4e0b06f2a24bd37a5435f2 就像 cargo run 会编译代码并运行生成的二进制文件一样,cargo test 在测试模式下编译代码并运行生成的测试二进制文件。cargo test 产生的二进制文件的默认行为是并发运行所有的测试,并截获测试运行过程中产生的输出,阻止它们被显示出来,使得阅读测试结果相关的内容变得更容易。不过可以指定命令行参数来改变 cargo test 的默认行为。 可以将一部分命令行参数传递给 cargo test,而将另外一部分传递给生成的测试二进制文件。为了分隔这两种参数,需要先列出传递给 cargo test 的参数,接着是分隔符 --,再之后是传递给测试二进制文件的参数。运行 cargo test --help 会提示 cargo test 的有关参数,而运行 cargo test -- --help 可以提示在分隔符之后使用的有关参数。","breadcrumbs":"编写自动化测试 » 控制测试如何运行 » 控制测试如何运行","id":"204","title":"控制测试如何运行"},"205":{"body":"当运行多个测试时,Rust 默认使用线程来并行运行。这意味着测试会更快地运行完毕,所以你可以更快的得到代码能否工作的反馈。因为测试是在同时运行的,你应该确保测试不能相互依赖,或依赖任何共享的状态,包括依赖共享的环境,比如当前工作目录或者环境变量。 举个例子,每一个测试都运行一些代码,假设这些代码都在硬盘上创建一个 test-output.txt 文件并写入一些数据。接着每一个测试都读取文件中的数据并断言这个文件包含特定的值,而这个值在每个测试中都是不同的。因为所有测试都是同时运行的,一个测试可能会在另一个测试读写文件过程中修改了文件。那么第二个测试就会失败,并不是因为代码不正确,而是因为测试并行运行时相互干扰。一个解决方案是使每一个测试读写不同的文件;另一个解决方案是一次运行一个测试。 如果你不希望测试并行运行,或者想要更加精确的控制线程的数量,可以传递 --test-threads 参数和希望使用线程的数量给测试二进制文件。例如: $ cargo test -- --test-threads=1 这里将测试线程设置为 1,告诉程序不要使用任何并行机制。这也会比并行运行花费更多时间,不过在有共享的状态时,测试就不会潜在的相互干扰了。","breadcrumbs":"编写自动化测试 » 控制测试如何运行 » 并行或连续的运行测试","id":"205","title":"并行或连续的运行测试"},"206":{"body":"默认情况下,当测试通过时,Rust 的测试库会截获打印到标准输出的所有内容。比如在测试中调用了 println! 而测试通过了,我们将不会在终端看到 println! 的输出:只会看到说明测试通过的提示行。如果测试失败了,则会看到所有标准输出和其他错误信息。 例如,示例 11-10 有一个无意义的函数,它打印出其参数的值并接着返回 10。接着还有一个会通过的测试和一个会失败的测试: 文件名:src/lib.rs fn prints_and_returns_10(a: i32) -> i32 { println!(\"I got the value {a}\"); 10\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn this_test_will_pass() { let value = prints_and_returns_10(4); assert_eq!(value, 10); } #[test] fn this_test_will_fail() { let value = prints_and_returns_10(8); assert_eq!(value, 5); }\n} 示例 11-10:一个调用了 println! 的函数的测试 运行 cargo test 将会看到这些测试的输出: $ cargo test Compiling silly-function v0.1.0 (file:///projects/silly-function) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s Running unittests src/lib.rs (target/debug/deps/silly_function-160869f38cff9166) running 2 tests\ntest tests::this_test_will_fail ... FAILED\ntest tests::this_test_will_pass ... ok failures: ---- tests::this_test_will_fail stdout ----\nI got the value 8\nthread 'tests::this_test_will_fail' panicked at src/lib.rs:19:9:\nassertion `left == right` failed left: 10 right: 5\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::this_test_will_fail test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 注意输出中不会出现测试通过时打印的内容,即 I got the value 4。因为当测试通过时,这些输出会被截获。失败测试的输出 I got the value 8 ,则出现在输出的测试摘要部分,同时也显示了测试失败的原因。 如果你希望也能看到通过的测试中打印的值,也可以在结尾加上 --show-output 告诉 Rust 显示成功测试的输出。 $ cargo test -- --show-output 使用 --show-output 参数再次运行示例 11-10 中的测试会显示如下输出: $ cargo test -- --show-output Compiling silly-function v0.1.0 (file:///projects/silly-function) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.60s Running unittests src/lib.rs (target/debug/deps/silly_function-160869f38cff9166) running 2 tests\ntest tests::this_test_will_fail ... FAILED\ntest tests::this_test_will_pass ... ok successes: ---- tests::this_test_will_pass stdout ----\nI got the value 4 successes: tests::this_test_will_pass failures: ---- tests::this_test_will_fail stdout ----\nI got the value 8\nthread 'tests::this_test_will_fail' panicked at src/lib.rs:19:9:\nassertion `left == right` failed left: 10 right: 5\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::this_test_will_fail test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib`","breadcrumbs":"编写自动化测试 » 控制测试如何运行 » 显示函数输出","id":"206","title":"显示函数输出"},"207":{"body":"有时运行整个测试集会耗费很长时间。如果你负责特定位置的代码,你可能会希望只运行与这些代码相关的测试。你可以向 cargo test 传递所希望运行的测试名称的参数来选择运行哪些测试。 为了展示如何运行部分测试,示例 11-11 为 add_two 函数创建了三个测试,我们可以选择具体运行哪一个: 文件名:src/lib.rs pub fn add_two(a: usize) -> usize { a + 2\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn add_two_and_two() { let result = add_two(2); assert_eq!(result, 4); } #[test] fn add_three_and_two() { let result = add_two(3); assert_eq!(result, 5); } #[test] fn one_hundred() { let result = add_two(100); assert_eq!(result, 102); }\n} 示例 11-11:不同名称的三个测试 如果没有传递任何参数就运行测试,如你所见,所有测试都会并行运行: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.62s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 3 tests\ntest tests::add_three_and_two ... ok\ntest tests::add_two_and_two ... ok\ntest tests::one_hundred ... ok test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 运行单个测试 可以向 cargo test 传递任意测试的名称来只运行这个测试: $ cargo test one_hundred Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.69s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest tests::one_hundred ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s 只有名称为 one_hundred 的测试被运行了;因为其余两个测试并不匹配这个名称。测试输出在摘要行的结尾显示了 2 filtered out 表明还存在比本次所运行的测试更多的测试没有被运行。 不能像这样指定多个测试名称;只有传递给 cargo test 的第一个值才会被使用。不过有运行多个测试的方法。 过滤运行多个测试 我们可以指定部分测试的名称,任何名称匹配这个名称的测试会被运行。例如,因为头两个测试的名称包含 add,可以通过 cargo test add 来运行这两个测试: $ cargo test add Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.61s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 2 tests\ntest tests::add_three_and_two ... ok\ntest tests::add_two_and_two ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s 这运行了所有名字中带有 add 的测试,也过滤掉了名为 one_hundred 的测试。同时注意测试所在的模块也是测试名称的一部分,所以可以通过模块名来运行一个模块中的所有测试。","breadcrumbs":"编写自动化测试 » 控制测试如何运行 » 通过指定名字来运行部分测试","id":"207","title":"通过指定名字来运行部分测试"},"208":{"body":"有时一些特定的测试执行起来是非常耗费时间的,所以在大多数运行 cargo test 的时候希望能排除它们。虽然可以通过参数列举出所有希望运行的测试来做到,也可以使用 ignore 属性来标记耗时的测试并排除它们,如下所示: 文件名:src/lib.rs pub fn add(left: usize, right: usize) -> usize { left + right\n} // ANCHOR: here\n#[cfg(test)]\nmod tests { use super::*; #[test] fn it_works() { let result = add(2, 2); assert_eq!(result, 4); } #[test] #[ignore] fn expensive_test() { // 需要运行一个小时的代码 }\n}\n// ANCHOR_END: here 对于想要排除的测试,我们在 #[test] 之后增加了 #[ignore] 行。现在如果运行测试,就会发现 it_works 运行了,而 expensive_test 没有运行: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.60s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 2 tests\ntest tests::expensive_test ... ignored\ntest tests::it_works ... ok test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s expensive_test 被列为 ignored,如果我们只希望运行被忽略的测试,可以使用 cargo test -- --ignored: $ cargo test -- --ignored Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.61s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest expensive_test ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 通过控制运行哪些测试,你可以确保能够快速地运行 cargo test 。当你需要运行 ignored 的测试时,可以执行 cargo test -- --ignored。如果你希望不管是否忽略都要运行全部测试,可以运行 cargo test -- --include-ignored。","breadcrumbs":"编写自动化测试 » 控制测试如何运行 » 除非特别指定否则忽略某些测试","id":"208","title":"除非特别指定否则忽略某些测试"},"209":{"body":"ch11-03-test-organization.md commit 654d8902d380dbb8dd94ed2e548dfc0aa80c07cb 本章一开始就提到,测试是一个复杂的概念,而且不同的开发者也采用不同的技术和组织。Rust 社区倾向于根据测试的两个主要分类来考虑问题: 单元测试 ( unit tests )与 集成测试 ( integration tests )。单元测试倾向于更小而更集中,在隔离的环境中一次测试一个模块,或者是测试私有接口。而集成测试对于你的库来说则完全是外部的。它们与其他外部代码一样,通过相同的方式使用你的代码,只测试公有接口而且每个测试都有可能会测试多个模块。 为了保证你的库能够按照你的预期运行,从独立和整体的角度编写这两类测试都是非常重要的。","breadcrumbs":"编写自动化测试 » 测试的组织结构 » 测试的组织结构","id":"209","title":"测试的组织结构"},"21":{"body":"首先创建一个存放 Rust 代码的目录。Rust 并不关心代码的存放位置,不过对于本书的练习和项目来说,我们建议你在 home 目录中创建 projects 目录,并将你的所有项目存放在这里。 打开终端并输入如下命令创建 projects 目录,并在 projects 目录中为 “Hello, world!” 项目创建一个目录。 对于 Linux、macOS 和 Windows PowerShell,输入: $ mkdir ~/projects\n$ cd ~/projects\n$ mkdir hello_world\n$ cd hello_world 对于 Windows CMD,输入: > mkdir \"%USERPROFILE%\\projects\"\n> cd /d \"%USERPROFILE%\\projects\"\n> mkdir hello_world\n> cd hello_world","breadcrumbs":"入门指南 » Hello, World! » 创建项目目录","id":"21","title":"创建项目目录"},"210":{"body":"单元测试的目的是在与其他部分隔离的环境中测试每一个单元的代码,以便于快速而准确地验证某个单元的代码功能是否符合预期。单元测试与它们要测试的代码共同存放在位于 src 目录下相同的文件中。规范是在每个文件中创建包含测试函数的 tests 模块,并使用 cfg(test) 标注模块。 测试模块和 #[cfg(test)] 测试模块的 #[cfg(test)] 注解告诉 Rust 只在执行 cargo test 时才编译和运行测试代码,而在运行 cargo build 时不这么做。这在只希望构建库的时候可以节省编译时间,并且因为它们并没有包含测试,所以能减少编译产生的文件的大小。与之对应的集成测试因为位于另一个文件夹,所以它们并不需要 #[cfg(test)] 注解。然而单元测试位于与源码相同的文件中,所以你需要使用 #[cfg(test)] 来指定它们不应该被包含进编译结果中。 回忆本章第一部分新建的 adder 项目,Cargo 为我们生成了如下代码: 文件名:src/lib.rs pub fn add(left: usize, right: usize) -> usize { left + right\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn it_works() { let result = add(2, 2); assert_eq!(result, 4); }\n} 上述代码就是自动生成的测试模块。cfg 属性代表 配置 ( configuration ) ,它告诉 Rust,接下来的项,只有在给定特定配置选项时,才会被包含。在这种情况下,配置选项是 test,即 Rust 所提供的用于编译和运行测试的配置选项。通过使用 cfg 属性,Cargo 只会在我们主动使用 cargo test 运行测试时才编译测试代码。这包括测试模块中可能存在的帮助函数,以及标注为 #[test] 的函数。 测试私有函数 测试社区中一直存在关于是否应该对私有函数直接进行测试的论战,而在其他语言中想要测试私有函数是一件困难的,甚至是不可能的事。不过无论你坚持哪种测试意识形态,Rust 的私有性规则确实允许你测试私有函数。考虑示例 11-12 中带有私有函数 internal_adder 的代码: 文件名:src/lib.rs pub fn add_two(a: usize) -> usize { internal_adder(a, 2)\n} fn internal_adder(left: usize, right: usize) -> usize { left + right\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn internal() { let result = internal_adder(2, 2); assert_eq!(result, 4); }\n} 示例 11-12:测试私有函数 注意 internal_adder 函数并没有标记为 pub。测试也不过是 Rust 代码,同时 tests 也仅仅是另一个模块。正如 “路径用于引用模块树中的项” 部分所说,子模块的项可以使用其上级模块的项。在测试中,我们通过 use super::* 将 test 模块的父模块的所有项引入了作用域,接着测试调用了 internal_adder。如果你并不认为应该测试私有函数,Rust 也不会强迫你这么做。","breadcrumbs":"编写自动化测试 » 测试的组织结构 » 单元测试","id":"210","title":"单元测试"},"211":{"body":"在 Rust 中,集成测试对于你需要测试的库来说完全是外部的。同其他使用库的代码一样使用库文件,也就是说它们只能调用一部分库中的公有 API。集成测试的目的是测试库的多个部分能否一起正常工作。一些单独能正确运行的代码单元集成在一起也可能会出现问题,所以集成测试的覆盖率也是很重要的。为了创建集成测试,你需要先创建一个 tests 目录。 tests 目录 为了编写集成测试,需要在项目根目录创建一个 tests 目录,与 src 同级。Cargo 知道如何去寻找这个目录中的集成测试文件。接着可以随意在这个目录中创建任意多的测试文件,Cargo 会将每一个文件当作单独的 crate 来编译。 让我们来创建一个集成测试。保留示例 11-12 中 src/lib.rs 的代码。创建一个 tests 目录,新建一个文件 tests/integration_test.rs 。目录结构应该看起来像这样: adder\n├── Cargo.lock\n├── Cargo.toml\n├── src\n│ └── lib.rs\n└── tests └── integration_test.rs 将示例 11-13 中的代码输入到 tests/integration_test.rs 文件中。 文件名:tests/integration_test.rs use adder::add_two; #[test]\nfn it_adds_two() { let result = add_two(2); assert_eq!(result, 4);\n} 示例 11-13:一个 adder crate 中函数的集成测试 因为每一个 tests 目录中的测试文件都是完全独立的 crate,所以需要在每一个文件中导入库。为此与单元测试不同,我们需要在文件顶部添加 use adder。 并不需要将 tests/integration_test.rs 中的任何代码标注为 #[cfg(test)]。 tests 文件夹在 Cargo 中是一个特殊的文件夹,Cargo 只会在运行 cargo test 时编译这个目录中的文件。现在就运行 cargo test 试试: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 1.31s Running unittests src/lib.rs (target/debug/deps/adder-1082c4b063a8fbe6) running 1 test\ntest tests::internal ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running tests/integration_test.rs (target/debug/deps/integration_test-1082c4b063a8fbe6) running 1 test\ntest it_adds_two ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 现在有了三个部分的输出:单元测试、集成测试和文档测试。注意如果一个部分的任何测试失败,之后的部分都不会运行。例如如果一个单元测试失败,则不会有任何集成测试和文档测试的输出,因为这些测试只会在所有单元测试都通过后才会执行。 第一部分单元测试与我们之前见过的一样:每个单元测试一行(示例 11-12 中有一个叫做 internal 的测试),接着是一个单元测试的摘要行。 集成测试部分以行 Running tests/integration_test.rs开头。接下来每一行是一个集成测试中的测试函数,以及一个位于 Doc-tests adder 部分之前的集成测试的摘要行。 每一个集成测试文件有对应的测试结果部分,所以如果在 tests 目录中增加更多文件,测试结果中就会有更多集成测试结果部分。 我们仍然可以通过指定测试函数的名称作为 cargo test 的参数来运行特定集成测试。也可以使用 cargo test 的 --test 后跟文件的名称来运行某个特定集成测试文件中的所有测试: $ cargo test --test integration_test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.64s Running tests/integration_test.rs (target/debug/deps/integration_test-82e7799c1bc62298) running 1 test\ntest it_adds_two ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 这个命令只运行了 tests 目录中我们指定的文件 integration_test.rs 中的测试。 集成测试中的子模块 随着集成测试的增加,你可能希望在 tests 目录创建更多文件以便更好地组织它们,例如根据测试的功能来将测试分组。如前所述, tests 目录中的每一个文件都被编译成一个单独的 crate,这有助于创建独立的作用域,以便更接近于最终用户使用你的 crate 的方式。但这意味着, tests 目录中的文件的行为,和你在第七章中学习如何将代码分为模块和文件时,学到的 src 中的文件的行为不一样。 当你有一些在多个集成测试文件都会用到的帮助函数,而你尝试按照第七章 “将模块移动到其他文件” 部分的步骤将它们提取到一个通用的模块中时, tests 目录中文件行为的不同就会凸显出来。例如,如果我们可以创建 一个 tests/common.rs 文件并创建一个名叫 setup 的函数,我们希望这个函数能被多个测试文件的测试函数调用: 文件名:tests/common.rs pub fn setup() { // setup code specific to your library's tests would go here\n} 如果再次运行测试,将会在测试结果中看到一个新的对应 common.rs 文件的测试结果部分,即便这个文件并没有包含任何测试函数,也没有任何地方调用了 setup 函数: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.89s Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test\ntest tests::internal ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running tests/common.rs (target/debug/deps/common-92948b65e88960b4) running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running tests/integration_test.rs (target/debug/deps/integration_test-92948b65e88960b4) running 1 test\ntest it_adds_two ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 我们并不想要common 出现在测试结果中显示 running 0 tests 。我们只是希望其能被其他多个集成测试文件中调用罢了。 为了不让 common 出现在测试输出中,我们将创建 tests/common/mod.rs ,而不是创建 tests/common.rs 。现在项目目录结构看起来像这样: ├── Cargo.lock\n├── Cargo.toml\n├── src\n│ └── lib.rs\n└── tests ├── common │ └── mod.rs └── integration_test.rs 这是一种老的命名规范,正如第七章 “另一种文件路径” 中提到的 Rust 仍然理解它们。这样命名告诉 Rust 不要将 common 看作一个集成测试文件。将 setup 函数代码移动到 tests/common/mod.rs 并删除 tests/common.rs 文件之后,测试输出中将不会出现这一部分。 tests 目录中的子目录不会被作为单独的 crate 编译或作为一个测试结果部分出现在测试输出中。 一旦拥有了 tests/common/mod.rs ,就可以将其作为模块以便在任何集成测试文件中使用。这里是一个 tests/integration_test.rs 中调用 setup 函数的 it_adds_two 测试的例子: 文件名:tests/integration_test.rs use adder::add_two; mod common; #[test]\nfn it_adds_two() { common::setup(); let result = add_two(2); assert_eq!(result, 4);\n} 注意 mod common; 声明与示例 7-21 中展示的模块声明相同。接着在测试函数中就可以调用 common::setup() 了。 二进制 crate 的集成测试 如果项目是二进制 crate 并且只包含 src/main.rs 而没有 src/lib.rs ,这样就不可能在 tests 目录创建集成测试并使用 extern crate 导入 src/main.rs 中定义的函数。只有库 crate 才会向其他 crate 暴露了可供调用和使用的函数;二进制 crate 只意在单独运行。 这就是许多 Rust 二进制项目使用一个简单的 src/main.rs 调用 src/lib.rs 中的逻辑的原因之一。因为通过这种结构,集成测试 就可以 通过 extern crate 测试库 crate 中的主要功能了,而如果这些重要的功能没有问题的话, src/main.rs 中的少量代码也就会正常工作且不需要测试。","breadcrumbs":"编写自动化测试 » 测试的组织结构 » 集成测试","id":"211","title":"集成测试"},"212":{"body":"Rust 的测试功能提供了一个确保即使你改变了函数的实现方式,也能继续以期望的方式运行的途径。单元测试独立地验证库的不同部分,也能够测试私有函数实现细节。集成测试则检查多个部分是否能结合起来正确地工作,并像其他外部代码那样测试库的公有 API。即使 Rust 的类型系统和所有权规则可以帮助避免一些 bug,不过测试对于减少代码中不符合期望行为的逻辑 bug 仍然是很重要的。 让我们将本章和其他之前章节所学的知识组合起来,在下一章一起编写一个项目!","breadcrumbs":"编写自动化测试 » 测试的组织结构 » 总结","id":"212","title":"总结"},"213":{"body":"ch12-00-an-io-project.md commit 02a168ed346042f07010f8b65b4eeed623dd31d1 本章既是一个目前所学的很多技能的概括,也是一个更多标准库功能的探索。我们将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 技能。 Rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择,所以我们的项目将创建一个我们自己版本的经典命令行搜索工具:grep。grep 是 “ G lobally search a R egular E xpression and P rint.” 的首字母缩写。grep 最简单的使用场景是在特定文件中搜索指定字符串。为此,grep 获取一个文件路径和一个字符串作为参数,接着读取文件并找到其中包含字符串参数的行,然后打印出这些行。 在这个过程中,我们会展示如何让我们的命令行工具利用很多命令行工具中用到的终端功能。读取环境变量来使得用户可以配置工具的行为。打印到标准错误控制流(stderr)而不是标准输出(stdout),例如这样用户可以选择将成功输出重定向到文件中的同时仍然在屏幕上显示错误信息。 一位 Rust 社区的成员,Andrew Gallant,已经创建了一个功能完整且非常快速的 grep 版本,叫做 ripgrep。相比之下,我们的版本将非常简单,本章将教会你一些帮助理解像 ripgrep 这样真实项目的背景知识。 我们的 grep 项目将会结合之前所学的一些内容: 代码组织(使用 第七章 学习的模块) vector 和字符串( 第八章 ,集合) 错误处理( 第九章 ) 合理的使用 trait 和生命周期( 第十章 ) 测试( 第十一章 ) 另外还会简要的讲到闭包、迭代器和 trait 对象,它们分别会在 第十三章 和 第十八章 中详细介绍。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 一个 I/O 项目:构建一个命令行程序","id":"213","title":"一个 I/O 项目:构建一个命令行程序"},"214":{"body":"ch12-01-accepting-command-line-arguments.md commit 02a168ed346042f07010f8b65b4eeed623dd31d1 一如既往使用 cargo new 新建一个项目,我们称之为 minigrep 以便与可能已经安装在系统上的 grep 工具相区别: $ cargo new minigrep Created binary (application) `minigrep` project\n$ cd minigrep 第一个任务是让 minigrep 能够接受两个命令行参数:文件路径和要搜索的字符串。也就是说我们希望能够使用 cargo run、要搜索的字符串和被搜索的文件的路径来运行程序,像这样: $ cargo run -- searchstring example-filename.txt 现在 cargo new 生成的程序忽略任何传递给它的参数。 Crates.io 上有一些现成的库可以帮助我们接受命令行参数,不过我们正在学习这些内容,让我们自己来实现一个。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 接受命令行参数 » 接受命令行参数","id":"214","title":"接受命令行参数"},"215":{"body":"为了确保 minigrep 能够获取传递给它的命令行参数的值,我们需要一个 Rust 标准库提供的函数 std::env::args。这个函数返回一个传递给程序的命令行参数的 迭代器 ( iterator )。我们会在 第十三章 全面的介绍它们。但是现在只需理解迭代器的两个细节:迭代器生成一系列的值,可以在迭代器上调用 collect 方法将其转换为一个集合,比如包含所有迭代器产生元素的 vector。 示例 12-1 中允许 minigrep 程序读取任何传递给它的命令行参数并将其收集到一个 vector 中。 文件名:src/main.rs use std::env; fn main() { let args: Vec = env::args().collect(); dbg!(args);\n} 示例 12-1:将命令行参数收集到一个 vector 中并打印出来 首先使用 use 语句来将 std::env 模块引入作用域以便可以使用它的 args 函数。注意 std::env::args 函数被嵌套进了两层模块中。正如 第七章 讲到的,当所需函数嵌套了多于一层模块时,通常将父模块引入作用域,而不是其自身。这便于我们利用 std::env 中的其他函数。这比增加了 use std::env::args; 后仅仅使用 args 调用函数要更明确一些,因为 args 容易被错认成一个定义于当前模块的函数。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 接受命令行参数 » 读取参数值","id":"215","title":"读取参数值"},"216":{"body":"注意 std::env::args 在其任何参数包含无效 Unicode 字符时会 panic。如果你需要接受包含无效 Unicode 字符的参数,使用 std::env::args_os 代替。这个函数返回 OsString 值而不是 String 值。这里出于简单考虑使用了 std::env::args,因为 OsString 值每个平台都不一样而且比 String 值处理起来更为复杂。 在 main 函数的第一行,我们调用了 env::args,并立即使用 collect 来创建了一个包含迭代器所有值的 vector。collect 可以被用来创建很多类型的集合,所以这里显式注明 args 的类型来指定我们需要一个字符串 vector。虽然在 Rust 中我们很少会需要注明类型,然而 collect 是一个经常需要注明类型的函数,因为 Rust 不能推断出你想要什么类型的集合。 最后,我们使用调试宏打印出 vector。让我们尝试分别用两种方式(不包含参数和包含参数)运行代码: $ cargo run Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.61s Running `target/debug/minigrep`\n[src/main.rs:5:5] args = [ \"target/debug/minigrep\",\n] $ cargo run -- needle haystack Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.57s Running `target/debug/minigrep needle haystack`\n[src/main.rs:5:5] args = [ \"target/debug/minigrep\", \"needle\", \"haystack\",\n] 注意 vector 的第一个值是 \"target/debug/minigrep\",它是我们二进制文件的名称。这与 C 中的参数列表的行为相匹配,让程序使用在执行时调用它们的名称。如果要在消息中打印它或者根据用于调用程序的命令行别名更改程序的行为,通常可以方便地访问程序名称,不过考虑到本章的目的,我们将忽略它并只保存所需的两个参数。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 接受命令行参数 » args 函数和无效的 Unicode","id":"216","title":"args 函数和无效的 Unicode"},"217":{"body":"目前程序可以访问指定为命令行参数的值。现在需要将这两个参数的值保存进变量这样就可以在程序的余下部分使用这些值了。让我们如示例 12-2 这样做: 文件名:src/main.rs use std::env; fn main() { let args: Vec = env::args().collect(); let query = &args[1]; let file_path = &args[2]; println!(\"Searching for {query}\"); println!(\"In file {file_path}\");\n} 示例 12-2:创建变量来存放查询参数和文件路径参数 正如之前打印出 vector 时所所看到的,程序的名称占据了 vector 的第一个值 args[0],所以我们从索引为 1 的参数开始。minigrep 获取的第一个参数是需要搜索的字符串,所以将其将第一个参数的引用存放在变量 query 中。第二个参数将是文件路径,所以将第二个参数的引用放入变量 file_path 中。 我们将临时打印出这些变量的值来证明代码如我们期望的那样工作。使用参数 test 和 sample.txt 再次运行这个程序: $ cargo run -- test sample.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep test sample.txt`\nSearching for test\nIn file sample.txt 好的,它可以工作!我们将所需的参数值保存进了对应的变量中。之后会增加一些错误处理来应对类似用户没有提供参数的情况,不过现在我们将忽略它们并开始增加读取文件功能。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 接受命令行参数 » 将参数值保存进变量","id":"217","title":"将参数值保存进变量"},"218":{"body":"ch12-02-reading-a-file.md commit 02a168ed346042f07010f8b65b4eeed623dd31d1 现在我们要增加读取由 file_path 命令行参数指定的文件的功能。首先,需要一个用来测试的示例文件:我们会用一个拥有多行少量文本且有一些重复单词的文件。示例 12-3 是一首艾米莉·狄金森(Emily Dickinson)的诗,它正适合这个工作!在项目根目录创建一个文件 poem.txt,并输入诗 \"I'm nobody! Who are you?\": 文件名:poem.txt I'm nobody! Who are you?\nAre you nobody, too?\nThen there's a pair of us - don't tell!\nThey'd banish us, you know. How dreary to be somebody!\nHow public, like a frog\nTo tell your name the livelong day\nTo an admiring bog! 示例 12-3:艾米莉·狄金森的诗 “I’m nobody! Who are you?”,一个好的测试用例 创建完这个文件之后,修改 src/main.rs 并增加如示例 12-4 所示的打开文件的代码: 文件名:src/main.rs use std::env;\nuse std::fs; fn main() { // --snip--\n# let args: Vec = env::args().collect();\n# # let query = &args[1];\n# let file_path = &args[2];\n# # println!(\"Searching for {query}\"); println!(\"In file {file_path}\"); let contents = fs::read_to_string(file_path) .expect(\"Should have been able to read the file\"); println!(\"With text:\\n{contents}\");\n} 示例 12-4:读取第二个参数所指定的文件内容 首先,我们增加了一个 use 语句来引入标准库中的相关部分:我们需要 std::fs 来处理文件。 在 main 中新增了一行语句:fs::read_to_string 接受 file_path,打开文件,接着返回包含其内容的 std::io::Result。 在这些代码之后,我们再次增加了临时的 println! 打印出读取文件之后 contents 的值,这样就可以检查目前为止的程序能否工作。 尝试运行这些代码,随意指定一个字符串作为第一个命令行参数(因为还未实现搜索功能的部分)而将 poem.txt 文件将作为第二个参数: $ cargo run -- the poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep the poem.txt`\nSearching for the\nIn file poem.txt\nWith text:\nI'm nobody! Who are you?\nAre you nobody, too?\nThen there's a pair of us - don't tell!\nThey'd banish us, you know. How dreary to be somebody!\nHow public, like a frog\nTo tell your name the livelong day\nTo an admiring bog! 好的!代码读取并打印出了文件的内容。虽然它还有一些瑕疵:此时 main 函数有着多个职能,通常函数只负责一个功能的话会更简洁并易于维护。另一个问题是没有尽可能的处理错误。虽然我们的程序还很小,这些瑕疵并不是什么大问题,不过随着程序功能的丰富,将会越来越难以用简单的方法修复它们。在开发程序时,及早开始重构是一个最佳实践,因为重构少量代码时要容易的多,所以让我们现在就开始吧。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 读取文件 » 读取文件","id":"218","title":"读取文件"},"219":{"body":"ch12-03-improving-error-handling-and-modularity.md commit 83788ff212a3281328e2f8f223ce9e0f69220b97 为了改善我们的程序这里有四个问题需要修复,而且它们都与程序的组织方式和如何处理潜在错误有关。第一,main 现在进行了两个任务:它解析了参数并打开了文件。对于一个这样的小函数,这并不是一个大问题。然而如果 main 中的功能持续增加,main 函数处理的独立任务也会增加。当函数承担了更多责任,它就更难以推导,更难以测试,并且更难以在不破坏其他部分的情况下做出修改。最好能分离出功能以便每个函数就负责一个任务。 这同时也关系到第二个问题:query 和 file_path 是程序中的配置变量,而像 contents 则用来执行程序逻辑。随着 main 函数的增长,就需要引入更多的变量到作用域中,而当作用域中有更多的变量时,将更难以追踪每个变量的目的。最好能将配置变量组织进一个结构,这样就能使它们的目的更明确了。 第三个问题是如果打开文件失败我们使用 expect 来打印出错误信息,不过这个错误信息只是说 Should have been able to read the file。读取文件失败的原因有多种:例如文件不存在,或者没有打开此文件的权限。目前,无论处于何种情况,我们只是打印出“文件读取出现错误”的信息,这并没有给予使用者具体的信息! 第四,我们不停地使用 expect 来处理不同的错误,如果用户没有指定足够的参数来运行程序,他们会从 Rust 得到 index out of bounds 错误,而这并不能明确地解释问题。如果所有的错误处理都位于一处,这样将来的维护者在需要修改错误处理逻辑时就只需要考虑这一处代码。将所有的错误处理都放在一处也有助于确保我们打印的错误信息对终端用户来说是有意义的。 让我们通过重构项目来解决这些问题。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 重构改进模块性和错误处理","id":"219","title":"重构改进模块性和错误处理"},"22":{"body":"接下来,新建一个源文件,命名为 main.rs 。Rust 源文件总是以 .rs 扩展名结尾。如果文件名包含多个单词,那么按照命名习惯,应当使用下划线来分隔单词。例如命名为 hello_world.rs ,而不是 helloworld.rs 。 现在打开刚创建的 main.rs 文件,输入示例 1-1 中的代码。 文件名:main.rs fn main() { println!(\"Hello, world!\");\n} 示例 1-1:一个打印 `Hello, world!` 的程序 保存文件,并回到当前目录为“~/projects/hello_world”的终端窗口。在 Linux 或 macOS 上,输入如下命令,编译并运行文件: $ rustc main.rs\n$ ./main\nHello, world! 在 Windows 上,输入命令 .\\main.exe,而不是 ./main: > rustc main.rs\n> .\\main.exe\nHello, world! 不管使用何种操作系统,终端应该打印字符串 Hello, world!。如果没有看到这些输出,回到安装部分的 “故障排除” 小节查找有帮助的方法。 如果 Hello, world! 出现了,恭喜你!你已经正式编写了一个 Rust 程序。现在你成为一名 Rust 程序员,欢迎!","breadcrumbs":"入门指南 » Hello, World! » 编写并运行 Rust 程序","id":"22","title":"编写并运行 Rust 程序"},"220":{"body":"main 函数负责多个任务的组织问题在许多二进制项目中很常见。所以 Rust 社区开发出一类在 main 函数开始变得庞大时进行二进制程序的关注分离的指导。这些过程有如下步骤: 将程序拆分成 main.rs 和 lib.rs 并将程序的逻辑放入 lib.rs 中。 当命令行解析逻辑比较小时,可以保留在 main.rs 中。 当命令行解析开始变得复杂时,也同样将其从 main.rs 提取到 lib.rs 中。 经过这些过程之后保留在 main 函数中的责任应该被限制为: 使用参数值调用命令行解析逻辑 设置任何其他的配置 调用 lib.rs 中的 run 函数 如果 run 返回错误,则处理这个错误 这个模式的一切就是为了关注分离: main.rs 处理程序运行,而 lib.rs 处理所有的真正的任务逻辑。因为不能直接测试 main 函数,这个结构通过将所有的程序逻辑移动到 lib.rs 的函数中使得我们可以测试它们。仅仅保留在 main.rs 中的代码将足够小以便阅读就可以验证其正确性。让我们遵循这些步骤来重构程序。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 二进制项目的关注分离","id":"220","title":"二进制项目的关注分离"},"221":{"body":"首先,我们将解析参数的功能提取到一个 main 将会调用的函数中,为将命令行解析逻辑移动到 src/lib.rs 中做准备。示例 12-5 中展示了新 main 函数的开头,它调用了新函数 parse_config。目前它仍将定义在 src/main.rs 中: 文件名:src/main.rs # use std::env;\n# use std::fs;\n# fn main() { let args: Vec = env::args().collect(); let (query, file_path) = parse_config(&args); // --snip--\n# # println!(\"Searching for {query}\");\n# println!(\"In file {file_path}\");\n# # let contents = fs::read_to_string(file_path)\n# .expect(\"Should have been able to read the file\");\n# # println!(\"With text:\\n{contents}\");\n} fn parse_config(args: &[String]) -> (&str, &str) { let query = &args[1]; let file_path = &args[2]; (query, file_path)\n} 示例 12-5:从 main 中提取出 parse_config 函数 我们仍然将命令行参数收集进一个 vector,不过不同于在 main 函数中将索引 1 的参数值赋值给变量 query 和将索引 2 的值赋值给变量 file_path,我们将整个 vector 传递给 parse_config 函数。接着 parse_config 函数将包含决定哪个参数该放入哪个变量的逻辑,并将这些值返回到 main。仍然在 main 中创建变量 query 和 file_path,不过 main 不再负责处理命令行参数与变量如何对应。 这对重构我们这小程序可能有点大材小用,不过我们将采用小的、增量的步骤进行重构。在做出这些改变之后,再次运行程序并验证参数解析是否仍然正常。经常验证你的进展是一个好习惯,这样在遇到问题时能帮助你定位问题的成因。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 提取参数解析器","id":"221","title":"提取参数解析器"},"222":{"body":"我们可以采取另一个小的步骤来进一步改善这个函数。现在函数返回一个元组,不过立刻又将元组拆成了独立的部分。这是一个我们可能没有进行正确抽象的信号。 另一个表明还有改进空间的迹象是 parse_config 名称的 config 部分,它暗示了我们返回的两个值是相关的并都是一个配置值的一部分。目前除了将这两个值组合进元组之外并没有表达这个数据结构的意义:我们可以将这两个值放入一个结构体并给每个字段一个有意义的名字。这会让未来的维护者更容易理解不同的值如何相互关联以及它们的目的。 注意:一些同学将这种在复杂类型更为合适的场景下使用基本类型的反模式称为 基本类型偏执 ( primitive obsession )。 示例 12-6 展示了 parse_config 函数的改进。 文件名:src/main.rs # use std::env;\n# use std::fs;\n# fn main() { let args: Vec = env::args().collect(); let config = parse_config(&args); println!(\"Searching for {}\", config.query); println!(\"In file {}\", config.file_path); let contents = fs::read_to_string(config.file_path) .expect(\"Should have been able to read the file\"); // --snip--\n# # println!(\"With text:\\n{contents}\");\n} struct Config { query: String, file_path: String,\n} fn parse_config(args: &[String]) -> Config { let query = args[1].clone(); let file_path = args[2].clone(); Config { query, file_path }\n} 示例 12-6:重构 parse_config 返回一个 Config 结构体实例 新定义的结构体 Config 中包含字段 query 和 file_path。 parse_config 的签名表明它现在返回一个 Config 值。在之前的 parse_config 函数体中,我们返回了引用 args 中 String 值的字符串 slice,现在我们定义 Config 来包含拥有所有权的 String 值。main 中的 args 变量是参数值的所有者并只允许 parse_config 函数借用它们,这意味着如果 Config 尝试获取 args 中值的所有权将违反 Rust 的借用规则。 还有许多不同的方式可以处理 String 的数据,而最简单但有些不太高效的方式是调用这些值的 clone 方法。这会生成 Config 实例可以拥有的数据的完整拷贝,不过会比储存字符串数据的引用消耗更多的时间和内存。不过拷贝数据使得代码显得更加直白因为无需管理引用的生命周期,所以在这种情况下牺牲一小部分性能来换取简洁性的取舍是值得的。 使用 clone 的权衡取舍 由于其运行时消耗,许多 Rustacean 之间有一个趋势是倾向于避免使用 clone 来解决所有权问题。在关于迭代器的第十三章中,我们将会学习如何更有效率的处理这种情况,不过现在,复制一些字符串来取得进展是没有问题的,因为只会进行一次这样的拷贝,而且文件路径和要搜索的字符串都比较短。在第一轮编写时拥有一个可以工作但有点低效的程序要比尝试过度优化代码更好一些。随着你对 Rust 更加熟练,将能更轻松的直奔合适的方法,不过现在调用 clone 是完全可以接受的。 我们更新 main 将 parse_config 返回的 Config 实例放入变量 config 中,并将之前分别使用 query 和 file_path 变量的代码更新为现在的使用 Config 结构体的字段的代码。 现在代码更明确的表现了我们的意图,query 和 file_path 是相关联的并且它们的目的是配置程序如何工作。任何使用这些值的代码就知道在 config 实例中对应目的的字段名中寻找它们。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 组合配置值","id":"222","title":"组合配置值"},"223":{"body":"目前为止,我们将负责解析命令行参数的逻辑从 main 提取到了 parse_config 函数中,这有助于我们看清值 query 和 file_path 是相互关联的并应该在代码中表现这种关系。接着我们增加了 Config 结构体来描述 query 和 file_path 的相关性,并能够从 parse_config 函数中将这些值的名称作为结构体字段名称返回。 所以现在 parse_config 函数的目的是创建一个 Config 实例,我们可以将 parse_config 从一个普通函数变为一个叫做 new 的与结构体关联的函数。做出这个改变使得代码更符合习惯:可以像标准库中的 String 调用 String::new 来创建一个该类型的实例那样,将 parse_config 变为一个与 Config 关联的 new 函数。示例 12-7 展示了需要做出的修改: 文件名:src/main.rs # use std::env;\n# use std::fs;\n# fn main() { let args: Vec = env::args().collect(); let config = Config::new(&args);\n# # println!(\"Searching for {}\", config.query);\n# println!(\"In file {}\", config.file_path);\n# # let contents = fs::read_to_string(config.file_path)\n# .expect(\"Should have been able to read the file\");\n# # println!(\"With text:\\n{contents}\"); // --snip--\n} // --snip-- # struct Config {\n# query: String,\n# file_path: String,\n# }\n# impl Config { fn new(args: &[String]) -> Config { let query = args[1].clone(); let file_path = args[2].clone(); Config { query, file_path } }\n} 示例 12-7:将 parse_config 变为 Config::new 这里将 main 中调用 parse_config 的地方更新为调用 Config::new。我们将 parse_config 的名字改为 new 并将其移动到 impl 块中,这使得 new 函数与 Config 相关联。再次尝试编译并确保它可以工作。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 创建一个 Config 的构造函数","id":"223","title":"创建一个 Config 的构造函数"},"224":{"body":"现在我们开始修复错误处理。回忆一下之前提到过如果 args vector 包含少于 3 个项并尝试访问 vector 中索引 1 或索引 2 的值会造成程序 panic。尝试不带任何参数运行程序;这将看起来像这样: $ cargo run Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep`\nthread 'main' panicked at src/main.rs:27:21:\nindex out of bounds: the len is 1 but the index is 1\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace index out of bounds: the len is 1 but the index is 1 是一个针对程序员的错误信息,然而这并不能真正帮助终端用户理解发生了什么和他们应该做什么。现在就让我们修复它吧。 改善错误信息 在示例 12-8 中,在 new 函数中增加了一个检查在访问索引 1 和 2 之前检查 slice 是否足够长。如果 slice 不够长,程序会打印一个更好的错误信息并 panic: 文件名:src/main.rs # use std::env;\n# use std::fs;\n# # fn main() {\n# let args: Vec = env::args().collect();\n# # let config = Config::new(&args);\n# # println!(\"Searching for {}\", config.query);\n# println!(\"In file {}\", config.file_path);\n# # let contents = fs::read_to_string(config.file_path)\n# .expect(\"Should have been able to read the file\");\n# # println!(\"With text:\\n{contents}\");\n# }\n# # struct Config {\n# query: String,\n# file_path: String,\n# }\n# # impl Config { // --snip-- fn new(args: &[String]) -> Config { if args.len() < 3 { panic!(\"not enough arguments\"); } // --snip--\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Config { query, file_path }\n# }\n# } 示例 12-8:增加一个参数数量检查 这类似于 示例 9-13 中的 Guess::new 函数 ,那里如果 value 参数超出了有效值的范围就调用 panic!。不同于检查值的范围,这里检查 args 的长度至少是 3,而函数的剩余部分则可以在假设这个条件成立的基础上运行。如果 args 少于 3 个项,则这个条件将为真,并调用 panic! 立即终止程序。 有了 new 中这几行额外的代码,再次不带任何参数运行程序并看看现在错误看起来像什么: $ cargo run Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep`\nthread 'main' panicked at src/main.rs:26:13:\nnot enough arguments\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 这个输出就好多了,现在有了一个合理的错误信息。然而,还是有一堆额外的信息我们不希望提供给用户。所以在这里使用示例 9-9 中的技术可能不是最好的;正如 第九章 所讲到的一样,panic! 的调用更趋向于程序上的问题而不是使用上的问题。相反我们可以使用第九章学习的另一个技术 —— 返回一个可以表明成功或错误的 Result 。 从 new 中返回 Result 而不是调用 panic! 我们可以选择返回一个 Result 值,它在成功时会包含一个 Config 的实例,而在错误时会描述问题。我们还将把函数名从new改为build,因为许多程序员希望 new 函数永远不会失败。当 Config::new 与 main 交流时,可以使用 Result 类型来表明这里存在问题。接着修改 main 将 Err 成员转换为对用户更友好的错误,而不是 panic! 调用产生的关于 thread 'main' 和 RUST_BACKTRACE 的文本。 示例 12-9 展示了为了返回 Result 在 Config::new 的返回值和函数体中所需的改变。注意这还不能编译,直到下一个示例同时也更新了 main 之后。 文件名:src/main.rs # use std::env;\n# use std::fs;\n# # fn main() {\n# let args: Vec = env::args().collect();\n# # let config = Config::new(&args);\n# # println!(\"Searching for {}\", config.query);\n# println!(\"In file {}\", config.file_path);\n# # let contents = fs::read_to_string(config.file_path)\n# .expect(\"Should have been able to read the file\");\n# # println!(\"With text:\\n{contents}\");\n# }\n# # struct Config {\n# query: String,\n# file_path: String,\n# }\n# impl Config { fn build(args: &[String]) -> Result { if args.len() < 3 { return Err(\"not enough arguments\"); } let query = args[1].clone(); let file_path = args[2].clone(); Ok(Config { query, file_path }) }\n} 示例 12-9:从 Config::build 中返回 Result 现在 build 函数返回一个 Result,在成功时带有一个 Config 实例而在出现错误时带有一个 &'static str。回忆一下第十章 “静态生命周期” 中讲到 &'static str 是字符串字面值的类型,也是目前的错误信息。 build 函数体中有两处修改:当没有足够参数时不再调用 panic!,而是返回 Err 值。同时我们将 Config 返回值包装进 Ok 成员中。这些修改使得函数符合其新的类型签名。 通过让 Config::build 返回一个 Err 值,这就允许 main 函数处理 build 函数返回的 Result 值并在出现错误的情况更明确的结束进程。 调用 Config::build 并处理错误 为了处理错误情况并打印一个对用户友好的信息,我们需要像示例 12-10 那样更新 main 函数来处理现在 Config::build 返回的 Result。另外还需要手动实现原先由 panic!负责的工作,即以非零错误码退出命令行工具的工作。非零的退出状态是一个惯例信号,用来告诉调用程序的进程:该程序以错误状态退出了。 文件名:src/main.rs # use std::env;\n# use std::fs;\nuse std::process; fn main() { let args: Vec = env::args().collect(); let config = Config::build(&args).unwrap_or_else(|err| { println!(\"Problem parsing arguments: {err}\"); process::exit(1); }); // --snip--\n# # println!(\"Searching for {}\", config.query);\n# println!(\"In file {}\", config.file_path);\n# # let contents = fs::read_to_string(config.file_path)\n# .expect(\"Should have been able to read the file\");\n# # println!(\"With text:\\n{contents}\");\n# }\n# # struct Config {\n# query: String,\n# file_path: String,\n# }\n# # impl Config {\n# fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# } 示例 12-10:如果新建 Config 失败则使用错误码退出 在上面的示例中,使用了一个之前没有详细说明的方法:unwrap_or_else,它定义于标准库的 Result 上。使用 unwrap_or_else 可以进行一些自定义的非 panic! 的错误处理。当 Result 是 Ok 时,这个方法的行为类似于 unwrap:它返回 Ok 内部封装的值。然而,当其值是 Err 时,该方法会调用一个 闭包 ( closure ),也就是一个我们定义的作为参数传递给 unwrap_or_else 的匿名函数。 第十三章 会更详细的介绍闭包。现在你需要理解的是 unwrap_or_else 会将 Err 的内部值,也就是示例 12-9 中增加的 not enough arguments 静态字符串的情况,传递给闭包中位于两道竖线间的参数 err。闭包中的代码在其运行时可以使用这个 err 值。 我们新增了一个 use 行来从标准库中导入 process。在错误的情况闭包中将被运行的代码只有两行:我们打印出了 err 值,接着调用了 std::process::exit。process::exit 会立即停止程序并将传递给它的数字作为退出状态码。这类似于示例 12-8 中使用的基于 panic! 的错误处理,除了不会再得到所有的额外输出了。让我们试试: $ cargo run Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s Running `target/debug/minigrep`\nProblem parsing arguments: not enough arguments 非常好!现在输出对于用户来说就友好多了。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 修复错误处理","id":"224","title":"修复错误处理"},"225":{"body":"现在我们完成了配置解析的重构:让我们转向程序的逻辑。正如 “二进制项目的关注分离” 部分所展开的讨论,我们将提取一个叫做 run 的函数来存放目前 main 函数中不属于设置配置或处理错误的所有逻辑。一旦完成这些,main 函数将简明得足以通过观察来验证,而我们将能够为所有其他逻辑编写测试。 示例 12-11 展示了提取出来的 run 函数。目前我们只进行小的增量式的提取函数的改进。我们仍将在 src/main.rs 中定义这个函数: 文件名:src/main.rs # use std::env;\n# use std::fs;\n# use std::process;\n# fn main() { // --snip-- # let args: Vec = env::args().collect();\n# # let config = Config::build(&args).unwrap_or_else(|err| {\n# println!(\"Problem parsing arguments: {err}\");\n# process::exit(1);\n# });\n# println!(\"Searching for {}\", config.query); println!(\"In file {}\", config.file_path); run(config);\n} fn run(config: Config) { let contents = fs::read_to_string(config.file_path) .expect(\"Should have been able to read the file\"); println!(\"With text:\\n{contents}\");\n} // --snip--\n# # struct Config {\n# query: String,\n# file_path: String,\n# }\n# # impl Config {\n# fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# } 示例 12-11:提取 run 函数来包含剩余的程序逻辑 现在 run 函数包含了 main 中从读取文件开始的剩余的所有逻辑。run 函数获取一个 Config 实例作为参数。 从 run 函数中返回错误 通过将剩余的逻辑分离进 run 函数而不是留在 main 中,就可以像示例 12-9 中的 Config::build 那样改进错误处理。不再通过 expect 允许程序 panic,run 函数将会在出错时返回一个 Result。这让我们进一步以一种对用户友好的方式统一 main 中的错误处理。示例 12-12 展示了 run 签名和函数体中的改变: 文件名:src/main.rs # use std::env;\n# use std::fs;\n# use std::process;\nuse std::error::Error; // --snip-- # # fn main() {\n# let args: Vec = env::args().collect();\n# # let config = Config::build(&args).unwrap_or_else(|err| {\n# println!(\"Problem parsing arguments: {err}\");\n# process::exit(1);\n# });\n# # println!(\"Searching for {}\", config.query);\n# println!(\"In file {}\", config.file_path);\n# # run(config);\n# }\n# fn run(config: Config) -> Result<(), Box> { let contents = fs::read_to_string(config.file_path)?; println!(\"With text:\\n{contents}\"); Ok(())\n}\n# # struct Config {\n# query: String,\n# file_path: String,\n# }\n# # impl Config {\n# fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# } 示例 12-12:修改 run 函数返回 Result 这里我们做出了三个明显的修改。首先,将 run 函数的返回类型变为 Result<(), Box>。之前这个函数返回 unit 类型 (),现在它仍然保持作为 Ok 时的返回值。 对于错误类型,使用了 trait 对象 Box(在开头使用了 use 语句将 std::error::Error 引入作用域)。 第十八章 会涉及 trait 对象。目前只需知道 Box 意味着函数会返回实现了 Error trait 的类型,不过无需指定具体将会返回的值的类型。这提供了在不同的错误场景可能有不同类型的错误返回值的灵活性。这也就是 dyn,它是 “动态的”(“dynamic”)的缩写。 第二个改变是去掉了 expect 调用并替换为 第九章 讲到的 ?。不同于遇到错误就 panic!,? 会从函数中返回错误值并让调用者来处理它。 第三个修改是现在成功时这个函数会返回一个 Ok 值。因为 run 函数签名中声明成功类型返回值是 (),这意味着需要将 unit 类型值包装进 Ok 值中。Ok(()) 一开始看起来有点奇怪,不过这样使用 () 是惯用的做法,表明调用 run 函数只是为了它的副作用;函数并没有返回什么有意义的值。 上述代码能够编译,不过会有一个警告: $ cargo run -- the poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep)\nwarning: unused `Result` that must be used --> src/main.rs:19:5 |\n19 | run(config); | ^^^^^^^^^^^ | = note: this `Result` may be an `Err` variant, which should be handled = note: `#[warn(unused_must_use)]` on by default\nhelp: use `let _ = ...` to ignore the resulting value |\n19 | let _ = run(config); | +++++++ warning: `minigrep` (bin \"minigrep\") generated 1 warning Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.71s Running `target/debug/minigrep the poem.txt`\nSearching for the\nIn file poem.txt\nWith text:\nI'm nobody! Who are you?\nAre you nobody, too?\nThen there's a pair of us - don't tell!\nThey'd banish us, you know. How dreary to be somebody!\nHow public, like a frog\nTo tell your name the livelong day\nTo an admiring bog! Rust 提示我们的代码忽略了 Result 值,它可能表明这里存在一个错误。但我们却没有检查这里是否有一个错误,而编译器提醒我们这里应该有一些错误处理代码!现在就让我们修正这个问题。 处理 main 中 run 返回的错误 我们将检查错误并使用类似示例 12-10 中 Config::build 处理错误的技术来处理它们,不过有一些细微的不同: 文件名:src/main.rs # use std::env;\n# use std::error::Error;\n# use std::fs;\n# use std::process;\n# fn main() { // --snip-- # let args: Vec = env::args().collect();\n# # let config = Config::build(&args).unwrap_or_else(|err| {\n# println!(\"Problem parsing arguments: {err}\");\n# process::exit(1);\n# });\n# println!(\"Searching for {}\", config.query); println!(\"In file {}\", config.file_path); if let Err(e) = run(config) { println!(\"Application error: {e}\"); process::exit(1); }\n}\n# # fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # println!(\"With text:\\n{contents}\");\n# # Ok(())\n# }\n# # struct Config {\n# query: String,\n# file_path: String,\n# }\n# # impl Config {\n# fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# } 我们使用 if let 来检查 run 是否返回一个 Err 值,不同于 unwrap_or_else,并在出错时调用 process::exit(1)。run 并不返回像 Config::build 返回的 Config 实例那样需要 unwrap 的值。因为 run 在成功时返回 (),而我们只关心检测错误,所以并不需要 unwrap_or_else 来返回未封装的值,因为它只会是 ()。 不过两个例子中 if let 和 unwrap_or_else 的函数体都一样:打印出错误并退出。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 从 main 提取逻辑","id":"225","title":"从 main 提取逻辑"},"226":{"body":"现在我们的 minigrep 项目看起来好多了!现在我们将要拆分 src/main.rs 并将一些代码放入 src/lib.rs ,这样就能测试它们并拥有一个含有更少功能的 main 函数。 让我们将所有不是 main 函数的代码从 src/main.rs 移动到新文件 src/lib.rs 中: run 函数定义 相关的 use 语句 Config 的定义 Config::build 函数定义 现在 src/lib.rs 的内容应该看起来像示例 12-13(为了简洁省略了函数体)。注意直到下一个示例修改完 src/main.rs 之后,代码还不能编译: 文件名:src/lib.rs use std::error::Error;\nuse std::fs; pub struct Config { pub query: String, pub file_path: String,\n} impl Config { pub fn build(args: &[String]) -> Result { // --snip--\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path }) }\n} pub fn run(config: Config) -> Result<(), Box> { // --snip--\n# let contents = fs::read_to_string(config.file_path)?;\n# # println!(\"With text:\\n{contents}\");\n# # Ok(())\n} 示例 12-13:将 Config 和 run 移动到 src/lib.rs 这里使用了公有的 pub 关键字:在 Config、其字段和其 build 方法,以及 run 函数上。现在我们有了一个拥有可以测试的公有 API 的库 crate 了。 现在需要在 src/main.rs 中将移动到 src/lib.rs 的代码引入二进制 crate 的作用域中,如示例 12-14 所示: 文件名:src/main.rs use std::env;\nuse std::process; use minigrep::Config; fn main() { // --snip--\n# let args: Vec = env::args().collect();\n# # let config = Config::build(&args).unwrap_or_else(|err| {\n# println!(\"Problem parsing arguments: {err}\");\n# process::exit(1);\n# });\n# # println!(\"Searching for {}\", config.query);\n# println!(\"In file {}\", config.file_path);\n# if let Err(e) = minigrep::run(config) { // --snip--\n# println!(\"Application error: {e}\");\n# process::exit(1); }\n} 示例 12-14:将 minigrep crate 引入 src/main.rs 的作用域中 我们添加了一行 use minigrep::Config,它将 Config 类型引入作用域,并使用 crate 名称作为 run 函数的前缀。通过这些重构,所有功能应该能够联系在一起并运行了。运行 cargo run 来确保一切都正确的衔接在一起。 哇哦!我们做了大量的工作,不过我们为将来的成功打下了基础。现在处理错误将更容易,同时代码也更加模块化。从现在开始几乎所有的工作都将在 src/lib.rs 中进行。 让我们利用这些新创建的模块的优势来进行一些在旧代码中难以展开的工作,这些工作在新代码中非常容易实现,那就是:编写测试!","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 重构以改进模块化与错误处理 » 将代码拆分到库 crate","id":"226","title":"将代码拆分到库 crate"},"227":{"body":"ch12-04-testing-the-librarys-functionality.md commit 8fd2327e4135876b368cc2793eb4a7e455b691f0 现在我们将逻辑提取到了 src/lib.rs 并将所有的参数解析和错误处理留在了 src/main.rs 中,为代码的核心功能编写测试将更加容易。我们可以直接使用多种参数调用函数并检查返回值而无需从命令行运行二进制文件了。 在这一部分,我们将遵循测试驱动开发(Test Driven Development, TDD)的模式来逐步增加 minigrep 的搜索逻辑。它遵循如下步骤: 编写一个失败的测试,并运行它以确保它失败的原因是你所期望的。 编写或修改足够的代码来使新的测试通过。 重构刚刚增加或修改的代码,并确保测试仍然能通过。 从步骤 1 开始重复! 虽然这只是众多编写软件的方法之一,不过 TDD 有助于驱动代码的设计。在编写能使测试通过的代码之前编写测试有助于在开发过程中保持高测试覆盖率。 我们将测试驱动实现实际在文件内容中搜索查询字符串并返回匹配的行示例的功能。我们将在一个叫做 search 的函数中增加这些功能。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 采用测试驱动开发完善库的功能 » 采用测试驱动开发完善库的功能","id":"227","title":"采用测试驱动开发完善库的功能"},"228":{"body":"去掉 src/lib.rs 和 src/main.rs 中用于检查程序行为的 println! 语句,因为不再真正需要它们了。接着我们会像 第十一章 那样增加一个 test 模块和一个测试函数。测试函数指定了 search 函数期望拥有的行为:它会获取一个需要查询的字符串和用来查询的文本,并只会返回包含请求的文本行。示例 12-15 展示了这个测试,它还不能编译: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # Ok(())\n# }\n# #[cfg(test)]\nmod tests { use super::*; #[test] fn one_result() { let query = \"duct\"; let contents = \"\\\nRust:\nsafe, fast, productive.\nPick three.\"; assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents)); }\n} 示例 12-15:创建一个我们期望的 search 函数的失败测试 这里选择使用 \"duct\" 作为这个测试中需要搜索的字符串。用来搜索的文本有三行,其中只有一行包含 \"duct\"。(注意双引号之后的反斜杠,这告诉 Rust 不要在字符串字面值内容的开头加入换行符)我们断言 search 函数的返回值只包含期望的那一行。 我们还不能运行这个测试并看到它失败,因为它甚至都还不能编译:search 函数还不存在呢!根据 TDD 的原则,我们将增加足够的代码来使其能够编译:一个总是会返回空 vector 的 search 函数定义,如示例 12-16 所示。然后这个测试应该能够编译并因为空 vector 并不匹配一个包含一行 \"safe, fast, productive.\" 的 vector 而失败。 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # Ok(())\n# }\n# pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { vec![]\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn one_result() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# } 示例 12-16:刚好足够使测试通过编译的 search 函数定义 注意需要在 search 的签名中定义一个显式生命周期 'a 并用于 contents 参数和返回值。回忆一下 第十章 中讲到生命周期参数指定哪个参数的生命周期与返回值的生命周期相关联。在这个例子中,我们表明返回的 vector 中应该包含引用参数 contents(而不是参数query)slice 的字符串 slice。 换句话说,我们告诉 Rust 函数 search 返回的数据将与 search 函数中的参数 contents 的数据存在的一样久。这是非常重要的!为了使这个引用有效那么 被 slice 引用的数据也需要保持有效;如果编译器认为我们是在创建 query 而不是 contents 的字符串 slice,那么安全检查将是不正确的。 如果尝试不用生命周期编译的话,我们将得到如下错误: $ cargo build Compiling minigrep v0.1.0 (file:///projects/minigrep)\nerror[E0106]: missing lifetime specifier --> src/lib.rs:28:51 |\n28 | pub fn search(query: &str, contents: &str) -> Vec<&str> { | ---- ---- ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `query` or `contents`\nhelp: consider introducing a named lifetime parameter |\n28 | pub fn search<'a>(query: &'a str, contents: &'a str) -> Vec<&'a str> { | ++++ ++ ++ ++ For more information about this error, try `rustc --explain E0106`.\nerror: could not compile `minigrep` (lib) due to 1 previous error Rust 不可能知道我们需要的是哪一个参数,所以需要告诉它。因为参数 contents 包含了所有的文本而且我们希望返回匹配的那部分文本,所以我们知道 contents 是应该要使用生命周期语法来与返回值相关联的参数。 其他语言中并不需要你在函数签名中将参数与返回值相关联。所以这么做可能仍然感觉有些陌生,随着时间的推移这将会变得越来越容易。你可能想要将这个例子与第十章中 “生命周期确保引用有效” 部分做对比。 现在运行测试: $ cargo test Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.97s Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 1 test\ntest tests::one_result ... FAILED failures: ---- tests::one_result stdout ----\nthread 'tests::one_result' panicked at src/lib.rs:44:9:\nassertion `left == right` failed left: [\"safe, fast, productive.\"] right: []\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::one_result test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 好的,测试失败了,这正是我们所期望的。修改代码来让测试通过吧!","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 采用测试驱动开发完善库的功能 » 编写失败测试","id":"228","title":"编写失败测试"},"229":{"body":"目前测试之所以会失败是因为我们总是返回一个空的 vector。为了修复并实现 search,我们的程序需要遵循如下步骤: 遍历内容的每一行文本。 查看这一行是否包含要搜索的字符串。 如果有,将这一行加入列表返回值中。 如果没有,什么也不做。 返回匹配到的结果列表 让我们一步一步的来,从遍历每行开始。 使用 lines 方法遍历每一行 Rust 有一个有助于一行一行遍历字符串的方法,出于方便它被命名为 lines,它如示例 12-17 这样工作。注意这还不能编译: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # Ok(())\n# }\n# pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { for line in contents.lines() { // do something with line }\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn one_result() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# } 示例 12-17:遍历 contents 的每一行 lines 方法返回一个迭代器。 第十三章 会深入了解迭代器,不过我们已经在 示例 3-5 中见过使用迭代器的方法了,在那里使用了一个 for 循环和迭代器在一个集合的每一项上运行了一些代码。 用查询字符串搜索每一行 接下来将会增加检查当前行是否包含查询字符串的功能。幸运的是,字符串类型为此也有一个叫做 contains 的实用方法!如示例 12-18 所示在 search 函数中加入 contains 方法调用。注意这仍然不能编译: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # Ok(())\n# }\n# pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { for line in contents.lines() { if line.contains(query) { // 对文本行进行操作 } }\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn one_result() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# } 示例 12-18:增加检查文本行是否包含 query 中字符串的功能 存储匹配的行 为了完成这个函数,我们还需要一个方法来存储包含查询字符串的行。为此可以在 for 循环之前创建一个可变的 vector 并调用 push 方法在 vector 中存放一个 line。在 for 循环之后,返回这个 vector,如示例 12-19 所示: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # Ok(())\n# }\n# pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { let mut results = Vec::new(); for line in contents.lines() { if line.contains(query) { results.push(line); } } results\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn one_result() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# } 示例 12-19:储存匹配的行以便可以返回它们 现在 search 函数应该返回只包含 query 的那些行,而测试应该会通过。让我们运行测试: $ cargo test Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `test` profile [unoptimized + debuginfo] target(s) in 1.22s Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 1 test\ntest tests::one_result ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running unittests src/main.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests minigrep running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 测试通过了,它可以工作了! 现在正是可以考虑重构的时机,在保证测试通过,保持功能不变的前提下重构 search 函数。search 函数中的代码并不坏,不过并没有利用迭代器的一些实用功能。第十三章将回到这个例子并深入探索迭代器并看看如何改进代码。 在 run 函数中使用 search 函数 现在 search 函数是可以工作并测试通过了的,我们需要实际在 run 函数中调用 search。需要将 config.query 值和 run 从文件中读取的 contents 传递给 search 函数。接着 run 会打印出 search 返回的每一行: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# pub fn run(config: Config) -> Result<(), Box> { let contents = fs::read_to_string(config.file_path)?; for line in search(&config.query, &contents) { println!(\"{line}\"); } Ok(())\n}\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn one_result() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# } 这里仍然使用了 for 循环获取了 search 返回的每一行并打印出来。 现在整个程序应该可以工作了!让我们试一试,首先使用一个只会在艾米莉·狄金森的诗中返回一行的单词 “frog”: $ cargo run -- frog poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.38s Running `target/debug/minigrep frog poem.txt`\nHow public, like a frog 好的!现在试试一个会匹配多行的单词,比如 “body”: $ cargo run -- body poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep body poem.txt`\nI'm nobody! Who are you?\nAre you nobody, too?\nHow dreary to be somebody! 最后,让我们确保搜索一个在诗中哪里都没有的单词时不会得到任何行,比如 \"monomorphization\": $ cargo run -- monomorphization poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep monomorphization poem.txt` 非常好!我们创建了一个属于自己的迷你版经典工具,并学习了很多如何组织程序的知识。我们还学习了一些文件输入输出、生命周期、测试和命令行解析的内容。 为了使这个项目更丰满,我们将简要的展示如何处理环境变量和打印到标准错误,这两者在编写命令行程序时都很有用。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 采用测试驱动开发完善库的功能 » 编写使测试通过的代码","id":"229","title":"编写使测试通过的代码"},"23":{"body":"现在,让我们回过头来仔细看看这个 “Hello, world!” 程序。这是第一块拼图: fn main() { } 这几行定义了一个名叫 main 的函数。main 函数是一个特殊的函数:在可执行的 Rust 程序中,它总是最先运行的代码。第一行代码声明了一个叫做 main 的函数,它没有参数也没有返回值。如果有参数的话,它们的名称应该出现在小括号 () 中。 函数体被包裹在 {} 中。Rust 要求所有函数体都要用花括号包裹起来。一般来说,将左花括号与函数声明置于同一行并以空格分隔,是良好的代码风格。 注:如果你希望在 Rust 项目中保持一种标准风格,可以使用名为 rustfmt 的自动格式化工具将代码格式化为特定的风格(更多内容详见 附录 D 中的 rustfmt)。Rust 团队已经在标准的 Rust 发行版中包含了这个工具,就像 rustc 一样。所以它应该已经安装在你的电脑中了! 在 main 函数中有如下代码: println!(\"Hello, world!\"); 这行代码完成这个简单程序的所有工作:在屏幕上打印文本。这里有四个重要的细节需要注意。首先 Rust 的缩进风格使用 4 个空格,而不是 1 个制表符(tab)。 第二,println! 调用了一个 Rust 宏(macro)。如果是调用函数,则应输入 println(没有!)。我们将在第二十章详细讨论宏。现在你只需记住,当看到符号 ! 的时候,就意味着调用的是宏而不是普通函数,并且宏并不总是遵循与函数相同的规则。 第三,\"Hello, world!\" 是一个字符串。我们把这个字符串作为一个参数传递给 println!,字符串将被打印到屏幕上。 第四,该行以分号结尾(;),这代表一个表达式的结束和下一个表达式的开始。大部分 Rust 代码行以分号结尾。","breadcrumbs":"入门指南 » Hello, World! » 分析这个 Rust 程序","id":"23","title":"分析这个 Rust 程序"},"230":{"body":"ch12-05-working-with-environment-variables.md commit 9c0fa2714859738ff73cbbb829592e4c037d7e46 我们将增加一个额外的功能来改进 minigrep:用户可以通过设置环境变量来设置搜索是否是大小写敏感的。当然,我们也可以将其设计为一个命令行参数并要求用户每次需要时都加上它,不过在这里我们将使用环境变量。这允许用户设置环境变量一次之后在整个终端会话中所有的搜索都将是大小写不敏感的。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 处理环境变量 » 处理环境变量","id":"230","title":"处理环境变量"},"231":{"body":"首先我们希望增加一个新函数 search_case_insensitive,并将会在环境变量有值时调用它。这里将继续遵循 TDD 过程,其第一步是再次编写一个失败测试。我们将为新的大小写不敏感搜索函数新增一个测试函数,并将老的测试函数从 one_result 改名为 case_sensitive 来更清楚的表明这两个测试的区别,如示例 12-20 所示: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # for line in search(&config.query, &contents) {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# #[cfg(test)]\nmod tests { use super::*; #[test] fn case_sensitive() { let query = \"duct\"; let contents = \"\\\nRust:\nsafe, fast, productive.\nPick three.\nDuct tape.\"; assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents)); } #[test] fn case_insensitive() { let query = \"rUsT\"; let contents = \"\\\nRust:\nsafe, fast, productive.\nPick three.\nTrust me.\"; assert_eq!( vec![\"Rust:\", \"Trust me.\"], search_case_insensitive(query, contents) ); }\n} 示例 12-20:为准备添加的大小写不敏感函数新增失败测试 注意我们也改变了老测试中 contents 的值。还新增了一个含有文本 \"Duct tape.\" 的行,它有一个大写的 D,这在大小写敏感搜索时不应该匹配 \"duct\"。我们修改这个测试以确保不会意外破坏已经实现的大小写敏感搜索功能;这个测试现在应该能通过并在处理大小写不敏感搜索时应该能一直通过。 大小写 不敏感 搜索的新测试使用 \"rUsT\" 作为其查询字符串。在我们将要增加的 search_case_insensitive 函数中,\"rUsT\" 查询应该包含带有一个大写 R 的 \"Rust:\" 还有 \"Trust me.\" 这两行,即便它们与查询的大小写都不同。这个测试现在不能编译,因为还没有定义 search_case_insensitive 函数。请随意增加一个总是返回空 vector 的骨架实现,正如示例 12-16 中 search 函数为了使测试通过编译并失败时所做的那样。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 处理环境变量 » 编写一个大小写不敏感 search 函数的失败测试","id":"231","title":"编写一个大小写不敏感 search 函数的失败测试"},"232":{"body":"search_case_insensitive 函数,如示例 12-21 所示,将与 search 函数基本相同。唯一的区别是它会将 query 变量和每一 line 都变为小写,这样不管输入参数是大写还是小写,在检查该行是否包含查询字符串时都会是小写。 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # for line in search(&config.query, &contents) {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# pub fn search_case_insensitive<'a>( query: &str, contents: &'a str,\n) -> Vec<&'a str> { let query = query.to_lowercase(); let mut results = Vec::new(); for line in contents.lines() { if line.to_lowercase().contains(&query) { results.push(line); } } results\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 12-21:定义 search_case_insensitive 函数,它在比较查询和每一行之前将它们都转换为小写 首先我们将 query 字符串转换为小写,并将其覆盖到同名的变量中。对查询字符串调用 to_lowercase 是必需的,这样不管用户的查询是 \"rust\"、\"RUST\"、\"Rust\" 或者 \"rUsT\",我们都将其当作 \"rust\" 处理并对大小写不敏感。虽然 to_lowercase 可以处理基本的 Unicode,但它不是 100% 准确。如果编写真实的程序的话,我们还需多做一些工作,不过这一部分是关于环境变量而不是 Unicode 的,所以这样就够了。 注意 query 现在是一个 String 而不是字符串 slice,因为调用 to_lowercase 是在创建新数据,而不是引用现有数据。如果查询字符串是 \"rUsT\",这个字符串 slice 并不包含可供我们使用的小写的 u 或 t,所以必需分配一个包含 \"rust\" 的新 String。现在当我们将 query 作为一个参数传递给 contains 方法时,需要增加一个 & 因为 contains 的签名被定义为获取一个字符串 slice。 接下来我们对每一 line 都调用 to_lowercase 将其转为小写。现在我们将 line 和 query 都转换成了小写,这样就可以不管查询的大小写进行匹配了。 让我们看看这个实现能否通过测试: $ cargo test Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `test` profile [unoptimized + debuginfo] target(s) in 1.33s Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 2 tests\ntest tests::case_insensitive ... ok\ntest tests::case_sensitive ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running unittests src/main.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests minigrep running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 好的!现在,让我们在 run 函数中实际调用新 search_case_insensitive 函数。首先,我们将在 Config 结构体中增加一个配置项来切换大小写敏感和大小写不敏感搜索。增加这些字段会导致编译错误,因为我们还没有在任何地方初始化这些字段: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# pub struct Config { pub query: String, pub file_path: String, pub ignore_case: bool,\n}\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # let results = if config.ignore_case {\n# search_case_insensitive(&config.query, &contents)\n# } else {\n# search(&config.query, &contents)\n# };\n# # for line in results {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 这里增加了 ignore_case 字符来存放一个布尔值。接着我们需要 run 函数检查 case_sensitive 字段的值并使用它来决定是否调用 search 函数或 search_case_insensitive 函数,如示例 12-22 所示。注意这还不能编译: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# pub ignore_case: bool,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# pub fn run(config: Config) -> Result<(), Box> { let contents = fs::read_to_string(config.file_path)?; let results = if config.ignore_case { search_case_insensitive(&config.query, &contents) } else { search(&config.query, &contents) }; for line in results { println!(\"{line}\"); } Ok(())\n}\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 12-22:根据 config.ignore_case 的值调用 search 或 search_case_insensitive 最后需要实际检查环境变量。处理环境变量的函数位于标准库的 env 模块中,所以我们需要在 src/lib.rs 的开头将这个模块引入作用域中。接着使用 env 模块的 var 方法来检查一个叫做 IGNORE_CASE 的环境变量,如示例 12-23 所示: 文件名:src/lib.rs use std::env;\n// --snip-- # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# pub ignore_case: bool,\n# }\n# impl Config { pub fn build(args: &[String]) -> Result { if args.len() < 3 { return Err(\"not enough arguments\"); } let query = args[1].clone(); let file_path = args[2].clone(); let ignore_case = env::var(\"IGNORE_CASE\").is_ok(); Ok(Config { query, file_path, ignore_case, }) }\n}\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # let results = if config.ignore_case {\n# search_case_insensitive(&config.query, &contents)\n# } else {\n# search(&config.query, &contents)\n# };\n# # for line in results {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 12-23:检查叫做 IGNORE_CASE 的环境变量 这里创建了一个新变量 ignore_case。为了设置它的值,需要调用 env::var 函数并传递我们需要寻找的环境变量名称,IGNORE_CASE。env::var 返回一个 Result,它在环境变量被设置时返回包含其值的 Ok 成员,并在环境变量未被设置时返回 Err 成员。 我们使用 Result 的 is_ok 方法来检查环境变量是否被设置,这也就意味着我们 需要 进行一个大小写不敏感的搜索。如果IGNORE_CASE 环境变量没有被设置为任何值,is_ok 会返回 false 并将进行大小写敏感的搜索。我们并不关心环境变量所设置的 值 ,只关心它是否被设置了,所以检查 is_ok 而不是 unwrap、expect 或任何我们已经见过的 Result 的方法。 我们将变量 ignore_case 的值传递给 Config 实例,这样 run 函数可以读取其值并决定是否调用 search 或者示例 12-22 中实现的 search_case_insensitive。 让我们试一试吧!首先不设置环境变量并使用查询 to 运行程序,这应该会匹配任何全小写的单词 “to” 的行: $ cargo run -- to poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep to poem.txt`\nAre you nobody, too?\nHow dreary to be somebody! 看起来程序仍然能够工作!现在将 IGNORE_CASE 设置为 1 并仍使用相同的查询 to。 $ IGNORE_CASE=1 cargo run to poem.txt 如果你使用 PowerShell,则需要用两个命令来分别设置环境变量并运行程序: PS> $Env:IGNORE_CASE=1; cargo run to poem.txt 而这会让 IGNORE_CASE 的效果在当前 shell 会话中持续生效。可以通过 Remove-Item 命令来取消设置: PS> Remove-Item Env:IGNORE_CASE 这回应该得到包含可能有大写字母的 “to” 的行: Are you nobody, too?\nHow dreary to be somebody!\nTo tell your name the livelong day\nTo an admiring bog! 好极了,我们也得到了包含 “To” 的行!现在 minigrep 程序可以通过环境变量控制进行大小写不敏感搜索了。现在你知道了如何管理由命令行参数或环境变量设置的选项了! 一些程序允许对相同配置同时使用参数 和 环境变量。在这种情况下,程序来决定参数和环境变量的优先级。作为一个留给你的测试,尝试通过一个命令行参数或一个环境变量来控制大小写敏感搜索。并在运行程序时遇到矛盾值时决定命令行参数和环境变量的优先级。 std::env 模块还包含了更多处理环境变量的实用功能;请查看官方文档来了解其可用的功能。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 处理环境变量 » 实现 search_case_insensitive 函数","id":"232","title":"实现 search_case_insensitive 函数"},"233":{"body":"ch12-06-writing-to-stderr-instead-of-stdout.md commit 02a168ed346042f07010f8b65b4eeed623dd31d1 目前为止,我们将所有的输出都通过 println! 写到了终端。大部分终端都提供了两种输出: 标准输出 ( standard output ,stdout)对应一般信息, 标准错误 ( standard error ,stderr)则用于错误信息。这种区别允许用户选择将程序正常输出定向到一个文件中并仍将错误信息打印到屏幕上。 但是 println! 宏只能够打印到标准输出,所以我们必须使用其他方法来打印到标准错误。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 将错误信息输出到标准错误而不是标准输出 » 将错误信息输出到标准错误而不是标准输出","id":"233","title":"将错误信息输出到标准错误而不是标准输出"},"234":{"body":"首先,让我们观察一下目前 minigrep 打印的所有内容是如何被写入标准输出的,包括那些应该被写入标准错误的错误信息。可以通过将标准输出流重定向到一个文件同时有意产生一个错误来做到这一点。我们没有重定向标准错误流,所以任何发送到标准错误的内容将会继续显示在屏幕上。 命令行程序被期望将错误信息发送到标准错误流,这样即便选择将标准输出流重定向到文件中时仍然能看到错误信息。目前我们的程序并不符合期望;相反我们将看到它将错误信息输出保存到了文件中! 我们通过 > 和文件路径 output.txt 来运行程序,我们期望重定向标准输出流到该文件中。在这里,我们没有传递任何参数,所以会产生一个错误: $ cargo run > output.txt > 语法告诉 shell 将标准输出的内容写入到 output.txt 文件中而不是屏幕上。我们并没有看到期望的错误信息打印到屏幕上,所以这意味着它一定被写入了文件中。如下是 output.txt 所包含的: Problem parsing arguments: not enough arguments 是的,错误信息被打印到了标准输出中。像这样的错误信息被打印到标准错误中将会有用得多,将使得只有成功运行所产生的输出才会写入文件。我们接下来就修改。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 将错误信息输出到标准错误而不是标准输出 » 检查错误应该写入何处","id":"234","title":"检查错误应该写入何处"},"235":{"body":"让我们如示例 12-24 所示的代码改变错误信息是如何被打印的。得益于本章早些时候的重构,所有打印错误信息的代码都位于 main 一个函数中。标准库提供了 eprintln! 宏来打印到标准错误流,所以将两个调用 println! 打印错误信息的位置替换为 eprintln!: 文件名:src/main.rs # use std::env;\n# use std::process;\n# # use minigrep::Config;\n# fn main() { let args: Vec = env::args().collect(); let config = Config::build(&args).unwrap_or_else(|err| { eprintln!(\"Problem parsing arguments: {err}\"); process::exit(1); }); if let Err(e) = minigrep::run(config) { eprintln!(\"Application error: {e}\"); process::exit(1); }\n} 示例 12-24:使用 eprintln! 将错误信息写入标准错误而不是标准输出 现在我们再次尝试用同样的方式运行程序,不使用任何参数并通过 > 重定向标准输出: $ cargo run > output.txt\nProblem parsing arguments: not enough arguments 现在我们看到了屏幕上的错误信息,同时 output.txt 里什么也没有,这正是命令行程序所期望的行为。 如果使用不会造成错误的参数再次运行程序,不过仍然将标准输出重定向到一个文件,像这样: $ cargo run -- to poem.txt > output.txt 我们并不会在终端看到任何输出,同时 output.txt 将会包含其结果: 文件名:output.txt Are you nobody, too?\nHow dreary to be somebody! 这一部分展示了现在我们适当的使用了成功时产生的标准输出和错误时产生的标准错误。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 将错误信息输出到标准错误而不是标准输出 » 将错误打印到标准错误","id":"235","title":"将错误打印到标准错误"},"236":{"body":"在这一章中,我们回顾了目前为止的一些主要章节并涉及了如何在 Rust 环境中进行常规的 I/O 操作。通过使用命令行参数、文件、环境变量和打印错误的 eprintln! 宏,现在你已经准备好编写命令行程序了。通过结合前几章的知识,你的代码将会是组织良好的,并能有效的将数据存储到合适的数据结构中、更好的处理错误,并且还是经过良好测试的。 接下来,让我们探索一些 Rust 中受函数式编程语言影响的功能:闭包和迭代器。","breadcrumbs":"一个 I/O 项目:构建命令行程序 » 将错误信息输出到标准错误而不是标准输出 » 总结","id":"236","title":"总结"},"237":{"body":"ch13-00-functional-features.md commit daa268a0cd04ef76a8067a26ed7d28ec2a9336d3 Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是 函数式编程 ( functional programming )。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。 本章我们不会讨论函数式编程是或不是什么的问题,而是展示 Rust 的一些在功能上与其他被认为是函数式语言类似的特性。 更具体的,我们将要涉及: 闭包 ( Closures ),一个可以储存在变量里的类似函数的结构 迭代器 ( Iterators ),一种处理元素序列的方式 如何使用闭包和迭代器来改进第十二章的 I/O 项目。 闭包和迭代器的性能。( 剧透警告: 它们的速度超乎你的想象!) 我们已经介绍了其它受函数式风格影响的 Rust 功能,比如模式匹配和枚举,这些已经在其他章节中讲到过了。因为掌握闭包和迭代器是编写符合语言风格的高性能 Rust 代码的重要一环,所以我们将专门用一整章来讲解它们。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » Rust 中的函数式语言功能:迭代器与闭包","id":"237","title":"Rust 中的函数式语言功能:迭代器与闭包"},"238":{"body":"ch13-01-closures.md commit a2cb72d3ad7584cc1ae3b85f715c877872f5e3ab Rust 的 闭包 ( closures )是可以保存在变量中或作为参数传递给其他函数的匿名函数。你可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获其被定义时所在作用域中的值。我们将展示这些闭包特性如何支持代码复用和行为定制。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 闭包:可以捕获其环境的匿名函数 » 闭包:可以捕获环境的匿名函数","id":"238","title":"闭包:可以捕获环境的匿名函数"},"239":{"body":"我们首先了解如何通过闭包捕获定义它的环境中的值以便之后使用。考虑如下场景:我们的 T 恤公司偶尔会向邮件列表中的某位成员赠送一件限量版的独家 T 恤作为促销。邮件列表中的成员可以选择将他们的喜爱的颜色添加到个人信息中。如果被选中的成员设置了喜爱的颜色,他们将获得那个颜色的 T 恤。如果他没有设置喜爱的颜色,他们会获赠公司当前库存最多的颜色的款式。 有很多种方式来实现这一点。例如,使用有 Red 和 Blue 两个成员的 ShirtColor 枚举(出于简单考虑限定为两种颜色)。我们使用 Inventory 结构体来代表公司的库存,它有一个类型为 Vec 的 shirts 字段表示库存中的衬衫的颜色。Inventory 上定义的 giveaway 方法获取免费衬衫得主所喜爱的颜色(如有),并返回其获得的衬衫的颜色。初始代码如示例 13-1 所示: 文件名:src/main.rs #[derive(Debug, PartialEq, Copy, Clone)]\nenum ShirtColor { Red, Blue,\n} struct Inventory { shirts: Vec,\n} impl Inventory { fn giveaway(&self, user_preference: Option) -> ShirtColor { user_preference.unwrap_or_else(|| self.most_stocked()) } fn most_stocked(&self) -> ShirtColor { let mut num_red = 0; let mut num_blue = 0; for color in &self.shirts { match color { ShirtColor::Red => num_red += 1, ShirtColor::Blue => num_blue += 1, } } if num_red > num_blue { ShirtColor::Red } else { ShirtColor::Blue } }\n} fn main() { let store = Inventory { shirts: vec![ShirtColor::Blue, ShirtColor::Red, ShirtColor::Blue], }; let user_pref1 = Some(ShirtColor::Red); let giveaway1 = store.giveaway(user_pref1); println!( \"The user with preference {:?} gets {:?}\", user_pref1, giveaway1 ); let user_pref2 = None; let giveaway2 = store.giveaway(user_pref2); println!( \"The user with preference {:?} gets {:?}\", user_pref2, giveaway2 );\n} 示例 13-1:衬衫公司赠送场景 main 函数中定义的 store 还剩下两件蓝衬衫和一件红衬衫,可以在限量版促销活动中赠送。我们通过调用 giveaway 方法,为一个期望红衬衫的用户和一个没有特定偏好的用户进行赠送。 再次强调,这段代码有多种实现方式。这里为了专注于闭包,我们继续使用已经学习过的概念,除了 giveaway 方法体中使用了闭包。在 giveaway 方法中,我们将用户偏好作为 Option 类型的参数获取,并在 user_preference 上调用 unwrap_or_else 方法。 Option 上的 unwrap_or_else 方法 由标准库定义。它接受一个无参闭包作为参数,该闭包返回一个 T 类型的值(与 Option 的 Some 变体中存储的值类型相同,这里是 ShirtColor)。如果 Option 是 Some 成员,则 unwrap_or_else 返回 Some 中的值。如果 Option 是 None 成员,则 unwrap_or_else 调用闭包并返回闭包的返回值。 我们将闭包表达式 || self.most_stocked() 作为 unwrap_or_else 的参数。这是一个本身不获取参数的闭包(如果闭包有参数,它们会出现在两道竖杠之间)。闭包体调用了 self.most_stocked()。我们在这里定义了闭包,而 unwrap_or_else 的实现会在之后需要其结果的时候执行闭包。 运行代码会打印出: $ cargo run Compiling shirt-company v0.1.0 (file:///projects/shirt-company) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.27s Running `target/debug/shirt-company`\nThe user with preference Some(Red) gets Red\nThe user with preference None gets Blue 这里有一个有趣的地方是,我们传递了一个闭包,该闭包会在当前的 Inventory 实例上调用 self.most_stocked() 方法。标准库不需要了解我们定义的 Inventory 或 ShirtColor 类型,也不需要了解我们在这个场景中要使用的逻辑。闭包捕获了对 self(即 Inventory 实例)的不可变引用,并将其与我们指定的代码一起传递给 unwrap_or_else 方法。相比之下,函数无法以这种方式捕获其环境。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 闭包:可以捕获其环境的匿名函数 » 闭包会捕获其环境","id":"239","title":"闭包会捕获其环境"},"24":{"body":"你刚刚运行了一个新创建的程序,那么让我们检查此过程中的每一个步骤。 在运行 Rust 程序之前,必须先使用 Rust 编译器编译它,即输入 rustc 命令并传入源文件名称,如下: $ rustc main.rs 如果你有 C 或 C++ 背景,就会发现这与 gcc 和 clang 类似。编译成功后,Rust 会输出一个二进制的可执行文件。 在 Linux、macOS 或 Windows 的 PowerShell 上,在 shell 中输入 ls 命令可以看见这个可执行文件。 $ ls\nmain main.rs 在 Linux 和 macOS,你会看到两个文件。在 Windows PowerShell 中,你会看到同使用 CMD 相同的三个文件。在 Windows 的 CMD 上,则输入如下内容: > dir /B %= the /B option says to only show the file names =%\nmain.exe\nmain.pdb\nmain.rs 这展示了扩展名为 .rs 的源文件、可执行文件(在 Windows 下是 main.exe ,其它平台是 main ),以及当使用 CMD 时会有一个包含调试信息、扩展名为 .pdb 的文件。从这里开始运行 main 或 main.exe 文件,如下: $ ./main # Windows 是 .\\main.exe 如果这里的 main.rs 是上文所述的 “Hello, world!” 程序,那么在终端上就会打印出 Hello, world!。 如果你更熟悉动态语言,如 Ruby、Python 或 JavaScript,则可能不习惯将编译和运行分为两个单独的步骤。Rust 是一种 预编译静态类型 ( ahead-of-time compiled )语言,这意味着你可以编译程序,并将可执行文件送给其他人,他们甚至不需要安装 Rust 就可以运行。如果你给他人一个 .rb 、 .py 或 .js 文件,他们需要先分别安装 Ruby,Python,JavaScript 实现(运行时环境,VM)。不过在这些语言中,只需要一句命令就可以编译和运行程序。这一切都是语言设计上的权衡取舍。 仅仅使用 rustc 编译简单程序是没问题的,不过随着项目的增长,你可能需要管理你项目的方方面面,并让代码易于分享。接下来,我们要介绍一个叫做 Cargo 的工具,它会帮助你编写真实世界中的 Rust 程序。","breadcrumbs":"入门指南 » Hello, World! » 编译和运行是彼此独立的步骤","id":"24","title":"编译和运行是彼此独立的步骤"},"240":{"body":"函数与闭包还有更多区别。闭包通常不要求像 fn 函数那样对参数和返回值进行类型注解。函数需要类型注解是因为这些类型是暴露给用户的显式接口的一部分。严格定义这些接口对于确保所有人对函数使用和返回值的类型达成一致理解非常重要。与此相比,闭包并不用于这样暴露在外的接口:它们储存在变量中并被使用,不用命名它们或暴露给库的用户调用。 闭包通常较短,并且只与特定的上下文相关,而不是适用于任意情境。在这些有限的上下文中,编译器可以推断参数和返回值的类型,类似于它推断大多数变量类型的方式(尽管在某些罕见的情况下,编译器也需要闭包的类型注解)。 类似于变量,如果我们希望增加代码的明确性和清晰度,可以添加类型注解,但代价是是会使代码变得比严格必要的更冗长。为示例 13-1 中定义的闭包标注类型看起来如示例 13-2 中的定义一样。这个例子中,我们定义了一个闭包并将它保存在变量中,而不是像示例 13-1 那样在传参的地方定义它。 文件名:src/main.rs # use std::thread;\n# use std::time::Duration;\n# # fn generate_workout(intensity: u32, random_number: u32) { let expensive_closure = |num: u32| -> u32 { println!(\"calculating slowly...\"); thread::sleep(Duration::from_secs(2)); num };\n# # if intensity < 25 {\n# println!(\"Today, do {} pushups!\", expensive_closure(intensity));\n# println!(\"Next, do {} situps!\", expensive_closure(intensity));\n# } else {\n# if random_number == 3 {\n# println!(\"Take a break today! Remember to stay hydrated!\");\n# } else {\n# println!(\n# \"Today, run for {} minutes!\",\n# expensive_closure(intensity)\n# );\n# }\n# }\n# }\n# # fn main() {\n# let simulated_user_specified_value = 10;\n# let simulated_random_number = 7;\n# # generate_workout(simulated_user_specified_value, simulated_random_number);\n# } 示例 13-2:为闭包的参数和返回值增加可选的类型注解 有了类型注解,闭包的语法看起来就更像函数的语法了。如下是一个对其参数加一的函数的定义与拥有相同行为闭包语法的纵向对比。这里增加了一些空格来对齐相应部分。这展示了除了使用竖线以及一些可选语法外,闭包语法与函数语法有多么地相似: fn add_one_v1 (x: u32) -> u32 { x + 1 }\nlet add_one_v2 = |x: u32| -> u32 { x + 1 };\nlet add_one_v3 = |x| { x + 1 };\nlet add_one_v4 = |x| x + 1 ; 第一行展示了一个函数定义,第二行展示了一个完整标注的闭包定义。第三行闭包定义中省略了类型注解,而第四行去掉了可选的大括号,因为闭包体只有一个表达式,所以大括号是可选的。这些都是有效的闭包定义,并在调用时产生相同的行为。调用闭包是 add_one_v3 和 add_one_v4 能够编译的必要条件,因为类型将从其用法中推断出来。这类似于 let v = Vec::new();,Rust 需要类型注解或是某种类型的值被插入到 Vec 中,才能推断其类型。 对于闭包定义,编译器会为每个参数和返回值推断出一个具体类型。例如,示例 13-3 展示了一个简短的闭包定义,该闭包仅仅返回作为参数接收到的值。除了作为示例用途外,这个闭包并不是很实用。注意这个定义没有增加任何类型注解。因为没有类型注解,我们可以使用任意类型来调用这个闭包,我们在这里第一次调用时使用了 String 类型。但是如果我们接着尝试使用整数来调用 example_closure,就会得到一个错误。 文件名:src/main.rs # fn main() { let example_closure = |x| x; let s = example_closure(String::from(\"hello\")); let n = example_closure(5);\n# } 示例 13-3:尝试调用一个被推断为两个不同类型的闭包 编译器给出如下错误: $ cargo run Compiling closure-example v0.1.0 (file:///projects/closure-example)\nerror[E0308]: mismatched types --> src/main.rs:5:29 |\n5 | let n = example_closure(5); | --------------- ^- help: try using a conversion method: `.to_string()` | | | | | expected `String`, found integer | arguments to this function are incorrect |\nnote: expected because the closure was earlier called with an argument of type `String` --> src/main.rs:4:29 |\n4 | let s = example_closure(String::from(\"hello\")); | --------------- ^^^^^^^^^^^^^^^^^^^^^ expected because this argument is of type `String` | | | in this closure call\nnote: closure parameter defined here --> src/main.rs:2:28 |\n2 | let example_closure = |x| x; | ^ For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `closure-example` (bin \"closure-example\") due to 1 previous error 第一次使用 String 值调用 example_closure 时,编译器推断出 x 的类型以及闭包的返回类型为 String。接着这些类型被锁定进闭包 example_closure 中,如果尝试对同一闭包使用不同类型则就会得到类型错误。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 闭包:可以捕获其环境的匿名函数 » 闭包类型推断和注解","id":"240","title":"闭包类型推断和注解"},"241":{"body":"闭包可以通过三种方式捕获其环境中的值,它们直接对应到函数获取参数的三种方式:不可变借用、可变借用和获取所有权。闭包将根据函数体中对捕获值的操作来决定使用哪种方式。 在示例 13-4 中定义了一个捕获名为 list 的 vector 的不可变引用的闭包,因为只需不可变引用就能打印其值: 文件名:src/main.rs fn main() { let list = vec![1, 2, 3]; println!(\"Before defining closure: {list:?}\"); let only_borrows = || println!(\"From closure: {list:?}\"); println!(\"Before calling closure: {list:?}\"); only_borrows(); println!(\"After calling closure: {list:?}\");\n} 示例 13-4:定义并调用一个捕获不可变引用的闭包 这个示例也展示了变量可以绑定一个闭包定义,并且我们可以像使用函数名一样,使用变量名和括号来调用该闭包。 因为同时可以有多个 list 的不可变引用,所以在闭包定义之前,闭包定义之后调用之前,闭包调用之后代码仍然可以访问 list。该代码可以编译、运行并输出: $ cargo run Locking 1 package to latest compatible version Adding closure-example v0.1.0 (/Users/chris/dev/rust-lang/book/tmp/listings/ch13-functional-features/listing-13-04) Compiling closure-example v0.1.0 (file:///projects/closure-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s Running `target/debug/closure-example`\nBefore defining closure: [1, 2, 3]\nBefore calling closure: [1, 2, 3]\nFrom closure: [1, 2, 3]\nAfter calling closure: [1, 2, 3] 接下来在示例 13-5 中,我们修改闭包体让它向 list vector 增加一个元素。闭包现在捕获一个可变引用: 文件名:src/main.rs fn main() { let mut list = vec![1, 2, 3]; println!(\"Before defining closure: {list:?}\"); let mut borrows_mutably = || list.push(7); borrows_mutably(); println!(\"After calling closure: {list:?}\");\n} 示例 13-5:定义并调用一个捕获可变引用的闭包 代码可以编译、运行并打印: $ cargo run Locking 1 package to latest compatible version Adding closure-example v0.1.0 (/Users/chris/dev/rust-lang/book/tmp/listings/ch13-functional-features/listing-13-05) Compiling closure-example v0.1.0 (file:///projects/closure-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.43s Running `target/debug/closure-example`\nBefore defining closure: [1, 2, 3]\nAfter calling closure: [1, 2, 3, 7] 注意在 borrows_mutably 闭包的定义和调用之间不再有 println!,这是因为当 borrows_mutably 被定义时,它捕获了对 list 的可变引用。闭包在被调用后就不再被使用,这时可变借用结束。因为当可变借用存在时不允许有其它的借用,所以在闭包定义和调用之间不能有不可变引用来进行打印。可以尝试在这里添加 println! 看看你会得到什么报错信息! 即使闭包体不严格需要所有权,如果希望强制闭包获取它在环境中所使用的值的所有权,可以在参数列表前使用 move 关键字。 当将闭包传递到一个新的线程时,这个技巧特别有用,因为它将数据的所有权移动到新线程中。我们将在第十六章讨论并发时详细讨论线程以及为什么你可能需要使用它们。不过现在,我们先简要探索一下如何使用需要 move 关键字的闭包来生成一个新线程。示例 13-6 展示了如何修改示例 13-4,以便在一个新线程中而不是在主线程中打印 vector: 文件名:src/main.rs use std::thread; fn main() { let list = vec![1, 2, 3]; println!(\"Before defining closure: {list:?}\"); thread::spawn(move || println!(\"From thread: {list:?}\")) .join() .unwrap();\n} 示例 13-6:使用 move 来强制闭包为线程获取 list 的所有权 我们生成了一个新的线程,并给这个线程传递一个闭包作为参数来运行,闭包体打印出列表。在示例 13-4 中,闭包仅通过不可变引用捕获了 list,因为这是打印列表所需的最少的访问权限。这个例子中,尽管闭包体依然只需要不可变引用,我们还是在闭包定义前写上 move 关键字,以确保 list 被移动到闭包中。新线程可能在主线程剩余部分执行完前执行完,也可能在主线程执行完之后执行完。如果主线程维护了 list 的所有权但却在新线程之前结束并且丢弃了 list,则在线程中的不可变引用将失效。因此,编译器要求 list 被移动到在新线程中运行的闭包中,这样引用就是有效的。试着移除 move 关键字,或者在闭包定义后在主线程中使用 list,看看你会得到什么编译器报错!","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 闭包:可以捕获其环境的匿名函数 » 捕获引用或者移动所有权","id":"241","title":"捕获引用或者移动所有权"},"242":{"body":"一旦闭包捕获了定义它的环境中的某个值的引用或所有权(也就影响了什么会被移 进 闭包,如有),闭包体中的代码则决定了在稍后执行闭包时,这些引用或值将如何处理(也就影响了什么会被移 出 闭包,如有)。闭包体可以执行以下任一操作:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获任何值。 闭包捕获和处理环境中的值的方式会影响闭包实现哪些 trait,而 trait 是函数和结构体指定它们可以使用哪些类型闭包的方式。根据闭包体如何处理这些值,闭包会自动、渐进地实现一个、两个或全部三个 Fn trait。 FnOnce 适用于只能被调用一次的闭包。所有闭包至少都实现了这个 trait,因为所有闭包都能被调用。一个会将捕获的值从闭包体中移出的闭包只会实现 FnOnce trait,而不会实现其他 Fn 相关的 trait,因为它只能被调用一次。 FnMut 适用于不会将捕获的值移出闭包体,但可能会修改捕获值的闭包。这类闭包可以被调用多次。 Fn 适用于既不将捕获的值移出闭包体,也不修改捕获值的闭包,同时也包括不从环境中捕获任何值的闭包。这类闭包可以被多次调用而不会改变其环境,这在会多次并发调用闭包的场景中十分重要。 让我们来看示例 13-1 中使用的在 Option 上的 unwrap_or_else 方法的定义: impl Option { pub fn unwrap_or_else(self, f: F) -> T where F: FnOnce() -> T { match self { Some(x) => x, None => f(), } }\n} 回忆一下,T 是表示 Option 中 Some 成员中的值的类型的泛型。类型 T 也是 unwrap_or_else 函数的返回值类型:举例来说,在 Option 上调用 unwrap_or_else 会得到一个 String。 接着注意到 unwrap_or_else 函数有额外的泛型参数 F。F 是参数 f 的类型,f 是调用 unwrap_or_else 时提供的闭包。 泛型 F 的 trait bound 是 FnOnce() -> T,这意味着 F 必须能够被调用一次,没有参数并返回一个 T。在 trait bound 中使用 FnOnce 表示 unwrap_or_else 最多只会调用 f 一次。在 unwrap_or_else 的函数体中可以看到,如果 Option 是 Some,f 不会被调用。如果 Option 是 None,f 将会被调用一次。由于所有的闭包都实现了 FnOnce,unwrap_or_else 接受所有三种类型的闭包,十分灵活。 注意:函数也可以实现所有的三种 Fn traits。如果我们要做的事情不需要从环境中捕获值,则可以在需要某种实现了 Fn trait 的东西时使用函数而不是闭包。举个例子,可以在 Option> 的值上调用 unwrap_or_else(Vec::new),以便在值为 None 时获取一个新的空的 vector。 现在让我们来看定义在 slice 上的标准库方法 sort_by_key,看看它与 unwrap_or_else 的区别,以及为什么 sort_by_key 使用 FnMut 而不是 FnOnce 作为 trait bound。这个闭包以一个 slice 中当前被考虑的元素的引用作为参数,并返回一个可以排序的 K 类型的值。当你想按照 slice 中每个元素的某个属性进行排序时,这个函数非常有用。在示例 13-7 中,我们有一个 Rectangle 实例的列表,并使用 sort_by_key 按 Rectangle 的 width 属性对它们从低到高排序: 文件名:src/main.rs #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} fn main() { let mut list = [ Rectangle { width: 10, height: 1 }, Rectangle { width: 3, height: 5 }, Rectangle { width: 7, height: 12 }, ]; list.sort_by_key(|r| r.width); println!(\"{list:#?}\");\n} 示例 13-7:使用 sort_by_key 对长方形按宽度排序 代码输出: $ cargo run Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.41s Running `target/debug/rectangles`\n[ Rectangle { width: 3, height: 5, }, Rectangle { width: 7, height: 12, }, Rectangle { width: 10, height: 1, },\n] sort_by_key 被定义为接收一个 FnMut 闭包的原因是它会多次调用这个闭包:对 slice 中的每个元素调用一次。闭包 |r| r.width 不捕获、修改或将任何东西移出它的环境,所以它满足 trait bound 的要求。 相比之下,示例 13-8 展示了一个只实现了 FnOnce trait 的闭包的例子,因为它从环境中移出了一个值。编译器不允许我们在 sort_by_key 中使用这个闭包: 文件名:src/main.rs #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} fn main() { let mut list = [ Rectangle { width: 10, height: 1 }, Rectangle { width: 3, height: 5 }, Rectangle { width: 7, height: 12 }, ]; let mut sort_operations = vec![]; let value = String::from(\"closure called\"); list.sort_by_key(|r| { sort_operations.push(value); r.width }); println!(\"{list:#?}\");\n} 示例 13-8:尝试在 sort_by_key 上使用一个 FnOnce 闭包 这是一个刻意构造的、复杂且无效的方式,试图统计在对 list 进行排序时 sort_by_key 调用闭包的次数。该代码试图通过将闭包环境中的 value(一个 String)插入 sort_operations vector 来实现计数。闭包捕获了 value,然后通过将 value 的所有权转移给 sort_operations vector 的方式将其移出闭包。这个闭包只能被调用一次;尝试第二次调用它将无法工作,因为这时 value 已经不在闭包的环境中,无法被再次插入 sort_operations 中!因而,这个闭包只实现了 FnOnce。当我们尝试编译此代码时,会出现错误提示:value 不能从闭包中移出,因为闭包必须实现 FnMut: $ cargo run Compiling rectangles v0.1.0 (file:///projects/rectangles)\nerror[E0507]: cannot move out of `value`, a captured variable in an `FnMut` closure --> src/main.rs:18:30 |\n15 | let value = String::from(\"closure called\"); | ----- captured outer variable\n16 |\n17 | list.sort_by_key(|r| { | --- captured by this `FnMut` closure\n18 | sort_operations.push(value); | ^^^^^ move occurs because `value` has type `String`, which does not implement the `Copy` trait |\nhelp: consider cloning the value if the performance cost is acceptable |\n18 | sort_operations.push(value.clone()); | ++++++++ For more information about this error, try `rustc --explain E0507`.\nerror: could not compile `rectangles` (bin \"rectangles\") due to 1 previous error 报错指向了闭包体中将 value 移出环境的那一行。要修复此问题,我们需要修改闭包体,使其不会将值移出环境。在环境中维护一个计数器,并在闭包体中递增其值,是计算闭包被调用次数的一个更简单直接的方法。示例 13-9 中的闭包可以在 sort_by_key 中使用,因为它只捕获了 num_sort_operations 计数器的可变引用,因此可以被多次调用: 文件名:src/main.rs #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} fn main() { let mut list = [ Rectangle { width: 10, height: 1 }, Rectangle { width: 3, height: 5 }, Rectangle { width: 7, height: 12 }, ]; let mut num_sort_operations = 0; list.sort_by_key(|r| { num_sort_operations += 1; r.width }); println!(\"{list:#?}, sorted in {num_sort_operations} operations\");\n} 示例 13-9:允许在 sort_by_key 上使用一个 FnMut 闭包 当定义或使用涉及闭包的函数或类型时,Fn traits 十分重要。在下个小节中,我们将讨论迭代器。许多迭代器方法都接收闭包参数,因此在继续前,请记住这些闭包的细节!","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 闭包:可以捕获其环境的匿名函数 » 将被捕获的值移出闭包和 Fn trait","id":"242","title":"将被捕获的值移出闭包和 Fn trait"},"243":{"body":"ch13-02-iterators.md commit eabaaaa90ee6937db3690dc56f739116be55ecb2 迭代器模式允许你依次对一个序列中的项执行某些操作。 迭代器 ( iterator )负责遍历序列中的每一项并确定序列何时结束的逻辑。使用迭代器时,你无需自己重新实现这些逻辑。 在 Rust 中,迭代器是 惰性的 ( lazy ),这意味着在调用消费迭代器的方法之前不会执行任何操作。例如,示例 13-10 中的代码通过调用定义于 Vec 上的 iter 方法在一个 vector v1 上创建了一个迭代器。这段代码本身并没有执行任何有用的操作。 # fn main() { let v1 = vec![1, 2, 3]; let v1_iter = v1.iter();\n# } 示例 13-10:创建一个迭代器 迭代器被储存在 v1_iter 变量中。一旦创建迭代器之后,可以选择用多种方式利用它。在第三章的示例 3-5 中,我们使用 for 循环来遍历一个数组并在每一个项上执行了一些代码。在底层它隐式地创建并接着消费了一个迭代器,不过直到现在我们都一笔带过了它具体是如何工作的。 示例 13-11 中的例子将迭代器的创建和 for 循环中的使用分开。当 for 循环使用 v1_iter 中的迭代器时,迭代器中的每一个元素都会用于循环的一次迭代,并打印出每个值。 # fn main() { let v1 = vec![1, 2, 3]; let v1_iter = v1.iter(); for val in v1_iter { println!(\"Got: {val}\"); }\n# } 示例 13-11:在一个 for 循环中使用迭代器 在标准库中没有提供迭代器的语言中,我们可能会使用一个从 0 开始的索引变量,使用这个变量索引 vector 中的值,并循环增加其值直到达到 vector 中的元素总量。 迭代器为我们处理了所有这些逻辑,这减少了重复代码并消除了潜在的混乱。另外,迭代器的实现方式提供了对多种不同的序列使用相同逻辑的灵活性,而不仅仅是像 vector 这样可索引的数据结构。让我们看看迭代器是如何做到这些的。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 使用迭代器处理元素序列 » 使用迭代器处理元素序列","id":"243","title":"使用迭代器处理元素序列"},"244":{"body":"迭代器都实现了一个叫做 Iterator 的定义于标准库的 trait。这个 trait 的定义看起来像这样: pub trait Iterator { type Item; fn next(&mut self) -> Option; // 此处省略了方法的默认实现\n} 注意这里有一个我们还未讲到的新语法:type Item 和 Self::Item,它们定义了 trait 的 关联类型 ( associated type )。第二十章会深入讲解关联类型,不过现在只需知道这段代码表明实现 Iterator trait 要求同时定义一个 Item 类型,这个 Item 类型被用作 next 方法的返回值类型。换句话说,Item 类型将是迭代器返回元素的类型。 next 是 Iterator 实现者被要求定义的唯一方法:next 方法,该方法每次返回迭代器中的一个项,封装在 Some 中,并且当迭代完成时,返回 None。 可以直接调用迭代器的 next 方法;示例 13-12 展示了对由 vector 创建的迭代器重复调用 next 方法时返回的值。 文件名:src/lib.rs # #[cfg(test)]\n# mod tests { #[test] fn iterator_demonstration() { let v1 = vec![1, 2, 3]; let mut v1_iter = v1.iter(); assert_eq!(v1_iter.next(), Some(&1)); assert_eq!(v1_iter.next(), Some(&2)); assert_eq!(v1_iter.next(), Some(&3)); assert_eq!(v1_iter.next(), None); }\n# } 示例 13-12:在迭代器上(直接)调用 next 方法 注意我们需要将 v1_iter 声明为可变的:在迭代器上调用 next 方法会改变迭代器内部的状态,该状态用于跟踪迭代器在序列中的位置。换句话说,代码 消费 (consume)了,或者说用尽了迭代器。每一次 next 调用都会从迭代器中消费一个项。使用 for 循环时无需使 v1_iter 可变因为 for 循环会获取 v1_iter 的所有权并在后台使 v1_iter 可变。 还需要注意的是,从 next 调用中获取的值是对 vector 中值的不可变引用。iter 方法生成一个不可变引用的迭代器。如果我们需要一个获取 v1 所有权并返回拥有所有权的迭代器,则可以调用 into_iter 而不是 iter。类似地,如果我们希望迭代可变引用,可以调用 iter_mut 而不是 iter。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 使用迭代器处理元素序列 » Iterator trait 和 next 方法","id":"244","title":"Iterator trait 和 next 方法"},"245":{"body":"Iterator trait 有一系列不同的由标准库提供默认实现的方法;你可以在 Iterator trait 的标准库 API 文档中找到所有这些方法。一些方法在其定义中调用了 next 方法,这也就是为什么在实现 Iterator trait 时要求实现 next 方法的原因。 这些调用 next 方法的方法被称为 消费适配器 ( consuming adaptors ),因为调用它们会消耗迭代器。一个消费适配器的例子是 sum 方法。这个方法获取迭代器的所有权并反复调用 next 来遍历迭代器,因而会消费迭代器。在遍历过程中,它将每个项累加到一个总和中,并在迭代完成时返回这个总和。示例 13-13 有一个展示 sum 方法使用的测试: 文件名:src/lib.rs # #[cfg(test)]\n# mod tests { #[test] fn iterator_sum() { let v1 = vec![1, 2, 3]; let v1_iter = v1.iter(); let total: i32 = v1_iter.sum(); assert_eq!(total, 6); }\n# } 示例 13-13:调用 sum 方法获取迭代器所有项的总和 调用 sum 之后不再允许使用 v1_iter 因为调用 sum 时它会获取迭代器的所有权。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 使用迭代器处理元素序列 » 消费迭代器的方法","id":"245","title":"消费迭代器的方法"},"246":{"body":"Iterator trait 中定义了另一类方法,被称为 迭代器适配器 ( iterator adaptors ),它们不会消耗当前的迭代器,而是通过改变原始迭代器的某些方面来生成不同的迭代器。 示例 13-14 展示了一个调用迭代器适配器方法 map 的例子,该方法使用一个闭包对每个元素进行操作。map 方法返回一个新的迭代器,该迭代器生成经过修改的元素。这里的闭包创建了一个新的迭代器,其中 vector 中的每个元素都被加 1。 文件名:src/main.rs # fn main() { let v1: Vec = vec![1, 2, 3]; v1.iter().map(|x| x + 1);\n# } 示例 13-14:调用迭代器适配器 map 来创建一个新迭代器 不过这些代码会产生一个警告: $ cargo run Compiling iterators v0.1.0 (file:///projects/iterators)\nwarning: unused `Map` that must be used --> src/main.rs:4:5 |\n4 | v1.iter().map(|x| x + 1); | ^^^^^^^^^^^^^^^^^^^^^^^^ | = note: iterators are lazy and do nothing unless consumed = note: `#[warn(unused_must_use)]` on by default\nhelp: use `let _ = ...` to ignore the resulting value |\n4 | let _ = v1.iter().map(|x| x + 1); | +++++++ warning: `iterators` (bin \"iterators\") generated 1 warning Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.47s Running `target/debug/iterators` 示例 13-14 中的代码实际上并没有做任何事;所指定的闭包从未被调用过。警告提醒了我们原因所在:迭代器适配器是惰性的,因此我们需要在此处消费迭代器。 为了修复这个警告并消费迭代器,我们将使用第十二章示例 12-1 结合 env::args 使用的 collect 方法。这个方法消费迭代器并将结果收集到一个集合数据类型中。 在示例 13-15 中,我们将遍历由 map 调用生成的迭代器结果收集到一个 vector 中。这个 vector 将包含原始 vector 中每个元素加 1 的结果。 文件名:src/main.rs # fn main() { let v1: Vec = vec![1, 2, 3]; let v2: Vec<_> = v1.iter().map(|x| x + 1).collect(); assert_eq!(v2, vec![2, 3, 4]);\n# } 示例 13-15:调用 map 方法创建一个新迭代器,接着调用 collect 方法消费新迭代器并创建一个 vector 由于 map 接受一个闭包,因此我们可以指定希望在每个元素上执行的任何操作。这是一个很好的例子,展示了如何通过闭包来自定义某些行为,同时复用 Iterator trait 提供的迭代行为。 可以链式调用多个迭代器适配器来以一种可读的方式进行复杂的操作。不过因为所有的迭代器都是惰性的,你必须调用一个消费适配器方法,才能从这些迭代器适配器的调用中获取结果。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 使用迭代器处理元素序列 » 产生其他迭代器的方法","id":"246","title":"产生其他迭代器的方法"},"247":{"body":"很多迭代器适配器接受闭包作为参数,而我们通常会指定捕获其环境的闭包作为迭代器适配器的参数。 作为一个例子,我们使用 filter 方法来获取一个闭包。该闭包从迭代器中获取一项并返回一个 bool。如果闭包返回 true,其值将会包含在 filter 提供的新迭代器中。如果闭包返回 false,其值不会被包含。 示例 13-16 中使用 filter 和一个捕获环境中变量 shoe_size 的闭包来遍历一个 Shoe 结构体集合。它只会返回指定鞋码的鞋子。 文件名:src/lib.rs #[derive(PartialEq, Debug)]\nstruct Shoe { size: u32, style: String,\n} fn shoes_in_size(shoes: Vec, shoe_size: u32) -> Vec { shoes.into_iter().filter(|s| s.size == shoe_size).collect()\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn filters_by_size() { let shoes = vec![ Shoe { size: 10, style: String::from(\"sneaker\"), }, Shoe { size: 13, style: String::from(\"sandal\"), }, Shoe { size: 10, style: String::from(\"boot\"), }, ]; let in_my_size = shoes_in_size(shoes, 10); assert_eq!( in_my_size, vec![ Shoe { size: 10, style: String::from(\"sneaker\") }, Shoe { size: 10, style: String::from(\"boot\") }, ] ); }\n} 示例 13-16:使用 filter 方法和一个捕获 shoe_size 的闭包 shoes_in_size 函数获取一个鞋子 vector 的所有权和一个鞋码作为参数。它返回一个只包含指定鞋码的鞋子的 vector。 shoes_in_size 函数体中调用了 into_iter 来创建一个获取 vector 所有权的迭代器。接着调用 filter 将这个迭代器适配成一个只含有那些闭包返回 true 的元素的新迭代器。 闭包从环境中捕获了 shoe_size 变量并使用其值与每一只鞋的大小作比较,只保留指定鞋码的鞋子。最终,调用 collect 将迭代器适配器返回的值收集进一个 vector 并返回。 这个测试展示当调用 shoes_in_size 时,返回的只会是与我们指定的鞋码相同的鞋子。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 使用迭代器处理元素序列 » 使用捕获其环境的闭包","id":"247","title":"使用捕获其环境的闭包"},"248":{"body":"ch13-03-improving-our-io-project.md commit 2cd1b5593d26dc6a03c20f8619187ad4b2485552 掌握了这些关于迭代器的新知识后,我们可以使用迭代器来改进第十二章中 I/O 项目的实现来使得代码更简洁明了。接下来,让我们看看迭代器如何改进 Config::build 函数和 search 函数的实现。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 改进之前的 I/O 项目 » 改进 I/O 项目","id":"248","title":"改进 I/O 项目"},"249":{"body":"在示例 12-6 中,我们增加了一些代码获取一个 String 类型的 slice 并创建一个 Config 结构体的实例,它们索引 slice 中的值并克隆这些值以便 Config 结构体可以拥有这些值。在示例 13-17 中重现了第十二章结尾示例 12-23 中 Config::build 函数的实现: 文件名:src/lib.rs # use std::env;\n# use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# pub ignore_case: bool,\n# }\n# impl Config { pub fn build(args: &[String]) -> Result { if args.len() < 3 { return Err(\"not enough arguments\"); } let query = args[1].clone(); let file_path = args[2].clone(); let ignore_case = env::var(\"IGNORE_CASE\").is_ok(); Ok(Config { query, file_path, ignore_case, }) }\n}\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # let results = if config.ignore_case {\n# search_case_insensitive(&config.query, &contents)\n# } else {\n# search(&config.query, &contents)\n# };\n# # for line in results {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 13-17:重现示例 12-23 的 Config::build 函数 当时我们说过不必担心低效的 clone 调用,因为我们以后会将其移除。好吧,就是现在! 起初这里需要 clone 的原因是参数 args 中有一个 String 元素的 slice,而 build 函数并不拥有 args。为了能够返回 Config 实例的所有权,我们需要克隆 Config 中字段 query 和 file_path 的值,这样 Config 实例就能拥有这些值。 在学习了迭代器之后,我们可以将 build 函数改为获取一个有所有权的迭代器作为参数,而不是借用 slice。我们将使用迭代器功能代替之前检查 slice 长度和索引特定位置的代码。这样可以更清晰地表达 Config::build 函数的操作,因为迭代器会负责访问这些值。 一旦 Config::build 获取了迭代器的所有权并不再使用借用的索引操作,就可以将迭代器中的 String 值移动到 Config 中,而不是调用 clone 分配新的空间。 直接使用返回的迭代器 打开 I/O 项目的 src/main.rs 文件,它看起来应该像这样: 文件名:src/main.rs # use std::env;\n# use std::process;\n# # use minigrep::Config;\n# fn main() { let args: Vec = env::args().collect(); let config = Config::build(&args).unwrap_or_else(|err| { eprintln!(\"Problem parsing arguments: {err}\"); process::exit(1); }); // --snip--\n# # if let Err(e) = minigrep::run(config) {\n# eprintln!(\"Application error: {e}\");\n# process::exit(1);\n# }\n} 首先我们修改第十二章结尾示例 12-24 中的 main 函数的开头为示例 13-18 中的代码。在更新 Config::build 之前这些代码还不能编译: 文件名:src/main.rs # use std::env;\n# use std::process;\n# # use minigrep::Config;\n# fn main() { let config = Config::build(env::args()).unwrap_or_else(|err| { eprintln!(\"Problem parsing arguments: {err}\"); process::exit(1); }); // --snip--\n# # if let Err(e) = minigrep::run(config) {\n# eprintln!(\"Application error: {e}\");\n# process::exit(1);\n# }\n} 示例 13-25:将 env::args 的返回值传递给 Config::build env::args 函数返回一个迭代器!不同于将迭代器的值收集到一个 vector 中接着传递一个 slice 给 Config::build,现在我们直接将 env::args 返回的迭代器的所有权传递给 Config::build。 接下来需要更新 Config::build 的定义。在 I/O 项目的 src/lib.rs 中,将 Config::build 的签名改为如示例 13-19 所示。这仍然不能编译因为我们还需更新函数体。 文件名:src/lib.rs # use std::env;\n# use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# pub ignore_case: bool,\n# }\n# impl Config { pub fn build( mut args: impl Iterator, ) -> Result { // --snip--\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # let ignore_case = env::var(\"IGNORE_CASE\").is_ok();\n# # Ok(Config {\n# query,\n# file_path,\n# ignore_case,\n# })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # let results = if config.ignore_case {\n# search_case_insensitive(&config.query, &contents)\n# } else {\n# search(&config.query, &contents)\n# };\n# # for line in results {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 13-19:以迭代器作为参数更新 Config::build 的签名 env::args 函数的标准库文档显示,它返回的迭代器的类型为 std::env::Args,并且这个类型实现了 Iterator trait 并返回 String 值。 我们已经更新了 Config::build 函数的签名,因此参数 args 有一个带有 trait bounds impl Iterator 的泛型类型,而不是 &[String]。这里用到了第十章 “trait 作为参数” 部分讨论过的 impl Trait 语法,这意味着 args 可以是任何实现了 Iterator trait 并返回 String 项(item)的类型。 由于我们获取了 args 的所有权,并且将通过迭代来修改 args,因此我们可以在 args 参数的声明中添加 mut 关键字,使其可变。 使用 Iterator trait 代替索引 接下来,我们将修改 Config::build 的函数体。因为 args 实现了 Iterator trait,因此我们知道可以对其调用 next 方法!示例 13-20 更新了示例 12-23 中的代码,以使用 next 方法: 文件名:src/lib.rs # use std::env;\n# use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# pub ignore_case: bool,\n# }\n# impl Config { pub fn build( mut args: impl Iterator, ) -> Result { args.next(); let query = match args.next() { Some(arg) => arg, None => return Err(\"Didn't get a query string\"), }; let file_path = match args.next() { Some(arg) => arg, None => return Err(\"Didn't get a file path\"), }; let ignore_case = env::var(\"IGNORE_CASE\").is_ok(); Ok(Config { query, file_path, ignore_case, }) }\n}\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # let results = if config.ignore_case {\n# search_case_insensitive(&config.query, &contents)\n# } else {\n# search(&config.query, &contents)\n# };\n# # for line in results {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# # pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.contains(query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 13-20:修改 Config::build 的函数体来使用迭代器方法 请记住 env::args 返回值的第一个值是程序的名称。我们希望忽略它并获取下一个值,所以首先调用 next 且不对其返回值做任何操作。然后,我们再次调用 next 来获取要放入 Config 结构体的 query 字段的值。如果 next 返回 Some,使用 match 来提取其值。如果它返回 None,则意味着没有提供足够的参数并通过 Err 值提早返回。我们对对 file_path 的值也进行同样的操作。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 改进之前的 I/O 项目 » 使用迭代器去除 clone","id":"249","title":"使用迭代器去除 clone"},"25":{"body":"ch01-03-hello-cargo.md commit 299fd1f3e11dd61ca136fb51d713f6b0ba7515ff Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目,因为它可以为你处理很多任务,比如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 依赖 ( dependencies ))。 最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。如果使用 Cargo 来构建 “Hello, world!” 项目,将只会用到 Cargo 构建代码的那部分功能。在编写更复杂的 Rust 程序时,你将添加依赖项,如果使用 Cargo 启动项目,则添加依赖项将更容易。 由于绝大多数 Rust 项目使用 Cargo,本书接下来的部分假设你也使用 Cargo。如果使用 “安装” 部分介绍的官方安装包的话,则自带了 Cargo。如果通过其他方式安装的话,可以在终端输入如下命令检查是否安装了 Cargo: $ cargo --version 如果你看到了版本号,说明已安装!如果看到类似 command not found 的错误,你应该查看相应安装文档以确定如何单独安装 Cargo。","breadcrumbs":"入门指南 » Hello, Cargo! » Hello, Cargo!","id":"25","title":"Hello, Cargo!"},"250":{"body":"I/O 项目中其他可以利用迭代器的地方是 search 函数,示例 13-21 中重现了第十二章结尾示例 12-19 中此函数的定义: 文件名:src/lib.rs # use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# }\n# # impl Config {\n# pub fn build(args: &[String]) -> Result {\n# if args.len() < 3 {\n# return Err(\"not enough arguments\");\n# }\n# # let query = args[1].clone();\n# let file_path = args[2].clone();\n# # Ok(Config { query, file_path })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # Ok(())\n# }\n# pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { let mut results = Vec::new(); for line in contents.lines() { if line.contains(query) { results.push(line); } } results\n}\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn one_result() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# } 示例 13-21:示例 12-19 中 search 函数的定义 可以通过使用迭代器适配器方法来编写更简明的代码。这样做还可以避免使用一个可变的中间 results vector。函数式编程风格倾向于最小化可变状态的数量来使代码更简洁。去除可变状态可能会使未来的并行搜索优化变得更容易,因为我们不必管理对 results vector 的并发访问。示例 13-22 展示了这一变化: 文件名:src/lib.rs # use std::env;\n# use std::error::Error;\n# use std::fs;\n# # pub struct Config {\n# pub query: String,\n# pub file_path: String,\n# pub ignore_case: bool,\n# }\n# # impl Config {\n# pub fn build(\n# mut args: impl Iterator,\n# ) -> Result {\n# args.next();\n# # let query = match args.next() {\n# Some(arg) => arg,\n# None => return Err(\"Didn't get a query string\"),\n# };\n# # let file_path = match args.next() {\n# Some(arg) => arg,\n# None => return Err(\"Didn't get a file path\"),\n# };\n# # let ignore_case = env::var(\"IGNORE_CASE\").is_ok();\n# # Ok(Config {\n# query,\n# file_path,\n# ignore_case,\n# })\n# }\n# }\n# # pub fn run(config: Config) -> Result<(), Box> {\n# let contents = fs::read_to_string(config.file_path)?;\n# # let results = if config.ignore_case {\n# search_case_insensitive(&config.query, &contents)\n# } else {\n# search(&config.query, &contents)\n# };\n# # for line in results {\n# println!(\"{line}\");\n# }\n# # Ok(())\n# }\n# pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { contents .lines() .filter(|line| line.contains(query)) .collect()\n}\n# # pub fn search_case_insensitive<'a>(\n# query: &str,\n# contents: &'a str,\n# ) -> Vec<&'a str> {\n# let query = query.to_lowercase();\n# let mut results = Vec::new();\n# # for line in contents.lines() {\n# if line.to_lowercase().contains(&query) {\n# results.push(line);\n# }\n# }\n# # results\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# # #[test]\n# fn case_sensitive() {\n# let query = \"duct\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Duct tape.\";\n# # assert_eq!(vec![\"safe, fast, productive.\"], search(query, contents));\n# }\n# # #[test]\n# fn case_insensitive() {\n# let query = \"rUsT\";\n# let contents = \"\\\n# Rust:\n# safe, fast, productive.\n# Pick three.\n# Trust me.\";\n# # assert_eq!(\n# vec![\"Rust:\", \"Trust me.\"],\n# search_case_insensitive(query, contents)\n# );\n# }\n# } 示例 13-22:在 search 函数实现中使用迭代器适配器 回忆一下,search 函数的目的是返回所有 contents 中包含 query 的行。类似于示例 13-16 中的 filter 例子,这段代码使用 filter 适配器来保留 line.contains(query) 返回 true 的行。接着使用 collect 将匹配行收集到另一个 vector 中。这样就容易多了!尝试对 search_case_insensitive 函数做出同样的使用迭代器方法的修改吧。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 改进之前的 I/O 项目 » 使用迭代器适配器来使代码更简明","id":"250","title":"使用迭代器适配器来使代码更简明"},"251":{"body":"接下来的逻辑问题就是在代码中应该选择哪种风格,以及原因:是使用示例 13-21 中的原始实现还是使用示例 13-22 中使用迭代器的版本?大部分 Rust 程序员倾向于使用迭代器风格。开始这有点难以掌握,不过一旦你对不同迭代器的工作方式有了感觉之后,迭代器反而更容易理解。相比摆弄不同的循环并创建新 vector,(迭代器)代码则更关注循环的高层次目的。这抽象掉那些老生常谈的代码,这样就更容易看清代码所特有的概念,比如迭代器中每个元素必须满足的过滤条件。 不过这两种实现真的完全等价吗?直觉上的假设是更底层的循环会更快一些。让我们聊聊性能吧。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 改进之前的 I/O 项目 » 选择循环或迭代器","id":"251","title":"选择循环或迭代器"},"252":{"body":"ch13-04-performance.md commit 009fffa4580ffb175f1b8470b5b12e4a63d670e4 为了决定是否使用循环或迭代器,你需要了解哪个实现更快:使用显式 for 循环的 search 函数版本,还是使用迭代器的版本。 我们进行了一个基准测试,将阿瑟·柯南·道尔的《福尔摩斯探案集》的全部内容加载到一个 String 中,并在内容中查找单词 “the”。以下是使用 for 循环版本和使用迭代器版本的 search 函数的基准测试结果: test bench_search_for ... bench: 19,620,300 ns/iter (+/- 915,700)\ntest bench_search_iter ... bench: 19,234,900 ns/iter (+/- 657,200) 结果迭代器版本还要稍微快一点!这里我们不会解释性能测试的代码,我们的目的并不是为了证明它们是完全等同的,而是得出一个怎样比较这两种实现方式性能的基本思路。 对于一个更全面的性能测试,你应该使用不同大小的文本作为 contents,不同的单词以及长度各异的单词作为 query,以及各种其他变化进行检查。关键在于:迭代器,作为一个高级的抽象,被编译成了与手写的底层代码大体一致性能的代码。迭代器是 Rust 的 零成本抽象 ( zero-cost abstractions )之一,它意味着抽象并不会引入额外的运行时开销,它与本贾尼·斯特劳斯特卢普(C++ 的设计和实现者)在 “Foundations of C++”(2012)中所定义的 零开销 ( zero-overhead )如出一辙: In general, C++ implementations obey the zero-overhead principle: What you don't use, you don't pay for. And further: What you do use, you couldn't hand code any better. Bjarne Stroustrup \"Foundations of C++\" 从整体来说,C++ 的实现遵循了零开销原则:你不需要的,无需为它买单。更有甚者的是:你需要的时候,也无法通过手写代码做得更好。 本贾尼·斯特劳斯特卢普 \"Foundations of C++\" 作为另一个例子,以下代码取自一个音频解码器。解码算法使用线性预测数学运算(linear prediction mathematical operation)来根据之前样本的线性函数预测将来的值。这些代码使用迭代器链对作用域中的三个变量进行某种数学计算:一个叫 buffer 的数据 slice、一个有 12 个元素的数组 coefficients、和一个代表位数据位移量的 qlp_shift。我们在这个例子中声明了这些变量,但没有为它们赋值;虽然这些代码在其上下文之外没有太多意义,不过仍是一个简明的现实例子,来展示 Rust 如何将高级概念转换为底层代码。 let buffer: &mut [i32];\nlet coefficients: [i64; 12];\nlet qlp_shift: i16; for i in 12..buffer.len() { let prediction = coefficients.iter() .zip(&buffer[i - 12..i]) .map(|(&c, &s)| c * s as i64) .sum::() >> qlp_shift; let delta = buffer[i]; buffer[i] = prediction as i32 + delta;\n} 为了计算 prediction 的值,这段代码遍历了 coefficients 中的 12 个值,使用 zip 方法将系数与 buffer 的前 12 个值组合在一起。接着将每一对值相乘,再将所有结果相加,然后将总和右移 qlp_shift 位。 像音频解码器这样的程序通常最看重计算的性能。这里,我们创建了一个迭代器,使用了两个适配器,接着消费了其值。那么这段 Rust 代码将会被编译为什么样的汇编代码呢?好吧,在编写本书的这个时候,它被编译成与手写的相同的汇编代码。遍历 coefficients 的值完全用不到循环:Rust 知道这里会迭代 12 次,所以它“展开”(unroll)了循环。展开是一种将循环迭代转换为重复代码,并移除循环控制代码开销的代码优化技术。 所有的系数都被储存在了寄存器中,这意味着访问它们非常快。这里也没有运行时数组访问边界检查。所有这些 Rust 能够提供的优化使得结果代码极为高效。现在你知道了这些,请放心大胆的使用迭代器和闭包吧!它们使得代码看起来更高级,但并不为此引入运行时性能损失。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 性能比较:循环对迭代器 » 性能对比:循环 VS 迭代器","id":"252","title":"性能对比:循环 VS 迭代器"},"253":{"body":"闭包和迭代器是 Rust 受函数式编程语言观念所启发的功能。它们对 Rust 以高性能来明确的表达高级概念的能力有很大贡献。闭包和迭代器的实现达到了不影响运行时性能的程度。这正是 Rust 致力于提供零成本抽象的目标的一部分。 现在我们改进了 I/O 项目的(代码)表现力,那么让我们来看看 cargo 的更多功能,这些功能将帮助我们将项目分享给全世界。","breadcrumbs":"Rust 中的函数式语言功能:迭代器与闭包 » 性能比较:循环对迭代器 » 总结","id":"253","title":"总结"},"254":{"body":"ch14-00-more-about-cargo.md commit 44e31f9f304e0cd9ace01045d17a2aa01a449528 目前为止我们只使用过 Cargo 构建、运行和测试代码这些最基本的功能,不过它还可以做到更多。本章会讨论 Cargo 其他一些更为高级的功能,我们将展示如何: 使用发布配置来自定义构建 将库发布到 crates.io 使用工作空间来组织更大的项目 从 crates.io 安装二进制文件 使用自定义的命令来扩展 Cargo Cargo 的功能不止本章所介绍的,关于其全部功能的详尽解释,请查看 文档","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 进一步认识 Cargo 和 Crates.io","id":"254","title":"进一步认识 Cargo 和 Crates.io"},"255":{"body":"ch14-01-release-profiles.md commit 44e31f9f304e0cd9ace01045d17a2aa01a449528 在 Rust 中 发布配置 ( release profiles )文件是预定义和可定制的,它们包含不同的配置,允许程序员更灵活地控制代码编译的多种选项。每一个配置都相互独立。 Cargo 有两个主要的配置:运行 cargo build 时采用的 dev 配置和运行 cargo build --release 的 release 配置。dev 配置为开发定义了良好的默认配置,release 配置则为发布构建定义了良好的默认配置。 这些配置名称可能很眼熟,因为它们出现在构建的输出中: $ cargo build Finished dev [unoptimized + debuginfo] target(s) in 0.0s\n$ cargo build --release Finished release [optimized] target(s) in 0.0s 构建输出中的 dev 和 release 表明编译器在使用不同的配置。 当项目的 Cargo.toml 文件中没有显式增加任何 [profile.*] 部分的时候,Cargo 会对每一个配置都采用默认设置。通过增加任何希望定制的配置对应的 [profile.*] 部分,我们可以选择覆盖任意默认设置的子集。例如,如下是 dev 和 release 配置的 opt-level 设置的默认值: 文件名:Cargo.toml [profile.dev]\nopt-level = 0 [profile.release]\nopt-level = 3 opt-level 设置控制 Rust 会对代码进行何种程度的优化。这个配置的值从 0 到 3。越高的优化级别需要更多的时间编译,所以如果你在进行开发并经常编译,可能会希望在牺牲一些代码性能的情况下减少优化以便编译得快一些。因此 dev 的 opt-level 默认为 0。当你准备发布时,花费更多时间在编译上则更好。只需要在发布模式编译一次,而编译出来的程序则会运行很多次,所以发布模式用更长的编译时间换取运行更快的代码。这正是为什么 release 配置的 opt-level 默认为 3。 我们可以选择通过在 Cargo.toml 增加不同的值来覆盖任何默认设置。比如,如果我们想要在开发配置中使用级别 1 的优化,则可以在 Cargo.toml 中增加这两行: 文件名:Cargo.toml [profile.dev]\nopt-level = 1 这会覆盖默认的设置 0。现在运行 cargo build 时,Cargo 将会使用 dev 的默认配置加上定制的 opt-level。因为 opt-level 设置为 1,Cargo 会比默认进行更多的优化,但是没有发布构建那么多。 对于每个配置的设置和其默认值的完整列表,请查看 Cargo 的文档 。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 采用发布配置自定义构建 » 采用发布配置自定义构建","id":"255","title":"采用发布配置自定义构建"},"256":{"body":"ch14-02-publishing-to-crates-io.md commit 3f2a6ef48943ade3e9c0eb23d69e2b8b41f057f1 我们曾经在项目中使用 crates.io 上的包作为依赖,不过你也可以通过发布自己的包来向他人分享代码。 crates.io 用来分发包的源代码,所以它主要托管开源代码。 Rust 和 Cargo 有一些帮助他人更方便地找到和使用你发布的包的功能。我们将介绍一些这样的功能,接着讲到如何发布一个包。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 将 crate 发布到 Crates.io","id":"256","title":"将 crate 发布到 Crates.io"},"257":{"body":"准确的包文档有助于其他用户理解如何以及何时使用它们,所以花一些时间编写文档是值得的。第三章中我们讨论了如何使用双斜杠 // 注释 Rust 代码。Rust 也有特定的用于文档的注释类型,通常被称为 文档注释 ( documentation comments ),它们会生成 HTML 文档。这些 HTML 展示公有 API 文档注释的内容,它们意在让对库感兴趣的程序员理解如何 使用 这个 crate,而不是它是如何被 实现 的。 文档注释使用三斜杠 /// 而不是双斜杠以支持 Markdown 注解来格式化文本。文档注释就位于需要文档的项的之前。示例 14-1 展示了一个 my_crate crate 中 add_one 函数的文档注释, 文件名:src/lib.rs /// Adds one to the number given.\n///\n/// # Examples\n///\n/// ```\n/// let arg = 5;\n/// let answer = my_crate::add_one(arg);\n///\n/// assert_eq!(6, answer);\n/// ```\npub fn add_one(x: i32) -> i32 { x + 1\n} 示例 14-1:一个函数的文档注释 这里,我们提供了一个 add_one 函数工作的描述,接着开始了一个标题为 Examples 的部分,和展示如何使用 add_one 函数的代码。可以运行 cargo doc 来生成这个文档注释的 HTML 文档。这个命令运行由 Rust 分发的工具 rustdoc 并将生成的 HTML 文档放入 target/doc 目录。 为了方便起见,运行 cargo doc --open 会构建当前 crate 文档(同时还有所有 crate 依赖的文档)的 HTML 并在浏览器中打开。导航到 add_one 函数将会发现文档注释的文本是如何渲染的,如图 14-1 所示: 图 14-1:add_one 函数的文档注释 HTML 常用(文档注释)部分 示例 14-1 中使用了 # Examples Markdown 标题在 HTML 中创建了一个以 “Examples” 为标题的部分。其他一些 crate 作者经常在文档注释中使用的部分有: Panics :这个函数可能会 panic! 的场景。并不希望程序崩溃的函数调用者应该确保他们不会在这些情况下调用此函数。 Errors :如果这个函数返回 Result,此部分描述可能会出现何种错误以及什么情况会造成这些错误,这有助于调用者编写代码来采用不同的方式处理不同的错误。 Safety :如果这个函数使用 unsafe 代码(这会在第二十章讨论),这一部分应该会涉及到期望函数调用者支持的确保 unsafe 块中代码正常工作的不变条件(invariants)。 大部分文档注释不需要所有这些部分,不过这是一个提醒你检查调用你代码的用户有兴趣了解的内容的列表。 文档注释作为测试 在文档注释中增加示例代码块是一个清楚的表明如何使用库的方法,这么做还有一个额外的好处:cargo test 也会像测试那样运行文档中的示例代码!没有什么比有例子的文档更好的了,但最糟糕的莫过于写完文档后改动了代码,而导致例子不能正常工作。尝试 cargo test 运行像示例 14-1 中 add_one 函数的文档;应该在测试结果中看到像这样的部分: Doc-tests my_crate running 1 test\ntest src/lib.rs - add_one (line 5) ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.27s 现在尝试改变函数或例子来使例子中的 assert_eq! 产生 panic。再次运行 cargo test,你将会看到文档测试捕获到了例子与代码不再同步! 注释包含项的结构 文档注释风格 //! 为包含注释的项,而不是位于注释之后的项增加文档。这通常用于 crate 根文件(通常是 src/lib.rs )或模块的根文件为 crate 或模块整体提供文档。 作为一个例子,为了增加描述包含 add_one 函数的 my_crate crate 目的的文档,可以在 src/lib.rs 开头增加以 //! 开头的注释,如示例 14-2 所示: 文件名:src/lib.rs //! # My Crate\n//!\n//! `my_crate` is a collection of utilities to make performing certain\n//! calculations more convenient. /// Adds one to the number given.\n// --snip--\n# ///\n# /// # Examples\n# ///\n# /// ```\n# /// let arg = 5;\n# /// let answer = my_crate::add_one(arg);\n# ///\n# /// assert_eq!(6, answer);\n# /// ```\n# pub fn add_one(x: i32) -> i32 {\n# x + 1\n# } 示例 14-2:my_crate crate 整体的文档 注意 //! 的最后一行之后没有任何代码。因为它们以 //! 开头而不是 ///,这是属于包含此注释的项而不是注释之后项的文档。在这个情况下时 src/lib.rs 文件,也就是 crate 根文件。这些注释描述了整个 crate。 如果运行 cargo doc --open,将会发现这些注释显示在 my_crate 文档的首页,位于 crate 中公有项列表之上,如图 14-2 所示: 图 14-2:包含 my_crate 整体描述的注释所渲染的文档 位于项之中的文档注释对于描述 crate 和模块特别有用。使用它们描述其容器整体的目的来帮助 crate 用户理解你的代码组织。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 编写有用的文档注释","id":"257","title":"编写有用的文档注释"},"258":{"body":"公有 API 的结构是你发布 crate 时主要需要考虑的。crate 用户没有你那么熟悉其结构,并且如果模块层级过大他们可能会难以找到所需的部分。 第七章介绍了如何使用 mod 关键字来将代码组织进模块中,如何使用 pub 关键字将项变为公有,和如何使用 use 关键字将项引入作用域。然而你开发时候使用的文件架构可能并不方便用户。你的结构可能是一个包含多个层级的分层结构,不过这对于用户来说并不方便。这是因为想要使用被定义在很深层级中的类型的人可能很难发现这些类型的存在。他们也可能会厌烦要使用 use my_crate::some_module::another_module::UsefulType; 而不是 use my_crate::UsefulType; 来使用类型。 好消息是,即使文件结构对于用户来说 不是 很方便,你也无需重新安排内部组织:你可以选择使用 pub use 重导出(re-export)项来使公有结构不同于私有结构。重导出获取位于一个位置的公有项并将其公开到另一个位置,好像它就定义在这个新位置一样。 例如,假设我们创建了一个描述美术信息的库 art。这个库中包含了一个有两个枚举 PrimaryColor 和 SecondaryColor 的模块 kinds,以及一个包含函数 mix 的模块 utils,如示例 14-3 所示: 文件名:src/lib.rs //! # Art\n//!\n//! A library for modeling artistic concepts. pub mod kinds { /// The primary colors according to the RYB color model. pub enum PrimaryColor { Red, Yellow, Blue, } /// The secondary colors according to the RYB color model. pub enum SecondaryColor { Orange, Green, Purple, }\n} pub mod utils { use crate::kinds::*; /// Combines two primary colors in equal amounts to create /// a secondary color. pub fn mix(c1: PrimaryColor, c2: PrimaryColor) -> SecondaryColor { // --snip--\n# unimplemented!(); }\n} 示例 14-3:一个库 art 其组织包含 kinds 和 utils 模块 cargo doc 所生成的 crate 文档首页如图 14-3 所示: 图 14-3:包含 kinds 和 utils 模块的库 art 的文档首页 注意 PrimaryColor 和 SecondaryColor 类型、以及 mix 函数都没有在首页中列出。我们必须点击 kinds 或 utils 才能看到它们。 另一个依赖这个库的 crate 需要 use 语句来导入 art 中的项,这包含指定其当前定义的模块结构。示例 14-4 展示了一个使用 art crate 中 PrimaryColor 和 mix 项的 crate 的例子: 文件名:src/main.rs use art::kinds::PrimaryColor;\nuse art::utils::mix; fn main() { let red = PrimaryColor::Red; let yellow = PrimaryColor::Yellow; mix(red, yellow);\n} 示例 14-4:一个通过导出内部结构使用 art crate 中项的 crate 示例 14-4 中使用 art crate 代码的作者不得不搞清楚 PrimaryColor 位于 kinds 模块而 mix 位于 utils 模块。art crate 的模块结构相比使用它的开发者来说对编写它的开发者更有意义。其内部结构并没有对尝试理解如何使用 art crate 的人提供任何有价值的信息,相反因为不得不搞清楚所需的内容在何处和必须在 use 语句中指定模块名称而显得混乱。 为了从公有 API 中去掉 crate 的内部组织,我们可以采用示例 14-3 中的 art crate 并增加 pub use 语句来重导出项到顶层结构,如示例 14-5 所示: 文件名:src/lib.rs //! # Art\n//!\n//! A library for modeling artistic concepts. pub use self::kinds::PrimaryColor;\npub use self::kinds::SecondaryColor;\npub use self::utils::mix; pub mod kinds { // --snip--\n# /// The primary colors according to the RYB color model.\n# pub enum PrimaryColor {\n# Red,\n# Yellow,\n# Blue,\n# }\n# # /// The secondary colors according to the RYB color model.\n# pub enum SecondaryColor {\n# Orange,\n# Green,\n# Purple,\n# }\n} pub mod utils { // --snip--\n# use crate::kinds::*;\n# # /// Combines two primary colors in equal amounts to create\n# /// a secondary color.\n# pub fn mix(c1: PrimaryColor, c2: PrimaryColor) -> SecondaryColor {\n# SecondaryColor::Orange\n# }\n} 示例 14-5:增加 pub use 语句重导出项 现在此 crate 由 cargo doc 生成的 API 文档会在首页列出重导出的项以及其链接,如图 14-4 所示,这使得 PrimaryColor 和 SecondaryColor 类型和 mix 函数更易于查找。 图 14-10:art 文档的首页,这里列出了重导出的项 art crate 的用户仍然可以看见和选择使用示例 14-4 中的内部结构,或者可以使用示例 14-5 中更为方便的结构,如示例 14-6 所示: 文件名:src/main.rs use art::mix;\nuse art::PrimaryColor; fn main() { // --snip--\n# let red = PrimaryColor::Red;\n# let yellow = PrimaryColor::Yellow;\n# mix(red, yellow);\n} 示例 14-6:一个使用 art crate 中重导出项的程序 对于有很多嵌套模块的情况,使用 pub use 将类型重导出到顶级结构对于使用 crate 的人来说将会是大为不同的体验。pub use 的另一个常见用法是重导出当前 crate 的依赖的定义使其 crate 定义变成你 crate 公有 API 的一部分。 创建一个有用的公有 API 结构更像是一门艺术而非科学,你可以反复检视它们来找出最适合用户的 API。pub use 提供了解耦组织 crate 内部结构和与终端用户体现的灵活性。观察一些你所安装的 crate 的代码来看看其内部结构是否不同于公有 API。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 使用 pub use 导出合适的公有 API","id":"258","title":"使用 pub use 导出合适的公有 API"},"259":{"body":"在你可以发布任何 crate 之前,需要在 crates.io 上注册账号并获取一个 API token。为此,访问位于 crates.io 的首页并使用 GitHub 账号登录。(目前 GitHub 账号是必须的,不过将来该网站可能会支持其他创建账号的方法)一旦登录之后,查看位于 https://crates.io/me/ 的账户设置页面并获取 API token。接着使用该 API token 运行 cargo login 命令,像这样: $ cargo login abcdefghijklmnopqrstuvwxyz012345 这个命令会通知 Cargo 你的 API token 并将其储存在本地的 ~/.cargo/credentials 文件中。注意这个 token 是一个 秘密 ( secret )且不应该与其他人共享。如果因为任何原因与他人共享了这个信息,应该立即到 crates.io 撤销并重新生成一个 token。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 创建 Crates.io 账号","id":"259","title":"创建 Crates.io 账号"},"26":{"body":"我们使用 Cargo 创建一个新项目,然后看看与上面的 “Hello, world!” 项目有什么不同。回到 projects 目录(或者你存放代码的目录)。接着,可在任何操作系统下运行以下命令: $ cargo new hello_cargo\n$ cd hello_cargo 第一行命令新建了名为 hello_cargo 的目录和项目。我们将项目命名为 hello_cargo ,同时 Cargo 在一个同名目录中创建项目文件。 进入 hello_cargo 目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录:一个 Cargo.toml 文件,一个 src 目录,以及位于 src 目录中的 main.rs 文件。 这也会在 hello_cargo 目录初始化了一个 git 仓库,以及一个 .gitignore 文件。如果在一个已经存在的 git 仓库中运行 cargo new,则这些 git 相关文件则不会生成;可以通过运行 cargo new --vcs=git 来覆盖这些行为。 注意:Git 是一个常用的版本控制系统(version control system,VCS)。可以通过 --vcs 参数使 cargo new 切换到其它版本控制系统(VCS),或者不使用 VCS。运行 cargo new --help 参看可用的选项。 请自行选用文本编辑器打开 Cargo.toml 文件。它应该看起来如示例 1-2 所示: 文件名:Cargo.toml [package]\nname = \"hello_cargo\"\nversion = \"0.1.0\"\nedition = \"2021\" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] 示例 1-2:*cargo new* 命令生成的 *Cargo.toml* 的内容 这个文件使用 TOML ( Tom's Obvious, Minimal Language ) 格式,这是 Cargo 配置文件的格式。 第一行,[package],是一个片段(section)标题,表明下面的语句用来配置一个包。随着我们在这个文件增加更多的信息,还将增加其他片段(section)。 接下来的三行设置了 Cargo 编译程序所需的配置:项目的名称、项目的版本以及要使用的 Rust 版本。 附录 E 会介绍 edition 的值。 最后一行,[dependencies],是罗列项目依赖的片段的开始。在 Rust 中,代码包被称为 crates 。这个项目并不需要其他的 crate,不过在第二章的第一个项目会用到依赖,那时会用得上这个片段。 现在打开 src/main.rs 看看: 文件名:src/main.rs fn main() { println!(\"Hello, world!\");\n} Cargo 为你生成了一个 “Hello, world!” 程序,正如我们之前编写的示例 1-1!目前为止,我们的项目与 Cargo 生成项目的区别是 Cargo 将代码放在 src 目录,同时项目根目录包含一个 Cargo.toml 配置文件。 Cargo 期望源文件存放在 src 目录中。项目根目录只存放 README、license 信息、配置文件和其他跟代码无关的文件。使用 Cargo 帮助你保持项目干净整洁,一切井井有条。 如果没有使用 Cargo 开始项目,比如我们创建的 “Hello, world!” 项目,你可以将其转换为使用 Cargo 的项目。将项目代码移入 src 目录,并创建一个合适的 Cargo.toml 文件。一个简单的创建 Cargo.toml 文件的方法是运行 cargo init,它会自动为你创建该文件。","breadcrumbs":"入门指南 » Hello, Cargo! » 使用 Cargo 创建项目","id":"26","title":"使用 Cargo 创建项目"},"260":{"body":"比如说你已经有一个希望发布的 crate。在发布之前,你需要在 crate 的 Cargo.toml 文件的 [package] 部分增加一些本 crate 的元信息(metadata)。 首先 crate 需要一个唯一的名称。虽然在本地开发 crate 时,可以使用任何你喜欢的名称。不过 crates.io 上的 crate 名称遵守先到先得的分配原则。一旦某个 crate 名称被使用,其他人就不能再发布这个名称的 crate 了。请搜索你希望使用的名称来找出它是否已被使用。如果没有,修改 Cargo.toml 中 [package] 里的名称为你希望用于发布的名称,像这样: 文件名:Cargo.toml [package]\nname = \"guessing_game\" 即使你选择了一个唯一的名称,如果此时尝试运行 cargo publish 发布该 crate 的话,会得到一个警告接着是一个错误: $ cargo publish Updating crates.io index\nwarning: manifest has no description, license, license-file, documentation, homepage or repository.\nSee https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info.\n--snip--\nerror: failed to publish to registry at https://crates.io Caused by: the remote server responded with an error: missing or empty metadata fields: description, license. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for how to upload metadata 这个错误是因为我们缺少一些关键信息:关于该 crate 用途的描述和用户可能在何种条款下使用该 crate 的 license。在 Cargo.toml 中添加通常是一两句话的描述,因为它将在搜索结果中和你的 crate 一起显示。对于 license 字段,你需要一个 license 标识符值 ( license identifier value )。 Linux 基金会的 Software Package Data Exchange (SPDX) 列出了可以使用的标识符。例如,为了指定 crate 使用 MIT License,增加 MIT 标识符: 文件名:Cargo.toml [package]\nname = \"guessing_game\"\nlicense = \"MIT\" 如果你希望使用不存在于 SPDX 的 license,则需要将 license 文本放入一个文件,将该文件包含进项目中,接着使用 license-file 来指定文件名而不是使用 license 字段。 关于项目所适用的 license 指导超出了本书的范畴。很多 Rust 社区成员选择与 Rust 自身相同的 license,这是一个双许可的 MIT OR Apache-2.0。这个实践展示了也可以通过 OR 分隔为项目指定多个 license 标识符。 那么,有了唯一的名称、版本号、由 cargo new 新建项目时增加的作者信息、描述和所选择的 license,已经准备好发布的项目的 Cargo.toml 文件可能看起来像这样: 文件名:Cargo.toml [package]\nname = \"guessing_game\"\nversion = \"0.1.0\"\nedition = \"2021\"\ndescription = \"A fun game where you guess what number the computer has chosen.\"\nlicense = \"MIT OR Apache-2.0\" [dependencies] Cargo 的文档 描述了其他可以指定的元信息,它们可以帮助你的 crate 更容易被发现和使用!","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 向新 crate 添加元信息","id":"260","title":"向新 crate 添加元信息"},"261":{"body":"现在我们创建了一个账号,保存了 API token,为 crate 选择了一个名字,并指定了所需的元数据,你已经准备好发布了!发布 crate 会上传特定版本的 crate 到 crates.io 以供他人使用。 发布 crate 时请多加小心,因为发布是 永久性的 ( permanent )。对应版本不可能被覆盖,其代码也不可能被删除。 crates.io 的一个主要目标是作为一个存储代码的永久文档服务器,这样所有依赖 crates.io 中的 crate 的项目都能一直正常工作。而允许删除版本没办法达成这个目标。然而,可以被发布的版本号却没有限制。 再次运行 cargo publish 命令。这次它应该会成功: $ cargo publish Updating crates.io index Packaging guessing_game v0.1.0 (file:///projects/guessing_game) Verifying guessing_game v0.1.0 (file:///projects/guessing_game) Compiling guessing_game v0.1.0\n(file:///projects/guessing_game/target/package/guessing_game-0.1.0) Finished dev [unoptimized + debuginfo] target(s) in 0.19s Uploading guessing_game v0.1.0 (file:///projects/guessing_game) 恭喜!你现在向 Rust 社区分享了代码,而且任何人都可以轻松的将你的 crate 加入他们项目的依赖。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 发布到 Crates.io","id":"261","title":"发布到 Crates.io"},"262":{"body":"当你修改了 crate 并准备好发布新版本时,改变 Cargo.toml 中 version 所指定的值。请使用 语义化版本规则 来根据修改的类型决定下一个版本号。接着运行 cargo publish 来上传新版本。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 发布现存 crate 的新版本","id":"262","title":"发布现存 crate 的新版本"},"263":{"body":"虽然你不能删除之前版本的 crate,但是可以阻止任何将来的项目将它们加入到依赖中。这在某个版本因为这样或那样的原因被破坏的情况很有用。对于这种情况,Cargo 支持 撤回 ( yanking )某个版本。 撤回某个版本会阻止新项目依赖此版本,不过所有现存此依赖的项目仍然能够下载和依赖这个版本。从本质上说,撤回意味着所有带有 Cargo.lock 的项目的依赖不会被破坏,同时任何新生成的 Cargo.lock 将不能使用被撤回的版本。 为了撤回一个版本的 crate,在之前发布 crate 的目录运行 cargo yank 并指定希望撤回的版本。例如,如果我们发布了一个名为 guessing_game 的 crate 的 1.0.1 版本并希望撤回它,在 guessing_game 项目目录运行: $ cargo yank --vers 1.0.1 Updating crates.io index Yank guessing_game@1.0.1 也可以撤销撤回操作,并允许项目可以再次开始依赖某个版本,通过在命令上增加 --undo: $ cargo yank --vers 1.0.1 --undo Updating crates.io index Unyank guessing_game@1.0.1 撤回 并没有 删除任何代码。举例来说,撤回功能并不能删除不小心上传的秘密信息。如果出现了这种情况,请立即重新设置这些秘密信息。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 将 crate 发布到 Crates.io » 使用 cargo yank 从 Crates.io 弃用版本","id":"263","title":"使用 cargo yank 从 Crates.io 弃用版本"},"264":{"body":"ch14-03-cargo-workspaces.md commit 704c51eec2f26a0133ae17a2c01986590c05a045 第十二章中,我们构建一个包含二进制 crate 和库 crate 的包。你可能会发现,随着项目开发的深入,库 crate 持续增大,而你希望将其进一步拆分成多个库 crate。Cargo 提供了一个叫 工作空间 ( workspaces )的功能,它可以帮助我们管理多个相关的协同开发的包。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » Cargo 工作空间 » Cargo 工作空间","id":"264","title":"Cargo 工作空间"},"265":{"body":"工作空间 是一系列共享同样的 Cargo.lock 和输出目录的包。让我们使用工作空间创建一个项目 —— 这里采用常见的代码以便可以关注工作空间的结构。有多种组织工作空间的方式,所以我们只展示一个常用方法。我们的工作空间有一个二进制项目和两个库。二进制项目会提供主要功能,并会依赖另两个库。一个库会提供 add_one 方法而第二个会提供 add_two 方法。这三个 crate 将会是相同工作空间的一部分。让我们以新建工作空间目录开始: $ mkdir add\n$ cd add 接着在 add 目录中,创建 Cargo.toml 文件。这个 Cargo.toml 文件配置了整个工作空间。它不会包含 [package] 部分。相反,它以 [workspace] 部分作为开始,并通过指定 adder 的路径来为工作空间增加成员,如下会加入二进制 crate: 文件名:Cargo.toml [workspace] members = [ \"adder\",\n] 接下来,在 add 目录运行 cargo new 新建 adder 二进制 crate: $ cargo new adder Created binary (application) `adder` package 到此为止,可以运行 cargo build 来构建工作空间。 add 目录中的文件应该看起来像这样: ├── Cargo.lock\n├── Cargo.toml\n├── adder\n│ ├── Cargo.toml\n│ └── src\n│ └── main.rs\n└── target 工作空间在顶级目录有一个 target 目录;adder 并没有自己的 target 目录。即使进入 adder 目录运行 cargo build,构建结果也位于 add/target 而不是 add/adder/target 。工作空间中的 crate 之间相互依赖。如果每个 crate 有其自己的 target 目录,为了在自己的 target 目录中生成构建结果,工作空间中的每一个 crate 都不得不相互重新编译其他 crate。通过共享一个 target 目录,工作空间可以避免其他 crate 重复构建。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » Cargo 工作空间 » 创建工作空间","id":"265","title":"创建工作空间"},"266":{"body":"接下来,让我们在工作空间中指定另一个成员 crate。这个 crate 位于 add_one 目录中,所以修改顶级 Cargo.toml 为也包含 add_one 路径: 文件名:Cargo.toml [workspace] members = [ \"adder\", \"add_one\",\n] 接着新生成一个叫做 add_one 的库: $ cargo new add_one --lib Created library `add_one` package 现在 add 目录应该有如下目录和文件: ├── Cargo.lock\n├── Cargo.toml\n├── add_one\n│ ├── Cargo.toml\n│ └── src\n│ └── lib.rs\n├── adder\n│ ├── Cargo.toml\n│ └── src\n│ └── main.rs\n└── target 在 add_one/src/lib.rs 文件中,增加一个 add_one 函数: 文件名:add_one/src/lib.rs pub fn add_one(x: i32) -> i32 { x + 1\n} 现在我们有了二进制 adder 依赖库 crate add_one。首先需要在 adder/Cargo.toml 文件中增加 add_one 作为路径依赖: 文件名:adder/Cargo.toml [dependencies]\nadd_one = { path = \"../add_one\" } cargo 并不假定工作空间中的 Crates 会相互依赖,所以需要明确表明工作空间中 crate 的依赖关系。 接下来,在 adder crate 中使用( add_one crate 中的)函数 add_one。打开 adder/src/main.rs 在顶部增加一行 use 将新 add_one 库 crate 引入作用域。接着修改 main 函数来调用 add_one 函数,如示例 14-7 所示。 文件名:adder/src/main.rs use add_one; fn main() { let num = 10; println!(\"Hello, world! {num} plus one is {}!\", add_one::add_one(num));\n} 示例 14-7:在 adder crate 中使用 add_one 库 crate 在 add 目录中运行 cargo build 来构建工作空间! $ cargo build Compiling add_one v0.1.0 (file:///projects/add/add_one) Compiling adder v0.1.0 (file:///projects/add/adder) Finished dev [unoptimized + debuginfo] target(s) in 0.68s 为了在顶层 add 目录运行二进制 crate,可以通过 -p 参数和包名称来运行 cargo run 指定工作空间中我们希望使用的包: $ cargo run -p adder Finished dev [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/adder`\nHello, world! 10 plus one is 11! 这会运行 adder/src/main.rs 中的代码,其依赖 add_one crate 在工作空间中依赖外部包 还需注意的是工作空间只在根目录有一个 Cargo.lock ,而不是在每一个 crate 目录都有 Cargo.lock 。这确保了所有的 crate 都使用完全相同版本的依赖。如果在 Cargo.toml 和 add_one/Cargo.toml 中都增加 rand crate,则 Cargo 会将其都解析为同一版本并记录到唯一的 Cargo.lock 中。使得工作空间中的所有 crate 都使用相同的依赖意味着其中的 crate 都是相互兼容的。让我们在 add_one/Cargo.toml 中的 [dependencies] 部分增加 rand crate 以便能够在 add_one crate 中使用 rand crate: 文件名:add_one/Cargo.toml [dependencies]\nrand = \"0.8.5\" 现在就可以在 add_one/src/lib.rs 中增加 use rand; 了,接着在 add 目录运行 cargo build 构建整个工作空间就会引入并编译 rand crate: $ cargo build Updating crates.io index Downloaded rand v0.8.5 --snip-- Compiling rand v0.8.5 Compiling add_one v0.1.0 (file:///projects/add/add_one)\nwarning: unused import: `rand` --> add_one/src/lib.rs:1:5 |\n1 | use rand; | ^^^^ | = note: `#[warn(unused_imports)]` on by default warning: `add_one` (lib) generated 1 warning Compiling adder v0.1.0 (file:///projects/add/adder) Finished dev [unoptimized + debuginfo] target(s) in 10.18s 现在顶级的 Cargo.lock 包含了 add_one 的 rand 依赖的信息。然而,即使 rand 被用于工作空间的某处,也不能在其他 crate 中使用它,除非也在它们的 Cargo.toml 中加入 rand。例如,如果在顶级的 adder crate 的 adder/src/main.rs 中增加 use rand;,会得到一个错误: $ cargo build --snip-- Compiling adder v0.1.0 (file:///projects/add/adder)\nerror[E0432]: unresolved import `rand` --> adder/src/main.rs:2:5 |\n2 | use rand; | ^^^^ no external crate `rand` 为了修复这个错误,修改顶级 adder crate 的 Cargo.toml 来表明 rand 也是这个 crate 的依赖。构建 adder crate 会将 rand 加入到 Cargo.lock 中 adder 的依赖列表中,但是这并不会下载 rand 的额外拷贝。Cargo 确保了工作空间中任何使用 rand 的 crate 都采用相同的版本,这节省了空间并确保了工作空间中的 crate 将是相互兼容的。 为工作空间增加测试 作为另一个提升,让我们为 add_one crate 中的 add_one::add_one 函数增加一个测试: 文件名:add_one/src/lib.rs pub fn add_one(x: i32) -> i32 { x + 1\n} #[cfg(test)]\nmod tests { use super::*; #[test] fn it_works() { assert_eq!(3, add_one(2)); }\n} 在顶级 add 目录运行 cargo test。在像这样的工作空间结构中运行 cargo test 会运行工作空间中所有 crate 的测试。: $ cargo test Compiling add_one v0.1.0 (file:///projects/add/add_one) Compiling adder v0.1.0 (file:///projects/add/adder) Finished test [unoptimized + debuginfo] target(s) in 0.27s Running unittests src/lib.rs (target/debug/deps/add_one-f0253159197f7841) running 1 test\ntest tests::it_works ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running unittests src/main.rs (target/debug/deps/adder-49979ff40686fa8e) running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests add_one running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 输出的第一部分显示 add_one crate 的 it_works 测试通过了。下一个部分显示 adder crate 中找到了 0 个测试,最后一部分显示 add_one crate 中有 0 个文档测试。 也可以选择运行工作空间中特定 crate 的测试,通过在根目录使用 -p 参数并指定希望测试的 crate 名称: $ cargo test -p add_one Finished test [unoptimized + debuginfo] target(s) in 0.00s Running unittests src/lib.rs (target/debug/deps/add_one-b3235fea9a156f74) running 1 test\ntest tests::it_works ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests add_one running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 输出显示了 cargo test 只运行了 add_one crate 的测试而没有运行 adder crate 的测试。 如果你选择向 crates.io 发布工作空间中的 crate,每一个工作空间中的 crate 需要单独发布。就像 cargo test 一样,可以通过 -p 参数并指定期望发布的 crate 名来发布工作空间中的某个特定的 crate。 现在尝试以类似 add_one crate 的方式向工作空间增加 add_two crate 来作为更多的练习! 随着项目增长,考虑使用工作空间:每一个更小的组件比一大块代码要容易理解。如果它们经常需要同时被修改的话,将 crate 保持在工作空间中更易于协调 crate 的改变。","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » Cargo 工作空间 » 在工作空间中创建第二个包","id":"266","title":"在工作空间中创建第二个包"},"267":{"body":"ch14-04-installing-binaries.md commit 704c51eec2f26a0133ae17a2c01986590c05a045 cargo install 命令用于在本地安装和使用二进制 crate。它并不打算替换系统中的包;它意在作为一个方便 Rust 开发者们安装其他人已经在 crates.io 上共享的工具的手段。只有拥有二进制目标文件的包能够被安装。 二进制目标 文件是在 crate 有 src/main.rs 或者其他指定为二进制文件时所创建的可执行程序,这不同于自身不能执行但适合包含在其他程序中的库目标文件。通常 crate 的 README 文件中有该 crate 是库、二进制目标还是两者兼有的信息。 所有来自 cargo install 的二进制文件都安装到 Rust 安装根目录的 bin 文件夹中。如果你是使用 rustup.rs 来安装 Rust 且没有自定义任何配置,这个目录将是 $HOME/.cargo/bin。确保将这个目录添加到 $PATH 环境变量中就能够运行通过 cargo install 安装的程序了。 例如,第十二章提到的叫做 ripgrep 的用于搜索文件的 grep 的 Rust 实现。为了安装 ripgrep 运行如下: $ cargo install ripgrep Updating crates.io index Downloaded ripgrep v13.0.0 Downloaded 1 crate (243.3 KB) in 0.88s Installing ripgrep v13.0.0\n--snip-- Compiling ripgrep v13.0.0 Finished release [optimized + debuginfo] target(s) in 3m 10s Installing ~/.cargo/bin/rg Installed package `ripgrep v13.0.0` (executable `rg`) 最后一行输出展示了安装的二进制文件的位置和名称,在这里 ripgrep 被命名为 rg。只要你像上面提到的那样将安装目录加入 $PATH,就可以运行 rg --help 并开始使用一个更快更 Rust 的工具来搜索文件了!","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » 使用 cargo install 安装二进制文件 » 使用 cargo install 安装二进制文件","id":"267","title":"使用 cargo install 安装二进制文件"},"268":{"body":"ch14-05-extending-cargo.md commit c084bdd9ee328e7e774df19882ccc139532e53d8 Cargo 的设计使得开发者可以通过新的子命令来对 Cargo 进行扩展,而无需修改 Cargo 本身。如果 $PATH 中有类似 cargo-something 的二进制文件,就可以通过 cargo something 来像 Cargo 子命令一样运行它。像这样的自定义命令也可以运行 cargo --list 来展示出来。能够通过 cargo install 向 Cargo 安装扩展并可以如内建 Cargo 工具那样运行它们是 Cargo 设计上的一个非常方便的优点!","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » Cargo 自定义扩展命令 » Cargo 自定义扩展命令","id":"268","title":"Cargo 自定义扩展命令"},"269":{"body":"通过 Cargo 和 crates.io 来分享代码是使得 Rust 生态环境可以用于许多不同的任务的重要组成部分。Rust 的标准库是小而稳定的,不过 crate 易于分享和使用,并采用一个不同语言自身的时间线来提供改进。不要羞于在 crates.io 上共享对你有用的代码,因为它很有可能对别人也很有用!","breadcrumbs":"更多关于 Cargo 和 Crates.io 的内容 » Cargo 自定义扩展命令 » 总结","id":"269","title":"总结"},"27":{"body":"现在让我们看看通过 Cargo 构建和运行 “Hello, world!” 程序有什么不同!在 hello_cargo 目录下,输入下面的命令来构建项目: $ cargo build Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs 这个命令会创建一个可执行文件 target/debug/hello_cargo (在 Windows 上是 target\\debug\\hello_cargo.exe ),而不是放在目前目录下。由于默认的构建方法是调试构建(debug build),Cargo 会将可执行文件放在名为 debug 的目录中。可以通过这个命令运行可执行文件: $ ./target/debug/hello_cargo # 或者在 Windows 下为 .\\target\\debug\\hello_cargo.exe\nHello, world! 如果一切顺利,终端上应该会打印出 Hello, world!。首次运行 cargo build 时,也会使 Cargo 在项目根目录创建一个新文件: Cargo.lock 。这个文件记录项目依赖的实际版本。这个项目并没有依赖,所以其内容比较少。你自己永远也不需要碰这个文件,让 Cargo 处理它就行了。 我们刚刚使用 cargo build 构建了项目,并使用 ./target/debug/hello_cargo 运行了程序,也可以使用 cargo run 在一个命令中同时编译并运行生成的可执行文件: $ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs Running `target/debug/hello_cargo`\nHello, world! 比起要记得运行 cargo build 之后再用可执行文件的完整路径来运行程序,使用 cargo run 可以实现完全相同的效果,而且要方便得多,所以大多数开发者会使用 cargo run。 注意这一次并没有出现表明 Cargo 正在编译 hello_cargo 的输出。Cargo 发现文件并没有被改变,所以它并没有重新编译,而是直接运行了可执行文件。如果修改了源文件的话,Cargo 会在运行之前重新构建项目,并会出现像这样的输出: $ cargo run Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs Running `target/debug/hello_cargo`\nHello, world! Cargo 还提供了一个叫 cargo check 的命令。该命令快速检查代码确保其可以编译,但并不产生可执行文件: $ cargo check Checking hello_cargo v0.1.0 (file:///projects/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs 为什么你会不需要可执行文件呢?通常 cargo check 要比 cargo build 快得多,因为它省略了生成可执行文件的步骤。如果你在编写代码时持续的进行检查,cargo check 可以让你快速了解现在的代码能不能正常通过编译!为此很多 Rustaceans 编写代码时定期运行 cargo check 确保它们可以编译。当准备好使用可执行文件时才运行 cargo build。 我们回顾下已学习的 Cargo 内容: 可以使用 cargo new 创建项目。 可以使用 cargo build 构建项目。 可以使用 cargo run 一步构建并运行项目。 可以使用 cargo check 在不生成二进制文件的情况下构建项目来检查错误。 有别于将构建结果放在与源码相同的目录,Cargo 会将其放到 target/debug 目录。 使用 Cargo 的一个额外的优点是,不管你使用什么操作系统,其命令都是一样的。所以从现在开始本书将不再为 Linux 和 macOS 以及 Windows 提供相应的命令。","breadcrumbs":"入门指南 » Hello, Cargo! » 构建并运行 Cargo 项目","id":"27","title":"构建并运行 Cargo 项目"},"270":{"body":"ch15-00-smart-pointers.md commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e 指针 ( pointer )是一个包含内存地址的变量的通用概念。这个地址引用,或 “指向”(points at)一些其他数据。Rust 中最常见的指针是第四章介绍的 引用 ( reference )。引用以 & 符号为标志并借用了它们所指向的值。除了引用数据没有任何其他特殊功能,也没有额外开销。 另一方面, 智能指针 ( smart pointers )是一类数据结构,它们的表现类似指针,但是也拥有额外的元数据和功能。智能指针的概念并不为 Rust 所独有;其起源于 C++ 并存在于其他语言中。Rust 标准库中定义了多种不同的智能指针,它们提供了多于引用的额外功能。为了探索其基本概念,我们来看看一些智能指针的例子,这包括 引用计数 ( reference counting )智能指针类型。这种指针允许数据有多个所有者,它会记录所有者的数量,当没有所有者时清理数据。在 Rust 中因为引用和借用,普通引用和智能指针的一个额外的区别是引用是一类只借用数据的指针;相反,在大部分情况下,智能指针 拥有 它们指向的数据。 实际上本书中已经出现过一些智能指针,比如第八章的 String 和 Vec,虽然当时并没有这样称呼它们。这些类型都属于智能指针,因为它们拥有一些数据,并允许你修改这些数据。它们也拥有元数据和额外的功能或保证。例如 String 存储了其容量作为元数据,并拥有额外的能力来确保其数据总是有效的 UTF-8 编码。 智能指针通常使用结构体实现。智能指针不同于结构体的地方在于其实现了 Deref 和 Drop trait。Deref trait 允许智能指针结构体实例表现的像引用一样,这样就可以编写既用于引用、又用于智能指针的代码。Drop trait 允许我们自定义当智能指针离开作用域时运行的代码。本章会讨论这些 trait 以及为什么对于智能指针来说它们很重要。 考虑到智能指针是一个在 Rust 经常被使用的通用设计模式,本章并不会覆盖所有现存的智能指针。很多库都有自己的智能指针而你也可以编写属于你自己的智能指针。这里将会讲到的是来自标准库中最常用的一些: Box,用于在堆上分配值 Rc,一个引用计数类型,其数据可以有多个所有者 Ref 和 RefMut,通过 RefCell 访问。( RefCell 是一个在运行时而不是在编译时执行借用规则的类型)。 另外我们会涉及 内部可变性 ( interior mutability )模式,这是不可变类型暴露出改变其内部值的 API。我们也会讨论 引用循环 ( reference cycles )会如何泄漏内存,以及如何避免。 让我们开始吧!","breadcrumbs":"智能指针 » 智能指针","id":"270","title":"智能指针"},"271":{"body":"ch15-01-box.md commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e 最简单直接的智能指针是 box ,其类型是 Box。box 允许你将一个值放在堆上而不是栈上。留在栈上的则是指向堆数据的指针。如果你想回顾一下栈与堆的区别请参考第四章。 除了数据被储存在堆上而不是栈上之外,box 没有性能损失。不过也没有很多额外的功能。它们多用于如下场景: 当有一个在编译时未知大小的类型,而又想要在需要确切大小的上下文中使用这个类型值的时候 当有大量数据并希望在确保数据不被拷贝的情况下转移所有权的时候 当希望拥有一个值并只关心它的类型是否实现了特定 trait 而不是其具体类型的时候 我们会在 “box 允许创建递归类型” 部分展示第一种场景。在第二种情况中,转移大量数据的所有权可能会花费很长的时间,因为数据在栈上进行了拷贝。为了改善这种情况下的性能,可以通过 box 将这些数据储存在堆上。接着,只有少量的指针数据在栈上被拷贝。第三种情况被称为 trait 对象 ( trait object ),第十八章刚好有一整个部分 “顾及不同类型值的 trait 对象” 专门讲解这个主题。所以这里所学的内容会在第十八章再次用上!","breadcrumbs":"智能指针 » 使用 Box 指向堆上数据 » 使用Box指向堆上的数据","id":"271","title":"使用Box指向堆上的数据"},"272":{"body":"在讨论 Box 的堆存储用例之前,让我们熟悉一下语法以及如何与储存在 Box 中的值进行交互。 示例 15-1 展示了如何使用 box 在堆上储存一个 i32: 文件名:src/main.rs fn main() { let b = Box::new(5); println!(\"b = {b}\");\n} 示例 15-1:使用 box 在堆上储存一个 i32 值 这里定义了变量 b,其值是一个指向被分配在堆上的值 5 的 Box。这个程序会打印出 b = 5;在这个例子中,我们可以像数据是储存在栈上的那样访问 box 中的数据。正如任何拥有数据所有权的值那样,当像 b 这样的 box 在 main 的末尾离开作用域时,它将被释放。这个释放过程作用于 box 本身(位于栈上)和它所指向的数据(位于堆上)。 将一个单独的值存放在堆上并不是很有意义,所以像示例 15-1 这样单独使用 box 并不常见。将像单个 i32 这样的值储存在栈上,也就是其默认存放的地方在大部分使用场景中更为合适。让我们看看一个不使用 box 时无法定义的类型的例子。","breadcrumbs":"智能指针 » 使用 Box 指向堆上数据 » 使用 Box 在堆上储存数据","id":"272","title":"使用 Box 在堆上储存数据"},"273":{"body":"递归类型 ( recursive type )的值可以拥有另一个同类型的值作为其自身的一部分。但是这会产生一个问题,因为 Rust 需要在编译时知道类型占用多少空间。递归类型的值嵌套理论上可以无限地进行下去,所以 Rust 不知道递归类型需要多少空间。因为 box 有一个已知的大小,所以通过在循环类型定义中插入 box,就可以创建递归类型了。 作为一个递归类型的例子,让我们探索一下 cons list 。这是一个函数式编程语言中常见的数据类型,来展示这个(递归类型)概念。除了递归之外,我们将要定义的 cons list 类型是很直白的,所以这个例子中的概念,在任何遇到更为复杂的涉及到递归类型的场景时都很实用。 cons list 的更多内容 cons list 是一个来源于 Lisp 编程语言及其方言的数据结构,它由嵌套的列表组成。它的名字来源于 Lisp 中的 cons 函数(“construct function\" 的缩写),它利用两个参数来构造一个新的列表。通过对一个包含值的列表和另一个值调用 cons,可以构建由递归列表组成的 cons list。 例如这里有一个包含列表 1,2,3 的 cons list 的伪代码表示,其每一个列表在一个括号中: (1, (2, (3, Nil))) cons list 的每一项都包含两个元素:当前项的值和下一项。其最后一项值包含一个叫做 Nil 的值且没有下一项。cons list 通过递归调用 cons 函数产生。代表递归的终止条件(base case)的规范名称是 Nil,它宣布列表的终止。注意这不同于第六章中的 “null” 或 “nil” 的概念,它们代表无效或缺失的值。 cons list 并不是一个 Rust 中常见的类型。大部分在 Rust 中需要列表的时候,Vec 是一个更好的选择。其他更为复杂的递归数据类型 确实 在 Rust 的很多场景中很有用,不过通过以 cons list 作为开始,我们可以探索如何使用 box 毫不费力的定义一个递归数据类型。 示例 15-2 包含一个 cons list 的枚举定义。注意这还不能编译因为这个类型没有已知的大小,之后我们会展示: 文件名:src/main.rs enum List { Cons(i32, List), Nil,\n}\n# # fn main() {} 示例 15-2:第一次尝试定义一个代表 i32 值的 cons list 数据结构的枚举 注意:出于示例的需要我们选择实现一个只存放 i32 值的 cons list。也可以用泛型,正如第十章讲到的,来定义一个可以存放任何类型值的 cons list 类型。 使用这个 cons list 来储存列表 1, 2, 3 将看起来如示例 15-3 所示: 文件名:src/main.rs # enum List {\n# Cons(i32, List),\n# Nil,\n# }\n# use crate::List::{Cons, Nil}; fn main() { let list = Cons(1, Cons(2, Cons(3, Nil)));\n} 示例 15-3:使用 List 枚举储存列表 1, 2, 3 第一个 Cons 储存了 1 和另一个 List 值。这个 List 是另一个包含 2 的 Cons 值和下一个 List 值。接着又有另一个存放了 3 的 Cons 值和最后一个值为 Nil 的 List,非递归成员代表了列表的结尾。 如果尝试编译示例 15-3 的代码,会得到如示例 15-4 所示的错误: $ cargo run Compiling cons-list v0.1.0 (file:///projects/cons-list)\nerror[E0072]: recursive type `List` has infinite size --> src/main.rs:1:1 |\n1 | enum List { | ^^^^^^^^^\n2 | Cons(i32, List), | ---- recursive without indirection |\nhelp: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle |\n2 | Cons(i32, Box), | ++++ + error[E0391]: cycle detected when computing when `List` needs drop --> src/main.rs:1:1 |\n1 | enum List { | ^^^^^^^^^ | = note: ...which immediately requires computing when `List` needs drop again = note: cycle used when computing whether `List` needs drop = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information Some errors have detailed explanations: E0072, E0391.\nFor more information about an error, try `rustc --explain E0072`.\nerror: could not compile `cons-list` (bin \"cons-list\") due to 2 previous errors 示例 15-4:尝试定义一个递归枚举时得到的错误 这个错误表明这个类型 “有无限的大小”。其原因是 List 的一个成员被定义为是递归的:它直接存放了另一个相同类型的值。这意味着 Rust 无法计算为了存放 List 值到底需要多少空间。让我们拆开来看为何会得到这个错误。首先了解一下 Rust 如何决定需要多少空间来存放一个非递归类型。","breadcrumbs":"智能指针 » 使用 Box 指向堆上数据 » Box 允许创建递归类型","id":"273","title":"Box 允许创建递归类型"},"274":{"body":"回忆一下第六章讨论枚举定义时示例 6-2 中定义的 Message 枚举: enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(i32, i32, i32),\n}\n# # fn main() {} 当 Rust 需要知道要为 Message 值分配多少空间时,它可以检查每一个成员并发现 Message::Quit 并不需要任何空间,Message::Move 需要足够储存两个 i32 值的空间,依此类推。因为 enum 实际上只会使用其中的一个成员,所以 Message 值所需的空间等于储存其最大成员的空间大小。 与此相对当 Rust 编译器检查像示例 15-2 中的 List 这样的递归类型时会发生什么呢。编译器尝试计算出储存一个 List 枚举需要多少内存,并开始检查 Cons 成员,那么 Cons 需要的空间等于 i32 的大小加上 List 的大小。为了计算 List 需要多少内存,它检查其成员,从 Cons 成员开始。Cons成员储存了一个 i32 值和一个List值,这样的计算将无限进行下去,如图 15-1 所示: 图 15-1:一个包含无限个 Cons 成员的无限 List","breadcrumbs":"智能指针 » 使用 Box 指向堆上数据 » 计算非递归类型的大小","id":"274","title":"计算非递归类型的大小"},"275":{"body":"因为 Rust 无法计算出要为定义为递归的类型分配多少空间,所以编译器给出了一个包括了有用建议的错误: help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `List` representable |\n2 | Cons(i32, Box), | ++++ + 在建议中,“indirection” 意味着不同于直接储存一个值,应该间接的储存一个指向值的指针。 因为 Box 是一个指针,我们总是知道它需要多少空间:指针的大小并不会根据其指向的数据量而改变。这意味着可以将 Box 放入 Cons 成员中而不是直接存放另一个 List 值。Box 会指向另一个位于堆上的 List 值,而不是存放在 Cons 成员中。从概念上讲,我们仍然有一个通过在其中 “存放” 其他列表创建的列表,不过现在实现这个概念的方式更像是一个项挨着另一项,而不是一项包含另一项。 我们可以修改示例 15-2 中 List 枚举的定义和示例 15-3 中对 List 的应用,如示例 15-65 所示,这是可以编译的: 文件名:src/main.rs enum List { Cons(i32, Box), Nil,\n} use crate::List::{Cons, Nil}; fn main() { let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));\n} 示例 15-5:为了拥有已知大小而使用 Box 的 List 定义 Cons 成员将会需要一个 i32 的大小加上储存 box 指针数据的空间。Nil 成员不储存值,所以它比 Cons 成员需要更少的空间。现在我们知道了任何 List 值最多需要一个 i32 加上 box 指针数据的大小。通过使用 box,打破了这无限递归的连锁,这样编译器就能够计算出储存 List 值需要的大小了。图 15-2 展示了现在 Cons 成员看起来像什么: 图 15-2:因为 Cons 存放一个 Box 所以 List 不是无限大小的了 box 只提供了间接存储和堆分配;它们并没有任何其他特殊的功能,比如我们将会见到的其他智能指针。它们也没有这些特殊功能带来的性能损失,所以它们可以用于像 cons list 这样间接存储是唯一所需功能的场景。我们还将在第十八章看到 box 的更多应用场景。 Box 类型是一个智能指针,因为它实现了 Deref trait,它允许 Box 值被当作引用对待。当 Box 值离开作用域时,由于 Box 类型 Drop trait 的实现,box 所指向的堆数据也会被清除。这两个 trait 对于在本章余下讨论的其他智能指针所提供的功能中,将会更为重要。让我们更详细的探索一下这两个 trait。","breadcrumbs":"智能指针 » 使用 Box 指向堆上数据 » 使用 Box 给递归类型一个已知的大小","id":"275","title":"使用 Box 给递归类型一个已知的大小"},"276":{"body":"ch15-02-deref.md commit 0514b1cf34c2eaab8285f43305c10a87f4ce34a0 实现 Deref trait 允许我们重载 解引用运算符 ( dereference operator )*(不要与乘法运算符或通配符相混淆)。通过这种方式实现 Deref trait 的智能指针可以被当作常规引用来对待,可以编写操作引用的代码并用于智能指针。 让我们首先看看解引用运算符如何处理常规引用,接着尝试定义我们自己的类似 Box 的类型并看看为何解引用运算符不能像引用一样工作。我们会探索如何实现 Deref trait 使得智能指针以类似引用的方式工作变为可能。最后,我们会讨论 Rust 的 Deref 强制转换 ( deref coercions )功能以及它是如何处理引用或智能指针的。 我们将要构建的 MyBox 类型与真正的 Box 有一个很大的区别:我们的版本不会在堆上储存数据。这个例子重点关注 Deref,所以其数据实际存放在何处,相比其类似指针的行为来说不算重要。","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » 通过 Deref trait 将智能指针当作常规引用处理","id":"276","title":"通过 Deref trait 将智能指针当作常规引用处理"},"277":{"body":"常规引用是一个指针类型,一种理解指针的方式是将其看成指向储存在其他某处值的箭头。在示例 15-6 中,创建了一个 i32 值的引用,接着使用解引用运算符来跟踪所引用的值: 文件名:src/main.rs fn main() { let x = 5; let y = &x; assert_eq!(5, x); assert_eq!(5, *y);\n} 示例 15-6:使用解引用运算符来跟踪 i32 值的引用 变量 x 存放了一个 i32 值 5。y 等于 x 的一个引用。可以断言 x 等于 5。然而,如果希望对 y 的值做出断言,必须使用 *y 来追踪引用所指向的值(也就是 解引用 ),这样编译器就可以比较实际的值了。一旦解引用了 y,就可以访问 y 所指向的整型值并可以与 5 做比较。 相反如果尝试编写 assert_eq!(5, y);,则会得到如下编译错误: $ cargo run Compiling deref-example v0.1.0 (file:///projects/deref-example)\nerror[E0277]: can't compare `{integer}` with `&{integer}` --> src/main.rs:6:5 |\n6 | assert_eq!(5, y); | ^^^^^^^^^^^^^^^^ no implementation for `{integer} == &{integer}` | = help: the trait `PartialEq<&{integer}>` is not implemented for `{integer}` = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `deref-example` (bin \"deref-example\") due to 1 previous error 不允许比较数字的引用与数字,因为它们是不同的类型。必须使用解引用运算符追踪引用所指向的值。","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » 追踪指针的值","id":"277","title":"追踪指针的值"},"278":{"body":"可以使用 Box 代替引用来重写示例 15-6 中的代码,示例 15-7 中 Box 上使用的解引用运算符与示例 15-6 中引用上使用的解引用运算符有着一样的功能: 文件名:src/main.rs fn main() { let x = 5; let y = Box::new(x); assert_eq!(5, x); assert_eq!(5, *y);\n} 示例 15-7:在 Box 上使用解引用运算符 示例 15-7 相比示例 15-6 主要不同的地方就是将 y 设置为一个指向 x 值拷贝的 Box 实例,而不是指向 x 值的引用。在最后的断言中,可以使用解引用运算符以 y 为引用时相同的方式追踪 Box 的指针。接下来让我们通过实现自己的类型来探索 Box 能这么做有何特殊之处。","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » 像引用一样使用 Box","id":"278","title":"像引用一样使用 Box"},"279":{"body":"为了体会默认情况下智能指针与引用的不同,让我们创建一个类似于标准库提供的 Box 类型的智能指针。接着学习如何增加使用解引用运算符的功能。 从根本上说,Box 被定义为包含一个元素的元组结构体,所以示例 15-8 以相同的方式定义了 MyBox 类型。我们还定义了 new 函数来对应定义于 Box 的 new 函数: 文件名:src/main.rs struct MyBox(T); impl MyBox { fn new(x: T) -> MyBox { MyBox(x) }\n}\n# # fn main() {} 示例 15-8:定义 MyBox 类型 这里定义了一个结构体 MyBox 并声明了一个泛型参数 T,因为我们希望其可以存放任何类型的值。MyBox 是一个包含 T 类型元素的元组结构体。MyBox::new 函数获取一个 T 类型的参数并返回一个存放传入值的 MyBox 实例。 尝试将示例 15-7 中的代码加入示例 15-8 中并修改 main 使用我们定义的 MyBox 类型代替 Box。示例 15-9 中的代码不能编译,因为 Rust 不知道如何解引用 MyBox: 文件名:src/main.rs # struct MyBox(T);\n# # impl MyBox {\n# fn new(x: T) -> MyBox {\n# MyBox(x)\n# }\n# }\n# fn main() { let x = 5; let y = MyBox::new(x); assert_eq!(5, x); assert_eq!(5, *y);\n} 示例 15-9:尝试以使用引用和 Box 相同的方式使用 MyBox 得到的编译错误是: $ cargo run Compiling deref-example v0.1.0 (file:///projects/deref-example)\nerror[E0614]: type `MyBox<{integer}>` cannot be dereferenced --> src/main.rs:14:19 |\n14 | assert_eq!(5, *y); | ^^ For more information about this error, try `rustc --explain E0614`.\nerror: could not compile `deref-example` (bin \"deref-example\") due to 1 previous error MyBox 类型不能解引用,因为我们尚未在该类型实现这个功能。为了启用 * 运算符的解引用功能,需要实现 Deref trait。","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » 自定义智能指针","id":"279","title":"自定义智能指针"},"28":{"body":"当项目最终准备好发布时,可以使用 cargo build --release 来优化编译项目。这会在 target/release 而不是 target/debug 下生成可执行文件。这些优化可以让 Rust 代码运行的更快,不过启用这些优化也需要消耗更长的编译时间。这也就是为什么会有两种不同的配置:一种是为了开发,你需要经常快速重新构建;另一种是为用户构建最终程序,它们不会经常重新构建,并且希望程序运行得越快越好。如果你在测试代码的运行时间,请确保运行 cargo build --release 并使用 target/release 下的可执行文件进行测试。","breadcrumbs":"入门指南 » Hello, Cargo! » 发布(release)构建","id":"28","title":"发布(release)构建"},"280":{"body":"如第十章 “为类型实现 trait” 部分所讨论的,为了实现 trait,需要提供 trait 所需的方法实现。Deref trait,由标准库提供,要求实现名为 deref 的方法,其借用 self 并返回一个内部数据的引用。示例 15-10 包含定义于 MyBox 之上的 Deref 实现: 文件名:src/main.rs use std::ops::Deref; impl Deref for MyBox { type Target = T; fn deref(&self) -> &Self::Target { &self.0 }\n}\n# # struct MyBox(T);\n# # impl MyBox {\n# fn new(x: T) -> MyBox {\n# MyBox(x)\n# }\n# }\n# # fn main() {\n# let x = 5;\n# let y = MyBox::new(x);\n# # assert_eq!(5, x);\n# assert_eq!(5, *y);\n# } 示例 15-10:MyBox 上的 Deref 实现 type Target = T; 语法定义了用于此 trait 的关联类型。关联类型是一个稍有不同的定义泛型参数的方式,现在还无需过多的担心它;第二十章会详细介绍。 deref 方法体中写入了 &self.0,这样 deref 返回了我希望通过 * 运算符访问的值的引用。回忆一下第五章 “使用没有命名字段的元组结构体来创建不同的类型” 部分 .0 用来访问元组结构体的第一个元素。示例 15-9 中的 main 函数中对 MyBox 值的 * 调用现在可以编译并能通过断言了! 没有 Deref trait 的话,编译器只会解引用 & 引用类型。deref 方法向编译器提供了获取任何实现了 Deref trait 的类型的值,并且调用这个类型的 deref 方法来获取一个它知道如何解引用的 & 引用的能力。 当我们在示例 15-9 中输入 *y 时,Rust 事实上在底层运行了如下代码: *(y.deref()) Rust 将 * 运算符替换为先调用 deref 方法再进行普通解引用的操作,如此我们便不用担心是否还需手动调用 deref 方法了。Rust 的这个特性可以让我们写出行为一致的代码,无论是面对的是常规引用还是实现了 Deref 的类型。 deref 方法返回值的引用,以及 *(y.deref()) 括号外边的普通解引用仍为必须的原因在于所有权。如果 deref 方法直接返回值而不是值的引用,其值(的所有权)将被移出 self。在这里以及大部分使用解引用运算符的情况下我们并不希望获取 MyBox 内部值的所有权。 注意,每次当我们在代码中使用 * 时, * 运算符都被替换成了先调用 deref 方法再接着使用 * 解引用的操作,且只会发生一次,不会对 * 操作符无限递归替换,解引用出上面 i32 类型的值就停止了,这个值与示例 15-9 中 assert_eq! 的 5 相匹配。","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » 通过实现 Deref trait 将某类型像引用一样处理","id":"280","title":"通过实现 Deref trait 将某类型像引用一样处理"},"281":{"body":"Deref 强制转换 ( deref coercions )将实现了 Deref trait 的类型的引用转换为另一种类型的引用。例如,Deref 强制转换可以将 &String 转换为 &str,因为 String 实现了 Deref trait 因此可以返回 &str。Deref 强制转换是 Rust 在函数或方法传参上的一种便利操作,并且只能作用于实现了 Deref trait 的类型。当这种特定类型的引用作为实参传递给和形参类型不同的函数或方法时将自动进行。这时会有一系列的 deref 方法被调用,把我们提供的类型转换成了参数所需的类型。 Deref 强制转换的加入使得 Rust 程序员编写函数和方法调用时无需增加过多显式使用 & 和 * 的引用和解引用。这个功能也使得我们可以编写更多同时作用于引用或智能指针的代码。 作为展示 Deref 强制转换的实例,让我们使用示例 15-8 中定义的 MyBox,以及示例 15-10 中增加的 Deref 实现。示例 15-11 展示了一个有着字符串 slice 参数的函数定义: 文件名:src/main.rs fn hello(name: &str) { println!(\"Hello, {name}!\");\n}\n# # fn main() {} 示例 15-11:hello 函数有着 &str 类型的参数 name 可以使用字符串 slice 作为参数调用 hello 函数,比如 hello(\"Rust\");。Deref 强制转换使得用 MyBox 类型值的引用调用 hello 成为可能,如示例 15-12 所示: 文件名:src/main.rs # use std::ops::Deref;\n# # impl Deref for MyBox {\n# type Target = T;\n# # fn deref(&self) -> &T {\n# &self.0\n# }\n# }\n# # struct MyBox(T);\n# # impl MyBox {\n# fn new(x: T) -> MyBox {\n# MyBox(x)\n# }\n# }\n# # fn hello(name: &str) {\n# println!(\"Hello, {name}!\");\n# }\n# fn main() { let m = MyBox::new(String::from(\"Rust\")); hello(&m);\n} 示例 15-12:因为 Deref 强制转换,使用 MyBox 的引用调用 hello 是可行的 这里使用 &m 调用 hello 函数,其为 MyBox 值的引用。因为示例 15-10 中在 MyBox 上实现了 Deref trait,Rust 可以通过 deref 调用将 &MyBox 变为 &String。标准库中提供了 String 上的 Deref 实现,其会返回字符串 slice,这可以在 Deref 的 API 文档中看到。Rust 再次调用 deref 将 &String 变为 &str,这就符合 hello 函数的定义了。 如果 Rust 没有实现 Deref 强制转换,为了使用 &MyBox 类型的值调用 hello,则不得不编写示例 15-13 中的代码来代替示例 15-12: 文件名:src/main.rs # use std::ops::Deref;\n# # impl Deref for MyBox {\n# type Target = T;\n# # fn deref(&self) -> &T {\n# &self.0\n# }\n# }\n# # struct MyBox(T);\n# # impl MyBox {\n# fn new(x: T) -> MyBox {\n# MyBox(x)\n# }\n# }\n# # fn hello(name: &str) {\n# println!(\"Hello, {name}!\");\n# }\n# fn main() { let m = MyBox::new(String::from(\"Rust\")); hello(&(*m)[..]);\n} 示例 15-13:如果 Rust 没有 Deref 强制转换则必须编写的代码 (*m) 将 MyBox 解引用为 String。接着 & 和 [..] 获取了整个 String 的字符串 slice 来匹配 hello 的签名。没有 Deref 强制转换所有这些符号混在一起将更难以读写和理解。Deref 强制转换使得 Rust 自动的帮我们处理这些转换。 当所涉及到的类型定义了 Deref trait,Rust 会分析这些类型并使用任意多次 Deref::deref 调用以获得匹配参数的类型。这些解析都发生在编译时,所以利用 Deref 强制转换并没有运行时损耗!","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » 函数和方法的隐式 Deref 强制转换","id":"281","title":"函数和方法的隐式 Deref 强制转换"},"282":{"body":"类似于如何使用 Deref trait 重载不可变引用的 * 运算符,Rust 提供了 DerefMut trait 用于重载可变引用的 * 运算符。 Rust 在发现类型和 trait 实现满足三种情况时会进行 Deref 强制转换: 当 T: Deref 时从 &T 到 &U。 当 T: DerefMut 时从 &mut T 到 &mut U。 当 T: Deref 时从 &mut T 到 &U。 头两个情况除了第二种实现了可变性之外是相同的:第一种情况表明如果有一个 &T,而 T 实现了返回 U 类型的 Deref,则可以直接得到 &U。第二种情况表明对于可变引用也有着相同的行为。 第三个情况有些微妙:Rust 也会将可变引用强转为不可变引用。但是反之是 不可能 的:不可变引用永远也不能强转为可变引用。因为根据借用规则,如果有一个可变引用,其必须是这些数据的唯一引用(否则程序将无法编译)。将一个可变引用转换为不可变引用永远也不会打破借用规则。将不可变引用转换为可变引用则需要初始的不可变引用是数据唯一的不可变引用,而借用规则无法保证这一点。因此,Rust 无法假设将不可变引用转换为可变引用是可能的。","breadcrumbs":"智能指针 » 使用 Deref Trait 将智能指针当作常规引用处理 » Deref 强制转换如何与可变性交互","id":"282","title":"Deref 强制转换如何与可变性交互"},"283":{"body":"ch15-03-drop.md commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e 对于智能指针模式来说第二个重要的 trait 是 Drop,其允许我们在值要离开作用域时执行一些代码。可以为任何类型提供 Drop trait 的实现,同时所指定的代码被用于释放类似于文件或网络连接的资源。 我们在智能指针上下文中讨论 Drop 是因为其功能几乎总是用于实现智能指针。例如,当 Box 被丢弃时会释放 box 指向的堆空间。 在其他一些语言中的某些类型,我们不得不记住在每次使用完那些类型的智能指针实例后调用清理内存或资源的代码。如果忘记的话,运行代码的系统可能会因为负荷过重而崩溃。在 Rust 中,可以指定每当值离开作用域时被执行的代码,编译器会自动插入这些代码。于是我们就不需要在程序中到处编写在实例结束时清理这些变量的代码 —— 而且还不会泄漏资源。 指定在值离开作用域时应该执行的代码的方式是实现 Drop trait。Drop trait 要求实现一个叫做 drop 的方法,它获取一个 self 的可变引用。为了能够看出 Rust 何时调用 drop,让我们暂时使用 println! 语句实现 drop。 示例 15-14 展示了唯一定制功能就是当其实例离开作用域时,打印出 Dropping CustomSmartPointer! 的结构体 CustomSmartPointer,这会演示 Rust 何时运行 drop 函数: 文件名:src/main.rs struct CustomSmartPointer { data: String,\n} impl Drop for CustomSmartPointer { fn drop(&mut self) { println!(\"Dropping CustomSmartPointer with data `{}`!\", self.data); }\n} fn main() { let c = CustomSmartPointer { data: String::from(\"my stuff\"), }; let d = CustomSmartPointer { data: String::from(\"other stuff\"), }; println!(\"CustomSmartPointers created.\");\n} 示例 15-14:结构体 CustomSmartPointer,其实现了放置清理代码的 Drop trait Drop trait 包含在 prelude 中,所以无需导入它。我们在 CustomSmartPointer 上实现了 Drop trait,并提供了一个调用 println! 的 drop 方法实现。drop 函数体是放置任何当类型实例离开作用域时期望运行的逻辑的地方。这里选择打印一些文本以可视化地展示 Rust 何时调用 drop。 在 main 中,我们新建了两个 CustomSmartPointer 实例并打印出了 CustomSmartPointer created.。在 main 的结尾,CustomSmartPointer 的实例会离开作用域,而 Rust 会调用放置于 drop 方法中的代码,打印出最后的信息。注意无需显式调用 drop 方法: 当运行这个程序,会出现如下输出: $ cargo run Compiling drop-example v0.1.0 (file:///projects/drop-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.60s Running `target/debug/drop-example`\nCustomSmartPointers created.\nDropping CustomSmartPointer with data `other stuff`!\nDropping CustomSmartPointer with data `my stuff`! 当实例离开作用域 Rust 会自动调用 drop,并调用我们指定的代码。变量以被创建时相反的顺序被丢弃,所以 d 在 c 之前被丢弃。这个例子的作用是给了我们一个 drop 方法如何工作的可视化指导,不过通常需要指定类型所需执行的清理代码而不是打印信息。 通过 std::mem::drop 提早丢弃值 不幸的是,我们并不能直截了当的禁用 drop 这个功能。通常也不需要禁用 drop ;整个 Drop trait 存在的意义在于其是自动处理的。然而,有时你可能需要提早清理某个值。一个例子是当使用智能指针管理锁时;你可能希望强制运行 drop 方法来释放锁以便作用域中的其他代码可以获取锁。Rust 并不允许我们主动调用 Drop trait 的 drop 方法;当我们希望在作用域结束之前就强制释放变量的话,我们应该使用的是由标准库提供的 std::mem::drop。 如果我们像是示例 15-14 那样尝试调用 Drop trait 的 drop 方法,就会得到像示例 15-15 那样的编译错误: 文件名:src/main.rs # struct CustomSmartPointer {\n# data: String,\n# }\n# # impl Drop for CustomSmartPointer {\n# fn drop(&mut self) {\n# println!(\"Dropping CustomSmartPointer with data `{}`!\", self.data);\n# }\n# }\n# fn main() { let c = CustomSmartPointer { data: String::from(\"some data\"), }; println!(\"CustomSmartPointer created.\"); c.drop(); println!(\"CustomSmartPointer dropped before the end of main.\");\n} 示例 15-15:尝试手动调用 Drop trait 的 drop 方法提早清理 如果尝试编译代码会得到如下错误: $ cargo run Compiling drop-example v0.1.0 (file:///projects/drop-example)\nerror[E0040]: explicit use of destructor method --> src/main.rs:16:7 |\n16 | c.drop(); | ^^^^ explicit destructor calls not allowed |\nhelp: consider using `drop` function |\n16 | drop(c); | +++++ ~ For more information about this error, try `rustc --explain E0040`.\nerror: could not compile `drop-example` (bin \"drop-example\") due to 1 previous error 错误信息表明不允许显式调用 drop。错误信息使用了术语 析构函数 ( destructor ),这是一个清理实例的函数的通用编程概念。 析构函数 对应创建实例的 构造函数 。Rust 中的 drop 函数就是这么一个析构函数。 Rust 不允许我们显式调用 drop 因为 Rust 仍然会在 main 的结尾对值自动调用 drop,这会导致一个 double free 错误,因为 Rust 会尝试清理相同的值两次。 因为不能禁用当值离开作用域时自动插入的 drop,并且不能显式调用 drop,如果我们需要强制提早清理值,可以使用 std::mem::drop 函数。 std::mem::drop 函数不同于 Drop trait 中的 drop 方法。可以通过传递希望强制丢弃的值作为参数。std::mem::drop 位于 prelude,所以我们可以修改示例 15-15 中的 main 来调用 drop 函数。如示例 15-16 所示: 文件名:src/main.rs # struct CustomSmartPointer {\n# data: String,\n# }\n# # impl Drop for CustomSmartPointer {\n# fn drop(&mut self) {\n# println!(\"Dropping CustomSmartPointer with data `{}`!\", self.data);\n# }\n# }\n# fn main() { let c = CustomSmartPointer { data: String::from(\"some data\"), }; println!(\"CustomSmartPointer created.\"); drop(c); println!(\"CustomSmartPointer dropped before the end of main.\");\n} 示例 15-16: 在值离开作用域之前调用 std::mem::drop 显式清理 运行这段代码会打印出如下: $ cargo run Compiling drop-example v0.1.0 (file:///projects/drop-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.73s Running `target/debug/drop-example`\nCustomSmartPointer created.\nDropping CustomSmartPointer with data `some data`!\nCustomSmartPointer dropped before the end of main. Dropping CustomSmartPointer with data `some data`! 出现在 CustomSmartPointer created. 和 CustomSmartPointer dropped before the end of main. 之间,表明了 drop 方法被调用了并在此丢弃了 c。 Drop trait 实现中指定的代码可以用于许多方面,来使得清理变得方便和安全:比如可以用其创建我们自己的内存分配器!通过 Drop trait 和 Rust 所有权系统,你无需担心之后的代码清理,Rust 会自动考虑这些问题。 我们也无需担心意外的清理掉仍在使用的值,这会造成编译器错误:所有权系统确保引用总是有效的,也会确保 drop 只会在值不再被使用时被调用一次。 现在我们学习了 Box 和一些智能指针的特性,让我们聊聊标准库中定义的其他几种智能指针。","breadcrumbs":"智能指针 » 使用 Drop Trait 运行清理代码 » 使用 Drop Trait 运行清理代码","id":"283","title":"使用 Drop Trait 运行清理代码"},"284":{"body":"ch15-04-rc.md commit 52fafaaa8e432e84beaaf4ea80ccba880624effd 大部分情况下所有权是非常明确的:可以准确地知道哪个变量拥有某个值。然而,有些情况单个值可能会有多个所有者。例如,在图数据结构中,多个边可能指向相同的节点,而这个节点从概念上讲为所有指向它的边所拥有。节点在没有任何边指向它从而没有任何所有者之前,都不应该被清理掉。 为了启用多所有权需要显式地使用 Rust 类型 Rc,其为 引用计数 ( reference counting )的缩写。引用计数意味着记录一个值的引用数量来知晓这个值是否仍在被使用。如果某个值有零个引用,就代表没有任何有效引用并可以被清理。 可以将其想象为客厅中的电视。当一个人进来看电视时,他打开电视。其他人也可以进来看电视。当最后一个人离开房间时,他关掉电视因为它不再被使用了。如果某人在其他人还在看的时候就关掉了电视,正在看电视的人肯定会抓狂的! Rc 用于当我们希望在堆上分配一些内存供程序的多个部分读取,而且无法在编译时确定程序的哪一部分会最后结束使用它的时候。如果确实知道哪部分是最后一个结束使用的话,就可以令其成为数据的所有者,正常的所有权规则就可以在编译时生效。 注意 Rc 只能用于单线程场景;第十六章并发会涉及到如何在多线程程序中进行引用计数。","breadcrumbs":"智能指针 » Rc 引用计数智能指针 » Rc 引用计数智能指针","id":"284","title":"Rc 引用计数智能指针"},"285":{"body":"让我们回到示例 15-5 中使用 Box 定义 cons list 的例子。这一次,我们希望创建两个共享第三个列表所有权的列表,其概念将会看起来如图 15-3 所示: 图 15-3: 两个列表,b 和 c, 共享第三个列表 a 的所有权 列表 a 包含 5 之后是 10,之后是另两个列表:b 从 3 开始而 c 从 4 开始。b 和 c 会接上包含 5 和 10 的列表 a。换句话说,这两个列表会尝试共享第一个列表所包含的 5 和 10。 尝试使用 Box 定义的 List 实现并不能工作,如示例 15-17 所示: 文件名:src/main.rs enum List { Cons(i32, Box), Nil,\n} use crate::List::{Cons, Nil}; fn main() { let a = Cons(5, Box::new(Cons(10, Box::new(Nil)))); let b = Cons(3, Box::new(a)); let c = Cons(4, Box::new(a));\n} 示例 15-17: 展示不能用两个 Box 的列表尝试共享第三个列表的所有权 编译会得出如下错误: $ cargo run Compiling cons-list v0.1.0 (file:///projects/cons-list)\nerror[E0382]: use of moved value: `a` --> src/main.rs:11:30 |\n9 | let a = Cons(5, Box::new(Cons(10, Box::new(Nil)))); | - move occurs because `a` has type `List`, which does not implement the `Copy` trait\n10 | let b = Cons(3, Box::new(a)); | - value moved here\n11 | let c = Cons(4, Box::new(a)); | ^ value used here after move For more information about this error, try `rustc --explain E0382`.\nerror: could not compile `cons-list` (bin \"cons-list\") due to 1 previous error Cons 成员拥有其储存的数据,所以当创建 b 列表时,a 被移动进了 b 这样 b 就拥有了 a。接着当再次尝试使用 a 创建 c 时,这不被允许,因为 a 的所有权已经被移动。 可以改变 Cons 的定义来存放一个引用,不过接着必须指定生命周期参数。通过指定生命周期参数,表明列表中的每一个元素都至少与列表本身存在的一样久。这是示例 15-17 中元素与列表的情况,但并不是所有情况都如此。 相反,我们修改 List 的定义为使用 Rc 代替 Box,如列表 15-18 所示。现在每一个 Cons 变量都包含一个值和一个指向 List 的 Rc。当创建 b 时,不同于获取 a 的所有权,这里会克隆 a 所包含的 Rc,这会将引用计数从 1 增加到 2 并允许 a 和 b 共享 Rc 中数据的所有权。创建 c 时也会克隆 a,这会将引用计数从 2 增加为 3。每次调用 Rc::clone,Rc 中数据的引用计数都会增加,直到有零个引用之前其数据都不会被清理。 文件名:src/main.rs enum List { Cons(i32, Rc), Nil,\n} use crate::List::{Cons, Nil};\nuse std::rc::Rc; fn main() { let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil))))); let b = Cons(3, Rc::clone(&a)); let c = Cons(4, Rc::clone(&a));\n} 示例 15-18: 使用 Rc 定义的 List 需要使用 use 语句将 Rc 引入作用域,因为它不在 prelude 中。在 main 中创建了存放 5 和 10 的列表并将其存放在 a 的新的 Rc 中。接着当创建 b 和 c 时,调用 Rc::clone 函数并传递 a 中 Rc 的引用作为参数。 也可以调用 a.clone() 而不是 Rc::clone(&a),不过在这里 Rust 的习惯是使用 Rc::clone。Rc::clone 的实现并不像大部分类型的 clone 实现那样对所有数据进行深拷贝。Rc::clone 只会增加引用计数,这并不会花费多少时间。深拷贝可能会花费很长时间。通过使用 Rc::clone 进行引用计数,可以明显的区别深拷贝类的克隆和增加引用计数类的克隆。当查找代码中的性能问题时,只需考虑深拷贝类的克隆而无需考虑 Rc::clone 调用。","breadcrumbs":"智能指针 » Rc 引用计数智能指针 » 使用 Rc 共享数据","id":"285","title":"使用 Rc 共享数据"},"286":{"body":"让我们修改示例 15-18 的代码以便观察创建和丢弃 a 中 Rc 的引用时引用计数的变化。 在示例 15-19 中,修改了 main 以便将列表 c 置于内部作用域中,这样就可以观察当 c 离开作用域时引用计数如何变化。 文件名:src/main.rs # enum List {\n# Cons(i32, Rc),\n# Nil,\n# }\n# # use crate::List::{Cons, Nil};\n# use std::rc::Rc;\n# fn main() { let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil))))); println!(\"count after creating a = {}\", Rc::strong_count(&a)); let b = Cons(3, Rc::clone(&a)); println!(\"count after creating b = {}\", Rc::strong_count(&a)); { let c = Cons(4, Rc::clone(&a)); println!(\"count after creating c = {}\", Rc::strong_count(&a)); } println!(\"count after c goes out of scope = {}\", Rc::strong_count(&a));\n} 示例 15-19:打印出引用计数 在程序中每个引用计数变化的点,会打印出引用计数,其值可以通过调用 Rc::strong_count 函数获得。这个函数叫做 strong_count 而不是 count 是因为 Rc 也有 weak_count;在 “避免引用循环:将 Rc 变为 Weak” 部分会讲解 weak_count 的用途。 这段代码会打印出: $ cargo run Compiling cons-list v0.1.0 (file:///projects/cons-list) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.45s Running `target/debug/cons-list`\ncount after creating a = 1\ncount after creating b = 2\ncount after creating c = 3\ncount after c goes out of scope = 2 我们能够看到 a 中 Rc 的初始引用计数为 1,接着每次调用 clone,计数会增加 1。当 c 离开作用域时,计数减 1。不必像调用 Rc::clone 增加引用计数那样调用一个函数来减少计数;Drop trait 的实现当 Rc 值离开作用域时自动减少引用计数。 从这个例子我们所不能看到的是,在 main 的结尾当 b 然后是 a 离开作用域时,此处计数会是 0,同时 Rc 被完全清理。使用 Rc 允许一个值有多个所有者,引用计数则确保只要任何所有者依然存在其值也保持有效。 通过不可变引用, Rc 允许在程序的多个部分之间只读地共享数据。如果 Rc 也允许多个可变引用,则会违反第四章讨论的借用规则之一:相同位置的多个可变借用可能造成数据竞争和不一致。不过可以修改数据是非常有用的!在下一部分,我们将讨论内部可变性模式和 RefCell 类型,它可以与 Rc 结合使用来处理不可变性的限制。","breadcrumbs":"智能指针 » Rc 引用计数智能指针 » 克隆 Rc 会增加引用计数","id":"286","title":"克隆 Rc 会增加引用计数"},"287":{"body":"ch15-05-interior-mutability.md commit 5a3a64d60b0dd786c35ca4daada7a4d20da33e5e 内部可变性 ( Interior mutability )是 Rust 中的一个设计模式,它允许你即使在有不可变引用时也可以改变数据,这通常是借用规则所不允许的。为了改变数据,该模式在数据结构中使用 unsafe 代码来模糊 Rust 通常的可变性和借用规则。不安全代码表明我们在手动检查这些规则而不是让编译器替我们检查。第二十章会更详细地介绍不安全代码。 当可以确保代码在运行时会遵守借用规则,即使编译器不能保证的情况,可以选择使用那些运用内部可变性模式的类型。所涉及的 unsafe 代码将被封装进安全的 API 中,而外部类型仍然是不可变的。 让我们通过遵循内部可变性模式的 RefCell 类型来开始探索。","breadcrumbs":"智能指针 » RefCell 与内部可变性模式 » RefCell 和内部可变性模式","id":"287","title":"RefCell 和内部可变性模式"},"288":{"body":"不同于 Rc,RefCell 代表其数据的唯一的所有权。那么是什么让 RefCell 不同于像 Box 这样的类型呢?回忆一下第四章所学的借用规则: 在任意给定时刻,只能拥有一个可变引用或任意数量的不可变引用 之一 (而不是两者)。 引用必须总是有效的。 对于引用和 Box,借用规则的不可变性作用于编译时。对于 RefCell,这些不可变性作用于 运行时 。对于引用,如果违反这些规则,会得到一个编译错误。而对于 RefCell,如果违反这些规则程序会 panic 并退出。 在编译时检查借用规则的优势是这些错误将在开发过程的早期被捕获,同时对运行时没有性能影响,因为所有的分析都提前完成了。为此,在编译时检查借用规则是大部分情况的最佳选择,这也正是其为何是 Rust 的默认行为。 相反在运行时检查借用规则的好处则是允许出现特定内存安全的场景,而它们在编译时检查中是不允许的。静态分析,正如 Rust 编译器,是天生保守的。但代码的一些属性不可能通过分析代码发现:其中最著名的就是 停机问题(Halting Problem) ,这超出了本书的范畴,不过如果你感兴趣的话这是一个值得研究的有趣主题。 因为一些分析是不可能的,如果 Rust 编译器不能通过所有权规则编译,它可能会拒绝一个正确的程序;从这种角度考虑它是保守的。如果 Rust 接受不正确的程序,那么用户也就不会相信 Rust 所做的保证了。然而,如果 Rust 拒绝正确的程序,虽然会给程序员带来不便,但不会带来灾难。RefCell 正是用于当你确信代码遵守借用规则,而编译器不能理解和确定的时候。 类似于 Rc,RefCell 只能用于单线程场景。如果尝试在多线程上下文中使用RefCell,会得到一个编译错误。第十六章会介绍如何在多线程程序中使用 RefCell 的功能。 如下为选择 Box,Rc 或 RefCell 的理由: Rc 允许相同数据有多个所有者;Box 和 RefCell 有单一所有者。 Box 允许在编译时执行不可变或可变借用检查;Rc仅允许在编译时执行不可变借用检查;RefCell 允许在运行时执行不可变或可变借用检查。 因为 RefCell 允许在运行时执行可变借用检查,所以我们可以在即便 RefCell 自身是不可变的情况下修改其内部的值。 在不可变值内部改变值就是 内部可变性 模式。让我们看看何时内部可变性是有用的,并讨论这是如何成为可能的。","breadcrumbs":"智能指针 » RefCell 与内部可变性模式 » 通过 RefCell 在运行时检查借用规则","id":"288","title":"通过 RefCell 在运行时检查借用规则"},"289":{"body":"借用规则的一个推论是当有一个不可变值时,不能可变地借用它。例如,如下代码不能编译: fn main() { let x = 5; let y = &mut x;\n} 如果尝试编译,会得到如下错误: $ cargo run Compiling borrowing v0.1.0 (file:///projects/borrowing)\nerror[E0596]: cannot borrow `x` as mutable, as it is not declared as mutable --> src/main.rs:3:13 |\n3 | let y = &mut x; | ^^^^^^ cannot borrow as mutable |\nhelp: consider changing this to be mutable |\n2 | let mut x = 5; | +++ For more information about this error, try `rustc --explain E0596`.\nerror: could not compile `borrowing` (bin \"borrowing\") due to 1 previous error 然而,特定情况下,令一个值在其方法内部能够修改自身,而在其他代码中仍视为不可变,是很有用的。值方法外部的代码就不能修改其值了。RefCell 是一个获得内部可变性的方法。RefCell 并没有完全绕开借用规则,编译器中的借用检查器允许内部可变性并相应地在运行时检查借用规则。如果违反了这些规则,会出现 panic 而不是编译错误。 让我们通过一个实际的例子来探索何处可以使用 RefCell 来修改不可变值并看看为何这么做是有意义的。 内部可变性的用例:mock 对象 有时在测试中程序员会用某个类型替换另一个类型,以便观察特定的行为并断言它是被正确实现的。这个占位符类型被称为 测试替身 ( test double )。就像电影制作中的替身演员 ( stunt double ) 一样,替代演员完成高难度的场景。测试替身在运行测试时替代某个类型。 mock 对象 是特定类型的测试替身,它们记录测试过程中发生了什么以便可以断言操作是正确的。 虽然 Rust 中的对象与其他语言中的对象并不是一回事,Rust 也没有像其他语言那样在标准库中内建 mock 对象功能,不过我们确实可以创建一个与 mock 对象有着相同功能的结构体。 如下是一个我们想要测试的场景:我们在编写一个记录某个值与最大值的差距的库,并根据当前值与最大值的差距来发送消息。例如,这个库可以用于记录用户所允许的 API 调用数量限额。 该库只提供记录与最大值的差距,以及何种情况发送什么消息的功能。使用此库的程序则期望提供实际发送消息的机制:程序可以选择记录一条消息、发送 email、发送短信等等。库本身无需知道这些细节;只需实现其提供的 Messenger trait 即可。示例 15-20 展示了库代码: 文件名:src/lib.rs pub trait Messenger { fn send(&self, msg: &str);\n} pub struct LimitTracker<'a, T: Messenger> { messenger: &'a T, value: usize, max: usize,\n} impl<'a, T> LimitTracker<'a, T>\nwhere T: Messenger,\n{ pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> { LimitTracker { messenger, value: 0, max, } } pub fn set_value(&mut self, value: usize) { self.value = value; let percentage_of_max = self.value as f64 / self.max as f64; if percentage_of_max >= 1.0 { self.messenger.send(\"Error: You are over your quota!\"); } else if percentage_of_max >= 0.9 { self.messenger .send(\"Urgent warning: You've used up over 90% of your quota!\"); } else if percentage_of_max >= 0.75 { self.messenger .send(\"Warning: You've used up over 75% of your quota!\"); } }\n} 示例 15-20:一个记录某个值与最大值差距的库,并根据此值的特定级别发出警告 这些代码中一个重要部分是拥有一个方法 send 的 Messenger trait,其获取一个 self 的不可变引用和文本信息。这个 trait 是 mock 对象所需要实现的接口库,这样 mock 就能像一个真正的对象那样使用了。另一个重要的部分是我们需要测试 LimitTracker 的 set_value 方法的行为。可以改变传递的 value 参数的值,不过 set_value 并没有返回任何可供断言的值。我们希望能够说,如果我们创建一个实现了 Messenger trait 和具有特定 max 值的 LimitTracker 时,当传递不同 value 值时,消息发送者应被告知发送合适的消息。 我们所需的 mock 对象是,调用 send 并不实际发送 email 或消息,而是只记录信息被通知要发送了。可以新建一个 mock 对象实例,用其创建 LimitTracker,调用 LimitTracker 的 set_value 方法,然后检查 mock 对象是否有我们期望的消息。示例 15-21 展示了一个如此尝试的 mock 对象实现,不过借用检查器并不允许: 文件名:src/lib.rs # pub trait Messenger {\n# fn send(&self, msg: &str);\n# }\n# # pub struct LimitTracker<'a, T: Messenger> {\n# messenger: &'a T,\n# value: usize,\n# max: usize,\n# }\n# # impl<'a, T> LimitTracker<'a, T>\n# where\n# T: Messenger,\n# {\n# pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {\n# LimitTracker {\n# messenger,\n# value: 0,\n# max,\n# }\n# }\n# # pub fn set_value(&mut self, value: usize) {\n# self.value = value;\n# # let percentage_of_max = self.value as f64 / self.max as f64;\n# # if percentage_of_max >= 1.0 {\n# self.messenger.send(\"Error: You are over your quota!\");\n# } else if percentage_of_max >= 0.9 {\n# self.messenger\n# .send(\"Urgent warning: You've used up over 90% of your quota!\");\n# } else if percentage_of_max >= 0.75 {\n# self.messenger\n# .send(\"Warning: You've used up over 75% of your quota!\");\n# }\n# }\n# }\n# #[cfg(test)]\nmod tests { use super::*; struct MockMessenger { sent_messages: Vec, } impl MockMessenger { fn new() -> MockMessenger { MockMessenger { sent_messages: vec![], } } } impl Messenger for MockMessenger { fn send(&self, message: &str) { self.sent_messages.push(String::from(message)); } } #[test] fn it_sends_an_over_75_percent_warning_message() { let mock_messenger = MockMessenger::new(); let mut limit_tracker = LimitTracker::new(&mock_messenger, 100); limit_tracker.set_value(80); assert_eq!(mock_messenger.sent_messages.len(), 1); }\n} 示例 15-21:尝试实现 MockMessenger,借用检查器不允许这么做 测试代码定义了一个 MockMessenger 结构体,其 sent_messages 字段为一个 String 值的 Vec 用来记录被告知发送的消息。我们还定义了一个关联函数 new 以便于新建从空消息列表开始的 MockMessenger 值。接着为 MockMessenger 实现 Messenger trait 这样就可以为 LimitTracker 提供一个 MockMessenger。在 send 方法的定义中,获取传入的消息作为参数并储存在 MockMessenger 的 sent_messages 列表中。 在测试中,我们测试了当 LimitTracker 被告知将 value 设置为超过 max 值 75% 的某个值。首先新建一个 MockMessenger,其从空消息列表开始。接着新建一个 LimitTracker 并传递新建 MockMessenger 的引用和 max 值 100。我们使用值 80 调用 LimitTracker 的 set_value 方法,这超过了 100 的 75%。接着断言 MockMessenger 中记录的消息列表应该有一条消息。 然而,这个测试是有问题的: $ cargo test Compiling limit-tracker v0.1.0 (file:///projects/limit-tracker)\nerror[E0596]: cannot borrow `self.sent_messages` as mutable, as it is behind a `&` reference --> src/lib.rs:58:13 |\n58 | self.sent_messages.push(String::from(message)); | ^^^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable |\nhelp: consider changing this to be a mutable reference in the `impl` method and the `trait` definition |\n2 ~ fn send(&mut self, msg: &str);\n3 | }\n...\n56 | impl Messenger for MockMessenger {\n57 ~ fn send(&mut self, message: &str) { | For more information about this error, try `rustc --explain E0596`.\nerror: could not compile `limit-tracker` (lib test) due to 1 previous error 不能修改 MockMessenger 来记录消息,因为 send 方法获取了 self 的不可变引用。我们也不能参考错误文本的建议使用 &mut self 替代,因为这样 send 的签名就不符合 Messenger trait 定义中的签名了(可以试着这么改,看看会出现什么错误信息)。 这正是内部可变性的用武之地!我们将通过 RefCell 来储存 sent_messages,然后 send 将能够修改 sent_messages 并储存消息。示例 15-22 展示了代码: 文件名:src/lib.rs # pub trait Messenger {\n# fn send(&self, msg: &str);\n# }\n# # pub struct LimitTracker<'a, T: Messenger> {\n# messenger: &'a T,\n# value: usize,\n# max: usize,\n# }\n# # impl<'a, T> LimitTracker<'a, T>\n# where\n# T: Messenger,\n# {\n# pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {\n# LimitTracker {\n# messenger,\n# value: 0,\n# max,\n# }\n# }\n# # pub fn set_value(&mut self, value: usize) {\n# self.value = value;\n# # let percentage_of_max = self.value as f64 / self.max as f64;\n# # if percentage_of_max >= 1.0 {\n# self.messenger.send(\"Error: You are over your quota!\");\n# } else if percentage_of_max >= 0.9 {\n# self.messenger\n# .send(\"Urgent warning: You've used up over 90% of your quota!\");\n# } else if percentage_of_max >= 0.75 {\n# self.messenger\n# .send(\"Warning: You've used up over 75% of your quota!\");\n# }\n# }\n# }\n# #[cfg(test)]\nmod tests { use super::*; use std::cell::RefCell; struct MockMessenger { sent_messages: RefCell>, } impl MockMessenger { fn new() -> MockMessenger { MockMessenger { sent_messages: RefCell::new(vec![]), } } } impl Messenger for MockMessenger { fn send(&self, message: &str) { self.sent_messages.borrow_mut().push(String::from(message)); } } #[test] fn it_sends_an_over_75_percent_warning_message() { // --snip--\n# let mock_messenger = MockMessenger::new();\n# let mut limit_tracker = LimitTracker::new(&mock_messenger, 100);\n# # limit_tracker.set_value(80); assert_eq!(mock_messenger.sent_messages.borrow().len(), 1); }\n} 示例 15-22:使用 RefCell 能够在外部值被认为是不可变的情况下修改内部值 现在 sent_messages 字段的类型是 RefCell> 而不是 Vec。在 new 函数中新建了一个 RefCell> 实例替代空 vector。 对于 send 方法的实现,第一个参数仍为 self 的不可变借用,这是符合方法定义的。我们调用 self.sent_messages 中 RefCell 的 borrow_mut 方法来获取 RefCell 中值的可变引用,这是一个 vector。接着可以对 vector 的可变引用调用 push 以便记录测试过程中看到的消息。 最后必须做出的修改位于断言中:为了看到其内部 vector 中有多少个项,需要调用 RefCell 的 borrow 以获取 vector 的不可变引用。 现在我们见识了如何使用 RefCell,让我们研究一下它怎样工作的!","breadcrumbs":"智能指针 » RefCell 与内部可变性模式 » 内部可变性:不可变值的可变借用","id":"289","title":"内部可变性:不可变值的可变借用"},"29":{"body":"对于简单项目,Cargo 并不比 rustc 提供了更多的优势,不过随着开发的深入,终将证明其价值。一旦程序壮大到由多个文件组成,亦或者是需要其他的依赖,让 Cargo 协调构建过程就会简单得多。 即便 hello_cargo 项目十分简单,它现在也使用了很多在你之后的 Rust 生涯将会用到的实用工具。其实,要在任何已存在的项目上工作时,可以使用如下命令通过 Git 检出代码,移动到该项目目录并构建: $ git clone example.org/someproject\n$ cd someproject\n$ cargo build 关于更多 Cargo 的信息,请查阅 其文档 。","breadcrumbs":"入门指南 » Hello, Cargo! » 把 Cargo 当作习惯","id":"29","title":"把 Cargo 当作习惯"},"290":{"body":"当创建不可变和可变引用时,我们分别使用 & 和 &mut 语法。对于 RefCell 来说,则是 borrow 和 borrow_mut 方法,这属于 RefCell 安全 API 的一部分。borrow 方法返回 Ref 类型的智能指针,borrow_mut 方法返回 RefMut 类型的智能指针。这两个类型都实现了 Deref,所以可以当作常规引用对待。 RefCell 记录当前有多少个活动的 Ref 和 RefMut 智能指针。每次调用 borrow,RefCell 将活动的不可变借用计数加一。当 Ref 值离开作用域时,不可变借用计数减一。就像编译时借用规则一样,RefCell 在任何时候只允许有多个不可变借用或一个可变借用。 如果我们尝试违反这些规则,相比引用时的编译时错误,RefCell 的实现会在运行时出现 panic。示例 15-23 展示了对示例 15-22 中 send 实现的修改,这里我们故意尝试在相同作用域创建两个可变借用以便演示 RefCell 不允许我们在运行时这么做: 文件名:src/lib.rs # pub trait Messenger {\n# fn send(&self, msg: &str);\n# }\n# # pub struct LimitTracker<'a, T: Messenger> {\n# messenger: &'a T,\n# value: usize,\n# max: usize,\n# }\n# # impl<'a, T> LimitTracker<'a, T>\n# where\n# T: Messenger,\n# {\n# pub fn new(messenger: &'a T, max: usize) -> LimitTracker<'a, T> {\n# LimitTracker {\n# messenger,\n# value: 0,\n# max,\n# }\n# }\n# # pub fn set_value(&mut self, value: usize) {\n# self.value = value;\n# # let percentage_of_max = self.value as f64 / self.max as f64;\n# # if percentage_of_max >= 1.0 {\n# self.messenger.send(\"Error: You are over your quota!\");\n# } else if percentage_of_max >= 0.9 {\n# self.messenger\n# .send(\"Urgent warning: You've used up over 90% of your quota!\");\n# } else if percentage_of_max >= 0.75 {\n# self.messenger\n# .send(\"Warning: You've used up over 75% of your quota!\");\n# }\n# }\n# }\n# # #[cfg(test)]\n# mod tests {\n# use super::*;\n# use std::cell::RefCell;\n# # struct MockMessenger {\n# sent_messages: RefCell>,\n# }\n# # impl MockMessenger {\n# fn new() -> MockMessenger {\n# MockMessenger {\n# sent_messages: RefCell::new(vec![]),\n# }\n# }\n# }\n# impl Messenger for MockMessenger { fn send(&self, message: &str) { let mut one_borrow = self.sent_messages.borrow_mut(); let mut two_borrow = self.sent_messages.borrow_mut(); one_borrow.push(String::from(message)); two_borrow.push(String::from(message)); } }\n# # #[test]\n# fn it_sends_an_over_75_percent_warning_message() {\n# let mock_messenger = MockMessenger::new();\n# let mut limit_tracker = LimitTracker::new(&mock_messenger, 100);\n# # limit_tracker.set_value(80);\n# # assert_eq!(mock_messenger.sent_messages.borrow().len(), 1);\n# }\n# } 示例 15-23:在同一作用域中创建两个可变引用并观察 RefCell panic 这里为 borrow_mut 返回的 RefMut 智能指针创建了 one_borrow 变量。接着用相同的方式在变量 two_borrow 创建了另一个可变借用。这会在相同作用域中创建两个可变引用,这是不允许的。当运行库的测试时,示例 15-23 编译时不会有任何错误,不过测试会失败: $ cargo test Compiling limit-tracker v0.1.0 (file:///projects/limit-tracker) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.91s Running unittests src/lib.rs (target/debug/deps/limit_tracker-e599811fa246dbde) running 1 test\ntest tests::it_sends_an_over_75_percent_warning_message ... FAILED failures: ---- tests::it_sends_an_over_75_percent_warning_message stdout ----\nthread 'tests::it_sends_an_over_75_percent_warning_message' panicked at src/lib.rs:60:53:\nalready borrowed: BorrowMutError\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::it_sends_an_over_75_percent_warning_message test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib` 注意代码 panic 和信息 already borrowed: BorrowMutError。这也就是 RefCell 如何在运行时处理违反借用规则的情况。 像我们这里这样选择在运行时捕获借用错误而不是编译时意味着会发现在开发过程的后期才会发现的潜在错误,甚至有可能发布到生产环境才会发现。还会因为在运行时而不是编译时记录借用而导致少量的运行时性能惩罚。然而,使用 RefCell 使得在只允许不可变值的上下文中编写修改自身以记录消息的 mock 对象成为可能。虽然有取舍,但是我们可以选择使用 RefCell 来获得比常规引用所能提供的更多的功能。","breadcrumbs":"智能指针 » RefCell 与内部可变性模式 » RefCell 在运行时记录借用","id":"290","title":"RefCell 在运行时记录借用"},"291":{"body":"RefCell 的一个常见用法是与 Rc 结合。回忆一下 Rc 允许对相同数据有多个所有者,不过只能提供数据的不可变访问。如果有一个储存了 RefCell 的 Rc 的话,就可以得到有多个所有者 并且 可以修改的值了! 例如,回忆示例 15-18 的 cons list 的例子中使用 Rc 使得多个列表共享另一个列表的所有权。因为 Rc 只存放不可变值,所以一旦创建了这些列表值后就不能修改。让我们加入 RefCell 来获得修改列表中值的能力。示例 15-24 展示了通过在 Cons 定义中使用 RefCell,我们就允许修改所有列表中的值了: 文件名:src/main.rs #[derive(Debug)]\nenum List { Cons(Rc>, Rc), Nil,\n} use crate::List::{Cons, Nil};\nuse std::cell::RefCell;\nuse std::rc::Rc; fn main() { let value = Rc::new(RefCell::new(5)); let a = Rc::new(Cons(Rc::clone(&value), Rc::new(Nil))); let b = Cons(Rc::new(RefCell::new(3)), Rc::clone(&a)); let c = Cons(Rc::new(RefCell::new(4)), Rc::clone(&a)); *value.borrow_mut() += 10; println!(\"a after = {a:?}\"); println!(\"b after = {b:?}\"); println!(\"c after = {c:?}\");\n} 示例 15-24:使用 Rc> 创建可以修改的 List 这里创建了一个 Rc> 实例并储存在变量 value 中以便之后直接访问。接着在 a 中用包含 value 的 Cons 成员创建了一个 List。需要克隆 value 以便 a 和 value 都能拥有其内部值 5 的所有权,而不是将所有权从 value 移动到 a 或者让 a 借用 value。 我们将列表 a 封装进了 Rc 这样当创建列表 b 和 c 时,它们都可以引用 a,正如示例 15-18 一样。 一旦创建了列表 a、b 和 c,我们将 value 的值加 10。为此对 value 调用了 borrow_mut,这里使用了第五章讨论的自动解引用功能( “-> 运算符到哪去了?” 部分)来解引用 Rc 以获取其内部的 RefCell 值。borrow_mut 方法返回 RefMut 智能指针,可以对其使用解引用运算符并修改其内部值。 当我们打印出 a、b 和 c 时,可以看到它们都拥有修改后的值 15 而不是 5: $ cargo run Compiling cons-list v0.1.0 (file:///projects/cons-list) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.63s Running `target/debug/cons-list`\na after = Cons(RefCell { value: 15 }, Nil)\nb after = Cons(RefCell { value: 3 }, Cons(RefCell { value: 15 }, Nil))\nc after = Cons(RefCell { value: 4 }, Cons(RefCell { value: 15 }, Nil)) 这是非常巧妙的!通过使用 RefCell,我们可以拥有一个表面上不可变的 List,不过可以使用 RefCell 中提供内部可变性的方法来在需要时修改数据。RefCell 的运行时借用规则检查也确实保护我们免于出现数据竞争——有时为了数据结构的灵活性而付出一些性能是值得的。注意 RefCell 不能用于多线程代码!Mutex 是一个线程安全版本的 RefCell ,我们会在第十六章讨论 Mutex。","breadcrumbs":"智能指针 » RefCell 与内部可变性模式 » 结合 Rc 和 RefCell 来拥有多个可变数据所有者","id":"291","title":"结合 Rc 和 RefCell 来拥有多个可变数据所有者"},"292":{"body":"ch15-06-reference-cycles.md commit c06006157b14b3d47b5c716fc392b77f3b2e21ce Rust 的内存安全性保证使其难以意外地制造永远也不会被清理的内存(被称为 内存泄漏 ( memory leak )),但并不是不可能。Rust 并不保证完全防止内存泄漏,这意味着内存泄漏在 Rust 中被认为是内存安全的。这一点可以通过 Rc 和 RefCell 看出:创建引用循环的可能性是存在的。这会造成内存泄漏,因为每一项的引用计数永远也到不了 0,持有的数据也就永远不会被释放。","breadcrumbs":"智能指针 » 引用循环会导致内存泄漏 » 引用循环与内存泄漏","id":"292","title":"引用循环与内存泄漏"},"293":{"body":"让我们看看引用循环是如何发生的以及如何避免它。以示例 15-25 中的 List 枚举和 tail 方法的定义开始: 文件名:src/main.rs use crate::List::{Cons, Nil};\nuse std::cell::RefCell;\nuse std::rc::Rc; #[derive(Debug)]\nenum List { Cons(i32, RefCell>), Nil,\n} impl List { fn tail(&self) -> Option<&RefCell>> { match self { Cons(_, item) => Some(item), Nil => None, } }\n} fn main() {} 示例 15-25: 一个存放 RefCell 的 cons list 定义,这样可以修改 Cons 成员所引用的数据 这里采用了示例 15-5 中 List 定义的另一种变体。现在 Cons 成员的第二个元素是 RefCell>,这意味着不同于像示例 15-24 那样能够修改 i32 的值,我们希望能够修改 Cons 成员所指向的 List。这里还增加了一个 tail 方法来方便我们在有 Cons 成员的时候访问其第二项。 在示例 15-26 中增加了一个 main 函数,其使用了示例 15-25 中的定义。这些代码在 a 中创建了一个列表,一个指向 a 中列表的 b 列表,接着修改 a 中的列表指向 b 中的列表,这会创建一个引用循环。在这个过程的多个位置有 println! 语句展示引用计数。 文件:src/main.rs # use crate::List::{Cons, Nil};\n# use std::cell::RefCell;\n# use std::rc::Rc;\n# # #[derive(Debug)]\n# enum List {\n# Cons(i32, RefCell>),\n# Nil,\n# }\n# # impl List {\n# fn tail(&self) -> Option<&RefCell>> {\n# match self {\n# Cons(_, item) => Some(item),\n# Nil => None,\n# }\n# }\n# }\n# fn main() { let a = Rc::new(Cons(5, RefCell::new(Rc::new(Nil)))); println!(\"a initial rc count = {}\", Rc::strong_count(&a)); println!(\"a next item = {:?}\", a.tail()); let b = Rc::new(Cons(10, RefCell::new(Rc::clone(&a)))); println!(\"a rc count after b creation = {}\", Rc::strong_count(&a)); println!(\"b initial rc count = {}\", Rc::strong_count(&b)); println!(\"b next item = {:?}\", b.tail()); if let Some(link) = a.tail() { *link.borrow_mut() = Rc::clone(&b); } println!(\"b rc count after changing a = {}\", Rc::strong_count(&b)); println!(\"a rc count after changing a = {}\", Rc::strong_count(&a)); // Uncomment the next line to see that we have a cycle; // it will overflow the stack // println!(\"a next item = {:?}\", a.tail());\n} 示例 15-26:创建一个引用循环:两个 List 值互相指向彼此 这里在变量 a 中创建了一个 Rc 实例来存放初值为 5, Nil 的 List 值。接着在变量 b 中创建了存放包含值 10 和指向列表 a 的 List 的另一个 Rc 实例。 最后,修改 a 使其指向 b 而不是 Nil,这就创建了一个循环。为此需要使用 tail 方法获取 a 中 RefCell> 的引用,并放入变量 link 中。接着使用 RefCell> 的 borrow_mut 方法将其值从存放 Nil 的 Rc 修改为 b 中的 Rc。 如果保持最后的 println! 行注释并运行代码,会得到如下输出: $ cargo run Compiling cons-list v0.1.0 (file:///projects/cons-list) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.53s Running `target/debug/cons-list`\na initial rc count = 1\na next item = Some(RefCell { value: Nil })\na rc count after b creation = 2\nb initial rc count = 1\nb next item = Some(RefCell { value: Cons(5, RefCell { value: Nil }) })\nb rc count after changing a = 2\na rc count after changing a = 2 可以看到将列表 a 修改为指向 b 之后, a 和 b 中的 Rc 实例的引用计数都是 2。在 main 的结尾,Rust 丢弃 b,这会使 b Rc 实例的引用计数从 2 减为 1。然而,b Rc 不能被回收,因为其引用计数是 1 而不是 0。接下来 Rust 会丢弃 a 将 a Rc 实例的引用计数从 2 减为 1。这个实例也不能被回收,因为 b Rc 实例依然引用它,所以其引用计数是 1。这些列表的内存将永远保持未被回收的状态。为了更形象的展示,我们创建了一个如图 15-4 所示的引用循环: 图 15-4: 列表 a 和 b 彼此互相指向形成引用循环 如果取消最后 println! 的注释并运行程序,Rust 会尝试打印出 a 指向 b 指向 a 这样的循环直到栈溢出。 相比真实世界的程序,这个例子中创建引用循环的结果并不可怕。创建了引用循环之后程序立刻就结束了。如果在更为复杂的程序中并在循环里分配了很多内存并占有很长时间,这个程序会使用多于它所需要的内存,并有可能压垮系统并造成没有内存可供使用。 创建引用循环并不容易,但也不是不可能。如果你有包含 Rc 的 RefCell 值或类似的嵌套结合了内部可变性和引用计数的类型,请务必小心确保你没有形成一个引用循环;你无法指望 Rust 帮你捕获它们。创建引用循环是一个程序上的逻辑 bug,你应该使用自动化测试、代码评审和其他软件开发最佳实践来使其最小化。 另一个解决方案是重新组织数据结构,使得一部分引用拥有所有权而另一部分没有。换句话说,循环将由一些拥有所有权的关系和一些无所有权的关系组成,只有所有权关系才能影响值是否可以被丢弃。在示例 15-25 中,我们总是希望 Cons 成员拥有其列表,所以重新组织数据结构是不可能的。让我们看看一个由父节点和子节点构成的图的例子,观察何时是使用无所有权的关系来避免引用循环的合适时机。","breadcrumbs":"智能指针 » 引用循环会导致内存泄漏 » 制造引用循环","id":"293","title":"制造引用循环"},"294":{"body":"到目前为止,我们已经展示了调用 Rc::clone 会增加 Rc 实例的 strong_count,和只在其 strong_count 为 0 时才会被清理的 Rc 实例。你也可以通过调用 Rc::downgrade 并传递 Rc 实例的引用来创建其值的 弱引用 ( weak reference )。强引用代表如何共享 Rc 实例的所有权。弱引用并不属于所有权关系,当 Rc 实例被清理时其计数没有影响。它们不会造成引用循环,因为任何涉及弱引用的循环会在其相关的值的强引用计数为 0 时被打断。 调用 Rc::downgrade 时会得到 Weak 类型的智能指针。不同于将 Rc 实例的 strong_count 加 1,调用 Rc::downgrade 会将 weak_count 加 1。Rc 类型使用 weak_count 来记录其存在多少个 Weak 引用,类似于 strong_count。其区别在于 weak_count 无需计数为 0 就能使 Rc 实例被清理。 强引用代表如何共享 Rc 实例的所有权,但弱引用并不属于所有权关系。它们不会造成引用循环,因为任何弱引用的循环会在其相关的强引用计数为 0 时被打断。 因为 Weak 引用的值可能已经被丢弃了,为了使用 Weak 所指向的值,我们必须确保其值仍然有效。为此可以调用 Weak 实例的 upgrade 方法,这会返回 Option>。如果 Rc 值还未被丢弃,则结果是 Some;如果 Rc 已被丢弃,则结果是 None。因为 upgrade 返回一个 Option>,Rust 会确保处理 Some 和 None 的情况,所以它不会返回非法指针。 我们会创建一个某项知道其子项和父项的树形结构的例子,而不是只知道其下一项的列表。 创建树形数据结构:带有子节点的 Node 在最开始,我们将会构建一个带有子节点的树。让我们创建一个用于存放其拥有所有权的 i32 值和其子节点引用的 Node: 文件名:src/main.rs use std::cell::RefCell;\nuse std::rc::Rc; #[derive(Debug)]\nstruct Node { value: i32, children: RefCell>>,\n}\n# # fn main() {\n# let leaf = Rc::new(Node {\n# value: 3,\n# children: RefCell::new(vec![]),\n# });\n# # let branch = Rc::new(Node {\n# value: 5,\n# children: RefCell::new(vec![Rc::clone(&leaf)]),\n# });\n# } 我们希望 Node 能够拥有其子节点,同时也希望能将所有权共享给变量,以便可以直接访问树中的每一个 Node,为此 Vec 的项的类型被定义为 Rc。我们还希望能修改其他节点的子节点,所以 children 中 Vec> 被放进了 RefCell。 接下来,使用此结构体定义来创建一个叫做 leaf 的带有值 3 且没有子节点的 Node 实例,和另一个带有值 5 并以 leaf 作为子节点的实例 branch,如示例 15-27 所示: 文件名:src/main.rs # use std::cell::RefCell;\n# use std::rc::Rc;\n# # #[derive(Debug)]\n# struct Node {\n# value: i32,\n# children: RefCell>>,\n# }\n# fn main() { let leaf = Rc::new(Node { value: 3, children: RefCell::new(vec![]), }); let branch = Rc::new(Node { value: 5, children: RefCell::new(vec![Rc::clone(&leaf)]), });\n} 示例 15-27:创建没有子节点的 leaf 节点和以 leaf 作为子节点的 branch 节点 这里克隆了 leaf 中的 Rc 并储存在 branch 中,这意味着 leaf 中的 Node 现在有两个所有者:leaf和branch。可以通过 branch.children 从 branch 中获得 leaf,不过无法从 leaf 到 branch。leaf 没有到 branch 的引用且并不知道它们相互关联。我们希望 leaf 知道 branch 是其父节点。稍后我们会这么做。 增加从子到父的引用 为了使子节点知道其父节点,需要在 Node 结构体定义中增加一个 parent 字段。问题是 parent 的类型应该是什么。我们知道其不能包含 Rc,因为这样 leaf.parent 将会指向 branch 而 branch.children 会包含 leaf 的指针,这会形成引用循环,会造成其 strong_count 永远也不会为 0。 现在换一种方式思考这个关系,父节点应该拥有其子节点:如果父节点被丢弃了,其子节点也应该被丢弃。然而子节点不应该拥有其父节点:如果丢弃子节点,其父节点应该依然存在。这正是弱引用的例子! 所以 parent 使用 Weak 类型而不是 Rc,具体来说是 RefCell>。现在 Node 结构体定义看起来像这样: 文件名:src/main.rs use std::cell::RefCell;\nuse std::rc::{Rc, Weak}; #[derive(Debug)]\nstruct Node { value: i32, parent: RefCell>, children: RefCell>>,\n}\n# # fn main() {\n# let leaf = Rc::new(Node {\n# value: 3,\n# parent: RefCell::new(Weak::new()),\n# children: RefCell::new(vec![]),\n# });\n# # println!(\"leaf parent = {:?}\", leaf.parent.borrow().upgrade());\n# # let branch = Rc::new(Node {\n# value: 5,\n# parent: RefCell::new(Weak::new()),\n# children: RefCell::new(vec![Rc::clone(&leaf)]),\n# });\n# # *leaf.parent.borrow_mut() = Rc::downgrade(&branch);\n# # println!(\"leaf parent = {:?}\", leaf.parent.borrow().upgrade());\n# } 这样,一个节点就能够引用其父节点,但不拥有其父节点。在示例 15-28 中,我们更新 main 来使用新定义以便 leaf 节点可以通过 branch 引用其父节点: 文件名:src/main.rs # use std::cell::RefCell;\n# use std::rc::{Rc, Weak};\n# # #[derive(Debug)]\n# struct Node {\n# value: i32,\n# parent: RefCell>,\n# children: RefCell>>,\n# }\n# fn main() { let leaf = Rc::new(Node { value: 3, parent: RefCell::new(Weak::new()), children: RefCell::new(vec![]), }); println!(\"leaf parent = {:?}\", leaf.parent.borrow().upgrade()); let branch = Rc::new(Node { value: 5, parent: RefCell::new(Weak::new()), children: RefCell::new(vec![Rc::clone(&leaf)]), }); *leaf.parent.borrow_mut() = Rc::downgrade(&branch); println!(\"leaf parent = {:?}\", leaf.parent.borrow().upgrade());\n} 示例 15-28:一个 leaf 节点,其拥有指向其父节点 branch 的 Weak 引用 创建 leaf 节点类似于示例 15-27,除了 parent 字段有所不同:leaf 开始时没有父节点,所以我们新建了一个空的 Weak 引用实例。 此时,当尝试使用 upgrade 方法获取 leaf 的父节点引用时,会得到一个 None 值。如第一个 println! 输出所示: leaf parent = None 当创建 branch 节点时,其也会新建一个 Weak 引用,因为 branch 并没有父节点。leaf 仍然作为 branch 的一个子节点。一旦在 branch 中有了 Node 实例,就可以修改 leaf 使其拥有指向父节点的 Weak 引用。这里使用了 leaf 中 parent 字段里的 RefCell> 的 borrow_mut 方法,接着使用了 Rc::downgrade 函数来从 branch 中的 Rc 值创建了一个指向 branch 的 Weak 引用。 当再次打印出 leaf 的父节点时,这一次将会得到存放了 branch 的 Some 值:现在 leaf 可以访问其父节点了!当打印出 leaf 时,我们也避免了如示例 15-26 中最终会导致栈溢出的循环:Weak 引用被打印为 (Weak): leaf parent = Some(Node { value: 5, parent: RefCell { value: (Weak) },\nchildren: RefCell { value: [Node { value: 3, parent: RefCell { value: (Weak) },\nchildren: RefCell { value: [] } }] } }) 没有无限的输出表明这段代码并没有造成引用循环。这一点也可以从观察 Rc::strong_count 和 Rc::weak_count 调用的结果看出。 可视化 strong_count 和 weak_count 的改变 让我们通过创建了一个新的内部作用域并将 branch 的创建放入其中,来观察 Rc 实例的 strong_count 和 weak_count 值的变化。这会展示当 branch 创建和离开作用域被丢弃时会发生什么。这些修改如示例 15-29 所示: 文件名:src/main.rs # use std::cell::RefCell;\n# use std::rc::{Rc, Weak};\n# # #[derive(Debug)]\n# struct Node {\n# value: i32,\n# parent: RefCell>,\n# children: RefCell>>,\n# }\n# fn main() { let leaf = Rc::new(Node { value: 3, parent: RefCell::new(Weak::new()), children: RefCell::new(vec![]), }); println!( \"leaf strong = {}, weak = {}\", Rc::strong_count(&leaf), Rc::weak_count(&leaf), ); { let branch = Rc::new(Node { value: 5, parent: RefCell::new(Weak::new()), children: RefCell::new(vec![Rc::clone(&leaf)]), }); *leaf.parent.borrow_mut() = Rc::downgrade(&branch); println!( \"branch strong = {}, weak = {}\", Rc::strong_count(&branch), Rc::weak_count(&branch), ); println!( \"leaf strong = {}, weak = {}\", Rc::strong_count(&leaf), Rc::weak_count(&leaf), ); } println!(\"leaf parent = {:?}\", leaf.parent.borrow().upgrade()); println!( \"leaf strong = {}, weak = {}\", Rc::strong_count(&leaf), Rc::weak_count(&leaf), );\n} 示例 15-29:在内部作用域创建 branch 并检查其强弱引用计数 一旦创建了 leaf,其 Rc 的强引用计数为 1,弱引用计数为 0。在内部作用域中创建了 branch 并与 leaf 相关联,此时 branch 中 Rc 的强引用计数为 1,弱引用计数为 1(因为 leaf.parent 通过 Weak 指向 branch)。这里 leaf 的强引用计数为 2,因为现在 branch 的 branch.children 中储存了 leaf 的 Rc 的拷贝,不过弱引用计数仍然为 0。 当内部作用域结束时,branch 离开作用域,Rc 的强引用计数减少为 0,所以其 Node 被丢弃。来自 leaf.parent 的弱引用计数 1 与 Node 是否被丢弃无关,所以并没有产生任何内存泄漏! 如果在内部作用域结束后尝试访问 leaf 的父节点,会再次得到 None。在程序的结尾,leaf 中 Rc 的强引用计数为 1,弱引用计数为 0,因为现在 leaf 又是 Rc 唯一的引用了。 所有这些管理计数和值的逻辑都内建于 Rc 和 Weak 以及它们的 Drop trait 实现中。通过在 Node 定义中指定从子节点到父节点的关系为一个Weak引用,就能够拥有父节点和子节点之间的双向引用而不会造成引用循环和内存泄漏。","breadcrumbs":"智能指针 » 引用循环会导致内存泄漏 » 避免引用循环:将 Rc 变为 Weak","id":"294","title":"避免引用循环:将 Rc 变为 Weak"},"295":{"body":"这一章涵盖了如何使用智能指针来做出不同于 Rust 常规引用默认所提供的保证与取舍。Box 有一个已知的大小并指向分配在堆上的数据。Rc 记录了堆上数据的引用数量以便可以拥有多个所有者。RefCell 和其内部可变性提供了一个可以用于当需要不可变类型但是需要改变其内部值能力的类型,并在运行时而不是编译时检查借用规则。 我们还介绍了提供了很多智能指针功能的 trait Deref 和 Drop。同时探索了会造成内存泄漏的引用循环,以及如何使用 Weak 来避免它们。 如果本章内容引起了你的兴趣并希望现在就实现你自己的智能指针的话,请阅读 “The Rustonomicon” 来获取更多有用的信息。 接下来,让我们谈谈 Rust 的并发。届时甚至还会学习到一些新的对并发有帮助的智能指针。","breadcrumbs":"智能指针 » 引用循环会导致内存泄漏 » 总结","id":"295","title":"总结"},"296":{"body":"ch16-00-concurrency.md commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f 安全且高效地处理并发编程是 Rust 的另一个主要目标。 并发编程 ( Concurrent programming ),代表程序的不同部分相互独立地执行,而 并行编程 ( parallel programming )代表程序不同部分同时执行,这两个概念随着计算机越来越多的利用多处理器的优势而显得愈发重要。由于历史原因,在此类上下文中编程一直是困难且容易出错的:Rust 希望能改变这一点。 起初,Rust 团队认为确保内存安全和防止并发问题是两个分别需要不同方法应对的挑战。随着时间的推移,团队发现所有权和类型系统是一系列解决内存安全 和 并发问题的强有力的工具!通过利用所有权和类型检查,在 Rust 中很多并发错误都是 编译时 错误,而非运行时错误。因此,相比花费大量时间尝试重现运行时并发 bug 出现的特定情况,Rust 会拒绝编译不正确的代码并提供解释问题的错误信息。因此,你可以在开发时修复代码,而不是在部署到生产环境后修复代码。我们给 Rust 的这一部分起了一个绰号 无畏并发 ( fearless concurrency )。无畏并发令你的代码免于出现诡异的 bug 并可以轻松重构且无需担心会引入新的 bug。 注意:出于简洁的考虑,我们将很多问题归类为 并发 ,而不是更准确的区分 并发和(或)并行 。如果这是一本专注于并发和/或并行的书,我们肯定会更加精确的。对于本章,当我们谈到 并发 时,请自行脑内替换为 并发和(或)并行 。 很多语言所提供的处理并发问题的解决方法都非常有特色。例如,Erlang 有着优雅的消息传递并发功能,但只有模糊不清的在线程间共享状态的方法。对于高级语言来说,只实现可能解决方案的子集是一个合理的策略,因为高级语言所许诺的价值来源于牺牲一些控制来换取抽象。然而对于底层语言则期望提供在任何给定的情况下有着最高的性能且对硬件有更少的抽象。因此,Rust 提供了多种工具,以符合实际情况和需求的方式来为问题建模。 如下是本章将要涉及到的内容: 如何创建线程来同时运行多段代码。 消息传递 ( Message passing )并发,其中信道(channel)被用来在线程间传递消息。 共享状态 ( Shared state )并发,其中多个线程可以访问同一片数据。 Sync 和 Send trait,将 Rust 的并发保证扩展到用户定义的以及标准库提供的类型中。","breadcrumbs":"无畏并发 » 无畏并发","id":"296","title":"无畏并发"},"297":{"body":"ch16-01-threads.md commit 8aecae3efe5ca8f79f055b70f05d9a3f990bce7b 在大部分现代操作系统中,已执行程序的代码在一个 进程 ( process )中运行,操作系统则会负责管理多个进程。在程序内部,也可以拥有多个同时运行的独立部分。这些运行这些独立部分的功能被称为 线程 ( threads )。例如,web 服务器可以有多个线程以便可以同时响应多个请求。 将程序中的计算拆分进多个线程可以改善性能,因为程序可以同时进行多个任务,不过这也会增加复杂性。因为线程是同时运行的,所以无法预先保证不同线程中的代码的执行顺序。这会导致诸如此类的问题: 竞态条件(Race conditions),多个线程以不一致的顺序访问数据或资源 死锁(Deadlocks),两个线程相互等待对方,这会阻止两者继续运行 只会发生在特定情况且难以稳定重现和修复的 bug Rust 尝试减轻使用线程的负面影响。不过在多线程上下文中编程仍需格外小心,同时其所要求的代码结构也不同于运行于单线程的程序。 编程语言有一些不同的方法来实现线程,而且很多操作系统提供了创建新线程的 API。Rust 标准库使用 1:1 线程实现,这代表程序的每一个语言级线程使用一个系统线程。有一些 crate 实现了其他有着不同于 1:1 模型取舍的线程模型。","breadcrumbs":"无畏并发 » 使用线程同时地运行代码 » 使用线程同时运行代码","id":"297","title":"使用线程同时运行代码"},"298":{"body":"为了创建一个新线程,需要调用 thread::spawn 函数并传递一个闭包(第十三章学习了闭包),并在其中包含希望在新线程运行的代码。示例 16-1 中的例子在主线程打印了一些文本而另一些文本则由新线程打印: 文件名:src/main.rs use std::thread;\nuse std::time::Duration; fn main() { thread::spawn(|| { for i in 1..10 { println!(\"hi number {i} from the spawned thread!\"); thread::sleep(Duration::from_millis(1)); } }); for i in 1..5 { println!(\"hi number {i} from the main thread!\"); thread::sleep(Duration::from_millis(1)); }\n} 示例 16-1: 创建一个打印某些内容的新线程,但是主线程打印其它内容 注意当 Rust 程序的主线程结束时,新线程也会结束,而不管其是否执行完毕。这个程序的输出可能每次都略有不同,不过它大体上看起来像这样: hi number 1 from the main thread!\nhi number 1 from the spawned thread!\nhi number 2 from the main thread!\nhi number 2 from the spawned thread!\nhi number 3 from the main thread!\nhi number 3 from the spawned thread!\nhi number 4 from the main thread!\nhi number 4 from the spawned thread!\nhi number 5 from the spawned thread! thread::sleep 调用强制线程停止执行一小段时间,这会允许其他不同的线程运行。这些线程可能会轮流运行,不过并不保证如此:这依赖操作系统如何调度线程。在这里,主线程首先打印,即便新创建线程的打印语句位于程序的开头,甚至即便我们告诉新建的线程打印直到 i 等于 9,它在主线程结束之前也只打印到了 5。 如果运行代码只看到了主线程的输出,或没有出现重叠打印的现象,尝试增大区间 (变量 i 的范围) 来增加操作系统切换线程的机会。 使用 join 等待所有线程结束 由于主线程结束,示例 16-1 中的代码大部分时候不光会提早结束新建线程,因为无法保证线程运行的顺序,我们甚至不能实际保证新建线程会被执行! 可以通过将 thread::spawn 的返回值储存在变量中来修复新建线程部分没有执行或者完全没有执行的问题。thread::spawn 的返回值类型是 JoinHandle。JoinHandle 是一个拥有所有权的值,当对其调用 join 方法时,它会等待其线程结束。示例 16-2 展示了如何使用示例 16-1 中创建的线程的 JoinHandle 并调用 join 来确保新建线程在 main 退出前结束运行: 文件名:src/main.rs use std::thread;\nuse std::time::Duration; fn main() { let handle = thread::spawn(|| { for i in 1..10 { println!(\"hi number {i} from the spawned thread!\"); thread::sleep(Duration::from_millis(1)); } }); for i in 1..5 { println!(\"hi number {i} from the main thread!\"); thread::sleep(Duration::from_millis(1)); } handle.join().unwrap();\n} 示例 16-2: 从 thread::spawn 保存一个 JoinHandle 以确保该线程能够运行至结束 通过调用 handle 的 join 会阻塞当前线程直到 handle 所代表的线程结束。 阻塞 ( Blocking )线程意味着阻止该线程执行工作或退出。因为我们将 join 调用放在了主线程的 for 循环之后,运行示例 16-2 应该会产生类似这样的输出: hi number 1 from the main thread!\nhi number 2 from the main thread!\nhi number 1 from the spawned thread!\nhi number 3 from the main thread!\nhi number 2 from the spawned thread!\nhi number 4 from the main thread!\nhi number 3 from the spawned thread!\nhi number 4 from the spawned thread!\nhi number 5 from the spawned thread!\nhi number 6 from the spawned thread!\nhi number 7 from the spawned thread!\nhi number 8 from the spawned thread!\nhi number 9 from the spawned thread! 这两个线程仍然会交替执行,不过主线程会由于 handle.join() 调用会等待直到新建线程执行完毕。 不过让我们看看将 handle.join() 移动到 main 中 for 循环之前会发生什么,如下: 文件名:src/main.rs use std::thread;\nuse std::time::Duration; fn main() { let handle = thread::spawn(|| { for i in 1..10 { println!(\"hi number {i} from the spawned thread!\"); thread::sleep(Duration::from_millis(1)); } }); handle.join().unwrap(); for i in 1..5 { println!(\"hi number {i} from the main thread!\"); thread::sleep(Duration::from_millis(1)); }\n} 主线程会等待直到新建线程执行完毕之后才开始执行 for 循环,所以输出将不会交替出现,如下所示: hi number 1 from the spawned thread!\nhi number 2 from the spawned thread!\nhi number 3 from the spawned thread!\nhi number 4 from the spawned thread!\nhi number 5 from the spawned thread!\nhi number 6 from the spawned thread!\nhi number 7 from the spawned thread!\nhi number 8 from the spawned thread!\nhi number 9 from the spawned thread!\nhi number 1 from the main thread!\nhi number 2 from the main thread!\nhi number 3 from the main thread!\nhi number 4 from the main thread! 诸如将 join 放置于何处这样的小细节,会影响线程是否同时运行。","breadcrumbs":"无畏并发 » 使用线程同时地运行代码 » 使用 spawn 创建新线程","id":"298","title":"使用 spawn 创建新线程"},"299":{"body":"move 关键字经常用于传递给 thread::spawn 的闭包,因为闭包会获取从环境中取得的值的所有权,因此会将这些值的所有权从一个线程传送到另一个线程。在第十三章 “闭包会捕获其环境” 部分讨论了闭包上下文中的 move。现在我们会更专注于 move 和 thread::spawn 之间的交互。 在第十三章中,我们讲到可以在参数列表前使用 move 关键字强制闭包获取其使用的环境值的所有权。这个技巧在创建新线程将值的所有权从一个线程移动到另一个线程时最为实用。 注意示例 16-1 中传递给 thread::spawn 的闭包并没有任何参数:并没有在新建线程代码中使用任何主线程的数据。为了在新建线程中使用来自于主线程的数据,需要新建线程的闭包获取它需要的值。示例 16-3 展示了一个尝试在主线程中创建一个 vector 并用于新建线程的例子,不过这么写还不能工作,如下所示: 文件名:src/main.rs use std::thread; fn main() { let v = vec![1, 2, 3]; let handle = thread::spawn(|| { println!(\"Here's a vector: {v:?}\"); }); handle.join().unwrap();\n} 示例 16-3: 尝试在另一个线程使用主线程创建的 vector 闭包使用了 v,所以闭包会捕获 v 并使其成为闭包环境的一部分。因为 thread::spawn 在一个新线程中运行这个闭包,所以可以在新线程中访问 v。然而当编译这个例子时,会得到如下错误: $ cargo run Compiling threads v0.1.0 (file:///projects/threads)\nerror[E0373]: closure may outlive the current function, but it borrows `v`, which is owned by the current function --> src/main.rs:6:32 |\n6 | let handle = thread::spawn(|| { | ^^ may outlive borrowed value `v`\n7 | println!(\"Here's a vector: {v:?}\"); | - `v` is borrowed here |\nnote: function requires argument type to outlive `'static` --> src/main.rs:6:18 |\n6 | let handle = thread::spawn(|| { | __________________^\n7 | | println!(\"Here's a vector: {v:?}\");\n8 | | }); | |______^\nhelp: to force the closure to take ownership of `v` (and any other referenced variables), use the `move` keyword |\n6 | let handle = thread::spawn(move || { | ++++ For more information about this error, try `rustc --explain E0373`.\nerror: could not compile `threads` (bin \"threads\") due to 1 previous error Rust 会 推断 如何捕获 v,因为 println! 只需要 v 的引用,闭包尝试借用 v。然而这有一个问题:Rust 不知道这个新建线程会执行多久,所以无法知晓对 v 的引用是否一直有效。 示例 16-4 展示了一个 v 的引用很有可能不再有效的场景: 文件名:src/main.rs use std::thread; fn main() { let v = vec![1, 2, 3]; let handle = thread::spawn(|| { println!(\"Here's a vector: {v:?}\"); }); drop(v); // oh no! handle.join().unwrap();\n} 示例 16-4: 一个具有闭包的线程,尝试使用一个在主线程中被回收的引用 v 如果 Rust 允许这段代码运行,则新建线程则可能会立刻被转移到后台并完全没有机会运行。新建线程内部有一个 v 的引用,不过主线程立刻就使用第十五章讨论的 drop 丢弃了 v。接着当新建线程开始执行,v 已不再有效,所以其引用也是无效的。噢,这太糟了! 为了修复示例 16-3 的编译错误,我们可以听取错误信息的建议: help: to force the closure to take ownership of `v` (and any other referenced variables), use the `move` keyword |\n6 | let handle = thread::spawn(move || { | ++++ 通过在闭包之前增加 move 关键字,我们强制闭包获取其使用的值的所有权,而不是任由 Rust 推断它应该借用值。示例 16-5 中展示的对示例 16-3 代码的修改,可以按照我们的预期编译并运行: 文件名:src/main.rs use std::thread; fn main() { let v = vec![1, 2, 3]; let handle = thread::spawn(move || { println!(\"Here's a vector: {v:?}\"); }); handle.join().unwrap();\n} 示例 16-5: 使用 move 关键字强制获取它使用的值的所有权 我们可能希望尝试同样的方法来修复示例 16-4 中的代码,其主线程使用 move 闭包调用了 drop。然而这个修复行不通,因为示例 16-4 所尝试的操作由于一个不同的原因而不被允许。如果为闭包增加 move,将会把 v 移动进闭包的环境中,如此将不能在主线程中对其调用 drop 了。我们会得到如下不同的编译错误: $ cargo run Compiling threads v0.1.0 (file:///projects/threads)\nerror[E0382]: use of moved value: `v` --> src/main.rs:10:10 |\n4 | let v = vec![1, 2, 3]; | - move occurs because `v` has type `Vec`, which does not implement the `Copy` trait\n5 |\n6 | let handle = thread::spawn(move || { | ------- value moved into closure here\n7 | println!(\"Here's a vector: {v:?}\"); | - variable moved due to use in closure\n...\n10 | drop(v); // oh no! | ^ value used here after move For more information about this error, try `rustc --explain E0382`.\nerror: could not compile `threads` (bin \"threads\") due to 1 previous error Rust 的所有权规则又一次帮助了我们!示例 16-3 中的错误是因为 Rust 是保守的并只会为线程借用 v,这意味着主线程理论上可能使新建线程的引用无效。通过告诉 Rust 将 v 的所有权移动到新建线程,我们向 Rust 保证主线程不会再使用 v。如果对示例 16-4 也做出如此修改,那么当在主线程中使用 v 时就会违反所有权规则。 move 关键字覆盖了 Rust 默认保守的借用,但它不允许我们违反所有权规则。 现在我们对线程和线程 API 有了基本的了解,让我们讨论一下使用线程实际可以 做 什么吧。","breadcrumbs":"无畏并发 » 使用线程同时地运行代码 » 将 move 闭包与线程一同使用","id":"299","title":"将 move 闭包与线程一同使用"},"3":{"body":"Rust 因多种原因适合许多人。让我们看看几个最重要的群体。","breadcrumbs":"简介 » Rust 适合哪些人","id":"3","title":"Rust 适合哪些人"},"30":{"body":"你已经准备好开启 Rust 之旅了!在本章中,你学习了如何: 使用 rustup 安装最新稳定版的 Rust 更新到新版的 Rust 打开本地安装的文档 直接通过 rustc 编写并运行 Hello, world! 程序 使用 Cargo 创建并运行新项目 是时候通过构建更实质性的程序来熟悉读写 Rust 代码了。所以在第二章我们会构建一个猜猜看游戏程序。如果你更愿意从学习 Rust 常用的编程概念开始,请阅读第三章,接着再回到第二章。","breadcrumbs":"入门指南 » Hello, Cargo! » 总结","id":"30","title":"总结"},"300":{"body":"ch16-02-message-passing.md commit 36383b4da21dbd0a0781473bc8ad7ef0ed1b6751 一个日益流行的确保安全并发的方式是 消息传递 ( message passing ),这里线程或 actor 通过发送包含数据的消息来相互沟通。这个思想来源于 Go 编程语言文档中 的口号:“不要通过共享内存来通讯;而是通过通讯来共享内存。”(“Do not communicate by sharing memory; instead, share memory by communicating.”) 为了实现消息传递并发,Rust 标准库提供了一个 信道 ( channel )实现。信道是一个通用编程概念,表示数据从一个线程发送到另一个线程。 你可以将编程中的信道想象为一个水流的渠道,比如河流或小溪。如果你将诸如橡皮鸭或小船之类的东西放入其中,它们会顺流而下到达下游。 编程中的信息渠道(信道)有两部分组成,一个发送者(transmitter)和一个接收者(receiver)。发送者位于上游位置,在这里可以将橡皮鸭放入河中,接收者则位于下游,橡皮鸭最终会漂流至此。代码中的一部分调用发送者的方法以及希望发送的数据,另一部分则检查接收端收到的消息。当发送者或接收者任一被丢弃时可以认为信道被 关闭 ( closed )了。 这里,我们将开发一个程序,它会在一个线程生成值向信道发送,而在另一个线程会接收值并打印出来。这里会通过信道在线程间发送简单值来演示这个功能。一旦你熟悉了这项技术,你就可以将信道用于任何相互通信的任何线程,例如一个聊天系统,或利用很多线程进行分布式计算并将部分计算结果发送给一个线程进行聚合。 首先,在示例 16-6 中,创建了一个信道但没有做任何事。注意这还不能编译,因为 Rust 不知道我们想要在信道中发送什么类型: 文件名:src/main.rs use std::sync::mpsc; fn main() { let (tx, rx) = mpsc::channel();\n} 示例 16-6: 创建一个信道,并将其两端赋值给 tx 和 rx 这里使用 mpsc::channel 函数创建一个新的信道;mpsc 是 多个生产者,单个消费者 ( multiple producer, single consumer )的缩写。简而言之,Rust 标准库实现信道的方式意味着一个信道可以有多个产生值的 发送 ( sending )端,但只能有一个消费这些值的 接收 ( receiving )端。想象一下多条小河小溪最终汇聚成大河:所有通过这些小河发出的东西最后都会来到下游的大河。目前我们以单个生产者开始,但是当示例可以工作后会增加多个生产者。 mpsc::channel 函数返回一个元组:第一个元素是发送端 -- 发送者,而第二个元素是接收端 -- 接收者。由于历史原因,tx 和 rx 通常作为 发送者 ( transmitter )和 接收者 ( receiver )的缩写,所以这就是我们将用来绑定这两端变量的名字。这里使用了一个 let 语句和模式来解构了此元组;第十九章会讨论 let 语句中的模式和解构。现在只需知道使用 let 语句是一个方便提取 mpsc::channel 返回的元组中一部分的手段。 让我们将发送端移动到一个新建线程中并发送一个字符串,这样新建线程就可以和主线程通讯了,如示例 16-7 所示。这类似于在河的上游扔下一只橡皮鸭或从一个线程向另一个线程发送聊天信息: 文件名:src/main.rs use std::sync::mpsc;\nuse std::thread; fn main() { let (tx, rx) = mpsc::channel(); thread::spawn(move || { let val = String::from(\"hi\"); tx.send(val).unwrap(); });\n} 示例 16-7: 将 tx 移动到一个新建的线程中并发送 “hi” 这里再次使用 thread::spawn 来创建一个新线程并使用 move 将 tx 移动到闭包中这样新建线程就拥有 tx 了。新建线程需要拥有信道的发送端以便能向信道发送消息。信道的发送端有一个 send 方法用来获取需要放入信道的值。send 方法返回一个 Result 类型,所以如果接收端已经被丢弃了,将没有发送值的目标,所以发送操作会返回错误。在这个例子中,出错的时候调用 unwrap 产生 panic。不过对于一个真实程序,需要合理地处理它:回到第九章复习正确处理错误的策略。 在示例 16-8 中,我们在主线程中从信道的接收者获取值。这类似于在河的下游捞起橡皮鸭或接收聊天信息: 文件名:src/main.rs use std::sync::mpsc;\nuse std::thread; fn main() { let (tx, rx) = mpsc::channel(); thread::spawn(move || { let val = String::from(\"hi\"); tx.send(val).unwrap(); }); let received = rx.recv().unwrap(); println!(\"Got: {received}\");\n} 示例 16-8: 在主线程中接收并打印内容 “hi” 信道的接收者有两个有用的方法:recv 和 try_recv。这里,我们使用了 recv,它是 receive 的缩写。这个方法会阻塞主线程执行直到从信道中接收一个值。一旦发送了一个值,recv 会在一个 Result 中返回它。当信道发送端关闭,recv 会返回一个错误表明不会再有新的值到来了。 try_recv 不会阻塞,相反它立刻返回一个 Result:Ok 值包含可用的信息,而 Err 值代表此时没有任何消息。如果线程在等待消息过程中还有其他工作时使用 try_recv 很有用:可以编写一个循环来频繁调用 try_recv,在有可用消息时进行处理,其余时候则处理一会其他工作直到再次检查。 出于简单的考虑,这个例子使用了 recv;主线程中除了等待消息之外没有任何其他工作,所以阻塞主线程是合适的。 如果运行示例 16-8 中的代码,我们将会看到主线程打印出这个值: Got: hi 完美!","breadcrumbs":"无畏并发 » 使用消息传递在线程间通信 » 使用消息传递在线程间传送数据","id":"300","title":"使用消息传递在线程间传送数据"},"301":{"body":"所有权规则在消息传递中扮演了重要角色,其有助于我们编写安全的并发代码。防止并发编程中的错误是在 Rust 程序中考虑所有权的一大优势。现在让我们做一个试验来看看信道与所有权如何一同协作以避免产生问题:我们将尝试在新建线程中的信道中发送完 val 值 之后 再使用它。尝试编译示例 16-9 中的代码并看看为何这是不允许的: 文件名:src/main.rs use std::sync::mpsc;\nuse std::thread; fn main() { let (tx, rx) = mpsc::channel(); thread::spawn(move || { let val = String::from(\"hi\"); tx.send(val).unwrap(); println!(\"val is {val}\"); }); let received = rx.recv().unwrap(); println!(\"Got: {received}\");\n} 示例 16-9: 在我们已经发送到信道中后,尝试使用 val 引用 这里尝试在通过 tx.send 发送 val 到信道中之后将其打印出来。允许这么做是一个坏主意:一旦将值发送到另一个线程后,那个线程可能会在我们再次使用它之前就将其修改或者丢弃。其他线程对值可能的修改会由于不一致或不存在的数据而导致错误或意外的结果。然而,尝试编译示例 16-9 的代码时,Rust 会给出一个错误: $ cargo run Compiling message-passing v0.1.0 (file:///projects/message-passing)\nerror[E0382]: borrow of moved value: `val` --> src/main.rs:10:26 |\n8 | let val = String::from(\"hi\"); | --- move occurs because `val` has type `String`, which does not implement the `Copy` trait\n9 | tx.send(val).unwrap(); | --- value moved here\n10 | println!(\"val is {val}\"); | ^^^^^ value borrowed here after move | = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info) For more information about this error, try `rustc --explain E0382`.\nerror: could not compile `message-passing` (bin \"message-passing\") due to 1 previous error 我们的并发错误会造成一个编译时错误。send 函数获取其参数的所有权并移动这个值归接收者所有。这可以防止在发送后再次意外地使用这个值;所有权系统检查一切是否合乎规则。","breadcrumbs":"无畏并发 » 使用消息传递在线程间通信 » 信道与所有权转移","id":"301","title":"信道与所有权转移"},"302":{"body":"示例 16-8 中的代码可以编译和运行,不过它并没有明确的告诉我们两个独立的线程通过信道相互通讯。示例 16-10 则有一些改进会证明示例 16-8 中的代码是并发执行的:新建线程现在会发送多个消息并在每个消息之间暂停一秒钟。 文件名:src/main.rs use std::sync::mpsc;\nuse std::thread;\nuse std::time::Duration; fn main() { let (tx, rx) = mpsc::channel(); thread::spawn(move || { let vals = vec![ String::from(\"hi\"), String::from(\"from\"), String::from(\"the\"), String::from(\"thread\"), ]; for val in vals { tx.send(val).unwrap(); thread::sleep(Duration::from_secs(1)); } }); for received in rx { println!(\"Got: {received}\"); }\n} 示例 16-10: 发送多个消息,并在每次发送后暂停一段时间 这一次,在新建线程中有一个字符串 vector 希望发送到主线程。我们遍历它们,单独的发送每一个字符串并通过一个 Duration 值调用 thread::sleep 函数来暂停一秒。 在主线程中,不再显式调用 recv 函数:而是将 rx 当作一个迭代器。对于每一个接收到的值,我们将其打印出来。当信道被关闭时,迭代器也将结束。 当运行示例 16-10 中的代码时,将看到如下输出,每一行都会暂停一秒: Got: hi\nGot: from\nGot: the\nGot: thread 因为主线程中的 for 循环里并没有任何暂停或等待的代码,所以可以说主线程是在等待从新建线程中接收值。","breadcrumbs":"无畏并发 » 使用消息传递在线程间通信 » 发送多个值并观察接收者的等待","id":"302","title":"发送多个值并观察接收者的等待"},"303":{"body":"之前我们提到了mpsc是 multiple producer, single consumer 的缩写。可以运用 mpsc 来扩展示例 16-10 中的代码来创建向同一接收者发送值的多个线程。这可以通过克隆发送者来做到,如示例 16-11 所示: 文件名:src/main.rs # use std::sync::mpsc;\n# use std::thread;\n# use std::time::Duration;\n# # fn main() { // --snip-- let (tx, rx) = mpsc::channel(); let tx1 = tx.clone(); thread::spawn(move || { let vals = vec![ String::from(\"hi\"), String::from(\"from\"), String::from(\"the\"), String::from(\"thread\"), ]; for val in vals { tx1.send(val).unwrap(); thread::sleep(Duration::from_secs(1)); } }); thread::spawn(move || { let vals = vec![ String::from(\"more\"), String::from(\"messages\"), String::from(\"for\"), String::from(\"you\"), ]; for val in vals { tx.send(val).unwrap(); thread::sleep(Duration::from_secs(1)); } }); for received in rx { println!(\"Got: {received}\"); } // --snip--\n# } 示例 16-11: 从多个生产者发送多个消息 这一次,在创建新线程之前,我们对发送者调用了 clone 方法。这会给我们一个可以传递给第一个新建线程的发送端句柄。我们会将原始的信道发送端传递给第二个新建线程。这样就会有两个线程,每个线程将向信道的接收端发送不同的消息。 如果运行这些代码,你 可能 会看到这样的输出: Got: hi\nGot: more\nGot: from\nGot: messages\nGot: for\nGot: the\nGot: thread\nGot: you 虽然你可能会看到这些值以不同的顺序出现;这依赖于你的系统。这也就是并发既有趣又困难的原因。如果通过 thread::sleep 做实验,在不同的线程中提供不同的值,就会发现它们的运行更加不确定,且每次都会产生不同的输出。 现在我们见识过了信道如何工作,再看看另一种不同的并发方式吧。","breadcrumbs":"无畏并发 » 使用消息传递在线程间通信 » 通过克隆发送者来创建多个生产者","id":"303","title":"通过克隆发送者来创建多个生产者"},"304":{"body":"ch16-03-shared-state.md commit 856d89c53a6d69470bb5669c773fdfe6aab6fcc9 消息传递是一个很好的处理并发的方式,但并不是唯一一个。另一种方式是让多个线程访问同一块内存中的数据(共享状态)。再考虑一下 Go 语言文档中的这句口号:“不要通过共享内存来通讯”(“do not communicate by sharing memory.” 通过共享内存进行通信,会是什么样的代码?此外,为什么喜欢消息传递的人会警告:谨慎使用内存共享? 在某种程度上,任何编程语言中的信道都类似于单所有权,因为一旦将一个值传送到信道中,将无法再使用这个值。共享内存类似于多所有权:多个线程可以同时访问相同的内存位置。在 15 章中,我们介绍了智能指针可以实现多所有权,然而这会增加额外的复杂性,因为需要管理多个所有者。Rust 的类型系统和所有权规则在正确管理这些问题上提供了极大的帮助:举个例子,让我们来看看 互斥器 ,一个较常见的共享内存并发原语。","breadcrumbs":"无畏并发 » 共享状态并发 » 共享状态的并发","id":"304","title":"共享状态的并发"},"305":{"body":"互斥器 ( mutex )是 互相排斥( mutual exclusion )的缩写。在同一时刻,其只允许一个线程对数据拥有访问权。为了访问互斥器中的数据,线程首先需要通过获取互斥器的 锁 ( lock )来表明其希望访问数据。锁是一个数据结构,作为互斥器的一部分,它记录谁有数据的专属访问权。因此我们讲,互斥器通过锁系统 保护 ( guarding )其数据。 互斥器以难以使用著称(译注:原文指互斥器在其他编程语言中难以使用),因为你必须记住: 在使用数据之前,必须获取锁。 使用完被互斥器所保护的数据之后,必须解锁数据,这样其他线程才能够获取锁。 作为一个现实中互斥器的例子,想象一下在某个会议的一次小组座谈会中,只有一个麦克风。如果一位成员要发言,他必须请求或表示希望使用麦克风。得到了麦克风后,他可以畅所欲言,讲完后再将麦克风交给下一位希望讲话的成员。如果一位成员结束发言后忘记将麦克风交还,其他人将无法发言。如果对共享麦克风的管理出现了问题,座谈会将无法正常进行! 正确的管理互斥器异常复杂,这也是许多人之所以热衷于信道的原因。然而,在 Rust 中,得益于类型系统和所有权,我们不会在锁和解锁上出错。","breadcrumbs":"无畏并发 » 共享状态并发 » 使用互斥器,实现同一时刻只允许一个线程访问数据","id":"305","title":"使用互斥器,实现同一时刻只允许一个线程访问数据"},"306":{"body":"我们先从在单线程环境中使用互斥器开始,作为展示其用法的一个例子,如示例 16-12 所示: 文件名:src/main.rs use std::sync::Mutex; fn main() { let m = Mutex::new(5); { let mut num = m.lock().unwrap(); *num = 6; } println!(\"m = {m:?}\");\n} 示例 16-12: 出于简单的考虑,在一个单线程上下文中探索 Mutex 的 API 像很多类型一样,我们使用关联函数 new 来创建一个 Mutex。使用 lock 方法来获取锁,从而可以访问互斥器中的数据。这个调用会阻塞当前线程,直到我们拥有锁为止。 如果另一个线程拥有锁,并且那个线程 panic 了,则 lock 调用会失败。在这种情况下,没人能够再获取锁,所以我们调用 unwrap,使当前线程 panic。 一旦获取了锁,就可以将返回值(命名为 num)视为一个其内部数据(i32)的可变引用了。类型系统确保了我们在使用 m 中的值之前获取锁。m 的类型是 Mutex 而不是 i32,所以 必须 获取锁才能使用这个 i32 值。我们是不会忘记这么做的,因为如果没有获取锁,类型系统就不允许访问内部的 i32 值。 正如你所猜想的,Mutex 是一个智能指针。更准确的说,lock 调用 返回 一个叫做 MutexGuard 的智能指针。这个智能指针实现了 Deref 来指向其内部数据;它也实现了 Drop,当 MutexGuard 离开作用域时,自动释放锁(发生在示例 16-12 内部作用域的结尾)。有了这个特性,就不会有忘记释放锁的潜在风险(忘记释放锁会使互斥器无法再被其它线程使用),因为锁的释放是自动发生的。 释放锁之后,我们可以打印出互斥器内部的 i32 值,并发现我们刚刚已经将其值改为 6。 在线程间共享 Mutex 现在让我们尝试使用 Mutex 在多个线程间共享同一个值。我们将启动 10 个线程,并在各个线程中对同一个计数器值加 1,这样计数器将从 0 变为 10。示例 16-13 中的例子会出现编译错误,而我们将通过这些错误来学习如何使用 Mutex,以及 Rust 又是如何帮助我们正确使用的。 文件名:src/main.rs use std::sync::Mutex;\nuse std::thread; fn main() { let counter = Mutex::new(0); let mut handles = vec![]; for _ in 0..10 { let handle = thread::spawn(move || { let mut num = counter.lock().unwrap(); *num += 1; }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } println!(\"Result: {}\", *counter.lock().unwrap());\n} 示例 16-13: 程序启动了 10 个线程,每个线程都通过 Mutex 来增加计数器的值 这里创建了一个 counter 变量来存放内含 i32 的 Mutex,类似示例 16-12 那样。接下来我们遍历整数区间,创建了 10 个线程。我们使用了 thread::spawn,并为所有线程传入了相同的闭包:它们每一个都将调用 lock 方法来获取 Mutex 上的锁,接着将互斥器中的值加一。当一个线程结束执行,num 会离开闭包作用域并释放锁,这样另一个线程就可以获取它了。 在主线程中,我们像示例 16-2 那样收集了所有的 JoinHandle,并调用它们的 join 方法来等待所有线程结束。然后,主线程会获取锁,并打印出程序的结果。 之前提示过,这个例子不能编译,让我们看看为什么! $ cargo run Compiling shared-state v0.1.0 (file:///projects/shared-state)\nerror[E0382]: borrow of moved value: `counter` --> src/main.rs:21:29 |\n5 | let counter = Mutex::new(0); | ------- move occurs because `counter` has type `Mutex`, which does not implement the `Copy` trait\n...\n8 | for _ in 0..10 { | -------------- inside of this loop\n9 | let handle = thread::spawn(move || { | ------- value moved into closure here, in previous iteration of loop\n...\n21 | println!(\"Result: {}\", *counter.lock().unwrap()); | ^^^^^^^ value borrowed here after move |\nhelp: consider moving the expression out of the loop so it is only moved once |\n8 ~ let mut value = counter.lock();\n9 ~ for _ in 0..10 {\n10 | let handle = thread::spawn(move || {\n11 ~ let mut num = value.unwrap(); | For more information about this error, try `rustc --explain E0382`.\nerror: could not compile `shared-state` (bin \"shared-state\") due to 1 previous error 错误信息表明 counter 值在上一次循环中被移动了。所以 Rust 告诉我们,不能将 counter 锁的所有权移动到多个线程中。让我们通过一个第 15 章讨论过的多所有权手段,来修复这个编译错误。 多线程和多所有权 在第 15 章中,我们用智能指针 Rc 来创建引用计数,使得一个值有了多个所有者。让我们做同样的事,看看会发生什么。将示例 16-14 中的 Mutex 封装进 Rc 中,并在将所有权移入线程之前克隆(clone) Rc。 文件名:src/main.rs use std::rc::Rc;\nuse std::sync::Mutex;\nuse std::thread; fn main() { let counter = Rc::new(Mutex::new(0)); let mut handles = vec![]; for _ in 0..10 { let counter = Rc::clone(&counter); let handle = thread::spawn(move || { let mut num = counter.lock().unwrap(); *num += 1; }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } println!(\"Result: {}\", *counter.lock().unwrap());\n} 示例 16-14: 尝试使用 Rc 来允许多个线程拥有 Mutex 再一次编译并...出现了不同的错误!编译器真是教会了我们很多! $ cargo run Compiling shared-state v0.1.0 (file:///projects/shared-state)\nerror[E0277]: `Rc>` cannot be sent between threads safely --> src/main.rs:11:36 |\n11 | let handle = thread::spawn(move || { | ------------- ^------ | | | | ______________________|_____________within this `{closure@src/main.rs:11:36: 11:43}` | | | | | required by a bound introduced by this call\n12 | | let mut num = counter.lock().unwrap();\n13 | |\n14 | | *num += 1;\n15 | | }); | |_________^ `Rc>` cannot be sent between threads safely | = help: within `{closure@src/main.rs:11:36: 11:43}`, the trait `Send` is not implemented for `Rc>`, which is required by `{closure@src/main.rs:11:36: 11:43}: Send`\nnote: required because it's used within this closure --> src/main.rs:11:36 |\n11 | let handle = thread::spawn(move || { | ^^^^^^^\nnote: required by a bound in `spawn` --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/thread/mod.rs:688:1 For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `shared-state` (bin \"shared-state\") due to 1 previous error 哇哦,错误信息太长不看!划重点:第一行错误表明 Rc> 不能在线程间安全传递(`Rc>` cannot be sent between threads safely);编译器也指出了原因:Rc> 没有实现 Send trait(the trait `Send` is not implemented for `Rc>`)。下一节我们会讲到 Send:这是一个确保所使用的类型可以用于并发环境的 trait。 不幸的是,Rc 并不能安全的在线程间共享。当 Rc 管理引用计数时,它必须在每一个 clone 调用时增加计数,并在每一个克隆体被丢弃时减少计数。Rc 并没有使用任何并发原语,无法确保改变计数的操作不会被其他线程打断。这可能使计数出错,并导致诡异的 bug,比如可能会造成内存泄漏,或在使用结束之前就丢弃一个值。我们所需要的是一个与 Rc 完全一致,又以线程安全的方式改变引用计数的类型。 原子引用计数 Arc 所幸 Arc 正是这么一个类似 Rc 并可以安全的用于并发环境的类型。字母 “a” 代表 原子性 ( atomic ),所以这是一个 原子引用计数 ( atomically reference counted )类型。 原子类型 (Atomics) 是另一类这里还未涉及到的并发原语:请查看标准库中 std::sync::atomic 的文档来获取更多细节。目前我们只需要知道:原子类型就像基本类型一样,可以安全的在线程间共享。 你可能会好奇,为什么不是所有的基本类型都是原子性的?为什么标准库中的类型没有全部默认使用 Arc 实现?原因在于,线程安全会造成性能损失,我们希望只在必要时才为此买单。如果只是在单线程中对值进行操作,原子性提供的保证并无必要,而不加入原子性可以使代码运行得更快。 回到之前的例子:Arc 和 Rc 有着相同的 API,所以我们只需修改程序中的 use 行、new 调用和 clone 调用。示例 16-15 中的代码最终可以编译和运行: 文件名:src/main.rs use std::sync::{Arc, Mutex};\nuse std::thread; fn main() { let counter = Arc::new(Mutex::new(0)); let mut handles = vec![]; for _ in 0..10 { let counter = Arc::clone(&counter); let handle = thread::spawn(move || { let mut num = counter.lock().unwrap(); *num += 1; }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } println!(\"Result: {}\", *counter.lock().unwrap());\n} 示例 16-15: 使用 Arc 包装一个 Mutex 能够实现在多线程之间共享所有权 这会打印出: Result: 10 成功了!我们从 0 数到了 10,这好像没啥大不了的,不过一路上我们确实学习了很多关于 Mutex 和线程安全的内容!这个例子中构建的结构可以用于比增加计数更为复杂的操作。使用这个策略,我们可将计算任务分成独立的部分,并分散到多个线程中,接着使用 Mutex 使用各自的运算结果来更新最终的结果。 注意,对于简单的数值运算, 标准库中 std::sync::atomic 模块 提供了比 Mutex 更简单的类型。针对基本类型,这些类型提供了安全、并发、原子的操作。在上面的例子中,为了专注于讲明白 Mutex 的用法,我们才选择在基本类型上使用 Mutex。(译注:对于上面例子中出现的 i32 加法操作,更好的做法是使用 AtomicI32 类型来完成。具体参考文档。)","breadcrumbs":"无畏并发 » 共享状态并发 » Mutex的 API","id":"306","title":"Mutex的 API"},"307":{"body":"你可能注意到了,尽管 counter 是不可变的,我们仍然可以获取其内部值的可变引用;这意味着 Mutex 提供了内部可变性,就像 Cell 系列类型那样。使用 RefCell 可以改变 Rc 中内容(在 15 章中讲到过),同样地,使用 Mutex 我们也可以改变 Arc 中的内容。 另一个值得注意的细节是,Rust 不能完全避免使用 Mutex 所带来的逻辑错误。回忆一下,第 15 章中讲过,使用 Rc 就有造成引用循环的风险:两个 Rc 值相互引用,造成内存泄漏。同理,Mutex 也有造成 死锁 ( deadlock )的风险:当某个操作需要锁住两个资源,而两个线程分别持有两个资源的其中一个锁时,它们会永远相互等待。如果你对这个话题感兴趣,尝试编写一个带有死锁的 Rust 程序,接着研究别的语言中使用互斥器的死锁规避策略,并尝试在 Rust 中实现它们。标准库中 Mutex 和 MutexGuard 的 API 文档会提供有用的信息。 接下来,为了丰富本章的内容,让我们讨论一下 Send和 Sync trait,以及如何对自定义类型使用它们。","breadcrumbs":"无畏并发 » 共享状态并发 » RefCell/Rc 与 Mutex/Arc 的相似性","id":"307","title":"RefCell/Rc 与 Mutex/Arc 的相似性"},"308":{"body":"ch16-04-extensible-concurrency-sync-and-send.md commit 7c7740a5ddef1458d74f1daf85fd49e03aaa97cf Rust 的并发模型中一个有趣的方面是:语言本身对并发知之 甚少 。我们之前讨论的几乎所有内容,都属于标准库,而不是语言本身的内容。由于不需要语言提供并发相关的基础设施,并发方案不受标准库或语言所限:我们可以编写自己的或使用别人编写的并发功能。 然而有两个并发概念是内嵌于语言中的:std::marker 中的 Sync 和 Send trait。","breadcrumbs":"无畏并发 » 使用 Sync 与 Send Traits 的可扩展并发 » 使用 Sync 和 Send trait 的可扩展并发","id":"308","title":"使用 Sync 和 Send trait 的可扩展并发"},"309":{"body":"Send 标记 trait 表明实现了 Send 的类型值的所有权可以在线程间传送。几乎所有的 Rust 类型都是Send 的,不过有一些例外,包括 Rc:这是不能 Send 的,因为如果克隆了 Rc 的值并尝试将克隆的所有权转移到另一个线程,这两个线程都可能同时更新引用计数。为此,Rc 被实现为用于单线程场景,这时不需要为拥有线程安全的引用计数而付出性能代价。 因此,Rust 类型系统和 trait bound 确保永远也不会意外的将不安全的 Rc 在线程间发送。当尝试在示例 16-14 中这么做的时候,会得到错误 the trait Send is not implemented for Rc>。而使用标记为 Send 的 Arc 时,就没有问题了。 任何完全由 Send 的类型组成的类型也会自动被标记为 Send。几乎所有基本类型都是 Send 的,除了第二十章将会讨论的裸指针(raw pointer)。","breadcrumbs":"无畏并发 » 使用 Sync 与 Send Traits 的可扩展并发 » 通过 Send 允许在线程间转移所有权","id":"309","title":"通过 Send 允许在线程间转移所有权"},"31":{"body":"ch02-00-guessing-game-tutorial.md commit 11ca3d508b0a28b03f7d9f16c88726088fafd87e 让我们一起动手完成一个项目来快速上手 Rust!本章将介绍一些 Rust 中常见的概念,并通过真实的程序来展示如何运用它们。你将会学到 let、match、方法(methods)、关联函数(associated functions)、外部 crate 等知识!后续章节会深入探讨这些概念的细节。在这一章,我们将主要练习基础内容。 我们会实现一个经典的新手编程问题:猜数字游戏。游戏的规则如下:程序将会生成一个 1 到 100 之间的随机整数。然后提示玩家输入一个猜测值。输入后,程序会指示该猜测是太低还是太高。如果猜对了,游戏会打印祝贺信息并退出。","breadcrumbs":"写个猜数字游戏 » 写个猜数字游戏","id":"31","title":"写个猜数字游戏"},"310":{"body":"Sync 标记 trait 表明一个实现了 Sync 的类型可以安全的在多个线程中拥有其值的引用。换一种方式来说,对于任意类型 T,如果 &T(T 的不可变引用)是 Send 的话 T 就是 Sync 的,这意味着其引用就可以安全的发送到另一个线程。类似于 Send 的情况,基本类型是 Sync 的,完全由 Sync 的类型组成的类型也是 Sync 的。 智能指针 Rc 也不是 Sync 的,出于其不是 Send 相同的原因。RefCell(第十五章讨论过)和 Cell 系列类型不是 Sync 的。RefCell 在运行时所进行的借用检查也不是线程安全的。Mutex 是 Sync 的,正如 “在线程间共享 Mutex” 部分所讲的它可以被用来在多线程中共享访问。","breadcrumbs":"无畏并发 » 使用 Sync 与 Send Traits 的可扩展并发 » Sync 允许多线程访问","id":"310","title":"Sync 允许多线程访问"},"311":{"body":"通常并不需要手动实现 Send 和 Sync trait,因为由 Send 和 Sync 的类型组成的类型,自动就是 Send 和 Sync 的。因为它们是标记 trait,甚至都不需要实现任何方法。它们只是用来加强并发相关的不可变性的。 手动实现这些标记 trait 涉及到编写不安全的 Rust 代码,第十九章将会讲述具体的方法;当前重要的是,在创建新的由不是 Send 和 Sync 的部分构成的并发类型时需要多加小心,以确保维持其安全保证。 “The Rustonomicon” 中有更多关于这些保证以及如何维持它们的信息。","breadcrumbs":"无畏并发 » 使用 Sync 与 Send Traits 的可扩展并发 » 手动实现 Send 和 Sync 是不安全的","id":"311","title":"手动实现 Send 和 Sync 是不安全的"},"312":{"body":"这不会是本书最后一个出现并发的章节:第二十一章的项目会在更现实的场景中使用这些概念,而不像本章中讨论的这些小例子。 正如之前提到的,因为 Rust 本身很少有处理并发的部分内容,有很多的并发方案都由 crate 实现。它们比标准库要发展的更快;请在网上搜索当前最新的用于多线程场景的 crate。 Rust 提供了用于消息传递的信道,和像 Mutex 和 Arc 这样可以安全的用于并发上下文的智能指针。类型系统和借用检查器会确保这些场景中的代码,不会出现数据竞争和无效的引用。一旦代码可以编译了,我们就可以坚信这些代码可以正确的运行于多线程环境,而不会出现其他语言中经常出现的那些难以追踪的 bug。并发编程不再是什么可怕的概念:无所畏惧地并发吧! 接下来,让我们讨论一下当 Rust 程序变得更大时,有哪些符合语言习惯的问题建模方法和结构化解决方案,以及 Rust 的风格是如何与面向对象编程(Object Oriented Programming)中那些你所熟悉的概念相联系的。","breadcrumbs":"无畏并发 » 使用 Sync 与 Send Traits 的可扩展并发 » 总结","id":"312","title":"总结"},"313":{"body":"ch17-00-async-await.md commit 3111eda07a4a4692bf69e3aaad999d840ac9c138 很多我们要求计算机处理的操作都需要一定的时间才能完成。例如,如果你使用视频编辑器来创建一个家庭聚会的视频,导出视频可能会花费几分钟到几小时不等。同样,从家庭成员那里下载共享的视频也可能需要很长时间。如果我们能在等待这些长时间运行的操作完成期间做点其他事情,那就太好了。 视频导出会尽可能使用所有的 CPU 和 GPU。如果你只有一个 CPU 核,同时操作系统在导出完成前也不会暂停,那么在其运行期间你无法使用计算机进行任何其他操作。这会是一个非常糟糕的体验。相反计算机的操作系统可以(也确实可以)隐式地中断导出过程,频率足够高,使你能够在导出进行的同时完成其他任务。 下载文件则有所不同。它不占用大量的 CPU 时间。相反 CPU 需要等待来自于网络的数据。虽然可以在部分数据就绪时就开始读取,但等待剩余数据可能还需要一段时间。即便数据全部就绪了,视频文件也可能非常大,因此加载所有数据也会花费一些时间。虽然这可能只需要一两秒,不过这对于一个现代处理器来说已经是非常长的时间了,因为它每秒可以执行数十亿次操作。因此,如果能让 CPU 在等待网络调用完成的同时去处理别的工作就再好不过了。所以同上操作系统会隐式地中断你的程序以便其它工作可以在网络操作进行的同时继续进行。 注意:视频导出这类操作通常被称为 “CPU 密集型”(“CPU-bound”)或者 “计算密集型”(“compute-bound”)操作。其受限于计算机 CPU 或 GPU 处理数据的速度,以及它所能利用的计算能力。而下载视频这类操作通常被称为 “IO 密集型”(“IO-bound”)操作,因为其受限于计算机的 输入输出 速度。下载的速度最多只能与通过网络传输数据的速度一致。 在上述两个例子中,操作系统的隐式中断提供了一种形式的并发。不过这种并发仅限于整个程序的级别:操作系统中断一个程序并让其它程序得以执行。在很多场景中,由于我们能比操作系统在更细粒度上理解我们的程序,因此我们可以观察到很多操作系统无法察觉的并发机会。 例如,如果我们在构建一个管理文件下载的工具,我们应当以一种不会因开始一个下载任务而锁定 UI 的方式来编写程序,并且用户应该能够同时开始多个下载任务。不过很多操作系统与网络交互的 API 都是 阻塞 的( blocking )。也就是说这些 API 会阻塞程序的进程,直到它们处理的数据完全就绪。 注意:如果你仔细思索一下,会发现这是 大部分 函数调用的工作方式!不过我们通常将 “阻塞” 这个术语保留给那些与文件、网络或其它计算机资源交互的函数调用,因为这些地方是单个程序可以从 非 阻塞操作中获益的地方。 我们可以新建专用的线程来下载每个文件以免阻塞主线程。然而,我们最终会发现这些线程的开销会成为一个问题。如果这些调用在一开始就是非阻塞的话那就更理想了。最后,如果我们能够像在阻塞代码中一样,以直接的风格编写非阻塞代码,那就更好了。比如这样: let data = fetch_data_from(url).await;\nprintln!(\"{data}\"); 这正是 Rust 的 async 抽象所提供的。不过在讲解它们在实践中如何工作之前,让我们稍微绕个远路来了解一下并行(parallelism)和并发(concurrency)的区别。","breadcrumbs":"Async 和 await » Async 和 await","id":"313","title":"Async 和 await"},"314":{"body":"在上一章中,我们大致将并行和并发视为可以互换的概念。但现在我们需要更加精确地区分它们,因为它们的区别将在实际工作中显现出来。 思考一下不同的团队分割方法来开发一个软件项目。我们可以分配给一个个人多个任务,也可以每个团队成员各自负责一个任务,或者可以采用这两种方法的组合。 当一个个人在任何一个任务完成前同时处理多个任务,这就是 并发 。你可能在计算机上同时运行两个项目,当你对其中一个项目感到厌倦或遇到困难时,可以切换到另一个项目。因为你是单独一个人,所以无法真正同时推进两个任务,但是你可以多任务处理,在不同任务之间切换以取得进展。 图 17-1:一个并发工作流,在任务 A 和任务 B 之间切换 当你同意将一组任务在组员中分配,每一个组员分配一个任务并单独处理它,这就是 并行 。每个组员可以真正同时进行工作。 图 17-2:一个并行流,其中任务 A 和任务 B 的工作同时独立进行 在这两种场景中,你可能需要协调不同的任务。也许你 认为 某个人负责的任务与其他人的工作完全不相关,但实际上它确实依赖于团队中另一位成员的工作完成。一些工作可以并行进行,不过一些工作事实上是 串行 的:它们只能串行地发生,一个接着一个,如图 17-3 所示。 图 17-3:一个部分并行的工作流,其中任务 A 和任务 B 的工作相互独立,直到任务 A3 阻塞在等待任务 B3 的结果 同理,你可能会意识到你自己的一个任务依赖另一个任务。现在并发任务也变成串行的了。 并行与并发也可能相互交叉(阻塞)。如果你得知某个同事卡在等待你的一个任务完成,你可能会集中所有精力在这个任务上来 “解锁” 你的同事。你和你的同事则不再能并行地工作了,同时你也不能够并发地处理自己的任务。 同样的基础动态也作用于软件与硬件。在一个单核的机器上,CPU 一次只能执行一个操作,不过它仍然可以并发工作。借助像线程、进程和异步(async)等工具,计算机可以暂停一个活动,并在最终切换回第一个活动之前切换到其它活动。在一个有多个 CPU 核心的机器上,它也可以并行工作。一个核心可以做一件工作的同时另一个核心可以做一些完全不相关的工作,而且这些工作实际上是同时发生的。 当使用 Rust 中的 async 时,我们总是在处理并发。取决于硬件、操作系统和所使用的异步运行时(async runtime)-- 稍后会介绍更多的异步运行时!并发也可能在底层使用了并行。 现在让我们深入理解 Rust 的异步编程实际上是如何工作的!在接下来的章节中,我们将: 学习如何使用 Rust 的 async 和 await 语法 探索如何使用异步模型来解决第十六章中遇到的一些挑战 了解多线程和异步如何互补,在很多场景中你甚至可以同时使用两者","breadcrumbs":"Async 和 await » 并行与并发","id":"314","title":"并行与并发"},"315":{"body":"ch17-01-futures-and-syntax.md commit e95efa05706c5c4309df9ed47d5e91d8ed342b7d Rust 异步编程的关键元素是 futures 和 Rust 的 async 与 await 关键字。 future 是一个现在可能还没有准备好但将在未来某个时刻准备好的值。(相同的概念也出现在很多语言中,有时被称为 “task” 或者 “promise”。)Rust 提供了 Future trait 作为基础组件,这样不同的异步操作就可以在不同的数据结构上实现。在 Rust 中,我们称实现了 Future trait 的类型为 futures。每一个实现了 Future 的类型会维护自己的进度状态信息和 “ready” 的定义。 async 关键字可以用于代码块和函数,表明它们可以被中断并恢复。在一个 async 块或 async 函数中,可以使用 await 关键字来等待一个 future 准备就绪,这一过程称为 等待一个 future 。async 块或 async 函数中每一个等待 future 的地方都可能是一个 async 块或 async 函数中断并随后恢复的点。检查一个 future 并查看其值是否已经准备就绪的过程被称为 轮询 (polling)。 其它一些语言也使用 async 和 await 关键字进行异步编程。如果你熟悉这些语言,则可能会注意到它们与 Rust 的处理方式有显著不同,包括语法上的差异。我们将看到,这样做是有充分理由的! 在大多数情况下,编写异步 Rust 代码时,我们使用 async 和 await 关键字。Rust 将其编译为等同于使用 Future trait 的代码,这非常类似于将 for 循环编译为等同于使用 Iterator trait 的代码。不过,由于 Rust 提供了 Future trait,你也可以在需要时为你自己的数据类型实现它。在整个章节中你会看到很多函数的返回值类型都有其自己的 Future 实现。我们会在本章结尾回到这个 trait 的定义,并深入了解它的工作原理,但现在这些细节已经足够让我们继续前进了。 这些内容可能有点抽象。让我们来编写第一个异步程序:一个小型网络爬虫。我们会从命令行传递两个 URL,并发地解析它们,并返回第一个完成解析的结果。这个示例会引入不少的新语法,不过不用担心。我们会逐步解释所有你需要了解的内容。","breadcrumbs":"Async 和 await » Futures 和 async 语法 » Futures 和 async 语法","id":"315","title":"Futures 和 async 语法"},"316":{"body":"为了保持本章的内容专注于学习 async,而不是处理生态系统的部分组件,我们已经创建了一个 trpl crate(trpl 是 “The Rust Programming Language” 的缩写)。它重导出了你需要的所有类型、traits 和函数,它们主要来自于 futures 和 tokio crates。 futures crate 是一个 Rust 异步代码实验的官方仓库,也正是 Future 最初设计的地方。 Tokio 是目前 Rust 中应用最广泛的异步运行时(async runtime),特别是(但不仅是!)web 应用。这里还有其他优秀的运行时,它们可能更适合你的需求。我们在 trpl 的底层使用 Tokio 是因为它经过了充分测试且广泛使用。 在一些场景中,trpl 也会重命名或者封装原始 API 以便我们专注于与本章相关的细节。如果你想了解该 crate 的具体功能,我们鼓励你查看 其源码 。你可以看到每个重导出的内容来自哪个 crate,我们留下了大量注释来解释这个 crate 的用途。 创建一个名为 hello-async 的二进制项目并将 trpl crate 作为一个依赖添加: $ cargo new hello-async\n$ cd hello-async\n$ cargo add trpl 现在我们可以利用 trpl 提供的多种组件来编写第一个异步程序。我们构建了一个小的命令行工具来抓取两个网页,拉取各自的 元素,并打印出第一个完成全部过程的标题。 让我们开始编写一个函数,它获取一个网页 URL 作为参数,请求该 URL 并返回标题元素的文本: 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # fn main() {\n# // TODO: we'll add this next!\n# }\n# use trpl::Html; async fn page_title(url: &str) -> Option<String> { let response = trpl::get(url).await; let response_text = response.text().await; Html::parse(&response_text) .select_first(\"title\") .map(|title_element| title_element.inner_html())\n} 示例 17-1:定义一个 async 函数来获取一个 HTML 页面的标题元素 在示例 17-1 中,我们定义了一个名为 page_title 的函数,并使用了 async 关键字标记。接着我们使用 trpl::get 函数来获取传入的任意 URL,然后使用 await 关键字来等待响应。接着我们调用其 text 方法来获取响应的文本,这里再一次使用 await 关键字等待。这两个步骤都是异步的。对于 get 来说,我们需要等待服务器发送回其响应的第一部分,这会包含 HTTP 头(headers)、cookies 等。这部分响应可以独立于响应体发送。特别是在响应体非常大时候,接收完整响应可能会花费一些时间。因此我们不得不等待响应 整体 返回,所以 text 方法也是异步。 我们必须显示地等待这两个 futures,因为 Rust 中的 futures 是 惰性 ( lazy )的:在你使用 await 请求之前它们不会执行任何操作。(事实上,如果你不使用一个 futures,Rust 会显示一个编译警告)这应该会让你想起 之前第十三章 关于迭代器的讨论。直到你调用迭代器的 next 方法(直接调用或者使用 for 循环或者类似 map 这类在底层使用 next 的方法)之前它们什么也不会做。对于 futures 来说,同样的基本理念也是适用的:除非你显式地请求,否则它们不会执行。惰性使得 Rust 可以避免提前运行异步代码,直到真正需要时才执行。 注意:这不同于上一章节中 thread::spawn 的行为,当时传递给另一个线程的闭包会立即开始运行。这也与许多其他语言处理异步的方式不同!但对于 Rust 而言,这一点非常重要。稍后我们会解释原因。 当我们有了 response_text 函数,就可以使用 Html::parse 将其解析为一个 Html 类型的实例。不同于原始字符串,现在我们有了一个可以将 HTML 作为更丰富数据结构来操作的数据类型。特别是我们可以使用 select_first 方法来找出给定 CSS 选择器(selector)中第一个匹配元素。通过传递字符串 \"title\",我们会得到文档中的第一个 <title> 元素,如果它存在的话。由于可能没有任何匹配的元素,select_first 返回一个 Option<ElementRef>。最后我们使用 Option::map 方法,它允许我们在 Option 中有元素时对其进行处理,而在没有时则什么也不做。(这里也可以使用一个 match 表达式,但 map 更符合惯用的写法。)在传递给 map 的函数体中,我们调用了 title_element 上的 inner_html 来获取其内容,这是一个 String。当上面所讲的都完成后,我们会得到一个 Option<String>。 注意 Rust 的 await 关键字出现在需要等待的表达式之后而不是之前。也就是说,这是一个 后缀关键字 ( postfix keyword )。如果你在其它语言中使用过 async 的话,这可能与你所熟悉的有所不同。Rust 如此选择是因为这使得方法的链式调用更加简洁。因此,我们可以修改 page_url_for 的函数体来链式调用 trpl::get 和 text 并在其之间使用 await,如示例 17-2 所示: 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use trpl::Html;\n# # fn main() {\n# // TODO: we'll add this next!\n# }\n# # async fn page_title(url: &str) -> Option<String> { let response_text = trpl::get(url).await.text().await;\n# Html::parse(&response_text)\n# .select_first(\"title\")\n# .map(|title_element| title_element.inner_html())\n# } 示例 17-2:使用 `await` 关键字的链式调用 这样我们就成功编写了第一个异步函数!在我们向 main 加入一些代码调用它之前,让我们再多了解下我们写了什么以及它的意义。 当 Rust 遇到一个 async 关键字标记的代码块时,会将其编译为一个实现了 Future trait 的唯一的、匿名的数据类型。当 Rust 遇到一个被标记为 async 的函数时,会将其编译进一个拥有异步代码块的非异步函数。异步函数的返回值类型是编译器为异步代码块所创建的匿名数据类型。 因此,编写 async fn 就等同于编写一个返回类型的 future 的函数。当编译器遇到类似示例 17-1 中 async fn page_title 的函数定义时,它等价于以下定义的非异步函数: # extern crate trpl; // required for mdbook test\nuse std::future::Future;\nuse trpl::Html; fn page_title(url: &str) -> impl Future<Output = Option<String>> + '_ { async move { let text = trpl::get(url).await.text().await; Html::parse(&text) .select_first(\"title\") .map(|title| title.inner_html()) }\n} 让我们挨个看一下转换后版本的每一个部分: 它使用了之前第十章 “trait 作为参数” 部分讨论过的 impl Trait 语法 它返回的 trait 是一个 Future,它有一个关联类型 Output。注意 Output 的类型是 Option<String>,这与 async fn 版本的 page_title 的原始返回值类型相同。 所有原始函数中被调用的代码被封装进一个 async move 块。回忆一下,代码块是表达式。这整个块就是函数所返回的表达式 如上所述,这个异步代码块产生一个 Option<String> 类型的值。这个值与返回类型中的 Output 类型一致。这正类似于你已经见过的其它代码块。 新版函数的函数体是一个 async move 代码块,因为它如何使用 url 参数决定了这一点。(本章后续部分将更详细地讨论 async 和 async move 之间的区别。) 新版本的函数在返回类型中使用了一种我们之前未见过的生命周期标记:'_。因为函数返回的 Future 指向一个引用(在这个例子中是指向 url 参数的引用)我们需要告诉 Rust 引用的生命周期。这里无需命名该生命周期,因为 Rust 足够智能到能理解这里只涉及到唯一一个引用,不过我们 必须 明确指出返回的 Future 受该生命周期的约束。 现在我们可以在 main 中调用 page_title。首先,我们只会获取一个页面的标题。在示例 17-3 中,我们沿用了第十二章中获取命令行参数的相同模式。接着我们传递第一个 URL 给 page_title,并等待结果。因为 future 产生的值是一个 Option<String>,我们使用 match 表达式来根据页面是否有 <title> 来打印不同的信息。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use trpl::Html;\n# async fn main() { let args: Vec<String> = std::env::args().collect(); let url = &args[1]; match page_title(url).await { Some(title) => println!(\"The title for {url} was {title}\"), None => println!(\"{url} had no title\"), }\n}\n# # async fn page_title(url: &str) -> Option<String> {\n# let response_text = trpl::get(url).await.text().await;\n# Html::parse(&response_text)\n# .select_first(\"title\")\n# .map(|title_element| title_element.inner_html())\n# } 示例 17-3:在 `main` 中通过一个用户提供的参数调用 `page_title` 函数 很不幸的是这还不能编译。唯一可以使用 await 关键字的地方是异步函数或者代码块中,同时 Rust 不允许将特殊的 main 函数标记为 async。 error[E0752]: `main` function is not allowed to be `async` --> src/main.rs:6:1 |\n6 | async fn main() { | ^^^^^^^^^^^^^^^ `main` function is not allowed to be `async` main 不能标记为 async 的原因是异步代码需要一个 运行时 :即一个管理执行异步代码细节的 Rust crate。一个程序的 main 函数可以 初始化 一个运行时,但是其 自身 并不是一个运行时。(稍后我们会进一步解释原因。)每一个执行异步代码的 Rust 程序必须至少有一个设置运行时并执行 futures 的地方。 大部分支持异步的语言会打包一个运行时在语言中。Rust 则不是,相这里有很多不同的异步运行时,每一个都有适合其目标的权衡取舍。例如,一个拥有很多核心和大量内存的高吞吐 web server 与一个单核、少量内存并且没有堆分配能力的微控制器相比有着截然不同的需求。提供这些运行时的 crate 通常也提供了例如文件或者网络 IO 这类常用功能的异步版本。 从这里到本章余下部分,我们会使用 trpl crate 的 run 函数,它获取一个 future 作为参数并运行到结束。在内部,调用 run 会设置一个运行时来运行传递的 future。一旦 future 完成,run 返回 future 返回的任何值。 我们可以将 page_title 返回的 future 直接传递给 run。一旦其完成,我们能够匹配返回的 Option<String>,正如示例 17-3 我们尝试的那样。然而,在本章的大部分示例中(以及大多数实际应用中的异步代码中!),我们会执行不止一次异步函数调用,所以相反我们会传递一个 async 块并显式地等待 page_title 调用的结果,如示例 17-4 所示。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use trpl::Html;\n# fn main() { let args: Vec<String> = std::env::args().collect(); trpl::run(async { let url = &args[1]; match page_title(url).await { Some(title) => println!(\"The title for {url} was {title}\"), None => println!(\"{url} had no title\"), } })\n}\n# # async fn page_title(url: &str) -> Option<String> {\n# let response_text = trpl::get(url).await.text().await;\n# Html::parse(&response_text)\n# .select_first(\"title\")\n# .map(|title_element| title_element.inner_html())\n# } 示例 17-4:等待一个使用异步代码块的 `trpl::run` 当我们运行代码,我们会得到最初预想的行为: $ cargo run \"http://www.rust-lang.org\"\nThe title for http://www.rust-lang.org was Rust Programming Language 我们终于有了一些可以正常工作的异步代码!现在它们可以成功编译并运行。在我们添加代码让两个网址进行竞争之前,让我们简要地回顾一下 future 是如何工作的。 每一个 await point ,也就是代码使用 await 关键字的地方,代表将控制权交还给运行时的地方。为此 Rust 需要记录异步代码块中涉及的状态,这样运行时可以去执行其他工作,并在准备好时回来继续推进当前的任务。这就像你通过编写一个枚举来保存每一个 await point 的状态一样: # extern crate trpl; // required for mdbook test\n# enum PageTitleFuture<'a> { Initial { url: &'a str }, GetAwaitPoint { url: &'a str }, TextAwaitPoint { response: trpl::Response },\n} 编写代码来手动控制不同状态之间的转换是非常乏味且容易出错的,特别是之后增加了更多功能和状态的时候。相反,Rust 编译器自动创建并管理异步代码的状态机数据结构。如果你感兴趣的话:是的,正常的借用和所有权也全部适用于这些数据结构。幸运的是,编译器也会为我们处理这些检查,并提供友好的错误信息。本章稍后会讲解一些相关内容! 最终需要某个组件来执行状态机。这就是运行时。(这也是为什么在了解运行时的时候,你可能会看到 executors 这个词:executor 是运行时中负责执行异步代码的部分。) 现在我们能够理解了之前示例 17-3 中为何编译器阻止我们将 main 本身标记为异步函数了。如果 main 是一个异步函数,需要有其它组件来管理 main futrue 返回的状态机,但是 main 是程序的入口点!为此我们在 main 函数中调用 trpl::run,它设置了一个运行时并运行 async 块返回的 future 并等待它返回 Ready。 注意:一些运行时提供了相关的宏所以你 可以 编写一个异步 main 函数。这些宏将 async fn main() { ... } 重写为正常的 fn main,执行的逻辑与我们在示例 17-5 中手动实现的一样:像 trpl::run 一样调用一个函数运行 future 直到结束。 让我们将这些代码片段整理一下来看看如何编写并发代码,这里通过两个来自命令行的不同 URL 来调用 page_title 并使其相互竞争。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# use trpl::{Either, Html}; fn main() { let args: Vec<String> = std::env::args().collect(); trpl::run(async { let title_fut_1 = page_title(&args[1]); let title_fut_2 = page_title(&args[2]); let (url, maybe_title) = match trpl::race(title_fut_1, title_fut_2).await { Either::Left(left) => left, Either::Right(right) => right, }; println!(\"{url} returned first\"); match maybe_title { Some(title) => println!(\"Its page title is: '{title}'\"), None => println!(\"Its title could not be parsed.\"), } })\n} async fn page_title(url: &str) -> (&str, Option<String>) { let text = trpl::get(url).await.text().await; let title = Html::parse(&text) .select_first(\"title\") .map(|title| title.inner_html()); (url, title)\n} 示例 17-5 示例 17-5 中以分别由用户提供的 URL 调用 page_title 开始。我们将调用 page_title 产生的 future 分别保存为 title_fut_1 和 title_fut_2。请记住,它们还没有进行任何工作,因为 future 是惰性的,并且我们还没有 await 它们。接着我们将 futures 传递给 trpl::race,它返回一个值表明哪个传递的 future 最先返回。 注意:在内部 race 构建在一个更通用的函数 select 之上,你会在真实的 Rust 代码中更常遇到它。select 函数可以做很多 trpl::race 函数做不了的事,不过它也有一些额外的复杂性,所以目前我们先略过介绍。 由于任何一个 future 都可以合理地 “获胜”,所以返回 Result 没有意义。相反 race 返回了一个我们之前没有见过的类型 trpl::Either。Either 类型有点类似于 Result,它也有两个成员。但是不同于 Either,Either 没有内置成功或者失败的概念。相反它使用 Left 和 Right 来表示 “一个或另一个”。 enum Either<A, B> { Left(A), Right(B),\n} race 函数返回 Left,如果第一个参数先完成,并包含该 future 的输出,如果 第二个 future 先完成,则返回 Right 和第二个 future 的输出。这匹配调用函数时参数出现的顺序:第一个参数在第二个参数的左边。 我们还更新了 page_title 来返回与传递时相同的 URL。如此如果首先返回的页面没有可以解析的 <title>,仍然可以打印出有意义的信息。有了这些信息,我们对 println! 的输出进行了封装和更新,以表明哪个 URL 最先完成,并在页面有 <title> 时打印出它的内容。 现在我们完成一个小型网页爬虫的构建了!挑选一对 URL 并运行命令行工具。你会发现某些网站稳定地快于其它网站,而有些情况哪些网站会 赢 则每次都不同。更重要的是,你已经掌握了处理 futures 的基础知识,因此我们现在可以进一步探索更多异步操作的可能性了。","breadcrumbs":"Async 和 await » Futures 和 async 语法 » 第一个异步程序","id":"316","title":"第一个异步程序"},"317":{"body":"ch17-02-concurrency-with-async.md commit 62d441060d66f9a1c3d3cdfffa8eed40f817d1aa 在这一部分,我们将使用异步来应对一些与第十六章中通过线程解决的相同的并发问题。因为之前我们已经讨论了很多关键理念了,这一部分我们会专注于线程与 future 的区别。 在很多情况下,使用异步处理并发的 API 与使用线程的非常相似。在其它的一些情况,它们则非常不同。即便线程与异步的的 API 看起来 很类似,通常它们有着不同的行为,同时它们几乎总是有着不同的性能特点。","breadcrumbs":"Async 和 await » 并发与 async » 并发与 async","id":"317","title":"并发与 async"},"318":{"body":"第十六章中我们应付的第一个任务是在两个不同的线程中计数。让我们用异步来完成相同的任务。trpl crate 提供了一个 spawn_task 函数,它看起来非常像 thread::spawn API,和一个 sleep 函数,这是 thread::sleep API 的异步版本。我们可以将它们结合使用,实现与线程示例相同的计数功能,如示例 17-6 所示。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# use std::time::Duration; fn main() { trpl::run(async { trpl::spawn_task(async { for i in 1..10 { println!(\"hi number {i} from the first task!\"); trpl::sleep(Duration::from_millis(500)).await; } }); for i in 1..5 { println!(\"hi number {i} from the second task!\"); trpl::sleep(Duration::from_millis(500)).await; } });\n} 示例 17-6:使用 `spawn_task` 启动两个计数任务 作为开始,我们在 main 函数中使用 trpl::run,这样我们的顶层函数可以是异步的。 注意:本章从现在开始,每一个示例的 main 中都会包含几乎相同的 trpl::run 封装代码,所以我们经常会连同 main 一同省略。别忘了在你的代码中加入它们! 接着我们在代码块中编写了两个循环,每个其中都有一个 trpl::sleep 调用,每一个都在发送下一个信息之前等待半秒(500 毫秒)。我们将一个循环放到 trpl::spawn_task 中并将另一个放在顶层的 for 循环中。我们也在 sleep 调用之后加入了一个 await。 这个实现与基于线程的版本类似,包括在运行时,你可能会在终端中看到消息以不同顺序出现的情况。 hi number 1 from the second task!\nhi number 1 from the first task!\nhi number 2 from the first task!\nhi number 2 from the second task!\nhi number 3 from the first task!\nhi number 3 from the second task!\nhi number 4 from the first task!\nhi number 4 from the second task!\nhi number 5 from the first task! 这个版本在 main 中的异步代码块中 for 循环结束后就停止了,因为当 main 函数结束时 spawn_task 产生的任务就会关闭。如果运行该任务直到结束,你需要使用一个 join 句柄(join handle)来等待第一个任务完成。对于线程来说,可以使用 join 方法来 “阻塞” 直到线程结束运行。在示例 17-7 中,我们可以使用 await 来实现相同的效果,因为任务句柄本身是一个 future。它的 Output 类型是一个 Result,所以我们还需要 unwrap 来 await 它。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let handle = trpl::spawn_task(async { for i in 1..10 { println!(\"hi number {i} from the first task!\"); trpl::sleep(Duration::from_millis(500)).await; } }); for i in 1..5 { println!(\"hi number {i} from the second task!\"); trpl::sleep(Duration::from_millis(500)).await; } handle.await.unwrap();\n# });\n# } 示例 17-7:在一个 join 句柄上使用 `await` 使得任务运行直到结束 更新后的版本会运行 两个 循环直到结束。 hi number 1 from the second task!\nhi number 1 from the first task!\nhi number 2 from the first task!\nhi number 2 from the second task!\nhi number 3 from the first task!\nhi number 3 from the second task!\nhi number 4 from the first task!\nhi number 4 from the second task!\nhi number 5 from the first task!\nhi number 6 from the first task!\nhi number 7 from the first task!\nhi number 8 from the first task!\nhi number 9 from the first task! 目前为止,看起来异步和线程版本给出了基本一样的输出,它们只是使用了不同的语法:在 join 句柄上使用 await 而不是调用 join,和 await sleep 调用。 最大的区别在于无需再产生另一个操作系统线程来进行工作。事实上,我们甚至不需要产生一个任务。因为异步代码块会编译为匿名 future,我们可以将每一个循环放进一个异步代码块并使用 trpl::join 方法来让运行时将它们两个都运行至完成。 在第十六章中,我们展示了如何在 std::thread::spawn 调用返回的 JoinHandle 类型上调用 join 方法。trpl::join 函数也类似,不过它作用于 future。当你传递两个 future,它会产生单独一个 future 但它的输出是一个元组,当 两者 都完成时其中有每一个传递给它的 future 的输出。因此,在示例 17-8 中,我们使用 trpl::join 来等待 fut1 和 fut2 都结束。我们 没有 await fut1 和 fut2,而是等待 trpl::join 新产生的 future。我们忽略其输出,因为它只是一个包含两个单元值(unit value)的元组。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let fut1 = async { for i in 1..10 { println!(\"hi number {i} from the first task!\"); trpl::sleep(Duration::from_millis(500)).await; } }; let fut2 = async { for i in 1..5 { println!(\"hi number {i} from the second task!\"); trpl::sleep(Duration::from_millis(500)).await; } }; trpl::join(fut1, fut2).await;\n# });\n# } 示例 17-8:使用 `trpl::join` 来 await 两个匿名 future 当运行代码我们会看到两个 future 会运行至结束: hi number 1 from the first task!\nhi number 1 from the second task!\nhi number 2 from the first task!\nhi number 2 from the second task!\nhi number 3 from the first task!\nhi number 3 from the second task!\nhi number 4 from the first task!\nhi number 4 from the second task!\nhi number 5 from the first task!\nhi number 6 from the first task!\nhi number 7 from the first task!\nhi number 8 from the first task!\nhi number 9 from the first task! 这里,你每次都会看到完全相同的顺序,这与我们在线程中看到的情况非常不同。这是因为 trpl::join 函数是 公平的 ( fair ),这意味着它以相同的频率检查每一个 future,使它们交替执行,绝不会让一个任务在另一个任务准备好时抢先执行。对于线程来说,操作系统会决定该检查哪个线程和会让它运行多长时间。对于异步 Rust 来说,运行时决定检查哪一个任务。(在实践中,细节会更为复杂,因为异步运行时可能在底层使用操作系统线程来作为其并发管理的一部分,因此要保证公平性可能会增加运行时的工作量,但这仍然是可行的!)运行时无需为任何操作保证公平性,同时运行时也经常提供不同的 API 来让你选择是否需要公平性。 尝试这些不同的 await future 的变体来观察它们的效果: 去掉一个或者两个循环外的异步代码块。 在定义两个异步代码块后立刻 await 它们。 直将第一个循环封装进异步代码块,并在第二个循环体之后 await 作为结果的 future。 作为额外的挑战,看看你能否在运行代码 之前 想出每个情况下的输出!","breadcrumbs":"Async 和 await » 并发与 async » 计数","id":"318","title":"计数"},"319":{"body":"在 future 之间共享数据也与线程类似:我们会再次使用消息传递,不过这次使用的是异步版本的类型和函数。我们会采用与之前第十六章中使用的稍微不同的方法,来展示一些基于线程的并发与基于 future 的并发之间的关键差异。在示例 17-9 中,我们会从仅有一个异步代码块开始, 不像 之前产生独立线程那样产生一个独立的任务。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # fn main() {\n# trpl::run(async { let (tx, mut rx) = trpl::channel(); let val = String::from(\"hi\"); tx.send(val).unwrap(); let received = rx.recv().await.unwrap(); println!(\"Got: {received}\");\n# });\n# } 示例 17-9:创建一个异步信道(async channel)并赋值其两端为 `tx` 和 `rx` 这里我们使用了 trpl::channel,一个第十六章用于线程的多生产者、单消费者信道 API 的异步版本。异步版本的 API 与基于线程的版本只有一点微小的区别:它使用一个可变的而不是不可变的 rx,并且它的 recv 方法产生一个需要 await 的 future 而不是直接返回值。现在我们可以发送端向接收端发送消息了。注意我们无需产生一个独立的线程或者任务;只需等待(await) rx.recv 调用。 std::mpsc::channel 中的同步 Receiver::recv 方法阻塞执行直到它接收一个消息。trpl::Receiver::recv 则不会阻塞,因为它是异步的。不同于阻塞,它将控制权交还给运行时,直到接收到一个消息或者信道的发送端关闭。相比之下,我们不用 await send,因为它不会阻塞。也无需阻塞,因为信道的发送端的数量是没有限制的。 注意:因为所有这些异步代码都运行在一个 trpl::run 调用的异步代码块中,其中的所有代码可以避免阻塞。然而, 外面 的代码会阻塞到 run 函数返回。这正是 trpl::run 函数的全部意义:它允许你 选择 在何处阻塞一部分异步代码,也就是在何处进行同步和异步代码的转换。这正是在大部分运行时中 run 实际上被命名为 block_on 的原因。 请注意这个示例中的两个地方:首先,消息立刻就会到达!其次,虽然我们使用了 future,但是这里还没有并发。示例中的所有事情都是顺序发生的,就像没涉及到 future 时一样。 让我们通过发送一系列消息并在之间休眠来解决第一个问题,如示例 17-10 所示: 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let (tx, mut rx) = trpl::channel(); let vals = vec![ String::from(\"hi\"), String::from(\"from\"), String::from(\"the\"), String::from(\"future\"), ]; for val in vals { tx.send(val).unwrap(); trpl::sleep(Duration::from_millis(500)).await; } while let Some(value) = rx.recv().await { println!(\"received '{value}'\"); }\n# });\n# } 示例 17-10:通过异步信道发送和接收多个消息并在每个消息之间通过 `await` 休眠 除了发送消息之外,我们还需要接收它们。在这个例子中我们可以手动接收,就是调用四次 rx.recv().await,因为我们知道进来了多少条消息。然而,在现实世界中,我们通常会等待 未知 数量的消息。这时我们需要一直等待直到可以确认没有更多消息了为止。 在示例 16-10 中,我们使用了 for 循坏来处理从异步信道接收的所有消息。然而,Rust 目前还没有在 异步 序列上编写 for 循环的方法。取而代之的是,我们需要一个我们还没有见过的新循环类型,即 while let 条件循环。while let 循环是我们在第六章中见过的 if let 结构的循环版本。只要其指定的模式持续匹配循环就会一直执行。 rx.recv 调用产生一个 Future,我们会 await 它。运行时会暂停 Future 直到它就绪。一旦消息到达,future 会解析为 Some(message),每次消息到达时都会如此。。当信道关闭时,不管是否有 任何 消息到达,future 都会解析为 None 来表明没有更多的值了,我们也就应该停止轮询,也就是停止等待。 while let 循环将上述逻辑整合在一起。如果 rx.recv().await 调用的结果是 Some(message),我们会得到消息并可以在循环体中使用它,就像使用 if let 一样。如果结果是 None,则循环停止。每次循环执行完毕,它会再次触发 await point,如此运行时会再次暂停直到另一条消息到达。 现在代码可以成功发送和接收所有的消息了。不幸的是,这里还有一些问题。首先,消息并不是按照半秒的间隔到达的。它们在程序启动后两秒(2000 毫秒)后立刻一起到达。其次,程序永远也不会退出!相反它会永远等待新消息。你会需要使用 ctrl-c 来关闭它。 让我们开始理解为何消息在全部延迟后立刻一起到达,而不是逐个在延迟后到达。在一个给定的异步代码块,await 关键字在代码中出现的顺序也就是程序执行时其发生的顺序。 示例 17-10 中只有一个异步代码块,所以所有的代码线性地执行。这里仍然没有并发。所有 tx.send 调用与 trpl::sleep 调用及其相关的 await point 是依次进行的。只有在此之后 while let 循环才开始执行 recv 调用上的 await point。 为了得到我们需要的行为,在接收每条消息之间引入休眠延迟,我们需要将 tx 和 rx 操作放置于它们各自的异步代码块中。这样运行时就可以使用 trpl::join 来分别执行它们,就像在计数示例中一样。我们再一次 await trpl::join 调用的结果,而不是它们各自的 future。如果我们顺序地 await 单个 future,则就又回到了一个顺序流,这正是我们 不 希望做的。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# let tx_fut = async { let vals = vec![ String::from(\"hi\"), String::from(\"from\"), String::from(\"the\"), String::from(\"future\"), ]; for val in vals { tx.send(val).unwrap(); trpl::sleep(Duration::from_millis(500)).await; } }; let rx_fut = async { while let Some(value) = rx.recv().await { println!(\"received '{value}'\"); } }; trpl::join(tx_fut, rx_fut).await;\n# });\n# } 示例 17-11:将 `send` 和 `recv` 分隔到其各自的 `async` 代码块中并 await 这些代码块的 future 采用示例 17-11 中的更新后的代码,消息会以 500 毫秒的间隔打印,而不是在两秒后就全部一起打印。 但是程序仍然永远也不会退出,这是由于 while let 循环与 trpl::join 的交互方式所致: trpl::join 返回的 future 只会完成一次,即传递的 两个 future 都完成的时候。 tx future 在发送 vals 中最后一条消息之后的休眠结束后立刻完成。 rx future 直到 while let 循环结束之前都不会完成。 当信道的另一端关闭后 await rx.recv 将只会返回 None。 信道只有在调用 rx.close 或者发送端 tx 被丢弃时才会关闭。 我们没有在任何地方调用 rx.close,并且 tx 直到传递给 trpl::run 的最外层异步代码块结束前都不会被丢弃。 代码块不能结束是因为它阻塞在了等待 trpl::join 完成,这就又回到了列表的开头! 我们可以在代码的某处调用 rx.close 来手动关闭 rx,不过这并没有太多意义。在处理了任意数量的消息后停止可以使程序停止,但是可能会丢失消息。我们需要其它的手段来确保 tx 在函数的结尾 之前 被丢弃。 目前发送消息的异步代码块只是借用了 tx,因为发送消息并不需要其所有权,但是如果我们可以将 tx 移动(move)进异步代码快,它会在代码块结束后立刻被丢弃。在第十三章中我们学习了如何在闭包上使用 move 关键字,在第十六章中,我们知道了使用线程时经常需要移动数据进闭包。同样的基本原理也适用于异步代码块,因此 move 关键字也能像闭包那样作用于异步代码块。 在示例 17-12 中,我们将发送消息的异步代码块从普通的 async 代码块修改为 async move 代码块。当运行 这个 版本的代码时,它会在发送和接收完最后一条消息后优雅地关闭。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let (tx, mut rx) = trpl::channel(); let tx_fut = async move { let vals = vec![ String::from(\"hi\"), String::from(\"from\"), String::from(\"the\"), String::from(\"future\"), ]; for val in vals { tx.send(val).unwrap(); trpl::sleep(Duration::from_millis(500)).await; } }; let rx_fut = async { while let Some(value) = rx.recv().await { eprintln!(\"received '{value}'\"); } }; trpl::join(tx_fut, rx_fut).await;\n# });\n# } 示例 17-12:一个可以工作的在 future 之间接收和发送消息的示例,其在结束后会正确地关闭 这个异步信道也是一个多生产者信道,所以如果希望从多个 future 发送消息可以调用 tx 上的 clone 方法。在示例 17-13 中,我们克隆了 tx,在第一个异步代码块外面创建 tx1。我们像第一个 tx 一样将 tx1 移动进代码块。接下来,将原始的 tx 移动进一个 新的 异步代码块,其中会用一个稍微更长的延迟发送更多的消息。我们碰巧将新代码块放在接收消息的异步代码块之后,不过也可以放在之前。关键在于 future 被 await 的顺序,而不是它们创建的顺序。 两个发送消息的异步代码块需要是 async move 代码块,如此 tx 和 tx1 都会在代码块结束后被丢弃。否则我们就会陷入到开始时同样的无限循环。最后,我们从 trpl::join 切换到 trpl::join3 来处理额外的 future。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let (tx, mut rx) = trpl::channel(); let tx1 = tx.clone(); let tx1_fut = async move { let vals = vec![ String::from(\"hi\"), String::from(\"from\"), String::from(\"the\"), String::from(\"future\"), ]; for val in vals { tx1.send(val).unwrap(); trpl::sleep(Duration::from_millis(500)).await; } }; let rx_fut = async { while let Some(value) = rx.recv().await { println!(\"received '{value}'\"); } }; let tx_fut = async move { let vals = vec![ String::from(\"more\"), String::from(\"messages\"), String::from(\"for\"), String::from(\"you\"), ]; for val in vals { tx.send(val).unwrap(); trpl::sleep(Duration::from_millis(1500)).await; } }; trpl::join3(tx1_fut, tx_fut, rx_fut).await;\n# });\n# } 示例 17-13:通过多个异步代码块使用多个发送者 现在我们会看到所有来在两个发送 future 的消息。因为发送 future 采用了稍微不同的发送延迟,消息也会以这些不同的延迟接收。 received 'hi'\nreceived 'more'\nreceived 'from'\nreceived 'the'\nreceived 'messages'\nreceived 'future'\nreceived 'for'\nreceived 'you' 这是一个良好的开始,不过它将我们限制到少数几个 future:join 两个,或者 join3 三个。让我们看下如何处理更多的 future。","breadcrumbs":"Async 和 await » 并发与 async » 消息传递","id":"319","title":"消息传递"},"32":{"body":"要创建一个新项目,进入第一章中创建的 projects 目录,使用 Cargo 新建一个项目,如下: $ cargo new guessing_game\n$ cd guessing_game 第一个命令,cargo new,它获取项目的名称(guessing_game)作为第一个参数。第二个命令进入到新创建的项目目录。 看看生成的 Cargo.toml 文件: 文件名:Cargo.toml [package]\nname = \"guessing_game\"\nversion = \"0.1.0\"\nedition = \"2021\" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] 正如第一章那样,cargo new 生成了一个 “Hello, world!” 程序。查看 src/main.rs 文件: 文件名:src/main.rs fn main() { println!(\"Hello, world!\");\n} 现在使用 cargo run 命令,一步完成 “Hello, world!” 程序的编译和运行: $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.50s Running `target/debug/guessing_game`\nHello, world! 当你需要在项目中快速迭代时,run 命令就能派上用场,正如我们在这个游戏项目中做的,在下一次迭代之前快速测试每一次迭代。 重新打开 src/main.rs 文件。我们将会在这个文件中编写全部的代码。","breadcrumbs":"写个猜数字游戏 » 准备一个新项目","id":"32","title":"准备一个新项目"},"320":{"body":"ch17-03-more-futures.md commit 9e85fcc9938e8f8c935d0ad8b4db7f45caaa2ca4 当我们在上一部分从使用两个 future 到三个 future 的时候,我们也必须从使用 join 切换到 join3。每次我们想要改变 join 的 future 数量时都不得不调用一个不同的函数是很烦人的。令人高兴的是,我们有一个宏版本的 join 可以传递任意数量的参数。它还会自行处理 await 这些 future。因此,我们可以重写示例 17-13 中的代码来使用 join! 而不是 join3,如示例 17-14 所示: 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# # let tx1 = tx.clone();\n# let tx1_fut = async move {\n# let vals = vec![\n# String::from(\"hi\"),\n# String::from(\"from\"),\n# String::from(\"the\"),\n# String::from(\"future\"),\n# ];\n# # for val in vals {\n# tx1.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# # let rx_fut = async {\n# while let Some(value) = rx.recv().await {\n# println!(\"received '{value}'\");\n# }\n# };\n# # let tx_fut = async move {\n# let vals = vec![\n# String::from(\"more\"),\n# String::from(\"messages\"),\n# String::from(\"for\"),\n# String::from(\"you\"),\n# ];\n# # for val in vals {\n# tx.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# trpl::join!(tx1_fut, tx_fut, rx_fut);\n# });\n# } 示例 17-14:使用 `join!` 来等待多个 future 相比于需要在 join 和 join3 和 join4 等等之间切换来说这绝对是一个进步!然而,即便是这个宏形式也只能用于我们提前知道 future 的数量的情况。不过,在现实世界的 Rust 中,将 futures 放进一个集合并接着等待集合中的一些或者全部 future 完成是一个常见的模式。 为了检查一些集合中的所有 future,我们需要遍历并 join 全部 的 future。trpl::join_all 函数接受任何实现了 Iterator trait 的类型,我们在之前的第十三章中学习过它们,所以这正是我们需要的。让我们将 futures 放进一个向量,并将 join! 替换为 join_all。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# # let tx1 = tx.clone();\n# let tx1_fut = async move {\n# let vals = vec![\n# String::from(\"hi\"),\n# String::from(\"from\"),\n# String::from(\"the\"),\n# String::from(\"future\"),\n# ];\n# # for val in vals {\n# tx1.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# # let rx_fut = async {\n# while let Some(value) = rx.recv().await {\n# println!(\"received '{value}'\");\n# }\n# };\n# # let tx_fut = async move {\n# let vals = vec![\n# String::from(\"more\"),\n# String::from(\"messages\"),\n# String::from(\"for\"),\n# String::from(\"you\"),\n# ];\n# # for val in vals {\n# tx.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# let futures = vec![tx1_fut, rx_fut, tx_fut]; trpl::join_all(futures).await;\n# });\n# } 示例 17-15:将匿名 futures 储存在一个向量中并调用 `join_all` 不幸的是这还不能编译。相反我们会得到这个错误: error[E0308]: mismatched types --> src/main.rs:43:37 |\n8 | let tx1_fut = async move { | _______________________-\n9 | | let vals = vec![\n10 | | String::from(\"hi\"),\n11 | | String::from(\"from\"),\n... |\n19 | | }\n20 | | }; | |_________- the expected `async` block\n21 |\n22 | let rx_fut = async { | ______________________-\n23 | | while let Some(value) = rx.recv().await {\n24 | | println!(\"received '{value}'\");\n25 | | }\n26 | | }; | |_________- the found `async` block\n...\n43 | let futures = vec![tx1_fut, rx_fut, tx_fut]; | ^^^^^^ expected `async` block, found a different `async` block | = note: expected `async` block `{async block@src/main.rs:8:23: 20:10}` found `async` block `{async block@src/main.rs:22:22: 26:10}` = note: no two async blocks, even if identical, have the same type = help: consider pinning your async block and and casting it to a trait object 这可能有点令人惊讶。毕竟没有一个 future 返回了任何值,所以每个代码块都会产生一个 Future<Output = ()>。然而,Future 是一个 trait,而不是一个具体类型。其具体类型是编译器为各个异步代码块生成的(不同的)数据结构。你不能将两个不同的手写的 struct 放进同一个 Vec,同样的原理也适用于编译器生成的不同 struct。 为了使代码能够正常工作,我们需要使用 trait objects ,正如我们在第十二章的 “从 run 函数中返回错误” 中做的那样。(第十八章会详细介绍 trait objects。)使用 trait objects 允许我们将这些类型所产生的不同的匿名 future 视为相同的类型,因为它们都实现了 Future trait。 注意:在第八章中,我们讨论过另一种将多种类型包含进一个 Vec 的方式:使用一个枚举来代表每个可以出现在向量中的不同类型。不过这里我们不能这么做。一方面,没有方法来命名这些不同的类型,因为它们是匿名的。另一方面,我们最开始采用向量和 join_all 的原因是为了处理一个直到运行时之前都不知道是什么的 future 的动态集合。 我们以将 vec! 中的每个 future 用 Box::new 封装来作为开始,如示例 17-16 所示。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# # let tx1 = tx.clone();\n# let tx1_fut = async move {\n# let vals = vec![\n# String::from(\"hi\"),\n# String::from(\"from\"),\n# String::from(\"the\"),\n# String::from(\"future\"),\n# ];\n# # for val in vals {\n# tx1.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# # let rx_fut = async {\n# while let Some(value) = rx.recv().await {\n# println!(\"received '{value}'\");\n# }\n# };\n# # let tx_fut = async move {\n# let vals = vec![\n# String::from(\"more\"),\n# String::from(\"messages\"),\n# String::from(\"for\"),\n# String::from(\"you\"),\n# ];\n# # for val in vals {\n# tx.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# let futures = vec![Box::new(tx1_fut), Box::new(rx_fut), Box::new(tx_fut)]; trpl::join_all(futures).await;\n# });\n# } 示例 17-16:尝试用 `Box::new` 来对齐 `Vec` 中 future 的类型 不幸的是,代码仍然不能编译。事实上,我们遇到了与之前相同的基本错误,不过这次我们会在第二个和第三个 Box::new 调用处各得到一个错误,同时还会得到一个提及 Unpin trait 的新错误。我们一会再回到 Unpin 错误上。首先,让我们通过显式标注 futures 的类型来修复 Box::new 调用的类型错误: 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{future::Future, time::Duration};\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# # let tx1 = tx.clone();\n# let tx1_fut = async move {\n# let vals = vec![\n# String::from(\"hi\"),\n# String::from(\"from\"),\n# String::from(\"the\"),\n# String::from(\"future\"),\n# ];\n# # for val in vals {\n# tx1.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# # let rx_fut = async {\n# while let Some(value) = rx.recv().await {\n# println!(\"received '{value}'\");\n# }\n# };\n# # let tx_fut = async move {\n# let vals = vec![\n# String::from(\"more\"),\n# String::from(\"messages\"),\n# String::from(\"for\"),\n# String::from(\"you\"),\n# ];\n# # for val in vals {\n# tx.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# };\n# let futures: Vec<Box<dyn Future<Output = ()>>> = vec![Box::new(tx1_fut), Box::new(rx_fut), Box::new(tx_fut)];\n# # trpl::join_all(futures).await;\n# });\n# } 示例 17-17:通过使用一个显式类型声明来修复余下的类型不匹配错误 这里必须编写的类型有一点复杂,让我们逐步过一遍: 最内层的类型是 future 本身。我们显式地指出 future 的输出类型是单元类型 (),其编写为 Future<Output = ()>。 接着使用 dyn 将 trait 标记为动态的。 整个 trait 引用被封装进一个 Box。 最后,我们显式表明 futures 是一个包含这些项的 Vec。 这已经有了很大的区别。现在当我们运行编译器时,就只会有提到 Unpin 的错误了。虽然这里有三个错误,但请注意它们每个的内容都非常相似。 error[E0277]: `{async block@src/main.rs:8:23: 20:10}` cannot be unpinned --> src/main.rs:46:24 |\n46 | trpl::join_all(futures).await; | -------------- ^^^^^^^ the trait `Unpin` is not implemented for `{async block@src/main.rs:8:23: 20:10}`, which is required by `Box<{async block@src/main.rs:8:23: 20:10}>: std::future::Future` | | | required by a bound introduced by this call | = note: consider using the `pin!` macro consider using `Box::pin` if you need to access the pinned value outside of the current scope = note: required for `Box<{async block@src/main.rs:8:23: 20:10}>` to implement `std::future::Future`\nnote: required by a bound in `join_all` --> /Users/chris/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.30/src/future/join_all.rs:105:14 |\n102 | pub fn join_all<I>(iter: I) -> JoinAll<I::Item> | -------- required by a bound in this function\n...\n105 | I::Item: Future, | ^^^^^^ required by this bound in `join_all` error[E0277]: `{async block@src/main.rs:8:23: 20:10}` cannot be unpinned --> src/main.rs:46:9 |\n46 | trpl::join_all(futures).await; | ^^^^^^^^^^^^^^^^^^^^^^^ the trait `Unpin` is not implemented for `{async block@src/main.rs:8:23: 20:10}`, which is required by `Box<{async block@src/main.rs:8:23: 20:10}>: std::future::Future` | = note: consider using the `pin!` macro consider using `Box::pin` if you need to access the pinned value outside of the current scope = note: required for `Box<{async block@src/main.rs:8:23: 20:10}>` to implement `std::future::Future`\nnote: required by a bound in `JoinAll` --> /Users/chris/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.30/src/future/join_all.rs:29:8 |\n27 | pub struct JoinAll<F> | ------- required by a bound in this struct\n28 | where\n29 | F: Future, | ^^^^^^ required by this bound in `JoinAll` error[E0277]: `{async block@src/main.rs:8:23: 20:10}` cannot be unpinned --> src/main.rs:46:33 |\n46 | trpl::join_all(futures).await; | ^^^^^ the trait `Unpin` is not implemented for `{async block@src/main.rs:8:23: 20:10}`, which is required by `Box<{async block@src/main.rs:8:23: 20:10}>: std::future::Future` | = note: consider using the `pin!` macro consider using `Box::pin` if you need to access the pinned value outside of the current scope = note: required for `Box<{async block@src/main.rs:8:23: 20:10}>` to implement `std::future::Future`\nnote: required by a bound in `JoinAll` --> /Users/chris/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.30/src/future/join_all.rs:29:8 |\n27 | pub struct JoinAll<F> | ------- required by a bound in this struct\n28 | where\n29 | F: Future, | ^^^^^^ required by this bound in `JoinAll` Some errors have detailed explanations: E0277, E0308.\nFor more information about an error, try `rustc --explain E0277`. 这里有 很多 内容需要分析,所以让我们拆开来看。信息的第一部分告诉我们第一个异步代码块(src/main.rs:8:23: 20:10)没有实现 Unpin trait,并建议使用 pin! 或 Box::pin 来修复,在本章的稍后部分我们会深入 Pin 和 Unpin 的一些更多细节。不过现在我们可以仅仅遵循编译器的建议来解困!在示例 17-18 中,我们以更新 futures 的类型声明作为开始,用 Pin 来封装每个 Box。其次,我们使用 Box::pin 来 pin 住 futures 自身。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{\n# future::Future,\n# pin::{pin, Pin},\n# time::Duration,\n# };\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# # let tx1 = tx.clone();\n# let tx1_fut = pin!(async move {\n# let vals = vec![\n# String::from(\"hi\"),\n# String::from(\"from\"),\n# String::from(\"the\"),\n# String::from(\"future\"),\n# ];\n# # for val in vals {\n# tx1.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# });\n# # let rx_fut = pin!(async {\n# while let Some(value) = rx.recv().await {\n# println!(\"received '{value}'\");\n# }\n# });\n# # let tx_fut = pin!(async move {\n# let vals = vec![\n# String::from(\"more\"),\n# String::from(\"messages\"),\n# String::from(\"for\"),\n# String::from(\"you\"),\n# ];\n# # for val in vals {\n# tx.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# }\n# });\n# let futures: Vec<Pin<Box<dyn Future<Output = ()>>>> = vec![Box::pin(tx1_fut), Box::pin(rx_fut), Box::pin(tx_fut)];\n# # trpl::join_all(futures).await;\n# });\n# } 示例 17-18:使用 `Pin` 和 `Box::pin` 来约束 `Vec` 的类型 如果编译并运行代码,我们终于会得到我们期望的输出: received 'hi'\nreceived 'more'\nreceived 'from'\nreceived 'messages'\nreceived 'the'\nreceived 'for'\nreceived 'future'\nreceived 'you' (长舒一口气!) 这里还有一些我们可以进一步探索的内容。首先,因为通过 Box 来将这些 futures 放到堆上,使用 Pin<Box<T>> 会带来少量的额外开销,而我们这么做仅仅是为了使类型对齐。毕竟这里实际上并不 需要 堆分配:这些 futures 对于这个特定的函数来说是本地的。如上所述,Pin 本身是一个封装类型,因此我们可以在 Vec 中拥有单一类型的好处(也就是使用 Box 的初始原因)而不用堆分配。我们可以通过 std::pin::pin 宏来直接对每个 future 使用 Pin。 然而,我们仍然必须现实地知道被 pin 的引用的类型:否则 Rust 仍然不知道如何将它们解释为动态 trait objects,这是将它们放进 Vec 所需的。因此我们在定义每个 future 的时候使用 pin!,并将 futures 定义为一个包含被 pin 的动态 Future 类型的可变引用的 Vec,如示例 17-19 所示。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{\n# future::Future,\n# pin::{pin, Pin},\n# time::Duration,\n# };\n# # fn main() {\n# trpl::run(async {\n# let (tx, mut rx) = trpl::channel();\n# # let tx1 = tx.clone(); let tx1_fut = pin!(async move { // --snip--\n# let vals = vec![\n# String::from(\"hi\"),\n# String::from(\"from\"),\n# String::from(\"the\"),\n# String::from(\"future\"),\n# ];\n# # for val in vals {\n# tx1.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# } }); let rx_fut = pin!(async { // --snip--\n# while let Some(value) = rx.recv().await {\n# println!(\"received '{value}'\");\n# } }); let tx_fut = pin!(async move { // --snip--\n# let vals = vec![\n# String::from(\"more\"),\n# String::from(\"messages\"),\n# String::from(\"for\"),\n# String::from(\"you\"),\n# ];\n# # for val in vals {\n# tx.send(val).unwrap();\n# trpl::sleep(Duration::from_secs(1)).await;\n# } }); let futures: Vec<Pin<&mut dyn Future<Output = ()>>> = vec![tx1_fut, rx_fut, tx_fut];\n# # trpl::join_all(futures).await;\n# });\n# } 示例 17-19:通过 `pin!` 宏来直接使用 `Pin` 以避免不必要的堆分配 目前为止我们一直忽略了可能有不同 Output 类型的事实。例如,在示例 17-20 中,匿名 future a 实现了 Future<Output = u32>,匿名 future b 实现了 Future<Output = &str>,而匿名 future c 实现了 Future<Output = bool>。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # fn main() {\n# trpl::run(async { let a = async { 1u32 }; let b = async { \"Hello!\" }; let c = async { true }; let (a_result, b_result, c_result) = trpl::join!(a, b, c); println!(\"{a_result}, {b_result}, {c_result}\");\n# });\n# } 示例 17-20:三个不同类型的 futures 我们可以使用 trpl::join! 来 await 它们,因为它允许你传递多个 future 类型并产生一个这些类型的元组。我们 不能 使用 trpl::join_all,因为它要求传递的 future 都拥有相同的类型。请记住,那个错误正是我们开启 Pin 探索之旅的原因! 这是一个基础的权衡取舍:要么我们可以使用 join_all 处理动态数量的 future,只要它们都有相同的类型;要么我们可以使用 join 函数或者 join! 宏来处理固定数量的 future,哪怕它们有着不同的类型。不过这与 Rust 处理任何其它类型是一样的。Future 并不特殊,即便我们采用了一些友好的语法来处理它们,而这其实是好事。","breadcrumbs":"Async 和 await » 使用任意数量的 futures » 使用任意数量的 futures","id":"320","title":"使用任意数量的 futures"},"321":{"body":"当我们使用 join 系列函数和宏来 “join” future 时,我们要求它们 全部 结束才能继续。虽然有时我们只需要 部分 future 结束就能继续,这有点像一个 future 与另一个 future 竞争。 在示例 17-21 中,我们再次使用 trpl::race 来运行 slow 和 fast 两个 future 并相互竞争。它们每一个都会在开始运行时打印一条消息,通过调用并 await sleep 暂停一段时间,接着在其结束时打印另一条消息。然后我们将它们传递给 trpl::race 并等待其中一个结束。(结果不会令人意外:fast 会赢!)不同于我们在 第一个异步程序 中使用 race 的时候,这里忽略了其返回的 Either 实例,因为所有有趣的行为都发生在异步代码块中。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let slow = async { println!(\"'slow' started.\"); trpl::sleep(Duration::from_millis(100)).await; println!(\"'slow' finished.\"); }; let fast = async { println!(\"'fast' started.\"); trpl::sleep(Duration::from_millis(50)).await; println!(\"'fast' finished.\"); }; trpl::race(slow, fast).await;\n# });\n# } 示例 17-21:使用 `race` 来获取哪个 future 最先结束的结果 请注意如果你反转 race 参数的顺序,“started” 消息的顺序会改变,即使 fast future 总是第一个结束。这是因为这个特定的 race 函数实现并不是公平的。它总是以传递的参数的顺序来运行传递的 futures。其它的实现 是 公平的,并且会随机选择首先轮询的 future。不过无论我们使用的 race 实现是否公平,其中 一个 future 会在另一个任务开始之前一直运行到异步代码块中第一个 await 为止。 回忆一下 第一个异步程序 中提到在每一个 await point,如果被 await 的 future 还没有就绪,Rust 会给运行时一个机会来暂停该任务并切换到另一个任务。反过来也是正确的:Rust 只会 在一个 await point 暂停异步代码块并将控制权交还给运行时。await points 之间的一切都是同步。 这意味着如果你在异步代码块中做了一堆工作而没有一个 await point,则那个 future 会阻塞其它任何 future 继续进行。有时你可能会听说这称为一个 future starving 其它 future。在一些情况中,这可能不是什么大问题。不过,如果你在进行某种昂贵的设置或者长时间运行的任务,亦或有一个 future 会无限持续运行某些特定任务的话,你会需要思考在何时何地将控制权交还运行时。 同样地,如果你有长时间运行的阻塞操作,异步可能是一个提供了将程序的不同部分相互关联起来的实用工具。 不过在这种情况下 如何 将控制权交还运行时呢?","breadcrumbs":"Async 和 await » 使用任意数量的 futures » future 竞争","id":"321","title":"future 竞争"},"322":{"body":"让我们模拟一个长时间运行的操作。示例 17-22 引入了一个 slow 函数。它使用 std::thread::sleep 而不是 trpl::sleep 因此 slow 调用会阻塞当前线程若干毫秒。我们可以用 slow 来代表现实世界中的长时间运行并且会阻塞的操作。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{thread, time::Duration};\n# # fn main() {\n# trpl::run(async {\n# // We will call `slow` here later\n# });\n# }\n# fn slow(name: &str, ms: u64) { thread::sleep(Duration::from_millis(ms)); println!(\"'{name}' ran for {ms}ms\");\n} 示例 17-22:使用 `thread::sleep` 来模拟缓慢的操作 在示例 17-22 中,我们使用 slow 在几个 future 中模拟这类 CPU 密集型工作。首先,每个 future 只会在进行了一系列缓慢操作 之后 才将控制权交还给运行时。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{thread, time::Duration};\n# # fn main() {\n# trpl::run(async { let a = async { println!(\"'a' started.\"); slow(\"a\", 30); slow(\"a\", 10); slow(\"a\", 20); trpl::sleep(Duration::from_millis(50)).await; println!(\"'a' finished.\"); }; let b = async { println!(\"'b' started.\"); slow(\"b\", 75); slow(\"b\", 10); slow(\"b\", 15); slow(\"b\", 350); trpl::sleep(Duration::from_millis(50)).await; println!(\"'b' finished.\"); }; trpl::race(a, b).await;\n# });\n# }\n# # fn slow(name: &str, ms: u64) {\n# thread::sleep(Duration::from_millis(ms));\n# println!(\"'{name}' ran for {ms}ms\");\n# } 示例 17-23:使用 `thread::sleep` 来模拟缓慢的操作 如果运行代码,你会看到这些输出: 'a' started.\n'a' ran for 30ms\n'a' ran for 10ms\n'a' ran for 20ms\n'b' started.\n'b' ran for 75ms\n'b' ran for 10ms\n'b' ran for 15ms\n'b' ran for 350ms\n'a' finished. 与上一个示例一样,race 仍然在 a 完成后就立刻结束了。两个 future 之间没有交替运行。a future 一直进行其工作直到 trpl::sleep 调用被 await,然后 b future 一直进行其工作直到它自己的 trpl::sleep 调用被 await,再然后 a future 才完成。为了使两个 future 在各自缓慢任务之间都能有所进展,我们需要 await point 才能将控制权交还给运行时。这意味着我们需要一些可以 await 的东西! 我们已经在示例 17-23 中见过这类交接发生:如果去掉 a future 结尾的 trpl::sleep,那么当它完成时 b future 完全 不会运行。也许我们可以使用 sleep 函数来作为开始呢? 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{thread, time::Duration};\n# # fn main() {\n# trpl::run(async { let one_ms = Duration::from_millis(1); let a = async { println!(\"'a' started.\"); slow(\"a\", 30); trpl::sleep(one_ms).await; slow(\"a\", 10); trpl::sleep(one_ms).await; slow(\"a\", 20); trpl::sleep(one_ms).await; println!(\"'a' finished.\"); }; let b = async { println!(\"'b' started.\"); slow(\"b\", 75); trpl::sleep(one_ms).await; slow(\"b\", 10); trpl::sleep(one_ms).await; slow(\"b\", 15); trpl::sleep(one_ms).await; slow(\"b\", 35); trpl::sleep(one_ms).await; println!(\"'b' finished.\"); };\n# # trpl::race(a, b).await;\n# });\n# }\n# # fn slow(name: &str, ms: u64) {\n# thread::sleep(Duration::from_millis(ms));\n# println!(\"'{name}' ran for {ms}ms\");\n# } 示例 17-24:使用 `sleep` 让操作切换以继续进行 在示例 17-24 中,我们在 slow 调用之间增加了 trpl::sleep 调用和 await points。现在两个 future 的工作会相互交替运行: 'a' started.\n'a' ran for 30ms\n'b' started.\n'b' ran for 75ms\n'a' ran for 10ms\n'b' ran for 10ms\n'a' ran for 20ms\n'b' ran for 15ms\n'a' finished. a future 仍然会在交还控制权给 b 之前运行一会儿,因为它在调用 trpl::sleep 之前就调用了 slow,不过在这之后两个 future 会在触发 await point 时来回切换。在这个例子中,我们在 slow 之后这么做,不过我们可以在任何合适的地方拆分任务。 不过我们并不是真的想在这里 休眠 :我们希望尽可能快地取得进展。我们仅仅是需要交还控制权给运行时。我们可以使用 yield_now 函数来直接这么做。在示例 17-25 中,我们将所有的 sleep 调用替换为 yield_now。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{thread, time::Duration};\n# # fn main() {\n# trpl::run(async { let a = async { println!(\"'a' started.\"); slow(\"a\", 30); trpl::yield_now().await; slow(\"a\", 10); trpl::yield_now().await; slow(\"a\", 20); trpl::yield_now().await; println!(\"'a' finished.\"); }; let b = async { println!(\"'b' started.\"); slow(\"b\", 75); trpl::yield_now().await; slow(\"b\", 10); trpl::yield_now().await; slow(\"b\", 15); trpl::yield_now().await; slow(\"b\", 35); trpl::yield_now().await; println!(\"'b' finished.\"); };\n# # trpl::race(a, b).await;\n# });\n# }\n# # fn slow(name: &str, ms: u64) {\n# thread::sleep(Duration::from_millis(ms));\n# println!(\"'{name}' ran for {ms}ms\");\n# } 示例 17-25:使用 `yield_now` 让操作切换以继续进行 这不仅更为清楚地表明了实际的意图而且更显著地快于使用 sleep,因为像这样使用 sleep 的定时器通常受限于其控制粒度。例如我们使用的 sleep 版本,会至少休眠一毫秒,哪怕我们传递一纳秒的 Duration。而且,现代计算机非常 快速 :它们可以在一毫秒内完成很多工作! 你可以自行设置一些基准测试来验证这一点,例如示例 17-26 中的这个。(这并不是一个特别严谨的进行性能测试的方法,不过用来展示这里的区别是足够的。)这里,我们省略了所有的状态打印,传递一纳秒的 Duration 给 trpl::sleep,并让每一个 future 各自运行,不在 future 之间切换。接着我们运行 1000 次迭代并对比下使用 trpl::sleep 的 future 和使用 trpl::yield_now 的 future 的运行时间。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::{Duration, Instant};\n# # fn main() {\n# trpl::run(async { let one_ns = Duration::from_nanos(1); let start = Instant::now(); async { for _ in 1..1000 { trpl::sleep(one_ns).await; } } .await; let time = Instant::now() - start; println!( \"'sleep' version finished after {} seconds.\", time.as_secs_f32() ); let start = Instant::now(); async { for _ in 1..1000 { trpl::yield_now().await; } } .await; let time = Instant::now() - start; println!( \"'yield' version finished after {} seconds.\", time.as_secs_f32() );\n# });\n# } 示例 17-26:对比 `sleep` 和 `yield_now` 的性能 使用 yield_now 的版本要 快得多 ! 这意味着取决于程序所作的其它工作,异步操作甚至在计算密集型任务中也有用处,因为它提供了一个结构化程序中不同部分之间关系的实用工具。这是一种形式的 协同多任务处理 ( cooperative multitasking ),每个 futrue 有权通过 await point 来决定何时交还控制权。因此每个 future 也有责任避免长时间阻塞。在一些基于 Rust 的嵌入式系统中,这是 唯一 的多任务处理类型! 当然,在真实代码中,你通常不会在每一行上都交替使用 await 点来调用函数。虽然这样控制 yielding 相对来说更为廉价,但也不是毫无代价的!在很多情况下,尝试将计算密集型任务拆分可能会显著降低其速度,所以有时为了 整体 性能简单地让一个操作阻塞是更好的选择。你应该总是通过测量来观察代码真正的性能瓶颈是什么。不过其底层的考量在于重要的是要牢记你是否 确实 观察到了很多期望并发进行的工作在串行地进行。","breadcrumbs":"Async 和 await » 使用任意数量的 futures » Yielding","id":"322","title":"Yielding"},"323":{"body":"我们也可以将 futures 组合起来形成一个新模式。例如,我们可以使用已有的异步代码块构建一个 timeout 函数。当我们完成时,其结果将是另一个可以用来构建进一步异步抽象的代码块。 示例 17-27 展示了我们预期 timeout 如何处理一个缓慢运行的 future。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::time::Duration;\n# # fn main() {\n# trpl::run(async { let slow = async { trpl::sleep(Duration::from_millis(100)).await; \"I finished!\" }; match timeout(slow, Duration::from_millis(10)).await { Ok(message) => println!(\"Succeeded with '{message}'\"), Err(duration) => { println!(\"Failed after {} seconds\", duration.as_secs()) } }\n# });\n# } 示例 17-27:使用假想的 `timeout` 来运行一个缓慢运行的操作并设置一个时限 让我们来实现它!首先,让我们考虑一下 timeout 的 API: 它需要是一个 async 函数以便可以 await。 它的第一个参数应该是需要运行的 future。我们可以使用泛型以便可以处理任意 future。 它的第二个参数将是需要等待的最大时间。如果我们使用 Duration 的话,将会使得将其直接传递给 trpl::sleep 变得简单。 它应该返回一个 Result。如果 future 成功完成,Result 将会是包含 future 所产生的值的 Ok。如果超时先发生,Result 将会是包含超时等待的持续时间的 Err。 示例 17-28 展示了这个抽象。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{future::Future, time::Duration};\n# # fn main() {\n# trpl::run(async {\n# let slow = async {\n# trpl::sleep(Duration::from_secs(5)).await;\n# \"Finally finished\"\n# };\n# # match timeout(slow, Duration::from_millis(10)).await {\n# Ok(message) => println!(\"Succeeded with '{message}'\"),\n# Err(duration) => {\n# println!(\"Failed after {} seconds\", duration.as_secs())\n# }\n# }\n# });\n# }\n# async fn timeout<F: Future>( future_to_try: F, max_time: Duration,\n) -> Result<F::Output, Duration> { // Here is where our implementation will go!\n} 示例 17-28:定义 `timeout` 的签名 这满足了我们对类型的目标。现在让我们思考下所需的 行为 :我们需要传递进来的 future 在持续时间内相互竞争。我们可以使用 trpl::sleep 和 duration 来创建一个定时器 future,并使用 trpl::race 来运行定时器 future 和调用者传递进来的 future。 我们还知道 race 是不公平的,并按照传递的顺序轮询参数。因此,我们首先传递 future_to_try 给 race 以便哪怕 max_time 是一个非常短的持续时间它也能有机会完成。如果 future_to_try 首先完成,race 会返回 Left 和 future 的输出。如果 timer 首先完成,race 会返回 Right 和定时器的输出 ()。 在示例 17-29 中,我们匹配 await trpl::race 的结果。如果 future_to_try 成功并得到一个 Left(output),我们返回 Ok(output)。相反如果休眠定时器超时了并得到一个 Right(()),则我们通过 _ 忽略 () 并返回 Err(max_time)。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # use std::{future::Future, time::Duration};\n# use trpl::Either; // --snip-- fn main() { trpl::run(async { let slow = async { trpl::sleep(Duration::from_secs(5)).await; \"Finally finished\" }; match timeout(slow, Duration::from_secs(2)).await { Ok(message) => println!(\"Succeeded with '{message}'\"), Err(duration) => { println!(\"Failed after {} seconds\", duration.as_secs()) } } });\n} async fn timeout<F: Future>( future_to_try: F, max_time: Duration,\n) -> Result<F::Output, Duration> { match trpl::race(future_to_try, trpl::sleep(max_time)).await { Either::Left(output) => Ok(output), Either::Right(_) => Err(max_time), }\n# } 示例 17-29:使用 `race` 和 `sleep` 来定义 `timeout` 于是我们有了一个由另外两个帮助函数构成的可以工作的 timeout。如果我们运行代码,它会在超时之后打印失败模式: Failed after 2 seconds 由于 future 可以和其他 future 组合,你可以使用更小的异步代码块来构建非常强力的工具。例如,可以使用相同的方式来组合超时和重试,并转而将其用于类似网络调用的工作,这正是本章开头的一个示例! 在实践中,你会直接处理 async 和 await,其次才是类似 join、join_all、race 等函数和宏,在使用这些 API 时你只会偶尔遇到 pin。 现在我们见过了一系列同时处理多个 future 的方法了。接下来,我们来看看如何通过( 流 ) streams 处理一个时间序列的多个 future。不过,在此之前,这里有几个你可能想要先考虑的问题: 我们在 Vec 上使用了 join_all 来等待一组中的所有 future 完成。相反该如何使用 Vec 来依次处理一个序列的 future 呢?这么做有哪些权衡取舍呢? 仔细观察 futures crate 中的 futures::stream::FuturesUnordered 类型。使用它与使用 Vec 又有什么区别呢?(不用担心它来自与 crate 的 stream 部分的事实;它刚好能处理任何 future 的集合。)","breadcrumbs":"Async 和 await » 使用任意数量的 futures » 构建我们自己的异步抽象","id":"323","title":"构建我们自己的异步抽象"},"324":{"body":"ch17-04-streams.md commit f04d20fe8d1a49c3bffa10a3086c58e527ff0a90 到本章的目前为止,我们大部分时间停留在独立的 future 上。一个重要的例外就是我们用过的异步信道。回忆一下在本章之前的 “消息传递” 中我们如何使用异步信道接收端的。异步 recv 方法随着时间的推移产生一个序列的项。这是一个通用的多的模式的实例,通常被称为 流 ( stream )。 一个序列的项是我们之前是见过的,回忆一下第十三章的 Iterator trait,不过迭代器和异步信道接收端有两个区别。第一个区别是时间的维度:迭代器是同步的,而信道接收端是异步的。第二个区别是 API。当直接处理 Iterator 时,我们会调用其同步 next 方法。对于这个特定的 trpl::Receiver 流,我们调用一个异步的 recv 方法。不过这两个 API 看起来非常相似。 这种相似性并非巧合。流类似于一种异步形式的迭代器。不过鉴于 trpl::Receiver 专门等待接收消息,多用途的流 API 则更为通用:它像 Iterator 一样提供了下一个项,不过是异步版本的。Rust 中迭代器和流的相似性意味着我们实际上可以从任何迭代器上创建流。就迭代器而言,可以通过调用其 next 方法并 await 输出来使用流,如示例 17-30 所示。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# # fn main() {\n# trpl::run(async { let values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let iter = values.iter().map(|n| n * 2); let mut stream = trpl::stream_from_iter(iter); while let Some(value) = stream.next().await { println!(\"The value was: {value}\"); }\n# });\n# } 示例 17-30:从迭代器创建流并打印其值 我们以一组数字作为开始,将其转换为一个迭代器并接着调用 map 将其所有值翻倍。然后使用 trpl::stream_from_iter 函数将迭代器转换为流。再然后在 while let 循环中到达时循环处理流中的项。 不幸的是当我们尝试运行代码时,代码无法编译。相反如果我们观察其输出,它会报告没有可用的 next 方法。 error[E0599]: no method named `next` found for struct `Iter` in the current scope --> src/main.rs:10:40 |\n10 | while let Some(value) = stream.next().await { | ^^^^ | = note: the full type name has been written to 'file:///projects/async_await/target/debug/deps/async_await-9de943556a6001b8.long-type-1281356139287206597.txt' = note: consider using `--verbose` to print the full type name to the console = help: items from traits can only be used if the trait is in scope\nhelp: the following traits which provide `next` are implemented but not in scope; perhaps you want to import one of them |\n1 + use crate::trpl::StreamExt; |\n1 + use futures_util::stream::stream::StreamExt; |\n1 + use std::iter::Iterator; |\n1 + use std::str::pattern::Searcher; |\nhelp: there is a method `try_next` with a similar name |\n10 | while let Some(value) = stream.try_next().await { | ~~~~~~~~ 正如输出中所建议的,编译器错误的原因是我们需要在作用域中有正确的 trait 以便能够使用 next 方法。鉴于目前为止的讨论,你可能会合理地推测是 Stream,不过这里需要的 trait 实际上是 StreamExt。这里的 Ext 是 “extension”:在 Rust 社区中这是用另一个 trait 扩展 trait 的常见模式。 为什么我们需要 StreamExt 而不是 Stream,而 Stream trait 本身又是做什么的呢?简单来说,答案是贯穿整个 Rust 生态系统,Stream trait 定义了一个底层接口用于有效地组合 Iterator 和 Future trait。StreamExt trait 在 Stream 之上提供了一组高层 API,这包括 next 和其它类似于 Iterator trait 提供的工具方法。在本章的最后我们会回到 Stream 和 StreamExt 并介绍更多细节。现在这已经足够我们继续了。 对编译器错误的修复是增加一个 trpl::StreamExt 的 use 语句,如示例 17-31 所示。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# use trpl::StreamExt; fn main() { trpl::run(async { let values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let iter = values.iter().map(|n| n * 2); let mut stream = trpl::stream_from_iter(iter); while let Some(value) = stream.next().await { println!(\"The value was: {value}\"); } });\n} 示例 17-31:成功使用迭代器作为流的基础 将所有这些代码片段拼凑在一起,这段代码如我们预期般运行!更重要的是,现在我们在作用域中拥有 StreamExt,就可以使用所有其工具方法。例如在示例 17-32 中,我们使用 filter 方法来过滤掉所有不是 3 或者 5 的倍数的项。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# use trpl::StreamExt; fn main() { trpl::run(async { let values = 1..101; let iter = values.map(|n| n * 2); let stream = trpl::stream_from_iter(iter); let mut filtered = stream.filter(|value| value % 3 == 0 || value % 5 == 0); while let Some(value) = filtered.next().await { println!(\"The value was: {value}\"); } });\n} 示例 17-32:使用 `StreamExt::filter` 方法来过滤 `Stream` 当然这并不是非常的有趣。我们完全可以使用普通的迭代器而不用任何异步操作来做到这些。所以让我们看看一些其它的只能用流的内容。","breadcrumbs":"Async 和 await » 流(Streams) » 流(Streams)","id":"324","title":"流(Streams)"},"325":{"body":"很多概念天然地可以用流来代表:队列中可用的项;或者处理超过计算机内存的数据,一次只能从文件系统拉取一个块;或者通过网络随着时间推移到达的数据。因为流是 future,我们也可以将其用于任何其它类型的 future,并且我们可以用一种非常有趣的方式来组合它们。例如,我们可以批量处理事件来避免触发过多的网络调用,为一系列的长时间运行的任务设置超时,或者对用户接口事件限速来避免进行无尽的工作。 让我们构建一个小的消息流作为开始,将其作为一个可能从 WebSocket 或者其它现实世界中的通信协议中遇到的数据流的替代。在示例 17-33 中,我们创建了一个返回 impl Stream<Item = String> 的 get_messages 函数。作为其实现,我们创建了一个异步信道,循环英文字母表的前是个字符,并通过信道发送它们。 我们还使用了一个新类型:ReceiverStream,它将 trpl::channel 的 rx 接收端转换为一个带有带有 next 方法的 Stream。回到 main,我们使用了一个 while let 循环来打印来自流中的所有消息。 文件名:src/main.rs # extern crate trpl; // required for mdbook test\n# use trpl::{ReceiverStream, Stream, StreamExt}; fn main() { trpl::run(async { let mut messages = get_messages(); while let Some(message) = messages.next().await { println!(\"{message}\"); } });\n} fn get_messages() -> impl Stream<Item = String> { let (tx, rx) = trpl::channel(); let messages = [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\"]; for message in messages { tx.send(format!(\"Message: '{message}'\")).unwrap(); } ReceiverStream::new(rx)\n} 示例 17-33:使用 `rx` 接收端作为一个 `ReceiverStream`","breadcrumbs":"Async 和 await » 流(Streams) » 组合流","id":"325","title":"组合流"},"326":{"body":"","breadcrumbs":"Async 和 await » 深入理解 async 相关的 traits » 深入理解 async 相关的 traits","id":"326","title":"深入理解 async 相关的 traits"},"327":{"body":"","breadcrumbs":"Async 和 await » Futures,任务(tasks)和线程(threads) » Futures,任务(tasks)和线程(threads)","id":"327","title":"Futures,任务(tasks)和线程(threads)"},"328":{"body":"ch18-00-oop.md commit 398d6f48d2e6b7b15efd51c4541d446e89de3892 面向对象编程(Object-Oriented Programming,OOP)是一种对程序进行建模方式。对象(Object)作为一个编程概念来源于 20 世纪 60 年代的 Simula 编程语言。这些对象影响了 Alan Kay 的编程架构,该架构中对象之间互相传递消息。他在 1967 年创造了 面向对象编程 ( object-oriented programming )这个术语。关于 OOP 是什么有很多相互矛盾的定义;在一些定义下,Rust 是面向对象的;在其他定义下,Rust 不是。在本章节中,我们会探索一些被普遍认为是面向对象的特性和这些特性是如何体现在 Rust 语言习惯中的。接着会展示如何在 Rust 中实现面向对象设计模式,并讨论这么做与利用 Rust 自身的一些优势实现的方案相比有什么取舍。","breadcrumbs":"Rust 的面向对象编程特性 » Rust 的面向对象特性","id":"328","title":"Rust 的面向对象特性"},"329":{"body":"ch18-01-what-is-oo.md commit 398d6f48d2e6b7b15efd51c4541d446e89de3892 关于一门语言必须具备哪些特征才能被视为面向对象,目前在编程社区中并没有共识。Rust 受到了许多编程范式的影响,包括面向对象编程(OOP);例如,在第 13 章中,我们探讨了来自函数式编程的特性。可以说,面向对象的语言共有一些共同的特征,即对象、封装和继承。我们将会讨论这些特征分别是什么,以及 Rust 是否支持它们。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象语言的特点 » 面向对象语言的特征","id":"329","title":"面向对象语言的特征"},"33":{"body":"猜数字程序的第一部分请求和处理用户输入,并检查输入是否符合预期的格式。首先,我们会允许玩家输入一个猜测。在 src/main.rs 中输入示例 2-1 中的代码。 文件名:src/main.rs use std::io; fn main() { println!(\"Guess the number!\"); println!(\"Please input your guess.\"); let mut guess = String::new(); io::stdin() .read_line(&mut guess) .expect(\"Failed to read line\"); println!(\"You guessed: {}\", guess);\n} 示例 2-1:获取用户猜测并打印的代码 这些代码包含很多信息,我们一行一行地过一遍。为了获取用户输入并打印结果作为输出,我们需要将 io 输入/输出库引入当前作用域。io 库来自于标准库,也被称为 std: use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {}\", guess);\n# } 默认情况下,Rust 设定了若干个会自动导入到每个程序作用域中的标准库内容,这组内容被称为 预导入(prelude) 内容。你可以在 标准库文档 中查看预导入的所有内容。 如果你需要的类型不在预导入内容中,就必须使用 use 语句显式地将其引入作用域。std::io 库提供很多有用的功能,包括接收用户输入的功能。 如第一章所提及,main 函数是程序的入口点: # use std::io;\n# fn main() {\n# println!(\"Guess the number!\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {}\", guess);\n# } fn 语法声明了一个新函数,小括号 () 表明没有参数,大括号 { 作为函数体的开始。 第一章也提及了 println! 是一个在屏幕上打印字符串的宏: # use std::io;\n# # fn main() { println!(\"Guess the number!\"); println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {}\", guess);\n# } 这些代码仅仅打印提示,介绍游戏的内容然后请求用户输入。","breadcrumbs":"写个猜数字游戏 » 处理一次猜测","id":"33","title":"处理一次猜测"},"330":{"body":"由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(Addison-Wesley Professional, 1994)编写的书 Design Patterns: Elements of Reusable Object-Oriented Software ,通称 The Gang of Four (“四人帮”),是一本面向对象设计模式的目录。它这样定义面向对象编程: Object-oriented programs are made up of objects. An object packages both data and the procedures that operate on that data. The procedures are typically called methods or operations . 面向对象的程序由对象组成。一个 对象 包含数据和操作这些数据的过程。这些过程通常被称为 方法 或 操作 。 在这个定义下,Rust 是面向对象的:结构体和枚举包含数据而 impl 块提供了在结构体和枚举之上的方法。虽然带有方法的结构体和枚举并不被 称为 对象,但是它们提供了与对象相同的功能,参考 The Gang of Four 中对象的定义。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象语言的特点 » 对象包含数据和行为","id":"330","title":"对象包含数据和行为"},"331":{"body":"另一个通常与面向对象编程关联的概念是 封装 ( encapsulation ):一个对象的实现细节对使用该对象的代码不可访问。因此,对象交互的唯一方式是通过其公共 API;使用对象的代码不应能直接触及对象的内部并改变数据或行为。这使得程序员能够更改和重构一个对象的内部实现,而无需改变使用该对象的代码。 我们在第 7 章讨论了如何控制封装:我们可以使用 pub 关键字来决定代码中的哪些模块、类型、函数和方法是公有的,而默认情况下其他所有内容都是私有的。例如,我们可以定义一个 AveragedCollection 结构体,其中有一个存有 Vec<i32> 的字段。该结构体还可以有一个字段存储其平均值,以便需要时取用。示例 17-1 给出了 AveragedCollection 结构体的定义: 文件名:src/lib.rs pub struct AveragedCollection { list: Vec<i32>, average: f64,\n} 示例 17-1: AveragedCollection 结构体维护了一个整型列表及其所有元素的平均值。 该结构体被标记为 pub,这样其他代码就可以使用它,但结构体内的字段保持私有。这在这种情况下很重要,因为我们想确保每当列表中添加或删除值时,平均值也会更新。我们通过实现结构体上的 add、remove 和 average 方法来做到这一点,如示例 17-2 所示: 文件名:src/lib.rs # pub struct AveragedCollection {\n# list: Vec<i32>,\n# average: f64,\n# }\n# impl AveragedCollection { pub fn add(&mut self, value: i32) { self.list.push(value); self.update_average(); } pub fn remove(&mut self) -> Option<i32> { let result = self.list.pop(); match result { Some(value) => { self.update_average(); Some(value) } None => None, } } pub fn average(&self) -> f64 { self.average } fn update_average(&mut self) { let total: i32 = self.list.iter().sum(); self.average = total as f64 / self.list.len() as f64; }\n} 示例 17-2: 在 AveragedCollection 结构体上实现了 add、remove 和 average 公有方法 公有方法 add、remove 和 average 是修改 AveragedCollection 实例的唯一方式。当使用 add 方法把一个元素加入到 list 或者使用 remove 方法来删除时,这些方法的实现同时会调用私有的 update_average 方法来更新 average 字段。 list 和 average 是私有的,所以没有其他方式来使得外部的代码直接向 list 增加或者删除元素,否则 list 改变时可能会导致 average 字段不同步。average 方法返回 average 字段的值,这使得外部的代码只能读取 average 而不能修改它。 因为我们已经封装了 AveragedCollection 的实现细节,改动数据结构等内部实现非常简单。例如,可以使用 HashSet<i32> 代替 Vec<i32> 作为 list 字段的类型。只要 add、remove 和 average 这些公有方法的签名保持不变,使用 AveragedCollection 的代码就无需改变。如果我们将 list 设为公有,情况就未必如此: HashSet<i32> 和 Vec<i32> 使用不同的方法增加或移除项,所以如果外部代码直接修改 list ,很可能需要进行更改。 如果封装被认为是面向对象语言所必要的特征,那么 Rust 满足这个要求。在代码中不同的部分控制 pub 的使用来封装实现细节。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象语言的特点 » 封装隐藏了实现细节","id":"331","title":"封装隐藏了实现细节"},"332":{"body":"继承 ( Inheritance )是一种机制:一个对象可以从另一个对象的定义中继承元素,从而获得父对象的数据和行为,无需再次定义。 如果一种语言必须具有继承才能被认为是面向对象语言,那么 Rust 不是其中之一。Rust 不支持定义一个结构体时继承父结构体的字段和方法,除非使用宏。 然而,如果您习惯于在编程过程中使用继承,那么根据运用继承的原因,Rust 提供了其他解决方案。 选择继承有两个主要的原因。其一是代码复用:您可以为一种类型实现特定的行为,继承可将其复用到不同的类型上。在 Rust 代码中可以使用默认 trait 方法实现来进行有限的代码复用,就像示例 10-14 中在 Summary trait 上增加的 summarize 方法的默认实现。任何实现了 Summary trait 的类型都可以使用 summarize 方法而无须进一步实现。这类似于父类有一个方法的实现,继承的子类也拥有这个方法的实现。当实现 Summary trait 时也可以选择覆盖 summarize 的默认实现,这类似于子类覆盖从父类继承方法的实现。 其二与类型系统有关:子类型可以用于父类型被使用的地方。这也被称为 多态 ( polymorphism ):如果多个对象共享某些特征,可以在运行时将它们互相替代。 多态(Polymorphism) 对很多人来说,多态性与继承同义。但它实际上是一个更广义的概念,指的是可以处理多种类型数据的代码。对继承而言,这些类型通常是子类。 Rust 使用泛型来抽象不同可能的类型,并通过 trait bounds 来约束这些类型所必须提供的内容。这有时被称为 bounded parametric polymorphism 。 作为一种语言设计的解决方案,继承在许多新的编程语言中逐渐不被青睐,因为它经常有分享过多代码的风险。子类不应总是共享父类的所有特征,但是继承始终如此。它还引入了在子类上调用方法的可能性,这些方法可能没有意义,或因为方法不适用于子类而导致错误。此外,一些语言只允许单一继承(意味着子类只能从一个类继承),进一步限制了程序设计的灵活性。 出于这些原因,Rust 使用 trait 对象而非继承。接下来我们会讨论 Rust 如何使用 trait 对象实现多态性。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象语言的特点 » 继承,作为类型系统与代码共享","id":"332","title":"继承,作为类型系统与代码共享"},"333":{"body":"ch18-02-trait-objects.md commit 96d4b0ec1c5e019b85604c33ceee68b3e2669d40 在第八章中,我们谈到了 vector 只能存储同种类型元素的局限。示例 8-9 中提供了一个替代方案,通过定义 SpreadsheetCell 枚举,来储存整型、浮点型或文本类型的成员。这意味着,我们可以在每个单元中储存不同类型的数据,并仍能拥有一个代表一排单元的 vector。只要我们需存储的值由一组固定的类型组成,并且在代码编译时就知道具体会有哪些类型,那么这种使用枚举的办法是完全可行的。 然而有时我们希望库用户在特定情况下能够扩展有效的类型集合。为了展示如何实现这一点,这里将创建一个图形用户接口(Graphical User Interface,GUI)工具的例子,它通过遍历列表并调用每一个项目的 draw 方法来将其绘制到屏幕上 —— 此乃一个 GUI 工具的常见技术。我们将要创建一个叫做 gui 的库 crate,它含一个 GUI 库的结构。这个 GUI 库包含一些可供开发者使用的类型,比如 Button 或 TextField。在此之上,gui 的用户希望创建自定义的可以绘制于屏幕上的类型:比如,一个程序员可能会增加 Image,另一个可能会增加 SelectBox。 这个例子中并不会实现一个功能完善的 GUI 库,不过会展示其中各个部分是如何结合在一起的。编写库的时候,我们不可能知晓并定义所有其他程序员希望创建的类型。我们所知晓的是 gui 需要记录一系列不同类型的值,并需要能够对其中每一个值调用 draw 方法。这里无需知道调用 draw 方法时具体会发生什么,只要该值会有那个方法可供我们调用。 在拥有继承的语言中,可以定义一个名为 Component 的类,该类上有一个 draw 方法。其他的类比如 Button、Image 和 SelectBox 会从 Component 派生并因此继承 draw 方法。它们各自都可以覆盖 draw 方法来定义自己的行为,但是框架会把所有这些类型当作是 Component 的实例,并在其上调用 draw。不过 Rust 并没有继承,我们得另寻出路。","breadcrumbs":"Rust 的面向对象编程特性 » 顾及不同类型值的 trait 对象 » 顾及不同类型值的 trait 对象","id":"333","title":"顾及不同类型值的 trait 对象"},"334":{"body":"为了实现 gui 所期望的行为,让我们定义一个 Draw trait,其中包含名为 draw 的方法。接着可以定义一个存放 trait 对象 ( trait object )的 vector。trait 对象指向一个实现了我们指定 trait 的类型的实例,以及一个用于在运行时查找该类型的 trait 方法的表。我们通过指定某种指针来创建 trait 对象,例如 & 引用或 Box<T> 智能指针,还有 dyn keyword,以及指定相关的 trait(第二十章 “动态大小类型和 Sized trait” 部分会介绍 trait 对象必须使用指针的原因)。我们可以使用 trait 对象代替泛型或具体类型。任何使用 trait 对象的位置,Rust 的类型系统会在编译时确保任何在此上下文中使用的值会实现其 trait 对象的 trait。如此便无需在编译时就知晓所有可能的类型。 之前提到过,Rust 刻意不将结构体与枚举称为 “对象”,以便与其他语言中的对象相区别。在结构体或枚举中,结构体字段中的数据和 impl 块中的行为是分开的,不同于其他语言中将数据和行为组合进一个称为对象的概念中。trait 对象将数据和行为两者相结合,从这种意义上说 则 其更类似其他语言中的对象。不过 trait 对象不同于传统的对象,因为不能向 trait 对象增加数据。trait 对象并不像其他语言中的对象那么通用:其(trait 对象)具体的作用是允许对通用行为进行抽象。 示例 17-3 展示了如何定义一个带有 draw 方法的 trait Draw: 文件名:src/lib.rs pub trait Draw { fn draw(&self);\n} 示例 17-3:Draw trait 的定义 因为第十章已经讨论过如何定义 trait,其语法看起来应该比较眼熟。接下来就是新内容了:示例 17-4 定义了一个存放了名叫 components 的 vector 的结构体 Screen。这个 vector 的类型是 Box<dyn Draw>,此为一个 trait 对象:它是 Box 中任何实现了 Draw trait 的类型的替身。 文件名:src/lib.rs # pub trait Draw {\n# fn draw(&self);\n# }\n# pub struct Screen { pub components: Vec<Box<dyn Draw>>,\n} 示例 17-4: 一个 Screen 结构体的定义,它带有一个字段 components,其包含实现了 Draw trait 的 trait 对象的 vector 在 Screen 结构体上,我们将定义一个 run 方法,该方法会对其 components 上的每一个组件调用 draw 方法,如示例 17-5 所示: 文件名:src/lib.rs # pub trait Draw {\n# fn draw(&self);\n# }\n# # pub struct Screen {\n# pub components: Vec<Box<dyn Draw>>,\n# }\n# impl Screen { pub fn run(&self) { for component in self.components.iter() { component.draw(); } }\n} 示例 17-5:在 Screen 上实现一个 run 方法,该方法在每个 component 上调用 draw 方法 这与定义使用了带有 trait bound 的泛型类型参数的结构体不同。泛型类型参数一次只能替代一个具体类型,而 trait 对象则允许在运行时替代多种具体类型。例如,可以定义 Screen 结构体来使用泛型和 trait bound,如示例 17-6 所示: 文件名:src/lib.rs # pub trait Draw {\n# fn draw(&self);\n# }\n# pub struct Screen<T: Draw> { pub components: Vec<T>,\n} impl<T> Screen<T>\nwhere T: Draw,\n{ pub fn run(&self) { for component in self.components.iter() { component.draw(); } }\n} 示例 17-6: 一种 Screen 结构体的替代实现,其 run 方法使用泛型和 trait bound 这限制了 Screen 实例必须拥有一个全是 Button 类型或者全是 TextField 类型的组件列表。如果只需要同质(相同类型)集合,则倾向于使用泛型和 trait bound,因为其定义会在编译时采用具体类型进行单态化。 另一方面,通过使用 trait 对象的方法,一个 Screen 实例可以存放一个既能包含 Box<Button>,也能包含 Box<TextField> 的 Vec<T>。让我们看看它是如何工作的,接着会讲到其运行时性能影响。","breadcrumbs":"Rust 的面向对象编程特性 » 顾及不同类型值的 trait 对象 » 定义通用行为的 trait","id":"334","title":"定义通用行为的 trait"},"335":{"body":"现在来增加一些实现了 Draw trait 的类型。我们将提供 Button 类型。再一次重申,真正实现 GUI 库超出了本书的范畴,所以 draw 方法体中不会有任何有意义的实现。为了想象一下这个实现看起来像什么,一个 Button 结构体可能会拥有 width、height 和 label 字段,如示例 17-7 所示: 文件名:src/lib.rs # pub trait Draw {\n# fn draw(&self);\n# }\n# # pub struct Screen {\n# pub components: Vec<Box<dyn Draw>>,\n# }\n# # impl Screen {\n# pub fn run(&self) {\n# for component in self.components.iter() {\n# component.draw();\n# }\n# }\n# }\n# pub struct Button { pub width: u32, pub height: u32, pub label: String,\n} impl Draw for Button { fn draw(&self) { // code to actually draw a button }\n} 示例 17-7: 一个实现了 Draw trait 的 Button 结构体 在 Button 上的 width、height 和 label 字段会和其他组件不同,比如 TextField 可能有 width、height、label 以及 placeholder 字段。每一个我们希望能在屏幕上绘制的类型都会使用不同的代码来实现 Draw trait 的 draw 方法来定义如何绘制特定的类型,像这里的 Button 类型(如上提到的并不包含任何实际的 GUI 代码)。除了实现 Draw trait 之外,比如 Button 还可能有另一个包含按钮点击如何响应的方法的 impl 块。这类方法并不适用于像 TextField 这样的类型。 如果一些库的使用者决定实现一个包含 width、height 和 options 字段的结构体 SelectBox,并且也为其实现了 Draw trait,如示例 17-8 所示: 文件名:src/main.rs use gui::Draw; struct SelectBox { width: u32, height: u32, options: Vec<String>,\n} impl Draw for SelectBox { fn draw(&self) { // code to actually draw a select box }\n}\n# # fn main() {} 示例 17-8: 另一个使用 gui 的 crate 中,在 SelectBox 结构体上实现 Draw trait 库使用者现在可以在他们的 main 函数中创建一个 Screen 实例。至此可以通过将 SelectBox 和 Button 放入 Box<T> 转变为 trait 对象再放入 Screen 实例中。接着可以调用 Screen 的 run 方法,它会调用每个组件的 draw 方法。示例 17-9 展示了这个实现: 文件名:src/main.rs # use gui::Draw;\n# # struct SelectBox {\n# width: u32,\n# height: u32,\n# options: Vec<String>,\n# }\n# # impl Draw for SelectBox {\n# fn draw(&self) {\n# // code to actually draw a select box\n# }\n# }\n# use gui::{Button, Screen}; fn main() { let screen = Screen { components: vec![ Box::new(SelectBox { width: 75, height: 10, options: vec![ String::from(\"Yes\"), String::from(\"Maybe\"), String::from(\"No\"), ], }), Box::new(Button { width: 50, height: 10, label: String::from(\"OK\"), }), ], }; screen.run();\n} 示例 17-9: 使用 trait 对象来存储实现了相同 trait 的不同类型的值 当编写库的时候,我们不知道何人会在何时增加 SelectBox 类型,不过 Screen 的实现能够操作并绘制这个新类型,因为 SelectBox 实现了 Draw trait,这意味着它实现了 draw 方法。 这个概念 —— 只关心值所反映的信息而不是其具体类型 —— 类似于动态类型语言中称为 鸭子类型 ( duck typing )的概念:如果它走起来像一只鸭子,叫起来像一只鸭子,那么它就是一只鸭子!在示例 17-5 中 Screen 上的 run 实现中,run 并不需要知道各个组件的具体类型是什么。它并不检查组件是 Button 或者 SelectBox 的实例。通过指定 Box<dyn Draw> 作为 components vector 中值的类型,我们就定义了 Screen 为需要可以在其上调用 draw 方法的值。 使用 trait 对象和 Rust 类型系统来进行类似鸭子类型操作的优势是无需在运行时检查一个值是否实现了特定方法或者担心在调用时因为值没有实现方法而产生错误。如果值没有实现 trait 对象所需的 trait 则 Rust 不会编译这些代码。 例如,示例 17-10 展示了当创建一个使用 String 做为其组件的 Screen 时发生的情况: 文件名:src/main.rs use gui::Screen; fn main() { let screen = Screen { components: vec![Box::new(String::from(\"Hi\"))], }; screen.run();\n} 示例 17-10: 尝试使用一种没有实现 trait 对象的 trait 的类型 我们会遇到这个错误,因为 String 没有实现 rust_gui::Draw trait: $ cargo run Compiling gui v0.1.0 (file:///projects/gui)\nerror[E0277]: the trait bound `String: Draw` is not satisfied --> src/main.rs:5:26 |\n5 | components: vec![Box::new(String::from(\"Hi\"))], | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Draw` is not implemented for `String` | = help: the trait `Draw` is implemented for `Button` = note: required for the cast from `Box<String>` to `Box<dyn Draw>` For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `gui` (bin \"gui\") due to 1 previous error 这告诉了我们,要么是我们传递了并不希望传递给 Screen 的类型并应该提供其他类型,要么应该在 String 上实现 Draw 以便 Screen 可以调用其上的 draw。","breadcrumbs":"Rust 的面向对象编程特性 » 顾及不同类型值的 trait 对象 » 实现 trait","id":"335","title":"实现 trait"},"336":{"body":"回忆一下第十章 “泛型代码的性能” 部分讨论过的,当对泛型使用 trait bound 时编译器所执行的单态化处理:编译器为每一个被泛型类型参数代替的具体类型生成了函数和方法的非泛型实现。单态化产生的代码在执行 静态分发 ( static dispatch )。静态分发发生于编译器在编译时就知晓调用了什么方法的时候。这与 动态分发 ( dynamic dispatch )相对,这时编译器在编译时无法知晓调用了什么方法。在动态分发的场景下,编译器会生成负责在运行时确定该调用什么方法的代码。 当使用 trait 对象时,Rust 必须使用动态分发。编译器无法知晓所有可能用于 trait 对象代码的类型,所以它也不知道应该调用哪个类型的哪个方法实现。为此,Rust 在运行时使用 trait 对象中的指针来知晓需要调用哪个方法。动态分发也阻止编译器有选择的内联方法代码,这会相应的禁用一些优化。尽管在编写示例 17-5 和可以支持示例 17-9 中的代码的过程中确实获得了额外的灵活性,但仍然需要权衡取舍。","breadcrumbs":"Rust 的面向对象编程特性 » 顾及不同类型值的 trait 对象 » trait 对象执行动态分发","id":"336","title":"trait 对象执行动态分发"},"337":{"body":"ch18-03-oo-design-patterns.md commit 937784b8708c24314707378ad42faeb12a334bbd 状态模式 ( state pattern )是一个面向对象设计模式。该模式的关键在于定义一系列值的内含状态。这些状态体现为一系列的 状态对象 ,同时值的行为随着其内部状态而改变。我们将编写一个博客发布结构体的例子,它拥有一个包含其状态的字段,这是一个有着 \"draft\"、\"review\" 或 \"published\" 的状态对象 状态对象共享功能:当然,在 Rust 中使用结构体和 trait 而不是对象和继承。每一个状态对象负责其自身的行为,以及该状态何时应当转移至另一个状态。持有一个状态对象的值对于不同状态的行为以及何时状态转移毫不知情。 使用状态模式的优点在于,程序的业务需求改变时,无需改变值持有状态或者使用值的代码。我们只需更新某个状态对象中的代码来改变其规则,或者是增加更多的状态对象。 首先我们将以一种更加传统的面向对象的方式实现状态模式,接着使用一种更 Rust 一点的方式。让我们使用状态模式增量式地实现一个发布博文的工作流以探索这个概念。 这个博客的最终功能看起来像这样: 博文从空白的草案开始。 一旦草案完成,请求审核博文。 一旦博文过审,它将被发表。 只有被发表的博文的内容会被打印,这样就不会意外打印出没有被审核的博文的文本。 任何其他对博文的修改尝试都是没有作用的。例如,如果尝试在请求审核之前通过一个草案博文,博文应该保持未发布的状态。 示例 17-11 展示这个工作流的代码形式:这是一个我们将要在一个叫做 blog 的库 crate 中实现的 API 的示例。这段代码还不能编译,因为还未实现 blog。 文件名:src/main.rs use blog::Post; fn main() { let mut post = Post::new(); post.add_text(\"I ate a salad for lunch today\"); assert_eq!(\"\", post.content()); post.request_review(); assert_eq!(\"\", post.content()); post.approve(); assert_eq!(\"I ate a salad for lunch today\", post.content());\n} 示例 17-11: 展示了 blog crate 期望行为的代码 我们希望允许用户使用 Post::new 创建一个新的博文草案。也希望能在草案阶段为博文编写一些文本。如果在审批之前尝试立刻获取博文的内容,不应该获取到任何文本因为博文仍然是草案。一个好的单元测试将是断言草案博文的 content 方法返回空字符串,不过我们并不准备为这个例子编写单元测试。 接下来,我们希望能够请求审核博文,而在等待审核的阶段 content 应该仍然返回空字符串。最后当博文审核通过,它应该被发表,这意味着当调用 content 时博文的文本将被返回。 注意我们与 crate 交互的唯一的类型是 Post。这个类型会使用状态模式并会存放处于三种博文所可能的状态之一的值 —— 草案,等待审核和发布。状态上的改变由 Post 类型内部进行管理。状态依库用户对 Post 实例调用的方法而改变,但是不能直接管理状态变化。这也意味着用户不会在状态上犯错,比如在过审前发布博文。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 面向对象设计模式的实现","id":"337","title":"面向对象设计模式的实现"},"338":{"body":"让我们开始实现这个库吧!我们知道需要一个公有 Post 结构体来存放一些文本,所以让我们从结构体的定义和一个创建 Post 实例的公有关联函数 new 开始,如示例 17-12 所示。还需定义一个私有 trait State。 Post 将在私有字段 state 中存放一个 Option<T> 类型的 trait 对象 Box<dyn State>。稍后将会看到为何 Option<T> 是必须的。 文件名:src/lib.rs pub struct Post { state: Option<Box<dyn State>>, content: String,\n} impl Post { pub fn new() -> Post { Post { state: Some(Box::new(Draft {})), content: String::new(), } }\n} trait State {} struct Draft {} impl State for Draft {} 示例 17-12: Post 结构体的定义和新建 Post 实例的 new 函数,State trait 和结构体 Draft State trait 定义了所有不同状态的博文所共享的行为,这个状态对象是 Draft、PendingReview 和 Published,它们都会实现 State 状态。现在这个 trait 并没有任何方法,同时开始将只定义 Draft 状态因为这是我们希望博文的初始状态。 当创建新的 Post 时,我们将其 state 字段设置为一个存放了 Box 的 Some 值。这个 Box 指向一个 Draft 结构体新实例。这确保了无论何时新建一个 Post 实例,它都会从草案开始。因为 Post 的 state 字段是私有的,也就无法创建任何其他状态的 Post 了!。Post::new 函数中将 content 设置为新建的空 String。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 定义 Post 并新建一个草案状态的实例","id":"338","title":"定义 Post 并新建一个草案状态的实例"},"339":{"body":"在示例 17-11 中,展示了我们希望能够调用一个叫做 add_text 的方法并向其传递一个 &str 来将文本增加到博文的内容中。选择实现为一个方法而不是将 content 字段暴露为 pub 。这意味着之后可以实现一个方法来控制 content 字段如何被读取。add_text 方法是非常直观的,让我们在示例 17-13 的 impl Post 块中增加一个实现: 文件名:src/lib.rs # pub struct Post {\n# state: Option<Box<dyn State>>,\n# content: String,\n# }\n# impl Post { // --snip--\n# pub fn new() -> Post {\n# Post {\n# state: Some(Box::new(Draft {})),\n# content: String::new(),\n# }\n# }\n# pub fn add_text(&mut self, text: &str) { self.content.push_str(text); }\n}\n# # trait State {}\n# # struct Draft {}\n# # impl State for Draft {} 示例 17-13: 实现方法 add_text 来向博文的 content 增加文本 add_text 获取一个 self 的可变引用,因为需要改变调用 add_text 的 Post 实例。接着调用 content 中的 String 的 push_str 并传递 text 参数来保存到 content 中。这不是状态模式的一部分,因为它的行为并不依赖博文所处的状态。add_text 方法完全不与 state 状态交互,不过这是我们希望支持的行为的一部分。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 存放博文内容的文本","id":"339","title":"存放博文内容的文本"},"34":{"body":"接下来,创建一个 变量 ( variable )来储存用户输入,像这样: # use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # println!(\"Please input your guess.\");\n# let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {}\", guess);\n# } 现在程序开始变得有意思了!这一小行代码发生了很多事。我们使用 let 语句来创建变量。这里是另外一个例子: let apples = 5; 这行代码新建了一个叫做 apples 的变量并把它绑定到值 5 上。在 Rust 中,变量默认是不可变的,这意味着一旦我们给变量赋值,这个值就不再可以修改了。我们将会在第三章的 “变量与可变性” 部分详细讨论这个概念。下面的例子展示了如何在变量名前使用 mut 来使一个变量可变: let apples = 5; // 不可变\nlet mut bananas = 5; // 可变 注意:// 语法开始一个注释,持续到行尾。Rust 忽略注释中的所有内容, 第三章 将会详细介绍注释。 回到猜数字程序中。现在我们知道了 let mut guess 会引入一个叫做 guess 的可变变量。等号(=)告诉 Rust 我们现在想将某个值绑定在变量上。等号的右边是 guess 所绑定的值,它是 String::new 的结果,这个函数会返回一个 String 的新实例。 String 是一个标准库提供的字符串类型,它是 UTF-8 编码的可增长文本块。 ::new 那一行的 :: 语法表明 new 是 String 类型的一个 关联函数 ( associated function )。关联函数是针对某个类型实现的函数,在这个例子中是 String。这个 new 函数创建了一个新的空字符串。你会发现许多类型上都有一个 new 函数,因为这是为某种类型创建新值的常用函数名。 总的来说,let mut guess = String::new(); 这一行创建了一个可变变量,当前它绑定到一个新的 String 空实例上。","breadcrumbs":"写个猜数字游戏 » 使用变量储存值","id":"34","title":"使用变量储存值"},"340":{"body":"即使调用 add_text 并向博文增加一些内容之后,我们仍然希望 content 方法返回一个空字符串 slice,因为博文仍然处于草案状态,如示例 17-11 的第 8 行所示。现在让我们使用能满足要求的最简单的方式来实现 content 方法:总是返回一个空字符串 slice。当实现了将博文状态改为发布的能力之后将改变这一做法。但是目前博文只能是草案状态,这意味着其内容应该总是空的。示例 17-14 展示了这个占位符实现: 文件名:src/lib.rs # pub struct Post {\n# state: Option<Box<dyn State>>,\n# content: String,\n# }\n# impl Post { // --snip--\n# pub fn new() -> Post {\n# Post {\n# state: Some(Box::new(Draft {})),\n# content: String::new(),\n# }\n# }\n# # pub fn add_text(&mut self, text: &str) {\n# self.content.push_str(text);\n# }\n# pub fn content(&self) -> &str { \"\" }\n}\n# # trait State {}\n# # struct Draft {}\n# # impl State for Draft {} 列表 17-14: 增加一个 Post 的 content 方法的占位实现,它总是返回一个空字符串 slice 通过增加这个 content 方法,示例 17-11 中直到第 8 行的代码能如期运行。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 确保博文草案的内容是空的","id":"340","title":"确保博文草案的内容是空的"},"341":{"body":"接下来需要增加请求审核博文的功能,这应当将其状态由 Draft 改为 PendingReview。示例 17-15 展示了这个代码: 文件名:src/lib.rs # pub struct Post {\n# state: Option<Box<dyn State>>,\n# content: String,\n# }\n# impl Post { // --snip--\n# pub fn new() -> Post {\n# Post {\n# state: Some(Box::new(Draft {})),\n# content: String::new(),\n# }\n# }\n# # pub fn add_text(&mut self, text: &str) {\n# self.content.push_str(text);\n# }\n# # pub fn content(&self) -> &str {\n# \"\"\n# }\n# pub fn request_review(&mut self) { if let Some(s) = self.state.take() { self.state = Some(s.request_review()) } }\n} trait State { fn request_review(self: Box<Self>) -> Box<dyn State>;\n} struct Draft {} impl State for Draft { fn request_review(self: Box<Self>) -> Box<dyn State> { Box::new(PendingReview {}) }\n} struct PendingReview {} impl State for PendingReview { fn request_review(self: Box<Self>) -> Box<dyn State> { self }\n} 示例 17-15: 实现 Post 和 State trait 的 request_review 方法 这里为 Post 增加一个获取 self 可变引用的公有方法 request_review。接着在 Post 的当前状态下调用内部的 request_review 方法,并且第二个 request_review 方法会消费当前的状态并返回一个新状态。 这里给 State trait 增加了 request_review 方法;所有实现了这个 trait 的类型现在都需要实现 request_review 方法。注意不同于使用 self、 &self 或者 &mut self 作为方法的第一个参数,这里使用了 self: Box<Self>。这个语法意味着该方法只可在持有这个类型的 Box 上被调用。这个语法获取了 Box<Self> 的所有权使老状态无效化,以便 Post 的状态值可转换为一个新状态。 为了消费老状态,request_review 方法需要获取状态值的所有权。这就是 Post 的 state 字段中 Option 的来历:调用 take 方法将 state 字段中的 Some 值取出并留下一个 None,因为 Rust 不允许结构体实例中存在值为空的字段。这使得我们将 state 的值移出 Post 而不是借用它。接着我们将博文的 state 值设置为这个操作的结果。 我们需要将 state 临时设置为 None 来获取 state 值,即老状态的所有权,而不是使用 self.state = self.state.request_review(); 这样的代码直接更新状态值。这确保了当 Post 被转换为新状态后不能再使用老 state 值。 Draft 的 request_review 方法需要返回一个新的,装箱的 PendingReview 结构体的实例,其用来代表博文处于等待审核状态。结构体 PendingReview 同样也实现了 request_review 方法,不过它不进行任何状态转换。相反它返回自身,因为当我们请求审核一个已经处于 PendingReview 状态的博文,它应该继续保持 PendingReview 状态。 现在我们能看出状态模式的优势了:无论 state 是何值,Post 的 request_review 方法都是一样的。每个状态只负责它自己的规则。 我们将继续保持 Post 的 content 方法实现不变,返回一个空字符串 slice。现在我们可以拥有 PendingReview 状态和 Draft 状态的 Post 了,不过我们希望在 PendingReview 状态下 Post 也有相同的行为。现在示例 17-11 中直到 10 行的代码是可以执行的!","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 请求审核博文来改变其状态","id":"341","title":"请求审核博文来改变其状态"},"342":{"body":"approve 方法将与 request_review 方法类似:它会将 state 设置为审核通过时应处于的状态,如示例 17-16 所示。 文件名:src/lib.rs # pub struct Post {\n# state: Option<Box<dyn State>>,\n# content: String,\n# }\n# impl Post { // --snip--\n# pub fn new() -> Post {\n# Post {\n# state: Some(Box::new(Draft {})),\n# content: String::new(),\n# }\n# }\n# # pub fn add_text(&mut self, text: &str) {\n# self.content.push_str(text);\n# }\n# # pub fn content(&self) -> &str {\n# \"\"\n# }\n# # pub fn request_review(&mut self) {\n# if let Some(s) = self.state.take() {\n# self.state = Some(s.request_review())\n# }\n# }\n# pub fn approve(&mut self) { if let Some(s) = self.state.take() { self.state = Some(s.approve()) } }\n} trait State { fn request_review(self: Box<Self>) -> Box<dyn State>; fn approve(self: Box<Self>) -> Box<dyn State>;\n} struct Draft {} impl State for Draft { // --snip--\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# Box::new(PendingReview {})\n# }\n# fn approve(self: Box<Self>) -> Box<dyn State> { self }\n} struct PendingReview {} impl State for PendingReview { // --snip--\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# fn approve(self: Box<Self>) -> Box<dyn State> { Box::new(Published {}) }\n} struct Published {} impl State for Published { fn request_review(self: Box<Self>) -> Box<dyn State> { self } fn approve(self: Box<Self>) -> Box<dyn State> { self }\n} 示例 17-16: 为 Post 和 State trait 实现 approve 方法 这里为 State trait 增加了 approve 方法,并新增了一个实现了 State 的结构体,Published 状态。 类似于 PendingReview 中 request_review 的工作方式,如果对 Draft 调用 approve 方法,并没有任何效果,因为它会返回 self。当对 PendingReview 调用 approve 时,它返回一个新的、装箱的 Published 结构体的实例。Published 结构体实现了 State trait,同时对于 request_review 和 approve 两方法来说,它返回自身,因为在这两种情况博文应该保持 Published 状态。 现在需要更新 Post 的 content 方法。我们希望 content 根据 Post 的当前状态返回值,所以需要 Post 代理一个定义于 state 上的 content 方法,如实例 17-17 所示: 文件名:src/lib.rs # pub struct Post {\n# state: Option<Box<dyn State>>,\n# content: String,\n# }\n# impl Post { // --snip--\n# pub fn new() -> Post {\n# Post {\n# state: Some(Box::new(Draft {})),\n# content: String::new(),\n# }\n# }\n# # pub fn add_text(&mut self, text: &str) {\n# self.content.push_str(text);\n# }\n# pub fn content(&self) -> &str { self.state.as_ref().unwrap().content(self) } // --snip--\n# # pub fn request_review(&mut self) {\n# if let Some(s) = self.state.take() {\n# self.state = Some(s.request_review())\n# }\n# }\n# # pub fn approve(&mut self) {\n# if let Some(s) = self.state.take() {\n# self.state = Some(s.approve())\n# }\n# }\n}\n# # trait State {\n# fn request_review(self: Box<Self>) -> Box<dyn State>;\n# fn approve(self: Box<Self>) -> Box<dyn State>;\n# }\n# # struct Draft {}\n# # impl State for Draft {\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# Box::new(PendingReview {})\n# }\n# # fn approve(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# }\n# # struct PendingReview {}\n# # impl State for PendingReview {\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# # fn approve(self: Box<Self>) -> Box<dyn State> {\n# Box::new(Published {})\n# }\n# }\n# # struct Published {}\n# # impl State for Published {\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# # fn approve(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# } 示例 17-17: 更新 Post 的 content 方法来委托调用 State 的 content 方法 因为目标是将所有像这样的规则保持在实现了 State 的结构体中,我们将调用 state 中的值的 content 方法并传递博文实例(也就是 self)作为参数。接着返回 state 值的 content 方法的返回值。 这里调用 Option 的 as_ref 方法是因为需要 Option 中值的引用而不是获取其所有权。因为 state 是一个 Option<Box<dyn State>>,调用 as_ref 会返回一个 Option<&Box<dyn State>>。如果不调用 as_ref,将会得到一个错误,因为不能将 state 移动出借用的 &self 函数参数。 接着调用 unwrap 方法,这里我们知道它永远也不会 panic,因为 Post 的所有方法都确保在它们返回时 state 会有一个 Some 值。这就是一个第十二章 “当我们比编译器知道更多的情况” 部分讨论过的我们知道 None 是不可能的而编译器却不能理解的情况。 接着我们就有了一个 &Box<dyn State>,当调用其 content 时,Deref 强制转换会作用于 & 和 Box ,这样最终会调用实现了 State trait 的类型的 content 方法。这意味着需要为 State trait 定义增加 content,这也是放置根据所处状态返回什么内容的逻辑的地方,如示例 17-18 所示: 文件名:src/lib.rs # pub struct Post {\n# state: Option<Box<dyn State>>,\n# content: String,\n# }\n# # impl Post {\n# pub fn new() -> Post {\n# Post {\n# state: Some(Box::new(Draft {})),\n# content: String::new(),\n# }\n# }\n# # pub fn add_text(&mut self, text: &str) {\n# self.content.push_str(text);\n# }\n# # pub fn content(&self) -> &str {\n# self.state.as_ref().unwrap().content(self)\n# }\n# # pub fn request_review(&mut self) {\n# if let Some(s) = self.state.take() {\n# self.state = Some(s.request_review())\n# }\n# }\n# # pub fn approve(&mut self) {\n# if let Some(s) = self.state.take() {\n# self.state = Some(s.approve())\n# }\n# }\n# }\n# trait State { // --snip--\n# fn request_review(self: Box<Self>) -> Box<dyn State>;\n# fn approve(self: Box<Self>) -> Box<dyn State>;\n# fn content<'a>(&self, post: &'a Post) -> &'a str { \"\" }\n} // --snip--\n# # struct Draft {}\n# # impl State for Draft {\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# Box::new(PendingReview {})\n# }\n# # fn approve(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# }\n# # struct PendingReview {}\n# # impl State for PendingReview {\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# # fn approve(self: Box<Self>) -> Box<dyn State> {\n# Box::new(Published {})\n# }\n# }\n# struct Published {} impl State for Published { // --snip--\n# fn request_review(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# # fn approve(self: Box<Self>) -> Box<dyn State> {\n# self\n# }\n# fn content<'a>(&self, post: &'a Post) -> &'a str { &post.content }\n} 示例 17-18: 为 State trait 增加 content 方法 这里增加了一个 content 方法的默认实现来返回一个空字符串 slice。这意味着无需为 Draft 和 PendingReview 结构体实现 content 了。Published 结构体会覆盖 content 方法并会返回 post.content 的值。 注意这个方法需要生命周期注解,如第十章所讨论的。这里获取 post 的引用作为参数,并返回 post 一部分的引用,所以返回的引用的生命周期与 post 参数相关。 现在示例完成了 —— 现在示例 17-11 中所有的代码都能工作!我们通过发布博文工作流的规则实现了状态模式。围绕这些规则的逻辑都存在于状态对象中而不是分散在 Post 之中。 为什么不用枚举? 你可能会好奇为什么不用包含不同可能的博文状态的 enum 作为变量。这确实是一个可能的方案,尝试实现并对比最终结果来看看哪一种更适合你!使用枚举的一个缺点是每一个检查枚举值的地方都需要一个 match 表达式或类似的代码来处理所有可能的成员。这相比 trait 对象模式可能显得更重复。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 增加改变 content 行为的 approve 方法","id":"342","title":"增加改变 content 行为的 approve 方法"},"343":{"body":"我们展示了 Rust 是能够实现面向对象的状态模式的,以便能根据博文所处的状态来封装不同类型的行为。Post 的方法并不知道这些不同类型的行为。通过这种组织代码的方式,要找到所有已发布博文的不同行为只需查看一处代码:Published 的 State trait 的实现。 如果要创建一个不使用状态模式的替代实现,则可能会在 Post 的方法中,或者甚至于在 main 代码中用到 match 语句,来检查博文状态并在这里改变其行为。这意味着需要查看很多位置来理解处于发布状态的博文的所有逻辑!这在增加更多状态时会变得更糟:每一个 match 语句都会需要另一个分支。 对于状态模式来说,Post 的方法和使用 Post 的位置无需 match 语句,同时增加新状态只涉及到增加一个新 struct 和为其实现 trait 的方法。 这个实现易于扩展增加更多功能。为了体会使用此模式维护代码的简洁性,请尝试如下一些建议: 增加 reject 方法将博文的状态从 PendingReview 变回 Draft 在将状态变为 Published 之前需要两次 approve 调用 只允许博文处于 Draft 状态时增加文本内容。提示:让状态对象负责内容可能发生什么改变,但不负责修改 Post。 状态模式的一个缺点是因为状态实现了状态之间的转换,一些状态会相互联系。如果在 PendingReview 和 Published 之间增加另一个状态,比如 Scheduled,则不得不修改 PendingReview 中的代码来转移到 Scheduled。如果 PendingReview 无需因为新增的状态而改变就更好了,不过这意味着切换到另一种设计模式。 另一个缺点是我们会发现一些重复的逻辑。为了消除它们,可以尝试为 State trait 中返回 self 的 request_review 和 approve 方法增加默认实现,不过这会违反对象安全性,因为 trait 不知道 self 具体是什么。我们希望能够将 State 作为一个 trait 对象,所以需要其方法是对象安全的。 另一个重复是 Post 中 request_review 和 approve 这两个类似的实现。它们都委托调用了 state 字段中 Option 值的同一方法,并在结果中为 state 字段设置了新值。如果 Post 中的很多方法都遵循这个模式,我们可能会考虑定义一个宏来消除重复(查看第二十章的 “宏” 部分)。 完全按照面向对象语言的定义实现这个模式并没有尽可能地利用 Rust 的优势。让我们看看一些代码中可以做出的修改,来将无效的状态和状态转移变为编译时错误。 将状态和行为编码为类型 我们将展示如何稍微反思状态模式来进行一系列不同的权衡取舍。不同于完全封装状态和状态转移使得外部代码对其毫不知情,我们将状态编码进不同的类型。如此,Rust 的类型检查就会将任何在只能使用发布博文的地方使用草案博文的尝试变为编译时错误。 让我们考虑一下示例 17-11 中 main 的第一部分: 文件名:src/main.rs # use blog::Post;\n# fn main() { let mut post = Post::new(); post.add_text(\"I ate a salad for lunch today\"); assert_eq!(\"\", post.content());\n# # post.request_review();\n# assert_eq!(\"\", post.content());\n# # post.approve();\n# assert_eq!(\"I ate a salad for lunch today\", post.content());\n} 我们仍然希望能够使用 Post::new 创建一个新的草案博文,并能够增加博文的内容。不过不同于存在一个草案博文时返回空字符串的 content 方法,我们将使草案博文完全没有 content 方法。这样如果尝试获取草案博文的内容,将会得到一个方法不存在的编译错误。这使得我们不可能在生产环境意外显示出草案博文的内容,因为这样的代码甚至就不能编译。示例 17-19 展示了 Post 结构体、DraftPost 结构体以及各自的方法的定义: 文件名:src/lib.rs pub struct Post { content: String,\n} pub struct DraftPost { content: String,\n} impl Post { pub fn new() -> DraftPost { DraftPost { content: String::new(), } } pub fn content(&self) -> &str { &self.content }\n} impl DraftPost { pub fn add_text(&mut self, text: &str) { self.content.push_str(text); }\n} 示例 17-19: 带有 content 方法的 Post 和没有 content 方法的 DraftPost Post 和 DraftPost 结构体都有一个私有的 content 字段来储存博文的文本。这些结构体不再有 state 字段因为我们将状态编码改为结构体类型。Post 将代表发布的博文,它有一个返回 content 的 content 方法。 仍然有一个 Post::new 函数,不过不同于返回 Post 实例,它返回 DraftPost 的实例。现在不可能创建一个 Post 实例,因为 content 是私有的同时没有任何函数返回 Post。 DraftPost 上定义了一个 add_text 方法,这样就可以像之前那样向 content 增加文本,不过注意 DraftPost 并没有定义 content 方法!如此现在程序确保了所有博文都从草案开始,同时草案博文没有任何可供展示的内容。任何绕过这些限制的尝试都会产生编译错误。 实现状态转移为不同类型的转换 那么如何得到发布的博文呢?我们希望强制执行的规则是草案博文在可以发布之前必须被审核通过。等待审核状态的博文应该仍然不会显示任何内容。让我们通过增加另一个结构体 PendingReviewPost 来实现这个限制,在 DraftPost 上定义 request_review 方法来返回 PendingReviewPost,并在 PendingReviewPost 上定义 approve 方法来返回 Post,如示例 17-20 所示: 文件名:src/lib.rs # pub struct Post {\n# content: String,\n# }\n# # pub struct DraftPost {\n# content: String,\n# }\n# # impl Post {\n# pub fn new() -> DraftPost {\n# DraftPost {\n# content: String::new(),\n# }\n# }\n# # pub fn content(&self) -> &str {\n# &self.content\n# }\n# }\n# impl DraftPost { // --snip--\n# pub fn add_text(&mut self, text: &str) {\n# self.content.push_str(text);\n# }\n# pub fn request_review(self) -> PendingReviewPost { PendingReviewPost { content: self.content, } }\n} pub struct PendingReviewPost { content: String,\n} impl PendingReviewPost { pub fn approve(self) -> Post { Post { content: self.content, } }\n} 列表 17-20: PendingReviewPost 通过调用 DraftPost 的 request_review 创建,approve 方法将 PendingReviewPost 变为发布的 Post request_review 和 approve 方法获取 self 的所有权,因此会消费 DraftPost 和 PendingReviewPost 实例,并分别转换为 PendingReviewPost 和发布的 Post。这样在调用 request_review 之后就不会遗留任何 DraftPost 实例,后者同理。PendingReviewPost 并没有定义 content 方法,所以尝试读取其内容会导致编译错误,DraftPost 同理。因为唯一得到定义了 content 方法的 Post 实例的途径是调用 PendingReviewPost 的 approve 方法,而得到 PendingReviewPost 的唯一办法是调用 DraftPost 的 request_review 方法,现在我们就将发博文的工作流编码进了类型系统。 这也意味着不得不对 main 做出一些小的修改。因为 request_review 和 approve 返回新实例而不是修改被调用的结构体,所以我们需要增加更多的 let post = 覆盖赋值来保存返回的实例。也不再能断言草案和等待审核的博文的内容为空字符串了,我们也不再需要它们:不能编译尝试使用这些状态下博文内容的代码。更新后的 main 的代码如示例 17-21 所示: 文件名:src/main.rs use blog::Post; fn main() { let mut post = Post::new(); post.add_text(\"I ate a salad for lunch today\"); let post = post.request_review(); let post = post.approve(); assert_eq!(\"I ate a salad for lunch today\", post.content());\n} 示例 17-21: main 中使用新的博文工作流实现的修改 不得不修改 main 来重新赋值 post 使得这个实现不再完全遵守面向对象的状态模式:状态间的转换不再完全封装在 Post 实现中。然而,得益于类型系统和编译时类型检查,我们得到了的是无效状态是不可能的!这确保了某些特定的 bug,比如显示未发布博文的内容,将在部署到生产环境之前被发现。 尝试为示例 17-21 之后的 blog crate 实现这一部分开始所建议的任务来体会使用这个版本的代码是何感觉。注意在这个设计中一些需求可能已经完成了。 即便 Rust 能够实现面向对象设计模式,也有其他像将状态编码进类型这样的模式存在。这些模式有着不同的权衡取舍。虽然你可能非常熟悉面向对象模式,重新思考这些问题来利用 Rust 提供的像在编译时避免一些 bug 这样有益功能。在 Rust 中面向对象模式并不总是最好的解决方案,因为 Rust 拥有像所有权这样的面向对象语言所没有的功能。","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 状态模式的权衡取舍","id":"343","title":"状态模式的权衡取舍"},"344":{"body":"阅读本章后,不管你是否认为 Rust 是一个面向对象语言,现在你都见识了 trait 对象是一个 Rust 中获取部分面向对象功能的方法。动态分发可以通过牺牲少量运行时性能来为你的代码提供一些灵活性。这些灵活性可以用来实现有助于代码可维护性的面向对象模式。Rust 也有像所有权这样不同于面向对象语言的功能。面向对象模式并不总是利用 Rust 优势的最好方式,但也是可用的选项。 接下来,让我们看看另一个提供了多样灵活性的 Rust 功能:模式。贯穿全书的模式,我们已经和它们打过照面了,但并没有见识过它们的全部本领。让我们开始探索吧!","breadcrumbs":"Rust 的面向对象编程特性 » 面向对象设计模式的实现 » 总结","id":"344","title":"总结"},"345":{"body":"ch19-00-patterns.md commit 6fce661a0938aa0da06526e7b8f98fd7e67a222f 模式 ( Patterns )是 Rust 中特殊的语法,它用来匹配类型中的结构,无论类型是简单还是复杂。结合使用模式和 match 表达式以及其他结构可以提供更多对程序控制流的支配权。模式由如下一些内容组合而成: 字面值 解构的数组、枚举、结构体或者元组 变量 通配符 占位符 一些模式的例子包括x, (a, 3) 和 Some(Color::Red)。在模式为有效的上下文中,这些部分描述了数据的形状。接着可以用其匹配值来决定程序是否拥有正确的数据来运行特定部分的代码。 我们通过将一些值与模式相比较来使用它。如果模式匹配这些值,我们对值部分进行相应处理。回忆一下第六章讨论 match 表达式时像硬币分类器那样使用模式。如果数据符合这个形状,就可以使用这些命名的片段。如果不符合,与该模式相关的代码则不会运行。 本章是所有模式相关内容的参考。我们将涉及到使用模式的有效位置, refutable 与 irrefutable 模式的区别,和你可能会见到的不同类型的模式语法。在最后,你将会看到如何使用模式创建强大而简洁的代码。","breadcrumbs":"模式与模式匹配 » 模式与模式匹配","id":"345","title":"模式与模式匹配"},"346":{"body":"ch19-01-all-the-places-for-patterns.md commit 0c2d41e2afce734825c3a12087d423e8c2f0ae53 模式出现在 Rust 的很多地方。你已经在不经意间使用了很多模式!本部分是一个所有有效模式位置的参考。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » 所有可能会用到模式的位置","id":"346","title":"所有可能会用到模式的位置"},"347":{"body":"如第六章所讨论的,一个模式常用的位置是 match 表达式的分支。在形式上 match 表达式由 match 关键字、用于匹配的值和一个或多个分支构成,这些分支包含一个模式和在值匹配分支的模式时运行的表达式: match VALUE { PATTERN => EXPRESSION, PATTERN => EXPRESSION, PATTERN => EXPRESSION,\n} 例如这是一个来自示例 6-5 中匹配变量 x 中 Option<i32> 值的 match 表达式: match x { None => None, Some(i) => Some(i + 1),\n} 这个 match 表达式中的模式为每个箭头左边的 None 和 Some(i)。 match 表达式必须是 穷尽 ( exhaustive )的,意为 match 表达式所有可能的值都必须被考虑到。一个确保覆盖每个可能值的方法是在最后一个分支使用捕获所有的模式:比如,一个匹配任何值的名称永远也不会失败,因此可以覆盖所有匹配剩下的情况。 有一个特定的模式 _ 可以匹配所有情况,不过它从不绑定任何变量。这在例如希望忽略任何未指定值的情况很有用。本章之后的 “忽略模式中的值” 部分会详细介绍 _ 模式的更多细节。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » match 分支","id":"347","title":"match 分支"},"348":{"body":"第六章讨论过了 if let 表达式,以及它是如何主要用于编写等同于只关心一个情况的 match 语句简写的。if let 可以对应一个可选的带有代码的 else 在 if let 中的模式不匹配时运行。 示例 19-1 展示了也可以组合并匹配 if let、else if 和 else if let 表达式。这相比 match 表达式一次只能将一个值与模式比较提供了更多灵活性。并且 Rust 并不要求一系列 if let、else if、else if let 分支的条件相互关联。 示例 19-1 中的代码展示了一系列针对不同条件的检查来决定背景颜色应该是什么。为了达到这个例子的目的,我们创建了硬编码值的变量,在真实程序中则可能由询问用户获得。 文件名:src/main.rs fn main() { let favorite_color: Option<&str> = None; let is_tuesday = false; let age: Result<u8, _> = \"34\".parse(); if let Some(color) = favorite_color { println!(\"Using your favorite color, {color}, as the background\"); } else if is_tuesday { println!(\"Tuesday is green day!\"); } else if let Ok(age) = age { if age > 30 { println!(\"Using purple as the background color\"); } else { println!(\"Using orange as the background color\"); } } else { println!(\"Using blue as the background color\"); }\n} 示例 19-1: 结合 if let、else if、else if let 以及 else 如果用户指定了中意的颜色,将使用其作为背景颜色。如果没有指定中意的颜色且今天是星期二,背景颜色将是绿色。如果用户指定了他们的年龄字符串并能够成功将其解析为数字的话,我们将根据这个数字使用紫色或者橙色。最后,如果没有一个条件符合,背景颜色将是蓝色。 这个条件结构允许我们支持复杂的需求。使用这里硬编码的值,例子会打印出 Using purple as the background color。 注意 if let 也可以像 match 分支那样引入覆盖变量:if let Ok(age) = age 引入了一个新的覆盖变量 age,它包含 Ok 成员中的值。这意味着 if age > 30 条件需要位于这个代码块内部;不能将两个条件组合为 if let Ok(age) = age && age > 30,因为我们希望与 30 进行比较的被覆盖的 age 直到大括号开始的新作用域才是有效的。 if let 表达式的缺点在于其穷尽性没有为编译器所检查,而 match 表达式则检查了。如果去掉最后的 else 块而遗漏处理一些情况,编译器也不会警告这类可能的逻辑错误。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » if let 条件表达式","id":"348","title":"if let 条件表达式"},"349":{"body":"一个与 if let 结构类似的是 while let 条件循环,它允许只要模式匹配就一直进行 while 循环。我们在第十七章第一次见到 while let 循环,当时我们使用它在流还在产生新值的时候保持循环。同理在示例 19-2 展示了一个 while let 循环等待跨线程发送的消息,不过在这个示例中它检查一个 Result 而不是 Option。 # fn main() { let (tx, rx) = std::sync::mpsc::channel(); std::thread::spawn(move || { for val in [1, 2, 3] { tx.send(val).unwrap(); } }); while let Ok(value) = rx.recv() { println!(\"{value}\"); }\n# } 示例 19-2: 使用 while let 循环只要 rx.recv() 返回 Ok 就打印出其值 这个例子会打印出 1、2 和 3。当在第十六章遇到 recv 时,我们直接 unwrap 了错误,或者使用 for 循环将其视为迭代器处理。不过如示例 19-2 所示,我们也可以使用 while let,因为 recv 方法只要发送端持续产生消息它就一直返回 Ok,并在发送端断开连接后产生一个 Err。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » while let 条件循环","id":"349","title":"while let 条件循环"},"35":{"body":"回忆一下,我们在程序的第一行使用 use std::io; 从标准库中引入了输入/输出功能。现在调用 io 库中的函数 stdin,这允许我们处理用户输入: # use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# io::stdin() .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # println!(\"You guessed: {}\", guess);\n# } 如果程序的开头没有使用 use std::io; 引入 io 库,我们仍可以通过把函数调用写成 std::io::stdin 来使用该函数。stdin 函数返回一个 std::io::Stdin 的实例,这是一种代表终端标准输入句柄的类型。 接下来,代码中的 .read_line(&mut guess) 调用了标准输入句柄上的 read_line 方法,以获取用户输入。我们还将 &mut guess 作为参数传递给 read_line 函数,让其将用户输入储存到这个字符串中。read_line 的工作是,无论用户在标准输入中键入什么内容,都将其追加(不会覆盖其原有内容)到一个字符串中,因此它需要字符串作为参数。这个字符串参数应该是可变的,以便 read_line 将用户输入附加上去。 & 表示这个参数是一个 引用 ( reference ),它允许多处代码访问同一处数据,而无需在内存中多次拷贝。引用是一个复杂的特性,Rust 的一个主要优势就是安全而简单的操纵引用。完成当前程序并不需要了解如此多细节。现在,我们只需知道它像变量一样,默认是不可变的。因此,需要写成 &mut guess 来使其可变,而不是 &guess。(第四章会更全面的解释引用。)","breadcrumbs":"写个猜数字游戏 » 接收用户输入","id":"35","title":"接收用户输入"},"350":{"body":"在 for 循环中,模式是 for 关键字直接跟随的值,正如 for x in y 中的 x。示例 19-3 中展示了如何使用 for 循环来解构,或拆开一个元组作为 for 循环的一部分: # fn main() { let v = vec!['a', 'b', 'c']; for (index, value) in v.iter().enumerate() { println!(\"{value} is at index {index}\"); }\n# } 列表 19-3: 在 for 循环中使用模式来解构元组 示例 19-3 的代码会打印出: $ cargo run Compiling patterns v0.1.0 (file:///projects/patterns) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.52s Running `target/debug/patterns`\na is at index 0\nb is at index 1\nc is at index 2 这里使用 enumerate 方法适配一个迭代器来产生一个值和其在迭代器中的索引,它们位于一个元组中。第一个产生的值是元组 (0, 'a')。当这个值匹配模式 (index, value),index 将会是 0 而 value 将会是 'a',并打印出第一行输出。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » for 循环","id":"350","title":"for 循环"},"351":{"body":"在本章之前,我们只明确的讨论过通过 match 和 if let 使用模式,不过事实上也在别的地方使用过模式,包括 let 语句。例如,考虑一下这个直白的 let 变量赋值: let x = 5; 不过你可能没有发觉,每一次像这样使用 let 语句就是在使用模式!let 语句更为正式的样子如下: let PATTERN = EXPRESSION; 像 let x = 5; 这样的语句中变量名位于 PATTERN 位置,变量名不过是形式特别朴素的模式。我们将表达式与模式比较,并为任何找到的名称赋值。所以例如 let x = 5; 的情况,x 是一个代表 “将匹配到的值绑定到变量 x” 的模式。同时因为名称 x 是整个模式,这个模式实际上等于 “将任何值绑定到变量 x,不管值是什么”。 为了更清楚的理解 let 的模式匹配方面的内容,考虑示例 19-4 中使用 let 和模式解构一个元组: # fn main() { let (x, y, z) = (1, 2, 3);\n# } 示例 19-4: 使用模式解构元组并一次创建三个变量 这里将一个元组与模式匹配。Rust 会比较值 (1, 2, 3) 与模式 (x, y, z) 并发现此值匹配这个模式。在这个例子中,将会把 1 绑定到 x,2 绑定到 y 并将 3 绑定到 z。你可以将这个元组模式看作是将三个独立的变量模式结合在一起。 如果模式中元素的数量不匹配元组中元素的数量,则整个类型不匹配,并会得到一个编译时错误。例如,示例 19-5 展示了尝试用两个变量解构三个元素的元组,这是不行的: # fn main() { let (x, y) = (1, 2, 3);\n# } 示例 19-5: 一个错误的模式结构,其中变量的数量不符合元组中元素的数量 尝试编译这段代码会给出如下类型错误: $ cargo run Compiling patterns v0.1.0 (file:///projects/patterns)\nerror[E0308]: mismatched types --> src/main.rs:2:9 |\n2 | let (x, y) = (1, 2, 3); | ^^^^^^ --------- this expression has type `({integer}, {integer}, {integer})` | | | expected a tuple with 3 elements, found one with 2 elements | = note: expected tuple `({integer}, {integer}, {integer})` found tuple `(_, _)` For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `patterns` (bin \"patterns\") due to 1 previous error 为了修复这个错误,可以使用 _ 或 .. 来忽略元组中一个或多个值,如 “忽略模式中的值” 部分所示。如果问题是模式中有太多的变量,则解决方法是通过去掉变量使得变量数与元组中元素数相等。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » let 语句","id":"351","title":"let 语句"},"352":{"body":"函数参数也可以是模式。列表 19-6 中的代码声明了一个叫做 foo 的函数,它获取一个 i32 类型的参数 x,现在这看起来应该很熟悉: fn foo(x: i32) { // code goes here\n}\n# # fn main() {} 列表 19-6: 在参数中使用模式的函数签名 x 部分就是一个模式!类似于之前对 let 所做的,可以在函数参数中匹配元组。列表 19-7 将传递给函数的元组拆分为值: 文件名:src/main.rs fn print_coordinates(&(x, y): &(i32, i32)) { println!(\"Current location: ({x}, {y})\");\n} fn main() { let point = (3, 5); print_coordinates(&point);\n} 列表 19-7: 一个在参数中解构元组的函数 这会打印出 Current location: (3, 5)。值 &(3, 5) 会匹配模式 &(x, y),如此 x 得到了值 3,而 y得到了值 5。 因为如第十三章所讲闭包类似于函数,也可以在闭包参数列表中使用模式。 现在我们见过了很多使用模式的方式了,不过模式在每个使用它的地方并不以相同的方式工作;在一些地方,模式必须是 irrefutable 的,意味着它们必须匹配所提供的任何值。在另一些情况,它们则可以是 refutable 的。接下来让我们讨论这两个概念。","breadcrumbs":"模式与模式匹配 » 所有可能会用到模式的位置 » 函数参数","id":"352","title":"函数参数"},"353":{"body":"ch19-02-refutability.md commit 0c2d41e2afce734825c3a12087d423e8c2f0ae53 模式有两种形式:refutable(可反驳的)和 irrefutable(不可反驳的)。能匹配任何传递的可能值的模式被称为是 不可反驳的 ( irrefutable )。一个例子就是 let x = 5; 语句中的 x,因为 x 可以匹配任何值所以不可能会失败。对某些可能的值进行匹配会失败的模式被称为是 可反驳的 ( refutable )。一个这样的例子便是 if let Some(x) = a_value 表达式中的 Some(x);如果变量 a_value 中的值是 None 而不是 Some,那么 Some(x) 模式不能匹配。 函数参数、let 语句和 for 循环只能接受不可反驳的模式,因为当值不匹配时,程序无法进行有意义的操作。if let 和 while let 表达式可以接受可反驳和不可反驳的模式,但编译器会对不可反驳的模式发出警告,因为根据定义它们旨在处理可能的失败:条件表达式的功能在于它能够根据成功或失败来执行不同的操作。 通常我们无需担心可反驳和不可反驳模式的区别,不过确实需要熟悉可反驳性的概念,这样当在错误信息中看到时就知道如何应对。遇到这些情况,根据代码行为的意图,需要修改模式或者使用模式的结构。 让我们看看一个尝试在 Rust 要求不可反驳模式的地方使用可反驳模式以及相反情况的例子。在示例 18-8 中,有一个 let 语句,不过模式被指定为可反驳模式 Some(x)。如你所见,这不能编译: # fn main() {\n# let some_option_value: Option<i32> = None; let Some(x) = some_option_value;\n# } 示例 18-8: 尝试在 let 中使用可反驳模式 如果 some_option_value 的值是 None,其不会成功匹配模式 Some(x),表明这个模式是可反驳的。然而,因为 let 对于 None 匹配不能产生任何合法的代码,所以 let 语句只能接受不可反驳模式。Rust 会在编译时抱怨我们尝试在要求不可反驳模式的地方使用可反驳模式: $ cargo run Compiling patterns v0.1.0 (file:///projects/patterns)\nerror[E0005]: refutable pattern in local binding --> src/main.rs:3:9 |\n3 | let Some(x) = some_option_value; | ^^^^^^^ pattern `None` not covered | = note: `let` bindings require an \"irrefutable pattern\", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch19-02-refutability.html = note: the matched value is of type `Option<i32>`\nhelp: you might want to use `let else` to handle the variant that isn't matched |\n3 | let Some(x) = some_option_value else { todo!() }; | ++++++++++++++++ For more information about this error, try `rustc --explain E0005`.\nerror: could not compile `patterns` (bin \"patterns\") due to 1 previous error 因为我们没有覆盖(也不可能覆盖!)到模式 Some(x) 的每一个可能的值,所以 Rust 会合理地抗议。 为了修复在需要不可反驳模式的地方使用可反驳模式的情况,可以修改使用模式的代码:不同于使用 let,可以使用 if let。如此,如果模式不匹配,大括号中的代码将被忽略,其余代码保持有效。示例 18-9 展示了如何修复示例 18-8 中的代码。 # fn main() {\n# let some_option_value: Option<i32> = None; if let Some(x) = some_option_value { println!(\"{x}\"); }\n# } 示例 18-9: 使用 if let 和一个带有可反驳模式的代码块来代替 let 我们给了代码一个得以继续的出路!虽然我们没办法在避免产生错误的情况下使用不可反驳模式,但这段使用可反驳模式的代码是完全有效的。如果为 if let 提供了一个总是会匹配的模式,比如示例 18-10 中的 x,编译器会给出一个警告: # fn main() { if let x = 5 { println!(\"{x}\"); };\n# } 示例 18-10: 尝试把不可反驳模式用到 if let 上 Rust 会抱怨将不可反驳模式用于 if let 是没有意义的: $ cargo run Compiling patterns v0.1.0 (file:///projects/patterns)\nwarning: irrefutable `if let` pattern --> src/main.rs:2:8 |\n2 | if let x = 5 { | ^^^^^^^^^ | = note: this pattern will always match, so the `if let` is useless = help: consider replacing the `if let` with a `let` = note: `#[warn(irrefutable_let_patterns)]` on by default warning: `patterns` (bin \"patterns\") generated 1 warning Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.39s Running `target/debug/patterns`\n5 基于此,match匹配分支必须使用可反驳模式,除了最后一个分支需要使用能匹配任何剩余值的不可反驳模式。Rust 允许我们在只有一个匹配分支的match中使用不可反驳模式,不过这么做不是特别有用,并可以被更简单的 let 语句替代。 目前我们已经讨论了所有可以使用模式的地方,以及可反驳模式与不可反驳模式的区别,下面让我们一起去把可以用来创建模式的语法过目一遍吧。","breadcrumbs":"模式与模式匹配 » Refutability(可反驳性): 模式是否会匹配失效 » Refutability(可反驳性): 模式是否会匹配失效","id":"353","title":"Refutability(可反驳性): 模式是否会匹配失效"},"354":{"body":"ch19-03-pattern-syntax.md commit 6fce661a0938aa0da06526e7b8f98fd7e67a222f 在本节中,我们收集了模式中所有有效的语法,并讨论为什么以及何时你可能要使用这些语法。","breadcrumbs":"模式与模式匹配 » 模式语法 » 所有的模式语法","id":"354","title":"所有的模式语法"},"355":{"body":"如第六章所示,可以直接匹配字面值模式。如下代码给出了一些例子: # fn main() { let x = 1; match x { 1 => println!(\"one\"), 2 => println!(\"two\"), 3 => println!(\"three\"), _ => println!(\"anything\"), }\n# } 这段代码会打印 one 因为 x 的值是 1。如果希望代码获得特定的具体值,则该语法很有用。","breadcrumbs":"模式与模式匹配 » 模式语法 » 匹配字面值","id":"355","title":"匹配字面值"},"356":{"body":"命名变量是匹配任何值的不可反驳模式,这在之前已经使用过数次。然而当其用于 match 表达式时情况会有些复杂。因为 match 会开始一个新作用域,match 表达式中作为模式的一部分声明的变量会覆盖 match 结构之外的同名变量,与所有变量一样。在示例 18-11 中,声明了一个值为 Some(5) 的变量 x 和一个值为 10 的变量 y。接着在值 x 上创建了一个 match 表达式。观察匹配分支中的模式和结尾的 println!,并在运行此代码或进一步阅读之前推断这段代码会打印什么。 文件名:src/main.rs # fn main() { let x = Some(5); let y = 10; match x { Some(50) => println!(\"Got 50\"), Some(y) => println!(\"Matched, y = {y}\"), _ => println!(\"Default case, x = {x:?}\"), } println!(\"at the end: x = {x:?}, y = {y}\");\n# } 示例 18-11: 一个 match 语句其中一个分支引入了覆盖变量 y 让我们看看当 match 语句运行的时候发生了什么。第一个匹配分支的模式并不匹配 x 中定义的值,所以代码继续执行。 第二个匹配分支中的模式引入了一个新变量 y,它会匹配任何 Some 中的值。因为我们在 match 表达式的新作用域中,这是一个新变量,而不是开头声明为值 10 的那个 y。这个新的 y 绑定会匹配任何 Some 中的值,在这里是 x 中的值。因此这个 y 绑定了 x 中 Some 内部的值。这个值是 5,所以这个分支的表达式将会执行并打印出 Matched, y = 5。 如果 x 的值是 None 而不是 Some(5),头两个分支的模式不会匹配,所以会匹配下划线。这个分支的模式中没有引入变量 x,所以此时表达式中的 x 会是外部没有被覆盖的 x。在这个假想的例子中,match 将会打印 Default case, x = None。 一旦 match 表达式执行完毕,其作用域也就结束了,同理内部 y 的作用域也结束了。最后的 println! 会打印 at the end: x = Some(5), y = 10。 为了创建能够比较外部 x 和 y 的值,而不引入覆盖变量的 match 表达式,我们需要相应地使用带有条件的匹配守卫(match guard)。我们稍后将在 “匹配守卫提供的额外条件” 这一小节讨论匹配守卫。","breadcrumbs":"模式与模式匹配 » 模式语法 » 匹配命名变量","id":"356","title":"匹配命名变量"},"357":{"body":"在 match 表达式中,可以使用 | 语法匹配多个模式,它代表 或 ( or )运算符模式。例如,如下代码将 x 的值与匹配分支相比较,第一个分支有 或 选项,意味着如果 x 的值匹配此分支的任一个值,它就会运行: # fn main() { let x = 1; match x { 1 | 2 => println!(\"one or two\"), 3 => println!(\"three\"), _ => println!(\"anything\"), }\n# } 上面的代码会打印 one or two。","breadcrumbs":"模式与模式匹配 » 模式语法 » 多个模式","id":"357","title":"多个模式"},"358":{"body":"..= 语法允许你匹配一个闭区间范围内的值。在如下代码中,当模式匹配任何在给定范围内的值时,该分支会执行: # fn main() { let x = 5; match x { 1..=5 => println!(\"one through five\"), _ => println!(\"something else\"), }\n# } 如果 x 是 1、2、3、4 或 5,第一个分支就会匹配。这个语法在匹配多个值时相比使用 | 运算符来表达相同的意思更为方便;如果使用 | 则不得不指定 1 | 2 | 3 | 4 | 5。相反指定范围就简短的多,特别是在希望匹配比如从 1 到 1000 的数字的时候! 编译器会在编译时检查范围不为空,而 char 和数字值是 Rust 仅有的可以判断范围是否为空的类型,所以范围只允许用于数字或 char 值。 如下是一个使用 char 类型值范围的例子: # fn main() { let x = 'c'; match x { 'a'..='j' => println!(\"early ASCII letter\"), 'k'..='z' => println!(\"late ASCII letter\"), _ => println!(\"something else\"), }\n# } Rust 知道 'c' 位于第一个模式的范围内,并会打印出 early ASCII letter。","breadcrumbs":"模式与模式匹配 » 模式语法 » 通过 ..= 匹配值的范围","id":"358","title":"通过 ..= 匹配值的范围"},"359":{"body":"也可以使用模式来解构结构体、枚举和元组,以便使用这些值的不同部分。让我们来分别看一看。 解构结构体 示例 18-12 展示带有两个字段 x 和 y 的结构体 Point,可以通过带有模式的 let 语句将其分解: 文件名:src/main.rs struct Point { x: i32, y: i32,\n} fn main() { let p = Point { x: 0, y: 7 }; let Point { x: a, y: b } = p; assert_eq!(0, a); assert_eq!(7, b);\n} 示例 18-12: 解构一个结构体的字段为单独的变量 这段代码创建了变量 a 和 b 来匹配结构体 p 中的 x 和 y 字段。这个例子展示了模式中的变量名不必与结构体中的字段名一致。不过通常希望变量名与字段名一致以便于理解变量来自于哪些字段。因为变量名匹配字段名是常见的,同时因为 let Point { x: x, y: y } = p; 包含了很多重复,所以对于匹配结构体字段的模式存在简写:只需列出结构体字段的名称,则模式创建的变量会有相同的名称。示例 18-13 展示了与示例 18-12 有着相同行为的代码,不过 let 模式创建的变量为 x 和 y 而不是 a 和 b: 文件名:src/main.rs struct Point { x: i32, y: i32,\n} fn main() { let p = Point { x: 0, y: 7 }; let Point { x, y } = p; assert_eq!(0, x); assert_eq!(7, y);\n} 示例 18-13: 使用结构体字段简写来解构结构体字段 这段代码创建了变量 x 和 y,与变量 p 中的 x 和 y 相匹配。其结果是变量 x 和 y 包含结构体 p 中的值。 也可以使用字面值作为结构体模式的一部分进行解构,而不是为所有的字段创建变量。这允许我们测试一些字段为特定值的同时创建其他字段的变量。 示例 18-14 展示了一个 match 语句将 Point 值分成了三种情况:直接位于 x 轴上(此时 y = 0 为真)、位于 y 轴上(x = 0)或不在任何轴上的点。 文件名:src/main.rs # struct Point {\n# x: i32,\n# y: i32,\n# }\n# fn main() { let p = Point { x: 0, y: 7 }; match p { Point { x, y: 0 } => println!(\"On the x axis at {x}\"), Point { x: 0, y } => println!(\"On the y axis at {y}\"), Point { x, y } => { println!(\"On neither axis: ({x}, {y})\"); } }\n} 示例 18-14: 解构和匹配模式中的字面值 第一个分支通过指定字段 y 匹配字面值 0 来匹配任何位于 x 轴上的点。此模式仍然创建了变量 x 以便在分支的代码中使用。 类似的,第二个分支通过指定字段 x 匹配字面值 0 来匹配任何位于 y 轴上的点,并为字段 y 创建了变量 y。第三个分支没有指定任何字面值,所以其会匹配任何其他的 Point 并为 x 和 y 两个字段创建变量。 在这个例子中,值 p 因为其 x 包含 0 而匹配第二个分支,因此会打印出 On the y axis at 7。 记住 match 表达式一旦找到一个匹配的模式就会停止检查其它分支,所以即使 Point { x: 0, y: 0} 在 x 轴上也在 y 轴上,这些代码也只会打印 On the x axis at 0。 解构枚举 本书之前曾经解构过枚举(例如第六章示例 6-5),不过当时没有明确提到解构枚举的模式需要对应枚举所定义的储存数据的方式。让我们以示例 6-2 中的 Message 枚举为例,编写一个 match 使用模式解构每一个内部值,如示例 18-15 所示: 文件名:src/main.rs enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(i32, i32, i32),\n} fn main() { let msg = Message::ChangeColor(0, 160, 255); match msg { Message::Quit => { println!(\"The Quit variant has no data to destructure.\"); } Message::Move { x, y } => { println!(\"Move in the x direction {x} and in the y direction {y}\"); } Message::Write(text) => { println!(\"Text message: {text}\"); } Message::ChangeColor(r, g, b) => { println!(\"Change the color to red {r}, green {g}, and blue {b}\") } }\n} 示例 18-15: 解构包含不同类型值成员的枚举 这段代码会打印出 Change the color to red 0, green 160, and blue 255。尝试改变 msg 的值来观察其他分支代码的运行。 对于像 Message::Quit 这样没有任何数据的枚举成员,不能进一步解构其值。只能匹配其字面值 Message::Quit,因此模式中没有任何变量。 对于像 Message::Move 这样的类结构体枚举成员,可以采用类似于匹配结构体的模式。在成员名称后,使用大括号并列出字段变量以便将其分解以供此分支的代码使用。这里使用了示例 18-13 所展示的简写。 对于像 Message::Write 这样的包含一个元素,以及像 Message::ChangeColor 这样包含三个元素的类元组枚举成员,其模式则类似于用于解构元组的模式。模式中变量的数量必须与成员中元素的数量一致。 解构嵌套的结构体和枚举 目前为止,所有的例子都只匹配了深度为一级的结构体或枚举,不过当然也可以匹配嵌套的项!例如,我们可以重构列表 18-15 的代码在 ChangeColor 消息中同时支持 RGB 和 HSV 色彩模式,如示例 18-16 所示: enum Color { Rgb(i32, i32, i32), Hsv(i32, i32, i32),\n} enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(Color),\n} fn main() { let msg = Message::ChangeColor(Color::Hsv(0, 160, 255)); match msg { Message::ChangeColor(Color::Rgb(r, g, b)) => { println!(\"Change color to red {r}, green {g}, and blue {b}\"); } Message::ChangeColor(Color::Hsv(h, s, v)) => { println!(\"Change color to hue {h}, saturation {s}, value {v}\") } _ => (), }\n} 示例 18-16: 匹配嵌套的枚举 match 表达式第一个分支的模式匹配一个包含 Color::Rgb 枚举成员的 Message::ChangeColor 枚举成员,然后模式绑定了 3 个内部的 i32 值。第二个分支的模式也匹配一个 Message::ChangeColor 枚举成员,但是其内部的枚举会匹配 Color::Hsv 枚举成员。我们可以在一个 match 表达式中指定这些复杂条件,即使会涉及到两个枚举。 解构结构体和元组 甚至可以用复杂的方式来混合、匹配和嵌套解构模式。如下是一个复杂结构体的例子,其中结构体和元组嵌套在元组中,并将所有的原始类型解构出来: # fn main() {\n# struct Point {\n# x: i32,\n# y: i32,\n# }\n# let ((feet, inches), Point { x, y }) = ((3, 10), Point { x: 3, y: -10 });\n# } 这将复杂的类型分解成部分组件以便可以单独使用我们感兴趣的值。 通过模式解构是一个方便利用部分值片段的手段,比如结构体中每个单独字段的值。","breadcrumbs":"模式与模式匹配 » 模式语法 » 解构并分解值","id":"359","title":"解构并分解值"},"36":{"body":"我们还没有完全分析完这行代码。虽然我们已经讲到了第三行代码,但要注意:它仍是逻辑行(虽然换行了但仍是语句)的一部分。后一部分是这个方法(method): # use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess) .expect(\"Failed to read line\");\n# # println!(\"You guessed: {}\", guess);\n# } 我们也可以将代码这样写: io::stdin().read_line(&mut guess).expect(\"Failed to read line\"); 不过,过长的代码行难以阅读,所以最好拆开来写。通常来说,当使用 .method_name() 语法调用方法时引入换行符和空格将长的代码行拆开是明智的。现在来看看这行代码干了什么。 之前提到了 read_line 会将用户输入附加到传递给它的字符串中,不过它也会返回一个类型为 Result 的值。 Result 是一种 枚举类型 ,通常也写作 enum 。枚举类型变量的值可以是多种可能状态中的一个。我们把每种可能的状态称为一种 枚举成员(variant) 。 第六章 将介绍枚举的更多细节。这里的 Result 类型将用来编码错误处理的信息。 Result 的成员是 Ok 和 Err,Ok 成员表示操作成功,内部包含成功时产生的值。Err 成员则意味着操作失败,并且 Err 中包含有关操作失败的原因或方式的信息。 这些 Result 类型的作用是编码错误处理信息。Result 类型的值,像其他类型一样,拥有定义于其上的方法。Result 的实例拥有 expect 方法 。如果 io::Result 实例的值是 Err,expect 会导致程序崩溃,并显示当做参数传递给 expect 的信息。如果 read_line 方法返回 Err,则可能是来源于底层操作系统错误的结果。如果 Result 实例的值是 Ok,expect 会获取 Ok 中的值并原样返回。在本例中,这个值是用户输入到标准输入中的字节数。 如果不调用 expect,程序也能编译,不过会出现一个警告: $ cargo build Compiling guessing_game v0.1.0 (file:///projects/guessing_game)\nwarning: unused `Result` that must be used --> src/main.rs:10:5 |\n10 | io::stdin().read_line(&mut guess); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: this `Result` may be an `Err` variant, which should be handled = note: `#[warn(unused_must_use)]` on by default\nhelp: use `let _ = ...` to ignore the resulting value |\n10 | let _ = io::stdin().read_line(&mut guess); | +++++++ warning: `guessing_game` (bin \"guessing_game\") generated 1 warning Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.59s Rust 警告我们没有使用 read_line 的返回值 Result,说明有一个可能的错误没有处理。 消除警告的正确做法是实际去编写错误处理代码,不过由于我们就是希望程序在出现问题时立即崩溃,所以直接使用 expect。 第九章 会学习如何从错误中恢复。","breadcrumbs":"写个猜数字游戏 » 使用 Result 类型来处理潜在的错误","id":"36","title":"使用 Result 类型来处理潜在的错误"},"360":{"body":"有时忽略模式中的一些值是有用的,比如 match 中最后捕获全部情况的分支实际上没有做任何事,但是它确实对所有剩余情况负责。有一些简单的方法可以忽略模式中全部或部分值:使用 _ 模式(我们已经见过了),在另一个模式中使用 _ 模式,使用一个以下划线开始的名称,或者使用 .. 忽略所剩部分的值。让我们来分别探索如何以及为什么要这么做。 使用 _ 忽略整个值 我们已经使用过下划线作为匹配但不绑定任何值的通配符模式了。虽然这作为 match 表达式最后的分支特别有用,也可以将其用于任意模式,包括函数参数中,如示例 18-17 所示: 文件名:src/main.rs fn foo(_: i32, y: i32) { println!(\"This code only uses the y parameter: {y}\");\n} fn main() { foo(3, 4);\n} 示例 18-17: 在函数签名中使用 _ 这段代码会完全忽略作为第一个参数传递的值 3,并会打印出 This code only uses the y parameter: 4。 大部分情况当你不再需要特定函数参数时,最好修改签名不再包含无用的参数。在一些情况下忽略函数参数会变得特别有用,比如实现 trait 时,当你需要特定类型签名但是函数实现并不需要某个参数时。这样可以避免一个存在未使用的函数参数的编译警告,就跟使用命名参数一样。 使用嵌套的 _ 忽略部分值 也可以在一个模式内部使用_ 忽略部分值,例如,当只需要测试部分值但在期望运行的代码中没有用到其他部分时。示例 18-18 展示了负责管理设置值的代码。业务需求是用户不允许覆盖现有的自定义设置,但是可以取消设置,也可以在当前未设置时为其提供设置。 # fn main() { let mut setting_value = Some(5); let new_setting_value = Some(10); match (setting_value, new_setting_value) { (Some(_), Some(_)) => { println!(\"Can't overwrite an existing customized value\"); } _ => { setting_value = new_setting_value; } } println!(\"setting is {setting_value:?}\");\n# } 示例 18-18: 当不需要 Some 中的值时在模式内使用下划线来匹配 Some 成员 这段代码会打印出 Can't overwrite an existing customized value 接着是 setting is Some(5)。在第一个匹配分支,我们不需要匹配或使用任一个 Some 成员中的值;重要的部分是需要测试 setting_value 和 new_setting_value 都为 Some 成员的情况。在这种情况,我们打印出为何不改变 setting_value,并且不会改变它。 对于所有其他情况(setting_value 或 new_setting_value 任一为 None),这由第二个分支的 _ 模式体现,这时确实希望允许 new_setting_value 变为 setting_value。 也可以在一个模式中的多处使用下划线来忽略特定值,如示例 18-19 所示,这里忽略了一个五元元组中的第二和第四个值: # fn main() { let numbers = (2, 4, 8, 16, 32); match numbers { (first, _, third, _, fifth) => { println!(\"Some numbers: {first}, {third}, {fifth}\") } }\n# } 示例 18-19: 忽略元组的多个部分 这会打印出 Some numbers: 2, 8, 32,值 4 和 16 会被忽略。 通过在名字前以一个 _ 开头来忽略未使用的变量 如果你创建了一个变量却不在任何地方使用它,Rust 通常会给你一个警告,因为未使用的变量可能会是个 bug。但是有时创建一个还未使用的变量是有用的,比如你正在设计原型或刚刚开始一个项目。这时你希望告诉 Rust 不要警告未使用的变量,为此可以用下划线作为变量名的开头。示例 18-20 中创建了两个未使用变量,不过当编译代码时只会得到其中一个的警告: 文件名:src/main.rs fn main() { let _x = 5; let y = 10;\n} 示例 18-20: 以下划线开始变量名以便去掉未使用变量警告 这里得到了警告说未使用变量 y,不过没有警告说使用 _x。 注意,只使用 _ 和使用以下划线开头的名称有些微妙的不同:比如 _x 仍会将值绑定到变量,而 _ 则完全不会绑定。为了展示这个区别的意义,示例 18-21 会产生一个错误。 # fn main() { let s = Some(String::from(\"Hello!\")); if let Some(_s) = s { println!(\"found a string\"); } println!(\"{s:?}\");\n# } 示例 18-21: 以下划线开头的未使用变量仍然会绑定值,它可能会获取值的所有权 我们会得到一个错误,因为 s 的值仍然会移动进 _s,并阻止我们再次使用 s。然而只使用下划线本身,并不会绑定值。示例 18-22 能够无错编译,因为 s 没有被移动进 _: # fn main() { let s = Some(String::from(\"Hello!\")); if let Some(_) = s { println!(\"found a string\"); } println!(\"{s:?}\");\n# } 示例 18-22: 单独使用下划线不会绑定值 上面的代码能很好的运行;因为没有把 s 绑定到任何变量;它没有被移动。 用 .. 忽略剩余值 对于有多个部分的值,可以使用 .. 语法来只使用特定部分并忽略其它值,同时避免不得不每一个忽略值列出下划线。.. 模式会忽略模式中剩余的任何没有显式匹配的值部分。在示例 18-23 中,有一个 Point 结构体存放了三维空间中的坐标。在 match 表达式中,我们希望只操作 x 坐标并忽略 y 和 z 字段的值: # fn main() { struct Point { x: i32, y: i32, z: i32, } let origin = Point { x: 0, y: 0, z: 0 }; match origin { Point { x, .. } => println!(\"x is {x}\"), }\n# } 示例 18-23: 通过使用 .. 来忽略 Point 中除 x 以外的字段 这里列出了 x 值,接着仅仅包含了 .. 模式。这比不得不列出 y: _ 和 z: _ 要来得简单,特别是在处理有很多字段的结构体,但只涉及一到两个字段时的情形。 .. 会扩展为所需要的值的数量。示例 18-24 展示了元组中 .. 的应用: 文件名:src/main.rs fn main() { let numbers = (2, 4, 8, 16, 32); match numbers { (first, .., last) => { println!(\"Some numbers: {first}, {last}\"); } }\n} 示例 18-24: 只匹配元组中的第一个和最后一个值并忽略掉所有其它值 这里用 first 和 last 来匹配第一个和最后一个值。.. 将匹配并忽略中间的所有值。 然而使用 .. 必须是无歧义的。如果期望匹配和忽略的值是不明确的,Rust 会报错。示例 18-25 展示了一个带有歧义的 .. 例子,因此其不能编译: 文件名:src/main.rs fn main() { let numbers = (2, 4, 8, 16, 32); match numbers { (.., second, ..) => { println!(\"Some numbers: {second}\") }, }\n} 示例 18-25: 尝试以有歧义的方式运用 .. 如果编译上面的例子,会得到下面的错误: $ cargo run Compiling patterns v0.1.0 (file:///projects/patterns)\nerror: `..` can only be used once per tuple pattern --> src/main.rs:5:22 |\n5 | (.., second, ..) => { | -- ^^ can only be used once per tuple pattern | | | previously used here error: could not compile `patterns` (bin \"patterns\") due to 1 previous error Rust 不可能决定在元组中匹配 second 值之前应该忽略多少个值,以及在之后忽略多少个值。这段代码可能表明我们意在忽略 2,绑定 second 为 4,接着忽略 8、16 和 32;抑或是意在忽略 2 和 4,绑定 second 为 8,接着忽略 16 和 32,以此类推。变量名 second 对于 Rust 来说并没有任何特殊意义,所以会得到编译错误,因为在这两个地方使用 .. 是有歧义的。","breadcrumbs":"模式与模式匹配 » 模式语法 » 忽略模式中的值","id":"360","title":"忽略模式中的值"},"361":{"body":"匹配守卫 ( match guard )是一个指定于 match 分支模式之后的额外 if 条件,它也必须被满足才能选择此分支。匹配守卫用于表达比单独的模式所能允许的更为复杂的情况。 这个条件可以使用模式中创建的变量。示例 18-26 展示了一个 match,其中第一个分支有模式 Some(x) 还有匹配守卫 if x % 2 == 0 (当 x 是偶数的时候为真): # fn main() { let num = Some(4); match num { Some(x) if x % 2 == 0 => println!(\"The number {x} is even\"), Some(x) => println!(\"The number {x} is odd\"), None => (), }\n# } 示例 18-26: 在模式中加入匹配守卫 上例会打印出 The number 4 is even。当 num 与模式中第一个分支比较时,因为 Some(4) 匹配 Some(x) 所以可以匹配。接着匹配守卫检查 x 除以 2 的余数是否等于 0,因为它等于 0,所以第一个分支被选择。 相反如果 num 为 Some(5),因为 5 除以 2 的余数是 1 不等于 0 所以第一个分支的匹配守卫为假。接着 Rust 会前往第二个分支,这次匹配因为它没有匹配守卫所以会匹配任何 Some 成员。 无法在模式中表达类似 if x % 2 == 0 的条件,所以通过匹配守卫提供了表达类似逻辑的能力。这种替代表达方式的缺点是,编译器不会尝试为包含匹配守卫的模式检查穷尽性。 在示例 18-11 中,我们提到可以使用匹配守卫来解决模式中变量覆盖的问题,那里 match 表达式的模式中新建了一个变量而不是使用 match 之外的同名变量。新变量意味着不能够测试外部变量的值。示例 18-27 展示了如何使用匹配守卫修复这个问题。 文件名:src/main.rs fn main() { let x = Some(5); let y = 10; match x { Some(50) => println!(\"Got 50\"), Some(n) if n == y => println!(\"Matched, n = {n}\"), _ => println!(\"Default case, x = {x:?}\"), } println!(\"at the end: x = {x:?}, y = {y}\");\n} 示例 18-27: 使用匹配守卫来测试与外部变量的相等性 现在这会打印出 Default case, x = Some(5)。现在第二个匹配分支中的模式不会引入一个覆盖外部 y 的新变量 y,这意味着可以在匹配守卫中使用外部的 y。相比指定会覆盖外部 y 的模式 Some(y),这里指定为 Some(n)。此新建的变量 n 并没有覆盖任何值,因为 match 外部没有变量 n。 匹配守卫 if n == y 并不是一个模式所以没有引入新变量。这个 y 正是 外部的 y 而不是新的覆盖变量 y,这样就可以通过比较 n 和 y 来表达寻找一个与外部 y 相同的值的概念了。 也可以在匹配守卫中使用 或 运算符 | 来指定多个模式,同时匹配守卫的条件会作用于所有的模式。示例 18-28 展示了结合匹配守卫与使用了 | 的模式的优先级。这个例子中重要的部分是匹配守卫 if y 作用于 4、5 和 6,即使这看起来好像 if y 只作用于 6: # fn main() { let x = 4; let y = false; match x { 4 | 5 | 6 if y => println!(\"yes\"), _ => println!(\"no\"), }\n# } 示例 18-28: 结合多个模式与匹配守卫 这个匹配条件表明此分支值匹配 x 值为 4、5 或 6 同时 y 为 true 的情况。运行这段代码时会发生的是第一个分支的模式因 x 为 4 而匹配,不过匹配守卫 if y 为假,所以第一个分支不会被选择。代码移动到第二个分支,这会匹配,此程序会打印出 no。这是因为 if 条件作用于整个 4 | 5 | 6 模式,而不仅是最后的值 6。换句话说,匹配守卫与模式的优先级关系看起来像这样: (4 | 5 | 6) if y => ... 而不是: 4 | 5 | (6 if y) => ... 可以通过运行代码时的情况看出这一点:如果匹配守卫只作用于由 | 运算符指定的值列表的最后一个值,这个分支就会匹配且程序会打印出 yes。","breadcrumbs":"模式与模式匹配 » 模式语法 » 匹配守卫提供的额外条件","id":"361","title":"匹配守卫提供的额外条件"},"362":{"body":"at 运算符(@)允许我们在创建一个存放值的变量的同时测试其值是否匹配模式。示例 18-29 展示了一个例子,这里我们希望测试 Message::Hello 的 id 字段是否位于 3..=7 范围内,同时也希望能将其值绑定到 id_variable 变量中以便此分支相关联的代码可以使用它。可以将 id_variable 命名为 id,与字段同名,不过出于示例的目的这里选择了不同的名称。 # fn main() { enum Message { Hello { id: i32 }, } let msg = Message::Hello { id: 5 }; match msg { Message::Hello { id: id_variable @ 3..=7, } => println!(\"Found an id in range: {id_variable}\"), Message::Hello { id: 10..=12 } => { println!(\"Found an id in another range\") } Message::Hello { id } => println!(\"Found some other id: {id}\"), }\n# } 示例 18-29: 使用 @ 在模式中绑定值的同时测试它 上例会打印出 Found an id in range: 5。通过在 3..=7 之前指定 id_variable @,我们捕获了任何匹配此范围的值并同时测试其值匹配这个范围模式。 第二个分支只在模式中指定了一个范围,分支相关代码没有一个包含 id 字段实际值的变量。id 字段的值可以是 10、11 或 12,不过这个模式的代码并不知情也不能使用 id 字段中的值,因为没有将 id 值保存进一个变量。 最后一个分支指定了一个没有范围的变量,此时确实拥有可以用于分支代码的变量 id,因为这里使用了结构体字段简写语法。不过此分支中没有像头两个分支那样对 id 字段的值进行测试:任何值都会匹配此分支。 使用 @ 可以在一个模式中同时测试和保存变量值。","breadcrumbs":"模式与模式匹配 » 模式语法 » @ 绑定","id":"362","title":"@ 绑定"},"363":{"body":"模式是 Rust 中一个很有用的功能,它有助于我们区分不同类型的数据。当用于 match 语句时,Rust 确保模式会包含每一个可能的值,否则程序将不能编译。let 语句和函数参数的模式使得这些结构更强大,可以在将值解构为更小部分的同时为变量赋值。可以创建简单或复杂的模式来满足我们的要求。 接下来,在本书倒数第二章中,我们将介绍一些 Rust 众多功能中较为高级的部分。","breadcrumbs":"模式与模式匹配 » 模式语法 » 总结","id":"363","title":"总结"},"364":{"body":"ch20-00-advanced-features.md commit a8536189d5f1ba2f0b1187bfae787c0d89e2871c 现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十一章开始另一个新项目之前,让我们聊聊一些总有一天你会遇上的部分内容。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下很有用处。虽然很少会碰到它们,我们希望确保你了解 Rust 提供的所有功能。 本章将涉及如下内容: 不安全 Rust:用于当需要舍弃 Rust 的某些保证并负责手动维持这些保证 高级 trait:与 trait 相关的关联类型,默认类型参数,完全限定语法(fully qualified syntax),超(父)trait(supertraits)和 newtype 模式 高级类型:关于 newtype 模式的更多内容,类型别名,never 类型和动态大小类型 高级函数和闭包:函数指针和返回闭包 宏:定义在编译时定义更多代码的方式 对所有人而言,这都是一个介绍 Rust 迷人特性的宝典!让我们翻开它吧!","breadcrumbs":"高级特征 » 高级特征","id":"364","title":"高级特征"},"365":{"body":"ch20-01-unsafe-rust.md commit 057b0d338229b87d06be772346ea0b643bdecdc5 目前为止讨论过的代码都有 Rust 在编译时会强制执行的内存安全保证。然而,Rust 还隐藏有第二种语言,它不会强制执行这类内存安全保证:这被称为 不安全 Rust ( unsafe Rust )。它与常规 Rust 代码无异,但是会提供额外的超能力。 尽管代码可能没问题,但如果 Rust 编译器没有足够的信息可以确定,它将拒绝代码。 不安全 Rust 之所以存在,是因为静态分析本质上是保守的。当编译器尝试确定一段代码是否支持某个保证时,拒绝一些合法的程序比接受无效的程序要好一些。这必然意味着有时代码 可能 是合法的,但如果 Rust 编译器没有足够的信息来确定,它将拒绝该代码。在这种情况下,可以使用不安全代码告诉编译器,“相信我,我知道我在干什么。” 不过千万注意,使用不安全 Rust 风险自担:如果不安全代码出错了,比如解引用空指针,可能会导致不安全的内存使用。 另一个 Rust 存在不安全一面的原因是:底层计算机硬件固有的不安全性。如果 Rust 不允许进行不安全操作,那么有些任务则根本完成不了。Rust 需要能够进行像直接与操作系统交互,甚至于编写你自己的操作系统这样的底层系统编程!这也是 Rust 语言的目标之一。让我们看看不安全 Rust 能做什么,和怎么做。","breadcrumbs":"高级特征 » 不安全的 Rust » 不安全 Rust","id":"365","title":"不安全 Rust"},"366":{"body":"可以通过 unsafe 关键字来切换到不安全 Rust,接着可以开启一个新的存放不安全代码的块。这里有五类可以在不安全 Rust 中进行而不能用于安全 Rust 的操作,它们称之为 “不安全的超能力。( unsafe superpowers )” 这些超能力是: 解引用裸指针 调用不安全的函数或方法 访问或修改可变静态变量 实现不安全 trait 访问 union 的字段 有一点很重要,unsafe 并不会关闭借用检查器或禁用任何其他 Rust 安全检查:如果在不安全代码中使用引用,它仍会被检查。unsafe 关键字只是提供了那五个不会被编译器检查内存安全的功能。你仍然能在不安全块中获得某种程度的安全。 再者,unsafe 不意味着块中的代码就一定是危险的或者必然导致内存安全问题:其意图在于作为程序员你将会确保 unsafe 块中的代码以有效的方式访问内存。 人是会犯错误的,错误总会发生,不过通过要求这五类操作必须位于标记为 unsafe 的块中,就能够知道任何与内存安全相关的错误必定位于 unsafe 块内。保持 unsafe 块尽可能小,如此当之后调查内存 bug 时就会感谢你自己了。 为了尽可能隔离不安全代码,将不安全代码封装进一个安全的抽象并提供安全 API 是一个好主意,当我们学习不安全函数和方法时会讨论到。标准库的一部分被实现为在被评审过的不安全代码之上的安全抽象。这个技术防止了 unsafe 泄露到所有你或者用户希望使用由 unsafe 代码实现的功能的地方,因为使用其安全抽象是安全的。 让我们按顺序依次介绍上述五个超能力,同时我们会看到一些提供不安全代码的安全接口的抽象。","breadcrumbs":"高级特征 » 不安全的 Rust » 不安全的超能力","id":"366","title":"不安全的超能力"},"367":{"body":"回到第四章的 “悬垂引用” 部分,那里提到了编译器会确保引用总是有效的。不安全 Rust 有两个被称为 裸指针 ( raw pointers )的类似于引用的新类型。和引用一样,裸指针是不可变或可变的,分别写作 *const T 和 *mut T。这里的星号不是解引用运算符;它是类型名称的一部分。在裸指针的上下文中, 不可变 意味着指针解引用之后不能直接赋值。 裸指针与引用和智能指针的区别在于 允许忽略借用规则,可以同时拥有不可变和可变的指针,或多个指向相同位置的可变指针 不保证指向有效的内存 允许为空 不能实现任何自动清理功能 通过去掉 Rust 强加的保证,你可以放弃安全保证以换取性能或使用另一个语言或硬件接口的能力,此时 Rust 的保证并不适用。 示例 19-1 展示了如何从引用同时创建不可变和可变裸指针。 # fn main() { let mut num = 5; let r1 = &num as *const i32; let r2 = &mut num as *mut i32;\n# } 示例 19-1: 通过引用创建裸指针 注意这里没有引入 unsafe 关键字。可以在安全代码中 创建 裸指针,只是不能在不安全块之外 解引用 裸指针,稍后便会看到。 这里使用 as 将不可变和可变引用强转为对应的裸指针类型。因为直接从保证安全的引用来创建它们,可以知道这些特定的裸指针是有效,但是不能对任何裸指针做出如此假设。 作为展示接下来会创建一个不能确定其有效性的裸指针,示例 19-2 展示了如何创建一个指向任意内存地址的裸指针。尝试使用任意内存是未定义行为:此地址可能有数据也可能没有,编译器可能会优化掉这个内存访问,或者程序可能会出现段错误(segmentation fault)。通常没有好的理由编写这样的代码,不过却是可行的: # fn main() { let address = 0x012345usize; let r = address as *const i32;\n# } 示例 19-2: 创建指向任意内存地址的裸指针 记得我们说过可以在安全代码中创建裸指针,不过不能 解引用 裸指针和读取其指向的数据。现在我们要做的就是对裸指针使用解引用运算符 *,这需要一个 unsafe 块,如示例 19-3 所示: # fn main() { let mut num = 5; let r1 = &num as *const i32; let r2 = &mut num as *mut i32; unsafe { println!(\"r1 is: {}\", *r1); println!(\"r2 is: {}\", *r2); }\n# } 示例 19-3: 在 unsafe 块中解引用裸指针 创建一个指针不会造成任何危险;只有当访问其指向的值时才有可能遇到无效的值。 还需注意示例 19-1 和 19-3 中创建了同时指向相同内存位置 num 的裸指针 *const i32 和 *mut i32。相反如果尝试同时创建 num 的不可变和可变引用,将无法通过编译,因为 Rust 的所有权规则不允许在拥有任何不可变引用的同时再创建一个可变引用。通过裸指针,就能够同时创建同一地址的可变指针和不可变指针,若通过可变指针修改数据,则可能潜在造成数据竞争。请多加小心! 既然存在这么多的危险,为何还要使用裸指针呢?一个主要的应用场景便是调用 C 代码接口,这在下一部分 “调用不安全函数或方法” 中会讲到。另一个场景是构建借用检查器无法理解的安全抽象。让我们先介绍不安全函数,接着看一看使用不安全代码的安全抽象的例子。","breadcrumbs":"高级特征 » 不安全的 Rust » 解引用裸指针","id":"367","title":"解引用裸指针"},"368":{"body":"第二类可以在不安全块中进行的操作是调用不安全函数。不安全函数和方法与常规函数方法十分类似,除了其开头有一个额外的 unsafe。在此上下文中,关键字unsafe表示该函数具有调用时需要满足的要求,而 Rust 不会保证满足这些要求。通过在 unsafe 块中调用不安全函数,表明我们已经阅读过此函数的文档并对其是否满足函数自身的契约负责。 如下是一个没有做任何操作的不安全函数 dangerous 的例子: # fn main() { unsafe fn dangerous() {} unsafe { dangerous(); }\n# } 必须在一个单独的 unsafe 块中调用 dangerous 函数。如果尝试不使用 unsafe 块调用 dangerous,则会得到一个错误: $ cargo run Compiling unsafe-example v0.1.0 (file:///projects/unsafe-example)\nerror[E0133]: call to unsafe function `dangerous` is unsafe and requires unsafe function or block --> src/main.rs:4:5 |\n4 | dangerous(); | ^^^^^^^^^^^ call to unsafe function | = note: consult the function's documentation for information on how to avoid undefined behavior For more information about this error, try `rustc --explain E0133`.\nerror: could not compile `unsafe-example` (bin \"unsafe-example\") due to 1 previous error 通过 unsafe 块,我们向 Rust 保证了我们已经阅读过函数的文档,理解如何正确使用,并验证过其满足函数的契约。 不安全函数体也是有效的 unsafe 块,所以在不安全函数中进行另一个不安全操作时无需新增额外的 unsafe 块。 创建不安全代码的安全抽象 仅仅因为函数包含不安全代码并不意味着整个函数都需要标记为不安全的。事实上,将不安全代码封装进安全函数是一个常见的抽象。作为一个例子,了解一下标准库中的函数 split_at_mut,它需要一些不安全代码,让我们探索如何可以实现它。这个安全函数定义于可变 slice 之上:它获取一个 slice 并从给定的索引参数开始将其分为两个 slice。split_at_mut 的用法如示例 19-4 所示: # fn main() { let mut v = vec![1, 2, 3, 4, 5, 6]; let r = &mut v[..]; let (a, b) = r.split_at_mut(3); assert_eq!(a, &mut [1, 2, 3]); assert_eq!(b, &mut [4, 5, 6]);\n# } 示例 19-4: 使用安全的 split_at_mut 函数 这个函数无法只通过安全 Rust 实现。一个尝试可能看起来像示例 19-5,它不能编译。出于简单考虑,我们将 split_at_mut 实现为函数而不是方法,并只处理 i32 值而非泛型 T 的 slice。 fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) { let len = values.len(); assert!(mid <= len); (&mut values[..mid], &mut values[mid..])\n}\n# # fn main() {\n# let mut vector = vec![1, 2, 3, 4, 5, 6];\n# let (left, right) = split_at_mut(&mut vector, 3);\n# } 示例 19-5: 尝试只使用安全 Rust 来实现 split_at_mut 此函数首先获取 slice 的长度,然后通过检查参数是否小于或等于这个长度来断言参数所给定的索引位于 slice 当中。该断言意味着如果传入的索引比要分割的 slice 的索引更大,此函数在尝试使用这个索引前 panic。 之后我们在一个元组中返回两个可变的 slice:一个从原始 slice 的开头直到 mid 索引,另一个从 mid 直到原 slice 的结尾。 如果尝试编译示例 19-5 的代码,会得到一个错误: $ cargo run Compiling unsafe-example v0.1.0 (file:///projects/unsafe-example)\nerror[E0499]: cannot borrow `*values` as mutable more than once at a time --> src/main.rs:6:31 |\n1 | fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) { | - let's call the lifetime of this reference `'1`\n...\n6 | (&mut values[..mid], &mut values[mid..]) | --------------------------^^^^^^-------- | | | | | | | second mutable borrow occurs here | | first mutable borrow occurs here | returning this value requires that `*values` is borrowed for `'1` | = help: use `.split_at_mut(position)` to obtain two mutable non-overlapping sub-slices For more information about this error, try `rustc --explain E0499`.\nerror: could not compile `unsafe-example` (bin \"unsafe-example\") due to 1 previous error Rust 的借用检查器不能理解我们要借用这个 slice 的两个不同部分:它只知道我们借用了同一个 slice 两次。本质上借用 slice 的不同部分是可以的,因为结果两个 slice 不会重叠,不过 Rust 还没有智能到能够理解这些。当我们知道某些事是可以的而 Rust 不知道的时候,就是触及不安全代码的时候了 示例 19-6 展示了如何使用 unsafe 块,裸指针和一些不安全函数调用来实现 split_at_mut: use std::slice; fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) { let len = values.len(); let ptr = values.as_mut_ptr(); assert!(mid <= len); unsafe { ( slice::from_raw_parts_mut(ptr, mid), slice::from_raw_parts_mut(ptr.add(mid), len - mid), ) }\n}\n# # fn main() {\n# let mut vector = vec![1, 2, 3, 4, 5, 6];\n# let (left, right) = split_at_mut(&mut vector, 3);\n# } 示例 19-6: 在 split_at_mut 函数的实现中使用不安全代码 回忆第四章的 “Slice 类型” 部分,slice 是一个指向一些数据的指针,并带有该 slice 的长度。可以使用 len 方法获取 slice 的长度,使用 as_mut_ptr 方法访问 slice 的裸指针。在这个例子中,因为有一个 i32 值的可变 slice,as_mut_ptr 返回一个 *mut i32 类型的裸指针,储存在 ptr 变量中。 我们保持索引 mid 位于 slice 中的断言。接着是不安全代码:slice::from_raw_parts_mut 函数获取一个裸指针和一个长度来创建一个 slice。这里使用此函数从 ptr 中创建了一个有 mid 个项的 slice。之后在 ptr 上调用 add 方法并使用 mid 作为参数来获取一个从 mid 开始的裸指针,使用这个裸指针并以 mid 之后项的数量为长度创建一个 slice。 slice::from_raw_parts_mut 函数是不安全的因为它获取一个裸指针,并必须确信这个指针是有效的。裸指针上的 add 方法也是不安全的,因为其必须确信此地址偏移量也是有效的指针。因此必须将 slice::from_raw_parts_mut 和 add 放入 unsafe 块中以便能调用它们。通过观察代码,和增加 mid 必然小于等于 len 的断言,我们可以说 unsafe 块中所有的裸指针将是有效的 slice 中数据的指针。这是一个可以接受的 unsafe 的恰当用法。 注意无需将 split_at_mut 函数的结果标记为 unsafe,并可以在安全 Rust 中调用此函数。我们创建了一个不安全代码的安全抽象,其代码以一种安全的方式使用了 unsafe 代码,因为其只从这个函数访问的数据中创建了有效的指针。 与此相对,示例 19-7 中的 slice::from_raw_parts_mut 在使用 slice 时很有可能会崩溃。这段代码获取任意内存地址并创建了一个长为一万的 slice: # fn main() { use std::slice; let address = 0x01234usize; let r = address as *mut i32; let values: &[i32] = unsafe { slice::from_raw_parts_mut(r, 10000) };\n# } 示例 19-7: 通过任意内存地址创建 slice 我们并不拥有这个任意地址的内存,也不能保证这段代码创建的 slice 包含有效的 i32 值。试图使用臆测为有效的 values 会导致未定义的行为。 使用 extern 函数调用外部代码 有时你的 Rust 代码可能需要与其他语言编写的代码交互。为此 Rust 有一个关键字,extern,有助于创建和使用 外部函数接口 ( Foreign Function Interface ,FFI)。外部函数接口是一个编程语言用以定义函数的方式,其允许不同(外部)编程语言调用这些函数。 示例 19-8 展示了如何集成 C 标准库中的 abs 函数。extern 块中声明的函数在 Rust 代码中总是不安全的。因为其他语言不会强制执行 Rust 的规则且 Rust 无法检查它们,所以确保其安全是程序员的责任: 文件名:src/main.rs extern \"C\" { fn abs(input: i32) -> i32;\n} fn main() { unsafe { println!(\"Absolute value of -3 according to C: {}\", abs(-3)); }\n} 示例 19-8: 声明并调用另一个语言中定义的 extern 函数 在 extern \"C\" 块中,列出了我们希望能够调用的另一个语言中的外部函数的签名和名称。\"C\" 部分定义了外部函数所使用的 应用二进制接口 ( application binary interface ,ABI) —— ABI 定义了如何在汇编语言层面调用此函数。\"C\" ABI 是最常见的,并遵循 C 编程语言的 ABI。 从其它语言调用 Rust 函数 也可以使用 extern 来创建一个允许其他语言调用 Rust 函数的接口。不同于创建整个 extern 块,就在 fn 关键字之前增加 extern 关键字并为相关函数指定所用到的 ABI。还需增加 #[no_mangle] 注解来告诉 Rust 编译器不要 mangle 此函数的名称。 Mangling 发生于当编译器将我们指定的函数名修改为不同的名称时,这会增加用于其他编译过程的额外信息,不过会使其名称更难以阅读。每一个编程语言的编译器都会以稍微不同的方式 mangle 函数名,所以为了使 Rust 函数能在其他语言中指定,必须禁用 Rust 编译器的 name mangling。 在如下的例子中,一旦其编译为动态库并从 C 语言中链接,call_from_c 函数就能够在 C 代码中访问: #[no_mangle]\npub extern \"C\" fn call_from_c() { println!(\"Just called a Rust function from C!\");\n} extern 的使用无需 unsafe。","breadcrumbs":"高级特征 » 不安全的 Rust » 调用不安全函数或方法","id":"368","title":"调用不安全函数或方法"},"369":{"body":"目前为止全书都尽量避免讨论 全局变量 ( global variables ),Rust 确实支持它们,不过这对于 Rust 的所有权规则来说是有问题的。如果有两个线程访问相同的可变全局变量,则可能会造成数据竞争。 全局变量在 Rust 中被称为 静态 ( static )变量。示例 19-9 展示了一个拥有字符串 slice 值的静态变量的声明和应用: 文件名:src/main.rs static HELLO_WORLD: &str = \"Hello, world!\"; fn main() { println!(\"name is: {HELLO_WORLD}\");\n} 示例 19-9: 定义和使用一个不可变静态变量 静态(static)变量类似于第三章 “变量和常量的区别” 部分讨论的常量。通常静态变量的名称采用 SCREAMING_SNAKE_CASE 写法。静态变量只能储存拥有 'static 生命周期的引用,这意味着 Rust 编译器可以自己计算出其生命周期而无需显式标注。访问不可变静态变量是安全的。 常量与不可变静态变量的一个微妙的区别是静态变量中的值有一个固定的内存地址。使用这个值总是会访问相同的地址。另一方面,常量则允许在任何被用到的时候复制其数据。另一个区别在于静态变量可以是可变的。访问和修改可变静态变量都是 不安全 的。示例 19-10 展示了如何声明、访问和修改名为 COUNTER 的可变静态变量: 文件名:src/main.rs static mut COUNTER: u32 = 0; fn add_to_count(inc: u32) { unsafe { COUNTER += inc; }\n} fn main() { add_to_count(3); unsafe { println!(\"COUNTER: {COUNTER}\"); }\n} 示例 19-10: 读取或修改一个可变静态变量是不安全的 就像常规变量一样,我们使用 mut 关键来指定可变性。任何读写 COUNTER 的代码都必须位于 unsafe 块中。这段代码可以编译并如期打印出 COUNTER: 3,因为这是单线程的。拥有多个线程访问 COUNTER 则可能导致数据竞争。 拥有可以全局访问的可变数据,难以保证不存在数据竞争,这就是为何 Rust 认为可变静态变量是不安全的。任何可能的情况,请优先使用第十六章讨论的并发技术和线程安全智能指针,这样编译器就能检测不同线程间的数据访问是否是安全的。","breadcrumbs":"高级特征 » 不安全的 Rust » 访问或修改可变静态变量","id":"369","title":"访问或修改可变静态变量"},"37":{"body":"除了位于结尾的右花括号,目前为止就只有这一行代码值得讨论一下了,就是这一行: # use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# println!(\"You guessed: {}\", guess);\n# } 这行代码现在打印了存储用户输入的字符串。{} 这对大括号是一个占位符:把 {} 想象成小蟹钳,可以夹住合适的值。当打印变量的值时,变量名可以写进大括号中。当打印表达式的执行结果时,格式化字符串(format string)中大括号中留空,格式化字符串后跟逗号分隔的需要打印的表达式列表,其顺序与每一个空大括号占位符的顺序一致。在一个 println! 调用中打印变量和表达式的值看起来像这样: let x = 5;\nlet y = 10; println!(\"x = {x} and y + 2 = {}\", y + 2); 这行代码会打印出 x = 5 and y + 2 = 12。","breadcrumbs":"写个猜数字游戏 » 使用 println! 占位符打印值","id":"37","title":"使用 println! 占位符打印值"},"370":{"body":"unsafe 的另一个操作用例是实现不安全 trait。当 trait 中至少有一个方法中包含编译器无法验证的不变式(invariant)时 trait 是不安全的。可以在 trait 之前增加 unsafe 关键字将 trait 声明为 unsafe,同时 trait 的实现也必须标记为 unsafe,如示例 19-11 所示: unsafe trait Foo { // methods go here\n} unsafe impl Foo for i32 { // method implementations go here\n} fn main() {} 示例 19-11: 定义并实现不安全 trait 通过 unsafe impl,我们承诺将保证编译器所不能验证的不变量。 作为一个例子,回忆第十六章 “使用 Sync 和 Send trait 的可扩展并发” 部分中的 Sync 和 Send 标记 trait,编译器会自动为完全由 Send 和 Sync 类型组成的类型自动实现它们。如果实现了一个包含一些不是 Send 或 Sync 的类型,比如裸指针,并希望将此类型标记为 Send 或 Sync,则必须使用 unsafe。Rust 不能验证我们的类型保证可以安全的跨线程发送或在多线程间访问,所以需要我们自己进行检查并通过 unsafe 表明。","breadcrumbs":"高级特征 » 不安全的 Rust » 实现不安全 trait","id":"370","title":"实现不安全 trait"},"371":{"body":"仅适用于 unsafe 的最后一个操作是访问 联合体 中的字段,union 和 struct 类似,但是在一个实例中同时只能使用一个声明的字段。联合体主要用于和 C 代码中的联合体交互。访问联合体的字段是不安全的,因为 Rust 无法保证当前存储在联合体实例中数据的类型。可以查看 参考 Rust 文档 了解有关联合体的更多信息。","breadcrumbs":"高级特征 » 不安全的 Rust » 访问联合体中的字段","id":"371","title":"访问联合体中的字段"},"372":{"body":"使用 unsafe 来进行这五个操作(超能力)之一是没有问题的,甚至是不需要深思熟虑的,不过使得 unsafe 代码正确也实属不易,因为编译器不能帮助保证内存安全。当有理由使用 unsafe 代码时,是可以这么做的,通过使用显式的 unsafe 标注可以更容易地在错误发生时追踪问题的源头。","breadcrumbs":"高级特征 » 不安全的 Rust » 何时使用不安全代码","id":"372","title":"何时使用不安全代码"},"373":{"body":"ch20-03-advanced-traits.md commit 95e931170404cb98d476b19017cbbdbc00d0834d 第十章 “trait:定义共同行为” 部分,我们第一次涉及到了 trait,不过我们并没有覆盖一些较为高级的细节。现在我们更加了解 Rust 了,可以深入理解其本质了。","breadcrumbs":"高级特征 » 高级 trait » 高级 trait","id":"373","title":"高级 trait"},"374":{"body":"关联类型 ( associated types )让我们可以在 trait 里面增加一个待定义的类型(类型占位符),将类型占位符与 trait 相关联,这样 trait 的方法签名中就可以使用这些占位符类型。trait 的实现者在实现这个 trait 的时候,会指定一个具体类型,来替换掉这个占位符。这样,我们可以在一个 trait 中通过占位符使用不同类型,在实现此 trait 时才需要指定这些类型具体是什么。 我们之前提到,本章所描述的大部分内容都较少使用。关联类型则比较适中;它们比本书其他的内容要少见,不过比本章中的很多内容要更常见。 一个带有关联类型的 trait 的例子是标准库提供的 Iterator trait。它有一个叫做 Item 的关联类型来替代遍历的值的类型。Iterator trait 的定义如示例 19-12 所示: pub trait Iterator { type Item; fn next(&mut self) -> Option<Self::Item>;\n} 示例 19-12: Iterator trait 的定义中带有关联类型 Item Item 是一个占位符类型,同时 next 方法的定义表明它返回 Option<Self::Item> 类型的值。这个 trait 的实现者会指定 Item 的具体类型,无论实现者指定何种类型,next 方法都会返回一个包含了此具体类型值的 Option。 关联类型看起来有点像泛型:后者允许定义一个函数时,暂不指定其可以处理的类型。为了体现这两者的区别,请看下面的例子。 这个例子为 Counter 结构体实现了 Iterator trait,其中指定 Item 的类型为 u32: 文件名:src/lib.rs # struct Counter {\n# count: u32,\n# }\n# # impl Counter {\n# fn new() -> Counter {\n# Counter { count: 0 }\n# }\n# }\n# impl Iterator for Counter { type Item = u32; fn next(&mut self) -> Option<Self::Item> { // --snip--\n# if self.count < 5 {\n# self.count += 1;\n# Some(self.count)\n# } else {\n# None\n# }\n# }\n# } 这个语法类似于泛型。那么为什么 Iterator trait 不像下面示例 19-13 那样,使用泛型来定义呢? pub trait Iterator<T> { fn next(&mut self) -> Option<T>;\n} 示例 19-13: 一个使用泛型的 Iterator trait 假想定义 区别在于当如示例 19-13 那样使用泛型时,则不得不在每一个实现中标注类型。这是因为我们也可以实现为 Iterator<String> for Counter,或任何其他类型,这样就可以有多个 Counter 的 Iterator 的实现。换句话说,当 trait 有泛型参数时,可以多次实现这个 trait,每次需改变泛型参数的具体类型。接着当使用 Counter 的 next 方法时,必须提供类型注解来表明希望使用 Iterator 的哪一个实现。 有了关联类型,在实现时就无需标注类型,因为不能多次实现这个 trait。对于示例 19-12 使用关联类型的定义,我们只能选择一次 Item 会是什么类型,因为只能有一个 impl Iterator for Counter。当调用 Counter 的 next 时不必每次指定我们需要 u32 值的迭代器。 关联类型也会成为 trait 契约的一部分:trait 的实现必须提供一个类型来替代关联类型占位符。关联类型通常以它的用途来命名,并且我们最好在 API 文档中为关联类型编写文档。","breadcrumbs":"高级特征 » 高级 trait » 关联类型在 trait 定义中指定占位符类型","id":"374","title":"关联类型在 trait 定义中指定占位符类型"},"375":{"body":"当使用泛型类型参数时,可以为泛型指定一个默认的具体类型。如果默认类型就足够的话,这消除了为具体类型实现 trait 的需要。为泛型类型指定默认类型的语法是在声明泛型类型时使用 <PlaceholderType=ConcreteType>。 这种情况的一个非常好的例子是使用 运算符重载 ( Operator overloading ),这是指在特定情况下自定义运算符(比如 +)行为的操作。 Rust 并不允许创建自定义运算符或重载任意运算符,不过 std::ops 中所列出的运算符和相应的 trait 可以通过实现运算符相关 trait 来重载。例如,示例 19-14 中展示了如何在 Point 结构体上实现 Add trait 来重载 + 运算符,这样就可以将两个 Point 实例相加了: 文件名:src/main.rs use std::ops::Add; #[derive(Debug, Copy, Clone, PartialEq)]\nstruct Point { x: i32, y: i32,\n} impl Add for Point { type Output = Point; fn add(self, other: Point) -> Point { Point { x: self.x + other.x, y: self.y + other.y, } }\n} fn main() { assert_eq!( Point { x: 1, y: 0 } + Point { x: 2, y: 3 }, Point { x: 3, y: 3 } );\n} 示例 19-14: 实现 Add trait 重载 Point 实例的 + 运算符 add 方法将两个 Point 实例的 x 值和 y 值分别相加来创建一个新的 Point。Add trait 有一个叫做 Output 的关联类型,它用来决定 add 方法的返回值类型。 这里默认泛型类型位于 Add trait 中。这里是其定义: trait Add<Rhs=Self> { type Output; fn add(self, rhs: Rhs) -> Self::Output;\n} 这些代码看来应该很熟悉,这是一个带有一个方法和一个关联类型的 trait。比较陌生的部分是尖括号中的 Rhs=Self:这个语法叫做 默认类型参数 ( default type parameters )。Rhs 是一个泛型类型参数(“right hand side” 的缩写),它用于定义 add 方法中的 rhs 参数。如果实现 Add trait 时不指定 Rhs 的具体类型,Rhs 的类型将是默认的 Self 类型,也就是在其上实现 Add 的类型。 当为 Point 实现 Add 时,使用了默认的 Rhs,因为我们希望将两个 Point 实例相加。让我们看看一个实现 Add trait 时希望自定义 Rhs 类型而不是使用默认类型的例子。 这里有两个存放不同单元值的结构体,Millimeters 和 Meters。(这种将现有类型简单封装进另一个结构体的方式被称为 newtype 模式 ( newtype pattern ,之后的 “为了类型安全和抽象而使用 newtype 模式” 部分会详细介绍。)我们希望能够将毫米值与米值相加,并让 Add 的实现正确处理转换。可以为 Millimeters 实现 Add 并以 Meters 作为 Rhs,如示例 19-15 所示。 文件名:src/lib.rs use std::ops::Add; struct Millimeters(u32);\nstruct Meters(u32); impl Add<Meters> for Millimeters { type Output = Millimeters; fn add(self, other: Meters) -> Millimeters { Millimeters(self.0 + (other.0 * 1000)) }\n} 示例 19-15: 在 Millimeters 上实现 Add,以便能够将 Millimeters 与 Meters 相加 为了使 Millimeters 和 Meters 能够相加,我们指定 impl Add<Meters> 来设定 Rhs 类型参数的值而不是使用默认的 Self。 默认参数类型主要用于如下两个方面: 扩展类型而不破坏现有代码。 在大部分用户都不需要的特定情况进行自定义。 标准库的 Add trait 就是一个第二个目的例子:大部分时候你会将两个相似的类型相加,不过它提供了自定义额外行为的能力。在 Add trait 定义中使用默认类型参数意味着大部分时候无需指定额外的参数。换句话说,一小部分实现的样板代码是不必要的,这样使用 trait 就更容易了。 第一个目的是相似的,但过程是反过来的:如果需要为现有 trait 增加类型参数,为其提供一个默认类型将允许我们在不破坏现有实现代码的基础上扩展 trait 的功能。","breadcrumbs":"高级特征 » 高级 trait » 默认泛型类型参数和运算符重载","id":"375","title":"默认泛型类型参数和运算符重载"},"376":{"body":"Rust 既不能避免一个 trait 与另一个 trait 拥有相同名称的方法,也不能阻止为同一类型同时实现这两个 trait。甚至直接在类型上实现开始已经有的同名方法也是可能的! 不过,当调用这些同名方法时,需要告诉 Rust 我们希望使用哪一个。考虑一下示例 19-16 中的代码,这里定义了 trait Pilot 和 Wizard 都拥有方法 fly。接着在一个本身已经实现了名为 fly 方法的类型 Human 上实现这两个 trait。每一个 fly 方法都进行了不同的操作: 文件名:src/main.rs trait Pilot { fn fly(&self);\n} trait Wizard { fn fly(&self);\n} struct Human; impl Pilot for Human { fn fly(&self) { println!(\"This is your captain speaking.\"); }\n} impl Wizard for Human { fn fly(&self) { println!(\"Up!\"); }\n} impl Human { fn fly(&self) { println!(\"*waving arms furiously*\"); }\n}\n# # fn main() {} 示例 19-16: 两个 trait 定义为拥有 fly 方法,并在直接定义有 fly 方法的 Human 类型上实现这两个 trait 当调用 Human 实例的 fly 时,编译器默认调用直接实现在类型上的方法,如示例 19-17 所示。 文件名:src/main.rs # trait Pilot {\n# fn fly(&self);\n# }\n# # trait Wizard {\n# fn fly(&self);\n# }\n# # struct Human;\n# # impl Pilot for Human {\n# fn fly(&self) {\n# println!(\"This is your captain speaking.\");\n# }\n# }\n# # impl Wizard for Human {\n# fn fly(&self) {\n# println!(\"Up!\");\n# }\n# }\n# # impl Human {\n# fn fly(&self) {\n# println!(\"*waving arms furiously*\");\n# }\n# }\n# fn main() { let person = Human; person.fly();\n} 示例 19-17: 调用 Human 实例的 fly 运行这段代码会打印出 *waving arms furiously*,这表明 Rust 调用了直接实现在 Human 上的 fly 方法。 为了能够调用 Pilot trait 或 Wizard trait 的 fly 方法,我们需要使用更明显的语法以便能指定我们指的是哪个 fly 方法。这个语法展示在示例 19-18 中: 文件名:src/main.rs # trait Pilot {\n# fn fly(&self);\n# }\n# # trait Wizard {\n# fn fly(&self);\n# }\n# # struct Human;\n# # impl Pilot for Human {\n# fn fly(&self) {\n# println!(\"This is your captain speaking.\");\n# }\n# }\n# # impl Wizard for Human {\n# fn fly(&self) {\n# println!(\"Up!\");\n# }\n# }\n# # impl Human {\n# fn fly(&self) {\n# println!(\"*waving arms furiously*\");\n# }\n# }\n# fn main() { let person = Human; Pilot::fly(&person); Wizard::fly(&person); person.fly();\n} 示例 19-18: 指定我们希望调用哪一个 trait 的 fly 方法 在方法名前指定 trait 名向 Rust 澄清了我们希望调用哪个 fly 实现。也可以选择写成 Human::fly(&person),这等同于示例 19-18 中的 person.fly(),不过如果无需消歧义的话这么写就有点长了。 运行这段代码会打印出: $ cargo run Compiling traits-example v0.1.0 (file:///projects/traits-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.46s Running `target/debug/traits-example`\nThis is your captain speaking.\nUp!\n*waving arms furiously* 因为 fly 方法获取一个 self 参数,如果有两个 类型 都实现了同一 trait ,Rust 可以根据 self 的类型计算出应该使用哪一个 trait 实现。 然而,不是方法的关联函数没有 self 参数。当存在多个类型或者 trait 定义了相同函数名的非方法函数时,Rust 就不总是能计算出我们期望的是哪一个类型,除非使用 完全限定语法 ( fully qualified syntax )。例如示例 19-19 中的创建了一个希望将所有小狗叫做 Spot 的动物收容所的 trait。Animal trait 有一个关联非方法函数 baby_name。结构体 Dog 实现了 Animal,同时又直接提供了关联非方法函数 baby_name。 文件名:src/main.rs trait Animal { fn baby_name() -> String;\n} struct Dog; impl Dog { fn baby_name() -> String { String::from(\"Spot\") }\n} impl Animal for Dog { fn baby_name() -> String { String::from(\"puppy\") }\n} fn main() { println!(\"A baby dog is called a {}\", Dog::baby_name());\n} 示例 19-19: 一个带有关联函数的 trait 和一个带有同名关联函数并实现了此 trait 的类型 Dog 上定义的关联函数 baby_name 的实现代码将所有的小狗起名为 Spot。Dog 类型还实现了 Animal trait,它描述了所有动物的共有的特征。小狗被称为 puppy,这表现为 Dog 的 Animal trait 实现中与 Animal trait 相关联的函数 baby_name。 在 main 调用了 Dog::baby_name 函数,它直接调用了定义于 Dog 之上的关联函数。这段代码会打印出: $ cargo run Compiling traits-example v0.1.0 (file:///projects/traits-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.54s Running `target/debug/traits-example`\nA baby dog is called a Spot 这并不是我们需要的。我们希望调用的是 Dog 上 Animal trait 实现那部分的 baby_name 函数,这样能够打印出 A baby dog is called a puppy。示例 19-18 中用到的技术在这并不管用;如果将 main 改为示例 19-20 中的代码,则会得到一个编译错误: 文件名:src/main.rs # trait Animal {\n# fn baby_name() -> String;\n# }\n# # struct Dog;\n# # impl Dog {\n# fn baby_name() -> String {\n# String::from(\"Spot\")\n# }\n# }\n# # impl Animal for Dog {\n# fn baby_name() -> String {\n# String::from(\"puppy\")\n# }\n# }\n# fn main() { println!(\"A baby dog is called a {}\", Animal::baby_name());\n} 示例 19-20: 尝试调用 Animal trait 的 baby_name 函数,不过 Rust 并不知道该使用哪一个实现 因为 Animal::baby_name 没有 self 参数,同时这可能会有其它类型实现了 Animal trait,Rust 无法计算出所需的是哪一个 Animal::baby_name 实现。我们会得到这个编译错误: $ cargo run Compiling traits-example v0.1.0 (file:///projects/traits-example)\nerror[E0790]: cannot call associated function on trait without specifying the corresponding `impl` type --> src/main.rs:20:43 |\n2 | fn baby_name() -> String; | ------------------------- `Animal::baby_name` defined here\n...\n20 | println!(\"A baby dog is called a {}\", Animal::baby_name()); | ^^^^^^^^^^^^^^^^^^^ cannot call associated function of trait |\nhelp: use the fully-qualified path to the only available implementation |\n20 | println!(\"A baby dog is called a {}\", <Dog as Animal>::baby_name()); | +++++++ + For more information about this error, try `rustc --explain E0790`.\nerror: could not compile `traits-example` (bin \"traits-example\") due to 1 previous error 为了消歧义并告诉 Rust 我们希望使用的是 Dog 的 Animal 实现而不是其它类型的 Animal 实现,需要使用 完全限定语法 ,这是调用函数时最为明确的方式。示例 19-21 展示了如何使用完全限定语法: 文件名:src/main.rs # trait Animal {\n# fn baby_name() -> String;\n# }\n# # struct Dog;\n# # impl Dog {\n# fn baby_name() -> String {\n# String::from(\"Spot\")\n# }\n# }\n# # impl Animal for Dog {\n# fn baby_name() -> String {\n# String::from(\"puppy\")\n# }\n# }\n# fn main() { println!(\"A baby dog is called a {}\", <Dog as Animal>::baby_name());\n} 示例 19-21: 使用完全限定语法来指定我们希望调用的是 Dog 上 Animal trait 实现中的 baby_name 函数 我们在尖括号中向 Rust 提供了类型注解,并通过在此函数调用中将 Dog 类型当作 Animal 对待,来指定希望调用的是 Dog 上 Animal trait 实现中的 baby_name 函数。现在这段代码会打印出我们期望的数据: $ cargo run Compiling traits-example v0.1.0 (file:///projects/traits-example) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s Running `target/debug/traits-example`\nA baby dog is called a puppy 通常,完全限定语法定义为: <Type as Trait>::function(receiver_if_method, next_arg, ...); 对于不是方法的关联函数,其没有一个 receiver,故只会有其他参数的列表。可以选择在任何函数或方法调用处使用完全限定语法。然而,允许省略任何 Rust 能够从程序中的其他信息中计算出的部分。只有当存在多个同名实现而 Rust 需要帮助以便知道我们希望调用哪个实现时,才需要使用这个较为冗长的语法。","breadcrumbs":"高级特征 » 高级 trait » 完全限定语法与消歧义:调用相同名称的方法","id":"376","title":"完全限定语法与消歧义:调用相同名称的方法"},"377":{"body":"有时我们可能会需要编写一个依赖另一个 trait 的 trait 定义:对于一个实现了第一个 trait 的类型,你希望要求这个类型也实现了第二个 trait。如此就可使 trait 定义使用第二个 trait 的关联项。这个所需的 trait 是我们实现的 trait 的 父(超)trait ( supertrait )。 例如我们希望创建一个带有 outline_print 方法的 trait OutlinePrint,它会将给定的值格式化为带有星号框。也就是说,给定一个实现了标准库 Display trait 的并返回 (x, y) 的 Point,当调用以 1 作为 x 和 3 作为 y 的 Point 实例的 outline_print 会显示如下: **********\n* *\n* (1, 3) *\n* *\n********** 在 outline_print 的实现中,因为希望能够使用 Display trait 的功能,则需要说明 OutlinePrint 只能用于同时也实现了 Display 并提供了 OutlinePrint 需要的功能的类型。可以通过在 trait 定义中指定 OutlinePrint: Display 来做到这一点。这类似于为 trait 增加 trait bound。示例 19-22 展示了一个 OutlinePrint trait 的实现: 文件名:src/main.rs use std::fmt; trait OutlinePrint: fmt::Display { fn outline_print(&self) { let output = self.to_string(); let len = output.len(); println!(\"{}\", \"*\".repeat(len + 4)); println!(\"*{}*\", \" \".repeat(len + 2)); println!(\"* {output} *\"); println!(\"*{}*\", \" \".repeat(len + 2)); println!(\"{}\", \"*\".repeat(len + 4)); }\n}\n# # fn main() {} 示例 19-22: 实现 OutlinePrint trait,它要求来自 Display 的功能 因为指定了 OutlinePrint 需要 Display trait,则可以在 outline_print 中使用 to_string,其会为任何实现 Display 的类型自动实现。如果不在 trait 名后增加 : Display 并尝试在 outline_print 中使用 to_string,则会得到一个错误说在当前作用域中没有找到用于 &Self 类型的方法 to_string。 让我们看看如果尝试在一个没有实现 Display 的类型上实现 OutlinePrint 会发生什么,比如 Point 结构体: 文件名:src/main.rs # use std::fmt;\n# # trait OutlinePrint: fmt::Display {\n# fn outline_print(&self) {\n# let output = self.to_string();\n# let len = output.len();\n# println!(\"{}\", \"*\".repeat(len + 4));\n# println!(\"*{}*\", \" \".repeat(len + 2));\n# println!(\"* {output} *\");\n# println!(\"*{}*\", \" \".repeat(len + 2));\n# println!(\"{}\", \"*\".repeat(len + 4));\n# }\n# }\n# struct Point { x: i32, y: i32,\n} impl OutlinePrint for Point {}\n# # fn main() {\n# let p = Point { x: 1, y: 3 };\n# p.outline_print();\n# } 这样会得到一个错误说 Display 是必须的而未被实现: $ cargo run Compiling traits-example v0.1.0 (file:///projects/traits-example)\nerror[E0277]: `Point` doesn't implement `std::fmt::Display` --> src/main.rs:20:23 |\n20 | impl OutlinePrint for Point {} | ^^^^^ `Point` cannot be formatted with the default formatter | = help: the trait `std::fmt::Display` is not implemented for `Point` = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead\nnote: required by a bound in `OutlinePrint` --> src/main.rs:3:21 |\n3 | trait OutlinePrint: fmt::Display { | ^^^^^^^^^^^^ required by this bound in `OutlinePrint` error[E0277]: `Point` doesn't implement `std::fmt::Display` --> src/main.rs:24:7 |\n24 | p.outline_print(); | ^^^^^^^^^^^^^ `Point` cannot be formatted with the default formatter | = help: the trait `std::fmt::Display` is not implemented for `Point` = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead\nnote: required by a bound in `OutlinePrint::outline_print` --> src/main.rs:3:21 |\n3 | trait OutlinePrint: fmt::Display { | ^^^^^^^^^^^^ required by this bound in `OutlinePrint::outline_print`\n4 | fn outline_print(&self) { | ------------- required by a bound in this associated function For more information about this error, try `rustc --explain E0277`.\nerror: could not compile `traits-example` (bin \"traits-example\") due to 2 previous errors 一旦在 Point 上实现 Display 并满足 OutlinePrint 要求的限制,比如这样: 文件名:src/main.rs # trait OutlinePrint: fmt::Display {\n# fn outline_print(&self) {\n# let output = self.to_string();\n# let len = output.len();\n# println!(\"{}\", \"*\".repeat(len + 4));\n# println!(\"*{}*\", \" \".repeat(len + 2));\n# println!(\"* {output} *\");\n# println!(\"*{}*\", \" \".repeat(len + 2));\n# println!(\"{}\", \"*\".repeat(len + 4));\n# }\n# }\n# # struct Point {\n# x: i32,\n# y: i32,\n# }\n# # impl OutlinePrint for Point {}\n# use std::fmt; impl fmt::Display for Point { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, \"({}, {})\", self.x, self.y) }\n}\n# # fn main() {\n# let p = Point { x: 1, y: 3 };\n# p.outline_print();\n# } 那么在 Point 上实现 OutlinePrint trait 将能成功编译,并可以在 Point 实例上调用 outline_print 来显示位于星号框中的点的值。","breadcrumbs":"高级特征 » 高级 trait » 父 trait 用于在另一个 trait 中使用某 trait 的功能","id":"377","title":"父 trait 用于在另一个 trait 中使用某 trait 的功能"},"378":{"body":"在第十章的 “为类型实现 trait” 部分,我们提到了孤儿规则(orphan rule),它说明只要 trait 或类型对于当前 crate 是本地的话就可以在此类型上实现该 trait。一个绕开这个限制的方法是使用 newtype 模式 ( newtype pattern ),它涉及到在一个元组结构体(第五章 “用没有命名字段的元组结构体来创建不同的类型” 部分介绍了元组结构体)中创建一个新类型。这个元组结构体带有一个字段作为希望实现 trait 的类型的简单封装。接着这个封装类型对于 crate 是本地的,这样就可以在这个封装上实现 trait。 Newtype 是一个源自 Haskell 编程语言的概念。使用这个模式没有运行时性能惩罚,这个封装类型在编译时就被省略了。 例如,如果想要在 Vec<T> 上实现 Display,而孤儿规则阻止我们直接这么做,因为 Display trait 和 Vec<T> 都定义于我们的 crate 之外。可以创建一个包含 Vec<T> 实例的 Wrapper 结构体,接着可以如列表 19-23 那样在 Wrapper 上实现 Display 并使用 Vec<T> 的值: 文件名:src/main.rs use std::fmt; struct Wrapper(Vec<String>); impl fmt::Display for Wrapper { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, \"[{}]\", self.0.join(\", \")) }\n} fn main() { let w = Wrapper(vec![String::from(\"hello\"), String::from(\"world\")]); println!(\"w = {w}\");\n} 示例 19-23: 创建 Wrapper 类型封装 Vec<String> 以便能够实现 Display Display 的实现使用 self.0 来访问其内部的 Vec<T>,因为 Wrapper 是元组结构体而 Vec<T> 是结构体总位于索引 0 的项。接着就可以使用 Wrapper 中 Display 的功能了。 此方法的缺点是,因为 Wrapper 是一个新类型,它没有定义于其值之上的方法;必须直接在 Wrapper 上实现 Vec<T> 的所有方法,这样就可以代理到self.0 上 —— 这就允许我们完全像 Vec<T> 那样对待 Wrapper。如果希望新类型拥有其内部类型的每一个方法,为封装类型实现 Deref trait(第十五章 “通过 Deref trait 将智能指针当作常规引用处理” 部分讨论过)并返回其内部类型是一种解决方案。如果不希望封装类型拥有所有内部类型的方法 —— 比如为了限制封装类型的行为 —— 则必须只自行实现所需的方法。 甚至当不涉及 trait 时 newtype 模式也很有用。现在让我们将话题的焦点转移到一些与 Rust 类型系统交互的高级方法上来吧。","breadcrumbs":"高级特征 » 高级 trait » newtype 模式用以在外部类型上实现外部 trait","id":"378","title":"newtype 模式用以在外部类型上实现外部 trait"},"379":{"body":"ch20-04-advanced-types.md commit 95e931170404cb98d476b19017cbbdbc00d0834d Rust 的类型系统有一些我们曾经提到但没有讨论过的功能。首先我们从一个关于为什么 newtype 与类型一样有用的更宽泛的讨论开始。接着会转向类型别名(type aliases),一个类似于 newtype 但有着稍微不同的语义的功能。我们还会讨论 ! 类型和动态大小类型。 这一部分假设你已经阅读了之前的 “newtype 模式用于在外部类型上实现外部 trait” 部分。","breadcrumbs":"高级特征 » 高级类型 » 高级类型","id":"379","title":"高级类型"},"38":{"body":"让我们来测试下猜数字游戏的第一部分。使用 cargo run 运行: $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 6.44s Running `target/debug/guessing_game`\nGuess the number!\nPlease input your guess.\n6\nYou guessed: 6 至此为止,游戏的第一部分已经完成:我们从键盘获取输入并打印了出来。","breadcrumbs":"写个猜数字游戏 » 测试第一部分代码","id":"38","title":"测试第一部分代码"},"380":{"body":"newtype 模式也可以用于一些其他我们还未讨论的功能,包括静态的确保某值不被混淆,和用来表示一个值的单位。实际上示例 19-15 中已经有一个这样的例子:Millimeters 和 Meters 结构体都在 newtype 中封装了 u32 值。如果编写了一个有 Millimeters 类型参数的函数,不小心使用 Meters 或普通的 u32 值来调用该函数的程序是不能编译的。 newtype 模式也可以用于抽象掉一些类型的实现细节:例如,封装类型可以暴露出与直接使用其内部私有类型时所不同的公有 API。 newtype 也可以隐藏其内部的泛型类型。例如,可以提供一个封装了 HashMap<i32, String> 的 People 类型,用来储存人名以及相应的 ID。使用 People 的代码只需与提供的公有 API 交互即可,比如向 People 集合增加名字字符串的方法,这样这些代码就无需知道在内部我们将一个 i32 ID 赋予了这个名字了。newtype 模式是一种实现第十八章 “封装隐藏了实现细节” 部分所讨论的隐藏实现细节的封装的轻量级方法。","breadcrumbs":"高级特征 » 高级类型 » 为了类型安全和抽象而使用 newtype 模式","id":"380","title":"为了类型安全和抽象而使用 newtype 模式"},"381":{"body":"Rust 提供了声明 类型别名 ( type alias )的能力,使用 type 关键字来给予现有类型另一个名字。例如,可以像这样创建 i32 的别名 Kilometers: # fn main() { type Kilometers = i32;\n# # let x: i32 = 5;\n# let y: Kilometers = 5;\n# # println!(\"x + y = {}\", x + y);\n# } 这意味着 Kilometers 是 i32 的 同义词 ( synonym );不同于示例 19-15 中创建的 Millimeters 和 Meters 类型。Kilometers 不是一个新的、单独的类型。Kilometers 类型的值将被完全当作 i32 类型值来对待: # fn main() { type Kilometers = i32; let x: i32 = 5; let y: Kilometers = 5; println!(\"x + y = {}\", x + y);\n# } 因为 Kilometers 是 i32 的别名,它们是同一类型,可以将 i32 与 Kilometers 相加,也可以将 Kilometers 传递给获取 i32 参数的函数。但通过这种手段无法获得上一部分讨论的 newtype 模式所提供的类型检查的好处。换句话说,如果在哪里混用 Kilometers 和 i32 的值,编译器也不会给出一个错误。 类型别名的主要用途是减少重复。例如,可能会有这样很长的类型: Box<dyn Fn() + Send + 'static> 在函数签名或类型注解中每次都书写这个类型将是枯燥且易于出错的。想象一下如示例 19-24 这样全是如此代码的项目: # fn main() { let f: Box<dyn Fn() + Send + 'static> = Box::new(|| println!(\"hi\")); fn takes_long_type(f: Box<dyn Fn() + Send + 'static>) { // --snip-- } fn returns_long_type() -> Box<dyn Fn() + Send + 'static> { // --snip--\n# Box::new(|| ()) }\n# } 示例 19-24: 在很多地方使用名称很长的类型 类型别名通过减少项目中重复代码的数量来使其更加易于控制。这里我们为这个冗长的类型引入了一个叫做 Thunk 的别名,这样就可以如示例 19-25 所示将所有使用这个类型的地方替换为更短的 Thunk: # fn main() { type Thunk = Box<dyn Fn() + Send + 'static>; let f: Thunk = Box::new(|| println!(\"hi\")); fn takes_long_type(f: Thunk) { // --snip-- } fn returns_long_type() -> Thunk { // --snip--\n# Box::new(|| ()) }\n# } 示例 19-25: 引入类型别名 Thunk 来减少重复 这样读写起来就容易多了!为类型别名选择一个好名字也可以帮助你表达意图(单词 thunk 表示会在之后被计算的代码,所以这是一个存放闭包的合适的名字)。 类型别名也经常与 Result<T, E> 结合使用来减少重复。考虑一下标准库中的 std::io 模块。I/O 操作通常会返回一个 Result<T, E>,因为这些操作可能会失败。标准库中的 std::io::Error 结构体代表了所有可能的 I/O 错误。std::io 中大部分函数会返回 Result<T, E>,其中 E 是 std::io::Error,比如 Write trait 中的这些函数: use std::fmt;\nuse std::io::Error; pub trait Write { fn write(&mut self, buf: &[u8]) -> Result<usize, Error>; fn flush(&mut self) -> Result<(), Error>; fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>; fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Error>;\n} 这里出现了很多的 Result<..., Error>。为此,std::io 有这个类型别名声明: # use std::fmt;\n# type Result<T> = std::result::Result<T, std::io::Error>;\n# # pub trait Write {\n# fn write(&mut self, buf: &[u8]) -> Result<usize>;\n# fn flush(&mut self) -> Result<()>;\n# # fn write_all(&mut self, buf: &[u8]) -> Result<()>;\n# fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<()>;\n# } 因为这位于 std::io 中,可用的完全限定的别名是 std::io::Result<T>;也就是说,Result<T, E> 中 E 放入了 std::io::Error。Write trait 中的函数最终看起来像这样: # use std::fmt;\n# # type Result<T> = std::result::Result<T, std::io::Error>;\n# pub trait Write { fn write(&mut self, buf: &[u8]) -> Result<usize>; fn flush(&mut self) -> Result<()>; fn write_all(&mut self, buf: &[u8]) -> Result<()>; fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<()>;\n} 类型别名在两个方面有帮助:易于编写 并 在整个 std::io 中提供了一致的接口。因为这是一个别名,它只是另一个 Result<T, E>,这意味着可以在其上使用 Result<T, E> 的任何方法,以及像 ? 这样的特殊语法。","breadcrumbs":"高级特征 » 高级类型 » 类型别名用来创建类型同义词","id":"381","title":"类型别名用来创建类型同义词"},"382":{"body":"Rust 有一个叫做 ! 的特殊类型。在类型理论术语中,它被称为 empty type ,因为它没有值。我们更倾向于称之为 never type 。这个名字描述了它的作用:在函数从不返回的时候充当返回值。例如: fn bar() -> ! { // --snip--\n# panic!();\n} 这读 “函数 bar 从不返回”,而从不返回的函数被称为 发散函数 ( diverging functions )。不能创建 ! 类型的值,所以 bar 也不可能返回值。 不过一个不能创建值的类型有什么用呢?如果你回想一下示例 2-5 中的代码,曾经有一些看起来像这样的代码,如示例 19-26 所重现的: # use rand::Rng;\n# use std::cmp::Ordering;\n# use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # loop {\n# println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # // --snip--\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, };\n# # println!(\"You guessed: {guess}\");\n# # // --snip--\n# # match guess.cmp(&secret_number) {\n# Ordering::Less => println!(\"Too small!\"),\n# Ordering::Greater => println!(\"Too big!\"),\n# Ordering::Equal => {\n# println!(\"You win!\");\n# break;\n# }\n# }\n# }\n# } 示例 19-26: match 语句和一个以 continue 结束的分支 当时我们忽略了代码中的一些细节。在第六章 “match 控制流运算符” 部分,我们学习了 match 的分支必须返回相同的类型。如下代码不能工作: # fn main() {\n# let guess = \"3\"; let guess = match guess.trim().parse() { Ok(_) => 5, Err(_) => \"hello\", };\n# } 这里的 guess 必须既是整型 也是 字符串,而 Rust 要求 guess 只能是一个类型。那么 continue 返回了什么呢?为什么示例 19-26 中会允许一个分支返回 u32 而另一个分支却以 continue 结束呢? 正如你可能猜到的,continue 的值是 !。也就是说,当 Rust 要计算 guess 的类型时,它查看这两个分支。前者是 u32 值,而后者是 ! 值。因为 ! 并没有一个值,Rust 决定 guess 的类型是 u32。 描述 ! 的行为的正式方式是 never type 可以强转为任何其他类型。允许 match 的分支以 continue 结束是因为 continue 并不真正返回一个值;相反它把控制权交回上层循环,所以在 Err 的情况,事实上并未对 guess 赋值。 never type 的另一个用途是 panic!。还记得 Option<T> 上的 unwrap 函数吗?它产生一个值或 panic。这里是它的定义: # enum Option<T> {\n# Some(T),\n# None,\n# }\n# # use crate::Option::*;\n# impl<T> Option<T> { pub fn unwrap(self) -> T { match self { Some(val) => val, None => panic!(\"called `Option::unwrap()` on a `None` value\"), } }\n} 这里与示例 19-34 中的 match 发生了相同的情况:Rust 知道 val 是 T 类型,panic! 是 ! 类型,所以整个 match 表达式的结果是 T 类型。这能工作是因为 panic! 并不产生一个值;它会终止程序。对于 None 的情况,unwrap 并不返回一个值,所以这些代码是有效的。 最后一个有着 ! 类型的表达式是 loop: # fn main() { print!(\"forever \"); loop { print!(\"and ever \"); }\n# } 这里,循环永远也不结束,所以此表达式的值是 !。但是如果引入 break 这就不为真了,因为循环在执行到 break 后就会终止。","breadcrumbs":"高级特征 » 高级类型 » 从不返回的 never type","id":"382","title":"从不返回的 never type"},"383":{"body":"Rust 需要知道有关类型的某些细节,例如为特定类型的值需要分配多少空间。这便是起初留下的一个类型系统中令人迷惑的角落:即 动态大小类型 ( dynamically sized types )。这有时被称为 “DST” 或 “unsized types”,这些类型允许我们处理只有在运行时才知道大小的类型。 让我们深入研究一个贯穿本书都在使用的动态大小类型的细节:str。没错,不是 &str,而是 str 本身。str 是一个 DST;直到运行时我们都不知道字符串有多长。因为直到运行时都不能知道其大小,也就意味着不能创建 str 类型的变量,也不能获取 str 类型的参数。考虑一下这些代码,它们不能工作: # fn main() { let s1: str = \"Hello there!\"; let s2: str = \"How's it going?\";\n# } Rust 需要知道应该为特定类型的值分配多少内存,同时所有同一类型的值必须使用相同数量的内存。如果允许编写这样的代码,也就意味着这两个 str 需要占用完全相同大小的空间,不过它们有着不同的长度。这也就是为什么不可能创建一个存放动态大小类型的变量的原因。 那么该怎么办呢?你已经知道了这种问题的答案:s1 和 s2 的类型是 &str 而不是 str。如果你回想第四章 “字符串 slice” 部分,slice 数据结构仅仅储存了开始位置和 slice 的长度。所以虽然 &T 是一个储存了 T 所在的内存位置的单个值,&str 则是 两个 值:str 的地址和其长度。这样,&str 就有了一个在编译时可以知道的大小:它是 usize 长度的两倍。也就是说,我们总是知道 &str 的大小,而无论其引用的字符串是多长。这里是 Rust 中动态大小类型的常规用法:它们有一些额外的元信息来储存动态信息的大小。这引出了动态大小类型的黄金规则:必须将动态大小类型的值置于某种指针之后。 可以将 str 与所有类型的指针结合:比如 Box<str> 或 Rc<str>。事实上,之前我们已经见过了,不过是另一个动态大小类型:trait。每一个 trait 都是一个可以通过 trait 名称来引用的动态大小类型。在第十八章 顾及不同类型值的 trait 对象” 部分,我们提到了为了将 trait 用于 trait 对象,必须将它们放入指针之后,比如 &dyn Trait 或 Box<dyn Trait>(Rc<dyn Trait> 也可以)。 为了处理 DST,Rust 提供了 Sized trait 来决定一个类型的大小是否在编译时可知。这个 trait 自动为编译器在编译时就知道大小的类型实现。另外,Rust 隐式的为每一个泛型函数增加了 Sized bound。也就是说,对于如下泛型函数定义: fn generic<T>(t: T) { // --snip--\n} 实际上被当作如下处理: fn generic<T: Sized>(t: T) { // --snip--\n} 泛型函数默认只能用于在编译时已知大小的类型。然而可以使用如下特殊语法来放宽这个限制: fn generic<T: ?Sized>(t: &T) { // --snip--\n} ?Sized 上的 trait bound 意味着 “T 可能是也可能不是 Sized” 同时这个注解会覆盖泛型类型必须在编译时拥有固定大小的默认规则。这种意义的 ?Trait 语法只能用于 Sized ,而不能用于任何其他 trait。 另外注意我们将 t 参数的类型从 T 变为了 &T:因为其类型可能不是 Sized 的,所以需要将其置于某种指针之后。在这个例子中选择了引用。 接下来,让我们讨论一下函数和闭包!","breadcrumbs":"高级特征 » 高级类型 » 动态大小类型和 Sized trait","id":"383","title":"动态大小类型和 Sized trait"},"384":{"body":"ch20-05-advanced-functions-and-closures.md commit 21cf840842bdf768a798869f06373c96c1cc5122 本部分将探索一些有关函数和闭包的高级功能,这包括函数指针以及返回值闭包。","breadcrumbs":"高级特征 » 高级函数与闭包 » 高级函数与闭包","id":"384","title":"高级函数与闭包"},"385":{"body":"我们讨论过了如何向函数传递闭包;也可以向函数传递常规函数!这个技术在我们希望传递已经定义的函数而不是重新定义闭包作为参数时很有用。函数满足类型 fn(小写的 f),不要与闭包 trait 的 Fn 相混淆。fn 被称为 函数指针 ( function pointer )。通过函数指针允许我们使用函数作为另一个函数的参数。 指定参数为函数指针的语法类似于闭包,如示例 19-27 所示,这里定义了一个 add_one 函数将其参数加一。do_twice 函数获取两个参数:一个指向任何获取一个 i32 参数并返回一个 i32 的函数指针,和一个 i32 值。do_twice 函数传递 arg 参数调用 f 函数两次,接着将两次函数调用的结果相加。main 函数使用 add_one 和 5 作为参数调用 do_twice。 文件名:src/main.rs fn add_one(x: i32) -> i32 { x + 1\n} fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 { f(arg) + f(arg)\n} fn main() { let answer = do_twice(add_one, 5); println!(\"The answer is: {answer}\");\n} 示例 19-27: 使用 fn 类型接受函数指针作为参数 这会打印出 The answer is: 12。do_twice 中的 f 被指定为一个接受一个 i32 参数并返回 i32 的 fn。接着就可以在 do_twice 函数体中调用 f。在 main 中,可以将函数名 add_one 作为第一个参数传递给 do_twice。 不同于闭包,fn 是一个类型而不是一个 trait,所以直接指定 fn 作为参数而不是声明一个带有 Fn 作为 trait bound 的泛型参数。 函数指针实现了所有三个闭包 trait(Fn、FnMut 和 FnOnce),所以总是可以在调用期望闭包的函数时传递函数指针作为参数。倾向于编写使用泛型和闭包 trait 的函数,这样它就能接受函数或闭包作为参数。 一个只期望接受 fn 而不接受闭包的情况的例子是与不存在闭包的外部代码交互时:C 语言的函数可以接受函数作为参数,但 C 语言没有闭包。 作为一个既可以使用内联定义的闭包又可以使用命名函数的例子,让我们看看一个 map 的应用。使用 map 函数将一个数字 vector 转换为一个字符串 vector,就可以使用闭包,比如这样: # fn main() { let list_of_numbers = vec![1, 2, 3]; let list_of_strings: Vec<String> = list_of_numbers.iter().map(|i| i.to_string()).collect();\n# } 或者可以将函数作为 map 的参数来代替闭包,像是这样: # fn main() { let list_of_numbers = vec![1, 2, 3]; let list_of_strings: Vec<String> = list_of_numbers.iter().map(ToString::to_string).collect();\n# } 注意这里必须使用 “高级 trait” 部分讲到的完全限定语法,因为存在多个叫做 to_string 的函数;这里使用了定义于 ToString trait 的 to_string 函数,标准库为所有实现了 Display 的类型实现了这个 trait。 回忆一下第六章 “枚举值” 部分中定义的每一个枚举成员也变成了一个构造函数。我们可以使用这些构造函数作为实现了闭包 trait 的函数指针,这意味着可以指定构造函数作为接受闭包的方法的参数,如下: # fn main() { enum Status { Value(u32), Stop, } let list_of_statuses: Vec<Status> = (0u32..20).map(Status::Value).collect();\n# } 这里创建了 Status::Value 实例,它通过 map 用范围的每一个 u32 值调用 Status::Value 的初始化函数。一些人倾向于函数风格,一些人喜欢闭包。这两种形式最终都会产生同样的代码,所以请使用对你来说更明白的形式吧。","breadcrumbs":"高级特征 » 高级函数与闭包 » 函数指针","id":"385","title":"函数指针"},"386":{"body":"闭包表现为 trait,这意味着不能直接返回闭包。对于大部分需要返回 trait 的情况,可以使用实现了期望返回的 trait 的具体类型来替代函数的返回值。但是这不能用于闭包,因为它们没有一个可返回的具体类型;例如不允许使用函数指针 fn 作为返回值类型。 这段代码尝试直接返回闭包,它并不能编译: fn returns_closure() -> dyn Fn(i32) -> i32 { |x| x + 1\n} 编译器给出的错误是: $ cargo build Compiling functions-example v0.1.0 (file:///projects/functions-example)\nerror[E0746]: return type cannot have an unboxed trait object --> src/lib.rs:1:25 |\n1 | fn returns_closure() -> dyn Fn(i32) -> i32 { | ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time |\nhelp: consider returning an `impl Trait` instead of a `dyn Trait` |\n1 | fn returns_closure() -> impl Fn(i32) -> i32 { | ~~~~\nhelp: alternatively, box the return type, and wrap all of the returned values in `Box::new` |\n1 ~ fn returns_closure() -> Box<dyn Fn(i32) -> i32> {\n2 ~ Box::new(|x| x + 1) | For more information about this error, try `rustc --explain E0746`.\nerror: could not compile `functions-example` (lib) due to 1 previous error 错误又一次指向了 Sized trait!Rust 并不知道需要多少空间来储存闭包。不过我们在上一部分见过这种情况的解决办法:可以使用 trait 对象: fn returns_closure() -> Box<dyn Fn(i32) -> i32> { Box::new(|x| x + 1)\n} 这段代码正好可以编译。关于 trait 对象的更多内容,请回顾第十八章的 顾及不同类型值的 trait 对象” 部分。 接下来让我们学习宏!","breadcrumbs":"高级特征 » 高级函数与闭包 » 返回闭包","id":"386","title":"返回闭包"},"387":{"body":"ch20-06-macros.md commit 95e931170404cb98d476b19017cbbdbc00d0834d 我们已经在本书中使用过像 println! 这样的宏了,不过还没完全探索什么是宏以及它是如何工作的。 宏 ( Macro )指的是 Rust 中一系列的功能:使用 macro_rules! 的 声明 ( Declarative )宏,和三种 过程 ( Procedural )宏: 自定义 #[derive] 宏在结构体和枚举上指定通过 derive 属性添加的代码 类属性(Attribute-like)宏定义可用于任意项的自定义属性 类函数宏看起来像函数不过作用于作为参数传递的 token 我们会依次讨论每一种宏,不过首要的是,为什么已经有了函数还需要宏呢?","breadcrumbs":"高级特征 » 宏 » 宏","id":"387","title":"宏"},"388":{"body":"从根本上来说,宏是一种为写其他代码而写代码的方式,即所谓的 元编程 ( metaprogramming )。在附录 C 中会探讨 derive 属性,其生成各种 trait 的实现。我们也在本书中使用过 println! 宏和 vec! 宏。所有的这些宏以 展开 的方式来生成比你所手写出的更多的代码。 元编程对于减少大量编写和维护的代码是非常有用的,它也扮演了函数扮演的角色。但宏有一些函数所没有的附加能力。 一个函数签名必须声明函数参数个数和类型。相比之下,宏能够接收不同数量的参数:用一个参数调用 println!(\"hello\") 或用两个参数调用 println!(\"hello {}\", name) 。而且,宏可以在编译器翻译代码前展开,例如,宏可以在一个给定类型上实现 trait。而函数则不行,因为函数是在运行时被调用,同时 trait 需要在编译时实现。 实现宏不如实现函数的一面是宏定义要比函数定义更复杂,因为你正在编写生成 Rust 代码的 Rust 代码。由于这样的间接性,宏定义通常要比函数定义更难阅读、理解以及维护。 宏和函数的最后一个重要的区别是:在一个文件里调用宏 之前 必须定义它,或将其引入作用域,而函数则可以在任何地方定义和调用。","breadcrumbs":"高级特征 » 宏 » 宏和函数的区别","id":"388","title":"宏和函数的区别"},"389":{"body":"Rust 最常用的宏形式是 声明宏 ( declarative macros )。它们有时也被称为 “macros by example”、“macro_rules! 宏” 或者就是 “macros”。其核心概念是,声明宏允许我们编写一些类似 Rust match 表达式的代码。正如在第六章讨论的那样,match 表达式是控制结构,其接收一个表达式,与表达式的结果进行模式匹配,然后根据模式匹配执行相关代码。宏也将一个值和包含相关代码的模式进行比较;此种情况下,该值是传递给宏的 Rust 源代码字面值,模式用于和前面提到的源代码字面值进行比较,每个模式的相关代码会替换传递给宏的代码。所有这一切都发生于编译时。 可以使用 macro_rules! 来定义宏。让我们通过查看 vec! 宏定义来探索如何使用 macro_rules! 结构。第八章讲述了如何使用 vec! 宏来生成一个给定值的 vector。例如,下面的宏用三个整数创建一个 vector: let v: Vec<u32> = vec![1, 2, 3]; 也可以使用 vec! 宏来构造两个整数的 vector 或五个字符串 slice 的 vector。但却无法使用函数做相同的事情,因为我们无法预先知道参数值的数量和类型。 在示例 19-28 中展示了一个 vec! 稍微简化的定义。 文件名:src/lib.rs #[macro_export]\nmacro_rules! vec { ( $( $x:expr ),* ) => { { let mut temp_vec = Vec::new(); $( temp_vec.push($x); )* temp_vec } };\n} 示例 19-28: 一个 vec! 宏定义的简化版本 注意:标准库中实际定义的 vec! 包括预分配适当量的内存的代码。这部分为代码优化,为了让示例简化,此处并没有包含在内。 #[macro_export] 注解表明只要导入了定义这个宏的 crate,该宏就应该是可用的。如果没有该注解,这个宏不能被引入作用域。 接着使用 macro_rules! 和宏名称开始宏定义,且所定义的宏并 不带 感叹号。名字后跟大括号表示宏定义体,在该例中宏名称是 vec 。 vec! 宏的结构和 match 表达式的结构类似。此处有一个分支模式 ( $( $x:expr ),* ) ,后跟 => 以及和模式相关的代码块。如果模式匹配,该相关代码块将被执行。这里这个宏只有一个模式,那就只有一个有效匹配方向,其他任何模式方向(译者注:不匹配这个模式)都会导致错误。更复杂的宏会有多个分支模式。 宏定义中有效模式语法和在第十九章提及的模式语法是不同的,因为宏模式所匹配的是 Rust 代码结构而不是值。回过头来检查下示例 19-28 中模式片段什么意思。对于全部的宏模式语法,请查阅 Rust 参考 。 首先,一对括号包含了整个模式。我们使用美元符号($)在宏系统中声明一个变量来包含匹配该模式的 Rust 代码。美元符号明确表明这是一个宏变量而不是普通 Rust 变量。之后是一对括号,其捕获了符合括号内模式的值用以在替代代码中使用。$() 内则是 $x:expr ,其匹配 Rust 的任意表达式,并将该表达式命名为 $x。 $() 之后的逗号说明一个可有可无的逗号分隔符可以出现在 $() 所匹配的代码之后。紧随逗号之后的 * 说明该模式匹配零个或更多个 * 之前的任何模式。 当以 vec![1, 2, 3]; 调用宏时,$x 模式与三个表达式 1、2 和 3 进行了三次匹配。 现在让我们来看看与此分支模式相关联的代码块中的模式:匹配到模式中的$()的每一部分,都会在(=>右侧)$()* 里生成temp_vec.push($x),生成零次还是多次取决于模式匹配到多少次。$x 由每个与之相匹配的表达式所替换。当以 vec![1, 2, 3]; 调用该宏时,替换该宏调用所生成的代码会是下面这样: { let mut temp_vec = Vec::new(); temp_vec.push(1); temp_vec.push(2); temp_vec.push(3); temp_vec\n} 我们已经定义了一个宏,其可以接收任意数量和类型的参数,同时可以生成能够创建包含指定元素的 vector 的代码。 请查阅在线文档或其他资源,如 “The Little Book of Rust Macros” 来更多地了解如何写宏,该书由 Daniel Keep 开始编写并由 Lukas Wirth 继续维护。","breadcrumbs":"高级特征 » 宏 » 使用 macro_rules! 的声明宏用于通用元编程","id":"389","title":"使用 macro_rules! 的声明宏用于通用元编程"},"39":{"body":"接下来,需要生成一个秘密数字,好让用户来猜。秘密数字应该每次都不同,这样重复玩才不会乏味;范围应该在 1 到 100 之间,这样才不会太困难。Rust 标准库中尚未包含随机数功能。然而,Rust 团队还是提供了一个包含上述功能的 rand crate 。","breadcrumbs":"写个猜数字游戏 » 生成一个秘密数字","id":"39","title":"生成一个秘密数字"},"390":{"body":"第二种形式的宏被称为 过程宏 ( procedural macros ),因为它们更像函数(一种过程类型)。过程宏接收 Rust 代码作为输入,在这些代码上进行操作,然后产生另一些代码作为输出,而非像声明式宏那样匹配对应模式然后以另一部分代码替换当前代码。有三种类型的过程宏(自定义派生(derive),类属性和类函数),不过它们的工作方式都类似。 创建过程宏时,其定义必须驻留在它们自己的具有特殊 crate 类型的 crate 中。这么做出于复杂的技术原因,将来我们希望能够消除这些限制。在示例 19-29 中展示了如何定义过程宏,其中 some_attribute 是一个使用特定宏变体的占位符。 文件名:src/lib.rs use proc_macro; #[some_attribute]\npub fn some_name(input: TokenStream) -> TokenStream {\n} 示例 19-29: 一个定义过程宏的例子 定义过程宏的函数接收一个 TokenStream 作为输入并生成 TokenStream 作为输出。TokenStream 是定义于proc_macro crate 里代表一系列 token 的类型,Rust 默认携带了proc_macro crate。这就是宏的核心:宏所处理的源代码组成了输入 TokenStream,宏生成的代码是输出 TokenStream。函数上还有一个属性;这个属性指明了我们创建的过程宏的类型。在同一 crate 中可以有多种的过程宏。 让我们看看不同种类的程序宏。我们将从一个自定义的派生宏开始,然后解释使其他形式不同的小差异。","breadcrumbs":"高级特征 » 宏 » 用于从属性生成代码的过程宏","id":"390","title":"用于从属性生成代码的过程宏"},"391":{"body":"让我们创建一个 hello_macro crate,其包含名为 HelloMacro 的 trait 和关联函数 hello_macro。不同于让用户为其每一个类型实现 HelloMacro trait,我们将会提供一个过程式宏以便用户可以使用 #[derive(HelloMacro)] 注解它们的类型来得到 hello_macro 函数的默认实现。该默认实现会打印 Hello, Macro! My name is TypeName!,其中 TypeName 为定义了 trait 的类型名。换言之,我们会创建一个 crate,使程序员能够写类似示例 19-30 中的代码。 文件名:src/main.rs use hello_macro::HelloMacro;\nuse hello_macro_derive::HelloMacro; #[derive(HelloMacro)]\nstruct Pancakes; fn main() { Pancakes::hello_macro();\n} 示例 19-30: crate 用户所写的能够使用过程式宏的代码 运行该代码将会打印 Hello, Macro! My name is Pancakes! 第一步是像下面这样新建一个库 crate: $ cargo new hello_macro --lib 接下来,会定义 HelloMacro trait 以及其关联函数: 文件名:src/lib.rs pub trait HelloMacro { fn hello_macro();\n} 现在有了一个包含函数的 trait。此时,crate 用户可以实现该 trait 以达到其期望的功能,像这样: use hello_macro::HelloMacro; struct Pancakes; impl HelloMacro for Pancakes { fn hello_macro() { println!(\"Hello, Macro! My name is Pancakes!\"); }\n} fn main() { Pancakes::hello_macro();\n} 然而,他们需要为每一个他们想使用 hello_macro 的类型编写实现的代码块。我们希望为其节约这些工作。 另外,我们也无法为 hello_macro 函数提供一个能够打印实现了该 trait 的类型的名字的默认实现:Rust 没有反射的能力,因此其无法在运行时获取类型名。我们需要一个在编译时生成代码的宏。 下一步是定义过程式宏。在编写本部分时,过程式宏必须在其自己的 crate 内。该限制最终可能被取消。构造 crate 和其中宏的惯例如下:对于一个 foo 的包来说,一个自定义的派生过程宏的包被称为 foo_derive 。在 hello_macro 项目中新建名为 hello_macro_derive 的包。 $ cargo new hello_macro_derive --lib 由于两个 crate 紧密相关,因此在 hello_macro 包的目录下创建过程式宏的 crate。如果改变在 hello_macro 中定义的 trait,同时也必须改变在 hello_macro_derive 中实现的过程式宏。这两个包需要分别发布,编程人员如果使用这些包,则需要同时添加这两个依赖并将其引入作用域。我们也可以只用 hello_macro 包而将 hello_macro_derive 作为一个依赖,并重新导出过程式宏的代码。但现在我们组织项目的方式使编程人员在无需 derive 功能时也能够单独使用 hello_macro。 我们需要声明 hello_macro_derive crate 是过程宏 (proc-macro) crate。我们还需要 syn 和 quote crate 中的功能,正如你即将看到的,需要将它们加到依赖中。将下面的代码加入到 hello_macro_derive 的 Cargo.toml 文件中。 文件名:hello_macro_derive/Cargo.toml [lib]\nproc-macro = true [dependencies]\nsyn = \"2.0\"\nquote = \"1.0\" 为定义一个过程式宏,请将示例 19-31 中的代码放在 hello_macro_derive crate 的 src/lib.rs 文件里面。注意这段代码在我们添加 impl_hello_macro 函数的定义之前是无法编译的。 文件名:hello_macro_derive/src/lib.rs use proc_macro::TokenStream;\nuse quote::quote; #[proc_macro_derive(HelloMacro)]\npub fn hello_macro_derive(input: TokenStream) -> TokenStream { // Construct a representation of Rust code as a syntax tree // that we can manipulate let ast = syn::parse(input).unwrap(); // Build the trait implementation impl_hello_macro(&ast)\n} 示例 19-31: 大多数过程式宏处理 Rust 代码时所需的代码 注意我们将代码分成了hello_macro_derive 和 impl_hello_macro 两个函数,前者负责解析 TokenStream,后者负责转换语法树:这使得编写过程宏更方便。几乎你看到或者创建的每一个过程宏的外部函数(这里是hello_macro_derive)中的代码都跟这里是一样的。你放入内部函数(这里是impl_hello_macro)中的代码根据你的过程宏的设计目的会有所不同。 现在,我们已经引入了三个新的 crate:proc_macro 、 syn 和 quote 。Rust 自带 proc_macro crate,因此无需将其加到 Cargo.toml 文件的依赖中。proc_macro crate 是编译器用来读取和操作我们 Rust 代码的 API。 syn crate 将字符串中的 Rust 代码解析成为一个可以操作的数据结构。quote 则将 syn 解析的数据结构转换回 Rust 代码。这些 crate 让解析任何我们所要处理的 Rust 代码变得更简单:为 Rust 编写整个的解析器并不是一件简单的工作。 当用户在一个类型上指定 #[derive(HelloMacro)] 时,hello_macro_derive 函数将会被调用。因为我们已经使用 proc_macro_derive 及其指定名称HelloMacro对 hello_macro_derive 函数进行了注解,指定名称HelloMacro就是 trait 名,这是大多数过程宏遵循的习惯。 该函数首先将来自 TokenStream 的 input 转换为一个我们可以解释和操作的数据结构。这正是 syn 派上用场的地方。syn 中的 parse 函数获取一个 TokenStream 并返回一个表示解析出 Rust 代码的 DeriveInput 结构体。示例 19-32 展示了从字符串 struct Pancakes; 中解析出来的 DeriveInput 结构体的相关部分: DeriveInput { // --snip-- ident: Ident { ident: \"Pancakes\", span: #0 bytes(95..103) }, data: Struct( DataStruct { struct_token: Struct, fields: Unit, semi_token: Some( Semi ) } )\n} 示例 19-32: 解析示例 19-30 中带有宏属性的代码时得到的 DeriveInput 实例 该结构体的字段展示了我们解析的 Rust 代码是一个类单元结构体,其 ident(identifier,表示名字)为 Pancakes。该结构体里面有更多字段描述了所有类型的 Rust 代码,查阅 syn 中 DeriveInput 的文档 以获取更多信息。 很快我们将定义 impl_hello_macro 函数,其用于构建所要包含在内的 Rust 新代码。但在此之前,注意其输出也是 TokenStream。所返回的 TokenStream 会被加到我们的 crate 用户所写的代码中,因此,当用户编译他们的 crate 时,他们会通过修改后的 TokenStream 获取到我们所提供的额外功能。 你可能也注意到了,当调用 syn::parse 函数失败时,我们用 unwrap 来使 hello_macro_derive 函数 panic。在错误时 panic 对过程宏来说是必须的,因为 proc_macro_derive 函数必须返回 TokenStream 而不是 Result,以此来符合过程宏的 API。这里选择用 unwrap 来简化了这个例子;在生产代码中,则应该通过 panic! 或 expect 来提供关于发生何种错误的更加明确的错误信息。 现在我们有了将注解的 Rust 代码从 TokenStream 转换为 DeriveInput 实例的代码,让我们来创建在注解类型上实现 HelloMacro trait 的代码,如示例 19-33 所示。 文件名:hello_macro_derive/src/lib.rs # use proc_macro::TokenStream;\n# use quote::quote;\n# # #[proc_macro_derive(HelloMacro)]\n# pub fn hello_macro_derive(input: TokenStream) -> TokenStream {\n# // Construct a representation of Rust code as a syntax tree\n# // that we can manipulate\n# let ast = syn::parse(input).unwrap();\n# # // Build the trait implementation\n# impl_hello_macro(&ast)\n# }\n# fn impl_hello_macro(ast: &syn::DeriveInput) -> TokenStream { let name = &ast.ident; let gen = quote! { impl HelloMacro for #name { fn hello_macro() { println!(\"Hello, Macro! My name is {}!\", stringify!(#name)); } } }; gen.into()\n} 示例 19-33: 使用解析过的 Rust 代码实现 HelloMacro trait 我们得到一个包含以 ast.ident 作为注解类型名字(标识符)的 Ident 结构体实例。示例 19-32 中的结构体表明当 impl_hello_macro 函数运行于示例 19-30 中的代码上时 ident 字段的值是 \"Pancakes\"。因此,示例 19-33 中 name 变量会包含一个 Ident 结构体的实例,当打印时,会是字符串 \"Pancakes\",也就是示例 19-30 中结构体的名称。 quote! 宏能让我们编写希望返回的 Rust 代码。quote! 宏执行的直接结果并不是编译器所期望的所以需要转换为 TokenStream。为此需要调用 into 方法,它会消费这个中间表示(intermediate representation,IR)并返回所需的 TokenStream 类型值。 这个宏也提供了一些非常酷的模板机制;我们可以写 #name ,然后 quote! 会以名为 name 的变量值来替换它。你甚至可以做一些类似常用宏那样的重复代码的工作。查阅 quote crate 的文档 来获取详尽的介绍。 我们期望我们的过程式宏能够为通过 #name 获取到的用户注解类型生成 HelloMacro trait 的实现。该 trait 的实现有一个函数 hello_macro ,其函数体包括了我们期望提供的功能:打印 Hello, Macro! My name is 和注解的类型名。 此处所使用的 stringify! 为 Rust 内置宏。其接收一个 Rust 表达式,如 1 + 2 ,然后在编译时将表达式转换为一个字符串常量,如 \"1 + 2\" 。这与 format! 或 println! 是不同的,它计算表达式并将结果转换为 String 。有一种可能的情况是,所输入的 #name 可能是一个需要打印的表达式,因此我们用 stringify! 。stringify! 也能通过在编译时将 #name 转换为字符串来节省内存分配。 此时,cargo build 应该都能成功编译 hello_macro 和 hello_macro_derive 。我们将这些 crate 连接到示例 19-30 的代码中来看看过程宏的行为!在 projects 目录下用 cargo new pancakes 命令新建一个二进制项目。需要将 hello_macro 和 hello_macro_derive 作为依赖加到 pancakes 包的 Cargo.toml 文件中去。如果你正将 hello_macro 和 hello_macro_derive 的版本发布到 crates.io 上,其应为常规依赖;如果不是,则可以像下面这样将其指定为 path 依赖: hello_macro = { path = \"../hello_macro\" }\nhello_macro_derive = { path = \"../hello_macro/hello_macro_derive\" } 把示例 19-30 中的代码放在 src/main.rs ,然后执行 cargo run:其应该打印 Hello, Macro! My name is Pancakes!。其包含了该过程宏中 HelloMacro trait 的实现,而无需 pancakes crate 实现它;#[derive(HelloMacro)] 增加了该 trait 实现。 接下来,让我们探索一下其他类型的过程宏与自定义派生宏有何区别。","breadcrumbs":"高级特征 » 宏 » 如何编写自定义 derive 宏","id":"391","title":"如何编写自定义 derive 宏"},"392":{"body":"类属性宏与自定义派生宏相似,不同的是 derive 属性生成代码,它们(类属性宏)能让你创建新的属性。它们也更为灵活;derive 只能用于结构体和枚举;属性还可以用于其它的项,比如函数。作为一个使用类属性宏的例子,可以创建一个名为 route 的属性用于注解 web 应用程序框架(web application framework)的函数: #[route(GET, \"/\")]\nfn index() { #[route] 属性将由框架本身定义为一个过程宏。其宏定义的函数签名看起来像这样: #[proc_macro_attribute]\npub fn route(attr: TokenStream, item: TokenStream) -> TokenStream { 这里有两个 TokenStream 类型的参数;第一个用于属性内容本身,也就是 GET, \"/\" 部分。第二个是属性所标记的项:在本例中,是 fn index() {} 和剩下的函数体。 除此之外,类属性宏与自定义派生宏工作方式一致:创建 proc-macro crate 类型的 crate 并实现希望生成代码的函数!","breadcrumbs":"高级特征 » 宏 » 类属性宏","id":"392","title":"类属性宏"},"393":{"body":"类函数(Function-like)宏的定义看起来像函数调用的宏。类似于 macro_rules!,它们比函数更灵活;例如,可以接受未知数量的参数。然而 macro_rules! 宏只能使用之前 “使用 macro_rules! 的声明宏用于通用元编程” 介绍的类匹配的语法定义。类函数宏获取 TokenStream 参数,其定义使用 Rust 代码操纵 TokenStream,就像另两种过程宏一样。一个类函数宏例子是可以像这样被调用的 sql! 宏: let sql = sql!(SELECT * FROM posts WHERE id=1); 这个宏会解析其中的 SQL 语句并检查其是否是句法正确的,这是比 macro_rules! 可以做到的更为复杂的处理。sql! 宏应该被定义为如此: #[proc_macro]\npub fn sql(input: TokenStream) -> TokenStream { 这类似于自定义派生宏的签名:获取括号中的 token,并返回希望生成的代码。","breadcrumbs":"高级特征 » 宏 » 类函数宏","id":"393","title":"类函数宏"},"394":{"body":"好的!现在我们学习了 Rust 并不常用但在特定情况下你可能用得着的功能。我们介绍了很多复杂的主题,这样若你在错误信息提示或阅读他人代码时遇到它们,至少可以说之前已经见过这些概念和语法了。你可以使用本章作为一个解决方案的参考。 接下来,我们将再开始一个项目,将本书所学的所有内容付与实践!","breadcrumbs":"高级特征 » 宏 » 总结","id":"394","title":"总结"},"395":{"body":"ch21-00-final-project-a-web-server.md commit 5df6909c57b3ba55f156a4122a42b805436de90c 这是一次漫长的旅途,不过我们到达了本书的结束。在本章中,我们将一同构建另一个项目,来展示最后几章所学,同时复习更早的章节。 作为最后的项目,我们将要实现一个返回 “hello” 的 web server,它在浏览器中看起来就如图例 20-1 所示: hello from rust 图例 20-1: 我们最后将一起分享的项目 如下是构建 web server 的计划: 学习一些 TCP 与 HTTP 知识 在套接字(socket)上监听 TCP 请求 解析少量的 HTTP 请求 创建一个合适的 HTTP 响应 通过线程池改善 server 的吞吐量 不过在开始之前,需要提到一点细节:这里使用的方法并不是使用 Rust 构建 web server 最好的方法。 crates.io 上有很多可用于生产环境的 crate,它们提供了比我们所要编写的更为完整的 web server 和线程池实现。然而,本章的目的在于学习,而不是走捷径。因为 Rust 是一个系统编程语言,我们能够选择处理什么层次的抽象,并能够选择比其他语言可能或可用的层次更低的层次。因此我们将自己编写一个基础的 HTTP server 和线程池,以便学习将来可能用到的 crate 背后的通用理念和技术。","breadcrumbs":"最后的项目:构建多线程 web server » 最后的项目:构建多线程 web server","id":"395","title":"最后的项目:构建多线程 web server"},"396":{"body":"ch21-01-single-threaded.md commit 5df6909c57b3ba55f156a4122a42b805436de90c 首先让我们创建一个可运行的单线程 web server,不过在开始之前,我们将快速了解一下构建 web server 所涉及到的协议。这些协议的细节超出了本书的范畴,不过一个简单的概括会提供我们所需的信息。 web server 中涉及到的两个主要协议是 超文本传输协议 ( Hypertext Transfer Protocol , HTTP )和 传输控制协议 ( Transmission Control Protocol , TCP )。这两者都是 请求 - 响应 ( request-response )协议,也就是说,有 客户端 ( client )来初始化请求,并有 服务端 ( server )监听请求并向客户端提供响应。请求与响应的内容由协议本身定义。 TCP 是一个底层协议,它描述了信息如何从一个 server 到另一个的细节,不过其并不指定信息是什么。HTTP 构建于 TCP 之上,它定义了请求和响应的内容。为此,技术上讲可将 HTTP 用于其他协议之上,不过对于绝大部分情况,HTTP 通过 TCP 传输。我们将要做的就是处理 TCP 和 HTTP 请求与响应的原始字节数据。","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 构建单线程 web server","id":"396","title":"构建单线程 web server"},"397":{"body":"我们的 web server 所需做的第一件事,是监听 TCP 连接。标准库提供了 std::net 模块处理这些功能。让我们一如既往新建一个项目: $ cargo new hello Created binary (application) `hello` project\n$ cd hello 现在,在 src/main.rs 输入示例 20-1 中的代码,作为一个开始。这段代码会在地址 127.0.0.1:7878 上监听传入的 TCP 流。当获取到传入的流,它会打印出 Connection established!: 文件名:src/main.rs use std::net::TcpListener; fn main() { let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap(); for stream in listener.incoming() { let stream = stream.unwrap(); println!(\"Connection established!\"); }\n} 示例 20-1: 监听传入的流并在接收到流时打印信息 TcpListener 用于监听 TCP 连接。我们选择监听本地地址 127.0.0.1:7878。将这个地址拆开来看,冒号之前的部分是一个代表本机的 IP 地址(在每台计算机上,这个地址都指本机,并不特指作者的计算机),而 7878 是端口。选择这个端口出于两个原因:通常 HTTP 服务器不在这个端口上接受请求,所以它不太可能与你机器上运行的其它 web server 的端口冲突;而且 7878 在电话上打出来就是 \"rust\"(译者注:九宫格键盘上的英文)。 在这个场景中 bind 函数类似于 new 函数,在这里它返回一个新的 TcpListener 实例。这个函数叫做 bind 是因为,在网络领域,连接到要监听的端口称为“绑定到端口”(“binding to a port”) bind 函数返回 Result<T, E>,这表明绑定可能会失败。例如,监听 80 端口需要管理员权限(非管理员用户只能监听大于 1023 的端口),所以如果尝试监听 80 端口而没有管理员权限,则会绑定失败。再比如,如果我们运行这个程序的两个实例,并因此有两个实例监听同一个端口,那么绑定也将失败。我们是出于学习目的来编写一个基础的服务器,不用关心处理这类错误,而仅仅使用 unwrap 在出现这些情况时直接停止程序。 TcpListener 的 incoming 方法返回一个迭代器,它提供了一系列的流(更准确的说是 TcpStream 类型的流)。 流 ( stream )代表一个客户端和服务端之间打开的连接。 连接 ( connection )代表客户端连接服务端、服务端生成响应以及服务端关闭连接的全部请求 / 响应过程。为此,我们会从 TcpStream 读取客户端发送了什么并接着向流发送响应以向客户端发回数据。总体来说,这个 for 循环会依次处理每个连接并产生一系列的流供我们处理。 目前,处理流的代码中也有一个 unwrap 调用,如果 stream 出现任何错误会终止程序;如果没有任何错误,则打印出信息。下一个例子中,我们将为成功的情况增加更多功能。当客户端连接到服务端时,incoming 方法是可能返回错误的,因为我们实际上不是在遍历连接,而是遍历 连接尝试 ( connection attempts )。连接的尝试可能会因为多种原因不能成功,大部分是操作系统相关的。例如,很多系统限制同时打开的连接数,超出数量限制的新连接尝试会产生错误,直到一些现有的连接关闭为止。 让我们试试这段代码!首先在终端执行 cargo run,接着在浏览器中打开 127.0.0.1:7878。浏览器会显示出看起来类似于“连接重置”(“Connection reset”)的错误信息,因为 server 目前并没响应任何数据。如果我们观察终端,会发现当浏览器连接我们的服务端时,会打印出一系列的信息! Running `target/debug/hello`\nConnection established!\nConnection established!\nConnection established! 有时,对于一次浏览器请求,可能会打印出多条信息;这可能是因为,浏览器在请求页面的同时,还请求了其他资源,比如出现在浏览器标签页开头的图标( favicon.ico )。 这也可能是因为浏览器尝试多次连接服务端,因为服务端没有响应任何数据。作为 drop 实现的一部分,当 stream 在循环的结尾离开作用域并被丢弃,其连接将被关闭。浏览器有时通过重连来处理关闭的连接,因为对于一般网站而言,这些问题可能是暂时的。这些都不重要;现在重要的是,我们成功的处理了 TCP 连接! 记得当运行完特定版本的代码后,使用 ctrl-C 来停止程序。并通过执行 cargo run 命令在做出最新的代码修改之后重启服务。","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 监听 TCP 连接","id":"397","title":"监听 TCP 连接"},"398":{"body":"让我们实现读取来自浏览器请求的功能!为了分离“获取连接”以及“接下来对连接的操作”,我们将开始写一个新函数来处理连接。在这个新的 handle_connection 函数中,我们从 TCP 流中读取数据,并打印出来,以便观察浏览器发送过来的数据。将代码修改为如示例 20-2 所示: 文件名:src/main.rs use std::{ io::{prelude::*, BufReader}, net::{TcpListener, TcpStream},\n}; fn main() { let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap(); for stream in listener.incoming() { let stream = stream.unwrap(); handle_connection(stream); }\n} fn handle_connection(mut stream: TcpStream) { let buf_reader = BufReader::new(&stream); let http_request: Vec<_> = buf_reader .lines() .map(|result| result.unwrap()) .take_while(|line| !line.is_empty()) .collect(); println!(\"Request: {http_request:#?}\");\n} 示例 20-2: 读取 TcpStream 并打印数据 这里将 std::io::prelude 和 std::io::BufReader 引入作用域,来获取读写流所需的特定 trait。在 main 函数的 for 循环中,相比获取到连接时打印信息,现在调用新的 handle_connection 函数并向其传递 stream。 在 handle_connection 中,我们新建了一个 BufReader 实例来封装一个 stream 的可变引用。BufReader 增加了缓存来替我们管理 std::io::Read trait 方法的调用。 我们创建了一个 http_request 变量来收集浏览器发送给服务端的请求行。这里增加了 Vec<_> 类型注解表明希望将这些行收集到一个 vector 中。 BufReader 实现了 std::io::BufRead trait,它提供了 lines 方法。lines 方法通过遇到换行符(newline)字节就切分数据流的方式返回一个 Result<String, std::io::Error> 的迭代器。为了获取每一个 String,通过 map 并 unwrap 每一个 Result。如果数据不是有效的 UTF-8 编码或者读取流遇到问题时,Result 可能是一个错误。一如既往生产环境的程序应该更优雅地处理这些错误,不过出于简单的目的我们选择在错误情况下停止程序。 浏览器通过连续发送两个换行符来代表一个 HTTP 请求的结束,所以为了从流中获取一个请求,我们获取行直到它们不为空。一旦将这些行收集进 vector,就可以使用友好的 debug 格式化打印它们,以便看看 web 浏览器发送给服务端的指令。 让我们试一试!启动程序并再次在浏览器中发起请求。注意浏览器中仍然会出现错误页面,不过终端中程序的输出现在看起来像这样: $ cargo run Compiling hello v0.1.0 (file:///projects/hello) Finished dev [unoptimized + debuginfo] target(s) in 0.42s Running `target/debug/hello`\nRequest: [ \"GET / HTTP/1.1\", \"Host: 127.0.0.1:7878\", \"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:99.0) Gecko/20100101 Firefox/99.0\", \"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\", \"Accept-Language: en-US,en;q=0.5\", \"Accept-Encoding: gzip, deflate, br\", \"DNT: 1\", \"Connection: keep-alive\", \"Upgrade-Insecure-Requests: 1\", \"Sec-Fetch-Dest: document\", \"Sec-Fetch-Mode: navigate\", \"Sec-Fetch-Site: none\", \"Sec-Fetch-User: ?1\", \"Cache-Control: max-age=0\",\n] 根据使用的浏览器不同可能会出现稍微不同的数据。现在我们打印出了请求数据,可以通过观察第一行 GET 之后的路径来解释为何会从浏览器得到多个连接。如果重复的连接都是请求 / ,就知道了浏览器尝试重复获取 / 因为它没有从程序得到响应。 让我们拆开请求数据来理解浏览器向程序请求了什么。 仔细观察 HTTP 请求 HTTP 是一个基于文本的协议,同时一个请求有如下格式: Method Request-URI HTTP-Version CRLF\nheaders CRLF\nmessage-body 第一行叫做 请求行 ( request line ),它存放了客户端请求了什么的信息。请求行的第一部分是所使用的 method ,比如 GET 或 POST,这描述了客户端如何进行请求。这里客户端使用了 GET 请求,表明它在请求信息。 请求行接下来的部分是 / ,它代表客户端请求的 统一资源标识符 ( Uniform Resource Identifier , URI ) —— URI 大体上类似,但也不完全类似于 URL( 统一资源定位符 , Uniform Resource Locators )。URI 和 URL 之间的区别对于本章的目的来说并不重要,不过 HTTP 规范使用术语 URI,所以这里可以简单的将 URL 理解为 URI。 最后一部分是客户端使用的 HTTP 版本,然后请求行以 CRLF 序列 (CRLF 代表回车和换行, carriage return line feed ,这是打字机时代的术语!)结束。CRLF 序列也可以写成\\r\\n,其中\\r是回车符,\\n是换行符。CRLF 序列将请求行与其余请求数据分开。请注意,打印 CRLF 时,我们会看到一个新行,而不是\\r\\n。 观察目前运行程序所接收到的数据的请求行,可以看到 GET 是 method, / 是请求 URI,而 HTTP/1.1 是版本。 从 Host: 开始的其余的行是 headers;GET 请求没有 body。 如果你希望的话,尝试用不同的浏览器发送请求,或请求不同的地址,比如 127.0.0.1:7878/test,来观察请求数据如何变化。 现在我们知道了浏览器请求了什么。让我们返回一些数据!","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 读取请求","id":"398","title":"读取请求"},"399":{"body":"我们将实现在客户端请求的响应中发送数据的功能。响应有如下格式: HTTP-Version Status-Code Reason-Phrase CRLF\nheaders CRLF\nmessage-body 第一行叫做 状态行 ( status line ),它包含响应的 HTTP 版本、一个数字状态码用以总结请求的结果和一个描述之前状态码的文本原因短语。CRLF 序列之后是任意 header,另一个 CRLF 序列,和响应的 body。 这里是一个使用 HTTP 1.1 版本的响应例子,其状态码为 200,原因短语为 OK,没有 header,也没有 body: HTTP/1.1 200 OK\\r\\n\\r\\n 状态码 200 是一个标准的成功响应。这些文本是一个微型的成功 HTTP 响应。让我们将这些文本写入流作为成功请求的响应!在 handle_connection 函数中,我们需要去掉打印请求数据的 println!,并替换为示例 20-3 中的代码: 文件名:src/main.rs # use std::{\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# };\n# # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # handle_connection(stream);\n# }\n# }\n# fn handle_connection(mut stream: TcpStream) { let buf_reader = BufReader::new(&stream); let http_request: Vec<_> = buf_reader .lines() .map(|result| result.unwrap()) .take_while(|line| !line.is_empty()) .collect(); let response = \"HTTP/1.1 200 OK\\r\\n\\r\\n\"; stream.write_all(response.as_bytes()).unwrap();\n} 示例 20-3: 将一个微型成功 HTTP 响应写入流 新代码中的第一行定义了变量 response 来存放将要返回的成功响应的数据。接着,在 response 上调用 as_bytes,因为 stream 的 write_all 方法获取一个 &[u8] 并直接将这些字节发送给连接。因为 write_all 操作可能会失败,所以像之前那样对任何错误结果使用 unwrap。同理,在真实世界的应用中这里需要添加错误处理。 有了这些修改,运行我们的代码并进行请求!我们不再向终端打印任何数据,所以不会再看到除了 Cargo 以外的任何输出。不过当在浏览器中加载 127.0.0.1:7878 时,会得到一个空页面而不是错误。太棒了!我们刚刚手写收发了一个 HTTP 请求与响应。","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 编写响应","id":"399","title":"编写响应"},"4":{"body":"Rust 已证明是一个对于具有不同系统编程知识水平的大型开发团队协作而言,非常高效的工具。底层代码容易出现各种微妙的错误,在大多数其他语言中,这些错误只能通过广泛的测试和经验丰富的开发者的仔细审核代码来捕捉。在 Rust 中,编译器充当了守门员的角色,拒绝编译包含这些难以察觉的错误的代码,包括并发错误。通过与编译器合作,团队可以将时间集中在程序逻辑上,而不是追踪 bug。 Rust 也为系统编程世界带来了现代化的开发工具: Cargo 是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。 Rustfmt 格式化工具确保开发者遵循一致的代码风格。 rust-analyzer 为集成开发环境(IDE)提供了强大的代码补全和内联错误信息功能。 通过使用 Rust 生态系统中丰富的工具,开发者在编写系统级代码时可以更加高效。","breadcrumbs":"简介 » 开发者团队","id":"4","title":"开发者团队"},"40":{"body":"记住,crate 是一组 Rust 源代码文件。我们正在构建的项目是一个 二进制 crate ,它生成一个可执行文件。 rand crate 是一个 库 crate ,库 crate 可以包含任意能被其他程序使用的代码,但是无法独立执行。 Cargo 对外部 crate 的运用是其真正的亮点所在。在我们使用 rand 编写代码之前,需要修改 Cargo.toml 文件,引入一个 rand 依赖。现在打开这个文件并将下面这一行添加到 [dependencies] 片段标题之下。在当前版本下,请确保按照我们这里的方式指定 rand,否则本教程中的示例代码可能无法工作。 文件名:Cargo.toml [dependencies]\nrand = \"0.8.5\" 在 Cargo.toml 文件中,标题以及之后的内容属同一个片段,直到遇到下一个标题才开始新的片段。[dependencies] 片段告诉 Cargo 本项目依赖了哪些外部 crate 及其版本。本例中,我们使用语义化版本 0.8.5 来指定 rand crate。Cargo 理解 语义化版本(Semantic Versioning) (有时也称为 SemVer ),这是一种定义版本号的标准。0.8.5 事实上是 ^0.8.5 的简写,它表示任何至少是 0.8.5 但小于 0.9.0 的版本。 Cargo 认为这些版本与 0.8.5 版本的公有 API 相兼容,这样的版本指定确保了我们可以获取能使本章代码编译的最新的补丁(patch)版本。任何大于等于 0.9.0 的版本不能保证和接下来的示例采用了相同的 API。 现在,不修改任何代码,构建项目,如示例 2-2 所示。 $ cargo build Updating crates.io index Downloaded rand v0.8.5 Downloaded libc v0.2.127 Downloaded getrandom v0.2.7 Downloaded cfg-if v1.0.0 Downloaded ppv-lite86 v0.2.16 Downloaded rand_chacha v0.3.1 Downloaded rand_core v0.6.3 Compiling libc v0.2.127 Compiling getrandom v0.2.7 Compiling cfg-if v1.0.0 Compiling ppv-lite86 v0.2.16 Compiling rand_core v0.6.3 Compiling rand_chacha v0.3.1 Compiling rand v0.8.5 Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 2.53s 示例 2-2:将 rand crate 添加为依赖之后运行 `cargo build` 的输出 可能会出现不同的版本号(多亏了语义化版本,它们与代码是兼容的!),并且显示的行数可能会有所不同(取决于操作系统),行的顺序也可能会不同。 现在我们有了一个外部依赖,Cargo 从 registry 上获取所有包的最新版本信息,这是一份来自 Crates.io 的数据副本。Crates.io 是 Rust 生态系统中,人们发布其开源 Rust 项目的平台,供他人使用。 在更新完 registry 后,Cargo 检查 [dependencies] 片段并下载列表中包含但还未下载的 crates。本例中,虽然只声明了 rand 一个依赖,然而 Cargo 还是额外获取了 rand 所需要的其他 crates,因为 rand 依赖它们来正常工作。下载完成后,Rust 编译依赖,然后使用这些依赖编译项目。 如果不做任何修改,立刻再次运行 cargo build,则不会看到任何除了 Finished 行之外的输出。Cargo 知道它已经下载并编译了依赖,同时 Cargo.toml 文件也没有变动。Cargo 还知道代码也没有任何修改,所以它不会重新编译代码。因为无事可做,它会简单地退出。 如果打开 src/main.rs 文件,做一些无关紧要的修改,保存并再次构建,则会出现两行输出: $ cargo build Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 2.53 secs 这一行表示 Cargo 只针对 src/main.rs 文件的微小修改而更新构建。依赖没有变化,所以 Cargo 知道它可以复用已经为此下载并编译的代码。它只是重新构建了部分(项目)代码。 Cargo.lock 文件确保构建是可重现的 Cargo 有一个机制,确保无论是你还是其他人在任何时候重新构建代码,都会生成相同的构建产物:Cargo 只会使用你指定的依赖版本,除非你明确指定其他版本。例如,如果下周 rand crate 的 0.8.6 版本出来了,该版本包含了一个重要的 bug 修复,但同时也引入了一个会破坏你代码的回归问题。为了解决这个问题,Rust 在你第一次运行 cargo build 时创建了 Cargo.lock 文件,我们现在可以在 guessing_game 目录找到它。 当第一次构建项目时,Cargo 计算出所有符合要求的依赖版本并写入 Cargo.lock 文件。当将来构建项目时,Cargo 会发现 Cargo.lock 已存在并使用其中指定的版本,而不是再次计算所有的版本。这使得你拥有了一个自动化的可重现的构建。换句话说,项目会持续使用 0.8.5 直到你显式升级,多亏有了 Cargo.lock 文件。由于 Cargo.lock 文件对于“可重复构建”非常重要,因此它通常会和项目中的其余代码一样纳入到版本控制系统中。 更新 crate 到一个新版本 当你 确实 需要升级 crate 时,Cargo 提供了这样一个命令,update,它会忽略 Cargo.lock 文件,并计算出所有符合 Cargo.toml 声明的最新版本。Cargo 接下来会把这些版本写入 Cargo.lock 文件。不过,Cargo 默认只会寻找大于 0.8.5 而小于 0.9.0 的版本。如果 rand crate 发布了两个新版本,0.8.6 和 0.9.0,在运行 cargo update 时会出现如下内容: $ cargo update Updating crates.io index Updating rand v0.8.5 -> v0.8.6 Cargo 忽略了 0.9.0 版本。这时,你也会注意到的 Cargo.lock 文件中的变化无外乎现在使用的 rand crate 版本是0.8.6 。如果想要使用 0.9.0 版本的 rand 或是任何 0.9.x 系列的版本,必须像这样更新 Cargo.toml 文件: [dependencies]\nrand = \"0.9.0\" 下一次运行 cargo build 时,Cargo 会更新可用 crate 的 registry,并根据你指定的新版本重新评估 rand 的要求。 第十四章会讲到 Cargo 及其 生态系统 的更多内容,不过目前你只需要了解这么多。通过 Cargo 复用库文件非常容易,因此 Rustacean 能够编写出由很多包组装而成的更轻巧的项目。","breadcrumbs":"写个猜数字游戏 » 使用 crate 来增加更多功能","id":"40","title":"使用 crate 来增加更多功能"},"400":{"body":"让我们实现不只是返回空页面的功能。在项目根目录创建一个新文件, hello.html —— 也就是说,不是在 src 目录。在此可以放入任何你期望的 HTML;列表 20-4 展示了一个可能的文本: 文件名:hello.html <!DOCTYPE html>\n<html lang=\"en\"> <head> <meta charset=\"utf-8\"> <title>Hello!

    Hello!

    Hi from Rust

    \n 示例 20-4: 一个简单的 HTML 文件用来作为响应 这是一个极小化的 HTML5 文档,它有一个标题和一小段文本。为了在 server 接受请求时返回它,需要如示例 20-5 所示修改 handle_connection 来读取 HTML 文件,将其加入到响应的 body 中,并发送: 文件名:src/main.rs use std::{ fs, io::{prelude::*, BufReader}, net::{TcpListener, TcpStream},\n};\n// --snip-- # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # handle_connection(stream);\n# }\n# }\n# fn handle_connection(mut stream: TcpStream) { let buf_reader = BufReader::new(&stream); let http_request: Vec<_> = buf_reader .lines() .map(|result| result.unwrap()) .take_while(|line| !line.is_empty()) .collect(); let status_line = \"HTTP/1.1 200 OK\"; let contents = fs::read_to_string(\"hello.html\").unwrap(); let length = contents.len(); let response = format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\"); stream.write_all(response.as_bytes()).unwrap();\n} 示例 20-5: 将 hello.html 的内容作为响应 body 发送 我们在开头 use 语句将标准库的文件系统模块 fs 引入作用域。打开和读取文件的代码应该看起来很熟悉,因为第十二章 I/O 项目的示例 12-4 中读取文件内容时出现过类似的代码。 接下来,使用 format! 将文件内容加入到将要写入流的成功响应的 body 中。 使用 cargo run 运行程序,在浏览器加载 127.0.0.1:7878 ,你应该会看到渲染出来的 HTML 文件! 目前忽略了 http_request 中的请求数据并无条件的发送了 HTML 文件的内容。这意味着如果尝试在浏览器中请求 127.0.0.1:7878/something-else 也会得到同样的 HTML 响应。目前我们的 server 的作用是非常有限的,也不是大部分 server 所做的;让我们检查请求并只对格式良好(well-formed)的请求 / 发送 HTML 文件。","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 返回真正的 HTML","id":"400","title":"返回真正的 HTML"},"401":{"body":"目前我们的 web server 不管客户端请求什么都会返回相同的 HTML 文件。让我们增加在返回 HTML 文件前检查浏览器是否请求 / ,并在其请求任何其他内容时返回错误的功能。为此需要如示例 20-6 那样修改 handle_connection。新代码接收到的请求的内容与已知的 / 请求的一部分做比较,并增加了 if 和 else 块来区别处理请求: 文件名:src/main.rs # use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# };\n# # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # handle_connection(stream);\n# }\n# }\n// --snip-- fn handle_connection(mut stream: TcpStream) { let buf_reader = BufReader::new(&stream); let request_line = buf_reader.lines().next().unwrap().unwrap(); if request_line == \"GET / HTTP/1.1\" { let status_line = \"HTTP/1.1 200 OK\"; let contents = fs::read_to_string(\"hello.html\").unwrap(); let length = contents.len(); let response = format!( \"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\" ); stream.write_all(response.as_bytes()).unwrap(); } else { // some other request }\n} 示例 20-6: 以不同于其它请求的方式处理 / 请求 我们只看 HTTP 请求的第一行,所以不同于将整个请求读取进 vector 中,这里调用 next 从迭代器中获取第一项。第一个 unwrap 负责处理 Option 并在迭代器没有项时停止程序。第二个 unwrap 处理 Result 并与示例 20-2 中增加的 map 中的 unwrap 有着相同的效果。 接下来检查 request_line 是否等于一个 / 路径的 GET 请求。如果是,if 代码块返回 HTML 文件的内容。 如果 request_line 不 等于一个 / 路径的 GET 请求,就说明接收的是其他请求。我们之后会在 else 块中增加代码来响应所有其他请求。 现在如果运行代码并请求 127.0.0.1:7878 ,就会得到 hello.html 中的 HTML。如果进行任何其他请求,比如 127.0.0.1:7878/something-else ,则会得到像运行示例 20-1 和 20-2 中代码那样的连接错误。 现在向示例 20-7 的 else 块增加代码来返回一个带有 404 状态码的响应,这代表了所请求的内容没有找到。接着也会返回一个 HTML 向浏览器终端用户表明此意: 文件名:src/main.rs # use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# };\n# # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # handle_connection(stream);\n# }\n# }\n# # fn handle_connection(mut stream: TcpStream) {\n# let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap();\n# # if request_line == \"GET / HTTP/1.1\" {\n# let status_line = \"HTTP/1.1 200 OK\";\n# let contents = fs::read_to_string(\"hello.html\").unwrap();\n# let length = contents.len();\n# # let response = format!(\n# \"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\"\n# );\n# # stream.write_all(response.as_bytes()).unwrap(); // --snip-- } else { let status_line = \"HTTP/1.1 404 NOT FOUND\"; let contents = fs::read_to_string(\"404.html\").unwrap(); let length = contents.len(); let response = format!( \"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\" ); stream.write_all(response.as_bytes()).unwrap(); }\n# } 示例 20-7: 对于任何不是 / 的请求返回 404 状态码的响应和错误页面 这里,响应的状态行有状态码 404 和原因短语 NOT FOUND。仍然没有返回任何 header,而其 body 将是 404.html 文件中的 HTML。需要在 hello.html 同级目录创建 404.html 文件作为错误页面;这一次也可以随意使用任何 HTML 或使用示例 20-8 中的示例 HTML: 文件名:404.html \n Hello!

    Oops!

    Sorry, I don't know what you're asking for.

    \n 示例 20-8: 任何 404 响应所返回错误页面内容样例 有了这些修改,再次运行 server。请求 127.0.0.1:7878 应该会返回 hello.html 的内容,而对于任何其他请求,比如 127.0.0.1:7878/foo ,应该会返回 404.html 中的错误 HTML!","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 验证请求并有选择的进行响应","id":"401","title":"验证请求并有选择的进行响应"},"402":{"body":"目前 if 和 else 块中的代码有很多的重复:他们都读取文件并将其内容写入流。唯一的区别是状态行和文件名。为了使代码更为简明,将这些区别分别提取到一行 if 和 else 中,对状态行和文件名变量赋值;然后在读取文件和写入响应的代码中无条件的使用这些变量。重构后取代了大段 if 和 else 块代码后的结果如示例 20-9 所示: 文件名:src/main.rs # use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# };\n# # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # handle_connection(stream);\n# }\n# }\n// --snip-- fn handle_connection(mut stream: TcpStream) { // --snip--\n# let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap(); let (status_line, filename) = if request_line == \"GET / HTTP/1.1\" { (\"HTTP/1.1 200 OK\", \"hello.html\") } else { (\"HTTP/1.1 404 NOT FOUND\", \"404.html\") }; let contents = fs::read_to_string(filename).unwrap(); let length = contents.len(); let response = format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\"); stream.write_all(response.as_bytes()).unwrap();\n} 示例 20-9: 重构使得 if 和 else 块中只包含两个情况所不同的代码 现在 if 和 else 块所做的唯一的事就是在一个元组中返回合适的状态行和文件名的值;接着使用第十九章讲到的使用模式的 let 语句通过解构元组的两部分为 filename 和 header 赋值。 之前读取文件和写入响应的冗余代码现在位于 if 和 else 块之外,并会使用变量 status_line 和 filename。这样更易于观察这两种情况真正有何不同,还意味着如果需要改变如何读取文件或写入响应时只需要更新一处的代码。示例 20-9 中代码的行为与示例 20-8 完全一样。 好极了!我们有了一个 40 行左右 Rust 代码的小而简单的 server,它对一个请求返回页面内容而对所有其他请求返回 404 响应。 目前 server 运行于单线程中,它一次只能处理一个请求。让我们模拟一些慢请求来看看这如何会成为一个问题,并进行修复以便 server 可以一次处理多个请求。","breadcrumbs":"最后的项目:构建多线程 web server » 建立单线程 web server » 少量代码重构","id":"402","title":"少量代码重构"},"403":{"body":"ch21-02-multithreaded.md commit 98c6225e5fb8255349ec0dc235433530ed3fb534 目前 server 会依次处理每一个请求,意味着它在完成第一个连接的处理之前不会处理第二个连接。如果 server 正接收越来越多的请求,这类串行操作会使性能越来越差。如果一个请求花费很长时间来处理,随后而来的请求则不得不等待这个长请求结束,即便这些新请求可以很快就处理完。我们需要修复这种情况,不过首先让我们实际尝试一下这个问题。","breadcrumbs":"最后的项目:构建多线程 web server » 将单线程 server 变为多线程 server » 将单线程 server 变为多线程 server","id":"403","title":"将单线程 server 变为多线程 server"},"404":{"body":"让我们看看一个慢请求如何影响当前 server 实现中的其他请求。示例 20-10 通过模拟慢响应实现了 /sleep 请求处理,它会使 server 在响应之前休眠五秒。 文件名:src/main.rs use std::{ fs, io::{prelude::*, BufReader}, net::{TcpListener, TcpStream}, thread, time::Duration,\n};\n// --snip--\n# # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # handle_connection(stream);\n# }\n# } fn handle_connection(mut stream: TcpStream) { // --snip-- # let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap();\n# let (status_line, filename) = match &request_line[..] { \"GET / HTTP/1.1\" => (\"HTTP/1.1 200 OK\", \"hello.html\"), \"GET /sleep HTTP/1.1\" => { thread::sleep(Duration::from_secs(5)); (\"HTTP/1.1 200 OK\", \"hello.html\") } _ => (\"HTTP/1.1 404 NOT FOUND\", \"404.html\"), }; // --snip--\n# # let contents = fs::read_to_string(filename).unwrap();\n# let length = contents.len();\n# # let response =\n# format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\");\n# # stream.write_all(response.as_bytes()).unwrap();\n} 示例 20-10: 通过休眠五秒来模拟慢请求 从 if 切换到 match 后现在有三个分支了。我们需要显式匹配一个 slice 的 request_line 以匹配字符串字面值的模式。match 不会像相等方法那样自动引用和解引用。 第一个分支与示例 20-9 中的 if 代码块相同。第二个分支匹配一个 /sleep 请求。当接收到这个请求时,server 在渲染成功 HTML 页面之前会先休眠五秒。第三个分支与示例 20-9 中的 else 代码块相同。 现在就可以真切的看出我们的 server 有多么的原始:真实的库将会以更简洁的方式处理多请求识别问题! 使用 cargo run 启动 server,并接着打开两个浏览器窗口:一个请求 http://127.0.0.1:7878/ 而另一个请求 http://127.0.0.1:7878/sleep 。如果像之前一样多次请求 / ,会发现响应的比较快速。不过如果请求 /sleep 之后再请求 / ,就会看到 / 会等待直到 sleep 休眠完五秒之后才出现。 有多种技术可以用来避免所有请求都排在慢请求之后;我们将要实现的一个便是线程池。","breadcrumbs":"最后的项目:构建多线程 web server » 将单线程 server 变为多线程 server » 在当前 server 实现中模拟慢请求","id":"404","title":"在当前 server 实现中模拟慢请求"},"405":{"body":"线程池 ( thread pool )是一组预先分配的等待或准备处理任务的线程。当程序收到一个新任务,线程池中的一个线程会被分配任务,这个线程会离开并处理任务。其余的线程则可用于处理在第一个线程处理任务的同时处理其他接收到的任务。当第一个线程处理完任务时,它会返回空闲线程池中等待处理新任务。线程池允许我们并发处理连接,增加 server 的吞吐量。 我们会将池中线程限制为较少的数量,以防拒绝服务(Denial of Service,DoS)攻击;如果程序为每一个接收的请求都新建一个线程,某人向 server 发起千万级的请求时会耗尽服务器的资源并导致所有请求的处理都被终止。 不同于分配无限的线程,线程池中将有固定数量的等待线程。当新进请求时,将请求发送到线程池中做处理。线程池会维护一个接收请求的队列。每一个线程会从队列中取出一个请求,处理请求,接着向队列索取另一个请求。通过这种设计,则可以并发处理 N 个请求,其中 N 为线程数。如果每一个线程都在响应慢请求,之后的请求仍然会阻塞队列,不过相比之前增加了能处理的慢请求的数量。 这个设计仅仅是多种改善 web server 吞吐量的方法之一。其他可供探索的方法有 fork/join 模型 ( fork/join model )、 单线程异步 I/O 模型 ( single-threaded async I/O model )或者 多线程异步 I/O 模型 ( multi-threaded async I/O model )。如果你对这个主题感兴趣,则可以阅读更多关于其他解决方案的内容并尝试实现它们;对于一个像 Rust 这样的底层语言,所有这些方法都是可能的。 在开始之前,让我们讨论一下线程池应用看起来怎样。当尝试设计代码时,首先编写客户端接口确实有助于指导代码设计。以期望的调用方式来构建 API 代码的结构,接着在这个结构之内实现功能,而不是先实现功能再设计公有 API。 类似于第十二章项目中使用的测试驱动开发。这里将要使用编译器驱动开发(compiler-driven development)。我们将编写调用所期望的函数的代码,接着观察编译器错误告诉我们接下来需要修改什么使得代码可以工作。不过在开始之前,我们将探索不会作为起点的技术。 为每一个请求分配线程 首先,让我们探索一下为每一个连接都创建一个线程的代码看起来如何。这并不是最终方案,因为正如之前讲到的它会潜在的分配无限的线程,不过这是一个可用的多线程 server 的起点。接着我们会增加线程池作为改进,这样比较两个方案将会更容易。示例 20-11 展示了 main 的改变,它在 for 循环中为每一个流分配了一个新线程进行处理: 文件名:src/main.rs # use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# thread,\n# time::Duration,\n# };\n# fn main() { let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap(); for stream in listener.incoming() { let stream = stream.unwrap(); thread::spawn(|| { handle_connection(stream); }); }\n}\n# # fn handle_connection(mut stream: TcpStream) {\n# let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap();\n# # let (status_line, filename) = match &request_line[..] {\n# \"GET / HTTP/1.1\" => (\"HTTP/1.1 200 OK\", \"hello.html\"),\n# \"GET /sleep HTTP/1.1\" => {\n# thread::sleep(Duration::from_secs(5));\n# (\"HTTP/1.1 200 OK\", \"hello.html\")\n# }\n# _ => (\"HTTP/1.1 404 NOT FOUND\", \"404.html\"),\n# };\n# # let contents = fs::read_to_string(filename).unwrap();\n# let length = contents.len();\n# # let response =\n# format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\");\n# # stream.write_all(response.as_bytes()).unwrap();\n# } 示例 20-11: 为每一个流新建一个线程 正如第十六章讲到的,thread::spawn 会创建一个新线程并在其中运行闭包中的代码。如果运行这段代码并在在浏览器中加载 /sleep ,接着在另两个浏览器标签页中加载 / ,确实会发现 / 请求不必等待 /sleep 结束。不过正如之前提到的,这最终会使系统崩溃因为我们无限制的创建新线程。 创建有限数量的线程 我们期望线程池以类似且熟悉的方式工作,以便从线程切换到线程池并不会对使用该 API 的代码做出较大的修改。示例 20-12 展示我们希望用来替换 thread::spawn 的 ThreadPool 结构体的假想接口: 文件名:src/main.rs # use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# thread,\n# time::Duration,\n# };\n# fn main() { let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap(); let pool = ThreadPool::new(4); for stream in listener.incoming() { let stream = stream.unwrap(); pool.execute(|| { handle_connection(stream); }); }\n}\n# # fn handle_connection(mut stream: TcpStream) {\n# let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap();\n# # let (status_line, filename) = match &request_line[..] {\n# \"GET / HTTP/1.1\" => (\"HTTP/1.1 200 OK\", \"hello.html\"),\n# \"GET /sleep HTTP/1.1\" => {\n# thread::sleep(Duration::from_secs(5));\n# (\"HTTP/1.1 200 OK\", \"hello.html\")\n# }\n# _ => (\"HTTP/1.1 404 NOT FOUND\", \"404.html\"),\n# };\n# # let contents = fs::read_to_string(filename).unwrap();\n# let length = contents.len();\n# # let response =\n# format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\");\n# # stream.write_all(response.as_bytes()).unwrap();\n# } 示例 20-12: 假想的 ThreadPool 接口 这里使用 ThreadPool::new 来创建一个新的线程池,它有一个可配置的线程数的参数,在这里是四。这样在 for 循环中,pool.execute 有着类似 thread::spawn 的接口,它获取一个线程池运行于每一个流的闭包。pool.execute 需要实现为获取闭包并传递给池中的线程运行。这段代码还不能编译,不过通过尝试,编译器会指导我们如何修复它。 采用编译器驱动构建 ThreadPool 继续并对示例 20-12 中的 src/main.rs 做出修改,并利用来自 cargo check 的编译器错误来驱动开发。下面是我们得到的第一个错误: $ cargo check Checking hello v0.1.0 (file:///projects/hello)\nerror[E0433]: failed to resolve: use of undeclared type `ThreadPool` --> src/main.rs:11:16 |\n11 | let pool = ThreadPool::new(4); | ^^^^^^^^^^ use of undeclared type `ThreadPool` For more information about this error, try `rustc --explain E0433`.\nerror: could not compile `hello` (bin \"hello\") due to 1 previous error 好的,这告诉我们需要一个 ThreadPool 类型或模块,所以我们将构建一个。ThreadPool 的实现会与 web server 的特定工作相独立,所以让我们从 hello crate 切换到存放 ThreadPool 实现的新库 crate。这也意味着可以在任何工作中使用这个单独的线程池库,而不仅仅是处理网络请求。 创建 src/lib.rs 文件,它包含了目前可用的最简单的 ThreadPool 定义: 文件名:src/lib.rs pub struct ThreadPool; 接着编辑 main.rs 文件通过在 src/main.rs 的开头增加如下代码将 ThreadPool 从库 crate 引入作用域: 文件名:src/main.rs use hello::ThreadPool;\n# use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# thread,\n# time::Duration,\n# };\n# # fn main() {\n# let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap();\n# let pool = ThreadPool::new(4);\n# # for stream in listener.incoming() {\n# let stream = stream.unwrap();\n# # pool.execute(|| {\n# handle_connection(stream);\n# });\n# }\n# }\n# # fn handle_connection(mut stream: TcpStream) {\n# let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap();\n# # let (status_line, filename) = match &request_line[..] {\n# \"GET / HTTP/1.1\" => (\"HTTP/1.1 200 OK\", \"hello.html\"),\n# \"GET /sleep HTTP/1.1\" => {\n# thread::sleep(Duration::from_secs(5));\n# (\"HTTP/1.1 200 OK\", \"hello.html\")\n# }\n# _ => (\"HTTP/1.1 404 NOT FOUND\", \"404.html\"),\n# };\n# # let contents = fs::read_to_string(filename).unwrap();\n# let length = contents.len();\n# # let response =\n# format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\");\n# # stream.write_all(response.as_bytes()).unwrap();\n# } 这仍然不能工作,再次尝试运行来得到下一个需要解决的错误: $ cargo check Checking hello v0.1.0 (file:///projects/hello)\nerror[E0599]: no function or associated item named `new` found for struct `ThreadPool` in the current scope --> src/main.rs:12:28 |\n12 | let pool = ThreadPool::new(4); | ^^^ function or associated item not found in `ThreadPool` For more information about this error, try `rustc --explain E0599`.\nerror: could not compile `hello` (bin \"hello\") due to 1 previous error 这告诉我们下一步是为 ThreadPool 创建一个叫做 new 的关联函数。我们还知道 new 需要有一个参数可以接受 4,而且 new 应该返回 ThreadPool 实例。让我们实现拥有此特征的最小化 new 函数: 文件夹:src/lib.rs pub struct ThreadPool; impl ThreadPool { pub fn new(size: usize) -> ThreadPool { ThreadPool }\n} 这里选择 usize 作为 size 参数的类型,因为我们知道为负的线程数没有意义。我们还知道将使用 4 作为线程集合的元素数量,这也就是使用 usize 类型的原因,如第三章 “整型” 部分所讲。 再次编译检查这段代码: $ cargo check Checking hello v0.1.0 (file:///projects/hello)\nerror[E0599]: no method named `execute` found for struct `ThreadPool` in the current scope --> src/main.rs:17:14 |\n17 | pool.execute(|| { | -----^^^^^^^ method not found in `ThreadPool` For more information about this error, try `rustc --explain E0599`.\nerror: could not compile `hello` (bin \"hello\") due to 1 previous error 现在有了一个警告和一个错误。暂时先忽略警告,发生错误是因为并没有 ThreadPool 上的 execute 方法。回忆 “创建有限数量的线程” 部分我们决定线程池应该有与 thread::spawn 类似的接口,同时我们将实现 execute 函数来获取传递的闭包并将其传递给池中的空闲线程执行。 我们会在 ThreadPool 上定义 execute 函数来获取一个闭包参数。回忆第十三章的 “将被捕获的值移出闭包和 Fn trait” 部分,闭包作为参数时可以使用三个不同的 trait:Fn、FnMut 和 FnOnce。我们需要决定这里应该使用哪种闭包。最终需要实现的类似于标准库的 thread::spawn,所以我们可以观察 thread::spawn 的签名在其参数中使用了何种 bound。查看文档会发现: pub fn spawn(f: F) -> JoinHandle where F: FnOnce() -> T, F: Send + 'static, T: Send + 'static, F 是这里我们关心的参数;T 与返回值有关所以我们并不关心。考虑到 spawn 使用 FnOnce 作为 F 的 trait bound,这可能也是我们需要的,因为最终会将传递给 execute 的参数传给 spawn。因为处理请求的线程只会执行闭包一次,这也进一步确认了 FnOnce 是我们需要的 trait,这里符合 FnOnce 中 Once 的意思。 F 还有 trait bound Send 和生命周期绑定 'static,这对我们的情况也是有意义的:需要 Send 来将闭包从一个线程转移到另一个线程,而 'static 是因为并不知道线程会执行多久。让我们编写一个使用带有这些 bound 的泛型参数 F 的 ThreadPool 的 execute 方法: 文件名:src/lib.rs # pub struct ThreadPool;\n# impl ThreadPool { // --snip--\n# pub fn new(size: usize) -> ThreadPool {\n# ThreadPool\n# }\n# pub fn execute(&self, f: F) where F: FnOnce() + Send + 'static, { }\n} FnOnce trait 仍然需要之后的 (),因为这里的 FnOnce 代表一个没有参数也没有返回值的闭包。正如函数的定义,返回值类型可以从签名中省略,不过即便没有参数也需要括号。 这里再一次增加了 execute 方法的最小化实现:它没有做任何工作,只是尝试让代码能够编译。再次进行检查: $ cargo check Checking hello v0.1.0 (file:///projects/hello) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.24s 现在就只有警告了!这意味着能够编译了!注意如果尝试 cargo run 运行程序并在浏览器中发起请求,仍会在浏览器中出现在本章开始时那样的错误。这个库实际上还没有调用传递给 execute 的闭包! 一个你可能听说过的关于像 Haskell 和 Rust 这样有严格编译器的语言的说法是 “如果代码能够编译,它就能工作”。这是一个提醒大家的好时机,实际上这并不是普适的。我们的项目可以编译,不过它完全没有做任何工作!如果构建一个真实且功能完整的项目,则需花费大量的时间来开始编写单元测试来检查代码能否编译 并且 拥有期望的行为。 在 new 中验证池中线程数量 这里仍然存在警告是因为其并没有对 new 和 execute 的参数做任何操作。让我们用期望的行为来实现这些函数。以考虑 new 作为开始。之前选择使用无符号类型作为 size 参数的类型,因为线程数为负的线程池没有意义。然而,线程数为零的线程池同样没有意义,不过零是一个完全有效的 usize 值。让我们增加在返回 ThreadPool 实例之前检查 size 是否大于零的代码,并使用 assert! 宏在得到零时 panic,如示例 20-13 所示: 文件名:src/lib.rs # pub struct ThreadPool;\n# impl ThreadPool { /// Create a new ThreadPool. /// /// The size is the number of threads in the pool. /// /// # Panics /// /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); ThreadPool } // --snip--\n# pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# }\n} 示例 20-13: 实现 ThreadPool::new 在 size 为零时 panic 这里也用文档注释为 ThreadPool 增加了一些文档。注意这里遵循了良好的文档实践并增加了一个部分来提示函数会 panic 的情况,正如第十四章所讨论的。尝试运行 cargo doc --open 并点击 ThreadPool 结构体来查看生成的 new 的文档看起来如何! 相比像这里使用 assert! 宏,也可以让 new 像之前 I/O 项目中示例 12-9 中 Config::build 那样将 new 更改为 build 并返回一个 Result,不过在这里我们选择创建一个没有任何线程的线程池应该是不可恢复的错误。如果你想做的更好,尝试编写一个采用如下签名的名为 build 的函数来对比一下 new 函数: pub fn build(size: usize) -> Result { 分配空间以储存线程 现在有了一个有效的线程池线程数,就可以实际创建这些线程并在返回结构体之前将它们储存在 ThreadPool 结构体中。不过如何 “储存” 一个线程?让我们再看看 thread::spawn 的签名: pub fn spawn(f: F) -> JoinHandle where F: FnOnce() -> T, F: Send + 'static, T: Send + 'static, spawn 返回 JoinHandle,其中 T 是闭包返回的类型。尝试使用 JoinHandle 来看看会发生什么。在我们的情况中,传递给线程池的闭包会处理连接并不返回任何值,所以 T 将会是单元类型 ()。 示例 20-14 中的代码可以编译,不过实际上还并没有创建任何线程。我们改变了 ThreadPool 的定义来存放一个 thread::JoinHandle<()> 的 vector 实例,使用 size 容量来初始化,并设置一个 for 循环来运行创建线程的代码,并返回包含这些线程的 ThreadPool 实例: 文件名:src/lib.rs use std::thread; pub struct ThreadPool { threads: Vec>,\n} impl ThreadPool { // --snip--\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let mut threads = Vec::with_capacity(size); for _ in 0..size { // create some threads and store them in the vector } ThreadPool { threads } } // --snip--\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# }\n} 示例 20-14: 为 ThreadPool 创建一个 vector 来存放线程 这里将 std::thread 引入库 crate 的作用域,因为使用了 thread::JoinHandle 作为 ThreadPool 中 vector 元素的类型。 在得到了有效的数量之后,ThreadPool 新建一个存放 size 个元素的 vector。with_capacity 函数与 Vec::new 做了同样的工作,不过有一个重要的区别:它为 vector 预先分配空间。因为已经知道了 vector 中需要 size 个元素,预先进行分配比仅仅 Vec::new 要稍微有效率一些,因为 Vec::new 随着插入元素而重新改变大小。 如果再次运行 cargo check,它应该会成功。 Worker 结构体负责从 ThreadPool 中将代码传递给线程 示例 20-14 的 for 循环中留下了一个关于创建线程的注释。如何实际创建线程呢?这是一个难题。标准库提供的创建线程的方法,thread::spawn,它期望获取一些一旦创建线程就应该执行的代码。然而,我们希望开始线程并使其等待稍后传递的代码。标准库的线程实现并没有包含这么做的方法;我们必须自己实现。 我们将要实现的行为是创建线程并稍后发送代码,这会在 ThreadPool 和线程间引入一个新数据类型来管理这种新行为。这个数据结构称为 Worker ,这是一个池实现中的常见概念。想象一下在餐馆厨房工作的员工:员工等待来自客户的订单,他们负责接受这些订单并完成它们。 不同于在线程池中储存一个 JoinHandle<()> 实例的 vector,我们会储存 Worker 结构体的实例。每一个 Worker 会储存一个单独的 JoinHandle<()> 实例。接着会在 Worker 上实现一个方法,该方法将闭包发送到已经运行的线程中执行。我们还会赋予每一个 worker id,这样就可以在日志和调试中区别线程池中的不同 worker。 如下是创建 ThreadPool 时会发生的新过程。在通过如下方式设置完 Worker 之后,我们会实现向线程发送闭包的代码: 定义 Worker 结构体存放 id 和 JoinHandle<()> 修改 ThreadPool 存放一个 Worker 实例的 vector 定义 Worker::new 函数,它获取一个 id 数字并返回一个带有 id 和用空闭包分配的线程的 Worker 实例 在 ThreadPool::new 中,使用 for 循环计数生成 id,使用这个 id 新建 Worker,并储存进 vector 中 如果你渴望挑战,在查示例 20-15 中的代码之前尝试自己实现这些修改。 准备好了吗?示例 20-15 就是一个做出了这些修改的例子: 文件名:src/lib.rs use std::thread; pub struct ThreadPool { workers: Vec,\n} impl ThreadPool { // --snip--\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let mut workers = Vec::with_capacity(size); for id in 0..size { workers.push(Worker::new(id)); } ThreadPool { workers } } // --snip--\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# }\n} struct Worker { id: usize, thread: thread::JoinHandle<()>,\n} impl Worker { fn new(id: usize) -> Worker { let thread = thread::spawn(|| {}); Worker { id, thread } }\n} 示例 20-15: 修改 ThreadPool 存放 Worker 实例而不是直接存放线程 这里将 ThreadPool 中字段名从 threads 改为 workers,因为它现在储存 Worker 而不是 JoinHandle<()>。使用 for 循环中的计数作为 Worker::new 的参数,并将每一个新建的 Worker 储存在叫做 workers 的 vector 中。 Worker 结构体和其 new 函数是私有的,因为外部代码(比如 src/main.rs 中的 server)并不需要知道关于 ThreadPool 中使用 Worker 结构体的实现细节。Worker::new 函数使用 id 参数并储存了使用一个空闭包创建的 JoinHandle<()>。 注意:如果操作系统因为没有足够的系统资源而无法创建线程时,thread::spawn 会 panic。这会导致整个 server panic,即使一些线程可能创建成功了。出于简单的考虑,这个行为是可行的,不过在一个生产级别的线程池实现中,你可能会希望使用 std::thread::Builder 和其 spawn 方法来返回一个 Result。 这段代码能够编译并用指定给 ThreadPool::new 的参数创建储存了一系列的 Worker 实例,不过 仍然 没有处理 execute 中得到的闭包。让我们聊聊接下来怎么做。 使用信道向线程发送请求 下一个需要解决的问题是传递给 thread::spawn 的闭包完全没有做任何工作。目前,我们在 execute 方法中获得期望执行的闭包,不过在创建 ThreadPool 的过程中创建每一个 Worker 时需要向 thread::spawn 传递一个闭包。 我们希望刚创建的 Worker 结构体能够从 ThreadPool 的队列中获取需要执行的代码,并发送到线程中执行它们。 在第十六章,我们学习了 信道 —— 一个沟通两个线程的简单手段 —— 对于这个例子来说则是绝佳的。这里信道将充当任务队列的作用,execute 将通过 ThreadPool 向其中线程正在寻找工作的 Worker 实例发送任务。如下是这个计划: ThreadPool 会创建一个信道并充当发送者。 每个 Worker 将会充当接收者。 新建一个 Job 结构体来存放用于向信道中发送的闭包。 execute 方法会在发送者发出期望执行的任务。 在线程中,Worker 会遍历接收者并执行任何接收到的任务。 让我们以在 ThreadPool::new 中创建信道并让 ThreadPool 实例充当发送者开始,如示例 20-16 所示。Job 是将在信道中发出的类型,目前它是一个没有任何内容的结构体: 文件名:src/lib.rs use std::{sync::mpsc, thread}; pub struct ThreadPool { workers: Vec, sender: mpsc::Sender,\n} struct Job; impl ThreadPool { // --snip--\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let (sender, receiver) = mpsc::channel(); let mut workers = Vec::with_capacity(size); for id in 0..size { workers.push(Worker::new(id)); } ThreadPool { workers, sender } } // --snip--\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# }\n}\n# # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n# # impl Worker {\n# fn new(id: usize) -> Worker {\n# let thread = thread::spawn(|| {});\n# # Worker { id, thread }\n# }\n# } 示例 20-16: 修改 ThreadPool 来储存一个传输 Job 实例的发送者 在 ThreadPool::new 中,新建了一个信道,并接着让线程池在接收端等待。这段代码能够成功编译。 让我们尝试在线程池创建每个 worker 时将接收者传递给它们。须知我们希望在 worker 所分配的线程中使用接收者,所以将在闭包中引用 receiver 参数。示例 20-17 中展示的代码还不能编译: 文件名:src/lib.rs # use std::{sync::mpsc, thread};\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # struct Job;\n# impl ThreadPool { // --snip--\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let (sender, receiver) = mpsc::channel(); let mut workers = Vec::with_capacity(size); for id in 0..size { workers.push(Worker::new(id, receiver)); } ThreadPool { workers, sender } } // --snip--\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# }\n} // --snip-- # # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n# impl Worker { fn new(id: usize, receiver: mpsc::Receiver) -> Worker { let thread = thread::spawn(|| { receiver; }); Worker { id, thread } }\n} 示例 20-17: 将信道的接收端传递给 worker 这是一些小而直观的修改:将接收者传递进了 Worker::new,并接着在闭包中使用它。 如果尝试 check 代码,会得到这个错误: $ cargo check Checking hello v0.1.0 (file:///projects/hello)\nerror[E0382]: use of moved value: `receiver` --> src/lib.rs:26:42 |\n21 | let (sender, receiver) = mpsc::channel(); | -------- move occurs because `receiver` has type `std::sync::mpsc::Receiver`, which does not implement the `Copy` trait\n...\n25 | for id in 0..size { | ----------------- inside of this loop\n26 | workers.push(Worker::new(id, receiver)); | ^^^^^^^^ value moved here, in previous iteration of loop |\nnote: consider changing this parameter type in method `new` to borrow instead if owning the value isn't necessary --> src/lib.rs:47:33 |\n47 | fn new(id: usize, receiver: mpsc::Receiver) -> Worker { | --- in this method ^^^^^^^^^^^^^^^^^^^ this parameter takes ownership of the value\nhelp: consider moving the expression out of the loop so it is only moved once |\n25 ~ let mut value = Worker::new(id, receiver);\n26 ~ for id in 0..size {\n27 ~ workers.push(value); | For more information about this error, try `rustc --explain E0382`.\nerror: could not compile `hello` (lib) due to 1 previous error 这段代码尝试将 receiver 传递给多个 Worker 实例。这是不行的,回忆第十六章:Rust 所提供的信道实现是多 生产者 ,单 消费者 的。这意味着不能简单的克隆信道的消费端来解决问题。我们也不希望将一个消息向多个消费者发送多次;我们希望有一个消息列表和多个 worker 这样每个消息就只会处理一次。 另外,从信道队列中取出任务涉及到修改 receiver,所以这些线程需要一个能安全的共享和修改 receiver 的方式,否则可能导致竞争状态(参考第十六章)。 回忆一下第十六章讨论的线程安全智能指针,为了在多个线程间共享所有权并允许线程修改其值,需要使用 Arc>。Arc 使得多个 worker 拥有接收端,而 Mutex 则确保一次只有一个 worker 能从接收端得到任务。示例 20-18 展示了所需的修改: 文件名:src/lib.rs use std::{ sync::{mpsc, Arc, Mutex}, thread,\n};\n// --snip-- # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # struct Job;\n# impl ThreadPool { // --snip--\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let (sender, receiver) = mpsc::channel(); let receiver = Arc::new(Mutex::new(receiver)); let mut workers = Vec::with_capacity(size); for id in 0..size { workers.push(Worker::new(id, Arc::clone(&receiver))); } ThreadPool { workers, sender } } // --snip--\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# }\n} // --snip-- # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n# impl Worker { fn new(id: usize, receiver: Arc>>) -> Worker { // --snip--\n# let thread = thread::spawn(|| {\n# receiver;\n# });\n# # Worker { id, thread } }\n} 示例 20-18: 使用 Arc 和 Mutex 在 worker 间共享接收者 在 ThreadPool::new 中,将接收者放入一个 Arc 和一个 Mutex 中。对于每一个新 worker,克隆 Arc 来增加引用计数,如此这些 worker 就可以共享接收者的所有权了。 通过这些修改,代码可以编译了!我们做到了! 实现 execute 方法 最后让我们实现 ThreadPool 上的 execute 方法。同时也要修改 Job 结构体:它将不再是结构体,Job 将是一个有着 execute 接收到的闭包类型的 trait 对象的类型别名。第二十章 “类型别名用来创建类型同义词” 部分提到过,类型别名允许将长的类型变短。观察示例 20-19: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# // --snip-- type Job = Box; impl ThreadPool { // --snip--\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# } pub fn execute(&self, f: F) where F: FnOnce() + Send + 'static, { let job = Box::new(f); self.sender.send(job).unwrap(); }\n} // --snip--\n# # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n# # impl Worker {\n# fn new(id: usize, receiver: Arc>>) -> Worker {\n# let thread = thread::spawn(|| {\n# receiver;\n# });\n# # Worker { id, thread }\n# }\n# } 示例 20-19: 为存放每一个闭包的 Box 创建一个 Job 类型别名,接着在信道中发出任务 在使用 execute 得到的闭包新建 Job 实例之后,将这些任务从信道的发送端发出。这里调用 send 上的 unwrap,因为发送可能会失败,这可能发生于例如停止了所有线程执行的情况,这意味着接收端停止接收新消息了。不过目前我们无法停止线程执行;只要线程池存在它们就会一直执行。使用 unwrap 是因为我们知道失败不可能发生,即便编译器不这么认为。 不过到此事情还没有结束!在 worker 中,传递给 thread::spawn 的闭包仍然还只是 引用 了信道的接收端。相反我们需要闭包一直循环,向信道的接收端请求任务,并在得到任务时执行它们。如示例 20-20 对 Worker::new 做出修改: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.send(job).unwrap();\n# }\n# }\n# # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n# // --snip-- impl Worker { fn new(id: usize, receiver: Arc>>) -> Worker { let thread = thread::spawn(move || loop { let job = receiver.lock().unwrap().recv().unwrap(); println!(\"Worker {id} got a job; executing.\"); job(); }); Worker { id, thread } }\n} 示例 20-20: 在 worker 线程中接收并执行任务 这里,首先在 receiver 上调用了 lock 来获取互斥器,接着 unwrap 在出现任何错误时 panic。如果互斥器处于一种叫做 被污染 ( poisoned )的状态时获取锁可能会失败,这可能发生于其他线程在持有锁时 panic 了且没有释放锁。在这种情况下,调用 unwrap 使其 panic 是正确的行为。请随意将 unwrap 改为包含有意义错误信息的 expect。 如果锁定了互斥器,接着调用 recv 从信道中接收 Job。最后的 unwrap 也绕过了一些错误,这可能发生于持有信道发送端的线程停止的情况,类似于如果接收端关闭时 send 方法如何返回 Err 一样。 调用 recv 会阻塞当前线程,所以如果还没有任务,其会等待直到有可用的任务。Mutex 确保一次只有一个 Worker 线程尝试请求任务。 现在线程池处于可以运行的状态了!执行 cargo run 并发起一些请求: $ cargo run Compiling hello v0.1.0 (file:///projects/hello)\nwarning: field is never read: `workers` --> src/lib.rs:7:5 |\n7 | workers: Vec, | ^^^^^^^^^^^^^^^^^^^^ | = note: `#[warn(dead_code)]` on by default warning: field is never read: `id` --> src/lib.rs:48:5 |\n48 | id: usize, | ^^^^^^^^^ warning: field is never read: `thread` --> src/lib.rs:49:5 |\n49 | thread: thread::JoinHandle<()>, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: `hello` (lib) generated 3 warnings Finished dev [unoptimized + debuginfo] target(s) in 1.40s Running `target/debug/hello`\nWorker 0 got a job; executing.\nWorker 2 got a job; executing.\nWorker 1 got a job; executing.\nWorker 3 got a job; executing.\nWorker 0 got a job; executing.\nWorker 2 got a job; executing.\nWorker 1 got a job; executing.\nWorker 3 got a job; executing.\nWorker 0 got a job; executing.\nWorker 2 got a job; executing. 成功了!现在我们有了一个可以异步执行连接的线程池!它绝不会创建超过四个线程,所以当 server 收到大量请求时系统也不会负担过重。如果请求 /sleep ,server 也能够通过另外一个线程处理其他请求。 注意如果同时在多个浏览器窗口打开 /sleep ,它们可能会彼此间隔地加载 5 秒,因为一些浏览器出于缓存的原因会顺序执行相同请求的多个实例。这些限制并不是由于我们的 web server 造成的。 在学习了第十七章和第十八章的 while let 循环之后,你可能会好奇为何不能如此编写 worker 线程,如示例 20-21 所示: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.send(job).unwrap();\n# }\n# }\n# # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n// --snip-- impl Worker { fn new(id: usize, receiver: Arc>>) -> Worker { let thread = thread::spawn(move || { while let Ok(job) = receiver.lock().unwrap().recv() { println!(\"Worker {id} got a job; executing.\"); job(); } }); Worker { id, thread } }\n} 示例 20-21: 一个使用 while let 的 Worker::new 替代实现 这段代码可以编译和运行,但是并不会产生所期望的线程行为:一个慢请求仍然会导致其他请求等待执行。其原因有些微妙:Mutex 结构体没有公有 unlock 方法,因为锁的所有权依赖 lock 方法返回的 LockResult> 中 MutexGuard 的生命周期。这允许借用检查器在编译时确保绝不会在没有持有锁的情况下访问由 Mutex 守护的资源,不过如果没有认真的思考 MutexGuard 的生命周期的话,也可能会导致比预期更久的持有锁。 示例 20-20 中的代码使用的 let job = receiver.lock().unwrap().recv().unwrap(); 之所以可以工作是因为对于 let 来说,当 let 语句结束时任何表达式中等号右侧使用的临时值都会立即被丢弃。然而 while let(if let 和 match)直到相关的代码块结束都不会丢弃临时值。在示例 20-21 中,job() 调用期间锁一直持续,这也意味着其他的 worker 无法接受任务。","breadcrumbs":"最后的项目:构建多线程 web server » 将单线程 server 变为多线程 server » 使用线程池改善吞吐量","id":"405","title":"使用线程池改善吞吐量"},"406":{"body":"ch21-03-graceful-shutdown-and-cleanup.md commit 3e5105b52f7e8d3d95def07ffade4dcb1cfdee27 示例 20-20 中的代码如期通过使用线程池异步的响应请求。这里有一些警告说 workers、id 和 thread 字段没有直接被使用,这提醒了我们并没有清理所有的内容。当使用不那么优雅的 ctrl-c 终止主线程时,所有其他线程也会立刻停止,即便它们正处于处理请求的过程中。 现在我们要为 ThreadPool 实现 Drop trait 对线程池中的每一个线程调用 join,这样这些线程将会执行完它们的请求。接着会为 ThreadPool 实现一个告诉线程它们应该停止接收新请求并结束的方式。为了实践这些代码,修改 server 在优雅停机(graceful shutdown)之前只接受两个请求。","breadcrumbs":"最后的项目:构建多线程 web server » 优雅停机与清理 » 优雅停机与清理","id":"406","title":"优雅停机与清理"},"407":{"body":"现在开始为线程池实现 Drop。当线程池被丢弃时,应该 join 所有线程以确保它们完成其操作。示例 20-22 展示了 Drop 实现的第一次尝试;这些代码还不能够编译: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.send(job).unwrap();\n# }\n# }\n# impl Drop for ThreadPool { fn drop(&mut self) { for worker in &mut self.workers { println!(\"Shutting down worker {}\", worker.id); worker.thread.join().unwrap(); } }\n}\n# # struct Worker {\n# id: usize,\n# thread: thread::JoinHandle<()>,\n# }\n# # impl Worker {\n# fn new(id: usize, receiver: Arc>>) -> Worker {\n# let thread = thread::spawn(move || loop {\n# let job = receiver.lock().unwrap().recv().unwrap();\n# # println!(\"Worker {id} got a job; executing.\");\n# # job();\n# });\n# # Worker { id, thread }\n# }\n# } 示例 20-22: 当线程池离开作用域时 join 每个线程 这里首先遍历线程池中的每个 workers。这里使用了 &mut 因为 self 本身是一个可变引用而且也需要能够修改 worker。对于每一个线程,会打印出说明信息表明此特定 worker 正在关闭,接着在 worker 线程上调用 join。如果 join 调用失败,通过 unwrap 使得 panic 并进行不优雅的关闭。 如下是尝试编译代码时得到的错误: $ cargo check Checking hello v0.1.0 (file:///projects/hello)\nerror[E0507]: cannot move out of `worker.thread` which is behind a mutable reference --> src/lib.rs:52:13 |\n52 | worker.thread.join().unwrap(); | ^^^^^^^^^^^^^ ------ `worker.thread` moved due to this method call | | | move occurs because `worker.thread` has type `JoinHandle<()>`, which does not implement the `Copy` trait |\nnote: `JoinHandle::::join` takes ownership of the receiver `self`, which moves `worker.thread` --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/thread/mod.rs:1778:17 For more information about this error, try `rustc --explain E0507`.\nerror: could not compile `hello` (lib) due to 1 previous error 这里的错误告诉我们并不能调用 join,因为我们只有每一个 worker 的可变借用,而 join 需要获取其参数的所有权。为了解决这个问题,需要一个方法将 thread 移动出拥有其所有权的 Worker 实例以便 join 可以消费这个线程。示例 17-15 中我们曾见过这么做的方法:如果 Worker 存放的是 Option,就可以在 Option 上调用 take 方法将值从 Some 成员中移动出来而对 None 成员不做处理。换句话说,正在运行的 Worker 的 thread 将是 Some 成员值,而当需要清理 worker 时,将 Some 替换为 None,这样 worker 就没有可以运行的线程了。 为此需要更新 Worker 的定义为如下: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.send(job).unwrap();\n# }\n# }\n# # impl Drop for ThreadPool {\n# fn drop(&mut self) {\n# for worker in &mut self.workers {\n# println!(\"Shutting down worker {}\", worker.id);\n# # worker.thread.join().unwrap();\n# }\n# }\n# }\n# struct Worker { id: usize, thread: Option>,\n}\n# # impl Worker {\n# fn new(id: usize, receiver: Arc>>) -> Worker {\n# let thread = thread::spawn(move || loop {\n# let job = receiver.lock().unwrap().recv().unwrap();\n# # println!(\"Worker {id} got a job; executing.\");\n# # job();\n# });\n# # Worker { id, thread }\n# }\n# } 现在依靠编译器来找出其他需要修改的地方。check 代码会得到两个错误: $ cargo check Checking hello v0.1.0 (file:///projects/hello)\nerror[E0599]: no method named `join` found for enum `Option` in the current scope --> src/lib.rs:52:27 |\n52 | worker.thread.join().unwrap(); | ^^^^ method not found in `Option>` |\nnote: the method `join` exists on the type `JoinHandle<()>` --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/thread/mod.rs:1778:5\nhelp: consider using `Option::expect` to unwrap the `JoinHandle<()>` value, panicking if the value is an `Option::None` |\n52 | worker.thread.expect(\"REASON\").join().unwrap(); | +++++++++++++++++ error[E0308]: mismatched types --> src/lib.rs:72:22 |\n72 | Worker { id, thread } | ^^^^^^ expected `Option>`, found `JoinHandle<_>` | = note: expected enum `Option>` found struct `JoinHandle<_>`\nhelp: try wrapping the expression in `Some` |\n72 | Worker { id, thread: Some(thread) } | +++++++++++++ + Some errors have detailed explanations: E0308, E0599.\nFor more information about an error, try `rustc --explain E0308`.\nerror: could not compile `hello` (lib) due to 2 previous errors 让我们修复第二个错误,它指向 Worker::new 结尾的代码;当新建 Worker 时需要将 thread 值封装进 Some。做出如下改变以修复问题: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.send(job).unwrap();\n# }\n# }\n# # impl Drop for ThreadPool {\n# fn drop(&mut self) {\n# for worker in &mut self.workers {\n# println!(\"Shutting down worker {}\", worker.id);\n# # worker.thread.join().unwrap();\n# }\n# }\n# }\n# # struct Worker {\n# id: usize,\n# thread: Option>,\n# }\n# impl Worker { fn new(id: usize, receiver: Arc>>) -> Worker { // --snip-- # let thread = thread::spawn(move || loop {\n# let job = receiver.lock().unwrap().recv().unwrap();\n# # println!(\"Worker {id} got a job; executing.\");\n# # job();\n# });\n# Worker { id, thread: Some(thread), } }\n} 第一个错误位于 Drop 实现中。之前提到过要调用 Option 上的 take 将 thread 移动出 worker。如下改变会修复问题: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: mpsc::Sender,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool { workers, sender }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.send(job).unwrap();\n# }\n# }\n# impl Drop for ThreadPool { fn drop(&mut self) { for worker in &mut self.workers { println!(\"Shutting down worker {}\", worker.id); if let Some(thread) = worker.thread.take() { thread.join().unwrap(); } } }\n}\n# # struct Worker {\n# id: usize,\n# thread: Option>,\n# }\n# # impl Worker {\n# fn new(id: usize, receiver: Arc>>) -> Worker {\n# let thread = thread::spawn(move || loop {\n# let job = receiver.lock().unwrap().recv().unwrap();\n# # println!(\"Worker {id} got a job; executing.\");\n# # job();\n# });\n# # Worker {\n# id,\n# thread: Some(thread),\n# }\n# }\n# } 如第十八章我们见过的,Option 上的 take 方法会取出 Some 而留下 None。使用 if let 解构 Some 并得到线程,接着在线程上调用 join。如果 worker 的线程已然是 None,就知道此时这个 worker 已经清理了其线程所以无需做任何操作。","breadcrumbs":"最后的项目:构建多线程 web server » 优雅停机与清理 » 为 ThreadPool 实现 Drop Trait","id":"407","title":"为 ThreadPool 实现 Drop Trait"},"408":{"body":"有了所有这些修改,代码就能编译且没有任何警告。不过也有坏消息,这些代码还不能以我们期望的方式运行。问题的关键在于 Worker 中分配的线程所运行的闭包中的逻辑:调用 join 并不会关闭线程,因为它们一直 loop 来寻找任务。如果采用这个实现来尝试丢弃 ThreadPool,则主线程会永远阻塞在等待第一个线程结束上。 为了修复这个问题,我们将修改 ThreadPool 的 drop 实现并修改 Worker 循环。 首先修改 ThreadPool 的 drop 实现在等待线程结束前显式丢弃 sender。示例 20-23 展示了 ThreadPool 显式丢弃 sender 所作的修改。我们使用了与之前处理线程时相同的 Option 和 take 技术以便能从 ThreadPool 中移动 sender: 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# pub struct ThreadPool { workers: Vec, sender: Option>,\n}\n// --snip--\n# # type Job = Box;\n# impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { // --snip-- # assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# ThreadPool { workers, sender: Some(sender), } } pub fn execute(&self, f: F) where F: FnOnce() + Send + 'static, { let job = Box::new(f); self.sender.as_ref().unwrap().send(job).unwrap(); }\n} impl Drop for ThreadPool { fn drop(&mut self) { drop(self.sender.take()); for worker in &mut self.workers { println!(\"Shutting down worker {}\", worker.id); if let Some(thread) = worker.thread.take() { thread.join().unwrap(); } } }\n}\n# # struct Worker {\n# id: usize,\n# thread: Option>,\n# }\n# # impl Worker {\n# fn new(id: usize, receiver: Arc>>) -> Worker {\n# let thread = thread::spawn(move || loop {\n# let job = receiver.lock().unwrap().recv().unwrap();\n# # println!(\"Worker {id} got a job; executing.\");\n# # job();\n# });\n# # Worker {\n# id,\n# thread: Some(thread),\n# }\n# }\n# } 示例 20-23: 在 join worker 线程之前显式丢弃 sender 丢弃 sender 会关闭信道,这表明不会有更多的消息被发送。这时 worker 中的无限循环中的所有 recv 调用都会返回错误。在示例 20-24 中,我们修改 Worker 循环在这种情况下优雅地退出,这意味着当 ThreadPool 的 drop 实现调用 join 时线程会结束。 文件名:src/lib.rs # use std::{\n# sync::{mpsc, Arc, Mutex},\n# thread,\n# };\n# # pub struct ThreadPool {\n# workers: Vec,\n# sender: Option>,\n# }\n# # type Job = Box;\n# # impl ThreadPool {\n# /// Create a new ThreadPool.\n# ///\n# /// The size is the number of threads in the pool.\n# ///\n# /// # Panics\n# ///\n# /// The `new` function will panic if the size is zero.\n# pub fn new(size: usize) -> ThreadPool {\n# assert!(size > 0);\n# # let (sender, receiver) = mpsc::channel();\n# # let receiver = Arc::new(Mutex::new(receiver));\n# # let mut workers = Vec::with_capacity(size);\n# # for id in 0..size {\n# workers.push(Worker::new(id, Arc::clone(&receiver)));\n# }\n# # ThreadPool {\n# workers,\n# sender: Some(sender),\n# }\n# }\n# # pub fn execute(&self, f: F)\n# where\n# F: FnOnce() + Send + 'static,\n# {\n# let job = Box::new(f);\n# # self.sender.as_ref().unwrap().send(job).unwrap();\n# }\n# }\n# # impl Drop for ThreadPool {\n# fn drop(&mut self) {\n# drop(self.sender.take());\n# # for worker in &mut self.workers {\n# println!(\"Shutting down worker {}\", worker.id);\n# # if let Some(thread) = worker.thread.take() {\n# thread.join().unwrap();\n# }\n# }\n# }\n# }\n# # struct Worker {\n# id: usize,\n# thread: Option>,\n# }\n# impl Worker { fn new(id: usize, receiver: Arc>>) -> Worker { let thread = thread::spawn(move || loop { let message = receiver.lock().unwrap().recv(); match message { Ok(job) => { println!(\"Worker {id} got a job; executing.\"); job(); } Err(_) => { println!(\"Worker {id} disconnected; shutting down.\"); break; } } }); Worker { id, thread: Some(thread), } }\n} 示例 20-24:当 recv 返回错误时显式退出循环 为了实践这些代码,如示例 20-25 所示修改 main 在优雅停机 server 之前只接受两个请求: 文件名:src/main.rs # use hello::ThreadPool;\n# use std::{\n# fs,\n# io::{prelude::*, BufReader},\n# net::{TcpListener, TcpStream},\n# thread,\n# time::Duration,\n# };\n# fn main() { let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap(); let pool = ThreadPool::new(4); for stream in listener.incoming().take(2) { let stream = stream.unwrap(); pool.execute(|| { handle_connection(stream); }); } println!(\"Shutting down.\");\n}\n# # fn handle_connection(mut stream: TcpStream) {\n# let buf_reader = BufReader::new(&stream);\n# let request_line = buf_reader.lines().next().unwrap().unwrap();\n# # let (status_line, filename) = match &request_line[..] {\n# \"GET / HTTP/1.1\" => (\"HTTP/1.1 200 OK\", \"hello.html\"),\n# \"GET /sleep HTTP/1.1\" => {\n# thread::sleep(Duration::from_secs(5));\n# (\"HTTP/1.1 200 OK\", \"hello.html\")\n# }\n# _ => (\"HTTP/1.1 404 NOT FOUND\", \"404.html\"),\n# };\n# # let contents = fs::read_to_string(filename).unwrap();\n# let length = contents.len();\n# # let response =\n# format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\");\n# # stream.write_all(response.as_bytes()).unwrap();\n# } 示例 20-25: 在处理两个请求之后通过退出循环来停止 server 你不会希望真实世界的 web server 只处理两次请求就停机了,这只是为了展示优雅停机和清理处于正常工作状态。 take 方法定义于 Iterator trait,这里限制循环最多头 2 次。ThreadPool 会在 main 的结尾离开作用域,而且还会看到 drop 实现的运行。 使用 cargo run 启动 server,并发起三个请求。第三个请求应该会失败,而终端的输出应该看起来像这样: $ cargo run Compiling hello v0.1.0 (file:///projects/hello) Finished dev [unoptimized + debuginfo] target(s) in 1.0s Running `target/debug/hello`\nWorker 0 got a job; executing.\nShutting down.\nShutting down worker 0\nWorker 3 got a job; executing.\nWorker 1 disconnected; shutting down.\nWorker 2 disconnected; shutting down.\nWorker 3 disconnected; shutting down.\nWorker 0 disconnected; shutting down.\nShutting down worker 1\nShutting down worker 2\nShutting down worker 3 可能会出现不同顺序的 worker 和信息输出。可以从信息中看到服务是如何运行的:worker 0 和 worker 3 获取了头两个请求。server 会在头第二个请求后停止接受请求,ThreadPool 的 Drop 实现甚至会在 worker 3 开始工作之前就开始执行。丢弃 sender 会断开所有 worker 的连接并让它们关闭。每个 worker 在断开时会打印出一个信息,接着线程池调用 join 来等待每一个 worker 线程结束。 这个特定的运行过程中一个有趣的地方在于:ThreadPool 丢弃 sender,而在任何线程收到消息之前,就尝试 join worker 0 了。worker 0 还没有从 recv 获得一个错误,所以主线程阻塞直到 worker 0 结束。与此同时,worker 3 接收到一个任务接着所有线程会收到一个错误。一旦 worker 0 结束,主线程就等待余下其他 worker 结束。此时它们都退出了循环并停止。 恭喜!现在我们完成了这个项目,也有了一个使用线程池异步响应请求的基础 web server。我们能对 server 执行优雅停机,它会清理线程池中的所有线程。 如下是完整的代码参考: 文件名:src/main.rs use hello::ThreadPool;\nuse std::{ fs, io::{prelude::*, BufReader}, net::{TcpListener, TcpStream}, thread, time::Duration,\n}; fn main() { let listener = TcpListener::bind(\"127.0.0.1:7878\").unwrap(); let pool = ThreadPool::new(4); for stream in listener.incoming().take(2) { let stream = stream.unwrap(); pool.execute(|| { handle_connection(stream); }); } println!(\"Shutting down.\");\n} fn handle_connection(mut stream: TcpStream) { let buf_reader = BufReader::new(&stream); let request_line = buf_reader.lines().next().unwrap().unwrap(); let (status_line, filename) = match &request_line[..] { \"GET / HTTP/1.1\" => (\"HTTP/1.1 200 OK\", \"hello.html\"), \"GET /sleep HTTP/1.1\" => { thread::sleep(Duration::from_secs(5)); (\"HTTP/1.1 200 OK\", \"hello.html\") } _ => (\"HTTP/1.1 404 NOT FOUND\", \"404.html\"), }; let contents = fs::read_to_string(filename).unwrap(); let length = contents.len(); let response = format!(\"{status_line}\\r\\nContent-Length: {length}\\r\\n\\r\\n{contents}\"); stream.write_all(response.as_bytes()).unwrap();\n} 文件名:src/lib.rs use std::{ sync::{mpsc, Arc, Mutex}, thread,\n}; pub struct ThreadPool { workers: Vec, sender: Option>,\n} type Job = Box; impl ThreadPool { /// Create a new ThreadPool. /// /// The size is the number of threads in the pool. /// /// # Panics /// /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let (sender, receiver) = mpsc::channel(); let receiver = Arc::new(Mutex::new(receiver)); let mut workers = Vec::with_capacity(size); for id in 0..size { workers.push(Worker::new(id, Arc::clone(&receiver))); } ThreadPool { workers, sender: Some(sender), } } pub fn execute(&self, f: F) where F: FnOnce() + Send + 'static, { let job = Box::new(f); self.sender.as_ref().unwrap().send(job).unwrap(); }\n} impl Drop for ThreadPool { fn drop(&mut self) { drop(self.sender.take()); for worker in &mut self.workers { println!(\"Shutting down worker {}\", worker.id); if let Some(thread) = worker.thread.take() { thread.join().unwrap(); } } }\n} struct Worker { id: usize, thread: Option>,\n} impl Worker { fn new(id: usize, receiver: Arc>>) -> Worker { let thread = thread::spawn(move || loop { let message = receiver.lock().unwrap().recv(); match message { Ok(job) => { println!(\"Worker {id} got a job; executing.\"); job(); } Err(_) => { println!(\"Worker {id} disconnected; shutting down.\"); break; } } }); Worker { id, thread: Some(thread), } }\n} 这里还有很多可以做的事!如果你希望继续增强这个项目,如下是一些点子: 为 ThreadPool 和其公有方法增加更多文档 为库的功能增加测试 将 unwrap 调用改为更健壮的错误处理 使用 ThreadPool 进行其他不同于处理网络请求的任务 在 crates.io 上寻找一个线程池 crate 并使用它实现一个类似的 web server,将其 API 和鲁棒性与我们的实现做对比","breadcrumbs":"最后的项目:构建多线程 web server » 优雅停机与清理 » 向线程发送信号使其停止接收任务","id":"408","title":"向线程发送信号使其停止接收任务"},"409":{"body":"好极了!你结束了本书的学习!由衷感谢你同我们一道加入这次 Rust 之旅。现在你已经准备好出发并实现自己的 Rust 项目并帮助他人了。请不要忘记我们的社区,这里有其他 Rustaceans 正乐于帮助你迎接 Rust 之路上的任何挑战。","breadcrumbs":"最后的项目:构建多线程 web server » 优雅停机与清理 » 总结","id":"409","title":"总结"},"41":{"body":"让我们开始使用 rand 来生成一个猜数字随机数。下一步是更新 src/main.rs ,如示例 2-3 所示。 文件名:src/main.rs use std::io;\nuse rand::Rng; fn main() { println!(\"Guess the number!\"); let secret_number = rand::thread_rng().gen_range(1..=100); println!(\"The secret number is: {secret_number}\"); println!(\"Please input your guess.\"); let mut guess = String::new(); io::stdin() .read_line(&mut guess) .expect(\"Failed to read line\"); println!(\"You guessed: {guess}\");\n} 示例 2-3:添加生成随机数的代码 首先,我们新增了一行 use rand::Rng;。Rng 是一个 trait,它定义了随机数生成器应实现的方法,想使用这些方法的话,此 trait 必须在作用域中。第十章会详细介绍 trait。 接下来,我们在中间还新增加了两行。第一行调用了 rand::thread_rng 函数提供实际使用的随机数生成器:它位于当前执行线程的本地环境中,并从操作系统获取 seed。接着调用随机数生成器的 gen_range 方法。这个方法由 use rand::Rng 语句引入到作用域的 Rng trait 定义。gen_range 方法获取一个范围表达式(range expression)作为参数,并生成一个在此范围之间的随机数。这里使用的这类范围表达式使用了 start..=end 这样的形式,也就是说包含了上下端点,所以需要指定 1..=100 来请求一个 1 和 100 之间的数。 注意:你不可能凭空就知道应该 use 哪个 trait 以及该从 crate 中调用哪个方法,因此每个 crate 有使用说明文档。Cargo 有一个很棒的功能是:运行 cargo doc --open 命令来构建所有本地依赖提供的文档,并在浏览器中打开。例如,假设你对 rand crate 中的其他功能感兴趣,你可以运行 cargo doc --open 并点击左侧导航栏中的 rand。 新增加的第二行代码打印出了秘密数字。这在开发程序时很有用,因为可以测试它,不过在最终版本中会删掉它。如果游戏一开始就打印出结果就没什么可玩的了! 尝试运行程序几次: $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 2.53s Running `target/debug/guessing_game`\nGuess the number!\nThe secret number is: 7\nPlease input your guess.\n4\nYou guessed: 4 $ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.02s Running `target/debug/guessing_game`\nGuess the number!\nThe secret number is: 83\nPlease input your guess.\n5\nYou guessed: 5 你应该能得到不同的随机数,同时它们应该都是在 1 和 100 之间的。干得漂亮!","breadcrumbs":"写个猜数字游戏 » 生成一个随机数","id":"41","title":"生成一个随机数"},"410":{"body":"appendix-00.md commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f 附录部分包含一些在你的 Rust 之旅中可能用到的参考资料。","breadcrumbs":"附录 » 附录","id":"410","title":"附录"},"411":{"body":"appendix-01-keywords.md commit efbafdba3618487fbc9305318fcab9775132ac15 下面的列表包含 Rust 中正在使用或者以后会用到的关键字。因此,这些关键字不能被用作标识符(除了 “ 原始标识符 ” 部分介绍的原始标识符),这包括函数、变量、参数、结构体字段、模块、crate、常量、宏、静态值、属性、类型、trait 或生命周期 的名字。","breadcrumbs":"附录 » A - 关键字 » 附录 A:关键字","id":"411","title":"附录 A:关键字"},"412":{"body":"如下关键字目前有对应其描述的功能。 as - 强制类型转换,消除特定包含项的 trait 的歧义,或者对 use 语句中的项重命名 async - 返回一个 Future 而不是阻塞当前线程 await - 暂停执行直到 Future 的结果就绪 break - 立刻退出循环 const - 定义常量或不变裸指针(constant raw pointer) continue - 继续进入下一次循环迭代 crate - 在模块路径中,代指 crate root dyn - 动态分发 trait 对象 else - 作为 if 和 if let 控制流结构的 fallback enum - 定义一个枚举 extern - 链接一个外部函数或变量 false - 布尔字面值 false fn - 定义一个函数或 函数指针类型 ( function pointer type ) for - 遍历一个迭代器或实现一个 trait 或者指定一个更高级的生命周期 if - 基于条件表达式的结果分支 impl - 实现自有或 trait 功能 in - for 循环语法的一部分 let - 绑定一个变量 loop - 无条件循环 match - 模式匹配 mod - 定义一个模块 move - 使闭包获取其所捕获项的所有权 mut - 表示引用、裸指针或模式绑定的可变性 pub - 表示结构体字段、impl 块或模块的公有可见性 ref - 通过引用绑定 return - 从函数中返回 Self - 定义或实现 trait 的类型的类型别名 self - 表示方法本身或当前模块 static - 表示全局变量或在整个程序执行期间保持其生命周期 struct - 定义一个结构体 super - 表示当前模块的父模块 trait - 定义一个 trait true - 布尔字面值 true type - 定义一个类型别名或关联类型 union - 定义一个 union 并且是 union 声明中唯一用到的关键字 unsafe - 表示不安全的代码、函数、trait 或实现 use - 引入外部空间的符号 where - 表示一个约束类型的从句 while - 基于一个表达式的结果判断是否进行循环","breadcrumbs":"附录 » A - 关键字 » 目前正在使用的关键字","id":"412","title":"目前正在使用的关键字"},"413":{"body":"如下关键字没有任何功能,不过由 Rust 保留以备将来的应用。 abstract become box do final macro override priv try typeof unsized virtual yield","breadcrumbs":"附录 » A - 关键字 » 保留做将来使用的关键字","id":"413","title":"保留做将来使用的关键字"},"414":{"body":"原始标识符(Raw identifiers)允许你使用通常不能使用的关键字,其带有 r# 前缀。 例如,match 是关键字。如果尝试编译如下使用 match 作为名字的函数: fn match(needle: &str, haystack: &str) -> bool { haystack.contains(needle)\n} 会得到这个错误: error: expected identifier, found keyword `match` --> src/main.rs:4:4 |\n4 | fn match(needle: &str, haystack: &str) -> bool { | ^^^^^ expected identifier, found keyword 该错误表示你不能将关键字 match 用作函数标识符。你可以使用原始标识符将 match 作为函数名称使用: 文件名:src/main.rs fn r#match(needle: &str, haystack: &str) -> bool { haystack.contains(needle)\n} fn main() { assert!(r#match(\"foo\", \"foobar\"));\n} 此代码编译没有任何错误。注意 r# 前缀需同时用于函数名定义和 main 函数中的调用。 原始标识符允许使用你选择的任何单词作为标识符,即使该单词恰好是保留关键字。这给予了我们更大的自由来选择名字,这样与其他语言交互式就不用考虑到关键字问题,在要交互的语言中这个名字不是关键字。此外,原始标识符允许你使用以不同于你的 crate 使用的 Rust 版本编写的库。比如,try 在 2015 edition 中不是关键字,而在 2018 edition 则是。所以如果用 2015 edition 编写的库中带有 try 函数,在 2018 edition 中调用时就需要使用原始标识符语法,在这里是 r#try。有关版本的更多信息,请参见 附录 E 。","breadcrumbs":"附录 » A - 关键字 » 原始标识符","id":"414","title":"原始标识符"},"415":{"body":"appendix-02-operators.md commit 396fdb69de7fb18f24b15c7ad13491b1c1fa7231 该附录包含了 Rust 语法的词汇表,包括运算符以及其他的符号,这些符号单独出现或出现在路径、泛型、trait bounds、宏、属性、注释、元组以及大括号上下文中。","breadcrumbs":"附录 » B - 运算符与符号 » 附录 B:运算符与符号","id":"415","title":"附录 B:运算符与符号"},"416":{"body":"表 B-1 包含了 Rust 中的运算符、运算符如何出现在上下文中的示例、简短解释以及该运算符是否可重载。如果一个运算符是可重载的,则该运算符上用于重载的相关 trait 也会列出。 表 B-1: 运算符 运算符 示例 解释 是否可重载 ! ident!(...), ident!{...}, ident![...] 宏展开 ! !expr 按位非或逻辑非 Not != expr != expr 不等比较 PartialEq % expr % expr 算术取余 Rem %= var %= expr 算术取余与赋值 RemAssign & &expr, &mut expr 借用 & &type, &mut type, &'a type, &'a mut type 借用指针类型 & expr & expr 按位与 BitAnd &= var &= expr 按位与及赋值 BitAndAssign && expr && expr 短路(Short-circuiting)逻辑与 * expr * expr 算术乘法 Mul *= var *= expr 算术乘法与赋值 MulAssign * *expr 解引用 Deref * *const type, *mut type 裸指针 + trait + trait, 'a + trait 复合类型限制 + expr + expr 算术加法 Add += var += expr 算术加法与赋值 AddAssign , expr, expr 参数以及元素分隔符 - - expr 算术取负 Neg - expr - expr 算术减法 Sub -= var -= expr 算术减法与赋值 SubAssign -> fn(...) -> type, |...| -> type 函数与闭包,返回类型 . expr.ident 成员访问 .. .., expr.., ..expr, expr..expr 右开区间范围 PartialOrd ..= ..=expr, expr..=expr 右闭区间范围模式 PartialOrd .. ..expr 结构体更新语法 .. variant(x, ..), struct_type { x, .. } “与剩余部分” 的模式绑定 ... expr...expr (Deprecated,请使用 ..=)在模式中:闭区间范围模式 / expr / expr 算术除法 Div /= var /= expr 算术除法与赋值 DivAssign : pat: type, ident: type 约束 : ident: expr 结构体字段初始化 : 'a: loop {...} 循环标志 ; expr; 语句和语句结束符 ; [...; len] 固定大小数组语法的部分 << expr << expr 左移 Shl <<= var <<= expr 左移与赋值 ShlAssign < expr < expr 小于比较 PartialOrd <= expr <= expr 小于等于比较 PartialOrd = var = expr, ident = type 赋值/等值 == expr == expr 等于比较 PartialEq => pat => expr 匹配准备语法的部分 > expr > expr 大于比较 PartialOrd >= expr >= expr 大于等于比较 PartialOrd >> expr >> expr 右移 Shr >>= var >>= expr 右移与赋值 ShrAssign @ ident @ pat 模式绑定 ^ expr ^ expr 按位异或 BitXor ^= var ^= expr 按位异或与赋值 BitXorAssign | pat | pat 模式选择 | expr | expr 按位或 BitOr |= var |= expr 按位或与赋值 BitOrAssign || expr || expr 短路(Short-circuiting)逻辑或 ? expr? 错误传播","breadcrumbs":"附录 » B - 运算符与符号 » 运算符","id":"416","title":"运算符"},"417":{"body":"下面的列表中包含了所有和运算符不一样功能的符号;也就是说,它们并不像函数调用或方法调用一样表现。 表 B-2 展示了以其自身出现以及出现在合法其他各个地方的符号。 表 B-2:独立语法 符号 解释 'ident 命名生命周期或循环标签 ...u8, ...i32, ...f64, ...usize 等 指定类型的数值常量 \"...\" 字符串常量 r\"...\", r#\"...\"#, r##\"...\"##, etc. 原始字符串字面值,未处理的转义字符 b\"...\" 字节字符串字面值; 构造一个字节数组类型而非字符串 br\"...\", br#\"...\"#, br##\"...\"## 等 原始字节字符串字面值,原始和字节字符串字面值的结合 '...' 字符字面值 b'...' ASCII 码字节字面值 |...| expr 闭包 ! 离散函数的总是为空的类型 _ “忽略” 模式绑定;也用于增强整型字面值的可读性 表 B-3 展示了出现在从模块结构到项的路径上下文中的符号 表 B-3:路径相关语法 符号 解释 ident::ident 命名空间路径 ::path 与 crate 根相对的路径(如一个显式绝对路径) self::path 与当前模块相对的路径(如一个显式相对路径) super::path 与父模块相对的路径 type::ident, ::ident 关联常量、函数以及类型 ::... 不可以被直接命名的关联项类型(如 <&T>::...,<[T]>::...,等) trait::method(...) 通过命名定义的 trait 来消除方法调用的二义性 type::method(...) 通过命名定义的类型来消除方法调用的二义性 ::method(...) 通过命名 trait 和类型来消除方法调用的二义性 表 B-4 展示了出现在泛型类型参数上下文中的符号。 表 B-4:泛型 符号 解释 path<...> 为一个类型中的泛型指定具体参数(如 Vec) path::<...>, method::<...> 为一个泛型、函数或表达式中的方法指定具体参数,通常指 turbofish(如 \"42\".parse::()) fn ident<...> ... 泛型函数定义 struct ident<...> ... 泛型结构体定义 enum ident<...> ... 泛型枚举定义 impl<...> ... 定义泛型实现 for<...> type 高级生命周期限制 type 泛型,其一个或多个相关类型必须被指定为特定类型(如 Iterator) 表 B-5 展示了出现在使用 trait bounds 约束泛型参数上下文中的符号。 表 B-5: Trait Bound 约束 符号 解释 T: U 泛型参数 T 约束于实现了 U 的类型 T: 'a 泛型 T 的生命周期必须长于 'a(意味着该类型不能传递包含生命周期短于 'a 的任何引用) T: 'static 泛型 T 不包含除 'static 之外的借用引用 'b: 'a 泛型 'b 生命周期必须长于泛型 'a T: ?Sized 使用一个不定大小的泛型类型 'a + trait, trait + trait 复合类型限制 表 B-6 展示了在调用或定义宏以及在其上指定属性时的上下文中出现的符号。 表 B-6: 宏与属性 符号 解释 #[meta] 外部属性 #![meta] 内部属性 $ident 宏替换 $ident:kind 宏捕获 $(…)… 宏重复 ident!(...), ident!{...}, ident![...] 宏调用 表 B-7 展示了写注释的符号。 表 B-7: 注释 符号 注释 // 行注释 //! 内部行文档注释 /// 外部行文档注释 /*...*/ 块注释 /*!...*/ 内部块文档注释 /**...*/ 外部块文档注释 表 B-8 展示了出现在使用元组时上下文中的符号。 表 B-8: 元组 符号 解释 () 空元组(亦称单元),即是字面值也是类型 (expr) 括号表达式 (expr,) 单一元素元组表达式 (type,) 单一元素元组类型 (expr, ...) 元组表达式 (type, ...) 元组类型 expr(expr, ...) 函数调用表达式;也用于初始化元组结构体 struct 以及元组枚举 enum 变体 expr.0, expr.1, etc. 元组索引 表 B-9 展示了使用大括号的上下文。 表 B-9: 大括号 符号 解释 {...} 块表达式 Type {...} struct 字面值 表 B-10 展示了使用方括号的上下文。 表 B-10: 方括号 符号 解释 [...] 数组 [expr; len] 复制了 len个 expr的数组 [type; len] 包含 len个 type 类型的数组 expr[expr] 集合索引。重载(Index, IndexMut) expr[..], expr[a..], expr[..b], expr[a..b] 集合索引,使用 Range,RangeFrom,RangeTo 或 RangeFull 作为索引来代替集合 slice","breadcrumbs":"附录 » B - 运算符与符号 » 非运算符符号","id":"417","title":"非运算符符号"},"418":{"body":"appendix-03-derivable-traits.md commit c07dddac692848ade6c2112c8e15a7087fbbec45 在本书的各个部分中,我们讨论了可应用于结构体和枚举定义的 derive 属性。derive 属性会在使用 derive 语法标记的类型上生成对应 trait 的默认实现的代码。 在本附录中提供了标准库中所有可以使用 derive 的 trait 的参考。这些部分涉及到: 该 trait 将会派生什么样的操作符和方法 由 derive 提供什么样的 trait 实现 由什么来实现类型的 trait 是否允许实现该 trait 的条件 需要 trait 操作的例子 如果你希望不同于 derive 属性所提供的行为,请查阅 标准库文档 中每个 trait 的细节以了解如何手动实现它们。 这里列出的 trait 是仅有的在标准库中定义且能通过 derive 在类型上实现。标准库中定义的其它 trait 不能通过 derive 在类型上实现。这些 trait 不存在有意义的默认行为,所以由你负责以合理的方式实现它们。 一个无法被派生的 trait 的例子是为终端用户处理格式化的 Display 。你应该时常考虑使用合适的方法来为终端用户显示一个类型。终端用户应该看到类型的什么部分?他们会找出相关部分吗?对他们来说最相关的数据格式是什么样的?Rust 编译器没有这样的洞察力,因此无法为你提供合适的默认行为。 本附录所提供的可派生 trait 列表并不全面:库可以为其自己的 trait 实现 derive,可以使用 derive 的 trait 列表事实上是无限的。实现 derive 涉及到过程宏的应用,这在第二十章的 “宏” 有介绍。","breadcrumbs":"附录 » C - 可派生的 trait » 附录 C:可派生的 trait","id":"418","title":"附录 C:可派生的 trait"},"419":{"body":"Debug trait 用于开启格式化字符串中的调试格式,其通过在 {} 占位符中增加 :? 表明。 Debug trait 允许以调试目的来打印一个类型的实例,所以使用该类型的程序员可以在程序执行的特定时间点观察其实例。 例如,在使用 assert_eq! 宏时,Debug trait 是必须的。如果等式断言失败,这个宏就把给定实例的值作为参数打印出来,如此程序员可以看到两个实例为什么不相等。","breadcrumbs":"附录 » C - 可派生的 trait » 用于程序员输出的 Debug","id":"419","title":"用于程序员输出的 Debug"},"42":{"body":"现在有了用户输入和一个随机数,我们可以比较它们。这个步骤如示例 2-4 所示。注意这段代码还不能通过编译,我们稍后会解释。 文件名:src/main.rs use rand::Rng;\nuse std::cmp::Ordering;\nuse std::io; fn main() { // --snip--\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\"); println!(\"You guessed: {guess}\"); match guess.cmp(&secret_number) { Ordering::Less => println!(\"Too small!\"), Ordering::Greater => println!(\"Too big!\"), Ordering::Equal => println!(\"You win!\"), }\n} 示例 2-4:处理比较两个数字可能的返回值 首先我们增加了另一个 use 声明,从标准库引入了一个叫做 std::cmp::Ordering 的类型到作用域中。 Ordering 也是一个枚举,不过它的成员是 Less、Greater 和 Equal。这是比较两个值时可能出现的三种结果。 接着,底部的五行新代码使用了 Ordering 类型,cmp 方法用来比较两个值并可以在任何可比较的值上调用。它获取一个被比较值的引用:这里是把 guess 与 secret_number 做比较。然后它会返回一个刚才通过 use 引入作用域的 Ordering 枚举的成员。使用一个 match 表达式,根据对 guess 和 secret_number 调用 cmp 返回的 Ordering 成员来决定接下来做什么。 一个 match 表达式由 分支(arms) 构成。一个分支包含一个 模式 ( pattern )和表达式开头的值与分支模式相匹配时应该执行的代码。Rust 获取提供给 match 的值并挨个检查每个分支的模式。match 结构和模式是 Rust 中强大的功能,它体现了代码可能遇到的多种情形,并帮助你确保没有遗漏处理。这些功能将分别在第六章和第十九章详细介绍。 让我们看看使用 match 表达式的例子。假设用户猜了 50,这时随机生成的秘密数字是 38。 比较 50 与 38 时,因为 50 比 38 要大,cmp 方法会返回 Ordering::Greater。Ordering::Greater 是 match 表达式得到的值。它检查第一个分支的模式,Ordering::Less 与 Ordering::Greater并不匹配,所以它忽略了这个分支的代码并来到下一个分支。下一个分支的模式是 Ordering::Greater, 正确 匹配!这个分支关联的代码被执行,在屏幕打印出 Too big!。match 表达式会在第一次成功匹配后终止,因为该场景下没有检查最后一个分支的必要。 然而,示例 2-4 的代码目前并不能编译,可以尝试一下: $ cargo build Downloading crates ... Downloaded rand_core v0.6.2 Downloaded getrandom v0.2.2 Downloaded rand_chacha v0.3.0 Downloaded ppv-lite86 v0.2.10 Downloaded libc v0.2.86 Compiling libc v0.2.86 Compiling getrandom v0.2.2 Compiling cfg-if v1.0.0 Compiling ppv-lite86 v0.2.10 Compiling rand_core v0.6.2 Compiling rand_chacha v0.3.0 Compiling rand v0.8.5 Compiling guessing_game v0.1.0 (file:///projects/guessing_game)\nerror[E0308]: mismatched types --> src/main.rs:22:21 |\n22 | match guess.cmp(&secret_number) { | --- ^^^^^^^^^^^^^^ expected `&String`, found `&{integer}` | | | arguments to this method are incorrect | = note: expected reference `&String` found reference `&{integer}`\nnote: method defined here --> /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/cmp.rs:839:8 For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `guessing_game` (bin \"guessing_game\") due to 1 previous error 错误的核心表明这里有 不匹配的类型 ( mismatched types )。Rust 有一个静态强类型系统,同时也有类型推断。当我们写出 let guess = String::new() 时,Rust 推断出 guess 应该是 String 类型,并不需要我们写出类型。另一方面,secret_number,是数字类型。几个数字类型拥有 1 到 100 之间的值:32 位数字 i32;32 位无符号数字 u32;64 位数字 i64 等等。Rust 默认使用 i32,所以它是 secret_number 的类型,除非增加类型信息,或任何能让 Rust 推断出不同数值类型的信息。这里错误的原因在于 Rust 不会比较字符串类型和数字类型。 所以我们必须把从输入中读取到的 String 转换为一个真正的数字类型,才好与秘密数字进行比较。这可以通过在 main 函数体中增加如下代码来实现: 文件名:src/main.rs # use rand::Rng;\n# use std::cmp::Ordering;\n# use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # println!(\"Please input your guess.\");\n# // --snip-- let mut guess = String::new(); io::stdin() .read_line(&mut guess) .expect(\"Failed to read line\"); let guess: u32 = guess.trim().parse().expect(\"Please type a number!\"); println!(\"You guessed: {guess}\"); match guess.cmp(&secret_number) { Ordering::Less => println!(\"Too small!\"), Ordering::Greater => println!(\"Too big!\"), Ordering::Equal => println!(\"You win!\"), }\n# } 这行新代码是: let guess: u32 = guess.trim().parse().expect(\"Please type a number!\"); 这里创建了一个叫做 guess 的变量。不过等等,不是已经有了一个叫做 guess 的变量了吗?确实如此,不过 Rust 允许用一个新值来 隐藏 ( Shadowing ) guess 之前的值。这个功能常用在需要转换值类型之类的场景。它允许我们复用 guess 变量的名字,而不是被迫创建两个不同变量,诸如 guess_str 和 guess 之类。 第三章 会介绍 shadowing 的更多细节,现在只需知道这个功能经常用于将一个类型的值转换为另一个类型的值。 我们将这个新变量绑定到 guess.trim().parse() 表达式上。表达式中的 guess 指的是包含输入的字符串类型 guess 变量。String 实例的 trim 方法会去除字符串开头和结尾的空白字符,我们必须执行此方法才能将字符串与 u32 比较,因为 u32 只能包含数值型数据。用户必须输入 enter 键才能让 read_line 返回并输入他们的猜想,这将会在字符串中增加一个换行(newline)符。例如,用户输入 5 并按下 enter(在 Windows 上,按下 enter 键会得到一个回车符和一个换行符,\\r\\n),guess 看起来像这样:5\\n 或者 5\\r\\n。\\n 代表 “换行”,回车键;\\r 代表 “回车”,回车键。trim 方法会消除 \\n 或者 \\r\\n,只留下 5。 字符串的 parse 方法 将字符串转换成其他类型。这里用它来把字符串转换为数值。我们需要告诉 Rust 具体的数字类型,这里通过 let guess: u32 指定。guess 后面的冒号(:)告诉 Rust 我们指定了变量的类型。Rust 有一些内建的数字类型;u32 是一个无符号的 32 位整型。对于不大的正整数来说,它是不错的默认类型, 第三章 还会讲到其他数字类型。 另外,程序中的 u32 注解以及与 secret_number 的比较,意味着 Rust 会推断出 secret_number 也是 u32 类型。现在可以使用相同类型比较两个值了! parse 方法只有在字符逻辑上可以转换为数字的时候才能工作所以非常容易出错。例如,字符串中包含 A👍%,就无法将其转换为一个数字。因此,parse 方法返回一个 Result 类型。像之前 “使用 Result 类型来处理潜在的错误” 讨论的 read_line 方法那样,再次按部就班的用 expect 方法处理即可。如果 parse 不能从字符串生成一个数字,返回一个 Result 的 Err 成员时,expect 会使游戏崩溃并打印附带的信息。如果 parse 成功地将字符串转换为一个数字,它会返回 Result 的 Ok 成员,然后 expect 会返回 Ok 值中的数字。 现在让我们运行程序! $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 0.43s Running `target/debug/guessing_game`\nGuess the number!\nThe secret number is: 58\nPlease input your guess. 76\nYou guessed: 76\nToo big! 漂亮!即便是在猜测之前添加了空格,程序依然能判断出用户猜测了 76。多运行程序几次,输入不同的数字来检验不同的行为:猜一个正确的数字,猜一个过大的数字和猜一个过小的数字。 现在游戏已经大体上能玩了,不过用户只能猜一次。增加一个循环来改变它吧!","breadcrumbs":"写个猜数字游戏 » 比较猜测的数字和秘密数字","id":"42","title":"比较猜测的数字和秘密数字"},"420":{"body":"PartialEq trait 可以比较一个类型的实例以检查是否相等,并开启了 == 和 != 运算符的功能。 派生的 PartialEq 实现了 eq 方法。当 PartialEq 在结构体上派生时,只有 所有 的字段都相等时两个实例才相等,同时只要有任何字段不相等则两个实例就不相等。当在枚举上派生时,每一个成员都和其自身相等,且和其他成员都不相等。 例如,当使用 assert_eq! 宏时,需要比较一个类型的两个实例是否相等,则 PartialEq trait 是必须的。 Eq trait 没有方法。其作用是表明每一个被标记类型的值等于其自身。Eq trait 只能应用于那些实现了 PartialEq 的类型,但并非所有实现了 PartialEq 的类型都可以实现 Eq。浮点类型就是一个例子:浮点数的实现表明两个非数字(NaN,not-a-number)值是互不相等的。 例如,对于一个 HashMap 中的 key 来说, Eq 是必须的,这样 HashMap 就可以知道两个 key 是否一样了。","breadcrumbs":"附录 » C - 可派生的 trait » 等值比较的 PartialEq 和 Eq","id":"420","title":"等值比较的 PartialEq 和 Eq"},"421":{"body":"PartialOrd trait 可以基于排序的目的而比较一个类型的实例。实现了 PartialOrd 的类型可以使用 <、 >、<= 和 >= 操作符。但只能在同时实现了 PartialEq 的类型上使用 PartialOrd。 派生 PartialOrd 实现了 partial_cmp 方法,其返回一个 Option ,但当给定值无法产生顺序时将返回 None。尽管大多数类型的值都可以比较,但一个无法产生顺序的例子是:浮点类型的非数字值。当在浮点数上调用 partial_cmp 时,NaN 的浮点数将返回 None。 当在结构体上派生时,PartialOrd 按照结构体定义中字段出现的顺序,依次比较每个字段的值,以此来比较两个实例。当在枚举上派生时,认为在枚举定义中声明较早的枚举变体小于其后的变体。 例如,对于来自于 rand crate 中的 gen_range 方法来说,当在一个范围表达式指定的范围内生成一个随机值时,PartialOrd trait 是必须的。 Ord trait 也让你明白在一个带注解类型上的任意两个值存在有效顺序。Ord trait 实现了 cmp 方法,它返回一个 Ordering 而不是 Option,因为总存在一个合法的顺序。只可以在实现了 PartialOrd 和 Eq(Eq 依赖 PartialEq)的类型上使用 Ord trait。当在结构体或枚举上派生时, cmp 和以 PartialOrd 派生实现的 partial_cmp 表现一致。 例如,当在 BTreeSet(一种基于有序值存储数据的数据结构)上存值时,Ord 是必须的。","breadcrumbs":"附录 » C - 可派生的 trait » 次序比较的 PartialOrd 和 Ord","id":"421","title":"次序比较的 PartialOrd 和 Ord"},"422":{"body":"Clone trait 可以明确地创建一个值的深拷贝(deep copy),复制过程可能包含任意代码的执行以及堆上数据的复制。查阅第四章 “变量与数据交互的方式(二):克隆” 以获取有关 Clone 的更多信息。 派生 Clone 实现了 clone 方法,其为整个的类型实现时,在类型的每一部分上调用了 clone 方法。这意味着类型中所有字段或值也必须实现了 Clone,这样才能够派生 Clone 。 例如,当在一个切片(slice)上调用 to_vec 方法时,Clone 是必须的。切片并不拥有其包含的实例,但是从 to_vec 中返回的 vector 需要拥有其实例,因此,to_vec 在每个元素上调用 clone。因此,存储在切片中的类型必须实现 Clone。 Copy trait 允许你通过只拷贝存储在栈上的位来复制值而不需要额外的代码。查阅第四章 “只在栈上的数据:拷贝” 的部分来获取有关 Copy 的更多信息。 Copy trait 并未定义任何方法来阻止编程人员重写这些方法或违反不需要执行额外代码的假设。尽管如此,所有的编程人员可以假设复制(copy)一个值非常快。 可以在类型内部全部实现 Copy trait 的任意类型上派生 Copy。一个实现了 Copy 的类型必须也实现了 Clone,因为一个实现了 Copy 的类型也简单地实现了 Clone,其执行和 Copy 相同的任务。 Copy trait 很少使用;实现 Copy 的类型是可以优化的,这意味着你无需调用 clone,这让代码更简洁。 任何使用 Copy 的代码都可以通过 Clone 实现,但代码可能会稍慢,或者不得不在代码中的许多位置上使用 clone。","breadcrumbs":"附录 » C - 可派生的 trait » 复制值的 Clone 和 Copy","id":"422","title":"复制值的 Clone 和 Copy"},"423":{"body":"Hash trait 可以实例化一个任意大小的类型,并且能够用哈希(hash)函数将该实例映射到一个固定大小的值上。派生 Hash 实现了 hash 方法。hash 方法的派生实现结合了在类型的每部分调用 hash 的结果,这意味着所有的字段或值也必须实现了 Hash,这样才能够派生 Hash。 例如,在 HashMap 上存储数据,存放 key 的时候,Hash 是必须的。","breadcrumbs":"附录 » C - 可派生的 trait » 固定大小的值到值映射的 Hash","id":"423","title":"固定大小的值到值映射的 Hash"},"424":{"body":"Default trait 使你创建一个类型的默认值。派生 Default 实现了 default 函数。default 函数的派生实现调用了类型每部分的 default 函数,这意味着类型中所有的字段或值也必须实现了 Default,这样才能够派生 Default 。 Default::default 函数通常结合结构体更新语法一起使用,这在第五章的 “使用结构体更新语法从其他实例中创建实例” 部分有讨论。可以自定义一个结构体的一小部分字段而剩余字段则使用 ..Default::default() 设置为默认值。 例如,当你在 Option 实例上使用 unwrap_or_default 方法时,Default trait 是必须的。如果 Option 是 None的话,unwrap_or_default 方法将返回存储在 Option 中 T 类型的 Default::default 的结果。","breadcrumbs":"附录 » C - 可派生的 trait » 默认值的 Default","id":"424","title":"默认值的 Default"},"425":{"body":"appendix-04-useful-development-tools.md commit 5057f157cd0b35bc7d0dc0af6ef622fa4c480996 本附录,我们将讨论 Rust 项目提供的用于开发 Rust 代码的工具。","breadcrumbs":"附录 » D - 实用开发工具 » 附录 D:实用开发工具","id":"425","title":"附录 D:实用开发工具"},"426":{"body":"rustfmt 工具根据社区代码风格格式化代码。很多项目使用 rustfmt 来避免编写 Rust 风格的争论:所有人都用这个工具格式化代码! 安装 rustfmt: $ rustup component add rustfmt 这会提供 rustfmt 和 cargo-fmt,类似于 Rust 同时安装 rustc 和 cargo。为了格式化整个 Cargo 项目: $ cargo fmt 运行此命令会格式化当前 crate 中所有的 Rust 代码。这应该只会改变代码风格,而不是代码语义。请查看 该文档 了解 rustfmt 的更多信息。","breadcrumbs":"附录 » D - 实用开发工具 » 通过 rustfmt 自动格式化","id":"426","title":"通过 rustfmt 自动格式化"},"427":{"body":"如果你编写过 Rust 代码,那么你可能见过那些有很明显修复方式的编译器警告。例如,考虑如下代码: 文件名:src/main.rs fn do_something() {} fn main() { for i in 0..100 { do_something(); }\n} 这里调用了 do_something 函数 100 次,不过从未在 for 循环体中使用变量 i。Rust 会警告说: $ cargo build Compiling myprogram v0.1.0 (file:///projects/myprogram)\nwarning: unused variable: `i` --> src/main.rs:4:9 |\n4 | for i in 0..100 { | ^ help: consider using `_i` instead | = note: #[warn(unused_variables)] on by default Finished dev [unoptimized + debuginfo] target(s) in 0.50s 警告中建议使用 _i 名称:下划线表明该变量有意不使用。我们可以通过 cargo fix 命令使用 rustfix 工具来自动采用该建议: $ cargo fix Checking myprogram v0.1.0 (file:///projects/myprogram) Fixing src/main.rs (1 fix) Finished dev [unoptimized + debuginfo] target(s) in 0.59s 如果再次查看 src/main.rs ,会发现 cargo fix 修改了代码: 文件名:src/main.rs fn do_something() {} fn main() { for _i in 0..100 { do_something(); }\n} 现在 for 循环变量变为 _i,警告也不再出现。 cargo fix 命令可以用于在不同 Rust 版本间迁移代码。版本在附录 E 中介绍。","breadcrumbs":"附录 » D - 实用开发工具 » 通过 rustfix 修复代码","id":"427","title":"通过 rustfix 修复代码"},"428":{"body":"clippy 工具是一系列 lint 的集合,用于捕捉常见错误和改进 Rust 代码。 安装 clippy: $ rustup component add clippy 对任何 Cargo 项目运行 clippy 的 lint: $ cargo clippy 例如,如果程序使用了如 pi 这样数学常数的近似值,如下: 文件名:src/main.rs fn main() { let x = 3.1415; let r = 8.0; println!(\"the area of the circle is {}\", x * r * r);\n} 在此项目上运行 cargo clippy 会导致这个错误: error: approximate value of `f{32, 64}::consts::PI` found --> src/main.rs:2:13 |\n2 | let x = 3.1415; | ^^^^^^ | = note: `#[deny(clippy::approx_constant)]` on by default = help: consider using the constant directly = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#approx_constant 这告诉我们 Rust 定义了更为精确的常量,而如果使用了这些常量程序将更加准确。如下代码就不会导致 clippy 产生任何错误或警告: 文件名:src/main.rs fn main() { let x = std::f64::consts::PI; let r = 8.0; println!(\"the area of the circle is {}\", x * r * r);\n} 请查看 其文档 来了解 clippy 的更多信息。","breadcrumbs":"附录 » D - 实用开发工具 » 通过 clippy 提供更多 lint 功能","id":"428","title":"通过 clippy 提供更多 lint 功能"},"429":{"body":"为了帮助 IDE 集成,Rust 社区建议使用 rust-analyzer 。这个工具是一组以编译器为中心的实用程序,它实现了 Language Server Protocol (一个 IDE 与编程语言之间的通信规范)。rust-analyzer 可以用于不同的客户端,比如 Visual Studio Code 的 Rust analyzer 插件 。 访问 rust-analyzer 项目的 主页 来了解如何安装它,然后为你的 IDE 安装 language server 支持。如此你的 IDE 便会获得如自动补全、跳转到定义和 inline error 之类的功能。","breadcrumbs":"附录 » D - 实用开发工具 » 使用 rust-analyzer 的 IDE 集成","id":"429","title":"使用 rust-analyzer 的 IDE 集成"},"43":{"body":"loop 关键字创建了一个无限循环。我们会增加循环来给用户更多机会猜数字: 文件名:src/main.rs # use rand::Rng;\n# use std::cmp::Ordering;\n# use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# // --snip-- println!(\"The secret number is: {secret_number}\"); loop { println!(\"Please input your guess.\"); // --snip-- # # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # let guess: u32 = guess.trim().parse().expect(\"Please type a number!\");\n# # println!(\"You guessed: {guess}\");\n# match guess.cmp(&secret_number) { Ordering::Less => println!(\"Too small!\"), Ordering::Greater => println!(\"Too big!\"), Ordering::Equal => println!(\"You win!\"), } }\n} 如上所示,我们将提示用户猜测之后的所有内容移动到了循环中。确保 loop 循环中的代码多缩进四个空格,再次运行程序。注意这里有一个新问题,因为程序忠实地执行了我们的要求:永远地请求另一个猜测,用户好像无法退出啊! 用户总能使用 ctrl-c 终止程序。不过还有另一个方法跳出无限循环,就是 “比较猜测与秘密数字” 部分提到的 parse:如果用户输入的答案不是一个数字,程序会崩溃。我们可以利用这一点来退出,如下所示: $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 1.50s Running `target/debug/guessing_game`\nGuess the number!\nThe secret number is: 59\nPlease input your guess.\n45\nYou guessed: 45\nToo small!\nPlease input your guess.\n60\nYou guessed: 60\nToo big!\nPlease input your guess.\n59\nYou guessed: 59\nYou win!\nPlease input your guess.\nquit\nthread 'main' panicked at 'Please type a number!: ParseIntError { kind: InvalidDigit }', src/main.rs:28:47\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 输入 quit 将会退出程序,同时你会注意到其他任何非数字输入也一样。然而,这并不理想,我们想要当猜测正确的数字时游戏停止。","breadcrumbs":"写个猜数字游戏 » 使用循环来允许多次猜测","id":"43","title":"使用循环来允许多次猜测"},"430":{"body":"appendix-05-editions.md commit 8cf0496bb8e56b683ea3f015871c8631684decf4 早在第一章,我们见过 cargo new 在 Cargo.toml 中增加了一些有关 edition 的元数据。本附录将解释其意义! Rust 语言和编译器有一个为期 6 周的发布循环。这意味着用户会稳定得到新功能的更新。其他编程语言发布大更新但不甚频繁;Rust 选择更为频繁的发布小更新。一段时间之后,所有这些小更新会日积月累。不过随着小更新逐次的发布,或许很难回过头来感叹:“哇,从 Rust 1.10 到 Rust 1.31,Rust 的变化真大!” 每两到三年,Rust 团队会生成一个新的 Rust 版本 ( edition )。每一个版本会结合已经落地的功能,并提供一个清晰的带有完整更新文档和工具的功能包。新版本会作为常规的 6 周发布过程的一部分发布。 这为不同的人群提供了不同的功能: 对于活跃的 Rust 用户,其将增量的修改与易于理解的功能包相结合。 对于非用户,它表明发布了一些重大进展,这意味着 Rust 可能变得值得一试。 对于 Rust 自身开发者,其提供了项目整体的集合点。 在本文档编写时,Rust 有三个可用版本:Rust 2015、Rust 2018 和 Rust 2021。本书基于 Rust 2021 edition 风格编写。 Cargo.toml 中的 edition 字段表明代码应该使用哪个版本编译。如果该字段不存在,其默认为 2015 以提供后向兼容性。 每个项目都可以选择不同于默认的 2015 edition 的版本。这样,版本可能会包含不兼容的修改,比如新增关键字可能会与代码中的标识符冲突并导致错误。不过除非选择兼容这些修改,(旧)代码仍将能够编译,即便升级了 Rust 编译器的版本。 所有 Rust 编译器都支持任何之前存在的编译器版本,并可以链接任何支持版本的 crate。编译器修改只影响最初的解析代码的过程。因此,如果你使用 Rust 2015 而某个依赖使用 Rust 2018,你的项目仍旧能够编译并使用该依赖。反之,若项目使用 Rust 2018 而依赖使用 Rust 2015 亦可工作。 有一点需要明确:大部分功能在所有版本中都能使用。开发者使用任何 Rust 版本将能继续接收最新稳定版的改进。然而在一些情况,主要是增加了新关键字的时候,则可能出现了只能用于新版本的功能。只需切换版本即可利用新版本的功能。 请查看 Edition Guide 了解更多细节,这是一个完全介绍版本的书籍,包括如何通过 cargo fix 自动将代码迁移到新版本。","breadcrumbs":"附录 » E - 版本 » 附录 E:版本","id":"430","title":"附录 E:版本"},"431":{"body":"appendix-06-translation.md commit 4c8d13c52c51f1c62a80b52d7fbd7cc0b63ada43 一些非英语语言的资源。多数仍在翻译中;查阅 翻译标签 来帮助翻译,或者添加译本链接! Português (BR) Português (PT) 简体中文 正體中文 Українська Español , alternate Italiano Русский 한국어 日本語 Français Polski Cebuano Tagalog Esperanto ελληνική Svenska Farsi Deutsch हिंदी ไทย Danske","breadcrumbs":"附录 » F - 本书译本 » 附录 F:本书译本","id":"431","title":"附录 F:本书译本"},"432":{"body":"appendix-07-nightly-rust.md commit d44317c3122b44fb713aba66cc295dee3453b24b 本附录介绍 Rust 是如何开发的以及这如何影响作为 Rust 开发者的你。","breadcrumbs":"附录 » G - Rust 是如何开发的与 “Nightly Rust” » 附录 G:Rust 是如何开发的与 “Nightly Rust”","id":"432","title":"附录 G:Rust 是如何开发的与 “Nightly Rust”"},"433":{"body":"作为一个语言,Rust 十分 注重代码的稳定性。我们希望 Rust 成为你代码坚实的基础,假如持续地有东西在变,这个希望就实现不了。但与此同时,如果不能实验新功能的话,在发布之前我们又无法发现其中重大的缺陷,而一旦发布便再也没有修改的机会了。 对于这个问题我们的解决方案被称为 “无停滞稳定”(“stability without stagnation”),其指导性原则是:无需担心升级到最新的稳定版 Rust。每次升级应该是无痛的,并应带来新功能,更少的 bug 和更快的编译速度。","breadcrumbs":"附录 » G - Rust 是如何开发的与 “Nightly Rust” » 无停滞稳定","id":"433","title":"无停滞稳定"},"434":{"body":"Rust 开发运行于一个 发布时刻表 ( train schedule )之上。也就是说,所有的开发工作都位于 Rust 仓库的 master 分支。发布采用 software release train 模型,其被用于思科 IOS 等其它软件项目。Rust 有三个 发布通道 ( release channel ): Nightly Beta Stable(稳定版) 大部分 Rust 开发者主要采用稳定版通道,不过希望实验新功能的开发者可能会使用 nightly 或 beta 版。 如下是一个开发和发布过程如何运转的例子:假设 Rust 团队正在进行 Rust 1.5 的发布工作。该版本发布于 2015 年 12 月,不过这里只是为了提供一个真实的版本。Rust 新增了一项功能:一个 master 分支的新提交。每天晚上,会产生一个新的 nightly 版本。每天都是发布版本的日子,而这些发布由发布基础设施自动完成。所以随着时间推移,发布轨迹看起来像这样,版本一天一发: nightly: * - - * - - * 每 6 周时间,是准备发布新版本的时候了!Rust 仓库的 beta 分支会从用于 nightly 的 master 分支产生。现在,有了两个发布版本: nightly: * - - * - - * |\nbeta: * 大部分 Rust 用户不会主要使用 beta 版本,不过在 CI 系统中对 beta 版本进行测试能够帮助 Rust 发现可能的回归缺陷(regression)。同时,每天仍产生 nightly 发布: nightly: * - - * - - * - - * - - * |\nbeta: * 比如我们发现了一个回归缺陷。好消息是在这些缺陷流入稳定发布之前还有一些时间来测试 beta 版本!fix 被合并到 master,为此 nightly 版本得到了修复,接着这些 fix 将 backport 到 beta 分支,一个新的 beta 发布就产生了: nightly: * - - * - - * - - * - - * - - * |\nbeta: * - - - - - - - - * 第一个 beta 版的 6 周后,是发布稳定版的时候了!stable 分支从 beta 分支生成: nightly: * - - * - - * - - * - - * - - * - * - * |\nbeta: * - - - - - - - - * |\nstable: * 好的!Rust 1.5 发布了!然而,我们忘了些东西:因为又过了 6 周,我们还需发布 新版 Rust 的 beta 版,Rust 1.6。所以从 beta 生成 stable 分支后,新版的 beta 分支也再次从 nightly 生成: nightly: * - - * - - * - - * - - * - - * - * - * | |\nbeta: * - - - - - - - - * * |\nstable: * 这被称为 “train model”,因为每 6 周,一个版本 “离开车站”(“leaves the station”),不过从 beta 通道到达稳定通道还有一段旅程。 Rust 每 6 周发布一个版本,如时钟般准确。如果你知道了某个 Rust 版本的发布时间,就可以知道下个版本的时间:6 周后。每 6 周发布版本的一个好的方面是下一班车会来得更快。如果特定版本碰巧缺失某个功能也无需担心:另一个版本很快就会到来!这有助于减少因临近发版时间而偷偷释出未经完善的功能的压力。 多亏了这个过程,你总是可以切换到下一版本的 Rust 并验证是否可以轻易的升级:如果 beta 版不能如期工作,你可以向 Rust 团队报告并在发布稳定版之前得到修复!beta 版造成的破坏是非常少见的,不过 rustc 也不过是一个软件,可能会存在 bug。","breadcrumbs":"附录 » G - Rust 是如何开发的与 “Nightly Rust” » Choo, Choo! 发布通道和发布时刻表(Riding the Trains)","id":"434","title":"Choo, Choo! 发布通道和发布时刻表(Riding the Trains)"},"435":{"body":"这个发布模型中另一个值得注意的地方:不稳定功能(unstable features)。Rust 使用一个被称为 “功能标记”(“feature flags”)的技术来确定给定版本的某个功能是否启用。如果新功能正在积极地开发中,其提交到了 master,因此会出现在 nightly 版中,不过会位于一个 功能标记 之后。作为用户,如果你希望尝试这个正在开发的功能,则可以在源码中使用合适的标记来开启,不过必须使用 nightly 版。 如果使用的是 beta 或稳定版 Rust,则不能使用任何功能标记。这是在新功能被宣布为永久稳定之前获得实用价值的关键。这既满足了希望使用最尖端技术的同学,那些坚持稳定版的同学也知道其代码不会被破坏。这就是无停滞稳定。 本书只包含稳定的功能,因为还在开发中的功能仍可能改变,当其进入稳定版时肯定会与编写本书的时候有所不同。你可以在网上获取 nightly 版的文档。","breadcrumbs":"附录 » G - Rust 是如何开发的与 “Nightly Rust” » 不稳定功能","id":"435","title":"不稳定功能"},"436":{"body":"Rustup 使得改变不同发布通道的 Rust 更为简单,其在全局或分项目的层次工作。其默认会安装稳定版 Rust。例如为了安装 nightly: $ rustup toolchain install nightly 你会发现 rustup 也安装了所有的 工具链 ( toolchains ,Rust 和其相关组件)。如下是一位作者的 Windows 计算机上的例子: > rustup toolchain list\nstable-x86_64-pc-windows-msvc (default)\nbeta-x86_64-pc-windows-msvc\nnightly-x86_64-pc-windows-msvc 如你所见,默认是稳定版。大部分 Rust 用户在大部分时间使用稳定版。你可能也会这么做,不过如果你关心最新的功能,可以为特定项目使用 nightly 版。为此,可以在项目目录使用 rustup override 来设置当前目录 rustup 使用 nightly 工具链: $ cd ~/projects/needs-nightly\n$ rustup override set nightly 现在,每次在 ~/projects/needs-nightly 调用 rustc 或 cargo,rustup 会确保使用 nightly 版 Rust。在你有很多 Rust 项目时大有裨益!","breadcrumbs":"附录 » G - Rust 是如何开发的与 “Nightly Rust” » Rustup 和 Rust Nightly 的职责","id":"436","title":"Rustup 和 Rust Nightly 的职责"},"437":{"body":"那么你如何了解这些新功能呢?Rust 开发模式遵循一个 Request For Comments (RFC) 过程 。如果你希望改进 Rust,可以编写一个提议,也就是 RFC。 任何人都可以编写 RFC 来改进 Rust,同时这些 RFC 会被 Rust 团队评审和讨论,他们由很多不同分工的子团队组成。这里是 Rust 官网上 所有团队的总列表,其包含了项目中每个领域的团队:语言设计、编译器实现、基础设施、文档等。各个团队会阅读相应的提议和评论,编写回复,并最终达成接受或回绝功能的一致。 如果功能被接受了,在 Rust 仓库会打开一个 issue,人们就可以实现它。实现功能的人当然可能不是最初提议功能的人!当实现完成后,其会合并到 master 分支并位于一个功能开关(feature gate)之后,正如 “不稳定功能” 部分所讨论的。 在稍后的某个时间,一旦使用 nightly 版的 Rust 团队能够尝试这个功能了,团队成员会讨论这个功能,它如何在 nightly 中工作,并决定是否应该进入稳定版。如果决定继续推进,功能开关会移除,然后这个功能就被认为是稳定的了!乘着“发布的列车”,最终在新的稳定版 Rust 中出现。","breadcrumbs":"附录 » G - Rust 是如何开发的与 “Nightly Rust” » RFC 过程和团队","id":"437","title":"RFC 过程和团队"},"44":{"body":"让我们增加一个 break 语句,在用户猜对时退出游戏: 文件名:src/main.rs # use rand::Rng;\n# use std::cmp::Ordering;\n# use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # loop {\n# println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# # io::stdin()\n# .read_line(&mut guess)\n# .expect(\"Failed to read line\");\n# # let guess: u32 = guess.trim().parse().expect(\"Please type a number!\");\n# # println!(\"You guessed: {guess}\");\n# // --snip-- match guess.cmp(&secret_number) { Ordering::Less => println!(\"Too small!\"), Ordering::Greater => println!(\"Too big!\"), Ordering::Equal => { println!(\"You win!\"); break; } } }\n} 通过在 You win! 之后增加一行 break,用户猜对了神秘数字后会退出循环。退出循环也意味着退出程序,因为循环是 main 的最后一部分。","breadcrumbs":"写个猜数字游戏 » 猜测正确后退出","id":"44","title":"猜测正确后退出"},"45":{"body":"为了进一步改善游戏性,不要在用户输入非数字时崩溃,需要忽略非数字,让用户可以继续猜测。可以通过修改 guess 将 String 转化为 u32 那部分代码来实现,如示例 2-5 所示: 文件名:src/main.rs # use rand::Rng;\n# use std::cmp::Ordering;\n# use std::io;\n# # fn main() {\n# println!(\"Guess the number!\");\n# # let secret_number = rand::thread_rng().gen_range(1..=100);\n# # println!(\"The secret number is: {secret_number}\");\n# # loop {\n# println!(\"Please input your guess.\");\n# # let mut guess = String::new();\n# // --snip-- io::stdin() .read_line(&mut guess) .expect(\"Failed to read line\"); let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; println!(\"You guessed: {guess}\"); // --snip--\n# # match guess.cmp(&secret_number) {\n# Ordering::Less => println!(\"Too small!\"),\n# Ordering::Greater => println!(\"Too big!\"),\n# Ordering::Equal => {\n# println!(\"You win!\");\n# break;\n# }\n# }\n# }\n# } 示例 2-5:忽略非数字的猜测并重新请求数字而不是让程序崩溃 我们将 expect 调用换成 match 语句,以从遇到错误就崩溃转换为处理错误。须知 parse 返回一个 Result 类型,而 Result 是一个拥有 Ok 或 Err 成员的枚举。这里使用的 match 表达式,和之前处理 cmp 方法返回 Ordering 时用的一样。 如果 parse 能够成功的将字符串转换为一个数字,它会返回一个包含结果数字的 Ok。这个 Ok 值与 match 第一个分支的模式相匹配,该分支对应的动作返回 Ok 值中的数字 num,最后如愿变成新创建的 guess 变量。 如果 parse 不 能将字符串转换为一个数字,它会返回一个包含更多错误信息的 Err。Err 值不能匹配第一个 match 分支的 Ok(num) 模式,但是会匹配第二个分支的 Err(_) 模式:_ 是一个通配符值,本例中用来匹配所有 Err 值,不管其中有何种信息。所以程序会执行第二个分支的动作,continue 意味着进入 loop 的下一次循环,请求另一个猜测。这样程序就有效的忽略了 parse 可能遇到的所有错误! 现在程序中的一切都应该如预期般工作了。让我们试试吧: $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 4.45s Running `target/debug/guessing_game`\nGuess the number!\nThe secret number is: 61\nPlease input your guess.\n10\nYou guessed: 10\nToo small!\nPlease input your guess.\n99\nYou guessed: 99\nToo big!\nPlease input your guess.\nfoo\nPlease input your guess.\n61\nYou guessed: 61\nYou win! 太棒了!再有最后一个小的修改,就能完成猜数字游戏了:还记得程序依然会打印出秘密数字。在测试时还好,但正式发布时会毁了游戏。删掉打印秘密数字的 println!。示例 2-6 为最终代码: 文件名:src/main.rs use rand::Rng;\nuse std::cmp::Ordering;\nuse std::io; fn main() { println!(\"Guess the number!\"); let secret_number = rand::thread_rng().gen_range(1..=100); loop { println!(\"Please input your guess.\"); let mut guess = String::new(); io::stdin() .read_line(&mut guess) .expect(\"Failed to read line\"); let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; println!(\"You guessed: {guess}\"); match guess.cmp(&secret_number) { Ordering::Less => println!(\"Too small!\"), Ordering::Greater => println!(\"Too big!\"), Ordering::Equal => { println!(\"You win!\"); break; } } }\n} 示例 2-6:猜数字游戏的完整代码 此时此刻,你顺利完成了猜数字游戏。恭喜!","breadcrumbs":"写个猜数字游戏 » 处理无效输入","id":"45","title":"处理无效输入"},"46":{"body":"本项目通过动手实践,向你介绍了 Rust 新概念:let、match、函数、使用外部 crate 等等,接下来的几章,你会继续深入学习这些概念。第三章介绍大部分编程语言都有的概念,比如变量、数据类型和函数,以及如何在 Rust 中使用它们。第四章探索所有权(ownership),这是一个 Rust 同其他语言大不相同的功能。第五章讨论结构体和方法的语法,而第六章侧重解释枚举。","breadcrumbs":"写个猜数字游戏 » 总结","id":"46","title":"总结"},"47":{"body":"ch03-00-common-programming-concepts.md commit d0acb2595c891de97a133d06635c50ab449dd65c 本章介绍一些几乎所有编程语言都有的概念,以及它们在 Rust 中是如何工作的。很多编程语言的核心概念都是共通的,本章中展示的概念都不是 Rust 所特有的,不过我们会在 Rust 上下文中讨论它们,并解释使用这些概念的惯例。 具体来说,我们将会学习变量、基本类型、函数、注释和控制流。每一个 Rust 程序中都会用到这些基础知识,提早学习这些概念会让你在起步时就打下坚实的基础。","breadcrumbs":"常见编程概念 » 常见编程概念","id":"47","title":"常见编程概念"},"48":{"body":"Rust 语言有一组保留的 关键字 ( keywords ),就像大部分语言一样,它们只能由语言本身使用。记住,你不能使用这些关键字作为变量或函数的名称。大部分关键字有特殊的意义,你将在 Rust 程序中使用它们完成各种任务;一些关键字目前没有相应的功能,是为将来可能添加的功能保留的。可以在 附录 A 中找到关键字的列表。","breadcrumbs":"常见编程概念 » 关键字","id":"48","title":"关键字"},"49":{"body":"ch03-01-variables-and-mutability.md commit 21a2ed14f4480dab62438dcc1130291bebc65379 正如第二章中 “使用变量储存值” 部分提到的那样,变量默认是不可改变的(immutable)。这是 Rust 提供给你的众多优势之一,让你得以充分利用 Rust 提供的安全性和简单并发性来编写代码。不过,你仍然可以使用可变变量。让我们探讨一下 Rust 为何及如何鼓励你利用不可变性,以及何时你会选择不使用不可变性。 当变量不可变时,一旦值被绑定一个名称上,你就不能改变这个值。为了对此进行说明,使用 cargo new variables 命令在 projects 目录生成一个叫做 variables 的新项目。 接着,在新建的 variables 目录,打开 src/main.rs 并将代码替换为如下代码,这些代码还不能编译,我们会首次检查到不可变错误(immutability error)。 文件名:src/main.rs fn main() { let x = 5; println!(\"The value of x is: {x}\"); x = 6; println!(\"The value of x is: {x}\");\n} 保存并使用 cargo run 运行程序。应该会看到一条与不可变性有关的错误信息,如下输出所示: $ cargo run Compiling variables v0.1.0 (file:///projects/variables)\nerror[E0384]: cannot assign twice to immutable variable `x` --> src/main.rs:4:5 |\n2 | let x = 5; | - first assignment to `x`\n3 | println!(\"The value of x is: {x}\");\n4 | x = 6; | ^^^^^ cannot assign twice to immutable variable |\nhelp: consider making this binding mutable |\n2 | let mut x = 5; | +++ For more information about this error, try `rustc --explain E0384`.\nerror: could not compile `variables` (bin \"variables\") due to 1 previous error 这个例子展示了编译器如何帮助你找出程序中的错误。虽然编译错误令人沮丧,但那只是表示程序不能安全的完成你想让它完成的工作;并 不能 说明你不是一个好程序员!经验丰富的 Rustacean 们一样会遇到编译错误。 错误信息指出错误的原因是 不能对不可变变量 x 二次赋值(cannot assign twice to immutable variable `x` ),因为你尝试对不可变变量 x 赋第二个值。 在尝试改变预设为不可变的值时,产生编译时错误是很重要的,因为这种情况可能导致 bug。如果一部分代码假设一个值永远也不会改变,而另一部分代码改变了这个值,第一部分代码就有可能以不可预料的方式运行。不得不承认这种 bug 的起因难以跟踪,尤其是第二部分代码只是 有时 会改变值。 Rust 编译器保证,如果声明一个值不会变,它就真的不会变,所以你不必自己跟踪它。这意味着你的代码更易于推导。 不过可变性也是非常有用的,可以用来更方便地编写代码。尽管变量默认是不可变的,你仍然可以在变量名前添加 mut 来使其可变,正如在 第二章 所做的那样。mut 也向读者表明了其他代码将会改变这个变量值的意图。 例如,让我们将 src/main.rs 修改为如下代码: 文件名:src/main.rs fn main() { let mut x = 5; println!(\"The value of x is: {x}\"); x = 6; println!(\"The value of x is: {x}\");\n} 现在运行这个程序,出现如下内容: $ cargo run Compiling variables v0.1.0 (file:///projects/variables) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s Running `target/debug/variables`\nThe value of x is: 5\nThe value of x is: 6 通过 mut,允许把绑定到 x 的值从 5 改成 6。是否让变量可变的最终决定权仍然在你,取决于在某个特定情况下,你是否认为变量可变会让代码更加清晰明了。","breadcrumbs":"常见编程概念 » 变量与可变性 » 变量和可变性","id":"49","title":"变量和可变性"},"5":{"body":"Rust 适合学生群体,也适合有兴趣学习系统概念的人。许多人通过 Rust 学习了操作系统开发等主题。社区对学生问题非常欢迎并乐于回答。通过类似这本书以及其他内容的努力,Rust 团队希望使系统概念能为更多人所易于理解,特别是编程新手。","breadcrumbs":"简介 » 学生","id":"5","title":"学生"},"50":{"body":"类似于不可变变量, 常量 (constants) 是绑定到一个名称的不允许改变的值,不过常量与变量还是有一些区别。 首先,不允许对常量使用 mut。常量不光默认不可变,它总是不可变。声明常量使用 const 关键字而不是 let,并且 必须 注明值的类型。在下一部分, “数据类型” 中会介绍类型和类型注解,现在无需关心这些细节,记住总是标注类型即可。 常量可以在任何作用域中声明,包括全局作用域,这在一个值需要被很多部分的代码用到时很有用。 最后一个区别是,常量只能被设置为常量表达式,而不可以是其他任何只能在运行时计算出的值。 下面是一个声明常量的例子: const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3; 常量的名称是 THREE_HOURS_IN_SECONDS,它的值被设置为 60(一分钟内的秒数)乘以 60(一小时内的分钟数)再乘以 3(我们在这个程序中要计算的小时数)的结果。Rust 对常量的命名约定是在单词之间使用全大写加下划线。编译器能够在编译时计算一组有限的操作,这使我们可以选择以更容易理解和验证的方式写出此值,而不是将此常量设置为值 10,800。有关声明常量时可以使用哪些操作的详细信息,请参阅 Rust Reference 的常量求值部分 。 在声明它的作用域之中,常量在整个程序生命周期中都有效,此属性使得常量可以作为多处代码使用的全局范围的值,例如一个游戏中所有玩家可以获取的最高分或者光速。 将遍布于应用程序中的硬编码值声明为常量,能帮助后来的代码维护人员了解值的意图。如果将来需要修改硬编码值,也只需修改汇聚于一处的硬编码值。","breadcrumbs":"常见编程概念 » 变量与可变性 » 常量","id":"50","title":"常量"},"51":{"body":"正如在 第二章 猜数字游戏中所讲,我们可以定义一个与之前变量同名的新变量。Rustacean 们称之为第一个变量被第二个 隐藏(Shadowing) 了,这意味着当您使用变量的名称时,编译器将看到第二个变量。实际上,第二个变量“遮蔽”了第一个变量,此时任何使用该变量名的行为中都会视为是在使用第二个变量,直到第二个变量自己也被隐藏或第二个变量的作用域结束。可以用相同变量名称来隐藏一个变量,以及重复使用 let 关键字来多次隐藏,如下所示: 文件名:src/main.rs fn main() { let x = 5; let x = x + 1; { let x = x * 2; println!(\"The value of x in the inner scope is: {x}\"); } println!(\"The value of x is: {x}\");\n} 这个程序首先将 x 绑定到值 5 上。接着通过 let x = 创建了一个新变量 x,获取初始值并加 1,这样 x 的值就变成 6 了。然后,在使用花括号创建的内部作用域内,第三个 let 语句也隐藏了 x 并创建了一个新的变量,将之前的值乘以 2,x 得到的值是 12。当该作用域结束时,内部 shadowing 的作用域也结束了,x 又返回到 6。运行这个程序,它会有如下输出: $ cargo run Compiling variables v0.1.0 (file:///projects/variables) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s Running `target/debug/variables`\nThe value of x in the inner scope is: 12\nThe value of x is: 6 隐藏与将变量标记为 mut 是有区别的。当不小心尝试对变量重新赋值时,如果没有使用 let 关键字,就会导致编译时错误。通过使用 let,我们可以用这个值进行一些计算,不过计算完之后变量仍然是不可变的。 mut 与隐藏的另一个区别是,当再次使用 let 时,实际上创建了一个新变量,我们可以改变值的类型,并且复用这个名字。例如,假设程序请求用户输入空格字符来说明希望在文本之间显示多少个空格,接下来我们想将输入存储成数字(多少个空格): # fn main() { let spaces = \" \"; let spaces = spaces.len();\n# } 第一个 spaces 变量是字符串类型,第二个 spaces 变量是数字类型。隐藏使我们不必使用不同的名字,如 spaces_str 和 spaces_num;相反,我们可以复用 spaces 这个更简单的名字。然而,如果尝试使用 mut,将会得到一个编译时错误,如下所示: # fn main() { let mut spaces = \" \"; spaces = spaces.len();\n# } 这个错误说明,我们不能改变变量的类型: $ cargo run Compiling variables v0.1.0 (file:///projects/variables)\nerror[E0308]: mismatched types --> src/main.rs:3:14 |\n2 | let mut spaces = \" \"; | ----- expected due to this value\n3 | spaces = spaces.len(); | ^^^^^^^^^^^^ expected `&str`, found `usize` For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `variables` (bin \"variables\") due to 1 previous error 现在我们已经了解了变量如何工作,让我们看看变量可以拥有的更多数据类型。","breadcrumbs":"常见编程概念 » 变量与可变性 » 隐藏","id":"51","title":"隐藏"},"52":{"body":"ch03-02-data-types.md commit d0acb2595c891de97a133d06635c50ab449dd65c 在 Rust 中,每一个值都属于某一个 数据类型 ( data type ),这告诉 Rust 它被指定为何种数据,以便明确数据处理方式。我们将看到两类数据类型子集:标量(scalar)和复合(compound)。 记住,Rust 是 静态类型 ( statically typed )语言,也就是说在编译时就必须知道所有变量的类型。根据值及其使用方式,编译器通常可以推断出我们想要用的类型。当多种类型均有可能时,比如第二章的 “比较猜测的数字和秘密数字” 使用 parse 将 String 转换为数字时,必须增加类型注解,像这样: let guess: u32 = \"42\".parse().expect(\"Not a number!\"); 如果不像上面的代码这样添加类型注解 : u32,Rust 会显示如下错误,这说明编译器需要我们提供更多信息,来了解我们想要的类型: $ cargo build Compiling no_type_annotations v0.1.0 (file:///projects/no_type_annotations)\nerror[E0284]: type annotations needed --> src/main.rs:2:9 |\n2 | let guess = \"42\".parse().expect(\"Not a number!\"); | ^^^^^ ----- type must be known at this point | = note: cannot satisfy `<_ as FromStr>::Err == _`\nhelp: consider giving `guess` an explicit type |\n2 | let guess: /* Type */ = \"42\".parse().expect(\"Not a number!\"); | ++++++++++++ For more information about this error, try `rustc --explain E0284`.\nerror: could not compile `no_type_annotations` (bin \"no_type_annotations\") due to 1 previous error 你会看到其它数据类型的各种类型注解。","breadcrumbs":"常见编程概念 » 数据类型 » 数据类型","id":"52","title":"数据类型"},"53":{"body":"标量 ( scalar )类型代表一个单独的值。Rust 有四种基本的标量类型:整型、浮点型、布尔类型和字符类型。你可能在其他语言中见过它们。让我们深入了解它们在 Rust 中是如何工作的。 整型 整数 是一个没有小数部分的数字。我们在第二章使用过 u32 整数类型。该类型声明表明,它关联的值应该是一个占据 32 比特位的无符号整数(有符号整数类型以 i 开头而不是 u)。表格 3-1 展示了 Rust 内建的整数类型。我们可以使用其中的任一个来声明一个整数值的类型。 表格 3-1: Rust 中的整型 长度 有符号 无符号 8-bit i8 u8 16-bit i16 u16 32-bit i32 u32 64-bit i64 u64 128-bit i128 u128 arch isize usize 每一个变体都可以是有符号或无符号的,并有一个明确的大小。 有符号 和 无符号 代表数字能否为负值,换句话说,这个数字是否有可能是负数(有符号数),或者永远为正而不需要符号(无符号数)。这有点像在纸上书写数字:当需要考虑符号的时候,数字以加号或减号作为前缀;然而,可以安全地假设为正数时,加号前缀通常省略。有符号数以 补码形式(two’s complement representation) 存储。 每一个有符号的变体可以储存包含从 -(2n - 1) 到 2n - 1 - 1 在内的数字,这里 n 是变体使用的位数。所以 i8 可以储存从 -(27) 到 27 - 1 在内的数字,也就是从 -128 到 127。无符号的变体可以储存从 0 到 2n - 1 的数字,所以 u8 可以储存从 0 到 28 - 1 的数字,也就是从 0 到 255。 另外,isize 和 usize 类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的,32 位架构上它们是 32 位的。 可以使用表格 3-2 中的任何一种形式编写数字字面值。请注意可以是多种数字类型的数字字面值允许使用类型后缀,例如 57u8 来指定类型,同时也允许使用 _ 做为分隔符以方便读数,例如1_000,它的值与你指定的 1000 相同。 表格 3-2: Rust 中的整型字面值 数字字面值 例子 Decimal (十进制) 98_222 Hex (十六进制) 0xff Octal (八进制) 0o77 Binary (二进制) 0b1111_0000 Byte (单字节字符)(仅限于u8) b'A' 那么该使用哪种类型的数字呢?如果拿不定主意,Rust 的默认类型通常是个不错的起点,数字类型默认是 i32。isize 或 usize 主要作为某些集合的索引。 整型溢出 比方说有一个 u8 ,它可以存放从零到 255 的值。那么当你将其修改为 256 时会发生什么呢?这被称为 “整型溢出”(“integer overflow” ),这会导致以下两种行为之一的发生。当在 debug 模式编译时,Rust 检查这类问题并使程序 panic ,这个术语被 Rust 用来表明程序因错误而退出。第九章 “panic! 与不可恢复的错误” 部分会详细介绍 panic。 使用 --release flag 在 release 模式中构建时,Rust 不会 检测会导致 panic 的整型溢出。相反发生整型溢出时,Rust 会进行一种被称为二进制补码 wrapping( two’s complement wrapping )的操作。简而言之,比此类型能容纳最大值还大的值会回绕到最小值,值 256 变成 0,值 257 变成 1,依此类推。程序不会 panic,不过变量可能也不会是你所期望的值。依赖整型溢出 wrapping 的行为被认为是一种错误。 为了显式地处理溢出的可能性,可以使用这几类标准库提供的原始数字类型方法: 所有模式下都可以使用 wrapping_* 方法进行 wrapping,如 wrapping_add 如果 checked_* 方法出现溢出,则返回 None值 用 overflowing_* 方法返回值和一个布尔值,表示是否出现溢出 用 saturating_* 方法在值的最小值或最大值处进行饱和处理 浮点型 Rust 也有两个原生的 浮点数 ( floating-point numbers )类型,它们是带小数点的数字。Rust 的浮点数类型是 f32 和 f64,分别占 32 位和 64 位。默认类型是 f64,因为在现代 CPU 中,它与 f32 速度几乎一样,不过精度更高。所有的浮点型都是有符号的。 这是一个展示浮点数的实例: 文件名:src/main.rs fn main() { let x = 2.0; // f64 let y: f32 = 3.0; // f32\n} 浮点数采用 IEEE-754 标准表示。f32 是单精度浮点数,f64 是双精度浮点数。 数值运算 Rust 中的所有数字类型都支持基本数学运算:加法、减法、乘法、除法和取余。整数除法会向零舍入到最接近的整数。下面的代码展示了如何在 let 语句中使用它们: 文件名:src/main.rs fn main() { // addition let sum = 5 + 10; // subtraction let difference = 95.5 - 4.3; // multiplication let product = 4 * 30; // division let quotient = 56.7 / 32.2; let truncated = -5 / 3; // 结果为 -1 // remainder let remainder = 43 % 5;\n} 这些语句中的每个表达式使用了一个数学运算符并计算出了一个值,然后绑定给一个变量。 附录 B 包含 Rust 提供的所有运算符的列表。 布尔型 正如其他大部分编程语言一样,Rust 中的布尔类型有两个可能的值:true 和 false。Rust 中的布尔类型使用 bool 表示。例如: 文件名:src/main.rs fn main() { let t = true; let f: bool = false; // with explicit type annotation\n} 使用布尔值的主要场景是条件表达式,例如 if 表达式。在 “控制流”(“Control Flow”) 部分将介绍 if 表达式在 Rust 中如何工作。 字符类型 Rust 的 char 类型是语言中最原生的字母类型。下面是一些声明 char 值的例子: 文件名:src/main.rs fn main() { let c = 'z'; let z: char = 'ℤ'; // with explicit type annotation let heart_eyed_cat = '😻';\n} 注意,我们用单引号声明 char 字面量,而与之相反的是,使用双引号声明字符串字面量。Rust 的 char 类型的大小为四个字节 (four bytes),并代表了一个 Unicode 标量值(Unicode Scalar Value),这意味着它可以比 ASCII 表示更多内容。在 Rust 中,带变音符号的字母(Accented letters),中文、日文、韩文等字符,emoji(绘文字)以及零长度的空白字符都是有效的 char 值。Unicode 标量值包含从 U+0000 到 U+D7FF 和 U+E000 到 U+10FFFF 在内的值。不过,“字符” 并不是一个 Unicode 中的概念,所以人直觉上的 “字符” 可能与 Rust 中的 char 并不符合。第八章的 “使用字符串储存 UTF-8 编码的文本” 中将详细讨论这个主题。","breadcrumbs":"常见编程概念 » 数据类型 » 标量类型","id":"53","title":"标量类型"},"54":{"body":"复合类型 ( Compound types )可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array)。 元组类型 元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定:一旦声明,其长度不会增大或缩小。 我们使用包含在圆括号中的逗号分隔的值列表来创建一个元组。元组中的每一个位置都有一个类型,而且这些不同值的类型也不必是相同的。这个例子中使用了可选的类型注解: 文件名:src/main.rs fn main() { let tup: (i32, f64, u8) = (500, 6.4, 1);\n} tup 变量绑定到整个元组上,因为元组是一个单独的复合元素。为了从元组中获取单个值,可以使用模式匹配(pattern matching)来解构(destructure)元组值,像这样: 文件名:src/main.rs fn main() { let tup = (500, 6.4, 1); let (x, y, z) = tup; println!(\"The value of y is: {y}\");\n} 程序首先创建了一个元组并绑定到 tup 变量上。接着使用了 let 和一个模式将 tup 分成了三个不同的变量,x、y 和 z。这叫做 解构 ( destructuring ),因为它将一个元组拆成了三个部分。最后,程序打印出了 y 的值,也就是 6.4。 我们也可以使用点号(.)后跟值的索引来直接访问它们。例如: 文件名:src/main.rs fn main() { let x: (i32, f64, u8) = (500, 6.4, 1); let five_hundred = x.0; let six_point_four = x.1; let one = x.2;\n} 这个程序创建了一个元组,x,然后使用其各自的索引访问元组中的每个元素。跟大多数编程语言一样,元组的第一个索引值是 0。 不带任何值的元组有个特殊的名称,叫做 单元(unit) 元组。这种值以及对应的类型都写作 (),表示空值或空的返回类型。如果表达式不返回任何其他值,则会隐式返回单元值。 数组类型 另一个包含多个值的方式是 数组 ( array )。与元组不同,数组中的每个元素的类型必须相同。Rust 中的数组与一些其他语言中的数组不同,Rust 中的数组长度是固定的。 我们将数组的值写成在方括号内,用逗号分隔: 文件名:src/main.rs fn main() { let a = [1, 2, 3, 4, 5];\n} 当你想要在栈(stack)而不是在堆(heap)上为数据分配空间( 第四章 将讨论栈与堆的更多内容),或者是想要确保总是有固定数量的元素时,数组非常有用。但是数组并不如 vector 类型灵活。vector 类型是标准库提供的一个 允许 增长和缩小长度的类似数组的集合类型。当不确定是应该使用数组还是 vector 的时候,那么很可能应该使用 vector。 第八章 会详细讨论 vector。 然而,当你确定元素个数不会改变时,数组会更有用。例如,当你在一个程序中使用月份名字时,你更应趋向于使用数组而不是 vector,因为你确定只会有 12 个元素。 let months = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"]; 可以像这样编写数组的类型:在方括号中包含每个元素的类型,后跟分号,再后跟数组元素的数量。 let a: [i32; 5] = [1, 2, 3, 4, 5]; 这里,i32 是每个元素的类型。分号之后,数字 5 表明该数组包含五个元素。 你还可以通过在方括号中指定初始值加分号再加元素个数的方式来创建一个每个元素都为相同值的数组: let a = [3; 5]; 变量名为 a 的数组将包含 5 个元素,这些元素的值最初都将被设置为 3。这种写法与 let a = [3, 3, 3, 3, 3]; 效果相同,但更简洁。 访问数组元素 数组是可以在栈 (stack) 上分配的已知固定大小的单个内存块。可以使用索引来访问数组的元素,像这样: 文件名:src/main.rs fn main() { let a = [1, 2, 3, 4, 5]; let first = a[0]; let second = a[1];\n} 在这个例子中,叫做 first 的变量的值是 1,因为它是数组索引 [0] 的值。变量 second 将会是数组索引 [1] 的值 2。 无效的数组元素访问 让我们看看如果我们访问数组结尾之后的元素会发生什么呢?比如你执行以下代码,它使用类似于第 2 章中的猜数字游戏的代码从用户那里获取数组索引: 文件名:src/main.rs use std::io; fn main() { let a = [1, 2, 3, 4, 5]; println!(\"Please enter an array index.\"); let mut index = String::new(); io::stdin() .read_line(&mut index) .expect(\"Failed to read line\"); let index: usize = index .trim() .parse() .expect(\"Index entered was not a number\"); let element = a[index]; println!(\"The value of the element at index {index} is: {element}\");\n} 此代码编译成功。如果您使用 cargo run 运行此代码并输入 0、1、2、3 或 4,程序将在数组中的索引处打印出相应的值。如果你输入一个超过数组末端的数字,如 10,你会看到这样的输出: thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src/main.rs:19:19\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 程序在索引操作中使用一个无效的值时导致 运行时 错误。程序带着错误信息退出,并且没有执行最后的 println! 语句。当尝试用索引访问一个元素时,Rust 会检查指定的索引是否小于数组的长度。如果索引超出了数组长度,Rust 会 panic ,这是 Rust 术语,它用于程序因为错误而退出的情况。这种检查必须在运行时进行,特别是在这种情况下,因为编译器不可能知道用户在以后运行代码时将输入什么值。 这是第一个在实战中遇到的 Rust 安全原则的例子。在很多底层语言中,并没有进行这类检查,这样当提供了一个不正确的索引时,就会访问无效的内存。通过立即退出而不是允许内存访问并继续执行,Rust 让你避开此类错误。第九章会更详细地讨论 Rust 的错误处理机制,以及如何编写可读性强而又安全的代码,使程序既不会 panic 也不会导致非法内存访问。","breadcrumbs":"常见编程概念 » 数据类型 » 复合类型","id":"54","title":"复合类型"},"55":{"body":"ch03-03-how-functions-work.md commit d0acb2595c891de97a133d06635c50ab449dd65c 函数在 Rust 代码中非常普遍。你已经见过语言中最重要的函数之一:main 函数,它是很多程序的入口点。你也见过 fn 关键字,它用来声明新函数。 Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并使用下划线分隔单词。这是一个包含函数定义示例的程序: 文件名:src/main.rs fn main() { println!(\"Hello, world!\"); another_function();\n} fn another_function() { println!(\"Another function.\");\n} 我们在 Rust 中通过输入 fn 后面跟着函数名和一对圆括号来定义函数。大括号告诉编译器哪里是函数体的开始和结尾。 可以使用函数名后跟圆括号来调用我们定义过的任意函数。因为程序中已定义 another_function 函数,所以可以在 main 函数中调用它。注意,源码中 another_function 定义在 main 函数 之后 ;也可以定义在之前。Rust 不关心函数定义所在的位置,只要函数被调用时出现在调用之处可见的作用域内就行。 让我们新建一个叫做 functions 的二进制项目来进一步探索函数。将上面的 another_function 例子写入 src/main.rs 中并运行。你应该会看到如下输出: $ cargo run Compiling functions v0.1.0 (file:///projects/functions) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.28s Running `target/debug/functions`\nHello, world!\nAnother function. main 函数中的代码会按顺序执行。首先,打印 “Hello, world!” 信息,然后调用 another_function 函数并打印它的信息。","breadcrumbs":"常见编程概念 » 函数 » 函数","id":"55","title":"函数"},"56":{"body":"我们可以定义为拥有 参数 ( parameters )的函数,参数是特殊变量,是函数签名的一部分。当函数拥有参数(形参)时,可以为这些参数提供具体的值(实参)。技术上讲,这些具体值被称为参数( arguments ),但是在日常交流中,人们倾向于不区分使用 parameter 和 argument 来表示函数定义中的变量或调用函数时传入的具体值。 在这版 another_function 中,我们增加了一个参数: 文件名:src/main.rs fn main() { another_function(5);\n} fn another_function(x: i32) { println!(\"The value of x is: {x}\");\n} 尝试运行程序,将会输出如下内容: $ cargo run Compiling functions v0.1.0 (file:///projects/functions) Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.21s Running `target/debug/functions`\nThe value of x is: 5 another_function 的声明中有一个命名为 x 的参数。x 的类型被指定为 i32。当我们将 5 传给 another_function 时,println! 宏会把 5 放在格式字符串中包含 x 的那对花括号的位置。 在函数签名中, 必须 声明每个参数的类型。这是 Rust 设计中一个经过慎重考虑的决定:要求在函数定义中提供类型注解,意味着编译器再也不需要你在代码的其他地方注明类型来指出你的意图。而且,在知道函数需要什么类型后,编译器就能够给出更有用的错误消息。 当定义多个参数时,使用逗号分隔,像这样: 文件名:src/main.rs fn main() { print_labeled_measurement(5, 'h');\n} fn print_labeled_measurement(value: i32, unit_label: char) { println!(\"The measurement is: {value}{unit_label}\");\n} 这个例子创建了一个名为 print_labeled_measurement 的函数,它有两个参数。第一个参数名为 value,类型是 i32。第二个参数是 unit_label ,类型是 char。然后,该函数打印包含 value 和 unit_label 的文本。 尝试运行代码。使用上面的例子替换当前 functions 项目的 src/main.rs 文件,并用 cargo run 运行它: $ cargo run Compiling functions v0.1.0 (file:///projects/functions) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s Running `target/debug/functions`\nThe measurement is: 5h 因为我们使用 5 作为 value 的值,h 作为 unit_label 的值来调用函数,所以程序输出包含这些值。","breadcrumbs":"常见编程概念 » 函数 » 参数","id":"56","title":"参数"},"57":{"body":"函数体由一系列的语句和一个可选的结尾表达式构成。目前为止,我们提到的函数还不包含结尾表达式,不过你已经见过作为语句一部分的表达式。因为 Rust 是一门基于表达式(expression-based)的语言,这是一个需要理解的(不同于其他语言)重要区别。其他语言并没有这样的区别,所以让我们看看语句与表达式有什么区别以及这些区别是如何影响函数体的。 语句 ( Statements )是执行一些操作但不返回值的指令。 表达式 ( Expressions )计算并产生一个值。让我们看一些例子。 实际上,我们已经使用过语句和表达式。使用 let 关键字创建变量并绑定一个值是一个语句。在列表 3-1 中,let y = 6; 是一个语句。 文件名:src/main.rs fn main() { let y = 6;\n} 列表 3-1:包含一个语句的 main 函数定义 函数定义也是语句,上面整个例子本身就是一个语句。 语句不返回值。因此,不能把 let 语句赋值给另一个变量,比如下面的例子尝试做的,会产生一个错误: 文件名:src/main.rs fn main() { let x = (let y = 6);\n} 当运行这个程序时,会得到如下错误: $ cargo run Compiling functions v0.1.0 (file:///projects/functions)\nerror: expected expression, found `let` statement --> src/main.rs:2:14 |\n2 | let x = (let y = 6); | ^^^ | = note: only supported directly in conditions of `if` and `while` expressions warning: unnecessary parentheses around assigned value --> src/main.rs:2:13 |\n2 | let x = (let y = 6); | ^ ^ | = note: `#[warn(unused_parens)]` on by default\nhelp: remove these parentheses |\n2 - let x = (let y = 6);\n2 + let x = let y = 6; | warning: `functions` (bin \"functions\") generated 1 warning\nerror: could not compile `functions` (bin \"functions\") due to 1 previous error; 1 warning emitted let y = 6 语句并不返回值,所以没有可以绑定到 x 上的值。这与其他语言不同,例如 C 和 Ruby,它们的赋值语句会返回所赋的值。在这些语言中,可以这么写 x = y = 6,这样 x 和 y 的值都是 6;Rust 中不能这样写。 表达式会计算出一个值,并且你将编写的大部分 Rust 代码是由表达式组成的。考虑一个数学运算,比如 5 + 6,这是一个表达式并计算出值 11。表达式可以是语句的一部分:在示例 3-1 中,语句 let y = 6; 中的 6 是一个表达式,它计算出的值是 6。函数调用是一个表达式。宏调用是一个表达式。用大括号创建的一个新的块作用域也是一个表达式,例如: 文件名:src/main.rs fn main() { let y = { let x = 3; x + 1 }; println!(\"The value of y is: {y}\");\n} 这个表达式: { let x = 3; x + 1\n} 是一个代码块,它的值是 4。这个值作为 let 语句的一部分被绑定到 y 上。注意 x+1 这一行在结尾没有分号,与你见过的大部分代码行不同。表达式的结尾没有分号。如果在表达式的结尾加上分号,它就变成了语句,而语句不会返回值。在接下来探索具有返回值的函数和表达式时要谨记这一点。","breadcrumbs":"常见编程概念 » 函数 » 语句和表达式","id":"57","title":"语句和表达式"},"58":{"body":"函数可以向调用它的代码返回值。我们并不对返回值命名,但要在箭头(->)后声明它的类型。在 Rust 中,函数的返回值等同于函数体最后一个表达式的值。使用 return 关键字和指定值,可从函数中提前返回;但大部分函数隐式的返回最后的表达式。这是一个有返回值的函数的例子: 文件名:src/main.rs fn five() -> i32 { 5\n} fn main() { let x = five(); println!(\"The value of x is: {x}\");\n} 在 five 函数中没有函数调用、宏、甚至没有 let 语句 —— 只有数字 5。这在 Rust 中是一个完全有效的函数。注意,也指定了函数返回值的类型,就是 -> i32。尝试运行代码;输出应该看起来像这样: $ cargo run Compiling functions v0.1.0 (file:///projects/functions) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s Running `target/debug/functions`\nThe value of x is: 5 five 函数的返回值是 5,所以返回值类型是 i32。让我们仔细检查一下这段代码。有两个重要的部分:首先,let x = five(); 这一行表明我们使用函数的返回值初始化一个变量。因为 five 函数返回 5,这一行与如下代码相同: let x = 5; 其次,five 函数没有参数并定义了返回值类型,不过函数体只有单单一个 5 也没有分号,因为这是一个表达式,我们想要返回它的值。 让我们看看另一个例子: 文件名:src/main.rs fn main() { let x = plus_one(5); println!(\"The value of x is: {x}\");\n} fn plus_one(x: i32) -> i32 { x + 1\n} 运行代码会打印出 The value of x is: 6。但如果在包含 x + 1 的行尾加上一个分号,把它从表达式变成语句,我们将看到一个错误。 文件名:src/main.rs fn main() { let x = plus_one(5); println!(\"The value of x is: {x}\");\n} fn plus_one(x: i32) -> i32 { x + 1;\n} 运行代码会产生一个错误,如下: $ cargo run Compiling functions v0.1.0 (file:///projects/functions)\nerror[E0308]: mismatched types --> src/main.rs:7:24 |\n7 | fn plus_one(x: i32) -> i32 { | -------- ^^^ expected `i32`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression\n8 | x + 1; | - help: remove this semicolon to return this value For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `functions` (bin \"functions\") due to 1 previous error 主要的错误信息,“mismatched types”(类型不匹配),揭示了代码的核心问题。函数 plus_one 的定义说明它要返回一个 i32 类型的值,不过语句并不会返回值,使用单位类型 () 表示不返回值。因为不返回值与函数定义相矛盾,从而出现一个错误。在输出中,Rust 提供了一条信息,可能有助于纠正这个错误:它建议删除分号,这会修复这个错误。","breadcrumbs":"常见编程概念 » 函数 » 具有返回值的函数","id":"58","title":"具有返回值的函数"},"59":{"body":"ch03-04-comments.md commit d0acb2595c891de97a133d06635c50ab449dd65c 所有程序员都力求使其代码易于理解,不过有时还需要提供额外的解释。在这种情况下,程序员在源码中留下 注释 ( comments ),编译器会忽略它们,不过阅读代码的人可能觉得有用。 这是一个简单的注释: // hello, world 在 Rust 中,惯用的注释样式是以两个斜杠开始注释,并持续到本行的结尾。对于超过一行的注释,需要在每一行前都加上 //,像这样: // So we’re doing something complicated here, long enough that we need\n// multiple lines of comments to do it! Whew! Hopefully, this comment will\n// explain what’s going on. 注释也可以放在包含代码的行的末尾: 文件名:src/main.rs fn main() { let lucky_number = 7; // I’m feeling lucky today\n} 不过你更经常看到的是以这种格式使用它们,也就是位于它所解释的代码行的上面一行: 文件名:src/main.rs fn main() { // I’m feeling lucky today let lucky_number = 7;\n} Rust 还有另一种注释,称为文档注释,我们将在 14 章的 “将 crate 发布到 Crates.io” 部分讨论它。","breadcrumbs":"常见编程概念 » 注释 » 注释","id":"59","title":"注释"},"6":{"body":"数百家大小规模的公司在生产环境中使用 Rust 完成各种任务,包括命令行工具、Web 服务、DevOps 工具、嵌入式设备、音视频分析与转码、加密货币、生物信息学、搜索引擎、物联网(IOT)程序、机器学习,甚至是 Firefox 浏览器的重要部分。","breadcrumbs":"简介 » 公司","id":"6","title":"公司"},"60":{"body":"ch03-05-control-flow.md commit d0acb2595c891de97a133d06635c50ab449dd65c 根据条件是否为真来决定是否执行某些代码,以及根据条件是否为真来重复运行一段代码的能力是大部分编程语言的基本组成部分。Rust 代码中最常见的用来控制执行流的结构是 if 表达式和循环。","breadcrumbs":"常见编程概念 » 控制流 » 控制流","id":"60","title":"控制流"},"61":{"body":"if 表达式允许根据条件执行不同的代码分支。你提供一个条件并表示 “如果条件满足,运行这段代码;如果条件不满足,不运行这段代码。 在 projects 目录新建一个叫做 branches 的项目,来学习 if 表达式。在 src/main.rs 文件中,输入如下内容: 文件名:src/main.rs fn main() { let number = 3; if number < 5 { println!(\"condition was true\"); } else { println!(\"condition was false\"); }\n} 所有的 if 表达式都以 if 关键字开头,其后跟一个条件。在这个例子中,条件检查变量 number 的值是否小于 5。在条件为 true 时希望执行的代码块位于紧跟条件之后的大括号中。if 表达式中与条件关联的代码块有时被叫做 arms ,就像第二章 “比较猜测的数字和秘密数字” 部分中讨论到的 match 表达式中的分支一样。 也可以包含一个可选的 else 表达式来提供一个在条件为 false 时应当执行的代码块,这里我们就这么做了。如果不提供 else 表达式并且条件为 false 时,程序会直接忽略 if 代码块并继续执行下面的代码。 尝试运行代码,应该能看到如下输出: $ cargo run Compiling branches v0.1.0 (file:///projects/branches) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s Running `target/debug/branches`\ncondition was true 尝试改变 number 的值使条件为 false 时看看会发生什么: # fn main() { let number = 7;\n# # if number < 5 {\n# println!(\"condition was true\");\n# } else {\n# println!(\"condition was false\");\n# }\n# } 再次运行程序并查看输出: $ cargo run Compiling branches v0.1.0 (file:///projects/branches) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s Running `target/debug/branches`\ncondition was false 另外值得注意的是代码中的条件 必须 是 bool 值。如果条件不是 bool 值,我们将得到一个错误。例如,尝试运行以下代码: 文件名:src/main.rs fn main() { let number = 3; if number { println!(\"number was three\"); }\n} 这里 if 条件的值是 3,Rust 抛出了一个错误: $ cargo run Compiling branches v0.1.0 (file:///projects/branches)\nerror[E0308]: mismatched types --> src/main.rs:4:8 |\n4 | if number { | ^^^^^^ expected `bool`, found integer For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `branches` (bin \"branches\") due to 1 previous error 这个错误表明 Rust 期望一个 bool 却得到了一个整数。不像 Ruby 或 JavaScript 这样的语言,Rust 并不会尝试自动地将非布尔值转换为布尔值。必须总是显式地使用布尔值作为 if 的条件。例如,如果想要 if 代码块只在一个数字不等于 0 时执行,可以把 if 表达式修改成下面这样: 文件名:src/main.rs fn main() { let number = 3; if number != 0 { println!(\"number was something other than zero\"); }\n} 运行代码会打印出 number was something other than zero。 使用 else if 处理多重条件 可以将 else if 表达式与 if 和 else 组合来实现多重条件。例如: 文件名:src/main.rs fn main() { let number = 6; if number % 4 == 0 { println!(\"number is divisible by 4\"); } else if number % 3 == 0 { println!(\"number is divisible by 3\"); } else if number % 2 == 0 { println!(\"number is divisible by 2\"); } else { println!(\"number is not divisible by 4, 3, or 2\"); }\n} 这个程序有四个可能的执行路径。运行后应该能看到如下输出: $ cargo run Compiling branches v0.1.0 (file:///projects/branches) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s Running `target/debug/branches`\nnumber is divisible by 3 当执行这个程序时,它按顺序检查每个 if 表达式并执行第一个条件为 true 的代码块。注意即使 6 可以被 2 整除,也不会输出 number is divisible by 2,更不会输出 else 块中的 number is not divisible by 4, 3, or 2。原因是 Rust 只会执行第一个条件为 true 的代码块,并且一旦它找到一个以后,甚至都不会检查剩下的条件了。 使用过多的 else if 表达式会使代码显得杂乱无章,所以如果有多于一个 else if 表达式,最好重构代码。为此,第六章会介绍一个强大的 Rust 分支结构(branching construct),叫做 match。 在 let 语句中使用 if 因为 if 是一个表达式,我们可以在 let 语句的右侧使用它,例如在示例 3-2 中: 文件名:src/main.rs fn main() { let condition = true; let number = if condition { 5 } else { 6 }; println!(\"The value of number is: {number}\");\n} 示例 3-2:将 if 表达式的返回值赋给一个变量 number 变量将会绑定到表示 if 表达式结果的值上。运行这段代码看看会出现什么: $ cargo run Compiling branches v0.1.0 (file:///projects/branches) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s Running `target/debug/branches`\nThe value of number is: 5 记住,代码块的值是其最后一个表达式的值,而数字本身就是一个表达式。在这个例子中,整个 if 表达式的值取决于哪个代码块被执行。这意味着 if 的每个分支的可能的返回值都必须是相同类型;在示例 3-2 中,if 分支和 else 分支的结果都是 i32 整型。如果它们的类型不匹配,如下面这个例子,则会出现一个错误: 文件名:src/main.rs fn main() { let condition = true; let number = if condition { 5 } else { \"six\" }; println!(\"The value of number is: {number}\");\n} 当编译这段代码时,会得到一个错误。if 和 else 分支的值类型是不相容的,同时 Rust 也准确地指出在程序中的何处发现的这个问题: $ cargo run Compiling branches v0.1.0 (file:///projects/branches)\nerror[E0308]: `if` and `else` have incompatible types --> src/main.rs:4:44 |\n4 | let number = if condition { 5 } else { \"six\" }; | - ^^^^^ expected integer, found `&str` | | | expected because of this For more information about this error, try `rustc --explain E0308`.\nerror: could not compile `branches` (bin \"branches\") due to 1 previous error if 代码块中的表达式返回一个整数,而 else 代码块中的表达式返回一个字符串。这不可行,因为变量必须只有一个类型。Rust 需要在编译时就确切的知道 number 变量的类型,这样它就可以在编译时验证在每处使用的 number 变量的类型是有效的。如果number的类型仅在运行时确定,则 Rust 无法做到这一点;且编译器必须跟踪每一个变量的多种假设类型,那么它就会变得更加复杂,对代码的保证也会减少。","breadcrumbs":"常见编程概念 » 控制流 » if 表达式","id":"61","title":"if 表达式"},"62":{"body":"多次执行同一段代码是很常用的,Rust 为此提供了多种 循环 ( loops )。一个循环执行循环体中的代码直到结尾并紧接着回到开头继续执行。为了实验一下循环,让我们新建一个叫做 loops 的项目。 Rust 有三种循环:loop、while 和 for。我们每一个都试试。 使用 loop 重复执行代码 loop 关键字告诉 Rust 一遍又一遍地执行一段代码直到你明确要求停止。 作为一个例子,将 loops 目录中的 src/main.rs 文件修改为如下: 文件名:src/main.rs fn main() { loop { println!(\"again!\"); }\n} 当运行这个程序时,我们会看到连续的反复打印 again!,直到我们手动停止程序。大部分终端都支持一个快捷键,ctrl-c,来终止一个陷入无限循环的程序。尝试一下: $ cargo run Compiling loops v0.1.0 (file:///projects/loops) Finished dev [unoptimized + debuginfo] target(s) in 0.29s Running `target/debug/loops`\nagain!\nagain!\nagain!\nagain!\n^Cagain! 符号 ^C 代表你在这按下了ctrl-c。在 ^C 之后你可能看到也可能看不到 again! ,这取决于在接收到终止信号时代码执行到了循环的何处。 幸运的是,Rust 提供了一种从代码中跳出循环的方法。可以使用 break 关键字来告诉程序何时停止循环。回忆一下在第二章猜猜看游戏的 “猜测正确后退出” 部分使用过它来在用户猜对数字赢得游戏后退出程序。 我们在猜谜游戏中也使用了 continue。循环中的 continue 关键字告诉程序跳过这个循环迭代中的任何剩余代码,并转到下一个迭代。 从循环返回值 loop 的一个用例是重试可能会失败的操作,比如检查线程是否完成了任务。然而你可能会需要将操作的结果传递给其它的代码。如果将返回值加入你用来停止循环的 break 表达式,它会被停止的循环返回: fn main() { let mut counter = 0; let result = loop { counter += 1; if counter == 10 { break counter * 2; } }; println!(\"The result is {result}\");\n} 在循环之前,我们声明了一个名为 counter 的变量并初始化为 0。接着声明了一个名为 result 来存放循环的返回值。在循环的每一次迭代中,我们将 counter 变量加 1,接着检查计数是否等于 10。当相等时,使用 break 关键字返回值 counter * 2。循环之后,我们通过分号结束赋值给 result 的语句。最后打印出 result 的值,也就是 20。 循环标签:在多个循环之间消除歧义 如果存在嵌套循环,break 和 continue 应用于此时最内层的循环。你可以选择在一个循环上指定一个 循环标签 ( loop label ),然后将标签与 break 或 continue 一起使用,使这些关键字应用于已标记的循环而不是最内层的循环。下面是一个包含两个嵌套循环的示例 fn main() { let mut count = 0; 'counting_up: loop { println!(\"count = {count}\"); let mut remaining = 10; loop { println!(\"remaining = {remaining}\"); if remaining == 9 { break; } if count == 2 { break 'counting_up; } remaining -= 1; } count += 1; } println!(\"End count = {count}\");\n} 外层循环有一个标签 counting_up,它将从 0 数到 2。没有标签的内部循环从 10 向下数到 9。第一个没有指定标签的 break 将只退出内层循环。break 'counting_up; 语句将退出外层循环。这个代码打印: $ cargo run Compiling loops v0.1.0 (file:///projects/loops) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.58s Running `target/debug/loops`\ncount = 0\nremaining = 10\nremaining = 9\ncount = 1\nremaining = 10\nremaining = 9\ncount = 2\nremaining = 10\nEnd count = 2 while 条件循环 在程序中计算循环的条件也很常见。当条件为 true,执行循环。当条件不再为 true,调用 break 停止循环。这个循环类型可以通过组合 loop、if、else 和 break 来实现;如果你喜欢的话,现在就可以在程序中试试。 然而,这个模式太常用了,Rust 为此内置了一个语言结构,它被称为 while 循环。示例 3-3 使用了 while:程序循环三次,每次数字都减一。接着,在循环结束后,打印出另一个信息并退出。 文件名:src/main.rs fn main() { let mut number = 3; while number != 0 { println!(\"{number}!\"); number -= 1; } println!(\"LIFTOFF!!!\");\n} 示例 3-3: 当条件为真时,使用 while 循环运行代码 这种结构消除了很多使用 loop、if、else 和 break 时所必须的嵌套,这样更加清晰。当条件为 true 就执行,否则退出循环。 使用 for 遍历集合 可以使用 while 结构来遍历集合中的元素,比如数组。例如,看看示例 3-4。 文件名:src/main.rs fn main() { let a = [10, 20, 30, 40, 50]; let mut index = 0; while index < 5 { println!(\"the value is: {}\", a[index]); index += 1; }\n} 示例 3-4:使用 while 循环遍历集合中的元素 这里,代码对数组中的元素进行计数。它从索引 0 开始,并接着循环直到遇到数组的最后一个索引(这时,index < 5 不再为真)。运行这段代码会打印出数组中的每一个元素: $ cargo run Compiling loops v0.1.0 (file:///projects/loops) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.32s Running `target/debug/loops`\nthe value is: 10\nthe value is: 20\nthe value is: 30\nthe value is: 40\nthe value is: 50 数组中的所有五个元素都如期被打印出来。尽管 index 在某一时刻会到达值 5,不过循环在其尝试从数组获取第六个值(会越界)之前就停止了。 但这个过程很容易出错;如果索引长度或测试条件不正确会导致程序 panic。例如,如果将 a 数组的定义改为包含 4 个元素而忘记了更新条件 while index < 4,则代码会 panic。这也使程序更慢,因为编译器增加了运行时代码来对每次循环进行条件检查,以确定在循环的每次迭代中索引是否在数组的边界内。 作为更简洁的替代方案,可以使用 for 循环来对一个集合的每个元素执行一些代码。for 循环看起来如示例 3-5 所示: 文件名:src/main.rs fn main() { let a = [10, 20, 30, 40, 50]; for element in a { println!(\"the value is: {element}\"); }\n} 示例 3-5:使用 for 循环遍历集合中的元素 当运行这段代码时,将看到与示例 3-4 一样的输出。更为重要的是,我们增强了代码安全性,并消除了可能由于超出数组的结尾或遍历长度不够而缺少一些元素而导致的 bug。 例如,在示例 3-4 的代码中,如果你将 a 数组的定义改为有四个元素,但忘记将条件更新为 while index < 4,代码将会 panic。使用 for 循环的话,就不需要惦记着在改变数组元素个数时修改其他的代码了。 for 循环的安全性和简洁性使得它成为 Rust 中使用最多的循环结构。即使是在想要循环执行代码特定次数时,例如示例 3-3 中使用 while 循环的倒计时例子,大部分 Rustacean 也会使用 for 循环。这么做的方式是使用 Range,它是标准库提供的类型,用来生成从一个数字开始到另一个数字之前结束的所有数字的序列。 下面是一个使用 for 循环来倒计时的例子,它还使用了一个我们还未讲到的方法,rev,用来反转 range。 注意:以下代码不会踏足到数字 4,仅从一个数字开始到另一个数字之前。 文件名:src/main.rs fn main() { for number in (1..4).rev() { println!(\"{number}!\"); } println!(\"LIFTOFF!!!\");\n} 这段代码看起来更帅气不是吗?","breadcrumbs":"常见编程概念 » 控制流 » 使用循环重复执行","id":"62","title":"使用循环重复执行"},"63":{"body":"你做到了!这是一个大章节:你学习了变量、标量和复合数据类型、函数、注释、 if 表达式和循环!如果你想要实践本章讨论的概念,尝试构建如下程序: 相互转换摄氏与华氏温度。 生成第 n 个斐波那契数。 打印圣诞颂歌 “The Twelve Days of Christmas” 的歌词,并利用歌曲中的重复部分(编写循环)。 当你准备好继续的时候,让我们讨论一个其他语言中 并不 常见的概念:所有权(ownership)。","breadcrumbs":"常见编程概念 » 控制流 » 总结","id":"63","title":"总结"},"64":{"body":"ch04-00-understanding-ownership.md commit a5e0c5b2c5f9054be3b961aea2c7edfeea591de8 所有权(系统)是 Rust 最为与众不同的特性,对语言的其他部分有着深刻含义。它让 Rust 无需垃圾回收(garbage collector)即可保障内存安全,因此理解 Rust 中所有权如何工作是十分重要的。本章,我们将讲到所有权以及相关功能:借用(borrowing)、slice 以及 Rust 如何在内存中布局数据。","breadcrumbs":"认识所有权 » 认识所有权","id":"64","title":"认识所有权"},"65":{"body":"ch04-01-what-is-ownership.md commit 3d51f70c78162faaebcab0da0de2ddd333e7a8ed 所有权 ( ownership )是 Rust 用于如何管理内存的一组规则。所有程序都必须管理其运行时使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时有规律地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则,程序都不能编译。在运行时,所有权系统的任何功能都不会减慢程序。 因为所有权对很多程序员来说都是一个新概念,需要一些时间来适应。好消息是随着你对 Rust 和所有权系统的规则越来越有经验,你就越能自然地编写出安全和高效的代码。持之以恒! 当你理解了所有权,你将有一个坚实的基础来理解那些使 Rust 独特的功能。在本章中,你将通过完成一些示例来学习所有权,这些示例基于一个常用的数据结构:字符串。","breadcrumbs":"认识所有权 » 什么是所有权? » 什么是所有权?","id":"65","title":"什么是所有权?"},"66":{"body":"在很多语言中,你并不需要经常考虑到栈与堆。不过在像 Rust 这样的系统编程语言中,值是位于栈上还是堆上在更大程度上影响了语言的行为以及为何必须做出这样的抉择。我们会在本章的稍后部分描述所有权与栈和堆相关的内容,所以这里只是一个用来预热的简要解释。 栈和堆都是代码在运行时可供使用的内存,但是它们的结构不同。栈以放入值的顺序存储值并以相反顺序取出值。这也被称作 后进先出 ( last in, first out )。想象一下一叠盘子:当增加更多盘子时,把它们放在盘子堆的顶部,当需要盘子时,也从顶部拿走。不能从中间也不能从底部增加或拿走盘子!增加数据叫做 进栈 ( pushing onto the stack ),而移出数据叫做 出栈 ( popping off the stack )。栈中的所有数据都必须占用已知且固定的大小。在编译时大小未知或大小可能变化的数据,要改为存储在堆上。 堆是缺乏组织的:当向堆放入数据时,你要请求一定大小的空间。内存分配器(memory allocator)在堆的某处找到一块足够大的空位,把它标记为已使用,并返回一个表示该位置地址的 指针 ( pointer )。这个过程称作 在堆上分配内存 ( allocating on the heap ),有时简称为 “分配”(allocating)。(将数据推入栈中并不被认为是分配)。因为指向放入堆中数据的指针是已知的并且大小是固定的,你可以将该指针存储在栈上,不过当需要实际数据时,必须访问指针。想象一下去餐馆就座吃饭。当进入时,你说明有几个人,餐馆员工会找到一个够大的空桌子并领你们过去。如果有人来迟了,他们也可以通过询问来找到你们坐在哪。 入栈比在堆上分配内存要快,因为(入栈时)分配器无需为存储新数据去搜索内存空间;其位置总是在栈顶。相比之下,在堆上分配内存则需要更多的工作,这是因为分配器必须首先找到一块足够存放数据的内存空间,并接着做一些记录为下一次分配做准备。 访问堆上的数据比访问栈上的数据慢,因为必须通过指针来访问。现代处理器在内存中跳转越少就越快(缓存)。继续类比,假设有一个服务员在餐厅里处理多个桌子的点菜。在一个桌子报完所有菜后再移动到下一个桌子是最有效率的。从桌子 A 听一个菜,接着桌子 B 听一个菜,然后再桌子 A,然后再桌子 B 这样的流程会更加缓慢。出于同样原因,处理器在处理的数据彼此较近的时候(比如在栈上)比较远的时候(比如可能在堆上)能更好的工作。 当你的代码调用一个函数时,传递给函数的值(包括可能指向堆上数据的指针)和函数的局部变量被压入栈中。当函数结束时,这些值被移出栈。 跟踪哪部分代码正在使用堆上的哪些数据,最大限度的减少堆上的重复数据的数量,以及清理堆上不再使用的数据确保不会耗尽空间,这些问题正是所有权系统要处理的。一旦理解了所有权,你就不需要经常考虑栈和堆了,不过明白了所有权的主要目的就是管理堆数据,能够帮助解释为什么所有权要以这种方式工作。","breadcrumbs":"认识所有权 » 什么是所有权? » 栈(Stack)与堆(Heap)","id":"66","title":"栈(Stack)与堆(Heap)"},"67":{"body":"首先,让我们看一下所有权的规则。当我们通过举例说明时,请谨记这些规则: Rust 中的每一个值都有一个 所有者 ( owner )。 值在任一时刻有且只有一个所有者。 当所有者(变量)离开作用域,这个值将被丢弃。","breadcrumbs":"认识所有权 » 什么是所有权? » 所有权规则","id":"67","title":"所有权规则"},"68":{"body":"既然我们已经掌握了基本语法,将不会在之后的例子中包含 fn main() { 代码,所以如果你是一路跟过来的,必须手动将之后例子的代码放入一个 main 函数中。这样,例子将显得更加简明,使我们可以关注实际细节而不是样板代码。 在所有权的第一个例子中,我们看看一些变量的 作用域 ( scope )。作用域是一个项(item)在程序中有效的范围。假设有这样一个变量: let s = \"hello\"; 变量 s 绑定到了一个字符串字面值,这个字符串值是硬编码进程序代码中的。这个变量从声明的点开始直到当前 作用域 结束时都是有效的。示例 4-1 中的注释标明了变量 s 在何处是有效的。 # fn main() { { // s 在这里无效,它尚未声明 let s = \"hello\"; // 从此处起,s 是有效的 // 使用 s } // 此作用域已结束,s 不再有效\n# } 示例 4-1:一个变量和其有效的作用域 换句话说,这里有两个重要的时间点: 当 s 进入作用域 时,它就是有效的。 这一直持续到它 离开作用域 为止。 目前为止,变量是否有效与作用域的关系跟其他编程语言是类似的。现在我们在此基础上介绍 String 类型。","breadcrumbs":"认识所有权 » 什么是所有权? » 变量作用域","id":"68","title":"变量作用域"},"69":{"body":"为了演示所有权的规则,我们需要一个比第三章 “数据类型” 中讲到的都要复杂的数据类型。前面介绍的类型都是已知大小的,可以存储在栈中,并且当离开作用域时被移出栈,如果代码的另一部分需要在不同的作用域中使用相同的值,可以快速简单地复制它们来创建一个新的独立实例。不过我们需要寻找一个存储在堆上的数据来探索 Rust 是如何知道该在何时清理数据的。 我们会专注于 String 与所有权相关的部分。这些方面也同样适用于标准库提供的或你自己创建的其他复杂数据类型。在 第八章 会更深入地讲解 String。 我们已经见过字符串字面值,即被硬编码进程序里的字符串值。字符串字面值是很方便的,不过它们并不适合使用文本的每一种场景。原因之一就是它们是不可变的。另一个原因是并非所有字符串的值都能在编写代码时就知道:例如,要是想获取用户输入并存储该怎么办呢?为此,Rust 有另一种字符串类型,String。这个类型管理被分配到堆上的数据,所以能够存储在编译时未知大小的文本。可以使用 from 函数基于字符串字面值来创建 String,如下: let s = String::from(\"hello\"); 这两个冒号 :: 是运算符,允许将特定的 from 函数置于 String 类型的命名空间(namespace)下,而不需要使用类似 string_from 这样的名字。在第五章的 “方法语法”(“Method Syntax”) 部分会着重讲解这个语法,而且在第七章的 “路径用于引用模块树中的项” 中会讲到模块的命名空间。 可以 修改此类字符串: # fn main() { let mut s = String::from(\"hello\"); s.push_str(\", world!\"); // push_str() 在字符串后追加字面值 println!(\"{s}\"); // 将打印 `hello, world!`\n# } 那么这里有什么区别呢?为什么 String 可变而字面值却不行呢?区别在于两个类型对内存的处理上。","breadcrumbs":"认识所有权 » 什么是所有权? » String 类型","id":"69","title":"String 类型"},"7":{"body":"Rust 适合那些希望构建 Rust 编程语言、社区、开发工具和库的开发者。我们非常欢迎你为 Rust 语言作出贡献。","breadcrumbs":"简介 » 开源开发者","id":"7","title":"开源开发者"},"70":{"body":"就字符串字面值来说,我们在编译时就知道其内容,所以文本被直接硬编码进最终的可执行文件中。这使得字符串字面值快速且高效。不过这些特性都只得益于字符串字面值的不可变性。不幸的是,我们不能为了每一个在编译时大小未知的文本而将一块内存放入二进制文件中,并且它的大小还可能随着程序运行而改变。 对于 String 类型,为了支持一个可变,可增长的文本片段,需要在堆上分配一块在编译时未知大小的内存来存放内容。这意味着: 必须在运行时向内存分配器(memory allocator)请求内存。 需要一个当我们处理完 String 时将内存返回给分配器的方法。 第一部分由我们完成:当调用 String::from 时,它的实现 ( implementation ) 请求其所需的内存。这在编程语言中是非常通用的。 然而,第二部分实现起来就各有区别了。在有 垃圾回收 ( garbage collector , GC )的语言中,GC 记录并清除不再使用的内存,而我们并不需要关心它。在大部分没有 GC 的语言中,识别出不再使用的内存并调用代码显式释放就是我们的责任了,跟请求内存的时候一样。从历史的角度上说正确处理内存回收曾经是一个困难的编程问题。如果忘记回收了会浪费内存。如果过早回收了,将会出现无效变量。如果重复回收,这也是个 bug。我们需要精确的为一个 allocate 配对一个 free。 Rust 采取了一个不同的策略:内存在拥有它的变量离开作用域后就被自动释放。下面是示例 4-1 中作用域例子的一个使用 String 而不是字符串字面值的版本: # fn main() { { let s = String::from(\"hello\"); // 从此处起,s 是有效的 // 使用 s } // 此作用域已结束, // s 不再有效\n# } 这是一个将 String 需要的内存返回给分配器的很自然的位置:当 s 离开作用域的时候。当变量离开作用域,Rust 为我们调用一个特殊的函数。这个函数叫做 drop ,在这里 String 的作者可以放置释放内存的代码。Rust 在结尾的 } 处自动调用 drop。 注意:在 C++ 中,这种 item 在生命周期结束时释放资源的模式有时被称作 资源获取即初始化 ( Resource Acquisition Is Initialization (RAII) )。如果你使用过 RAII 模式的话应该对 Rust 的 drop 函数并不陌生。 这个模式对编写 Rust 代码的方式有着深远的影响。现在它看起来很简单,不过在更复杂的场景下代码的行为可能是不可预测的,比如当有多个变量使用在堆上分配的内存时。现在让我们探索一些这样的场景。 变量与数据交互的方式(一):移动 在 Rust 中,多个变量可以采取不同的方式与同一数据进行交互。让我们看看示例 4-2 中一个使用整型的例子。 # fn main() { let x = 5; let y = x;\n# } 示例 4-2:将变量 x 的整数值赋给 y 我们大致可以猜到这在干什么:“将 5 绑定到 x;接着生成一个值 x 的拷贝并绑定到 y”。现在有了两个变量,x 和 y,都等于 5。这也正是事实上发生了的,因为整数是有已知固定大小的简单值,所以这两个 5 被放入了栈中。 现在看看这个 String 版本: # fn main() { let s1 = String::from(\"hello\"); let s2 = s1;\n# } 这看起来与上面的代码非常类似,所以我们可能会假设它们的运行方式也是类似的:也就是说,第二行可能会生成一个 s1 的拷贝并绑定到 s2 上。不过,事实上并不完全是这样。 看看图 4-1 以了解 String 的底层会发生什么。String 由三部分组成,如图左侧所示:一个指向存放字符串内容内存的指针,一个长度,和一个容量。这一组数据存储在栈上。右侧则是堆上存放内容的内存部分。 图 4-1:将值 \"hello\" 绑定给 s1 的 String 在内存中的表现形式 长度表示 String 的内容当前使用了多少字节的内存。容量是 String 从分配器总共获取了多少字节的内存。长度与容量的区别是很重要的,不过在当前上下文中并不重要,所以现在可以忽略容量。 当我们将 s1 赋值给 s2,String 的数据被复制了,这意味着我们从栈上拷贝了它的指针、长度和容量。我们并没有复制指针指向的堆上数据。换句话说,内存中数据的表现如图 4-2 所示。 图 4-2:变量 s2 的内存表现,它有一份 s1 指针、长度和容量的拷贝 这个表现形式看起来 并不像 图 4-3 中的那样,如果 Rust 也拷贝了堆上的数据,那么内存看起来就是这样的。如果 Rust 这么做了,那么操作 s2 = s1 在堆上数据比较大的时候会对运行时性能造成非常大的影响。 图 4-3:另一个 s2 = s1 时可能的内存表现,如果 Rust 同时也拷贝了堆上的数据的话 之前我们提到过当变量离开作用域后,Rust 自动调用 drop 函数并清理变量的堆内存。不过图 4-2 展示了两个数据指针指向了同一位置。这就有了一个问题:当 s2 和 s1 离开作用域,它们都会尝试释放相同的内存。这是一个叫做 二次释放 ( double free )的错误,也是之前提到过的内存安全性 bug 之一。两次释放(相同)内存会导致内存污染,它可能会导致潜在的安全漏洞。 为了确保内存安全,在 let s2 = s1; 之后,Rust 认为 s1 不再有效,因此 Rust 不需要在 s1 离开作用域后清理任何东西。看看在 s2 被创建之后尝试使用 s1 会发生什么;这段代码不能运行: # fn main() { let s1 = String::from(\"hello\"); let s2 = s1; println!(\"{s1}, world!\");\n# } 你会得到一个类似如下的错误,因为 Rust 禁止你使用无效的引用。 $ cargo run Compiling ownership v0.1.0 (file:///projects/ownership)\nerror[E0382]: borrow of moved value: `s1` --> src/main.rs:5:15 |\n2 | let s1 = String::from(\"hello\"); | -- move occurs because `s1` has type `String`, which does not implement the `Copy` trait\n3 | let s2 = s1; | -- value moved here\n4 |\n5 | println!(\"{s1}, world!\"); | ^^^^ value borrowed here after move | = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)\nhelp: consider cloning the value if the performance cost is acceptable |\n3 | let s2 = s1.clone(); | ++++++++ For more information about this error, try `rustc --explain E0382`.\nerror: could not compile `ownership` (bin \"ownership\") due to 1 previous error 如果你在其他语言中听说过术语 浅拷贝 ( shallow copy )和 深拷贝 ( deep copy ),那么拷贝指针、长度和容量而不拷贝数据可能听起来像浅拷贝。不过因为 Rust 同时使第一个变量无效了,这个操作被称为 移动 ( move ),而不是叫做浅拷贝。上面的例子可以解读为 s1 被 移动 到了 s2 中。那么具体发生了什么,如图 4-4 所示。 图 4-4:s1 无效之后的内存表现 这样就解决了我们的问题!因为只有 s2 是有效的,当其离开作用域,它就释放自己的内存,完毕。 另外,这里还隐含了一个设计选择:Rust 永远也不会自动创建数据的 “深拷贝”。因此,任何 自动 的复制都可以被认为是对运行时性能影响较小的。 变量与数据交互的方式(二):克隆 如果我们 确实 需要深度复制 String 中堆上的数据,而不仅仅是栈上的数据,可以使用一个叫做 clone 的通用函数。第五章会讨论方法语法,不过因为方法在很多语言中是一个常见功能,所以之前你可能已经见过了。 这是一个实际使用 clone 方法的例子: # fn main() { let s1 = String::from(\"hello\"); let s2 = s1.clone(); println!(\"s1 = {s1}, s2 = {s2}\");\n# } 这段代码能正常运行,并且明确产生图 4-3 中行为,这里堆上的数据 确实 被复制了。 当出现 clone 调用时,你知道一些特定的代码被执行而且这些代码可能相当消耗资源。你很容易察觉到一些不寻常的事情正在发生。 只在栈上的数据:拷贝 这里还有一个没有提到的小窍门。这些代码使用了整型并且是有效的,它们是示例 4-2 中的一部分: # fn main() { let x = 5; let y = x; println!(\"x = {x}, y = {y}\");\n# } 但这段代码似乎与我们刚刚学到的内容相矛盾:没有调用 clone,不过 x 依然有效且没有被移动到 y 中。 原因是像整型这样的在编译时已知大小的类型被整个存储在栈上,所以拷贝其实际的值是快速的。这意味着没有理由在创建变量 y 后使 x 无效。换句话说,这里没有深浅拷贝的区别,所以这里调用 clone 并不会与通常的浅拷贝有什么不同,我们可以不用管它。 Rust 有一个叫做 Copy trait 的特殊注解,可以用在类似整型这样的存储在栈上的类型上( 第十章 将会详细讲解 trait)。如果一个类型实现了 Copy trait,那么一个旧的变量在将其赋值给其他变量后仍然可用。 Rust 不允许自身或其任何部分实现了 Drop trait 的类型使用 Copy trait。如果我们对其值离开作用域时需要特殊处理的类型使用 Copy 注解,将会出现一个编译时错误。要学习如何为你的类型添加 Copy 注解以实现该 trait,请阅读附录 C 中的 “可派生的 trait” 。 那么哪些类型实现了 Copy trait 呢?你可以查看给定类型的文档来确认,不过作为一个通用的规则,任何一组简单标量值的组合都可以实现 Copy,任何不需要分配内存或某种形式资源的类型都可以实现 Copy 。如下是一些 Copy 的类型: 所有整数类型,比如 u32。 布尔类型,bool,它的值是 true 和 false。 所有浮点数类型,比如 f64。 字符类型,char。 元组,当且仅当其包含的类型也都实现 Copy 的时候。比如,(i32, i32) 实现了 Copy,但 (i32, String) 就没有。","breadcrumbs":"认识所有权 » 什么是所有权? » 内存与分配","id":"70","title":"内存与分配"},"71":{"body":"将值传递给函数与给变量赋值的原理相似。向函数传递值可能会移动或者复制,就像赋值语句一样。示例 4-3 使用注释展示变量何时进入和离开作用域: 文件名:src/main.rs fn main() { let s = String::from(\"hello\"); // s 进入作用域 takes_ownership(s); // s 的值移动到函数里 ... // ... 所以到这里不再有效 let x = 5; // x 进入作用域 makes_copy(x); // x 应该移动函数里, // 但 i32 是 Copy 的, // 所以在后面可继续使用 x } // 这里,x 先移出了作用域,然后是 s。但因为 s 的值已被移走, // 没有特殊之处 fn takes_ownership(some_string: String) { // some_string 进入作用域 println!(\"{some_string}\");\n} // 这里,some_string 移出作用域并调用 `drop` 方法。 // 占用的内存被释放 fn makes_copy(some_integer: i32) { // some_integer 进入作用域 println!(\"{some_integer}\");\n} // 这里,some_integer 移出作用域。没有特殊之处 示例 4-3:带有所有权和作用域注释的函数 当尝试在调用 takes_ownership 后使用 s 时,Rust 会抛出一个编译时错误。这些静态检查使我们免于犯错。试试在 main 函数中添加使用 s 和 x 的代码来看看哪里能使用它们,以及所有权规则会在哪里阻止我们这么做。","breadcrumbs":"认识所有权 » 什么是所有权? » 所有权与函数","id":"71","title":"所有权与函数"},"72":{"body":"返回值也可以转移所有权。示例 4-4 展示了一个返回了某些值的示例,与示例 4-3 一样带有类似的注释。 文件名:src/main.rs fn main() { let s1 = gives_ownership(); // gives_ownership 将返回值 // 转移给 s1 let s2 = String::from(\"hello\"); // s2 进入作用域 let s3 = takes_and_gives_back(s2); // s2 被移动到 // takes_and_gives_back 中, // 它也将返回值移给 s3\n} // 这里,s3 移出作用域并被丢弃。s2 也移出作用域,但已被移走, // 所以什么也不会发生。s1 离开作用域并被丢弃 fn gives_ownership() -> String { // gives_ownership 会将 // 返回值移动给 // 调用它的函数 let some_string = String::from(\"yours\"); // some_string 进入作用域。 some_string // 返回 some_string // 并移出给调用的函数 // } // takes_and_gives_back 将传入字符串并返回该值\nfn takes_and_gives_back(a_string: String) -> String { // a_string 进入作用域 // a_string // 返回 a_string 并移出给调用的函数\n} 示例 4-4: 转移返回值的所有权 变量的所有权总是遵循相同的模式:将值赋给另一个变量时移动它。当持有堆中数据值的变量离开作用域时,其值将通过 drop 被清理掉,除非数据被移动为另一个变量所有。 虽然这样是可以的,但是在每一个函数中都获取所有权并接着返回所有权有些啰嗦。如果我们想要函数使用一个值但不获取所有权该怎么办呢?如果我们还要接着使用它的话,每次都传进去再返回来就有点烦人了,除此之外,我们也可能想返回函数体中产生的一些数据。 我们可以使用元组来返回多个值,如示例 4-5 所示。 文件名:src/main.rs fn main() { let s1 = String::from(\"hello\"); let (s2, len) = calculate_length(s1); println!(\"The length of '{s2}' is {len}.\");\n} fn calculate_length(s: String) -> (String, usize) { let length = s.len(); // len() 返回字符串的长度 (s, length)\n} 示例 4-5: 返回参数的所有权 但是这未免有些形式主义,而且这种场景应该很常见。幸运的是,Rust 对此提供了一个不用获取所有权就可以使用值的功能,叫做 引用 ( references )。","breadcrumbs":"认识所有权 » 什么是所有权? » 返回值与作用域","id":"72","title":"返回值与作用域"},"73":{"body":"ch04-02-references-and-borrowing.md commit 3d51f70c78162faaebcab0da0de2ddd333e7a8ed 示例 4-5 中的元组代码有这样一个问题:我们必须将 String 返回给调用函数,以便在调用 calculate_length 后仍能使用 String,因为 String 被移动到了 calculate_length 内。相反我们可以提供一个 String 值的引用(reference)。 引用 ( reference )像一个指针,因为它是一个地址,我们可以由此访问储存于该地址的属于其他变量的数据。 与指针不同,引用确保指向某个特定类型的有效值。 下面是如何定义并使用一个(新的)calculate_length 函数,它以一个对象的引用作为参数而不是获取值的所有权: 文件名:src/main.rs fn main() { let s1 = String::from(\"hello\"); let len = calculate_length(&s1); println!(\"The length of '{s1}' is {len}.\");\n} fn calculate_length(s: &String) -> usize { s.len()\n} 首先,注意变量声明和函数返回值中的所有元组代码都消失了。其次,注意我们传递 &s1 给 calculate_length,同时在函数定义中,我们获取 &String 而不是 String。这些 & 符号就是 引用 ,它们允许你使用值但不获取其所有权。图 4-6 展示了一张示意图。 图 4-6:&String s 指向 String s1 示意图 注意:与使用 & 引用相反的操作是 解引用 ( dereferencing ),它使用解引用运算符,*。我们将会在第八章遇到一些解引用运算符,并在第十五章详细讨论解引用。 仔细看看这个函数调用: # fn main() { let s1 = String::from(\"hello\"); let len = calculate_length(&s1);\n# # println!(\"The length of '{s1}' is {len}.\");\n# }\n# # fn calculate_length(s: &String) -> usize {\n# s.len()\n# } &s1 语法让我们创建一个 指向 值 s1 的引用,但是并不拥有它。因为并不拥有这个值,所以当引用停止使用时,它所指向的值也不会被丢弃。 同理,函数签名使用 & 来表明参数 s 的类型是一个引用。让我们增加一些解释性的注释: # fn main() {\n# let s1 = String::from(\"hello\");\n# # let len = calculate_length(&s1);\n# # println!(\"The length of '{s1}' is {len}.\");\n# }\n# fn calculate_length(s: &String) -> usize { // s 是 String 的引用 s.len()\n} // 这里,s 离开了作用域。但因为它并不拥有引用值的所有权, // 所以什么也不会发生 变量 s 有效的作用域与函数参数的作用域一样,不过当 s 停止使用时并不丢弃引用指向的数据,因为 s 并没有所有权。当函数使用引用而不是实际值作为参数,无需返回值来交还所有权,因为就不曾拥有所有权。 我们将创建一个引用的行为称为 借用 ( borrowing )。正如现实生活中,如果一个人拥有某样东西,你可以从他那里借来。当你使用完毕,必须还回去。我们并不拥有它。 如果我们尝试修改借用的变量呢?尝试示例 4-6 中的代码。剧透:这行不通! 文件名:src/main.rs fn main() { let s = String::from(\"hello\"); change(&s);\n} fn change(some_string: &String) { some_string.push_str(\", world\");\n} 示例 4-6:尝试修改借用的值 这里是错误: $ cargo run Compiling ownership v0.1.0 (file:///projects/ownership)\nerror[E0596]: cannot borrow `*some_string` as mutable, as it is behind a `&` reference --> src/main.rs:8:5 |\n8 | some_string.push_str(\", world\"); | ^^^^^^^^^^^ `some_string` is a `&` reference, so the data it refers to cannot be borrowed as mutable |\nhelp: consider changing this to be a mutable reference |\n7 | fn change(some_string: &mut String) { | +++ For more information about this error, try `rustc --explain E0596`.\nerror: could not compile `ownership` (bin \"ownership\") due to 1 previous error 正如变量默认是不可变的,引用也一样。(默认)不允许修改引用的值。","breadcrumbs":"认识所有权 » 引用与借用 » 引用与借用","id":"73","title":"引用与借用"},"74":{"body":"我们通过一个小调整就能修复示例 4-6 代码中的错误,允许我们修改一个借用的值,这就是 可变引用 ( mutable reference ): 文件名:src/main.rs fn main() { let mut s = String::from(\"hello\"); change(&mut s);\n} fn change(some_string: &mut String) { some_string.push_str(\", world\");\n} 首先,我们必须将 s 改为 mut。然后在调用 change 函数的地方创建一个可变引用 &mut s,并更新函数签名以接受一个可变引用 some_string: &mut String。这就非常清楚地表明,change 函数将改变它所借用的值。 可变引用有一个很大的限制:如果你有一个对该变量的可变引用,你就不能再创建对该变量的引用。这些尝试创建两个 s 的可变引用的代码会失败: 文件名:src/main.rs # fn main() { let mut s = String::from(\"hello\"); let r1 = &mut s; let r2 = &mut s; println!(\"{}, {}\", r1, r2);\n# } 错误如下: $ cargo run Compiling ownership v0.1.0 (file:///projects/ownership)\nerror[E0499]: cannot borrow `s` as mutable more than once at a time --> src/main.rs:5:14 |\n4 | let r1 = &mut s; | ------ first mutable borrow occurs here\n5 | let r2 = &mut s; | ^^^^^^ second mutable borrow occurs here\n6 |\n7 | println!(\"{}, {}\", r1, r2); | -- first borrow later used here For more information about this error, try `rustc --explain E0499`.\nerror: could not compile `ownership` (bin \"ownership\") due to 1 previous error 这个报错说这段代码是无效的,因为我们不能在同一时间多次将 s 作为可变变量借用。第一个可变的借入在 r1 中,并且必须持续到在 println! 中使用它,但是在那个可变引用的创建和它的使用之间,我们又尝试在 r2 中创建另一个可变引用,该引用借用与 r1 相同的数据。 这一限制以一种非常小心谨慎的方式允许可变性,防止同一时间对同一数据存在多个可变引用。新 Rustacean 们经常难以适应这一点,因为大部分语言中变量任何时候都是可变的。这个限制的好处是 Rust 可以在编译时就避免数据竞争。 数据竞争 ( data race )类似于竞态条件,它可由这三个行为造成: 两个或更多指针同时访问同一数据。 至少有一个指针被用来写入数据。 没有同步数据访问的机制。 数据竞争会导致未定义行为,难以在运行时追踪,并且难以诊断和修复;Rust 避免了这种情况的发生,因为它甚至不会编译存在数据竞争的代码! 一如既往,可以使用大括号来创建一个新的作用域,以允许拥有多个可变引用,只是不能 同时 拥有: # fn main() { let mut s = String::from(\"hello\"); { let r1 = &mut s; } // r1 在这里离开了作用域,所以我们完全可以创建一个新的引用 let r2 = &mut s;\n# } Rust 在同时使用可变与不可变引用时也采用的类似的规则。这些代码会导致一个错误: # fn main() { let mut s = String::from(\"hello\"); let r1 = &s; // 没问题 let r2 = &s; // 没问题 let r3 = &mut s; // 大问题 println!(\"{}, {}, and {}\", r1, r2, r3);\n# } 错误如下: $ cargo run Compiling ownership v0.1.0 (file:///projects/ownership)\nerror[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable --> src/main.rs:6:14 |\n4 | let r1 = &s; // no problem | -- immutable borrow occurs here\n5 | let r2 = &s; // no problem\n6 | let r3 = &mut s; // BIG PROBLEM | ^^^^^^ mutable borrow occurs here\n7 |\n8 | println!(\"{}, {}, and {}\", r1, r2, r3); | -- immutable borrow later used here For more information about this error, try `rustc --explain E0502`.\nerror: could not compile `ownership` (bin \"ownership\") due to 1 previous error 哇哦!我们 也 不能在拥有不可变引用的同时拥有可变引用。 不可变引用的用户可不希望在他们的眼皮底下值就被意外的改变了!然而,多个不可变引用是可以的,因为没有哪个只能读取数据的人有能力影响其他人读取到的数据。 注意一个引用的作用域从声明的地方开始一直持续到最后一次使用为止。例如,因为最后一次使用不可变引用(println!),发生在声明可变引用之前,所以如下代码是可以编译的: # fn main() { let mut s = String::from(\"hello\"); let r1 = &s; // 没问题 let r2 = &s; // 没问题 println!(\"{r1} and {r2}\"); // 此位置之后 r1 和 r2 不再使用 let r3 = &mut s; // 没问题 println!(\"{r3}\");\n# } 不可变引用 r1 和 r2 的作用域在 println! 最后一次使用之后结束,这也是创建可变引用 r3 的地方。它们的作用域没有重叠,所以代码是可以编译的。编译器可以在作用域结束之前判断不再使用的引用。 尽管这些错误有时使人沮丧,但请牢记这是 Rust 编译器在提前指出一个潜在的 bug(在编译时而不是在运行时)并精准显示问题所在。这样你就不必去跟踪为何数据并不是你想象中的那样。","breadcrumbs":"认识所有权 » 引用与借用 » 可变引用","id":"74","title":"可变引用"},"75":{"body":"在具有指针的语言中,很容易通过释放内存时保留指向它的指针而错误地生成一个 悬垂指针 ( dangling pointer ),所谓悬垂指针是其指向的内存可能已经被分配给其它持有者。相比之下,在 Rust 中编译器确保引用永远也不会变成悬垂状态:当你拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域。 让我们尝试创建一个悬垂引用,Rust 会通过一个编译时错误来避免: 文件名:src/main.rs fn main() { let reference_to_nothing = dangle();\n} fn dangle() -> &String { let s = String::from(\"hello\"); &s\n} 这里是错误: $ cargo run Compiling ownership v0.1.0 (file:///projects/ownership)\nerror[E0106]: missing lifetime specifier --> src/main.rs:5:16 |\n5 | fn dangle() -> &String { | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from\nhelp: consider using the `'static` lifetime, but this is uncommon unless you're returning a borrowed value from a `const` or a `static` |\n5 | fn dangle() -> &'static String { | +++++++\nhelp: instead, you are more likely to want to return an owned value |\n5 - fn dangle() -> &String {\n5 + fn dangle() -> String { | error[E0515]: cannot return reference to local variable `s` --> src/main.rs:8:5 |\n8 | &s | ^^ returns a reference to data owned by the current function Some errors have detailed explanations: E0106, E0515.\nFor more information about an error, try `rustc --explain E0106`.\nerror: could not compile `ownership` (bin \"ownership\") due to 2 previous errors 错误信息引用了一个我们还未介绍的功能:生命周期(lifetimes)。第十章会详细介绍生命周期。不过,如果你不理会生命周期部分,错误信息中确实包含了为什么这段代码有问题的关键信息: this function's return type contains a borrowed value, but there is no value\nfor it to be borrowed from 让我们仔细看看我们的 dangle 代码的每一步到底发生了什么: 文件名:src/main.rs # fn main() {\n# let reference_to_nothing = dangle();\n# }\n# fn dangle() -> &String { // dangle 返回一个字符串的引用 let s = String::from(\"hello\"); // s 是一个新字符串 &s // 返回字符串 s 的引用\n} // 这里 s 离开作用域并被丢弃。其内存被释放。 // 危险! 因为 s 是在 dangle 函数内创建的,当 dangle 的代码执行完毕后,s 将被释放。不过我们尝试返回它的引用。这意味着这个引用会指向一个无效的 String,这可不对!Rust 不会允许我们这么做。 这里的解决方法是直接返回 String: # fn main() {\n# let string = no_dangle();\n# }\n# fn no_dangle() -> String { let s = String::from(\"hello\"); s\n} 这样就没有任何错误了。所有权被移动出去,所以没有值被释放。","breadcrumbs":"认识所有权 » 引用与借用 » 悬垂引用(Dangling References)","id":"75","title":"悬垂引用(Dangling References)"},"76":{"body":"让我们概括一下之前对引用的讨论: 在任意给定时间, 要么 只能有一个可变引用, 要么 只能有多个不可变引用。 引用必须总是有效的。 接下来,我们来看看另一种不同类型的引用:slice。","breadcrumbs":"认识所有权 » 引用与借用 » 引用的规则","id":"76","title":"引用的规则"},"77":{"body":"ch04-03-slices.md commit 3d51f70c78162faaebcab0da0de2ddd333e7a8ed slice 允许你引用集合中一段连续的元素序列,而不用引用整个集合。slice 是一种引用,所以它没有所有权。 这里有一个编程小习题:编写一个函数,该函数接收一个用空格分隔单词的字符串,并返回在该字符串中找到的第一个单词。如果函数在该字符串中并未找到空格,则整个字符串就是一个单词,所以应该返回整个字符串。 让我们推敲下如何不用 slice 编写这个函数的签名,来理解 slice 能解决的问题: fn first_word(s: &String) -> ? first_word 函数有一个参数 &String。因为我们不需要所有权,所以这没有问题。不过应该返回什么呢?我们并没有一个真正获取 部分 字符串的办法。不过,我们可以返回单词结尾的索引,结尾由一个空格表示。试试如示例 4-7 中的代码。 文件名:src/main.rs fn first_word(s: &String) -> usize { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return i; } } s.len()\n}\n# # fn main() {} 示例 4-7:first_word 函数返回 String 参数的一个字节索引值 因为需要逐个元素的检查 String 中的值是否为空格,需要用 as_bytes 方法将 String 转化为字节数组。 # fn first_word(s: &String) -> usize { let bytes = s.as_bytes();\n# # for (i, &item) in bytes.iter().enumerate() {\n# if item == b' ' {\n# return i;\n# }\n# }\n# # s.len()\n# }\n# # fn main() {} 接下来,使用 iter 方法在字节数组上创建一个迭代器: # fn first_word(s: &String) -> usize {\n# let bytes = s.as_bytes();\n# for (i, &item) in bytes.iter().enumerate() {\n# if item == b' ' {\n# return i;\n# }\n# }\n# # s.len()\n# }\n# # fn main() {} 我们将在 第十三章 详细讨论迭代器。现在,只需知道 iter 方法返回集合中的每一个元素,而 enumerate 包装了 iter 的结果,将这些元素作为元组的一部分来返回。enumerate 返回的元组中,第一个元素是索引,第二个元素是集合中元素的引用。这比我们自己计算索引要方便一些。 因为 enumerate 方法返回一个元组,我们可以使用模式来解构,我们将在 第六章 中进一步讨论有关模式的问题。所以在 for 循环中,我们指定了一个模式,其中元组中的 i 是索引而元组中的 &item 是单个字节。因为我们从 .iter().enumerate() 中获取了集合元素的引用,所以模式中使用了 &。 在 for 循环中,我们通过字节的字面值语法来寻找代表空格的字节。如果找到了一个空格,返回它的位置。否则,使用 s.len() 返回字符串的长度: # fn first_word(s: &String) -> usize {\n# let bytes = s.as_bytes();\n# # for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return i; } } s.len()\n# }\n# # fn main() {} 现在有了一个找到字符串中第一个单词结尾索引的方法,不过这有一个问题。我们返回了一个独立的 usize,不过它只在 &String 的上下文中才是一个有意义的数字。换句话说,因为它是一个与 String 相分离的值,无法保证将来它仍然有效。考虑一下示例 4-8 中使用了示例 4-7 中 first_word 函数的程序。 文件名:src/main.rs # fn first_word(s: &String) -> usize {\n# let bytes = s.as_bytes();\n# # for (i, &item) in bytes.iter().enumerate() {\n# if item == b' ' {\n# return i;\n# }\n# }\n# # s.len()\n# }\n# fn main() { let mut s = String::from(\"hello world\"); let word = first_word(&s); // word 的值为 5 s.clear(); // 这清空了字符串,使其等于 \"\" // word 在此处的值仍然是 5, // 但是没有更多的字符串让我们可以有效地应用数值 5。word 的值现在完全无效!\n} 示例 4-8:存储 first_word 函数调用的返回值并接着改变 String 的内容 这个程序编译时没有任何错误,而且在调用 s.clear() 之后使用 word 也不会出错。因为 word 与 s 状态完全没有联系,所以 word 仍然包含值 5。可以尝试用值 5 来提取变量 s 的第一个单词,不过这是有 bug 的,因为在我们将 5 保存到 word 之后 s 的内容已经改变。 我们不得不时刻担心 word 的索引与 s 中的数据不再同步,这很啰嗦且易出错!如果编写这么一个 second_word 函数的话,管理索引这件事将更加容易出问题。它的签名看起来像这样: fn second_word(s: &String) -> (usize, usize) { 现在我们要跟踪一个开始索引 和 一个结尾索引,同时有了更多从数据的某个特定状态计算而来的值,但都完全没有与这个状态相关联。现在有三个飘忽不定的不相关变量需要保持同步。 幸运的是,Rust 为这个问题提供了一个解决方法:字符串 slice。","breadcrumbs":"认识所有权 » Slice 类型 » Slice 类型","id":"77","title":"Slice 类型"},"78":{"body":"字符串 slice ( string slice )是 String 中一部分值的引用,它看起来像这样: # fn main() { let s = String::from(\"hello world\"); let hello = &s[0..5]; let world = &s[6..11];\n# } 不同于整个 String 的引用,hello 是一个部分 String 的引用,由一个额外的 [0..5] 部分指定。可以使用一个由中括号中的 [starting_index..ending_index] 指定的 range 创建一个 slice,其中 starting_index 是 slice 的第一个位置,ending_index 则是 slice 最后一个位置的后一个值。在其内部,slice 的数据结构存储了 slice 的开始位置和长度,长度对应于 ending_index 减去 starting_index 的值。所以对于 let world = &s[6..11]; 的情况,world 将是一个包含指向 s 索引 6 的指针和长度值 5 的 slice。 图 4-7 展示了一个图例。 图 4-7:引用了部分 String 的字符串 slice 对于 Rust 的 .. range 语法,如果想要从索引 0 开始,可以不写两个点号之前的值。换句话说,如下两个语句是相同的: let s = String::from(\"hello\"); let slice = &s[0..2];\nlet slice = &s[..2]; 依此类推,如果 slice 包含 String 的最后一个字节,也可以舍弃尾部的数字。这意味着如下也是相同的: let s = String::from(\"hello\"); let len = s.len(); let slice = &s[3..len];\nlet slice = &s[3..]; 也可以同时舍弃这两个值来获取整个字符串的 slice。所以如下亦是相同的: let s = String::from(\"hello\"); let len = s.len(); let slice = &s[0..len];\nlet slice = &s[..]; 注意:字符串 slice range 的索引必须位于有效的 UTF-8 字符边界内,如果尝试从一个多字节字符的中间位置创建字符串 slice,则程序将会因错误而退出。出于介绍字符串 slice 的目的,本部分假设只使用 ASCII 字符集;第八章的 “使用字符串储存 UTF-8 编码的文本” 部分会更加全面的讨论 UTF-8 处理问题。 在记住所有这些知识后,让我们重写 first_word 来返回一个 slice。“字符串 slice” 的类型声明写作 &str: 文件名:src/main.rs fn first_word(s: &String) -> &str { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return &s[0..i]; } } &s[..]\n}\n# # fn main() {} 我们使用跟示例 4-7 相同的方式获取单词结尾的索引,通过寻找第一个出现的空格。当找到一个空格,我们返回一个字符串 slice,它使用字符串的开始和空格的索引作为开始和结束的索引。 现在当调用 first_word 时,会返回与底层数据关联的单个值。这个值由一个 slice 开始位置的引用和 slice 中元素的数量组成。 second_word 函数也可以改为返回一个 slice: fn second_word(s: &String) -> &str { 现在我们有了一个不易混淆且直观的 API 了,因为编译器会确保指向 String 的引用持续有效。还记得示例 4-8 程序中,那个当我们获取第一个单词结尾的索引后,接着就清除了字符串导致索引就无效的 bug 吗?那些代码在逻辑上是不正确的,但却没有显示任何直接的错误。问题会在之后尝试对空字符串使用第一个单词的索引时出现。slice 就不可能出现这种 bug 并让我们更早的知道出问题了。使用 slice 版本的 first_word 会抛出一个编译时错误: 文件名:src/main.rs # fn first_word(s: &String) -> &str {\n# let bytes = s.as_bytes();\n# # for (i, &item) in bytes.iter().enumerate() {\n# if item == b' ' {\n# return &s[0..i];\n# }\n# }\n# # &s[..]\n# }\n# fn main() { let mut s = String::from(\"hello world\"); let word = first_word(&s); s.clear(); // 错误! println!(\"the first word is: {word}\");\n} 这里是编译错误: $ cargo run Compiling ownership v0.1.0 (file:///projects/ownership)\nerror[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable --> src/main.rs:18:5 |\n16 | let word = first_word(&s); | -- immutable borrow occurs here\n17 |\n18 | s.clear(); // error! | ^^^^^^^^^ mutable borrow occurs here\n19 |\n20 | println!(\"the first word is: {word}\"); | ------ immutable borrow later used here For more information about this error, try `rustc --explain E0502`.\nerror: could not compile `ownership` (bin \"ownership\") due to 1 previous error 回忆一下借用规则,当拥有某值的不可变引用时,就不能再获取一个可变引用。因为 clear 需要清空 String,它尝试获取一个可变引用。在调用 clear 之后的 println! 使用了 word 中的引用,所以这个不可变的引用在此时必须仍然有效。Rust 不允许 clear 中的可变引用和 word 中的不可变引用同时存在,因此编译失败。Rust 不仅使得我们的 API 简单易用,也在编译时就消除了一整类的错误! 字符串字面值就是 slice 还记得我们讲到过字符串字面值被储存在二进制文件中吗?现在知道 slice 了,我们就可以正确地理解字符串字面值了: let s = \"Hello, world!\"; 这里 s 的类型是 &str:它是一个指向二进制程序特定位置的 slice。这也就是为什么字符串字面值是不可变的;&str 是一个不可变引用。 字符串 slice 作为参数 在知道了能够获取字面值和 String 的 slice 后,我们对 first_word 做了改进,这是它的签名: fn first_word(s: &String) -> &str { 而更有经验的 Rustacean 会编写出示例 4-9 中的签名,因为它使得可以对 &String 值和 &str 值使用相同的函数: fn first_word(s: &str) -> &str {\n# let bytes = s.as_bytes();\n# # for (i, &item) in bytes.iter().enumerate() {\n# if item == b' ' {\n# return &s[0..i];\n# }\n# }\n# # &s[..]\n# }\n# # fn main() {\n# let my_string = String::from(\"hello world\");\n# # // `first_word` 适用于 `String`(的 slice),部分或全部\n# let word = first_word(&my_string[0..6]);\n# let word = first_word(&my_string[..]);\n# // `first_word` 也适用于 `String` 的引用,\n# // 这等价于整个 `String` 的 slice\n# let word = first_word(&my_string);\n# # let my_string_literal = \"hello world\";\n# # // `first_word` 适用于字符串字面值,部分或全部\n# let word = first_word(&my_string_literal[0..6]);\n# let word = first_word(&my_string_literal[..]);\n# # // 因为字符串字面值已经 **是** 字符串 slice 了,\n# // 这也是适用的,无需 slice 语法!\n# let word = first_word(my_string_literal);\n# } 示例 4-9: 通过将 s 参数的类型改为字符串 slice 来改进 first_word 函数 如果有一个字符串 slice,可以直接传递它。如果有一个 String,则可以传递整个 String 的 slice 或对 String 的引用。这种灵活性利用了 deref coercions 的优势,这个特性我们将在 “函数和方法的隐式 Deref 强制转换” 章节中介绍。定义一个获取字符串 slice 而不是 String 引用的函数使得我们的 API 更加通用并且不会丢失任何功能: 文件名:src/main.rs # fn first_word(s: &str) -> &str {\n# let bytes = s.as_bytes();\n# # for (i, &item) in bytes.iter().enumerate() {\n# if item == b' ' {\n# return &s[0..i];\n# }\n# }\n# # &s[..]\n# }\n# fn main() { let my_string = String::from(\"hello world\"); // `first_word` 适用于 `String`(的 slice),部分或全部 let word = first_word(&my_string[0..6]); let word = first_word(&my_string[..]); // `first_word` 也适用于 `String` 的引用, // 这等价于整个 `String` 的 slice let word = first_word(&my_string); let my_string_literal = \"hello world\"; // `first_word` 适用于字符串字面值,部分或全部 let word = first_word(&my_string_literal[0..6]); let word = first_word(&my_string_literal[..]); // 因为字符串字面值已经 **是** 字符串 slice 了, // 这也是适用的,无需 slice 语法! let word = first_word(my_string_literal);\n}","breadcrumbs":"认识所有权 » Slice 类型 » 字符串 slice","id":"78","title":"字符串 slice"},"79":{"body":"字符串 slice,正如你想象的那样,是针对字符串的。不过也有更通用的 slice 类型。考虑一下这个数组: let a = [1, 2, 3, 4, 5]; 就跟我们想要获取字符串的一部分那样,我们也会想要引用数组的一部分。我们可以这样做: let a = [1, 2, 3, 4, 5]; let slice = &a[1..3]; assert_eq!(slice, &[2, 3]); 这个 slice 的类型是 &[i32]。它跟字符串 slice 的工作方式一样,通过存储第一个集合元素的引用和一个集合总长度。你可以对其他所有集合使用这类 slice。第八章讲到 vector 时会详细讨论这些集合。","breadcrumbs":"认识所有权 » Slice 类型 » 其他类型的 slice","id":"79","title":"其他类型的 slice"},"8":{"body":"Rust 适合那些渴望在编程语言中寻求速度与稳定性的开发者。对于速度来说,既是指 Rust 可以运行的多快,也是指编写 Rust 程序的速度。Rust 编译器的检查确保了增加功能和重构代码时的稳定性,这与那些缺乏这些检查的语言中脆弱的祖传代码形成了鲜明对比,开发者往往不敢去修改这些代码。通过追求零成本抽象(zero-cost abstractions)—— 将高级语言特性编译成底层代码,并且与手写的代码运行速度同样快。Rust 努力确保代码又安全又快速。 这里提到的只是几个较大的受益群体,Rust 语言也希望能支持更多其他用户。总的来说,Rust 最重要的目标是消除数十年来程序员习以为常的取舍,让安全和高效、速度和易读易用 可以兼得 。试试看 Rust,说不定它的选择就适合你。","breadcrumbs":"简介 » 重视速度和稳定性的开发者","id":"8","title":"重视速度和稳定性的开发者"},"80":{"body":"所有权、借用和 slice 这些概念让 Rust 程序在编译时确保内存安全。Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码。 所有权系统影响了 Rust 中很多其他部分的工作方式,所以我们还会继续讲到这些概念,这将贯穿本书的余下内容。让我们开始第五章,来看看如何将多份数据组合进一个 struct 中。","breadcrumbs":"认识所有权 » Slice 类型 » 总结","id":"80","title":"总结"},"81":{"body":"ch05-00-structs.md commit 8612c4a5801b61f8d2e952f8bbbb444692ff1ec2 struct ,或者 structure ,是一个自定义数据类型,允许你包装和命名多个相关的值,从而形成一个有意义的组合。如果你熟悉一门面向对象语言, struct 就像对象中的数据属性。在本章中,我们会对元组和结构体进行比较和对比。 我们还将演示如何定义和实例化结构体,并讨论如何定义关联函数,特别是被称为 方法 的那种关联函数,以指定与结构体类型相关的行为。你可以在程序中基于结构体和枚举( enum )(在第六章介绍)创建新类型,以充分利用 Rust 的编译时类型检查。","breadcrumbs":"使用结构体组织相关联的数据 » 使用结构体组织相关联的数据","id":"81","title":"使用结构体组织相关联的数据"},"82":{"body":"ch05-01-defining-structs.md commit a371f82b0916cf21de2d56bd386ca5d72f7699b0 结构体和我们在 “元组类型” 部分论过的元组类似,它们都包含多个相关的值。和元组一样,结构体的每一部分可以是不同类型。但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来指定或访问实例中的值。 定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段 ( field )。例如,示例 5-1 展示了一个存储用户账号信息的结构体: 文件名:src/main.rs struct User { active: bool, username: String, email: String, sign_in_count: u64,\n}\n# # fn main() {} 示例 5-1:User 结构体定义 一旦定义了结构体后,为了使用它,通过为每个字段指定具体值来创建这个结构体的 实例 。创建一个实例需要以结构体的名字开头,接着在大括号中使用 key: value 键 - 值对的形式提供字段,其中 key 是字段的名字,value 是需要存储在字段中的数据值。实例中字段的顺序不需要和它们在结构体中声明的顺序一致。换句话说,结构体的定义就像一个类型的通用模板,而实例则会在这个模板中放入特定数据来创建这个类型的值。例如,可以像示例 5-2 这样来声明一个特定的用户: 文件名:src/main.rs # struct User {\n# active: bool,\n# username: String,\n# email: String,\n# sign_in_count: u64,\n# }\n# fn main() { let user1 = User { active: true, username: String::from(\"someusername123\"), email: String::from(\"someone@example.com\"), sign_in_count: 1, };\n} 示例 5-2:创建 User 结构体的实例 为了从结构体中获取某个特定的值,可以使用点号。举个例子,想要用户的邮箱地址,可以用 user1.email。如果结构体的实例是可变的,我们可以使用点号并为对应的字段赋值。示例 5-3 展示了如何改变一个可变的 User 实例中 email 字段的值: 文件名:src/main.rs # struct User {\n# active: bool,\n# username: String,\n# email: String,\n# sign_in_count: u64,\n# }\n# fn main() { let mut user1 = User { active: true, username: String::from(\"someusername123\"), email: String::from(\"someone@example.com\"), sign_in_count: 1, }; user1.email = String::from(\"anotheremail@example.com\");\n} 示例 5-3:改变 User 实例 email 字段的值 注意整个实例必须是可变的;Rust 并不允许只将某个字段标记为可变。另外需要注意同其他任何表达式一样,我们可以在函数体的最后一个表达式中构造一个结构体的新实例,来隐式地返回这个实例。 示例 5-4 显示了一个 build_user 函数,它返回一个带有给定的 email 和用户名的 User 结构体实例。active 字段的值为 true,并且 sign_in_count 的值为 1。 文件名:src/main.rs # struct User {\n# active: bool,\n# username: String,\n# email: String,\n# sign_in_count: u64,\n# }\n# fn build_user(email: String, username: String) -> User { User { active: true, username: username, email: email, sign_in_count: 1, }\n}\n# # fn main() {\n# let user1 = build_user(\n# String::from(\"someone@example.com\"),\n# String::from(\"someusername123\"),\n# );\n# } 示例 5-4:build_user 函数获取 email 和用户名并返回 User 实例 为函数参数起与结构体字段相同的名字是可以理解的,但是不得不重复 email 和 username 字段名称与变量有些啰嗦。如果结构体有更多字段,重复每个名称就更加烦人了。幸运的是,有一个方便的简写语法!","breadcrumbs":"使用结构体组织相关联的数据 » 结构体的定义和实例化 » 结构体的定义和实例化","id":"82","title":"结构体的定义和实例化"},"83":{"body":"因为示例 5-4 中的参数名与字段名都完全相同,我们可以使用 字段初始化简写语法 ( field init shorthand )来重写 build_user,这样其行为与之前完全相同,不过无需重复 username 和 email 了,如示例 5-5 所示。 文件名:src/main.rs # struct User {\n# active: bool,\n# username: String,\n# email: String,\n# sign_in_count: u64,\n# }\n# fn build_user(email: String, username: String) -> User { User { active: true, username, email, sign_in_count: 1, }\n}\n# # fn main() {\n# let user1 = build_user(\n# String::from(\"someone@example.com\"),\n# String::from(\"someusername123\"),\n# );\n# } 示例 5-5:build_user 函数使用了字段初始化简写语法,因为 username 和 email 参数与结构体字段同名 这里我们创建了一个新的 User 结构体实例,它有一个叫做 email 的字段。我们想要将 email 字段的值设置为 build_user 函数 email 参数的值。因为 email 字段与 email 参数有着相同的名称,则只需编写 email 而不是 email: email。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体的定义和实例化 » 使用字段初始化简写语法","id":"83","title":"使用字段初始化简写语法"},"84":{"body":"使用旧实例的大部分值但改变其部分值来创建一个新的结构体实例通常是很有用的。这可以通过 结构体更新语法 ( struct update syntax )实现。 首先,示例 5-6 展示了不使用更新语法时,如何在 user2 中创建一个新 User 实例。我们为 email 设置了新的值,其他值则使用了实例 5-2 中创建的 user1 中的同名值: 文件名:src/main.rs # struct User {\n# active: bool,\n# username: String,\n# email: String,\n# sign_in_count: u64,\n# }\n# fn main() { // --snip--\n# # let user1 = User {\n# email: String::from(\"someone@example.com\"),\n# username: String::from(\"someusername123\"),\n# active: true,\n# sign_in_count: 1,\n# }; let user2 = User { active: user1.active, username: user1.username, email: String::from(\"another@example.com\"), sign_in_count: user1.sign_in_count, };\n} 示例 5-6:使用 user1 中的一个值创建一个新的 User 实例 使用结构体更新语法,我们可以通过更少的代码来达到相同的效果,如示例 5-7 所示。.. 语法指定了剩余未显式设置值的字段应有与给定实例对应字段相同的值。 文件名:src/main.rs # struct User {\n# active: bool,\n# username: String,\n# email: String,\n# sign_in_count: u64,\n# }\n# fn main() { // --snip--\n# # let user1 = User {\n# email: String::from(\"someone@example.com\"),\n# username: String::from(\"someusername123\"),\n# active: true,\n# sign_in_count: 1,\n# }; let user2 = User { email: String::from(\"another@example.com\"), ..user1 };\n} 示例 5-7:使用结构体更新语法为一个 User 实例设置一个新的 email 值,不过其余值来自 user1 变量中实例的字段 示例 5-7 中的代码也在 user2 中创建了一个新实例,但该实例中 email 字段的值与 user1 不同,而 username、 active 和 sign_in_count 字段的值与 user1 相同。..user1 必须放在最后,以指定其余的字段应从 user1 的相应字段中获取其值,但我们可以选择以任何顺序为任意字段指定值,而不用考虑结构体定义中字段的顺序。 请注意,结构更新语法就像带有 = 的赋值,因为它移动了数据,就像我们在 “变量与数据交互的方式(一):移动” 部分讲到的一样。在这个例子中,总体上说我们在创建 user2 后就不能再使用 user1 了,因为 user1 的 username 字段中的 String 被移到 user2 中。如果我们给 user2 的 email 和 username 都赋予新的 String 值,从而只使用 user1 的 active 和 sign_in_count 值,那么 user1 在创建 user2 后仍然有效。active 和 sign_in_count 的类型是实现 Copy trait 的类型,所以我们在 “变量与数据交互的方式(二):克隆” 部分讨论的行为同样适用。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体的定义和实例化 » 使用结构体更新语法从其他实例创建实例","id":"84","title":"使用结构体更新语法从其他实例创建实例"},"85":{"body":"也可以定义与元组(在第三章讨论过)类似的结构体,称为 元组结构体 ( tuple structs )。元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型。当你想给整个元组取一个名字,并使元组成为与其他元组不同的类型时,元组结构体是很有用的,这时像常规结构体那样为每个字段命名就显得多余和形式化了。 要定义元组结构体,以 struct 关键字和结构体名开头并后跟元组中的类型。例如,下面是两个分别叫做 Color 和 Point 元组结构体的定义和用法: 文件名:src/main.rs struct Color(i32, i32, i32);\nstruct Point(i32, i32, i32); fn main() { let black = Color(0, 0, 0); let origin = Point(0, 0, 0);\n} 注意 black 和 origin 值的类型不同,因为它们是不同的元组结构体的实例。你定义的每一个结构体有其自己的类型,即使结构体中的字段可能有着相同的类型。例如,一个获取 Color 类型参数的函数不能接受 Point 作为参数,即便这两个类型都由三个 i32 值组成。在其他方面,元组结构体实例类似于元组,你可以将它们解构为单独的部分,也可以使用 . 后跟索引来访问单独的值,等等。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体的定义和实例化 » 使用没有命名字段的元组结构体来创建不同的类型","id":"85","title":"使用没有命名字段的元组结构体来创建不同的类型"},"86":{"body":"我们也可以定义一个没有任何字段的结构体!它们被称为 类单元结构体 ( unit-like structs )因为它们类似于 (),即 “元组类型” 一节中提到的 unit 类型。类单元结构体常常在你想要在某个类型上实现 trait 但不需要在类型中存储数据的时候发挥作用。我们将在第十章介绍 trait。下面是一个声明和实例化一个名为 AlwaysEqual 的 unit 结构的例子。 文件名:src/main.rs struct AlwaysEqual; fn main() { let subject = AlwaysEqual;\n} 为了定义 AlwaysEqual,我们使用 struct 关键字,接着是我们想要的名称,然后是一个分号。不需要花括号或圆括号!然后,我们可以以类似的方式在 subject 变量中创建 AlwaysEqual 的实例:只需使用我们定义的名称,无需任何花括号或圆括号。设想我们稍后将为这个类型实现某种行为,使得每个 AlwaysEqual 的实例始终等于任何其它类型的实例,也许是为了获得一个已知的结果以便进行测试。我们不需要任何数据来实现这种行为!在第十章中,你会看到如何定义特征并在任何类型上实现它们,包括类单元结构体。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体的定义和实例化 » 没有任何字段的类单元结构体","id":"86","title":"没有任何字段的类单元结构体"},"87":{"body":"在示例 5-1 中的 User 结构体的定义中,我们使用了自身拥有所有权的 String 类型而不是 &str 字符串 slice 类型。这是一个有意而为之的选择,因为我们想要这个结构体拥有它所有的数据,为此只要整个结构体是有效的话其数据也是有效的。 可以使结构体存储被其他对象拥有的数据的引用,不过这么做的话需要用上 生命周期 ( lifetimes ),这是一个第十章会讨论的 Rust 功能。生命周期确保结构体引用的数据有效性跟结构体本身保持一致。如果你尝试在结构体中存储一个引用而不指定生命周期将是无效的,比如这样: 文件名:src/main.rs struct User { active: bool, username: &str, email: &str, sign_in_count: u64,\n} fn main() { let user1 = User { active: true, username: \"someusername123\", email: \"someone@example.com\", sign_in_count: 1, };\n} 编译器会抱怨它需要生命周期标识符: $ cargo run Compiling structs v0.1.0 (file:///projects/structs)\nerror[E0106]: missing lifetime specifier --> src/main.rs:3:15 |\n3 | username: &str, | ^ expected named lifetime parameter |\nhelp: consider introducing a named lifetime parameter |\n1 ~ struct User<'a> {\n2 | active: bool,\n3 ~ username: &'a str, | error[E0106]: missing lifetime specifier --> src/main.rs:4:12 |\n4 | email: &str, | ^ expected named lifetime parameter |\nhelp: consider introducing a named lifetime parameter |\n1 ~ struct User<'a> {\n2 | active: bool,\n3 | username: &str,\n4 ~ email: &'a str, | For more information about this error, try `rustc --explain E0106`.\nerror: could not compile `structs` due to 2 previous errors 第十章会讲到如何修复这个问题以便在结构体中存储引用,不过现在,我们会使用像 String 这类拥有所有权的类型来替代 &str 这样的引用以修正这个错误。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体的定义和实例化 » 结构体数据的所有权","id":"87","title":"结构体数据的所有权"},"88":{"body":"ch05-02-example-structs.md commit 8612c4a5801b61f8d2e952f8bbbb444692ff1ec2 为了理解何时会需要使用结构体,让我们编写一个计算长方形面积的程序。我们会从单独的变量开始,接着重构程序直到使用结构体替代它们为止。 使用 Cargo 新建一个叫做 rectangles 的二进制程序,它获取以像素为单位的长方形的宽度和高度,并计算出长方形的面积。示例 5-8 显示了位于项目的 src/main.rs 中的小程序,它刚刚好实现此功能: 文件名:src/main.rs fn main() { let width1 = 30; let height1 = 50; println!( \"The area of the rectangle is {} square pixels.\", area(width1, height1) );\n} fn area(width: u32, height: u32) -> u32 { width * height\n} 示例 5-8:通过分别指定长方形的宽和高的变量来计算长方形面积 现在使用 cargo run 运行程序: $ cargo run Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.42s Running `target/debug/rectangles`\nThe area of the rectangle is 1500 square pixels. 这个示例代码在调用 area 函数时传入每个维度,虽然可以正确计算出长方形的面积,但我们仍然可以修改这段代码来使它的意义更加明确,并且增加可读性。 这些代码的问题突显在 area 的签名上: # fn main() {\n# let width1 = 30;\n# let height1 = 50;\n# # println!(\n# \"The area of the rectangle is {} square pixels.\",\n# area(width1, height1)\n# );\n# }\n# fn area(width: u32, height: u32) -> u32 {\n# width * height\n# } 函数 area 本应该计算一个长方形的面积,不过函数却有两个参数。这两个参数是相关联的,不过程序本身却没有表现出这一点。将长度和宽度组合在一起将更易懂也更易处理。第三章的 “元组类型” 部分已经讨论过了一种可行的方法:元组。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体示例程序 » 结构体示例程序","id":"88","title":"结构体示例程序"},"89":{"body":"示例 5-9 展示了使用元组的另一个程序版本。 文件名:src/main.rs fn main() { let rect1 = (30, 50); println!( \"The area of the rectangle is {} square pixels.\", area(rect1) );\n} fn area(dimensions: (u32, u32)) -> u32 { dimensions.0 * dimensions.1\n} 示例 5-9:使用元组来指定长方形的宽高 在某种程度上说,这个程序更好一点了。元组帮助我们增加了一些结构性,并且现在只需传一个参数。不过在另一方面,这个版本却有一点不明确了:元组并没有给出元素的名称,所以计算变得更费解了,因为不得不使用索引来获取元组的每一部分: 在计算面积时将宽和高弄混倒无关紧要,不过当在屏幕上绘制长方形时就有问题了!我们必须牢记 width 的元组索引是 0,height 的元组索引是 1。如果其他人要使用这些代码,他们必须要搞清楚这一点,并也要牢记于心。很容易忘记或者混淆这些值而造成错误,因为我们没有在代码中传达数据的意图。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体示例程序 » 使用元组重构","id":"89","title":"使用元组重构"},"9":{"body":"本书假设你已经有其他编程语言的经验,任何语言均可,我们尽可能让各种语言背景的人都能读懂。本书的重点不是程序设计 本身 ,也不是程序设计思维。如果你完全没学过编程,建议你先阅读专门介绍程序设计的书籍。","breadcrumbs":"简介 » 本书适合哪些人","id":"9","title":"本书适合哪些人"},"90":{"body":"我们使用结构体为数据命名来为其赋予意义。我们可以将我们正在使用的元组转换成一个有整体名称而且每个部分也有对应名字的结构体,如示例 5-10 所示: 文件名:src/main.rs struct Rectangle { width: u32, height: u32,\n} fn main() { let rect1 = Rectangle { width: 30, height: 50, }; println!( \"The area of the rectangle is {} square pixels.\", area(&rect1) );\n} fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height\n} 示例 5-10:定义 Rectangle 结构体 这里我们定义了一个结构体并称其为 Rectangle。在大括号中定义了字段 width 和 height,类型都是 u32。接着在 main 中,我们创建了一个具体的 Rectangle 实例,它的宽是 30,高是 50。 函数 area 现在被定义为接收一个名叫 rectangle 的参数,其类型是一个结构体 Rectangle 实例的不可变借用。第四章讲到过,我们希望借用结构体而不是获取它的所有权,这样 main 函数就可以保持 rect1 的所有权并继续使用它,所以这就是为什么在函数签名和调用的地方会有 &。 area 函数访问 Rectangle 实例的 width 和 height 字段(注意,访问对结构体的引用的字段不会移动字段的所有权,这就是为什么你经常看到对结构体的引用)。area 的函数签名现在明确的阐述了我们的意图:使用 Rectangle 的 width 和 height 字段,计算 Rectangle 的面积。这表明宽高是相互联系的,并为这些值提供了描述性的名称而不是使用元组的索引值 0 和 1 。结构体胜在更清晰明了。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体示例程序 » 使用结构体重构:赋予更多意义","id":"90","title":"使用结构体重构:赋予更多意义"},"91":{"body":"在调试程序时打印出 Rectangle 实例来查看其所有字段的值非常有用。示例 5-11 像前面章节那样尝试使用 println! 宏 。但这并不行。 文件名:src/main.rs struct Rectangle { width: u32, height: u32,\n} fn main() { let rect1 = Rectangle { width: 30, height: 50, }; println!(\"rect1 is {}\", rect1);\n} 示例 5-11:尝试打印出 Rectangle 实例 当我们运行这个代码时,会出现带有如下核心信息的错误: error[E0277]: `Rectangle` doesn't implement `std::fmt::Display` println! 宏能处理很多类型的格式,不过,{} 默认告诉 println! 使用被称为 Display 的格式:意在提供给直接终端用户查看的输出。目前为止见过的基本类型都默认实现了 Display,因为它就是向用户展示 1 或其他任何基本类型的唯一方式。不过对于结构体,println! 应该用来输出的格式是不明确的,因为这有更多显示的可能性:是否需要逗号?需要打印出大括号吗?所有字段都应该显示吗?由于这种不确定性,Rust 不会尝试猜测我们的意图,所以结构体并没有提供一个 Display 实现来使用 println! 与 {} 占位符。 但是如果我们继续阅读错误,将会发现这个有帮助的信息: = help: the trait `std::fmt::Display` is not implemented for `Rectangle` = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead 让我们来试试!现在 println! 宏调用看起来像 println!(\"rect1 is {:?}\", rect1); 这样。在 {} 中加入 :? 指示符告诉 println! 我们想要使用叫做 Debug 的输出格式。Debug 是一个 trait,它允许我们以一种对开发者有帮助的方式打印结构体,以便当我们调试代码时能看到它的值。 这样调整后再次运行程序。见鬼了!仍然能看到一个错误: error[E0277]: `Rectangle` doesn't implement `Debug` 不过编译器又一次给出了一个有帮助的信息: = help: the trait `Debug` is not implemented for `Rectangle` = note: add `#[derive(Debug)]` to `Rectangle` or manually `impl Debug for Rectangle` Rust 确实 包含了打印出调试信息的功能,不过我们必须为结构体显式选择这个功能。为此,在结构体定义之前加上外部属性 #[derive(Debug)],如示例 5-12 所示: 文件名:src/main.rs #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} fn main() { let rect1 = Rectangle { width: 30, height: 50, }; println!(\"rect1 is {rect1:?}\");\n} 示例 5-12:增加属性来派生 Debug trait,并使用调试格式打印 Rectangle 实例 现在我们再运行这个程序时,就不会有任何错误,并会出现如下输出: $ cargo run Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s Running `target/debug/rectangles`\nrect1 is Rectangle { width: 30, height: 50 } 好极了!这并不是最漂亮的输出,不过它显示这个实例的所有字段,毫无疑问这对调试有帮助。当我们有一个更大的结构体时,能有更易读一点的输出就好了,为此可以使用 {:#?} 替换 println! 字符串中的 {:?}。在这个例子中使用 {:#?} 风格将会输出如下: $ cargo run Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.48s Running `target/debug/rectangles`\nrect1 is Rectangle { width: 30, height: 50,\n} 另一种使用 Debug 格式打印数值的方法是使用 dbg! 宏 。dbg! 宏接收一个表达式的所有权(与 println! 宏相反,后者接收的是引用),打印出代码中调用 dbg! 宏时所在的文件和行号,以及该表达式的结果值,并返回该值的所有权。 注意:调用 dbg! 宏会打印到标准错误控制台流(stderr),与 println! 不同,后者会打印到标准输出控制台流(stdout)。我们将在 第十二章 “将错误信息写入标准错误而不是标准输出” 一节 中更多地讨论 stderr 和 stdout。 下面是一个例子,我们对分配给 width 字段的值以及 rect1 中整个结构的值感兴趣。 #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} fn main() { let scale = 2; let rect1 = Rectangle { width: dbg!(30 * scale), height: 50, }; dbg!(&rect1);\n} 我们可以把 dbg! 放在表达式 30 * scale 周围,因为 dbg! 返回表达式的值的所有权,所以 width 字段将获得相同的值,就像我们在那里没有 dbg! 调用一样。我们不希望 dbg! 拥有 rect1 的所有权,所以我们在下一次调用 dbg! 时传递一个引用。下面是这个例子的输出结果: $ cargo run Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.61s Running `target/debug/rectangles`\n[src/main.rs:10:16] 30 * scale = 60\n[src/main.rs:14:5] &rect1 = Rectangle { width: 60, height: 50,\n} 我们可以看到第一点输出来自 src/main.rs 第 10 行,我们正在调试表达式 30 * scale,其结果值是 60(为整数实现的 Debug 格式化是只打印它们的值)。在 src/main.rs 第 14 行 的 dbg! 调用输出 &rect1 的值,即 Rectangle 结构。这个输出使用了更为易读的 Debug 格式。当你试图弄清楚你的代码在做什么时,dbg! 宏可能真的很有帮助! 除了 Debug trait,Rust 还为我们提供了很多可以通过 derive 属性来使用的 trait,它们可以为我们的自定义类型增加实用的行为。 附录 C 中列出了这些 trait 和行为。第十章会介绍如何通过自定义行为来实现这些 trait,同时还有如何创建你自己的 trait。除了 derive 之外,还有很多属性;更多信息请参见 Rust Reference 的 Attributes 部分。 我们的 area 函数是非常特殊的,它只计算长方形的面积。如果这个行为与 Rectangle 结构体再结合得更紧密一些就更好了,因为它不能用于其他类型。现在让我们看看如何继续重构这些代码,来将 area 函数协调进 Rectangle 类型定义的 area 方法 中。","breadcrumbs":"使用结构体组织相关联的数据 » 结构体示例程序 » 通过派生 trait 增加实用功能","id":"91","title":"通过派生 trait 增加实用功能"},"92":{"body":"ch05-03-method-syntax.md commit d339373a838fd312a8a9bcc9487e1ffbc9e1582f 方法 (method)与函数类似:它们使用 fn 关键字和名称声明,可以拥有参数和返回值,同时包含在某处调用该方法时会执行的代码。不过方法与函数是不同的,因为它们在结构体的上下文中被定义(或者是枚举或 trait 对象的上下文,将分别在 第六章 和 第十八章 讲解),并且它们第一个参数总是 self,它代表调用该方法的结构体实例。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » 方法语法","id":"92","title":"方法语法"},"93":{"body":"让我们把前面实现的获取一个 Rectangle 实例作为参数的 area 函数,改写成一个定义于 Rectangle 结构体上的 area 方法,如示例 5-13 所示: 文件名:src/main.rs #[derive(Debug)]\nstruct Rectangle { width: u32, height: u32,\n} impl Rectangle { fn area(&self) -> u32 { self.width * self.height }\n} fn main() { let rect1 = Rectangle { width: 30, height: 50, }; println!( \"The area of the rectangle is {} square pixels.\", rect1.area() );\n} 示例 5-13:在 Rectangle 结构体上定义 area 方法 为了使函数定义于 Rectangle 的上下文中,我们开始了一个 impl 块(impl 是 implementation 的缩写),这个 impl 块中的所有内容都将与 Rectangle 类型相关联。接着将 area 函数移动到 impl 大括号中,并将签名中的第一个(在这里也是唯一一个)参数和函数体中其他地方的对应参数改成 self。然后在 main 中将我们先前调用 area 方法并传递 rect1 作为参数的地方,改成使用 方法语法 ( method syntax )在 Rectangle 实例上调用 area 方法。方法语法获取一个实例并加上一个点号,后跟方法名、圆括号以及任何参数。 在 area 的签名中,使用 &self 来替代 rectangle: &Rectangle,&self 实际上是 self: &Self 的缩写。在一个 impl 块中,Self 类型是 impl 块的类型的别名。方法的第一个参数必须有一个名为 self 的Self 类型的参数,所以 Rust 让你在第一个参数位置上只用 self 这个名字来简化。注意,我们仍然需要在 self 前面使用 & 来表示这个方法借用了 Self 实例,就像我们在 rectangle: &Rectangle 中做的那样。方法可以选择获得 self 的所有权,或者像我们这里一样不可变地借用 self,或者可变地借用 self,就跟其他参数一样。 这里选择 &self 的理由跟在函数版本中使用 &Rectangle 是相同的:我们并不想获取所有权,只希望能够读取结构体中的数据,而不是写入。如果想要在方法中改变调用方法的实例,需要将第一个参数改为 &mut self。通过仅仅使用 self 作为第一个参数来使方法获取实例的所有权是很少见的;这种技术通常用在当方法将 self 转换成别的实例的时候,这时我们想要防止调用者在转换之后使用原始的实例。 使用方法替代函数,除了可使用方法语法和不需要在每个函数签名中重复 self 的类型之外,其主要好处在于组织性。我们将某个类型实例能做的所有事情都一起放入 impl 块中,而不是让将来的用户在我们的库中到处寻找 Rectangle 的功能。 请注意,我们可以选择将方法的名称与结构中的一个字段相同。例如,我们可以在 Rectangle 上定义一个方法,并命名为 width: 文件名:src/main.rs # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# impl Rectangle { fn width(&self) -> bool { self.width > 0 }\n} fn main() { let rect1 = Rectangle { width: 30, height: 50, }; if rect1.width() { println!(\"The rectangle has a nonzero width; it is {}\", rect1.width); }\n} 在这里,我们选择让 width 方法在实例的 width 字段的值大于 0 时返回 true,等于 0 时则返回 false:我们可以出于任何目的,在同名的方法中使用同名的字段。在 main 中,当我们在 rect1.width 后面加上括号时。Rust 知道我们指的是方法 width。当我们不使用圆括号时,Rust 知道我们指的是字段 width。 通常,但并不总是如此,与字段同名的方法将被定义为只返回字段中的值,而不做其他事情。这样的方法被称为 getters ,Rust 并不像其他一些语言那样为结构字段自动实现它们。Getters 很有用,因为你可以把字段变成私有的,但方法是公共的,这样就可以把对字段的只读访问作为该类型公共 API 的一部分。我们将在 第七章 中讨论什么是公有和私有,以及如何将一个字段或方法指定为公有或私有。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » 定义方法","id":"93","title":"定义方法"},"94":{"body":"在 C/C++ 语言中,有两个不同的运算符来调用方法:. 直接在对象上调用方法,而 -> 在一个对象的指针上调用方法,这时需要先解引用(dereference)指针。换句话说,如果 object 是一个指针,那么 object->something() 就像 (*object).something() 一样。 Rust 并没有一个与 -> 等效的运算符;相反,Rust 有一个叫 自动引用和解引用 ( automatic referencing and dereferencing )的功能。方法调用是 Rust 中少数几个拥有这种行为的地方。 它是这样工作的:当使用 object.something() 调用方法时,Rust 会自动为 object 添加 &、&mut 或 * 以便使 object 与方法签名匹配。也就是说,这些代码是等价的: # #[derive(Debug,Copy,Clone)]\n# struct Point {\n# x: f64,\n# y: f64,\n# }\n#\n# impl Point {\n# fn distance(&self, other: &Point) -> f64 {\n# let x_squared = f64::powi(other.x - self.x, 2);\n# let y_squared = f64::powi(other.y - self.y, 2);\n#\n# f64::sqrt(x_squared + y_squared)\n# }\n# }\n# let p1 = Point { x: 0.0, y: 0.0 };\n# let p2 = Point { x: 5.0, y: 6.5 };\np1.distance(&p2);\n(&p1).distance(&p2); 第一行看起来简洁的多。这种自动引用的行为之所以有效,是因为方法有一个明确的接收者———— self 的类型。在给出接收者和方法名的前提下,Rust 可以明确地计算出方法是仅仅读取(&self),做出修改(&mut self)或者是获取所有权(self)。事实上,Rust 对方法接收者的隐式借用让所有权在实践中更友好。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » -> 运算符到哪去了?","id":"94","title":"-> 运算符到哪去了?"},"95":{"body":"让我们通过实现 Rectangle 结构体上的另一方法来练习使用方法。这回,我们让一个 Rectangle 的实例获取另一个 Rectangle 实例,如果 self (第一个 Rectangle)能完全包含第二个长方形则返回 true;否则返回 false。一旦我们定义了 can_hold 方法,就可以编写示例 5-14 中的代码。 文件名:src/main.rs fn main() { let rect1 = Rectangle { width: 30, height: 50, }; let rect2 = Rectangle { width: 10, height: 40, }; let rect3 = Rectangle { width: 60, height: 45, }; println!(\"Can rect1 hold rect2? {}\", rect1.can_hold(&rect2)); println!(\"Can rect1 hold rect3? {}\", rect1.can_hold(&rect3));\n} 示例 5-14:使用还未实现的 can_hold 方法 同时我们希望看到如下输出,因为 rect2 的两个维度都小于 rect1,而 rect3 比 rect1 要宽: Can rect1 hold rect2? true\nCan rect1 hold rect3? false 因为我们想定义一个方法,所以它应该位于 impl Rectangle 块中。方法名是 can_hold,并且它会获取另一个 Rectangle 的不可变借用作为参数。通过观察调用方法的代码可以看出参数是什么类型的:rect1.can_hold(&rect2) 传入了 &rect2,它是一个 Rectangle 的实例 rect2 的不可变借用。这是可以理解的,因为我们只需要读取 rect2(而不是写入,这意味着我们需要一个不可变借用),而且希望 main 保持 rect2 的所有权,这样就可以在调用这个方法后继续使用它。can_hold 的返回值是一个布尔值,其实现会分别检查 self 的宽高是否都大于另一个 Rectangle。让我们在示例 5-13 的 impl 块中增加这个新的 can_hold 方法,如示例 5-15 所示: 文件名:src/main.rs # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# impl Rectangle { fn area(&self) -> u32 { self.width * self.height } fn can_hold(&self, other: &Rectangle) -> bool { self.width > other.width && self.height > other.height }\n}\n# # fn main() {\n# let rect1 = Rectangle {\n# width: 30,\n# height: 50,\n# };\n# let rect2 = Rectangle {\n# width: 10,\n# height: 40,\n# };\n# let rect3 = Rectangle {\n# width: 60,\n# height: 45,\n# };\n# # println!(\"Can rect1 hold rect2? {}\", rect1.can_hold(&rect2));\n# println!(\"Can rect1 hold rect3? {}\", rect1.can_hold(&rect3));\n# } 示例 5-15:在 Rectangle 上实现 can_hold 方法,它获取另一个 Rectangle 实例作为参数 如果结合示例 5-14 的 main 函数来运行,就会看到期望的输出。在方法签名中,可以在 self 后增加多个参数,而且这些参数就像函数中的参数一样工作。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » 带有更多参数的方法","id":"95","title":"带有更多参数的方法"},"96":{"body":"所有在 impl 块中定义的函数被称为 关联函数 ( associated functions ),因为它们与 impl 后面命名的类型相关。我们可以定义不以 self 为第一参数的关联函数(因此不是方法),因为它们并不作用于一个结构体的实例。我们已经使用了一个这样的函数:在 String 类型上定义的 String::from 函数。 不是方法的关联函数经常被用作返回一个结构体新实例的构造函数。这些函数的名称通常为 new ,但 new 并不是一个关键字。例如我们可以提供一个叫做 square 关联函数,它接受一个维度参数并且同时作为宽和高,这样可以更轻松的创建一个正方形 Rectangle 而不必指定两次同样的值: 文件名:src/main.rs # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# impl Rectangle { fn square(size: u32) -> Self { Self { width: size, height: size, } }\n}\n# # fn main() {\n# let sq = Rectangle::square(3);\n# } 关键字 Self 在函数的返回类型中代指在 impl 关键字后出现的类型,在这里是 Rectangle 使用结构体名和 :: 语法来调用这个关联函数:比如 let sq = Rectangle::square(3);。这个函数位于结构体的命名空间中::: 语法用于关联函数和模块创建的命名空间。 第七章 会讲到模块。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » 关联函数","id":"96","title":"关联函数"},"97":{"body":"每个结构体都允许拥有多个 impl 块。例如,示例 5-16 中的代码等同于示例 5-15,但每个方法有其自己的 impl 块。 # #[derive(Debug)]\n# struct Rectangle {\n# width: u32,\n# height: u32,\n# }\n# impl Rectangle { fn area(&self) -> u32 { self.width * self.height }\n} impl Rectangle { fn can_hold(&self, other: &Rectangle) -> bool { self.width > other.width && self.height > other.height }\n}\n# # fn main() {\n# let rect1 = Rectangle {\n# width: 30,\n# height: 50,\n# };\n# let rect2 = Rectangle {\n# width: 10,\n# height: 40,\n# };\n# let rect3 = Rectangle {\n# width: 60,\n# height: 45,\n# };\n# # println!(\"Can rect1 hold rect2? {}\", rect1.can_hold(&rect2));\n# println!(\"Can rect1 hold rect3? {}\", rect1.can_hold(&rect3));\n# } 示例 5-16:使用多个 impl 块重写示例 5-15 这里没有理由将这些方法分散在多个 impl 块中,不过这是有效的语法。第十章讨论泛型和 trait 时会看到实用的多 impl 块的用例。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » 多个 impl 块","id":"97","title":"多个 impl 块"},"98":{"body":"结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,让你指定结构体的实例所具有的行为。 但结构体并不是创建自定义类型的唯一方法:让我们转向 Rust 的枚举功能,为你的工具箱再添一个工具。","breadcrumbs":"使用结构体组织相关联的数据 » 方法语法 » 总结","id":"98","title":"总结"},"99":{"body":"ch06-00-enums.md commit bb7e429ad6b59d9a0c37db7434976364cbb9c6da 本章介绍 枚举 ( enumerations ),也被称作 enums 。枚举允许你通过列举可能的 成员 ( variants )来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做 Option,它代表一个值要么是某个值要么什么都不是。然后会讲到在 match 表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。最后会介绍 if let,另一个简洁方便处理代码中枚举的结构。","breadcrumbs":"枚举和模式匹配 » 枚举和模式匹配","id":"99","title":"枚举和模式匹配"}},"length":438,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{".":{"1":{"0":{"0":{"df":1,"docs":{"427":{"tf":1.7320508075688772}}},"df":1,"docs":{"306":{"tf":2.23606797749979}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"143":{"tf":1.0}}},"5":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"405":{"tf":3.1622776601683795},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"0":{"0":{"df":14,"docs":{"198":{"tf":2.23606797749979},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"266":{"tf":2.449489742783178},"290":{"tf":1.0}}},"2":{"df":1,"docs":{"41":{"tf":1.0}}},"df":10,"docs":{"175":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"232":{"tf":1.0},"255":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"94":{"tf":1.4142135623730951}}},"1":{".":{"0":{"df":4,"docs":{"26":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"32":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"261":{"tf":1.0}}},"df":0,"docs":{}},"2":{"4":{"df":1,"docs":{"405":{"tf":1.0}}},"5":{"df":1,"docs":{"155":{"tf":1.0}}},"7":{"df":4,"docs":{"156":{"tf":1.0},"239":{"tf":1.0},"257":{"tf":1.0},"266":{"tf":1.0}}},"8":{"df":1,"docs":{"55":{"tf":1.0}}},"9":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}},"3":{".":{"3":{"0":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"0":{"5":{":":{"1":{"4":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"9":{":":{"8":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":3,"docs":{"49":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.0}}},"1":{"df":3,"docs":{"51":{"tf":1.0},"56":{"tf":1.0},"61":{"tf":1.7320508075688772}}},"2":{"df":2,"docs":{"27":{"tf":1.0},"62":{"tf":1.0}}},"3":{"df":1,"docs":{"27":{"tf":1.0}}},"8":{"df":1,"docs":{"229":{"tf":1.0}}},"9":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"4":{"1":{"df":1,"docs":{"242":{"tf":1.0}}},"2":{"df":2,"docs":{"398":{"tf":1.0},"88":{"tf":1.0}}},"3":{"df":3,"docs":{"143":{"tf":1.0},"241":{"tf":1.4142135623730951},"42":{"tf":1.0}}},"5":{"df":1,"docs":{"286":{"tf":1.0}}},"6":{"df":1,"docs":{"376":{"tf":1.0}}},"7":{"df":1,"docs":{"246":{"tf":1.0}}},"8":{"df":3,"docs":{"224":{"tf":1.0},"376":{"tf":1.0},"91":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"427":{"tf":1.0}}},"2":{"df":1,"docs":{"350":{"tf":1.0}}},"3":{"df":1,"docs":{"293":{"tf":1.0}}},"4":{"df":1,"docs":{"376":{"tf":1.0}}},"7":{"df":1,"docs":{"198":{"tf":1.0}}},"8":{"df":4,"docs":{"200":{"tf":1.0},"202":{"tf":1.0},"206":{"tf":1.0},"62":{"tf":1.0}}},"9":{"df":3,"docs":{"198":{"tf":1.0},"36":{"tf":1.0},"427":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":3,"docs":{"206":{"tf":1.0},"208":{"tf":1.0},"283":{"tf":1.0}}},"1":{"df":5,"docs":{"200":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"216":{"tf":1.0},"91":{"tf":1.0}}},"2":{"df":2,"docs":{"202":{"tf":1.0},"207":{"tf":1.0}}},"3":{"df":1,"docs":{"291":{"tf":1.0}}},"4":{"df":1,"docs":{"211":{"tf":1.0}}},"6":{"df":2,"docs":{"199":{"tf":1.7320508075688772},"202":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"9":{"df":1,"docs":{"207":{"tf":1.0}}},"df":0,"docs":{}},"7":{"1":{"df":1,"docs":{"225":{"tf":1.0}}},"2":{"df":1,"docs":{"198":{"tf":1.0}}},"3":{"df":2,"docs":{"157":{"tf":1.0},"283":{"tf":1.0}}},"5":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"df":0,"docs":{}},"8":{".":{"5":{"df":3,"docs":{"124":{"tf":1.0},"266":{"tf":1.0},"40":{"tf":2.8284271247461903}}},"6":{"df":1,"docs":{"40":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"267":{"tf":1.0}}},"9":{"df":1,"docs":{"211":{"tf":1.0}}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"40":{"tf":2.6457513110645907}}},"df":0,"docs":{},"x":{"df":1,"docs":{"40":{"tf":1.0}}}},"1":{"df":2,"docs":{"201":{"tf":1.0},"290":{"tf":1.0}}},"3":{"df":1,"docs":{"201":{"tf":1.0}}},"7":{"df":1,"docs":{"228":{"tf":1.0}}},"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"410":{"tf":1.0}}},"df":0,"docs":{}}},"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"4":{"5":{"8":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"b":{"1":{"7":{"5":{"df":0,"docs":{},"f":{"1":{"b":{"8":{"4":{"7":{"0":{"b":{"5":{"b":{"1":{"2":{"df":0,"docs":{},"e":{"4":{"a":{"6":{"3":{"d":{"6":{"7":{"0":{"df":0,"docs":{},"e":{"4":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":22,"docs":{"110":{"tf":1.0},"12":{"tf":1.0},"130":{"tf":1.0},"153":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.0},"2":{"tf":1.0},"213":{"tf":1.0},"237":{"tf":1.0},"254":{"tf":1.0},"270":{"tf":1.0},"296":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"328":{"tf":1.0},"345":{"tf":1.0},"364":{"tf":1.0},"395":{"tf":1.0},"47":{"tf":1.0},"64":{"tf":1.0},"81":{"tf":1.0},"99":{"tf":1.0}}},"1":{"df":21,"docs":{"100":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"131":{"tf":1.0},"154":{"tf":1.0},"171":{"tf":1.0},"197":{"tf":1.0},"214":{"tf":1.0},"238":{"tf":1.0},"255":{"tf":1.0},"271":{"tf":1.0},"297":{"tf":1.0},"315":{"tf":1.0},"329":{"tf":1.0},"346":{"tf":1.0},"365":{"tf":1.0},"396":{"tf":1.0},"411":{"tf":1.0},"49":{"tf":1.0},"65":{"tf":1.0},"82":{"tf":1.0}}},"2":{"a":{"1":{"6":{"8":{"df":0,"docs":{},"e":{"d":{"3":{"4":{"6":{"0":{"4":{"2":{"df":0,"docs":{},"f":{"0":{"7":{"0":{"1":{"0":{"df":0,"docs":{},"f":{"8":{"b":{"6":{"5":{"b":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"6":{"2":{"3":{"d":{"d":{"3":{"1":{"d":{"1":{"df":4,"docs":{"213":{"tf":1.0},"214":{"tf":1.0},"218":{"tf":1.0},"233":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":22,"docs":{"0":{"tf":1.0},"103":{"tf":1.0},"112":{"tf":1.0},"138":{"tf":1.0},"142":{"tf":1.0},"157":{"tf":1.0},"177":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"218":{"tf":1.0},"243":{"tf":1.0},"256":{"tf":1.0},"276":{"tf":1.0},"300":{"tf":1.0},"317":{"tf":1.0},"333":{"tf":1.0},"353":{"tf":1.4142135623730951},"403":{"tf":1.0},"415":{"tf":1.0},"52":{"tf":1.0},"73":{"tf":1.0},"88":{"tf":1.0}}},"3":{"df":21,"docs":{"108":{"tf":1.0},"115":{"tf":1.0},"146":{"tf":1.0},"163":{"tf":1.0},"184":{"tf":1.0},"209":{"tf":1.0},"219":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.0},"264":{"tf":1.0},"283":{"tf":1.0},"304":{"tf":1.0},"320":{"tf":1.0},"337":{"tf":1.0},"354":{"tf":1.0},"373":{"tf":1.0},"406":{"tf":1.0},"418":{"tf":1.0},"55":{"tf":1.0},"77":{"tf":1.0},"92":{"tf":1.0}}},"4":{"df":11,"docs":{"120":{"tf":1.0},"227":{"tf":1.0},"241":{"tf":1.0},"252":{"tf":1.0},"267":{"tf":1.0},"284":{"tf":1.0},"308":{"tf":1.0},"324":{"tf":1.0},"379":{"tf":1.0},"425":{"tf":1.0},"59":{"tf":1.0}}},"5":{"1":{"4":{"b":{"1":{"c":{"df":0,"docs":{},"f":{"3":{"4":{"c":{"2":{"df":0,"docs":{},"e":{"a":{"a":{"b":{"8":{"2":{"8":{"5":{"df":0,"docs":{},"f":{"4":{"3":{"3":{"0":{"5":{"c":{"1":{"0":{"a":{"8":{"7":{"df":0,"docs":{},"f":{"4":{"c":{"df":0,"docs":{},"e":{"3":{"4":{"a":{"0":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"b":{"0":{"d":{"3":{"3":{"8":{"2":{"2":{"9":{"b":{"8":{"7":{"d":{"0":{"6":{"b":{"df":0,"docs":{},"e":{"7":{"7":{"2":{"3":{"4":{"6":{"df":0,"docs":{},"e":{"a":{"0":{"b":{"6":{"4":{"3":{"b":{"d":{"df":0,"docs":{},"e":{"c":{"d":{"c":{"5":{"df":1,"docs":{"365":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":9,"docs":{"0":{"tf":1.0},"127":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"268":{"tf":1.0},"287":{"tf":1.0},"384":{"tf":1.0},"430":{"tf":1.0},"60":{"tf":1.0}}},"6":{"df":4,"docs":{"233":{"tf":1.0},"292":{"tf":1.0},"387":{"tf":1.0},"431":{"tf":1.0}}},"7":{"df":1,"docs":{"432":{"tf":1.0}}},"b":{"1":{"1":{"1":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"2":{"d":{"4":{"1":{"df":0,"docs":{},"e":{"2":{"a":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"7":{"3":{"4":{"8":{"2":{"5":{"c":{"3":{"a":{"1":{"2":{"0":{"8":{"7":{"d":{"4":{"2":{"3":{"df":0,"docs":{},"e":{"8":{"c":{"2":{"df":0,"docs":{},"f":{"0":{"a":{"df":0,"docs":{},"e":{"5":{"3":{"df":2,"docs":{"346":{"tf":1.0},"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":54,"docs":{"101":{"tf":1.7320508075688772},"108":{"tf":1.4142135623730951},"134":{"tf":1.0},"142":{"tf":1.0},"150":{"tf":1.0},"156":{"tf":1.7320508075688772},"162":{"tf":1.7320508075688772},"198":{"tf":5.0990195135927845},"199":{"tf":4.795831523312719},"200":{"tf":3.7416573867739413},"201":{"tf":2.8284271247461903},"202":{"tf":4.242640687119285},"206":{"tf":2.449489742783178},"207":{"tf":4.0},"208":{"tf":4.242640687119285},"211":{"tf":6.244997998398398},"228":{"tf":2.0},"229":{"tf":4.0},"232":{"tf":4.0},"239":{"tf":1.4142135623730951},"242":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.7320508075688772},"257":{"tf":2.0},"266":{"tf":5.291502622129181},"280":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":1.7320508075688772},"290":{"tf":2.23606797749979},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":3.0},"306":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"350":{"tf":1.7320508075688772},"359":{"tf":3.7416573867739413},"360":{"tf":1.7320508075688772},"361":{"tf":2.449489742783178},"369":{"tf":1.0},"374":{"tf":1.0},"375":{"tf":1.0},"378":{"tf":1.0},"391":{"tf":1.0},"405":{"tf":3.4641016151377544},"407":{"tf":2.0},"408":{"tf":3.3166247903554},"53":{"tf":2.0},"54":{"tf":1.4142135623730951},"61":{"tf":2.23606797749979},"62":{"tf":2.8284271247461903},"78":{"tf":1.0},"85":{"tf":2.0},"90":{"tf":1.0},"93":{"tf":1.7320508075688772}},"o":{"7":{"7":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"3":{"2":{".":{".":{"2":{"0":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"x":{"0":{"1":{"2":{"3":{"4":{"5":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"367":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"368":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"53":{"tf":1.0}}}}},"、":{"1":{"df":0,"docs":{},"、":{"2":{"df":0,"docs":{},"、":{"3":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},",":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"89":{"tf":1.0}}}}}}}}}},"1":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"246":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{".":{"1":{"0":{"0":{"0":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"324":{"tf":1.0}}},"df":2,"docs":{"298":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"4":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"62":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":2,"docs":{"298":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772}}},"=":{"1":{"0":{"0":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{"1":{"df":1,"docs":{"263":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":6,"docs":{"173":{"tf":1.4142135623730951},"191":{"tf":1.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"391":{"tf":1.0},"408":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"430":{"tf":1.0}}},"df":1,"docs":{"399":{"tf":1.0}}},"2":{"1":{"df":1,"docs":{"56":{"tf":1.0}}},"2":{"df":1,"docs":{"229":{"tf":1.0}}},"df":0,"docs":{}},"3":{"1":{"df":1,"docs":{"211":{"tf":1.0}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"430":{"tf":1.0}}}}}}}},"3":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"5":{"0":{"df":2,"docs":{"32":{"tf":1.0},"43":{"tf":1.0}}},"7":{"df":1,"docs":{"216":{"tf":1.0}}},"df":1,"docs":{"434":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"434":{"tf":1.0}}},"7":{"8":{".":{"0":{"df":0,"docs":{},"(":{"2":{"0":{"2":{"4":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"=":{"1":{"2":{"df":1,"docs":{"362":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"5":{"df":1,"docs":{"398":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"368":{"tf":1.0}}},"df":4,"docs":{"322":{"tf":1.0},"358":{"tf":1.0},"375":{"tf":1.0},"53":{"tf":1.0}}},"df":14,"docs":{"134":{"tf":1.4142135623730951},"156":{"tf":1.0},"167":{"tf":3.3166247903554},"170":{"tf":2.449489742783178},"172":{"tf":1.7320508075688772},"202":{"tf":4.0},"232":{"tf":1.0},"289":{"tf":2.0},"290":{"tf":1.0},"31":{"tf":1.0},"39":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.0}}},"2":{"3":{"df":1,"docs":{"397":{"tf":1.0}}},"df":2,"docs":{"207":{"tf":1.0},"320":{"tf":1.0}}},"4":{"df":1,"docs":{"142":{"tf":1.0}}},"5":{"df":1,"docs":{"320":{"tf":1.0}}},"8":{"2":{"c":{"4":{"b":{"0":{"6":{"3":{"a":{"8":{"df":0,"docs":{},"f":{"b":{"df":0,"docs":{},"e":{"6":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":73,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":1.0},"137":{"tf":1.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.7320508075688772},"150":{"tf":2.449489742783178},"162":{"tf":1.7320508075688772},"170":{"tf":3.1622776601683795},"172":{"tf":2.23606797749979},"173":{"tf":2.8284271247461903},"175":{"tf":3.4641016151377544},"176":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"183":{"tf":1.4142135623730951},"185":{"tf":3.0},"186":{"tf":2.6457513110645907},"188":{"tf":2.8284271247461903},"190":{"tf":1.4142135623730951},"191":{"tf":2.23606797749979},"192":{"tf":1.4142135623730951},"194":{"tf":1.0},"196":{"tf":1.0},"198":{"tf":1.0},"202":{"tf":1.0},"206":{"tf":2.8284271247461903},"224":{"tf":1.4142135623730951},"225":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":2.0},"243":{"tf":1.4142135623730951},"247":{"tf":2.23606797749979},"266":{"tf":1.4142135623730951},"267":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":2.0},"291":{"tf":1.4142135623730951},"293":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.7320508075688772},"303":{"tf":1.0},"306":{"tf":2.449489742783178},"319":{"tf":2.0},"320":{"tf":1.0},"322":{"tf":2.449489742783178},"324":{"tf":2.0},"332":{"tf":1.0},"335":{"tf":2.0},"341":{"tf":1.0},"353":{"tf":1.4142135623730951},"356":{"tf":2.0},"359":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951},"360":{"tf":1.0},"361":{"tf":1.0},"369":{"tf":1.4142135623730951},"37":{"tf":1.0},"404":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"62":{"tf":3.1622776601683795},"90":{"tf":1.4142135623730951},"91":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":2.0}}},"、":{"1":{"1":{"df":1,"docs":{"362":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"148":{"tf":1.0}}}}}},",":{"df":0,"docs":{},"之":{"df":0,"docs":{},"后":{"df":0,"docs":{},"是":{"df":0,"docs":{},"另":{"df":0,"docs":{},"两":{"df":0,"docs":{},"个":{"df":0,"docs":{},"列":{"df":0,"docs":{},"表":{"df":0,"docs":{},":":{"b":{"df":1,"docs":{"285":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}},":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"280":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"1":{":":{"4":{"3":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"3":{"d":{"5":{"0":{"8":{"b":{"0":{"a":{"2":{"8":{"b":{"0":{"3":{"df":0,"docs":{},"f":{"7":{"d":{"9":{"df":0,"docs":{},"f":{"1":{"6":{"c":{"8":{"8":{"7":{"2":{"6":{"0":{"8":{"8":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"f":{"d":{"8":{"7":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":38,"docs":{"120":{"tf":1.7320508075688772},"121":{"tf":1.7320508075688772},"123":{"tf":1.0},"140":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"189":{"tf":1.0},"192":{"tf":1.0},"198":{"tf":2.8284271247461903},"199":{"tf":2.0},"200":{"tf":1.4142135623730951},"202":{"tf":2.23606797749979},"203":{"tf":1.0},"206":{"tf":1.7320508075688772},"207":{"tf":2.0},"210":{"tf":1.4142135623730951},"211":{"tf":2.0},"225":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"266":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"303":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"337":{"tf":1.4142135623730951},"339":{"tf":1.0},"340":{"tf":1.4142135623730951},"341":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.0},"370":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"57":{"tf":1.0},"91":{"tf":1.4142135623730951}},":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"281":{"tf":1.0}}}}}}}}},"2":{".":{".":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":1.0}}}},"df":0,"docs":{}},"7":{".":{"0":{".":{"0":{".":{"1":{":":{"7":{"8":{"7":{"8":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"401":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}}}},"df":5,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"165":{"tf":1.4142135623730951}},"。":{"df":0,"docs":{},"第":{"df":0,"docs":{},"二":{"df":0,"docs":{},"个":{"df":0,"docs":{},"实":{"df":0,"docs":{},"例":{"df":0,"docs":{},",":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},",":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.0}}},"8":{"1":{"3":{"5":{"6":{"1":{"3":{"9":{"2":{"8":{"7":{"2":{"0":{"6":{"5":{"9":{"7":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":45,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"156":{"tf":1.0},"162":{"tf":1.4142135623730951},"178":{"tf":1.0},"180":{"tf":1.0},"200":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"215":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"218":{"tf":2.0},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.8284271247461903},"225":{"tf":2.8284271247461903},"226":{"tf":2.0},"228":{"tf":2.0},"229":{"tf":2.449489742783178},"231":{"tf":1.7320508075688772},"232":{"tf":2.6457513110645907},"235":{"tf":1.4142135623730951},"242":{"tf":2.0},"244":{"tf":1.4142135623730951},"246":{"tf":1.0},"249":{"tf":2.23606797749979},"250":{"tf":1.4142135623730951},"252":{"tf":2.23606797749979},"281":{"tf":1.7320508075688772},"306":{"tf":2.23606797749979},"319":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"359":{"tf":1.7320508075688772},"362":{"tf":1.0},"37":{"tf":1.0},"374":{"tf":1.7320508075688772},"400":{"tf":1.0},"405":{"tf":2.23606797749979},"434":{"tf":1.0},"51":{"tf":1.4142135623730951},"54":{"tf":1.0},"91":{"tf":1.4142135623730951}},"。":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"385":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"然":{"df":0,"docs":{},"而":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}}}}},":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"178":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"3":{"5":{"df":1,"docs":{"142":{"tf":1.0}}},"df":32,"docs":{"121":{"tf":2.0},"140":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"181":{"tf":1.0},"211":{"tf":1.4142135623730951},"224":{"tf":1.0},"226":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":3.1622776601683795},"242":{"tf":2.6457513110645907},"243":{"tf":2.0},"244":{"tf":1.4142135623730951},"245":{"tf":2.0},"246":{"tf":2.23606797749979},"247":{"tf":1.7320508075688772},"249":{"tf":2.8284271247461903},"250":{"tf":2.23606797749979},"251":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"329":{"tf":1.0},"339":{"tf":1.4142135623730951},"359":{"tf":1.7320508075688772},"374":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"93":{"tf":1.4142135623730951},"95":{"tf":1.0}}},"4":{"1":{"df":1,"docs":{"142":{"tf":1.0}}},"df":22,"docs":{"121":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"142":{"tf":1.0},"180":{"tf":1.0},"226":{"tf":1.4142135623730951},"246":{"tf":1.7320508075688772},"257":{"tf":3.1622776601683795},"258":{"tf":4.0},"266":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":1.7320508075688772},"306":{"tf":1.7320508075688772},"309":{"tf":1.0},"320":{"tf":1.4142135623730951},"332":{"tf":1.0},"340":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"375":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"59":{"tf":1.0},"91":{"tf":1.0},"95":{"tf":1.7320508075688772}},":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"5":{"0":{"0":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"1":{"df":2,"docs":{"142":{"tf":1.0},"144":{"tf":1.0}}},"df":39,"docs":{"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"183":{"tf":1.4142135623730951},"199":{"tf":1.0},"228":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.4142135623730951},"272":{"tf":1.7320508075688772},"273":{"tf":2.6457513110645907},"274":{"tf":1.7320508075688772},"275":{"tf":2.449489742783178},"277":{"tf":1.4142135623730951},"278":{"tf":2.449489742783178},"279":{"tf":2.449489742783178},"280":{"tf":2.23606797749979},"281":{"tf":3.1622776601683795},"283":{"tf":3.3166247903554},"285":{"tf":2.8284271247461903},"286":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":2.0},"291":{"tf":2.8284271247461903},"293":{"tf":3.1622776601683795},"294":{"tf":2.8284271247461903},"304":{"tf":1.0},"306":{"tf":2.23606797749979},"307":{"tf":1.4142135623730951},"320":{"tf":1.0},"322":{"tf":1.7320508075688772},"341":{"tf":1.4142135623730951},"359":{"tf":1.7320508075688772},"375":{"tf":1.4142135623730951},"380":{"tf":1.0},"381":{"tf":1.0},"405":{"tf":1.7320508075688772},"407":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"6":{"0":{"8":{"6":{"9":{"df":0,"docs":{},"f":{"3":{"8":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"9":{"1":{"6":{"6":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"359":{"tf":1.7320508075688772}}},"4":{"df":1,"docs":{"142":{"tf":2.23606797749979}}},"5":{"df":1,"docs":{"142":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"142":{"tf":1.0}}},"df":27,"docs":{"122":{"tf":1.7320508075688772},"141":{"tf":1.4142135623730951},"185":{"tf":1.7320508075688772},"228":{"tf":1.4142135623730951},"231":{"tf":1.0},"242":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"283":{"tf":2.0},"298":{"tf":2.6457513110645907},"299":{"tf":3.605551275463989},"300":{"tf":2.6457513110645907},"301":{"tf":1.7320508075688772},"302":{"tf":2.23606797749979},"303":{"tf":1.7320508075688772},"306":{"tf":3.3166247903554},"309":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.4142135623730951},"342":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"360":{"tf":2.23606797749979},"376":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"53":{"tf":1.0},"78":{"tf":1.0},"97":{"tf":1.4142135623730951}},"、":{"1":{"0":{"df":1,"docs":{"185":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"7":{"0":{"b":{"9":{"4":{"2":{"df":0,"docs":{},"e":{"b":{"5":{"b":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"3":{"a":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"df":1,"docs":{"142":{"tf":1.0}}},"df":36,"docs":{"123":{"tf":1.4142135623730951},"127":{"tf":1.0},"141":{"tf":1.4142135623730951},"185":{"tf":1.4142135623730951},"186":{"tf":1.0},"191":{"tf":1.0},"229":{"tf":1.4142135623730951},"242":{"tf":1.0},"249":{"tf":1.4142135623730951},"285":{"tf":1.7320508075688772},"314":{"tf":2.0},"316":{"tf":3.7416573867739413},"318":{"tf":2.449489742783178},"319":{"tf":3.3166247903554},"320":{"tf":3.7416573867739413},"321":{"tf":1.4142135623730951},"322":{"tf":3.3166247903554},"323":{"tf":2.449489742783178},"324":{"tf":2.449489742783178},"325":{"tf":1.4142135623730951},"331":{"tf":2.0},"334":{"tf":2.8284271247461903},"335":{"tf":3.0},"336":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"339":{"tf":1.7320508075688772},"340":{"tf":2.0},"341":{"tf":1.7320508075688772},"342":{"tf":3.0},"343":{"tf":2.8284271247461903},"360":{"tf":1.4142135623730951},"376":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"407":{"tf":1.0},"78":{"tf":1.0}},":":{"df":0,"docs":{},"r":{"df":1,"docs":{"185":{"tf":1.0}}}}},"8":{"0":{"df":1,"docs":{"144":{"tf":1.0}}},"4":{"df":1,"docs":{"142":{"tf":1.0}}},"df":22,"docs":{"125":{"tf":1.4142135623730951},"141":{"tf":2.0},"142":{"tf":1.0},"185":{"tf":1.4142135623730951},"186":{"tf":1.0},"229":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"249":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"342":{"tf":1.4142135623730951},"353":{"tf":2.6457513110645907},"356":{"tf":1.4142135623730951},"359":{"tf":3.605551275463989},"360":{"tf":4.47213595499958},"361":{"tf":2.6457513110645907},"362":{"tf":1.4142135623730951},"376":{"tf":2.0},"405":{"tf":1.4142135623730951},"78":{"tf":1.0}}},"9":{",":{"2":{"3":{"4":{",":{"9":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"2":{"0":{",":{"3":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"7":{"df":1,"docs":{"328":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}},"9":{"4":{"df":1,"docs":{"330":{"tf":1.0}}},"9":{"df":1,"docs":{"104":{"tf":1.0}}},"c":{"a":{"9":{"9":{"9":{"2":{"6":{"df":0,"docs":{},"f":{"2":{"3":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"f":{"5":{"8":{"1":{"a":{"9":{"1":{"7":{"df":0,"docs":{},"e":{"a":{"d":{"a":{"4":{"b":{"6":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"2":{"1":{"7":{"5":{"4":{"df":1,"docs":{"153":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":35,"docs":{"125":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"188":{"tf":1.0},"225":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"348":{"tf":1.7320508075688772},"349":{"tf":1.7320508075688772},"350":{"tf":1.7320508075688772},"351":{"tf":2.0},"352":{"tf":2.0},"360":{"tf":1.4142135623730951},"367":{"tf":2.8284271247461903},"368":{"tf":3.3166247903554},"369":{"tf":2.0},"370":{"tf":1.4142135623730951},"374":{"tf":2.449489742783178},"375":{"tf":2.0},"376":{"tf":4.0},"377":{"tf":1.4142135623730951},"378":{"tf":1.4142135623730951},"380":{"tf":1.0},"381":{"tf":2.23606797749979},"382":{"tf":2.0},"385":{"tf":1.4142135623730951},"389":{"tf":1.7320508075688772},"390":{"tf":1.4142135623730951},"391":{"tf":3.872983346207417},"405":{"tf":1.4142135623730951},"78":{"tf":1.0}},":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"186":{"tf":1.0}}}}},"df":0,"docs":{}}}},":":{"1":{"df":1,"docs":{"297":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"_":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":138,"docs":{"0":{"tf":1.0},"101":{"tf":2.0},"102":{"tf":1.0},"103":{"tf":1.7320508075688772},"104":{"tf":1.0},"105":{"tf":2.0},"106":{"tf":1.7320508075688772},"108":{"tf":1.4142135623730951},"114":{"tf":2.0},"115":{"tf":1.0},"120":{"tf":1.7320508075688772},"132":{"tf":1.7320508075688772},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"150":{"tf":1.7320508075688772},"151":{"tf":1.0},"156":{"tf":2.0},"162":{"tf":1.0},"167":{"tf":3.3166247903554},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"173":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":3.1622776601683795},"199":{"tf":3.1622776601683795},"200":{"tf":2.0},"201":{"tf":2.0},"202":{"tf":4.358898943540674},"203":{"tf":1.0},"206":{"tf":2.0},"207":{"tf":1.7320508075688772},"208":{"tf":2.23606797749979},"211":{"tf":3.1622776601683795},"215":{"tf":1.4142135623730951},"217":{"tf":1.0},"22":{"tf":2.0},"221":{"tf":1.0},"224":{"tf":2.449489742783178},"225":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":1.4142135623730951},"23":{"tf":1.0},"232":{"tf":1.0},"239":{"tf":2.0},"240":{"tf":2.6457513110645907},"241":{"tf":2.8284271247461903},"242":{"tf":2.6457513110645907},"246":{"tf":2.6457513110645907},"255":{"tf":1.4142135623730951},"257":{"tf":3.0},"26":{"tf":2.0},"266":{"tf":2.8284271247461903},"267":{"tf":1.0},"272":{"tf":1.7320508075688772},"273":{"tf":2.449489742783178},"274":{"tf":1.4142135623730951},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":2.0},"289":{"tf":2.0},"290":{"tf":1.7320508075688772},"293":{"tf":2.0},"294":{"tf":2.449489742783178},"298":{"tf":3.1622776601683795},"299":{"tf":1.7320508075688772},"301":{"tf":1.0},"306":{"tf":2.6457513110645907},"31":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.7320508075688772},"318":{"tf":2.449489742783178},"324":{"tf":2.449489742783178},"33":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"335":{"tf":1.0},"347":{"tf":1.0},"348":{"tf":1.7320508075688772},"349":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":2.449489742783178},"353":{"tf":1.4142135623730951},"355":{"tf":1.7320508075688772},"357":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"361":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":2.449489742783178},"374":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":2.0},"385":{"tf":1.0},"386":{"tf":2.6457513110645907},"39":{"tf":1.0},"391":{"tf":1.4142135623730951},"395":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.7320508075688772},"401":{"tf":1.0},"405":{"tf":2.449489742783178},"407":{"tf":1.0},"408":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"416":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"427":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.7320508075688772},"52":{"tf":1.0},"53":{"tf":3.1622776601683795},"54":{"tf":3.0},"57":{"tf":2.8284271247461903},"58":{"tf":2.23606797749979},"61":{"tf":1.4142135623730951},"62":{"tf":2.6457513110645907},"68":{"tf":1.4142135623730951},"70":{"tf":2.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"78":{"tf":1.0},"79":{"tf":1.4142135623730951},"82":{"tf":2.23606797749979},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":2.0},"90":{"tf":1.0},"91":{"tf":1.0}},"f":{"b":{"7":{"4":{"c":{"3":{"df":0,"docs":{},"f":{"1":{"d":{"8":{"a":{"df":0,"docs":{},"e":{"b":{"a":{"3":{"9":{"3":{"7":{"3":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"4":{"c":{"d":{"b":{"9":{"a":{"4":{"b":{"d":{"c":{"a":{"9":{"5":{"6":{"0":{"4":{"df":0,"docs":{},"f":{"df":2,"docs":{"2":{"tf":1.0},"20":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"8":{"9":{"0":{"0":{"3":{"1":{"3":{"1":{"1":{"6":{"1":{"2":{"df":0,"docs":{},"e":{"5":{"4":{"9":{"6":{"5":{"df":0,"docs":{},"f":{"7":{"df":0,"docs":{},"f":{"8":{"0":{"0":{"a":{"8":{"c":{"8":{"b":{"d":{"4":{"4":{"6":{"4":{"6":{"6":{"3":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"f":{"c":{"4":{"b":{"9":{"6":{"c":{"2":{"0":{"1":{"7":{"df":0,"docs":{},"f":{"6":{"4":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"f":{"4":{"1":{"a":{"0":{"a":{"0":{"7":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"e":{"8":{"1":{"5":{"df":0,"docs":{},"f":{"2":{"4":{"df":0,"docs":{},"f":{"df":4,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"296":{"tf":1.0},"410":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"3":{"2":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"、":{"2":{"df":3,"docs":{"132":{"tf":1.0},"349":{"tf":1.0},"389":{"tf":1.0}},"、":{"3":{"df":0,"docs":{},"、":{"4":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"然":{"df":0,"docs":{},"而":{"df":0,"docs":{},",":{"b":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}}}}},",":{"2":{"df":0,"docs":{},",":{"3":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"82":{"tf":1.0}}}}}}}},"2":{".":{"0":{"df":3,"docs":{"260":{"tf":1.4142135623730951},"391":{"tf":1.0},"53":{"tf":1.0}}},"5":{"3":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0}}},"df":0,"docs":{}},"8":{"5":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"8":{"df":1,"docs":{"104":{"tf":1.0}}},"9":{"df":1,"docs":{"102":{"tf":1.0}}},"df":8,"docs":{"202":{"tf":2.0},"399":{"tf":2.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}},"1":{"5":{"df":3,"docs":{"414":{"tf":1.4142135623730951},"430":{"tf":2.0},"434":{"tf":1.0}},"、":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"430":{"tf":1.0}}}}}}}},"8":{"df":2,"docs":{"414":{"tf":1.4142135623730951},"430":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"1":{"df":4,"docs":{"26":{"tf":1.0},"260":{"tf":1.0},"32":{"tf":1.0},"430":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"8":{"df":2,"docs":{"142":{"tf":2.0},"144":{"tf":1.4142135623730951}}},":":{"1":{"0":{"df":1,"docs":{"320":{"tf":3.7416573867739413}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":28,"docs":{"125":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"289":{"tf":1.0},"320":{"tf":1.7320508075688772},"322":{"tf":1.7320508075688772},"328":{"tf":1.0},"343":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"395":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":2.0},"401":{"tf":3.0},"402":{"tf":2.0},"404":{"tf":2.0},"405":{"tf":5.477225575051661},"406":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951},"408":{"tf":2.449489742783178},"62":{"tf":2.0},"78":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"1":{"a":{"2":{"df":0,"docs":{},"e":{"d":{"1":{"4":{"df":0,"docs":{},"f":{"4":{"4":{"8":{"0":{"d":{"a":{"b":{"6":{"2":{"4":{"3":{"8":{"d":{"c":{"c":{"1":{"1":{"3":{"0":{"2":{"9":{"1":{"b":{"df":0,"docs":{},"e":{"b":{"c":{"6":{"5":{"3":{"7":{"9":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"f":{"8":{"4":{"0":{"8":{"4":{"2":{"b":{"d":{"df":0,"docs":{},"f":{"7":{"6":{"8":{"a":{"7":{"9":{"8":{"8":{"6":{"9":{"df":0,"docs":{},"f":{"0":{"6":{"3":{"7":{"3":{"c":{"9":{"6":{"c":{"1":{"c":{"c":{"5":{"1":{"2":{"2":{"df":1,"docs":{"384":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":16,"docs":{"127":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"188":{"tf":1.0},"194":{"tf":1.0},"211":{"tf":1.0},"232":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"251":{"tf":1.0},"289":{"tf":1.4142135623730951},"306":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.4142135623730951},"343":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"376":{"tf":1.4142135623730951},"405":{"tf":2.0}},":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"188":{"tf":1.0}}}}}}}}}}},"2":{"4":{"df":1,"docs":{"142":{"tf":2.449489742783178}}},"df":14,"docs":{"127":{"tf":1.7320508075688772},"149":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951},"232":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"251":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"377":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951},"42":{"tf":1.0}}},"3":{"df":11,"docs":{"150":{"tf":1.4142135623730951},"185":{"tf":1.0},"188":{"tf":1.7320508075688772},"232":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"290":{"tf":1.7320508075688772},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"378":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951}}},"4":{"3":{".":{"3":{"df":1,"docs":{"267":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"142":{"tf":1.0},"150":{"tf":1.7320508075688772},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"235":{"tf":1.4142135623730951},"249":{"tf":1.0},"291":{"tf":1.4142135623730951},"293":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"377":{"tf":1.0},"381":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951}}},"5":{"5":{"df":3,"docs":{"101":{"tf":1.0},"359":{"tf":1.7320508075688772},"53":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"53":{"tf":1.0}}},"df":16,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":2.449489742783178},"108":{"tf":1.4142135623730951},"150":{"tf":2.0},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"191":{"tf":1.7320508075688772},"240":{"tf":1.0},"249":{"tf":1.0},"293":{"tf":2.0},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"381":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951}}},"6":{":":{"1":{"0":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":7,"docs":{"293":{"tf":1.4142135623730951},"294":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"382":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951}}},"7":{"df":7,"docs":{"294":{"tf":1.7320508075688772},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"385":{"tf":1.4142135623730951},"405":{"tf":1.0},"53":{"tf":1.4142135623730951}}},"8":{"0":{"df":2,"docs":{"178":{"tf":1.0},"179":{"tf":1.0}}},"df":7,"docs":{"228":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"389":{"tf":1.7320508075688772},"53":{"tf":1.0}}},"9":{"2":{"1":{"7":{"4":{"3":{"5":{"1":{"6":{"b":{"3":{"df":0,"docs":{},"e":{"2":{"c":{"0":{"df":0,"docs":{},"f":{"4":{"5":{"a":{"9":{"5":{"3":{"9":{"0":{"df":0,"docs":{},"e":{"7":{"b":{"5":{"3":{"6":{"df":0,"docs":{},"e":{"4":{"2":{"df":0,"docs":{},"f":{"4":{"a":{"df":0,"docs":{},"f":{"7":{"c":{"df":1,"docs":{"154":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"df":0,"docs":{},"f":{"d":{"1":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"e":{"1":{"1":{"d":{"d":{"6":{"1":{"c":{"a":{"1":{"3":{"6":{"df":0,"docs":{},"f":{"b":{"5":{"1":{"d":{"7":{"1":{"3":{"df":0,"docs":{},"f":{"6":{"b":{"0":{"b":{"a":{"7":{"5":{"1":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":5,"docs":{"294":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"362":{"tf":1.4142135623730951},"390":{"tf":1.4142135623730951}}},"b":{"4":{"5":{"6":{"5":{"6":{"6":{"2":{"d":{"1":{"a":{"7":{"9":{"7":{"3":{"d":{"8":{"7":{"0":{"7":{"4":{"4":{"a":{"9":{"2":{"3":{"df":0,"docs":{},"f":{"5":{"8":{"df":0,"docs":{},"f":{"8":{"df":0,"docs":{},"f":{"7":{"d":{"c":{"c":{"df":0,"docs":{},"e":{"9":{"1":{"df":2,"docs":{"115":{"tf":1.0},"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"d":{"1":{"b":{"5":{"5":{"9":{"3":{"d":{"2":{"6":{"d":{"c":{"6":{"a":{"0":{"3":{"c":{"2":{"0":{"df":0,"docs":{},"f":{"8":{"6":{"1":{"9":{"1":{"8":{"7":{"a":{"d":{"4":{"b":{"2":{"4":{"8":{"5":{"5":{"5":{"2":{"df":1,"docs":{"248":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":101,"docs":{"101":{"tf":2.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.7320508075688772},"116":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.0},"132":{"tf":1.7320508075688772},"134":{"tf":2.0},"137":{"tf":1.0},"150":{"tf":1.0},"156":{"tf":2.23606797749979},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"170":{"tf":2.449489742783178},"198":{"tf":2.8284271247461903},"199":{"tf":1.7320508075688772},"200":{"tf":1.0},"203":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.23606797749979},"208":{"tf":1.4142135623730951},"210":{"tf":1.7320508075688772},"217":{"tf":1.4142135623730951},"221":{"tf":1.0},"224":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":3.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.4142135623730951},"257":{"tf":1.7320508075688772},"26":{"tf":1.0},"266":{"tf":1.0},"273":{"tf":3.0},"274":{"tf":1.4142135623730951},"275":{"tf":2.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"289":{"tf":1.4142135623730951},"293":{"tf":2.449489742783178},"294":{"tf":1.0},"298":{"tf":3.0},"299":{"tf":2.0},"306":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"318":{"tf":2.449489742783178},"323":{"tf":1.0},"324":{"tf":2.23606797749979},"33":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"349":{"tf":2.0},"350":{"tf":1.0},"351":{"tf":2.449489742783178},"353":{"tf":1.0},"355":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.0},"360":{"tf":2.449489742783178},"361":{"tf":2.23606797749979},"367":{"tf":1.4142135623730951},"368":{"tf":2.0},"37":{"tf":1.7320508075688772},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":2.6457513110645907},"382":{"tf":1.0},"385":{"tf":1.4142135623730951},"386":{"tf":1.0},"389":{"tf":1.7320508075688772},"391":{"tf":1.4142135623730951},"398":{"tf":1.4142135623730951},"40":{"tf":2.0},"401":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"407":{"tf":1.0},"408":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"42":{"tf":1.7320508075688772},"428":{"tf":1.0},"45":{"tf":2.0},"49":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":2.449489742783178},"57":{"tf":2.0},"61":{"tf":3.0},"62":{"tf":2.449489742783178},"70":{"tf":2.6457513110645907},"75":{"tf":1.0},"79":{"tf":1.7320508075688772},"82":{"tf":1.4142135623730951},"84":{"tf":1.0},"87":{"tf":1.7320508075688772},"91":{"tf":1.0},"94":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"53":{"tf":1.7320508075688772}}},",":{"df":0,"docs":{},"x":{"df":1,"docs":{"51":{"tf":1.0}}}},":":{"*":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"257":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"3":{".":{".":{"=":{"7":{"df":1,"docs":{"362":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":1,"docs":{"53":{"tf":1.0}}},"1":{"4":{"1":{"5":{"df":1,"docs":{"428":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"183":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"0":{"df":13,"docs":{"322":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"348":{"tf":2.0},"391":{"tf":2.6457513110645907},"53":{"tf":1.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":2.6457513110645907},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"1":{"0":{"df":0,"docs":{},"e":{"a":{"6":{"c":{"b":{"0":{"d":{"d":{"8":{"5":{"5":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"5":{"1":{"0":{"c":{"9":{"b":{"a":{"0":{"5":{"6":{"4":{"8":{"b":{"c":{"5":{"8":{"3":{"6":{"df":0,"docs":{},"e":{"a":{"d":{"0":{"c":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"1":{"df":0,"docs":{},"e":{"d":{"a":{"0":{"7":{"a":{"4":{"a":{"4":{"6":{"9":{"2":{"b":{"df":0,"docs":{},"f":{"6":{"9":{"df":0,"docs":{},"e":{"3":{"a":{"a":{"a":{"d":{"9":{"9":{"9":{"d":{"8":{"4":{"0":{"a":{"c":{"9":{"c":{"1":{"3":{"8":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"324":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951}}},"2":{".":{"2":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":6,"docs":{"135":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"360":{"tf":2.449489742783178},"391":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"53":{"tf":2.23606797749979}}},"3":{"df":2,"docs":{"325":{"tf":1.4142135623730951},"391":{"tf":1.7320508075688772}}},"4":{"\"":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"348":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"3":{"1":{"4":{"c":{"1":{"0":{"df":0,"docs":{},"f":{"6":{"9":{"9":{"c":{"c":{"8":{"8":{"2":{"d":{"4":{"df":0,"docs":{},"e":{"0":{"b":{"0":{"6":{"df":0,"docs":{},"f":{"2":{"a":{"2":{"4":{"b":{"d":{"3":{"7":{"a":{"5":{"4":{"3":{"5":{"df":0,"docs":{},"f":{"2":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.4142135623730951},"382":{"tf":1.0}}},"5":{"0":{"df":1,"docs":{"322":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.0}}}},"df":1,"docs":{"322":{"tf":1.4142135623730951}}},"6":{"3":{"8":{"3":{"b":{"4":{"d":{"a":{"2":{"1":{"d":{"b":{"d":{"0":{"a":{"0":{"7":{"8":{"1":{"4":{"7":{"3":{"b":{"c":{"8":{"a":{"d":{"7":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"e":{"d":{"1":{"b":{"6":{"7":{"5":{"1":{"df":1,"docs":{"300":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":1,"docs":{"42":{"tf":1.7320508075688772}}},"9":{"6":{"2":{"c":{"0":{"2":{"2":{"4":{"b":{"2":{"7":{"4":{"df":0,"docs":{},"e":{"2":{"3":{"5":{"8":{"df":0,"docs":{},"e":{"0":{"a":{"c":{"df":0,"docs":{},"f":{"0":{"6":{"4":{"4":{"3":{"a":{"df":0,"docs":{},"f":{"6":{"4":{"d":{"df":0,"docs":{},"f":{"1":{"1":{"5":{"3":{"5":{"9":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"d":{"b":{"6":{"9":{"d":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"f":{"b":{"1":{"8":{"df":0,"docs":{},"f":{"2":{"4":{"b":{"1":{"5":{"c":{"7":{"a":{"d":{"1":{"3":{"4":{"9":{"1":{"b":{"1":{"c":{"1":{"df":0,"docs":{},"f":{"a":{"7":{"2":{"3":{"1":{"df":1,"docs":{"415":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"8":{"d":{"6":{"df":0,"docs":{},"f":{"4":{"8":{"d":{"2":{"df":0,"docs":{},"e":{"6":{"b":{"7":{"b":{"1":{"5":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"d":{"5":{"1":{"c":{"4":{"5":{"4":{"1":{"d":{"4":{"4":{"6":{"df":0,"docs":{},"e":{"8":{"9":{"d":{"df":0,"docs":{},"e":{"3":{"8":{"9":{"2":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"5":{"1":{"df":0,"docs":{},"f":{"7":{"0":{"c":{"7":{"8":{"1":{"6":{"2":{"df":0,"docs":{},"f":{"a":{"a":{"df":0,"docs":{},"e":{"b":{"c":{"a":{"b":{"0":{"d":{"a":{"0":{"d":{"df":0,"docs":{},"e":{"2":{"d":{"d":{"d":{"3":{"3":{"3":{"df":0,"docs":{},"e":{"7":{"a":{"8":{"df":3,"docs":{"65":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":92,"docs":{"103":{"tf":2.23606797749979},"106":{"tf":1.0},"107":{"tf":2.449489742783178},"115":{"tf":2.0},"116":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"134":{"tf":1.7320508075688772},"137":{"tf":1.0},"142":{"tf":1.7320508075688772},"156":{"tf":2.0},"157":{"tf":1.7320508075688772},"162":{"tf":1.4142135623730951},"170":{"tf":1.7320508075688772},"172":{"tf":1.0},"174":{"tf":1.0},"192":{"tf":1.4142135623730951},"196":{"tf":1.0},"198":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"224":{"tf":2.23606797749979},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.23606797749979},"231":{"tf":1.0},"232":{"tf":2.0},"240":{"tf":1.7320508075688772},"241":{"tf":3.0},"242":{"tf":2.0},"243":{"tf":1.7320508075688772},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"273":{"tf":2.6457513110645907},"275":{"tf":1.0},"285":{"tf":2.0},"286":{"tf":1.0},"289":{"tf":1.4142135623730951},"291":{"tf":1.0},"294":{"tf":2.6457513110645907},"298":{"tf":2.449489742783178},"299":{"tf":3.0},"314":{"tf":1.4142135623730951},"316":{"tf":2.0},"318":{"tf":2.449489742783178},"324":{"tf":2.0},"334":{"tf":1.0},"345":{"tf":1.0},"349":{"tf":1.4142135623730951},"350":{"tf":1.7320508075688772},"351":{"tf":2.449489742783178},"352":{"tf":2.0},"353":{"tf":1.4142135623730951},"355":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.7320508075688772},"360":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":2.8284271247461903},"369":{"tf":1.0},"375":{"tf":1.7320508075688772},"377":{"tf":2.449489742783178},"382":{"tf":1.0},"385":{"tf":1.4142135623730951},"389":{"tf":2.0},"399":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"408":{"tf":2.449489742783178},"41":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":2.23606797749979},"54":{"tf":3.3166247903554},"57":{"tf":2.23606797749979},"61":{"tf":3.3166247903554},"62":{"tf":3.605551275463989},"70":{"tf":2.23606797749979},"71":{"tf":1.4142135623730951},"72":{"tf":1.0},"79":{"tf":1.7320508075688772},"82":{"tf":1.4142135623730951},"87":{"tf":1.7320508075688772}},"e":{"5":{"1":{"0":{"5":{"b":{"5":{"2":{"df":0,"docs":{},"f":{"7":{"df":0,"docs":{},"e":{"8":{"d":{"3":{"d":{"9":{"5":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"d":{"df":0,"docs":{},"e":{"4":{"d":{"c":{"b":{"1":{"c":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"2":{"7":{"df":1,"docs":{"406":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"f":{"2":{"a":{"6":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"4":{"8":{"9":{"4":{"3":{"a":{"d":{"df":0,"docs":{},"e":{"3":{"df":0,"docs":{},"e":{"9":{"c":{"0":{"df":0,"docs":{},"e":{"b":{"2":{"3":{"d":{"6":{"9":{"df":0,"docs":{},"e":{"2":{"b":{"8":{"b":{"4":{"1":{"df":0,"docs":{},"f":{"0":{"5":{"7":{"df":0,"docs":{},"f":{"1":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":1,"docs":{"267":{"tf":1.0}}},"(":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"个":{"df":0,"docs":{},"程":{"df":0,"docs":{},"序":{"df":0,"docs":{},"中":{"df":0,"docs":{},"要":{"df":0,"docs":{},"计":{"df":0,"docs":{},"算":{"df":0,"docs":{},"的":{"df":0,"docs":{},"小":{"df":0,"docs":{},"时":{"df":0,"docs":{},"数":{"df":0,"docs":{},")":{"df":0,"docs":{},"的":{"df":0,"docs":{},"结":{"df":0,"docs":{},"果":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"50":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}}}},":":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"334":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"4":{".":{"0":{"df":1,"docs":{"173":{"tf":2.23606797749979}},",":{"df":0,"docs":{},"因":{"df":0,"docs":{},"为":{"df":0,"docs":{},"它":{"df":0,"docs":{},"i":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}},"3":{"df":1,"docs":{"53":{"tf":1.0}}},"4":{"5":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"4":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":5,"docs":{"401":{"tf":2.0},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}}},"df":5,"docs":{"401":{"tf":2.23606797749979},"402":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"df":4,"docs":{"402":{"tf":1.0},"62":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"2":{"\"":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{":":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":3,"docs":{"170":{"tf":1.4142135623730951},"320":{"tf":1.0},"53":{"tf":1.0}}},"4":{"df":0,"docs":{},"e":{"3":{"1":{"df":0,"docs":{},"f":{"9":{"df":0,"docs":{},"f":{"3":{"0":{"4":{"df":0,"docs":{},"e":{"0":{"c":{"d":{"9":{"a":{"c":{"df":0,"docs":{},"e":{"0":{"1":{"0":{"4":{"5":{"d":{"1":{"7":{"a":{"2":{"a":{"a":{"0":{"1":{"a":{"4":{"4":{"9":{"5":{"2":{"8":{"df":2,"docs":{"254":{"tf":1.0},"255":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":3,"docs":{"43":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"6":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}},"7":{"df":1,"docs":{"405":{"tf":1.0}}},"8":{"df":1,"docs":{"405":{"tf":1.0}}},"9":{"9":{"7":{"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"0":{"6":{"8":{"6":{"df":0,"docs":{},"f":{"a":{"8":{"df":0,"docs":{},"e":{"df":1,"docs":{"266":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"405":{"tf":1.0}}},"a":{"a":{"9":{"6":{"a":{"3":{"d":{"2":{"0":{"5":{"7":{"0":{"df":0,"docs":{},"f":{"8":{"6":{"8":{"b":{"d":{"2":{"0":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"e":{"3":{"df":0,"docs":{},"e":{"8":{"6":{"5":{"b":{"0":{"4":{"7":{"2":{"8":{"4":{"b":{"df":0,"docs":{},"e":{"3":{"0":{"df":1,"docs":{"169":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"8":{"d":{"1":{"3":{"c":{"5":{"2":{"c":{"5":{"1":{"df":0,"docs":{},"f":{"1":{"c":{"6":{"2":{"a":{"8":{"0":{"b":{"5":{"2":{"d":{"7":{"df":0,"docs":{},"f":{"b":{"d":{"7":{"c":{"c":{"0":{"b":{"6":{"3":{"a":{"d":{"a":{"4":{"3":{"df":1,"docs":{"431":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":73,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"108":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.0},"125":{"tf":1.0},"134":{"tf":2.449489742783178},"137":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.0},"156":{"tf":1.7320508075688772},"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"160":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"198":{"tf":2.23606797749979},"200":{"tf":2.449489742783178},"203":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"23":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":2.0},"246":{"tf":1.7320508075688772},"258":{"tf":2.23606797749979},"273":{"tf":1.4142135623730951},"285":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"298":{"tf":2.449489742783178},"299":{"tf":2.449489742783178},"316":{"tf":1.4142135623730951},"318":{"tf":2.449489742783178},"324":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"351":{"tf":1.4142135623730951},"358":{"tf":1.0},"360":{"tf":2.8284271247461903},"361":{"tf":2.6457513110645907},"368":{"tf":2.6457513110645907},"377":{"tf":2.6457513110645907},"400":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"414":{"tf":1.0},"417":{"tf":1.4142135623730951},"42":{"tf":1.7320508075688772},"427":{"tf":1.0},"49":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":2.0},"57":{"tf":1.0},"61":{"tf":2.449489742783178},"62":{"tf":2.8284271247461903},"68":{"tf":1.4142135623730951},"70":{"tf":4.0},"71":{"tf":1.4142135623730951},"72":{"tf":2.6457513110645907},"73":{"tf":2.23606797749979},"74":{"tf":1.7320508075688772},"77":{"tf":2.23606797749979},"78":{"tf":2.449489742783178},"79":{"tf":1.4142135623730951},"82":{"tf":1.0},"83":{"tf":1.0},"87":{"tf":1.4142135623730951}},"、":{"5":{"df":1,"docs":{"361":{"tf":1.4142135623730951}}},"df":0,"docs":{}},":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"1":{"df":1,"docs":{"70":{"tf":1.0}}},"df":0,"docs":{}}}},"5":{".":{"0":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"df":3,"docs":{"318":{"tf":1.0},"319":{"tf":1.0},"54":{"tf":1.7320508075688772}}},"5":{"7":{"df":0,"docs":{},"f":{"1":{"5":{"7":{"c":{"d":{"0":{"b":{"3":{"5":{"b":{"c":{"7":{"d":{"0":{"d":{"c":{"0":{"a":{"df":0,"docs":{},"f":{"6":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"6":{"2":{"2":{"df":0,"docs":{},"f":{"a":{"4":{"c":{"4":{"8":{"0":{"9":{"9":{"6":{"df":1,"docs":{"425":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"7":{"7":{"5":{"3":{"6":{"0":{"b":{"a":{"3":{"9":{"0":{"4":{"c":{"4":{"1":{"df":0,"docs":{},"e":{"8":{"4":{"1":{"7":{"6":{"3":{"3":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"7":{"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"e":{"7":{"d":{"6":{"1":{"7":{"7":{"c":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":20,"docs":{"104":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"148":{"tf":1.7320508075688772},"150":{"tf":1.7320508075688772},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"196":{"tf":1.0},"335":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0},"42":{"tf":1.7320508075688772},"62":{"tf":1.7320508075688772},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":2.449489742783178},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"2":{"df":1,"docs":{"407":{"tf":1.7320508075688772}},"f":{"a":{"df":0,"docs":{},"f":{"a":{"a":{"a":{"8":{"df":0,"docs":{},"e":{"4":{"3":{"2":{"df":0,"docs":{},"e":{"8":{"4":{"b":{"df":0,"docs":{},"e":{"a":{"a":{"df":0,"docs":{},"f":{"4":{"df":0,"docs":{},"e":{"a":{"8":{"0":{"c":{"c":{"b":{"a":{"8":{"8":{"0":{"6":{"2":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"d":{"df":1,"docs":{"284":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"4":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}},"6":{".":{"7":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"289":{"tf":1.0}}},"7":{"d":{"7":{"0":{"c":{"3":{"a":{"c":{"b":{"7":{"3":{"8":{"df":0,"docs":{},"f":{"4":{"d":{"df":1,"docs":{"202":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"135":{"tf":1.4142135623730951},"289":{"tf":1.0}},"u":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}},"8":{"df":2,"docs":{"289":{"tf":1.0},"42":{"tf":1.0}}},"9":{"df":1,"docs":{"43":{"tf":1.7320508075688772}}},"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"42":{"tf":1.0}}},"r":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"。":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"a":{"3":{"a":{"6":{"4":{"d":{"6":{"0":{"b":{"0":{"d":{"d":{"7":{"8":{"6":{"c":{"3":{"5":{"c":{"a":{"4":{"d":{"a":{"a":{"d":{"a":{"7":{"a":{"4":{"d":{"2":{"0":{"d":{"a":{"3":{"3":{"df":0,"docs":{},"e":{"5":{"df":4,"docs":{"270":{"tf":1.0},"271":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"f":{"6":{"9":{"0":{"9":{"c":{"5":{"7":{"b":{"3":{"b":{"a":{"5":{"5":{"df":0,"docs":{},"f":{"1":{"5":{"6":{"a":{"4":{"1":{"2":{"2":{"a":{"4":{"2":{"b":{"8":{"0":{"5":{"4":{"3":{"6":{"d":{"df":0,"docs":{},"e":{"9":{"0":{"c":{"df":2,"docs":{"395":{"tf":1.0},"396":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":100,"docs":{"102":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"105":{"tf":2.0},"106":{"tf":1.0},"116":{"tf":2.0},"134":{"tf":2.8284271247461903},"156":{"tf":1.0},"158":{"tf":2.0},"162":{"tf":1.0},"172":{"tf":1.7320508075688772},"173":{"tf":2.449489742783178},"175":{"tf":2.23606797749979},"176":{"tf":1.0},"185":{"tf":2.449489742783178},"188":{"tf":1.0},"199":{"tf":3.1622776601683795},"200":{"tf":1.7320508075688772},"206":{"tf":1.7320508075688772},"207":{"tf":1.0},"221":{"tf":1.4142135623730951},"229":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":2.0},"243":{"tf":1.0},"257":{"tf":1.7320508075688772},"258":{"tf":1.7320508075688772},"272":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.7320508075688772},"278":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"285":{"tf":2.23606797749979},"289":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"294":{"tf":2.6457513110645907},"298":{"tf":2.0},"299":{"tf":1.7320508075688772},"306":{"tf":1.0},"316":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772},"324":{"tf":2.0},"334":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951},"336":{"tf":1.0},"34":{"tf":2.0},"347":{"tf":1.0},"351":{"tf":2.23606797749979},"352":{"tf":2.0},"353":{"tf":2.0},"356":{"tf":1.4142135623730951},"358":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"361":{"tf":2.23606797749979},"362":{"tf":1.4142135623730951},"367":{"tf":1.4142135623730951},"368":{"tf":2.6457513110645907},"37":{"tf":1.4142135623730951},"374":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.4142135623730951},"385":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"49":{"tf":2.449489742783178},"51":{"tf":1.4142135623730951},"53":{"tf":1.7320508075688772},"54":{"tf":3.0},"56":{"tf":2.0},"57":{"tf":1.0},"58":{"tf":2.6457513110645907},"61":{"tf":2.6457513110645907},"62":{"tf":2.0},"70":{"tf":2.23606797749979},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":2.0},"77":{"tf":2.23606797749979},"78":{"tf":1.0},"79":{"tf":1.4142135623730951},"82":{"tf":2.8284271247461903},"83":{"tf":2.0},"84":{"tf":2.449489742783178},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"91":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":2.449489742783178},"97":{"tf":2.0}},"f":{"6":{"7":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"4":{"2":{"3":{"4":{"5":{"b":{"a":{"4":{"4":{"df":0,"docs":{},"f":{"6":{"df":0,"docs":{},"f":{"0":{"8":{"a":{"2":{"2":{"c":{"2":{"1":{"9":{"2":{"1":{"6":{"5":{"df":0,"docs":{},"f":{"4":{"b":{"0":{"df":0,"docs":{},"e":{"9":{"3":{"0":{"df":1,"docs":{"184":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"h":{"df":1,"docs":{"56":{"tf":1.0}}},"。":{"df":0,"docs":{},"i":{"df":1,"docs":{"277":{"tf":1.0}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}}}}},",":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"199":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"6":{".":{"4":{"4":{"df":1,"docs":{"38":{"tf":1.0}}},"df":1,"docs":{"54":{"tf":2.0}}},"5":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":6,"docs":{"328":{"tf":1.0},"43":{"tf":1.4142135623730951},"50":{"tf":2.0},"91":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"1":{"df":1,"docs":{"45":{"tf":1.7320508075688772}}},"2":{"d":{"4":{"4":{"1":{"0":{"6":{"0":{"d":{"6":{"6":{"df":0,"docs":{},"f":{"9":{"a":{"1":{"c":{"3":{"d":{"3":{"c":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"4":{"0":{"df":0,"docs":{},"f":{"8":{"1":{"7":{"d":{"1":{"a":{"a":{"df":1,"docs":{"317":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"df":1,"docs":{"53":{"tf":2.0}},"}":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"4":{"d":{"8":{"9":{"0":{"2":{"d":{"3":{"8":{"0":{"d":{"b":{"b":{"8":{"d":{"d":{"9":{"4":{"df":0,"docs":{},"e":{"d":{"2":{"df":0,"docs":{},"e":{"5":{"4":{"8":{"d":{"df":0,"docs":{},"f":{"c":{"0":{"a":{"a":{"8":{"0":{"c":{"0":{"7":{"c":{"b":{"df":1,"docs":{"209":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{",":{"2":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"4":{"c":{"4":{"5":{"6":{"1":{"df":0,"docs":{},"e":{"4":{"8":{"9":{"4":{"2":{"df":1,"docs":{"199":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"275":{"tf":1.0}}},"6":{"8":{"c":{"6":{"4":{"7":{"6":{"0":{"b":{"5":{"c":{"7":{"df":0,"docs":{},"e":{"a":{"6":{"5":{"4":{"df":0,"docs":{},"f":{"a":{"c":{"b":{"4":{"b":{"a":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"a":{"d":{"d":{"df":0,"docs":{},"f":{"d":{"a":{"2":{"7":{"c":{"c":{"df":1,"docs":{"138":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"9":{"a":{"d":{"c":{"6":{"df":0,"docs":{},"f":{"5":{"c":{"b":{"7":{"6":{"df":0,"docs":{},"f":{"6":{"df":0,"docs":{},"e":{"9":{"d":{"5":{"6":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"a":{"5":{"7":{"d":{"8":{"a":{"8":{"4":{"4":{"a":{"c":{"0":{"7":{"a":{"8":{"8":{"df":1,"docs":{"157":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":53,"docs":{"101":{"tf":2.449489742783178},"103":{"tf":2.23606797749979},"104":{"tf":1.4142135623730951},"105":{"tf":2.0},"108":{"tf":2.449489742783178},"116":{"tf":1.7320508075688772},"134":{"tf":2.0},"135":{"tf":1.0},"156":{"tf":1.0},"160":{"tf":1.4142135623730951},"161":{"tf":2.0},"162":{"tf":1.7320508075688772},"173":{"tf":1.0},"175":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"199":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"245":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.4142135623730951},"274":{"tf":1.0},"277":{"tf":1.7320508075688772},"278":{"tf":1.7320508075688772},"298":{"tf":1.4142135623730951},"299":{"tf":2.23606797749979},"300":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":2.0},"324":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"347":{"tf":1.0},"352":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"361":{"tf":2.8284271247461903},"368":{"tf":2.6457513110645907},"38":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"430":{"tf":1.4142135623730951},"434":{"tf":2.6457513110645907},"45":{"tf":1.4142135623730951},"49":{"tf":2.0},"51":{"tf":1.7320508075688772},"57":{"tf":3.4641016151377544},"58":{"tf":1.0},"61":{"tf":1.7320508075688772},"73":{"tf":1.7320508075688772},"74":{"tf":1.7320508075688772},"78":{"tf":1.0},"84":{"tf":1.4142135623730951}},"e":{"2":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"7":{"c":{"0":{"df":0,"docs":{},"f":{"0":{"8":{"5":{"9":{"8":{"9":{"c":{"c":{"4":{"9":{"8":{"c":{"df":0,"docs":{},"e":{"c":{"1":{"3":{"9":{"df":0,"docs":{},"e":{"7":{"1":{"7":{"df":0,"docs":{},"e":{"2":{"a":{"df":0,"docs":{},"f":{"1":{"7":{"2":{"c":{"b":{"7":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"f":{"1":{"7":{"d":{"2":{"2":{"b":{"b":{"a":{"1":{"5":{"0":{"0":{"1":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"6":{"6":{"1":{"a":{"0":{"9":{"3":{"8":{"a":{"a":{"0":{"d":{"a":{"0":{"6":{"5":{"2":{"6":{"df":0,"docs":{},"e":{"7":{"b":{"8":{"df":0,"docs":{},"f":{"9":{"8":{"df":0,"docs":{},"f":{"d":{"7":{"df":0,"docs":{},"e":{"6":{"7":{"a":{"2":{"2":{"2":{"df":0,"docs":{},"f":{"df":2,"docs":{"345":{"tf":1.0},"354":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"73":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}},";":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.0}}}}}}}},"7":{"0":{"4":{"c":{"5":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"c":{"2":{"df":0,"docs":{},"f":{"2":{"6":{"a":{"0":{"1":{"3":{"3":{"a":{"df":0,"docs":{},"e":{"1":{"7":{"a":{"2":{"c":{"0":{"1":{"9":{"8":{"6":{"5":{"9":{"0":{"c":{"0":{"5":{"a":{"0":{"4":{"5":{"df":2,"docs":{"264":{"tf":1.0},"267":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"407":{"tf":1.4142135623730951}}},"5":{"4":{"df":1,"docs":{"53":{"tf":1.0}}},"df":4,"docs":{"289":{"tf":2.23606797749979},"290":{"tf":1.0},"322":{"tf":1.7320508075688772},"335":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"6":{"5":{"3":{"1":{"8":{"b":{"8":{"4":{"4":{"5":{"6":{"9":{"a":{"6":{"4":{"2":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"7":{"b":{"df":0,"docs":{},"f":{"1":{"a":{"d":{"a":{"b":{"9":{"6":{"3":{"9":{"c":{"b":{"df":0,"docs":{},"f":{"6":{"a":{"df":0,"docs":{},"f":{"3":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"8":{"7":{"8":{"df":1,"docs":{"397":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"7":{"7":{"4":{"0":{"a":{"5":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"1":{"4":{"5":{"8":{"d":{"7":{"4":{"df":0,"docs":{},"f":{"1":{"d":{"a":{"df":0,"docs":{},"f":{"8":{"5":{"df":0,"docs":{},"f":{"d":{"4":{"9":{"df":0,"docs":{},"e":{"0":{"3":{"a":{"a":{"a":{"9":{"7":{"c":{"df":0,"docs":{},"f":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":52,"docs":{"107":{"tf":2.23606797749979},"114":{"tf":2.449489742783178},"115":{"tf":2.6457513110645907},"116":{"tf":3.4641016151377544},"118":{"tf":1.4142135623730951},"119":{"tf":2.0},"120":{"tf":2.6457513110645907},"121":{"tf":3.3166247903554},"122":{"tf":2.23606797749979},"123":{"tf":1.7320508075688772},"125":{"tf":2.6457513110645907},"127":{"tf":2.449489742783178},"134":{"tf":1.0},"135":{"tf":1.7320508075688772},"156":{"tf":1.0},"161":{"tf":2.23606797749979},"162":{"tf":1.0},"173":{"tf":1.7320508075688772},"185":{"tf":1.4142135623730951},"188":{"tf":1.0},"199":{"tf":2.449489742783178},"200":{"tf":1.4142135623730951},"211":{"tf":1.0},"223":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0},"242":{"tf":2.449489742783178},"266":{"tf":1.4142135623730951},"278":{"tf":1.7320508075688772},"279":{"tf":1.0},"298":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"300":{"tf":1.4142135623730951},"318":{"tf":2.0},"324":{"tf":1.4142135623730951},"331":{"tf":1.0},"335":{"tf":1.4142135623730951},"352":{"tf":1.4142135623730951},"359":{"tf":2.0},"368":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.0},"417":{"tf":1.4142135623730951},"58":{"tf":1.0},"59":{"tf":1.4142135623730951},"61":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"78":{"tf":1.7320508075688772},"84":{"tf":1.7320508075688772}},":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"8":{".":{"0":{"df":1,"docs":{"428":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{"df":2,"docs":{"289":{"tf":1.0},"397":{"tf":1.4142135623730951}}},"2":{"df":0,"docs":{},"e":{"7":{"7":{"9":{"9":{"c":{"1":{"b":{"c":{"6":{"2":{"2":{"9":{"8":{"df":1,"docs":{"211":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"3":{"7":{"8":{"8":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"2":{"1":{"2":{"a":{"3":{"2":{"8":{"1":{"3":{"2":{"8":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"f":{"8":{"df":0,"docs":{},"f":{"2":{"2":{"3":{"c":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"0":{"df":0,"docs":{},"f":{"6":{"9":{"2":{"2":{"0":{"b":{"9":{"7":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"41":{"tf":1.0}}},"5":{"6":{"d":{"8":{"9":{"c":{"5":{"3":{"a":{"6":{"d":{"6":{"9":{"4":{"7":{"0":{"b":{"b":{"5":{"6":{"6":{"9":{"c":{"7":{"7":{"3":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"6":{"a":{"a":{"b":{"6":{"df":0,"docs":{},"f":{"c":{"c":{"9":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"1":{"2":{"c":{"4":{"a":{"5":{"8":{"0":{"1":{"b":{"6":{"1":{"df":0,"docs":{},"f":{"8":{"d":{"2":{"df":0,"docs":{},"e":{"9":{"5":{"2":{"df":0,"docs":{},"f":{"8":{"b":{"b":{"b":{"b":{"4":{"4":{"4":{"6":{"9":{"2":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"df":0,"docs":{},"e":{"c":{"2":{"df":2,"docs":{"81":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}},"a":{"df":0,"docs":{},"e":{"c":{"a":{"df":0,"docs":{},"e":{"3":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"5":{"c":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"9":{"df":0,"docs":{},"f":{"0":{"5":{"5":{"b":{"7":{"0":{"df":0,"docs":{},"f":{"0":{"5":{"d":{"9":{"a":{"3":{"df":0,"docs":{},"f":{"9":{"9":{"0":{"b":{"c":{"df":0,"docs":{},"e":{"7":{"b":{"df":1,"docs":{"297":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"f":{"0":{"4":{"9":{"6":{"b":{"b":{"8":{"df":0,"docs":{},"e":{"5":{"6":{"b":{"6":{"8":{"3":{"df":0,"docs":{},"e":{"a":{"3":{"df":0,"docs":{},"f":{"0":{"1":{"5":{"8":{"7":{"1":{"c":{"8":{"6":{"3":{"1":{"6":{"8":{"4":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"4":{"df":1,"docs":{"430":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":60,"docs":{"118":{"tf":1.4142135623730951},"132":{"tf":2.23606797749979},"133":{"tf":1.4142135623730951},"134":{"tf":2.8284271247461903},"135":{"tf":3.1622776601683795},"136":{"tf":1.4142135623730951},"137":{"tf":1.4142135623730951},"138":{"tf":1.0},"139":{"tf":1.7320508075688772},"140":{"tf":3.0},"141":{"tf":3.1622776601683795},"142":{"tf":2.8284271247461903},"145":{"tf":1.7320508075688772},"147":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"149":{"tf":1.4142135623730951},"150":{"tf":2.6457513110645907},"152":{"tf":1.0},"161":{"tf":1.4142135623730951},"170":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"185":{"tf":1.0},"188":{"tf":1.0},"199":{"tf":2.8284271247461903},"202":{"tf":1.7320508075688772},"206":{"tf":1.7320508075688772},"224":{"tf":1.7320508075688772},"242":{"tf":1.4142135623730951},"270":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.0},"298":{"tf":1.4142135623730951},"299":{"tf":1.0},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"318":{"tf":2.0},"320":{"tf":1.0},"324":{"tf":1.4142135623730951},"333":{"tf":1.0},"335":{"tf":1.4142135623730951},"34":{"tf":1.0},"340":{"tf":1.4142135623730951},"353":{"tf":1.7320508075688772},"360":{"tf":2.23606797749979},"368":{"tf":1.4142135623730951},"398":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"417":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"58":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.4142135623730951},"78":{"tf":2.0},"88":{"tf":1.4142135623730951}},"f":{"d":{"2":{"3":{"2":{"7":{"df":0,"docs":{},"e":{"4":{"1":{"3":{"5":{"8":{"7":{"6":{"b":{"3":{"6":{"8":{"c":{"c":{"2":{"7":{"9":{"3":{"df":0,"docs":{},"e":{"b":{"4":{"a":{"7":{"df":0,"docs":{},"e":{"4":{"5":{"5":{"b":{"6":{"9":{"1":{"df":0,"docs":{},"f":{"0":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"、":{"1":{"6":{"df":1,"docs":{"360":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"9":{"0":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"1":{"5":{",":{"7":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"9":{"4":{"8":{"b":{"6":{"5":{"df":0,"docs":{},"e":{"8":{"8":{"9":{"6":{"0":{"b":{"4":{"df":5,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"f":{"b":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"f":{"8":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"9":{"a":{"8":{"1":{"4":{"c":{"df":0,"docs":{},"e":{"a":{"0":{"a":{"5":{"8":{"df":0,"docs":{},"e":{"9":{"c":{"0":{"1":{"9":{"c":{"5":{"2":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"4":{"a":{"df":1,"docs":{"177":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"3":{"7":{"7":{"8":{"4":{"b":{"8":{"7":{"0":{"8":{"c":{"2":{"4":{"3":{"1":{"4":{"7":{"0":{"7":{"3":{"7":{"8":{"a":{"d":{"4":{"2":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"e":{"b":{"1":{"2":{"a":{"3":{"3":{"4":{"b":{"b":{"d":{"df":1,"docs":{"337":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"5":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"9":{"3":{"1":{"1":{"7":{"0":{"4":{"0":{"4":{"c":{"b":{"9":{"8":{"d":{"4":{"7":{"6":{"b":{"1":{"9":{"0":{"1":{"7":{"c":{"b":{"b":{"d":{"b":{"c":{"0":{"0":{"d":{"0":{"8":{"3":{"4":{"d":{"df":3,"docs":{"373":{"tf":1.0},"379":{"tf":1.0},"387":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"6":{"d":{"4":{"b":{"0":{"df":0,"docs":{},"e":{"c":{"1":{"c":{"5":{"df":0,"docs":{},"e":{"0":{"1":{"9":{"b":{"8":{"5":{"6":{"0":{"4":{"c":{"3":{"3":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"6":{"8":{"b":{"3":{"df":0,"docs":{},"e":{"2":{"6":{"6":{"9":{"d":{"4":{"0":{"df":1,"docs":{"333":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"_":{"2":{"2":{"2":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"6":{"2":{"2":{"5":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"b":{"8":{"2":{"5":{"5":{"3":{"4":{"9":{"df":0,"docs":{},"e":{"c":{"0":{"d":{"c":{"2":{"3":{"5":{"4":{"3":{"3":{"5":{"3":{"0":{"df":0,"docs":{},"e":{"d":{"3":{"df":0,"docs":{},"f":{"b":{"5":{"3":{"4":{"df":1,"docs":{"403":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"df":2,"docs":{"156":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951}},"。":{"df":0,"docs":{},"下":{"df":0,"docs":{},"面":{"df":0,"docs":{},"的":{"df":0,"docs":{},"说":{"df":0,"docs":{},"明":{"df":0,"docs":{},"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"156":{"tf":1.0}}}}}}}}}}}}}},"c":{"0":{"df":0,"docs":{},"f":{"a":{"2":{"7":{"1":{"4":{"8":{"5":{"9":{"7":{"3":{"8":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"7":{"3":{"c":{"b":{"b":{"b":{"8":{"2":{"9":{"5":{"9":{"2":{"df":0,"docs":{},"e":{"4":{"c":{"0":{"3":{"7":{"d":{"7":{"df":0,"docs":{},"e":{"4":{"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"d":{"2":{"0":{"0":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"a":{"c":{"0":{"df":0,"docs":{},"f":{"c":{"9":{"4":{"df":3,"docs":{"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"9":{"4":{"3":{"5":{"5":{"6":{"a":{"6":{"0":{"0":{"1":{"b":{"8":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":44,"docs":{"107":{"tf":1.7320508075688772},"115":{"tf":1.0},"116":{"tf":1.0},"119":{"tf":1.4142135623730951},"136":{"tf":1.4142135623730951},"156":{"tf":2.449489742783178},"157":{"tf":2.23606797749979},"158":{"tf":2.449489742783178},"159":{"tf":1.0},"160":{"tf":1.7320508075688772},"161":{"tf":3.872983346207417},"162":{"tf":3.0},"167":{"tf":1.4142135623730951},"174":{"tf":1.0},"175":{"tf":1.7320508075688772},"185":{"tf":1.0},"186":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"224":{"tf":2.449489742783178},"225":{"tf":1.0},"242":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"285":{"tf":1.0},"298":{"tf":1.7320508075688772},"301":{"tf":2.0},"306":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951},"319":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":1.4142135623730951},"333":{"tf":1.0},"335":{"tf":1.4142135623730951},"336":{"tf":1.0},"353":{"tf":1.4142135623730951},"369":{"tf":1.4142135623730951},"402":{"tf":1.7320508075688772},"404":{"tf":1.4142135623730951},"405":{"tf":1.0},"417":{"tf":1.4142135623730951},"62":{"tf":2.0},"78":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}},"e":{"8":{"5":{"df":0,"docs":{},"f":{"c":{"c":{"9":{"9":{"3":{"8":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"f":{"8":{"c":{"9":{"3":{"5":{"d":{"0":{"a":{"d":{"8":{"b":{"4":{"d":{"b":{"7":{"df":0,"docs":{},"f":{"4":{"5":{"c":{"a":{"a":{"a":{"2":{"c":{"a":{"4":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"创":{"df":0,"docs":{},"建":{"df":0,"docs":{},"一":{"df":0,"docs":{},"个":{"df":0,"docs":{},"异":{"df":0,"docs":{},"步":{"df":0,"docs":{},"信":{"df":0,"docs":{},"道":{"df":0,"docs":{},"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"319":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}},"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"df":1,"docs":{"320":{"tf":1.0}}},"df":1,"docs":{"320":{"tf":1.0}},"|":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"306":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"306":{"tf":1.0},"320":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":27,"docs":{"107":{"tf":2.449489742783178},"108":{"tf":2.0},"142":{"tf":1.0},"225":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"306":{"tf":2.23606797749979},"316":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.0},"347":{"tf":1.4142135623730951},"348":{"tf":1.0},"351":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.4142135623730951},"359":{"tf":1.0},"36":{"tf":1.4142135623730951},"360":{"tf":4.0},"361":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":2.0},"408":{"tf":1.4142135623730951},"417":{"tf":1.0},"45":{"tf":1.0},"52":{"tf":1.4142135623730951},"53":{"tf":1.0}},"i":{"df":1,"docs":{"427":{"tf":2.0}}},"s":{"df":1,"docs":{"360":{"tf":1.0}}},"x":{"df":1,"docs":{"360":{"tf":1.7320508075688772}}}},"a":{"'":{".":{".":{"=":{"'":{"df":0,"docs":{},"j":{"df":1,"docs":{"358":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"285":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"2":{"c":{"b":{"7":{"2":{"d":{"3":{"a":{"d":{"7":{"5":{"8":{"4":{"c":{"c":{"1":{"a":{"df":0,"docs":{},"e":{"3":{"b":{"8":{"5":{"df":0,"docs":{},"f":{"7":{"1":{"5":{"c":{"8":{"7":{"7":{"8":{"7":{"2":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"3":{"a":{"b":{"df":1,"docs":{"238":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"7":{"1":{"df":0,"docs":{},"f":{"8":{"2":{"b":{"0":{"9":{"1":{"6":{"c":{"df":0,"docs":{},"f":{"2":{"1":{"d":{"df":0,"docs":{},"e":{"2":{"d":{"5":{"6":{"b":{"d":{"3":{"8":{"6":{"c":{"a":{"5":{"d":{"7":{"2":{"df":0,"docs":{},"f":{"7":{"6":{"9":{"9":{"b":{"0":{"df":1,"docs":{"82":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"314":{"tf":1.0}}},"5":{"df":0,"docs":{},"e":{"0":{"c":{"5":{"b":{"2":{"c":{"5":{"df":0,"docs":{},"f":{"9":{"0":{"5":{"4":{"b":{"df":0,"docs":{},"e":{"3":{"b":{"9":{"6":{"1":{"a":{"df":0,"docs":{},"e":{"a":{"2":{"c":{"7":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"a":{"5":{"9":{"1":{"d":{"df":0,"docs":{},"e":{"8":{"df":1,"docs":{"64":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"8":{"5":{"3":{"6":{"1":{"8":{"9":{"d":{"5":{"df":0,"docs":{},"f":{"1":{"b":{"a":{"2":{"df":0,"docs":{},"f":{"0":{"b":{"1":{"1":{"8":{"7":{"b":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"e":{"7":{"8":{"7":{"c":{"0":{"d":{"8":{"9":{"df":0,"docs":{},"e":{"2":{"8":{"7":{"1":{"c":{"df":1,"docs":{"364":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"0":{"df":1,"docs":{"54":{"tf":1.0}}},"1":{".":{".":{"3":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"54":{"tf":1.0},"62":{"tf":1.0}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"72":{"tf":1.7320508075688772}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"353":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"b":{"c":{"a":{"b":{"c":{"a":{"b":{"c":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":1,"docs":{"186":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"df":0,"docs":{},"k":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"v":{"df":0,"docs":{},"w":{"df":0,"docs":{},"x":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"0":{"1":{"2":{"3":{"4":{"5":{"df":1,"docs":{"259":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"368":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"368":{"tf":2.23606797749979}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"155":{"tf":1.7320508075688772}}}}},"s":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"102":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"115":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"252":{"tf":1.0},"413":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"1":{"6":{"1":{"8":{"4":{"a":{"7":{"df":0,"docs":{},"f":{"5":{"6":{"d":{"1":{"7":{"d":{"a":{"a":{"9":{"c":{"4":{"c":{"7":{"6":{"9":{"0":{"1":{"3":{"7":{"1":{"0":{"8":{"5":{"d":{"c":{"0":{"a":{"c":{"4":{"3":{"df":1,"docs":{"131":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":5,"docs":{"162":{"tf":1.0},"214":{"tf":1.0},"242":{"tf":1.0},"398":{"tf":1.7320508075688772},"70":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"258":{"tf":2.0},"368":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":4,"docs":{"82":{"tf":2.8284271247461903},"83":{"tf":1.4142135623730951},"84":{"tf":2.8284271247461903},"87":{"tf":2.0}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"300":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"200":{"tf":1.0},"335":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"245":{"tf":1.0},"246":{"tf":1.0}}}}}}},"d":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"2":{"df":4,"docs":{"198":{"tf":1.7320508075688772},"203":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":4,"docs":{"198":{"tf":1.7320508075688772},"203":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"141":{"tf":1.0},"375":{"tf":1.7320508075688772}}}}}}},"/":{"a":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"265":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"265":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"<":{"&":{"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"375":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"h":{"df":1,"docs":{"102":{"tf":1.0}},"s":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"375":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"107":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"257":{"tf":2.6457513110645907},"265":{"tf":1.0},"266":{"tf":5.744562646538029},"385":{"tf":1.7320508075688772}},"e":{"(":{"2":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{},"x":{"df":3,"docs":{"257":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"385":{"tf":1.0}}}},"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":2.0}},"s":{":":{"1":{":":{"5":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"266":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"1":{"df":1,"docs":{"240":{"tf":1.0}}},"2":{"df":1,"docs":{"240":{"tf":1.0}}},"3":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"4":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":3,"docs":{"339":{"tf":2.23606797749979},"340":{"tf":1.0},"343":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"3":{"df":1,"docs":{"369":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"369":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"114":{"tf":1.4142135623730951},"115":{"tf":3.605551275463989},"116":{"tf":3.7416573867739413},"120":{"tf":2.23606797749979},"121":{"tf":2.23606797749979},"123":{"tf":1.4142135623730951},"127":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"(":{"1":{"0":{"0":{"df":1,"docs":{"207":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":3,"docs":{"200":{"tf":2.0},"207":{"tf":1.0},"211":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"207":{"tf":1.0}}},"a":{"df":3,"docs":{"200":{"tf":1.4142135623730951},"207":{"tf":1.0},"210":{"tf":1.0}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":5,"docs":{"196":{"tf":1.4142135623730951},"200":{"tf":1.7320508075688772},"207":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":15,"docs":{"102":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"152":{"tf":1.0},"207":{"tf":2.0},"257":{"tf":1.4142135623730951},"265":{"tf":2.23606797749979},"266":{"tf":2.23606797749979},"316":{"tf":1.7320508075688772},"331":{"tf":1.0},"368":{"tf":1.7320508075688772},"375":{"tf":4.0},"416":{"tf":1.0},"426":{"tf":1.0},"428":{"tf":1.0},"91":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":2.0}},"s":{":":{"2":{":":{"5":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":8,"docs":{"198":{"tf":3.3166247903554},"200":{"tf":1.7320508075688772},"207":{"tf":2.0},"208":{"tf":2.0},"210":{"tf":1.0},"211":{"tf":3.0},"265":{"tf":2.8284271247461903},"266":{"tf":4.0}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"101":{"tf":2.23606797749979},"165":{"tf":1.0},"367":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951}}}}}},"、":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"331":{"tf":2.0}}}}}}}}},"df":3,"docs":{"106":{"tf":1.0},"162":{"tf":1.0},"241":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"364":{"tf":1.0},"373":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"180":{"tf":1.0},"182":{"tf":1.0},"273":{"tf":1.0},"62":{"tf":2.23606797749979}}}}},"df":1,"docs":{"348":{"tf":3.0}},"e":{"=":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"180":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"179":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"178":{"tf":1.0},"179":{"tf":2.8284271247461903}}}}}},"o":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"b":{"a":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":1,"docs":{"328":{"tf":1.0}}},"s":{"df":0,"docs":{},"k":{"a":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"183":{"tf":1.0},"381":{"tf":1.0}},"s":{"df":1,"docs":{"379":{"tf":1.0}}}},"df":0,"docs":{},"v":{"df":1,"docs":{"398":{"tf":1.0}}}},"l":{"df":0,"docs":{},"o":{"c":{":":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{":":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"t":{",":{"a":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"66":{"tf":1.0},"70":{"tf":1.4142135623730951}}},"df":0,"docs":{},"w":{"df":2,"docs":{"283":{"tf":1.0},"316":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"191":{"tf":1.0},"290":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"386":{"tf":1.0},"431":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"353":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"86":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"152":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":3,"docs":{"20":{"tf":1.0},"4":{"tf":1.0},"429":{"tf":2.23606797749979}}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"203":{"tf":1.0},"208":{"tf":1.0}}},"df":0,"docs":{}}}},"df":2,"docs":{"203":{"tf":1.0},"208":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"213":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{":":{":":{"b":{"a":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},">":{":":{":":{"b":{"a":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"376":{"tf":4.242640687119285}}}},"n":{"df":1,"docs":{"194":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"52":{"tf":1.0},"53":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"192":{"tf":2.23606797749979}},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"。":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"194":{"tf":1.0}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"162":{"tf":1.0},"198":{"tf":2.0},"362":{"tf":1.0},"55":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"55":{"tf":2.449489742783178},"56":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"5":{"df":1,"docs":{"56":{"tf":1.0}}},"df":0,"docs":{},"x":{"df":1,"docs":{"56":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"142":{"tf":1.7320508075688772},"257":{"tf":2.0},"385":{"tf":2.0}}}}}}},"p":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"260":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":45,"docs":{"109":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.4142135623730951},"123":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"146":{"tf":1.0},"150":{"tf":1.4142135623730951},"152":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"198":{"tf":1.0},"212":{"tf":1.0},"226":{"tf":1.0},"245":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":2.6457513110645907},"259":{"tf":2.0},"261":{"tf":1.0},"270":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"299":{"tf":1.0},"306":{"tf":1.7320508075688772},"307":{"tf":1.0},"313":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.4142135623730951},"318":{"tf":1.7320508075688772},"319":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":2.0},"337":{"tf":1.0},"366":{"tf":1.0},"374":{"tf":1.0},"380":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"408":{"tf":1.0},"78":{"tf":1.7320508075688772},"93":{"tf":1.0}},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"297":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":8,"docs":{"410":{"tf":1.0},"411":{"tf":1.0},"415":{"tf":1.0},"418":{"tf":1.0},"425":{"tf":1.0},"430":{"tf":1.0},"431":{"tf":1.0},"432":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}},"l":{"df":2,"docs":{"152":{"tf":1.0},"34":{"tf":1.7320508075688772}},"i":{"c":{"df":6,"docs":{"111":{"tf":1.0},"214":{"tf":1.0},"265":{"tf":1.0},"368":{"tf":1.0},"392":{"tf":1.0},"397":{"tf":1.0}}},"df":1,"docs":{"172":{"tf":1.0}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"342":{"tf":2.6457513110645907},"343":{"tf":2.8284271247461903}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"342":{"tf":3.4641016151377544},"343":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"428":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"306":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"0":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{">":{">":{"df":0,"docs":{},"。":{"a":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"t":{"df":4,"docs":{"306":{"tf":2.23606797749979},"307":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0}}}},"df":3,"docs":{"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"h":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"93":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"89":{"tf":1.0}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"89":{"tf":1.0}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"1":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":1,"docs":{"88":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":6,"docs":{"428":{"tf":1.4142135623730951},"88":{"tf":2.449489742783178},"89":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"93":{"tf":2.8284271247461903}}},"df":0,"docs":{}},"g":{"df":16,"docs":{"215":{"tf":2.0},"216":{"tf":2.0},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":2.0},"223":{"tf":1.0},"224":{"tf":2.449489742783178},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":3.605551275463989},"250":{"tf":1.7320508075688772},"257":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":9,"docs":{"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"249":{"tf":1.7320508075688772},"250":{"tf":1.7320508075688772}}}}}}},"[":{"0":{"df":1,"docs":{"217":{"tf":1.0}}},"1":{"]":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"2":{"]":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"224":{"tf":2.8284271247461903},"225":{"tf":2.449489742783178},"226":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"234":{"tf":1.4142135623730951},"235":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"249":{"tf":2.0},"250":{"tf":1.0},"299":{"tf":1.0},"42":{"tf":1.0},"56":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"214":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":4,"docs":{"106":{"tf":1.0},"376":{"tf":2.23606797749979},"42":{"tf":1.0},"61":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{":":{":":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":3.7416573867739413}},"i":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"180":{"tf":1.7320508075688772}},"e":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"180":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}}},"s":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":2,"docs":{"399":{"tf":1.0},"77":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":5,"docs":{"145":{"tf":1.0},"358":{"tf":1.7320508075688772},"417":{"tf":1.0},"53":{"tf":1.0},"78":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":1,"docs":{"401":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"113":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"!":{"(":{"!":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"#":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"414":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":3,"docs":{"405":{"tf":3.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"203":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"、":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"201":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"!":{"(":{"\"":{"df":0,"docs":{},"i":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}},"*":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951}}}}}}}}},"0":{"df":1,"docs":{"359":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"266":{"tf":1.0}}},"5":{"df":4,"docs":{"277":{"tf":2.0},"278":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"280":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"359":{"tf":1.4142135623730951}}},"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"(":{"2":{"df":1,"docs":{"200":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"368":{"tf":1.0}}},"b":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}},"e":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"162":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{")":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"289":{"tf":1.0},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"289":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":6,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"245":{"tf":1.0}}}}},"v":{"1":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"246":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"!":{"[":{"\"":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":18,"docs":{"162":{"tf":1.0},"198":{"tf":1.0},"200":{"tf":2.8284271247461903},"201":{"tf":1.0},"203":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":2.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0},"257":{"tf":1.0},"277":{"tf":1.0},"280":{"tf":1.0},"337":{"tf":1.4142135623730951},"343":{"tf":1.4142135623730951},"375":{"tf":1.0},"419":{"tf":1.0},"420":{"tf":1.0}}}},"n":{"df":2,"docs":{"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951}}}},"df":6,"docs":{"199":{"tf":3.0},"200":{"tf":2.23606797749979},"201":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"228":{"tf":1.0},"405":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"49":{"tf":2.0},"57":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":7,"docs":{"244":{"tf":1.0},"34":{"tf":1.0},"374":{"tf":1.0},"376":{"tf":1.4142135623730951},"377":{"tf":1.0},"405":{"tf":1.4142135623730951},"96":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{".":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":1,"docs":{"391":{"tf":1.4142135623730951}}},"y":{"df":0,"docs":{},"n":{"c":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"317":{"tf":1.0}}},"df":0,"docs":{}}},"df":15,"docs":{"10":{"tf":1.0},"313":{"tf":1.7320508075688772},"314":{"tf":1.4142135623730951},"315":{"tf":3.3166247903554},"316":{"tf":5.656854249492381},"317":{"tf":1.0},"318":{"tf":1.4142135623730951},"319":{"tf":3.3166247903554},"320":{"tf":5.744562646538029},"321":{"tf":1.4142135623730951},"322":{"tf":2.8284271247461903},"323":{"tf":2.6457513110645907},"326":{"tf":1.0},"405":{"tf":1.4142135623730951},"412":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":2,"docs":{"337":{"tf":1.4142135623730951},"343":{"tf":2.0}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"306":{"tf":1.7320508075688772}},"i":{"c":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"198":{"tf":1.0},"387":{"tf":1.0},"91":{"tf":1.0}}}}},"df":0,"docs":{}}}},")":{"df":0,"docs":{},"一":{"df":0,"docs":{},"些":{"df":0,"docs":{},"其":{"df":0,"docs":{},"他":{"df":0,"docs":{},"数":{"df":0,"docs":{},"据":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"270":{"tf":1.0}}}}}}}}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"180":{"tf":1.4142135623730951},"376":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":3.4641016151377544}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"331":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":3.1622776601683795}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}}},"df":13,"docs":{"10":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0},"315":{"tf":2.0},"316":{"tf":3.3166247903554},"318":{"tf":3.3166247903554},"319":{"tf":3.4641016151377544},"320":{"tf":1.4142135623730951},"321":{"tf":2.6457513110645907},"322":{"tf":3.1622776601683795},"323":{"tf":1.7320508075688772},"324":{"tf":1.0},"412":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"359":{"tf":2.23606797749979}}}},"y":{"df":1,"docs":{"152":{"tf":1.0}}},"、":{"b":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"👍":{"%":{"df":0,"docs":{},",":{"df":0,"docs":{},"就":{"df":0,"docs":{},"无":{"df":0,"docs":{},"法":{"df":0,"docs":{},"将":{"df":0,"docs":{},"其":{"df":0,"docs":{},"转":{"df":0,"docs":{},"换":{"df":0,"docs":{},"为":{"df":0,"docs":{},"一":{"df":0,"docs":{},"个":{"df":0,"docs":{},"数":{"df":0,"docs":{},"字":{"df":0,"docs":{},"。":{"df":0,"docs":{},"因":{"df":0,"docs":{},"此":{"df":0,"docs":{},",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}}},"b":{"'":{"a":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.0}}}}},"df":0,"docs":{}}},"3":{"2":{"3":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"9":{"a":{"1":{"5":{"6":{"df":0,"docs":{},"f":{"7":{"4":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"314":{"tf":1.0}}},">":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}}}},"a":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":2.8284271247461903}}},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":4.242640687119285}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"118":{"tf":2.0},"119":{"tf":1.4142135623730951}},"e":{":":{":":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"l":{"a":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"114":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"348":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"434":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":18,"docs":{"143":{"tf":1.0},"155":{"tf":1.7320508075688772},"156":{"tf":3.605551275463989},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"277":{"tf":1.0},"290":{"tf":1.0},"301":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0},"70":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"113":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}}}}},"r":{"df":2,"docs":{"141":{"tf":1.0},"382":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"273":{"tf":1.0}}}}},"b":{"7":{"df":0,"docs":{},"e":{"4":{"2":{"9":{"a":{"d":{"6":{"b":{"5":{"9":{"d":{"9":{"a":{"0":{"c":{"3":{"7":{"d":{"b":{"7":{"4":{"3":{"4":{"9":{"7":{"6":{"3":{"6":{"4":{"c":{"b":{"b":{"9":{"c":{"6":{"d":{"a":{"df":3,"docs":{"100":{"tf":1.0},"108":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":26,"docs":{"10":{"tf":1.0},"114":{"tf":1.7320508075688772},"144":{"tf":1.0},"185":{"tf":2.8284271247461903},"191":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"272":{"tf":2.23606797749979},"285":{"tf":3.3166247903554},"286":{"tf":2.0},"291":{"tf":2.0},"293":{"tf":4.242640687119285},"314":{"tf":1.7320508075688772},"316":{"tf":1.0},"320":{"tf":1.7320508075688772},"322":{"tf":3.872983346207417},"325":{"tf":1.0},"350":{"tf":1.4142135623730951},"359":{"tf":2.8284271247461903},"368":{"tf":1.0},"415":{"tf":1.0},"416":{"tf":1.4142135623730951},"417":{"tf":4.69041575982343},"53":{"tf":1.0},"66":{"tf":1.4142135623730951},"77":{"tf":2.23606797749979},"78":{"tf":2.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"413":{"tf":1.0}}}}},"df":1,"docs":{"106":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"241":{"tf":1.7320508075688772},"283":{"tf":2.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"289":{"tf":1.0},"407":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}},"n":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"252":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":1,"docs":{"252":{"tf":1.4142135623730951}},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"198":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}},"t":{"a":{"df":3,"docs":{"434":{"tf":4.58257569495584},"435":{"tf":1.0},"436":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"252":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"167":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772}}}}}}}},"i":{"df":0,"docs":{},"g":{"!":{"df":0,"docs":{},"。":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":8,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"74":{"tf":1.0}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"102":{"tf":1.7320508075688772}}}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":7,"docs":{"111":{"tf":1.0},"172":{"tf":1.0},"214":{"tf":1.0},"265":{"tf":1.0},"368":{"tf":1.0},"397":{"tf":1.0},"53":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"267":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"d":{"df":5,"docs":{"185":{"tf":1.0},"188":{"tf":1.0},"353":{"tf":1.4142135623730951},"397":{"tf":1.7320508075688772},"49":{"tf":1.0}}},"df":46,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"225":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"246":{"tf":1.0},"267":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"405":{"tf":1.7320508075688772},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"194":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"a":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"53":{"tf":2.23606797749979}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}}}}}},"j":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"183":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"@":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"2":{"2":{":":{"2":{"2":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"2":{"3":{"df":1,"docs":{"320":{"tf":3.605551275463989}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"319":{"tf":1.0}}}}},"df":4,"docs":{"298":{"tf":1.0},"313":{"tf":1.0},"320":{"tf":2.8284271247461903},"368":{"tf":1.0}}}},"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"337":{"tf":1.7320508075688772},"343":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":6,"docs":{"148":{"tf":1.0},"150":{"tf":1.4142135623730951},"239":{"tf":1.7320508075688772},"258":{"tf":1.4142135623730951},"348":{"tf":1.0},"359":{"tf":1.7320508075688772}}}}},"o":{"d":{"df":0,"docs":{},"i":{"df":6,"docs":{"229":{"tf":1.7320508075688772},"398":{"tf":1.4142135623730951},"399":{"tf":1.7320508075688772},"400":{"tf":2.23606797749979},"401":{"tf":1.7320508075688772},"58":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0}}},"o":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"0":{"tf":1.4142135623730951},"142":{"tf":1.0},"389":{"tf":1.0}}},"l":{"df":21,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":2.449489742783178},"181":{"tf":1.4142135623730951},"182":{"tf":2.23606797749979},"199":{"tf":2.0},"232":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0},"320":{"tf":1.0},"414":{"tf":1.7320508075688772},"53":{"tf":1.4142135623730951},"61":{"tf":2.0},"70":{"tf":1.0},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.7320508075688772},"93":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"289":{"tf":1.0},"290":{"tf":1.7320508075688772},"291":{"tf":1.4142135623730951},"293":{"tf":1.0},"294":{"tf":1.0}}}}}},"df":18,"docs":{"134":{"tf":2.23606797749979},"185":{"tf":2.0},"186":{"tf":1.4142135623730951},"188":{"tf":1.7320508075688772},"189":{"tf":1.0},"228":{"tf":1.4142135623730951},"289":{"tf":2.8284271247461903},"290":{"tf":2.0},"299":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"368":{"tf":2.0},"405":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.7320508075688772},"74":{"tf":3.0},"75":{"tf":2.23606797749979},"78":{"tf":2.23606797749979}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}}}}}},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":2.0}}}}}},"df":0,"docs":{}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"173":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}},"df":1,"docs":{"330":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":25,"docs":{"156":{"tf":1.4142135623730951},"177":{"tf":1.0},"181":{"tf":3.4641016151377544},"183":{"tf":2.449489742783178},"194":{"tf":1.7320508075688772},"195":{"tf":1.4142135623730951},"219":{"tf":1.0},"224":{"tf":1.4142135623730951},"242":{"tf":2.0},"249":{"tf":1.0},"306":{"tf":1.4142135623730951},"309":{"tf":1.0},"313":{"tf":1.7320508075688772},"320":{"tf":3.1622776601683795},"332":{"tf":1.4142135623730951},"334":{"tf":2.0},"335":{"tf":1.0},"336":{"tf":1.0},"377":{"tf":2.449489742783178},"383":{"tf":1.4142135623730951},"385":{"tf":1.0},"405":{"tf":2.0},"415":{"tf":1.0},"417":{"tf":1.4142135623730951},"54":{"tf":1.0}},",":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"181":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"x":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"5":{"df":1,"docs":{"272":{"tf":1.0}}},"a":{"df":1,"docs":{"285":{"tf":2.0}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"1":{"0":{"df":1,"docs":{"285":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"275":{"tf":1.0}}},"3":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":3,"docs":{"405":{"tf":1.7320508075688772},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"275":{"tf":1.0},"285":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}}}}}}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"335":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"x":{"df":1,"docs":{"278":{"tf":1.0}}},"|":{"df":0,"docs":{},"x":{"df":1,"docs":{"386":{"tf":1.4142135623730951}}}}},"df":3,"docs":{"320":{"tf":2.0},"381":{"tf":2.0},"386":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"320":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"<":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"334":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":20,"docs":{"162":{"tf":2.6457513110645907},"225":{"tf":2.23606797749979},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"334":{"tf":1.0},"335":{"tf":1.4142135623730951},"338":{"tf":1.0},"341":{"tf":1.7320508075688772},"342":{"tf":5.0},"381":{"tf":2.23606797749979},"383":{"tf":1.0},"386":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"278":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"273":{"tf":1.0},"275":{"tf":1.4142135623730951},"285":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"341":{"tf":2.23606797749979},"342":{"tf":4.898979485566356}}}}},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"335":{"tf":1.0},"383":{"tf":1.0}}}}},"t":{">":{"df":0,"docs":{},"。":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"271":{"tf":1.0}}}}},"df":0,"docs":{}},",":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":13,"docs":{"270":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.7320508075688772},"275":{"tf":2.6457513110645907},"276":{"tf":1.4142135623730951},"278":{"tf":2.449489742783178},"279":{"tf":2.23606797749979},"283":{"tf":1.4142135623730951},"285":{"tf":2.0},"288":{"tf":2.0},"295":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"334":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"{":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"320":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":14,"docs":{"271":{"tf":2.0},"272":{"tf":2.8284271247461903},"273":{"tf":2.23606797749979},"275":{"tf":3.0},"283":{"tf":1.0},"320":{"tf":2.0},"334":{"tf":1.0},"335":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"341":{"tf":1.0},"342":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":1.0},"413":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{".":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"294":{"tf":5.477225575051661},"61":{"tf":3.4641016151377544}},"。":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"398":{"tf":1.0},"417":{"tf":1.7320508075688772},"431":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"k":{"df":9,"docs":{"167":{"tf":1.0},"240":{"tf":1.0},"273":{"tf":1.0},"382":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951},"412":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"62":{"tf":3.605551275463989}},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":8,"docs":{"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":5,"docs":{"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"381":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}}},"df":2,"docs":{"156":{"tf":1.0},"252":{"tf":1.7320508075688772}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":8,"docs":{"398":{"tf":2.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":25,"docs":{"102":{"tf":1.0},"106":{"tf":1.7320508075688772},"153":{"tf":1.0},"156":{"tf":1.0},"167":{"tf":1.0},"196":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.7320508075688772},"212":{"tf":1.4142135623730951},"296":{"tf":1.7320508075688772},"297":{"tf":1.0},"312":{"tf":1.0},"343":{"tf":1.0},"366":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"433":{"tf":1.0},"434":{"tf":1.0},"49":{"tf":1.0},"62":{"tf":1.0},"70":{"tf":1.4142135623730951},"77":{"tf":1.0},"78":{"tf":1.4142135623730951}},"!":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"200":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.0},"250":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"405":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"82":{"tf":1.4142135623730951},"83":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"82":{"tf":1.0},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":28,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"15":{"tf":1.0},"156":{"tf":1.0},"210":{"tf":1.0},"224":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.0},"249":{"tf":2.0},"250":{"tf":1.0},"255":{"tf":2.23606797749979},"265":{"tf":1.4142135623730951},"266":{"tf":2.23606797749979},"27":{"tf":2.6457513110645907},"277":{"tf":1.0},"28":{"tf":1.4142135623730951},"29":{"tf":1.0},"301":{"tf":1.0},"36":{"tf":1.0},"386":{"tf":1.0},"391":{"tf":1.7320508075688772},"40":{"tf":2.449489742783178},"405":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.0},"52":{"tf":1.0},"70":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{}},")":{"df":0,"docs":{},",":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"155":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"333":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":3.4641016151377544}},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"333":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":6,"docs":{"143":{"tf":1.4142135623730951},"144":{"tf":1.4142135623730951},"191":{"tf":1.0},"53":{"tf":1.4142135623730951},"77":{"tf":2.23606797749979},"78":{"tf":2.0}},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"df":0,"docs":{}},"9":{"5":{".":{".":{"1":{"0":{"3":{"df":1,"docs":{"391":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"191":{"tf":1.0},"77":{"tf":2.23606797749979},"78":{"tf":2.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"c":{"+":{"+":{"df":0,"docs":{},"”":{"df":0,"docs":{},"(":{"2":{"0":{"1":{"2":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},".":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"/":{"c":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"0":{"6":{"0":{"0":{"6":{"1":{"5":{"7":{"b":{"1":{"4":{"b":{"3":{"d":{"4":{"7":{"b":{"5":{"c":{"7":{"1":{"6":{"df":0,"docs":{},"f":{"c":{"3":{"9":{"2":{"b":{"7":{"7":{"df":0,"docs":{},"f":{"3":{"b":{"2":{"df":0,"docs":{},"e":{"2":{"1":{"c":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"d":{"d":{"d":{"a":{"c":{"6":{"9":{"2":{"8":{"4":{"8":{"a":{"d":{"df":0,"docs":{},"e":{"6":{"c":{"2":{"1":{"1":{"2":{"c":{"8":{"df":0,"docs":{},"e":{"1":{"5":{"a":{"7":{"0":{"8":{"7":{"df":0,"docs":{},"f":{"b":{"b":{"df":0,"docs":{},"e":{"c":{"4":{"5":{"df":1,"docs":{"418":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"4":{"b":{"d":{"d":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"3":{"2":{"8":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"e":{"7":{"7":{"4":{"d":{"df":0,"docs":{},"f":{"1":{"9":{"8":{"8":{"2":{"c":{"c":{"c":{"1":{"3":{"9":{"5":{"3":{"2":{"df":0,"docs":{},"e":{"5":{"3":{"d":{"8":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"7":{"7":{"d":{"7":{"a":{"1":{"2":{"7":{"9":{"d":{"b":{"c":{"7":{"a":{"9":{"d":{"7":{"6":{"df":0,"docs":{},"e":{"8":{"0":{"c":{"5":{"a":{"c":{"9":{"d":{"7":{"4":{"2":{"d":{"d":{"5":{"2":{"9":{"5":{"3":{"8":{"c":{"df":3,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"398":{"tf":1.0}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"62":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"73":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":2,"docs":{"72":{"tf":1.0},"73":{"tf":1.7320508075688772}},"s":{"1":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"73":{"tf":2.0}}}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"c":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":15,"docs":{"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"154":{"tf":1.0},"159":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":2.449489742783178},"242":{"tf":1.4142135623730951},"283":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.0},"330":{"tf":1.0},"368":{"tf":2.0},"376":{"tf":3.1622776601683795},"407":{"tf":1.0}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"277":{"tf":1.0},"360":{"tf":1.0}}}},"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"199":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"199":{"tf":2.8284271247461903},"95":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":2.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":1.7320508075688772}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":7,"docs":{"113":{"tf":1.0},"211":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"266":{"tf":2.449489742783178},"27":{"tf":1.0},"40":{"tf":3.0}}}},"df":0,"docs":{}}},"m":{"d":{"df":3,"docs":{"25":{"tf":1.0},"254":{"tf":1.0},"268":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":15,"docs":{"111":{"tf":2.0},"113":{"tf":1.0},"124":{"tf":2.23606797749979},"155":{"tf":1.0},"211":{"tf":1.4142135623730951},"255":{"tf":2.23606797749979},"26":{"tf":2.6457513110645907},"260":{"tf":2.6457513110645907},"262":{"tf":1.0},"265":{"tf":2.23606797749979},"266":{"tf":2.8284271247461903},"32":{"tf":1.4142135623730951},"391":{"tf":1.7320508075688772},"40":{"tf":2.449489742783178},"430":{"tf":1.4142135623730951}}}}}}},"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"267":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"259":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":141,"docs":{"10":{"tf":1.4142135623730951},"102":{"tf":1.0},"106":{"tf":1.0},"110":{"tf":1.4142135623730951},"111":{"tf":3.3166247903554},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.0},"124":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":2.0},"157":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":3.3166247903554},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"203":{"tf":1.0},"204":{"tf":3.0},"205":{"tf":1.0},"206":{"tf":2.0},"207":{"tf":2.6457513110645907},"208":{"tf":2.6457513110645907},"210":{"tf":2.23606797749979},"211":{"tf":3.1622776601683795},"214":{"tf":2.23606797749979},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"232":{"tf":2.0},"234":{"tf":1.0},"235":{"tf":1.4142135623730951},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"246":{"tf":1.0},"25":{"tf":3.3166247903554},"253":{"tf":1.0},"254":{"tf":2.23606797749979},"255":{"tf":3.0},"256":{"tf":1.0},"257":{"tf":2.23606797749979},"258":{"tf":1.4142135623730951},"259":{"tf":1.7320508075688772},"26":{"tf":4.358898943540674},"260":{"tf":2.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"263":{"tf":2.0},"264":{"tf":1.4142135623730951},"265":{"tf":2.0},"266":{"tf":4.123105625617661},"267":{"tf":2.23606797749979},"268":{"tf":3.4641016151377544},"269":{"tf":1.0},"27":{"tf":5.385164807134504},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.4142135623730951},"283":{"tf":1.7320508075688772},"285":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":1.4142135623730951},"29":{"tf":2.23606797749979},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"32":{"tf":2.449489742783178},"335":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"38":{"tf":1.4142135623730951},"386":{"tf":1.0},"391":{"tf":2.23606797749979},"397":{"tf":1.7320508075688772},"398":{"tf":1.0},"399":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":5.291502622129181},"400":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":3.3166247903554},"407":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951},"41":{"tf":2.23606797749979},"42":{"tf":1.4142135623730951},"426":{"tf":2.0},"427":{"tf":2.23606797749979},"428":{"tf":1.7320508075688772},"43":{"tf":1.0},"430":{"tf":1.4142135623730951},"45":{"tf":1.0},"49":{"tf":2.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.7320508075688772},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":2.449489742783178},"62":{"tf":1.7320508075688772},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"436":{"tf":1.0}}}}}}}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"398":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.4142135623730951},"232":{"tf":2.23606797749979},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}}},"df":5,"docs":{"106":{"tf":1.0},"273":{"tf":1.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951}}},"t":{"df":2,"docs":{"320":{"tf":1.0},"335":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"102":{"tf":1.0},"260":{"tf":1.0}}}}},"d":{"df":10,"docs":{"198":{"tf":1.0},"21":{"tf":2.0},"214":{"tf":1.0},"26":{"tf":1.0},"265":{"tf":1.0},"29":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"397":{"tf":1.0},"436":{"tf":1.0}}},"df":34,"docs":{"10":{"tf":1.0},"144":{"tf":1.0},"15":{"tf":2.23606797749979},"156":{"tf":1.0},"172":{"tf":1.0},"175":{"tf":1.4142135623730951},"200":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.4142135623730951},"252":{"tf":2.23606797749979},"270":{"tf":1.0},"283":{"tf":2.23606797749979},"285":{"tf":3.0},"286":{"tf":2.8284271247461903},"291":{"tf":2.449489742783178},"319":{"tf":1.0},"320":{"tf":1.7320508075688772},"325":{"tf":1.0},"350":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"367":{"tf":1.0},"368":{"tf":3.1622776601683795},"371":{"tf":1.0},"385":{"tf":1.0},"388":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"418":{"tf":1.0},"43":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":1.0},"62":{"tf":2.0},"70":{"tf":1.4142135623730951},"91":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"431":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"310":{"tf":1.0}}}},"df":1,"docs":{"307":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":23,"docs":{"198":{"tf":2.0},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":2.6457513110645907},"211":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"244":{"tf":1.0},"245":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"266":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}},"df":3,"docs":{"210":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"42":{"tf":1.0}}}},"h":{"0":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"1":{"df":4,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":1.0},"25":{"tf":1.0}}},"2":{"df":1,"docs":{"31":{"tf":1.0}}},"3":{"df":6,"docs":{"47":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}},"4":{"df":4,"docs":{"64":{"tf":1.0},"65":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0}}},"5":{"df":4,"docs":{"81":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0}}},"6":{"df":4,"docs":{"100":{"tf":1.0},"103":{"tf":1.0},"108":{"tf":1.0},"99":{"tf":1.0}}},"7":{"df":6,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":1.0}}},"8":{"df":4,"docs":{"130":{"tf":1.0},"131":{"tf":1.0},"138":{"tf":1.0},"146":{"tf":1.0}}},"9":{"df":4,"docs":{"153":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":4,"docs":{"169":{"tf":1.0},"171":{"tf":1.0},"177":{"tf":1.0},"184":{"tf":1.0}}},"1":{"df":4,"docs":{"196":{"tf":1.0},"197":{"tf":1.0},"204":{"tf":1.0},"209":{"tf":1.0}}},"2":{"df":7,"docs":{"213":{"tf":1.0},"214":{"tf":1.0},"218":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0}}},"3":{"df":5,"docs":{"237":{"tf":1.0},"238":{"tf":1.0},"243":{"tf":1.0},"248":{"tf":1.0},"252":{"tf":1.0}}},"4":{"df":6,"docs":{"254":{"tf":1.0},"255":{"tf":1.0},"256":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0}}},"5":{"df":7,"docs":{"270":{"tf":1.0},"271":{"tf":1.0},"276":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0}}},"6":{"df":5,"docs":{"296":{"tf":1.0},"297":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0}}},"7":{"df":5,"docs":{"313":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":1.0}}},"8":{"df":4,"docs":{"328":{"tf":1.0},"329":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0}}},"9":{"df":4,"docs":{"345":{"tf":1.0},"346":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":6,"docs":{"364":{"tf":1.0},"365":{"tf":1.0},"373":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0},"387":{"tf":1.0}}},"1":{"df":4,"docs":{"395":{"tf":1.0},"396":{"tf":1.0},"403":{"tf":1.0},"406":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":6,"docs":{"289":{"tf":1.4142135623730951},"293":{"tf":2.0},"359":{"tf":1.0},"405":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0}},"e":{"(":{"&":{"df":1,"docs":{"73":{"tf":1.0}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"73":{"tf":1.4142135623730951},"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"359":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"274":{"tf":1.0},"359":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"101":{"tf":1.0},"359":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"296":{"tf":1.0},"300":{"tf":1.0},"319":{"tf":1.0},"434":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"1":{"0":{"df":6,"docs":{"172":{"tf":1.7320508075688772},"173":{"tf":1.7320508075688772},"185":{"tf":1.7320508075688772},"186":{"tf":1.7320508075688772},"188":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":1,"docs":{"142":{"tf":1.0}}}}}},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.4142135623730951}}}}}}},"df":11,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":2.0},"162":{"tf":1.0},"170":{"tf":1.0},"172":{"tf":2.449489742783178},"175":{"tf":1.4142135623730951},"358":{"tf":1.7320508075688772},"53":{"tf":2.6457513110645907},"56":{"tf":1.4142135623730951},"70":{"tf":1.0}},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"=":{"\"":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"102":{"tf":1.0},"27":{"tf":2.6457513110645907},"405":{"tf":3.605551275463989},"407":{"tf":2.23606797749979},"427":{"tf":1.0}},"e":{"d":{"_":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"185":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"114":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"294":{"tf":4.242640687119285}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"434":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"260":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"i":{"df":1,"docs":{"434":{"tf":1.0}},"r":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"100":{"tf":1.0},"428":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"416":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"15":{"tf":1.0},"24":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"406":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":1,"docs":{"78":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"396":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":3.0}}},"y":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":14,"docs":{"181":{"tf":2.0},"222":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.0},"249":{"tf":2.0},"285":{"tf":1.0},"286":{"tf":1.0},"29":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":1.7320508075688772},"319":{"tf":1.0},"375":{"tf":1.0},"422":{"tf":4.0},"70":{"tf":2.449489742783178}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"300":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":8,"docs":{"224":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"240":{"tf":2.449489742783178},"241":{"tf":4.123105625617661},"242":{"tf":1.4142135623730951},"299":{"tf":2.23606797749979},"306":{"tf":1.4142135623730951}},"e":{"@":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"1":{":":{"3":{"6":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"238":{"tf":1.0},"384":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"迭":{"df":0,"docs":{},"代":{"df":0,"docs":{},"器":{"df":0,"docs":{},"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}}}}}}}}}}}},"m":{"d":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":3,"docs":{"17":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.7320508075688772}}},"df":0,"docs":{},"p":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"183":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"183":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":3,"docs":{"42":{"tf":1.7320508075688772},"421":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"n":{"df":1,"docs":{"0":{"tf":1.0}}},"o":{"d":{"df":0,"docs":{},"e":{"df":10,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"211":{"tf":1.0},"252":{"tf":1.0},"335":{"tf":1.7320508075688772},"352":{"tf":1.0},"360":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"399":{"tf":1.0},"429":{"tf":1.0}},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"测":{"df":0,"docs":{},"试":{"df":0,"docs":{},"中":{"df":0,"docs":{},",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"163":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"c":{"df":1,"docs":{"141":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"141":{"tf":1.0},"276":{"tf":1.0},"281":{"tf":1.0},"78":{"tf":1.0}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"179":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{":":{":":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":3,"docs":{"103":{"tf":1.7320508075688772},"104":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"这":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"104":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"103":{"tf":3.0},"104":{"tf":2.449489742783178},"105":{"tf":1.0},"108":{"tf":2.6457513110645907}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":13,"docs":{"130":{"tf":1.0},"134":{"tf":1.7320508075688772},"142":{"tf":1.7320508075688772},"143":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"247":{"tf":1.0},"250":{"tf":1.4142135623730951},"257":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"64":{"tf":1.0},"70":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"(":{"0":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":1,"docs":{"359":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"b":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"149":{"tf":1.0},"239":{"tf":1.4142135623730951},"258":{"tf":3.4641016151377544},"348":{"tf":2.449489742783178},"359":{"tf":2.23606797749979},"85":{"tf":1.4142135623730951}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"301":{"tf":1.0},"70":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"214":{"tf":1.0},"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"257":{"tf":1.0},"437":{"tf":1.0},"59":{"tf":1.7320508075688772}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"59":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"t":{"df":110,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"100":{"tf":1.0},"103":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"138":{"tf":1.0},"146":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.0},"177":{"tf":1.0},"184":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"209":{"tf":1.0},"213":{"tf":1.0},"214":{"tf":1.0},"218":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"243":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.0},"252":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.0},"256":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.0},"276":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"297":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"364":{"tf":1.0},"365":{"tf":1.0},"373":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0},"387":{"tf":1.0},"395":{"tf":1.0},"396":{"tf":1.0},"403":{"tf":1.0},"406":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0},"415":{"tf":1.0},"418":{"tf":1.0},"425":{"tf":1.0},"430":{"tf":1.0},"431":{"tf":1.0},"432":{"tf":1.0},"47":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0},"99":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"130":{"tf":1.0},"211":{"tf":2.449489742783178},"47":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"300":{"tf":1.4142135623730951},"304":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}},"r":{"df":1,"docs":{"277":{"tf":1.0}}},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":97,"docs":{"102":{"tf":1.7320508075688772},"106":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"134":{"tf":1.4142135623730951},"142":{"tf":1.4142135623730951},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"185":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951},"189":{"tf":1.4142135623730951},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"242":{"tf":1.7320508075688772},"246":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":2.8284271247461903},"267":{"tf":1.0},"27":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"283":{"tf":2.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"289":{"tf":2.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":2.0},"301":{"tf":1.4142135623730951},"306":{"tf":2.0},"32":{"tf":1.0},"335":{"tf":1.4142135623730951},"350":{"tf":1.0},"351":{"tf":1.4142135623730951},"353":{"tf":1.7320508075688772},"36":{"tf":1.0},"360":{"tf":1.4142135623730951},"368":{"tf":2.0},"376":{"tf":2.23606797749979},"377":{"tf":1.4142135623730951},"38":{"tf":1.0},"386":{"tf":1.7320508075688772},"398":{"tf":1.0},"40":{"tf":3.0},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":3.1622776601683795},"427":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.7320508075688772},"51":{"tf":1.7320508075688772},"52":{"tf":1.4142135623730951},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.4142135623730951},"58":{"tf":1.7320508075688772},"61":{"tf":2.8284271247461903},"62":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":2.0},"75":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":1,"docs":{"59":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"333":{"tf":1.7320508075688772},"334":{"tf":3.0},"335":{"tf":2.449489742783178},"426":{"tf":1.0},"428":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":2,"docs":{"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"102":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"260":{"tf":1.0},"273":{"tf":1.7320508075688772},"313":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"47":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":3,"docs":{"296":{"tf":1.4142135623730951},"308":{"tf":1.0},"317":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"297":{"tf":1.0},"57":{"tf":1.0},"61":{"tf":2.6457513110645907}}}}},"df":7,"docs":{"273":{"tf":4.898979485566356},"274":{"tf":2.23606797749979},"275":{"tf":2.6457513110645907},"285":{"tf":2.6457513110645907},"286":{"tf":1.0},"291":{"tf":2.0},"293":{"tf":2.6457513110645907}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":5,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"229":{"tf":1.0}}}}}}}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":5,"docs":{"224":{"tf":1.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"(":{")":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"249":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":6,"docs":{"224":{"tf":2.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":3.7416573867739413},"405":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"223":{"tf":1.0},"224":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"223":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"108":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"df":12,"docs":{"222":{"tf":3.872983346207417},"223":{"tf":3.1622776601683795},"224":{"tf":3.872983346207417},"225":{"tf":3.7416573867739413},"226":{"tf":2.8284271247461903},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.7416573867739413},"235":{"tf":1.0},"249":{"tf":4.242640687119285},"250":{"tf":2.449489742783178}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"108":{"tf":1.4142135623730951},"210":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"397":{"tf":2.449489742783178},"398":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"(":{"1":{"df":2,"docs":{"273":{"tf":1.0},"275":{"tf":1.0}}},"2":{"df":1,"docs":{"273":{"tf":1.0}}},"3":{"df":3,"docs":{"273":{"tf":1.0},"285":{"tf":1.7320508075688772},"286":{"tf":1.0}}},"4":{"df":2,"docs":{"285":{"tf":1.7320508075688772},"286":{"tf":1.0}}},"5":{"df":2,"docs":{"285":{"tf":1.4142135623730951},"293":{"tf":1.0}}},"_":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}},"df":0,"docs":{},"i":{"3":{"2":{"df":5,"docs":{"273":{"tf":2.0},"275":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"293":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"c":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"3":{"df":1,"docs":{"291":{"tf":1.0}}},"4":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"291":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"d":{"df":23,"docs":{"120":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"186":{"tf":1.0},"228":{"tf":1.0},"242":{"tf":1.0},"283":{"tf":1.0},"289":{"tf":1.4142135623730951},"306":{"tf":1.0},"320":{"tf":2.6457513110645907},"324":{"tf":1.0},"353":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"427":{"tf":1.0},"428":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"412":{"tf":1.0},"428":{"tf":1.0},"50":{"tf":1.0}}}}},"df":5,"docs":{"367":{"tf":2.23606797749979},"412":{"tf":1.0},"416":{"tf":1.0},"50":{"tf":1.4142135623730951},"75":{"tf":1.0}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"273":{"tf":1.0},"391":{"tf":1.4142135623730951},"61":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}},"m":{"df":5,"docs":{"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"300":{"tf":1.0},"303":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"145":{"tf":1.0},"186":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"75":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":4,"docs":{"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"<":{"'":{"a":{">":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"342":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":34,"docs":{"116":{"tf":1.0},"140":{"tf":1.7320508075688772},"179":{"tf":1.7320508075688772},"180":{"tf":2.449489742783178},"181":{"tf":1.4142135623730951},"182":{"tf":2.6457513110645907},"218":{"tf":1.4142135623730951},"219":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":3.872983346207417},"229":{"tf":4.358898943540674},"231":{"tf":2.8284271247461903},"232":{"tf":5.916079783099616},"249":{"tf":5.196152422706632},"250":{"tf":3.872983346207417},"252":{"tf":1.0},"337":{"tf":1.7320508075688772},"338":{"tf":1.7320508075688772},"339":{"tf":2.6457513110645907},"340":{"tf":2.449489742783178},"341":{"tf":1.7320508075688772},"342":{"tf":4.47213595499958},"343":{"tf":4.58257569495584},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"s":{"\"":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"140":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"(":{"df":0,"docs":{},"而":{"df":0,"docs":{},"不":{"df":0,"docs":{},"是":{"df":0,"docs":{},"参":{"df":0,"docs":{},"数":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},")":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"228":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":5,"docs":{"167":{"tf":1.7320508075688772},"382":{"tf":2.6457513110645907},"412":{"tf":1.0},"45":{"tf":1.4142135623730951},"62":{"tf":2.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"166":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":6,"docs":{"112":{"tf":1.0},"26":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"257":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"i":{"df":15,"docs":{"148":{"tf":1.0},"149":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"375":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.0},"422":{"tf":3.4641016151377544},"70":{"tf":3.7416573867739413},"71":{"tf":1.0},"84":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"i":{">":{">":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"156":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"156":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"156":{"tf":1.0}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"[":{"df":0,"docs":{},"t":{"]":{">":{">":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"242":{"tf":1.0},"252":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"252":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":9,"docs":{"108":{"tf":2.0},"150":{"tf":2.0},"270":{"tf":1.0},"284":{"tf":1.0},"286":{"tf":2.23606797749979},"293":{"tf":3.1622776601683795},"306":{"tf":1.0},"374":{"tf":1.4142135623730951},"62":{"tf":3.1622776601683795}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"306":{"tf":2.8284271247461903}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":5,"docs":{"306":{"tf":3.3166247903554},"307":{"tf":1.0},"369":{"tf":2.6457513110645907},"374":{"tf":3.3166247903554},"62":{"tf":2.6457513110645907}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":2.0}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"s":{"df":3,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"106":{"tf":1.7320508075688772},"353":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":4,"docs":{"313":{"tf":2.8284271247461903},"314":{"tf":1.0},"322":{"tf":1.0},"53":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"102":{"tf":1.0},"155":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":2,"docs":{"301":{"tf":1.0},"70":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"120":{"tf":2.449489742783178},"121":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":1.7320508075688772},"121":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{":":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"113":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"{":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"273":{"tf":1.0},"275":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"382":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":69,"docs":{"110":{"tf":2.8284271247461903},"111":{"tf":4.69041575982343},"113":{"tf":3.4641016151377544},"114":{"tf":2.6457513110645907},"115":{"tf":3.4641016151377544},"116":{"tf":2.449489742783178},"117":{"tf":3.872983346207417},"118":{"tf":1.7320508075688772},"120":{"tf":2.0},"121":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"127":{"tf":2.449489742783178},"128":{"tf":1.4142135623730951},"129":{"tf":1.4142135623730951},"144":{"tf":1.0},"156":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":3.4641016151377544},"211":{"tf":3.4641016151377544},"226":{"tf":2.23606797749979},"256":{"tf":1.4142135623730951},"257":{"tf":3.872983346207417},"258":{"tf":4.69041575982343},"259":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":3.872983346207417},"261":{"tf":2.449489742783178},"262":{"tf":1.4142135623730951},"263":{"tf":1.7320508075688772},"264":{"tf":1.7320508075688772},"265":{"tf":2.8284271247461903},"266":{"tf":6.782329983125268},"267":{"tf":2.23606797749979},"269":{"tf":1.0},"297":{"tf":1.0},"31":{"tf":1.0},"312":{"tf":1.4142135623730951},"316":{"tf":4.0},"318":{"tf":2.0},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":2.23606797749979},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"333":{"tf":1.0},"335":{"tf":1.0},"337":{"tf":1.7320508075688772},"343":{"tf":1.0},"378":{"tf":1.7320508075688772},"39":{"tf":1.0},"390":{"tf":2.23606797749979},"391":{"tf":4.58257569495584},"392":{"tf":1.4142135623730951},"395":{"tf":1.4142135623730951},"40":{"tf":4.123105625617661},"405":{"tf":1.7320508075688772},"408":{"tf":1.0},"41":{"tf":1.7320508075688772},"412":{"tf":1.4142135623730951},"414":{"tf":1.0},"417":{"tf":1.0},"42":{"tf":1.0},"421":{"tf":1.0},"426":{"tf":1.0},"46":{"tf":1.0},"59":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":18,"docs":{"124":{"tf":1.4142135623730951},"144":{"tf":1.0},"151":{"tf":1.0},"214":{"tf":1.0},"254":{"tf":1.7320508075688772},"256":{"tf":1.7320508075688772},"259":{"tf":2.0},"260":{"tf":1.4142135623730951},"261":{"tf":2.23606797749979},"263":{"tf":1.7320508075688772},"266":{"tf":1.4142135623730951},"267":{"tf":1.4142135623730951},"269":{"tf":1.4142135623730951},"391":{"tf":1.0},"395":{"tf":1.0},"40":{"tf":2.0},"408":{"tf":1.0},"59":{"tf":1.0}}}},"m":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"111":{"tf":1.0},"264":{"tf":1.0},"40":{"tf":1.0}}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"111":{"tf":1.0},"158":{"tf":1.4142135623730951},"198":{"tf":1.0},"214":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.0},"283":{"tf":2.6457513110645907},"286":{"tf":2.449489742783178},"397":{"tf":1.0},"405":{"tf":3.1622776601683795},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"398":{"tf":2.449489742783178},"399":{"tf":1.7320508075688772}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"316":{"tf":1.0}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":5,"docs":{"319":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"43":{"tf":1.0},"62":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"189":{"tf":1.0},"299":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"324":{"tf":1.0},"352":{"tf":1.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"75":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"120":{"tf":2.23606797749979},"360":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"283":{"tf":5.385164807134504}}}}}}}}}},"df":0,"docs":{}}}}}}}},"y":{"c":{"df":0,"docs":{},"l":{"df":3,"docs":{"270":{"tf":1.0},"273":{"tf":1.7320508075688772},"293":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"d":{"0":{"a":{"c":{"b":{"2":{"5":{"9":{"5":{"c":{"8":{"9":{"1":{"d":{"df":0,"docs":{},"e":{"9":{"7":{"a":{"1":{"3":{"3":{"d":{"0":{"6":{"6":{"3":{"5":{"c":{"5":{"0":{"a":{"b":{"4":{"4":{"9":{"d":{"d":{"6":{"5":{"c":{"df":5,"docs":{"47":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"3":{"9":{"3":{"7":{"3":{"a":{"8":{"3":{"8":{"df":0,"docs":{},"f":{"d":{"3":{"1":{"2":{"a":{"8":{"a":{"9":{"b":{"c":{"c":{"9":{"4":{"8":{"7":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"b":{"c":{"9":{"df":0,"docs":{},"e":{"1":{"5":{"8":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"4":{"3":{"1":{"7":{"c":{"3":{"1":{"2":{"2":{"b":{"4":{"4":{"df":0,"docs":{},"f":{"b":{"7":{"1":{"3":{"a":{"b":{"a":{"6":{"6":{"c":{"c":{"2":{"9":{"5":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"3":{"4":{"5":{"3":{"b":{"2":{"4":{"b":{"df":1,"docs":{"432":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":0,"docs":{},"e":{"b":{"2":{"df":0,"docs":{},"f":{"7":{"a":{"8":{"df":0,"docs":{},"e":{"9":{"c":{"6":{"df":0,"docs":{},"f":{"5":{"1":{"b":{"4":{"4":{"7":{"8":{"df":0,"docs":{},"f":{"9":{"c":{"d":{"4":{"6":{"df":0,"docs":{},"f":{"5":{"5":{"4":{"4":{"8":{"df":0,"docs":{},"e":{"2":{"c":{"a":{"2":{"c":{"1":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"9":{"4":{"df":0,"docs":{},"e":{"0":{"3":{"a":{"1":{"8":{"a":{"2":{"5":{"9":{"0":{"df":0,"docs":{},"e":{"d":{"3":{"df":0,"docs":{},"f":{"1":{"c":{"6":{"7":{"b":{"8":{"5":{"9":{"c":{"b":{"1":{"1":{"5":{"2":{"8":{"d":{"2":{"a":{"2":{"d":{"5":{"c":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"a":{"a":{"2":{"6":{"8":{"a":{"0":{"c":{"d":{"0":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"7":{"6":{"a":{"8":{"0":{"6":{"7":{"a":{"2":{"6":{"df":0,"docs":{},"e":{"d":{"7":{"d":{"2":{"8":{"df":0,"docs":{},"e":{"c":{"2":{"a":{"9":{"3":{"3":{"6":{"d":{"3":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":2.6457513110645907}}}},"l":{"df":2,"docs":{"185":{"tf":1.0},"75":{"tf":3.7416573867739413}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"431":{"tf":1.0}}}}},"t":{"a":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"140":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":13,"docs":{"140":{"tf":1.0},"189":{"tf":1.0},"260":{"tf":1.0},"283":{"tf":4.242640687119285},"289":{"tf":1.0},"313":{"tf":1.0},"330":{"tf":1.4142135623730951},"359":{"tf":1.0},"391":{"tf":1.0},"52":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"y":{"df":5,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0},"348":{"tf":1.0},"63":{"tf":1.0}}}},"b":{"df":0,"docs":{},"g":{"!":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"3":{"0":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"215":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"91":{"tf":3.3166247903554}}}},"d":{"8":{"df":0,"docs":{},"f":{"4":{"7":{"a":{"7":{"4":{"b":{"6":{"7":{"1":{"7":{"8":{"c":{"df":0,"docs":{},"e":{"a":{"8":{"c":{"8":{"3":{"2":{"df":0,"docs":{},"e":{"3":{"b":{"4":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"3":{"b":{"b":{"5":{"1":{"5":{"b":{"d":{"7":{"2":{"df":1,"docs":{"163":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"17":{"tf":1.0}}},"df":8,"docs":{"10":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"23":{"tf":1.0},"231":{"tf":1.0},"283":{"tf":1.4142135623730951},"325":{"tf":1.0},"425":{"tf":1.0}},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.0}}}},"df":0,"docs":{}},"df":9,"docs":{"156":{"tf":1.4142135623730951},"181":{"tf":1.0},"200":{"tf":1.7320508075688772},"247":{"tf":1.0},"27":{"tf":1.0},"398":{"tf":1.0},"419":{"tf":2.0},"53":{"tf":1.0},"91":{"tf":3.1622776601683795}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":59,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":2.23606797749979},"267":{"tf":1.0},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"53":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"185":{"tf":1.0},"188":{"tf":1.0},"289":{"tf":1.0},"387":{"tf":1.0},"389":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"422":{"tf":1.0},"70":{"tf":1.0}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"120":{"tf":1.0},"225":{"tf":1.0},"246":{"tf":1.0},"266":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"36":{"tf":1.0},"361":{"tf":1.0},"375":{"tf":1.0},"377":{"tf":1.4142135623730951},"405":{"tf":1.0},"424":{"tf":3.0},"427":{"tf":1.0},"428":{"tf":1.0},"436":{"tf":1.0},"57":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":10,"docs":{"100":{"tf":1.0},"106":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":2.23606797749979},"376":{"tf":1.0},"42":{"tf":1.0},"82":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"26":{"tf":1.0},"289":{"tf":1.0},"32":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"151":{"tf":1.0},"405":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"(":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{":":{":":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":7,"docs":{"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"260":{"tf":1.0},"266":{"tf":1.7320508075688772},"32":{"tf":1.0},"391":{"tf":1.0},"40":{"tf":2.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"416":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"u":{"df":1,"docs":{"282":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":16,"docs":{"141":{"tf":1.7320508075688772},"270":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":2.449489742783178},"277":{"tf":1.7320508075688772},"279":{"tf":2.0},"280":{"tf":4.242640687119285},"281":{"tf":5.0},"282":{"tf":2.0},"290":{"tf":1.0},"295":{"tf":1.0},"306":{"tf":1.0},"342":{"tf":1.0},"378":{"tf":1.4142135623730951},"416":{"tf":1.0},"78":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"276":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"279":{"tf":1.0},"73":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"u":{"df":1,"docs":{"282":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":1,"docs":{"282":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"v":{"df":7,"docs":{"198":{"tf":1.0},"387":{"tf":1.4142135623730951},"388":{"tf":1.0},"391":{"tf":1.4142135623730951},"392":{"tf":1.0},"418":{"tf":3.4641016151377544},"91":{"tf":1.4142135623730951}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{",":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{",":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":15,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"113":{"tf":1.0},"199":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.7320508075688772},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979},"375":{"tf":1.0},"91":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":2,"docs":{"200":{"tf":1.0},"247":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":2.449489742783178}}}}}}}}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":3,"docs":{"102":{"tf":1.0},"330":{"tf":1.0},"337":{"tf":1.0}}}}},"t":{"df":1,"docs":{"398":{"tf":1.0}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"359":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":5,"docs":{"156":{"tf":1.0},"273":{"tf":1.0},"320":{"tf":1.0},"407":{"tf":1.0},"75":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"431":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":48,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.0},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":2.6457513110645907},"261":{"tf":1.0},"266":{"tf":1.7320508075688772},"27":{"tf":2.0},"273":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"227":{"tf":1.0},"425":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"107":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"127":{"tf":1.0},"320":{"tf":1.0},"53":{"tf":1.0}}}}}},"j":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"e":{"df":3,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"0":{"df":1,"docs":{"89":{"tf":1.0}}},"1":{"df":1,"docs":{"89":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"115":{"tf":1.0}}}},"r":{"df":2,"docs":{"111":{"tf":1.0},"24":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"428":{"tf":1.0},"57":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"408":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"336":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{">":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"181":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":25,"docs":{"140":{"tf":1.0},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"179":{"tf":1.7320508075688772},"181":{"tf":1.7320508075688772},"183":{"tf":2.449489742783178},"194":{"tf":1.7320508075688772},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0},"377":{"tf":3.3166247903554},"378":{"tf":2.449489742783178},"385":{"tf":1.0},"418":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0},"91":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"94":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"175":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"175":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"382":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"53":{"tf":1.0},"61":{"tf":2.6457513110645907}}}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"427":{"tf":2.23606797749979}}}}}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"385":{"tf":2.23606797749979}},"e":{"(":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"385":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"c":{"df":16,"docs":{"0":{"tf":1.0},"19":{"tf":1.0},"198":{"tf":2.0},"199":{"tf":1.4142135623730951},"200":{"tf":1.0},"202":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"229":{"tf":1.0},"232":{"tf":1.0},"257":{"tf":2.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"257":{"tf":1.0},"260":{"tf":1.0},"368":{"tf":1.0},"398":{"tf":1.0}}}}}}}},"df":1,"docs":{"59":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":3,"docs":{"377":{"tf":1.4142135623730951},"386":{"tf":1.0},"91":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"g":{":":{":":{"b":{"a":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":5.291502622129181}}},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"252":{"tf":1.4142135623730951},"401":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"283":{"tf":1.0},"289":{"tf":1.4142135623730951},"70":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":4.0}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":4,"docs":{"266":{"tf":1.0},"267":{"tf":1.4142135623730951},"40":{"tf":2.6457513110645907},"42":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"\"":{"df":0,"docs":{},"、":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"337":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":6,"docs":{"338":{"tf":2.23606797749979},"339":{"tf":1.4142135623730951},"340":{"tf":1.4142135623730951},"341":{"tf":2.23606797749979},"342":{"tf":2.8284271247461903},"343":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":4.47213595499958}}}}}},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"338":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}}}}},"w":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"334":{"tf":2.0},"335":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"333":{"tf":2.6457513110645907},"334":{"tf":4.123105625617661},"335":{"tf":5.196152422706632}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.4142135623730951},"235":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"227":{"tf":1.0},"405":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"283":{"tf":1.7320508075688772},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"c":{"df":1,"docs":{"283":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}},"df":18,"docs":{"185":{"tf":1.0},"188":{"tf":1.0},"270":{"tf":1.0},"273":{"tf":1.7320508075688772},"275":{"tf":1.0},"283":{"tf":7.615773105863909},"286":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"299":{"tf":1.7320508075688772},"306":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":2.8284271247461903},"408":{"tf":2.8284271247461903},"70":{"tf":2.23606797749979},"71":{"tf":1.0},"72":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.0}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.0}}}}}}}}},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"335":{"tf":1.0}}},"t":{"df":6,"docs":{"228":{"tf":2.0},"229":{"tf":2.0},"231":{"tf":1.7320508075688772},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"e":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.7320508075688772},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"302":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":2.449489742783178}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"1":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"(":{"1":{"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"(":{"2":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"225":{"tf":1.0},"336":{"tf":1.0},"383":{"tf":1.0}}}},"df":6,"docs":{"225":{"tf":1.0},"320":{"tf":1.4142135623730951},"334":{"tf":1.0},"383":{"tf":1.0},"386":{"tf":1.7320508075688772},"412":{"tf":1.0}}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":2,"docs":{"273":{"tf":1.0},"275":{"tf":1.0}}}},"0":{"0":{"0":{"4":{"df":1,"docs":{"106":{"tf":1.0}}},"5":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"6":{"df":4,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"75":{"tf":1.4142135623730951},"87":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"7":{"7":{"df":8,"docs":{"102":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"277":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.4142135623730951},"335":{"tf":1.0},"377":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"8":{"df":9,"docs":{"173":{"tf":1.0},"240":{"tf":1.0},"320":{"tf":1.0},"351":{"tf":1.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"51":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"6":{"9":{"df":1,"docs":{"172":{"tf":1.0}}},"df":0,"docs":{}},"7":{"3":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"8":{"2":{"df":6,"docs":{"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0},"70":{"tf":1.0}}},"4":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}},"9":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{"3":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":2,"docs":{"368":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"2":{"df":3,"docs":{"134":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"407":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":2,"docs":{"189":{"tf":1.0},"75":{"tf":1.0}}},"df":0,"docs":{}},"9":{"6":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"7":{"df":2,"docs":{"185":{"tf":1.0},"188":{"tf":1.0}}},"9":{"df":2,"docs":{"405":{"tf":1.4142135623730951},"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"0":{"3":{"df":2,"docs":{"115":{"tf":1.0},"116":{"tf":1.0}}},"df":0,"docs":{}},"1":{"4":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"4":{"6":{"df":1,"docs":{"386":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"9":{"9":{"8":{"1":{"1":{"df":0,"docs":{},"f":{"a":{"2":{"4":{"6":{"d":{"b":{"d":{"df":1,"docs":{"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"5":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"0":{"5":{"7":{"0":{"6":{"c":{"5":{"c":{"4":{"3":{"0":{"9":{"d":{"df":0,"docs":{},"f":{"9":{"df":0,"docs":{},"e":{"d":{"4":{"7":{"d":{"5":{"df":0,"docs":{},"e":{"9":{"1":{"d":{"8":{"df":0,"docs":{},"e":{"d":{"3":{"4":{"2":{"b":{"7":{"d":{"df":1,"docs":{"315":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},">":{"df":0,"docs":{},":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"300":{"tf":1.0}}}}}},"a":{"b":{"a":{"a":{"a":{"a":{"9":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"6":{"9":{"3":{"7":{"d":{"b":{"3":{"6":{"9":{"0":{"d":{"c":{"5":{"6":{"df":0,"docs":{},"f":{"7":{"3":{"9":{"1":{"1":{"6":{"b":{"df":0,"docs":{},"e":{"5":{"5":{"df":0,"docs":{},"e":{"c":{"b":{"2":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"358":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":7,"docs":{"115":{"tf":3.0},"116":{"tf":3.1622776601683795},"119":{"tf":2.6457513110645907},"120":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"123":{"tf":1.0},"127":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":1.7320508075688772}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"26":{"tf":1.4142135623730951},"260":{"tf":1.0},"32":{"tf":1.0},"414":{"tf":2.0},"430":{"tf":2.449489742783178}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"430":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":24,"docs":{"10":{"tf":1.0},"153":{"tf":1.0},"157":{"tf":2.23606797749979},"158":{"tf":2.0},"159":{"tf":1.0},"160":{"tf":1.7320508075688772},"162":{"tf":2.6457513110645907},"169":{"tf":1.0},"174":{"tf":2.0},"203":{"tf":2.449489742783178},"213":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.4142135623730951},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951},"26":{"tf":1.0},"300":{"tf":1.4142135623730951},"325":{"tf":1.0},"381":{"tf":2.8284271247461903},"397":{"tf":1.0},"414":{"tf":1.0},"427":{"tf":1.0},"430":{"tf":1.0}},"f":{"b":{"a":{"df":0,"docs":{},"f":{"d":{"b":{"a":{"3":{"6":{"1":{"8":{"4":{"8":{"7":{"df":0,"docs":{},"f":{"b":{"c":{"9":{"3":{"0":{"5":{"3":{"1":{"8":{"df":0,"docs":{},"f":{"c":{"a":{"b":{"9":{"7":{"7":{"5":{"1":{"3":{"2":{"a":{"c":{"1":{"5":{"df":1,"docs":{"411":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"df":0,"docs":{},"k":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"v":{"df":0,"docs":{},"w":{"df":0,"docs":{},"x":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":1,"docs":{"189":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"(":{"_":{"df":1,"docs":{"323":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"<":{"a":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"134":{"tf":2.23606797749979},"330":{"tf":1.0},"351":{"tf":1.4142135623730951},"54":{"tf":1.7320508075688772},"62":{"tf":1.4142135623730951}}}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"108":{"tf":1.0}}}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":5,"docs":{"289":{"tf":1.0},"82":{"tf":3.605551275463989},"83":{"tf":3.4641016151377544},"84":{"tf":3.1622776601683795},"87":{"tf":2.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"218":{"tf":1.0}}}},"t":{"df":2,"docs":{"120":{"tf":1.0},"57":{"tf":1.0}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"260":{"tf":1.0},"382":{"tf":1.0}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"331":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}}},"d":{"df":4,"docs":{"283":{"tf":2.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.0},"62":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"398":{"tf":1.0}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"152":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":14,"docs":{"185":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951},"224":{"tf":2.449489742783178},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"234":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"59":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"102":{"tf":1.0},"106":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"42":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"150":{"tf":2.23606797749979}}},"y":{"df":0,"docs":{},",":{"df":0,"docs":{},"它":{"df":0,"docs":{},"获":{"df":0,"docs":{},"取":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"想":{"df":0,"docs":{},"要":{"df":0,"docs":{},"检":{"df":0,"docs":{},"查":{"df":0,"docs":{},"的":{"df":0,"docs":{},"键":{"df":0,"docs":{},"作":{"df":0,"docs":{},"为":{"df":0,"docs":{},"参":{"df":0,"docs":{},"数":{"df":0,"docs":{},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"150":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}}}},"u":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"100":{"tf":1.0}}},"df":0,"docs":{}}},"df":34,"docs":{"100":{"tf":1.0},"101":{"tf":3.0},"102":{"tf":2.0},"103":{"tf":1.4142135623730951},"104":{"tf":2.23606797749979},"106":{"tf":1.7320508075688772},"108":{"tf":2.0},"119":{"tf":1.4142135623730951},"136":{"tf":1.0},"157":{"tf":1.0},"174":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"239":{"tf":1.0},"258":{"tf":2.0},"273":{"tf":2.0},"274":{"tf":1.4142135623730951},"275":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"342":{"tf":1.0},"353":{"tf":1.0},"359":{"tf":1.7320508075688772},"36":{"tf":1.0},"362":{"tf":1.0},"382":{"tf":1.0},"385":{"tf":1.0},"407":{"tf":1.4142135623730951},"412":{"tf":1.0},"417":{"tf":1.4142135623730951},"81":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"350":{"tf":1.0},"77":{"tf":1.7320508075688772},"99":{"tf":1.0}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":3,"docs":{"216":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":2.23606797749979}},"s":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"\"":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"232":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"232":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"232":{"tf":1.0}},"e":{"=":{"1":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"232":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":16,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"230":{"tf":1.0},"290":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"235":{"tf":1.7320508075688772},"236":{"tf":1.0}}}}}}}}},"q":{"df":1,"docs":{"420":{"tf":2.0}},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"202":{"tf":3.4641016151377544},"203":{"tf":1.0},"258":{"tf":1.4142135623730951},"42":{"tf":1.0}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"421":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"(":{"\"":{"d":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"_":{"df":4,"docs":{"167":{"tf":1.0},"382":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}},"df":9,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":2.0},"162":{"tf":1.0},"174":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"157":{"tf":1.0},"158":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"203":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":24,"docs":{"157":{"tf":2.23606797749979},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":2.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"165":{"tf":1.4142135623730951},"174":{"tf":1.0},"203":{"tf":2.0},"224":{"tf":3.0},"225":{"tf":2.23606797749979},"226":{"tf":1.0},"232":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.7320508075688772},"300":{"tf":1.0},"323":{"tf":1.0},"349":{"tf":1.0},"36":{"tf":2.0},"382":{"tf":1.0},"405":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":2.0}}},"df":0,"docs":{}}}}},">":{"df":0,"docs":{},"。":{"df":0,"docs":{},"为":{"df":0,"docs":{},"此":{"df":0,"docs":{},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"381":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"[":{"df":0,"docs":{},"e":{"0":{"0":{"0":{"4":{"df":1,"docs":{"106":{"tf":1.0}}},"5":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"6":{"df":4,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"7":{"7":{"df":9,"docs":{"102":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"277":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.7320508075688772},"335":{"tf":1.0},"377":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"8":{"df":9,"docs":{"173":{"tf":1.0},"240":{"tf":1.0},"320":{"tf":1.0},"351":{"tf":1.0},"407":{"tf":1.0},"42":{"tf":1.0},"51":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"6":{"9":{"df":1,"docs":{"172":{"tf":1.0}}},"df":0,"docs":{}},"7":{"3":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"8":{"2":{"df":6,"docs":{"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0},"70":{"tf":1.0}}},"4":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}},"9":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{"2":{"df":1,"docs":{"266":{"tf":1.0}}},"3":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":2,"docs":{"368":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"2":{"df":3,"docs":{"134":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"407":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":2,"docs":{"189":{"tf":1.0},"75":{"tf":1.0}}},"df":0,"docs":{}},"9":{"6":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"7":{"df":2,"docs":{"185":{"tf":1.0},"188":{"tf":1.0}}},"9":{"df":3,"docs":{"324":{"tf":1.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"0":{"3":{"df":2,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"1":{"4":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"4":{"6":{"df":1,"docs":{"386":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":78,"docs":{"102":{"tf":2.0},"106":{"tf":1.7320508075688772},"115":{"tf":1.7320508075688772},"116":{"tf":1.7320508075688772},"120":{"tf":1.7320508075688772},"134":{"tf":1.7320508075688772},"142":{"tf":1.7320508075688772},"153":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.7320508075688772},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"162":{"tf":3.4641016151377544},"172":{"tf":1.7320508075688772},"173":{"tf":1.7320508075688772},"185":{"tf":1.7320508075688772},"186":{"tf":1.7320508075688772},"188":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"219":{"tf":1.0},"225":{"tf":2.6457513110645907},"226":{"tf":1.4142135623730951},"228":{"tf":2.449489742783178},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"233":{"tf":1.0},"235":{"tf":1.0},"240":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"249":{"tf":2.23606797749979},"250":{"tf":1.4142135623730951},"257":{"tf":1.0},"260":{"tf":1.4142135623730951},"273":{"tf":2.0},"277":{"tf":2.0},"279":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"285":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":1.0},"299":{"tf":2.449489742783178},"301":{"tf":2.0},"306":{"tf":2.449489742783178},"320":{"tf":1.4142135623730951},"335":{"tf":1.7320508075688772},"351":{"tf":1.7320508075688772},"353":{"tf":1.7320508075688772},"360":{"tf":1.7320508075688772},"368":{"tf":2.449489742783178},"376":{"tf":1.7320508075688772},"377":{"tf":1.7320508075688772},"381":{"tf":2.0},"386":{"tf":1.7320508075688772},"405":{"tf":3.4641016151377544},"407":{"tf":2.6457513110645907},"414":{"tf":1.0},"42":{"tf":1.7320508075688772},"428":{"tf":1.0},"429":{"tf":1.0},"49":{"tf":2.0},"51":{"tf":1.7320508075688772},"52":{"tf":1.7320508075688772},"57":{"tf":1.7320508075688772},"58":{"tf":1.7320508075688772},"61":{"tf":2.449489742783178},"70":{"tf":2.0},"73":{"tf":1.7320508075688772},"74":{"tf":2.449489742783178},"75":{"tf":2.0},"78":{"tf":2.0},"87":{"tf":1.7320508075688772}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"158":{"tf":1.0}}},"df":0,"docs":{}}}}}},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.0}}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"36":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"ñ":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"431":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"431":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"397":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"c":{"df":1,"docs":{"417":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"320":{"tf":1.0},"361":{"tf":1.4142135623730951}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":12,"docs":{"214":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":2.8284271247461903},"257":{"tf":2.23606797749979},"277":{"tf":2.0},"279":{"tf":2.0},"283":{"tf":3.1622776601683795},"368":{"tf":2.8284271247461903},"376":{"tf":3.605551275463989},"377":{"tf":2.0},"386":{"tf":1.7320508075688772},"88":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}}}},"_":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":2.23606797749979}},"e":{"(":{"5":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"”":{"df":0,"docs":{},"、":{"df":0,"docs":{},"“":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"260":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"305":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"267":{"tf":1.0},"405":{"tf":5.291502622129181},"407":{"tf":2.0},"408":{"tf":2.23606797749979}},"e":{"<":{"df":0,"docs":{},"f":{">":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"405":{"tf":3.1622776601683795},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"347":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"360":{"tf":1.4142135623730951},"407":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"162":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":2,"docs":{"301":{"tf":1.0},"70":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"r":{"d":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"165":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"d":{"df":6,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":27,"docs":{"142":{"tf":1.0},"159":{"tf":2.8284271247461903},"164":{"tf":1.0},"165":{"tf":1.7320508075688772},"173":{"tf":1.0},"186":{"tf":1.0},"200":{"tf":1.0},"202":{"tf":2.8284271247461903},"219":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"228":{"tf":1.0},"240":{"tf":1.7320508075688772},"320":{"tf":1.7320508075688772},"351":{"tf":1.4142135623730951},"36":{"tf":2.0},"391":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.4142135623730951},"414":{"tf":1.4142135623730951},"42":{"tf":2.23606797749979},"45":{"tf":1.0},"51":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.7320508075688772},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"208":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}}},"n":{"df":4,"docs":{"273":{"tf":1.0},"320":{"tf":1.0},"407":{"tf":1.0},"75":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"106":{"tf":1.0},"283":{"tf":1.4142135623730951},"52":{"tf":1.0},"53":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"198":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"123":{"tf":1.0}}}}},"r":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"417":{"tf":1.0}}}}}}},".":{".":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"416":{"tf":1.0}}}}}}},"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"416":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"416":{"tf":1.0}}}}}}},"0":{"df":1,"docs":{"417":{"tf":1.0}}},"1":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"416":{"tf":1.0}}},"df":0,"docs":{}}},"[":{".":{".":{"b":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{".":{".":{"b":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"417":{"tf":1.0}}}}}}},"df":2,"docs":{"416":{"tf":7.874007874011811},"417":{"tf":2.6457513110645907}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":7,"docs":{"306":{"tf":1.0},"347":{"tf":1.7320508075688772},"351":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"57":{"tf":2.0},"58":{"tf":1.0}}}}}}},"t":{"df":1,"docs":{"324":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"308":{"tf":1.0},"324":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"211":{"tf":1.4142135623730951},"266":{"tf":1.0},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"368":{"tf":3.3166247903554},"412":{"tf":1.0}}}}}}},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}}}},"f":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"385":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"0":{"2":{"5":{"3":{"1":{"5":{"9":{"1":{"9":{"7":{"df":0,"docs":{},"f":{"7":{"8":{"4":{"1":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"d":{"2":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"8":{"d":{"1":{"a":{"4":{"9":{"c":{"3":{"b":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"1":{"0":{"a":{"3":{"0":{"8":{"6":{"c":{"5":{"8":{"df":0,"docs":{},"e":{"5":{"2":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"a":{"9":{"0":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"a":{"7":{"8":{"df":0,"docs":{},"f":{"6":{"4":{"b":{"6":{"6":{"8":{"df":0,"docs":{},"f":{"6":{"3":{"df":0,"docs":{},"f":{"5":{"8":{"1":{"2":{"0":{"3":{"c":{"6":{"b":{"a":{"c":{"5":{"0":{"9":{"9":{"0":{"3":{"df":0,"docs":{},"f":{"7":{"c":{"0":{"0":{"df":0,"docs":{},"e":{"df":1,"docs":{"171":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":2,"docs":{"175":{"tf":1.4142135623730951},"53":{"tf":2.23606797749979}}},"df":0,"docs":{}},"6":{"4":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"94":{"tf":1.0}}},"x":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":10,"docs":{"175":{"tf":1.0},"176":{"tf":1.4142135623730951},"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951},"331":{"tf":2.23606797749979},"417":{"tf":1.0},"53":{"tf":2.0},"54":{"tf":1.4142135623730951},"70":{"tf":1.0},"94":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":19,"docs":{"120":{"tf":1.0},"198":{"tf":3.7416573867739413},"199":{"tf":3.0},"200":{"tf":3.0},"201":{"tf":3.0},"202":{"tf":3.1622776601683795},"206":{"tf":3.1622776601683795},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":2.23606797749979},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"257":{"tf":1.0},"260":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":2.0},"323":{"tf":1.0},"405":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":8,"docs":{"198":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":2.0},"202":{"tf":2.0},"206":{"tf":2.0},"228":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"318":{"tf":1.0}}}},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"412":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":14,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.4142135623730951},"182":{"tf":2.0},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"232":{"tf":1.0},"247":{"tf":1.0},"348":{"tf":1.0},"361":{"tf":1.0},"412":{"tf":1.4142135623730951},"53":{"tf":1.0},"61":{"tf":2.449489742783178},"70":{"tf":1.0},"95":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},",":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"431":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":7,"docs":{"228":{"tf":2.449489742783178},"229":{"tf":2.8284271247461903},"231":{"tf":1.7320508075688772},"232":{"tf":3.4641016151377544},"249":{"tf":3.0},"250":{"tf":2.23606797749979},"321":{"tf":2.0}}}},"v":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"397":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"348":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"348":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"y":{"df":1,"docs":{"152":{"tf":1.0}}}},"c":{"df":1,"docs":{"158":{"tf":1.0}}},"df":14,"docs":{"10":{"tf":1.0},"242":{"tf":3.0},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"325":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0},"381":{"tf":1.4142135623730951},"385":{"tf":2.0},"405":{"tf":6.324555320336759},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"431":{"tf":1.0},"53":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"296":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"435":{"tf":1.0},"437":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"237":{"tf":1.0},"364":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"435":{"tf":1.0}}}}}}}}}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"59":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"359":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"t":{"c":{"df":0,"docs":{},"h":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"398":{"tf":2.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"149":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"149":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":5,"docs":{"260":{"tf":1.0},"391":{"tf":1.0},"405":{"tf":1.7320508075688772},"82":{"tf":1.0},"83":{"tf":1.0}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}}}},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}}},":":{"/":{"/":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"a":{"d":{"d":{"/":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.7320508075688772}}}}},"df":1,"docs":{"266":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"_":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"/":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"_":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"289":{"tf":1.0}}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"61":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"1":{"0":{"df":6,"docs":{"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"240":{"tf":1.0},"241":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":5,"docs":{"273":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"277":{"tf":1.0},"279":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"102":{"tf":1.0},"106":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"157":{"tf":1.0},"162":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":5,"docs":{"386":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":10,"docs":{"202":{"tf":1.7320508075688772},"261":{"tf":1.7320508075688772},"32":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"261":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"i":{"df":1,"docs":{"335":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"398":{"tf":1.0},"405":{"tf":2.449489742783178},"407":{"tf":1.4142135623730951},"408":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"246":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"289":{"tf":1.0},"290":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":1.7320508075688772}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"301":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":8,"docs":{"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"232":{"tf":1.4142135623730951}}}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"427":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":5,"docs":{"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0}}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"350":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"360":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":4,"docs":{"199":{"tf":1.7320508075688772},"242":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"239":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"376":{"tf":2.0},"377":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"49":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"c":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"158":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"?":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"161":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":6,"docs":{"157":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":2.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"157":{"tf":2.449489742783178},"158":{"tf":2.0},"160":{"tf":2.23606797749979},"161":{"tf":1.4142135623730951},"162":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":15,"docs":{"217":{"tf":1.7320508075688772},"218":{"tf":2.0},"219":{"tf":1.0},"221":{"tf":2.449489742783178},"222":{"tf":2.449489742783178},"223":{"tf":2.23606797749979},"224":{"tf":3.0},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.4641016151377544},"249":{"tf":3.3166247903554},"250":{"tf":2.449489742783178}}}}},"df":0,"docs":{}}},"df":16,"docs":{"157":{"tf":2.23606797749979},"158":{"tf":2.23606797749979},"159":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"218":{"tf":1.7320508075688772},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.449489742783178},"225":{"tf":2.23606797749979},"226":{"tf":1.0},"24":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"260":{"tf":1.4142135623730951}},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"402":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"214":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"250":{"tf":1.0}}}}}}},"df":18,"docs":{"198":{"tf":2.449489742783178},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.23606797749979},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"247":{"tf":2.23606797749979},"250":{"tf":1.4142135623730951},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"324":{"tf":1.4142135623730951}},"e":{"d":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"247":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"323":{"tf":1.4142135623730951},"395":{"tf":1.0},"413":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":63,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":2.8284271247461903},"199":{"tf":2.8284271247461903},"200":{"tf":2.23606797749979},"201":{"tf":2.0},"202":{"tf":2.6457513110645907},"206":{"tf":2.0},"207":{"tf":2.6457513110645907},"208":{"tf":2.449489742783178},"211":{"tf":3.3166247903554},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.6457513110645907},"232":{"tf":2.23606797749979},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.4142135623730951},"257":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":3.1622776601683795},"267":{"tf":1.0},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.4142135623730951},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":3.1622776601683795},"323":{"tf":1.7320508075688772},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"/":{"9":{"9":{".":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"6":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"190":{"tf":1.4142135623730951},"192":{"tf":2.0}}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"(":{"&":{"df":2,"docs":{"77":{"tf":1.0},"78":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"[":{"0":{".":{".":{"6":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"[":{"0":{".":{".":{"6":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"191":{"tf":1.4142135623730951},"77":{"tf":2.449489742783178},"78":{"tf":2.23606797749979}},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"<":{"'":{"a":{">":{"(":{"df":1,"docs":{"191":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"191":{"tf":1.7320508075688772},"77":{"tf":1.7320508075688772},"78":{"tf":3.3166247903554}}},"df":0,"docs":{}}}}},"df":13,"docs":{"102":{"tf":1.0},"134":{"tf":2.449489742783178},"152":{"tf":1.0},"187":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":5.0990195135927845},"360":{"tf":2.23606797749979},"368":{"tf":1.0},"49":{"tf":1.0},"54":{"tf":1.4142135623730951},"66":{"tf":1.0},"74":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":4,"docs":{"105":{"tf":2.0},"106":{"tf":1.0},"358":{"tf":1.0},"58":{"tf":2.6457513110645907}}}},"x":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"427":{"tf":2.449489742783178},"430":{"tf":1.0},"434":{"tf":1.4142135623730951}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":3.605551275463989}}},"o":{"a":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"6":{"4":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"173":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"53":{"tf":1.0}}}},"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"53":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"376":{"tf":3.872983346207417}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"377":{"tf":1.0},"378":{"tf":1.0}}}}}}},"df":0,"docs":{}},":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":2,"docs":{"377":{"tf":2.449489742783178},"378":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"377":{"tf":1.0},"378":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":3,"docs":{"121":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"381":{"tf":1.7320508075688772},"426":{"tf":1.4142135623730951}}}},"n":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"385":{"tf":1.0},"386":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":245,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":3.605551275463989},"102":{"tf":1.4142135623730951},"103":{"tf":2.0},"104":{"tf":1.7320508075688772},"105":{"tf":2.8284271247461903},"106":{"tf":1.4142135623730951},"107":{"tf":3.3166247903554},"108":{"tf":2.0},"113":{"tf":1.0},"114":{"tf":2.23606797749979},"115":{"tf":1.4142135623730951},"116":{"tf":2.6457513110645907},"118":{"tf":1.7320508075688772},"119":{"tf":1.7320508075688772},"120":{"tf":2.0},"121":{"tf":2.23606797749979},"122":{"tf":1.4142135623730951},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":2.0},"141":{"tf":2.6457513110645907},"142":{"tf":1.7320508075688772},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":2.449489742783178},"165":{"tf":1.0},"167":{"tf":1.7320508075688772},"170":{"tf":2.0},"172":{"tf":2.6457513110645907},"173":{"tf":1.7320508075688772},"175":{"tf":2.8284271247461903},"176":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":2.0},"180":{"tf":3.1622776601683795},"181":{"tf":3.3166247903554},"182":{"tf":2.8284271247461903},"183":{"tf":1.4142135623730951},"185":{"tf":1.7320508075688772},"186":{"tf":2.23606797749979},"188":{"tf":2.449489742783178},"189":{"tf":2.0},"190":{"tf":1.0},"191":{"tf":3.0},"192":{"tf":2.449489742783178},"194":{"tf":1.4142135623730951},"198":{"tf":3.0},"199":{"tf":3.0},"200":{"tf":2.0},"201":{"tf":2.449489742783178},"202":{"tf":2.8284271247461903},"203":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"207":{"tf":2.0},"208":{"tf":1.7320508075688772},"210":{"tf":2.23606797749979},"211":{"tf":1.7320508075688772},"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"22":{"tf":1.0},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.449489742783178},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":3.0},"229":{"tf":4.0},"23":{"tf":1.0},"231":{"tf":2.23606797749979},"232":{"tf":4.898979485566356},"235":{"tf":1.0},"239":{"tf":1.7320508075688772},"240":{"tf":2.23606797749979},"241":{"tf":1.7320508075688772},"242":{"tf":3.3166247903554},"243":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"245":{"tf":1.0},"246":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"249":{"tf":4.47213595499958},"250":{"tf":3.1622776601683795},"257":{"tf":1.4142135623730951},"258":{"tf":2.0},"26":{"tf":1.0},"266":{"tf":2.0},"272":{"tf":1.0},"273":{"tf":1.4142135623730951},"274":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":2.0},"280":{"tf":1.7320508075688772},"281":{"tf":3.1622776601683795},"283":{"tf":2.449489742783178},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"289":{"tf":4.242640687119285},"290":{"tf":2.449489742783178},"291":{"tf":1.0},"293":{"tf":2.0},"294":{"tf":2.23606797749979},"298":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":4.123105625617661},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"32":{"tf":1.0},"320":{"tf":2.8284271247461903},"321":{"tf":1.0},"322":{"tf":3.0},"323":{"tf":2.23606797749979},"324":{"tf":1.7320508075688772},"325":{"tf":1.4142135623730951},"33":{"tf":2.23606797749979},"331":{"tf":2.0},"334":{"tf":2.449489742783178},"335":{"tf":2.8284271247461903},"337":{"tf":1.0},"338":{"tf":1.0},"339":{"tf":1.4142135623730951},"34":{"tf":1.0},"340":{"tf":1.7320508075688772},"341":{"tf":2.6457513110645907},"342":{"tf":6.4031242374328485},"343":{"tf":3.1622776601683795},"348":{"tf":1.0},"349":{"tf":1.0},"35":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.4142135623730951},"352":{"tf":2.0},"353":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.4142135623730951},"359":{"tf":2.449489742783178},"36":{"tf":1.0},"360":{"tf":3.1622776601683795},"361":{"tf":1.7320508075688772},"362":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":3.605551275463989},"369":{"tf":1.7320508075688772},"37":{"tf":1.0},"370":{"tf":1.0},"374":{"tf":2.0},"375":{"tf":2.0},"376":{"tf":5.5677643628300215},"377":{"tf":2.8284271247461903},"378":{"tf":1.4142135623730951},"381":{"tf":5.0},"382":{"tf":2.23606797749979},"383":{"tf":2.0},"385":{"tf":3.872983346207417},"386":{"tf":2.449489742783178},"390":{"tf":1.0},"391":{"tf":2.8284271247461903},"392":{"tf":1.7320508075688772},"393":{"tf":1.0},"397":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":2.0},"402":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"405":{"tf":6.244997998398398},"407":{"tf":4.0},"408":{"tf":4.0},"41":{"tf":1.0},"412":{"tf":1.0},"414":{"tf":2.0},"416":{"tf":1.0},"417":{"tf":1.0},"42":{"tf":1.4142135623730951},"427":{"tf":2.0},"428":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772},"53":{"tf":2.0},"54":{"tf":2.449489742783178},"55":{"tf":2.0},"56":{"tf":2.0},"57":{"tf":1.7320508075688772},"58":{"tf":2.6457513110645907},"59":{"tf":1.4142135623730951},"61":{"tf":2.6457513110645907},"62":{"tf":2.6457513110645907},"68":{"tf":1.4142135623730951},"69":{"tf":1.0},"70":{"tf":2.449489742783178},"71":{"tf":1.7320508075688772},"72":{"tf":2.23606797749979},"73":{"tf":3.0},"74":{"tf":2.449489742783178},"75":{"tf":3.1622776601683795},"77":{"tf":3.4641016151377544},"78":{"tf":3.3166247903554},"82":{"tf":2.23606797749979},"83":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":2.0},"89":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"91":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":2.0},"94":{"tf":1.0},"95":{"tf":2.0},"96":{"tf":1.4142135623730951},"97":{"tf":1.7320508075688772}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"242":{"tf":2.6457513110645907}}}}},"o":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"242":{"tf":2.8284271247461903},"405":{"tf":4.47213595499958},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"当":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"尝":{"df":0,"docs":{},"试":{"df":0,"docs":{},"编":{"df":0,"docs":{},"译":{"df":0,"docs":{},"此":{"df":0,"docs":{},"代":{"df":0,"docs":{},"码":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"会":{"df":0,"docs":{},"出":{"df":0,"docs":{},"现":{"df":0,"docs":{},"错":{"df":0,"docs":{},"误":{"df":0,"docs":{},"提":{"df":0,"docs":{},"示":{"df":0,"docs":{},":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"242":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"242":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"102":{"tf":1.0},"324":{"tf":1.0}}}}}},"o":{"(":{"3":{"df":1,"docs":{"360":{"tf":1.0}}},"_":{"df":1,"docs":{"360":{"tf":1.0}}},"df":0,"docs":{},"x":{"df":1,"docs":{"352":{"tf":1.0}}}},"<":{"'":{"a":{">":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"191":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"414":{"tf":1.0}},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"352":{"tf":1.0},"370":{"tf":1.4142135623730951},"391":{"tf":1.0},"45":{"tf":1.0}}},"r":{".":{"<":{"/":{"df":0,"docs":{},"p":{"df":1,"docs":{"401":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"368":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"180":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"201":{"tf":1.0}}}}}}},"{":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"400":{"tf":1.0},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"141":{"tf":2.0},"179":{"tf":1.4142135623730951},"180":{"tf":1.7320508075688772},"181":{"tf":1.4142135623730951},"182":{"tf":2.0},"201":{"tf":1.4142135623730951},"377":{"tf":2.0},"391":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"91":{"tf":1.0}},"t":{"df":1,"docs":{"377":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"400":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.7320508075688772}}}},"df":21,"docs":{"142":{"tf":1.0},"173":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"320":{"tf":1.7320508075688772},"324":{"tf":1.0},"351":{"tf":1.4142135623730951},"362":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":1.4142135623730951},"414":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"428":{"tf":1.0},"51":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"r":{"df":5,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.7320508075688772},"203":{"tf":1.0},"330":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"392":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"ç":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"431":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"137":{"tf":1.0}}},"df":2,"docs":{"283":{"tf":1.0},"70":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"g":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":2.0}}},"m":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"162":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":1,"docs":{"162":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{">":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":8,"docs":{"114":{"tf":2.23606797749979},"115":{"tf":1.7320508075688772},"116":{"tf":3.1622776601683795},"120":{"tf":1.7320508075688772},"121":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":3.0},"128":{"tf":1.4142135623730951}},"e":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"/":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"114":{"tf":1.0}}}}}},"s":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"161":{"tf":1.7320508075688772},"218":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"\"":{"4":{"0":{"4":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"401":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"161":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":11,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"218":{"tf":1.0},"221":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":4,"docs":{"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.4142135623730951}},"i":{"df":2,"docs":{"364":{"tf":1.0},"376":{"tf":1.4142135623730951}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"'":{"df":4,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"368":{"tf":1.0},"75":{"tf":1.4142135623730951}}},"1":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}},"2":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":34,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":2.449489742783178},"146":{"tf":1.0},"162":{"tf":1.7320508075688772},"189":{"tf":1.0},"206":{"tf":2.0},"237":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"273":{"tf":1.0},"283":{"tf":1.0},"299":{"tf":1.7320508075688772},"31":{"tf":1.0},"316":{"tf":1.4142135623730951},"320":{"tf":1.0},"34":{"tf":1.0},"368":{"tf":2.23606797749979},"376":{"tf":1.4142135623730951},"377":{"tf":1.0},"382":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"386":{"tf":1.4142135623730951},"393":{"tf":1.0},"405":{"tf":3.3166247903554},"407":{"tf":2.0},"408":{"tf":1.7320508075688772},"412":{"tf":1.0},"55":{"tf":2.23606797749979},"56":{"tf":1.7320508075688772},"57":{"tf":2.23606797749979},"58":{"tf":2.0},"75":{"tf":1.0},"96":{"tf":1.0}}}}}}},"df":1,"docs":{"260":{"tf":1.0}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"376":{"tf":2.23606797749979}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"252":{"tf":1.0},"428":{"tf":1.0}}}}}}},"t":{"1":{"df":1,"docs":{"318":{"tf":1.7320508075688772}}},"2":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"318":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"318":{"tf":1.7320508075688772}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":2,"docs":{"316":{"tf":1.0},"322":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"315":{"tf":3.872983346207417},"316":{"tf":5.477225575051661},"317":{"tf":1.0},"318":{"tf":3.1622776601683795},"319":{"tf":4.795831523312719},"320":{"tf":7.0710678118654755},"321":{"tf":4.0},"322":{"tf":4.123105625617661},"323":{"tf":4.47213595499958},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"412":{"tf":1.4142135623730951}},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"316":{"tf":1.0},"320":{"tf":2.8284271247461903}}}}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"323":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"323":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"任":{"df":0,"docs":{},"务":{"df":0,"docs":{},"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"线":{"df":0,"docs":{},"程":{"df":0,"docs":{},"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"327":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}},"df":0,"docs":{}}}}}}},"。":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"319":{"tf":1.0}}}}}}}}}}}},"{":{"3":{"2":{"df":1,"docs":{"428":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}}}},"g":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"213":{"tf":1.0}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"260":{"tf":1.0},"31":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"、":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"330":{"tf":1.4142135623730951}}}},"r":{"b":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"64":{"tf":1.0},"70":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":1,"docs":{"113":{"tf":2.23606797749979}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"437":{"tf":1.0}}}}},"c":{"c":{"df":2,"docs":{"15":{"tf":1.0},"24":{"tf":1.0}}},"df":1,"docs":{"70":{"tf":1.7320508075688772}}},"df":4,"docs":{"10":{"tf":1.0},"213":{"tf":1.0},"325":{"tf":1.0},"359":{"tf":2.0}},"e":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"/":{"2":{"0":{"1":{"0":{"0":{"1":{"0":{"1":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"41":{"tf":1.4142135623730951},"421":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"391":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":10,"docs":{"120":{"tf":1.0},"169":{"tf":1.0},"225":{"tf":1.0},"246":{"tf":1.0},"252":{"tf":1.0},"266":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"405":{"tf":1.0},"57":{"tf":1.0}},"i":{"c":{"<":{"df":0,"docs":{},"t":{">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"383":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"169":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"12":{"tf":1.0},"239":{"tf":2.0}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"167":{"tf":1.0},"93":{"tf":1.4142135623730951}}}}}}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":2.0},"29":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"u":{"b":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"259":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.0}}}}}}}},"v":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"239":{"tf":1.0}}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"df":1,"docs":{"239":{"tf":2.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"52":{"tf":1.0}},"n":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"72":{"tf":2.0}}}}}}}}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":3,"docs":{"112":{"tf":1.0},"126":{"tf":2.449489742783178},"199":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":7,"docs":{"211":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"323":{"tf":1.0},"370":{"tf":1.4142135623730951},"383":{"tf":1.0},"59":{"tf":1.0}},"e":{"df":3,"docs":{"137":{"tf":1.0},"286":{"tf":1.4142135623730951},"352":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":1,"docs":{"313":{"tf":1.4142135623730951}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"406":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"_":{"1":{"0":{"0":{"df":1,"docs":{"202":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":1,"docs":{"202":{"tf":2.23606797749979}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"258":{"tf":1.4142135623730951},"348":{"tf":1.0},"359":{"tf":1.7320508075688772}}},"t":{"df":1,"docs":{"201":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"201":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"201":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"201":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":4,"docs":{"157":{"tf":1.0},"158":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"162":{"tf":2.0}},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"157":{"tf":2.23606797749979},"158":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"157":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"p":{"df":4,"docs":{"10":{"tf":1.0},"213":{"tf":1.7320508075688772},"214":{"tf":1.0},"267":{"tf":1.0}}}},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"110":{"tf":1.0},"113":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"305":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},".":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"(":{")":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":4,"docs":{"167":{"tf":1.0},"382":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}},"e":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":4,"docs":{"125":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"2":{"0":{"0":{"df":1,"docs":{"202":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"167":{"tf":2.0},"202":{"tf":1.4142135623730951},"224":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":19,"docs":{"124":{"tf":2.23606797749979},"125":{"tf":3.3166247903554},"167":{"tf":5.0},"202":{"tf":5.477225575051661},"260":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":4.47213595499958},"34":{"tf":3.0},"35":{"tf":3.0},"36":{"tf":2.6457513110645907},"37":{"tf":2.23606797749979},"38":{"tf":1.7320508075688772},"382":{"tf":3.605551275463989},"41":{"tf":3.3166247903554},"42":{"tf":5.291502622129181},"43":{"tf":3.7416573867739413},"44":{"tf":2.449489742783178},"45":{"tf":4.69041575982343},"52":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":12,"docs":{"202":{"tf":2.0},"260":{"tf":1.7320508075688772},"261":{"tf":2.0},"263":{"tf":1.4142135623730951},"32":{"tf":2.0},"36":{"tf":1.7320508075688772},"38":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0}},"e":{"@":{"1":{".":{"0":{".":{"1":{"df":1,"docs":{"263":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"。":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"167":{"tf":1.0}}}}}}}}},"i":{":":{":":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}},"df":0,"docs":{}},"{":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":1,"docs":{"430":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"116":{"tf":1.0}}}}}}},"df":3,"docs":{"333":{"tf":2.449489742783178},"334":{"tf":1.0},"335":{"tf":2.449489742783178}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"398":{"tf":1.0}}}}},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"432":{"tf":1.0}}}}}}}},"h":{"1":{">":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"!":{"<":{"/":{"df":0,"docs":{},"h":{"1":{"df":1,"docs":{"400":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"!":{"<":{"/":{"df":0,"docs":{},"h":{"1":{"df":1,"docs":{"401":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"288":{"tf":1.0}}}},"n":{"d":{"df":2,"docs":{"252":{"tf":1.0},"375":{"tf":1.0}},"l":{"df":11,"docs":{"106":{"tf":1.0},"157":{"tf":1.7320508075688772},"162":{"tf":2.0},"219":{"tf":1.0},"225":{"tf":1.0},"298":{"tf":2.0},"299":{"tf":2.8284271247461903},"306":{"tf":4.0},"318":{"tf":1.4142135623730951},"353":{"tf":1.0},"36":{"tf":1.0}},"e":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"318":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"298":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"306":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"298":{"tf":1.4142135623730951}}}}}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"398":{"tf":1.7320508075688772},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"153":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":6,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"146":{"tf":2.0},"151":{"tf":1.0},"17":{"tf":1.0},"423":{"tf":3.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"151":{"tf":2.0}}}},"m":{"a":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"121":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"380":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"k":{"df":4,"docs":{"146":{"tf":1.4142135623730951},"169":{"tf":1.0},"420":{"tf":1.4142135623730951},"423":{"tf":1.0}}}},"df":4,"docs":{"121":{"tf":1.4142135623730951},"124":{"tf":1.0},"147":{"tf":1.7320508075688772},"151":{"tf":1.0}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"三":{"df":0,"docs":{},"个":{"df":0,"docs":{},"常":{"df":0,"docs":{},"用":{"df":0,"docs":{},"集":{"df":0,"docs":{},"合":{"df":0,"docs":{},"中":{"df":0,"docs":{},",":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"147":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"331":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"378":{"tf":1.0},"405":{"tf":1.0}}}}}},"y":{"df":1,"docs":{"152":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"414":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"216":{"tf":1.7320508075688772},"414":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"”":{"df":0,"docs":{},"(":{"df":0,"docs":{},"“":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"152":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":4,"docs":{"142":{"tf":1.7320508075688772},"325":{"tf":1.0},"359":{"tf":1.0},"56":{"tf":1.4142135623730951}},"e":{"a":{"d":{"df":2,"docs":{"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"398":{"tf":1.0},"399":{"tf":1.7320508075688772},"401":{"tf":1.0},"402":{"tf":1.0}},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"、":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},"df":0,"docs":{}}},";":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"p":{"df":1,"docs":{"66":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"88":{"tf":2.0}}},"df":11,"docs":{"100":{"tf":1.0},"199":{"tf":3.7416573867739413},"242":{"tf":3.872983346207417},"335":{"tf":2.23606797749979},"88":{"tf":2.0},"90":{"tf":2.23606797749979},"91":{"tf":3.0},"93":{"tf":2.0},"95":{"tf":2.6457513110645907},"96":{"tf":1.4142135623730951},"97":{"tf":2.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"\"":{"[":{"0":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"\"":{")":{";":{"df":0,"docs":{},"。":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"&":{"(":{"*":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":6,"docs":{"400":{"tf":1.7320508075688772},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951}}}}}},":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"405":{"tf":1.0},"408":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"[":{"0":{".":{".":{"1":{"df":1,"docs":{"143":{"tf":1.0}}},"4":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"26":{"tf":2.6457513110645907},"27":{"tf":2.23606797749979},"29":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":3.872983346207417}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}}}}},"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"391":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"391":{"tf":4.47213595499958}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":2,"docs":{"21":{"tf":2.0},"369":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":41,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"140":{"tf":3.3166247903554},"141":{"tf":1.0},"142":{"tf":4.795831523312719},"143":{"tf":1.0},"150":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"191":{"tf":1.0},"20":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"21":{"tf":1.0},"22":{"tf":2.23606797749979},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"26":{"tf":1.7320508075688772},"266":{"tf":1.0},"27":{"tf":2.23606797749979},"281":{"tf":2.6457513110645907},"30":{"tf":1.0},"316":{"tf":1.7320508075688772},"32":{"tf":1.7320508075688772},"320":{"tf":1.0},"362":{"tf":1.0},"369":{"tf":1.0},"382":{"tf":1.0},"383":{"tf":1.0},"391":{"tf":2.0},"395":{"tf":1.4142135623730951},"397":{"tf":1.7320508075688772},"398":{"tf":1.0},"405":{"tf":3.872983346207417},"407":{"tf":2.0},"408":{"tf":1.0},"55":{"tf":1.4142135623730951},"59":{"tf":1.0},"68":{"tf":1.4142135623730951},"69":{"tf":1.0},"70":{"tf":1.0},"78":{"tf":2.23606797749979}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"m":{"df":0,"docs":{},"、":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"p":{"df":44,"docs":{"102":{"tf":1.4142135623730951},"106":{"tf":1.0},"120":{"tf":1.0},"142":{"tf":1.7320508075688772},"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"186":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"240":{"tf":1.0},"242":{"tf":1.0},"246":{"tf":1.0},"26":{"tf":1.0},"267":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"283":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"324":{"tf":1.7320508075688772},"335":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"368":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.4142135623730951},"386":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.4142135623730951},"427":{"tf":1.0},"428":{"tf":1.4142135623730951},"49":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.7320508075688772},"87":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"e":{"df":29,"docs":{"106":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"134":{"tf":1.7320508075688772},"137":{"tf":1.0},"185":{"tf":1.7320508075688772},"188":{"tf":1.7320508075688772},"189":{"tf":1.0},"203":{"tf":1.4142135623730951},"208":{"tf":1.4142135623730951},"211":{"tf":1.0},"240":{"tf":1.0},"285":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"322":{"tf":1.0},"323":{"tf":1.0},"352":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"370":{"tf":1.4142135623730951},"376":{"tf":1.0},"405":{"tf":1.0},"42":{"tf":1.0},"59":{"tf":1.0},"70":{"tf":1.4142135623730951},"74":{"tf":2.449489742783178},"78":{"tf":1.7320508075688772}}}},"x":{"df":1,"docs":{"53":{"tf":1.0}}}},"i":{"df":7,"docs":{"298":{"tf":5.916079783099616},"300":{"tf":1.7320508075688772},"302":{"tf":1.0},"303":{"tf":1.0},"318":{"tf":5.916079783099616},"319":{"tf":1.0},"320":{"tf":1.0}},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"167":{"tf":1.0}}}}},"o":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},",":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"102":{"tf":1.0}}}}}}}}},"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"142":{"tf":1.0}}},"d":{"df":2,"docs":{"95":{"tf":2.449489742783178},"97":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"267":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"101":{"tf":2.0},"165":{"tf":1.0},"21":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"260":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"59":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"196":{"tf":1.0}}}}}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"179":{"tf":1.0},"180":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":9,"docs":{"114":{"tf":2.0},"115":{"tf":3.0},"116":{"tf":3.4641016151377544},"120":{"tf":2.449489742783178},"121":{"tf":1.0},"123":{"tf":1.4142135623730951},"127":{"tf":3.0},"128":{"tf":1.0},"398":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.7320508075688772}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"120":{"tf":2.0},"121":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"。":{"df":0,"docs":{},"最":{"df":0,"docs":{},"后":{"df":0,"docs":{},",":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"116":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"w":{"'":{"df":1,"docs":{"383":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"v":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"359":{"tf":1.0}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"5":{"df":1,"docs":{"400":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"316":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":6,"docs":{"0":{"tf":1.0},"257":{"tf":2.6457513110645907},"316":{"tf":2.0},"400":{"tf":3.3166247903554},"401":{"tf":3.4641016151377544},"404":{"tf":1.0}}}},"t":{"df":0,"docs":{},"p":{"/":{"1":{".":{"1":{"df":8,"docs":{"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":1.0},"401":{"tf":2.23606797749979},"402":{"tf":1.7320508075688772},"404":{"tf":2.23606797749979},"405":{"tf":3.872983346207417},"408":{"tf":3.1622776601683795}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"/":{"/":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{":":{"7":{"8":{"7":{"8":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"404":{"tf":1.0}}}}}}}},"df":1,"docs":{"404":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"398":{"tf":1.7320508075688772},"399":{"tf":1.0},"400":{"tf":1.4142135623730951}}}}}}}}}},"df":9,"docs":{"15":{"tf":1.0},"166":{"tf":1.0},"316":{"tf":1.0},"395":{"tf":2.0},"396":{"tf":2.23606797749979},"397":{"tf":1.0},"398":{"tf":2.449489742783178},"399":{"tf":2.449489742783178},"401":{"tf":1.0}},"s":{":":{"/":{"/":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"m":{"df":1,"docs":{"259":{"tf":1.0}}}},"df":1,"docs":{"260":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"c":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":6,"docs":{"0":{"tf":1.0},"142":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.4142135623730951},"32":{"tf":1.0},"353":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"c":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":3,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"428":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"359":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":4.358898943540674}}}},"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"196":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"396":{"tf":1.0}}}}}}}}}}},"i":{"'":{"df":0,"docs":{},"m":{"df":3,"docs":{"218":{"tf":1.7320508075688772},"225":{"tf":1.0},"229":{"tf":1.0}}}},".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{")":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"/":{"df":0,"docs":{},"o":{"df":10,"docs":{"213":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"248":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"253":{"tf":1.0},"381":{"tf":1.4142135623730951},"400":{"tf":1.0},"405":{"tf":2.23606797749979}}}},"1":{"2":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":2,"docs":{"252":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"3":{"2":{"df":57,"docs":{"101":{"tf":3.605551275463989},"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"147":{"tf":1.0},"149":{"tf":1.0},"167":{"tf":3.0},"169":{"tf":1.0},"170":{"tf":2.449489742783178},"172":{"tf":2.0},"175":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"181":{"tf":1.7320508075688772},"187":{"tf":2.8284271247461903},"191":{"tf":2.0},"192":{"tf":1.7320508075688772},"202":{"tf":2.8284271247461903},"206":{"tf":1.4142135623730951},"245":{"tf":1.0},"252":{"tf":1.4142135623730951},"257":{"tf":2.0},"266":{"tf":2.0},"272":{"tf":1.7320508075688772},"273":{"tf":1.4142135623730951},"274":{"tf":2.6457513110645907},"275":{"tf":1.4142135623730951},"277":{"tf":1.7320508075688772},"280":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":2.449489742783178},"306":{"tf":2.449489742783178},"331":{"tf":1.4142135623730951},"352":{"tf":2.0},"359":{"tf":4.358898943540674},"360":{"tf":2.23606797749979},"362":{"tf":1.0},"367":{"tf":2.6457513110645907},"368":{"tf":4.123105625617661},"370":{"tf":1.0},"375":{"tf":1.4142135623730951},"377":{"tf":2.0},"380":{"tf":1.0},"381":{"tf":3.3166247903554},"385":{"tf":3.1622776601683795},"386":{"tf":2.23606797749979},"417":{"tf":1.0},"42":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":2.0},"56":{"tf":2.0},"58":{"tf":3.1622776601683795},"61":{"tf":1.0},"70":{"tf":1.7320508075688772},"71":{"tf":1.4142135623730951},"79":{"tf":1.0},"85":{"tf":2.23606797749979}},"。":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"53":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"172":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},";":{"3":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"6":{"4":{"df":3,"docs":{"252":{"tf":1.4142135623730951},"42":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":2,"docs":{"102":{"tf":3.3166247903554},"53":{"tf":1.4142135623730951}}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"=":{"1":{"df":1,"docs":{"393":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"362":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":7,"docs":{"20":{"tf":2.0},"362":{"tf":4.0},"380":{"tf":1.4142135623730951},"405":{"tf":5.830951894845301},"407":{"tf":4.242640687119285},"408":{"tf":3.7416573867739413},"429":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":4,"docs":{"320":{"tf":1.0},"391":{"tf":2.449489742783178},"416":{"tf":2.6457513110645907},"417":{"tf":2.8284271247461903}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":3,"docs":{"260":{"tf":1.0},"398":{"tf":1.0},"414":{"tf":1.7320508075688772}}}}},"(":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}}},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"348":{"tf":1.4142135623730951}}}}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":18,"docs":{"198":{"tf":2.23606797749979},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.0},"208":{"tf":3.605551275463989},"211":{"tf":2.8284271247461903},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"246":{"tf":1.0},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"36":{"tf":1.0}},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"232":{"tf":3.605551275463989},"249":{"tf":3.0},"250":{"tf":1.7320508075688772}},"e":{"=":{"1":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"232":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"。":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"也":{"df":0,"docs":{},"没":{"df":0,"docs":{},"有":{"df":0,"docs":{},"过":{"df":0,"docs":{},"滤":{"df":0,"docs":{},"需":{"df":0,"docs":{},"要":{"df":0,"docs":{},"运":{"df":0,"docs":{},"行":{"df":0,"docs":{},"的":{"df":0,"docs":{},"测":{"df":0,"docs":{},"试":{"df":0,"docs":{},",":{"df":0,"docs":{},"所":{"df":0,"docs":{},"以":{"df":0,"docs":{},"摘":{"df":0,"docs":{},"要":{"df":0,"docs":{},"中":{"df":0,"docs":{},"会":{"df":0,"docs":{},"显":{"df":0,"docs":{},"示":{"0":{"df":1,"docs":{"198":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"333":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"134":{"tf":1.7320508075688772},"49":{"tf":2.0},"74":{"tf":1.7320508075688772},"78":{"tf":1.7320508075688772}}}}},"p":{"df":0,"docs":{},"l":{"<":{"'":{"a":{"df":3,"docs":{"192":{"tf":2.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":8,"docs":{"175":{"tf":1.4142135623730951},"183":{"tf":1.7320508075688772},"242":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"281":{"tf":2.0},"334":{"tf":1.0},"382":{"tf":1.0}}},"x":{"1":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"(":{"&":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"391":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":61,"docs":{"101":{"tf":1.4142135623730951},"119":{"tf":1.0},"161":{"tf":1.0},"167":{"tf":1.0},"175":{"tf":3.1622776601683795},"179":{"tf":2.0},"180":{"tf":2.449489742783178},"181":{"tf":3.3166247903554},"182":{"tf":3.1622776601683795},"183":{"tf":2.0},"191":{"tf":1.0},"192":{"tf":1.7320508075688772},"199":{"tf":2.0},"202":{"tf":2.0},"223":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"239":{"tf":1.0},"249":{"tf":2.6457513110645907},"250":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"330":{"tf":1.0},"331":{"tf":1.0},"334":{"tf":1.4142135623730951},"335":{"tf":2.23606797749979},"338":{"tf":1.4142135623730951},"339":{"tf":1.7320508075688772},"340":{"tf":1.4142135623730951},"341":{"tf":1.7320508075688772},"342":{"tf":3.4641016151377544},"343":{"tf":2.23606797749979},"370":{"tf":1.4142135623730951},"374":{"tf":1.7320508075688772},"375":{"tf":1.7320508075688772},"376":{"tf":4.0},"377":{"tf":2.0},"378":{"tf":1.0},"386":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"405":{"tf":4.242640687119285},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"412":{"tf":1.4142135623730951},"417":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":3.0},"94":{"tf":1.0},"95":{"tf":1.7320508075688772},"96":{"tf":2.0},"97":{"tf":2.8284271247461903},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":25,"docs":{"102":{"tf":2.8284271247461903},"142":{"tf":2.0},"162":{"tf":1.4142135623730951},"183":{"tf":2.0},"242":{"tf":1.0},"252":{"tf":1.0},"277":{"tf":1.4142135623730951},"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.7320508075688772},"309":{"tf":1.0},"320":{"tf":2.449489742783178},"323":{"tf":1.0},"324":{"tf":1.0},"335":{"tf":1.4142135623730951},"370":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":2.0},"391":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"70":{"tf":1.4142135623730951},"91":{"tf":2.0},"93":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"58":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"<":{"'":{"a":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":2.6457513110645907},"192":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"120":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"324":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"219":{"tf":1.0},"248":{"tf":1.0}}}}}}},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}},"c":{"df":1,"docs":{"369":{"tf":1.0}},"h":{"df":1,"docs":{"359":{"tf":1.0}}},"l":{"df":0,"docs":{},"u":{"d":{"df":3,"docs":{"127":{"tf":1.0},"159":{"tf":1.4142135623730951},"208":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"397":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"_":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"142":{"tf":1.0}}}}}}}}},"df":16,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"156":{"tf":2.0},"219":{"tf":1.0},"224":{"tf":2.0},"260":{"tf":1.0},"261":{"tf":1.0},"263":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"350":{"tf":2.6457513110645907},"392":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"417":{"tf":1.0},"54":{"tf":3.0},"62":{"tf":2.6457513110645907}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"417":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"273":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}}},"o":{"df":4,"docs":{"260":{"tf":1.0},"277":{"tf":1.0},"301":{"tf":1.0},"70":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.4142135623730951},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.4142135623730951},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"368":{"tf":1.7320508075688772},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"428":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"332":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"83":{"tf":1.0}},"i":{"df":4,"docs":{"140":{"tf":1.7320508075688772},"293":{"tf":2.0},"316":{"tf":1.0},"70":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"429":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},"df":1,"docs":{"51":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":17,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"191":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"382":{"tf":1.0},"391":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.7320508075688772},"43":{"tf":2.23606797749979},"44":{"tf":1.0},"45":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"398":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":5,"docs":{"147":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"143":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"15":{"tf":1.4142135623730951},"267":{"tf":3.0},"268":{"tf":1.0},"436":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"322":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":8,"docs":{"233":{"tf":1.0},"300":{"tf":1.0},"377":{"tf":1.4142135623730951},"386":{"tf":1.0},"405":{"tf":1.0},"427":{"tf":1.0},"75":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":9,"docs":{"142":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"240":{"tf":1.0},"277":{"tf":2.23606797749979},"351":{"tf":2.449489742783178},"42":{"tf":1.4142135623730951},"53":{"tf":1.0},"61":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"173":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":1.7320508075688772}}}},"df":1,"docs":{"211":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"209":{"tf":1.0}}}},"l":{"df":1,"docs":{"398":{"tf":1.0}}},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}},"r":{"df":0,"docs":{},"f":{"a":{"c":{"df":2,"docs":{"177":{"tf":1.0},"368":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},",":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"270":{"tf":1.0},"287":{"tf":1.4142135623730951}}}}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"_":{"a":{"d":{"d":{"df":1,"docs":{"210":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"2":{"df":1,"docs":{"210":{"tf":1.0}}},"a":{"df":1,"docs":{"210":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"210":{"tf":1.0}}}}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"如":{"df":0,"docs":{},"果":{"df":0,"docs":{},"你":{"df":0,"docs":{},"并":{"df":0,"docs":{},"不":{"df":0,"docs":{},"认":{"df":0,"docs":{},"为":{"df":0,"docs":{},"应":{"df":0,"docs":{},"该":{"df":0,"docs":{},"测":{"df":0,"docs":{},"试":{"df":0,"docs":{},"私":{"df":0,"docs":{},"有":{"df":0,"docs":{},"函":{"df":0,"docs":{},"数":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"210":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"210":{"tf":1.0},"211":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"247":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":5,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"87":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"239":{"tf":2.8284271247461903}}}}}}}}}},"o":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"160":{"tf":2.449489742783178},"161":{"tf":2.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"121":{"tf":1.0},"36":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}},"df":0,"docs":{}}},"{":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":9,"docs":{"125":{"tf":1.0},"158":{"tf":1.0},"213":{"tf":1.0},"248":{"tf":1.0},"313":{"tf":1.4142135623730951},"316":{"tf":1.0},"33":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"434":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"122":{"tf":1.7320508075688772}}}}}}}}},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"v":{"4":{"(":{"1":{"2":{"7":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"6":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{":":{":":{"1":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"101":{"tf":3.0},"165":{"tf":1.4142135623730951}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"v":{"4":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":2.449489742783178}}},"6":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"100":{"tf":2.0},"101":{"tf":3.605551275463989}}},"df":0,"docs":{}}}},":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"100":{"tf":2.8284271247461903},"101":{"tf":2.449489742783178},"165":{"tf":2.449489742783178},"397":{"tf":1.0}},"v":{"4":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"100":{"tf":1.0}},"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"100":{"tf":1.0}}}}}}}},"6":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"100":{"tf":1.4142135623730951}},"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"100":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"345":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.7320508075688772}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"152":{"tf":1.0}}}}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"232":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"348":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"353":{"tf":1.0},"405":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}},"t":{"'":{"df":1,"docs":{"306":{"tf":1.0}}},"_":{"a":{"d":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":2,"docs":{"200":{"tf":1.4142135623730951},"211":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"7":{"5":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":5,"docs":{"198":{"tf":1.7320508075688772},"203":{"tf":1.4142135623730951},"208":{"tf":1.4142135623730951},"210":{"tf":1.0},"266":{"tf":1.4142135623730951}}}}}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"431":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"181":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"1":{"df":1,"docs":{"181":{"tf":1.7320508075688772}}},"2":{"df":1,"docs":{"181":{"tf":2.23606797749979}}},"df":16,"docs":{"115":{"tf":1.0},"170":{"tf":1.7320508075688772},"172":{"tf":3.1622776601683795},"181":{"tf":2.23606797749979},"191":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"244":{"tf":2.23606797749979},"249":{"tf":1.0},"293":{"tf":2.6457513110645907},"324":{"tf":1.0},"374":{"tf":2.8284271247461903},"392":{"tf":1.0},"405":{"tf":1.4142135623730951},"70":{"tf":1.0},"77":{"tf":3.3166247903554},"78":{"tf":2.8284271247461903}}},"r":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"77":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"=":{"df":0,"docs":{},"t":{"df":1,"docs":{"417":{"tf":1.0}}}},"df":2,"docs":{"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"374":{"tf":1.0}}}}},"t":{"df":1,"docs":{"374":{"tf":1.0}}}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"245":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":16,"docs":{"182":{"tf":1.0},"215":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":2.8284271247461903},"245":{"tf":1.7320508075688772},"246":{"tf":2.6457513110645907},"249":{"tf":2.0},"306":{"tf":1.0},"315":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":3.0},"374":{"tf":3.3166247903554},"405":{"tf":1.0},"408":{"tf":1.0},"77":{"tf":1.7320508075688772}}}}},"’":{"df":0,"docs":{},"m":{"df":2,"docs":{"218":{"tf":1.0},"59":{"tf":1.4142135623730951}}}},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"427":{"tf":1.0}}}}}}}},"j":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"325":{"tf":1.0}},"o":{"b":{"df":3,"docs":{"405":{"tf":5.830951894845301},"407":{"tf":4.47213595499958},"408":{"tf":3.872983346207417}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"3":{"df":2,"docs":{"319":{"tf":1.0},"320":{"tf":1.7320508075688772}}},"4":{"df":1,"docs":{"320":{"tf":1.0}}},"_":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"320":{"tf":2.449489742783178},"323":{"tf":1.0}},"l":{"<":{"df":0,"docs":{},"i":{">":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"320":{"tf":2.0}},"l":{"<":{"df":0,"docs":{},"f":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}},"i":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":9,"docs":{"241":{"tf":1.0},"298":{"tf":2.449489742783178},"306":{"tf":1.0},"318":{"tf":2.6457513110645907},"320":{"tf":3.1622776601683795},"321":{"tf":1.4142135623730951},"406":{"tf":1.0},"407":{"tf":3.1622776601683795},"408":{"tf":2.23606797749979}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":5,"docs":{"298":{"tf":1.4142135623730951},"306":{"tf":1.0},"318":{"tf":1.0},"405":{"tf":2.449489742783178},"407":{"tf":1.7320508075688772}},"e":{":":{":":{"<":{"df":0,"docs":{},"t":{">":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"407":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"_":{"df":1,"docs":{"407":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"298":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"、":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"、":{"df":0,"docs":{},"r":{"a":{"c":{"df":1,"docs":{"323":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"s":{"df":1,"docs":{"24":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"k":{"'":{".":{".":{"=":{"'":{"df":0,"docs":{},"z":{"df":1,"docs":{"358":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"328":{"tf":1.0}}}},"b":{"df":1,"docs":{"267":{"tf":1.0}}},"df":2,"docs":{"146":{"tf":1.0},"242":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"389":{"tf":1.0},"398":{"tf":1.0}}}},"y":{"df":6,"docs":{"148":{"tf":1.0},"26":{"tf":1.0},"32":{"tf":1.0},"420":{"tf":1.4142135623730951},"423":{"tf":1.0},"82":{"tf":1.4142135623730951}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}}},"df":5,"docs":{"299":{"tf":1.4142135623730951},"316":{"tf":1.0},"334":{"tf":1.0},"414":{"tf":1.4142135623730951},"48":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"411":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":3.4641016151377544}}}}}}},"n":{"d":{"df":6,"docs":{"101":{"tf":2.449489742783178},"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"258":{"tf":2.6457513110645907},"43":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"a":{"b":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":6,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"401":{"tf":1.0}},"n":{"df":2,"docs":{"386":{"tf":1.0},"52":{"tf":1.0}}}}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"335":{"tf":2.0},"62":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"c":{"df":0,"docs":{},"h":{"0":{"8":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"1":{"9":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"260":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"26":{"tf":1.0},"260":{"tf":1.0},"32":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"273":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}},"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"h":{"1":{"3":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"=":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":6,"docs":{"102":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.0},"316":{"tf":1.4142135623730951},"398":{"tf":1.0},"429":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}}},"_":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":2.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"199":{"tf":2.23606797749979}}},"s":{"df":0,"docs":{},"t":{"(":{"&":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.4142135623730951},"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}}}}},"<":{"df":0,"docs":{},"t":{">":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"172":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"(":{"&":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"3":{"2":{"(":{"&":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":1,"docs":{"172":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"170":{"tf":5.291502622129181},"172":{"tf":4.898979485566356},"183":{"tf":1.4142135623730951}}}}}}},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}},"e":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"102":{"tf":1.0},"162":{"tf":1.0},"360":{"tf":1.7320508075688772},"66":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"134":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"322":{"tf":1.0},"74":{"tf":1.4142135623730951},"78":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}},"z":{"df":0,"docs":{},"i":{"df":3,"docs":{"243":{"tf":1.0},"246":{"tf":1.0},"316":{"tf":1.0}}}}},"df":1,"docs":{"141":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"294":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":1,"docs":{"294":{"tf":6.082762530298219}},"和":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"k":{"df":1,"docs":{"292":{"tf":1.0}}},"v":{"df":1,"docs":{"434":{"tf":1.0}}}},"d":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}}}}},"df":10,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":2.6457513110645907},"203":{"tf":1.0},"206":{"tf":2.0},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"323":{"tf":1.0},"368":{"tf":1.4142135623730951}}}},"n":{"df":11,"docs":{"142":{"tf":1.0},"156":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"368":{"tf":2.6457513110645907},"377":{"tf":1.7320508075688772},"416":{"tf":1.0},"417":{"tf":2.0},"54":{"tf":1.0},"72":{"tf":1.7320508075688772},"73":{"tf":2.449489742783178},"78":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":8,"docs":{"400":{"tf":1.4142135623730951},"401":{"tf":2.449489742783178},"402":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0},"72":{"tf":1.7320508075688772},"73":{"tf":1.7320508075688772}},"}":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":6,"docs":{"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"202":{"tf":2.6457513110645907}},"、":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"t":{"'":{"df":1,"docs":{"368":{"tf":1.0}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"358":{"tf":1.7320508075688772}}}}},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"348":{"tf":1.7320508075688772}}}}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"46":{"tf":1.0}},"、":{"df":0,"docs":{},"方":{"df":0,"docs":{},"法":{"df":0,"docs":{},"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"关":{"df":0,"docs":{},"联":{"df":0,"docs":{},"函":{"df":0,"docs":{},"数":{"df":0,"docs":{},"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"405":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"192":{"tf":1.0},"255":{"tf":3.0}}}}}},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":3,"docs":{"211":{"tf":1.4142135623730951},"220":{"tf":2.449489742783178},"266":{"tf":1.0}}}},"c":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}},"df":18,"docs":{"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.4142135623730951},"198":{"tf":1.4142135623730951},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"289":{"tf":1.0},"290":{"tf":1.0},"386":{"tf":1.0},"391":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"111":{"tf":1.0},"198":{"tf":1.0},"227":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0}}},"y":{"'":{"df":1,"docs":{"211":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"260":{"tf":4.242640687119285}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":10,"docs":{"169":{"tf":1.0},"184":{"tf":1.4142135623730951},"186":{"tf":1.7320508075688772},"188":{"tf":1.0},"191":{"tf":2.0},"193":{"tf":1.0},"228":{"tf":1.7320508075688772},"368":{"tf":1.0},"75":{"tf":1.7320508075688772},"87":{"tf":2.6457513110645907}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"8":{"0":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"289":{"tf":3.3166247903554},"290":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"'":{"a":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"229":{"tf":1.7320508075688772},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":28,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"162":{"tf":1.0},"167":{"tf":1.0},"214":{"tf":1.0},"229":{"tf":3.1622776601683795},"231":{"tf":1.4142135623730951},"232":{"tf":3.872983346207417},"249":{"tf":3.0},"250":{"tf":2.0},"257":{"tf":1.0},"293":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"382":{"tf":1.0},"398":{"tf":2.23606797749979},"399":{"tf":1.4142135623730951},"400":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0},"59":{"tf":1.0}}},"k":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"120":{"tf":1.0},"293":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}},"t":{"df":1,"docs":{"428":{"tf":1.7320508075688772}}},"u":{"df":0,"docs":{},"x":{"df":7,"docs":{"111":{"tf":1.0},"15":{"tf":1.7320508075688772},"17":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"260":{"tf":1.0},"27":{"tf":1.0}},"、":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"o":{"df":3,"docs":{"12":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"t":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"7":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":2.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"[":{"0":{"df":2,"docs":{"170":{"tf":1.0},"172":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"385":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"|":{"df":0,"docs":{},"i":{"df":1,"docs":{"385":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"385":{"tf":1.0}}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"385":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":14,"docs":{"170":{"tf":2.0},"172":{"tf":2.0},"241":{"tf":4.69041575982343},"242":{"tf":2.0},"268":{"tf":1.0},"273":{"tf":6.082762530298219},"274":{"tf":2.449489742783178},"275":{"tf":3.4641016151377544},"285":{"tf":3.4641016151377544},"286":{"tf":2.0},"291":{"tf":2.8284271247461903},"293":{"tf":3.7416573867739413},"331":{"tf":3.0},"436":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":9,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":8,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{")":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"2":{"df":1,"docs":{"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"e":{"8":{"6":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"185":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0}}}}}}}}},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"189":{"tf":1.0},"353":{"tf":1.0},"75":{"tf":1.0}}},"t":{"df":6,"docs":{"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.7320508075688772},"352":{"tf":1.4142135623730951},"398":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":4,"docs":{"241":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":2.0},"405":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"d":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"259":{"tf":1.4142135623730951}}}}},"l":{"df":1,"docs":{"141":{"tf":1.0}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"185":{"tf":1.4142135623730951},"188":{"tf":2.449489742783178},"189":{"tf":1.0},"59":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"1":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":2.0},"189":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"186":{"tf":1.4142135623730951},"191":{"tf":1.0}}}},"<":{"'":{"a":{">":{"(":{"df":0,"docs":{},"x":{"df":3,"docs":{"186":{"tf":1.0},"188":{"tf":1.7320508075688772},"189":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"191":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"a":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"194":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"<":{"'":{"a":{"df":1,"docs":{"194":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":6,"docs":{"186":{"tf":2.8284271247461903},"187":{"tf":1.0},"188":{"tf":3.4641016151377544},"189":{"tf":2.23606797749979},"191":{"tf":1.0},"194":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"p":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"101":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"167":{"tf":1.0},"306":{"tf":1.7320508075688772},"382":{"tf":1.7320508075688772},"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":2.0},"412":{"tf":1.0},"416":{"tf":1.0},"43":{"tf":1.7320508075688772},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"62":{"tf":3.7416573867739413}},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"62":{"tf":1.0}}}}}}}}},"w":{"df":1,"docs":{"167":{"tf":1.0}}}},"s":{"df":2,"docs":{"111":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"103":{"tf":1.0},"59":{"tf":1.4142135623730951}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"59":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"k":{"a":{"df":1,"docs":{"389":{"tf":1.0}}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"337":{"tf":1.4142135623730951},"343":{"tf":2.0}}}},"df":0,"docs":{}}}},"m":{".":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"a":{"c":{"df":1,"docs":{"398":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"398":{"tf":1.0}}}}}}}},"o":{"df":5,"docs":{"15":{"tf":1.7320508075688772},"17":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0}}},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"389":{"tf":1.4142135623730951}}}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"387":{"tf":1.0},"389":{"tf":2.23606797749979},"393":{"tf":1.7320508075688772}}}}}},"df":11,"docs":{"23":{"tf":1.0},"277":{"tf":1.4142135623730951},"301":{"tf":1.7320508075688772},"320":{"tf":1.7320508075688772},"387":{"tf":1.0},"389":{"tf":2.0},"390":{"tf":1.0},"391":{"tf":2.8284271247461903},"392":{"tf":1.0},"413":{"tf":1.0},"70":{"tf":1.7320508075688772}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"387":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"22":{"tf":1.4142135623730951},"24":{"tf":2.0}}}},"p":{"d":{"b":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":10,"docs":{"111":{"tf":1.0},"113":{"tf":1.0},"156":{"tf":1.0},"22":{"tf":2.23606797749979},"220":{"tf":2.23606797749979},"24":{"tf":2.0},"26":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"405":{"tf":1.0}}}},"df":197,"docs":{"100":{"tf":1.0},"101":{"tf":3.0},"102":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"105":{"tf":2.0},"106":{"tf":1.0},"107":{"tf":1.7320508075688772},"108":{"tf":2.0},"111":{"tf":1.4142135623730951},"113":{"tf":1.0},"121":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":2.0},"141":{"tf":2.449489742783178},"142":{"tf":1.7320508075688772},"143":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772},"155":{"tf":1.4142135623730951},"156":{"tf":1.7320508075688772},"157":{"tf":1.7320508075688772},"158":{"tf":1.4142135623730951},"159":{"tf":2.0},"162":{"tf":4.47213595499958},"165":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"175":{"tf":2.0},"176":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"185":{"tf":1.7320508075688772},"186":{"tf":1.4142135623730951},"188":{"tf":2.0},"189":{"tf":1.4142135623730951},"190":{"tf":1.4142135623730951},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"194":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.7320508075688772},"219":{"tf":1.7320508075688772},"22":{"tf":1.7320508075688772},"220":{"tf":2.0},"221":{"tf":2.8284271247461903},"222":{"tf":1.7320508075688772},"223":{"tf":1.7320508075688772},"224":{"tf":3.3166247903554},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"23":{"tf":2.23606797749979},"235":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"24":{"tf":2.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"258":{"tf":1.4142135623730951},"26":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"274":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.4142135623730951},"281":{"tf":1.7320508075688772},"283":{"tf":3.3166247903554},"285":{"tf":1.7320508075688772},"286":{"tf":1.7320508075688772},"289":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":2.0},"294":{"tf":2.449489742783178},"298":{"tf":4.47213595499958},"299":{"tf":1.7320508075688772},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":4.69041575982343},"318":{"tf":2.8284271247461903},"319":{"tf":2.23606797749979},"32":{"tf":1.0},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.4142135623730951},"33":{"tf":2.23606797749979},"335":{"tf":2.0},"337":{"tf":1.0},"34":{"tf":1.0},"343":{"tf":2.8284271247461903},"348":{"tf":1.0},"349":{"tf":1.0},"35":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.4142135623730951},"352":{"tf":1.4142135623730951},"353":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.4142135623730951},"359":{"tf":2.449489742783178},"36":{"tf":1.0},"360":{"tf":3.0},"361":{"tf":1.7320508075688772},"362":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":2.449489742783178},"369":{"tf":1.4142135623730951},"37":{"tf":1.0},"370":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":2.8284271247461903},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.7320508075688772},"383":{"tf":1.0},"385":{"tf":2.449489742783178},"391":{"tf":1.4142135623730951},"397":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.0},"408":{"tf":2.0},"41":{"tf":1.0},"414":{"tf":1.4142135623730951},"42":{"tf":1.7320508075688772},"427":{"tf":1.4142135623730951},"428":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772},"53":{"tf":2.0},"54":{"tf":2.6457513110645907},"55":{"tf":2.23606797749979},"56":{"tf":1.4142135623730951},"57":{"tf":2.0},"58":{"tf":1.7320508075688772},"59":{"tf":1.4142135623730951},"61":{"tf":2.6457513110645907},"62":{"tf":2.6457513110645907},"68":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":2.449489742783178},"71":{"tf":1.4142135623730951},"72":{"tf":1.4142135623730951},"73":{"tf":2.0},"74":{"tf":2.23606797749979},"75":{"tf":1.7320508075688772},"77":{"tf":2.23606797749979},"78":{"tf":2.23606797749979},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"93":{"tf":2.0},"95":{"tf":2.0},"96":{"tf":1.0},"97":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"df":4,"docs":{"198":{"tf":1.4142135623730951},"257":{"tf":1.0},"275":{"tf":1.0},"49":{"tf":1.0}},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"71":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"x":{"df":1,"docs":{"71":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"110":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"368":{"tf":2.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"(":{"df":0,"docs":{},"|":{"(":{"&":{"c":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.0}}}}},"df":0,"docs":{}}}}}}}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"1":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"149":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":16,"docs":{"10":{"tf":1.0},"121":{"tf":1.0},"130":{"tf":2.0},"145":{"tf":1.0},"146":{"tf":2.449489742783178},"147":{"tf":2.0},"148":{"tf":2.23606797749979},"149":{"tf":3.0},"150":{"tf":3.7416573867739413},"152":{"tf":1.7320508075688772},"246":{"tf":2.6457513110645907},"316":{"tf":1.7320508075688772},"324":{"tf":1.0},"385":{"tf":2.0},"398":{"tf":1.0},"401":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"434":{"tf":2.0},"435":{"tf":1.0},"437":{"tf":1.0}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"414":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}},"df":55,"docs":{"102":{"tf":1.0},"103":{"tf":3.872983346207417},"104":{"tf":1.0},"105":{"tf":3.3166247903554},"106":{"tf":2.23606797749979},"107":{"tf":2.23606797749979},"108":{"tf":3.7416573867739413},"109":{"tf":1.0},"125":{"tf":1.4142135623730951},"134":{"tf":1.4142135623730951},"136":{"tf":1.0},"157":{"tf":2.23606797749979},"158":{"tf":3.4641016151377544},"159":{"tf":1.4142135623730951},"160":{"tf":2.449489742783178},"161":{"tf":1.4142135623730951},"162":{"tf":2.0},"167":{"tf":1.4142135623730951},"239":{"tf":1.0},"242":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"316":{"tf":2.449489742783178},"323":{"tf":2.0},"331":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.7320508075688772},"345":{"tf":1.4142135623730951},"347":{"tf":3.1622776601683795},"348":{"tf":2.0},"351":{"tf":1.0},"353":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":3.605551275463989},"357":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"359":{"tf":2.8284271247461903},"360":{"tf":2.8284271247461903},"361":{"tf":3.0},"362":{"tf":1.0},"363":{"tf":1.0},"382":{"tf":3.1622776601683795},"389":{"tf":1.7320508075688772},"404":{"tf":1.7320508075688772},"405":{"tf":2.0},"408":{"tf":2.0},"412":{"tf":1.0},"414":{"tf":2.23606797749979},"42":{"tf":3.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":2.8284271247461903},"61":{"tf":1.4142135623730951},"99":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},")":{"df":0,"docs":{},"来":{"df":0,"docs":{},"解":{"df":0,"docs":{},"构":{"df":0,"docs":{},"(":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}}},"!":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"158":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"x":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}}},"df":4,"docs":{"108":{"tf":2.0},"289":{"tf":3.4641016151377544},"290":{"tf":1.7320508075688772},"398":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"108":{"tf":1.4142135623730951}}}}}}},"y":{"b":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":9,"docs":{"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":4,"docs":{"101":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951},"281":{"tf":2.0},"306":{"tf":2.0}},"e":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"119":{"tf":1.0}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":16,"docs":{"198":{"tf":2.449489742783178},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"56":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"183":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"292":{"tf":1.0},"300":{"tf":1.4142135623730951},"304":{"tf":1.0},"70":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":20,"docs":{"101":{"tf":2.6457513110645907},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"202":{"tf":1.0},"274":{"tf":2.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"296":{"tf":1.0},"300":{"tf":1.4142135623730951},"301":{"tf":1.7320508075688772},"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.0},"323":{"tf":1.7320508075688772},"325":{"tf":2.0},"359":{"tf":2.0},"362":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"408":{"tf":2.0}},"e":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"0":{"df":1,"docs":{"359":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"(":{"0":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{},"h":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"b":{"(":{"df":0,"docs":{},"r":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":1,"docs":{"359":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"362":{"tf":2.23606797749979}}}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"274":{"tf":1.0},"359":{"tf":1.4142135623730951}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"274":{"tf":1.0},"359":{"tf":1.7320508075688772}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"}":{"'":{"\"":{")":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":4.795831523312719},"290":{"tf":2.449489742783178}}}}}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"260":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"400":{"tf":1.0},"401":{"tf":1.0},"417":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"388":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"375":{"tf":2.0},"380":{"tf":1.4142135623730951},"381":{"tf":1.0}},"s":{"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":15,"docs":{"191":{"tf":1.0},"240":{"tf":1.0},"283":{"tf":1.0},"289":{"tf":1.0},"324":{"tf":1.4142135623730951},"330":{"tf":1.0},"370":{"tf":1.4142135623730951},"398":{"tf":1.7320508075688772},"405":{"tf":2.0},"407":{"tf":2.0},"417":{"tf":1.0},"42":{"tf":1.4142135623730951},"69":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"df":1,"docs":{"368":{"tf":3.605551275463989}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"375":{"tf":2.8284271247461903},"380":{"tf":1.4142135623730951},"381":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"3":{"2":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"226":{"tf":1.4142135623730951},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":13,"docs":{"214":{"tf":2.23606797749979},"215":{"tf":1.4142135623730951},"216":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.4142135623730951},"227":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":2.23606797749979},"232":{"tf":2.0},"234":{"tf":1.0}}}}}},"m":{"df":1,"docs":{"26":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":9,"docs":{"173":{"tf":1.0},"240":{"tf":1.0},"320":{"tf":1.0},"351":{"tf":1.0},"407":{"tf":1.0},"42":{"tf":1.4142135623730951},"51":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":5,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"260":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}},"t":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"t":{"df":1,"docs":{"260":{"tf":2.23606797749979}}},"x":{"(":{"c":{"1":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}},"df":1,"docs":{"258":{"tf":2.23606797749979}},"u":{"df":0,"docs":{},"p":{"<":{"df":0,"docs":{},"x":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"175":{"tf":1.7320508075688772}}}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"21":{"tf":2.0},"265":{"tf":1.0}}}}},"df":0,"docs":{}},"m":{"df":1,"docs":{"17":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}}}}},"df":2,"docs":{"289":{"tf":3.1622776601683795},"290":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":4.58257569495584},"290":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}},"d":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"128":{"tf":1.4142135623730951},"211":{"tf":1.0}}}},"df":36,"docs":{"113":{"tf":2.8284271247461903},"114":{"tf":2.0},"115":{"tf":2.0},"116":{"tf":2.449489742783178},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"123":{"tf":1.4142135623730951},"127":{"tf":2.6457513110645907},"128":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"244":{"tf":1.0},"245":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"266":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"412":{"tf":1.0}},"e":{"df":1,"docs":{"398":{"tf":1.0}},"l":{"df":3,"docs":{"258":{"tf":2.449489742783178},"405":{"tf":1.7320508075688772},"434":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":2.6457513110645907},"120":{"tf":1.7320508075688772},"127":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"110":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"176":{"tf":1.0},"229":{"tf":1.7320508075688772}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"54":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":56,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.4142135623730951},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"180":{"tf":2.23606797749979},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.0},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"303":{"tf":1.0},"306":{"tf":1.4142135623730951},"319":{"tf":1.0},"32":{"tf":1.0},"320":{"tf":1.7320508075688772},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"368":{"tf":1.7320508075688772},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951},"78":{"tf":1.0},"87":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"239":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"107":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"107":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":17,"docs":{"101":{"tf":1.7320508075688772},"241":{"tf":2.23606797749979},"242":{"tf":1.4142135623730951},"274":{"tf":1.0},"285":{"tf":2.0},"299":{"tf":4.123105625617661},"300":{"tf":1.0},"301":{"tf":2.0},"306":{"tf":2.449489742783178},"316":{"tf":2.0},"319":{"tf":2.6457513110645907},"320":{"tf":3.605551275463989},"359":{"tf":1.4142135623730951},"405":{"tf":2.23606797749979},"407":{"tf":2.0},"412":{"tf":1.0},"70":{"tf":2.23606797749979}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"/":{"5":{".":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":7,"docs":{"300":{"tf":2.449489742783178},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":2,"docs":{"405":{"tf":2.449489742783178},"407":{"tf":2.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"300":{"tf":1.0},"303":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"322":{"tf":2.0}},"g":{"df":4,"docs":{"289":{"tf":2.0},"290":{"tf":1.0},"359":{"tf":2.23606797749979},"362":{"tf":1.4142135623730951}}},"v":{"c":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":1,"docs":{"436":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"}":{"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"405":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"300":{"tf":1.0},"303":{"tf":1.0},"53":{"tf":1.0},"59":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"403":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"287":{"tf":1.0},"49":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"l":{"df":10,"docs":{"134":{"tf":1.4142135623730951},"270":{"tf":1.0},"287":{"tf":1.0},"289":{"tf":2.6457513110645907},"368":{"tf":2.0},"407":{"tf":1.0},"49":{"tf":1.0},"73":{"tf":1.7320508075688772},"74":{"tf":2.449489742783178},"78":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":78,"docs":{"108":{"tf":1.4142135623730951},"119":{"tf":1.0},"121":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.7320508075688772},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":2.0},"160":{"tf":1.4142135623730951},"161":{"tf":1.7320508075688772},"167":{"tf":1.0},"170":{"tf":2.0},"172":{"tf":1.7320508075688772},"187":{"tf":1.0},"191":{"tf":1.0},"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"239":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"242":{"tf":2.23606797749979},"244":{"tf":1.0},"249":{"tf":3.0},"250":{"tf":1.7320508075688772},"252":{"tf":1.0},"282":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":2.0},"306":{"tf":3.1622776601683795},"319":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"33":{"tf":2.0},"337":{"tf":1.0},"34":{"tf":2.23606797749979},"341":{"tf":1.0},"343":{"tf":1.4142135623730951},"35":{"tf":1.7320508075688772},"36":{"tf":1.0},"360":{"tf":1.0},"367":{"tf":2.8284271247461903},"368":{"tf":4.58257569495584},"369":{"tf":1.4142135623730951},"37":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0},"382":{"tf":1.0},"389":{"tf":1.4142135623730951},"405":{"tf":3.0},"407":{"tf":3.0},"408":{"tf":2.449489742783178},"41":{"tf":1.0},"412":{"tf":1.0},"416":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":2.23606797749979},"50":{"tf":1.0},"51":{"tf":2.23606797749979},"54":{"tf":1.0},"62":{"tf":2.23606797749979},"69":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":4.242640687119285},"77":{"tf":1.0},"78":{"tf":1.0},"82":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"0":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}},"5":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{">":{"/":{"a":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"291":{"tf":1.4142135623730951},"306":{"tf":4.242640687119285},"307":{"tf":2.23606797749979},"310":{"tf":1.4142135623730951},"312":{"tf":1.0}}}},"df":5,"docs":{"305":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"d":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}},"df":2,"docs":{"306":{"tf":1.4142135623730951},"307":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"305":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"_":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"257":{"tf":2.449489742783178}},"e":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{":":{":":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"(":{"df":0,"docs":{},"x":{"df":3,"docs":{"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"279":{"tf":1.0},"280":{"tf":1.0}}}},"df":1,"docs":{"279":{"tf":1.0}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"281":{"tf":2.449489742783178}}}}},"t":{">":{"(":{"df":0,"docs":{},"t":{"df":3,"docs":{"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":4,"docs":{"276":{"tf":1.0},"279":{"tf":3.0},"280":{"tf":2.23606797749979},"281":{"tf":2.8284271247461903}}},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"279":{"tf":1.0}}}}}}}}},"df":2,"docs":{"279":{"tf":1.7320508075688772},"280":{"tf":1.0}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"427":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":19,"docs":{"186":{"tf":1.4142135623730951},"201":{"tf":2.0},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"232":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.7320508075688772},"281":{"tf":2.0},"32":{"tf":1.0},"324":{"tf":2.0},"368":{"tf":1.0},"388":{"tf":1.0},"391":{"tf":3.7416573867739413},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":2.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":1,"docs":{"421":{"tf":1.0}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"398":{"tf":1.0}}}}}},"df":7,"docs":{"240":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"361":{"tf":2.6457513110645907},"405":{"tf":1.4142135623730951},"42":{"tf":1.0},"53":{"tf":1.0},"63":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"405":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":4,"docs":{"273":{"tf":1.7320508075688772},"320":{"tf":1.7320508075688772},"52":{"tf":1.0},"59":{"tf":1.0}},"l":{"df":1,"docs":{"216":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"g":{"df":1,"docs":{"416":{"tf":1.0}}},"t":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"364":{"tf":1.0},"382":{"tf":2.0},"405":{"tf":1.7320508075688772}}}}},"w":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"223":{"tf":1.0},"224":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"405":{"tf":3.3166247903554},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"167":{"tf":1.0},"202":{"tf":2.0}}}}},"df":0,"docs":{}},"x":{"df":4,"docs":{"183":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"360":{"tf":2.449489742783178}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":41,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.0},"140":{"tf":1.0},"147":{"tf":1.0},"167":{"tf":1.7320508075688772},"179":{"tf":1.4142135623730951},"180":{"tf":1.7320508075688772},"181":{"tf":1.4142135623730951},"183":{"tf":1.0},"198":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"214":{"tf":1.7320508075688772},"223":{"tf":2.0},"224":{"tf":2.0},"26":{"tf":2.449489742783178},"260":{"tf":1.0},"265":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.4142135623730951},"289":{"tf":2.0},"290":{"tf":1.0},"306":{"tf":1.4142135623730951},"316":{"tf":1.0},"32":{"tf":1.4142135623730951},"338":{"tf":1.7320508075688772},"339":{"tf":1.0},"34":{"tf":2.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"374":{"tf":1.0},"391":{"tf":1.7320508075688772},"397":{"tf":1.4142135623730951},"405":{"tf":5.656854249492381},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178},"430":{"tf":1.0},"49":{"tf":1.0},"96":{"tf":1.4142135623730951}},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"l":{"df":5,"docs":{"178":{"tf":1.4142135623730951},"179":{"tf":2.449489742783178},"180":{"tf":3.0},"181":{"tf":2.0},"182":{"tf":2.6457513110645907}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":6,"docs":{"364":{"tf":1.4142135623730951},"375":{"tf":1.7320508075688772},"378":{"tf":2.23606797749979},"379":{"tf":1.7320508075688772},"380":{"tf":2.449489742783178},"381":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"374":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"376":{"tf":1.0}}}}},"df":0,"docs":{}},"df":10,"docs":{"162":{"tf":1.7320508075688772},"244":{"tf":3.1622776601683795},"245":{"tf":2.0},"249":{"tf":2.23606797749979},"293":{"tf":2.449489742783178},"316":{"tf":2.0},"324":{"tf":2.6457513110645907},"325":{"tf":1.0},"374":{"tf":2.0},"401":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"162":{"tf":1.0}}},"l":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":1,"docs":{"0":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":10,"docs":{"10":{"tf":1.0},"198":{"tf":1.0},"277":{"tf":1.0},"301":{"tf":1.0},"432":{"tf":1.4142135623730951},"434":{"tf":3.605551275463989},"435":{"tf":1.7320508075688772},"436":{"tf":3.1622776601683795},"437":{"tf":1.4142135623730951},"70":{"tf":1.0}}}}}}},"l":{"df":6,"docs":{"273":{"tf":3.0},"275":{"tf":1.7320508075688772},"285":{"tf":2.0},"286":{"tf":1.4142135623730951},"291":{"tf":2.23606797749979},"293":{"tf":3.3166247903554}}}},"o":{"_":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"75":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"218":{"tf":2.449489742783178},"225":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"235":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"294":{"tf":4.242640687119285}}}},"df":0,"docs":{},"n":{"df":2,"docs":{"106":{"tf":1.0},"368":{"tf":1.0}},"e":{"df":34,"docs":{"102":{"tf":2.6457513110645907},"105":{"tf":4.0},"106":{"tf":2.449489742783178},"108":{"tf":1.0},"134":{"tf":2.0},"148":{"tf":1.0},"162":{"tf":2.449489742783178},"166":{"tf":1.0},"174":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"239":{"tf":1.7320508075688772},"242":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"294":{"tf":2.0},"316":{"tf":1.7320508075688772},"319":{"tf":1.7320508075688772},"331":{"tf":1.4142135623730951},"341":{"tf":1.4142135623730951},"342":{"tf":1.0},"347":{"tf":1.7320508075688772},"348":{"tf":1.0},"353":{"tf":2.449489742783178},"356":{"tf":1.4142135623730951},"360":{"tf":1.0},"361":{"tf":1.0},"374":{"tf":1.0},"382":{"tf":2.0},"398":{"tf":1.0},"407":{"tf":2.0},"421":{"tf":1.0},"53":{"tf":1.0}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"程":{"df":0,"docs":{},"序":{"df":0,"docs":{},"的":{"df":0,"docs":{},"结":{"df":0,"docs":{},"尾":{"df":0,"docs":{},",":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"的":{"df":0,"docs":{},"话":{"df":0,"docs":{},",":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},",":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":46,"docs":{"106":{"tf":1.7320508075688772},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"120":{"tf":1.0},"142":{"tf":1.4142135623730951},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"228":{"tf":1.0},"240":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"266":{"tf":1.0},"273":{"tf":1.7320508075688772},"277":{"tf":1.0},"290":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":3.3166247903554},"324":{"tf":1.4142135623730951},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"368":{"tf":1.0},"377":{"tf":2.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"427":{"tf":1.0},"428":{"tf":1.0},"43":{"tf":1.0},"52":{"tf":1.0},"54":{"tf":1.0},"57":{"tf":1.4142135623730951},"70":{"tf":1.0},"91":{"tf":1.4142135623730951}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0}}},"df":0,"docs":{}}}}},"h":{"df":1,"docs":{"246":{"tf":1.0}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"181":{"tf":2.0}}},"y":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"1":{"df":1,"docs":{"181":{"tf":1.0}}},"df":1,"docs":{"181":{"tf":1.4142135623730951}}}}}}},"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"'":{".":{"'":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"190":{"tf":2.0},"192":{"tf":1.4142135623730951}}},"m":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"df":1,"docs":{"15":{"tf":1.0}}}},"s":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"102":{"tf":1.7320508075688772},"273":{"tf":1.0}}}},"m":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"[":{"0":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":3.0},"172":{"tf":1.4142135623730951}}}}}}},"df":33,"docs":{"124":{"tf":1.4142135623730951},"125":{"tf":2.23606797749979},"167":{"tf":1.4142135623730951},"170":{"tf":3.7416573867739413},"172":{"tf":1.4142135623730951},"173":{"tf":1.0},"257":{"tf":1.4142135623730951},"260":{"tf":1.0},"298":{"tf":6.4031242374328485},"318":{"tf":6.4031242374328485},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"360":{"tf":3.1622776601683795},"361":{"tf":1.7320508075688772},"37":{"tf":1.0},"38":{"tf":1.0},"382":{"tf":1.4142135623730951},"405":{"tf":3.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772},"41":{"tf":2.449489742783178},"42":{"tf":2.8284271247461903},"420":{"tf":1.0},"43":{"tf":2.449489742783178},"44":{"tf":1.7320508075688772},"45":{"tf":2.23606797749979},"52":{"tf":1.7320508075688772},"53":{"tf":1.0},"54":{"tf":1.0},"61":{"tf":5.5677643628300215},"62":{"tf":2.0}}}}},"df":8,"docs":{"167":{"tf":1.0},"240":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"306":{"tf":3.3166247903554},"361":{"tf":2.0},"367":{"tf":2.8284271247461903},"382":{"tf":1.0},"45":{"tf":1.7320508075688772}}}}},"o":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"252":{"tf":1.0}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"94":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"94":{"tf":1.0}}}}}}}}},"df":10,"docs":{"102":{"tf":1.0},"162":{"tf":1.0},"271":{"tf":1.0},"312":{"tf":1.0},"320":{"tf":2.23606797749979},"328":{"tf":1.4142135623730951},"330":{"tf":2.0},"334":{"tf":1.0},"386":{"tf":1.0},"94":{"tf":2.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"333":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"368":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"26":{"tf":1.0}}}}}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"134":{"tf":1.4142135623730951},"242":{"tf":1.0},"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"368":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":2.0},"78":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{"d":{"df":1,"docs":{"361":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}},"k":{"(":{"_":{"df":2,"docs":{"160":{"tf":1.0},"382":{"tf":1.0}}},"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"348":{"tf":1.7320508075688772}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"f":{"c":{"df":1,"docs":{"158":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":1.0}}}}},"j":{"df":0,"docs":{},"o":{"b":{"df":2,"docs":{"405":{"tf":1.0},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"167":{"tf":1.0},"382":{"tf":1.0},"45":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}}}}},"t":{"df":2,"docs":{"157":{"tf":1.0},"174":{"tf":1.0}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"160":{"tf":1.0},"161":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"349":{"tf":1.0}}}}},"df":0,"docs":{}}},"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"399":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"162":{"tf":1.0}}}}},"df":41,"docs":{"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"157":{"tf":2.449489742783178},"159":{"tf":1.0},"160":{"tf":1.7320508075688772},"161":{"tf":2.0},"162":{"tf":2.23606797749979},"165":{"tf":1.0},"174":{"tf":1.0},"198":{"tf":3.0},"199":{"tf":2.8284271247461903},"200":{"tf":2.23606797749979},"202":{"tf":1.7320508075688772},"203":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"207":{"tf":3.1622776601683795},"208":{"tf":2.449489742783178},"211":{"tf":3.605551275463989},"224":{"tf":1.7320508075688772},"225":{"tf":2.449489742783178},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.8284271247461903},"231":{"tf":1.0},"232":{"tf":3.1622776601683795},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"266":{"tf":2.6457513110645907},"348":{"tf":1.0},"349":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0},"42":{"tf":1.4142135623730951},"45":{"tf":2.0}},"。":{"df":0,"docs":{},"如":{"df":0,"docs":{},"果":{"df":0,"docs":{},"超":{"df":0,"docs":{},"时":{"df":0,"docs":{},"先":{"df":0,"docs":{},"发":{"df":0,"docs":{},"生":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}},"n":{"c":{"df":7,"docs":{"180":{"tf":1.0},"182":{"tf":1.0},"306":{"tf":1.0},"360":{"tf":1.4142135623730951},"368":{"tf":1.0},"405":{"tf":1.4142135623730951},"74":{"tf":1.0}}},"df":8,"docs":{"257":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"324":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"355":{"tf":1.0},"357":{"tf":1.0},"54":{"tf":1.0}},"e":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"207":{"tf":2.0}}}},"df":0,"docs":{}}}},"m":{"df":1,"docs":{"322":{"tf":1.0}}},"n":{"df":1,"docs":{"322":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"250":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"y":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"66":{"tf":1.0}}}}},"o":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"337":{"tf":1.0}},"p":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"328":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"10":{"tf":1.0},"328":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"415":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"242":{"tf":1.0},"276":{"tf":1.0},"330":{"tf":1.4142135623730951},"375":{"tf":1.0}}}},"t":{"df":1,"docs":{"255":{"tf":3.0}},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"255":{"tf":1.0},"267":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"407":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"382":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"<":{"&":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"342":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"134":{"tf":1.0},"148":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"348":{"tf":1.0}}}}},"t":{"df":1,"docs":{"134":{"tf":1.0}}},"v":{"df":1,"docs":{"148":{"tf":1.0}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":5,"docs":{"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{">":{"df":0,"docs":{},",":{"df":0,"docs":{},"是":{"df":0,"docs":{},"不":{"df":0,"docs":{},"同":{"df":0,"docs":{},"于":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}},"df":1,"docs":{"162":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}}}},"i":{"3":{"2":{">":{"df":0,"docs":{},"。":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":7,"docs":{"102":{"tf":1.4142135623730951},"105":{"tf":3.1622776601683795},"106":{"tf":2.0},"148":{"tf":1.0},"331":{"tf":1.0},"347":{"tf":1.0},"353":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"102":{"tf":2.23606797749979}}},"df":0,"docs":{}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"407":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"421":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"c":{"<":{"df":0,"docs":{},"t":{">":{">":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"244":{"tf":1.0},"374":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"242":{"tf":1.0},"316":{"tf":3.3166247903554}}}}},"t":{"df":14,"docs":{"102":{"tf":3.872983346207417},"105":{"tf":2.0},"106":{"tf":1.0},"109":{"tf":1.0},"162":{"tf":1.7320508075688772},"169":{"tf":1.0},"174":{"tf":2.23606797749979},"176":{"tf":2.0},"239":{"tf":2.0},"242":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"374":{"tf":1.0},"382":{"tf":1.7320508075688772},"424":{"tf":1.7320508075688772}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"8":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"242":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"6":{"4":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"5":{".":{"0":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"3":{"2":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"5":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":18,"docs":{"102":{"tf":2.8284271247461903},"157":{"tf":1.0},"162":{"tf":3.1622776601683795},"166":{"tf":1.0},"168":{"tf":1.0},"176":{"tf":1.0},"24":{"tf":1.0},"242":{"tf":1.7320508075688772},"316":{"tf":1.0},"335":{"tf":2.0},"341":{"tf":1.0},"342":{"tf":1.4142135623730951},"343":{"tf":1.0},"349":{"tf":1.0},"374":{"tf":1.0},"401":{"tf":1.0},"407":{"tf":2.0},"408":{"tf":1.0}}}}}}},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}}}}}}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"348":{"tf":1.0}}}}},"d":{"df":1,"docs":{"421":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"119":{"tf":1.0}}},"2":{"df":1,"docs":{"119":{"tf":1.0}}},"df":3,"docs":{"42":{"tf":2.0},"421":{"tf":1.0},"45":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"。":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"209":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"102":{"tf":1.0},"312":{"tf":1.0},"328":{"tf":1.4142135623730951},"330":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"277":{"tf":1.0},"301":{"tf":1.0},"360":{"tf":1.4142135623730951},"70":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"179":{"tf":1.0},"378":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":3,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"398":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"0":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"199":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}}}}},"i":{"df":2,"docs":{"175":{"tf":1.0},"375":{"tf":1.0}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"199":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}}},"x":{"df":1,"docs":{"375":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.7320508075688772}}}}}}}},"t":{"df":26,"docs":{"137":{"tf":1.0},"156":{"tf":1.4142135623730951},"198":{"tf":2.449489742783178},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.23606797749979},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"219":{"tf":1.0},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"242":{"tf":1.0},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"286":{"tf":1.4142135623730951},"290":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.0},"54":{"tf":1.0},"66":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"377":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"377":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"377":{"tf":4.358898943540674}}}}}}}}},"v":{"df":1,"docs":{"299":{"tf":1.7320508075688772}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"377":{"tf":1.7320508075688772}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"205":{"tf":1.0},"234":{"tf":2.0},"235":{"tf":2.23606797749979}}}}}},"df":8,"docs":{"191":{"tf":1.0},"206":{"tf":2.0},"233":{"tf":1.0},"316":{"tf":1.7320508075688772},"318":{"tf":1.0},"320":{"tf":1.0},"375":{"tf":2.0},"377":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.7320508075688772}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"293":{"tf":1.0},"53":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"368":{"tf":1.0}}}},"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"d":{"df":2,"docs":{"413":{"tf":1.0},"436":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}}}}}}}},"w":{"df":0,"docs":{},"n":{"df":4,"docs":{"189":{"tf":1.0},"299":{"tf":1.0},"405":{"tf":1.0},"75":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"67":{"tf":1.0}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"64":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"299":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"46":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"70":{"tf":1.7320508075688772},"73":{"tf":1.7320508075688772},"74":{"tf":2.449489742783178},"75":{"tf":1.7320508075688772},"78":{"tf":1.7320508075688772}}}}}}}}}}},"p":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}}}},"x":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}},"1":{")":{".":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"175":{"tf":1.7320508075688772},"94":{"tf":1.0}}},"2":{"df":2,"docs":{"175":{"tf":1.4142135623730951},"94":{"tf":1.0}},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"175":{"tf":1.0}}}}}}}}}}},"3":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"175":{"tf":1.7320508075688772}}},"x":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}},"df":1,"docs":{"175":{"tf":1.4142135623730951}}},">":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"400":{"tf":1.0}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"401":{"tf":1.0}}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":12,"docs":{"110":{"tf":1.4142135623730951},"111":{"tf":1.7320508075688772},"117":{"tf":1.0},"241":{"tf":1.4142135623730951},"26":{"tf":1.0},"260":{"tf":2.449489742783178},"261":{"tf":1.0},"265":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"32":{"tf":1.0},"330":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}},"g":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":3.4641016151377544}},"e":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"[":{"1":{"df":1,"docs":{"316":{"tf":1.0}}},"2":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"316":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"<":{"'":{"a":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"102":{"tf":1.0}}},"r":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"183":{"tf":2.6457513110645907}}}},"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}}},"n":{"c":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"391":{"tf":3.7416573867739413}},"e":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"c":{"!":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"382":{"tf":1.0}}}},"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"155":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"167":{"tf":1.0},"202":{"tf":1.4142135623730951}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"198":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"224":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"157":{"tf":1.0},"158":{"tf":2.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"154":{"tf":1.0},"163":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":39,"docs":{"10":{"tf":1.0},"134":{"tf":1.4142135623730951},"143":{"tf":1.0},"153":{"tf":1.4142135623730951},"154":{"tf":3.0},"155":{"tf":3.872983346207417},"156":{"tf":3.605551275463989},"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"159":{"tf":2.8284271247461903},"160":{"tf":1.4142135623730951},"162":{"tf":1.0},"163":{"tf":2.6457513110645907},"164":{"tf":1.7320508075688772},"166":{"tf":2.8284271247461903},"167":{"tf":1.7320508075688772},"168":{"tf":1.4142135623730951},"198":{"tf":2.23606797749979},"199":{"tf":1.0},"202":{"tf":5.0990195135927845},"203":{"tf":1.4142135623730951},"216":{"tf":1.0},"224":{"tf":3.1622776601683795},"225":{"tf":1.0},"257":{"tf":1.7320508075688772},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"342":{"tf":1.0},"368":{"tf":1.0},"382":{"tf":2.23606797749979},"391":{"tf":1.7320508075688772},"405":{"tf":5.0},"407":{"tf":3.0},"408":{"tf":2.449489742783178},"53":{"tf":2.23606797749979},"54":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951}},"k":{"df":17,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"198":{"tf":1.4142135623730951},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0},"407":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"225":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"296":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":10,"docs":{"172":{"tf":1.0},"186":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"240":{"tf":1.0},"360":{"tf":1.4142135623730951},"375":{"tf":1.0},"405":{"tf":1.4142135623730951},"56":{"tf":1.4142135623730951},"75":{"tf":1.0},"87":{"tf":2.0}},"r":{"df":1,"docs":{"332":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"114":{"tf":1.0},"294":{"tf":4.795831523312719}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}}},"s":{"df":13,"docs":{"165":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"316":{"tf":1.0},"391":{"tf":1.0},"42":{"tf":2.0},"45":{"tf":2.0},"52":{"tf":1.0},"54":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"221":{"tf":1.0},"222":{"tf":1.0}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"221":{"tf":1.0},"222":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"221":{"tf":2.0},"222":{"tf":2.6457513110645907},"223":{"tf":2.8284271247461903}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"43":{"tf":1.0}}}}}}}}}}}},"t":{"df":2,"docs":{"190":{"tf":2.0},"192":{"tf":2.0}},"i":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"421":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"<":{"&":{"df":0,"docs":{},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":6,"docs":{"200":{"tf":1.4142135623730951},"239":{"tf":1.0},"375":{"tf":1.0},"416":{"tf":1.4142135623730951},"420":{"tf":2.6457513110645907},"421":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"172":{"tf":1.4142135623730951},"183":{"tf":1.4142135623730951},"416":{"tf":2.449489742783178},"421":{"tf":2.8284271247461903}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":18,"docs":{"198":{"tf":2.6457513110645907},"199":{"tf":2.449489742783178},"200":{"tf":2.0},"201":{"tf":2.0},"202":{"tf":2.449489742783178},"206":{"tf":2.0},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.4142135623730951},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951},"296":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"300":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"t":{"df":1,"docs":{"416":{"tf":2.23606797749979}},"h":{"df":13,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.7320508075688772},"120":{"tf":1.0},"17":{"tf":1.7320508075688772},"249":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.4142135623730951},"268":{"tf":1.0},"376":{"tf":1.0},"391":{"tf":1.7320508075688772},"417":{"tf":1.7320508075688772}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"106":{"tf":2.0},"330":{"tf":1.0},"337":{"tf":1.0},"345":{"tf":1.0},"347":{"tf":1.7320508075688772},"350":{"tf":1.0},"351":{"tf":2.23606797749979},"353":{"tf":3.3166247903554},"354":{"tf":1.0},"360":{"tf":2.23606797749979},"375":{"tf":1.0},"378":{"tf":1.0},"42":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":3,"docs":{"337":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"y":{"df":1,"docs":{"252":{"tf":1.0}}}},"c":{"df":1,"docs":{"436":{"tf":1.7320508075688772}}},"d":{"b":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"175":{"tf":1.4142135623730951},"213":{"tf":1.0},"266":{"tf":2.23606797749979},"359":{"tf":3.3166247903554},"377":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":3,"docs":{"341":{"tf":3.0},"342":{"tf":3.0},"343":{"tf":2.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":3.7416573867739413}}}}}}}}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}},"n":{"df":0,"docs":{},"i":{"df":3,"docs":{"103":{"tf":1.7320508075688772},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}},"y":{"!":{"df":0,"docs":{},"”":{"df":0,"docs":{},",":{"df":0,"docs":{},"同":{"df":0,"docs":{},"时":{"df":0,"docs":{},"仍":{"df":0,"docs":{},"然":{"df":0,"docs":{},"返":{"df":0,"docs":{},"回":{"df":0,"docs":{},"代":{"df":0,"docs":{},"码":{"df":0,"docs":{},"块":{"df":0,"docs":{},"最":{"df":0,"docs":{},"后":{"df":0,"docs":{},"的":{"df":0,"docs":{},"值":{"df":0,"docs":{},",":{"1":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"380":{"tf":1.7320508075688772}}}}},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":2,"docs":{"289":{"tf":3.4641016151377544},"290":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"360":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":4,"docs":{"102":{"tf":1.0},"242":{"tf":1.0},"257":{"tf":1.0},"70":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"261":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}}},"df":1,"docs":{"376":{"tf":1.4142135623730951}}}}}}},"h":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"399":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772}}}},"df":2,"docs":{"1":{"tf":1.0},"428":{"tf":1.0}},"g":{"df":1,"docs":{"152":{"tf":1.0}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":2.8284271247461903}}}}},"n":{"!":{"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"320":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"<":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"320":{"tf":4.69041575982343},"323":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"88":{"tf":1.7320508075688772},"89":{"tf":1.0},"90":{"tf":1.0},"93":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"346":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"335":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"=":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"375":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"113":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":8,"docs":{"119":{"tf":1.0},"192":{"tf":1.4142135623730951},"260":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":2.23606797749979},"45":{"tf":2.0}}}},"df":0,"docs":{}},"u":{"df":2,"docs":{"203":{"tf":1.0},"266":{"tf":1.4142135623730951}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"105":{"tf":1.7320508075688772},"106":{"tf":1.0},"58":{"tf":1.0}},"e":{"(":{"5":{"df":1,"docs":{"58":{"tf":1.4142135623730951}}},"df":0,"docs":{},"f":{"df":2,"docs":{"105":{"tf":2.23606797749979},"106":{"tf":1.0}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"105":{"tf":2.0},"106":{"tf":1.0}}}}},"x":{"df":3,"docs":{"105":{"tf":2.0},"106":{"tf":1.0},"58":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":5,"docs":{"218":{"tf":2.449489742783178},"225":{"tf":1.7320508075688772},"229":{"tf":2.449489742783178},"232":{"tf":2.0},"235":{"tf":1.0}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"<":{"df":0,"docs":{},"f":{"3":{"2":{"df":1,"docs":{"175":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":2,"docs":{"173":{"tf":2.6457513110645907},"175":{"tf":3.1622776601683795}}},"x":{"1":{"df":1,"docs":{"175":{"tf":1.7320508075688772}}},"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"df":16,"docs":{"173":{"tf":3.605551275463989},"175":{"tf":3.4641016151377544},"270":{"tf":1.0},"316":{"tf":1.4142135623730951},"319":{"tf":1.7320508075688772},"321":{"tf":2.0},"322":{"tf":2.0},"352":{"tf":1.0},"359":{"tf":4.358898943540674},"360":{"tf":2.23606797749979},"375":{"tf":3.872983346207417},"377":{"tf":4.47213595499958},"52":{"tf":1.0},"53":{"tf":1.0},"85":{"tf":1.4142135623730951},"94":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"270":{"tf":1.4142135623730951},"309":{"tf":1.0},"367":{"tf":1.0},"385":{"tf":1.0},"412":{"tf":1.4142135623730951},"66":{"tf":1.0},"75":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"。":{"a":{"d":{"d":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"405":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"315":{"tf":1.0}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"431":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":1,"docs":{"332":{"tf":1.7320508075688772}}}}}}}}},"o":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"405":{"tf":2.0},"408":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"405":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"405":{"tf":3.7416573867739413},"407":{"tf":2.0},"408":{"tf":2.23606797749979}}}},"p":{"df":2,"docs":{"136":{"tf":1.0},"66":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"ê":{"df":1,"docs":{"431":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{".":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"i":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"337":{"tf":1.7320508075688772},"342":{"tf":1.4142135623730951},"343":{"tf":2.0}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":3,"docs":{"337":{"tf":1.4142135623730951},"338":{"tf":1.0},"343":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":9,"docs":{"337":{"tf":1.7320508075688772},"338":{"tf":3.7416573867739413},"339":{"tf":2.449489742783178},"340":{"tf":2.23606797749979},"341":{"tf":3.872983346207417},"342":{"tf":5.0990195135927845},"343":{"tf":5.477225575051661},"393":{"tf":1.0},"398":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"14":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.4142135623730951}}}}}}}}}},"p":{"df":0,"docs":{},"v":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"11":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":2.0}}}}},"l":{"df":0,"docs":{},"u":{"d":{"df":7,"docs":{"102":{"tf":1.0},"126":{"tf":1.0},"147":{"tf":1.0},"157":{"tf":1.0},"283":{"tf":1.4142135623730951},"285":{"tf":1.0},"33":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"377":{"tf":1.4142135623730951},"91":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.7320508075688772},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}},"s":{"df":1,"docs":{"360":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":3.3166247903554}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"222":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"!":{"(":{"\"":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"382":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"382":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{"&":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"352":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"352":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"56":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"5":{"df":1,"docs":{"56":{"tf":1.0}}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"56":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"324":{"tf":1.0},"377":{"tf":1.4142135623730951},"91":{"tf":1.0}},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"'":{"a":{"df":1,"docs":{"322":{"tf":2.449489742783178}}},"b":{"df":1,"docs":{"322":{"tf":2.449489742783178}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}}}}},"{":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}},"df":0,"docs":{}}}},"*":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"1":{"df":2,"docs":{"179":{"tf":1.0},"180":{"tf":1.0}}},"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}}}},"df":3,"docs":{"291":{"tf":1.0},"293":{"tf":2.23606797749979},"376":{"tf":2.23606797749979}},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"62":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"194":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"355":{"tf":1.0},"357":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"225":{"tf":1.0},"226":{"tf":1.0}}}}},"t":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}}}}},"b":{"df":3,"docs":{"272":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"241":{"tf":2.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"181":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"360":{"tf":1.0}}}},"df":2,"docs":{"95":{"tf":2.0},"97":{"tf":1.4142135623730951}}}},"df":1,"docs":{"291":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"359":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":2.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"286":{"tf":2.0},"369":{"tf":1.0},"62":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"352":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"283":{"tf":2.23606797749979}}}}}}}}}},"df":0,"docs":{}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"358":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"360":{"tf":1.4142135623730951},"362":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":8,"docs":{"243":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":14,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":9,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"281":{"tf":1.7320508075688772},"32":{"tf":1.0},"388":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"55":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"299":{"tf":2.449489742783178}}},"df":0,"docs":{}}}},"i":{"df":3,"docs":{"298":{"tf":2.449489742783178},"318":{"tf":2.449489742783178},"381":{"tf":1.4142135623730951}}}},"i":{"'":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":1,"docs":{"206":{"tf":1.0}},"n":{"df":8,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"358":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}}}}}}},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"103":{"tf":1.0}}}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"306":{"tf":1.0}},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"359":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"180":{"tf":1.0}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"o":{"df":1,"docs":{"361":{"tf":1.0}}},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"61":{"tf":2.449489742783178}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"355":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.7320508075688772}}}},"p":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}},"3":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"175":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"224":{"tf":1.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"1":{"df":1,"docs":{"367":{"tf":1.0}}},"2":{"df":1,"docs":{"367":{"tf":1.0}}},"df":1,"docs":{"185":{"tf":2.0}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"319":{"tf":1.7320508075688772},"320":{"tf":2.6457513110645907}}}}},"t":{"1":{"df":1,"docs":{"91":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"62":{"tf":1.0}}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"306":{"tf":2.0}}}}}}}},"s":{"1":{"df":1,"docs":{"70":{"tf":1.0}}},"2":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":8,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":1,"docs":{"360":{"tf":1.0}}}},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"360":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"358":{"tf":1.4142135623730951}}}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"108":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"u":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.0}}}}},"h":{"df":36,"docs":{"108":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"134":{"tf":2.0},"167":{"tf":1.0},"170":{"tf":2.23606797749979},"172":{"tf":2.0},"183":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"188":{"tf":2.0},"189":{"tf":1.4142135623730951},"194":{"tf":1.0},"316":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"359":{"tf":1.0},"361":{"tf":1.4142135623730951},"382":{"tf":1.0},"385":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"428":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":2.23606797749979},"51":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.7320508075688772},"61":{"tf":1.4142135623730951},"62":{"tf":1.7320508075688772},"72":{"tf":1.0},"73":{"tf":1.7320508075688772},"78":{"tf":1.4142135623730951},"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"134":{"tf":1.0}}}},"i":{"df":2,"docs":{"360":{"tf":1.0},"376":{"tf":1.7320508075688772}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"355":{"tf":1.0},"357":{"tf":1.0}}}}},"o":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":7,"docs":{"125":{"tf":2.0},"167":{"tf":1.4142135623730951},"382":{"tf":1.4142135623730951},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.0}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"348":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"355":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}},"s":{"df":1,"docs":{"348":{"tf":2.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"301":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"w":{"df":1,"docs":{"378":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":7,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"405":{"tf":1.4142135623730951},"407":{"tf":2.0},"408":{"tf":2.23606797749979}}}}}},"x":{"df":4,"docs":{"360":{"tf":1.0},"37":{"tf":1.0},"381":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"y":{"df":1,"docs":{"361":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":14,"docs":{"124":{"tf":1.0},"125":{"tf":2.0},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.0}}}}},"{":{"a":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"144":{"tf":1.0}}},"c":{"df":1,"docs":{"144":{"tf":1.0}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"360":{"tf":1.4142135623730951},"69":{"tf":1.0}},"i":{"df":1,"docs":{"135":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"148":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"229":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"242":{"tf":1.7320508075688772}}}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"150":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"r":{"1":{"df":1,"docs":{"74":{"tf":1.0}}},"3":{"df":1,"docs":{"74":{"tf":1.0}}},"df":0,"docs":{}},"s":{"1":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"71":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"71":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"349":{"tf":1.0},"350":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"353":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":38,"docs":{"104":{"tf":1.0},"141":{"tf":1.0},"188":{"tf":1.7320508075688772},"206":{"tf":1.7320508075688772},"218":{"tf":1.0},"228":{"tf":1.0},"23":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"235":{"tf":1.0},"239":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"293":{"tf":1.7320508075688772},"294":{"tf":2.23606797749979},"299":{"tf":1.0},"301":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.4142135623730951},"33":{"tf":1.0},"356":{"tf":1.0},"37":{"tf":1.4142135623730951},"377":{"tf":3.872983346207417},"387":{"tf":1.0},"388":{"tf":1.0},"391":{"tf":1.0},"399":{"tf":1.0},"45":{"tf":1.0},"54":{"tf":1.0},"56":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":2.449489742783178},"78":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":3.1622776601683795},"93":{"tf":1.0}}}},"s":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"1":{"0":{"(":{"4":{"df":1,"docs":{"206":{"tf":1.0}}},"8":{"df":1,"docs":{"206":{"tf":1.0}}},"a":{"df":1,"docs":{"206":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":2.0},"116":{"tf":2.0}}}},"df":1,"docs":{"413":{"tf":1.0}}}},"o":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"102":{"tf":1.0},"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":6,"docs":{"157":{"tf":1.0},"224":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"288":{"tf":1.0},"74":{"tf":1.7320508075688772}}}}}},"c":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"392":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"390":{"tf":1.7320508075688772},"391":{"tf":1.4142135623730951},"393":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"391":{"tf":1.4142135623730951},"392":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"330":{"tf":1.4142135623730951},"387":{"tf":1.0},"390":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"1":{")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"225":{"tf":1.0}}}}}}},"df":5,"docs":{"224":{"tf":1.0},"225":{"tf":2.0},"226":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"249":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"297":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"300":{"tf":1.0},"303":{"tf":1.0}},"t":{"df":7,"docs":{"228":{"tf":2.449489742783178},"229":{"tf":2.8284271247461903},"231":{"tf":1.7320508075688772},"232":{"tf":3.4641016151377544},"249":{"tf":3.0},"250":{"tf":2.23606797749979},"53":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"l":{"df":46,"docs":{"143":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.7320508075688772},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"405":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}},"e":{".":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"255":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"155":{"tf":1.0},"255":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":9,"docs":{"19":{"tf":1.0},"2":{"tf":1.0},"237":{"tf":1.0},"296":{"tf":1.4142135623730951},"312":{"tf":1.0},"316":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.0},"47":{"tf":1.0}},"m":{"df":1,"docs":{"196":{"tf":1.0}}}}},"df":0,"docs":{}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"213":{"tf":1.0},"248":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}},"df":13,"docs":{"110":{"tf":1.0},"111":{"tf":2.0},"159":{"tf":1.4142135623730951},"198":{"tf":1.0},"21":{"tf":2.23606797749979},"214":{"tf":1.0},"26":{"tf":1.0},"32":{"tf":1.0},"391":{"tf":1.0},"395":{"tf":1.0},"397":{"tf":1.0},"49":{"tf":1.0},"61":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"436":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"”":{"df":0,"docs":{},"。":{"df":0,"docs":{},")":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"160":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"396":{"tf":1.4142135623730951},"429":{"tf":1.0}}}}},"df":1,"docs":{"15":{"tf":1.0}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"163":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":1,"docs":{"232":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"431":{"tf":1.0}},"r":{"df":1,"docs":{"368":{"tf":2.0}}}},"u":{"b":{"df":62,"docs":{"112":{"tf":1.0},"113":{"tf":2.23606797749979},"115":{"tf":2.23606797749979},"116":{"tf":3.872983346207417},"119":{"tf":3.7416573867739413},"120":{"tf":2.449489742783178},"121":{"tf":1.7320508075688772},"123":{"tf":3.4641016151377544},"127":{"tf":2.449489742783178},"128":{"tf":1.0},"129":{"tf":1.0},"167":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"179":{"tf":3.3166247903554},"180":{"tf":4.795831523312719},"181":{"tf":4.123105625617661},"182":{"tf":4.69041575982343},"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.8284271247461903},"203":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.7320508075688772},"211":{"tf":1.0},"226":{"tf":2.449489742783178},"228":{"tf":3.605551275463989},"229":{"tf":4.898979485566356},"231":{"tf":2.449489742783178},"232":{"tf":5.5677643628300215},"242":{"tf":1.0},"244":{"tf":1.0},"249":{"tf":4.898979485566356},"250":{"tf":3.7416573867739413},"257":{"tf":1.4142135623730951},"258":{"tf":4.47213595499958},"266":{"tf":1.4142135623730951},"289":{"tf":3.4641016151377544},"290":{"tf":2.0},"320":{"tf":1.7320508075688772},"331":{"tf":2.6457513110645907},"334":{"tf":3.4641016151377544},"335":{"tf":2.8284271247461903},"338":{"tf":1.4142135623730951},"339":{"tf":2.0},"340":{"tf":2.0},"341":{"tf":2.23606797749979},"342":{"tf":4.242640687119285},"343":{"tf":3.605551275463989},"368":{"tf":1.0},"374":{"tf":1.4142135623730951},"381":{"tf":1.7320508075688772},"382":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.7320508075688772},"392":{"tf":1.0},"393":{"tf":1.0},"405":{"tf":6.0},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"412":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"120":{"tf":1.0},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":8,"docs":{"256":{"tf":1.0},"260":{"tf":1.7320508075688772},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"337":{"tf":1.0},"338":{"tf":1.0},"342":{"tf":3.3166247903554},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"348":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"141":{"tf":2.0},"339":{"tf":1.0},"69":{"tf":1.0}}}}}},"df":6,"docs":{"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":2.0},"229":{"tf":1.0},"289":{"tf":1.0},"66":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"102":{"tf":1.0}}}},"y":{"df":1,"docs":{"24":{"tf":1.0}}}},"q":{"df":1,"docs":{"172":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"364":{"tf":1.0},"376":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}}}}}},"df":3,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.7320508075688772},"108":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":15,"docs":{"217":{"tf":1.7320508075688772},"218":{"tf":1.4142135623730951},"219":{"tf":1.0},"221":{"tf":2.449489742783178},"222":{"tf":2.449489742783178},"223":{"tf":2.23606797749979},"224":{"tf":3.0},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":3.1622776601683795},"229":{"tf":4.242640687119285},"231":{"tf":2.23606797749979},"232":{"tf":5.744562646538029},"249":{"tf":4.898979485566356},"250":{"tf":3.605551275463989}}},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"101":{"tf":1.7320508075688772},"274":{"tf":1.0},"359":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.7320508075688772}}},"df":1,"docs":{"391":{"tf":3.0}},"e":{":":{":":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}}}}}}}},"r":{"#":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"414":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"414":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"3":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"242":{"tf":2.0}}}}},"df":0,"docs":{}}}},"1":{"df":2,"docs":{"367":{"tf":1.7320508075688772},"74":{"tf":3.872983346207417}}},"2":{"df":2,"docs":{"367":{"tf":1.7320508075688772},"74":{"tf":3.7416573867739413}}},"3":{"df":1,"docs":{"74":{"tf":2.449489742783178}}},"\\":{"df":0,"docs":{},"n":{"df":2,"docs":{"398":{"tf":1.0},"42":{"tf":1.0}},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}}},",":{"df":0,"docs":{},"其":{"df":0,"docs":{},"中":{"\\":{"df":0,"docs":{},"r":{"df":0,"docs":{},"是":{"df":0,"docs":{},"回":{"df":0,"docs":{},"车":{"df":0,"docs":{},"符":{"df":0,"docs":{},",":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"是":{"df":0,"docs":{},"换":{"df":0,"docs":{},"行":{"df":0,"docs":{},"符":{"df":0,"docs":{},"。":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"398":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"c":{"df":0,"docs":{},"e":{"df":6,"docs":{"297":{"tf":1.0},"316":{"tf":1.7320508075688772},"321":{"tf":2.23606797749979},"322":{"tf":1.0},"323":{"tf":2.23606797749979},"74":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}},"n":{"d":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{";":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"df":9,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{")":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"1":{".":{".":{"=":{"1":{"0":{"0":{"df":9,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"124":{"tf":1.0},"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"c":{"df":0,"docs":{},"h":{"a":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":8,"docs":{"111":{"tf":1.0},"124":{"tf":2.449489742783178},"266":{"tf":4.58257569495584},"39":{"tf":1.0},"40":{"tf":4.358898943540674},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"421":{"tf":1.0}},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"322":{"tf":4.123105625617661}},"g":{"df":6,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"362":{"tf":1.7320508075688772},"41":{"tf":1.0},"62":{"tf":1.0},"78":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"417":{"tf":1.0}}}}},",":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"417":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"w":{"df":4,"docs":{"309":{"tf":1.0},"367":{"tf":1.0},"412":{"tf":1.0},"414":{"tf":1.0}}}},"b":{"df":1,"docs":{"24":{"tf":1.0}}},"c":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"284":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"a":{"df":3,"docs":{"285":{"tf":1.7320508075688772},"286":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951}}},"b":{"df":1,"docs":{"293":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"306":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"285":{"tf":2.0},"286":{"tf":1.0},"294":{"tf":1.0}},"。":{"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"285":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},",":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"285":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"294":{"tf":2.0}},"e":{"(":{"&":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"1":{"0":{"df":3,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"293":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":3,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"293":{"tf":1.0}}},"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"291":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"0":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0}}}},"o":{"d":{"df":1,"docs":{"294":{"tf":3.1622776601683795}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"5":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"a":{"df":2,"docs":{"286":{"tf":2.0},"293":{"tf":1.7320508075688772}}},"b":{"df":1,"docs":{"293":{"tf":1.4142135623730951}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"286":{"tf":1.0},"294":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"285":{"tf":2.23606797749979},"286":{"tf":2.0},"291":{"tf":1.0},"293":{"tf":3.0}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"306":{"tf":2.449489742783178},"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"294":{"tf":3.1622776601683795}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"t":{">":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"288":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"270":{"tf":1.0},"284":{"tf":2.0},"285":{"tf":2.23606797749979},"286":{"tf":2.8284271247461903},"288":{"tf":1.0},"291":{"tf":2.8284271247461903},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":3.7416573867739413},"295":{"tf":1.0},"306":{"tf":3.1622776601683795},"307":{"tf":1.7320508075688772},"309":{"tf":1.7320508075688772},"310":{"tf":1.0}}}},"df":3,"docs":{"273":{"tf":1.0},"275":{"tf":1.0},"293":{"tf":3.1622776601683795}}},"df":11,"docs":{"185":{"tf":4.58257569495584},"213":{"tf":1.0},"231":{"tf":1.0},"242":{"tf":1.0},"359":{"tf":1.4142135623730951},"367":{"tf":1.0},"368":{"tf":1.4142135623730951},"414":{"tf":1.4142135623730951},"417":{"tf":1.7320508075688772},"42":{"tf":1.0},"428":{"tf":2.449489742783178}},"e":{"a":{"d":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"35":{"tf":2.0},"36":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.4142135623730951},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"160":{"tf":2.0},"161":{"tf":2.0}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"160":{"tf":1.0},"161":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":26,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"167":{"tf":1.0},"180":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"219":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"382":{"tf":1.0},"405":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}},"i":{"df":2,"docs":{"315":{"tf":1.0},"316":{"tf":1.0}}},"m":{"df":1,"docs":{"267":{"tf":1.0}},"e":{"df":0,"docs":{},"、":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"399":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":9,"docs":{"300":{"tf":2.23606797749979},"301":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"319":{"tf":3.1622776601683795},"320":{"tf":2.8284271247461903},"405":{"tf":5.477225575051661},"407":{"tf":3.605551275463989},"408":{"tf":3.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"405":{"tf":1.4142135623730951},"407":{"tf":2.0},"408":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"405":{"tf":1.0},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"x":{"df":1,"docs":{"325":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"325":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"153":{"tf":1.0},"157":{"tf":1.0}}}}}},"t":{"1":{".":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"2":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"3":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"93":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"df":6,"docs":{"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":3.4641016151377544},"93":{"tf":1.7320508075688772},"95":{"tf":3.1622776601683795},"97":{"tf":1.7320508075688772}}},"2":{"df":2,"docs":{"95":{"tf":3.0},"97":{"tf":1.4142135623730951}}},"3":{"df":2,"docs":{"95":{"tf":2.449489742783178},"97":{"tf":1.4142135623730951}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":11,"docs":{"100":{"tf":1.4142135623730951},"199":{"tf":5.656854249492381},"242":{"tf":4.58257569495584},"88":{"tf":2.23606797749979},"89":{"tf":1.0},"90":{"tf":3.4641016151377544},"91":{"tf":4.898979485566356},"93":{"tf":4.47213595499958},"95":{"tf":4.358898943540674},"96":{"tf":2.0},"97":{"tf":2.6457513110645907}},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"90":{"tf":1.0}}}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"3":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},",":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"273":{"tf":1.7320508075688772}}}}},"v":{"df":7,"docs":{"300":{"tf":1.7320508075688772},"302":{"tf":1.0},"319":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"349":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.7320508075688772}}}},"d":{"df":3,"docs":{"239":{"tf":1.7320508075688772},"258":{"tf":2.0},"359":{"tf":1.7320508075688772}}},"df":4,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"123":{"tf":1.0},"258":{"tf":1.0}},"f":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"270":{"tf":1.0},"290":{"tf":1.7320508075688772}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"289":{"tf":2.0},"290":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.0}},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"a":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"289":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"294":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{">":{"/":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":12,"docs":{"270":{"tf":1.4142135623730951},"286":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":3.0},"289":{"tf":2.0},"290":{"tf":2.8284271247461903},"291":{"tf":3.3166247903554},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"307":{"tf":1.0},"310":{"tf":1.4142135623730951}}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"412":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":20,"docs":{"102":{"tf":2.0},"115":{"tf":1.0},"185":{"tf":1.0},"195":{"tf":1.0},"270":{"tf":1.7320508075688772},"284":{"tf":1.0},"289":{"tf":2.0},"292":{"tf":1.0},"294":{"tf":1.0},"306":{"tf":1.0},"35":{"tf":1.0},"368":{"tf":1.0},"407":{"tf":1.0},"42":{"tf":1.4142135623730951},"50":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":2.6457513110645907},"74":{"tf":1.0},"75":{"tf":1.7320508075688772},"91":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"189":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"94":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"75":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":3,"docs":{"270":{"tf":1.0},"290":{"tf":1.4142135623730951},"291":{"tf":1.0}}}},"df":1,"docs":{"290":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"353":{"tf":1.0}}}}}},"m":{"d":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"345":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":2.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"260":{"tf":1.0},"40":{"tf":1.7320508075688772}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"434":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":1,"docs":{"115":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":7,"docs":{"155":{"tf":1.0},"156":{"tf":1.0},"255":{"tf":3.1622776601683795},"267":{"tf":1.0},"28":{"tf":1.7320508075688772},"434":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":1,"docs":{"62":{"tf":3.0}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}},"v":{"df":4,"docs":{"232":{"tf":1.4142135623730951},"331":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"107":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"377":{"tf":3.4641016151377544}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"l":{"a":{"c":{"df":2,"docs":{"145":{"tf":1.0},"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":4,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":2.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"260":{"tf":1.0}}}}}}}}},"r":{"df":1,"docs":{"159":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},",":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}}}},"df":3,"docs":{"275":{"tf":1.0},"391":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"401":{"tf":2.449489742783178},"402":{"tf":1.4142135623730951},"404":{"tf":1.7320508075688772},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"341":{"tf":1.7320508075688772},"342":{"tf":3.4641016151377544},"343":{"tf":1.0}}}}}}},"df":3,"docs":{"341":{"tf":3.1622776601683795},"342":{"tf":1.7320508075688772},"343":{"tf":2.8284271247461903}}}}}}}}},"df":4,"docs":{"396":{"tf":1.0},"398":{"tf":2.0},"401":{"tf":1.0},"437":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":17,"docs":{"142":{"tf":1.4142135623730951},"273":{"tf":1.0},"299":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":4.795831523312719},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"335":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"377":{"tf":2.23606797749979}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"107":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"n":{"df":8,"docs":{"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"398":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"260":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":9,"docs":{"316":{"tf":1.4142135623730951},"396":{"tf":1.0},"399":{"tf":1.7320508075688772},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}}}}},"t":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"114":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"120":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"189":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"157":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"<":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"160":{"tf":1.0},"161":{"tf":1.7320508075688772},"398":{"tf":1.0}}}}},"t":{"df":13,"docs":{"153":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"158":{"tf":1.7320508075688772},"160":{"tf":1.0},"162":{"tf":2.0},"169":{"tf":1.0},"174":{"tf":1.0},"203":{"tf":2.449489742783178},"224":{"tf":1.0},"225":{"tf":1.0},"300":{"tf":1.7320508075688772},"381":{"tf":2.6457513110645907},"397":{"tf":1.0}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"405":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"8":{"df":1,"docs":{"348":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}},"df":58,"docs":{"121":{"tf":2.0},"122":{"tf":1.7320508075688772},"156":{"tf":1.0},"157":{"tf":3.3166247903554},"159":{"tf":1.4142135623730951},"160":{"tf":1.7320508075688772},"161":{"tf":1.7320508075688772},"162":{"tf":4.58257569495584},"163":{"tf":2.0},"165":{"tf":2.23606797749979},"166":{"tf":1.4142135623730951},"168":{"tf":2.0},"170":{"tf":2.0},"172":{"tf":2.8284271247461903},"174":{"tf":1.7320508075688772},"186":{"tf":2.0},"188":{"tf":4.123105625617661},"189":{"tf":3.0},"194":{"tf":1.4142135623730951},"198":{"tf":3.0},"199":{"tf":2.23606797749979},"200":{"tf":2.23606797749979},"201":{"tf":2.449489742783178},"202":{"tf":2.0},"203":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.6457513110645907},"208":{"tf":2.23606797749979},"210":{"tf":1.4142135623730951},"211":{"tf":3.1622776601683795},"224":{"tf":3.1622776601683795},"225":{"tf":2.8284271247461903},"226":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":3.3166247903554},"231":{"tf":1.7320508075688772},"232":{"tf":5.656854249492381},"246":{"tf":1.0},"249":{"tf":4.58257569495584},"250":{"tf":3.1622776601683795},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"306":{"tf":1.0},"316":{"tf":1.4142135623730951},"318":{"tf":1.0},"323":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"349":{"tf":1.0},"36":{"tf":3.605551275463989},"381":{"tf":3.1622776601683795},"391":{"tf":1.0},"398":{"tf":1.4142135623730951},"401":{"tf":1.0},"405":{"tf":1.0},"42":{"tf":2.0},"45":{"tf":1.4142135623730951},"62":{"tf":2.449489742783178}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":24,"docs":{"160":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":2.23606797749979},"186":{"tf":1.0},"189":{"tf":1.4142135623730951},"191":{"tf":1.0},"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":2.0},"250":{"tf":1.7320508075688772},"316":{"tf":1.0},"368":{"tf":1.0},"386":{"tf":2.0},"398":{"tf":1.0},"412":{"tf":1.0},"58":{"tf":2.0},"75":{"tf":2.449489742783178},"77":{"tf":2.23606797749979},"78":{"tf":2.0}},"s":{"_":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"386":{"tf":2.23606797749979}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"381":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"182":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"182":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":2.0}}}}}}},"u":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"f":{"c":{"df":1,"docs":{"437":{"tf":2.23606797749979}}},"df":0,"docs":{}},"g":{"b":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"359":{"tf":1.0}}},"df":1,"docs":{"267":{"tf":1.7320508075688772}}},"h":{"df":1,"docs":{"375":{"tf":3.1622776601683795}},"s":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"375":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"434":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"(":{"b":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":11,"docs":{"198":{"tf":2.449489742783178},"200":{"tf":2.449489742783178},"203":{"tf":1.4142135623730951},"206":{"tf":2.0},"208":{"tf":1.4142135623730951},"210":{"tf":2.0},"228":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"323":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"375":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"213":{"tf":1.0}}}},"p":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"213":{"tf":1.0},"267":{"tf":2.8284271247461903}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"124":{"tf":1.0},"41":{"tf":1.0}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"111":{"tf":1.0},"115":{"tf":1.0},"412":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"392":{"tf":1.4142135623730951}},"e":{"(":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"392":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"392":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"v":{"4":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772}}},"6":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"w":{"df":1,"docs":{"136":{"tf":1.0}}}},"s":{"df":2,"docs":{"22":{"tf":1.0},"24":{"tf":1.0}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"61":{"tf":1.0}}},"y":{"df":0,"docs":{},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}},",":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},",":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"179":{"tf":1.0},"191":{"tf":1.0},"378":{"tf":1.0}}}},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":8,"docs":{"225":{"tf":2.8284271247461903},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":101,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.7320508075688772},"155":{"tf":1.7320508075688772},"156":{"tf":2.449489742783178},"157":{"tf":1.7320508075688772},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":3.1622776601683795},"199":{"tf":3.0},"200":{"tf":2.449489742783178},"201":{"tf":2.449489742783178},"202":{"tf":2.8284271247461903},"204":{"tf":1.4142135623730951},"206":{"tf":2.449489742783178},"207":{"tf":2.6457513110645907},"208":{"tf":2.449489742783178},"211":{"tf":4.0},"214":{"tf":1.0},"216":{"tf":2.0},"217":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"220":{"tf":1.4142135623730951},"224":{"tf":2.8284271247461903},"225":{"tf":4.123105625617661},"226":{"tf":2.23606797749979},"228":{"tf":1.7320508075688772},"229":{"tf":3.872983346207417},"232":{"tf":3.4641016151377544},"234":{"tf":1.0},"235":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"241":{"tf":2.0},"242":{"tf":1.7320508075688772},"246":{"tf":1.4142135623730951},"257":{"tf":1.0},"266":{"tf":3.3166247903554},"27":{"tf":2.8284271247461903},"273":{"tf":1.0},"277":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":2.23606797749979},"285":{"tf":1.0},"286":{"tf":1.4142135623730951},"289":{"tf":1.0},"290":{"tf":1.7320508075688772},"291":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"316":{"tf":2.23606797749979},"319":{"tf":1.4142135623730951},"32":{"tf":2.0},"320":{"tf":1.0},"334":{"tf":1.7320508075688772},"335":{"tf":2.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.0},"353":{"tf":1.7320508075688772},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":2.6457513110645907},"377":{"tf":1.0},"38":{"tf":1.7320508075688772},"391":{"tf":1.0},"397":{"tf":1.7320508075688772},"398":{"tf":1.4142135623730951},"400":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.0},"408":{"tf":1.7320508075688772},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"49":{"tf":2.0},"51":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"56":{"tf":2.23606797749979},"57":{"tf":1.0},"58":{"tf":1.7320508075688772},"61":{"tf":3.1622776601683795},"62":{"tf":2.449489742783178},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.7320508075688772},"91":{"tf":2.449489742783178}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"314":{"tf":1.0}},"e":{"df":0,"docs":{},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"特":{"df":0,"docs":{},"别":{"df":0,"docs":{},"是":{"df":0,"docs":{},"(":{"df":0,"docs":{},"但":{"df":0,"docs":{},"不":{"df":0,"docs":{},"仅":{"df":0,"docs":{},"是":{"df":0,"docs":{},"!":{"df":0,"docs":{},")":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"b":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"\"":{"df":0,"docs":{},"、":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"\"":{"df":0,"docs":{},"、":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"365":{"tf":1.0},"432":{"tf":1.0}}},"df":0,"docs":{}}},"<":{"/":{"df":0,"docs":{},"p":{"df":1,"docs":{"400":{"tf":1.0}}}},"df":0,"docs":{}},"_":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":2,"docs":{"156":{"tf":1.7320508075688772},"224":{"tf":1.0}},"e":{"=":{"1":{"df":15,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{":":{":":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"335":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"a":{"c":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":14,"docs":{"111":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"145":{"tf":1.0},"159":{"tf":1.0},"222":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.0},"40":{"tf":1.0},"409":{"tf":1.0},"49":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}},"s":{"df":0,"docs":{},"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"9":{"0":{"c":{"d":{"a":{"1":{"9":{"6":{"9":{"3":{"8":{"3":{"df":0,"docs":{},"f":{"5":{"6":{"a":{"2":{"6":{"3":{"7":{"c":{"b":{"d":{"3":{"0":{"3":{"7":{"b":{"d":{"df":0,"docs":{},"f":{"5":{"9":{"8":{"8":{"4":{"1":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"8":{"3":{"9":{":":{"8":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"5":{"7":{"4":{":":{"1":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"5":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":58,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"111":{"tf":1.4142135623730951},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"17":{"tf":1.4142135623730951},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"22":{"tf":1.4142135623730951},"228":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"29":{"tf":1.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"426":{"tf":1.0},"434":{"tf":1.0},"436":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}},"d":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}}},"df":262,"docs":{"0":{"tf":2.6457513110645907},"1":{"tf":3.4641016151377544},"10":{"tf":4.58257569495584},"100":{"tf":1.0},"102":{"tf":3.0},"103":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":2.0},"108":{"tf":1.0},"109":{"tf":1.4142135623730951},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"115":{"tf":2.23606797749979},"116":{"tf":1.0},"12":{"tf":1.7320508075688772},"121":{"tf":1.7320508075688772},"124":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"13":{"tf":3.0},"130":{"tf":1.4142135623730951},"132":{"tf":2.23606797749979},"133":{"tf":1.0},"134":{"tf":1.4142135623730951},"136":{"tf":1.7320508075688772},"138":{"tf":1.0},"139":{"tf":2.0},"142":{"tf":3.1622776601683795},"143":{"tf":1.4142135623730951},"145":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"153":{"tf":1.7320508075688772},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":2.23606797749979},"157":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.4142135623730951},"161":{"tf":1.0},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":2.0},"172":{"tf":1.4142135623730951},"176":{"tf":2.0},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"181":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":2.6457513110645907},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":2.0},"189":{"tf":1.0},"191":{"tf":3.1622776601683795},"192":{"tf":1.0},"195":{"tf":1.4142135623730951},"196":{"tf":1.7320508075688772},"197":{"tf":1.4142135623730951},"198":{"tf":2.449489742783178},"2":{"tf":2.23606797749979},"20":{"tf":2.449489742783178},"200":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"210":{"tf":1.7320508075688772},"211":{"tf":2.0},"212":{"tf":1.4142135623730951},"213":{"tf":1.7320508075688772},"215":{"tf":1.0},"216":{"tf":1.4142135623730951},"219":{"tf":1.0},"22":{"tf":2.0},"220":{"tf":1.0},"222":{"tf":1.4142135623730951},"225":{"tf":1.0},"228":{"tf":2.23606797749979},"229":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"231":{"tf":2.449489742783178},"232":{"tf":4.0},"236":{"tf":1.4142135623730951},"237":{"tf":2.23606797749979},"238":{"tf":1.0},"24":{"tf":2.23606797749979},"243":{"tf":1.0},"249":{"tf":3.0},"25":{"tf":2.23606797749979},"250":{"tf":2.0},"251":{"tf":1.0},"252":{"tf":2.23606797749979},"253":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"256":{"tf":1.0},"257":{"tf":1.7320508075688772},"26":{"tf":1.4142135623730951},"260":{"tf":1.4142135623730951},"261":{"tf":1.0},"267":{"tf":2.23606797749979},"269":{"tf":1.4142135623730951},"270":{"tf":2.0},"273":{"tf":2.6457513110645907},"274":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"280":{"tf":1.7320508075688772},"281":{"tf":2.449489742783178},"282":{"tf":1.7320508075688772},"283":{"tf":3.605551275463989},"284":{"tf":1.0},"285":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":2.449489742783178},"289":{"tf":1.4142135623730951},"29":{"tf":1.0},"292":{"tf":1.7320508075688772},"293":{"tf":2.0},"295":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":2.8284271247461903},"3":{"tf":1.4142135623730951},"30":{"tf":2.23606797749979},"300":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"307":{"tf":1.7320508075688772},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"311":{"tf":1.0},"312":{"tf":2.0},"313":{"tf":1.0},"314":{"tf":1.7320508075688772},"315":{"tf":2.6457513110645907},"316":{"tf":4.358898943540674},"318":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":1.0},"324":{"tf":1.7320508075688772},"328":{"tf":2.449489742783178},"329":{"tf":1.0},"33":{"tf":1.0},"330":{"tf":1.0},"331":{"tf":1.0},"332":{"tf":2.449489742783178},"333":{"tf":1.0},"334":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951},"336":{"tf":1.0},"337":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"341":{"tf":1.0},"343":{"tf":2.449489742783178},"344":{"tf":2.0},"345":{"tf":1.0},"346":{"tf":1.0},"348":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":2.0},"358":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":2.23606797749979},"361":{"tf":1.0},"363":{"tf":1.7320508075688772},"364":{"tf":2.23606797749979},"365":{"tf":3.872983346207417},"366":{"tf":1.7320508075688772},"367":{"tf":2.0},"368":{"tf":4.358898943540674},"369":{"tf":2.23606797749979},"371":{"tf":1.4142135623730951},"373":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":3.3166247903554},"378":{"tf":1.0},"379":{"tf":1.0},"381":{"tf":1.0},"382":{"tf":2.23606797749979},"383":{"tf":2.0},"387":{"tf":1.0},"388":{"tf":1.4142135623730951},"389":{"tf":3.0},"39":{"tf":1.4142135623730951},"390":{"tf":1.4142135623730951},"391":{"tf":4.358898943540674},"393":{"tf":1.0},"394":{"tf":1.0},"395":{"tf":1.7320508075688772},"397":{"tf":1.0},"4":{"tf":2.449489742783178},"40":{"tf":2.0},"402":{"tf":1.0},"405":{"tf":1.7320508075688772},"409":{"tf":1.7320508075688772},"410":{"tf":1.0},"411":{"tf":1.0},"413":{"tf":1.0},"414":{"tf":1.0},"415":{"tf":1.0},"416":{"tf":1.0},"42":{"tf":3.3166247903554},"425":{"tf":1.4142135623730951},"426":{"tf":1.7320508075688772},"427":{"tf":1.4142135623730951},"428":{"tf":1.4142135623730951},"429":{"tf":2.449489742783178},"430":{"tf":4.358898943540674},"432":{"tf":1.7320508075688772},"433":{"tf":1.7320508075688772},"434":{"tf":4.123105625617661},"436":{"tf":2.6457513110645907},"437":{"tf":2.8284271247461903},"46":{"tf":1.7320508075688772},"47":{"tf":2.0},"48":{"tf":1.4142135623730951},"49":{"tf":2.0},"5":{"tf":1.4142135623730951},"50":{"tf":1.0},"52":{"tf":1.7320508075688772},"53":{"tf":4.358898943540674},"54":{"tf":2.6457513110645907},"55":{"tf":2.0},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.4142135623730951},"59":{"tf":1.4142135623730951},"6":{"tf":1.0},"61":{"tf":2.449489742783178},"62":{"tf":2.449489742783178},"64":{"tf":2.0},"65":{"tf":1.7320508075688772},"66":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.7320508075688772},"70":{"tf":4.123105625617661},"71":{"tf":1.0},"74":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951},"77":{"tf":1.0},"78":{"tf":1.7320508075688772},"8":{"tf":2.6457513110645907},"80":{"tf":1.7320508075688772},"81":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"91":{"tf":1.4142135623730951},"93":{"tf":1.7320508075688772},"94":{"tf":2.23606797749979},"98":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"427":{"tf":1.4142135623730951}}}},"m":{"df":0,"docs":{},"t":{"df":3,"docs":{"23":{"tf":1.0},"4":{"tf":1.0},"426":{"tf":2.6457513110645907}},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"134":{"tf":1.0},"295":{"tf":1.0},"311":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"267":{"tf":1.0}}}},"df":10,"docs":{"0":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"18":{"tf":2.0},"19":{"tf":1.0},"30":{"tf":1.0},"426":{"tf":1.0},"428":{"tf":1.0},"436":{"tf":2.8284271247461903}}}},"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"v":{":":{"9":{"9":{".":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"x":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"319":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"300":{"tf":1.0},"301":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"319":{"tf":1.7320508075688772},"349":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"319":{"tf":1.7320508075688772},"320":{"tf":3.3166247903554}}}}}},"df":8,"docs":{"300":{"tf":2.23606797749979},"301":{"tf":1.0},"302":{"tf":1.7320508075688772},"303":{"tf":1.4142135623730951},"319":{"tf":3.0},"320":{"tf":2.449489742783178},"325":{"tf":1.7320508075688772},"349":{"tf":1.0}}},"y":{"b":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}}},"s":{".":{"a":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":3,"docs":{"191":{"tf":1.0},"77":{"tf":2.23606797749979},"78":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"77":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"72":{"tf":1.0},"73":{"tf":1.7320508075688772},"77":{"tf":2.449489742783178},"78":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"'":{"df":0,"docs":{},"l":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"69":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"247":{"tf":1.0}}}}}}},"1":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"2":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"[":{"0":{"df":1,"docs":{"142":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":6,"docs":{"141":{"tf":3.3166247903554},"142":{"tf":1.0},"383":{"tf":1.4142135623730951},"70":{"tf":4.69041575982343},"72":{"tf":2.0},"73":{"tf":3.1622776601683795}}},"2":{"df":4,"docs":{"141":{"tf":4.358898943540674},"383":{"tf":1.4142135623730951},"70":{"tf":4.0},"72":{"tf":2.449489742783178}},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}}}},"3":{"df":2,"docs":{"141":{"tf":2.6457513110645907},"72":{"tf":1.7320508075688772}}},"[":{".":{".":{"2":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"2":{"df":1,"docs":{"78":{"tf":1.0}}},"5":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":2.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"78":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"78":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"78":{"tf":1.0}}},"6":{".":{".":{"1":{"1":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":8,"docs":{"102":{"tf":1.0},"228":{"tf":2.0},"229":{"tf":2.0},"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},")":{"df":0,"docs":{},";":{"df":0,"docs":{},"编":{"df":0,"docs":{},"译":{"df":0,"docs":{},"器":{"df":0,"docs":{},"也":{"df":0,"docs":{},"指":{"df":0,"docs":{},"出":{"df":0,"docs":{},"了":{"df":0,"docs":{},"原":{"df":0,"docs":{},"因":{"df":0,"docs":{},":":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"257":{"tf":1.0}}}}}},"l":{"a":{"d":{"df":3,"docs":{"119":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"343":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"152":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"320":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":2.0}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"335":{"tf":1.0},"52":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"359":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"91":{"tf":2.23606797749979}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"343":{"tf":1.4142135623730951},"434":{"tf":1.0}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":11,"docs":{"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"120":{"tf":1.0},"137":{"tf":1.0},"286":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"51":{"tf":1.4142135623730951},"68":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"147":{"tf":1.0},"148":{"tf":2.449489742783178},"150":{"tf":1.7320508075688772}},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"\"":{")":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"5":{"0":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"\"":{")":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"5":{"0":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"0":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"150":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"147":{"tf":1.0},"148":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}}}},"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"334":{"tf":1.4142135623730951}}}},"df":2,"docs":{"334":{"tf":3.3166247903554},"335":{"tf":4.0}}}}}}},"df":20,"docs":{"140":{"tf":2.23606797749979},"141":{"tf":3.1622776601683795},"143":{"tf":1.7320508075688772},"183":{"tf":1.0},"191":{"tf":1.0},"193":{"tf":1.0},"240":{"tf":1.4142135623730951},"252":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"360":{"tf":2.8284271247461903},"68":{"tf":3.0},"69":{"tf":1.4142135623730951},"70":{"tf":2.23606797749979},"71":{"tf":2.6457513110645907},"72":{"tf":1.0},"73":{"tf":2.8284271247461903},"74":{"tf":5.196152422706632},"75":{"tf":3.605551275463989},"77":{"tf":2.23606797749979},"78":{"tf":3.872983346207417}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"229":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"228":{"tf":1.7320508075688772},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"<":{"'":{"a":{">":{"(":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"231":{"tf":1.4142135623730951},"232":{"tf":2.6457513110645907},"250":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"232":{"tf":1.7320508075688772},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"<":{"'":{"a":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"213":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"225":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":2.8284271247461903},"229":{"tf":3.3166247903554},"231":{"tf":1.4142135623730951},"232":{"tf":2.0},"248":{"tf":1.0},"250":{"tf":2.0},"252":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"214":{"tf":1.0}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":3,"docs":{"27":{"tf":2.0},"398":{"tf":2.0},"40":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"(":{"df":2,"docs":{"77":{"tf":1.0},"78":{"tf":1.0}}},"df":2,"docs":{"77":{"tf":1.0},"78":{"tf":1.0}}},"df":0,"docs":{}}}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}}}},"df":8,"docs":{"187":{"tf":1.4142135623730951},"318":{"tf":3.872983346207417},"322":{"tf":1.4142135623730951},"323":{"tf":2.0},"360":{"tf":2.6457513110645907},"368":{"tf":1.0},"54":{"tf":1.4142135623730951},"74":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":9,"docs":{"124":{"tf":1.4142135623730951},"125":{"tf":2.0},"167":{"tf":1.0},"382":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"42":{"tf":3.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"df":10,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"259":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":6,"docs":{"142":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.4142135623730951},"273":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":2,"docs":{"333":{"tf":1.4142135623730951},"335":{"tf":3.1622776601683795}}}}},"df":3,"docs":{"15":{"tf":1.0},"316":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}},"f":{".":{"0":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"378":{"tf":1.0}}}}}}},"df":3,"docs":{"280":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"378":{"tf":1.4142135623730951}}},"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951},"343":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":5,"docs":{"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"374":{"tf":1.4142135623730951}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":4,"docs":{"199":{"tf":2.0},"93":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}}}}}}},"i":{"df":4,"docs":{"183":{"tf":1.4142135623730951},"375":{"tf":1.0},"377":{"tf":1.0},"94":{"tf":1.0}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"331":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"331":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"331":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"o":{"c":{"df":3,"docs":{"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"x":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"239":{"tf":2.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"405":{"tf":1.7320508075688772},"407":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"289":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"289":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"239":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"341":{"tf":1.4142135623730951},"342":{"tf":2.449489742783178}},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"342":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"341":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"180":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"377":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"179":{"tf":1.0},"180":{"tf":1.7320508075688772},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"167":{"tf":1.0},"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"199":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"x":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"(":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":5,"docs":{"175":{"tf":1.7320508075688772},"183":{"tf":1.4142135623730951},"375":{"tf":1.0},"377":{"tf":1.0},"94":{"tf":1.0}}},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"(":{"2":{")":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"175":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"244":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"375":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"417":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"280":{"tf":1.0}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":37,"docs":{"101":{"tf":1.4142135623730951},"125":{"tf":1.0},"141":{"tf":1.4142135623730951},"167":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":1.0},"183":{"tf":1.7320508075688772},"191":{"tf":2.0},"192":{"tf":2.23606797749979},"239":{"tf":1.0},"242":{"tf":1.0},"244":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":2.0},"289":{"tf":3.1622776601683795},"290":{"tf":1.0},"293":{"tf":1.4142135623730951},"331":{"tf":1.7320508075688772},"339":{"tf":1.4142135623730951},"340":{"tf":1.0},"341":{"tf":2.8284271247461903},"342":{"tf":4.898979485566356},"343":{"tf":2.23606797749979},"374":{"tf":1.7320508075688772},"375":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"381":{"tf":3.4641016151377544},"382":{"tf":1.0},"407":{"tf":2.449489742783178},"408":{"tf":1.7320508075688772},"412":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":4.242640687119285},"94":{"tf":1.0},"95":{"tf":1.7320508075688772},"96":{"tf":2.0}},"、":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"115":{"tf":1.0}}}}}},")":{"df":0,"docs":{},"或":{"df":0,"docs":{},"者":{"df":0,"docs":{},"是":{"df":0,"docs":{},"获":{"df":0,"docs":{},"取":{"df":0,"docs":{},"所":{"df":0,"docs":{},"有":{"df":0,"docs":{},"权":{"df":0,"docs":{},"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"事":{"df":0,"docs":{},"实":{"df":0,"docs":{},"上":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"94":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"做":{"df":0,"docs":{},"出":{"df":0,"docs":{},"修":{"df":0,"docs":{},"改":{"df":0,"docs":{},"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"58":{"tf":1.0}}}}}}},"df":1,"docs":{"391":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"n":{"d":{"(":{"\"":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}},"df":0,"docs":{}}},"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"289":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"289":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"289":{"tf":2.6457513110645907},"290":{"tf":1.0},"296":{"tf":1.0},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"306":{"tf":2.23606797749979},"307":{"tf":1.0},"308":{"tf":1.4142135623730951},"309":{"tf":3.1622776601683795},"310":{"tf":1.7320508075688772},"311":{"tf":2.23606797749979},"319":{"tf":1.0},"370":{"tf":2.23606797749979},"381":{"tf":2.23606797749979},"405":{"tf":4.58257569495584},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"405":{"tf":4.358898943540674},"407":{"tf":3.4641016151377544},"408":{"tf":4.0}}}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"306":{"tf":1.7320508075688772}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"114":{"tf":2.0}},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"395":{"tf":1.0}}},"df":0,"docs":{}}},"df":15,"docs":{"111":{"tf":1.0},"260":{"tf":1.0},"316":{"tf":1.0},"395":{"tf":2.6457513110645907},"396":{"tf":2.449489742783178},"397":{"tf":1.7320508075688772},"400":{"tf":1.7320508075688772},"401":{"tf":1.4142135623730951},"402":{"tf":1.7320508075688772},"403":{"tf":2.0},"404":{"tf":2.449489742783178},"405":{"tf":3.1622776601683795},"406":{"tf":1.0},"408":{"tf":2.6457513110645907},"429":{"tf":1.4142135623730951}}}},"i":{"c":{"df":1,"docs":{"151":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"289":{"tf":2.0}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":2,"docs":{"360":{"tf":1.0},"436":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"360":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"211":{"tf":2.449489742783178}}}}}},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"70":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":4,"docs":{"296":{"tf":1.0},"300":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951},"306":{"tf":2.449489742783178}}}}},"df":1,"docs":{"15":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":4,"docs":{"115":{"tf":1.0},"232":{"tf":1.0},"234":{"tf":1.0},"24":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":1,"docs":{"239":{"tf":2.449489742783178}}}}}}},"df":1,"docs":{"239":{"tf":2.0}}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}},"o":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"247":{"tf":2.0}},"e":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"247":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"247":{"tf":2.8284271247461903}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":1,"docs":{"247":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"247":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"416":{"tf":1.4142135623730951}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"83":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"197":{"tf":1.0},"202":{"tf":3.605551275463989},"203":{"tf":1.0}},"i":{"c":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"202":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":3,"docs":{"196":{"tf":1.4142135623730951},"206":{"tf":2.0},"24":{"tf":1.0}},"n":{"df":1,"docs":{"106":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"406":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"408":{"tf":3.3166247903554}}}}},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"114":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"375":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"82":{"tf":2.8284271247461903},"83":{"tf":1.4142135623730951},"84":{"tf":2.8284271247461903},"87":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"186":{"tf":1.0},"228":{"tf":1.0}}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"328":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":4,"docs":{"300":{"tf":1.0},"303":{"tf":1.0},"396":{"tf":1.0},"405":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"398":{"tf":1.0}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"240":{"tf":1.0}}}}},"x":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"54":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":5,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.7320508075688772},"105":{"tf":2.0},"106":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"z":{"df":0,"docs":{},"e":{"d":{">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"247":{"tf":2.449489742783178},"273":{"tf":1.0},"334":{"tf":1.0},"383":{"tf":2.8284271247461903},"386":{"tf":1.4142135623730951},"405":{"tf":5.0},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178},"417":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"318":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":2.8284271247461903},"323":{"tf":1.0},"404":{"tf":2.23606797749979},"405":{"tf":2.6457513110645907},"408":{"tf":1.4142135623730951}}}}},"i":{"c":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"368":{"tf":1.0}}}}},"r":{"df":1,"docs":{"368":{"tf":1.0}}}},"df":1,"docs":{"368":{"tf":2.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":39,"docs":{"139":{"tf":2.23606797749979},"141":{"tf":2.0},"143":{"tf":2.23606797749979},"145":{"tf":1.4142135623730951},"150":{"tf":1.0},"162":{"tf":2.0},"170":{"tf":1.7320508075688772},"172":{"tf":2.23606797749979},"175":{"tf":1.0},"186":{"tf":2.6457513110645907},"188":{"tf":1.4142135623730951},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":2.0},"194":{"tf":1.0},"222":{"tf":1.0},"224":{"tf":1.4142135623730951},"228":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"242":{"tf":2.0},"249":{"tf":2.449489742783178},"252":{"tf":1.0},"281":{"tf":2.0},"340":{"tf":1.4142135623730951},"341":{"tf":1.0},"342":{"tf":1.0},"368":{"tf":5.291502622129181},"369":{"tf":1.0},"383":{"tf":1.7320508075688772},"389":{"tf":1.0},"404":{"tf":1.0},"417":{"tf":1.0},"422":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":2.23606797749979},"78":{"tf":6.557438524302},"79":{"tf":2.449489742783178},"80":{"tf":1.0},"87":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"[":{"_":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"这":{"df":0,"docs":{},"也":{"df":0,"docs":{},"就":{"df":0,"docs":{},"是":{"df":0,"docs":{},"为":{"df":0,"docs":{},"什":{"df":0,"docs":{},"么":{"df":0,"docs":{},"字":{"df":0,"docs":{},"符":{"df":0,"docs":{},"串":{"df":0,"docs":{},"字":{"df":0,"docs":{},"面":{"df":0,"docs":{},"值":{"df":0,"docs":{},"是":{"df":0,"docs":{},"不":{"df":0,"docs":{},"可":{"df":0,"docs":{},"变":{"df":0,"docs":{},"的":{"df":0,"docs":{},";":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"78":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}},",":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"w":{"(":{"\"":{"a":{"df":1,"docs":{"322":{"tf":3.0}}},"b":{"df":1,"docs":{"322":{"tf":3.4641016151377544}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}},"df":0,"docs":{}}},"df":3,"docs":{"321":{"tf":1.4142135623730951},"322":{"tf":2.8284271247461903},"323":{"tf":1.7320508075688772}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}}},"_":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"199":{"tf":2.23606797749979}}}}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":50,"docs":{"101":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"125":{"tf":2.0},"167":{"tf":1.4142135623730951},"183":{"tf":1.0},"199":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":2.0},"226":{"tf":2.0},"232":{"tf":1.0},"249":{"tf":1.7320508075688772},"257":{"tf":1.0},"258":{"tf":2.0},"260":{"tf":1.0},"266":{"tf":1.4142135623730951},"267":{"tf":1.0},"289":{"tf":1.0},"303":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"323":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":2.8284271247461903},"343":{"tf":1.0},"374":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.7320508075688772},"383":{"tf":1.7320508075688772},"391":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.4142135623730951},"404":{"tf":1.7320508075688772},"405":{"tf":4.58257569495584},"407":{"tf":1.0},"408":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"395":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"260":{"tf":1.0},"330":{"tf":1.0},"434":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"(":{"&":{"1":{"df":1,"docs":{"244":{"tf":1.0}}},"2":{"df":1,"docs":{"244":{"tf":1.0}}},"3":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"134":{"tf":1.0}}}}},"'":{"d":{"df":1,"docs":{"162":{"tf":1.0}}},"df":1,"docs":{"102":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"360":{"tf":1.0}}},"df":0,"docs":{}},"3":{"df":0,"docs":{},"u":{"8":{"df":1,"docs":{"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"4":{"df":1,"docs":{"361":{"tf":1.4142135623730951}}},"5":{".":{"0":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"0":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}}},"df":7,"docs":{"102":{"tf":1.4142135623730951},"105":{"tf":2.6457513110645907},"106":{"tf":1.0},"176":{"tf":1.0},"356":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"361":{"tf":1.7320508075688772}}},"_":{"df":1,"docs":{"360":{"tf":2.0}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":5,"docs":{"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"348":{"tf":1.0}}}}}}},"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":2.449489742783178}},"f":{"6":{"4":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"3":{"2":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"105":{"tf":3.0},"106":{"tf":2.0},"347":{"tf":1.7320508075688772},"356":{"tf":1.0},"361":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"x":{")":{"df":0,"docs":{},",":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":1,"docs":{"108":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":1,"docs":{"361":{"tf":1.4142135623730951}},"o":{"d":{"df":1,"docs":{"294":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"239":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"s":{".":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"374":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":4,"docs":{"102":{"tf":1.7320508075688772},"105":{"tf":1.0},"174":{"tf":1.0},"382":{"tf":1.0}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"319":{"tf":2.0},"320":{"tf":2.6457513110645907},"324":{"tf":2.23606797749979},"331":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"382":{"tf":1.0}}},"x":{"df":3,"docs":{"242":{"tf":1.0},"353":{"tf":3.1622776601683795},"361":{"tf":2.0}}}},"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"390":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"71":{"tf":1.4142135623730951}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"390":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"353":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":4,"docs":{"71":{"tf":1.4142135623730951},"72":{"tf":2.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"73":{"tf":1.4142135623730951},"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.4142135623730951},"235":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"194":{"tf":1.0}}},"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"87":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"df":5,"docs":{"229":{"tf":1.0},"268":{"tf":1.4142135623730951},"59":{"tf":1.0},"61":{"tf":1.4142135623730951},"94":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"1":{"2":{"3":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},",":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"242":{"tf":3.1622776601683795}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"242":{"tf":1.4142135623730951}},"e":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":1,"docs":{"242":{"tf":2.0}}}}}}},"df":1,"docs":{"242":{"tf":1.0}}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"51":{"tf":3.0}},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"51":{"tf":1.7320508075688772}}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"51":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":1,"docs":{"391":{"tf":1.0}}},"w":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"f":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}},"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"318":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":3,"docs":{"298":{"tf":5.196152422706632},"306":{"tf":1.0},"405":{"tf":1.7320508075688772}}}}},"d":{"df":0,"docs":{},"x":{"df":1,"docs":{"260":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"376":{"tf":2.0}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"211":{"tf":1.0}},"i":{"df":5,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"376":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"368":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":1,"docs":{"368":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"376":{"tf":1.4142135623730951}},"。":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"376":{"tf":1.0}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"136":{"tf":1.0},"333":{"tf":1.0}},"l":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"(":{"1":{"0":{".":{"1":{"2":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"3":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"136":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"q":{"df":1,"docs":{"96":{"tf":1.4142135623730951}},"l":{"!":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"393":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"393":{"tf":1.0}}}}}}}},"df":1,"docs":{"393":{"tf":2.0}}},"u":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"88":{"tf":1.7320508075688772},"89":{"tf":1.0},"90":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"c":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"111":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"127":{"tf":2.6457513110645907},"128":{"tf":1.0}}}},"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"127":{"tf":1.0},"128":{"tf":1.0}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":2.0}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.4142135623730951}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":64,"docs":{"111":{"tf":1.7320508075688772},"113":{"tf":1.0},"114":{"tf":1.7320508075688772},"115":{"tf":1.0},"116":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"128":{"tf":1.0},"167":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"191":{"tf":1.0},"198":{"tf":3.0},"199":{"tf":2.6457513110645907},"200":{"tf":1.7320508075688772},"201":{"tf":1.7320508075688772},"202":{"tf":2.23606797749979},"206":{"tf":1.7320508075688772},"207":{"tf":2.0},"208":{"tf":1.7320508075688772},"210":{"tf":1.4142135623730951},"211":{"tf":2.23606797749979},"221":{"tf":1.0},"226":{"tf":2.6457513110645907},"227":{"tf":1.0},"228":{"tf":2.0},"229":{"tf":2.23606797749979},"231":{"tf":1.0},"232":{"tf":2.449489742783178},"244":{"tf":1.0},"245":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":2.0},"250":{"tf":1.4142135623730951},"257":{"tf":2.449489742783178},"258":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"289":{"tf":1.7320508075688772},"290":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"334":{"tf":2.0},"335":{"tf":1.0},"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"374":{"tf":1.0},"375":{"tf":1.0},"389":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.4142135623730951},"405":{"tf":3.605551275463989},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"s":{":":{"1":{"1":{":":{"9":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"1":{"3":{"df":1,"docs":{"202":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":2,"docs":{"200":{"tf":1.0},"201":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"9":{"df":1,"docs":{"198":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"9":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"2":{"5":{"df":1,"docs":{"386":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"6":{":":{"4":{"2":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"5":{"1":{"df":1,"docs":{"228":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"199":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"5":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{":":{"9":{"df":1,"docs":{"116":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"4":{":":{"9":{"df":1,"docs":{"228":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"3":{"3":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"5":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"5":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"2":{":":{"1":{"3":{"df":1,"docs":{"407":{"tf":1.0}}},"df":0,"docs":{}},"2":{"7":{"df":1,"docs":{"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"1":{"3":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"0":{":":{"5":{"3":{"df":1,"docs":{"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"2":{":":{"2":{"2":{"df":1,"docs":{"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"5":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"2":{"8":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"3":{"7":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"9":{"0":{"6":{":":{"4":{"df":1,"docs":{"159":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":148,"docs":{"111":{"tf":2.0},"113":{"tf":1.7320508075688772},"114":{"tf":1.0},"117":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.4142135623730951},"127":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"175":{"tf":1.7320508075688772},"176":{"tf":1.0},"186":{"tf":1.4142135623730951},"188":{"tf":1.7320508075688772},"189":{"tf":1.4142135623730951},"190":{"tf":1.0},"211":{"tf":2.0},"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":2.0},"226":{"tf":2.449489742783178},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"235":{"tf":1.0},"239":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"246":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"258":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979},"298":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":2.23606797749979},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"32":{"tf":1.7320508075688772},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"33":{"tf":1.4142135623730951},"335":{"tf":1.7320508075688772},"337":{"tf":1.0},"343":{"tf":1.4142135623730951},"348":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":2.0},"360":{"tf":2.0},"361":{"tf":1.0},"368":{"tf":1.0},"369":{"tf":1.4142135623730951},"375":{"tf":1.0},"376":{"tf":2.449489742783178},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"385":{"tf":1.0},"391":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"40":{"tf":1.4142135623730951},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.449489742783178},"408":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"414":{"tf":1.0},"42":{"tf":1.4142135623730951},"427":{"tf":2.0},"428":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":2.0},"51":{"tf":1.0},"53":{"tf":2.0},"54":{"tf":2.449489742783178},"55":{"tf":1.4142135623730951},"56":{"tf":1.7320508075688772},"57":{"tf":1.7320508075688772},"58":{"tf":1.7320508075688772},"59":{"tf":1.4142135623730951},"61":{"tf":2.6457513110645907},"62":{"tf":2.449489742783178},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"75":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"78":{"tf":1.7320508075688772},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"96":{"tf":1.0}},"s":{":":{"1":{"0":{":":{"1":{"0":{"df":1,"docs":{"299":{"tf":1.0}}},"6":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"2":{"6":{"df":1,"docs":{"301":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{":":{"1":{"6":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"285":{"tf":1.0}}},"6":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"189":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"2":{"8":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{":":{"1":{"9":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"7":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"1":{"4":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"3":{"0":{"df":1,"docs":{"242":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"1":{"9":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"225":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{":":{"2":{"3":{"df":1,"docs":{"377":{"tf":1.0}}},"df":0,"docs":{}},"4":{"3":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{":":{"2":{"9":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"2":{"1":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{":":{"7":{"df":1,"docs":{"377":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"1":{"3":{"df":1,"docs":{"224":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"2":{"1":{"df":1,"docs":{"224":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"4":{"7":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"3":{"df":2,"docs":{"428":{"tf":1.0},"57":{"tf":1.0}}},"4":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"2":{"8":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"155":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"353":{"tf":1.0}}},"9":{"df":2,"docs":{"351":{"tf":1.0},"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{":":{"1":{"3":{"df":1,"docs":{"289":{"tf":1.0}}},"4":{"df":1,"docs":{"51":{"tf":1.0}}},"5":{"df":2,"docs":{"106":{"tf":1.0},"87":{"tf":1.0}}},"6":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"377":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{":":{"3":{"7":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"2":{"4":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"2":{"df":1,"docs":{"87":{"tf":1.0}}},"9":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}},"2":{"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"61":{"tf":1.0}}},"8":{"df":1,"docs":{"162":{"tf":1.0}}},"9":{"df":1,"docs":{"159":{"tf":1.0}}},"df":1,"docs":{"414":{"tf":1.0}}},"5":{"df":4,"docs":{"156":{"tf":1.4142135623730951},"246":{"tf":1.0},"368":{"tf":1.0},"49":{"tf":1.0}}},"6":{"df":1,"docs":{"156":{"tf":1.0}}},"8":{"df":1,"docs":{"61":{"tf":1.0}}},"9":{"df":1,"docs":{"427":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{":":{"1":{"4":{"df":1,"docs":{"74":{"tf":1.0}}},"5":{"df":1,"docs":{"70":{"tf":1.0}}},"6":{"df":1,"docs":{"75":{"tf":1.0}}},"7":{"df":2,"docs":{"102":{"tf":1.0},"172":{"tf":1.0}}},"df":0,"docs":{}},"2":{"2":{"df":1,"docs":{"360":{"tf":1.0}}},"6":{"df":1,"docs":{"335":{"tf":1.0}}},"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"1":{"3":{"df":1,"docs":{"185":{"tf":1.0}}},"4":{"df":1,"docs":{"74":{"tf":1.0}}},"8":{"df":1,"docs":{"299":{"tf":1.0}}},"df":1,"docs":{"316":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"368":{"tf":1.0}}},"2":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"188":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":2,"docs":{"134":{"tf":1.0},"277":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"2":{"4":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}},"3":{"8":{"df":1,"docs":{"173":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"2":{"3":{"df":1,"docs":{"157":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":2,"docs":{"73":{"tf":1.0},"75":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"3":{"3":{"df":1,"docs":{"186":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":9,"docs":{"111":{"tf":1.0},"113":{"tf":1.0},"127":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":2.0},"26":{"tf":2.23606797749979},"265":{"tf":1.0},"266":{"tf":1.4142135623730951},"400":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"433":{"tf":1.0}}}},"l":{"df":2,"docs":{"434":{"tf":2.23606797749979},"436":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"154":{"tf":1.0},"156":{"tf":1.0},"293":{"tf":1.0},"54":{"tf":1.0},"66":{"tf":1.4142135623730951}},")":{"df":0,"docs":{},"与":{"df":0,"docs":{},"堆":{"df":0,"docs":{},"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"66":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"233":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{},"t":{".":{".":{"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"321":{"tf":1.7320508075688772},"322":{"tf":3.7416573867739413}},"e":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"78":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"321":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"104":{"tf":2.23606797749979},"108":{"tf":1.4142135623730951},"296":{"tf":1.0},"306":{"tf":2.8284271247461903},"337":{"tf":1.0},"338":{"tf":3.605551275463989},"339":{"tf":2.449489742783178},"340":{"tf":2.23606797749979},"341":{"tf":4.358898943540674},"342":{"tf":8.0},"343":{"tf":2.449489742783178}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":21,"docs":{"193":{"tf":3.0},"224":{"tf":2.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"299":{"tf":1.0},"336":{"tf":1.0},"369":{"tf":2.23606797749979},"381":{"tf":2.23606797749979},"405":{"tf":4.358898943540674},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178},"412":{"tf":1.0},"417":{"tf":1.4142135623730951},"52":{"tf":1.0},"75":{"tf":1.7320508075688772}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"434":{"tf":1.0}}}}},"u":{"df":2,"docs":{"385":{"tf":1.0},"399":{"tf":1.4142135623730951}},"s":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"385":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"401":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"y":{"df":1,"docs":{"240":{"tf":1.0}}}},"d":{":":{":":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"125":{"tf":1.0},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{">":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"172":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":6,"docs":{"121":{"tf":1.0},"124":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":3,"docs":{"215":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"249":{"tf":1.0}},"s":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"215":{"tf":1.7320508075688772},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"232":{"tf":1.4142135623730951},"235":{"tf":1.0},"249":{"tf":2.23606797749979},"250":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"162":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"f":{"6":{"4":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"161":{"tf":1.0},"218":{"tf":1.4142135623730951},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":4,"docs":{"183":{"tf":1.0},"194":{"tf":1.0},"377":{"tf":2.0},"91":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"121":{"tf":1.0},"122":{"tf":1.0},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"381":{"tf":1.7320508075688772}}}},"s":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":7,"docs":{"157":{"tf":1.7320508075688772},"158":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"174":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"316":{"tf":1.0},"320":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"398":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"157":{"tf":1.0},"162":{"tf":1.4142135623730951},"174":{"tf":1.0},"381":{"tf":2.23606797749979},"398":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"。":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.0}}}}}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"218":{"tf":1.0}}}}},"t":{">":{"df":0,"docs":{},";":{"df":0,"docs":{},"也":{"df":0,"docs":{},"就":{"df":0,"docs":{},"是":{"df":0,"docs":{},"说":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.7320508075688772}}}}}},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"125":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"121":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":2.23606797749979},"161":{"tf":1.0},"167":{"tf":1.0},"33":{"tf":2.23606797749979},"34":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.0},"37":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{":":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"319":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"165":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"397":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"397":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"375":{"tf":1.0}},"s":{":":{":":{"a":{"d":{"d":{"df":1,"docs":{"375":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"224":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"224":{"tf":1.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"r":{"c":{":":{":":{"df":0,"docs":{},"r":{"c":{"df":6,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"306":{"tf":1.0}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"n":{"c":{":":{":":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"349":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}}}}}},"{":{"a":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"349":{"tf":1.0}}}}}},"df":1,"docs":{"318":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"240":{"tf":1.0},"241":{"tf":1.0},"298":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.4142135623730951},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":1.7320508075688772},"405":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{":":{":":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":9,"docs":{"240":{"tf":1.0},"298":{"tf":1.7320508075688772},"302":{"tf":1.0},"303":{"tf":1.0},"318":{"tf":1.7320508075688772},"319":{"tf":2.0},"320":{"tf":1.7320508075688772},"321":{"tf":1.0},"323":{"tf":1.0}}}}},"df":0,"docs":{},"{":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"{":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"125":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"320":{"tf":1.0},"323":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"322":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":13,"docs":{"124":{"tf":1.7320508075688772},"125":{"tf":1.0},"320":{"tf":1.4142135623730951},"33":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":2,"docs":{"233":{"tf":1.0},"91":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"233":{"tf":1.0}}},"df":0,"docs":{}}},"df":10,"docs":{"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"228":{"tf":1.0},"233":{"tf":1.0},"290":{"tf":1.0},"91":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"0":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"185":{"tf":1.0},"188":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"385":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"1":{"df":1,"docs":{"239":{"tf":1.0}}},"2":{"df":1,"docs":{"239":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"239":{"tf":1.4142135623730951},"405":{"tf":1.0}}}}},"r":{"df":43,"docs":{"119":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"145":{"tf":1.4142135623730951},"162":{"tf":1.0},"186":{"tf":3.0},"188":{"tf":3.0},"189":{"tf":2.449489742783178},"190":{"tf":1.0},"191":{"tf":4.0},"192":{"tf":2.449489742783178},"193":{"tf":1.0},"194":{"tf":1.7320508075688772},"201":{"tf":1.7320508075688772},"221":{"tf":1.4142135623730951},"224":{"tf":2.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":3.1622776601683795},"229":{"tf":4.0},"231":{"tf":2.0},"232":{"tf":5.291502622129181},"249":{"tf":4.58257569495584},"250":{"tf":3.3166247903554},"281":{"tf":2.449489742783178},"289":{"tf":2.6457513110645907},"290":{"tf":1.4142135623730951},"316":{"tf":3.0},"320":{"tf":1.0},"322":{"tf":2.0},"339":{"tf":1.4142135623730951},"340":{"tf":1.4142135623730951},"341":{"tf":1.4142135623730951},"342":{"tf":2.8284271247461903},"343":{"tf":2.0},"369":{"tf":1.0},"383":{"tf":3.872983346207417},"414":{"tf":2.449489742783178},"51":{"tf":1.0},"61":{"tf":1.0},"78":{"tf":3.3166247903554},"87":{"tf":3.0}},"e":{"a":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":9,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{")":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":7,"docs":{"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"325":{"tf":1.4142135623730951}}}}}}},"df":12,"docs":{"323":{"tf":1.4142135623730951},"324":{"tf":3.4641016151377544},"325":{"tf":1.4142135623730951},"397":{"tf":2.23606797749979},"398":{"tf":2.23606797749979},"399":{"tf":2.0},"400":{"tf":1.7320508075688772},"401":{"tf":2.449489742783178},"402":{"tf":1.7320508075688772},"404":{"tf":1.7320508075688772},"405":{"tf":3.0},"408":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"324":{"tf":2.0},"325":{"tf":1.0}}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"1":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"194":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":2.8284271247461903},"189":{"tf":1.4142135623730951},"194":{"tf":1.0}}},"2":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"188":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"186":{"tf":2.0},"188":{"tf":3.4641016151377544},"189":{"tf":2.0},"194":{"tf":1.4142135623730951}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"180":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{":":{"1":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"c":{"d":{"df":4,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":1.0},"189":{"tf":1.4142135623730951},"194":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"148":{"tf":1.0},"149":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":1.4142135623730951}}}}}}}},"d":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"r":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"149":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"r":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":4,"docs":{"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":2.6457513110645907}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"319":{"tf":2.0},"320":{"tf":2.449489742783178}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":14,"docs":{"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.7320508075688772},"191":{"tf":1.0},"201":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"70":{"tf":2.23606797749979},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":2.0},"74":{"tf":2.23606797749979},"75":{"tf":1.7320508075688772},"77":{"tf":1.0},"78":{"tf":2.6457513110645907}}}}}},"i":{"df":6,"docs":{"300":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907}}},"o":{"df":0,"docs":{},"l":{"a":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"179":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"140":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"141":{"tf":1.0}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"188":{"tf":1.4142135623730951}}}}}},"m":{"a":{"df":0,"docs":{},"y":{"b":{"df":1,"docs":{"335":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}},"i":{"df":1,"docs":{"283":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}}},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"335":{"tf":1.0}}}},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"335":{"tf":1.0}}},"l":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"283":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"180":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}}}},"r":{"df":1,"docs":{"189":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"247":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"82":{"tf":1.7320508075688772},"83":{"tf":1.0},"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"1":{"2":{"3":{"df":3,"docs":{"82":{"tf":1.7320508075688772},"83":{"tf":1.0},"84":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}}},"t":{"a":{"c":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"141":{"tf":1.4142135623730951}},"h":{"df":4,"docs":{"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":2.449489742783178}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"302":{"tf":1.0},"303":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"141":{"tf":1.0},"378":{"tf":1.0}}},"df":0,"docs":{}}}}},"x":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":1,"docs":{"188":{"tf":1.7320508075688772}}}}},"y":{"df":4,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178},"335":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"72":{"tf":1.0}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":7,"docs":{"140":{"tf":3.0},"142":{"tf":3.7416573867739413},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"182":{"tf":2.0},"70":{"tf":1.0},"96":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":25,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"140":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"167":{"tf":1.0},"223":{"tf":1.0},"33":{"tf":2.0},"338":{"tf":1.0},"339":{"tf":1.0},"34":{"tf":1.7320508075688772},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"`":{"df":1,"docs":{"191":{"tf":1.0}}},"df":89,"docs":{"101":{"tf":2.23606797749979},"119":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"137":{"tf":1.0},"138":{"tf":2.0},"139":{"tf":2.23606797749979},"140":{"tf":2.8284271247461903},"141":{"tf":4.242640687119285},"142":{"tf":2.8284271247461903},"144":{"tf":1.0},"145":{"tf":2.449489742783178},"147":{"tf":1.0},"149":{"tf":1.0},"160":{"tf":1.7320508075688772},"161":{"tf":1.4142135623730951},"169":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":3.0},"180":{"tf":4.242640687119285},"181":{"tf":3.1622776601683795},"182":{"tf":4.242640687119285},"183":{"tf":1.0},"186":{"tf":1.7320508075688772},"188":{"tf":3.0},"189":{"tf":1.7320508075688772},"190":{"tf":1.0},"191":{"tf":1.7320508075688772},"194":{"tf":1.0},"196":{"tf":1.0},"201":{"tf":1.7320508075688772},"202":{"tf":1.0},"203":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"221":{"tf":1.0},"222":{"tf":2.449489742783178},"223":{"tf":2.0},"224":{"tf":3.0},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.7416573867739413},"240":{"tf":2.449489742783178},"242":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":4.123105625617661},"250":{"tf":2.6457513110645907},"252":{"tf":1.0},"270":{"tf":1.4142135623730951},"281":{"tf":2.6457513110645907},"283":{"tf":1.7320508075688772},"289":{"tf":1.0},"301":{"tf":1.0},"316":{"tf":1.0},"325":{"tf":1.4142135623730951},"335":{"tf":2.449489742783178},"338":{"tf":1.4142135623730951},"339":{"tf":1.4142135623730951},"34":{"tf":2.23606797749979},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":2.23606797749979},"360":{"tf":1.4142135623730951},"376":{"tf":3.1622776601683795},"377":{"tf":1.4142135623730951},"380":{"tf":1.0},"391":{"tf":1.0},"398":{"tf":1.0},"42":{"tf":2.23606797749979},"45":{"tf":1.0},"52":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":2.449489742783178},"70":{"tf":3.7416573867739413},"71":{"tf":1.0},"72":{"tf":2.23606797749979},"73":{"tf":3.605551275463989},"74":{"tf":1.0},"75":{"tf":3.0},"77":{"tf":3.605551275463989},"78":{"tf":4.898979485566356},"82":{"tf":3.1622776601683795},"83":{"tf":2.0},"84":{"tf":2.449489742783178},"87":{"tf":1.4142135623730951},"91":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"391":{"tf":1.7320508075688772}}},"y":{"!":{"(":{"#":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"142":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"m":{"d":{"df":1,"docs":{"138":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"这":{"df":0,"docs":{},"就":{"df":0,"docs":{},"非":{"df":0,"docs":{},"常":{"df":0,"docs":{},"清":{"df":0,"docs":{},"楚":{"df":0,"docs":{},"地":{"df":0,"docs":{},"表":{"df":0,"docs":{},"明":{"df":0,"docs":{},",":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"74":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},",":{"df":0,"docs":{},"这":{"df":0,"docs":{},"可":{"df":0,"docs":{},"不":{"df":0,"docs":{},"对":{"df":0,"docs":{},"!":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"75":{"tf":1.0}}}}}}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"286":{"tf":1.0},"294":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":2.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"252":{"tf":1.0}}}}}}}}},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"391":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"416":{"tf":1.0}}}}}},"df":77,"docs":{"101":{"tf":3.0},"113":{"tf":1.0},"119":{"tf":1.0},"167":{"tf":1.0},"173":{"tf":1.7320508075688772},"175":{"tf":1.7320508075688772},"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.4142135623730951},"182":{"tf":2.0},"183":{"tf":1.0},"190":{"tf":1.0},"192":{"tf":1.4142135623730951},"199":{"tf":2.0},"202":{"tf":2.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.7320508075688772},"289":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"324":{"tf":1.0},"331":{"tf":1.4142135623730951},"334":{"tf":1.7320508075688772},"335":{"tf":2.0},"338":{"tf":1.4142135623730951},"339":{"tf":1.4142135623730951},"340":{"tf":1.4142135623730951},"341":{"tf":1.7320508075688772},"342":{"tf":3.4641016151377544},"343":{"tf":2.449489742783178},"353":{"tf":1.0},"359":{"tf":2.0},"360":{"tf":1.0},"371":{"tf":1.0},"374":{"tf":1.0},"375":{"tf":1.7320508075688772},"376":{"tf":2.449489742783178},"377":{"tf":1.4142135623730951},"378":{"tf":1.0},"391":{"tf":2.23606797749979},"405":{"tf":4.898979485566356},"407":{"tf":3.0},"408":{"tf":2.449489742783178},"412":{"tf":1.0},"417":{"tf":1.7320508075688772},"80":{"tf":1.0},"81":{"tf":1.4142135623730951},"82":{"tf":2.23606797749979},"83":{"tf":1.0},"84":{"tf":1.7320508075688772},"85":{"tf":2.0},"86":{"tf":1.7320508075688772},"87":{"tf":2.23606797749979},"90":{"tf":1.0},"91":{"tf":1.7320508075688772},"93":{"tf":1.4142135623730951},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":3,"docs":{"81":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"81":{"tf":1.0}}}},",":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"137":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"。":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":0,"docs":{},"当":{"a":{"d":{"d":{"df":0,"docs":{},"函":{"df":0,"docs":{},"数":{"df":0,"docs":{},"被":{"df":0,"docs":{},"调":{"df":0,"docs":{},"用":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},",":{"df":0,"docs":{},"它":{"df":0,"docs":{},"通":{"df":0,"docs":{},"常":{"df":0,"docs":{},"以":{"df":0,"docs":{},"被":{"df":0,"docs":{},"借":{"df":0,"docs":{},"用":{"df":0,"docs":{},"的":{"df":0,"docs":{},"形":{"df":0,"docs":{},"式":{"df":0,"docs":{},"出":{"df":0,"docs":{},"现":{"df":0,"docs":{},",":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"429":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":2,"docs":{"137":{"tf":1.0},"283":{"tf":2.0}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"289":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"247":{"tf":2.449489742783178}}}}}},"u":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":2,"docs":{"368":{"tf":1.0},"416":{"tf":1.0}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"86":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"202":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"h":{"df":2,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{":":{":":{"<":{"df":0,"docs":{},"i":{"6":{"4":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"102":{"tf":1.4142135623730951},"245":{"tf":2.23606797749979},"53":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"178":{"tf":1.7320508075688772},"179":{"tf":1.4142135623730951},"180":{"tf":3.0},"181":{"tf":2.0},"332":{"tf":1.7320508075688772}},"i":{"df":6,"docs":{"178":{"tf":2.0},"179":{"tf":3.1622776601683795},"180":{"tf":3.872983346207417},"181":{"tf":3.7416573867739413},"182":{"tf":3.3166247903554},"332":{"tf":1.7320508075688772}},"z":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":5,"docs":{"178":{"tf":1.4142135623730951},"179":{"tf":1.7320508075688772},"180":{"tf":2.0},"181":{"tf":1.7320508075688772},"182":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"180":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"180":{"tf":2.23606797749979}},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{">":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"1":{"df":1,"docs":{"181":{"tf":1.0}}},"df":1,"docs":{"181":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"119":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"*":{";":{"df":0,"docs":{},"。":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"417":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":22,"docs":{"118":{"tf":2.449489742783178},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.7320508075688772},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"266":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"412":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"366":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.0}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"a":{"df":1,"docs":{"431":{"tf":1.0}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"182":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"120":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"391":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":6,"docs":{"296":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":1.7320508075688772},"310":{"tf":3.1622776601683795},"311":{"tf":2.23606797749979},"370":{"tf":2.23606797749979}}},"df":1,"docs":{"391":{"tf":2.8284271247461903}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"381":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"d":{"df":5,"docs":{"171":{"tf":1.0},"184":{"tf":1.0},"315":{"tf":1.0},"354":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}}},"df":6,"docs":{"191":{"tf":1.0},"376":{"tf":1.0},"391":{"tf":1.4142135623730951},"69":{"tf":1.0},"84":{"tf":1.0},"93":{"tf":1.0}},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"超":{"df":0,"docs":{},"(":{"df":0,"docs":{},"父":{"df":0,"docs":{},")":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"364":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"102":{"tf":1.4142135623730951},"110":{"tf":1.0}},",":{"df":0,"docs":{},"v":{"c":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"t":{">":{"(":{"df":0,"docs":{},"f":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}},":":{":":{".":{".":{".":{"df":0,"docs":{},",":{"<":{"[":{"df":0,"docs":{},"t":{"df":1,"docs":{"417":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"]":{">":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":1,"docs":{"23":{"tf":1.0}},"l":{"df":1,"docs":{"151":{"tf":1.0}}}},"c":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"431":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"293":{"tf":1.7320508075688772},"58":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":5,"docs":{"299":{"tf":1.4142135623730951},"341":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":2.0},"408":{"tf":1.4142135623730951}},"s":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"(":{"a":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"72":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"2":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"72":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"f":{"df":1,"docs":{"381":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"(":{"df":1,"docs":{"71":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"71":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"71":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"df":4,"docs":{"231":{"tf":1.4142135623730951},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"df":59,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.4142135623730951},"261":{"tf":1.0},"266":{"tf":2.23606797749979},"267":{"tf":1.0},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}},"/":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"/":{"a":{"d":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"61":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":3,"docs":{"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"/":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.4142135623730951}}}}},"df":6,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"211":{"tf":1.0}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"202":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"211":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":3,"docs":{"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"157":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":6,"docs":{"32":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"405":{"tf":1.0},"408":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"246":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":1.7320508075688772}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"216":{"tf":2.23606797749979},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.0}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"350":{"tf":1.0},"353":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":3,"docs":{"242":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"239":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"49":{"tf":1.0},"51":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"27":{"tf":1.0},"28":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"c":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"28":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"\\":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"\\":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"265":{"tf":2.449489742783178},"266":{"tf":1.0},"280":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951}}}}}},"s":{"df":0,"docs":{},"k":{"df":2,"docs":{"315":{"tf":1.0},"318":{"tf":6.4031242374328485}}}}},"c":{"df":0,"docs":{},"p":{"df":4,"docs":{"395":{"tf":1.4142135623730951},"396":{"tf":2.23606797749979},"397":{"tf":2.23606797749979},"398":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"397":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"\"":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{":":{"7":{"8":{"7":{"8":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":9,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":9,"docs":{"397":{"tf":1.4142135623730951},"398":{"tf":1.7320508075688772},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":2.0},"402":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}}},"df":0,"docs":{}}}}}}},"d":{"d":{"df":3,"docs":{"227":{"tf":1.4142135623730951},"228":{"tf":1.0},"231":{"tf":1.0}}},"df":0,"docs":{}},"df":30,"docs":{"102":{"tf":2.8284271247461903},"105":{"tf":1.0},"157":{"tf":1.7320508075688772},"160":{"tf":1.0},"172":{"tf":4.0},"173":{"tf":3.3166247903554},"174":{"tf":2.449489742783178},"175":{"tf":3.4641016151377544},"181":{"tf":2.8284271247461903},"183":{"tf":2.449489742783178},"194":{"tf":2.23606797749979},"232":{"tf":1.0},"239":{"tf":2.0},"242":{"tf":2.449489742783178},"279":{"tf":2.0},"280":{"tf":1.7320508075688772},"281":{"tf":2.449489742783178},"282":{"tf":2.8284271247461903},"289":{"tf":4.58257569495584},"290":{"tf":2.6457513110645907},"310":{"tf":1.4142135623730951},"334":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"382":{"tf":1.7320508075688772},"383":{"tf":3.0},"405":{"tf":2.6457513110645907},"417":{"tf":2.6457513110645907},"424":{"tf":1.0},"53":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"148":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"218":{"tf":2.0},"225":{"tf":1.4142135623730951},"232":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"$":{"df":0,"docs":{},"x":{"df":1,"docs":{"389":{"tf":1.0}}}},"1":{"df":1,"docs":{"389":{"tf":1.0}}},"2":{"df":1,"docs":{"389":{"tf":1.0}}},"3":{"df":1,"docs":{"389":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"389":{"tf":2.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":42,"docs":{"126":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":6.708203932499369},"199":{"tf":5.830951894845301},"200":{"tf":4.358898943540674},"201":{"tf":4.242640687119285},"202":{"tf":5.477225575051661},"203":{"tf":1.7320508075688772},"204":{"tf":2.6457513110645907},"205":{"tf":2.0},"206":{"tf":4.358898943540674},"207":{"tf":5.385164807134504},"208":{"tf":5.0990195135927845},"209":{"tf":1.7320508075688772},"210":{"tf":3.3166247903554},"211":{"tf":7.483314773547883},"217":{"tf":2.0},"227":{"tf":1.4142135623730951},"228":{"tf":3.3166247903554},"229":{"tf":4.242640687119285},"231":{"tf":1.7320508075688772},"232":{"tf":4.795831523312719},"244":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"249":{"tf":3.0},"250":{"tf":2.23606797749979},"252":{"tf":1.4142135623730951},"257":{"tf":2.6457513110645907},"266":{"tf":4.898979485566356},"289":{"tf":2.6457513110645907},"290":{"tf":2.8284271247461903},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"197":{"tf":1.0},"204":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":2.23606797749979}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":3.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"o":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"198":{"tf":2.23606797749979}}}}}}},"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"208":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"198":{"tf":1.4142135623730951}}}}}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"_":{"1":{"0":{"0":{"df":1,"docs":{"202":{"tf":2.8284271247461903}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"201":{"tf":2.8284271247461903}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}}},"t":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"200":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"7":{"5":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"198":{"tf":1.0},"208":{"tf":1.0},"266":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"207":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"228":{"tf":2.0},"229":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"206":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"206":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"136":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{"?":{".":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}}},":":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":11,"docs":{"150":{"tf":1.4142135623730951},"162":{"tf":2.23606797749979},"218":{"tf":1.0},"225":{"tf":1.0},"316":{"tf":2.23606797749979},"339":{"tf":1.4142135623730951},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"359":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"334":{"tf":1.0},"335":{"tf":1.4142135623730951}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"此":{"df":0,"docs":{},"之":{"df":0,"docs":{},"上":{"df":0,"docs":{},",":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"333":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"'":{"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}},"df":0,"docs":{}}},"y":{"'":{"d":{"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"134":{"tf":2.8284271247461903},"360":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"206":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"206":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"407":{"tf":1.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"405":{"tf":3.1622776601683795},"407":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"1":{"df":1,"docs":{"298":{"tf":2.449489742783178}}},"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"(":{"1":{"df":2,"docs":{"302":{"tf":1.0},"303":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"240":{"tf":1.0}}},"5":{"df":3,"docs":{"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"298":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"318":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":10,"docs":{"241":{"tf":1.0},"299":{"tf":2.0},"300":{"tf":1.4142135623730951},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.4142135623730951},"306":{"tf":2.6457513110645907},"405":{"tf":1.4142135623730951},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"df":6,"docs":{"298":{"tf":2.449489742783178},"299":{"tf":2.8284271247461903},"300":{"tf":1.0},"316":{"tf":1.0},"318":{"tf":1.0},"405":{"tf":4.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":29,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"228":{"tf":1.0},"241":{"tf":1.0},"290":{"tf":1.0},"297":{"tf":1.0},"298":{"tf":6.4031242374328485},"299":{"tf":2.449489742783178},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":1.7320508075688772},"404":{"tf":1.0},"405":{"tf":7.0},"406":{"tf":1.0},"407":{"tf":5.0990195135927845},"408":{"tf":4.123105625617661},"43":{"tf":1.0},"54":{"tf":1.0}},"e":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"396":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"4":{"df":2,"docs":{"405":{"tf":2.0},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"405":{"tf":2.6457513110645907}}}}}},"df":0,"docs":{}},"df":4,"docs":{"405":{"tf":9.797958971132712},"406":{"tf":1.4142135623730951},"407":{"tf":5.0},"408":{"tf":5.385164807134504}}}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"297":{"tf":1.0}}},"df":0,"docs":{}}},"=":{"1":{"df":1,"docs":{"205":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"50":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":7,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772},"61":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"120":{"tf":1.0},"358":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"381":{"tf":2.8284271247461903}}}}}},"i":{"c":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"f":{"3":{"2":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"320":{"tf":1.7320508075688772},"322":{"tf":2.0},"323":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":6,"docs":{"102":{"tf":1.0},"24":{"tf":1.0},"322":{"tf":1.4142135623730951},"368":{"tf":1.0},"386":{"tf":1.0},"74":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}}}},"<":{"df":0,"docs":{},"f":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}},"df":1,"docs":{"323":{"tf":2.6457513110645907}}}}},"r":{"df":1,"docs":{"323":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"316":{"tf":4.123105625617661}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}},">":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"!":{"<":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"1":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"2":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"1":{".":{"2":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"232":{"tf":2.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":5,"docs":{"140":{"tf":2.0},"183":{"tf":1.0},"240":{"tf":1.0},"377":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"422":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":2.449489742783178}}}}},"d":{"a":{"df":0,"docs":{},"y":{"df":6,"docs":{"162":{"tf":1.0},"194":{"tf":1.0},"240":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"343":{"tf":2.0},"59":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"o":{"df":3,"docs":{"106":{"tf":1.0},"316":{"tf":1.4142135623730951},"353":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"141":{"tf":1.0}},"”":{"df":0,"docs":{},"。":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"259":{"tf":2.449489742783178},"261":{"tf":1.0},"387":{"tf":1.0},"390":{"tf":1.0},"393":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"390":{"tf":2.449489742783178},"391":{"tf":3.7416573867739413},"392":{"tf":2.0},"393":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}},"m":{"'":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"26":{"tf":1.0}}}},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"436":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"425":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"183":{"tf":1.7320508075688772},"385":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"245":{"tf":1.0},"331":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"434":{"tf":2.0}}},"t":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},">":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"(":{"df":0,"docs":{},"r":{"c":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"383":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":111,"docs":{"10":{"tf":1.4142135623730951},"102":{"tf":1.4142135623730951},"124":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"142":{"tf":1.7320508075688772},"149":{"tf":1.0},"151":{"tf":1.4142135623730951},"161":{"tf":1.0},"162":{"tf":2.449489742783178},"169":{"tf":1.7320508075688772},"172":{"tf":2.0},"177":{"tf":2.23606797749979},"178":{"tf":3.4641016151377544},"179":{"tf":4.58257569495584},"180":{"tf":3.7416573867739413},"181":{"tf":5.291502622129181},"182":{"tf":3.1622776601683795},"183":{"tf":4.123105625617661},"194":{"tf":2.0},"195":{"tf":2.23606797749979},"200":{"tf":2.449489742783178},"213":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"242":{"tf":3.7416573867739413},"244":{"tf":2.449489742783178},"245":{"tf":1.7320508075688772},"246":{"tf":1.4142135623730951},"249":{"tf":2.6457513110645907},"270":{"tf":1.7320508075688772},"271":{"tf":2.0},"275":{"tf":2.0},"276":{"tf":2.0},"277":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":2.8284271247461903},"281":{"tf":1.7320508075688772},"282":{"tf":1.7320508075688772},"283":{"tf":3.7416573867739413},"285":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":3.1622776601683795},"290":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":2.0},"307":{"tf":1.0},"308":{"tf":1.4142135623730951},"309":{"tf":1.7320508075688772},"310":{"tf":1.0},"311":{"tf":1.4142135623730951},"315":{"tf":2.23606797749979},"316":{"tf":2.23606797749979},"320":{"tf":3.7416573867739413},"324":{"tf":3.3166247903554},"326":{"tf":1.0},"332":{"tf":2.6457513110645907},"333":{"tf":1.4142135623730951},"334":{"tf":5.830951894845301},"335":{"tf":4.58257569495584},"336":{"tf":2.23606797749979},"337":{"tf":1.0},"338":{"tf":2.449489742783178},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":2.0},"342":{"tf":3.1622776601683795},"343":{"tf":2.23606797749979},"344":{"tf":1.0},"360":{"tf":1.0},"364":{"tf":1.4142135623730951},"366":{"tf":1.0},"370":{"tf":3.3166247903554},"373":{"tf":1.4142135623730951},"374":{"tf":4.795831523312719},"375":{"tf":4.0},"376":{"tf":6.324555320336759},"377":{"tf":5.744562646538029},"378":{"tf":3.1622776601683795},"379":{"tf":1.0},"381":{"tf":2.23606797749979},"383":{"tf":3.605551275463989},"385":{"tf":2.8284271247461903},"386":{"tf":3.0},"388":{"tf":1.7320508075688772},"391":{"tf":4.123105625617661},"398":{"tf":1.7320508075688772},"405":{"tf":2.6457513110645907},"406":{"tf":1.0},"407":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":2.0},"412":{"tf":2.8284271247461903},"416":{"tf":2.0},"417":{"tf":2.6457513110645907},"418":{"tf":4.0},"419":{"tf":1.7320508075688772},"420":{"tf":2.0},"421":{"tf":2.23606797749979},"422":{"tf":2.23606797749979},"423":{"tf":1.0},"424":{"tf":1.4142135623730951},"70":{"tf":3.0},"84":{"tf":1.0},"86":{"tf":1.4142135623730951},"91":{"tf":2.8284271247461903},"92":{"tf":1.0},"97":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":3,"docs":{"177":{"tf":1.0},"373":{"tf":1.0},"418":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"270":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"此":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"!":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"386":{"tf":1.0}}}}}}},"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"、":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"306":{"tf":1.0}}}}},",":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"179":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"281":{"tf":1.4142135623730951},"376":{"tf":1.0},"91":{"tf":1.0}}}}}}},":":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"181":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"、":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.0}}}}}}}}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"396":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"431":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"396":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"300":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"114":{"tf":1.0},"391":{"tf":1.4142135623730951}}}},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"100":{"tf":1.0}}}}}},"df":50,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.4142135623730951},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.7320508075688772},"413":{"tf":1.0},"414":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}},"m":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"54":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"319":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"325":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"323":{"tf":1.0}},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.23606797749979}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"!":{"(":{"a":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"318":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"3":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"319":{"tf":1.0}}},"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"320":{"tf":1.0}},"l":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"318":{"tf":2.449489742783178},"319":{"tf":2.449489742783178},"320":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"(":{"a":{"df":1,"docs":{"322":{"tf":1.7320508075688772}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"1":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":3,"docs":{"316":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"324":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"n":{"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":9,"docs":{"316":{"tf":1.4142135623730951},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":3,"docs":{"316":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951},"319":{"tf":1.7320508075688772}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"1":{"0":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"318":{"tf":2.449489742783178},"319":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"(":{"1":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":4,"docs":{"318":{"tf":1.0},"319":{"tf":1.0},"322":{"tf":2.8284271247461903},"323":{"tf":1.4142135623730951}}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"318":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"318":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"{":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":9,"docs":{"316":{"tf":3.7416573867739413},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":17,"docs":{"199":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"320":{"tf":1.0},"361":{"tf":1.0},"391":{"tf":1.0},"412":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"61":{"tf":2.8284271247461903},"62":{"tf":1.7320508075688772},"70":{"tf":1.0},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.4142135623730951}},",":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.7320508075688772},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951}}}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"300":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"54":{"tf":2.449489742783178}},"l":{"df":3,"docs":{"351":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"85":{"tf":1.0}},"e":{"df":0,"docs":{},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"数":{"df":0,"docs":{},"组":{"df":0,"docs":{},"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"417":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"179":{"tf":1.0},"180":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":5,"docs":{"178":{"tf":1.4142135623730951},"179":{"tf":3.605551275463989},"180":{"tf":3.605551275463989},"181":{"tf":2.0},"182":{"tf":3.0}}}},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"63":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"49":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"o":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"203":{"tf":1.0},"258":{"tf":1.4142135623730951},"320":{"tf":1.0},"357":{"tf":1.4142135623730951},"368":{"tf":1.0}},"’":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}}},"x":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":7,"docs":{"300":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"349":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"301":{"tf":1.0},"319":{"tf":1.0}}},"df":0,"docs":{}}}}},"1":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"319":{"tf":1.0},"320":{"tf":2.6457513110645907}}}}}},"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":2.449489742783178}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"319":{"tf":2.0},"320":{"tf":3.1622776601683795}}}}}},"df":8,"docs":{"300":{"tf":2.8284271247461903},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":4.242640687119285},"320":{"tf":2.449489742783178},"325":{"tf":1.0},"349":{"tf":1.0}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"417":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":51,"docs":{"102":{"tf":1.4142135623730951},"106":{"tf":1.0},"125":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.7320508075688772},"173":{"tf":1.0},"183":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.7320508075688772},"242":{"tf":1.0},"244":{"tf":1.7320508075688772},"273":{"tf":1.4142135623730951},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"335":{"tf":1.0},"351":{"tf":1.4142135623730951},"353":{"tf":1.0},"374":{"tf":1.7320508075688772},"375":{"tf":2.0},"376":{"tf":1.4142135623730951},"381":{"tf":2.6457513110645907},"382":{"tf":2.23606797749979},"383":{"tf":1.0},"386":{"tf":1.4142135623730951},"405":{"tf":2.6457513110645907},"407":{"tf":2.6457513110645907},"408":{"tf":1.7320508075688772},"412":{"tf":1.4142135623730951},"416":{"tf":3.3166247903554},"417":{"tf":3.0},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":2.449489742783178},"53":{"tf":1.4142135623730951},"54":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"75":{"tf":1.4142135623730951}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"413":{"tf":1.0}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"379":{"tf":1.0},"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"i":{"c":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}}}},"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"310":{"tf":1.0}}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"175":{"tf":1.0}}}}}},"x":{"df":1,"docs":{"175":{"tf":1.0}}},"因":{"df":0,"docs":{},"为":{"df":0,"docs":{},"传":{"df":0,"docs":{},"统":{"df":0,"docs":{},"上":{"df":0,"docs":{},"来":{"df":0,"docs":{},"说":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}}}}}}},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"希":{"df":0,"docs":{},"望":{"df":0,"docs":{},"其":{"df":0,"docs":{},"可":{"df":0,"docs":{},"以":{"df":0,"docs":{},"存":{"df":0,"docs":{},"放":{"df":0,"docs":{},"任":{"df":0,"docs":{},"何":{"df":0,"docs":{},"类":{"df":0,"docs":{},"型":{"df":0,"docs":{},"的":{"df":0,"docs":{},"值":{"df":0,"docs":{},"。":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}},"u":{"+":{"0":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"53":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"2":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"3":{"2":{"df":30,"docs":{"125":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"199":{"tf":2.8284271247461903},"240":{"tf":2.8284271247461903},"242":{"tf":2.449489742783178},"247":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":2.449489742783178},"369":{"tf":1.4142135623730951},"374":{"tf":2.0},"380":{"tf":1.4142135623730951},"382":{"tf":2.0},"385":{"tf":1.0},"42":{"tf":2.8284271247461903},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"50":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"70":{"tf":1.0},"88":{"tf":2.449489742783178},"89":{"tf":1.7320508075688772},"90":{"tf":2.0},"91":{"tf":2.449489742783178},"93":{"tf":2.23606797749979},"95":{"tf":1.7320508075688772},"96":{"tf":1.7320508075688772},"97":{"tf":1.7320508075688772}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},";":{"6":{"4":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"6":{"4":{"df":6,"docs":{"322":{"tf":2.0},"53":{"tf":1.0},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":10,"docs":{"101":{"tf":2.0},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"107":{"tf":1.4142135623730951},"142":{"tf":1.0},"381":{"tf":2.449489742783178},"399":{"tf":1.0},"417":{"tf":1.0},"53":{"tf":2.0},"54":{"tf":1.4142135623730951}}},">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.0}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"df":6,"docs":{"173":{"tf":2.0},"181":{"tf":2.449489742783178},"232":{"tf":1.0},"282":{"tf":2.23606797749979},"417":{"tf":1.4142135623730951},"53":{"tf":1.0}},"i":{"df":1,"docs":{"313":{"tf":1.0}}},"n":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"386":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"293":{"tf":1.0}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"75":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"120":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"156":{"tf":1.0},"368":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"64":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":1,"docs":{"263":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"d":{"df":5,"docs":{"142":{"tf":1.7320508075688772},"144":{"tf":1.4142135623730951},"216":{"tf":1.7320508075688772},"232":{"tf":1.4142135623730951},"53":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"398":{"tf":1.4142135623730951}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"181":{"tf":1.0},"258":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"366":{"tf":1.0},"371":{"tf":1.0},"412":{"tf":1.7320508075688772}}}},"t":{"_":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"56":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":5,"docs":{"209":{"tf":1.0},"225":{"tf":1.4142135623730951},"391":{"tf":1.0},"54":{"tf":1.0},"86":{"tf":1.7320508075688772}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":14,"docs":{"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"266":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"246":{"tf":1.0},"75":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"405":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"57":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":58,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":2.23606797749979},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":3.3166247903554}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"153":{"tf":1.0},"154":{"tf":1.0}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}},"s":{"a":{"df":0,"docs":{},"f":{"df":11,"docs":{"257":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"365":{"tf":1.4142135623730951},"366":{"tf":3.1622776601683795},"367":{"tf":2.0},"368":{"tf":5.291502622129181},"369":{"tf":1.7320508075688772},"370":{"tf":2.8284271247461903},"371":{"tf":1.0},"372":{"tf":2.0},"412":{"tf":1.0}},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"370":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"383":{"tf":1.0},"413":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"435":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":6,"docs":{"120":{"tf":1.0},"225":{"tf":1.0},"246":{"tf":1.0},"266":{"tf":1.0},"36":{"tf":1.0},"427":{"tf":1.0}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"155":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"382":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":5,"docs":{"158":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"239":{"tf":2.6457513110645907},"242":{"tf":2.8284271247461903}},"e":{"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"242":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"<":{"df":0,"docs":{},"f":{">":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"148":{"tf":1.0}}}}},"df":20,"docs":{"159":{"tf":3.0},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"224":{"tf":1.0},"225":{"tf":1.0},"241":{"tf":1.0},"300":{"tf":1.0},"306":{"tf":1.0},"318":{"tf":1.0},"342":{"tf":1.0},"349":{"tf":1.0},"382":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"401":{"tf":1.7320508075688772},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"408":{"tf":1.0}},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"263":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":8,"docs":{"18":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"263":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"40":{"tf":2.449489742783178},"84":{"tf":1.0}},"e":{"_":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951},"330":{"tf":1.0},"376":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":2,"docs":{"294":{"tf":1.7320508075688772},"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":2,"docs":{"260":{"tf":1.0},"261":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"398":{"tf":2.6457513110645907}}},"l":{"df":2,"docs":{"316":{"tf":4.358898943540674},"398":{"tf":1.7320508075688772}}}},"s":{",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{";":{"df":0,"docs":{},"q":{"=":{"0":{".":{"5":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"a":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}},"df":141,"docs":{"102":{"tf":1.0},"110":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.7320508075688772},"119":{"tf":1.4142135623730951},"120":{"tf":4.358898943540674},"121":{"tf":3.7416573867739413},"122":{"tf":2.0},"123":{"tf":3.1622776601683795},"124":{"tf":2.449489742783178},"125":{"tf":4.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772},"157":{"tf":1.4142135623730951},"158":{"tf":2.0},"159":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"161":{"tf":2.449489742783178},"162":{"tf":2.23606797749979},"165":{"tf":1.0},"167":{"tf":1.7320508075688772},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"183":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"194":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":2.0},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.7320508075688772},"211":{"tf":1.7320508075688772},"215":{"tf":1.7320508075688772},"217":{"tf":1.0},"218":{"tf":1.7320508075688772},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.8284271247461903},"225":{"tf":3.7416573867739413},"226":{"tf":2.6457513110645907},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.605551275463989},"235":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"246":{"tf":1.4142135623730951},"247":{"tf":1.0},"249":{"tf":4.242640687119285},"250":{"tf":2.6457513110645907},"252":{"tf":1.4142135623730951},"258":{"tf":4.58257569495584},"266":{"tf":2.6457513110645907},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"285":{"tf":2.449489742783178},"286":{"tf":1.4142135623730951},"289":{"tf":3.0},"290":{"tf":2.0},"291":{"tf":1.7320508075688772},"293":{"tf":2.449489742783178},"294":{"tf":3.1622776601683795},"298":{"tf":2.449489742783178},"299":{"tf":2.8284271247461903},"300":{"tf":2.23606797749979},"301":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"303":{"tf":1.7320508075688772},"306":{"tf":3.1622776601683795},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.0},"320":{"tf":3.4641016151377544},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":2.0},"324":{"tf":3.0},"325":{"tf":1.0},"33":{"tf":2.23606797749979},"335":{"tf":2.0},"337":{"tf":1.0},"34":{"tf":1.0},"343":{"tf":1.4142135623730951},"348":{"tf":1.0},"35":{"tf":1.7320508075688772},"353":{"tf":1.0},"36":{"tf":1.7320508075688772},"360":{"tf":2.23606797749979},"368":{"tf":1.7320508075688772},"37":{"tf":1.0},"375":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":2.23606797749979},"378":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":2.0},"390":{"tf":1.0},"391":{"tf":2.6457513110645907},"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":3.872983346207417},"407":{"tf":2.23606797749979},"408":{"tf":2.6457513110645907},"41":{"tf":2.23606797749979},"412":{"tf":1.4142135623730951},"42":{"tf":2.8284271247461903},"425":{"tf":1.0},"427":{"tf":1.0},"428":{"tf":1.0},"43":{"tf":1.7320508075688772},"44":{"tf":1.7320508075688772},"45":{"tf":2.449489742783178},"54":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"91":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"353":{"tf":1.0}}}}}},"r":{"1":{".":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":4,"docs":{"82":{"tf":1.7320508075688772},"83":{"tf":1.0},"84":{"tf":3.7416573867739413},"87":{"tf":1.0}}},"2":{"df":1,"docs":{"84":{"tf":2.8284271247461903}}},"<":{"'":{"a":{"df":1,"docs":{"87":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"1":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"239":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":7,"docs":{"239":{"tf":2.0},"333":{"tf":1.0},"398":{"tf":1.4142135623730951},"82":{"tf":3.605551275463989},"83":{"tf":2.0},"84":{"tf":3.0},"87":{"tf":1.7320508075688772}},"n":{"a":{"df":0,"docs":{},"m":{"df":10,"docs":{"160":{"tf":2.0},"161":{"tf":2.449489742783178},"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":2.0},"82":{"tf":3.1622776601683795},"83":{"tf":2.23606797749979},"84":{"tf":2.8284271247461903},"87":{"tf":2.23606797749979}},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"160":{"tf":2.0},"161":{"tf":1.7320508075688772}},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"160":{"tf":1.0},"161":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"160":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"%":{"\\":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"21":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"s":{"/":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"z":{"df":22,"docs":{"142":{"tf":1.4142135623730951},"156":{"tf":1.0},"198":{"tf":3.0},"200":{"tf":2.0},"203":{"tf":1.7320508075688772},"207":{"tf":1.4142135623730951},"208":{"tf":1.7320508075688772},"210":{"tf":2.8284271247461903},"289":{"tf":3.4641016151377544},"290":{"tf":2.0},"368":{"tf":1.7320508075688772},"383":{"tf":1.0},"405":{"tf":5.5677643628300215},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"417":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.7320508075688772},"54":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.7320508075688772},"77":{"tf":2.8284271247461903}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.7320508075688772},"108":{"tf":1.7320508075688772}},"e":{":":{":":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"a":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"f":{"df":11,"docs":{"138":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"140":{"tf":1.0},"142":{"tf":2.0},"145":{"tf":1.4142135623730951},"152":{"tf":1.0},"270":{"tf":1.0},"34":{"tf":1.0},"398":{"tf":1.0},"53":{"tf":1.0},"78":{"tf":1.7320508075688772}}},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"257":{"tf":1.0},"258":{"tf":2.6457513110645907},"320":{"tf":1.7320508075688772}}}}}},"v":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"350":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"5":{"df":1,"docs":{"133":{"tf":1.0}}},"6":{"df":2,"docs":{"133":{"tf":1.0},"134":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"133":{"tf":1.0}}},"8":{"df":1,"docs":{"133":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"0":{".":{"1":{".":{"0":{"df":95,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":2.0},"242":{"tf":1.4142135623730951},"246":{"tf":1.0},"261":{"tf":2.0},"266":{"tf":2.6457513110645907},"27":{"tf":1.7320508075688772},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.7320508075688772},"285":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"32":{"tf":1.0},"335":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"38":{"tf":1.0},"386":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"407":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":2.449489742783178},"62":{"tf":1.7320508075688772},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"1":{"0":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"2":{"7":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"8":{"6":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"2":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"5":{"df":3,"docs":{"266":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"42":{"tf":1.0}}},"6":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{".":{"0":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"x":{"df":1,"docs":{"246":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0}}}}}}},"3":{".":{"0":{".":{"0":{"df":1,"docs":{"267":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"245":{"tf":1.0}}}}}},"df":3,"docs":{"243":{"tf":2.23606797749979},"244":{"tf":2.23606797749979},"245":{"tf":1.4142135623730951}}}}}}},"df":4,"docs":{"243":{"tf":1.7320508075688772},"244":{"tf":1.4142135623730951},"245":{"tf":1.0},"246":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"246":{"tf":1.0}}},"4":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"v":{"4":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.0}}}}}}}},"u":{"8":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":2.449489742783178}}},"6":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"v":{"6":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}}}}}},"df":2,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":2.6457513110645907}}},"[":{"0":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}},"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"134":{"tf":1.0}}},"9":{"9":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":9,"docs":{"243":{"tf":1.4142135623730951},"300":{"tf":1.4142135623730951},"301":{"tf":3.0},"302":{"tf":1.7320508075688772},"303":{"tf":2.449489742783178},"319":{"tf":4.123105625617661},"320":{"tf":6.082762530298219},"349":{"tf":1.0},"382":{"tf":1.4142135623730951}},"i":{"d":{"df":1,"docs":{"165":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":55,"docs":{"106":{"tf":1.0},"148":{"tf":1.4142135623730951},"159":{"tf":1.0},"167":{"tf":4.242640687119285},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":5.916079783099616},"206":{"tf":2.8284271247461903},"224":{"tf":1.0},"225":{"tf":1.0},"228":{"tf":1.0},"242":{"tf":3.1622776601683795},"246":{"tf":1.0},"260":{"tf":1.0},"285":{"tf":1.7320508075688772},"289":{"tf":3.872983346207417},"290":{"tf":2.0},"291":{"tf":3.7416573867739413},"293":{"tf":1.7320508075688772},"294":{"tf":4.58257569495584},"299":{"tf":2.0},"301":{"tf":1.7320508075688772},"306":{"tf":2.0},"318":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":3.1622776601683795},"324":{"tf":3.3166247903554},"331":{"tf":1.0},"347":{"tf":1.0},"350":{"tf":1.4142135623730951},"353":{"tf":1.0},"359":{"tf":1.0},"36":{"tf":1.0},"360":{"tf":1.4142135623730951},"368":{"tf":2.449489742783178},"382":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"428":{"tf":1.0},"49":{"tf":2.6457513110645907},"51":{"tf":2.23606797749979},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"56":{"tf":2.23606797749979},"57":{"tf":1.4142135623730951},"58":{"tf":2.449489742783178},"61":{"tf":1.7320508075688772},"62":{"tf":2.6457513110645907},"70":{"tf":2.0},"75":{"tf":2.449489742783178},"82":{"tf":1.4142135623730951}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"167":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"385":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"350":{"tf":1.0}}}}},"df":0,"docs":{}}}}},".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"df":1,"docs":{"103":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"a":{")":{")":{"df":0,"docs":{},",":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}}},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"[":{".":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"}":{"df":0,"docs":{},"{":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"56":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"r":{"df":2,"docs":{"232":{"tf":1.0},"416":{"tf":3.3166247903554}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":24,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"242":{"tf":1.4142135623730951},"290":{"tf":1.0},"299":{"tf":1.7320508075688772},"34":{"tf":1.0},"369":{"tf":1.0},"427":{"tf":1.0},"43":{"tf":1.0},"49":{"tf":3.3166247903554},"51":{"tf":2.0},"54":{"tf":1.0},"75":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"416":{"tf":1.0}}}},"df":6,"docs":{"100":{"tf":1.0},"225":{"tf":1.0},"353":{"tf":1.4142135623730951},"359":{"tf":1.0},"36":{"tf":1.4142135623730951},"99":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":1,"docs":{"26":{"tf":1.7320508075688772}},"s":{"=":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":17,"docs":{"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":2.0},"135":{"tf":2.0},"137":{"tf":1.7320508075688772},"146":{"tf":1.7320508075688772},"150":{"tf":1.0},"156":{"tf":1.0},"169":{"tf":1.0},"240":{"tf":1.0},"299":{"tf":5.477225575051661},"350":{"tf":1.0},"359":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"389":{"tf":1.0},"420":{"tf":1.4142135623730951},"423":{"tf":1.0}},"e":{"c":{"!":{"[":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}},"'":{"a":{"df":1,"docs":{"350":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":1,"docs":{"172":{"tf":1.4142135623730951}}}},"1":{"0":{"0":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":13,"docs":{"132":{"tf":1.0},"134":{"tf":1.7320508075688772},"137":{"tf":1.0},"156":{"tf":1.0},"241":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.4142135623730951},"299":{"tf":2.0},"368":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951},"389":{"tf":1.7320508075688772}}},"2":{"df":1,"docs":{"246":{"tf":1.0}}},"3":{"4":{"df":2,"docs":{"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"239":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{")":{";":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":9,"docs":{"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951},"389":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"<":{"&":{"'":{"a":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"228":{"tf":1.0}}}}}},"_":{"df":4,"docs":{"246":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.0},"400":{"tf":1.0}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":3,"docs":{"320":{"tf":1.0},"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":5,"docs":{"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"246":{"tf":1.4142135623730951},"299":{"tf":1.0},"331":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"<":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"c":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"o":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"385":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":16,"docs":{"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0},"289":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"335":{"tf":1.4142135623730951},"378":{"tf":1.0},"385":{"tf":1.4142135623730951}}}}},"t":{"df":11,"docs":{"131":{"tf":1.0},"132":{"tf":1.7320508075688772},"134":{"tf":1.0},"140":{"tf":1.0},"169":{"tf":1.0},"179":{"tf":1.7320508075688772},"243":{"tf":1.0},"273":{"tf":1.0},"294":{"tf":1.0},"334":{"tf":1.0},"378":{"tf":2.8284271247461903}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"405":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"3":{"2":{"df":1,"docs":{"389":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":2,"docs":{"142":{"tf":1.0},"417":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"df":19,"docs":{"132":{"tf":1.4142135623730951},"136":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"247":{"tf":1.4142135623730951},"289":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":4.69041575982343},"323":{"tf":1.7320508075688772},"335":{"tf":1.4142135623730951},"388":{"tf":1.0},"389":{"tf":3.0}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":49,"docs":{"10":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.7320508075688772},"132":{"tf":2.6457513110645907},"133":{"tf":1.7320508075688772},"134":{"tf":4.0},"135":{"tf":3.0},"136":{"tf":3.3166247903554},"137":{"tf":2.23606797749979},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.0},"152":{"tf":1.4142135623730951},"156":{"tf":2.0},"213":{"tf":1.0},"215":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":2.0},"229":{"tf":2.0},"231":{"tf":1.0},"241":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"243":{"tf":2.0},"244":{"tf":1.4142135623730951},"246":{"tf":2.23606797749979},"247":{"tf":2.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"289":{"tf":2.23606797749979},"299":{"tf":2.8284271247461903},"302":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.7320508075688772},"335":{"tf":1.0},"368":{"tf":2.0},"385":{"tf":1.4142135623730951},"389":{"tf":2.0},"398":{"tf":1.4142135623730951},"401":{"tf":1.0},"405":{"tf":3.1622776601683795},"422":{"tf":1.0},"54":{"tf":2.449489742783178},"79":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"131":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"334":{"tf":1.0}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"113":{"tf":2.0}}}}},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"156":{"tf":1.0},"324":{"tf":1.0}}}}},"df":1,"docs":{"263":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"196":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"261":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"17":{"tf":1.0},"241":{"tf":1.4142135623730951},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"260":{"tf":1.0},"262":{"tf":1.0},"32":{"tf":1.0},"322":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"40":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"413":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"353":{"tf":1.0},"428":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"429":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"(":{"a":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"s":{"df":2,"docs":{"113":{"tf":1.0},"252":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"。":{"df":0,"docs":{},"接":{"df":0,"docs":{},"着":{"df":0,"docs":{},"当":{"df":0,"docs":{},"新":{"df":0,"docs":{},"建":{"df":0,"docs":{},"线":{"df":0,"docs":{},"程":{"df":0,"docs":{},"开":{"df":0,"docs":{},"始":{"df":0,"docs":{},"执":{"df":0,"docs":{},"行":{"df":0,"docs":{},",":{"df":0,"docs":{},"v":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}}}}}}}}},"然":{"df":0,"docs":{},"而":{"df":0,"docs":{},"这":{"df":0,"docs":{},"有":{"df":0,"docs":{},"一":{"df":0,"docs":{},"个":{"df":0,"docs":{},"问":{"df":0,"docs":{},"题":{"df":0,"docs":{},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}}}}}}}}}}},"w":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"324":{"tf":1.0},"353":{"tf":1.0},"75":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"353":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"120":{"tf":1.0},"266":{"tf":1.0}}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"225":{"tf":1.0},"246":{"tf":1.0},"36":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"57":{"tf":1.0}}}}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"427":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":12,"docs":{"120":{"tf":2.0},"225":{"tf":1.7320508075688772},"246":{"tf":1.7320508075688772},"260":{"tf":1.0},"266":{"tf":1.7320508075688772},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"353":{"tf":1.7320508075688772},"36":{"tf":1.7320508075688772},"405":{"tf":2.23606797749979},"427":{"tf":1.0},"57":{"tf":2.0}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"376":{"tf":1.4142135623730951}}}},"y":{"df":1,"docs":{"196":{"tf":1.0}}}},"df":2,"docs":{"196":{"tf":1.0},"378":{"tf":1.4142135623730951}},"e":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}},"a":{"df":0,"docs":{},"k":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"t":{"df":3,"docs":{"286":{"tf":1.0},"294":{"tf":2.8284271247461903},"295":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"286":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":3.605551275463989}}}},"b":{"df":13,"docs":{"10":{"tf":1.0},"111":{"tf":1.0},"297":{"tf":1.0},"316":{"tf":1.0},"392":{"tf":1.4142135623730951},"395":{"tf":2.449489742783178},"396":{"tf":2.0},"397":{"tf":1.4142135623730951},"398":{"tf":1.0},"401":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.7320508075688772},"6":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"400":{"tf":1.0}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"’":{"df":0,"docs":{},"r":{"df":1,"docs":{"59":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"’":{"df":1,"docs":{"59":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"273":{"tf":1.0}}}}}},"w":{"df":1,"docs":{"59":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":12,"docs":{"100":{"tf":1.0},"199":{"tf":3.7416573867739413},"242":{"tf":4.0},"335":{"tf":2.23606797749979},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":2.23606797749979},"91":{"tf":3.3166247903554},"93":{"tf":3.0},"95":{"tf":2.6457513110645907},"96":{"tf":1.4142135623730951},"97":{"tf":2.0}},"、":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"335":{"tf":1.7320508075688772}},"、":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"335":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"。":{"df":0,"docs":{},"当":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"不":{"df":0,"docs":{},"使":{"df":0,"docs":{},"用":{"df":0,"docs":{},"圆":{"df":0,"docs":{},"括":{"df":0,"docs":{},"号":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{},"l":{"d":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":10,"docs":{"111":{"tf":1.0},"12":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.0},"24":{"tf":2.23606797749979},"27":{"tf":1.7320508075688772},"42":{"tf":1.0},"436":{"tf":2.0}}}}},"df":9,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"389":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"191":{"tf":1.0},"273":{"tf":1.0},"376":{"tf":1.0},"433":{"tf":1.0}}}}}}},"z":{"a":{"df":0,"docs":{},"r":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"r":{"d":{"df":4,"docs":{"150":{"tf":1.0},"191":{"tf":1.7320508075688772},"77":{"tf":2.8284271247461903},"78":{"tf":4.47213595499958}}},"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"191":{"tf":1.7320508075688772},"230":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\"":{")":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"407":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"407":{"tf":1.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":1,"docs":{"407":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"405":{"tf":2.449489742783178},"407":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"405":{"tf":10.099504938362077},"407":{"tf":7.280109889280518},"408":{"tf":7.416198487095663}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"405":{"tf":1.0}}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"406":{"tf":1.0}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":4,"docs":{"110":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.4142135623730951},"266":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"264":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"!":{"df":0,"docs":{},"。":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}}},"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"162":{"tf":1.0}}}}}}},"df":24,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"150":{"tf":1.7320508075688772},"191":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"21":{"tf":1.0},"22":{"tf":2.449489742783178},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"26":{"tf":2.0},"266":{"tf":1.4142135623730951},"27":{"tf":2.23606797749979},"30":{"tf":1.0},"32":{"tf":2.0},"369":{"tf":1.0},"55":{"tf":1.7320508075688772},"59":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":3.1622776601683795}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"386":{"tf":1.0},"407":{"tf":1.0},"53":{"tf":2.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"378":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"378":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"378":{"tf":2.8284271247461903}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"a":{"d":{"d":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"df":2,"docs":{"377":{"tf":1.0},"378":{"tf":1.0}}}},"df":0,"docs":{}},"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"274":{"tf":1.0},"359":{"tf":1.4142135623730951}}}}}},"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"399":{"tf":1.4142135623730951}},"l":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":5,"docs":{"101":{"tf":1.0},"125":{"tf":1.0},"197":{"tf":1.0},"233":{"tf":1.0},"381":{"tf":2.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"x":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"+":{"1":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},".":{"0":{"df":1,"docs":{"54":{"tf":1.0}}},"1":{"df":1,"docs":{"54":{"tf":1.0}}},"2":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"186":{"tf":1.0},"188":{"tf":1.7320508075688772},"194":{"tf":1.0}}}}},"y":{".":{"df":0,"docs":{},"z":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}},"1":{"df":1,"docs":{"175":{"tf":2.0}}},"2":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"8":{"6":{"_":{"6":{"4":{"df":1,"docs":{"436":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"389":{"tf":1.7320508075688772}}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}},"df":56,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"105":{"tf":2.449489742783178},"106":{"tf":1.4142135623730951},"173":{"tf":4.358898943540674},"175":{"tf":4.358898943540674},"183":{"tf":1.7320508075688772},"185":{"tf":4.47213595499958},"186":{"tf":2.23606797749979},"188":{"tf":2.6457513110645907},"189":{"tf":1.7320508075688772},"194":{"tf":1.4142135623730951},"240":{"tf":3.605551275463989},"242":{"tf":1.0},"246":{"tf":2.0},"257":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"274":{"tf":1.0},"277":{"tf":2.449489742783178},"278":{"tf":2.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"289":{"tf":2.23606797749979},"345":{"tf":1.0},"347":{"tf":1.4142135623730951},"350":{"tf":1.4142135623730951},"351":{"tf":3.3166247903554},"352":{"tf":2.23606797749979},"353":{"tf":2.449489742783178},"355":{"tf":1.7320508075688772},"356":{"tf":4.123105625617661},"357":{"tf":2.0},"358":{"tf":2.23606797749979},"359":{"tf":6.4031242374328485},"360":{"tf":2.6457513110645907},"361":{"tf":4.242640687119285},"37":{"tf":1.7320508075688772},"375":{"tf":2.449489742783178},"377":{"tf":2.449489742783178},"381":{"tf":2.0},"385":{"tf":1.0},"386":{"tf":2.0},"389":{"tf":1.4142135623730951},"398":{"tf":1.0},"416":{"tf":1.0},"428":{"tf":2.23606797749979},"49":{"tf":5.0},"51":{"tf":4.123105625617661},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"56":{"tf":2.449489742783178},"57":{"tf":3.4641016151377544},"58":{"tf":4.123105625617661},"70":{"tf":3.1622776601683795},"71":{"tf":2.449489742783178},"94":{"tf":1.7320508075688772}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"213":{"tf":1.0}}}}}}}}}},"y":{"df":0,"docs":{},"z":{"df":4,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":1.0},"189":{"tf":1.0},"194":{"tf":1.0}}}},"、":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"个":{"df":0,"docs":{},"假":{"df":0,"docs":{},"想":{"df":0,"docs":{},"的":{"df":0,"docs":{},"例":{"df":0,"docs":{},"子":{"df":0,"docs":{},"中":{"df":0,"docs":{},",":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"356":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}}},",":{"2":{"df":1,"docs":{"351":{"tf":1.0}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"185":{"tf":1.0}}}}}}}},"y":{".":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"186":{"tf":1.0},"188":{"tf":1.7320508075688772},"194":{"tf":1.0}}}}}},"1":{"df":1,"docs":{"175":{"tf":2.449489742783178}}},"2":{">":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"175":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"175":{"tf":2.23606797749979}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"94":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"263":{"tf":2.449489742783178}}}}},"df":33,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"172":{"tf":1.0},"173":{"tf":4.242640687119285},"175":{"tf":3.4641016151377544},"183":{"tf":2.0},"186":{"tf":2.8284271247461903},"188":{"tf":3.1622776601683795},"189":{"tf":2.23606797749979},"191":{"tf":1.7320508075688772},"194":{"tf":1.4142135623730951},"274":{"tf":1.0},"277":{"tf":2.8284271247461903},"278":{"tf":2.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.7320508075688772},"289":{"tf":1.4142135623730951},"350":{"tf":1.0},"351":{"tf":2.23606797749979},"352":{"tf":2.0},"356":{"tf":3.872983346207417},"359":{"tf":6.324555320336759},"360":{"tf":3.1622776601683795},"361":{"tf":4.69041575982343},"37":{"tf":2.0},"375":{"tf":2.449489742783178},"377":{"tf":2.449489742783178},"381":{"tf":2.449489742783178},"53":{"tf":1.0},"54":{"tf":2.0},"57":{"tf":3.872983346207417},"70":{"tf":2.8284271247461903},"94":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"102":{"tf":1.0},"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"df":1,"docs":{"361":{"tf":1.0}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"148":{"tf":1.0},"150":{"tf":1.0},"258":{"tf":2.449489742783178}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"322":{"tf":2.23606797749979}}}}}},"df":2,"docs":{"322":{"tf":1.7320508075688772},"413":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"u":{"'":{"df":0,"docs":{},"r":{"df":2,"docs":{"401":{"tf":1.0},"75":{"tf":1.0}}},"v":{"df":2,"docs":{"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"y":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}},"”":{"df":0,"docs":{},"。":{"df":0,"docs":{},"现":{"df":0,"docs":{},"在":{"df":0,"docs":{},"有":{"df":0,"docs":{},"了":{"df":0,"docs":{},"两":{"df":0,"docs":{},"个":{"df":0,"docs":{},"变":{"df":0,"docs":{},"量":{"df":0,"docs":{},",":{"df":0,"docs":{},"x":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}}}}}}}},"(":{"df":0,"docs":{},"其":{"df":0,"docs":{},"值":{"df":0,"docs":{},"为":{"c":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}}},"z":{"df":7,"docs":{"277":{"tf":1.0},"301":{"tf":1.0},"351":{"tf":1.4142135623730951},"360":{"tf":2.0},"53":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951},"70":{"tf":1.0}},"e":{"df":1,"docs":{"142":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"o":{"df":5,"docs":{"252":{"tf":1.7320508075688772},"405":{"tf":3.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772},"61":{"tf":1.4142135623730951}}}}},"h":{"df":1,"docs":{"0":{"tf":1.0}}},"i":{"df":0,"docs":{},"p":{"(":{"&":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"252":{"tf":1.0}}}}}}},"breadcrumbs":{"root":{"0":{".":{".":{"1":{"0":{"0":{"df":1,"docs":{"427":{"tf":1.7320508075688772}}},"df":1,"docs":{"306":{"tf":2.23606797749979}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"143":{"tf":1.0}}},"5":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"405":{"tf":3.1622776601683795},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"0":{"0":{"df":14,"docs":{"198":{"tf":2.23606797749979},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"266":{"tf":2.449489742783178},"290":{"tf":1.0}}},"2":{"df":1,"docs":{"41":{"tf":1.0}}},"df":10,"docs":{"175":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"232":{"tf":1.0},"255":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"94":{"tf":1.4142135623730951}}},"1":{".":{"0":{"df":4,"docs":{"26":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"32":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"261":{"tf":1.0}}},"df":0,"docs":{}},"2":{"4":{"df":1,"docs":{"405":{"tf":1.0}}},"5":{"df":1,"docs":{"155":{"tf":1.0}}},"7":{"df":4,"docs":{"156":{"tf":1.0},"239":{"tf":1.0},"257":{"tf":1.0},"266":{"tf":1.0}}},"8":{"df":1,"docs":{"55":{"tf":1.0}}},"9":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}},"3":{".":{"3":{"0":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"0":{"5":{":":{"1":{"4":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"9":{":":{"8":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":3,"docs":{"49":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.0}}},"1":{"df":3,"docs":{"51":{"tf":1.0},"56":{"tf":1.0},"61":{"tf":1.7320508075688772}}},"2":{"df":2,"docs":{"27":{"tf":1.0},"62":{"tf":1.0}}},"3":{"df":1,"docs":{"27":{"tf":1.0}}},"8":{"df":1,"docs":{"229":{"tf":1.0}}},"9":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"4":{"1":{"df":1,"docs":{"242":{"tf":1.0}}},"2":{"df":2,"docs":{"398":{"tf":1.0},"88":{"tf":1.0}}},"3":{"df":3,"docs":{"143":{"tf":1.0},"241":{"tf":1.4142135623730951},"42":{"tf":1.0}}},"5":{"df":1,"docs":{"286":{"tf":1.0}}},"6":{"df":1,"docs":{"376":{"tf":1.0}}},"7":{"df":1,"docs":{"246":{"tf":1.0}}},"8":{"df":3,"docs":{"224":{"tf":1.0},"376":{"tf":1.0},"91":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"427":{"tf":1.0}}},"2":{"df":1,"docs":{"350":{"tf":1.0}}},"3":{"df":1,"docs":{"293":{"tf":1.0}}},"4":{"df":1,"docs":{"376":{"tf":1.0}}},"7":{"df":1,"docs":{"198":{"tf":1.0}}},"8":{"df":4,"docs":{"200":{"tf":1.0},"202":{"tf":1.0},"206":{"tf":1.0},"62":{"tf":1.0}}},"9":{"df":3,"docs":{"198":{"tf":1.0},"36":{"tf":1.0},"427":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":3,"docs":{"206":{"tf":1.0},"208":{"tf":1.0},"283":{"tf":1.0}}},"1":{"df":5,"docs":{"200":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"216":{"tf":1.0},"91":{"tf":1.0}}},"2":{"df":2,"docs":{"202":{"tf":1.0},"207":{"tf":1.0}}},"3":{"df":1,"docs":{"291":{"tf":1.0}}},"4":{"df":1,"docs":{"211":{"tf":1.0}}},"6":{"df":2,"docs":{"199":{"tf":1.7320508075688772},"202":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"9":{"df":1,"docs":{"207":{"tf":1.0}}},"df":0,"docs":{}},"7":{"1":{"df":1,"docs":{"225":{"tf":1.0}}},"2":{"df":1,"docs":{"198":{"tf":1.0}}},"3":{"df":2,"docs":{"157":{"tf":1.0},"283":{"tf":1.0}}},"5":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"df":0,"docs":{}},"8":{".":{"5":{"df":3,"docs":{"124":{"tf":1.0},"266":{"tf":1.0},"40":{"tf":2.8284271247461903}}},"6":{"df":1,"docs":{"40":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"267":{"tf":1.0}}},"9":{"df":1,"docs":{"211":{"tf":1.0}}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"40":{"tf":2.6457513110645907}}},"df":0,"docs":{},"x":{"df":1,"docs":{"40":{"tf":1.0}}}},"1":{"df":2,"docs":{"201":{"tf":1.0},"290":{"tf":1.0}}},"3":{"df":1,"docs":{"201":{"tf":1.0}}},"7":{"df":1,"docs":{"228":{"tf":1.0}}},"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"410":{"tf":1.0}}},"df":0,"docs":{}}},"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"4":{"5":{"8":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"b":{"1":{"7":{"5":{"df":0,"docs":{},"f":{"1":{"b":{"8":{"4":{"7":{"0":{"b":{"5":{"b":{"1":{"2":{"df":0,"docs":{},"e":{"4":{"a":{"6":{"3":{"d":{"6":{"7":{"0":{"df":0,"docs":{},"e":{"4":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":22,"docs":{"110":{"tf":1.0},"12":{"tf":1.0},"130":{"tf":1.0},"153":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.0},"2":{"tf":1.0},"213":{"tf":1.0},"237":{"tf":1.0},"254":{"tf":1.0},"270":{"tf":1.0},"296":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"328":{"tf":1.0},"345":{"tf":1.0},"364":{"tf":1.0},"395":{"tf":1.0},"47":{"tf":1.0},"64":{"tf":1.0},"81":{"tf":1.0},"99":{"tf":1.0}}},"1":{"df":21,"docs":{"100":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"131":{"tf":1.0},"154":{"tf":1.0},"171":{"tf":1.0},"197":{"tf":1.0},"214":{"tf":1.0},"238":{"tf":1.0},"255":{"tf":1.0},"271":{"tf":1.0},"297":{"tf":1.0},"315":{"tf":1.0},"329":{"tf":1.0},"346":{"tf":1.0},"365":{"tf":1.0},"396":{"tf":1.0},"411":{"tf":1.0},"49":{"tf":1.0},"65":{"tf":1.0},"82":{"tf":1.0}}},"2":{"a":{"1":{"6":{"8":{"df":0,"docs":{},"e":{"d":{"3":{"4":{"6":{"0":{"4":{"2":{"df":0,"docs":{},"f":{"0":{"7":{"0":{"1":{"0":{"df":0,"docs":{},"f":{"8":{"b":{"6":{"5":{"b":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"6":{"2":{"3":{"d":{"d":{"3":{"1":{"d":{"1":{"df":4,"docs":{"213":{"tf":1.0},"214":{"tf":1.0},"218":{"tf":1.0},"233":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":22,"docs":{"0":{"tf":1.0},"103":{"tf":1.0},"112":{"tf":1.0},"138":{"tf":1.0},"142":{"tf":1.0},"157":{"tf":1.0},"177":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"218":{"tf":1.0},"243":{"tf":1.0},"256":{"tf":1.0},"276":{"tf":1.0},"300":{"tf":1.0},"317":{"tf":1.0},"333":{"tf":1.0},"353":{"tf":1.4142135623730951},"403":{"tf":1.0},"415":{"tf":1.0},"52":{"tf":1.0},"73":{"tf":1.0},"88":{"tf":1.0}}},"3":{"df":21,"docs":{"108":{"tf":1.0},"115":{"tf":1.0},"146":{"tf":1.0},"163":{"tf":1.0},"184":{"tf":1.0},"209":{"tf":1.0},"219":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.0},"264":{"tf":1.0},"283":{"tf":1.0},"304":{"tf":1.0},"320":{"tf":1.0},"337":{"tf":1.0},"354":{"tf":1.0},"373":{"tf":1.0},"406":{"tf":1.0},"418":{"tf":1.0},"55":{"tf":1.0},"77":{"tf":1.0},"92":{"tf":1.0}}},"4":{"df":11,"docs":{"120":{"tf":1.0},"227":{"tf":1.0},"241":{"tf":1.0},"252":{"tf":1.0},"267":{"tf":1.0},"284":{"tf":1.0},"308":{"tf":1.0},"324":{"tf":1.0},"379":{"tf":1.0},"425":{"tf":1.0},"59":{"tf":1.0}}},"5":{"1":{"4":{"b":{"1":{"c":{"df":0,"docs":{},"f":{"3":{"4":{"c":{"2":{"df":0,"docs":{},"e":{"a":{"a":{"b":{"8":{"2":{"8":{"5":{"df":0,"docs":{},"f":{"4":{"3":{"3":{"0":{"5":{"c":{"1":{"0":{"a":{"8":{"7":{"df":0,"docs":{},"f":{"4":{"c":{"df":0,"docs":{},"e":{"3":{"4":{"a":{"0":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"b":{"0":{"d":{"3":{"3":{"8":{"2":{"2":{"9":{"b":{"8":{"7":{"d":{"0":{"6":{"b":{"df":0,"docs":{},"e":{"7":{"7":{"2":{"3":{"4":{"6":{"df":0,"docs":{},"e":{"a":{"0":{"b":{"6":{"4":{"3":{"b":{"d":{"df":0,"docs":{},"e":{"c":{"d":{"c":{"5":{"df":1,"docs":{"365":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":9,"docs":{"0":{"tf":1.0},"127":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"268":{"tf":1.0},"287":{"tf":1.0},"384":{"tf":1.0},"430":{"tf":1.0},"60":{"tf":1.0}}},"6":{"df":4,"docs":{"233":{"tf":1.0},"292":{"tf":1.0},"387":{"tf":1.0},"431":{"tf":1.0}}},"7":{"df":1,"docs":{"432":{"tf":1.0}}},"b":{"1":{"1":{"1":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"2":{"d":{"4":{"1":{"df":0,"docs":{},"e":{"2":{"a":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"7":{"3":{"4":{"8":{"2":{"5":{"c":{"3":{"a":{"1":{"2":{"0":{"8":{"7":{"d":{"4":{"2":{"3":{"df":0,"docs":{},"e":{"8":{"c":{"2":{"df":0,"docs":{},"f":{"0":{"a":{"df":0,"docs":{},"e":{"5":{"3":{"df":2,"docs":{"346":{"tf":1.0},"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":54,"docs":{"101":{"tf":1.7320508075688772},"108":{"tf":1.4142135623730951},"134":{"tf":1.0},"142":{"tf":1.0},"150":{"tf":1.0},"156":{"tf":1.7320508075688772},"162":{"tf":1.7320508075688772},"198":{"tf":5.0990195135927845},"199":{"tf":4.795831523312719},"200":{"tf":3.7416573867739413},"201":{"tf":2.8284271247461903},"202":{"tf":4.242640687119285},"206":{"tf":2.449489742783178},"207":{"tf":4.0},"208":{"tf":4.242640687119285},"211":{"tf":6.244997998398398},"228":{"tf":2.0},"229":{"tf":4.0},"232":{"tf":4.0},"239":{"tf":1.4142135623730951},"242":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.7320508075688772},"257":{"tf":2.0},"266":{"tf":5.291502622129181},"280":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":1.7320508075688772},"290":{"tf":2.23606797749979},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":3.0},"306":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"350":{"tf":1.7320508075688772},"359":{"tf":3.7416573867739413},"360":{"tf":1.7320508075688772},"361":{"tf":2.449489742783178},"369":{"tf":1.0},"374":{"tf":1.0},"375":{"tf":1.0},"378":{"tf":1.0},"391":{"tf":1.0},"405":{"tf":3.4641016151377544},"407":{"tf":2.0},"408":{"tf":3.3166247903554},"53":{"tf":2.0},"54":{"tf":1.4142135623730951},"61":{"tf":2.23606797749979},"62":{"tf":2.8284271247461903},"78":{"tf":1.0},"85":{"tf":2.0},"90":{"tf":1.0},"93":{"tf":1.7320508075688772}},"o":{"7":{"7":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"3":{"2":{".":{".":{"2":{"0":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"x":{"0":{"1":{"2":{"3":{"4":{"5":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"367":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"368":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"53":{"tf":1.0}}}}},"、":{"1":{"df":0,"docs":{},"、":{"2":{"df":0,"docs":{},"、":{"3":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},",":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"89":{"tf":1.0}}}}}}}}}},"1":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"246":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{".":{"1":{"0":{"0":{"0":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"324":{"tf":1.0}}},"df":2,"docs":{"298":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"4":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"62":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":2,"docs":{"298":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772}}},"=":{"1":{"0":{"0":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{"1":{"df":1,"docs":{"263":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":6,"docs":{"173":{"tf":1.4142135623730951},"191":{"tf":1.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"391":{"tf":1.0},"408":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"430":{"tf":1.0}}},"df":1,"docs":{"399":{"tf":1.0}}},"2":{"1":{"df":1,"docs":{"56":{"tf":1.0}}},"2":{"df":1,"docs":{"229":{"tf":1.0}}},"df":0,"docs":{}},"3":{"1":{"df":1,"docs":{"211":{"tf":1.0}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"430":{"tf":1.0}}}}}}}},"3":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"5":{"0":{"df":2,"docs":{"32":{"tf":1.0},"43":{"tf":1.0}}},"7":{"df":1,"docs":{"216":{"tf":1.0}}},"df":1,"docs":{"434":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"434":{"tf":1.0}}},"7":{"8":{".":{"0":{"df":0,"docs":{},"(":{"2":{"0":{"2":{"4":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"=":{"1":{"2":{"df":1,"docs":{"362":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"5":{"df":1,"docs":{"398":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"368":{"tf":1.0}}},"df":4,"docs":{"322":{"tf":1.0},"358":{"tf":1.0},"375":{"tf":1.0},"53":{"tf":1.0}}},"df":14,"docs":{"134":{"tf":1.4142135623730951},"156":{"tf":1.0},"167":{"tf":3.3166247903554},"170":{"tf":2.449489742783178},"172":{"tf":1.7320508075688772},"202":{"tf":4.0},"232":{"tf":1.0},"289":{"tf":2.0},"290":{"tf":1.0},"31":{"tf":1.0},"39":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.0}}},"2":{"3":{"df":1,"docs":{"397":{"tf":1.0}}},"df":2,"docs":{"207":{"tf":1.0},"320":{"tf":1.0}}},"4":{"df":1,"docs":{"142":{"tf":1.0}}},"5":{"df":1,"docs":{"320":{"tf":1.0}}},"8":{"2":{"c":{"4":{"b":{"0":{"6":{"3":{"a":{"8":{"df":0,"docs":{},"f":{"b":{"df":0,"docs":{},"e":{"6":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":73,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":1.0},"137":{"tf":1.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.7320508075688772},"150":{"tf":2.449489742783178},"162":{"tf":1.7320508075688772},"170":{"tf":3.1622776601683795},"172":{"tf":2.23606797749979},"173":{"tf":2.8284271247461903},"175":{"tf":3.4641016151377544},"176":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"183":{"tf":1.4142135623730951},"185":{"tf":3.0},"186":{"tf":2.6457513110645907},"188":{"tf":2.8284271247461903},"190":{"tf":1.4142135623730951},"191":{"tf":2.23606797749979},"192":{"tf":1.4142135623730951},"194":{"tf":1.0},"196":{"tf":1.0},"198":{"tf":1.0},"202":{"tf":1.0},"206":{"tf":2.8284271247461903},"224":{"tf":1.4142135623730951},"225":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":2.0},"243":{"tf":1.4142135623730951},"247":{"tf":2.23606797749979},"266":{"tf":1.4142135623730951},"267":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":2.0},"291":{"tf":1.4142135623730951},"293":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.7320508075688772},"303":{"tf":1.0},"306":{"tf":2.449489742783178},"319":{"tf":2.0},"320":{"tf":1.0},"322":{"tf":2.449489742783178},"324":{"tf":2.0},"332":{"tf":1.0},"335":{"tf":2.0},"341":{"tf":1.0},"353":{"tf":1.4142135623730951},"356":{"tf":2.0},"359":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951},"360":{"tf":1.0},"361":{"tf":1.0},"369":{"tf":1.4142135623730951},"37":{"tf":1.0},"404":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"62":{"tf":3.1622776601683795},"90":{"tf":1.4142135623730951},"91":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":2.0}}},"、":{"1":{"1":{"df":1,"docs":{"362":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"148":{"tf":1.0}}}}}},",":{"df":0,"docs":{},"之":{"df":0,"docs":{},"后":{"df":0,"docs":{},"是":{"df":0,"docs":{},"另":{"df":0,"docs":{},"两":{"df":0,"docs":{},"个":{"df":0,"docs":{},"列":{"df":0,"docs":{},"表":{"df":0,"docs":{},":":{"b":{"df":1,"docs":{"285":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}},":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"280":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"1":{":":{"4":{"3":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"3":{"d":{"5":{"0":{"8":{"b":{"0":{"a":{"2":{"8":{"b":{"0":{"3":{"df":0,"docs":{},"f":{"7":{"d":{"9":{"df":0,"docs":{},"f":{"1":{"6":{"c":{"8":{"8":{"7":{"2":{"6":{"0":{"8":{"8":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"f":{"d":{"8":{"7":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":38,"docs":{"120":{"tf":1.7320508075688772},"121":{"tf":1.7320508075688772},"123":{"tf":1.0},"140":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"189":{"tf":1.0},"192":{"tf":1.0},"198":{"tf":2.8284271247461903},"199":{"tf":2.0},"200":{"tf":1.4142135623730951},"202":{"tf":2.23606797749979},"203":{"tf":1.0},"206":{"tf":1.7320508075688772},"207":{"tf":2.0},"210":{"tf":1.4142135623730951},"211":{"tf":2.0},"225":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"266":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"303":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"337":{"tf":1.4142135623730951},"339":{"tf":1.0},"340":{"tf":1.4142135623730951},"341":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.0},"370":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"57":{"tf":1.0},"91":{"tf":1.4142135623730951}},":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"281":{"tf":1.0}}}}}}}}},"2":{".":{".":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":1.0}}}},"df":0,"docs":{}},"7":{".":{"0":{".":{"0":{".":{"1":{":":{"7":{"8":{"7":{"8":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"401":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}}}},"df":5,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"165":{"tf":1.4142135623730951}},"。":{"df":0,"docs":{},"第":{"df":0,"docs":{},"二":{"df":0,"docs":{},"个":{"df":0,"docs":{},"实":{"df":0,"docs":{},"例":{"df":0,"docs":{},",":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},",":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.0}}},"8":{"1":{"3":{"5":{"6":{"1":{"3":{"9":{"2":{"8":{"7":{"2":{"0":{"6":{"5":{"9":{"7":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":45,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"156":{"tf":1.0},"162":{"tf":1.4142135623730951},"178":{"tf":1.0},"180":{"tf":1.0},"200":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"215":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"218":{"tf":2.0},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.8284271247461903},"225":{"tf":2.8284271247461903},"226":{"tf":2.0},"228":{"tf":2.0},"229":{"tf":2.449489742783178},"231":{"tf":1.7320508075688772},"232":{"tf":2.6457513110645907},"235":{"tf":1.4142135623730951},"242":{"tf":2.0},"244":{"tf":1.4142135623730951},"246":{"tf":1.0},"249":{"tf":2.23606797749979},"250":{"tf":1.4142135623730951},"252":{"tf":2.23606797749979},"281":{"tf":1.7320508075688772},"306":{"tf":2.23606797749979},"319":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"359":{"tf":1.7320508075688772},"362":{"tf":1.0},"37":{"tf":1.0},"374":{"tf":1.7320508075688772},"400":{"tf":1.0},"405":{"tf":2.23606797749979},"434":{"tf":1.0},"51":{"tf":1.4142135623730951},"54":{"tf":1.0},"91":{"tf":1.4142135623730951}},"。":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"385":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"然":{"df":0,"docs":{},"而":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}}}}},":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"178":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"3":{"5":{"df":1,"docs":{"142":{"tf":1.0}}},"df":32,"docs":{"121":{"tf":2.0},"140":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"181":{"tf":1.0},"211":{"tf":1.4142135623730951},"224":{"tf":1.0},"226":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":3.1622776601683795},"242":{"tf":2.6457513110645907},"243":{"tf":2.0},"244":{"tf":1.4142135623730951},"245":{"tf":2.0},"246":{"tf":2.23606797749979},"247":{"tf":1.7320508075688772},"249":{"tf":2.8284271247461903},"250":{"tf":2.23606797749979},"251":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"329":{"tf":1.0},"339":{"tf":1.4142135623730951},"359":{"tf":1.7320508075688772},"374":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"93":{"tf":1.4142135623730951},"95":{"tf":1.0}}},"4":{"1":{"df":1,"docs":{"142":{"tf":1.0}}},"df":22,"docs":{"121":{"tf":1.4142135623730951},"140":{"tf":1.4142135623730951},"142":{"tf":1.0},"180":{"tf":1.0},"226":{"tf":1.4142135623730951},"246":{"tf":1.7320508075688772},"257":{"tf":3.1622776601683795},"258":{"tf":4.0},"266":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":1.7320508075688772},"306":{"tf":1.7320508075688772},"309":{"tf":1.0},"320":{"tf":1.4142135623730951},"332":{"tf":1.0},"340":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"375":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"59":{"tf":1.0},"91":{"tf":1.0},"95":{"tf":1.7320508075688772}},":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"5":{"0":{"0":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"1":{"df":2,"docs":{"142":{"tf":1.0},"144":{"tf":1.0}}},"df":39,"docs":{"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"183":{"tf":1.4142135623730951},"199":{"tf":1.0},"228":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.4142135623730951},"272":{"tf":1.7320508075688772},"273":{"tf":2.6457513110645907},"274":{"tf":1.7320508075688772},"275":{"tf":2.449489742783178},"277":{"tf":1.4142135623730951},"278":{"tf":2.449489742783178},"279":{"tf":2.449489742783178},"280":{"tf":2.23606797749979},"281":{"tf":3.1622776601683795},"283":{"tf":3.3166247903554},"285":{"tf":2.8284271247461903},"286":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":2.0},"291":{"tf":2.8284271247461903},"293":{"tf":3.1622776601683795},"294":{"tf":2.8284271247461903},"304":{"tf":1.0},"306":{"tf":2.23606797749979},"307":{"tf":1.4142135623730951},"320":{"tf":1.0},"322":{"tf":1.7320508075688772},"341":{"tf":1.4142135623730951},"359":{"tf":1.7320508075688772},"375":{"tf":1.4142135623730951},"380":{"tf":1.0},"381":{"tf":1.0},"405":{"tf":1.7320508075688772},"407":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"6":{"0":{"8":{"6":{"9":{"df":0,"docs":{},"f":{"3":{"8":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"9":{"1":{"6":{"6":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"359":{"tf":1.7320508075688772}}},"4":{"df":1,"docs":{"142":{"tf":2.23606797749979}}},"5":{"df":1,"docs":{"142":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"142":{"tf":1.0}}},"df":27,"docs":{"122":{"tf":1.7320508075688772},"141":{"tf":1.4142135623730951},"185":{"tf":1.7320508075688772},"228":{"tf":1.4142135623730951},"231":{"tf":1.0},"242":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"283":{"tf":2.0},"298":{"tf":2.6457513110645907},"299":{"tf":3.605551275463989},"300":{"tf":2.6457513110645907},"301":{"tf":1.7320508075688772},"302":{"tf":2.23606797749979},"303":{"tf":1.7320508075688772},"306":{"tf":3.3166247903554},"309":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.4142135623730951},"342":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"360":{"tf":2.23606797749979},"376":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"53":{"tf":1.0},"78":{"tf":1.0},"97":{"tf":1.4142135623730951}},"、":{"1":{"0":{"df":1,"docs":{"185":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"7":{"0":{"b":{"9":{"4":{"2":{"df":0,"docs":{},"e":{"b":{"5":{"b":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"3":{"a":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"df":1,"docs":{"142":{"tf":1.0}}},"df":36,"docs":{"123":{"tf":1.4142135623730951},"127":{"tf":1.0},"141":{"tf":1.4142135623730951},"185":{"tf":1.4142135623730951},"186":{"tf":1.0},"191":{"tf":1.0},"229":{"tf":1.4142135623730951},"242":{"tf":1.0},"249":{"tf":1.4142135623730951},"285":{"tf":1.7320508075688772},"314":{"tf":2.0},"316":{"tf":3.7416573867739413},"318":{"tf":2.449489742783178},"319":{"tf":3.3166247903554},"320":{"tf":3.7416573867739413},"321":{"tf":1.4142135623730951},"322":{"tf":3.3166247903554},"323":{"tf":2.449489742783178},"324":{"tf":2.449489742783178},"325":{"tf":1.4142135623730951},"331":{"tf":2.0},"334":{"tf":2.8284271247461903},"335":{"tf":3.0},"336":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"339":{"tf":1.7320508075688772},"340":{"tf":2.0},"341":{"tf":1.7320508075688772},"342":{"tf":3.0},"343":{"tf":2.8284271247461903},"360":{"tf":1.4142135623730951},"376":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"407":{"tf":1.0},"78":{"tf":1.0}},":":{"df":0,"docs":{},"r":{"df":1,"docs":{"185":{"tf":1.0}}}}},"8":{"0":{"df":1,"docs":{"144":{"tf":1.0}}},"4":{"df":1,"docs":{"142":{"tf":1.0}}},"df":22,"docs":{"125":{"tf":1.4142135623730951},"141":{"tf":2.0},"142":{"tf":1.0},"185":{"tf":1.4142135623730951},"186":{"tf":1.0},"229":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"249":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"342":{"tf":1.4142135623730951},"353":{"tf":2.6457513110645907},"356":{"tf":1.4142135623730951},"359":{"tf":3.605551275463989},"360":{"tf":4.47213595499958},"361":{"tf":2.6457513110645907},"362":{"tf":1.4142135623730951},"376":{"tf":2.0},"405":{"tf":1.4142135623730951},"78":{"tf":1.0}}},"9":{",":{"2":{"3":{"4":{",":{"9":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"2":{"0":{",":{"3":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"7":{"df":1,"docs":{"328":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}},"9":{"4":{"df":1,"docs":{"330":{"tf":1.0}}},"9":{"df":1,"docs":{"104":{"tf":1.0}}},"c":{"a":{"9":{"9":{"9":{"2":{"6":{"df":0,"docs":{},"f":{"2":{"3":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"f":{"5":{"8":{"1":{"a":{"9":{"1":{"7":{"df":0,"docs":{},"e":{"a":{"d":{"a":{"4":{"b":{"6":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"2":{"1":{"7":{"5":{"4":{"df":1,"docs":{"153":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":35,"docs":{"125":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"188":{"tf":1.0},"225":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"348":{"tf":1.7320508075688772},"349":{"tf":1.7320508075688772},"350":{"tf":1.7320508075688772},"351":{"tf":2.0},"352":{"tf":2.0},"360":{"tf":1.4142135623730951},"367":{"tf":2.8284271247461903},"368":{"tf":3.3166247903554},"369":{"tf":2.0},"370":{"tf":1.4142135623730951},"374":{"tf":2.449489742783178},"375":{"tf":2.0},"376":{"tf":4.0},"377":{"tf":1.4142135623730951},"378":{"tf":1.4142135623730951},"380":{"tf":1.0},"381":{"tf":2.23606797749979},"382":{"tf":2.0},"385":{"tf":1.4142135623730951},"389":{"tf":1.7320508075688772},"390":{"tf":1.4142135623730951},"391":{"tf":3.872983346207417},"405":{"tf":1.4142135623730951},"78":{"tf":1.0}},":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"186":{"tf":1.0}}}}},"df":0,"docs":{}}}},":":{"1":{"df":1,"docs":{"297":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"_":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":138,"docs":{"0":{"tf":1.0},"101":{"tf":2.0},"102":{"tf":1.0},"103":{"tf":1.7320508075688772},"104":{"tf":1.0},"105":{"tf":2.0},"106":{"tf":1.7320508075688772},"108":{"tf":1.4142135623730951},"114":{"tf":2.0},"115":{"tf":1.0},"120":{"tf":1.7320508075688772},"132":{"tf":1.7320508075688772},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"150":{"tf":1.7320508075688772},"151":{"tf":1.0},"156":{"tf":2.0},"162":{"tf":1.0},"167":{"tf":3.3166247903554},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"173":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":3.1622776601683795},"199":{"tf":3.1622776601683795},"200":{"tf":2.0},"201":{"tf":2.0},"202":{"tf":4.358898943540674},"203":{"tf":1.0},"206":{"tf":2.0},"207":{"tf":1.7320508075688772},"208":{"tf":2.23606797749979},"211":{"tf":3.1622776601683795},"215":{"tf":1.4142135623730951},"217":{"tf":1.0},"22":{"tf":2.0},"221":{"tf":1.0},"224":{"tf":2.449489742783178},"225":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":1.4142135623730951},"23":{"tf":1.0},"232":{"tf":1.0},"239":{"tf":2.0},"240":{"tf":2.6457513110645907},"241":{"tf":2.8284271247461903},"242":{"tf":2.6457513110645907},"246":{"tf":2.6457513110645907},"255":{"tf":1.4142135623730951},"257":{"tf":3.0},"26":{"tf":2.0},"266":{"tf":2.8284271247461903},"267":{"tf":1.0},"272":{"tf":1.7320508075688772},"273":{"tf":2.449489742783178},"274":{"tf":1.4142135623730951},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":2.0},"289":{"tf":2.0},"290":{"tf":1.7320508075688772},"293":{"tf":2.0},"294":{"tf":2.449489742783178},"298":{"tf":3.1622776601683795},"299":{"tf":1.7320508075688772},"301":{"tf":1.0},"306":{"tf":2.6457513110645907},"31":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.7320508075688772},"318":{"tf":2.449489742783178},"324":{"tf":2.449489742783178},"33":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"335":{"tf":1.0},"347":{"tf":1.0},"348":{"tf":1.7320508075688772},"349":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":2.449489742783178},"353":{"tf":1.4142135623730951},"355":{"tf":1.7320508075688772},"357":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"361":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":2.449489742783178},"374":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":2.0},"385":{"tf":1.0},"386":{"tf":2.6457513110645907},"39":{"tf":1.0},"391":{"tf":1.4142135623730951},"395":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.7320508075688772},"401":{"tf":1.0},"405":{"tf":2.449489742783178},"407":{"tf":1.0},"408":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"416":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"427":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.7320508075688772},"52":{"tf":1.0},"53":{"tf":3.1622776601683795},"54":{"tf":3.0},"57":{"tf":2.8284271247461903},"58":{"tf":2.23606797749979},"61":{"tf":1.4142135623730951},"62":{"tf":2.6457513110645907},"68":{"tf":1.4142135623730951},"70":{"tf":2.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"78":{"tf":1.0},"79":{"tf":1.4142135623730951},"82":{"tf":2.23606797749979},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":2.0},"90":{"tf":1.0},"91":{"tf":1.0}},"f":{"b":{"7":{"4":{"c":{"3":{"df":0,"docs":{},"f":{"1":{"d":{"8":{"a":{"df":0,"docs":{},"e":{"b":{"a":{"3":{"9":{"3":{"7":{"3":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"4":{"c":{"d":{"b":{"9":{"a":{"4":{"b":{"d":{"c":{"a":{"9":{"5":{"6":{"0":{"4":{"df":0,"docs":{},"f":{"df":2,"docs":{"2":{"tf":1.0},"20":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"8":{"9":{"0":{"0":{"3":{"1":{"3":{"1":{"1":{"6":{"1":{"2":{"df":0,"docs":{},"e":{"5":{"4":{"9":{"6":{"5":{"df":0,"docs":{},"f":{"7":{"df":0,"docs":{},"f":{"8":{"0":{"0":{"a":{"8":{"c":{"8":{"b":{"d":{"4":{"4":{"6":{"4":{"6":{"6":{"3":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"f":{"c":{"4":{"b":{"9":{"6":{"c":{"2":{"0":{"1":{"7":{"df":0,"docs":{},"f":{"6":{"4":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"f":{"4":{"1":{"a":{"0":{"a":{"0":{"7":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"e":{"8":{"1":{"5":{"df":0,"docs":{},"f":{"2":{"4":{"df":0,"docs":{},"f":{"df":4,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"296":{"tf":1.0},"410":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"3":{"2":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"、":{"2":{"df":3,"docs":{"132":{"tf":1.0},"349":{"tf":1.0},"389":{"tf":1.0}},"、":{"3":{"df":0,"docs":{},"、":{"4":{"df":1,"docs":{"358":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"然":{"df":0,"docs":{},"而":{"df":0,"docs":{},",":{"b":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}}}}},",":{"2":{"df":0,"docs":{},",":{"3":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"82":{"tf":1.0}}}}}}}},"2":{".":{"0":{"df":3,"docs":{"260":{"tf":1.4142135623730951},"391":{"tf":1.0},"53":{"tf":1.0}}},"5":{"3":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0}}},"df":0,"docs":{}},"8":{"5":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"8":{"df":1,"docs":{"104":{"tf":1.0}}},"9":{"df":1,"docs":{"102":{"tf":1.0}}},"df":8,"docs":{"202":{"tf":2.0},"399":{"tf":2.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}},"1":{"5":{"df":3,"docs":{"414":{"tf":1.4142135623730951},"430":{"tf":2.0},"434":{"tf":1.0}},"、":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"430":{"tf":1.0}}}}}}}},"8":{"df":2,"docs":{"414":{"tf":1.4142135623730951},"430":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"1":{"df":4,"docs":{"26":{"tf":1.0},"260":{"tf":1.0},"32":{"tf":1.0},"430":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"8":{"df":2,"docs":{"142":{"tf":2.0},"144":{"tf":1.4142135623730951}}},":":{"1":{"0":{"df":1,"docs":{"320":{"tf":3.7416573867739413}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":28,"docs":{"125":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"289":{"tf":1.0},"320":{"tf":1.7320508075688772},"322":{"tf":1.7320508075688772},"328":{"tf":1.0},"343":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"395":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":2.0},"401":{"tf":3.0},"402":{"tf":2.0},"404":{"tf":2.0},"405":{"tf":5.477225575051661},"406":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951},"408":{"tf":2.449489742783178},"62":{"tf":2.0},"78":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"1":{"a":{"2":{"df":0,"docs":{},"e":{"d":{"1":{"4":{"df":0,"docs":{},"f":{"4":{"4":{"8":{"0":{"d":{"a":{"b":{"6":{"2":{"4":{"3":{"8":{"d":{"c":{"c":{"1":{"1":{"3":{"0":{"2":{"9":{"1":{"b":{"df":0,"docs":{},"e":{"b":{"c":{"6":{"5":{"3":{"7":{"9":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"f":{"8":{"4":{"0":{"8":{"4":{"2":{"b":{"d":{"df":0,"docs":{},"f":{"7":{"6":{"8":{"a":{"7":{"9":{"8":{"8":{"6":{"9":{"df":0,"docs":{},"f":{"0":{"6":{"3":{"7":{"3":{"c":{"9":{"6":{"c":{"1":{"c":{"c":{"5":{"1":{"2":{"2":{"df":1,"docs":{"384":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":16,"docs":{"127":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"188":{"tf":1.0},"194":{"tf":1.0},"211":{"tf":1.0},"232":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"251":{"tf":1.0},"289":{"tf":1.4142135623730951},"306":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.4142135623730951},"343":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"376":{"tf":1.4142135623730951},"405":{"tf":2.0}},":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"188":{"tf":1.0}}}}}}}}}}},"2":{"4":{"df":1,"docs":{"142":{"tf":2.449489742783178}}},"df":14,"docs":{"127":{"tf":1.7320508075688772},"149":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951},"232":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"251":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"377":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951},"42":{"tf":1.0}}},"3":{"df":11,"docs":{"150":{"tf":1.4142135623730951},"185":{"tf":1.0},"188":{"tf":1.7320508075688772},"232":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"290":{"tf":1.7320508075688772},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"378":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951}}},"4":{"3":{".":{"3":{"df":1,"docs":{"267":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"142":{"tf":1.0},"150":{"tf":1.7320508075688772},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"235":{"tf":1.4142135623730951},"249":{"tf":1.0},"291":{"tf":1.4142135623730951},"293":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"377":{"tf":1.0},"381":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951}}},"5":{"5":{"df":3,"docs":{"101":{"tf":1.0},"359":{"tf":1.7320508075688772},"53":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"53":{"tf":1.0}}},"df":16,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":2.449489742783178},"108":{"tf":1.4142135623730951},"150":{"tf":2.0},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"191":{"tf":1.7320508075688772},"240":{"tf":1.0},"249":{"tf":1.0},"293":{"tf":2.0},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"360":{"tf":1.4142135623730951},"381":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951}}},"6":{":":{"1":{"0":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":7,"docs":{"293":{"tf":1.4142135623730951},"294":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"382":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951}}},"7":{"df":7,"docs":{"294":{"tf":1.7320508075688772},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"385":{"tf":1.4142135623730951},"405":{"tf":1.0},"53":{"tf":1.4142135623730951}}},"8":{"0":{"df":2,"docs":{"178":{"tf":1.0},"179":{"tf":1.0}}},"df":7,"docs":{"228":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"389":{"tf":1.7320508075688772},"53":{"tf":1.0}}},"9":{"2":{"1":{"7":{"4":{"3":{"5":{"1":{"6":{"b":{"3":{"df":0,"docs":{},"e":{"2":{"c":{"0":{"df":0,"docs":{},"f":{"4":{"5":{"a":{"9":{"5":{"3":{"9":{"0":{"df":0,"docs":{},"e":{"7":{"b":{"5":{"3":{"6":{"df":0,"docs":{},"e":{"4":{"2":{"df":0,"docs":{},"f":{"4":{"a":{"df":0,"docs":{},"f":{"7":{"c":{"df":1,"docs":{"154":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"df":0,"docs":{},"f":{"d":{"1":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"e":{"1":{"1":{"d":{"d":{"6":{"1":{"c":{"a":{"1":{"3":{"6":{"df":0,"docs":{},"f":{"b":{"5":{"1":{"d":{"7":{"1":{"3":{"df":0,"docs":{},"f":{"6":{"b":{"0":{"b":{"a":{"7":{"5":{"1":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":5,"docs":{"294":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"362":{"tf":1.4142135623730951},"390":{"tf":1.4142135623730951}}},"b":{"4":{"5":{"6":{"5":{"6":{"6":{"2":{"d":{"1":{"a":{"7":{"9":{"7":{"3":{"d":{"8":{"7":{"0":{"7":{"4":{"4":{"a":{"9":{"2":{"3":{"df":0,"docs":{},"f":{"5":{"8":{"df":0,"docs":{},"f":{"8":{"df":0,"docs":{},"f":{"7":{"d":{"c":{"c":{"df":0,"docs":{},"e":{"9":{"1":{"df":2,"docs":{"115":{"tf":1.0},"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"d":{"1":{"b":{"5":{"5":{"9":{"3":{"d":{"2":{"6":{"d":{"c":{"6":{"a":{"0":{"3":{"c":{"2":{"0":{"df":0,"docs":{},"f":{"8":{"6":{"1":{"9":{"1":{"8":{"7":{"a":{"d":{"4":{"b":{"2":{"4":{"8":{"5":{"5":{"5":{"2":{"df":1,"docs":{"248":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":101,"docs":{"101":{"tf":2.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.7320508075688772},"116":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.0},"132":{"tf":1.7320508075688772},"134":{"tf":2.0},"137":{"tf":1.0},"150":{"tf":1.0},"156":{"tf":2.23606797749979},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"170":{"tf":2.449489742783178},"198":{"tf":2.8284271247461903},"199":{"tf":1.7320508075688772},"200":{"tf":1.0},"203":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.23606797749979},"208":{"tf":1.4142135623730951},"210":{"tf":1.7320508075688772},"217":{"tf":1.4142135623730951},"221":{"tf":1.0},"224":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":3.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.4142135623730951},"257":{"tf":1.7320508075688772},"26":{"tf":1.0},"266":{"tf":1.0},"273":{"tf":3.0},"274":{"tf":1.4142135623730951},"275":{"tf":2.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"289":{"tf":1.4142135623730951},"293":{"tf":2.449489742783178},"294":{"tf":1.0},"298":{"tf":3.0},"299":{"tf":2.0},"306":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"318":{"tf":2.449489742783178},"323":{"tf":1.0},"324":{"tf":2.23606797749979},"33":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"349":{"tf":2.0},"350":{"tf":1.0},"351":{"tf":2.449489742783178},"353":{"tf":1.0},"355":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.0},"360":{"tf":2.449489742783178},"361":{"tf":2.23606797749979},"367":{"tf":1.4142135623730951},"368":{"tf":2.0},"37":{"tf":1.7320508075688772},"375":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":2.6457513110645907},"382":{"tf":1.0},"385":{"tf":1.4142135623730951},"386":{"tf":1.0},"389":{"tf":1.7320508075688772},"391":{"tf":1.4142135623730951},"398":{"tf":1.4142135623730951},"40":{"tf":2.0},"401":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"407":{"tf":1.0},"408":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"42":{"tf":1.7320508075688772},"428":{"tf":1.0},"45":{"tf":2.0},"49":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":2.449489742783178},"57":{"tf":2.0},"61":{"tf":3.0},"62":{"tf":2.449489742783178},"70":{"tf":2.6457513110645907},"75":{"tf":1.0},"79":{"tf":1.7320508075688772},"82":{"tf":1.4142135623730951},"84":{"tf":1.0},"87":{"tf":1.7320508075688772},"91":{"tf":1.0},"94":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"53":{"tf":1.7320508075688772}}},",":{"df":0,"docs":{},"x":{"df":1,"docs":{"51":{"tf":1.0}}}},":":{"*":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"257":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"3":{".":{".":{"=":{"7":{"df":1,"docs":{"362":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":1,"docs":{"53":{"tf":1.0}}},"1":{"4":{"1":{"5":{"df":1,"docs":{"428":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"183":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"0":{"df":13,"docs":{"322":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"348":{"tf":2.0},"391":{"tf":2.6457513110645907},"53":{"tf":1.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":2.6457513110645907},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"1":{"0":{"df":0,"docs":{},"e":{"a":{"6":{"c":{"b":{"0":{"d":{"d":{"8":{"5":{"5":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"5":{"1":{"0":{"c":{"9":{"b":{"a":{"0":{"5":{"6":{"4":{"8":{"b":{"c":{"5":{"8":{"3":{"6":{"df":0,"docs":{},"e":{"a":{"d":{"0":{"c":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"1":{"df":0,"docs":{},"e":{"d":{"a":{"0":{"7":{"a":{"4":{"a":{"4":{"6":{"9":{"2":{"b":{"df":0,"docs":{},"f":{"6":{"9":{"df":0,"docs":{},"e":{"3":{"a":{"a":{"a":{"d":{"9":{"9":{"9":{"d":{"8":{"4":{"0":{"a":{"c":{"9":{"c":{"1":{"3":{"8":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"324":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951}}},"2":{".":{"2":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":6,"docs":{"135":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"360":{"tf":2.449489742783178},"391":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"53":{"tf":2.23606797749979}}},"3":{"df":2,"docs":{"325":{"tf":1.4142135623730951},"391":{"tf":1.7320508075688772}}},"4":{"\"":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"348":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"3":{"1":{"4":{"c":{"1":{"0":{"df":0,"docs":{},"f":{"6":{"9":{"9":{"c":{"c":{"8":{"8":{"2":{"d":{"4":{"df":0,"docs":{},"e":{"0":{"b":{"0":{"6":{"df":0,"docs":{},"f":{"2":{"a":{"2":{"4":{"b":{"d":{"3":{"7":{"a":{"5":{"4":{"3":{"5":{"df":0,"docs":{},"f":{"2":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.4142135623730951},"382":{"tf":1.0}}},"5":{"0":{"df":1,"docs":{"322":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.0}}}},"df":1,"docs":{"322":{"tf":1.4142135623730951}}},"6":{"3":{"8":{"3":{"b":{"4":{"d":{"a":{"2":{"1":{"d":{"b":{"d":{"0":{"a":{"0":{"7":{"8":{"1":{"4":{"7":{"3":{"b":{"c":{"8":{"a":{"d":{"7":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"e":{"d":{"1":{"b":{"6":{"7":{"5":{"1":{"df":1,"docs":{"300":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":1,"docs":{"42":{"tf":1.7320508075688772}}},"9":{"6":{"2":{"c":{"0":{"2":{"2":{"4":{"b":{"2":{"7":{"4":{"df":0,"docs":{},"e":{"2":{"3":{"5":{"8":{"df":0,"docs":{},"e":{"0":{"a":{"c":{"df":0,"docs":{},"f":{"0":{"6":{"4":{"4":{"3":{"a":{"df":0,"docs":{},"f":{"6":{"4":{"d":{"df":0,"docs":{},"f":{"1":{"1":{"5":{"3":{"5":{"9":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"d":{"b":{"6":{"9":{"d":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"f":{"b":{"1":{"8":{"df":0,"docs":{},"f":{"2":{"4":{"b":{"1":{"5":{"c":{"7":{"a":{"d":{"1":{"3":{"4":{"9":{"1":{"b":{"1":{"c":{"1":{"df":0,"docs":{},"f":{"a":{"7":{"2":{"3":{"1":{"df":1,"docs":{"415":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"8":{"d":{"6":{"df":0,"docs":{},"f":{"4":{"8":{"d":{"2":{"df":0,"docs":{},"e":{"6":{"b":{"7":{"b":{"1":{"5":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"d":{"5":{"1":{"c":{"4":{"5":{"4":{"1":{"d":{"4":{"4":{"6":{"df":0,"docs":{},"e":{"8":{"9":{"d":{"df":0,"docs":{},"e":{"3":{"8":{"9":{"2":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"5":{"1":{"df":0,"docs":{},"f":{"7":{"0":{"c":{"7":{"8":{"1":{"6":{"2":{"df":0,"docs":{},"f":{"a":{"a":{"df":0,"docs":{},"e":{"b":{"c":{"a":{"b":{"0":{"d":{"a":{"0":{"d":{"df":0,"docs":{},"e":{"2":{"d":{"d":{"d":{"3":{"3":{"3":{"df":0,"docs":{},"e":{"7":{"a":{"8":{"df":3,"docs":{"65":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":92,"docs":{"103":{"tf":2.23606797749979},"106":{"tf":1.0},"107":{"tf":2.449489742783178},"115":{"tf":2.0},"116":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"134":{"tf":1.7320508075688772},"137":{"tf":1.0},"142":{"tf":1.7320508075688772},"156":{"tf":2.0},"157":{"tf":1.7320508075688772},"162":{"tf":1.4142135623730951},"170":{"tf":1.7320508075688772},"172":{"tf":1.0},"174":{"tf":1.0},"192":{"tf":1.4142135623730951},"196":{"tf":1.0},"198":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"224":{"tf":2.23606797749979},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.23606797749979},"231":{"tf":1.0},"232":{"tf":2.0},"240":{"tf":1.7320508075688772},"241":{"tf":3.0},"242":{"tf":2.0},"243":{"tf":1.7320508075688772},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"273":{"tf":2.6457513110645907},"275":{"tf":1.0},"285":{"tf":2.0},"286":{"tf":1.0},"289":{"tf":1.4142135623730951},"291":{"tf":1.0},"294":{"tf":2.6457513110645907},"298":{"tf":2.449489742783178},"299":{"tf":3.0},"314":{"tf":1.4142135623730951},"316":{"tf":2.0},"318":{"tf":2.449489742783178},"324":{"tf":2.0},"334":{"tf":1.0},"345":{"tf":1.0},"349":{"tf":1.4142135623730951},"350":{"tf":1.7320508075688772},"351":{"tf":2.449489742783178},"352":{"tf":2.0},"353":{"tf":1.4142135623730951},"355":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.7320508075688772},"360":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":2.8284271247461903},"369":{"tf":1.0},"375":{"tf":1.7320508075688772},"377":{"tf":2.449489742783178},"382":{"tf":1.0},"385":{"tf":1.4142135623730951},"389":{"tf":2.0},"399":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"408":{"tf":2.449489742783178},"41":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":2.23606797749979},"54":{"tf":3.3166247903554},"57":{"tf":2.23606797749979},"61":{"tf":3.3166247903554},"62":{"tf":3.605551275463989},"70":{"tf":2.23606797749979},"71":{"tf":1.4142135623730951},"72":{"tf":1.0},"79":{"tf":1.7320508075688772},"82":{"tf":1.4142135623730951},"87":{"tf":1.7320508075688772}},"e":{"5":{"1":{"0":{"5":{"b":{"5":{"2":{"df":0,"docs":{},"f":{"7":{"df":0,"docs":{},"e":{"8":{"d":{"3":{"d":{"9":{"5":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"d":{"df":0,"docs":{},"e":{"4":{"d":{"c":{"b":{"1":{"c":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"2":{"7":{"df":1,"docs":{"406":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"f":{"2":{"a":{"6":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"4":{"8":{"9":{"4":{"3":{"a":{"d":{"df":0,"docs":{},"e":{"3":{"df":0,"docs":{},"e":{"9":{"c":{"0":{"df":0,"docs":{},"e":{"b":{"2":{"3":{"d":{"6":{"9":{"df":0,"docs":{},"e":{"2":{"b":{"8":{"b":{"4":{"1":{"df":0,"docs":{},"f":{"0":{"5":{"7":{"df":0,"docs":{},"f":{"1":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":1,"docs":{"267":{"tf":1.0}}},"(":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"个":{"df":0,"docs":{},"程":{"df":0,"docs":{},"序":{"df":0,"docs":{},"中":{"df":0,"docs":{},"要":{"df":0,"docs":{},"计":{"df":0,"docs":{},"算":{"df":0,"docs":{},"的":{"df":0,"docs":{},"小":{"df":0,"docs":{},"时":{"df":0,"docs":{},"数":{"df":0,"docs":{},")":{"df":0,"docs":{},"的":{"df":0,"docs":{},"结":{"df":0,"docs":{},"果":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"50":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}}}},":":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"334":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"4":{".":{"0":{"df":1,"docs":{"173":{"tf":2.23606797749979}},",":{"df":0,"docs":{},"因":{"df":0,"docs":{},"为":{"df":0,"docs":{},"它":{"df":0,"docs":{},"i":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}},"3":{"df":1,"docs":{"53":{"tf":1.0}}},"4":{"5":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"4":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":5,"docs":{"401":{"tf":2.0},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}}},"df":5,"docs":{"401":{"tf":2.23606797749979},"402":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"df":4,"docs":{"402":{"tf":1.0},"62":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"2":{"\"":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{":":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":3,"docs":{"170":{"tf":1.4142135623730951},"320":{"tf":1.0},"53":{"tf":1.0}}},"4":{"df":0,"docs":{},"e":{"3":{"1":{"df":0,"docs":{},"f":{"9":{"df":0,"docs":{},"f":{"3":{"0":{"4":{"df":0,"docs":{},"e":{"0":{"c":{"d":{"9":{"a":{"c":{"df":0,"docs":{},"e":{"0":{"1":{"0":{"4":{"5":{"d":{"1":{"7":{"a":{"2":{"a":{"a":{"0":{"1":{"a":{"4":{"4":{"9":{"5":{"2":{"8":{"df":2,"docs":{"254":{"tf":1.0},"255":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":3,"docs":{"43":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"6":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}},"7":{"df":1,"docs":{"405":{"tf":1.0}}},"8":{"df":1,"docs":{"405":{"tf":1.0}}},"9":{"9":{"7":{"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"0":{"6":{"8":{"6":{"df":0,"docs":{},"f":{"a":{"8":{"df":0,"docs":{},"e":{"df":1,"docs":{"266":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"405":{"tf":1.0}}},"a":{"a":{"9":{"6":{"a":{"3":{"d":{"2":{"0":{"5":{"7":{"0":{"df":0,"docs":{},"f":{"8":{"6":{"8":{"b":{"d":{"2":{"0":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"e":{"3":{"df":0,"docs":{},"e":{"8":{"6":{"5":{"b":{"0":{"4":{"7":{"2":{"8":{"4":{"b":{"df":0,"docs":{},"e":{"3":{"0":{"df":1,"docs":{"169":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"8":{"d":{"1":{"3":{"c":{"5":{"2":{"c":{"5":{"1":{"df":0,"docs":{},"f":{"1":{"c":{"6":{"2":{"a":{"8":{"0":{"b":{"5":{"2":{"d":{"7":{"df":0,"docs":{},"f":{"b":{"d":{"7":{"c":{"c":{"0":{"b":{"6":{"3":{"a":{"d":{"a":{"4":{"3":{"df":1,"docs":{"431":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":73,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"108":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.0},"125":{"tf":1.0},"134":{"tf":2.449489742783178},"137":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.0},"156":{"tf":1.7320508075688772},"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"160":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"198":{"tf":2.23606797749979},"200":{"tf":2.449489742783178},"203":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"23":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":2.0},"246":{"tf":1.7320508075688772},"258":{"tf":2.23606797749979},"273":{"tf":1.4142135623730951},"285":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"298":{"tf":2.449489742783178},"299":{"tf":2.449489742783178},"316":{"tf":1.4142135623730951},"318":{"tf":2.449489742783178},"324":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"351":{"tf":1.4142135623730951},"358":{"tf":1.0},"360":{"tf":2.8284271247461903},"361":{"tf":2.6457513110645907},"368":{"tf":2.6457513110645907},"377":{"tf":2.6457513110645907},"400":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"414":{"tf":1.0},"417":{"tf":1.4142135623730951},"42":{"tf":1.7320508075688772},"427":{"tf":1.0},"49":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":2.0},"57":{"tf":1.0},"61":{"tf":2.449489742783178},"62":{"tf":2.8284271247461903},"68":{"tf":1.4142135623730951},"70":{"tf":4.0},"71":{"tf":1.4142135623730951},"72":{"tf":2.6457513110645907},"73":{"tf":2.23606797749979},"74":{"tf":1.7320508075688772},"77":{"tf":2.23606797749979},"78":{"tf":2.449489742783178},"79":{"tf":1.4142135623730951},"82":{"tf":1.0},"83":{"tf":1.0},"87":{"tf":1.4142135623730951}},"、":{"5":{"df":1,"docs":{"361":{"tf":1.4142135623730951}}},"df":0,"docs":{}},":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"1":{"df":1,"docs":{"70":{"tf":1.0}}},"df":0,"docs":{}}}},"5":{".":{"0":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"df":3,"docs":{"318":{"tf":1.0},"319":{"tf":1.0},"54":{"tf":1.7320508075688772}}},"5":{"7":{"df":0,"docs":{},"f":{"1":{"5":{"7":{"c":{"d":{"0":{"b":{"3":{"5":{"b":{"c":{"7":{"d":{"0":{"d":{"c":{"0":{"a":{"df":0,"docs":{},"f":{"6":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"6":{"2":{"2":{"df":0,"docs":{},"f":{"a":{"4":{"c":{"4":{"8":{"0":{"9":{"9":{"6":{"df":1,"docs":{"425":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"7":{"7":{"5":{"3":{"6":{"0":{"b":{"a":{"3":{"9":{"0":{"4":{"c":{"4":{"1":{"df":0,"docs":{},"e":{"8":{"4":{"1":{"7":{"6":{"3":{"3":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"7":{"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"e":{"7":{"d":{"6":{"1":{"7":{"7":{"c":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":20,"docs":{"104":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"148":{"tf":1.7320508075688772},"150":{"tf":1.7320508075688772},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"196":{"tf":1.0},"335":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0},"42":{"tf":1.7320508075688772},"62":{"tf":1.7320508075688772},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":2.449489742783178},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"2":{"df":1,"docs":{"407":{"tf":1.7320508075688772}},"f":{"a":{"df":0,"docs":{},"f":{"a":{"a":{"a":{"8":{"df":0,"docs":{},"e":{"4":{"3":{"2":{"df":0,"docs":{},"e":{"8":{"4":{"b":{"df":0,"docs":{},"e":{"a":{"a":{"df":0,"docs":{},"f":{"4":{"df":0,"docs":{},"e":{"a":{"8":{"0":{"c":{"c":{"b":{"a":{"8":{"8":{"0":{"6":{"2":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"d":{"df":1,"docs":{"284":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"4":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}},"6":{".":{"7":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"289":{"tf":1.0}}},"7":{"d":{"7":{"0":{"c":{"3":{"a":{"c":{"b":{"7":{"3":{"8":{"df":0,"docs":{},"f":{"4":{"d":{"df":1,"docs":{"202":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"135":{"tf":1.4142135623730951},"289":{"tf":1.0}},"u":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}},"8":{"df":2,"docs":{"289":{"tf":1.0},"42":{"tf":1.0}}},"9":{"df":1,"docs":{"43":{"tf":1.7320508075688772}}},"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"42":{"tf":1.0}}},"r":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"。":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"a":{"3":{"a":{"6":{"4":{"d":{"6":{"0":{"b":{"0":{"d":{"d":{"7":{"8":{"6":{"c":{"3":{"5":{"c":{"a":{"4":{"d":{"a":{"a":{"d":{"a":{"7":{"a":{"4":{"d":{"2":{"0":{"d":{"a":{"3":{"3":{"df":0,"docs":{},"e":{"5":{"df":4,"docs":{"270":{"tf":1.0},"271":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"f":{"6":{"9":{"0":{"9":{"c":{"5":{"7":{"b":{"3":{"b":{"a":{"5":{"5":{"df":0,"docs":{},"f":{"1":{"5":{"6":{"a":{"4":{"1":{"2":{"2":{"a":{"4":{"2":{"b":{"8":{"0":{"5":{"4":{"3":{"6":{"d":{"df":0,"docs":{},"e":{"9":{"0":{"c":{"df":2,"docs":{"395":{"tf":1.0},"396":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":100,"docs":{"102":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"105":{"tf":2.0},"106":{"tf":1.0},"116":{"tf":2.0},"134":{"tf":2.8284271247461903},"156":{"tf":1.0},"158":{"tf":2.0},"162":{"tf":1.0},"172":{"tf":1.7320508075688772},"173":{"tf":2.449489742783178},"175":{"tf":2.23606797749979},"176":{"tf":1.0},"185":{"tf":2.449489742783178},"188":{"tf":1.0},"199":{"tf":3.1622776601683795},"200":{"tf":1.7320508075688772},"206":{"tf":1.7320508075688772},"207":{"tf":1.0},"221":{"tf":1.4142135623730951},"229":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":2.0},"243":{"tf":1.0},"257":{"tf":1.7320508075688772},"258":{"tf":1.7320508075688772},"272":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.7320508075688772},"278":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"285":{"tf":2.23606797749979},"289":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"294":{"tf":2.6457513110645907},"298":{"tf":2.0},"299":{"tf":1.7320508075688772},"306":{"tf":1.0},"316":{"tf":1.7320508075688772},"318":{"tf":1.7320508075688772},"324":{"tf":2.0},"334":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951},"336":{"tf":1.0},"34":{"tf":2.0},"347":{"tf":1.0},"351":{"tf":2.23606797749979},"352":{"tf":2.0},"353":{"tf":2.0},"356":{"tf":1.4142135623730951},"358":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"361":{"tf":2.23606797749979},"362":{"tf":1.4142135623730951},"367":{"tf":1.4142135623730951},"368":{"tf":2.6457513110645907},"37":{"tf":1.4142135623730951},"374":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.4142135623730951},"385":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"49":{"tf":2.449489742783178},"51":{"tf":1.4142135623730951},"53":{"tf":1.7320508075688772},"54":{"tf":3.0},"56":{"tf":2.0},"57":{"tf":1.0},"58":{"tf":2.6457513110645907},"61":{"tf":2.6457513110645907},"62":{"tf":2.0},"70":{"tf":2.23606797749979},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":2.0},"77":{"tf":2.23606797749979},"78":{"tf":1.0},"79":{"tf":1.4142135623730951},"82":{"tf":2.8284271247461903},"83":{"tf":2.0},"84":{"tf":2.449489742783178},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"91":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":2.449489742783178},"97":{"tf":2.0}},"f":{"6":{"7":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"4":{"2":{"3":{"4":{"5":{"b":{"a":{"4":{"4":{"df":0,"docs":{},"f":{"6":{"df":0,"docs":{},"f":{"0":{"8":{"a":{"2":{"2":{"c":{"2":{"1":{"9":{"2":{"1":{"6":{"5":{"df":0,"docs":{},"f":{"4":{"b":{"0":{"df":0,"docs":{},"e":{"9":{"3":{"0":{"df":1,"docs":{"184":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"h":{"df":1,"docs":{"56":{"tf":1.0}}},"。":{"df":0,"docs":{},"i":{"df":1,"docs":{"277":{"tf":1.0}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}}}}},",":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"199":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"6":{".":{"4":{"4":{"df":1,"docs":{"38":{"tf":1.0}}},"df":1,"docs":{"54":{"tf":2.0}}},"5":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":6,"docs":{"328":{"tf":1.0},"43":{"tf":1.4142135623730951},"50":{"tf":2.0},"91":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"1":{"df":1,"docs":{"45":{"tf":1.7320508075688772}}},"2":{"d":{"4":{"4":{"1":{"0":{"6":{"0":{"d":{"6":{"6":{"df":0,"docs":{},"f":{"9":{"a":{"1":{"c":{"3":{"d":{"3":{"c":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"4":{"0":{"df":0,"docs":{},"f":{"8":{"1":{"7":{"d":{"1":{"a":{"a":{"df":1,"docs":{"317":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"df":1,"docs":{"53":{"tf":2.0}},"}":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"4":{"d":{"8":{"9":{"0":{"2":{"d":{"3":{"8":{"0":{"d":{"b":{"b":{"8":{"d":{"d":{"9":{"4":{"df":0,"docs":{},"e":{"d":{"2":{"df":0,"docs":{},"e":{"5":{"4":{"8":{"d":{"df":0,"docs":{},"f":{"c":{"0":{"a":{"a":{"8":{"0":{"c":{"0":{"7":{"c":{"b":{"df":1,"docs":{"209":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{",":{"2":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"4":{"c":{"4":{"5":{"6":{"1":{"df":0,"docs":{},"e":{"4":{"8":{"9":{"4":{"2":{"df":1,"docs":{"199":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"275":{"tf":1.0}}},"6":{"8":{"c":{"6":{"4":{"7":{"6":{"0":{"b":{"5":{"c":{"7":{"df":0,"docs":{},"e":{"a":{"6":{"5":{"4":{"df":0,"docs":{},"f":{"a":{"c":{"b":{"4":{"b":{"a":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"a":{"d":{"d":{"df":0,"docs":{},"f":{"d":{"a":{"2":{"7":{"c":{"c":{"df":1,"docs":{"138":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"9":{"a":{"d":{"c":{"6":{"df":0,"docs":{},"f":{"5":{"c":{"b":{"7":{"6":{"df":0,"docs":{},"f":{"6":{"df":0,"docs":{},"e":{"9":{"d":{"5":{"6":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"a":{"5":{"7":{"d":{"8":{"a":{"8":{"4":{"4":{"a":{"c":{"0":{"7":{"a":{"8":{"8":{"df":1,"docs":{"157":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":53,"docs":{"101":{"tf":2.449489742783178},"103":{"tf":2.23606797749979},"104":{"tf":1.4142135623730951},"105":{"tf":2.0},"108":{"tf":2.449489742783178},"116":{"tf":1.7320508075688772},"134":{"tf":2.0},"135":{"tf":1.0},"156":{"tf":1.0},"160":{"tf":1.4142135623730951},"161":{"tf":2.0},"162":{"tf":1.7320508075688772},"173":{"tf":1.0},"175":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"199":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"245":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.4142135623730951},"274":{"tf":1.0},"277":{"tf":1.7320508075688772},"278":{"tf":1.7320508075688772},"298":{"tf":1.4142135623730951},"299":{"tf":2.23606797749979},"300":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":2.0},"324":{"tf":1.4142135623730951},"334":{"tf":1.4142135623730951},"347":{"tf":1.0},"352":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"361":{"tf":2.8284271247461903},"368":{"tf":2.6457513110645907},"38":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"417":{"tf":1.4142135623730951},"430":{"tf":1.4142135623730951},"434":{"tf":2.6457513110645907},"45":{"tf":1.4142135623730951},"49":{"tf":2.0},"51":{"tf":1.7320508075688772},"57":{"tf":3.4641016151377544},"58":{"tf":1.0},"61":{"tf":1.7320508075688772},"73":{"tf":1.7320508075688772},"74":{"tf":1.7320508075688772},"78":{"tf":1.0},"84":{"tf":1.4142135623730951}},"e":{"2":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"7":{"c":{"0":{"df":0,"docs":{},"f":{"0":{"8":{"5":{"9":{"8":{"9":{"c":{"c":{"4":{"9":{"8":{"c":{"df":0,"docs":{},"e":{"c":{"1":{"3":{"9":{"df":0,"docs":{},"e":{"7":{"1":{"7":{"df":0,"docs":{},"e":{"2":{"a":{"df":0,"docs":{},"f":{"1":{"7":{"2":{"c":{"b":{"7":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"f":{"1":{"7":{"d":{"2":{"2":{"b":{"b":{"a":{"1":{"5":{"0":{"0":{"1":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"6":{"6":{"1":{"a":{"0":{"9":{"3":{"8":{"a":{"a":{"0":{"d":{"a":{"0":{"6":{"5":{"2":{"6":{"df":0,"docs":{},"e":{"7":{"b":{"8":{"df":0,"docs":{},"f":{"9":{"8":{"df":0,"docs":{},"f":{"d":{"7":{"df":0,"docs":{},"e":{"6":{"7":{"a":{"2":{"2":{"2":{"df":0,"docs":{},"f":{"df":2,"docs":{"345":{"tf":1.0},"354":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"73":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}},";":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.0}}}}}}}},"7":{"0":{"4":{"c":{"5":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"c":{"2":{"df":0,"docs":{},"f":{"2":{"6":{"a":{"0":{"1":{"3":{"3":{"a":{"df":0,"docs":{},"e":{"1":{"7":{"a":{"2":{"c":{"0":{"1":{"9":{"8":{"6":{"5":{"9":{"0":{"c":{"0":{"5":{"a":{"0":{"4":{"5":{"df":2,"docs":{"264":{"tf":1.0},"267":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"407":{"tf":1.4142135623730951}}},"5":{"4":{"df":1,"docs":{"53":{"tf":1.0}}},"df":4,"docs":{"289":{"tf":2.23606797749979},"290":{"tf":1.0},"322":{"tf":1.7320508075688772},"335":{"tf":1.0}},"m":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}}},"6":{"5":{"3":{"1":{"8":{"b":{"8":{"4":{"4":{"5":{"6":{"9":{"a":{"6":{"4":{"2":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"7":{"b":{"df":0,"docs":{},"f":{"1":{"a":{"d":{"a":{"b":{"9":{"6":{"3":{"9":{"c":{"b":{"df":0,"docs":{},"f":{"6":{"a":{"df":0,"docs":{},"f":{"3":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"8":{"7":{"8":{"df":1,"docs":{"397":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"7":{"7":{"4":{"0":{"a":{"5":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"1":{"4":{"5":{"8":{"d":{"7":{"4":{"df":0,"docs":{},"f":{"1":{"d":{"a":{"df":0,"docs":{},"f":{"8":{"5":{"df":0,"docs":{},"f":{"d":{"4":{"9":{"df":0,"docs":{},"e":{"0":{"3":{"a":{"a":{"a":{"9":{"7":{"c":{"df":0,"docs":{},"f":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":52,"docs":{"107":{"tf":2.23606797749979},"114":{"tf":2.449489742783178},"115":{"tf":2.6457513110645907},"116":{"tf":3.4641016151377544},"118":{"tf":1.4142135623730951},"119":{"tf":2.0},"120":{"tf":2.6457513110645907},"121":{"tf":3.3166247903554},"122":{"tf":2.23606797749979},"123":{"tf":1.7320508075688772},"125":{"tf":2.6457513110645907},"127":{"tf":2.449489742783178},"134":{"tf":1.0},"135":{"tf":1.7320508075688772},"156":{"tf":1.0},"161":{"tf":2.23606797749979},"162":{"tf":1.0},"173":{"tf":1.7320508075688772},"185":{"tf":1.4142135623730951},"188":{"tf":1.0},"199":{"tf":2.449489742783178},"200":{"tf":1.4142135623730951},"211":{"tf":1.0},"223":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0},"242":{"tf":2.449489742783178},"266":{"tf":1.4142135623730951},"278":{"tf":1.7320508075688772},"279":{"tf":1.0},"298":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"300":{"tf":1.4142135623730951},"318":{"tf":2.0},"324":{"tf":1.4142135623730951},"331":{"tf":1.0},"335":{"tf":1.4142135623730951},"352":{"tf":1.4142135623730951},"359":{"tf":2.0},"368":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.0},"417":{"tf":1.4142135623730951},"58":{"tf":1.0},"59":{"tf":1.4142135623730951},"61":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"78":{"tf":1.7320508075688772},"84":{"tf":1.7320508075688772}},":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"8":{".":{"0":{"df":1,"docs":{"428":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{"df":2,"docs":{"289":{"tf":1.0},"397":{"tf":1.4142135623730951}}},"2":{"df":0,"docs":{},"e":{"7":{"7":{"9":{"9":{"c":{"1":{"b":{"c":{"6":{"2":{"2":{"9":{"8":{"df":1,"docs":{"211":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"3":{"7":{"8":{"8":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"2":{"1":{"2":{"a":{"3":{"2":{"8":{"1":{"3":{"2":{"8":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"f":{"8":{"df":0,"docs":{},"f":{"2":{"2":{"3":{"c":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"0":{"df":0,"docs":{},"f":{"6":{"9":{"2":{"2":{"0":{"b":{"9":{"7":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"41":{"tf":1.0}}},"5":{"6":{"d":{"8":{"9":{"c":{"5":{"3":{"a":{"6":{"d":{"6":{"9":{"4":{"7":{"0":{"b":{"b":{"5":{"6":{"6":{"9":{"c":{"7":{"7":{"3":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"6":{"a":{"a":{"b":{"6":{"df":0,"docs":{},"f":{"c":{"c":{"9":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"1":{"2":{"c":{"4":{"a":{"5":{"8":{"0":{"1":{"b":{"6":{"1":{"df":0,"docs":{},"f":{"8":{"d":{"2":{"df":0,"docs":{},"e":{"9":{"5":{"2":{"df":0,"docs":{},"f":{"8":{"b":{"b":{"b":{"b":{"4":{"4":{"4":{"6":{"9":{"2":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"df":0,"docs":{},"e":{"c":{"2":{"df":2,"docs":{"81":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}},"a":{"df":0,"docs":{},"e":{"c":{"a":{"df":0,"docs":{},"e":{"3":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"5":{"c":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"9":{"df":0,"docs":{},"f":{"0":{"5":{"5":{"b":{"7":{"0":{"df":0,"docs":{},"f":{"0":{"5":{"d":{"9":{"a":{"3":{"df":0,"docs":{},"f":{"9":{"9":{"0":{"b":{"c":{"df":0,"docs":{},"e":{"7":{"b":{"df":1,"docs":{"297":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"f":{"0":{"4":{"9":{"6":{"b":{"b":{"8":{"df":0,"docs":{},"e":{"5":{"6":{"b":{"6":{"8":{"3":{"df":0,"docs":{},"e":{"a":{"3":{"df":0,"docs":{},"f":{"0":{"1":{"5":{"8":{"7":{"1":{"c":{"8":{"6":{"3":{"1":{"6":{"8":{"4":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"4":{"df":1,"docs":{"430":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":62,"docs":{"118":{"tf":1.4142135623730951},"132":{"tf":2.23606797749979},"133":{"tf":1.4142135623730951},"134":{"tf":2.8284271247461903},"135":{"tf":3.1622776601683795},"136":{"tf":1.4142135623730951},"137":{"tf":1.4142135623730951},"138":{"tf":1.7320508075688772},"139":{"tf":2.0},"140":{"tf":3.1622776601683795},"141":{"tf":3.3166247903554},"142":{"tf":3.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":2.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"149":{"tf":1.4142135623730951},"150":{"tf":2.6457513110645907},"152":{"tf":1.0},"161":{"tf":1.4142135623730951},"170":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"185":{"tf":1.0},"188":{"tf":1.0},"199":{"tf":2.8284271247461903},"202":{"tf":1.7320508075688772},"206":{"tf":1.7320508075688772},"224":{"tf":1.7320508075688772},"242":{"tf":1.4142135623730951},"270":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.0},"298":{"tf":1.4142135623730951},"299":{"tf":1.0},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"318":{"tf":2.0},"320":{"tf":1.0},"324":{"tf":1.4142135623730951},"333":{"tf":1.0},"335":{"tf":1.4142135623730951},"34":{"tf":1.0},"340":{"tf":1.4142135623730951},"353":{"tf":1.7320508075688772},"360":{"tf":2.23606797749979},"368":{"tf":1.4142135623730951},"398":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"417":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"58":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.4142135623730951},"78":{"tf":2.0},"88":{"tf":1.4142135623730951}},"f":{"d":{"2":{"3":{"2":{"7":{"df":0,"docs":{},"e":{"4":{"1":{"3":{"5":{"8":{"7":{"6":{"b":{"3":{"6":{"8":{"c":{"c":{"2":{"7":{"9":{"3":{"df":0,"docs":{},"e":{"b":{"4":{"a":{"7":{"df":0,"docs":{},"e":{"4":{"5":{"5":{"b":{"6":{"9":{"1":{"df":0,"docs":{},"f":{"0":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"、":{"1":{"6":{"df":1,"docs":{"360":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"9":{"0":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"1":{"5":{",":{"7":{"0":{"0":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"9":{"4":{"8":{"b":{"6":{"5":{"df":0,"docs":{},"e":{"8":{"8":{"9":{"6":{"0":{"b":{"4":{"df":5,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"f":{"b":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"f":{"8":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"9":{"a":{"8":{"1":{"4":{"c":{"df":0,"docs":{},"e":{"a":{"0":{"a":{"5":{"8":{"df":0,"docs":{},"e":{"9":{"c":{"0":{"1":{"9":{"c":{"5":{"2":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"4":{"a":{"df":1,"docs":{"177":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"3":{"7":{"7":{"8":{"4":{"b":{"8":{"7":{"0":{"8":{"c":{"2":{"4":{"3":{"1":{"4":{"7":{"0":{"7":{"3":{"7":{"8":{"a":{"d":{"4":{"2":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"e":{"b":{"1":{"2":{"a":{"3":{"3":{"4":{"b":{"b":{"d":{"df":1,"docs":{"337":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"5":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"9":{"3":{"1":{"1":{"7":{"0":{"4":{"0":{"4":{"c":{"b":{"9":{"8":{"d":{"4":{"7":{"6":{"b":{"1":{"9":{"0":{"1":{"7":{"c":{"b":{"b":{"d":{"b":{"c":{"0":{"0":{"d":{"0":{"8":{"3":{"4":{"d":{"df":3,"docs":{"373":{"tf":1.0},"379":{"tf":1.0},"387":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"6":{"d":{"4":{"b":{"0":{"df":0,"docs":{},"e":{"c":{"1":{"c":{"5":{"df":0,"docs":{},"e":{"0":{"1":{"9":{"b":{"8":{"5":{"6":{"0":{"4":{"c":{"3":{"3":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"6":{"8":{"b":{"3":{"df":0,"docs":{},"e":{"2":{"6":{"6":{"9":{"d":{"4":{"0":{"df":1,"docs":{"333":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"_":{"2":{"2":{"2":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"6":{"2":{"2":{"5":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"b":{"8":{"2":{"5":{"5":{"3":{"4":{"9":{"df":0,"docs":{},"e":{"c":{"0":{"d":{"c":{"2":{"3":{"5":{"4":{"3":{"3":{"5":{"3":{"0":{"df":0,"docs":{},"e":{"d":{"3":{"df":0,"docs":{},"f":{"b":{"5":{"3":{"4":{"df":1,"docs":{"403":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"df":2,"docs":{"156":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951}},"。":{"df":0,"docs":{},"下":{"df":0,"docs":{},"面":{"df":0,"docs":{},"的":{"df":0,"docs":{},"说":{"df":0,"docs":{},"明":{"df":0,"docs":{},"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"156":{"tf":1.0}}}}}}}}}}}}}},"c":{"0":{"df":0,"docs":{},"f":{"a":{"2":{"7":{"1":{"4":{"8":{"5":{"9":{"7":{"3":{"8":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"7":{"3":{"c":{"b":{"b":{"b":{"8":{"2":{"9":{"5":{"9":{"2":{"df":0,"docs":{},"e":{"4":{"c":{"0":{"3":{"7":{"d":{"7":{"df":0,"docs":{},"e":{"4":{"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"d":{"2":{"0":{"0":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"a":{"c":{"0":{"df":0,"docs":{},"f":{"c":{"9":{"4":{"df":3,"docs":{"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"9":{"4":{"3":{"5":{"5":{"6":{"a":{"6":{"0":{"0":{"1":{"b":{"8":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":44,"docs":{"107":{"tf":1.7320508075688772},"115":{"tf":1.0},"116":{"tf":1.0},"119":{"tf":1.4142135623730951},"136":{"tf":1.4142135623730951},"156":{"tf":2.449489742783178},"157":{"tf":2.23606797749979},"158":{"tf":2.449489742783178},"159":{"tf":1.0},"160":{"tf":1.7320508075688772},"161":{"tf":3.872983346207417},"162":{"tf":3.0},"167":{"tf":1.4142135623730951},"174":{"tf":1.0},"175":{"tf":1.7320508075688772},"185":{"tf":1.0},"186":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"224":{"tf":2.449489742783178},"225":{"tf":1.0},"242":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"285":{"tf":1.0},"298":{"tf":1.7320508075688772},"301":{"tf":2.0},"306":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951},"319":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":1.4142135623730951},"333":{"tf":1.0},"335":{"tf":1.4142135623730951},"336":{"tf":1.0},"353":{"tf":1.4142135623730951},"369":{"tf":1.4142135623730951},"402":{"tf":1.7320508075688772},"404":{"tf":1.4142135623730951},"405":{"tf":1.0},"417":{"tf":1.4142135623730951},"62":{"tf":2.0},"78":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}},"e":{"8":{"5":{"df":0,"docs":{},"f":{"c":{"c":{"9":{"9":{"3":{"8":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"f":{"8":{"c":{"9":{"3":{"5":{"d":{"0":{"a":{"d":{"8":{"b":{"4":{"d":{"b":{"7":{"df":0,"docs":{},"f":{"4":{"5":{"c":{"a":{"a":{"a":{"2":{"c":{"a":{"4":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"创":{"df":0,"docs":{},"建":{"df":0,"docs":{},"一":{"df":0,"docs":{},"个":{"df":0,"docs":{},"异":{"df":0,"docs":{},"步":{"df":0,"docs":{},"信":{"df":0,"docs":{},"道":{"df":0,"docs":{},"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"319":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}},"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"df":1,"docs":{"320":{"tf":1.0}}},"df":1,"docs":{"320":{"tf":1.0}},"|":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"306":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"306":{"tf":1.0},"320":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":27,"docs":{"107":{"tf":2.6457513110645907},"108":{"tf":2.0},"142":{"tf":1.0},"225":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"306":{"tf":2.23606797749979},"316":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.0},"347":{"tf":1.4142135623730951},"348":{"tf":1.0},"351":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.4142135623730951},"359":{"tf":1.0},"36":{"tf":1.4142135623730951},"360":{"tf":4.0},"361":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":2.0},"408":{"tf":1.4142135623730951},"417":{"tf":1.0},"45":{"tf":1.0},"52":{"tf":1.4142135623730951},"53":{"tf":1.0}},"i":{"df":1,"docs":{"427":{"tf":2.0}}},"s":{"df":1,"docs":{"360":{"tf":1.0}}},"x":{"df":1,"docs":{"360":{"tf":1.7320508075688772}}}},"a":{"'":{".":{".":{"=":{"'":{"df":0,"docs":{},"j":{"df":1,"docs":{"358":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"285":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"2":{"c":{"b":{"7":{"2":{"d":{"3":{"a":{"d":{"7":{"5":{"8":{"4":{"c":{"c":{"1":{"a":{"df":0,"docs":{},"e":{"3":{"b":{"8":{"5":{"df":0,"docs":{},"f":{"7":{"1":{"5":{"c":{"8":{"7":{"7":{"8":{"7":{"2":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"3":{"a":{"b":{"df":1,"docs":{"238":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"7":{"1":{"df":0,"docs":{},"f":{"8":{"2":{"b":{"0":{"9":{"1":{"6":{"c":{"df":0,"docs":{},"f":{"2":{"1":{"d":{"df":0,"docs":{},"e":{"2":{"d":{"5":{"6":{"b":{"d":{"3":{"8":{"6":{"c":{"a":{"5":{"d":{"7":{"2":{"df":0,"docs":{},"f":{"7":{"6":{"9":{"9":{"b":{"0":{"df":1,"docs":{"82":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"314":{"tf":1.0}}},"5":{"df":0,"docs":{},"e":{"0":{"c":{"5":{"b":{"2":{"c":{"5":{"df":0,"docs":{},"f":{"9":{"0":{"5":{"4":{"b":{"df":0,"docs":{},"e":{"3":{"b":{"9":{"6":{"1":{"a":{"df":0,"docs":{},"e":{"a":{"2":{"c":{"7":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"a":{"5":{"9":{"1":{"d":{"df":0,"docs":{},"e":{"8":{"df":1,"docs":{"64":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"8":{"5":{"3":{"6":{"1":{"8":{"9":{"d":{"5":{"df":0,"docs":{},"f":{"1":{"b":{"a":{"2":{"df":0,"docs":{},"f":{"0":{"b":{"1":{"1":{"8":{"7":{"b":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"e":{"7":{"8":{"7":{"c":{"0":{"d":{"8":{"9":{"df":0,"docs":{},"e":{"2":{"8":{"7":{"1":{"c":{"df":1,"docs":{"364":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"0":{"df":1,"docs":{"54":{"tf":1.0}}},"1":{".":{".":{"3":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"54":{"tf":1.0},"62":{"tf":1.0}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"72":{"tf":1.7320508075688772}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"353":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"b":{"c":{"a":{"b":{"c":{"a":{"b":{"c":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":1,"docs":{"186":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"df":0,"docs":{},"k":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"v":{"df":0,"docs":{},"w":{"df":0,"docs":{},"x":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"0":{"1":{"2":{"3":{"4":{"5":{"df":1,"docs":{"259":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"368":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"368":{"tf":2.23606797749979}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"155":{"tf":1.7320508075688772}}}}},"s":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"102":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"115":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"252":{"tf":1.0},"413":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"1":{"6":{"1":{"8":{"4":{"a":{"7":{"df":0,"docs":{},"f":{"5":{"6":{"d":{"1":{"7":{"d":{"a":{"a":{"9":{"c":{"4":{"c":{"7":{"6":{"9":{"0":{"1":{"3":{"7":{"1":{"0":{"8":{"5":{"d":{"c":{"0":{"a":{"c":{"4":{"3":{"df":1,"docs":{"131":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":5,"docs":{"162":{"tf":1.0},"214":{"tf":1.0},"242":{"tf":1.0},"398":{"tf":1.7320508075688772},"70":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"258":{"tf":2.0},"368":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":4,"docs":{"82":{"tf":2.8284271247461903},"83":{"tf":1.4142135623730951},"84":{"tf":2.8284271247461903},"87":{"tf":2.0}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"300":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"200":{"tf":1.0},"335":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"245":{"tf":1.0},"246":{"tf":1.0}}}}}}},"d":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"2":{"df":4,"docs":{"198":{"tf":1.7320508075688772},"203":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":4,"docs":{"198":{"tf":1.7320508075688772},"203":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"141":{"tf":1.0},"375":{"tf":1.7320508075688772}}}}}}},"/":{"a":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"265":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"265":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"<":{"&":{"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"375":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"h":{"df":1,"docs":{"102":{"tf":1.0}},"s":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"375":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"107":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"257":{"tf":2.6457513110645907},"265":{"tf":1.0},"266":{"tf":5.744562646538029},"385":{"tf":1.7320508075688772}},"e":{"(":{"2":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{},"x":{"df":3,"docs":{"257":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"385":{"tf":1.0}}}},"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":2.0}},"s":{":":{"1":{":":{"5":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"266":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"1":{"df":1,"docs":{"240":{"tf":1.0}}},"2":{"df":1,"docs":{"240":{"tf":1.0}}},"3":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"4":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":3,"docs":{"339":{"tf":2.23606797749979},"340":{"tf":1.0},"343":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"3":{"df":1,"docs":{"369":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"369":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"114":{"tf":1.4142135623730951},"115":{"tf":3.605551275463989},"116":{"tf":3.7416573867739413},"120":{"tf":2.23606797749979},"121":{"tf":2.23606797749979},"123":{"tf":1.4142135623730951},"127":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"(":{"1":{"0":{"0":{"df":1,"docs":{"207":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":3,"docs":{"200":{"tf":2.0},"207":{"tf":1.0},"211":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"207":{"tf":1.0}}},"a":{"df":3,"docs":{"200":{"tf":1.4142135623730951},"207":{"tf":1.0},"210":{"tf":1.0}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":5,"docs":{"196":{"tf":1.4142135623730951},"200":{"tf":1.7320508075688772},"207":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":15,"docs":{"102":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"152":{"tf":1.0},"207":{"tf":2.0},"257":{"tf":1.4142135623730951},"265":{"tf":2.23606797749979},"266":{"tf":2.23606797749979},"316":{"tf":1.7320508075688772},"331":{"tf":1.0},"368":{"tf":1.7320508075688772},"375":{"tf":4.0},"416":{"tf":1.0},"426":{"tf":1.0},"428":{"tf":1.0},"91":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":2.0}},"s":{":":{"2":{":":{"5":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":8,"docs":{"198":{"tf":3.3166247903554},"200":{"tf":1.7320508075688772},"207":{"tf":2.0},"208":{"tf":2.0},"210":{"tf":1.0},"211":{"tf":3.0},"265":{"tf":2.8284271247461903},"266":{"tf":4.0}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"101":{"tf":2.23606797749979},"165":{"tf":1.0},"367":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951}}}}}},"、":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"331":{"tf":2.0}}}}}}}}},"df":3,"docs":{"106":{"tf":1.0},"162":{"tf":1.0},"241":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"364":{"tf":1.0},"373":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"180":{"tf":1.0},"182":{"tf":1.0},"273":{"tf":1.0},"62":{"tf":2.23606797749979}}}}},"df":1,"docs":{"348":{"tf":3.0}},"e":{"=":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"180":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"179":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"178":{"tf":1.0},"179":{"tf":2.8284271247461903}}}}}},"o":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"b":{"a":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":1,"docs":{"328":{"tf":1.0}}},"s":{"df":0,"docs":{},"k":{"a":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"183":{"tf":1.0},"381":{"tf":1.0}},"s":{"df":1,"docs":{"379":{"tf":1.0}}}},"df":0,"docs":{},"v":{"df":1,"docs":{"398":{"tf":1.0}}}},"l":{"df":0,"docs":{},"o":{"c":{":":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{":":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"t":{",":{"a":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"66":{"tf":1.0},"70":{"tf":1.4142135623730951}}},"df":0,"docs":{},"w":{"df":2,"docs":{"283":{"tf":1.0},"316":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"191":{"tf":1.0},"290":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"386":{"tf":1.0},"431":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"353":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"86":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"152":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":3,"docs":{"20":{"tf":1.0},"4":{"tf":1.0},"429":{"tf":2.449489742783178}}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"203":{"tf":1.0},"208":{"tf":1.0}}},"df":0,"docs":{}}}},"df":2,"docs":{"203":{"tf":1.0},"208":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"213":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{":":{":":{"b":{"a":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},">":{":":{":":{"b":{"a":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"376":{"tf":4.242640687119285}}}},"n":{"df":1,"docs":{"194":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"52":{"tf":1.0},"53":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"192":{"tf":2.23606797749979}},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"。":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"194":{"tf":1.0}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"162":{"tf":1.0},"198":{"tf":2.0},"362":{"tf":1.0},"55":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"55":{"tf":2.449489742783178},"56":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"5":{"df":1,"docs":{"56":{"tf":1.0}}},"df":0,"docs":{},"x":{"df":1,"docs":{"56":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"142":{"tf":1.7320508075688772},"257":{"tf":2.0},"385":{"tf":2.0}}}}}}},"p":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"260":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":45,"docs":{"109":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.4142135623730951},"123":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"146":{"tf":1.0},"150":{"tf":1.4142135623730951},"152":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"198":{"tf":1.0},"212":{"tf":1.0},"226":{"tf":1.0},"245":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":2.8284271247461903},"259":{"tf":2.0},"261":{"tf":1.0},"270":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"299":{"tf":1.0},"306":{"tf":2.0},"307":{"tf":1.0},"313":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.4142135623730951},"318":{"tf":1.7320508075688772},"319":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":2.0},"337":{"tf":1.0},"366":{"tf":1.0},"374":{"tf":1.0},"380":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"408":{"tf":1.0},"78":{"tf":1.7320508075688772},"93":{"tf":1.0}},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"297":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":8,"docs":{"410":{"tf":1.0},"411":{"tf":1.0},"415":{"tf":1.0},"418":{"tf":1.0},"425":{"tf":1.0},"430":{"tf":1.0},"431":{"tf":1.0},"432":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}},"l":{"df":2,"docs":{"152":{"tf":1.0},"34":{"tf":1.7320508075688772}},"i":{"c":{"df":6,"docs":{"111":{"tf":1.0},"214":{"tf":1.0},"265":{"tf":1.0},"368":{"tf":1.0},"392":{"tf":1.0},"397":{"tf":1.0}}},"df":1,"docs":{"172":{"tf":1.0}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"342":{"tf":2.8284271247461903},"343":{"tf":2.8284271247461903}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"342":{"tf":3.4641016151377544},"343":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"428":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"306":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"0":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{">":{">":{"df":0,"docs":{},"。":{"a":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"t":{"df":4,"docs":{"306":{"tf":2.23606797749979},"307":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0}}}},"df":3,"docs":{"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"h":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"93":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"89":{"tf":1.0}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"89":{"tf":1.0}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"1":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":1,"docs":{"88":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":6,"docs":{"428":{"tf":1.4142135623730951},"88":{"tf":2.449489742783178},"89":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"93":{"tf":2.8284271247461903}}},"df":0,"docs":{}},"g":{"df":16,"docs":{"215":{"tf":2.0},"216":{"tf":2.23606797749979},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":2.0},"223":{"tf":1.0},"224":{"tf":2.449489742783178},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":3.605551275463989},"250":{"tf":1.7320508075688772},"257":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":9,"docs":{"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"249":{"tf":1.7320508075688772},"250":{"tf":1.7320508075688772}}}}}}},"[":{"0":{"df":1,"docs":{"217":{"tf":1.0}}},"1":{"]":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"2":{"]":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"224":{"tf":2.8284271247461903},"225":{"tf":2.449489742783178},"226":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"234":{"tf":1.4142135623730951},"235":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"249":{"tf":2.0},"250":{"tf":1.0},"299":{"tf":1.0},"42":{"tf":1.0},"56":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"214":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":4,"docs":{"106":{"tf":1.0},"376":{"tf":2.23606797749979},"42":{"tf":1.0},"61":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{":":{":":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":3.7416573867739413}},"i":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"180":{"tf":1.7320508075688772}},"e":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"180":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}}},"s":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":2,"docs":{"399":{"tf":1.0},"77":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":5,"docs":{"145":{"tf":1.0},"358":{"tf":1.7320508075688772},"417":{"tf":1.0},"53":{"tf":1.0},"78":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":1,"docs":{"401":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"113":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"!":{"(":{"!":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"#":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"414":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":3,"docs":{"405":{"tf":3.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"203":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"、":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"201":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"!":{"(":{"\"":{"df":0,"docs":{},"i":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}},"*":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951}}}}}}}}},"0":{"df":1,"docs":{"359":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"266":{"tf":1.0}}},"5":{"df":4,"docs":{"277":{"tf":2.0},"278":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"280":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"359":{"tf":1.4142135623730951}}},"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"(":{"2":{"df":1,"docs":{"200":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"368":{"tf":1.0}}},"b":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}},"e":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"162":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{")":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"289":{"tf":1.0},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"289":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":6,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"245":{"tf":1.0}}}}},"v":{"1":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"246":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"!":{"[":{"\"":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":18,"docs":{"162":{"tf":1.0},"198":{"tf":1.0},"200":{"tf":3.0},"201":{"tf":1.0},"203":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":2.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0},"257":{"tf":1.0},"277":{"tf":1.0},"280":{"tf":1.0},"337":{"tf":1.4142135623730951},"343":{"tf":1.4142135623730951},"375":{"tf":1.0},"419":{"tf":1.0},"420":{"tf":1.0}}}},"n":{"df":2,"docs":{"200":{"tf":2.0},"201":{"tf":1.4142135623730951}}}},"df":6,"docs":{"199":{"tf":3.1622776601683795},"200":{"tf":2.23606797749979},"201":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"228":{"tf":1.0},"405":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"49":{"tf":2.0},"57":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":7,"docs":{"244":{"tf":1.0},"34":{"tf":1.0},"374":{"tf":1.0},"376":{"tf":1.4142135623730951},"377":{"tf":1.0},"405":{"tf":1.4142135623730951},"96":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{".":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":1,"docs":{"391":{"tf":1.4142135623730951}}},"y":{"df":0,"docs":{},"n":{"c":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"317":{"tf":1.0}}},"df":0,"docs":{}}},"df":18,"docs":{"10":{"tf":1.0},"313":{"tf":2.23606797749979},"314":{"tf":1.7320508075688772},"315":{"tf":3.7416573867739413},"316":{"tf":5.830951894845301},"317":{"tf":2.0},"318":{"tf":2.0},"319":{"tf":3.605551275463989},"320":{"tf":5.830951894845301},"321":{"tf":1.7320508075688772},"322":{"tf":3.0},"323":{"tf":2.8284271247461903},"324":{"tf":1.0},"325":{"tf":1.0},"326":{"tf":2.0},"327":{"tf":1.0},"405":{"tf":1.4142135623730951},"412":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":2,"docs":{"337":{"tf":1.4142135623730951},"343":{"tf":2.0}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"306":{"tf":1.7320508075688772}},"i":{"c":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"198":{"tf":1.0},"387":{"tf":1.0},"91":{"tf":1.0}}}}},"df":0,"docs":{}}}},")":{"df":0,"docs":{},"一":{"df":0,"docs":{},"些":{"df":0,"docs":{},"其":{"df":0,"docs":{},"他":{"df":0,"docs":{},"数":{"df":0,"docs":{},"据":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"270":{"tf":1.0}}}}}}}}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"180":{"tf":1.4142135623730951},"376":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":3.4641016151377544}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"331":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":3.1622776601683795}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"10":{"tf":1.0},"313":{"tf":1.7320508075688772},"314":{"tf":1.4142135623730951},"315":{"tf":2.23606797749979},"316":{"tf":3.4641016151377544},"317":{"tf":1.0},"318":{"tf":3.4641016151377544},"319":{"tf":3.605551275463989},"320":{"tf":1.7320508075688772},"321":{"tf":2.8284271247461903},"322":{"tf":3.3166247903554},"323":{"tf":2.0},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"412":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"359":{"tf":2.23606797749979}}}},"y":{"df":1,"docs":{"152":{"tf":1.0}}},"、":{"b":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"👍":{"%":{"df":0,"docs":{},",":{"df":0,"docs":{},"就":{"df":0,"docs":{},"无":{"df":0,"docs":{},"法":{"df":0,"docs":{},"将":{"df":0,"docs":{},"其":{"df":0,"docs":{},"转":{"df":0,"docs":{},"换":{"df":0,"docs":{},"为":{"df":0,"docs":{},"一":{"df":0,"docs":{},"个":{"df":0,"docs":{},"数":{"df":0,"docs":{},"字":{"df":0,"docs":{},"。":{"df":0,"docs":{},"因":{"df":0,"docs":{},"此":{"df":0,"docs":{},",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}}},"b":{"'":{"a":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.0}}}}},"df":0,"docs":{}}},"3":{"2":{"3":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"9":{"a":{"1":{"5":{"6":{"df":0,"docs":{},"f":{"7":{"4":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"314":{"tf":1.0}}},">":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}}}},"a":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":2.8284271247461903}}},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":4.242640687119285}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"118":{"tf":2.0},"119":{"tf":1.4142135623730951}},"e":{":":{":":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"l":{"a":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"114":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"348":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"434":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":18,"docs":{"143":{"tf":1.0},"155":{"tf":1.7320508075688772},"156":{"tf":3.7416573867739413},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"277":{"tf":1.0},"290":{"tf":1.0},"301":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0},"70":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"113":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}}}}},"r":{"df":2,"docs":{"141":{"tf":1.0},"382":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"273":{"tf":1.0}}}}},"b":{"7":{"df":0,"docs":{},"e":{"4":{"2":{"9":{"a":{"d":{"6":{"b":{"5":{"9":{"d":{"9":{"a":{"0":{"c":{"3":{"7":{"d":{"b":{"7":{"4":{"3":{"4":{"9":{"7":{"6":{"3":{"6":{"4":{"c":{"b":{"b":{"9":{"c":{"6":{"d":{"a":{"df":3,"docs":{"100":{"tf":1.0},"108":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":26,"docs":{"10":{"tf":1.0},"114":{"tf":1.7320508075688772},"144":{"tf":1.0},"185":{"tf":2.8284271247461903},"191":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"272":{"tf":2.23606797749979},"285":{"tf":3.3166247903554},"286":{"tf":2.0},"291":{"tf":2.0},"293":{"tf":4.242640687119285},"314":{"tf":1.7320508075688772},"316":{"tf":1.0},"320":{"tf":1.7320508075688772},"322":{"tf":3.872983346207417},"325":{"tf":1.0},"350":{"tf":1.4142135623730951},"359":{"tf":2.8284271247461903},"368":{"tf":1.0},"415":{"tf":1.7320508075688772},"416":{"tf":1.7320508075688772},"417":{"tf":4.795831523312719},"53":{"tf":1.0},"66":{"tf":1.4142135623730951},"77":{"tf":2.23606797749979},"78":{"tf":2.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"413":{"tf":1.0}}}}},"df":1,"docs":{"106":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"241":{"tf":1.7320508075688772},"283":{"tf":2.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"289":{"tf":1.0},"407":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}},"n":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"252":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":1,"docs":{"252":{"tf":1.4142135623730951}},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"198":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}},"t":{"a":{"df":3,"docs":{"434":{"tf":4.58257569495584},"435":{"tf":1.0},"436":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"252":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"167":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772}}}}}}}},"i":{"df":0,"docs":{},"g":{"!":{"df":0,"docs":{},"。":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":8,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"74":{"tf":1.0}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"102":{"tf":1.7320508075688772}}}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":7,"docs":{"111":{"tf":1.0},"172":{"tf":1.0},"214":{"tf":1.0},"265":{"tf":1.0},"368":{"tf":1.0},"397":{"tf":1.0},"53":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"267":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"d":{"df":5,"docs":{"185":{"tf":1.0},"188":{"tf":1.0},"353":{"tf":1.4142135623730951},"397":{"tf":1.7320508075688772},"49":{"tf":1.0}}},"df":46,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"225":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"246":{"tf":1.0},"267":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"405":{"tf":1.7320508075688772},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"194":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"a":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"53":{"tf":2.23606797749979}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}}}}}},"j":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"183":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"@":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"2":{"2":{":":{"2":{"2":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"2":{"3":{"df":1,"docs":{"320":{"tf":3.605551275463989}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"319":{"tf":1.0}}}}},"df":4,"docs":{"298":{"tf":1.0},"313":{"tf":1.0},"320":{"tf":2.8284271247461903},"368":{"tf":1.0}}}},"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"337":{"tf":1.7320508075688772},"343":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":6,"docs":{"148":{"tf":1.0},"150":{"tf":1.4142135623730951},"239":{"tf":1.7320508075688772},"258":{"tf":1.4142135623730951},"348":{"tf":1.0},"359":{"tf":1.7320508075688772}}}}},"o":{"d":{"df":0,"docs":{},"i":{"df":6,"docs":{"229":{"tf":1.7320508075688772},"398":{"tf":1.4142135623730951},"399":{"tf":1.7320508075688772},"400":{"tf":2.23606797749979},"401":{"tf":1.7320508075688772},"58":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0}}},"o":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"0":{"tf":1.4142135623730951},"142":{"tf":1.0},"389":{"tf":1.0}}},"l":{"df":21,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":2.449489742783178},"181":{"tf":1.4142135623730951},"182":{"tf":2.23606797749979},"199":{"tf":2.0},"232":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0},"320":{"tf":1.0},"414":{"tf":1.7320508075688772},"53":{"tf":1.4142135623730951},"61":{"tf":2.0},"70":{"tf":1.0},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.7320508075688772},"93":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"289":{"tf":1.0},"290":{"tf":1.7320508075688772},"291":{"tf":1.4142135623730951},"293":{"tf":1.0},"294":{"tf":1.0}}}}}},"df":18,"docs":{"134":{"tf":2.23606797749979},"185":{"tf":2.0},"186":{"tf":1.4142135623730951},"188":{"tf":1.7320508075688772},"189":{"tf":1.0},"228":{"tf":1.4142135623730951},"289":{"tf":2.8284271247461903},"290":{"tf":2.0},"299":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"368":{"tf":2.0},"405":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.7320508075688772},"74":{"tf":3.0},"75":{"tf":2.23606797749979},"78":{"tf":2.23606797749979}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}}}}}},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":2.0}}}}}},"df":0,"docs":{}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"173":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}},"df":1,"docs":{"330":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":25,"docs":{"156":{"tf":1.4142135623730951},"177":{"tf":1.0},"181":{"tf":3.4641016151377544},"183":{"tf":2.6457513110645907},"194":{"tf":2.0},"195":{"tf":1.4142135623730951},"219":{"tf":1.0},"224":{"tf":1.4142135623730951},"242":{"tf":2.0},"249":{"tf":1.0},"306":{"tf":1.4142135623730951},"309":{"tf":1.0},"313":{"tf":1.7320508075688772},"320":{"tf":3.1622776601683795},"332":{"tf":1.4142135623730951},"334":{"tf":2.0},"335":{"tf":1.0},"336":{"tf":1.0},"377":{"tf":2.449489742783178},"383":{"tf":1.4142135623730951},"385":{"tf":1.0},"405":{"tf":2.0},"415":{"tf":1.0},"417":{"tf":1.4142135623730951},"54":{"tf":1.0}},",":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"181":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"x":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"5":{"df":1,"docs":{"272":{"tf":1.0}}},"a":{"df":1,"docs":{"285":{"tf":2.0}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"1":{"0":{"df":1,"docs":{"285":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"275":{"tf":1.0}}},"3":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":3,"docs":{"405":{"tf":1.7320508075688772},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"275":{"tf":1.0},"285":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}}}}}}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"335":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"x":{"df":1,"docs":{"278":{"tf":1.0}}},"|":{"df":0,"docs":{},"x":{"df":1,"docs":{"386":{"tf":1.4142135623730951}}}}},"df":3,"docs":{"320":{"tf":2.0},"381":{"tf":2.0},"386":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"320":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"<":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"334":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":20,"docs":{"162":{"tf":2.6457513110645907},"225":{"tf":2.23606797749979},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"334":{"tf":1.0},"335":{"tf":1.4142135623730951},"338":{"tf":1.0},"341":{"tf":1.7320508075688772},"342":{"tf":5.0},"381":{"tf":2.23606797749979},"383":{"tf":1.0},"386":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"278":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"273":{"tf":1.0},"275":{"tf":1.4142135623730951},"285":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"341":{"tf":2.23606797749979},"342":{"tf":4.898979485566356}}}}},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"335":{"tf":1.0},"383":{"tf":1.0}}}}},"t":{">":{"df":0,"docs":{},"。":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"271":{"tf":1.0}}}}},"df":0,"docs":{}},",":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":15,"docs":{"270":{"tf":1.0},"271":{"tf":1.7320508075688772},"272":{"tf":2.23606797749979},"273":{"tf":1.0},"274":{"tf":1.0},"275":{"tf":3.0},"276":{"tf":1.4142135623730951},"278":{"tf":2.6457513110645907},"279":{"tf":2.23606797749979},"283":{"tf":1.4142135623730951},"285":{"tf":2.0},"288":{"tf":2.0},"295":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"334":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"{":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"320":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":14,"docs":{"271":{"tf":2.0},"272":{"tf":2.8284271247461903},"273":{"tf":2.449489742783178},"275":{"tf":3.0},"283":{"tf":1.0},"320":{"tf":2.0},"334":{"tf":1.0},"335":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"341":{"tf":1.0},"342":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":1.0},"413":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{".":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"294":{"tf":5.477225575051661},"61":{"tf":3.4641016151377544}},"。":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"398":{"tf":1.0},"417":{"tf":1.7320508075688772},"431":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"k":{"df":9,"docs":{"167":{"tf":1.0},"240":{"tf":1.0},"273":{"tf":1.0},"382":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951},"412":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"62":{"tf":3.605551275463989}},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":8,"docs":{"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":5,"docs":{"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"381":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}}},"df":2,"docs":{"156":{"tf":1.0},"252":{"tf":1.7320508075688772}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":8,"docs":{"398":{"tf":2.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"g":{"df":25,"docs":{"102":{"tf":1.0},"106":{"tf":1.7320508075688772},"153":{"tf":1.0},"156":{"tf":1.0},"167":{"tf":1.0},"196":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.7320508075688772},"212":{"tf":1.4142135623730951},"296":{"tf":1.7320508075688772},"297":{"tf":1.0},"312":{"tf":1.0},"343":{"tf":1.0},"366":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"433":{"tf":1.0},"434":{"tf":1.0},"49":{"tf":1.0},"62":{"tf":1.0},"70":{"tf":1.4142135623730951},"77":{"tf":1.0},"78":{"tf":1.4142135623730951}},"!":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"200":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.0},"250":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"405":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"82":{"tf":1.4142135623730951},"83":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"82":{"tf":1.0},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":28,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"15":{"tf":1.0},"156":{"tf":1.0},"210":{"tf":1.0},"224":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.0},"249":{"tf":2.0},"250":{"tf":1.0},"255":{"tf":2.23606797749979},"265":{"tf":1.4142135623730951},"266":{"tf":2.23606797749979},"27":{"tf":2.6457513110645907},"277":{"tf":1.0},"28":{"tf":1.4142135623730951},"29":{"tf":1.0},"301":{"tf":1.0},"36":{"tf":1.0},"386":{"tf":1.0},"391":{"tf":1.7320508075688772},"40":{"tf":2.449489742783178},"405":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.0},"52":{"tf":1.0},"70":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{}},")":{"df":0,"docs":{},",":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"155":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"333":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":3.4641016151377544}},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"333":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":6,"docs":{"143":{"tf":1.4142135623730951},"144":{"tf":1.4142135623730951},"191":{"tf":1.0},"53":{"tf":1.4142135623730951},"77":{"tf":2.23606797749979},"78":{"tf":2.0}},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"df":0,"docs":{}},"9":{"5":{".":{".":{"1":{"0":{"3":{"df":1,"docs":{"391":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"191":{"tf":1.0},"77":{"tf":2.23606797749979},"78":{"tf":2.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"c":{"+":{"+":{"df":0,"docs":{},"”":{"df":0,"docs":{},"(":{"2":{"0":{"1":{"2":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},".":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"/":{"c":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"0":{"6":{"0":{"0":{"6":{"1":{"5":{"7":{"b":{"1":{"4":{"b":{"3":{"d":{"4":{"7":{"b":{"5":{"c":{"7":{"1":{"6":{"df":0,"docs":{},"f":{"c":{"3":{"9":{"2":{"b":{"7":{"7":{"df":0,"docs":{},"f":{"3":{"b":{"2":{"df":0,"docs":{},"e":{"2":{"1":{"c":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"d":{"d":{"d":{"a":{"c":{"6":{"9":{"2":{"8":{"4":{"8":{"a":{"d":{"df":0,"docs":{},"e":{"6":{"c":{"2":{"1":{"1":{"2":{"c":{"8":{"df":0,"docs":{},"e":{"1":{"5":{"a":{"7":{"0":{"8":{"7":{"df":0,"docs":{},"f":{"b":{"b":{"df":0,"docs":{},"e":{"c":{"4":{"5":{"df":1,"docs":{"418":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"4":{"b":{"d":{"d":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"3":{"2":{"8":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"e":{"7":{"7":{"4":{"d":{"df":0,"docs":{},"f":{"1":{"9":{"8":{"8":{"2":{"c":{"c":{"c":{"1":{"3":{"9":{"5":{"3":{"2":{"df":0,"docs":{},"e":{"5":{"3":{"d":{"8":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"7":{"7":{"d":{"7":{"a":{"1":{"2":{"7":{"9":{"d":{"b":{"c":{"7":{"a":{"9":{"d":{"7":{"6":{"df":0,"docs":{},"e":{"8":{"0":{"c":{"5":{"a":{"c":{"9":{"d":{"7":{"4":{"2":{"d":{"d":{"5":{"2":{"9":{"5":{"3":{"8":{"c":{"df":3,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"398":{"tf":1.0}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"62":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"73":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":2,"docs":{"72":{"tf":1.0},"73":{"tf":1.7320508075688772}},"s":{"1":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"73":{"tf":2.0}}}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"c":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":15,"docs":{"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"154":{"tf":1.0},"159":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":2.449489742783178},"242":{"tf":1.4142135623730951},"283":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"322":{"tf":1.0},"330":{"tf":1.0},"368":{"tf":2.0},"376":{"tf":3.1622776601683795},"407":{"tf":1.0}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"277":{"tf":1.0},"360":{"tf":1.0}}}},"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"199":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"199":{"tf":2.8284271247461903},"95":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":2.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":1.7320508075688772}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":7,"docs":{"113":{"tf":1.0},"211":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"266":{"tf":2.449489742783178},"27":{"tf":1.0},"40":{"tf":3.0}}}},"df":0,"docs":{}}},"m":{"d":{"df":3,"docs":{"25":{"tf":1.0},"254":{"tf":1.0},"268":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":15,"docs":{"111":{"tf":2.0},"113":{"tf":1.0},"124":{"tf":2.23606797749979},"155":{"tf":1.0},"211":{"tf":1.4142135623730951},"255":{"tf":2.23606797749979},"26":{"tf":2.6457513110645907},"260":{"tf":2.6457513110645907},"262":{"tf":1.0},"265":{"tf":2.23606797749979},"266":{"tf":2.8284271247461903},"32":{"tf":1.4142135623730951},"391":{"tf":1.7320508075688772},"40":{"tf":2.449489742783178},"430":{"tf":1.4142135623730951}}}}}}},"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"267":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"259":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":141,"docs":{"10":{"tf":1.4142135623730951},"102":{"tf":1.0},"106":{"tf":1.0},"110":{"tf":1.4142135623730951},"111":{"tf":3.3166247903554},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.0},"124":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":2.0},"157":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":3.3166247903554},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"203":{"tf":1.0},"204":{"tf":3.0},"205":{"tf":1.0},"206":{"tf":2.0},"207":{"tf":2.6457513110645907},"208":{"tf":2.6457513110645907},"210":{"tf":2.23606797749979},"211":{"tf":3.1622776601683795},"214":{"tf":2.23606797749979},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"232":{"tf":2.0},"234":{"tf":1.0},"235":{"tf":1.4142135623730951},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"246":{"tf":1.0},"25":{"tf":3.605551275463989},"253":{"tf":1.0},"254":{"tf":2.6457513110645907},"255":{"tf":3.1622776601683795},"256":{"tf":1.4142135623730951},"257":{"tf":2.449489742783178},"258":{"tf":1.7320508075688772},"259":{"tf":2.0},"26":{"tf":4.58257569495584},"260":{"tf":2.23606797749979},"261":{"tf":1.7320508075688772},"262":{"tf":1.4142135623730951},"263":{"tf":2.449489742783178},"264":{"tf":2.23606797749979},"265":{"tf":2.449489742783178},"266":{"tf":4.358898943540674},"267":{"tf":2.8284271247461903},"268":{"tf":3.872983346207417},"269":{"tf":1.7320508075688772},"27":{"tf":5.5677643628300215},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"285":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":1.4142135623730951},"29":{"tf":2.6457513110645907},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"32":{"tf":2.449489742783178},"335":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"38":{"tf":1.4142135623730951},"386":{"tf":1.0},"391":{"tf":2.23606797749979},"397":{"tf":1.7320508075688772},"398":{"tf":1.0},"399":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":5.291502622129181},"400":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":3.3166247903554},"407":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951},"41":{"tf":2.23606797749979},"42":{"tf":1.4142135623730951},"426":{"tf":2.0},"427":{"tf":2.23606797749979},"428":{"tf":1.7320508075688772},"43":{"tf":1.0},"430":{"tf":1.4142135623730951},"45":{"tf":1.0},"49":{"tf":2.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.7320508075688772},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":2.449489742783178},"62":{"tf":1.7320508075688772},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"436":{"tf":1.0}}}}}}}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"398":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.4142135623730951},"232":{"tf":2.23606797749979},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}}},"df":5,"docs":{"106":{"tf":1.0},"273":{"tf":1.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951}}},"t":{"df":2,"docs":{"320":{"tf":1.0},"335":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"102":{"tf":1.0},"260":{"tf":1.0}}}}},"d":{"df":10,"docs":{"198":{"tf":1.0},"21":{"tf":2.0},"214":{"tf":1.0},"26":{"tf":1.0},"265":{"tf":1.0},"29":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"397":{"tf":1.0},"436":{"tf":1.0}}},"df":40,"docs":{"10":{"tf":1.0},"144":{"tf":1.0},"15":{"tf":2.23606797749979},"156":{"tf":1.0},"172":{"tf":1.0},"175":{"tf":1.4142135623730951},"200":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.4142135623730951},"252":{"tf":2.23606797749979},"270":{"tf":1.0},"283":{"tf":2.23606797749979},"285":{"tf":3.0},"286":{"tf":2.8284271247461903},"291":{"tf":2.449489742783178},"319":{"tf":1.0},"320":{"tf":1.7320508075688772},"325":{"tf":1.0},"350":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"367":{"tf":1.0},"368":{"tf":3.1622776601683795},"371":{"tf":1.0},"385":{"tf":1.0},"388":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"418":{"tf":1.7320508075688772},"419":{"tf":1.0},"420":{"tf":1.0},"421":{"tf":1.0},"422":{"tf":1.0},"423":{"tf":1.0},"424":{"tf":1.0},"43":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":1.0},"62":{"tf":2.0},"70":{"tf":1.4142135623730951},"91":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"431":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"310":{"tf":1.0}}}},"df":1,"docs":{"307":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":23,"docs":{"198":{"tf":2.0},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":2.6457513110645907},"211":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"244":{"tf":1.0},"245":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"266":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}},"df":3,"docs":{"210":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"42":{"tf":1.0}}}},"h":{"0":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"1":{"df":4,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":1.0},"25":{"tf":1.0}}},"2":{"df":1,"docs":{"31":{"tf":1.0}}},"3":{"df":6,"docs":{"47":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}},"4":{"df":4,"docs":{"64":{"tf":1.0},"65":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0}}},"5":{"df":4,"docs":{"81":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0}}},"6":{"df":4,"docs":{"100":{"tf":1.0},"103":{"tf":1.0},"108":{"tf":1.0},"99":{"tf":1.0}}},"7":{"df":6,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":1.0}}},"8":{"df":4,"docs":{"130":{"tf":1.0},"131":{"tf":1.0},"138":{"tf":1.0},"146":{"tf":1.0}}},"9":{"df":4,"docs":{"153":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":4,"docs":{"169":{"tf":1.0},"171":{"tf":1.0},"177":{"tf":1.0},"184":{"tf":1.0}}},"1":{"df":4,"docs":{"196":{"tf":1.0},"197":{"tf":1.0},"204":{"tf":1.0},"209":{"tf":1.0}}},"2":{"df":7,"docs":{"213":{"tf":1.0},"214":{"tf":1.0},"218":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0}}},"3":{"df":5,"docs":{"237":{"tf":1.0},"238":{"tf":1.0},"243":{"tf":1.0},"248":{"tf":1.0},"252":{"tf":1.0}}},"4":{"df":6,"docs":{"254":{"tf":1.0},"255":{"tf":1.0},"256":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0}}},"5":{"df":7,"docs":{"270":{"tf":1.0},"271":{"tf":1.0},"276":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0}}},"6":{"df":5,"docs":{"296":{"tf":1.0},"297":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0}}},"7":{"df":5,"docs":{"313":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":1.0}}},"8":{"df":4,"docs":{"328":{"tf":1.0},"329":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0}}},"9":{"df":4,"docs":{"345":{"tf":1.0},"346":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":6,"docs":{"364":{"tf":1.0},"365":{"tf":1.0},"373":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0},"387":{"tf":1.0}}},"1":{"df":4,"docs":{"395":{"tf":1.0},"396":{"tf":1.0},"403":{"tf":1.0},"406":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":6,"docs":{"289":{"tf":1.4142135623730951},"293":{"tf":2.0},"359":{"tf":1.0},"405":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0}},"e":{"(":{"&":{"df":1,"docs":{"73":{"tf":1.0}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"73":{"tf":1.4142135623730951},"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"359":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"274":{"tf":1.0},"359":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"101":{"tf":1.0},"359":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"296":{"tf":1.0},"300":{"tf":1.0},"319":{"tf":1.0},"434":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"1":{"0":{"df":6,"docs":{"172":{"tf":1.7320508075688772},"173":{"tf":1.7320508075688772},"185":{"tf":1.7320508075688772},"186":{"tf":1.7320508075688772},"188":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":1,"docs":{"142":{"tf":1.0}}}}}},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.4142135623730951}}}}}}},"df":11,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":2.0},"162":{"tf":1.0},"170":{"tf":1.0},"172":{"tf":2.449489742783178},"175":{"tf":1.4142135623730951},"358":{"tf":1.7320508075688772},"53":{"tf":2.6457513110645907},"56":{"tf":1.4142135623730951},"70":{"tf":1.0}},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"=":{"\"":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"102":{"tf":1.0},"27":{"tf":2.6457513110645907},"405":{"tf":3.605551275463989},"407":{"tf":2.23606797749979},"427":{"tf":1.0}},"e":{"d":{"_":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"185":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"114":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"294":{"tf":4.242640687119285}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"434":{"tf":2.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"260":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"i":{"df":1,"docs":{"434":{"tf":1.0}},"r":{"c":{"df":0,"docs":{},"l":{"df":2,"docs":{"100":{"tf":1.0},"428":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"416":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"15":{"tf":1.0},"24":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"406":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":1,"docs":{"78":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"396":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":3.1622776601683795}}},"y":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":14,"docs":{"181":{"tf":2.0},"222":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.0},"249":{"tf":2.23606797749979},"285":{"tf":1.0},"286":{"tf":1.0},"29":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":1.7320508075688772},"319":{"tf":1.0},"375":{"tf":1.0},"422":{"tf":4.123105625617661},"70":{"tf":2.449489742783178}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"300":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":8,"docs":{"224":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"240":{"tf":2.449489742783178},"241":{"tf":4.123105625617661},"242":{"tf":1.4142135623730951},"299":{"tf":2.23606797749979},"306":{"tf":1.4142135623730951}},"e":{"@":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"1":{":":{"3":{"6":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"238":{"tf":1.0},"384":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"迭":{"df":0,"docs":{},"代":{"df":0,"docs":{},"器":{"df":0,"docs":{},"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}}}}}}}}}}}},"m":{"d":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":3,"docs":{"17":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.7320508075688772}}},"df":0,"docs":{},"p":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"183":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"183":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":3,"docs":{"42":{"tf":1.7320508075688772},"421":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"n":{"df":1,"docs":{"0":{"tf":1.0}}},"o":{"d":{"df":0,"docs":{},"e":{"df":10,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"211":{"tf":1.0},"252":{"tf":1.0},"335":{"tf":1.7320508075688772},"352":{"tf":1.0},"360":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"399":{"tf":1.0},"429":{"tf":1.0}},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"测":{"df":0,"docs":{},"试":{"df":0,"docs":{},"中":{"df":0,"docs":{},",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"163":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"c":{"df":1,"docs":{"141":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"141":{"tf":1.0},"276":{"tf":1.0},"281":{"tf":1.0},"78":{"tf":1.0}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"179":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{":":{":":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":3,"docs":{"103":{"tf":1.7320508075688772},"104":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"这":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"104":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"103":{"tf":3.0},"104":{"tf":2.449489742783178},"105":{"tf":1.0},"108":{"tf":2.6457513110645907}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":13,"docs":{"130":{"tf":1.0},"134":{"tf":1.7320508075688772},"142":{"tf":1.7320508075688772},"143":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"247":{"tf":1.0},"250":{"tf":1.4142135623730951},"257":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"64":{"tf":1.0},"70":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"(":{"0":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":1,"docs":{"359":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"b":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"149":{"tf":1.0},"239":{"tf":1.4142135623730951},"258":{"tf":3.4641016151377544},"348":{"tf":2.449489742783178},"359":{"tf":2.23606797749979},"85":{"tf":1.4142135623730951}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"301":{"tf":1.0},"70":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"214":{"tf":1.0},"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"257":{"tf":1.0},"437":{"tf":1.0},"59":{"tf":1.7320508075688772}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"59":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"t":{"df":110,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"100":{"tf":1.0},"103":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"138":{"tf":1.0},"146":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.0},"177":{"tf":1.0},"184":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"209":{"tf":1.0},"213":{"tf":1.0},"214":{"tf":1.0},"218":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"243":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.0},"252":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.0},"256":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.0},"276":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"297":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"333":{"tf":1.0},"337":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.0},"353":{"tf":1.0},"354":{"tf":1.0},"364":{"tf":1.0},"365":{"tf":1.0},"373":{"tf":1.0},"379":{"tf":1.0},"384":{"tf":1.0},"387":{"tf":1.0},"395":{"tf":1.0},"396":{"tf":1.0},"403":{"tf":1.0},"406":{"tf":1.0},"410":{"tf":1.0},"411":{"tf":1.0},"415":{"tf":1.0},"418":{"tf":1.0},"425":{"tf":1.0},"430":{"tf":1.0},"431":{"tf":1.0},"432":{"tf":1.0},"47":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0},"99":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"130":{"tf":1.0},"211":{"tf":2.449489742783178},"47":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"300":{"tf":1.4142135623730951},"304":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}},"r":{"df":1,"docs":{"277":{"tf":1.0}}},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":97,"docs":{"102":{"tf":1.7320508075688772},"106":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"134":{"tf":1.4142135623730951},"142":{"tf":1.4142135623730951},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"185":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951},"189":{"tf":1.4142135623730951},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"242":{"tf":1.7320508075688772},"246":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":2.8284271247461903},"267":{"tf":1.0},"27":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"283":{"tf":2.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"289":{"tf":2.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":2.0},"301":{"tf":1.4142135623730951},"306":{"tf":2.0},"32":{"tf":1.0},"335":{"tf":1.4142135623730951},"350":{"tf":1.0},"351":{"tf":1.4142135623730951},"353":{"tf":1.7320508075688772},"36":{"tf":1.0},"360":{"tf":1.4142135623730951},"368":{"tf":2.0},"376":{"tf":2.23606797749979},"377":{"tf":1.4142135623730951},"38":{"tf":1.0},"386":{"tf":1.7320508075688772},"398":{"tf":1.0},"40":{"tf":3.0},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":3.1622776601683795},"427":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.7320508075688772},"51":{"tf":1.7320508075688772},"52":{"tf":1.4142135623730951},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.4142135623730951},"58":{"tf":1.7320508075688772},"61":{"tf":2.8284271247461903},"62":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":2.0},"75":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":1,"docs":{"59":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"333":{"tf":1.7320508075688772},"334":{"tf":3.0},"335":{"tf":2.449489742783178},"426":{"tf":1.0},"428":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":2,"docs":{"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"102":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"260":{"tf":1.0},"273":{"tf":1.7320508075688772},"313":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"47":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":3,"docs":{"296":{"tf":1.4142135623730951},"308":{"tf":1.0},"317":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"297":{"tf":1.0},"57":{"tf":1.0},"61":{"tf":2.6457513110645907}}}}},"df":7,"docs":{"273":{"tf":4.898979485566356},"274":{"tf":2.23606797749979},"275":{"tf":2.6457513110645907},"285":{"tf":2.6457513110645907},"286":{"tf":1.0},"291":{"tf":2.0},"293":{"tf":2.6457513110645907}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":5,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"229":{"tf":1.0}}}}}}}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":5,"docs":{"224":{"tf":1.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"(":{")":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"249":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":6,"docs":{"224":{"tf":2.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":3.7416573867739413},"405":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"223":{"tf":1.0},"224":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"223":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"108":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"df":12,"docs":{"222":{"tf":3.872983346207417},"223":{"tf":3.3166247903554},"224":{"tf":3.872983346207417},"225":{"tf":3.7416573867739413},"226":{"tf":2.8284271247461903},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.7416573867739413},"235":{"tf":1.0},"249":{"tf":4.242640687119285},"250":{"tf":2.449489742783178}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"108":{"tf":1.4142135623730951},"210":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"397":{"tf":2.449489742783178},"398":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"(":{"1":{"df":2,"docs":{"273":{"tf":1.0},"275":{"tf":1.0}}},"2":{"df":1,"docs":{"273":{"tf":1.0}}},"3":{"df":3,"docs":{"273":{"tf":1.0},"285":{"tf":1.7320508075688772},"286":{"tf":1.0}}},"4":{"df":2,"docs":{"285":{"tf":1.7320508075688772},"286":{"tf":1.0}}},"5":{"df":2,"docs":{"285":{"tf":1.4142135623730951},"293":{"tf":1.0}}},"_":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}},"df":0,"docs":{},"i":{"3":{"2":{"df":5,"docs":{"273":{"tf":2.0},"275":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"293":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"c":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"3":{"df":1,"docs":{"291":{"tf":1.0}}},"4":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"291":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"d":{"df":23,"docs":{"120":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"186":{"tf":1.0},"228":{"tf":1.0},"242":{"tf":1.0},"283":{"tf":1.0},"289":{"tf":1.4142135623730951},"306":{"tf":1.0},"320":{"tf":2.6457513110645907},"324":{"tf":1.0},"353":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"427":{"tf":1.0},"428":{"tf":1.0},"49":{"tf":1.0},"52":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"412":{"tf":1.0},"428":{"tf":1.0},"50":{"tf":1.0}}}}},"df":5,"docs":{"367":{"tf":2.23606797749979},"412":{"tf":1.0},"416":{"tf":1.0},"50":{"tf":1.4142135623730951},"75":{"tf":1.0}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"273":{"tf":1.0},"391":{"tf":1.4142135623730951},"61":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}},"m":{"df":5,"docs":{"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"300":{"tf":1.0},"303":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"145":{"tf":1.0},"186":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"75":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":4,"docs":{"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"<":{"'":{"a":{">":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"342":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":34,"docs":{"116":{"tf":1.0},"140":{"tf":1.7320508075688772},"179":{"tf":1.7320508075688772},"180":{"tf":2.449489742783178},"181":{"tf":1.4142135623730951},"182":{"tf":2.6457513110645907},"218":{"tf":1.4142135623730951},"219":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":3.872983346207417},"229":{"tf":4.358898943540674},"231":{"tf":2.8284271247461903},"232":{"tf":5.916079783099616},"249":{"tf":5.196152422706632},"250":{"tf":3.872983346207417},"252":{"tf":1.0},"337":{"tf":1.7320508075688772},"338":{"tf":1.7320508075688772},"339":{"tf":2.6457513110645907},"340":{"tf":2.449489742783178},"341":{"tf":1.7320508075688772},"342":{"tf":4.58257569495584},"343":{"tf":4.58257569495584},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"s":{"\"":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"140":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"(":{"df":0,"docs":{},"而":{"df":0,"docs":{},"不":{"df":0,"docs":{},"是":{"df":0,"docs":{},"参":{"df":0,"docs":{},"数":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},")":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"228":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":5,"docs":{"167":{"tf":1.7320508075688772},"382":{"tf":2.6457513110645907},"412":{"tf":1.0},"45":{"tf":1.4142135623730951},"62":{"tf":2.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"166":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":6,"docs":{"112":{"tf":1.0},"26":{"tf":1.0},"396":{"tf":1.0},"398":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"257":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"i":{"df":15,"docs":{"148":{"tf":1.0},"149":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"375":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.0},"422":{"tf":3.605551275463989},"70":{"tf":3.7416573867739413},"71":{"tf":1.0},"84":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"i":{">":{">":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"156":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"156":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"156":{"tf":1.0}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"[":{"df":0,"docs":{},"t":{"]":{">":{">":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"242":{"tf":1.0},"252":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"252":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":9,"docs":{"108":{"tf":2.0},"150":{"tf":2.0},"270":{"tf":1.0},"284":{"tf":1.0},"286":{"tf":2.23606797749979},"293":{"tf":3.1622776601683795},"306":{"tf":1.0},"374":{"tf":1.4142135623730951},"62":{"tf":3.1622776601683795}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"306":{"tf":2.8284271247461903}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":5,"docs":{"306":{"tf":3.3166247903554},"307":{"tf":1.0},"369":{"tf":2.6457513110645907},"374":{"tf":3.3166247903554},"62":{"tf":2.6457513110645907}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":2.0}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"s":{"df":3,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"106":{"tf":1.7320508075688772},"353":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":4,"docs":{"313":{"tf":2.8284271247461903},"314":{"tf":1.0},"322":{"tf":1.0},"53":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"102":{"tf":1.0},"155":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":2,"docs":{"301":{"tf":1.0},"70":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"120":{"tf":2.449489742783178},"121":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":1.7320508075688772},"121":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{":":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"113":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"{":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"273":{"tf":1.0},"275":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"382":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":74,"docs":{"110":{"tf":3.1622776601683795},"111":{"tf":5.0},"112":{"tf":1.0},"113":{"tf":3.605551275463989},"114":{"tf":2.8284271247461903},"115":{"tf":3.605551275463989},"116":{"tf":2.6457513110645907},"117":{"tf":4.123105625617661},"118":{"tf":2.0},"119":{"tf":1.0},"120":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":1.4142135623730951},"124":{"tf":1.7320508075688772},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":2.6457513110645907},"128":{"tf":1.7320508075688772},"129":{"tf":1.7320508075688772},"144":{"tf":1.0},"156":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":3.4641016151377544},"211":{"tf":3.4641016151377544},"226":{"tf":2.449489742783178},"256":{"tf":2.0},"257":{"tf":4.0},"258":{"tf":4.795831523312719},"259":{"tf":1.4142135623730951},"26":{"tf":1.0},"260":{"tf":4.123105625617661},"261":{"tf":2.6457513110645907},"262":{"tf":2.0},"263":{"tf":2.0},"264":{"tf":1.7320508075688772},"265":{"tf":2.8284271247461903},"266":{"tf":6.782329983125268},"267":{"tf":2.23606797749979},"269":{"tf":1.0},"297":{"tf":1.0},"31":{"tf":1.0},"312":{"tf":1.4142135623730951},"316":{"tf":4.0},"318":{"tf":2.0},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":2.23606797749979},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"333":{"tf":1.0},"335":{"tf":1.0},"337":{"tf":1.7320508075688772},"343":{"tf":1.0},"378":{"tf":1.7320508075688772},"39":{"tf":1.0},"390":{"tf":2.23606797749979},"391":{"tf":4.58257569495584},"392":{"tf":1.4142135623730951},"395":{"tf":1.4142135623730951},"40":{"tf":4.242640687119285},"405":{"tf":1.7320508075688772},"408":{"tf":1.0},"41":{"tf":1.7320508075688772},"412":{"tf":1.4142135623730951},"414":{"tf":1.0},"417":{"tf":1.0},"42":{"tf":1.0},"421":{"tf":1.0},"426":{"tf":1.0},"46":{"tf":1.0},"59":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":25,"docs":{"124":{"tf":1.4142135623730951},"144":{"tf":1.0},"151":{"tf":1.0},"214":{"tf":1.0},"254":{"tf":2.23606797749979},"255":{"tf":1.0},"256":{"tf":2.449489742783178},"257":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"259":{"tf":2.6457513110645907},"260":{"tf":2.0},"261":{"tf":2.8284271247461903},"262":{"tf":1.4142135623730951},"263":{"tf":2.449489742783178},"264":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.7320508075688772},"267":{"tf":1.7320508075688772},"268":{"tf":1.0},"269":{"tf":1.7320508075688772},"391":{"tf":1.0},"395":{"tf":1.0},"40":{"tf":2.0},"408":{"tf":1.0},"59":{"tf":1.0}}}},"m":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"111":{"tf":1.0},"264":{"tf":1.0},"40":{"tf":1.0}}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"111":{"tf":1.0},"158":{"tf":1.4142135623730951},"198":{"tf":1.0},"214":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.0},"283":{"tf":2.6457513110645907},"286":{"tf":2.449489742783178},"397":{"tf":1.0},"405":{"tf":3.1622776601683795},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"398":{"tf":2.449489742783178},"399":{"tf":1.7320508075688772}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"316":{"tf":1.0}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":5,"docs":{"319":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"43":{"tf":1.0},"62":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"189":{"tf":1.0},"299":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"324":{"tf":1.0},"352":{"tf":1.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"75":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"120":{"tf":2.23606797749979},"360":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"283":{"tf":5.385164807134504}}}}}}}}}},"df":0,"docs":{}}}}}}}},"y":{"c":{"df":0,"docs":{},"l":{"df":3,"docs":{"270":{"tf":1.0},"273":{"tf":1.7320508075688772},"293":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"d":{"0":{"a":{"c":{"b":{"2":{"5":{"9":{"5":{"c":{"8":{"9":{"1":{"d":{"df":0,"docs":{},"e":{"9":{"7":{"a":{"1":{"3":{"3":{"d":{"0":{"6":{"6":{"3":{"5":{"c":{"5":{"0":{"a":{"b":{"4":{"4":{"9":{"d":{"d":{"6":{"5":{"c":{"df":5,"docs":{"47":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"3":{"9":{"3":{"7":{"3":{"a":{"8":{"3":{"8":{"df":0,"docs":{},"f":{"d":{"3":{"1":{"2":{"a":{"8":{"a":{"9":{"b":{"c":{"c":{"9":{"4":{"8":{"7":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"b":{"c":{"9":{"df":0,"docs":{},"e":{"1":{"5":{"8":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"4":{"3":{"1":{"7":{"c":{"3":{"1":{"2":{"2":{"b":{"4":{"4":{"df":0,"docs":{},"f":{"b":{"7":{"1":{"3":{"a":{"b":{"a":{"6":{"6":{"c":{"c":{"2":{"9":{"5":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"3":{"4":{"5":{"3":{"b":{"2":{"4":{"b":{"df":1,"docs":{"432":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":0,"docs":{},"e":{"b":{"2":{"df":0,"docs":{},"f":{"7":{"a":{"8":{"df":0,"docs":{},"e":{"9":{"c":{"6":{"df":0,"docs":{},"f":{"5":{"1":{"b":{"4":{"4":{"7":{"8":{"df":0,"docs":{},"f":{"9":{"c":{"d":{"4":{"6":{"df":0,"docs":{},"f":{"5":{"5":{"4":{"4":{"8":{"df":0,"docs":{},"e":{"2":{"c":{"a":{"2":{"c":{"1":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"9":{"4":{"df":0,"docs":{},"e":{"0":{"3":{"a":{"1":{"8":{"a":{"2":{"5":{"9":{"0":{"df":0,"docs":{},"e":{"d":{"3":{"df":0,"docs":{},"f":{"1":{"c":{"6":{"7":{"b":{"8":{"5":{"9":{"c":{"b":{"1":{"1":{"5":{"2":{"8":{"d":{"2":{"a":{"2":{"d":{"5":{"c":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"a":{"a":{"2":{"6":{"8":{"a":{"0":{"c":{"d":{"0":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"7":{"6":{"a":{"8":{"0":{"6":{"7":{"a":{"2":{"6":{"df":0,"docs":{},"e":{"d":{"7":{"d":{"2":{"8":{"df":0,"docs":{},"e":{"c":{"2":{"a":{"9":{"3":{"3":{"6":{"d":{"3":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":2.6457513110645907}}}},"l":{"df":2,"docs":{"185":{"tf":1.0},"75":{"tf":3.872983346207417}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"431":{"tf":1.0}}}}},"t":{"a":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"140":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":13,"docs":{"140":{"tf":1.0},"189":{"tf":1.0},"260":{"tf":1.0},"283":{"tf":4.242640687119285},"289":{"tf":1.0},"313":{"tf":1.0},"330":{"tf":1.4142135623730951},"359":{"tf":1.0},"391":{"tf":1.0},"52":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"y":{"df":5,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0},"348":{"tf":1.0},"63":{"tf":1.0}}}},"b":{"df":0,"docs":{},"g":{"!":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"3":{"0":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"215":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"91":{"tf":3.3166247903554}}}},"d":{"8":{"df":0,"docs":{},"f":{"4":{"7":{"a":{"7":{"4":{"b":{"6":{"7":{"1":{"7":{"8":{"c":{"df":0,"docs":{},"e":{"a":{"8":{"c":{"8":{"3":{"2":{"df":0,"docs":{},"e":{"3":{"b":{"4":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"3":{"b":{"b":{"5":{"1":{"5":{"b":{"d":{"7":{"2":{"df":1,"docs":{"163":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"17":{"tf":1.0}}},"df":12,"docs":{"10":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"23":{"tf":1.0},"231":{"tf":1.0},"283":{"tf":1.4142135623730951},"325":{"tf":1.0},"425":{"tf":1.7320508075688772},"426":{"tf":1.0},"427":{"tf":1.0},"428":{"tf":1.0},"429":{"tf":1.0}},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.0}}}},"df":0,"docs":{}},"df":9,"docs":{"156":{"tf":1.4142135623730951},"181":{"tf":1.0},"200":{"tf":1.7320508075688772},"247":{"tf":1.0},"27":{"tf":1.0},"398":{"tf":1.0},"419":{"tf":2.23606797749979},"53":{"tf":1.0},"91":{"tf":3.1622776601683795}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":59,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":2.23606797749979},"267":{"tf":1.0},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"53":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"185":{"tf":1.0},"188":{"tf":1.0},"289":{"tf":1.0},"387":{"tf":1.0},"389":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"422":{"tf":1.0},"70":{"tf":1.0}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"120":{"tf":1.0},"225":{"tf":1.0},"246":{"tf":1.0},"266":{"tf":1.0},"353":{"tf":1.0},"356":{"tf":1.0},"36":{"tf":1.0},"361":{"tf":1.0},"375":{"tf":1.0},"377":{"tf":1.4142135623730951},"405":{"tf":1.0},"424":{"tf":3.1622776601683795},"427":{"tf":1.0},"428":{"tf":1.0},"436":{"tf":1.0},"57":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":10,"docs":{"100":{"tf":1.0},"106":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":2.23606797749979},"376":{"tf":1.0},"42":{"tf":1.0},"82":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"26":{"tf":1.0},"289":{"tf":1.0},"32":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"151":{"tf":1.0},"405":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"(":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{":":{":":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":7,"docs":{"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"260":{"tf":1.0},"266":{"tf":1.7320508075688772},"32":{"tf":1.0},"391":{"tf":1.0},"40":{"tf":2.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"416":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"u":{"df":1,"docs":{"282":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":17,"docs":{"141":{"tf":1.7320508075688772},"270":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":2.8284271247461903},"277":{"tf":2.0},"278":{"tf":1.0},"279":{"tf":2.23606797749979},"280":{"tf":4.47213595499958},"281":{"tf":5.196152422706632},"282":{"tf":2.449489742783178},"290":{"tf":1.0},"295":{"tf":1.0},"306":{"tf":1.0},"342":{"tf":1.0},"378":{"tf":1.4142135623730951},"416":{"tf":1.0},"78":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"276":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"279":{"tf":1.0},"73":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"u":{"df":1,"docs":{"282":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":1,"docs":{"282":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"v":{"df":7,"docs":{"198":{"tf":1.0},"387":{"tf":1.4142135623730951},"388":{"tf":1.0},"391":{"tf":1.7320508075688772},"392":{"tf":1.0},"418":{"tf":3.4641016151377544},"91":{"tf":1.4142135623730951}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{",":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{",":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":15,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"113":{"tf":1.0},"199":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.7320508075688772},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979},"375":{"tf":1.0},"91":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":2,"docs":{"200":{"tf":1.0},"247":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":2.449489742783178}}}}}}}}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":3,"docs":{"102":{"tf":1.0},"330":{"tf":1.0},"337":{"tf":1.0}}}}},"t":{"df":1,"docs":{"398":{"tf":1.0}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"359":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":5,"docs":{"156":{"tf":1.0},"273":{"tf":1.0},"320":{"tf":1.0},"407":{"tf":1.0},"75":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"431":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":48,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.0},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":2.6457513110645907},"261":{"tf":1.0},"266":{"tf":1.7320508075688772},"27":{"tf":2.0},"273":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"227":{"tf":1.0},"425":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"107":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"127":{"tf":1.0},"320":{"tf":1.0},"53":{"tf":1.0}}}}}},"j":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"e":{"df":3,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"0":{"df":1,"docs":{"89":{"tf":1.0}}},"1":{"df":1,"docs":{"89":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"115":{"tf":1.0}}}},"r":{"df":2,"docs":{"111":{"tf":1.0},"24":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"428":{"tf":1.0},"57":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"408":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"336":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{">":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"181":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":25,"docs":{"140":{"tf":1.0},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"179":{"tf":1.7320508075688772},"181":{"tf":1.7320508075688772},"183":{"tf":2.449489742783178},"194":{"tf":1.7320508075688772},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0},"377":{"tf":3.3166247903554},"378":{"tf":2.449489742783178},"385":{"tf":1.0},"418":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0},"91":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"94":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"175":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"175":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"382":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"53":{"tf":1.0},"61":{"tf":2.6457513110645907}}}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"427":{"tf":2.23606797749979}}}}}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"385":{"tf":2.23606797749979}},"e":{"(":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"385":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"c":{"df":16,"docs":{"0":{"tf":1.0},"19":{"tf":1.0},"198":{"tf":2.0},"199":{"tf":1.4142135623730951},"200":{"tf":1.0},"202":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"229":{"tf":1.0},"232":{"tf":1.0},"257":{"tf":2.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"257":{"tf":1.0},"260":{"tf":1.0},"368":{"tf":1.0},"398":{"tf":1.0}}}}}}}},"df":1,"docs":{"59":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":3,"docs":{"377":{"tf":1.4142135623730951},"386":{"tf":1.0},"91":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"g":{":":{":":{"b":{"a":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":5.291502622129181}}},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"252":{"tf":1.4142135623730951},"401":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"283":{"tf":1.0},"289":{"tf":1.4142135623730951},"70":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":4.0}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":4,"docs":{"266":{"tf":1.0},"267":{"tf":1.4142135623730951},"40":{"tf":2.6457513110645907},"42":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"\"":{"df":0,"docs":{},"、":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"337":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":6,"docs":{"338":{"tf":2.23606797749979},"339":{"tf":1.4142135623730951},"340":{"tf":1.4142135623730951},"341":{"tf":2.23606797749979},"342":{"tf":2.8284271247461903},"343":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":4.47213595499958}}}}}},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"338":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}}}}},"w":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"334":{"tf":2.0},"335":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"333":{"tf":2.6457513110645907},"334":{"tf":4.123105625617661},"335":{"tf":5.196152422706632}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.4142135623730951},"235":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"227":{"tf":1.0},"405":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"283":{"tf":1.7320508075688772},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"c":{"df":1,"docs":{"283":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}},"df":18,"docs":{"185":{"tf":1.0},"188":{"tf":1.0},"270":{"tf":1.0},"273":{"tf":1.7320508075688772},"275":{"tf":1.0},"283":{"tf":7.745966692414834},"286":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"299":{"tf":1.7320508075688772},"306":{"tf":1.0},"397":{"tf":1.0},"406":{"tf":1.0},"407":{"tf":3.0},"408":{"tf":2.8284271247461903},"70":{"tf":2.23606797749979},"71":{"tf":1.0},"72":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.0}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.0}}}}}}}}},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"335":{"tf":1.0}}},"t":{"df":6,"docs":{"228":{"tf":2.0},"229":{"tf":2.0},"231":{"tf":1.7320508075688772},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"e":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.7320508075688772},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"302":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":2.449489742783178}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"1":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"(":{"1":{"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"(":{"2":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"225":{"tf":1.0},"336":{"tf":1.0},"383":{"tf":1.0}}}},"df":6,"docs":{"225":{"tf":1.0},"320":{"tf":1.4142135623730951},"334":{"tf":1.0},"383":{"tf":1.0},"386":{"tf":1.7320508075688772},"412":{"tf":1.0}}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":2,"docs":{"273":{"tf":1.0},"275":{"tf":1.0}}}},"0":{"0":{"0":{"4":{"df":1,"docs":{"106":{"tf":1.0}}},"5":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"6":{"df":4,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"75":{"tf":1.4142135623730951},"87":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"7":{"7":{"df":8,"docs":{"102":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"277":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.4142135623730951},"335":{"tf":1.0},"377":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"8":{"df":9,"docs":{"173":{"tf":1.0},"240":{"tf":1.0},"320":{"tf":1.0},"351":{"tf":1.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"51":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"6":{"9":{"df":1,"docs":{"172":{"tf":1.0}}},"df":0,"docs":{}},"7":{"3":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"8":{"2":{"df":6,"docs":{"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0},"70":{"tf":1.0}}},"4":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}},"9":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{"3":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":2,"docs":{"368":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"2":{"df":3,"docs":{"134":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"407":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":2,"docs":{"189":{"tf":1.0},"75":{"tf":1.0}}},"df":0,"docs":{}},"9":{"6":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"7":{"df":2,"docs":{"185":{"tf":1.0},"188":{"tf":1.0}}},"9":{"df":2,"docs":{"405":{"tf":1.4142135623730951},"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"0":{"3":{"df":2,"docs":{"115":{"tf":1.0},"116":{"tf":1.0}}},"df":0,"docs":{}},"1":{"4":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"4":{"6":{"df":1,"docs":{"386":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"9":{"9":{"8":{"1":{"1":{"df":0,"docs":{},"f":{"a":{"2":{"4":{"6":{"d":{"b":{"d":{"df":1,"docs":{"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"5":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"0":{"5":{"7":{"0":{"6":{"c":{"5":{"c":{"4":{"3":{"0":{"9":{"d":{"df":0,"docs":{},"f":{"9":{"df":0,"docs":{},"e":{"d":{"4":{"7":{"d":{"5":{"df":0,"docs":{},"e":{"9":{"1":{"d":{"8":{"df":0,"docs":{},"e":{"d":{"3":{"4":{"2":{"b":{"7":{"d":{"df":1,"docs":{"315":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},">":{"df":0,"docs":{},":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"300":{"tf":1.0}}}}}},"a":{"b":{"a":{"a":{"a":{"a":{"9":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"6":{"9":{"3":{"7":{"d":{"b":{"3":{"6":{"9":{"0":{"d":{"c":{"5":{"6":{"df":0,"docs":{},"f":{"7":{"3":{"9":{"1":{"1":{"6":{"b":{"df":0,"docs":{},"e":{"5":{"5":{"df":0,"docs":{},"e":{"c":{"b":{"2":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"358":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":7,"docs":{"115":{"tf":3.0},"116":{"tf":3.1622776601683795},"119":{"tf":2.6457513110645907},"120":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"123":{"tf":1.0},"127":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":1.7320508075688772}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"26":{"tf":1.4142135623730951},"260":{"tf":1.0},"32":{"tf":1.0},"414":{"tf":2.0},"430":{"tf":2.449489742783178}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"430":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":24,"docs":{"10":{"tf":1.0},"153":{"tf":1.0},"157":{"tf":2.23606797749979},"158":{"tf":2.0},"159":{"tf":1.0},"160":{"tf":1.7320508075688772},"162":{"tf":2.6457513110645907},"169":{"tf":1.0},"174":{"tf":2.0},"203":{"tf":2.6457513110645907},"213":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.4142135623730951},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951},"26":{"tf":1.0},"300":{"tf":1.4142135623730951},"325":{"tf":1.0},"381":{"tf":2.8284271247461903},"397":{"tf":1.0},"414":{"tf":1.0},"427":{"tf":1.0},"430":{"tf":1.7320508075688772}},"f":{"b":{"a":{"df":0,"docs":{},"f":{"d":{"b":{"a":{"3":{"6":{"1":{"8":{"4":{"8":{"7":{"df":0,"docs":{},"f":{"b":{"c":{"9":{"3":{"0":{"5":{"3":{"1":{"8":{"df":0,"docs":{},"f":{"c":{"a":{"b":{"9":{"7":{"7":{"5":{"1":{"3":{"2":{"a":{"c":{"1":{"5":{"df":1,"docs":{"411":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"df":0,"docs":{},"k":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"v":{"df":0,"docs":{},"w":{"df":0,"docs":{},"x":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":1,"docs":{"189":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"(":{"_":{"df":1,"docs":{"323":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"<":{"a":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"134":{"tf":2.23606797749979},"330":{"tf":1.0},"351":{"tf":1.4142135623730951},"54":{"tf":1.7320508075688772},"62":{"tf":1.4142135623730951}}}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"191":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"108":{"tf":1.0}}}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":5,"docs":{"289":{"tf":1.0},"82":{"tf":3.605551275463989},"83":{"tf":3.4641016151377544},"84":{"tf":3.1622776601683795},"87":{"tf":2.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"218":{"tf":1.0}}}},"t":{"df":2,"docs":{"120":{"tf":1.0},"57":{"tf":1.0}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"260":{"tf":1.0},"382":{"tf":1.0}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"331":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}}},"d":{"df":4,"docs":{"283":{"tf":2.0},"356":{"tf":1.4142135623730951},"361":{"tf":1.0},"62":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"398":{"tf":1.0}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"152":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":14,"docs":{"185":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951},"224":{"tf":2.449489742783178},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"234":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"59":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"102":{"tf":1.0},"106":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"42":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"150":{"tf":2.23606797749979}}},"y":{"df":0,"docs":{},",":{"df":0,"docs":{},"它":{"df":0,"docs":{},"获":{"df":0,"docs":{},"取":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"想":{"df":0,"docs":{},"要":{"df":0,"docs":{},"检":{"df":0,"docs":{},"查":{"df":0,"docs":{},"的":{"df":0,"docs":{},"键":{"df":0,"docs":{},"作":{"df":0,"docs":{},"为":{"df":0,"docs":{},"参":{"df":0,"docs":{},"数":{"df":0,"docs":{},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"150":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}}}},"u":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"100":{"tf":1.0}}},"df":0,"docs":{}}},"df":34,"docs":{"100":{"tf":1.0},"101":{"tf":3.0},"102":{"tf":2.0},"103":{"tf":1.4142135623730951},"104":{"tf":2.23606797749979},"106":{"tf":1.7320508075688772},"108":{"tf":2.0},"119":{"tf":1.4142135623730951},"136":{"tf":1.0},"157":{"tf":1.0},"174":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"239":{"tf":1.0},"258":{"tf":2.0},"273":{"tf":2.0},"274":{"tf":1.4142135623730951},"275":{"tf":1.0},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"342":{"tf":1.0},"353":{"tf":1.0},"359":{"tf":1.7320508075688772},"36":{"tf":1.0},"362":{"tf":1.0},"382":{"tf":1.0},"385":{"tf":1.0},"407":{"tf":1.4142135623730951},"412":{"tf":1.0},"417":{"tf":1.4142135623730951},"81":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"350":{"tf":1.0},"77":{"tf":1.7320508075688772},"99":{"tf":1.0}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":3,"docs":{"216":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":2.23606797749979}},"s":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"\"":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"232":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"232":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"232":{"tf":1.0}},"e":{"=":{"1":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"232":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":16,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"230":{"tf":1.0},"290":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"235":{"tf":1.7320508075688772},"236":{"tf":1.0}}}}}}}}},"q":{"df":1,"docs":{"420":{"tf":2.23606797749979}},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"202":{"tf":3.4641016151377544},"203":{"tf":1.0},"258":{"tf":1.4142135623730951},"42":{"tf":1.0}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"421":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"(":{"\"":{"d":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.0}}}}}},"_":{"df":4,"docs":{"167":{"tf":1.0},"382":{"tf":1.4142135623730951},"408":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}},"df":9,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":2.0},"162":{"tf":1.0},"174":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"157":{"tf":1.0},"158":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"203":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":24,"docs":{"157":{"tf":2.23606797749979},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":2.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"165":{"tf":1.4142135623730951},"174":{"tf":1.0},"203":{"tf":2.0},"224":{"tf":3.0},"225":{"tf":2.23606797749979},"226":{"tf":1.0},"232":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.7320508075688772},"300":{"tf":1.0},"323":{"tf":1.0},"349":{"tf":1.0},"36":{"tf":2.0},"382":{"tf":1.0},"405":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":2.0}}},"df":0,"docs":{}}}}},">":{"df":0,"docs":{},"。":{"df":0,"docs":{},"为":{"df":0,"docs":{},"此":{"df":0,"docs":{},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"381":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"[":{"df":0,"docs":{},"e":{"0":{"0":{"0":{"4":{"df":1,"docs":{"106":{"tf":1.0}}},"5":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"6":{"df":4,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"7":{"7":{"df":9,"docs":{"102":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"277":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.7320508075688772},"335":{"tf":1.0},"377":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"8":{"df":9,"docs":{"173":{"tf":1.0},"240":{"tf":1.0},"320":{"tf":1.0},"351":{"tf":1.0},"407":{"tf":1.0},"42":{"tf":1.0},"51":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"6":{"9":{"df":1,"docs":{"172":{"tf":1.0}}},"df":0,"docs":{}},"7":{"3":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"8":{"2":{"df":6,"docs":{"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0},"70":{"tf":1.0}}},"4":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}},"9":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{"2":{"df":1,"docs":{"266":{"tf":1.0}}},"3":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":2,"docs":{"368":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"2":{"df":3,"docs":{"134":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"407":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":2,"docs":{"189":{"tf":1.0},"75":{"tf":1.0}}},"df":0,"docs":{}},"9":{"6":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"7":{"df":2,"docs":{"185":{"tf":1.0},"188":{"tf":1.0}}},"9":{"df":3,"docs":{"324":{"tf":1.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"0":{"3":{"df":2,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"1":{"4":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"4":{"6":{"df":1,"docs":{"386":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":78,"docs":{"102":{"tf":2.0},"106":{"tf":1.7320508075688772},"115":{"tf":1.7320508075688772},"116":{"tf":1.7320508075688772},"120":{"tf":1.7320508075688772},"134":{"tf":1.7320508075688772},"142":{"tf":1.7320508075688772},"153":{"tf":1.0},"154":{"tf":1.0},"157":{"tf":1.7320508075688772},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"162":{"tf":3.4641016151377544},"172":{"tf":1.7320508075688772},"173":{"tf":1.7320508075688772},"185":{"tf":1.7320508075688772},"186":{"tf":1.7320508075688772},"188":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"219":{"tf":1.0},"225":{"tf":2.6457513110645907},"226":{"tf":1.4142135623730951},"228":{"tf":2.449489742783178},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"233":{"tf":1.0},"235":{"tf":1.0},"240":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"249":{"tf":2.23606797749979},"250":{"tf":1.4142135623730951},"257":{"tf":1.0},"260":{"tf":1.4142135623730951},"273":{"tf":2.0},"277":{"tf":2.0},"279":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"285":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":1.0},"299":{"tf":2.449489742783178},"301":{"tf":2.0},"306":{"tf":2.449489742783178},"320":{"tf":1.4142135623730951},"335":{"tf":1.7320508075688772},"351":{"tf":1.7320508075688772},"353":{"tf":1.7320508075688772},"360":{"tf":1.7320508075688772},"368":{"tf":2.449489742783178},"376":{"tf":1.7320508075688772},"377":{"tf":1.7320508075688772},"381":{"tf":2.0},"386":{"tf":1.7320508075688772},"405":{"tf":3.4641016151377544},"407":{"tf":2.6457513110645907},"414":{"tf":1.0},"42":{"tf":1.7320508075688772},"428":{"tf":1.0},"429":{"tf":1.0},"49":{"tf":2.0},"51":{"tf":1.7320508075688772},"52":{"tf":1.7320508075688772},"57":{"tf":1.7320508075688772},"58":{"tf":1.7320508075688772},"61":{"tf":2.449489742783178},"70":{"tf":2.0},"73":{"tf":1.7320508075688772},"74":{"tf":2.449489742783178},"75":{"tf":2.0},"78":{"tf":2.0},"87":{"tf":1.7320508075688772}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"158":{"tf":1.0}}},"df":0,"docs":{}}}}}},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.0}}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"36":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"ñ":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"431":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"431":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"397":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"c":{"df":1,"docs":{"417":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"320":{"tf":1.0},"361":{"tf":1.4142135623730951}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":12,"docs":{"214":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":2.8284271247461903},"257":{"tf":2.23606797749979},"277":{"tf":2.0},"279":{"tf":2.0},"283":{"tf":3.1622776601683795},"368":{"tf":2.8284271247461903},"376":{"tf":3.605551275463989},"377":{"tf":2.0},"386":{"tf":1.7320508075688772},"88":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}}}},"_":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":2.23606797749979}},"e":{"(":{"5":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"”":{"df":0,"docs":{},"、":{"df":0,"docs":{},"“":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"260":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"305":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"267":{"tf":1.0},"405":{"tf":5.291502622129181},"407":{"tf":2.0},"408":{"tf":2.23606797749979}},"e":{"<":{"df":0,"docs":{},"f":{">":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"405":{"tf":3.1622776601683795},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"347":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"360":{"tf":1.4142135623730951},"407":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"162":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":2,"docs":{"301":{"tf":1.0},"70":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"r":{"d":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"165":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"d":{"df":6,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":27,"docs":{"142":{"tf":1.0},"159":{"tf":3.0},"164":{"tf":1.0},"165":{"tf":1.7320508075688772},"173":{"tf":1.0},"186":{"tf":1.0},"200":{"tf":1.0},"202":{"tf":2.8284271247461903},"219":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"228":{"tf":1.0},"240":{"tf":1.7320508075688772},"320":{"tf":1.7320508075688772},"351":{"tf":1.4142135623730951},"36":{"tf":2.0},"391":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.4142135623730951},"414":{"tf":1.4142135623730951},"42":{"tf":2.23606797749979},"45":{"tf":1.0},"51":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.7320508075688772},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"208":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}}},"n":{"df":4,"docs":{"273":{"tf":1.0},"320":{"tf":1.0},"407":{"tf":1.0},"75":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"106":{"tf":1.0},"283":{"tf":1.4142135623730951},"52":{"tf":1.0},"53":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"198":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"123":{"tf":1.0}}}}},"r":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"417":{"tf":1.0}}}}}}},".":{".":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"416":{"tf":1.0}}}}}}},"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"416":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"416":{"tf":1.0}}}}}}},"0":{"df":1,"docs":{"417":{"tf":1.0}}},"1":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"416":{"tf":1.0}}},"df":0,"docs":{}}},"[":{".":{".":{"b":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{".":{".":{"b":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"417":{"tf":1.0}}}}}}},"df":2,"docs":{"416":{"tf":7.874007874011811},"417":{"tf":2.6457513110645907}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":7,"docs":{"306":{"tf":1.0},"347":{"tf":1.7320508075688772},"351":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"57":{"tf":2.0},"58":{"tf":1.0}}}}}}},"t":{"df":1,"docs":{"324":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"308":{"tf":1.0},"324":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"211":{"tf":1.4142135623730951},"266":{"tf":1.0},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"368":{"tf":3.3166247903554},"412":{"tf":1.0}}}}}}},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}}}},"f":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"385":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"0":{"2":{"5":{"3":{"1":{"5":{"9":{"1":{"9":{"7":{"df":0,"docs":{},"f":{"7":{"8":{"4":{"1":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"d":{"2":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"8":{"d":{"1":{"a":{"4":{"9":{"c":{"3":{"b":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"a":{"1":{"0":{"a":{"3":{"0":{"8":{"6":{"c":{"5":{"8":{"df":0,"docs":{},"e":{"5":{"2":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"a":{"9":{"0":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"a":{"7":{"8":{"df":0,"docs":{},"f":{"6":{"4":{"b":{"6":{"6":{"8":{"df":0,"docs":{},"f":{"6":{"3":{"df":0,"docs":{},"f":{"5":{"8":{"1":{"2":{"0":{"3":{"c":{"6":{"b":{"a":{"c":{"5":{"0":{"9":{"9":{"0":{"3":{"df":0,"docs":{},"f":{"7":{"c":{"0":{"0":{"df":0,"docs":{},"e":{"df":1,"docs":{"171":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":2,"docs":{"175":{"tf":1.4142135623730951},"53":{"tf":2.23606797749979}}},"df":0,"docs":{}},"6":{"4":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"94":{"tf":1.0}}},"x":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":10,"docs":{"175":{"tf":1.0},"176":{"tf":1.4142135623730951},"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951},"331":{"tf":2.23606797749979},"417":{"tf":1.0},"53":{"tf":2.0},"54":{"tf":1.4142135623730951},"70":{"tf":1.0},"94":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":19,"docs":{"120":{"tf":1.0},"198":{"tf":3.7416573867739413},"199":{"tf":3.0},"200":{"tf":3.0},"201":{"tf":3.0},"202":{"tf":3.1622776601683795},"206":{"tf":3.1622776601683795},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":2.23606797749979},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"257":{"tf":1.0},"260":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":2.0},"323":{"tf":1.0},"405":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":8,"docs":{"198":{"tf":1.4142135623730951},"199":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":2.0},"202":{"tf":2.0},"206":{"tf":2.0},"228":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"318":{"tf":1.0}}}},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"412":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":14,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.4142135623730951},"182":{"tf":2.0},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"232":{"tf":1.0},"247":{"tf":1.0},"348":{"tf":1.0},"361":{"tf":1.0},"412":{"tf":1.4142135623730951},"53":{"tf":1.0},"61":{"tf":2.449489742783178},"70":{"tf":1.0},"95":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},",":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"431":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":7,"docs":{"228":{"tf":2.449489742783178},"229":{"tf":2.8284271247461903},"231":{"tf":1.7320508075688772},"232":{"tf":3.4641016151377544},"249":{"tf":3.0},"250":{"tf":2.23606797749979},"321":{"tf":2.0}}}},"v":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"397":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"348":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"348":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"y":{"df":1,"docs":{"152":{"tf":1.0}}}},"c":{"df":1,"docs":{"158":{"tf":1.0}}},"df":14,"docs":{"10":{"tf":1.0},"242":{"tf":3.0},"320":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"325":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0},"381":{"tf":1.4142135623730951},"385":{"tf":2.0},"405":{"tf":6.324555320336759},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"431":{"tf":1.7320508075688772},"53":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"296":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"435":{"tf":1.0},"437":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"237":{"tf":1.0},"364":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"435":{"tf":1.0}}}}}}}}}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"59":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"359":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"t":{"c":{"df":0,"docs":{},"h":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"398":{"tf":2.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"149":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"149":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":5,"docs":{"260":{"tf":1.0},"391":{"tf":1.0},"405":{"tf":1.7320508075688772},"82":{"tf":1.0},"83":{"tf":1.0}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}}}},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}}},":":{"/":{"/":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"a":{"d":{"d":{"/":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.7320508075688772}}}}},"df":1,"docs":{"266":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"_":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"/":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"_":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"289":{"tf":1.0}}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"61":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"1":{"0":{"df":6,"docs":{"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"240":{"tf":1.0},"241":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":5,"docs":{"273":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"277":{"tf":1.0},"279":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"102":{"tf":1.0},"106":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"157":{"tf":1.0},"162":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":5,"docs":{"386":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":10,"docs":{"202":{"tf":1.7320508075688772},"261":{"tf":1.7320508075688772},"32":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"261":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"i":{"df":1,"docs":{"335":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"398":{"tf":1.0},"405":{"tf":2.449489742783178},"407":{"tf":1.4142135623730951},"408":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"246":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"289":{"tf":1.0},"290":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":1.7320508075688772}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"301":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":8,"docs":{"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"232":{"tf":1.4142135623730951}}}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"427":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":5,"docs":{"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0}}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"350":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"360":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":4,"docs":{"199":{"tf":1.7320508075688772},"242":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"239":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"376":{"tf":2.0},"377":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"49":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"c":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"158":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"?":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"161":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":6,"docs":{"157":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":2.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"157":{"tf":2.449489742783178},"158":{"tf":2.0},"160":{"tf":2.23606797749979},"161":{"tf":1.4142135623730951},"162":{"tf":1.0}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":15,"docs":{"217":{"tf":1.7320508075688772},"218":{"tf":2.0},"219":{"tf":1.0},"221":{"tf":2.449489742783178},"222":{"tf":2.449489742783178},"223":{"tf":2.23606797749979},"224":{"tf":3.0},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.4641016151377544},"249":{"tf":3.3166247903554},"250":{"tf":2.449489742783178}}}}},"df":0,"docs":{}}},"df":16,"docs":{"157":{"tf":2.23606797749979},"158":{"tf":2.23606797749979},"159":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"218":{"tf":1.7320508075688772},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.449489742783178},"225":{"tf":2.23606797749979},"226":{"tf":1.0},"24":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"260":{"tf":1.4142135623730951}},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"402":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"214":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"250":{"tf":1.0}}}}}}},"df":18,"docs":{"198":{"tf":2.449489742783178},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.23606797749979},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"247":{"tf":2.23606797749979},"250":{"tf":1.4142135623730951},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"324":{"tf":1.4142135623730951}},"e":{"d":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"247":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"323":{"tf":1.4142135623730951},"395":{"tf":1.0},"413":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":63,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":2.8284271247461903},"199":{"tf":2.8284271247461903},"200":{"tf":2.23606797749979},"201":{"tf":2.0},"202":{"tf":2.6457513110645907},"206":{"tf":2.0},"207":{"tf":2.6457513110645907},"208":{"tf":2.449489742783178},"211":{"tf":3.3166247903554},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.6457513110645907},"232":{"tf":2.23606797749979},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.4142135623730951},"257":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":3.1622776601683795},"267":{"tf":1.0},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.4142135623730951},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":3.1622776601683795},"323":{"tf":1.7320508075688772},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"/":{"9":{"9":{".":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"6":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"190":{"tf":1.4142135623730951},"192":{"tf":2.0}}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"(":{"&":{"df":2,"docs":{"77":{"tf":1.0},"78":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"[":{"0":{".":{".":{"6":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"[":{"0":{".":{".":{"6":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"191":{"tf":1.4142135623730951},"77":{"tf":2.449489742783178},"78":{"tf":2.23606797749979}},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"<":{"'":{"a":{">":{"(":{"df":1,"docs":{"191":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"191":{"tf":1.7320508075688772},"77":{"tf":1.7320508075688772},"78":{"tf":3.3166247903554}}},"df":0,"docs":{}}}}},"df":13,"docs":{"102":{"tf":1.0},"134":{"tf":2.449489742783178},"152":{"tf":1.0},"187":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":5.0990195135927845},"360":{"tf":2.23606797749979},"368":{"tf":1.0},"49":{"tf":1.0},"54":{"tf":1.4142135623730951},"66":{"tf":1.0},"74":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":4,"docs":{"105":{"tf":2.0},"106":{"tf":1.0},"358":{"tf":1.0},"58":{"tf":2.6457513110645907}}}},"x":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"427":{"tf":2.449489742783178},"430":{"tf":1.0},"434":{"tf":1.4142135623730951}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":3.605551275463989}}},"o":{"a":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"6":{"4":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"173":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"53":{"tf":1.0}}}},"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"53":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"376":{"tf":3.872983346207417}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"377":{"tf":1.0},"378":{"tf":1.0}}}}}}},"df":0,"docs":{}},":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":2,"docs":{"377":{"tf":2.449489742783178},"378":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"377":{"tf":1.0},"378":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":3,"docs":{"121":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"381":{"tf":1.7320508075688772},"426":{"tf":1.4142135623730951}}}},"n":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"385":{"tf":1.0},"386":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":245,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":3.605551275463989},"102":{"tf":1.4142135623730951},"103":{"tf":2.0},"104":{"tf":1.7320508075688772},"105":{"tf":2.8284271247461903},"106":{"tf":1.4142135623730951},"107":{"tf":3.3166247903554},"108":{"tf":2.0},"113":{"tf":1.0},"114":{"tf":2.23606797749979},"115":{"tf":1.4142135623730951},"116":{"tf":2.6457513110645907},"118":{"tf":1.7320508075688772},"119":{"tf":1.7320508075688772},"120":{"tf":2.0},"121":{"tf":2.23606797749979},"122":{"tf":1.4142135623730951},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":2.0},"141":{"tf":2.6457513110645907},"142":{"tf":1.7320508075688772},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":2.449489742783178},"165":{"tf":1.0},"167":{"tf":1.7320508075688772},"170":{"tf":2.0},"172":{"tf":2.6457513110645907},"173":{"tf":1.7320508075688772},"175":{"tf":2.8284271247461903},"176":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":2.0},"180":{"tf":3.1622776601683795},"181":{"tf":3.3166247903554},"182":{"tf":2.8284271247461903},"183":{"tf":1.4142135623730951},"185":{"tf":1.7320508075688772},"186":{"tf":2.23606797749979},"188":{"tf":2.449489742783178},"189":{"tf":2.0},"190":{"tf":1.0},"191":{"tf":3.0},"192":{"tf":2.449489742783178},"194":{"tf":1.4142135623730951},"198":{"tf":3.0},"199":{"tf":3.0},"200":{"tf":2.0},"201":{"tf":2.449489742783178},"202":{"tf":2.8284271247461903},"203":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"207":{"tf":2.0},"208":{"tf":1.7320508075688772},"210":{"tf":2.23606797749979},"211":{"tf":1.7320508075688772},"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"22":{"tf":1.0},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.449489742783178},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":3.0},"229":{"tf":4.0},"23":{"tf":1.0},"231":{"tf":2.23606797749979},"232":{"tf":4.898979485566356},"235":{"tf":1.0},"239":{"tf":1.7320508075688772},"240":{"tf":2.23606797749979},"241":{"tf":1.7320508075688772},"242":{"tf":3.4641016151377544},"243":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"245":{"tf":1.0},"246":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"249":{"tf":4.47213595499958},"250":{"tf":3.1622776601683795},"257":{"tf":1.4142135623730951},"258":{"tf":2.0},"26":{"tf":1.0},"266":{"tf":2.0},"272":{"tf":1.0},"273":{"tf":1.4142135623730951},"274":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":2.0},"280":{"tf":1.7320508075688772},"281":{"tf":3.1622776601683795},"283":{"tf":2.449489742783178},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"289":{"tf":4.242640687119285},"290":{"tf":2.449489742783178},"291":{"tf":1.0},"293":{"tf":2.0},"294":{"tf":2.23606797749979},"298":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":4.123105625617661},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"32":{"tf":1.0},"320":{"tf":2.8284271247461903},"321":{"tf":1.0},"322":{"tf":3.0},"323":{"tf":2.23606797749979},"324":{"tf":1.7320508075688772},"325":{"tf":1.4142135623730951},"33":{"tf":2.23606797749979},"331":{"tf":2.0},"334":{"tf":2.449489742783178},"335":{"tf":2.8284271247461903},"337":{"tf":1.0},"338":{"tf":1.0},"339":{"tf":1.4142135623730951},"34":{"tf":1.0},"340":{"tf":1.7320508075688772},"341":{"tf":2.6457513110645907},"342":{"tf":6.4031242374328485},"343":{"tf":3.1622776601683795},"348":{"tf":1.0},"349":{"tf":1.0},"35":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.4142135623730951},"352":{"tf":2.0},"353":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.4142135623730951},"359":{"tf":2.449489742783178},"36":{"tf":1.0},"360":{"tf":3.1622776601683795},"361":{"tf":1.7320508075688772},"362":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":3.605551275463989},"369":{"tf":1.7320508075688772},"37":{"tf":1.0},"370":{"tf":1.0},"374":{"tf":2.0},"375":{"tf":2.0},"376":{"tf":5.5677643628300215},"377":{"tf":2.8284271247461903},"378":{"tf":1.4142135623730951},"381":{"tf":5.0},"382":{"tf":2.23606797749979},"383":{"tf":2.0},"385":{"tf":3.872983346207417},"386":{"tf":2.449489742783178},"390":{"tf":1.0},"391":{"tf":2.8284271247461903},"392":{"tf":1.7320508075688772},"393":{"tf":1.0},"397":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":2.0},"402":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"405":{"tf":6.244997998398398},"407":{"tf":4.0},"408":{"tf":4.0},"41":{"tf":1.0},"412":{"tf":1.0},"414":{"tf":2.0},"416":{"tf":1.0},"417":{"tf":1.0},"42":{"tf":1.4142135623730951},"427":{"tf":2.0},"428":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772},"53":{"tf":2.0},"54":{"tf":2.449489742783178},"55":{"tf":2.0},"56":{"tf":2.0},"57":{"tf":1.7320508075688772},"58":{"tf":2.6457513110645907},"59":{"tf":1.4142135623730951},"61":{"tf":2.6457513110645907},"62":{"tf":2.6457513110645907},"68":{"tf":1.4142135623730951},"69":{"tf":1.0},"70":{"tf":2.449489742783178},"71":{"tf":1.7320508075688772},"72":{"tf":2.23606797749979},"73":{"tf":3.0},"74":{"tf":2.449489742783178},"75":{"tf":3.1622776601683795},"77":{"tf":3.4641016151377544},"78":{"tf":3.3166247903554},"82":{"tf":2.23606797749979},"83":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":2.0},"89":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"91":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":2.0},"94":{"tf":1.0},"95":{"tf":2.0},"96":{"tf":1.4142135623730951},"97":{"tf":1.7320508075688772}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"242":{"tf":2.6457513110645907}}}}},"o":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"242":{"tf":2.8284271247461903},"405":{"tf":4.47213595499958},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"当":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"尝":{"df":0,"docs":{},"试":{"df":0,"docs":{},"编":{"df":0,"docs":{},"译":{"df":0,"docs":{},"此":{"df":0,"docs":{},"代":{"df":0,"docs":{},"码":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"会":{"df":0,"docs":{},"出":{"df":0,"docs":{},"现":{"df":0,"docs":{},"错":{"df":0,"docs":{},"误":{"df":0,"docs":{},"提":{"df":0,"docs":{},"示":{"df":0,"docs":{},":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"242":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"242":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"102":{"tf":1.0},"324":{"tf":1.0}}}}}},"o":{"(":{"3":{"df":1,"docs":{"360":{"tf":1.0}}},"_":{"df":1,"docs":{"360":{"tf":1.0}}},"df":0,"docs":{},"x":{"df":1,"docs":{"352":{"tf":1.0}}}},"<":{"'":{"a":{">":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"191":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"414":{"tf":1.0}},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"352":{"tf":1.0},"370":{"tf":1.4142135623730951},"391":{"tf":1.0},"45":{"tf":1.0}}},"r":{".":{"<":{"/":{"df":0,"docs":{},"p":{"df":1,"docs":{"401":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"368":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"180":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"201":{"tf":1.0}}}}}}},"{":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"400":{"tf":1.0},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"141":{"tf":2.0},"179":{"tf":1.4142135623730951},"180":{"tf":1.7320508075688772},"181":{"tf":1.4142135623730951},"182":{"tf":2.0},"201":{"tf":1.4142135623730951},"377":{"tf":2.0},"391":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"91":{"tf":1.0}},"t":{"df":1,"docs":{"377":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"400":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.7320508075688772}}}},"df":21,"docs":{"142":{"tf":1.0},"173":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"320":{"tf":1.7320508075688772},"324":{"tf":1.0},"351":{"tf":1.4142135623730951},"362":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":1.4142135623730951},"414":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"428":{"tf":1.0},"51":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"r":{"df":5,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.7320508075688772},"203":{"tf":1.0},"330":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"392":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"ç":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"431":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"137":{"tf":1.0}}},"df":2,"docs":{"283":{"tf":1.0},"70":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"g":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":2.0}}},"m":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"162":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":1,"docs":{"162":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{">":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":8,"docs":{"114":{"tf":2.23606797749979},"115":{"tf":1.7320508075688772},"116":{"tf":3.1622776601683795},"120":{"tf":1.7320508075688772},"121":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":3.0},"128":{"tf":1.4142135623730951}},"e":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"/":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"114":{"tf":1.0}}}}}},"s":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"161":{"tf":1.7320508075688772},"218":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"\"":{"4":{"0":{"4":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"401":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"161":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":11,"docs":{"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"218":{"tf":1.0},"221":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":4,"docs":{"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"324":{"tf":1.4142135623730951}},"i":{"df":2,"docs":{"364":{"tf":1.0},"376":{"tf":1.4142135623730951}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"'":{"df":4,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"368":{"tf":1.0},"75":{"tf":1.4142135623730951}}},"1":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}},"2":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":34,"docs":{"115":{"tf":1.4142135623730951},"116":{"tf":2.449489742783178},"146":{"tf":1.0},"162":{"tf":1.7320508075688772},"189":{"tf":1.0},"206":{"tf":2.0},"237":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"273":{"tf":1.0},"283":{"tf":1.0},"299":{"tf":1.7320508075688772},"31":{"tf":1.0},"316":{"tf":1.4142135623730951},"320":{"tf":1.0},"34":{"tf":1.0},"368":{"tf":2.23606797749979},"376":{"tf":1.4142135623730951},"377":{"tf":1.0},"382":{"tf":1.0},"384":{"tf":1.0},"385":{"tf":1.0},"386":{"tf":1.4142135623730951},"393":{"tf":1.0},"405":{"tf":3.3166247903554},"407":{"tf":2.0},"408":{"tf":1.7320508075688772},"412":{"tf":1.0},"55":{"tf":2.23606797749979},"56":{"tf":1.7320508075688772},"57":{"tf":2.23606797749979},"58":{"tf":2.0},"75":{"tf":1.0},"96":{"tf":1.0}}}}}}},"df":1,"docs":{"260":{"tf":1.0}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"376":{"tf":2.23606797749979}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"252":{"tf":1.0},"428":{"tf":1.0}}}}}}},"t":{"1":{"df":1,"docs":{"318":{"tf":1.7320508075688772}}},"2":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"318":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"318":{"tf":1.7320508075688772}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":2,"docs":{"316":{"tf":1.0},"322":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"315":{"tf":4.123105625617661},"316":{"tf":5.5677643628300215},"317":{"tf":1.0},"318":{"tf":3.1622776601683795},"319":{"tf":4.795831523312719},"320":{"tf":7.211102550927978},"321":{"tf":4.242640687119285},"322":{"tf":4.242640687119285},"323":{"tf":4.58257569495584},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"412":{"tf":1.4142135623730951}},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"316":{"tf":1.0},"320":{"tf":2.8284271247461903}}}}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"323":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"323":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"任":{"df":0,"docs":{},"务":{"df":0,"docs":{},"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"线":{"df":0,"docs":{},"程":{"df":0,"docs":{},"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"327":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}},"df":0,"docs":{}}}}}}},"。":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"319":{"tf":1.0}}}}}}}}}}}},"{":{"3":{"2":{"df":1,"docs":{"428":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}}}},"g":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"213":{"tf":1.0}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"260":{"tf":1.0},"31":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"、":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"330":{"tf":1.4142135623730951}}}},"r":{"b":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"64":{"tf":1.0},"70":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":1,"docs":{"113":{"tf":2.23606797749979}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"437":{"tf":1.0}}}}},"c":{"c":{"df":2,"docs":{"15":{"tf":1.0},"24":{"tf":1.0}}},"df":1,"docs":{"70":{"tf":1.7320508075688772}}},"df":10,"docs":{"10":{"tf":1.0},"213":{"tf":1.0},"325":{"tf":1.0},"359":{"tf":2.0},"432":{"tf":1.0},"433":{"tf":1.0},"434":{"tf":1.0},"435":{"tf":1.0},"436":{"tf":1.0},"437":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"/":{"2":{"0":{"1":{"0":{"0":{"1":{"0":{"1":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"41":{"tf":1.4142135623730951},"421":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"391":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":10,"docs":{"120":{"tf":1.0},"169":{"tf":1.0},"225":{"tf":1.0},"246":{"tf":1.0},"252":{"tf":1.0},"266":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"405":{"tf":1.0},"57":{"tf":1.0}},"i":{"c":{"<":{"df":0,"docs":{},"t":{">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"383":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"169":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"12":{"tf":1.0},"239":{"tf":2.0}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"167":{"tf":1.0},"93":{"tf":1.4142135623730951}}}}}}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":2.0},"29":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"u":{"b":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"259":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.0}}}}}}}},"v":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"239":{"tf":1.0}}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"df":1,"docs":{"239":{"tf":2.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"52":{"tf":1.0}},"n":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"72":{"tf":2.0}}}}}}}}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":3,"docs":{"112":{"tf":1.0},"126":{"tf":2.6457513110645907},"199":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":7,"docs":{"211":{"tf":1.0},"300":{"tf":1.0},"304":{"tf":1.0},"323":{"tf":1.0},"370":{"tf":1.4142135623730951},"383":{"tf":1.0},"59":{"tf":1.0}},"e":{"df":3,"docs":{"137":{"tf":1.0},"286":{"tf":1.4142135623730951},"352":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":1,"docs":{"313":{"tf":1.4142135623730951}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"406":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"_":{"1":{"0":{"0":{"df":1,"docs":{"202":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":1,"docs":{"202":{"tf":2.23606797749979}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"258":{"tf":1.4142135623730951},"348":{"tf":1.0},"359":{"tf":1.7320508075688772}}},"t":{"df":1,"docs":{"201":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"201":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"201":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"201":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":4,"docs":{"157":{"tf":1.0},"158":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"162":{"tf":2.0}},"e":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"157":{"tf":2.23606797749979},"158":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"157":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"p":{"df":4,"docs":{"10":{"tf":1.0},"213":{"tf":1.7320508075688772},"214":{"tf":1.0},"267":{"tf":1.0}}}},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"110":{"tf":1.0},"113":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"305":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},".":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"(":{")":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":4,"docs":{"167":{"tf":1.0},"382":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}},"e":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":4,"docs":{"125":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"2":{"0":{"0":{"df":1,"docs":{"202":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"167":{"tf":2.0},"202":{"tf":1.4142135623730951},"224":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":19,"docs":{"124":{"tf":2.23606797749979},"125":{"tf":3.3166247903554},"167":{"tf":5.0},"202":{"tf":5.477225575051661},"260":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":4.47213595499958},"34":{"tf":3.0},"35":{"tf":3.0},"36":{"tf":2.6457513110645907},"37":{"tf":2.23606797749979},"38":{"tf":1.7320508075688772},"382":{"tf":3.605551275463989},"41":{"tf":3.3166247903554},"42":{"tf":5.291502622129181},"43":{"tf":3.7416573867739413},"44":{"tf":2.449489742783178},"45":{"tf":4.69041575982343},"52":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":12,"docs":{"202":{"tf":2.0},"260":{"tf":1.7320508075688772},"261":{"tf":2.0},"263":{"tf":1.4142135623730951},"32":{"tf":2.0},"36":{"tf":1.7320508075688772},"38":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0}},"e":{"@":{"1":{".":{"0":{".":{"1":{"df":1,"docs":{"263":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"。":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"167":{"tf":1.0}}}}}}}}},"i":{":":{":":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}},"df":0,"docs":{}},"{":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":1,"docs":{"430":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"116":{"tf":1.0}}}}}}},"df":3,"docs":{"333":{"tf":2.449489742783178},"334":{"tf":1.0},"335":{"tf":2.449489742783178}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"398":{"tf":1.0}}}}},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"432":{"tf":1.4142135623730951}}}}}}}},"h":{"1":{">":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"!":{"<":{"/":{"df":0,"docs":{},"h":{"1":{"df":1,"docs":{"400":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"!":{"<":{"/":{"df":0,"docs":{},"h":{"1":{"df":1,"docs":{"401":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"288":{"tf":1.0}}}},"n":{"d":{"df":2,"docs":{"252":{"tf":1.0},"375":{"tf":1.0}},"l":{"df":11,"docs":{"106":{"tf":1.0},"157":{"tf":1.7320508075688772},"162":{"tf":2.0},"219":{"tf":1.0},"225":{"tf":1.0},"298":{"tf":2.0},"299":{"tf":2.8284271247461903},"306":{"tf":4.0},"318":{"tf":1.4142135623730951},"353":{"tf":1.0},"36":{"tf":1.0}},"e":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"318":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"298":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"306":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"298":{"tf":1.4142135623730951}}}}}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"398":{"tf":1.7320508075688772},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"153":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":11,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"146":{"tf":2.449489742783178},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.4142135623730951},"152":{"tf":1.0},"17":{"tf":1.0},"423":{"tf":3.1622776601683795}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"151":{"tf":2.0}}}},"m":{"a":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"121":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"380":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"k":{"df":4,"docs":{"146":{"tf":1.4142135623730951},"169":{"tf":1.0},"420":{"tf":1.4142135623730951},"423":{"tf":1.0}}}},"df":4,"docs":{"121":{"tf":1.4142135623730951},"124":{"tf":1.0},"147":{"tf":1.7320508075688772},"151":{"tf":1.0}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"三":{"df":0,"docs":{},"个":{"df":0,"docs":{},"常":{"df":0,"docs":{},"用":{"df":0,"docs":{},"集":{"df":0,"docs":{},"合":{"df":0,"docs":{},"中":{"df":0,"docs":{},",":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"147":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"331":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"378":{"tf":1.0},"405":{"tf":1.0}}}}}},"y":{"df":1,"docs":{"152":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"414":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"216":{"tf":1.7320508075688772},"414":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"”":{"df":0,"docs":{},"(":{"df":0,"docs":{},"“":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"152":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":4,"docs":{"142":{"tf":1.7320508075688772},"325":{"tf":1.0},"359":{"tf":1.0},"56":{"tf":1.4142135623730951}},"e":{"a":{"d":{"df":2,"docs":{"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"398":{"tf":1.0},"399":{"tf":1.7320508075688772},"401":{"tf":1.0},"402":{"tf":1.0}},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"、":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},"df":0,"docs":{}}},";":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"p":{"df":1,"docs":{"66":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"88":{"tf":2.0}}},"df":11,"docs":{"100":{"tf":1.0},"199":{"tf":3.7416573867739413},"242":{"tf":3.872983346207417},"335":{"tf":2.23606797749979},"88":{"tf":2.0},"90":{"tf":2.23606797749979},"91":{"tf":3.0},"93":{"tf":2.0},"95":{"tf":2.6457513110645907},"96":{"tf":1.4142135623730951},"97":{"tf":2.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"\"":{"[":{"0":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"\"":{")":{";":{"df":0,"docs":{},"。":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"&":{"(":{"*":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":6,"docs":{"400":{"tf":1.7320508075688772},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951}}}}}},":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"405":{"tf":1.0},"408":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"[":{"0":{".":{".":{"1":{"df":1,"docs":{"143":{"tf":1.0}}},"4":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"26":{"tf":2.6457513110645907},"27":{"tf":2.23606797749979},"29":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":3.872983346207417}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}}}}},"/":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"391":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"391":{"tf":4.47213595499958}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":2,"docs":{"21":{"tf":2.0},"369":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":43,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"140":{"tf":3.3166247903554},"141":{"tf":1.0},"142":{"tf":4.795831523312719},"143":{"tf":1.0},"150":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"191":{"tf":1.0},"20":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"22":{"tf":2.449489742783178},"23":{"tf":1.7320508075688772},"24":{"tf":1.7320508075688772},"25":{"tf":2.23606797749979},"26":{"tf":2.0},"266":{"tf":1.0},"27":{"tf":2.449489742783178},"28":{"tf":1.0},"281":{"tf":2.6457513110645907},"29":{"tf":1.0},"30":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"32":{"tf":1.7320508075688772},"320":{"tf":1.0},"362":{"tf":1.0},"369":{"tf":1.0},"382":{"tf":1.0},"383":{"tf":1.0},"391":{"tf":2.0},"395":{"tf":1.4142135623730951},"397":{"tf":1.7320508075688772},"398":{"tf":1.0},"405":{"tf":3.872983346207417},"407":{"tf":2.0},"408":{"tf":1.0},"55":{"tf":1.4142135623730951},"59":{"tf":1.0},"68":{"tf":1.4142135623730951},"69":{"tf":1.0},"70":{"tf":1.0},"78":{"tf":2.23606797749979}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"m":{"df":0,"docs":{},"、":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"p":{"df":44,"docs":{"102":{"tf":1.4142135623730951},"106":{"tf":1.0},"120":{"tf":1.0},"142":{"tf":1.7320508075688772},"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"186":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"240":{"tf":1.0},"242":{"tf":1.0},"246":{"tf":1.0},"26":{"tf":1.0},"267":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"283":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"324":{"tf":1.7320508075688772},"335":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"368":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":1.4142135623730951},"386":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.4142135623730951},"427":{"tf":1.0},"428":{"tf":1.4142135623730951},"49":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.7320508075688772},"87":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"e":{"df":29,"docs":{"106":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"134":{"tf":1.7320508075688772},"137":{"tf":1.0},"185":{"tf":1.7320508075688772},"188":{"tf":1.7320508075688772},"189":{"tf":1.0},"203":{"tf":1.4142135623730951},"208":{"tf":1.4142135623730951},"211":{"tf":1.0},"240":{"tf":1.0},"285":{"tf":1.4142135623730951},"299":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"322":{"tf":1.0},"323":{"tf":1.0},"352":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"370":{"tf":1.4142135623730951},"376":{"tf":1.0},"405":{"tf":1.0},"42":{"tf":1.0},"59":{"tf":1.0},"70":{"tf":1.4142135623730951},"74":{"tf":2.449489742783178},"78":{"tf":1.7320508075688772}}}},"x":{"df":1,"docs":{"53":{"tf":1.0}}}},"i":{"df":7,"docs":{"298":{"tf":5.916079783099616},"300":{"tf":1.7320508075688772},"302":{"tf":1.0},"303":{"tf":1.0},"318":{"tf":5.916079783099616},"319":{"tf":1.0},"320":{"tf":1.0}},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"167":{"tf":1.0}}}}},"o":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},",":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"102":{"tf":1.0}}}}}}}}},"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"142":{"tf":1.0}}},"d":{"df":2,"docs":{"95":{"tf":2.449489742783178},"97":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"267":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"101":{"tf":2.0},"165":{"tf":1.0},"21":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"260":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"59":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"196":{"tf":1.0}}}}}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"179":{"tf":1.0},"180":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":9,"docs":{"114":{"tf":2.0},"115":{"tf":3.0},"116":{"tf":3.4641016151377544},"120":{"tf":2.449489742783178},"121":{"tf":1.0},"123":{"tf":1.4142135623730951},"127":{"tf":3.0},"128":{"tf":1.0},"398":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.7320508075688772}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"120":{"tf":2.0},"121":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"。":{"df":0,"docs":{},"最":{"df":0,"docs":{},"后":{"df":0,"docs":{},",":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"116":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"w":{"'":{"df":1,"docs":{"383":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"v":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"359":{"tf":1.0}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"5":{"df":1,"docs":{"400":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"316":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":6,"docs":{"0":{"tf":1.0},"257":{"tf":2.6457513110645907},"316":{"tf":2.0},"400":{"tf":3.4641016151377544},"401":{"tf":3.4641016151377544},"404":{"tf":1.0}}}},"t":{"df":0,"docs":{},"p":{"/":{"1":{".":{"1":{"df":8,"docs":{"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":1.0},"401":{"tf":2.23606797749979},"402":{"tf":1.7320508075688772},"404":{"tf":2.23606797749979},"405":{"tf":3.872983346207417},"408":{"tf":3.1622776601683795}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"/":{"/":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{":":{"7":{"8":{"7":{"8":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"404":{"tf":1.0}}}}}}}},"df":1,"docs":{"404":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"398":{"tf":1.7320508075688772},"399":{"tf":1.0},"400":{"tf":1.4142135623730951}}}}}}}}}},"df":9,"docs":{"15":{"tf":1.0},"166":{"tf":1.0},"316":{"tf":1.0},"395":{"tf":2.0},"396":{"tf":2.23606797749979},"397":{"tf":1.0},"398":{"tf":2.449489742783178},"399":{"tf":2.449489742783178},"401":{"tf":1.0}},"s":{":":{"/":{"/":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"m":{"df":1,"docs":{"259":{"tf":1.0}}}},"df":1,"docs":{"260":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"c":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":6,"docs":{"0":{"tf":1.0},"142":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.4142135623730951},"32":{"tf":1.0},"353":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"c":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":3,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"428":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"359":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":4.358898943540674}}}},"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"196":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"396":{"tf":1.0}}}}}}}}}}},"i":{"'":{"df":0,"docs":{},"m":{"df":3,"docs":{"218":{"tf":1.7320508075688772},"225":{"tf":1.0},"229":{"tf":1.0}}}},".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{")":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"/":{"df":0,"docs":{},"o":{"df":33,"docs":{"213":{"tf":1.7320508075688772},"214":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"236":{"tf":1.4142135623730951},"237":{"tf":1.0},"248":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"251":{"tf":1.0},"253":{"tf":1.0},"381":{"tf":1.4142135623730951},"400":{"tf":1.0},"405":{"tf":2.23606797749979}}}},"1":{"2":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":2,"docs":{"252":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"3":{"2":{"df":57,"docs":{"101":{"tf":3.605551275463989},"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"147":{"tf":1.0},"149":{"tf":1.0},"167":{"tf":3.0},"169":{"tf":1.0},"170":{"tf":2.449489742783178},"172":{"tf":2.0},"175":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"181":{"tf":1.7320508075688772},"187":{"tf":2.8284271247461903},"191":{"tf":2.0},"192":{"tf":1.7320508075688772},"202":{"tf":2.8284271247461903},"206":{"tf":1.4142135623730951},"245":{"tf":1.0},"252":{"tf":1.4142135623730951},"257":{"tf":2.0},"266":{"tf":2.0},"272":{"tf":1.7320508075688772},"273":{"tf":1.4142135623730951},"274":{"tf":2.6457513110645907},"275":{"tf":1.4142135623730951},"277":{"tf":1.7320508075688772},"280":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":2.449489742783178},"306":{"tf":2.449489742783178},"331":{"tf":1.4142135623730951},"352":{"tf":2.0},"359":{"tf":4.358898943540674},"360":{"tf":2.23606797749979},"362":{"tf":1.0},"367":{"tf":2.6457513110645907},"368":{"tf":4.123105625617661},"370":{"tf":1.0},"375":{"tf":1.4142135623730951},"377":{"tf":2.0},"380":{"tf":1.0},"381":{"tf":3.3166247903554},"385":{"tf":3.1622776601683795},"386":{"tf":2.23606797749979},"417":{"tf":1.0},"42":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":2.0},"56":{"tf":2.0},"58":{"tf":3.1622776601683795},"61":{"tf":1.0},"70":{"tf":1.7320508075688772},"71":{"tf":1.4142135623730951},"79":{"tf":1.0},"85":{"tf":2.23606797749979}},"。":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"53":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"172":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},";":{"3":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"6":{"4":{"df":3,"docs":{"252":{"tf":1.4142135623730951},"42":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":2,"docs":{"102":{"tf":3.3166247903554},"53":{"tf":1.4142135623730951}}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"=":{"1":{"df":1,"docs":{"393":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"362":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":7,"docs":{"20":{"tf":2.0},"362":{"tf":4.0},"380":{"tf":1.4142135623730951},"405":{"tf":5.830951894845301},"407":{"tf":4.242640687119285},"408":{"tf":3.7416573867739413},"429":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":4,"docs":{"320":{"tf":1.0},"391":{"tf":2.449489742783178},"416":{"tf":2.6457513110645907},"417":{"tf":2.8284271247461903}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":3,"docs":{"260":{"tf":1.0},"398":{"tf":1.0},"414":{"tf":1.7320508075688772}}}}},"(":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}}},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"348":{"tf":1.4142135623730951}}}}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":18,"docs":{"198":{"tf":2.23606797749979},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.0},"208":{"tf":3.605551275463989},"211":{"tf":2.8284271247461903},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"246":{"tf":1.0},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"36":{"tf":1.0}},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"232":{"tf":3.605551275463989},"249":{"tf":3.0},"250":{"tf":1.7320508075688772}},"e":{"=":{"1":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"232":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"。":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"也":{"df":0,"docs":{},"没":{"df":0,"docs":{},"有":{"df":0,"docs":{},"过":{"df":0,"docs":{},"滤":{"df":0,"docs":{},"需":{"df":0,"docs":{},"要":{"df":0,"docs":{},"运":{"df":0,"docs":{},"行":{"df":0,"docs":{},"的":{"df":0,"docs":{},"测":{"df":0,"docs":{},"试":{"df":0,"docs":{},",":{"df":0,"docs":{},"所":{"df":0,"docs":{},"以":{"df":0,"docs":{},"摘":{"df":0,"docs":{},"要":{"df":0,"docs":{},"中":{"df":0,"docs":{},"会":{"df":0,"docs":{},"显":{"df":0,"docs":{},"示":{"0":{"df":1,"docs":{"198":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"333":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"134":{"tf":1.7320508075688772},"49":{"tf":2.0},"74":{"tf":1.7320508075688772},"78":{"tf":1.7320508075688772}}}}},"p":{"df":0,"docs":{},"l":{"<":{"'":{"a":{"df":3,"docs":{"192":{"tf":2.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":8,"docs":{"175":{"tf":1.4142135623730951},"183":{"tf":1.7320508075688772},"242":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"281":{"tf":2.0},"334":{"tf":1.0},"382":{"tf":1.0}}},"x":{"1":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"(":{"&":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"391":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":61,"docs":{"101":{"tf":1.4142135623730951},"119":{"tf":1.0},"161":{"tf":1.0},"167":{"tf":1.0},"175":{"tf":3.1622776601683795},"179":{"tf":2.0},"180":{"tf":2.449489742783178},"181":{"tf":3.3166247903554},"182":{"tf":3.1622776601683795},"183":{"tf":2.0},"191":{"tf":1.0},"192":{"tf":1.7320508075688772},"199":{"tf":2.0},"202":{"tf":2.0},"223":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"239":{"tf":1.0},"249":{"tf":2.6457513110645907},"250":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"330":{"tf":1.0},"331":{"tf":1.0},"334":{"tf":1.4142135623730951},"335":{"tf":2.23606797749979},"338":{"tf":1.4142135623730951},"339":{"tf":1.7320508075688772},"340":{"tf":1.4142135623730951},"341":{"tf":1.7320508075688772},"342":{"tf":3.4641016151377544},"343":{"tf":2.23606797749979},"370":{"tf":1.4142135623730951},"374":{"tf":1.7320508075688772},"375":{"tf":1.7320508075688772},"376":{"tf":4.0},"377":{"tf":2.0},"378":{"tf":1.0},"386":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"405":{"tf":4.242640687119285},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"412":{"tf":1.4142135623730951},"417":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":3.0},"94":{"tf":1.0},"95":{"tf":1.7320508075688772},"96":{"tf":2.0},"97":{"tf":3.0},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":25,"docs":{"102":{"tf":2.8284271247461903},"142":{"tf":2.0},"162":{"tf":1.4142135623730951},"183":{"tf":2.0},"242":{"tf":1.0},"252":{"tf":1.0},"277":{"tf":1.4142135623730951},"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.7320508075688772},"309":{"tf":1.0},"320":{"tf":2.449489742783178},"323":{"tf":1.0},"324":{"tf":1.0},"335":{"tf":1.4142135623730951},"370":{"tf":1.0},"376":{"tf":1.0},"377":{"tf":2.0},"391":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"70":{"tf":1.4142135623730951},"91":{"tf":2.0},"93":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"58":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"<":{"'":{"a":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":2.6457513110645907},"192":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"120":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"324":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"219":{"tf":1.0},"248":{"tf":1.0}}}}}}},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}},"c":{"df":1,"docs":{"369":{"tf":1.0}},"h":{"df":1,"docs":{"359":{"tf":1.0}}},"l":{"df":0,"docs":{},"u":{"d":{"df":3,"docs":{"127":{"tf":1.0},"159":{"tf":1.4142135623730951},"208":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"397":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"_":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"142":{"tf":1.0}}}}}}}}},"df":16,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"156":{"tf":2.0},"219":{"tf":1.0},"224":{"tf":2.0},"260":{"tf":1.0},"261":{"tf":1.0},"263":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"350":{"tf":2.6457513110645907},"392":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"417":{"tf":1.0},"54":{"tf":3.0},"62":{"tf":2.6457513110645907}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"417":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"273":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}}},"o":{"df":4,"docs":{"260":{"tf":1.0},"277":{"tf":1.0},"301":{"tf":1.0},"70":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.4142135623730951},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.4142135623730951},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"368":{"tf":1.7320508075688772},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"428":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"332":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"83":{"tf":1.0}},"i":{"df":4,"docs":{"140":{"tf":1.7320508075688772},"293":{"tf":2.0},"316":{"tf":1.0},"70":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"429":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},"df":1,"docs":{"51":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":17,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"191":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"382":{"tf":1.0},"391":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.7320508075688772},"43":{"tf":2.23606797749979},"44":{"tf":1.0},"45":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"398":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":5,"docs":{"147":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"143":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"15":{"tf":1.4142135623730951},"267":{"tf":3.3166247903554},"268":{"tf":1.0},"436":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"322":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":8,"docs":{"233":{"tf":1.0},"300":{"tf":1.0},"377":{"tf":1.4142135623730951},"386":{"tf":1.0},"405":{"tf":1.0},"427":{"tf":1.0},"75":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":9,"docs":{"142":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"240":{"tf":1.0},"277":{"tf":2.23606797749979},"351":{"tf":2.449489742783178},"42":{"tf":1.4142135623730951},"53":{"tf":1.0},"61":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"173":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":1.7320508075688772}}}},"df":1,"docs":{"211":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"209":{"tf":1.0}}}},"l":{"df":1,"docs":{"398":{"tf":1.0}}},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}},"r":{"df":0,"docs":{},"f":{"a":{"c":{"df":2,"docs":{"177":{"tf":1.0},"368":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},",":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"270":{"tf":1.0},"287":{"tf":1.4142135623730951}}}}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"_":{"a":{"d":{"d":{"df":1,"docs":{"210":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"2":{"df":1,"docs":{"210":{"tf":1.0}}},"a":{"df":1,"docs":{"210":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"210":{"tf":1.0}}}}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"如":{"df":0,"docs":{},"果":{"df":0,"docs":{},"你":{"df":0,"docs":{},"并":{"df":0,"docs":{},"不":{"df":0,"docs":{},"认":{"df":0,"docs":{},"为":{"df":0,"docs":{},"应":{"df":0,"docs":{},"该":{"df":0,"docs":{},"测":{"df":0,"docs":{},"试":{"df":0,"docs":{},"私":{"df":0,"docs":{},"有":{"df":0,"docs":{},"函":{"df":0,"docs":{},"数":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"210":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"210":{"tf":1.0},"211":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"247":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":5,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"87":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"257":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"239":{"tf":2.8284271247461903}}}}}}}}}},"o":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"160":{"tf":2.449489742783178},"161":{"tf":2.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"121":{"tf":1.0},"36":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}},"df":0,"docs":{}}},"{":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":9,"docs":{"125":{"tf":1.0},"158":{"tf":1.0},"213":{"tf":1.0},"248":{"tf":1.0},"313":{"tf":1.4142135623730951},"316":{"tf":1.0},"33":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"434":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"122":{"tf":1.7320508075688772}}}}}}}}},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"v":{"4":{"(":{"1":{"2":{"7":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"6":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{":":{":":{"1":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"101":{"tf":3.0},"165":{"tf":1.4142135623730951}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"v":{"4":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":2.449489742783178}}},"6":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"100":{"tf":2.0},"101":{"tf":3.605551275463989}}},"df":0,"docs":{}}}},":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"100":{"tf":2.8284271247461903},"101":{"tf":2.449489742783178},"165":{"tf":2.449489742783178},"397":{"tf":1.0}},"v":{"4":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"100":{"tf":1.0}},"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"100":{"tf":1.0}}}}}}}},"6":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"100":{"tf":1.4142135623730951}},"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"100":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"345":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":1.7320508075688772}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"152":{"tf":1.0}}}}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"232":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"348":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"353":{"tf":1.0},"405":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}},"t":{"'":{"df":1,"docs":{"306":{"tf":1.0}}},"_":{"a":{"d":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":2,"docs":{"200":{"tf":1.4142135623730951},"211":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"7":{"5":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":5,"docs":{"198":{"tf":1.7320508075688772},"203":{"tf":1.4142135623730951},"208":{"tf":1.4142135623730951},"210":{"tf":1.0},"266":{"tf":1.4142135623730951}}}}}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"431":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"181":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"1":{"df":1,"docs":{"181":{"tf":1.7320508075688772}}},"2":{"df":1,"docs":{"181":{"tf":2.23606797749979}}},"df":16,"docs":{"115":{"tf":1.0},"170":{"tf":1.7320508075688772},"172":{"tf":3.1622776601683795},"181":{"tf":2.23606797749979},"191":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"244":{"tf":2.23606797749979},"249":{"tf":1.0},"293":{"tf":2.6457513110645907},"324":{"tf":1.0},"374":{"tf":2.8284271247461903},"392":{"tf":1.0},"405":{"tf":1.4142135623730951},"70":{"tf":1.0},"77":{"tf":3.3166247903554},"78":{"tf":2.8284271247461903}}},"r":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"77":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"=":{"df":0,"docs":{},"t":{"df":1,"docs":{"417":{"tf":1.0}}}},"df":2,"docs":{"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"374":{"tf":1.0}}}}},"t":{"df":1,"docs":{"374":{"tf":1.0}}}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"245":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":16,"docs":{"182":{"tf":1.0},"215":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":3.0},"245":{"tf":1.7320508075688772},"246":{"tf":2.6457513110645907},"249":{"tf":2.0},"306":{"tf":1.0},"315":{"tf":1.0},"320":{"tf":1.0},"324":{"tf":3.0},"374":{"tf":3.3166247903554},"405":{"tf":1.0},"408":{"tf":1.0},"77":{"tf":1.7320508075688772}}}}},"’":{"df":0,"docs":{},"m":{"df":2,"docs":{"218":{"tf":1.0},"59":{"tf":1.4142135623730951}}}},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"427":{"tf":1.0}}}}}}}},"j":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"325":{"tf":1.0}},"o":{"b":{"df":3,"docs":{"405":{"tf":5.830951894845301},"407":{"tf":4.47213595499958},"408":{"tf":3.872983346207417}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"3":{"df":2,"docs":{"319":{"tf":1.0},"320":{"tf":1.7320508075688772}}},"4":{"df":1,"docs":{"320":{"tf":1.0}}},"_":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"320":{"tf":2.449489742783178},"323":{"tf":1.0}},"l":{"<":{"df":0,"docs":{},"i":{">":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"320":{"tf":2.0}},"l":{"<":{"df":0,"docs":{},"f":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}},"i":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":9,"docs":{"241":{"tf":1.0},"298":{"tf":2.449489742783178},"306":{"tf":1.0},"318":{"tf":2.6457513110645907},"320":{"tf":3.1622776601683795},"321":{"tf":1.4142135623730951},"406":{"tf":1.0},"407":{"tf":3.1622776601683795},"408":{"tf":2.23606797749979}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":5,"docs":{"298":{"tf":1.4142135623730951},"306":{"tf":1.0},"318":{"tf":1.0},"405":{"tf":2.449489742783178},"407":{"tf":1.7320508075688772}},"e":{":":{":":{"<":{"df":0,"docs":{},"t":{">":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"407":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"_":{"df":1,"docs":{"407":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"298":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"、":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"、":{"df":0,"docs":{},"r":{"a":{"c":{"df":1,"docs":{"323":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"s":{"df":1,"docs":{"24":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"k":{"'":{".":{".":{"=":{"'":{"df":0,"docs":{},"z":{"df":1,"docs":{"358":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"328":{"tf":1.0}}}},"b":{"df":1,"docs":{"267":{"tf":1.0}}},"df":2,"docs":{"146":{"tf":1.0},"242":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"389":{"tf":1.0},"398":{"tf":1.0}}}},"y":{"df":6,"docs":{"148":{"tf":1.0},"26":{"tf":1.0},"32":{"tf":1.0},"420":{"tf":1.4142135623730951},"423":{"tf":1.0},"82":{"tf":1.4142135623730951}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}}},"df":5,"docs":{"299":{"tf":1.4142135623730951},"316":{"tf":1.0},"334":{"tf":1.0},"414":{"tf":1.4142135623730951},"48":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"411":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":3.4641016151377544}}}}}}},"n":{"d":{"df":6,"docs":{"101":{"tf":2.449489742783178},"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"258":{"tf":2.6457513110645907},"43":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"a":{"b":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":6,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"401":{"tf":1.0}},"n":{"df":2,"docs":{"386":{"tf":1.0},"52":{"tf":1.0}}}}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"335":{"tf":2.0},"62":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"c":{"df":0,"docs":{},"h":{"0":{"8":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"1":{"9":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"260":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"26":{"tf":1.0},"260":{"tf":1.0},"32":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"273":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}},"/":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"h":{"1":{"3":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"=":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":6,"docs":{"102":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.0},"316":{"tf":1.4142135623730951},"398":{"tf":1.0},"429":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}}},"_":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":2.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"199":{"tf":2.23606797749979}}},"s":{"df":0,"docs":{},"t":{"(":{"&":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.4142135623730951},"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}}}}},"<":{"df":0,"docs":{},"t":{">":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"172":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"(":{"&":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"3":{"2":{"(":{"&":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":1,"docs":{"172":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"170":{"tf":5.291502622129181},"172":{"tf":4.898979485566356},"183":{"tf":1.4142135623730951}}}}}}},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}},"e":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"102":{"tf":1.0},"162":{"tf":1.0},"360":{"tf":1.7320508075688772},"66":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"134":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"322":{"tf":1.0},"74":{"tf":1.4142135623730951},"78":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}},"z":{"df":0,"docs":{},"i":{"df":3,"docs":{"243":{"tf":1.0},"246":{"tf":1.0},"316":{"tf":1.0}}}}},"df":1,"docs":{"141":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"294":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":1,"docs":{"294":{"tf":6.082762530298219}},"和":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"k":{"df":1,"docs":{"292":{"tf":1.0}}},"v":{"df":1,"docs":{"434":{"tf":1.0}}}},"d":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}}}}},"df":10,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":2.6457513110645907},"203":{"tf":1.0},"206":{"tf":2.0},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"323":{"tf":1.0},"368":{"tf":1.4142135623730951}}}},"n":{"df":11,"docs":{"142":{"tf":1.0},"156":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"368":{"tf":2.6457513110645907},"377":{"tf":1.7320508075688772},"416":{"tf":1.0},"417":{"tf":2.0},"54":{"tf":1.0},"72":{"tf":1.7320508075688772},"73":{"tf":2.449489742783178},"78":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":8,"docs":{"400":{"tf":1.4142135623730951},"401":{"tf":2.449489742783178},"402":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0},"72":{"tf":1.7320508075688772},"73":{"tf":1.7320508075688772}},"}":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":6,"docs":{"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"202":{"tf":2.6457513110645907}},"、":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"t":{"'":{"df":1,"docs":{"368":{"tf":1.0}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"358":{"tf":1.7320508075688772}}}}},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"348":{"tf":1.7320508075688772}}}}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"46":{"tf":1.0}},"、":{"df":0,"docs":{},"方":{"df":0,"docs":{},"法":{"df":0,"docs":{},"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"关":{"df":0,"docs":{},"联":{"df":0,"docs":{},"函":{"df":0,"docs":{},"数":{"df":0,"docs":{},"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"405":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"192":{"tf":1.0},"255":{"tf":3.0}}}}}},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":3,"docs":{"211":{"tf":1.4142135623730951},"220":{"tf":2.449489742783178},"266":{"tf":1.0}}}},"c":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}},"df":18,"docs":{"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.4142135623730951},"198":{"tf":1.4142135623730951},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"289":{"tf":1.0},"290":{"tf":1.0},"386":{"tf":1.0},"391":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"407":{"tf":1.4142135623730951}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"111":{"tf":1.0},"198":{"tf":1.0},"227":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0}}},"y":{"'":{"df":1,"docs":{"211":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"260":{"tf":4.242640687119285}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":10,"docs":{"169":{"tf":1.0},"184":{"tf":1.4142135623730951},"186":{"tf":1.7320508075688772},"188":{"tf":1.0},"191":{"tf":2.23606797749979},"193":{"tf":1.0},"228":{"tf":1.7320508075688772},"368":{"tf":1.0},"75":{"tf":1.7320508075688772},"87":{"tf":2.6457513110645907}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"8":{"0":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"289":{"tf":3.3166247903554},"290":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"'":{"a":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"229":{"tf":1.7320508075688772},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"&":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":28,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"162":{"tf":1.0},"167":{"tf":1.0},"214":{"tf":1.0},"229":{"tf":3.1622776601683795},"231":{"tf":1.4142135623730951},"232":{"tf":3.872983346207417},"249":{"tf":3.0},"250":{"tf":2.0},"257":{"tf":1.0},"293":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"382":{"tf":1.0},"398":{"tf":2.23606797749979},"399":{"tf":1.4142135623730951},"400":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0},"59":{"tf":1.0}}},"k":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"120":{"tf":1.0},"293":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}},"t":{"df":1,"docs":{"428":{"tf":2.0}}},"u":{"df":0,"docs":{},"x":{"df":7,"docs":{"111":{"tf":1.0},"15":{"tf":2.0},"17":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"260":{"tf":1.0},"27":{"tf":1.0}},"、":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"o":{"df":3,"docs":{"12":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"t":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"7":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":2.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"[":{"0":{"df":2,"docs":{"170":{"tf":1.0},"172":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"385":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"|":{"df":0,"docs":{},"i":{"df":1,"docs":{"385":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"385":{"tf":1.0}}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"385":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":14,"docs":{"170":{"tf":2.0},"172":{"tf":2.0},"241":{"tf":4.69041575982343},"242":{"tf":2.0},"268":{"tf":1.0},"273":{"tf":6.082762530298219},"274":{"tf":2.449489742783178},"275":{"tf":3.4641016151377544},"285":{"tf":3.4641016151377544},"286":{"tf":2.0},"291":{"tf":2.8284271247461903},"293":{"tf":3.7416573867739413},"331":{"tf":3.0},"436":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":9,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":8,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{")":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"2":{"df":1,"docs":{"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"e":{"8":{"6":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"191":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"185":{"tf":1.4142135623730951},"188":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"232":{"tf":1.0}}}}}}}}},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"189":{"tf":1.0},"353":{"tf":1.0},"75":{"tf":1.0}}},"t":{"df":6,"docs":{"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.7320508075688772},"352":{"tf":1.4142135623730951},"398":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":4,"docs":{"241":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":2.0},"405":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"d":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"259":{"tf":1.4142135623730951}}}}},"l":{"df":1,"docs":{"141":{"tf":1.0}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"185":{"tf":1.4142135623730951},"188":{"tf":2.449489742783178},"189":{"tf":1.0},"59":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"1":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":2.0},"189":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"186":{"tf":1.4142135623730951},"191":{"tf":1.0}}}},"<":{"'":{"a":{">":{"(":{"df":0,"docs":{},"x":{"df":3,"docs":{"186":{"tf":1.0},"188":{"tf":1.7320508075688772},"189":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"191":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"a":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"194":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"<":{"'":{"a":{"df":1,"docs":{"194":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":6,"docs":{"186":{"tf":2.8284271247461903},"187":{"tf":1.0},"188":{"tf":3.4641016151377544},"189":{"tf":2.23606797749979},"191":{"tf":1.0},"194":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"p":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"101":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"167":{"tf":1.0},"306":{"tf":1.7320508075688772},"382":{"tf":1.7320508075688772},"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":2.0},"412":{"tf":1.0},"416":{"tf":1.0},"43":{"tf":1.7320508075688772},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"62":{"tf":3.7416573867739413}},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"62":{"tf":1.0}}}}}}}}},"w":{"df":1,"docs":{"167":{"tf":1.0}}}},"s":{"df":2,"docs":{"111":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"103":{"tf":1.0},"59":{"tf":1.4142135623730951}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"59":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"k":{"a":{"df":1,"docs":{"389":{"tf":1.0}}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"337":{"tf":1.4142135623730951},"343":{"tf":2.0}}}},"df":0,"docs":{}}}},"m":{".":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"a":{"c":{"df":1,"docs":{"398":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"398":{"tf":1.0}}}}}}}},"o":{"df":5,"docs":{"15":{"tf":2.0},"17":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0}}},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"389":{"tf":1.4142135623730951}}}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"387":{"tf":1.0},"389":{"tf":2.449489742783178},"393":{"tf":1.7320508075688772}}}}}},"df":11,"docs":{"23":{"tf":1.0},"277":{"tf":1.4142135623730951},"301":{"tf":1.7320508075688772},"320":{"tf":1.7320508075688772},"387":{"tf":1.0},"389":{"tf":2.0},"390":{"tf":1.0},"391":{"tf":2.8284271247461903},"392":{"tf":1.0},"413":{"tf":1.0},"70":{"tf":1.7320508075688772}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"387":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"22":{"tf":1.4142135623730951},"24":{"tf":2.0}}}},"p":{"d":{"b":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":10,"docs":{"111":{"tf":1.0},"113":{"tf":1.0},"156":{"tf":1.0},"22":{"tf":2.23606797749979},"220":{"tf":2.23606797749979},"24":{"tf":2.0},"26":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"405":{"tf":1.0}}}},"df":197,"docs":{"100":{"tf":1.0},"101":{"tf":3.0},"102":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"105":{"tf":2.0},"106":{"tf":1.0},"107":{"tf":1.7320508075688772},"108":{"tf":2.0},"111":{"tf":1.4142135623730951},"113":{"tf":1.0},"121":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":2.0},"141":{"tf":2.449489742783178},"142":{"tf":1.7320508075688772},"143":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772},"155":{"tf":1.4142135623730951},"156":{"tf":1.7320508075688772},"157":{"tf":1.7320508075688772},"158":{"tf":1.4142135623730951},"159":{"tf":2.0},"162":{"tf":4.47213595499958},"165":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"175":{"tf":2.0},"176":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"185":{"tf":1.7320508075688772},"186":{"tf":1.4142135623730951},"188":{"tf":2.0},"189":{"tf":1.4142135623730951},"190":{"tf":1.4142135623730951},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"194":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.7320508075688772},"219":{"tf":1.7320508075688772},"22":{"tf":1.7320508075688772},"220":{"tf":2.0},"221":{"tf":2.8284271247461903},"222":{"tf":1.7320508075688772},"223":{"tf":1.7320508075688772},"224":{"tf":3.3166247903554},"225":{"tf":3.1622776601683795},"226":{"tf":1.7320508075688772},"23":{"tf":2.23606797749979},"235":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"24":{"tf":2.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"258":{"tf":1.4142135623730951},"26":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"274":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.4142135623730951},"281":{"tf":1.7320508075688772},"283":{"tf":3.3166247903554},"285":{"tf":1.7320508075688772},"286":{"tf":1.7320508075688772},"289":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":2.0},"294":{"tf":2.449489742783178},"298":{"tf":4.47213595499958},"299":{"tf":1.7320508075688772},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":4.69041575982343},"318":{"tf":2.8284271247461903},"319":{"tf":2.23606797749979},"32":{"tf":1.0},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.4142135623730951},"33":{"tf":2.23606797749979},"335":{"tf":2.0},"337":{"tf":1.0},"34":{"tf":1.0},"343":{"tf":2.8284271247461903},"348":{"tf":1.0},"349":{"tf":1.0},"35":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.4142135623730951},"352":{"tf":1.4142135623730951},"353":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.4142135623730951},"359":{"tf":2.449489742783178},"36":{"tf":1.0},"360":{"tf":3.0},"361":{"tf":1.7320508075688772},"362":{"tf":1.0},"367":{"tf":1.7320508075688772},"368":{"tf":2.449489742783178},"369":{"tf":1.4142135623730951},"37":{"tf":1.0},"370":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":2.8284271247461903},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.7320508075688772},"383":{"tf":1.0},"385":{"tf":2.449489742783178},"391":{"tf":1.4142135623730951},"397":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.0},"408":{"tf":2.0},"41":{"tf":1.0},"414":{"tf":1.4142135623730951},"42":{"tf":1.7320508075688772},"427":{"tf":1.4142135623730951},"428":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772},"53":{"tf":2.0},"54":{"tf":2.6457513110645907},"55":{"tf":2.23606797749979},"56":{"tf":1.4142135623730951},"57":{"tf":2.0},"58":{"tf":1.7320508075688772},"59":{"tf":1.4142135623730951},"61":{"tf":2.6457513110645907},"62":{"tf":2.6457513110645907},"68":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":2.449489742783178},"71":{"tf":1.4142135623730951},"72":{"tf":1.4142135623730951},"73":{"tf":2.0},"74":{"tf":2.23606797749979},"75":{"tf":1.7320508075688772},"77":{"tf":2.23606797749979},"78":{"tf":2.23606797749979},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"93":{"tf":2.0},"95":{"tf":2.0},"96":{"tf":1.0},"97":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"df":4,"docs":{"198":{"tf":1.4142135623730951},"257":{"tf":1.0},"275":{"tf":1.0},"49":{"tf":1.0}},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"71":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"x":{"df":1,"docs":{"71":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"110":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"368":{"tf":2.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"(":{"df":0,"docs":{},"|":{"(":{"&":{"c":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.0}}}}},"df":0,"docs":{}}}}}}}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"1":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"149":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":17,"docs":{"10":{"tf":1.0},"121":{"tf":1.0},"130":{"tf":2.0},"145":{"tf":1.0},"146":{"tf":2.8284271247461903},"147":{"tf":2.449489742783178},"148":{"tf":2.6457513110645907},"149":{"tf":3.3166247903554},"150":{"tf":4.0},"151":{"tf":1.0},"152":{"tf":2.0},"246":{"tf":2.6457513110645907},"316":{"tf":1.7320508075688772},"324":{"tf":1.0},"385":{"tf":2.0},"398":{"tf":1.0},"401":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"434":{"tf":2.0},"435":{"tf":1.0},"437":{"tf":1.0}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"414":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}},"df":55,"docs":{"102":{"tf":1.0},"103":{"tf":4.123105625617661},"104":{"tf":1.4142135623730951},"105":{"tf":3.4641016151377544},"106":{"tf":2.449489742783178},"107":{"tf":2.449489742783178},"108":{"tf":3.7416573867739413},"109":{"tf":1.0},"125":{"tf":1.4142135623730951},"134":{"tf":1.4142135623730951},"136":{"tf":1.0},"157":{"tf":2.23606797749979},"158":{"tf":3.4641016151377544},"159":{"tf":1.4142135623730951},"160":{"tf":2.449489742783178},"161":{"tf":1.4142135623730951},"162":{"tf":2.0},"167":{"tf":1.4142135623730951},"239":{"tf":1.0},"242":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"316":{"tf":2.449489742783178},"323":{"tf":2.0},"331":{"tf":1.0},"342":{"tf":1.0},"343":{"tf":1.7320508075688772},"345":{"tf":1.4142135623730951},"347":{"tf":3.3166247903554},"348":{"tf":2.0},"351":{"tf":1.0},"353":{"tf":1.7320508075688772},"355":{"tf":1.0},"356":{"tf":3.605551275463989},"357":{"tf":1.4142135623730951},"358":{"tf":1.4142135623730951},"359":{"tf":2.8284271247461903},"360":{"tf":2.8284271247461903},"361":{"tf":3.0},"362":{"tf":1.0},"363":{"tf":1.0},"382":{"tf":3.1622776601683795},"389":{"tf":1.7320508075688772},"404":{"tf":1.7320508075688772},"405":{"tf":2.0},"408":{"tf":2.0},"412":{"tf":1.0},"414":{"tf":2.23606797749979},"42":{"tf":3.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":2.8284271247461903},"61":{"tf":1.4142135623730951},"99":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},")":{"df":0,"docs":{},"来":{"df":0,"docs":{},"解":{"df":0,"docs":{},"构":{"df":0,"docs":{},"(":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}}},"!":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"158":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"x":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}}},"df":4,"docs":{"108":{"tf":2.0},"289":{"tf":3.4641016151377544},"290":{"tf":1.7320508075688772},"398":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"108":{"tf":1.4142135623730951}}}}}}},"y":{"b":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":9,"docs":{"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":4,"docs":{"101":{"tf":1.4142135623730951},"172":{"tf":1.4142135623730951},"281":{"tf":2.0},"306":{"tf":2.0}},"e":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"119":{"tf":1.0}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":16,"docs":{"198":{"tf":2.449489742783178},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"56":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"183":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"292":{"tf":1.0},"300":{"tf":1.4142135623730951},"304":{"tf":1.0},"70":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":20,"docs":{"101":{"tf":2.6457513110645907},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"202":{"tf":1.0},"274":{"tf":2.0},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"296":{"tf":1.0},"300":{"tf":1.4142135623730951},"301":{"tf":1.7320508075688772},"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.0},"323":{"tf":1.7320508075688772},"325":{"tf":2.0},"359":{"tf":2.0},"362":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"408":{"tf":2.0}},"e":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"0":{"df":1,"docs":{"359":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"(":{"0":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{},"h":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"b":{"(":{"df":0,"docs":{},"r":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"359":{"tf":1.0}}}},"df":1,"docs":{"359":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"362":{"tf":2.23606797749979}}}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"274":{"tf":1.0},"359":{"tf":1.4142135623730951}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"274":{"tf":1.0},"359":{"tf":1.7320508075688772}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"}":{"'":{"\"":{")":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":4.795831523312719},"290":{"tf":2.449489742783178}}}}}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"260":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"400":{"tf":1.0},"401":{"tf":1.0},"417":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"388":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"375":{"tf":2.0},"380":{"tf":1.4142135623730951},"381":{"tf":1.0}},"s":{"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":15,"docs":{"191":{"tf":1.0},"240":{"tf":1.0},"283":{"tf":1.0},"289":{"tf":1.0},"324":{"tf":1.4142135623730951},"330":{"tf":1.0},"370":{"tf":1.4142135623730951},"398":{"tf":1.7320508075688772},"405":{"tf":2.0},"407":{"tf":2.0},"417":{"tf":1.0},"42":{"tf":1.4142135623730951},"69":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"df":1,"docs":{"368":{"tf":3.605551275463989}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"375":{"tf":2.8284271247461903},"380":{"tf":1.4142135623730951},"381":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"3":{"2":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"226":{"tf":1.4142135623730951},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":3,"docs":{"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":13,"docs":{"214":{"tf":2.23606797749979},"215":{"tf":1.4142135623730951},"216":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.4142135623730951},"227":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":2.23606797749979},"232":{"tf":2.0},"234":{"tf":1.0}}}}}},"m":{"df":1,"docs":{"26":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":9,"docs":{"173":{"tf":1.0},"240":{"tf":1.0},"320":{"tf":1.0},"351":{"tf":1.0},"407":{"tf":1.0},"42":{"tf":1.4142135623730951},"51":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":5,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"260":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}},"t":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"t":{"df":1,"docs":{"260":{"tf":2.23606797749979}}},"x":{"(":{"c":{"1":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}},"df":1,"docs":{"258":{"tf":2.23606797749979}},"u":{"df":0,"docs":{},"p":{"<":{"df":0,"docs":{},"x":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"175":{"tf":1.7320508075688772}}}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"21":{"tf":2.0},"265":{"tf":1.0}}}}},"df":0,"docs":{}},"m":{"df":1,"docs":{"17":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}}}}}},"df":2,"docs":{"289":{"tf":3.1622776601683795},"290":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":4.58257569495584},"290":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"289":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}},"d":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"128":{"tf":1.4142135623730951},"211":{"tf":1.0}}}},"df":36,"docs":{"113":{"tf":2.8284271247461903},"114":{"tf":2.0},"115":{"tf":2.0},"116":{"tf":2.449489742783178},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"123":{"tf":1.4142135623730951},"127":{"tf":2.6457513110645907},"128":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"244":{"tf":1.0},"245":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"266":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"412":{"tf":1.0}},"e":{"df":1,"docs":{"398":{"tf":1.0}},"l":{"df":3,"docs":{"258":{"tf":2.449489742783178},"405":{"tf":1.7320508075688772},"434":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":2.6457513110645907},"120":{"tf":1.7320508075688772},"127":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"110":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"176":{"tf":1.0},"229":{"tf":1.7320508075688772}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"54":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":56,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.4142135623730951},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"180":{"tf":2.23606797749979},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.0},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"303":{"tf":1.0},"306":{"tf":1.4142135623730951},"319":{"tf":1.0},"32":{"tf":1.0},"320":{"tf":1.7320508075688772},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"368":{"tf":1.7320508075688772},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951},"78":{"tf":1.0},"87":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"239":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"107":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"107":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":17,"docs":{"101":{"tf":1.7320508075688772},"241":{"tf":2.23606797749979},"242":{"tf":1.4142135623730951},"274":{"tf":1.0},"285":{"tf":2.0},"299":{"tf":4.242640687119285},"300":{"tf":1.0},"301":{"tf":2.0},"306":{"tf":2.449489742783178},"316":{"tf":2.0},"319":{"tf":2.6457513110645907},"320":{"tf":3.605551275463989},"359":{"tf":1.4142135623730951},"405":{"tf":2.23606797749979},"407":{"tf":2.0},"412":{"tf":1.0},"70":{"tf":2.23606797749979}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"/":{"5":{".":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":7,"docs":{"300":{"tf":2.449489742783178},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":2,"docs":{"405":{"tf":2.449489742783178},"407":{"tf":2.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"300":{"tf":1.0},"303":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"322":{"tf":2.0}},"g":{"df":4,"docs":{"289":{"tf":2.0},"290":{"tf":1.0},"359":{"tf":2.23606797749979},"362":{"tf":1.4142135623730951}}},"v":{"c":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":1,"docs":{"436":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"}":{"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"405":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"300":{"tf":1.0},"303":{"tf":1.0},"53":{"tf":1.0},"59":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"403":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"287":{"tf":1.0},"49":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"l":{"df":10,"docs":{"134":{"tf":1.4142135623730951},"270":{"tf":1.0},"287":{"tf":1.0},"289":{"tf":2.6457513110645907},"368":{"tf":2.0},"407":{"tf":1.0},"49":{"tf":1.0},"73":{"tf":1.7320508075688772},"74":{"tf":2.449489742783178},"78":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":78,"docs":{"108":{"tf":1.4142135623730951},"119":{"tf":1.0},"121":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.7320508075688772},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":2.0},"160":{"tf":1.4142135623730951},"161":{"tf":1.7320508075688772},"167":{"tf":1.0},"170":{"tf":2.0},"172":{"tf":1.7320508075688772},"187":{"tf":1.0},"191":{"tf":1.0},"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"239":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"242":{"tf":2.23606797749979},"244":{"tf":1.0},"249":{"tf":3.0},"250":{"tf":1.7320508075688772},"252":{"tf":1.0},"282":{"tf":1.7320508075688772},"289":{"tf":2.449489742783178},"290":{"tf":2.0},"306":{"tf":3.1622776601683795},"319":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"33":{"tf":2.0},"337":{"tf":1.0},"34":{"tf":2.23606797749979},"341":{"tf":1.0},"343":{"tf":1.4142135623730951},"35":{"tf":1.7320508075688772},"36":{"tf":1.0},"360":{"tf":1.0},"367":{"tf":2.8284271247461903},"368":{"tf":4.58257569495584},"369":{"tf":1.4142135623730951},"37":{"tf":1.0},"377":{"tf":1.0},"378":{"tf":1.0},"382":{"tf":1.0},"389":{"tf":1.4142135623730951},"405":{"tf":3.0},"407":{"tf":3.0},"408":{"tf":2.449489742783178},"41":{"tf":1.0},"412":{"tf":1.0},"416":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":2.23606797749979},"50":{"tf":1.0},"51":{"tf":2.23606797749979},"54":{"tf":1.0},"62":{"tf":2.23606797749979},"69":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":4.242640687119285},"77":{"tf":1.0},"78":{"tf":1.0},"82":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"0":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}},"5":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{">":{"/":{"a":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"291":{"tf":1.4142135623730951},"306":{"tf":4.358898943540674},"307":{"tf":2.23606797749979},"310":{"tf":1.4142135623730951},"312":{"tf":1.0}}}},"df":5,"docs":{"305":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"d":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}},"df":2,"docs":{"306":{"tf":1.4142135623730951},"307":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"305":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"_":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"257":{"tf":2.449489742783178}},"e":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{":":{":":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"(":{"df":0,"docs":{},"x":{"df":3,"docs":{"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"279":{"tf":1.0},"280":{"tf":1.0}}}},"df":1,"docs":{"279":{"tf":1.0}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"281":{"tf":2.449489742783178}}}}},"t":{">":{"(":{"df":0,"docs":{},"t":{"df":3,"docs":{"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":4,"docs":{"276":{"tf":1.0},"279":{"tf":3.0},"280":{"tf":2.23606797749979},"281":{"tf":2.8284271247461903}}},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"279":{"tf":1.0}}}}}}}}},"df":2,"docs":{"279":{"tf":1.7320508075688772},"280":{"tf":1.0}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"427":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":19,"docs":{"186":{"tf":1.4142135623730951},"201":{"tf":2.0},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"232":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.7320508075688772},"281":{"tf":2.0},"32":{"tf":1.0},"324":{"tf":2.0},"368":{"tf":1.0},"388":{"tf":1.0},"391":{"tf":3.7416573867739413},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":2.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":1,"docs":{"421":{"tf":1.0}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"398":{"tf":1.0}}}}}},"df":7,"docs":{"240":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"361":{"tf":2.6457513110645907},"405":{"tf":1.4142135623730951},"42":{"tf":1.0},"53":{"tf":1.0},"63":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"405":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":4,"docs":{"273":{"tf":1.7320508075688772},"320":{"tf":1.7320508075688772},"52":{"tf":1.0},"59":{"tf":1.0}},"l":{"df":1,"docs":{"216":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"g":{"df":1,"docs":{"416":{"tf":1.0}}},"t":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":8,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"364":{"tf":1.0},"382":{"tf":2.23606797749979},"405":{"tf":1.7320508075688772}}}}},"w":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"223":{"tf":1.0},"224":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"405":{"tf":3.3166247903554},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"167":{"tf":1.0},"202":{"tf":2.0}}}}},"df":0,"docs":{}},"x":{"df":4,"docs":{"183":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"360":{"tf":2.449489742783178}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":41,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.0},"140":{"tf":1.0},"147":{"tf":1.0},"167":{"tf":1.7320508075688772},"179":{"tf":1.4142135623730951},"180":{"tf":1.7320508075688772},"181":{"tf":1.4142135623730951},"183":{"tf":1.0},"198":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"214":{"tf":1.7320508075688772},"223":{"tf":2.0},"224":{"tf":2.0},"26":{"tf":2.449489742783178},"260":{"tf":1.0},"265":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.4142135623730951},"289":{"tf":2.0},"290":{"tf":1.0},"306":{"tf":1.4142135623730951},"316":{"tf":1.0},"32":{"tf":1.4142135623730951},"338":{"tf":1.7320508075688772},"339":{"tf":1.0},"34":{"tf":2.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"374":{"tf":1.0},"391":{"tf":1.7320508075688772},"397":{"tf":1.4142135623730951},"405":{"tf":5.656854249492381},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178},"430":{"tf":1.0},"49":{"tf":1.0},"96":{"tf":1.4142135623730951}},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"l":{"df":5,"docs":{"178":{"tf":1.4142135623730951},"179":{"tf":2.449489742783178},"180":{"tf":3.0},"181":{"tf":2.0},"182":{"tf":2.6457513110645907}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":6,"docs":{"364":{"tf":1.4142135623730951},"375":{"tf":1.7320508075688772},"378":{"tf":2.449489742783178},"379":{"tf":1.7320508075688772},"380":{"tf":2.6457513110645907},"381":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"374":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"376":{"tf":1.0}}}}},"df":0,"docs":{}},"df":10,"docs":{"162":{"tf":1.7320508075688772},"244":{"tf":3.3166247903554},"245":{"tf":2.0},"249":{"tf":2.23606797749979},"293":{"tf":2.449489742783178},"316":{"tf":2.0},"324":{"tf":2.6457513110645907},"325":{"tf":1.0},"374":{"tf":2.0},"401":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"162":{"tf":1.0}}},"l":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":1,"docs":{"0":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":11,"docs":{"10":{"tf":1.0},"198":{"tf":1.0},"277":{"tf":1.0},"301":{"tf":1.0},"432":{"tf":2.0},"433":{"tf":1.0},"434":{"tf":3.7416573867739413},"435":{"tf":2.0},"436":{"tf":3.4641016151377544},"437":{"tf":1.7320508075688772},"70":{"tf":1.0}}}}}}},"l":{"df":6,"docs":{"273":{"tf":3.0},"275":{"tf":1.7320508075688772},"285":{"tf":2.0},"286":{"tf":1.4142135623730951},"291":{"tf":2.23606797749979},"293":{"tf":3.3166247903554}}}},"o":{"_":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"75":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"218":{"tf":2.449489742783178},"225":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"235":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"294":{"tf":4.242640687119285}}}},"df":0,"docs":{},"n":{"df":2,"docs":{"106":{"tf":1.0},"368":{"tf":1.0}},"e":{"df":34,"docs":{"102":{"tf":2.6457513110645907},"105":{"tf":4.0},"106":{"tf":2.449489742783178},"108":{"tf":1.0},"134":{"tf":2.0},"148":{"tf":1.0},"162":{"tf":2.449489742783178},"166":{"tf":1.0},"174":{"tf":1.4142135623730951},"176":{"tf":1.4142135623730951},"239":{"tf":1.7320508075688772},"242":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"294":{"tf":2.0},"316":{"tf":1.7320508075688772},"319":{"tf":1.7320508075688772},"331":{"tf":1.4142135623730951},"341":{"tf":1.4142135623730951},"342":{"tf":1.0},"347":{"tf":1.7320508075688772},"348":{"tf":1.0},"353":{"tf":2.449489742783178},"356":{"tf":1.4142135623730951},"360":{"tf":1.0},"361":{"tf":1.0},"374":{"tf":1.0},"382":{"tf":2.0},"398":{"tf":1.0},"407":{"tf":2.0},"421":{"tf":1.0},"53":{"tf":1.0}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"程":{"df":0,"docs":{},"序":{"df":0,"docs":{},"的":{"df":0,"docs":{},"结":{"df":0,"docs":{},"尾":{"df":0,"docs":{},",":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"的":{"df":0,"docs":{},"话":{"df":0,"docs":{},",":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},",":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":46,"docs":{"106":{"tf":1.7320508075688772},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"120":{"tf":1.0},"142":{"tf":1.4142135623730951},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"228":{"tf":1.0},"240":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"266":{"tf":1.0},"273":{"tf":1.7320508075688772},"277":{"tf":1.0},"290":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":3.3166247903554},"324":{"tf":1.4142135623730951},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"368":{"tf":1.0},"377":{"tf":2.0},"405":{"tf":1.4142135623730951},"407":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"427":{"tf":1.0},"428":{"tf":1.0},"43":{"tf":1.0},"52":{"tf":1.0},"54":{"tf":1.0},"57":{"tf":1.4142135623730951},"70":{"tf":1.0},"91":{"tf":1.4142135623730951}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0}}},"df":0,"docs":{}}}}},"h":{"df":1,"docs":{"246":{"tf":1.0}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"181":{"tf":2.0}}},"y":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"1":{"df":1,"docs":{"181":{"tf":1.0}}},"df":1,"docs":{"181":{"tf":1.4142135623730951}}}}}}},"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"'":{".":{"'":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"190":{"tf":2.0},"192":{"tf":1.4142135623730951}}},"m":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"df":1,"docs":{"15":{"tf":1.0}}}},"s":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"102":{"tf":1.7320508075688772},"273":{"tf":1.0}}}},"m":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"[":{"0":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":3.0},"172":{"tf":1.4142135623730951}}}}}}},"df":33,"docs":{"124":{"tf":1.4142135623730951},"125":{"tf":2.23606797749979},"167":{"tf":1.4142135623730951},"170":{"tf":3.7416573867739413},"172":{"tf":1.4142135623730951},"173":{"tf":1.0},"257":{"tf":1.4142135623730951},"260":{"tf":1.0},"298":{"tf":6.4031242374328485},"318":{"tf":6.4031242374328485},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"360":{"tf":3.1622776601683795},"361":{"tf":1.7320508075688772},"37":{"tf":1.0},"38":{"tf":1.0},"382":{"tf":1.4142135623730951},"405":{"tf":3.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772},"41":{"tf":2.449489742783178},"42":{"tf":2.8284271247461903},"420":{"tf":1.0},"43":{"tf":2.449489742783178},"44":{"tf":1.7320508075688772},"45":{"tf":2.23606797749979},"52":{"tf":1.7320508075688772},"53":{"tf":1.0},"54":{"tf":1.0},"61":{"tf":5.5677643628300215},"62":{"tf":2.0}}}}},"df":8,"docs":{"167":{"tf":1.0},"240":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"306":{"tf":3.3166247903554},"361":{"tf":2.0},"367":{"tf":2.8284271247461903},"382":{"tf":1.0},"45":{"tf":1.7320508075688772}}}}},"o":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"252":{"tf":1.0}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"94":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"94":{"tf":1.0}}}}}}}}},"df":10,"docs":{"102":{"tf":1.0},"162":{"tf":1.0},"271":{"tf":1.0},"312":{"tf":1.0},"320":{"tf":2.23606797749979},"328":{"tf":1.4142135623730951},"330":{"tf":2.0},"334":{"tf":1.0},"386":{"tf":1.0},"94":{"tf":2.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"333":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"368":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"26":{"tf":1.0}}}}}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"134":{"tf":1.4142135623730951},"242":{"tf":1.0},"285":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.0},"368":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":2.0},"78":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{"d":{"df":1,"docs":{"361":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":1,"docs":{"299":{"tf":1.4142135623730951}}},"k":{"(":{"_":{"df":2,"docs":{"160":{"tf":1.0},"382":{"tf":1.0}}},"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"348":{"tf":1.7320508075688772}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"f":{"c":{"df":1,"docs":{"158":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":1.0}}}}},"j":{"df":0,"docs":{},"o":{"b":{"df":2,"docs":{"405":{"tf":1.0},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"167":{"tf":1.0},"382":{"tf":1.0},"45":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}}}}},"t":{"df":2,"docs":{"157":{"tf":1.0},"174":{"tf":1.0}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"160":{"tf":1.0},"161":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"349":{"tf":1.0}}}}},"df":0,"docs":{}}},"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"399":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"162":{"tf":1.0}}}}},"df":41,"docs":{"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"157":{"tf":2.449489742783178},"159":{"tf":1.0},"160":{"tf":1.7320508075688772},"161":{"tf":2.0},"162":{"tf":2.23606797749979},"165":{"tf":1.0},"174":{"tf":1.0},"198":{"tf":3.0},"199":{"tf":2.8284271247461903},"200":{"tf":2.23606797749979},"202":{"tf":1.7320508075688772},"203":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"207":{"tf":3.1622776601683795},"208":{"tf":2.449489742783178},"211":{"tf":3.605551275463989},"224":{"tf":1.7320508075688772},"225":{"tf":2.449489742783178},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.8284271247461903},"231":{"tf":1.0},"232":{"tf":3.1622776601683795},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"266":{"tf":2.6457513110645907},"348":{"tf":1.0},"349":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0},"42":{"tf":1.4142135623730951},"45":{"tf":2.0}},"。":{"df":0,"docs":{},"如":{"df":0,"docs":{},"果":{"df":0,"docs":{},"超":{"df":0,"docs":{},"时":{"df":0,"docs":{},"先":{"df":0,"docs":{},"发":{"df":0,"docs":{},"生":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}},"n":{"c":{"df":7,"docs":{"180":{"tf":1.0},"182":{"tf":1.0},"306":{"tf":1.0},"360":{"tf":1.4142135623730951},"368":{"tf":1.0},"405":{"tf":1.4142135623730951},"74":{"tf":1.0}}},"df":8,"docs":{"257":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"324":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"355":{"tf":1.0},"357":{"tf":1.0},"54":{"tf":1.0}},"e":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"207":{"tf":2.0}}}},"df":0,"docs":{}}}},"m":{"df":1,"docs":{"322":{"tf":1.0}}},"n":{"df":1,"docs":{"322":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"250":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"y":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"66":{"tf":1.0}}}}},"o":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"337":{"tf":1.0}},"p":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"328":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"10":{"tf":1.0},"328":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"405":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"415":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"242":{"tf":1.0},"276":{"tf":1.0},"330":{"tf":1.4142135623730951},"375":{"tf":1.0}}}},"t":{"df":1,"docs":{"255":{"tf":3.0}},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"255":{"tf":1.0},"267":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"407":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"382":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"<":{"&":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"342":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"134":{"tf":1.0},"148":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"348":{"tf":1.0}}}}},"t":{"df":1,"docs":{"134":{"tf":1.0}}},"v":{"df":1,"docs":{"148":{"tf":1.0}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":5,"docs":{"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{">":{"df":0,"docs":{},",":{"df":0,"docs":{},"是":{"df":0,"docs":{},"不":{"df":0,"docs":{},"同":{"df":0,"docs":{},"于":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}},"df":1,"docs":{"162":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}}}},"i":{"3":{"2":{">":{"df":0,"docs":{},"。":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":7,"docs":{"102":{"tf":1.4142135623730951},"105":{"tf":3.1622776601683795},"106":{"tf":2.0},"148":{"tf":1.0},"331":{"tf":1.0},"347":{"tf":1.0},"353":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"102":{"tf":2.23606797749979}}},"df":0,"docs":{}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"407":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"421":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"c":{"<":{"df":0,"docs":{},"t":{">":{">":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"244":{"tf":1.0},"374":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"242":{"tf":1.0},"316":{"tf":3.3166247903554}}}}},"t":{"df":14,"docs":{"102":{"tf":3.872983346207417},"105":{"tf":2.23606797749979},"106":{"tf":1.0},"109":{"tf":1.0},"162":{"tf":1.7320508075688772},"169":{"tf":1.0},"174":{"tf":2.23606797749979},"176":{"tf":2.0},"239":{"tf":2.0},"242":{"tf":1.4142135623730951},"338":{"tf":1.4142135623730951},"374":{"tf":1.0},"382":{"tf":1.7320508075688772},"424":{"tf":1.7320508075688772}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"8":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"242":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"6":{"4":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"5":{".":{"0":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"3":{"2":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"5":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":18,"docs":{"102":{"tf":3.0},"157":{"tf":1.0},"162":{"tf":3.1622776601683795},"166":{"tf":1.0},"168":{"tf":1.0},"176":{"tf":1.0},"24":{"tf":1.0},"242":{"tf":1.7320508075688772},"316":{"tf":1.0},"335":{"tf":2.0},"341":{"tf":1.0},"342":{"tf":1.4142135623730951},"343":{"tf":1.0},"349":{"tf":1.0},"374":{"tf":1.0},"401":{"tf":1.0},"407":{"tf":2.0},"408":{"tf":1.0}}}}}}},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}}}}}}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"348":{"tf":1.0}}}}},"d":{"df":1,"docs":{"421":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"119":{"tf":1.0}}},"2":{"df":1,"docs":{"119":{"tf":1.0}}},"df":3,"docs":{"42":{"tf":2.0},"421":{"tf":1.0},"45":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"。":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"209":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"102":{"tf":1.0},"312":{"tf":1.0},"328":{"tf":1.4142135623730951},"330":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"277":{"tf":1.0},"301":{"tf":1.0},"360":{"tf":1.4142135623730951},"70":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"179":{"tf":1.0},"378":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":3,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"398":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"0":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"199":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}}}}},"i":{"df":2,"docs":{"175":{"tf":1.0},"375":{"tf":1.0}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"199":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}}},"x":{"df":1,"docs":{"375":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"161":{"tf":1.7320508075688772}}}}}}}},"t":{"df":26,"docs":{"137":{"tf":1.0},"156":{"tf":1.4142135623730951},"198":{"tf":2.449489742783178},"199":{"tf":2.23606797749979},"200":{"tf":1.7320508075688772},"201":{"tf":1.4142135623730951},"202":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.23606797749979},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"219":{"tf":1.0},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"242":{"tf":1.0},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"286":{"tf":1.4142135623730951},"290":{"tf":1.0},"306":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":1.0},"54":{"tf":1.0},"66":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"377":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"377":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"377":{"tf":4.358898943540674}}}}}}}}},"v":{"df":1,"docs":{"299":{"tf":1.7320508075688772}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"377":{"tf":1.7320508075688772}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"205":{"tf":1.0},"234":{"tf":2.0},"235":{"tf":2.23606797749979}}}}}},"df":8,"docs":{"191":{"tf":1.0},"206":{"tf":2.0},"233":{"tf":1.0},"316":{"tf":1.7320508075688772},"318":{"tf":1.0},"320":{"tf":1.0},"375":{"tf":2.0},"377":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.7320508075688772}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"293":{"tf":1.0},"53":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"252":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"368":{"tf":1.0}}}},"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"d":{"df":2,"docs":{"413":{"tf":1.0},"436":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}}}}}}}},"w":{"df":0,"docs":{},"n":{"df":4,"docs":{"189":{"tf":1.0},"299":{"tf":1.0},"405":{"tf":1.0},"75":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"67":{"tf":1.0}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"64":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"299":{"tf":1.4142135623730951},"405":{"tf":1.0},"407":{"tf":1.0},"46":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"70":{"tf":1.7320508075688772},"73":{"tf":1.7320508075688772},"74":{"tf":2.449489742783178},"75":{"tf":1.7320508075688772},"78":{"tf":1.7320508075688772}}}}}}}}}}},"p":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}}}},"x":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}},"1":{")":{".":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"175":{"tf":1.7320508075688772},"94":{"tf":1.0}}},"2":{"df":2,"docs":{"175":{"tf":1.4142135623730951},"94":{"tf":1.0}},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"175":{"tf":1.0}}}}}}}}}}},"3":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"175":{"tf":1.7320508075688772}}},"x":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}},"df":1,"docs":{"175":{"tf":1.4142135623730951}}},">":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"400":{"tf":1.0}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"401":{"tf":1.0}}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":12,"docs":{"110":{"tf":1.4142135623730951},"111":{"tf":1.7320508075688772},"117":{"tf":1.0},"241":{"tf":1.4142135623730951},"26":{"tf":1.0},"260":{"tf":2.449489742783178},"261":{"tf":1.0},"265":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"32":{"tf":1.0},"330":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}},"g":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":3.4641016151377544}},"e":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"[":{"1":{"df":1,"docs":{"316":{"tf":1.0}}},"2":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"316":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"<":{"'":{"a":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"102":{"tf":1.0}}},"r":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"183":{"tf":2.6457513110645907}}}},"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}}},"n":{"c":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"391":{"tf":3.7416573867739413}},"e":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"c":{"!":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"382":{"tf":1.0}}}},"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"155":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"167":{"tf":1.0},"202":{"tf":1.4142135623730951}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"198":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"224":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"157":{"tf":1.0},"158":{"tf":2.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"154":{"tf":1.0},"163":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":40,"docs":{"10":{"tf":1.0},"134":{"tf":1.4142135623730951},"143":{"tf":1.0},"153":{"tf":1.4142135623730951},"154":{"tf":3.3166247903554},"155":{"tf":4.123105625617661},"156":{"tf":3.872983346207417},"157":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"159":{"tf":3.0},"160":{"tf":1.4142135623730951},"162":{"tf":1.0},"163":{"tf":3.0},"164":{"tf":2.23606797749979},"165":{"tf":1.0},"166":{"tf":3.0},"167":{"tf":2.0},"168":{"tf":1.7320508075688772},"198":{"tf":2.23606797749979},"199":{"tf":1.0},"202":{"tf":5.196152422706632},"203":{"tf":1.4142135623730951},"216":{"tf":1.0},"224":{"tf":3.1622776601683795},"225":{"tf":1.0},"257":{"tf":1.7320508075688772},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"342":{"tf":1.0},"368":{"tf":1.0},"382":{"tf":2.23606797749979},"391":{"tf":1.7320508075688772},"405":{"tf":5.0},"407":{"tf":3.0},"408":{"tf":2.449489742783178},"53":{"tf":2.23606797749979},"54":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951}},"k":{"df":17,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"198":{"tf":1.4142135623730951},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0},"407":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"225":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"296":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":10,"docs":{"172":{"tf":1.0},"186":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"240":{"tf":1.0},"360":{"tf":1.4142135623730951},"375":{"tf":1.0},"405":{"tf":1.4142135623730951},"56":{"tf":1.4142135623730951},"75":{"tf":1.0},"87":{"tf":2.0}},"r":{"df":1,"docs":{"332":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"114":{"tf":1.0},"294":{"tf":4.795831523312719}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}}},"s":{"df":13,"docs":{"165":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"316":{"tf":1.0},"391":{"tf":1.0},"42":{"tf":2.0},"45":{"tf":2.0},"52":{"tf":1.0},"54":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"(":{"&":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"221":{"tf":1.0},"222":{"tf":1.0}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"221":{"tf":1.0},"222":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"221":{"tf":2.0},"222":{"tf":2.6457513110645907},"223":{"tf":2.8284271247461903}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"43":{"tf":1.0}}}}}}}}}}}},"t":{"df":2,"docs":{"190":{"tf":2.0},"192":{"tf":2.0}},"i":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"421":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"<":{"&":{"df":0,"docs":{},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":6,"docs":{"200":{"tf":1.4142135623730951},"239":{"tf":1.0},"375":{"tf":1.0},"416":{"tf":1.4142135623730951},"420":{"tf":2.8284271247461903},"421":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"172":{"tf":1.4142135623730951},"183":{"tf":1.4142135623730951},"416":{"tf":2.449489742783178},"421":{"tf":3.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":18,"docs":{"198":{"tf":2.6457513110645907},"199":{"tf":2.449489742783178},"200":{"tf":2.0},"201":{"tf":2.0},"202":{"tf":2.449489742783178},"206":{"tf":2.0},"207":{"tf":2.0},"208":{"tf":2.0},"211":{"tf":2.8284271247461903},"228":{"tf":1.4142135623730951},"229":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951},"296":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"300":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"t":{"df":1,"docs":{"416":{"tf":2.23606797749979}},"h":{"df":13,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.7320508075688772},"120":{"tf":1.0},"17":{"tf":1.7320508075688772},"249":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.4142135623730951},"268":{"tf":1.0},"376":{"tf":1.0},"391":{"tf":1.7320508075688772},"417":{"tf":1.7320508075688772}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"106":{"tf":2.0},"330":{"tf":1.0},"337":{"tf":1.0},"345":{"tf":1.0},"347":{"tf":1.7320508075688772},"350":{"tf":1.0},"351":{"tf":2.23606797749979},"353":{"tf":3.3166247903554},"354":{"tf":1.0},"360":{"tf":2.23606797749979},"375":{"tf":1.0},"378":{"tf":1.0},"42":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":3,"docs":{"337":{"tf":1.0},"345":{"tf":1.0},"346":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"y":{"df":1,"docs":{"252":{"tf":1.0}}}},"c":{"df":1,"docs":{"436":{"tf":1.7320508075688772}}},"d":{"b":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"175":{"tf":1.4142135623730951},"213":{"tf":1.0},"266":{"tf":2.23606797749979},"359":{"tf":3.3166247903554},"377":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":3,"docs":{"341":{"tf":3.0},"342":{"tf":3.0},"343":{"tf":2.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":3.7416573867739413}}}}}}}}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}},"n":{"df":0,"docs":{},"i":{"df":3,"docs":{"103":{"tf":1.7320508075688772},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}},"y":{"!":{"df":0,"docs":{},"”":{"df":0,"docs":{},",":{"df":0,"docs":{},"同":{"df":0,"docs":{},"时":{"df":0,"docs":{},"仍":{"df":0,"docs":{},"然":{"df":0,"docs":{},"返":{"df":0,"docs":{},"回":{"df":0,"docs":{},"代":{"df":0,"docs":{},"码":{"df":0,"docs":{},"块":{"df":0,"docs":{},"最":{"df":0,"docs":{},"后":{"df":0,"docs":{},"的":{"df":0,"docs":{},"值":{"df":0,"docs":{},",":{"1":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951},"380":{"tf":1.7320508075688772}}}}},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":2,"docs":{"289":{"tf":3.4641016151377544},"290":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"360":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":4,"docs":{"102":{"tf":1.0},"242":{"tf":1.0},"257":{"tf":1.0},"70":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"261":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}}},"df":1,"docs":{"376":{"tf":1.4142135623730951}}}}}}},"h":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"399":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772}}}},"df":2,"docs":{"1":{"tf":1.0},"428":{"tf":1.0}},"g":{"df":1,"docs":{"152":{"tf":1.0}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":2.8284271247461903}}}}},"n":{"!":{"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"320":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"<":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"320":{"tf":4.69041575982343},"323":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"88":{"tf":1.7320508075688772},"89":{"tf":1.0},"90":{"tf":1.0},"93":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"346":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"335":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"=":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"375":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"113":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":8,"docs":{"119":{"tf":1.0},"192":{"tf":1.4142135623730951},"260":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":2.23606797749979},"45":{"tf":2.0}}}},"df":0,"docs":{}},"u":{"df":2,"docs":{"203":{"tf":1.0},"266":{"tf":1.4142135623730951}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"105":{"tf":1.7320508075688772},"106":{"tf":1.0},"58":{"tf":1.0}},"e":{"(":{"5":{"df":1,"docs":{"58":{"tf":1.4142135623730951}}},"df":0,"docs":{},"f":{"df":2,"docs":{"105":{"tf":2.23606797749979},"106":{"tf":1.0}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"105":{"tf":2.0},"106":{"tf":1.0}}}}},"x":{"df":3,"docs":{"105":{"tf":2.0},"106":{"tf":1.0},"58":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":5,"docs":{"218":{"tf":2.449489742783178},"225":{"tf":1.7320508075688772},"229":{"tf":2.449489742783178},"232":{"tf":2.0},"235":{"tf":1.0}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"<":{"df":0,"docs":{},"f":{"3":{"2":{"df":1,"docs":{"175":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":2,"docs":{"173":{"tf":2.6457513110645907},"175":{"tf":3.1622776601683795}}},"x":{"1":{"df":1,"docs":{"175":{"tf":1.7320508075688772}}},"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}},"df":16,"docs":{"173":{"tf":3.605551275463989},"175":{"tf":3.4641016151377544},"270":{"tf":1.0},"316":{"tf":1.4142135623730951},"319":{"tf":1.7320508075688772},"321":{"tf":2.0},"322":{"tf":2.0},"352":{"tf":1.0},"359":{"tf":4.358898943540674},"360":{"tf":2.23606797749979},"375":{"tf":3.872983346207417},"377":{"tf":4.47213595499958},"52":{"tf":1.0},"53":{"tf":1.0},"85":{"tf":1.4142135623730951},"94":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"270":{"tf":1.4142135623730951},"309":{"tf":1.0},"367":{"tf":1.0},"385":{"tf":1.0},"412":{"tf":1.4142135623730951},"66":{"tf":1.0},"75":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"270":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"。":{"a":{"d":{"d":{"df":1,"docs":{"375":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"405":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"315":{"tf":1.0}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"431":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":1,"docs":{"332":{"tf":1.7320508075688772}}}}}}}}},"o":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"405":{"tf":2.0},"408":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"405":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"405":{"tf":3.7416573867739413},"407":{"tf":2.0},"408":{"tf":2.23606797749979}}}},"p":{"df":2,"docs":{"136":{"tf":1.0},"66":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"ê":{"df":1,"docs":{"431":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{".":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"i":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"337":{"tf":1.7320508075688772},"342":{"tf":1.4142135623730951},"343":{"tf":2.0}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"337":{"tf":1.0},"343":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":3,"docs":{"337":{"tf":1.4142135623730951},"338":{"tf":1.0},"343":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":9,"docs":{"337":{"tf":1.7320508075688772},"338":{"tf":3.872983346207417},"339":{"tf":2.449489742783178},"340":{"tf":2.23606797749979},"341":{"tf":3.872983346207417},"342":{"tf":5.0990195135927845},"343":{"tf":5.477225575051661},"393":{"tf":1.0},"398":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"316":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"14":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.4142135623730951}}}}}}}}}},"p":{"df":0,"docs":{},"v":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"11":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":2.0}}}}},"l":{"df":0,"docs":{},"u":{"d":{"df":7,"docs":{"102":{"tf":1.0},"126":{"tf":1.0},"147":{"tf":1.0},"157":{"tf":1.0},"283":{"tf":1.4142135623730951},"285":{"tf":1.0},"33":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"377":{"tf":1.4142135623730951},"91":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":49,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.7320508075688772},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}},"s":{"df":1,"docs":{"360":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":3.3166247903554}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"222":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"!":{"(":{"\"":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"382":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"382":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{"&":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"352":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"352":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"56":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"5":{"df":1,"docs":{"56":{"tf":1.0}}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"56":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":3,"docs":{"324":{"tf":1.0},"377":{"tf":1.4142135623730951},"91":{"tf":1.0}},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"'":{"a":{"df":1,"docs":{"322":{"tf":2.449489742783178}}},"b":{"df":1,"docs":{"322":{"tf":2.449489742783178}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}}}}},"{":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}},"df":0,"docs":{}}}},"*":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"1":{"df":2,"docs":{"179":{"tf":1.0},"180":{"tf":1.0}}},"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}}}},"df":3,"docs":{"291":{"tf":1.0},"293":{"tf":2.23606797749979},"376":{"tf":2.23606797749979}},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"62":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"194":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"355":{"tf":1.0},"357":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"225":{"tf":1.0},"226":{"tf":1.0}}}}},"t":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}}}}},"b":{"df":3,"docs":{"272":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"241":{"tf":2.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"181":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"360":{"tf":1.0}}}},"df":2,"docs":{"95":{"tf":2.0},"97":{"tf":1.4142135623730951}}}},"df":1,"docs":{"291":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"359":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":2.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"286":{"tf":2.0},"369":{"tf":1.0},"62":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"352":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"283":{"tf":2.23606797749979}}}}}}}}}},"df":0,"docs":{}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"358":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"360":{"tf":1.4142135623730951},"362":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":8,"docs":{"243":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":1.0},"356":{"tf":1.0},"361":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":14,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":9,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"281":{"tf":1.7320508075688772},"32":{"tf":1.0},"388":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"55":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"299":{"tf":2.449489742783178}}},"df":0,"docs":{}}}},"i":{"df":3,"docs":{"298":{"tf":2.449489742783178},"318":{"tf":2.449489742783178},"381":{"tf":1.4142135623730951}}}},"i":{"'":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":1,"docs":{"206":{"tf":1.0}},"n":{"df":8,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}},"t":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"358":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}}}}}}},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"103":{"tf":1.0}}}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"306":{"tf":1.0}},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"359":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"180":{"tf":1.0}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"o":{"df":1,"docs":{"361":{"tf":1.0}}},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"61":{"tf":2.449489742783178}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"355":{"tf":1.0},"357":{"tf":1.0},"358":{"tf":1.0},"359":{"tf":1.7320508075688772}}}},"p":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}},"3":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"175":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"224":{"tf":1.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"1":{"df":1,"docs":{"367":{"tf":1.0}}},"2":{"df":1,"docs":{"367":{"tf":1.0}}},"df":1,"docs":{"185":{"tf":2.0}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"319":{"tf":1.7320508075688772},"320":{"tf":2.6457513110645907}}}}},"t":{"1":{"df":1,"docs":{"91":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"62":{"tf":1.0}}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"398":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"306":{"tf":2.0}}}}}}}},"s":{"1":{"df":1,"docs":{"70":{"tf":1.0}}},"2":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":8,"docs":{"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":1,"docs":{"360":{"tf":1.0}}}},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"360":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"358":{"tf":1.4142135623730951}}}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"108":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"u":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"359":{"tf":1.0}}}}},"h":{"df":36,"docs":{"108":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"134":{"tf":2.0},"167":{"tf":1.0},"170":{"tf":2.23606797749979},"172":{"tf":2.0},"183":{"tf":1.4142135623730951},"186":{"tf":1.4142135623730951},"188":{"tf":2.0},"189":{"tf":1.4142135623730951},"194":{"tf":1.0},"316":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"359":{"tf":1.0},"361":{"tf":1.4142135623730951},"382":{"tf":1.0},"385":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"428":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":2.23606797749979},"51":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.7320508075688772},"61":{"tf":1.4142135623730951},"62":{"tf":1.7320508075688772},"72":{"tf":1.0},"73":{"tf":1.7320508075688772},"78":{"tf":1.4142135623730951},"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"134":{"tf":1.0}}}},"i":{"df":2,"docs":{"360":{"tf":1.0},"376":{"tf":1.7320508075688772}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"355":{"tf":1.0},"357":{"tf":1.0}}}}},"o":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":7,"docs":{"125":{"tf":2.0},"167":{"tf":1.4142135623730951},"382":{"tf":1.4142135623730951},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.0}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"348":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"355":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}},"s":{"df":1,"docs":{"348":{"tf":2.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"301":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"w":{"df":1,"docs":{"378":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":7,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"405":{"tf":1.4142135623730951},"407":{"tf":2.0},"408":{"tf":2.23606797749979}}}}}},"x":{"df":4,"docs":{"360":{"tf":1.0},"37":{"tf":1.0},"381":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"y":{"df":1,"docs":{"361":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":14,"docs":{"124":{"tf":1.0},"125":{"tf":2.0},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.0}}}}},"{":{"a":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"144":{"tf":1.0}}},"c":{"df":1,"docs":{"144":{"tf":1.0}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"360":{"tf":1.4142135623730951},"69":{"tf":1.0}},"i":{"df":1,"docs":{"135":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"148":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"229":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"242":{"tf":1.7320508075688772}}}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"150":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"r":{"1":{"df":1,"docs":{"74":{"tf":1.0}}},"3":{"df":1,"docs":{"74":{"tf":1.0}}},"df":0,"docs":{}},"s":{"1":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"71":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"71":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"349":{"tf":1.0},"350":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"353":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":38,"docs":{"104":{"tf":1.0},"141":{"tf":1.0},"188":{"tf":1.7320508075688772},"206":{"tf":1.7320508075688772},"218":{"tf":1.0},"228":{"tf":1.0},"23":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"235":{"tf":1.0},"239":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"293":{"tf":1.7320508075688772},"294":{"tf":2.23606797749979},"299":{"tf":1.0},"301":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.4142135623730951},"33":{"tf":1.0},"356":{"tf":1.0},"37":{"tf":1.7320508075688772},"377":{"tf":3.872983346207417},"387":{"tf":1.0},"388":{"tf":1.0},"391":{"tf":1.0},"399":{"tf":1.0},"45":{"tf":1.0},"54":{"tf":1.0},"56":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":2.449489742783178},"78":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":3.1622776601683795},"93":{"tf":1.0}}}},"s":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"1":{"0":{"(":{"4":{"df":1,"docs":{"206":{"tf":1.0}}},"8":{"df":1,"docs":{"206":{"tf":1.0}}},"a":{"df":1,"docs":{"206":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":2.0},"116":{"tf":2.0}}}},"df":1,"docs":{"413":{"tf":1.0}}}},"o":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"102":{"tf":1.0},"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":6,"docs":{"157":{"tf":1.0},"224":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"288":{"tf":1.0},"74":{"tf":1.7320508075688772}}}}}},"c":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"392":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"390":{"tf":1.7320508075688772},"391":{"tf":1.4142135623730951},"393":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"391":{"tf":1.4142135623730951},"392":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"330":{"tf":1.4142135623730951},"387":{"tf":1.0},"390":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"1":{")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"225":{"tf":1.0}}}}}}},"df":5,"docs":{"224":{"tf":1.0},"225":{"tf":2.0},"226":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"249":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"297":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"300":{"tf":1.0},"303":{"tf":1.0}},"t":{"df":7,"docs":{"228":{"tf":2.449489742783178},"229":{"tf":2.8284271247461903},"231":{"tf":1.7320508075688772},"232":{"tf":3.4641016151377544},"249":{"tf":3.0},"250":{"tf":2.23606797749979},"53":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"l":{"df":46,"docs":{"143":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.7320508075688772},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"405":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}},"e":{".":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"255":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"155":{"tf":1.0},"255":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":9,"docs":{"19":{"tf":1.0},"2":{"tf":1.0},"237":{"tf":1.0},"296":{"tf":1.4142135623730951},"312":{"tf":1.0},"316":{"tf":1.4142135623730951},"328":{"tf":1.0},"330":{"tf":1.0},"47":{"tf":1.0}},"m":{"df":1,"docs":{"196":{"tf":1.0}}}}},"df":0,"docs":{}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"213":{"tf":1.0},"248":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}},"df":13,"docs":{"110":{"tf":1.0},"111":{"tf":2.0},"159":{"tf":1.4142135623730951},"198":{"tf":1.0},"21":{"tf":2.23606797749979},"214":{"tf":1.0},"26":{"tf":1.0},"32":{"tf":1.0},"391":{"tf":1.0},"395":{"tf":1.0},"397":{"tf":1.0},"49":{"tf":1.0},"61":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"436":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"”":{"df":0,"docs":{},"。":{"df":0,"docs":{},")":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"160":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"396":{"tf":1.4142135623730951},"429":{"tf":1.0}}}}},"df":1,"docs":{"15":{"tf":1.0}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"163":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":1,"docs":{"232":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"431":{"tf":1.0}},"r":{"df":1,"docs":{"368":{"tf":2.0}}}},"u":{"b":{"df":62,"docs":{"112":{"tf":1.0},"113":{"tf":2.23606797749979},"115":{"tf":2.23606797749979},"116":{"tf":4.0},"119":{"tf":3.7416573867739413},"120":{"tf":2.449489742783178},"121":{"tf":1.7320508075688772},"123":{"tf":3.605551275463989},"127":{"tf":2.449489742783178},"128":{"tf":1.0},"129":{"tf":1.0},"167":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"179":{"tf":3.3166247903554},"180":{"tf":4.795831523312719},"181":{"tf":4.123105625617661},"182":{"tf":4.69041575982343},"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.8284271247461903},"203":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.7320508075688772},"211":{"tf":1.0},"226":{"tf":2.449489742783178},"228":{"tf":3.605551275463989},"229":{"tf":4.898979485566356},"231":{"tf":2.449489742783178},"232":{"tf":5.5677643628300215},"242":{"tf":1.0},"244":{"tf":1.0},"249":{"tf":4.898979485566356},"250":{"tf":3.7416573867739413},"257":{"tf":1.4142135623730951},"258":{"tf":4.58257569495584},"266":{"tf":1.4142135623730951},"289":{"tf":3.4641016151377544},"290":{"tf":2.0},"320":{"tf":1.7320508075688772},"331":{"tf":2.6457513110645907},"334":{"tf":3.4641016151377544},"335":{"tf":2.8284271247461903},"338":{"tf":1.4142135623730951},"339":{"tf":2.0},"340":{"tf":2.0},"341":{"tf":2.23606797749979},"342":{"tf":4.242640687119285},"343":{"tf":3.605551275463989},"368":{"tf":1.0},"374":{"tf":1.4142135623730951},"381":{"tf":1.7320508075688772},"382":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.7320508075688772},"392":{"tf":1.0},"393":{"tf":1.0},"405":{"tf":6.0},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"412":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"120":{"tf":1.0},"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":8,"docs":{"256":{"tf":1.0},"260":{"tf":1.7320508075688772},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"337":{"tf":1.0},"338":{"tf":1.0},"342":{"tf":3.3166247903554},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"348":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"141":{"tf":2.0},"339":{"tf":1.0},"69":{"tf":1.0}}}}}},"df":6,"docs":{"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":2.0},"229":{"tf":1.0},"289":{"tf":1.0},"66":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"102":{"tf":1.0}}}},"y":{"df":1,"docs":{"24":{"tf":1.0}}}},"q":{"df":1,"docs":{"172":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"252":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"364":{"tf":1.0},"376":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951}}}}}}},"df":3,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.7320508075688772},"108":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":15,"docs":{"217":{"tf":1.7320508075688772},"218":{"tf":1.4142135623730951},"219":{"tf":1.0},"221":{"tf":2.449489742783178},"222":{"tf":2.449489742783178},"223":{"tf":2.23606797749979},"224":{"tf":3.0},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":3.1622776601683795},"229":{"tf":4.242640687119285},"231":{"tf":2.23606797749979},"232":{"tf":5.744562646538029},"249":{"tf":4.898979485566356},"250":{"tf":3.605551275463989}}},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"101":{"tf":1.7320508075688772},"274":{"tf":1.0},"359":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.7320508075688772}}},"df":1,"docs":{"391":{"tf":3.0}},"e":{":":{":":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}}}}}}}},"r":{"#":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"414":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"414":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"3":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"242":{"tf":2.0}}}}},"df":0,"docs":{}}}},"1":{"df":2,"docs":{"367":{"tf":1.7320508075688772},"74":{"tf":3.872983346207417}}},"2":{"df":2,"docs":{"367":{"tf":1.7320508075688772},"74":{"tf":3.7416573867739413}}},"3":{"df":1,"docs":{"74":{"tf":2.449489742783178}}},"\\":{"df":0,"docs":{},"n":{"df":2,"docs":{"398":{"tf":1.0},"42":{"tf":1.0}},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}}},",":{"df":0,"docs":{},"其":{"df":0,"docs":{},"中":{"\\":{"df":0,"docs":{},"r":{"df":0,"docs":{},"是":{"df":0,"docs":{},"回":{"df":0,"docs":{},"车":{"df":0,"docs":{},"符":{"df":0,"docs":{},",":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"是":{"df":0,"docs":{},"换":{"df":0,"docs":{},"行":{"df":0,"docs":{},"符":{"df":0,"docs":{},"。":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"398":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"c":{"df":0,"docs":{},"e":{"df":6,"docs":{"297":{"tf":1.0},"316":{"tf":1.7320508075688772},"321":{"tf":2.23606797749979},"322":{"tf":1.0},"323":{"tf":2.23606797749979},"74":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}},"n":{"d":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{";":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"df":9,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{")":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"1":{".":{".":{"=":{"1":{"0":{"0":{"df":9,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"124":{"tf":1.0},"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"c":{"df":0,"docs":{},"h":{"a":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":8,"docs":{"111":{"tf":1.0},"124":{"tf":2.449489742783178},"266":{"tf":4.58257569495584},"39":{"tf":1.0},"40":{"tf":4.358898943540674},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"421":{"tf":1.0}},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"322":{"tf":4.123105625617661}},"g":{"df":6,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"362":{"tf":1.7320508075688772},"41":{"tf":1.0},"62":{"tf":1.0},"78":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"417":{"tf":1.0}}}}},",":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"417":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"w":{"df":4,"docs":{"309":{"tf":1.0},"367":{"tf":1.0},"412":{"tf":1.0},"414":{"tf":1.0}}}},"b":{"df":1,"docs":{"24":{"tf":1.0}}},"c":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"284":{"tf":1.0}}},"df":0,"docs":{}}},":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"a":{"df":3,"docs":{"285":{"tf":1.7320508075688772},"286":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951}}},"b":{"df":1,"docs":{"293":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"306":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"285":{"tf":2.0},"286":{"tf":1.0},"294":{"tf":1.0}},"。":{"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"285":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},",":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"285":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"294":{"tf":2.0}},"e":{"(":{"&":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"1":{"0":{"df":3,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"293":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":3,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"293":{"tf":1.0}}},"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"291":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"0":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0}}}},"o":{"d":{"df":1,"docs":{"294":{"tf":3.1622776601683795}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"5":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"a":{"df":2,"docs":{"286":{"tf":2.0},"293":{"tf":1.7320508075688772}}},"b":{"df":1,"docs":{"293":{"tf":1.4142135623730951}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"286":{"tf":1.0},"294":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"&":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"285":{"tf":2.23606797749979},"286":{"tf":2.0},"291":{"tf":1.0},"293":{"tf":3.0}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"306":{"tf":2.449489742783178},"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"294":{"tf":3.1622776601683795}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"t":{">":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"288":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"270":{"tf":1.0},"284":{"tf":2.449489742783178},"285":{"tf":2.6457513110645907},"286":{"tf":3.1622776601683795},"288":{"tf":1.0},"291":{"tf":3.0},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":3.872983346207417},"295":{"tf":1.0},"306":{"tf":3.1622776601683795},"307":{"tf":1.7320508075688772},"309":{"tf":1.7320508075688772},"310":{"tf":1.0}}}},"df":3,"docs":{"273":{"tf":1.0},"275":{"tf":1.0},"293":{"tf":3.1622776601683795}}},"df":11,"docs":{"185":{"tf":4.58257569495584},"213":{"tf":1.0},"231":{"tf":1.0},"242":{"tf":1.0},"359":{"tf":1.4142135623730951},"367":{"tf":1.0},"368":{"tf":1.4142135623730951},"414":{"tf":1.4142135623730951},"417":{"tf":1.7320508075688772},"42":{"tf":1.0},"428":{"tf":2.449489742783178}},"e":{"a":{"d":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"35":{"tf":2.0},"36":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":15,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.4142135623730951},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"160":{"tf":2.0},"161":{"tf":2.0}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"160":{"tf":1.0},"161":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":26,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"167":{"tf":1.0},"180":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"219":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"382":{"tf":1.0},"405":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}},"i":{"df":2,"docs":{"315":{"tf":1.0},"316":{"tf":1.0}}},"m":{"df":1,"docs":{"267":{"tf":1.0}},"e":{"df":0,"docs":{},"、":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"399":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":9,"docs":{"300":{"tf":2.23606797749979},"301":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"319":{"tf":3.1622776601683795},"320":{"tf":2.8284271247461903},"405":{"tf":5.477225575051661},"407":{"tf":3.605551275463989},"408":{"tf":3.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"405":{"tf":1.4142135623730951},"407":{"tf":2.0},"408":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"405":{"tf":1.0},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"x":{"df":1,"docs":{"325":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"325":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"153":{"tf":1.0},"157":{"tf":1.0}}}}}},"t":{"1":{".":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"2":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"3":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"93":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"df":6,"docs":{"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":3.4641016151377544},"93":{"tf":1.7320508075688772},"95":{"tf":3.1622776601683795},"97":{"tf":1.7320508075688772}}},"2":{"df":2,"docs":{"95":{"tf":3.0},"97":{"tf":1.4142135623730951}}},"3":{"df":2,"docs":{"95":{"tf":2.449489742783178},"97":{"tf":1.4142135623730951}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":11,"docs":{"100":{"tf":1.4142135623730951},"199":{"tf":5.656854249492381},"242":{"tf":4.58257569495584},"88":{"tf":2.23606797749979},"89":{"tf":1.0},"90":{"tf":3.4641016151377544},"91":{"tf":4.898979485566356},"93":{"tf":4.47213595499958},"95":{"tf":4.358898943540674},"96":{"tf":2.0},"97":{"tf":2.6457513110645907}},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}}}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"90":{"tf":1.0}}}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"3":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},",":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"273":{"tf":1.7320508075688772}}}}},"v":{"df":7,"docs":{"300":{"tf":1.7320508075688772},"302":{"tf":1.0},"319":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"349":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.7320508075688772}}}},"d":{"df":3,"docs":{"239":{"tf":1.7320508075688772},"258":{"tf":2.0},"359":{"tf":1.7320508075688772}}},"df":4,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"123":{"tf":1.0},"258":{"tf":1.0}},"f":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"270":{"tf":1.0},"290":{"tf":1.7320508075688772}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":4,"docs":{"289":{"tf":2.0},"290":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.0}},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"a":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"df":0,"docs":{},"r":{"c":{":":{":":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"294":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"289":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"294":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{">":{"/":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":12,"docs":{"270":{"tf":1.4142135623730951},"286":{"tf":1.0},"287":{"tf":2.0},"288":{"tf":3.3166247903554},"289":{"tf":2.23606797749979},"290":{"tf":3.1622776601683795},"291":{"tf":3.605551275463989},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"307":{"tf":1.0},"310":{"tf":1.4142135623730951}}},"v":{"df":0,"docs":{},"e":{"c":{"<":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"412":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":20,"docs":{"102":{"tf":2.0},"115":{"tf":1.0},"185":{"tf":1.0},"195":{"tf":1.0},"270":{"tf":1.7320508075688772},"284":{"tf":1.0},"289":{"tf":2.0},"292":{"tf":1.0},"294":{"tf":1.0},"306":{"tf":1.0},"35":{"tf":1.0},"368":{"tf":1.0},"407":{"tf":1.0},"42":{"tf":1.4142135623730951},"50":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":2.6457513110645907},"74":{"tf":1.0},"75":{"tf":2.0},"91":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"189":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"94":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"75":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":3,"docs":{"270":{"tf":1.0},"290":{"tf":1.4142135623730951},"291":{"tf":1.0}}}},"df":1,"docs":{"290":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"353":{"tf":1.0}}}}}},"m":{"d":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"345":{"tf":1.0},"352":{"tf":1.0},"353":{"tf":2.449489742783178}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"260":{"tf":1.0},"40":{"tf":1.7320508075688772}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"434":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"343":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":1,"docs":{"115":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":7,"docs":{"155":{"tf":1.0},"156":{"tf":1.0},"255":{"tf":3.1622776601683795},"267":{"tf":1.0},"28":{"tf":2.0},"434":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":1,"docs":{"62":{"tf":3.0}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}},"v":{"df":4,"docs":{"232":{"tf":1.4142135623730951},"331":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"107":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"377":{"tf":3.4641016151377544}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"l":{"a":{"c":{"df":2,"docs":{"145":{"tf":1.0},"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":4,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":2.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"260":{"tf":1.0}}}}}}}}},"r":{"df":1,"docs":{"159":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},",":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}}}},"df":3,"docs":{"275":{"tf":1.0},"391":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"401":{"tf":2.449489742783178},"402":{"tf":1.4142135623730951},"404":{"tf":1.7320508075688772},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"341":{"tf":1.7320508075688772},"342":{"tf":3.4641016151377544},"343":{"tf":1.0}}}}}}},"df":3,"docs":{"341":{"tf":3.1622776601683795},"342":{"tf":1.7320508075688772},"343":{"tf":2.8284271247461903}}}}}}}}},"df":4,"docs":{"396":{"tf":1.0},"398":{"tf":2.0},"401":{"tf":1.0},"437":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":17,"docs":{"142":{"tf":1.4142135623730951},"273":{"tf":1.0},"299":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":4.795831523312719},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"335":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"377":{"tf":2.23606797749979}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"107":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"n":{"df":8,"docs":{"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"397":{"tf":1.0}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"398":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"260":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":9,"docs":{"316":{"tf":1.4142135623730951},"396":{"tf":1.0},"399":{"tf":1.7320508075688772},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}}}}},"t":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"114":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"120":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"189":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"\"":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"157":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"<":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":9,"docs":{"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"160":{"tf":1.0},"161":{"tf":1.7320508075688772},"398":{"tf":1.0}}}}},"t":{"df":13,"docs":{"153":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"158":{"tf":1.7320508075688772},"160":{"tf":1.0},"162":{"tf":2.0},"169":{"tf":1.0},"174":{"tf":1.0},"203":{"tf":2.6457513110645907},"224":{"tf":1.0},"225":{"tf":1.0},"300":{"tf":1.7320508075688772},"381":{"tf":2.6457513110645907},"397":{"tf":1.0}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"405":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"8":{"df":1,"docs":{"348":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}},"df":59,"docs":{"121":{"tf":2.0},"122":{"tf":1.7320508075688772},"156":{"tf":1.0},"157":{"tf":3.605551275463989},"158":{"tf":1.0},"159":{"tf":1.7320508075688772},"160":{"tf":2.0},"161":{"tf":2.0},"162":{"tf":4.69041575982343},"163":{"tf":2.0},"165":{"tf":2.23606797749979},"166":{"tf":1.4142135623730951},"168":{"tf":2.0},"170":{"tf":2.0},"172":{"tf":2.8284271247461903},"174":{"tf":1.7320508075688772},"186":{"tf":2.0},"188":{"tf":4.123105625617661},"189":{"tf":3.0},"194":{"tf":1.4142135623730951},"198":{"tf":3.0},"199":{"tf":2.23606797749979},"200":{"tf":2.23606797749979},"201":{"tf":2.449489742783178},"202":{"tf":2.0},"203":{"tf":2.0},"206":{"tf":1.4142135623730951},"207":{"tf":2.6457513110645907},"208":{"tf":2.23606797749979},"210":{"tf":1.4142135623730951},"211":{"tf":3.1622776601683795},"224":{"tf":3.1622776601683795},"225":{"tf":2.8284271247461903},"226":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":3.3166247903554},"231":{"tf":1.7320508075688772},"232":{"tf":5.656854249492381},"246":{"tf":1.0},"249":{"tf":4.58257569495584},"250":{"tf":3.1622776601683795},"257":{"tf":1.0},"266":{"tf":2.23606797749979},"290":{"tf":1.0},"306":{"tf":1.0},"316":{"tf":1.4142135623730951},"318":{"tf":1.0},"323":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"349":{"tf":1.0},"36":{"tf":3.7416573867739413},"381":{"tf":3.1622776601683795},"391":{"tf":1.0},"398":{"tf":1.4142135623730951},"401":{"tf":1.0},"405":{"tf":1.0},"42":{"tf":2.0},"45":{"tf":1.4142135623730951},"62":{"tf":2.449489742783178}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":24,"docs":{"160":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":2.23606797749979},"186":{"tf":1.0},"189":{"tf":1.4142135623730951},"191":{"tf":1.0},"224":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.7320508075688772},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":2.0},"250":{"tf":1.7320508075688772},"316":{"tf":1.0},"368":{"tf":1.0},"386":{"tf":2.0},"398":{"tf":1.0},"412":{"tf":1.0},"58":{"tf":2.0},"75":{"tf":2.449489742783178},"77":{"tf":2.23606797749979},"78":{"tf":2.0}},"s":{"_":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"386":{"tf":2.23606797749979}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"381":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"182":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"182":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":2.0}}}}}}},"u":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"f":{"c":{"df":1,"docs":{"437":{"tf":2.449489742783178}}},"df":0,"docs":{}},"g":{"b":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"359":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"359":{"tf":1.0}}},"df":1,"docs":{"267":{"tf":1.7320508075688772}}},"h":{"df":1,"docs":{"375":{"tf":3.1622776601683795}},"s":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"375":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"434":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"(":{"b":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":11,"docs":{"198":{"tf":2.449489742783178},"200":{"tf":2.449489742783178},"203":{"tf":1.4142135623730951},"206":{"tf":2.0},"208":{"tf":1.4142135623730951},"210":{"tf":2.0},"228":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"323":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"375":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"213":{"tf":1.0}}}},"p":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"213":{"tf":1.0},"267":{"tf":2.8284271247461903}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"124":{"tf":1.0},"41":{"tf":1.0}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"111":{"tf":1.0},"115":{"tf":1.0},"412":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"392":{"tf":1.4142135623730951}},"e":{"(":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"392":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"392":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"v":{"4":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772}}},"6":{"df":2,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"w":{"df":1,"docs":{"136":{"tf":1.0}}}},"s":{"df":2,"docs":{"22":{"tf":1.0},"24":{"tf":1.0}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"61":{"tf":1.0}}},"y":{"df":0,"docs":{},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}},",":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},",":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"179":{"tf":1.0},"191":{"tf":1.0},"378":{"tf":1.0}}}},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":8,"docs":{"225":{"tf":2.8284271247461903},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":101,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.7320508075688772},"155":{"tf":1.7320508075688772},"156":{"tf":2.449489742783178},"157":{"tf":1.7320508075688772},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":3.1622776601683795},"199":{"tf":3.0},"200":{"tf":2.449489742783178},"201":{"tf":2.449489742783178},"202":{"tf":2.8284271247461903},"204":{"tf":1.4142135623730951},"206":{"tf":2.449489742783178},"207":{"tf":2.6457513110645907},"208":{"tf":2.449489742783178},"211":{"tf":4.0},"214":{"tf":1.0},"216":{"tf":2.0},"217":{"tf":1.4142135623730951},"218":{"tf":1.4142135623730951},"220":{"tf":1.4142135623730951},"224":{"tf":2.8284271247461903},"225":{"tf":4.123105625617661},"226":{"tf":2.23606797749979},"228":{"tf":1.7320508075688772},"229":{"tf":3.872983346207417},"232":{"tf":3.4641016151377544},"234":{"tf":1.0},"235":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"241":{"tf":2.0},"242":{"tf":1.7320508075688772},"246":{"tf":1.4142135623730951},"257":{"tf":1.0},"266":{"tf":3.3166247903554},"27":{"tf":2.8284271247461903},"273":{"tf":1.0},"277":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":2.23606797749979},"285":{"tf":1.0},"286":{"tf":1.4142135623730951},"289":{"tf":1.0},"290":{"tf":1.7320508075688772},"291":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"316":{"tf":2.23606797749979},"319":{"tf":1.4142135623730951},"32":{"tf":2.0},"320":{"tf":1.0},"334":{"tf":1.7320508075688772},"335":{"tf":2.0},"350":{"tf":1.4142135623730951},"351":{"tf":1.0},"353":{"tf":1.7320508075688772},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":2.6457513110645907},"377":{"tf":1.0},"38":{"tf":1.7320508075688772},"391":{"tf":1.0},"397":{"tf":1.7320508075688772},"398":{"tf":1.4142135623730951},"400":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.0},"408":{"tf":1.7320508075688772},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"49":{"tf":2.0},"51":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"56":{"tf":2.23606797749979},"57":{"tf":1.0},"58":{"tf":1.7320508075688772},"61":{"tf":3.1622776601683795},"62":{"tf":2.449489742783178},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.7320508075688772},"91":{"tf":2.449489742783178}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"314":{"tf":1.0}},"e":{"df":0,"docs":{},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"特":{"df":0,"docs":{},"别":{"df":0,"docs":{},"是":{"df":0,"docs":{},"(":{"df":0,"docs":{},"但":{"df":0,"docs":{},"不":{"df":0,"docs":{},"仅":{"df":0,"docs":{},"是":{"df":0,"docs":{},"!":{"df":0,"docs":{},")":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"b":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"\"":{"df":0,"docs":{},"、":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"\"":{"df":0,"docs":{},"、":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"365":{"tf":1.0},"432":{"tf":1.0}}},"df":0,"docs":{}}},"<":{"/":{"df":0,"docs":{},"p":{"df":1,"docs":{"400":{"tf":1.0}}}},"df":0,"docs":{}},"_":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":2,"docs":{"156":{"tf":1.7320508075688772},"224":{"tf":1.0}},"e":{"=":{"1":{"df":15,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"290":{"tf":1.0},"43":{"tf":1.0},"54":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{":":{":":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"335":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"a":{"c":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":14,"docs":{"111":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"145":{"tf":1.0},"159":{"tf":1.0},"222":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.0},"40":{"tf":1.0},"409":{"tf":1.0},"49":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}},"s":{"df":0,"docs":{},"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"9":{"0":{"c":{"d":{"a":{"1":{"9":{"6":{"9":{"3":{"8":{"3":{"df":0,"docs":{},"f":{"5":{"6":{"a":{"2":{"6":{"3":{"7":{"c":{"b":{"d":{"3":{"0":{"3":{"7":{"b":{"d":{"df":0,"docs":{},"f":{"5":{"9":{"8":{"8":{"4":{"1":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"8":{"3":{"9":{":":{"8":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"5":{"7":{"4":{":":{"1":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"5":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":58,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"111":{"tf":1.4142135623730951},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"17":{"tf":1.4142135623730951},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"22":{"tf":1.4142135623730951},"228":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"29":{"tf":1.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.4142135623730951},"42":{"tf":1.0},"426":{"tf":1.0},"434":{"tf":1.0},"436":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}}},"d":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}}},"df":278,"docs":{"0":{"tf":3.0},"1":{"tf":3.4641016151377544},"10":{"tf":4.58257569495584},"100":{"tf":1.0},"102":{"tf":3.0},"103":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":2.0},"108":{"tf":1.0},"109":{"tf":1.4142135623730951},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"115":{"tf":2.23606797749979},"116":{"tf":1.0},"12":{"tf":1.7320508075688772},"121":{"tf":1.7320508075688772},"124":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"13":{"tf":3.0},"130":{"tf":1.4142135623730951},"132":{"tf":2.23606797749979},"133":{"tf":1.0},"134":{"tf":1.4142135623730951},"136":{"tf":1.7320508075688772},"138":{"tf":1.0},"139":{"tf":2.0},"142":{"tf":3.1622776601683795},"143":{"tf":1.4142135623730951},"145":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"153":{"tf":1.7320508075688772},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":2.23606797749979},"157":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.4142135623730951},"161":{"tf":1.0},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":2.0},"172":{"tf":1.4142135623730951},"176":{"tf":2.0},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"181":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":2.6457513110645907},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":2.0},"189":{"tf":1.0},"191":{"tf":3.1622776601683795},"192":{"tf":1.0},"195":{"tf":1.4142135623730951},"196":{"tf":1.7320508075688772},"197":{"tf":1.4142135623730951},"198":{"tf":2.449489742783178},"2":{"tf":2.23606797749979},"20":{"tf":2.449489742783178},"200":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"210":{"tf":1.7320508075688772},"211":{"tf":2.0},"212":{"tf":1.4142135623730951},"213":{"tf":1.7320508075688772},"215":{"tf":1.0},"216":{"tf":1.4142135623730951},"219":{"tf":1.0},"22":{"tf":2.23606797749979},"220":{"tf":1.0},"222":{"tf":1.4142135623730951},"225":{"tf":1.0},"228":{"tf":2.23606797749979},"229":{"tf":2.23606797749979},"23":{"tf":3.0},"231":{"tf":2.449489742783178},"232":{"tf":4.0},"236":{"tf":1.4142135623730951},"237":{"tf":2.6457513110645907},"238":{"tf":1.4142135623730951},"239":{"tf":1.0},"24":{"tf":2.23606797749979},"240":{"tf":1.0},"241":{"tf":1.0},"242":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":3.1622776601683795},"25":{"tf":2.23606797749979},"250":{"tf":2.23606797749979},"251":{"tf":1.4142135623730951},"252":{"tf":2.449489742783178},"253":{"tf":2.0},"255":{"tf":1.4142135623730951},"256":{"tf":1.0},"257":{"tf":1.7320508075688772},"26":{"tf":1.4142135623730951},"260":{"tf":1.4142135623730951},"261":{"tf":1.0},"267":{"tf":2.23606797749979},"269":{"tf":1.4142135623730951},"270":{"tf":2.0},"273":{"tf":2.6457513110645907},"274":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"280":{"tf":1.7320508075688772},"281":{"tf":2.449489742783178},"282":{"tf":1.7320508075688772},"283":{"tf":3.605551275463989},"284":{"tf":1.0},"285":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":2.449489742783178},"289":{"tf":1.4142135623730951},"29":{"tf":1.0},"292":{"tf":1.7320508075688772},"293":{"tf":2.0},"295":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":2.8284271247461903},"3":{"tf":1.7320508075688772},"30":{"tf":2.23606797749979},"300":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"307":{"tf":1.7320508075688772},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"311":{"tf":1.0},"312":{"tf":2.0},"313":{"tf":1.0},"314":{"tf":1.7320508075688772},"315":{"tf":2.6457513110645907},"316":{"tf":4.358898943540674},"318":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":1.0},"324":{"tf":1.7320508075688772},"328":{"tf":2.8284271247461903},"329":{"tf":1.4142135623730951},"33":{"tf":1.0},"330":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"332":{"tf":2.6457513110645907},"333":{"tf":1.4142135623730951},"334":{"tf":1.7320508075688772},"335":{"tf":1.7320508075688772},"336":{"tf":1.4142135623730951},"337":{"tf":1.7320508075688772},"338":{"tf":1.0},"339":{"tf":1.0},"34":{"tf":1.7320508075688772},"340":{"tf":1.0},"341":{"tf":1.4142135623730951},"342":{"tf":1.0},"343":{"tf":2.6457513110645907},"344":{"tf":2.23606797749979},"345":{"tf":1.0},"346":{"tf":1.0},"348":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":2.0},"358":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":2.23606797749979},"361":{"tf":1.0},"363":{"tf":1.7320508075688772},"364":{"tf":2.23606797749979},"365":{"tf":4.123105625617661},"366":{"tf":2.0},"367":{"tf":2.23606797749979},"368":{"tf":4.47213595499958},"369":{"tf":2.449489742783178},"370":{"tf":1.0},"371":{"tf":1.7320508075688772},"372":{"tf":1.0},"373":{"tf":1.0},"375":{"tf":1.0},"376":{"tf":3.3166247903554},"378":{"tf":1.0},"379":{"tf":1.0},"381":{"tf":1.0},"382":{"tf":2.23606797749979},"383":{"tf":2.0},"387":{"tf":1.0},"388":{"tf":1.4142135623730951},"389":{"tf":3.0},"39":{"tf":1.4142135623730951},"390":{"tf":1.4142135623730951},"391":{"tf":4.358898943540674},"393":{"tf":1.0},"394":{"tf":1.0},"395":{"tf":1.7320508075688772},"397":{"tf":1.0},"4":{"tf":2.449489742783178},"40":{"tf":2.0},"402":{"tf":1.0},"405":{"tf":1.7320508075688772},"409":{"tf":1.7320508075688772},"410":{"tf":1.0},"411":{"tf":1.0},"413":{"tf":1.0},"414":{"tf":1.0},"415":{"tf":1.0},"416":{"tf":1.0},"42":{"tf":3.3166247903554},"425":{"tf":1.4142135623730951},"426":{"tf":1.7320508075688772},"427":{"tf":1.4142135623730951},"428":{"tf":1.4142135623730951},"429":{"tf":2.6457513110645907},"430":{"tf":4.358898943540674},"432":{"tf":2.449489742783178},"433":{"tf":2.23606797749979},"434":{"tf":4.358898943540674},"435":{"tf":1.4142135623730951},"436":{"tf":3.1622776601683795},"437":{"tf":3.1622776601683795},"46":{"tf":1.7320508075688772},"47":{"tf":2.0},"48":{"tf":1.4142135623730951},"49":{"tf":2.0},"5":{"tf":1.4142135623730951},"50":{"tf":1.0},"52":{"tf":1.7320508075688772},"53":{"tf":4.358898943540674},"54":{"tf":2.6457513110645907},"55":{"tf":2.0},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.4142135623730951},"59":{"tf":1.4142135623730951},"6":{"tf":1.0},"61":{"tf":2.449489742783178},"62":{"tf":2.449489742783178},"64":{"tf":2.0},"65":{"tf":1.7320508075688772},"66":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.7320508075688772},"70":{"tf":4.123105625617661},"71":{"tf":1.0},"74":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951},"77":{"tf":1.0},"78":{"tf":1.7320508075688772},"8":{"tf":2.6457513110645907},"80":{"tf":1.7320508075688772},"81":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"91":{"tf":1.4142135623730951},"93":{"tf":1.7320508075688772},"94":{"tf":2.23606797749979},"98":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"427":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"t":{"df":3,"docs":{"23":{"tf":1.0},"4":{"tf":1.0},"426":{"tf":2.8284271247461903}},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"134":{"tf":1.0},"295":{"tf":1.0},"311":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"267":{"tf":1.0}}}},"df":10,"docs":{"0":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"18":{"tf":2.0},"19":{"tf":1.0},"30":{"tf":1.0},"426":{"tf":1.0},"428":{"tf":1.0},"436":{"tf":3.0}}}},"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"v":{":":{"9":{"9":{".":{"0":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"x":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"319":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"300":{"tf":1.0},"301":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"319":{"tf":1.7320508075688772},"349":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"319":{"tf":1.7320508075688772},"320":{"tf":3.3166247903554}}}}}},"df":8,"docs":{"300":{"tf":2.23606797749979},"301":{"tf":1.0},"302":{"tf":1.7320508075688772},"303":{"tf":1.4142135623730951},"319":{"tf":3.0},"320":{"tf":2.449489742783178},"325":{"tf":1.7320508075688772},"349":{"tf":1.0}}},"y":{"b":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}}},"s":{".":{"a":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":3,"docs":{"191":{"tf":1.0},"77":{"tf":2.23606797749979},"78":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"77":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"72":{"tf":1.0},"73":{"tf":1.7320508075688772},"77":{"tf":2.449489742783178},"78":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"'":{"df":0,"docs":{},"l":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"69":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"247":{"tf":1.0}}}}}}},"1":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"2":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"[":{"0":{"df":1,"docs":{"142":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":6,"docs":{"141":{"tf":3.3166247903554},"142":{"tf":1.0},"383":{"tf":1.4142135623730951},"70":{"tf":4.69041575982343},"72":{"tf":2.0},"73":{"tf":3.1622776601683795}}},"2":{"df":4,"docs":{"141":{"tf":4.358898943540674},"383":{"tf":1.4142135623730951},"70":{"tf":4.0},"72":{"tf":2.449489742783178}},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}}}},"3":{"df":2,"docs":{"141":{"tf":2.6457513110645907},"72":{"tf":1.7320508075688772}}},"[":{".":{".":{"2":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"2":{"df":1,"docs":{"78":{"tf":1.0}}},"5":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":2,"docs":{"191":{"tf":1.0},"78":{"tf":2.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"78":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"78":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"78":{"tf":1.0}}},"6":{".":{".":{"1":{"1":{"df":1,"docs":{"78":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":8,"docs":{"102":{"tf":1.0},"228":{"tf":2.0},"229":{"tf":2.0},"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},")":{"df":0,"docs":{},";":{"df":0,"docs":{},"编":{"df":0,"docs":{},"译":{"df":0,"docs":{},"器":{"df":0,"docs":{},"也":{"df":0,"docs":{},"指":{"df":0,"docs":{},"出":{"df":0,"docs":{},"了":{"df":0,"docs":{},"原":{"df":0,"docs":{},"因":{"df":0,"docs":{},":":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"257":{"tf":1.0}}}}}},"l":{"a":{"d":{"df":3,"docs":{"119":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"343":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"152":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"320":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":2.0}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"335":{"tf":1.0},"52":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"359":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"91":{"tf":2.23606797749979}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"343":{"tf":1.4142135623730951},"434":{"tf":1.0}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":11,"docs":{"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"120":{"tf":1.0},"137":{"tf":1.0},"286":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"405":{"tf":1.4142135623730951},"407":{"tf":1.0},"51":{"tf":1.4142135623730951},"68":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"147":{"tf":1.0},"148":{"tf":2.449489742783178},"150":{"tf":1.7320508075688772}},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"\"":{")":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"5":{"0":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"\"":{")":{")":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"5":{"0":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"0":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"150":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"147":{"tf":1.0},"148":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"369":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}}}},"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"334":{"tf":1.4142135623730951}}}},"df":2,"docs":{"334":{"tf":3.3166247903554},"335":{"tf":4.0}}}}}}},"df":20,"docs":{"140":{"tf":2.23606797749979},"141":{"tf":3.1622776601683795},"143":{"tf":1.7320508075688772},"183":{"tf":1.0},"191":{"tf":1.0},"193":{"tf":1.0},"240":{"tf":1.4142135623730951},"252":{"tf":1.4142135623730951},"359":{"tf":1.4142135623730951},"360":{"tf":2.8284271247461903},"68":{"tf":3.0},"69":{"tf":1.4142135623730951},"70":{"tf":2.23606797749979},"71":{"tf":2.6457513110645907},"72":{"tf":1.0},"73":{"tf":2.8284271247461903},"74":{"tf":5.196152422706632},"75":{"tf":3.605551275463989},"77":{"tf":2.23606797749979},"78":{"tf":3.872983346207417}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"229":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"228":{"tf":1.7320508075688772},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"<":{"'":{"a":{">":{"(":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"250":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"&":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"232":{"tf":1.7320508075688772},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}}},"<":{"'":{"a":{"df":3,"docs":{"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"213":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"225":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":2.8284271247461903},"229":{"tf":3.3166247903554},"231":{"tf":1.7320508075688772},"232":{"tf":2.0},"248":{"tf":1.0},"250":{"tf":2.0},"252":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"214":{"tf":1.0}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":3,"docs":{"27":{"tf":2.0},"398":{"tf":2.0},"40":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"(":{"df":2,"docs":{"77":{"tf":1.0},"78":{"tf":1.0}}},"df":2,"docs":{"77":{"tf":1.0},"78":{"tf":1.0}}},"df":0,"docs":{}}}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}}}},"df":8,"docs":{"187":{"tf":1.4142135623730951},"318":{"tf":3.872983346207417},"322":{"tf":1.4142135623730951},"323":{"tf":2.0},"360":{"tf":2.6457513110645907},"368":{"tf":1.0},"54":{"tf":1.4142135623730951},"74":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":9,"docs":{"124":{"tf":1.4142135623730951},"125":{"tf":2.0},"167":{"tf":1.0},"382":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"42":{"tf":3.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"df":10,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"259":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":6,"docs":{"142":{"tf":1.0},"26":{"tf":1.0},"260":{"tf":1.4142135623730951},"273":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":2,"docs":{"333":{"tf":1.4142135623730951},"335":{"tf":3.1622776601683795}}}}},"df":3,"docs":{"15":{"tf":1.0},"316":{"tf":1.4142135623730951},"335":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}},"f":{".":{"0":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"378":{"tf":1.0}}}}}}},"df":3,"docs":{"280":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"378":{"tf":1.4142135623730951}}},"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951},"343":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":5,"docs":{"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"374":{"tf":1.4142135623730951}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"283":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":4,"docs":{"199":{"tf":2.0},"93":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}}}}}}},"i":{"df":4,"docs":{"183":{"tf":1.4142135623730951},"375":{"tf":1.0},"377":{"tf":1.0},"94":{"tf":1.0}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"331":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"331":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"331":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"o":{"c":{"df":3,"docs":{"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"x":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"239":{"tf":2.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"192":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"405":{"tf":1.7320508075688772},"407":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"289":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"289":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"289":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"239":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"341":{"tf":1.4142135623730951},"342":{"tf":2.449489742783178}},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"342":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"341":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"180":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"377":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"179":{"tf":1.0},"180":{"tf":1.7320508075688772},"181":{"tf":1.0},"182":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"167":{"tf":1.0},"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"199":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"x":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"(":{"2":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":5,"docs":{"175":{"tf":1.7320508075688772},"183":{"tf":1.4142135623730951},"375":{"tf":1.0},"377":{"tf":1.0},"94":{"tf":1.0}}},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"(":{"2":{")":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"175":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"244":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"375":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"417":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"280":{"tf":1.0}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":37,"docs":{"101":{"tf":1.4142135623730951},"125":{"tf":1.0},"141":{"tf":1.4142135623730951},"167":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":1.0},"183":{"tf":1.7320508075688772},"191":{"tf":2.0},"192":{"tf":2.23606797749979},"239":{"tf":1.0},"242":{"tf":1.0},"244":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":2.0},"289":{"tf":3.1622776601683795},"290":{"tf":1.0},"293":{"tf":1.4142135623730951},"331":{"tf":1.7320508075688772},"339":{"tf":1.4142135623730951},"340":{"tf":1.0},"341":{"tf":2.8284271247461903},"342":{"tf":4.898979485566356},"343":{"tf":2.23606797749979},"374":{"tf":1.7320508075688772},"375":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"381":{"tf":3.4641016151377544},"382":{"tf":1.0},"407":{"tf":2.449489742783178},"408":{"tf":1.7320508075688772},"412":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":4.242640687119285},"94":{"tf":1.0},"95":{"tf":1.7320508075688772},"96":{"tf":2.0}},"、":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"115":{"tf":1.0}}}}}},")":{"df":0,"docs":{},"或":{"df":0,"docs":{},"者":{"df":0,"docs":{},"是":{"df":0,"docs":{},"获":{"df":0,"docs":{},"取":{"df":0,"docs":{},"所":{"df":0,"docs":{},"有":{"df":0,"docs":{},"权":{"df":0,"docs":{},"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"事":{"df":0,"docs":{},"实":{"df":0,"docs":{},"上":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"94":{"tf":1.0}}}}}}}}}}}}}}}}}}}}}}}}},",":{"df":0,"docs":{},"做":{"df":0,"docs":{},"出":{"df":0,"docs":{},"修":{"df":0,"docs":{},"改":{"df":0,"docs":{},"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"58":{"tf":1.0}}}}}}},"df":1,"docs":{"391":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"n":{"d":{"(":{"\"":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}},"df":0,"docs":{}}},"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"289":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"289":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}}},"df":18,"docs":{"289":{"tf":2.6457513110645907},"290":{"tf":1.0},"296":{"tf":1.0},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"306":{"tf":2.23606797749979},"307":{"tf":1.0},"308":{"tf":2.0},"309":{"tf":3.4641016151377544},"310":{"tf":2.0},"311":{"tf":2.6457513110645907},"312":{"tf":1.0},"319":{"tf":1.0},"370":{"tf":2.23606797749979},"381":{"tf":2.23606797749979},"405":{"tf":4.58257569495584},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"405":{"tf":4.358898943540674},"407":{"tf":3.4641016151377544},"408":{"tf":4.0}}}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"289":{"tf":3.0},"290":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"306":{"tf":1.7320508075688772}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"114":{"tf":2.0}},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"395":{"tf":1.0}}},"df":0,"docs":{}}},"df":19,"docs":{"111":{"tf":1.0},"260":{"tf":1.0},"316":{"tf":1.0},"395":{"tf":3.0},"396":{"tf":3.0},"397":{"tf":2.23606797749979},"398":{"tf":1.4142135623730951},"399":{"tf":1.4142135623730951},"400":{"tf":2.23606797749979},"401":{"tf":2.0},"402":{"tf":2.23606797749979},"403":{"tf":3.0},"404":{"tf":3.1622776601683795},"405":{"tf":3.605551275463989},"406":{"tf":1.4142135623730951},"407":{"tf":1.0},"408":{"tf":2.8284271247461903},"409":{"tf":1.0},"429":{"tf":1.4142135623730951}}}},"i":{"c":{"df":1,"docs":{"151":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"289":{"tf":2.0}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":2,"docs":{"360":{"tf":1.0},"436":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"360":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"211":{"tf":2.449489742783178}}}}}},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"70":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":4,"docs":{"296":{"tf":1.0},"300":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951},"306":{"tf":2.449489742783178}}}}},"df":1,"docs":{"15":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":4,"docs":{"115":{"tf":1.0},"232":{"tf":1.0},"234":{"tf":1.0},"24":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":1,"docs":{"239":{"tf":2.449489742783178}}}}}}},"df":1,"docs":{"239":{"tf":2.0}}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}},"o":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"247":{"tf":2.0}},"e":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"247":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"247":{"tf":2.8284271247461903}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":1,"docs":{"247":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"247":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"416":{"tf":1.4142135623730951}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"83":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"197":{"tf":1.0},"202":{"tf":3.7416573867739413},"203":{"tf":1.0}},"i":{"c":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"202":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":3,"docs":{"196":{"tf":1.4142135623730951},"206":{"tf":2.0},"24":{"tf":1.0}},"n":{"df":1,"docs":{"106":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":1,"docs":{"416":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"406":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"408":{"tf":3.3166247903554}}}}},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"114":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"375":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"82":{"tf":2.8284271247461903},"83":{"tf":1.4142135623730951},"84":{"tf":2.8284271247461903},"87":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"186":{"tf":1.0},"228":{"tf":1.0}}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"328":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":4,"docs":{"300":{"tf":1.0},"303":{"tf":1.0},"396":{"tf":1.0},"405":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"398":{"tf":1.0}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"240":{"tf":1.0}}}}},"x":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"54":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":5,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.7320508075688772},"105":{"tf":2.0},"106":{"tf":1.0},"61":{"tf":1.4142135623730951}}},"z":{"df":0,"docs":{},"e":{"d":{">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"383":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"247":{"tf":2.449489742783178},"273":{"tf":1.0},"334":{"tf":1.0},"383":{"tf":3.0},"386":{"tf":1.4142135623730951},"405":{"tf":5.0},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178},"417":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"318":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":2.8284271247461903},"323":{"tf":1.0},"404":{"tf":2.23606797749979},"405":{"tf":2.6457513110645907},"408":{"tf":1.4142135623730951}}}}},"i":{"c":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"368":{"tf":1.0}}}}},"r":{"df":1,"docs":{"368":{"tf":1.0}}}},"df":1,"docs":{"368":{"tf":2.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":39,"docs":{"139":{"tf":2.23606797749979},"141":{"tf":2.0},"143":{"tf":2.449489742783178},"145":{"tf":1.4142135623730951},"150":{"tf":1.0},"162":{"tf":2.0},"170":{"tf":1.7320508075688772},"172":{"tf":2.23606797749979},"175":{"tf":1.0},"186":{"tf":2.6457513110645907},"188":{"tf":1.4142135623730951},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":2.0},"194":{"tf":1.0},"222":{"tf":1.0},"224":{"tf":1.4142135623730951},"228":{"tf":1.7320508075688772},"232":{"tf":1.7320508075688772},"242":{"tf":2.0},"249":{"tf":2.449489742783178},"252":{"tf":1.0},"281":{"tf":2.0},"340":{"tf":1.4142135623730951},"341":{"tf":1.0},"342":{"tf":1.0},"368":{"tf":5.291502622129181},"369":{"tf":1.0},"383":{"tf":1.7320508075688772},"389":{"tf":1.0},"404":{"tf":1.0},"417":{"tf":1.0},"422":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":2.6457513110645907},"78":{"tf":6.708203932499369},"79":{"tf":2.8284271247461903},"80":{"tf":1.4142135623730951},"87":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"[":{"_":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"142":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"这":{"df":0,"docs":{},"也":{"df":0,"docs":{},"就":{"df":0,"docs":{},"是":{"df":0,"docs":{},"为":{"df":0,"docs":{},"什":{"df":0,"docs":{},"么":{"df":0,"docs":{},"字":{"df":0,"docs":{},"符":{"df":0,"docs":{},"串":{"df":0,"docs":{},"字":{"df":0,"docs":{},"面":{"df":0,"docs":{},"值":{"df":0,"docs":{},"是":{"df":0,"docs":{},"不":{"df":0,"docs":{},"可":{"df":0,"docs":{},"变":{"df":0,"docs":{},"的":{"df":0,"docs":{},";":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"78":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}},",":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"w":{"(":{"\"":{"a":{"df":1,"docs":{"322":{"tf":3.0}}},"b":{"df":1,"docs":{"322":{"tf":3.4641016151377544}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}},"df":0,"docs":{}}},"df":3,"docs":{"321":{"tf":1.4142135623730951},"322":{"tf":2.8284271247461903},"323":{"tf":1.7320508075688772}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":7,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}}},"_":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"199":{"tf":2.23606797749979}}}}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":50,"docs":{"101":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"125":{"tf":2.0},"167":{"tf":1.4142135623730951},"183":{"tf":1.0},"199":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":2.0},"226":{"tf":2.0},"232":{"tf":1.0},"249":{"tf":1.7320508075688772},"257":{"tf":1.0},"258":{"tf":2.0},"260":{"tf":1.0},"266":{"tf":1.4142135623730951},"267":{"tf":1.0},"289":{"tf":1.0},"303":{"tf":1.4142135623730951},"320":{"tf":1.7320508075688772},"323":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":2.8284271247461903},"343":{"tf":1.0},"374":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.7320508075688772},"383":{"tf":1.7320508075688772},"391":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.4142135623730951},"404":{"tf":1.7320508075688772},"405":{"tf":4.58257569495584},"407":{"tf":1.0},"408":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"395":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"260":{"tf":1.0},"330":{"tf":1.0},"434":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"(":{"&":{"1":{"df":1,"docs":{"244":{"tf":1.0}}},"2":{"df":1,"docs":{"244":{"tf":1.0}}},"3":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"134":{"tf":1.0}}}}},"'":{"d":{"df":1,"docs":{"162":{"tf":1.0}}},"df":1,"docs":{"102":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"360":{"tf":1.0}}},"df":0,"docs":{}},"3":{"df":0,"docs":{},"u":{"8":{"df":1,"docs":{"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"4":{"df":1,"docs":{"361":{"tf":1.4142135623730951}}},"5":{".":{"0":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"0":{"df":2,"docs":{"356":{"tf":1.0},"361":{"tf":1.0}}},"df":7,"docs":{"102":{"tf":1.4142135623730951},"105":{"tf":2.6457513110645907},"106":{"tf":1.0},"176":{"tf":1.0},"356":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"361":{"tf":1.7320508075688772}}},"_":{"df":1,"docs":{"360":{"tf":2.0}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":5,"docs":{"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"348":{"tf":1.0}}}}}}},"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":2.449489742783178}},"f":{"6":{"4":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"3":{"2":{"df":1,"docs":{"176":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"105":{"tf":3.0},"106":{"tf":2.0},"347":{"tf":1.7320508075688772},"356":{"tf":1.0},"361":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"293":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"x":{")":{"df":0,"docs":{},",":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":1,"docs":{"108":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":1,"docs":{"361":{"tf":1.4142135623730951}},"o":{"d":{"df":1,"docs":{"294":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"239":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"s":{".":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"342":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"341":{"tf":1.0},"342":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"374":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"df":1,"docs":{"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"360":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":4,"docs":{"102":{"tf":1.7320508075688772},"105":{"tf":1.0},"174":{"tf":1.0},"382":{"tf":1.0}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"319":{"tf":2.0},"320":{"tf":2.6457513110645907},"324":{"tf":2.23606797749979},"331":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"382":{"tf":1.0}}},"x":{"df":3,"docs":{"242":{"tf":1.0},"353":{"tf":3.1622776601683795},"361":{"tf":2.0}}}},"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"390":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"71":{"tf":1.4142135623730951}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"390":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"353":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":4,"docs":{"71":{"tf":1.4142135623730951},"72":{"tf":2.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"73":{"tf":1.4142135623730951},"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.4142135623730951},"235":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"194":{"tf":1.0}}},"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"87":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"df":5,"docs":{"229":{"tf":1.0},"268":{"tf":1.4142135623730951},"59":{"tf":1.0},"61":{"tf":1.4142135623730951},"94":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"1":{"2":{"3":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},",":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"242":{"tf":3.1622776601683795}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"242":{"tf":1.4142135623730951}},"e":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":1,"docs":{"242":{"tf":2.0}}}}}}},"df":1,"docs":{"242":{"tf":1.0}}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"51":{"tf":3.0}},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"51":{"tf":1.7320508075688772}}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"51":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":1,"docs":{"391":{"tf":1.0}}},"w":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"f":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}},"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"318":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":3,"docs":{"298":{"tf":5.291502622129181},"306":{"tf":1.0},"405":{"tf":1.7320508075688772}}}}},"d":{"df":0,"docs":{},"x":{"df":1,"docs":{"260":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"376":{"tf":2.0}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"211":{"tf":1.0}},"i":{"df":5,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"376":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"368":{"tf":1.0}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"368":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":1,"docs":{"368":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"376":{"tf":1.4142135623730951}},"。":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"376":{"tf":1.0}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"136":{"tf":1.0},"333":{"tf":1.0}},"l":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"(":{"1":{"0":{".":{"1":{"2":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"3":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"136":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"q":{"df":1,"docs":{"96":{"tf":1.4142135623730951}},"l":{"!":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"393":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"393":{"tf":1.0}}}}}}}},"df":1,"docs":{"393":{"tf":2.0}}},"u":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"88":{"tf":1.7320508075688772},"89":{"tf":1.0},"90":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"c":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"111":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"127":{"tf":2.6457513110645907},"128":{"tf":1.0}}}},"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"r":{"df":2,"docs":{"127":{"tf":1.0},"128":{"tf":1.0}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":2.0}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.4142135623730951}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":64,"docs":{"111":{"tf":1.7320508075688772},"113":{"tf":1.0},"114":{"tf":1.7320508075688772},"115":{"tf":1.0},"116":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"128":{"tf":1.0},"167":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"191":{"tf":1.0},"198":{"tf":3.0},"199":{"tf":2.6457513110645907},"200":{"tf":1.7320508075688772},"201":{"tf":1.7320508075688772},"202":{"tf":2.23606797749979},"206":{"tf":1.7320508075688772},"207":{"tf":2.0},"208":{"tf":1.7320508075688772},"210":{"tf":1.4142135623730951},"211":{"tf":2.23606797749979},"221":{"tf":1.0},"226":{"tf":2.6457513110645907},"227":{"tf":1.0},"228":{"tf":2.0},"229":{"tf":2.23606797749979},"231":{"tf":1.0},"232":{"tf":2.449489742783178},"244":{"tf":1.0},"245":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":2.0},"250":{"tf":1.4142135623730951},"257":{"tf":2.449489742783178},"258":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"289":{"tf":1.7320508075688772},"290":{"tf":1.4142135623730951},"331":{"tf":1.4142135623730951},"334":{"tf":2.0},"335":{"tf":1.0},"338":{"tf":1.0},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"374":{"tf":1.0},"375":{"tf":1.0},"389":{"tf":1.0},"390":{"tf":1.0},"391":{"tf":1.4142135623730951},"405":{"tf":3.605551275463989},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}},"s":{":":{"1":{"1":{":":{"9":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"1":{"3":{"df":1,"docs":{"202":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":2,"docs":{"200":{"tf":1.0},"201":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"9":{"df":1,"docs":{"198":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"9":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"2":{"5":{"df":1,"docs":{"386":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"6":{":":{"4":{"2":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"5":{"1":{"df":1,"docs":{"228":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"199":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"5":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{":":{"9":{"df":1,"docs":{"116":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"4":{":":{"9":{"df":1,"docs":{"228":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"3":{"3":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"5":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"5":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"2":{":":{"1":{"3":{"df":1,"docs":{"407":{"tf":1.0}}},"df":0,"docs":{}},"2":{"7":{"df":1,"docs":{"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"1":{"3":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"0":{":":{"5":{"3":{"df":1,"docs":{"290":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"2":{":":{"2":{"2":{"df":1,"docs":{"407":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"5":{"df":2,"docs":{"120":{"tf":1.0},"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"2":{"8":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"3":{"7":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"9":{"0":{"6":{":":{"4":{"df":1,"docs":{"159":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":148,"docs":{"111":{"tf":2.0},"113":{"tf":1.7320508075688772},"114":{"tf":1.0},"117":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.4142135623730951},"127":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"175":{"tf":1.7320508075688772},"176":{"tf":1.0},"186":{"tf":1.4142135623730951},"188":{"tf":1.7320508075688772},"189":{"tf":1.4142135623730951},"190":{"tf":1.0},"211":{"tf":2.0},"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":2.0},"226":{"tf":2.449489742783178},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"235":{"tf":1.0},"239":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"246":{"tf":1.4142135623730951},"249":{"tf":1.7320508075688772},"258":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.7320508075688772},"283":{"tf":1.7320508075688772},"285":{"tf":1.4142135623730951},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979},"298":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":2.0},"316":{"tf":2.23606797749979},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"32":{"tf":1.7320508075688772},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0},"33":{"tf":1.4142135623730951},"335":{"tf":1.7320508075688772},"337":{"tf":1.0},"343":{"tf":1.4142135623730951},"348":{"tf":1.0},"352":{"tf":1.0},"356":{"tf":1.0},"359":{"tf":2.0},"360":{"tf":2.0},"361":{"tf":1.0},"368":{"tf":1.0},"369":{"tf":1.4142135623730951},"375":{"tf":1.0},"376":{"tf":2.449489742783178},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"385":{"tf":1.0},"391":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"40":{"tf":1.4142135623730951},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.449489742783178},"408":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"414":{"tf":1.0},"42":{"tf":1.4142135623730951},"427":{"tf":2.0},"428":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":2.0},"51":{"tf":1.0},"53":{"tf":2.0},"54":{"tf":2.449489742783178},"55":{"tf":1.4142135623730951},"56":{"tf":1.7320508075688772},"57":{"tf":1.7320508075688772},"58":{"tf":1.7320508075688772},"59":{"tf":1.4142135623730951},"61":{"tf":2.6457513110645907},"62":{"tf":2.449489742783178},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"75":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"78":{"tf":1.7320508075688772},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":2.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"96":{"tf":1.0}},"s":{":":{"1":{"0":{":":{"1":{"0":{"df":1,"docs":{"299":{"tf":1.0}}},"6":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"2":{"6":{"df":1,"docs":{"301":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{":":{"1":{"6":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"285":{"tf":1.0}}},"6":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"189":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"2":{"8":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{":":{"1":{"9":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"7":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"1":{"4":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"3":{"0":{"df":1,"docs":{"242":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"1":{"9":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"225":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"df":1,"docs":{"273":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{":":{"2":{"3":{"df":1,"docs":{"377":{"tf":1.0}}},"df":0,"docs":{}},"4":{"3":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{":":{"2":{"9":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"2":{"1":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{":":{"7":{"df":1,"docs":{"377":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"1":{"3":{"df":1,"docs":{"224":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"2":{"1":{"df":1,"docs":{"224":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"4":{"7":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"3":{"df":2,"docs":{"428":{"tf":1.0},"57":{"tf":1.0}}},"4":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"2":{"8":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"155":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"353":{"tf":1.0}}},"9":{"df":2,"docs":{"351":{"tf":1.0},"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{":":{"1":{"3":{"df":1,"docs":{"289":{"tf":1.0}}},"4":{"df":1,"docs":{"51":{"tf":1.0}}},"5":{"df":2,"docs":{"106":{"tf":1.0},"87":{"tf":1.0}}},"6":{"df":1,"docs":{"142":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"377":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"353":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{":":{"3":{"7":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"2":{"4":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"9":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"2":{"df":1,"docs":{"87":{"tf":1.0}}},"9":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}},"2":{"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"61":{"tf":1.0}}},"8":{"df":1,"docs":{"162":{"tf":1.0}}},"9":{"df":1,"docs":{"159":{"tf":1.0}}},"df":1,"docs":{"414":{"tf":1.0}}},"5":{"df":4,"docs":{"156":{"tf":1.4142135623730951},"246":{"tf":1.0},"368":{"tf":1.0},"49":{"tf":1.0}}},"6":{"df":1,"docs":{"156":{"tf":1.0}}},"8":{"df":1,"docs":{"61":{"tf":1.0}}},"9":{"df":1,"docs":{"427":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{":":{"1":{"4":{"df":1,"docs":{"74":{"tf":1.0}}},"5":{"df":1,"docs":{"70":{"tf":1.0}}},"6":{"df":1,"docs":{"75":{"tf":1.0}}},"7":{"df":2,"docs":{"102":{"tf":1.0},"172":{"tf":1.0}}},"df":0,"docs":{}},"2":{"2":{"df":1,"docs":{"360":{"tf":1.0}}},"6":{"df":1,"docs":{"335":{"tf":1.0}}},"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"1":{"3":{"df":1,"docs":{"185":{"tf":1.0}}},"4":{"df":1,"docs":{"74":{"tf":1.0}}},"8":{"df":1,"docs":{"299":{"tf":1.0}}},"df":1,"docs":{"316":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"368":{"tf":1.0}}},"2":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"188":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":2,"docs":{"134":{"tf":1.0},"277":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"2":{"4":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}},"3":{"8":{"df":1,"docs":{"173":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"2":{"3":{"df":1,"docs":{"157":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":2,"docs":{"73":{"tf":1.0},"75":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"3":{"3":{"df":1,"docs":{"186":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":9,"docs":{"111":{"tf":1.0},"113":{"tf":1.0},"127":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":2.0},"26":{"tf":2.23606797749979},"265":{"tf":1.0},"266":{"tf":1.4142135623730951},"400":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"433":{"tf":1.0}}}},"l":{"df":2,"docs":{"434":{"tf":2.23606797749979},"436":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"154":{"tf":1.0},"156":{"tf":1.0},"293":{"tf":1.0},"54":{"tf":1.0},"66":{"tf":1.4142135623730951}},")":{"df":0,"docs":{},"与":{"df":0,"docs":{},"堆":{"df":0,"docs":{},"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"66":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"233":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{},"t":{".":{".":{"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"321":{"tf":1.7320508075688772},"322":{"tf":3.7416573867739413}},"e":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"78":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"321":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"104":{"tf":2.23606797749979},"108":{"tf":1.4142135623730951},"296":{"tf":1.0},"306":{"tf":2.8284271247461903},"337":{"tf":1.0},"338":{"tf":3.605551275463989},"339":{"tf":2.449489742783178},"340":{"tf":2.23606797749979},"341":{"tf":4.358898943540674},"342":{"tf":8.0},"343":{"tf":2.449489742783178}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":21,"docs":{"193":{"tf":3.0},"224":{"tf":2.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"299":{"tf":1.0},"336":{"tf":1.0},"369":{"tf":2.23606797749979},"381":{"tf":2.23606797749979},"405":{"tf":4.358898943540674},"407":{"tf":2.8284271247461903},"408":{"tf":2.449489742783178},"412":{"tf":1.0},"417":{"tf":1.4142135623730951},"52":{"tf":1.0},"75":{"tf":1.7320508075688772}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"434":{"tf":1.0}}}}},"u":{"df":2,"docs":{"385":{"tf":1.0},"399":{"tf":1.4142135623730951}},"s":{":":{":":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"385":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"r":{"\\":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"401":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"y":{"df":1,"docs":{"240":{"tf":1.0}}}},"d":{":":{":":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"125":{"tf":1.0},"167":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{">":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"172":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":6,"docs":{"121":{"tf":1.0},"124":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":3,"docs":{"215":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"249":{"tf":1.0}},"s":{"(":{")":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"215":{"tf":1.7320508075688772},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"232":{"tf":1.4142135623730951},"235":{"tf":1.0},"249":{"tf":2.23606797749979},"250":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"162":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"f":{"6":{"4":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"161":{"tf":1.0},"218":{"tf":1.4142135623730951},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":4,"docs":{"183":{"tf":1.0},"194":{"tf":1.0},"377":{"tf":2.0},"91":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"121":{"tf":1.0},"122":{"tf":1.0},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"381":{"tf":1.7320508075688772}}}},"s":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":7,"docs":{"157":{"tf":1.7320508075688772},"158":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"174":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"316":{"tf":1.0},"320":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"398":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"157":{"tf":1.0},"162":{"tf":1.4142135623730951},"174":{"tf":1.0},"381":{"tf":2.23606797749979},"398":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"。":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.0}}}}}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"218":{"tf":1.0}}}}},"t":{">":{"df":0,"docs":{},";":{"df":0,"docs":{},"也":{"df":0,"docs":{},"就":{"df":0,"docs":{},"是":{"df":0,"docs":{},"说":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.4142135623730951}}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.7320508075688772}}}}}},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"125":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"121":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":2.23606797749979},"161":{"tf":1.0},"167":{"tf":1.0},"33":{"tf":2.23606797749979},"34":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.0},"37":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{":":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"319":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"165":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"397":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"397":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"375":{"tf":1.0}},"s":{":":{":":{"a":{"d":{"d":{"df":1,"docs":{"375":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"。":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"224":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"224":{"tf":1.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"r":{"c":{":":{":":{"df":0,"docs":{},"r":{"c":{"df":6,"docs":{"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"306":{"tf":1.0}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"294":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"n":{"c":{":":{":":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"349":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"300":{"tf":1.7320508075688772},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"306":{"tf":1.7320508075688772}}}}}}},"{":{"a":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"349":{"tf":1.0}}}}}},"df":1,"docs":{"318":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"240":{"tf":1.0},"241":{"tf":1.0},"298":{"tf":1.7320508075688772},"299":{"tf":1.7320508075688772},"300":{"tf":1.4142135623730951},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":1.7320508075688772},"405":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{":":{":":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":9,"docs":{"240":{"tf":1.0},"298":{"tf":1.7320508075688772},"302":{"tf":1.0},"303":{"tf":1.0},"318":{"tf":1.7320508075688772},"319":{"tf":2.0},"320":{"tf":1.7320508075688772},"321":{"tf":1.0},"323":{"tf":1.0}}}}},"df":0,"docs":{},"{":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"{":{"c":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"125":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"320":{"tf":1.0},"323":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"322":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":13,"docs":{"124":{"tf":1.7320508075688772},"125":{"tf":1.0},"320":{"tf":1.4142135623730951},"33":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.6457513110645907},"407":{"tf":2.0},"408":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":2,"docs":{"233":{"tf":1.0},"91":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"233":{"tf":1.0}}},"df":0,"docs":{}}},"df":10,"docs":{"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"228":{"tf":1.0},"233":{"tf":1.0},"290":{"tf":1.0},"91":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"0":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"185":{"tf":1.0},"188":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"385":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"1":{"df":1,"docs":{"239":{"tf":1.0}}},"2":{"df":1,"docs":{"239":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"239":{"tf":1.4142135623730951},"405":{"tf":1.0}}}}},"r":{"df":43,"docs":{"119":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"145":{"tf":1.4142135623730951},"162":{"tf":1.0},"186":{"tf":3.0},"188":{"tf":3.0},"189":{"tf":2.449489742783178},"190":{"tf":1.0},"191":{"tf":4.0},"192":{"tf":2.449489742783178},"193":{"tf":1.0},"194":{"tf":1.7320508075688772},"201":{"tf":1.7320508075688772},"221":{"tf":1.4142135623730951},"224":{"tf":2.0},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":3.1622776601683795},"229":{"tf":4.0},"231":{"tf":2.0},"232":{"tf":5.291502622129181},"249":{"tf":4.58257569495584},"250":{"tf":3.3166247903554},"281":{"tf":2.449489742783178},"289":{"tf":2.6457513110645907},"290":{"tf":1.4142135623730951},"316":{"tf":3.0},"320":{"tf":1.0},"322":{"tf":2.0},"339":{"tf":1.4142135623730951},"340":{"tf":1.4142135623730951},"341":{"tf":1.4142135623730951},"342":{"tf":2.8284271247461903},"343":{"tf":2.0},"369":{"tf":1.0},"383":{"tf":3.872983346207417},"414":{"tf":2.449489742783178},"51":{"tf":1.0},"61":{"tf":1.0},"78":{"tf":3.3166247903554},"87":{"tf":3.0}},"e":{"a":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":9,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{")":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":7,"docs":{"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.7320508075688772},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"325":{"tf":1.4142135623730951}}}}}}},"df":12,"docs":{"323":{"tf":1.4142135623730951},"324":{"tf":3.7416573867739413},"325":{"tf":1.7320508075688772},"397":{"tf":2.23606797749979},"398":{"tf":2.23606797749979},"399":{"tf":2.0},"400":{"tf":1.7320508075688772},"401":{"tf":2.449489742783178},"402":{"tf":1.7320508075688772},"404":{"tf":1.7320508075688772},"405":{"tf":3.0},"408":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"324":{"tf":2.0},"325":{"tf":1.0}}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"324":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"1":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"194":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":2.8284271247461903},"189":{"tf":1.4142135623730951},"194":{"tf":1.0}}},"2":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"188":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"186":{"tf":2.0},"188":{"tf":3.4641016151377544},"189":{"tf":2.0},"194":{"tf":1.4142135623730951}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"180":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{":":{"1":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"c":{"d":{"df":4,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":1.0},"189":{"tf":1.4142135623730951},"194":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"148":{"tf":1.0},"149":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"242":{"tf":1.4142135623730951}}}}}}}},"d":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"r":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"149":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"r":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":4,"docs":{"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":2.6457513110645907}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"319":{"tf":2.0},"320":{"tf":2.449489742783178}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":14,"docs":{"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.7320508075688772},"191":{"tf":1.0},"201":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"70":{"tf":2.23606797749979},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":2.0},"74":{"tf":2.23606797749979},"75":{"tf":1.7320508075688772},"77":{"tf":1.0},"78":{"tf":2.6457513110645907}}}}}},"i":{"df":6,"docs":{"300":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907}}},"o":{"df":0,"docs":{},"l":{"a":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"179":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"140":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"141":{"tf":1.0}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"188":{"tf":1.4142135623730951}}}}}},"m":{"a":{"df":0,"docs":{},"y":{"b":{"df":1,"docs":{"335":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}},"i":{"df":1,"docs":{"283":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}}},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"335":{"tf":1.0}}}},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"335":{"tf":1.0}}},"l":{"df":2,"docs":{"140":{"tf":1.0},"142":{"tf":1.4142135623730951}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"283":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"180":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}}}},"r":{"df":1,"docs":{"189":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"247":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"82":{"tf":1.7320508075688772},"83":{"tf":1.0},"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"1":{"2":{"3":{"df":3,"docs":{"82":{"tf":1.7320508075688772},"83":{"tf":1.0},"84":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}}},"t":{"a":{"c":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"141":{"tf":1.4142135623730951}},"h":{"df":4,"docs":{"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":2.449489742783178}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"302":{"tf":1.0},"303":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"141":{"tf":1.0},"378":{"tf":1.0}}},"df":0,"docs":{}}}}},"x":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":1,"docs":{"188":{"tf":1.7320508075688772}}}}},"y":{"df":4,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178},"335":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"72":{"tf":1.0}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":7,"docs":{"140":{"tf":3.0},"142":{"tf":3.7416573867739413},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"182":{"tf":2.0},"70":{"tf":1.0},"96":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":25,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"140":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"167":{"tf":1.0},"223":{"tf":1.0},"33":{"tf":2.0},"338":{"tf":1.0},"339":{"tf":1.0},"34":{"tf":1.7320508075688772},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"382":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"`":{"df":1,"docs":{"191":{"tf":1.0}}},"df":89,"docs":{"101":{"tf":2.23606797749979},"119":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"137":{"tf":1.0},"138":{"tf":2.0},"139":{"tf":2.23606797749979},"140":{"tf":2.8284271247461903},"141":{"tf":4.242640687119285},"142":{"tf":2.8284271247461903},"144":{"tf":1.0},"145":{"tf":2.449489742783178},"147":{"tf":1.0},"149":{"tf":1.0},"160":{"tf":1.7320508075688772},"161":{"tf":1.4142135623730951},"169":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":3.0},"180":{"tf":4.242640687119285},"181":{"tf":3.1622776601683795},"182":{"tf":4.242640687119285},"183":{"tf":1.0},"186":{"tf":1.7320508075688772},"188":{"tf":3.0},"189":{"tf":1.7320508075688772},"190":{"tf":1.0},"191":{"tf":1.7320508075688772},"194":{"tf":1.0},"196":{"tf":1.0},"201":{"tf":1.7320508075688772},"202":{"tf":1.0},"203":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"221":{"tf":1.0},"222":{"tf":2.449489742783178},"223":{"tf":2.0},"224":{"tf":3.0},"225":{"tf":3.0},"226":{"tf":1.7320508075688772},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.7416573867739413},"240":{"tf":2.449489742783178},"242":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":4.123105625617661},"250":{"tf":2.6457513110645907},"252":{"tf":1.0},"270":{"tf":1.4142135623730951},"281":{"tf":2.6457513110645907},"283":{"tf":1.7320508075688772},"289":{"tf":1.0},"301":{"tf":1.0},"316":{"tf":1.0},"325":{"tf":1.4142135623730951},"335":{"tf":2.449489742783178},"338":{"tf":1.4142135623730951},"339":{"tf":1.4142135623730951},"34":{"tf":2.23606797749979},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":2.23606797749979},"360":{"tf":1.4142135623730951},"376":{"tf":3.1622776601683795},"377":{"tf":1.4142135623730951},"380":{"tf":1.0},"391":{"tf":1.0},"398":{"tf":1.0},"42":{"tf":2.23606797749979},"45":{"tf":1.0},"52":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":2.6457513110645907},"70":{"tf":3.7416573867739413},"71":{"tf":1.0},"72":{"tf":2.23606797749979},"73":{"tf":3.605551275463989},"74":{"tf":1.0},"75":{"tf":3.0},"77":{"tf":3.605551275463989},"78":{"tf":4.898979485566356},"82":{"tf":3.1622776601683795},"83":{"tf":2.0},"84":{"tf":2.449489742783178},"87":{"tf":1.4142135623730951},"91":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"391":{"tf":1.7320508075688772}}},"y":{"!":{"(":{"#":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"142":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"m":{"d":{"df":1,"docs":{"138":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"df":0,"docs":{},"这":{"df":0,"docs":{},"就":{"df":0,"docs":{},"非":{"df":0,"docs":{},"常":{"df":0,"docs":{},"清":{"df":0,"docs":{},"楚":{"df":0,"docs":{},"地":{"df":0,"docs":{},"表":{"df":0,"docs":{},"明":{"df":0,"docs":{},",":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"74":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},",":{"df":0,"docs":{},"这":{"df":0,"docs":{},"可":{"df":0,"docs":{},"不":{"df":0,"docs":{},"对":{"df":0,"docs":{},"!":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"75":{"tf":1.0}}}}}}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"286":{"tf":1.0},"294":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":2.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"252":{"tf":1.0}}}}}}}}},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"391":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"416":{"tf":1.0}}}}}},"df":77,"docs":{"101":{"tf":3.0},"113":{"tf":1.0},"119":{"tf":1.0},"167":{"tf":1.0},"173":{"tf":1.7320508075688772},"175":{"tf":1.7320508075688772},"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.4142135623730951},"182":{"tf":2.0},"183":{"tf":1.0},"190":{"tf":1.0},"192":{"tf":1.4142135623730951},"199":{"tf":2.0},"202":{"tf":2.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"239":{"tf":1.0},"242":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.7320508075688772},"289":{"tf":2.23606797749979},"290":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"324":{"tf":1.0},"331":{"tf":1.4142135623730951},"334":{"tf":1.7320508075688772},"335":{"tf":2.0},"338":{"tf":1.4142135623730951},"339":{"tf":1.4142135623730951},"340":{"tf":1.4142135623730951},"341":{"tf":1.7320508075688772},"342":{"tf":3.4641016151377544},"343":{"tf":2.449489742783178},"353":{"tf":1.0},"359":{"tf":2.0},"360":{"tf":1.0},"371":{"tf":1.0},"374":{"tf":1.0},"375":{"tf":1.7320508075688772},"376":{"tf":2.449489742783178},"377":{"tf":1.4142135623730951},"378":{"tf":1.0},"391":{"tf":2.23606797749979},"405":{"tf":4.898979485566356},"407":{"tf":3.0},"408":{"tf":2.449489742783178},"412":{"tf":1.0},"417":{"tf":1.7320508075688772},"80":{"tf":1.0},"81":{"tf":1.4142135623730951},"82":{"tf":2.23606797749979},"83":{"tf":1.0},"84":{"tf":1.7320508075688772},"85":{"tf":2.0},"86":{"tf":1.7320508075688772},"87":{"tf":2.23606797749979},"90":{"tf":1.0},"91":{"tf":1.7320508075688772},"93":{"tf":1.4142135623730951},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":3,"docs":{"81":{"tf":1.0},"82":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"81":{"tf":1.0}}}},",":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"137":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"。":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":0,"docs":{},"当":{"a":{"d":{"d":{"df":0,"docs":{},"函":{"df":0,"docs":{},"数":{"df":0,"docs":{},"被":{"df":0,"docs":{},"调":{"df":0,"docs":{},"用":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},",":{"df":0,"docs":{},"它":{"df":0,"docs":{},"通":{"df":0,"docs":{},"常":{"df":0,"docs":{},"以":{"df":0,"docs":{},"被":{"df":0,"docs":{},"借":{"df":0,"docs":{},"用":{"df":0,"docs":{},"的":{"df":0,"docs":{},"形":{"df":0,"docs":{},"式":{"df":0,"docs":{},"出":{"df":0,"docs":{},"现":{"df":0,"docs":{},",":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"429":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":2,"docs":{"137":{"tf":1.0},"283":{"tf":2.0}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"289":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"247":{"tf":2.449489742783178}}}}}},"u":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"416":{"tf":1.0}}}}}}}},"df":2,"docs":{"368":{"tf":1.0},"416":{"tf":1.0}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"86":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"202":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"h":{"df":2,"docs":{"157":{"tf":1.0},"159":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{":":{":":{"<":{"df":0,"docs":{},"i":{"6":{"4":{"df":1,"docs":{"252":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"102":{"tf":1.4142135623730951},"245":{"tf":2.23606797749979},"53":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"178":{"tf":1.7320508075688772},"179":{"tf":1.4142135623730951},"180":{"tf":3.0},"181":{"tf":2.0},"332":{"tf":1.7320508075688772}},"i":{"df":6,"docs":{"178":{"tf":2.0},"179":{"tf":3.1622776601683795},"180":{"tf":3.872983346207417},"181":{"tf":3.7416573867739413},"182":{"tf":3.3166247903554},"332":{"tf":1.7320508075688772}},"z":{"df":0,"docs":{},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":5,"docs":{"178":{"tf":1.4142135623730951},"179":{"tf":1.7320508075688772},"180":{"tf":2.0},"181":{"tf":1.7320508075688772},"182":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"180":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"180":{"tf":2.23606797749979}},",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{">":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"1":{"df":1,"docs":{"181":{"tf":1.0}}},"df":1,"docs":{"181":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"119":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"*":{";":{"df":0,"docs":{},"。":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"118":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"417":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":22,"docs":{"118":{"tf":2.6457513110645907},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.7320508075688772},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.4142135623730951},"266":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"412":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"366":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"377":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.0}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"a":{"df":1,"docs":{"431":{"tf":1.0}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"182":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"120":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"391":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"c":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"c":{"df":3,"docs":{"405":{"tf":2.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":8,"docs":{"296":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":2.23606797749979},"309":{"tf":1.0},"310":{"tf":3.4641016151377544},"311":{"tf":2.6457513110645907},"312":{"tf":1.0},"370":{"tf":2.23606797749979}}},"df":1,"docs":{"391":{"tf":2.8284271247461903}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"381":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"d":{"df":5,"docs":{"171":{"tf":1.0},"184":{"tf":1.0},"315":{"tf":1.0},"354":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}}},"df":6,"docs":{"191":{"tf":1.0},"376":{"tf":1.0},"391":{"tf":1.4142135623730951},"69":{"tf":1.0},"84":{"tf":1.0},"93":{"tf":1.0}},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"超":{"df":0,"docs":{},"(":{"df":0,"docs":{},"父":{"df":0,"docs":{},")":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"364":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"102":{"tf":1.4142135623730951},"110":{"tf":1.0}},",":{"df":0,"docs":{},"v":{"c":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"t":{">":{"(":{"df":0,"docs":{},"f":{"df":1,"docs":{"405":{"tf":1.4142135623730951}}}},":":{":":{".":{".":{".":{"df":0,"docs":{},",":{"<":{"[":{"df":0,"docs":{},"t":{"df":1,"docs":{"417":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"]":{">":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"156":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":1,"docs":{"23":{"tf":1.0}},"l":{"df":1,"docs":{"151":{"tf":1.0}}}},"c":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"431":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"293":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"293":{"tf":1.7320508075688772},"58":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":5,"docs":{"299":{"tf":1.4142135623730951},"341":{"tf":1.0},"405":{"tf":1.0},"407":{"tf":2.0},"408":{"tf":1.4142135623730951}},"s":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"(":{"a":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"72":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"2":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"72":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"f":{"df":1,"docs":{"381":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"(":{"df":1,"docs":{"71":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"71":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"71":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"df":4,"docs":{"231":{"tf":1.4142135623730951},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"df":59,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.4142135623730951},"261":{"tf":1.0},"266":{"tf":2.23606797749979},"267":{"tf":1.0},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}},"/":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"/":{"a":{"d":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"61":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":3,"docs":{"286":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"/":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.4142135623730951}}}}},"df":6,"docs":{"198":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"211":{"tf":1.0}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"201":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"202":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"211":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":3,"docs":{"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"206":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"157":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":6,"docs":{"32":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"405":{"tf":1.0},"408":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"246":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":1.7320508075688772}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"216":{"tf":2.23606797749979},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"229":{"tf":1.7320508075688772},"232":{"tf":1.0}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"350":{"tf":1.0},"353":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":3,"docs":{"242":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"239":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"376":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"49":{"tf":1.0},"51":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"27":{"tf":1.0},"28":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"c":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"28":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"\\":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"\\":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"_":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"265":{"tf":2.449489742783178},"266":{"tf":1.0},"280":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951}}}}}},"s":{"df":0,"docs":{},"k":{"df":2,"docs":{"315":{"tf":1.0},"318":{"tf":6.4031242374328485}}}}},"c":{"df":0,"docs":{},"p":{"df":4,"docs":{"395":{"tf":1.4142135623730951},"396":{"tf":2.23606797749979},"397":{"tf":2.449489742783178},"398":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"397":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"\"":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{":":{"7":{"8":{"7":{"8":{"\"":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":9,"docs":{"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.0},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":9,"docs":{"397":{"tf":1.4142135623730951},"398":{"tf":1.7320508075688772},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":2.0},"402":{"tf":1.4142135623730951},"404":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"408":{"tf":2.0}}}},"df":0,"docs":{}}}}}}},"d":{"d":{"df":3,"docs":{"227":{"tf":1.4142135623730951},"228":{"tf":1.0},"231":{"tf":1.0}}},"df":0,"docs":{}},"df":30,"docs":{"102":{"tf":2.8284271247461903},"105":{"tf":1.0},"157":{"tf":1.7320508075688772},"160":{"tf":1.0},"172":{"tf":4.0},"173":{"tf":3.3166247903554},"174":{"tf":2.449489742783178},"175":{"tf":3.4641016151377544},"181":{"tf":2.8284271247461903},"183":{"tf":2.449489742783178},"194":{"tf":2.23606797749979},"232":{"tf":1.0},"239":{"tf":2.0},"242":{"tf":2.449489742783178},"279":{"tf":2.0},"280":{"tf":1.7320508075688772},"281":{"tf":2.449489742783178},"282":{"tf":2.8284271247461903},"289":{"tf":4.58257569495584},"290":{"tf":2.6457513110645907},"310":{"tf":1.4142135623730951},"334":{"tf":1.0},"367":{"tf":1.0},"368":{"tf":1.0},"382":{"tf":1.7320508075688772},"383":{"tf":3.0},"405":{"tf":2.6457513110645907},"417":{"tf":2.6457513110645907},"424":{"tf":1.0},"53":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"148":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"218":{"tf":2.0},"225":{"tf":1.4142135623730951},"232":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"$":{"df":0,"docs":{},"x":{"df":1,"docs":{"389":{"tf":1.0}}}},"1":{"df":1,"docs":{"389":{"tf":1.0}}},"2":{"df":1,"docs":{"389":{"tf":1.0}}},"3":{"df":1,"docs":{"389":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"389":{"tf":2.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"162":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":42,"docs":{"126":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":6.708203932499369},"199":{"tf":5.830951894845301},"200":{"tf":4.358898943540674},"201":{"tf":4.242640687119285},"202":{"tf":5.477225575051661},"203":{"tf":1.7320508075688772},"204":{"tf":2.6457513110645907},"205":{"tf":2.0},"206":{"tf":4.358898943540674},"207":{"tf":5.385164807134504},"208":{"tf":5.0990195135927845},"209":{"tf":1.7320508075688772},"210":{"tf":3.3166247903554},"211":{"tf":7.483314773547883},"217":{"tf":2.0},"227":{"tf":1.4142135623730951},"228":{"tf":3.3166247903554},"229":{"tf":4.242640687119285},"231":{"tf":1.7320508075688772},"232":{"tf":4.795831523312719},"244":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"249":{"tf":3.0},"250":{"tf":2.23606797749979},"252":{"tf":1.4142135623730951},"257":{"tf":2.6457513110645907},"266":{"tf":4.898979485566356},"289":{"tf":2.6457513110645907},"290":{"tf":2.8284271247461903},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"197":{"tf":1.0},"204":{"tf":1.0}}},"df":0,"docs":{}}},"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":2.23606797749979}}}},"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"211":{"tf":3.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},":":{":":{"a":{"d":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"o":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"207":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"198":{"tf":2.23606797749979}}}}}}},"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"208":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"198":{"tf":1.4142135623730951}}}}}}}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"_":{"1":{"0":{"0":{"df":1,"docs":{"202":{"tf":2.8284271247461903}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"201":{"tf":2.8284271247461903}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}}},"t":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"200":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"7":{"5":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"198":{"tf":1.0},"208":{"tf":1.0},"266":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"199":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"207":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"228":{"tf":2.0},"229":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"199":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"206":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"206":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"136":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{"?":{".":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}}},":":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":11,"docs":{"150":{"tf":1.4142135623730951},"162":{"tf":2.23606797749979},"218":{"tf":1.0},"225":{"tf":1.0},"316":{"tf":2.23606797749979},"339":{"tf":1.4142135623730951},"340":{"tf":1.0},"341":{"tf":1.0},"342":{"tf":1.7320508075688772},"343":{"tf":1.4142135623730951},"359":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"334":{"tf":1.0},"335":{"tf":1.4142135623730951}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"此":{"df":0,"docs":{},"之":{"df":0,"docs":{},"上":{"df":0,"docs":{},",":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"333":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"'":{"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}},"df":0,"docs":{}}},"y":{"'":{"d":{"df":2,"docs":{"218":{"tf":1.4142135623730951},"225":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"134":{"tf":2.8284271247461903},"360":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"206":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"206":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"407":{"tf":1.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"405":{"tf":3.1622776601683795},"407":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"1":{"df":1,"docs":{"298":{"tf":2.449489742783178}}},"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":2.0}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"(":{"1":{"df":2,"docs":{"302":{"tf":1.0},"303":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"240":{"tf":1.0}}},"5":{"df":3,"docs":{"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"298":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"318":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":10,"docs":{"241":{"tf":1.0},"299":{"tf":2.0},"300":{"tf":1.4142135623730951},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.4142135623730951},"306":{"tf":2.6457513110645907},"405":{"tf":1.4142135623730951},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}},"df":6,"docs":{"298":{"tf":2.449489742783178},"299":{"tf":2.8284271247461903},"300":{"tf":1.0},"316":{"tf":1.0},"318":{"tf":1.0},"405":{"tf":4.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":29,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"157":{"tf":1.0},"159":{"tf":1.4142135623730951},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"228":{"tf":1.0},"241":{"tf":1.0},"290":{"tf":1.0},"297":{"tf":1.0},"298":{"tf":6.4031242374328485},"299":{"tf":2.449489742783178},"302":{"tf":1.0},"303":{"tf":1.0},"306":{"tf":1.7320508075688772},"404":{"tf":1.0},"405":{"tf":7.0},"406":{"tf":1.0},"407":{"tf":5.0990195135927845},"408":{"tf":4.123105625617661},"43":{"tf":1.0},"54":{"tf":1.0}},"e":{"d":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"396":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"4":{"df":2,"docs":{"405":{"tf":2.0},"408":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"405":{"tf":2.6457513110645907}}}}}},"df":0,"docs":{}},"df":4,"docs":{"405":{"tf":9.797958971132712},"406":{"tf":1.4142135623730951},"407":{"tf":5.0990195135927845},"408":{"tf":5.385164807134504}}}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"297":{"tf":1.0}}},"df":0,"docs":{}}},"=":{"1":{"df":1,"docs":{"205":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"50":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":7,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.4142135623730951},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772},"61":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"120":{"tf":1.0},"358":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"381":{"tf":2.8284271247461903}}}}}},"i":{"c":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"f":{"3":{"2":{"df":1,"docs":{"322":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"320":{"tf":1.7320508075688772},"322":{"tf":2.0},"323":{"tf":1.4142135623730951},"404":{"tf":1.0},"405":{"tf":1.7320508075688772},"408":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":6,"docs":{"102":{"tf":1.0},"24":{"tf":1.0},"322":{"tf":1.4142135623730951},"368":{"tf":1.0},"386":{"tf":1.0},"74":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"323":{"tf":1.7320508075688772}}}}}}},"<":{"df":0,"docs":{},"f":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}},"df":1,"docs":{"323":{"tf":2.6457513110645907}}}}},"r":{"df":1,"docs":{"323":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"316":{"tf":4.123105625617661}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}},">":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"!":{"<":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":2,"docs":{"400":{"tf":1.0},"401":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"1":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"2":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"1":{".":{"2":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"232":{"tf":2.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":5,"docs":{"140":{"tf":2.0},"183":{"tf":1.0},"240":{"tf":1.0},"377":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"422":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":2.449489742783178}}}}},"d":{"a":{"df":0,"docs":{},"y":{"df":6,"docs":{"162":{"tf":1.0},"194":{"tf":1.0},"240":{"tf":1.4142135623730951},"337":{"tf":1.4142135623730951},"343":{"tf":2.0},"59":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"o":{"df":3,"docs":{"106":{"tf":1.0},"316":{"tf":1.4142135623730951},"353":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"141":{"tf":1.0}},"”":{"df":0,"docs":{},"。":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"259":{"tf":2.449489742783178},"261":{"tf":1.0},"387":{"tf":1.0},"390":{"tf":1.0},"393":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"390":{"tf":2.449489742783178},"391":{"tf":3.7416573867739413},"392":{"tf":2.0},"393":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}},"m":{"'":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"26":{"tf":1.0}}}},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"436":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"425":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"183":{"tf":1.7320508075688772},"385":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"245":{"tf":1.0},"331":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"289":{"tf":1.7320508075688772},"290":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"434":{"tf":2.23606797749979}}},"t":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},">":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"376":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"(":{"df":0,"docs":{},"r":{"c":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"383":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":129,"docs":{"10":{"tf":1.4142135623730951},"102":{"tf":1.4142135623730951},"124":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"142":{"tf":1.7320508075688772},"149":{"tf":1.0},"151":{"tf":1.4142135623730951},"161":{"tf":1.0},"162":{"tf":2.449489742783178},"169":{"tf":2.23606797749979},"170":{"tf":1.0},"171":{"tf":1.0},"172":{"tf":2.23606797749979},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":2.8284271247461903},"178":{"tf":3.872983346207417},"179":{"tf":4.898979485566356},"180":{"tf":4.0},"181":{"tf":5.5677643628300215},"182":{"tf":3.605551275463989},"183":{"tf":4.47213595499958},"184":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":2.449489742783178},"195":{"tf":2.449489742783178},"200":{"tf":2.449489742783178},"213":{"tf":1.4142135623730951},"225":{"tf":1.7320508075688772},"242":{"tf":3.872983346207417},"244":{"tf":2.6457513110645907},"245":{"tf":1.7320508075688772},"246":{"tf":1.4142135623730951},"249":{"tf":2.6457513110645907},"270":{"tf":1.7320508075688772},"271":{"tf":2.0},"275":{"tf":2.0},"276":{"tf":2.449489742783178},"277":{"tf":1.4142135623730951},"278":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":3.1622776601683795},"281":{"tf":2.0},"282":{"tf":2.0},"283":{"tf":4.0},"285":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":3.1622776601683795},"290":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"301":{"tf":1.0},"306":{"tf":2.0},"307":{"tf":1.0},"308":{"tf":2.0},"309":{"tf":2.0},"310":{"tf":1.4142135623730951},"311":{"tf":1.7320508075688772},"312":{"tf":1.0},"315":{"tf":2.23606797749979},"316":{"tf":2.23606797749979},"320":{"tf":3.7416573867739413},"324":{"tf":3.3166247903554},"326":{"tf":1.7320508075688772},"332":{"tf":2.6457513110645907},"333":{"tf":2.0},"334":{"tf":6.0},"335":{"tf":4.795831523312719},"336":{"tf":2.6457513110645907},"337":{"tf":1.0},"338":{"tf":2.449489742783178},"339":{"tf":1.0},"340":{"tf":1.0},"341":{"tf":2.0},"342":{"tf":3.1622776601683795},"343":{"tf":2.23606797749979},"344":{"tf":1.0},"360":{"tf":1.0},"364":{"tf":1.4142135623730951},"366":{"tf":1.0},"370":{"tf":3.4641016151377544},"373":{"tf":2.0},"374":{"tf":5.0},"375":{"tf":4.123105625617661},"376":{"tf":6.4031242374328485},"377":{"tf":6.082762530298219},"378":{"tf":3.4641016151377544},"379":{"tf":1.0},"381":{"tf":2.23606797749979},"383":{"tf":3.7416573867739413},"385":{"tf":2.8284271247461903},"386":{"tf":3.0},"388":{"tf":1.7320508075688772},"391":{"tf":4.123105625617661},"398":{"tf":1.7320508075688772},"405":{"tf":2.6457513110645907},"406":{"tf":1.0},"407":{"tf":1.7320508075688772},"408":{"tf":1.0},"41":{"tf":2.0},"412":{"tf":2.8284271247461903},"416":{"tf":2.0},"417":{"tf":2.6457513110645907},"418":{"tf":4.242640687119285},"419":{"tf":2.0},"420":{"tf":2.23606797749979},"421":{"tf":2.449489742783178},"422":{"tf":2.449489742783178},"423":{"tf":1.4142135623730951},"424":{"tf":1.7320508075688772},"70":{"tf":3.0},"84":{"tf":1.0},"86":{"tf":1.4142135623730951},"91":{"tf":3.0},"92":{"tf":1.0},"97":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":3,"docs":{"177":{"tf":1.0},"373":{"tf":1.0},"418":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"376":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"270":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"此":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"391":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"!":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"386":{"tf":1.0}}}}}}},"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"、":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"385":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"306":{"tf":1.0}}}}},",":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"179":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"281":{"tf":1.4142135623730951},"376":{"tf":1.0},"91":{"tf":1.0}}}}}}},":":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"181":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"、":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"405":{"tf":1.0}}}}}}}}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"396":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"431":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"396":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"300":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"114":{"tf":1.0},"391":{"tf":1.4142135623730951}}}},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"100":{"tf":1.0}}}}}},"df":50,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.4142135623730951},"242":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"285":{"tf":1.0},"289":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.0},"407":{"tf":1.7320508075688772},"413":{"tf":1.0},"414":{"tf":1.4142135623730951},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"58":{"tf":1.0},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0}},"m":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"54":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"319":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"325":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"323":{"tf":1.0}},"。":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":2.23606797749979}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"!":{"(":{"a":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"1":{"df":1,"docs":{"318":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"3":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"319":{"tf":1.0}}},"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"320":{"tf":1.0}},"l":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"318":{"tf":2.449489742783178},"319":{"tf":2.449489742783178},"320":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"(":{"a":{"df":1,"docs":{"322":{"tf":1.7320508075688772}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"1":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":3,"docs":{"316":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"324":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"n":{"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":9,"docs":{"316":{"tf":1.4142135623730951},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":3,"docs":{"316":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951},"319":{"tf":1.7320508075688772}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"1":{"0":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"318":{"tf":2.449489742783178},"319":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"s":{"(":{"1":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{")":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":4,"docs":{"318":{"tf":1.0},"319":{"tf":1.0},"322":{"tf":2.8284271247461903},"323":{"tf":1.4142135623730951}}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"(":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"318":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"318":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{")":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"322":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"{":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":9,"docs":{"316":{"tf":3.7416573867739413},"318":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":2.6457513110645907},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":17,"docs":{"199":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"320":{"tf":1.0},"361":{"tf":1.0},"391":{"tf":1.0},"412":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"61":{"tf":2.8284271247461903},"62":{"tf":1.7320508075688772},"70":{"tf":1.0},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.4142135623730951}},",":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"199":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.7320508075688772},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951}}}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"300":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"54":{"tf":2.449489742783178}},"l":{"df":3,"docs":{"351":{"tf":1.7320508075688772},"360":{"tf":1.4142135623730951},"85":{"tf":1.0}},"e":{"df":0,"docs":{},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"数":{"df":0,"docs":{},"组":{"df":0,"docs":{},"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"417":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"179":{"tf":1.0},"180":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":5,"docs":{"178":{"tf":1.4142135623730951},"179":{"tf":3.605551275463989},"180":{"tf":3.605551275463989},"181":{"tf":2.0},"182":{"tf":3.0}}}},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"63":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"49":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"o":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"290":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"290":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":5,"docs":{"203":{"tf":1.0},"258":{"tf":1.4142135623730951},"320":{"tf":1.0},"357":{"tf":1.4142135623730951},"368":{"tf":1.0}},"’":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}}},"x":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"325":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":7,"docs":{"300":{"tf":1.4142135623730951},"301":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":2.23606797749979},"320":{"tf":2.449489742783178},"349":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"301":{"tf":1.0},"319":{"tf":1.0}}},"df":0,"docs":{}}}}},"1":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"319":{"tf":1.0},"320":{"tf":2.6457513110645907}}}}}},"df":3,"docs":{"303":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":2.449489742783178}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"319":{"tf":2.0},"320":{"tf":3.1622776601683795}}}}}},"df":8,"docs":{"300":{"tf":2.8284271247461903},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"319":{"tf":4.242640687119285},"320":{"tf":2.449489742783178},"325":{"tf":1.0},"349":{"tf":1.0}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"417":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"417":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":51,"docs":{"102":{"tf":1.4142135623730951},"106":{"tf":1.0},"125":{"tf":1.0},"142":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.7320508075688772},"173":{"tf":1.0},"183":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.7320508075688772},"242":{"tf":1.0},"244":{"tf":1.7320508075688772},"273":{"tf":1.4142135623730951},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.4142135623730951},"324":{"tf":1.7320508075688772},"335":{"tf":1.0},"351":{"tf":1.4142135623730951},"353":{"tf":1.0},"374":{"tf":1.7320508075688772},"375":{"tf":2.0},"376":{"tf":1.4142135623730951},"381":{"tf":2.6457513110645907},"382":{"tf":2.449489742783178},"383":{"tf":1.0},"386":{"tf":1.4142135623730951},"405":{"tf":2.6457513110645907},"407":{"tf":2.6457513110645907},"408":{"tf":1.7320508075688772},"412":{"tf":1.4142135623730951},"416":{"tf":3.3166247903554},"417":{"tf":3.0},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":2.449489742783178},"53":{"tf":1.4142135623730951},"54":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"70":{"tf":1.0},"75":{"tf":1.4142135623730951}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"391":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"413":{"tf":1.0}}}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":2,"docs":{"379":{"tf":1.0},"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"i":{"c":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}}}},"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"310":{"tf":1.0}}}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"175":{"tf":1.0}}}}}},"x":{"df":1,"docs":{"175":{"tf":1.0}}},"因":{"df":0,"docs":{},"为":{"df":0,"docs":{},"传":{"df":0,"docs":{},"统":{"df":0,"docs":{},"上":{"df":0,"docs":{},"来":{"df":0,"docs":{},"说":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"172":{"tf":1.0}}}}}}}}}}}},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"希":{"df":0,"docs":{},"望":{"df":0,"docs":{},"其":{"df":0,"docs":{},"可":{"df":0,"docs":{},"以":{"df":0,"docs":{},"存":{"df":0,"docs":{},"放":{"df":0,"docs":{},"任":{"df":0,"docs":{},"何":{"df":0,"docs":{},"类":{"df":0,"docs":{},"型":{"df":0,"docs":{},"的":{"df":0,"docs":{},"值":{"df":0,"docs":{},"。":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}}}}}}}}}}}}}}}}},"u":{"+":{"0":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"7":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"53":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"2":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"3":{"2":{"df":30,"docs":{"125":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"199":{"tf":2.8284271247461903},"240":{"tf":2.8284271247461903},"242":{"tf":2.449489742783178},"247":{"tf":1.4142135623730951},"320":{"tf":1.0},"335":{"tf":2.449489742783178},"369":{"tf":1.4142135623730951},"374":{"tf":2.0},"380":{"tf":1.4142135623730951},"382":{"tf":2.0},"385":{"tf":1.0},"42":{"tf":2.8284271247461903},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"50":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"70":{"tf":1.0},"88":{"tf":2.449489742783178},"89":{"tf":1.7320508075688772},"90":{"tf":2.0},"91":{"tf":2.449489742783178},"93":{"tf":2.23606797749979},"95":{"tf":1.7320508075688772},"96":{"tf":1.7320508075688772},"97":{"tf":1.7320508075688772}},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},";":{"6":{"4":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"6":{"4":{"df":6,"docs":{"322":{"tf":2.0},"53":{"tf":1.0},"82":{"tf":2.0},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":10,"docs":{"101":{"tf":2.0},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"107":{"tf":1.4142135623730951},"142":{"tf":1.0},"381":{"tf":2.449489742783178},"399":{"tf":1.0},"417":{"tf":1.0},"53":{"tf":2.0},"54":{"tf":1.4142135623730951}}},">":{"(":{"df":0,"docs":{},"t":{"df":1,"docs":{"181":{"tf":1.0}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"df":6,"docs":{"173":{"tf":2.0},"181":{"tf":2.449489742783178},"232":{"tf":1.0},"282":{"tf":2.23606797749979},"417":{"tf":1.4142135623730951},"53":{"tf":1.0}},"i":{"df":1,"docs":{"313":{"tf":1.0}}},"n":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":1,"docs":{"386":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"293":{"tf":1.0}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"75":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"120":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"156":{"tf":1.0},"368":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"64":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":1,"docs":{"263":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"d":{"df":5,"docs":{"142":{"tf":1.7320508075688772},"144":{"tf":1.4142135623730951},"216":{"tf":2.0},"232":{"tf":1.4142135623730951},"53":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"398":{"tf":1.4142135623730951}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"181":{"tf":1.0},"258":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"366":{"tf":1.0},"371":{"tf":1.0},"412":{"tf":1.7320508075688772}}}},"t":{"_":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"56":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":5,"docs":{"209":{"tf":1.0},"225":{"tf":1.4142135623730951},"391":{"tf":1.0},"54":{"tf":1.0},"86":{"tf":1.7320508075688772}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":14,"docs":{"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"228":{"tf":1.0},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"266":{"tf":1.7320508075688772},"290":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"246":{"tf":1.0},"75":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"405":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"57":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":58,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"241":{"tf":1.4142135623730951},"242":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":1.0},"261":{"tf":1.0},"266":{"tf":2.23606797749979},"27":{"tf":2.0},"283":{"tf":1.4142135623730951},"286":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"32":{"tf":1.0},"350":{"tf":1.0},"353":{"tf":1.0},"36":{"tf":1.0},"376":{"tf":1.7320508075688772},"38":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"61":{"tf":2.0},"62":{"tf":1.7320508075688772},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}}}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":3.3166247903554}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"153":{"tf":1.0},"154":{"tf":1.0}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}},"s":{"a":{"df":0,"docs":{},"f":{"df":11,"docs":{"257":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"365":{"tf":1.4142135623730951},"366":{"tf":3.1622776601683795},"367":{"tf":2.0},"368":{"tf":5.291502622129181},"369":{"tf":1.7320508075688772},"370":{"tf":2.8284271247461903},"371":{"tf":1.0},"372":{"tf":2.0},"412":{"tf":1.0}},"e":{"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"370":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"383":{"tf":1.0},"413":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"435":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":6,"docs":{"120":{"tf":1.0},"225":{"tf":1.0},"246":{"tf":1.0},"266":{"tf":1.0},"36":{"tf":1.0},"427":{"tf":1.0}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"155":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"382":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":5,"docs":{"158":{"tf":1.4142135623730951},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"239":{"tf":2.6457513110645907},"242":{"tf":2.8284271247461903}},"e":{"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"242":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"<":{"df":0,"docs":{},"f":{">":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"242":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"148":{"tf":1.0}}}}},"df":20,"docs":{"159":{"tf":3.1622776601683795},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"224":{"tf":1.0},"225":{"tf":1.0},"241":{"tf":1.0},"300":{"tf":1.0},"306":{"tf":1.0},"318":{"tf":1.0},"342":{"tf":1.0},"349":{"tf":1.0},"382":{"tf":1.4142135623730951},"391":{"tf":1.4142135623730951},"397":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"401":{"tf":1.7320508075688772},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"408":{"tf":1.0}},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"263":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":8,"docs":{"18":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"263":{"tf":1.4142135623730951},"266":{"tf":1.0},"267":{"tf":1.0},"40":{"tf":2.449489742783178},"84":{"tf":1.0}},"e":{"_":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"331":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"331":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951},"330":{"tf":1.0},"376":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":2,"docs":{"294":{"tf":1.7320508075688772},"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":2,"docs":{"260":{"tf":1.0},"261":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"398":{"tf":2.6457513110645907}}},"l":{"df":2,"docs":{"316":{"tf":4.358898943540674},"398":{"tf":1.7320508075688772}}}},"s":{",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{";":{"df":0,"docs":{},"q":{"=":{"0":{".":{"5":{"df":1,"docs":{"398":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"a":{"df":2,"docs":{"180":{"tf":1.0},"182":{"tf":1.0}}},"df":141,"docs":{"102":{"tf":1.0},"110":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.7320508075688772},"119":{"tf":1.4142135623730951},"120":{"tf":4.58257569495584},"121":{"tf":4.0},"122":{"tf":2.23606797749979},"123":{"tf":3.4641016151377544},"124":{"tf":2.6457513110645907},"125":{"tf":4.242640687119285},"126":{"tf":1.7320508075688772},"127":{"tf":1.0},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.7320508075688772},"157":{"tf":1.4142135623730951},"158":{"tf":2.0},"159":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"161":{"tf":2.449489742783178},"162":{"tf":2.23606797749979},"165":{"tf":1.0},"167":{"tf":1.7320508075688772},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"183":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"194":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":2.0},"200":{"tf":1.4142135623730951},"201":{"tf":1.7320508075688772},"202":{"tf":2.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"208":{"tf":1.0},"210":{"tf":1.7320508075688772},"211":{"tf":1.7320508075688772},"215":{"tf":1.7320508075688772},"217":{"tf":1.0},"218":{"tf":1.7320508075688772},"221":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"224":{"tf":2.8284271247461903},"225":{"tf":3.7416573867739413},"226":{"tf":2.6457513110645907},"228":{"tf":2.449489742783178},"229":{"tf":3.4641016151377544},"231":{"tf":1.7320508075688772},"232":{"tf":3.605551275463989},"235":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"246":{"tf":1.4142135623730951},"247":{"tf":1.0},"249":{"tf":4.242640687119285},"250":{"tf":2.6457513110645907},"252":{"tf":1.4142135623730951},"258":{"tf":4.69041575982343},"266":{"tf":2.6457513110645907},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"285":{"tf":2.449489742783178},"286":{"tf":1.4142135623730951},"289":{"tf":3.0},"290":{"tf":2.0},"291":{"tf":1.7320508075688772},"293":{"tf":2.449489742783178},"294":{"tf":3.1622776601683795},"298":{"tf":2.449489742783178},"299":{"tf":2.8284271247461903},"300":{"tf":2.23606797749979},"301":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"303":{"tf":1.7320508075688772},"306":{"tf":3.1622776601683795},"316":{"tf":2.6457513110645907},"318":{"tf":1.7320508075688772},"319":{"tf":2.0},"320":{"tf":3.4641016151377544},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"323":{"tf":2.0},"324":{"tf":3.0},"325":{"tf":1.0},"33":{"tf":2.23606797749979},"335":{"tf":2.0},"337":{"tf":1.0},"34":{"tf":1.0},"343":{"tf":1.4142135623730951},"348":{"tf":1.0},"35":{"tf":1.7320508075688772},"353":{"tf":1.0},"36":{"tf":1.7320508075688772},"360":{"tf":2.23606797749979},"368":{"tf":1.7320508075688772},"37":{"tf":1.0},"375":{"tf":1.4142135623730951},"376":{"tf":1.0},"377":{"tf":2.23606797749979},"378":{"tf":1.0},"381":{"tf":2.0},"382":{"tf":2.0},"390":{"tf":1.0},"391":{"tf":2.6457513110645907},"397":{"tf":1.0},"398":{"tf":1.0},"399":{"tf":1.0},"400":{"tf":1.4142135623730951},"401":{"tf":1.4142135623730951},"402":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":3.872983346207417},"407":{"tf":2.23606797749979},"408":{"tf":2.6457513110645907},"41":{"tf":2.23606797749979},"412":{"tf":1.4142135623730951},"42":{"tf":2.8284271247461903},"425":{"tf":1.0},"427":{"tf":1.0},"428":{"tf":1.0},"43":{"tf":1.7320508075688772},"44":{"tf":1.7320508075688772},"45":{"tf":2.449489742783178},"54":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"91":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"353":{"tf":1.0}}}}}},"r":{"1":{".":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":4,"docs":{"82":{"tf":1.7320508075688772},"83":{"tf":1.0},"84":{"tf":3.7416573867739413},"87":{"tf":1.0}}},"2":{"df":1,"docs":{"84":{"tf":2.8284271247461903}}},"<":{"'":{"a":{"df":1,"docs":{"87":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"1":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"239":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"df":7,"docs":{"239":{"tf":2.0},"333":{"tf":1.0},"398":{"tf":1.4142135623730951},"82":{"tf":3.605551275463989},"83":{"tf":2.0},"84":{"tf":3.0},"87":{"tf":1.7320508075688772}},"n":{"a":{"df":0,"docs":{},"m":{"df":10,"docs":{"160":{"tf":2.0},"161":{"tf":2.449489742783178},"179":{"tf":1.4142135623730951},"180":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":2.0},"82":{"tf":3.1622776601683795},"83":{"tf":2.23606797749979},"84":{"tf":2.8284271247461903},"87":{"tf":2.23606797749979}},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"160":{"tf":2.0},"161":{"tf":1.7320508075688772}},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"160":{"tf":1.0},"161":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"。":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"160":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"%":{"\\":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"21":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"s":{"/":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"z":{"df":22,"docs":{"142":{"tf":1.4142135623730951},"156":{"tf":1.0},"198":{"tf":3.0},"200":{"tf":2.0},"203":{"tf":1.7320508075688772},"207":{"tf":1.4142135623730951},"208":{"tf":1.7320508075688772},"210":{"tf":2.8284271247461903},"289":{"tf":3.4641016151377544},"290":{"tf":2.0},"368":{"tf":1.7320508075688772},"383":{"tf":1.0},"405":{"tf":5.5677643628300215},"407":{"tf":3.4641016151377544},"408":{"tf":3.0},"417":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.7320508075688772},"54":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.7320508075688772},"77":{"tf":2.8284271247461903}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.7320508075688772},"108":{"tf":1.7320508075688772}},"e":{":":{":":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"a":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"f":{"df":14,"docs":{"138":{"tf":2.0},"139":{"tf":1.7320508075688772},"140":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":2.23606797749979},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.7320508075688772},"152":{"tf":1.0},"270":{"tf":1.0},"34":{"tf":1.0},"398":{"tf":1.0},"53":{"tf":1.0},"78":{"tf":1.7320508075688772}}},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"257":{"tf":1.0},"258":{"tf":2.6457513110645907},"320":{"tf":1.7320508075688772}}}}}},"v":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"350":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"5":{"df":1,"docs":{"133":{"tf":1.0}}},"6":{"df":2,"docs":{"133":{"tf":1.0},"134":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"133":{"tf":1.0}}},"8":{"df":1,"docs":{"133":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"0":{".":{"1":{".":{"0":{"df":95,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"134":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":1.7320508075688772},"199":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":1.7320508075688772},"206":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"208":{"tf":1.4142135623730951},"211":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"218":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.0},"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"232":{"tf":1.4142135623730951},"239":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":2.0},"242":{"tf":1.4142135623730951},"246":{"tf":1.0},"261":{"tf":2.0},"266":{"tf":2.6457513110645907},"27":{"tf":1.7320508075688772},"273":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.7320508075688772},"285":{"tf":1.0},"286":{"tf":1.0},"289":{"tf":1.4142135623730951},"290":{"tf":1.0},"291":{"tf":1.0},"293":{"tf":1.0},"299":{"tf":1.4142135623730951},"301":{"tf":1.0},"306":{"tf":1.4142135623730951},"32":{"tf":1.0},"335":{"tf":1.0},"350":{"tf":1.0},"351":{"tf":1.0},"353":{"tf":1.4142135623730951},"36":{"tf":1.0},"360":{"tf":1.0},"368":{"tf":1.4142135623730951},"376":{"tf":2.0},"377":{"tf":1.0},"38":{"tf":1.0},"386":{"tf":1.0},"398":{"tf":1.0},"40":{"tf":1.4142135623730951},"405":{"tf":2.449489742783178},"407":{"tf":1.4142135623730951},"408":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"427":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"61":{"tf":2.449489742783178},"62":{"tf":1.7320508075688772},"70":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"78":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"1":{"0":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"2":{"7":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"8":{"6":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"2":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"5":{"df":3,"docs":{"266":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"42":{"tf":1.0}}},"6":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{".":{"0":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"x":{"df":1,"docs":{"246":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0}}}}}}},"3":{".":{"0":{".":{"0":{"df":1,"docs":{"267":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"245":{"tf":1.0}}}}}},"df":3,"docs":{"243":{"tf":2.23606797749979},"244":{"tf":2.23606797749979},"245":{"tf":1.4142135623730951}}}}}}},"df":4,"docs":{"243":{"tf":1.7320508075688772},"244":{"tf":1.4142135623730951},"245":{"tf":1.0},"246":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"246":{"tf":1.0}}},"4":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"v":{"4":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.0}}}}}}}},"u":{"8":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":2.449489742783178}}},"6":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"v":{"6":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}}}}}},"df":2,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":2.6457513110645907}}},"[":{"0":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}},"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"134":{"tf":1.0}}},"9":{"9":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":9,"docs":{"243":{"tf":1.4142135623730951},"300":{"tf":1.4142135623730951},"301":{"tf":3.0},"302":{"tf":1.7320508075688772},"303":{"tf":2.449489742783178},"319":{"tf":4.123105625617661},"320":{"tf":6.082762530298219},"349":{"tf":1.0},"382":{"tf":1.4142135623730951}},"i":{"d":{"df":1,"docs":{"165":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":55,"docs":{"106":{"tf":1.0},"148":{"tf":1.4142135623730951},"159":{"tf":1.0},"167":{"tf":4.242640687119285},"185":{"tf":1.0},"186":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"202":{"tf":5.916079783099616},"206":{"tf":2.8284271247461903},"224":{"tf":1.0},"225":{"tf":1.0},"228":{"tf":1.0},"242":{"tf":3.1622776601683795},"246":{"tf":1.0},"260":{"tf":1.0},"285":{"tf":1.7320508075688772},"289":{"tf":3.872983346207417},"290":{"tf":2.0},"291":{"tf":3.7416573867739413},"293":{"tf":1.7320508075688772},"294":{"tf":4.58257569495584},"299":{"tf":2.0},"301":{"tf":1.7320508075688772},"306":{"tf":2.0},"318":{"tf":1.0},"319":{"tf":2.0},"320":{"tf":3.1622776601683795},"324":{"tf":3.3166247903554},"331":{"tf":1.0},"347":{"tf":1.0},"350":{"tf":1.4142135623730951},"353":{"tf":1.0},"359":{"tf":1.0},"36":{"tf":1.0},"360":{"tf":1.4142135623730951},"368":{"tf":2.449489742783178},"382":{"tf":1.0},"386":{"tf":1.0},"405":{"tf":2.23606797749979},"407":{"tf":1.4142135623730951},"428":{"tf":1.0},"49":{"tf":2.6457513110645907},"51":{"tf":2.23606797749979},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"56":{"tf":2.23606797749979},"57":{"tf":1.4142135623730951},"58":{"tf":2.449489742783178},"61":{"tf":1.7320508075688772},"62":{"tf":2.6457513110645907},"70":{"tf":2.0},"75":{"tf":2.449489742783178},"82":{"tf":1.4142135623730951}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"167":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"385":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},")":{"df":0,"docs":{},",":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"350":{"tf":1.0}}}}},"df":0,"docs":{}}}}},".":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"df":1,"docs":{"103":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"a":{")":{")":{"df":0,"docs":{},",":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"103":{"tf":1.4142135623730951},"104":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"368":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}}}},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"[":{".":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"368":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"}":{"df":0,"docs":{},"{":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"56":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}},"r":{"df":2,"docs":{"232":{"tf":1.0},"416":{"tf":3.3166247903554}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":24,"docs":{"143":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"189":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.4142135623730951},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.0},"242":{"tf":1.4142135623730951},"290":{"tf":1.0},"299":{"tf":1.7320508075688772},"34":{"tf":1.0},"369":{"tf":1.0},"427":{"tf":1.0},"43":{"tf":1.0},"49":{"tf":3.3166247903554},"51":{"tf":2.0},"54":{"tf":1.0},"75":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"416":{"tf":1.0}}}},"df":6,"docs":{"100":{"tf":1.0},"225":{"tf":1.0},"353":{"tf":1.4142135623730951},"359":{"tf":1.0},"36":{"tf":1.4142135623730951},"99":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":1,"docs":{"26":{"tf":1.7320508075688772}},"s":{"=":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":17,"docs":{"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":2.0},"135":{"tf":2.0},"137":{"tf":1.7320508075688772},"146":{"tf":1.7320508075688772},"150":{"tf":1.0},"156":{"tf":1.0},"169":{"tf":1.0},"240":{"tf":1.0},"299":{"tf":5.477225575051661},"350":{"tf":1.0},"359":{"tf":1.4142135623730951},"368":{"tf":1.4142135623730951},"389":{"tf":1.0},"420":{"tf":1.4142135623730951},"423":{"tf":1.0}},"e":{"c":{"!":{"[":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"231":{"tf":1.0},"232":{"tf":2.0},"249":{"tf":1.7320508075688772},"250":{"tf":1.0}}}}}}},"'":{"a":{"df":1,"docs":{"350":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":1,"docs":{"172":{"tf":1.4142135623730951}}}},"1":{"0":{"0":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":13,"docs":{"132":{"tf":1.0},"134":{"tf":1.7320508075688772},"137":{"tf":1.0},"156":{"tf":1.0},"241":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.4142135623730951},"299":{"tf":2.0},"368":{"tf":1.7320508075688772},"385":{"tf":1.4142135623730951},"389":{"tf":1.7320508075688772}}},"2":{"df":1,"docs":{"246":{"tf":1.0}}},"3":{"4":{"df":2,"docs":{"170":{"tf":1.7320508075688772},"172":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"335":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"239":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"x":{"1":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{")":{";":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":9,"docs":{"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"229":{"tf":1.4142135623730951},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.4142135623730951},"389":{"tf":1.4142135623730951},"405":{"tf":1.7320508075688772}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"<":{"&":{"'":{"a":{"df":6,"docs":{"228":{"tf":1.4142135623730951},"229":{"tf":2.0},"231":{"tf":1.0},"232":{"tf":2.8284271247461903},"249":{"tf":2.449489742783178},"250":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"228":{"tf":1.0}}}}}},"_":{"df":4,"docs":{"246":{"tf":1.0},"398":{"tf":1.4142135623730951},"399":{"tf":1.0},"400":{"tf":1.0}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":3,"docs":{"320":{"tf":1.0},"334":{"tf":1.4142135623730951},"335":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":5,"docs":{"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"246":{"tf":1.4142135623730951},"299":{"tf":1.0},"331":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"<":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"c":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"o":{"df":1,"docs":{"247":{"tf":1.4142135623730951}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"385":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":16,"docs":{"215":{"tf":1.0},"217":{"tf":1.0},"218":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.7320508075688772},"225":{"tf":1.7320508075688772},"226":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0},"289":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772},"335":{"tf":1.4142135623730951},"378":{"tf":1.0},"385":{"tf":1.4142135623730951}}}}},"t":{"df":11,"docs":{"131":{"tf":1.0},"132":{"tf":1.7320508075688772},"134":{"tf":1.0},"140":{"tf":1.0},"169":{"tf":1.0},"179":{"tf":1.7320508075688772},"243":{"tf":1.0},"273":{"tf":1.0},"294":{"tf":1.0},"334":{"tf":1.0},"378":{"tf":2.8284271247461903}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"405":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"3":{"2":{"df":1,"docs":{"389":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":2,"docs":{"142":{"tf":1.0},"417":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}}}}}},"df":19,"docs":{"132":{"tf":1.4142135623730951},"136":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"228":{"tf":1.0},"240":{"tf":1.0},"242":{"tf":1.0},"247":{"tf":1.4142135623730951},"289":{"tf":1.4142135623730951},"302":{"tf":1.0},"303":{"tf":1.4142135623730951},"306":{"tf":1.7320508075688772},"319":{"tf":2.23606797749979},"320":{"tf":4.69041575982343},"323":{"tf":1.7320508075688772},"335":{"tf":1.4142135623730951},"388":{"tf":1.0},"389":{"tf":3.0}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":49,"docs":{"10":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":2.23606797749979},"132":{"tf":3.0},"133":{"tf":2.23606797749979},"134":{"tf":4.242640687119285},"135":{"tf":3.3166247903554},"136":{"tf":3.4641016151377544},"137":{"tf":2.6457513110645907},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.4142135623730951},"148":{"tf":1.0},"152":{"tf":1.4142135623730951},"156":{"tf":2.0},"213":{"tf":1.0},"215":{"tf":1.7320508075688772},"216":{"tf":1.4142135623730951},"217":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":2.0},"229":{"tf":2.0},"231":{"tf":1.0},"241":{"tf":1.7320508075688772},"242":{"tf":1.7320508075688772},"243":{"tf":2.0},"244":{"tf":1.4142135623730951},"246":{"tf":2.23606797749979},"247":{"tf":2.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"289":{"tf":2.23606797749979},"299":{"tf":2.8284271247461903},"302":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.7320508075688772},"335":{"tf":1.0},"368":{"tf":2.0},"385":{"tf":1.4142135623730951},"389":{"tf":2.0},"398":{"tf":1.4142135623730951},"401":{"tf":1.0},"405":{"tf":3.1622776601683795},"422":{"tf":1.0},"54":{"tf":2.449489742783178},"79":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"131":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"。":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"334":{"tf":1.0}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"113":{"tf":2.0}}}}},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"156":{"tf":1.0},"324":{"tf":1.0}}}}},"df":1,"docs":{"263":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"196":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"261":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":11,"docs":{"17":{"tf":1.0},"241":{"tf":1.4142135623730951},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"260":{"tf":1.0},"262":{"tf":1.0},"32":{"tf":1.0},"322":{"tf":1.4142135623730951},"398":{"tf":1.0},"399":{"tf":1.0},"40":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"413":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"353":{"tf":1.0},"428":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"429":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"(":{"a":{"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"s":{"df":2,"docs":{"113":{"tf":1.0},"252":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"。":{"df":0,"docs":{},"接":{"df":0,"docs":{},"着":{"df":0,"docs":{},"当":{"df":0,"docs":{},"新":{"df":0,"docs":{},"建":{"df":0,"docs":{},"线":{"df":0,"docs":{},"程":{"df":0,"docs":{},"开":{"df":0,"docs":{},"始":{"df":0,"docs":{},"执":{"df":0,"docs":{},"行":{"df":0,"docs":{},",":{"df":0,"docs":{},"v":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}}}}}}}}},"然":{"df":0,"docs":{},"而":{"df":0,"docs":{},"这":{"df":0,"docs":{},"有":{"df":0,"docs":{},"一":{"df":0,"docs":{},"个":{"df":0,"docs":{},"问":{"df":0,"docs":{},"题":{"df":0,"docs":{},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}}}}}}}}}}},"w":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"324":{"tf":1.0},"353":{"tf":1.0},"75":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"353":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"120":{"tf":1.0},"266":{"tf":1.0}}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"225":{"tf":1.0},"246":{"tf":1.0},"36":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"57":{"tf":1.0}}}}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"427":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":12,"docs":{"120":{"tf":2.0},"225":{"tf":1.7320508075688772},"246":{"tf":1.7320508075688772},"260":{"tf":1.0},"266":{"tf":1.7320508075688772},"289":{"tf":1.7320508075688772},"290":{"tf":1.0},"353":{"tf":1.7320508075688772},"36":{"tf":1.7320508075688772},"405":{"tf":2.23606797749979},"427":{"tf":1.0},"57":{"tf":2.0}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"376":{"tf":1.4142135623730951}}}},"y":{"df":1,"docs":{"196":{"tf":1.0}}}},"df":2,"docs":{"196":{"tf":1.0},"378":{"tf":1.4142135623730951}},"e":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}}}},"a":{"df":0,"docs":{},"k":{"<":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"294":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"t":{"df":3,"docs":{"286":{"tf":1.0},"294":{"tf":3.0},"295":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"286":{"tf":1.4142135623730951},"294":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"294":{"tf":3.605551275463989}}}},"b":{"df":21,"docs":{"10":{"tf":1.0},"111":{"tf":1.0},"297":{"tf":1.0},"316":{"tf":1.0},"392":{"tf":1.4142135623730951},"395":{"tf":2.8284271247461903},"396":{"tf":2.6457513110645907},"397":{"tf":2.0},"398":{"tf":1.7320508075688772},"399":{"tf":1.4142135623730951},"400":{"tf":1.4142135623730951},"401":{"tf":1.7320508075688772},"402":{"tf":1.4142135623730951},"403":{"tf":1.0},"404":{"tf":1.0},"405":{"tf":2.0},"406":{"tf":1.0},"407":{"tf":1.0},"408":{"tf":2.0},"409":{"tf":1.0},"6":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"325":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"400":{"tf":1.0}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"’":{"df":0,"docs":{},"r":{"df":1,"docs":{"59":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"’":{"df":1,"docs":{"59":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"186":{"tf":1.0},"228":{"tf":1.0},"273":{"tf":1.0}}}}}},"w":{"df":1,"docs":{"59":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":12,"docs":{"100":{"tf":1.0},"199":{"tf":3.7416573867739413},"242":{"tf":4.0},"335":{"tf":2.23606797749979},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"90":{"tf":2.23606797749979},"91":{"tf":3.3166247903554},"93":{"tf":3.0},"95":{"tf":2.6457513110645907},"96":{"tf":1.4142135623730951},"97":{"tf":2.0}},"、":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"335":{"tf":1.7320508075688772}},"、":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"335":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"。":{"df":0,"docs":{},"当":{"df":0,"docs":{},"我":{"df":0,"docs":{},"们":{"df":0,"docs":{},"不":{"df":0,"docs":{},"使":{"df":0,"docs":{},"用":{"df":0,"docs":{},"圆":{"df":0,"docs":{},"括":{"df":0,"docs":{},"号":{"df":0,"docs":{},"时":{"df":0,"docs":{},",":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}}}}}}}}}}}}}}}}}}},"df":0,"docs":{},"l":{"d":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":10,"docs":{"111":{"tf":1.0},"12":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.0},"24":{"tf":2.23606797749979},"27":{"tf":1.7320508075688772},"42":{"tf":1.0},"436":{"tf":2.0}}}}},"df":9,"docs":{"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.0},"382":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"389":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"306":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"191":{"tf":1.0},"273":{"tf":1.0},"376":{"tf":1.0},"433":{"tf":1.0}}}}}}},"z":{"a":{"df":0,"docs":{},"r":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"(":{"&":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"376":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"376":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"r":{"d":{"df":4,"docs":{"150":{"tf":1.0},"191":{"tf":1.7320508075688772},"77":{"tf":2.8284271247461903},"78":{"tf":4.47213595499958}}},"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"191":{"tf":1.7320508075688772},"230":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\"":{")":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"407":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"407":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"407":{"tf":1.0},"408":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":1,"docs":{"407":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"405":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"405":{"tf":2.449489742783178},"407":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"405":{"tf":10.099504938362077},"407":{"tf":7.280109889280518},"408":{"tf":7.416198487095663}},"s":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"405":{"tf":1.0}}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"405":{"tf":2.8284271247461903},"407":{"tf":2.0},"408":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"406":{"tf":1.0}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":4,"docs":{"110":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.4142135623730951},"266":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"264":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"!":{"df":0,"docs":{},"。":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}}}},".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}}},"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"162":{"tf":1.0}}}}}}},"df":24,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"150":{"tf":1.7320508075688772},"191":{"tf":1.4142135623730951},"20":{"tf":2.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.6457513110645907},"23":{"tf":2.0},"24":{"tf":1.7320508075688772},"25":{"tf":1.0},"26":{"tf":2.0},"266":{"tf":1.4142135623730951},"27":{"tf":2.23606797749979},"30":{"tf":1.0},"32":{"tf":2.0},"369":{"tf":1.0},"55":{"tf":1.7320508075688772},"59":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":3.1622776601683795}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"386":{"tf":1.0},"407":{"tf":1.0},"53":{"tf":2.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"c":{"!":{"[":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"378":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"378":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"378":{"tf":2.8284271247461903}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"a":{"d":{"d":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"df":2,"docs":{"377":{"tf":1.0},"378":{"tf":1.0}}}},"df":0,"docs":{}},"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"274":{"tf":1.0},"359":{"tf":1.4142135623730951}}}}}},"_":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"399":{"tf":1.4142135623730951}},"l":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"381":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":5,"docs":{"101":{"tf":1.0},"125":{"tf":1.0},"197":{"tf":1.0},"233":{"tf":1.0},"381":{"tf":2.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"324":{"tf":1.0}}}}}}}}},"x":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"+":{"1":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},".":{"0":{"df":1,"docs":{"54":{"tf":1.0}}},"1":{"df":1,"docs":{"54":{"tf":1.0}}},"2":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"186":{"tf":1.0},"188":{"tf":1.7320508075688772},"194":{"tf":1.0}}}}},"y":{".":{"df":0,"docs":{},"z":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}},"1":{"df":1,"docs":{"175":{"tf":2.0}}},"2":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"8":{"6":{"_":{"6":{"4":{"df":1,"docs":{"436":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"389":{"tf":1.7320508075688772}}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}},"df":56,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"105":{"tf":2.449489742783178},"106":{"tf":1.4142135623730951},"173":{"tf":4.358898943540674},"175":{"tf":4.358898943540674},"183":{"tf":1.7320508075688772},"185":{"tf":4.47213595499958},"186":{"tf":2.23606797749979},"188":{"tf":2.6457513110645907},"189":{"tf":1.7320508075688772},"194":{"tf":1.4142135623730951},"240":{"tf":3.605551275463989},"242":{"tf":1.0},"246":{"tf":2.0},"257":{"tf":1.4142135623730951},"266":{"tf":1.4142135623730951},"274":{"tf":1.0},"277":{"tf":2.449489742783178},"278":{"tf":2.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"289":{"tf":2.23606797749979},"345":{"tf":1.0},"347":{"tf":1.4142135623730951},"350":{"tf":1.4142135623730951},"351":{"tf":3.3166247903554},"352":{"tf":2.23606797749979},"353":{"tf":2.449489742783178},"355":{"tf":1.7320508075688772},"356":{"tf":4.123105625617661},"357":{"tf":2.0},"358":{"tf":2.23606797749979},"359":{"tf":6.4031242374328485},"360":{"tf":2.6457513110645907},"361":{"tf":4.242640687119285},"37":{"tf":1.7320508075688772},"375":{"tf":2.449489742783178},"377":{"tf":2.449489742783178},"381":{"tf":2.0},"385":{"tf":1.0},"386":{"tf":2.0},"389":{"tf":1.4142135623730951},"398":{"tf":1.0},"416":{"tf":1.0},"428":{"tf":2.23606797749979},"49":{"tf":5.0},"51":{"tf":4.123105625617661},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"56":{"tf":2.449489742783178},"57":{"tf":3.4641016151377544},"58":{"tf":4.123105625617661},"70":{"tf":3.1622776601683795},"71":{"tf":2.449489742783178},"94":{"tf":1.7320508075688772}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"213":{"tf":1.0}}}}}}}}}},"y":{"df":0,"docs":{},"z":{"df":4,"docs":{"186":{"tf":1.4142135623730951},"188":{"tf":1.0},"189":{"tf":1.0},"194":{"tf":1.0}}}},"、":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}},"。":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"个":{"df":0,"docs":{},"假":{"df":0,"docs":{},"想":{"df":0,"docs":{},"的":{"df":0,"docs":{},"例":{"df":0,"docs":{},"子":{"df":0,"docs":{},"中":{"df":0,"docs":{},",":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"356":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}}},",":{"2":{"df":1,"docs":{"351":{"tf":1.0}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"185":{"tf":1.0}}}}}}}},"y":{".":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"186":{"tf":1.0},"188":{"tf":1.7320508075688772},"194":{"tf":1.0}}}}}},"1":{"df":1,"docs":{"175":{"tf":2.449489742783178}}},"2":{">":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"175":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"175":{"tf":2.23606797749979}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"94":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"263":{"tf":2.6457513110645907}}}}},"df":33,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"172":{"tf":1.0},"173":{"tf":4.242640687119285},"175":{"tf":3.4641016151377544},"183":{"tf":2.0},"186":{"tf":2.8284271247461903},"188":{"tf":3.1622776601683795},"189":{"tf":2.23606797749979},"191":{"tf":1.7320508075688772},"194":{"tf":1.4142135623730951},"274":{"tf":1.0},"277":{"tf":2.8284271247461903},"278":{"tf":2.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.7320508075688772},"289":{"tf":1.4142135623730951},"350":{"tf":1.0},"351":{"tf":2.23606797749979},"352":{"tf":2.0},"356":{"tf":3.872983346207417},"359":{"tf":6.324555320336759},"360":{"tf":3.1622776601683795},"361":{"tf":4.69041575982343},"37":{"tf":2.0},"375":{"tf":2.449489742783178},"377":{"tf":2.449489742783178},"381":{"tf":2.449489742783178},"53":{"tf":1.0},"54":{"tf":2.0},"57":{"tf":3.872983346207417},"70":{"tf":2.8284271247461903},"94":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"102":{"tf":1.0},"190":{"tf":1.0},"192":{"tf":1.4142135623730951}}}},"df":1,"docs":{"361":{"tf":1.0}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"148":{"tf":1.0},"150":{"tf":1.0},"258":{"tf":2.449489742783178}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"322":{"tf":2.23606797749979}}}}}},"df":2,"docs":{"322":{"tf":2.0},"413":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"u":{"'":{"df":0,"docs":{},"r":{"df":2,"docs":{"401":{"tf":1.0},"75":{"tf":1.0}}},"v":{"df":2,"docs":{"289":{"tf":2.449489742783178},"290":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"y":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}},"”":{"df":0,"docs":{},"。":{"df":0,"docs":{},"现":{"df":0,"docs":{},"在":{"df":0,"docs":{},"有":{"df":0,"docs":{},"了":{"df":0,"docs":{},"两":{"df":0,"docs":{},"个":{"df":0,"docs":{},"变":{"df":0,"docs":{},"量":{"df":0,"docs":{},",":{"df":0,"docs":{},"x":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}}}}}}}},"(":{"df":0,"docs":{},"其":{"df":0,"docs":{},"值":{"df":0,"docs":{},"为":{"c":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}}},"z":{"df":7,"docs":{"277":{"tf":1.0},"301":{"tf":1.0},"351":{"tf":1.4142135623730951},"360":{"tf":2.0},"53":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951},"70":{"tf":1.0}},"e":{"df":1,"docs":{"142":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"o":{"df":5,"docs":{"252":{"tf":1.7320508075688772},"405":{"tf":3.0},"407":{"tf":2.0},"408":{"tf":1.7320508075688772},"61":{"tf":1.4142135623730951}}}}},"h":{"df":1,"docs":{"0":{"tf":1.0}}},"i":{"df":0,"docs":{},"p":{"(":{"&":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"252":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"252":{"tf":1.0}}}}}}},"title":{"root":{"8":{"df":1,"docs":{"138":{"tf":1.0}}},"_":{"df":1,"docs":{"107":{"tf":1.0}}},"a":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":1,"docs":{"429":{"tf":1.0}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":2,"docs":{"258":{"tf":1.0},"306":{"tf":1.0}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"342":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"216":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"200":{"tf":1.0}}}},"n":{"df":1,"docs":{"200":{"tf":1.0}}}},"df":1,"docs":{"199":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"n":{"c":{"df":4,"docs":{"313":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"326":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":1,"docs":{"156":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"415":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"183":{"tf":1.0},"194":{"tf":1.0}}},"df":0,"docs":{}}},"x":{"<":{"df":0,"docs":{},"t":{"df":4,"docs":{"271":{"tf":1.0},"272":{"tf":1.0},"275":{"tf":1.0},"278":{"tf":1.0}}}},"df":1,"docs":{"273":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":9,"docs":{"25":{"tf":1.0},"254":{"tf":1.0},"26":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":1.0}}}}}},"df":1,"docs":{"418":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"434":{"tf":1.4142135623730951}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"428":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"249":{"tf":1.0},"422":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"223":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"342":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"422":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":8,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"117":{"tf":1.0},"226":{"tf":1.0},"256":{"tf":1.0},"260":{"tf":1.0},"262":{"tf":1.0},"40":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":5,"docs":{"254":{"tf":1.0},"256":{"tf":1.0},"259":{"tf":1.0},"261":{"tf":1.0},"263":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"75":{"tf":1.0}}}}}},"df":1,"docs":{"425":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"419":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"424":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":4,"docs":{"276":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.0}}}},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"391":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"283":{"tf":1.0},"407":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"203":{"tf":1.0},"430":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"191":{"tf":1.0}}}}},"q":{"df":1,"docs":{"420":{"tf":1.0}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}},"f":{"df":1,"docs":{"431":{"tf":1.0}},"n":{"df":1,"docs":{"242":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"315":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},",":{"df":0,"docs":{},"任":{"df":0,"docs":{},"务":{"df":0,"docs":{},"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},")":{"df":0,"docs":{},"和":{"df":0,"docs":{},"线":{"df":0,"docs":{},"程":{"df":0,"docs":{},"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"327":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}}},"df":0,"docs":{}}}}}}}}}}}}},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}}},":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"432":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"146":{"tf":1.0},"423":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"20":{"tf":1.0},"25":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"400":{"tf":1.0}}}}}},"i":{"/":{"df":0,"docs":{},"o":{"df":2,"docs":{"213":{"tf":1.0},"248":{"tf":1.0}}}},"d":{"df":1,"docs":{"429":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"97":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"267":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"191":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"428":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"m":{"a":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"15":{"tf":1.0}}},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"389":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"225":{"tf":1.0}}}},"p":{"df":5,"docs":{"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"103":{"tf":1.0},"347":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"299":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"t":{">":{"/":{"a":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"306":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"382":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"378":{"tf":1.0},"380":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"432":{"tf":1.0},"436":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":1,"docs":{"102":{"tf":1.0}}}}}}},"r":{"d":{"df":1,"docs":{"421":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":7,"docs":{"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"202":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":1,"docs":{"420":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"421":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"338":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}}}}},"u":{"b":{"df":3,"docs":{"116":{"tf":1.0},"123":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":5,"docs":{"284":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"294":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"df":0,"docs":{},"t":{">":{"/":{"df":0,"docs":{},"r":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"307":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"287":{"tf":1.0},"288":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"75":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"353":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"203":{"tf":1.0}}}},"df":2,"docs":{"157":{"tf":1.0},"36":{"tf":1.0}}}}}}},"f":{"c":{"df":1,"docs":{"437":{"tf":1.0}}},"df":0,"docs":{}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"434":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":10,"docs":{"0":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"237":{"tf":1.0},"3":{"tf":1.0},"328":{"tf":1.0},"365":{"tf":1.0},"429":{"tf":1.0},"432":{"tf":1.0},"436":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"427":{"tf":1.0}}}},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"426":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"436":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"308":{"tf":1.0},"309":{"tf":1.0},"311":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"395":{"tf":1.0},"396":{"tf":1.0},"403":{"tf":1.4142135623730951},"404":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"202":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"383":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"143":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"298":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},")":{"df":0,"docs":{},"与":{"df":0,"docs":{},"堆":{"df":0,"docs":{},"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"66":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"308":{"tf":1.0},"310":{"tf":1.0},"311":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"c":{"df":0,"docs":{},"p":{"df":1,"docs":{"397":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"407":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"434":{"tf":1.0}}},"t":{"df":28,"docs":{"169":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"194":{"tf":1.0},"242":{"tf":1.0},"244":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":1.0},"308":{"tf":1.0},"326":{"tf":1.0},"333":{"tf":1.0},"334":{"tf":1.0},"335":{"tf":1.0},"336":{"tf":1.0},"370":{"tf":1.0},"373":{"tf":1.0},"374":{"tf":1.0},"377":{"tf":1.7320508075688772},"378":{"tf":1.0},"383":{"tf":1.0},"407":{"tf":1.0},"418":{"tf":1.0},"91":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"382":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"216":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":5,"docs":{"120":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":1.0},"258":{"tf":1.0}}},"t":{"df":0,"docs":{},"f":{"df":1,"docs":{"138":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0}}}}}},"df":0,"docs":{}},"s":{"df":1,"docs":{"252":{"tf":1.0}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"294":{"tf":1.0}}}},"df":0,"docs":{}}},"b":{"df":2,"docs":{"395":{"tf":1.0},"396":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}}}}},"y":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"263":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"322":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}} \ No newline at end of file diff --git a/theme/2018-edition.css b/theme/2018-edition.css new file mode 100644 index 000000000..b1dcf9364 --- /dev/null +++ b/theme/2018-edition.css @@ -0,0 +1,9 @@ +span.caption { + font-size: .8em; + font-weight: 600; +} + +span.caption code { + font-size: 0.875em; + font-weight: 400; +} diff --git a/theme/listing.css b/theme/listing.css new file mode 100644 index 000000000..5998d39f3 --- /dev/null +++ b/theme/listing.css @@ -0,0 +1,8 @@ +figure.listing { + margin: 0; +} + +.listing figcaption { + font-size: .8em; + font-weight: 600; +} diff --git a/theme/semantic-notes.css b/theme/semantic-notes.css new file mode 100644 index 000000000..7e68eb371 --- /dev/null +++ b/theme/semantic-notes.css @@ -0,0 +1,13 @@ +/* + This is copied directly from the styles for blockquotes, because notes were + historically rendered *as* blockquotes. This keeps the presentation of them + identical while updating the presentation. +*/ +.note { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-block-start: 0.1em solid var(--quote-border); + border-block-end: 0.1em solid var(--quote-border); +} diff --git a/title-page.html b/title-page.html new file mode 100644 index 000000000..80f52f125 --- /dev/null +++ b/title-page.html @@ -0,0 +1,246 @@ + + + + + + Rust 程序设计语言 - Rust 程序设计语言 简体中文版 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Rust 程序设计语言

    +
    +

    title-page.md +
    +commit d94e03a18a2590ed3f1c67b859cb11528d2a2d5c

    +
    +

    本书的英文原版作者为 Steve Klabnik 和 Carol Nichols,并由 Rust 社区补充完善。本简体中文译本由 Rust 中文社区翻译。

    +

    本书假设你使用 Rust 1.78.0(2024-05-02 发布)或更新的版本。请查看 第 1 章的 “安装” 部分 了解如何安装和升级 Rust。

    +

    本书的英文原版 HTML 格式可以在 https://doc.rust-lang.org/stable/book/ 在线阅读;使用 rustup 安装的 Rust 也包含一份英文离线版,运行 rustup docs --book 即可打开。

    +

    本书还有一些社区 翻译版本。简体中文译本可以在 https://kaisery.github.io/trpl-zh-cn/ 在线阅读。

    +

    本书也有 由 No Starch Press 出版的纸质版和电子版

    +
    +

    🚨 想要具有互动性的学习体验吗?试试 Rust Book 的另一个版本,其中包括测验、高亮、可视化等功能https://rust-book.cs.brown.edu

    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/tomorrow-night.css b/tomorrow-night.css new file mode 100644 index 000000000..81fe276e7 --- /dev/null +++ b/tomorrow-night.css @@ -0,0 +1,102 @@ +/* Tomorrow Night Theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #de935f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rule .hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.hljs-name, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b5bd68; +} + +/* Tomorrow Aqua */ +.hljs-title, +.css .hljs-hexcolor { + color: #8abeb7; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b294bb; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1d1f21; + color: #c5c8c6; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + +.hljs-addition { + color: #718c00; +} + +.hljs-deletion { + color: #c82829; +}

    3ltT~BKS6mJs3A%}*cEt-p$yG^1!_AxUIH@wX8 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 z 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 literal 0 HcmV?d00001 diff --git a/img/trpl15-01.svg b/img/trpl15-01.svg new file mode 100644 index 000000000..bbeef968a --- /dev/null +++ b/img/trpl15-01.svg @@ -0,0 +1,43 @@ + + + + + + +%3 + + + +table0 + +Cons + +i32 + + +Cons + +i32 + + +Cons + +i32 + + +Cons + +i32 + + +Cons + +i32 + + + + + diff --git a/img/trpl15-02.svg b/img/trpl15-02.svg new file mode 100644 index 000000000..4454df8c3 --- /dev/null +++ b/img/trpl15-02.svg @@ -0,0 +1,26 @@ + + + + + + +%3 + + + +table0 + +Cons + +i32 + + +Box + +usize + + + diff --git a/img/trpl15-03.svg b/img/trpl15-03.svg new file mode 100644 index 000000000..dbc3b5cdb --- /dev/null +++ b/img/trpl15-03.svg @@ -0,0 +1,109 @@ + + + + + + +%3 + + + +table4 +b + + + +table5 + +3 + +   + + + +table4:c->table5:pte4 + + + + + +table1 + +5 + +   + + + +table5:c->table1:pte0 + + + + + +table0 +a + + + +table0:c->table1:pte0 + + + + + +table2 + +10 + +   + + + +table1:c->table2:pte1 + + + + + +table3 + +Nil + + + +table2:c->table3:pte2 + + + + + +table6 +c + + + +table7 + +4 + +   + + + +table6:c->table7:pte6 + + + + + +table7:c->table1:pte0 + + + + + diff --git a/img/trpl15-04.svg b/img/trpl15-04.svg new file mode 100644 index 000000000..7285ae673 --- /dev/null +++ b/img/trpl15-04.svg @@ -0,0 +1,84 @@ + + + + + + + + + +l1 + +5 + + + + + +l2 + +10 + + + + + +l1:c->l2:data + + + + + +invisible_end + + + + +l2:c->invisible_end:n + + + + +invisible_start + + + + +invisible_start:n->l1 + + + + + +invisible_start:s->invisible_end:s + + + + +a + +a + + + +a->l1:n + + + + + +b + +b + + + +b->l2:n + + + + + diff --git a/img/trpl17-01.svg b/img/trpl17-01.svg new file mode 100644 index 000000000..483bf7216 --- /dev/null +++ b/img/trpl17-01.svg @@ -0,0 +1,110 @@ + + + + + + + + +cluster_task_a + +Task A + + +cluster_task_b + +Task B + + + +A1 + +A1 + + + +A2 + +A2 + + + + +B1 + +B1 + + + +A1->B1 + + + + + +A3 + +A3 + + + + +B2 + +B2 + + + +A2->B2 + + + + + +A4 + +A4 + + + + +A3->A4 + + + + + + + + +B3 + +B3 + + + +A4->B3 + + + + + + + +B1->A2 + + + + + + +B2->A3 + + + + + + diff --git a/img/trpl17-02.svg b/img/trpl17-02.svg new file mode 100644 index 000000000..5c32a1a26 --- /dev/null +++ b/img/trpl17-02.svg @@ -0,0 +1,96 @@ + + + + + + + + +cluster_ColleagueB + +Task B + + +cluster_ColleagueA + +Task A + + + +B1 + +B1 + + + +B2 + +B2 + + + +B1->B2 + + + + + +B3 + +B3 + + + +B2->B3 + + + + + + + +A1 + +A1 + + + +A2 + +A2 + + + +A1->A2 + + + + + +A3 + +A3 + + + +A2->A3 + + + + + +A4 + +A4 + + + +A3->A4 + + + + + diff --git a/img/trpl17-03.svg b/img/trpl17-03.svg new file mode 100644 index 000000000..ad105a583 --- /dev/null +++ b/img/trpl17-03.svg @@ -0,0 +1,110 @@ + + + + + + + + +cluster_ColleagueB + +Task A + + +cluster_ColleagueA + +Task B + + + +A1 + +A1 + + + +A2 + +A2 + + + +A1->A2 + + + + + + +A2->A0_1:c + + + + + + +A3 + +A3 + + + +A0_1->A3 + + + + + + + +B1 + +B1 + + + +B2 + +B2 + + + +B1->B2 + + + + + +B3 + +B3 + + + +B2->B3 + + + + + +B3->A3 + + + + + +B4 + +B4 + + + +B3->B4 + + + + + diff --git a/img/trpl17-04.svg b/img/trpl17-04.svg new file mode 100644 index 000000000..fed6c3604 --- /dev/null +++ b/img/trpl17-04.svg @@ -0,0 +1,30 @@ + + + + + + + + + +fut1 + +fut1 + +0 + +1 + +   + + + +fut1:c->fut1:target + + + + + diff --git a/img/trpl17-05.svg b/img/trpl17-05.svg new file mode 100644 index 000000000..e3472baa7 --- /dev/null +++ b/img/trpl17-05.svg @@ -0,0 +1,46 @@ + + + + + + + + +%3 + + + +fut1 + + +fut1 + +? + +? + +? + + + +fut2 + +fut2 + +0 + +1 + + + + + +fut2:c->fut1:c + + + + + diff --git a/img/trpl17-06.svg b/img/trpl17-06.svg new file mode 100644 index 000000000..443bb568d --- /dev/null +++ b/img/trpl17-06.svg @@ -0,0 +1,69 @@ + + + + + + + + +cluster_box + + +cluster_box_internal + +b1 + + +cluster_deref + +pinned + + + +pinned_box + +Pin + + + + + +pin + + + + +pinned_box:c->pin + + + + +box + +fut + +0 + + + +... + +1 + + + +pin->box:target + + + + + +box:c->box:internal + + + + + diff --git a/img/trpl17-07.svg b/img/trpl17-07.svg new file mode 100644 index 000000000..712e3006f --- /dev/null +++ b/img/trpl17-07.svg @@ -0,0 +1,86 @@ + + + + + + + + +cluster_not_fut + + +cluster_boxes + + +cluster_box_1 + + +cluster_box_2_internal + +b1 + + +cluster_box_2 + + +cluster_box_2_internal + +b2 + + +cluster_target + +pinned + + + +pin + +Pin + + + + + + + +box2 + + + + +pin:c->box2 + + + + + +fut + +fut + +0 + + + +... + +1 + + + +box2->fut:target + + + + + +fut:c->fut:internal + + + + + diff --git a/img/trpl17-08.svg b/img/trpl17-08.svg new file mode 100644 index 000000000..b2275ac19 --- /dev/null +++ b/img/trpl17-08.svg @@ -0,0 +1,57 @@ + + + + + + + + +cluster_deref + +String + + + +pinned_box + +Pin + + + + + +pin + + + + +pinned_box:c->pin + + + + +fut + +5usize + +h + +e + +l + +l + +o + + + +pin->fut:target + + + + + diff --git a/img/trpl17-09.svg b/img/trpl17-09.svg new file mode 100644 index 000000000..997d9b82e --- /dev/null +++ b/img/trpl17-09.svg @@ -0,0 +1,85 @@ + + + + + + + + +cluster_both + + +cluster_deref + +String + + + +pinned_box + +Pin + + + + + +pin + + + + +pinned_box:c->pin + + + + +string1 + + +s1 + +5usize + +h + +e + +l + +l + +o + + + +string2 + +s2 + +7usize + +g + +o + +o + +d + +b + +y + +e + + + +pin->string2:target + + + + + diff --git a/img/trpl20-01.png b/img/trpl20-01.png new file mode 100644 index 0000000000000000000000000000000000000000..19e2cbc0ac4a1fc44e39f9c470e44b81dfe2f1f4 GIT binary patch literal 8491 zcmd6NS5#9`v@M`0f}kJ}sY;3TAgCbHk={XS2q1{`jtEFciWqt?A{|1nfzTx(^df

    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    前言

    +
    +

    foreword.md +
    +commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f

    +
    +

    Rust 程序设计语言的本质实际在于 赋能empowerment):无论你现在编写的是何种代码,Rust 能让你在更为广泛的编程领域走得更远,写出自信。(这一点并不显而易见)

    +

    举例来说,那些“系统层面”的工作涉及内存管理、数据表示和并发等底层细节。从传统角度来看,这是一个神秘的编程领域,只为浸润多年的极少数人所触及,也只有他们能避开那些臭名昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。

    +

    Rust 破除了这些障碍:它消除了旧的陷阱,并提供了伴你一路同行的友好、精良的工具。想要 “深入” 底层控制的程序员可以使用 Rust,无需时刻担心出现崩溃或安全漏洞,也无需因为工具链不靠谱而被迫去了解其中的细节。更妙的是,语言设计本身会自然而然地引导你编写出可靠的代码,并且运行速度和内存使用上都十分高效。

    +

    已经在从事编写底层代码的程序员可以使用 Rust 来提升信心。例如,在 Rust 中引入并行是相对低风险的操作,因为编译器会替你找到经典的错误。同时你可以自信地采取更加激进的优化,而不会意外引入崩溃或漏洞。

    +

    但 Rust 并不局限于底层系统编程。它表达力强、写起来舒适,让人能够轻松地编写出命令行应用、网络服务器等各种类型的代码——在本书中就有这两者的简单示例。使用 Rust 能让你把在一个领域中学习的技能延伸到另一个领域:你可以通过编写网页应用来学习 Rust,接着将同样的技能应用到你的 Raspberry Pi(树莓派)上。

    +

    本书全面介绍了 Rust 为用户赋予的能力。其内容平易近人,致力于帮助你提升 Rust 的知识,并且提升你作为程序员整体的理解与自信。欢迎你加入 Rust 社区,让我们准备深入学习 Rust 吧!

    +

    —— Nicholas Matsakis 和 Aaron Turon

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
  • |);g&Er`YsAqG5@$~*B4u!aq5I*l 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%0A(DDC6>L|A? z+k9zgw=q;?Zr-K5FWQ=o@fiFIST>oqJ2i0bt>9SbBTLUG_jU(J1au1XplqX>vj4qS ztKjib2jiKxib6d<`^qke{rBa&JOA^CD218hJeh?}AL@MDA<8ZNC9>Lz8W6mxX}oi| zkdkuuHtGbZkH7j*Vc+H&q=Vh8PA>r5SCi4m$mh2E z{SUsc74LhRoL8LpGvAG5IN0F9K)oxVp8LghJXbxLVAb(;&;f7c)gla$->IP3JsSpY zoY&t)Z-YvkY$xxo%o8mGju%xu>Sn;R#B85;OMv0o$oi1PuDqK^hP;Nep1tN1Y?M5l z>UVvx_Co$Uz~EYYl&j{PL(dJS(2OKbgV!Pln)J5^@GQvVQ;6`YH#HJ3l+_MlX;U1P4@dK>Fab3a`DM;F;+~Em0kdIqsk#E|z?(~InNUce zI|JB)rw+hKd#{Lra_~z=EIj53QNU=Da1}tJ&%y{ca6zu22b_i?su)-bI;6{E`8Cci zkF7$dg(Vym0qc2S<+lc0PBL<~24C&0ivvk5T;$wL@CxztS&O28{~;!Puk1V3qrvcB zXhPL!qKG%)0Wm>h#9k*5;y*3_F%}&+9gEq`0wAB|(Fg<3OCejyTRM9S00{{NftJ&; z0%FrILzlSn`1nA{!@L!Yq72*Sk2DX`V-Srj;AzDtkJ-C^Aex6b6n&WMG_&yL$Qdi# z&qujq)dT_T%mE`#Zo~k}Hm9R{SS61?=QTsu6Nb};TdvI$6_g<`XT=#Ae+NDrOsC`? zOEbub_|w|aaM+e9T**{LMlJf|oH24@YbP50R7di@1MCrd=x31wgQjpbl$wFmDrR2a zwt_`_)RdDo-ywf;KolI)@81}I7%Ab5%H_WbNH$nS<#ltL6IHwD)`*Ex{fs&6-`OrW zz%DWN=EF4N7a~~YQ$uj50J;lHnsIkZtclw2no~8_%a~y>CmO+AI*j6%)>=4#FsVbVOm`^8SMC&8; z`XfPAy%#|_wf|7CUxUatZTZzNL(vRTCa)Bj6q=%$G^w#lC~ctx6=ic_hRL$D*Bvr% z7pL&Uc%PJKOX+rG5W$ikzn+KI*6MU6=GBnayuiXPwW<;od~+99JBZ^Kj6inI z`fNxA<>5jA3rWBjw^cxwU$Cdyc#+fZC2}_a)Exs$E_Sg`m?8wW6;e2@Nw2% zy3A5)fC4_umV}I2jHl+|ln68!KM*sQox-UH3YKEg ze%G4*BBfk)XOVLNb;U0{K*foL|9Sh-a?>r;W(epAgf#per*H>CuWy`fi{1L6pc%I$ zEKb= zOh+F+Qi1(AEKEa&RWiBApIQ1wQ}V6SHk1HCdr&Lx<#_DwHqA+3dY(I}+bTp0wI~6F z-xnoTix8szfrO_1-J>1{SlJp1^rT%Hsrd*eR{}QoS2zB+XxahgP5qWR!ov4uqOQuF zyx+ShScrtB8xVWU(9WPkvYgK~Nu8~!_ELyzO|N)d3tsbJ@VmPSXhw ztml4(E61!^Ley9}y$8msNDc|`EM$^ae3EzM*&HmLIpr+|j-Sl3wEVuN_4kA&$YG!0 zXQ+0XPr`l4hV+;$F+&TGN^I;yek$YjuoI6QP^g{;RaG%q8%0K(<>0lps_>B!Kd(jF z$K6`G$dbIpgK|Aljhe`>*Zndk+gE1$^ou64Gj7cNVt-fD1!P`)_gj;_Ae4M$o0F*9 zp|)amO!KG+ z+(>DL1S8}(%ClzFrGtXI#fTGl(;lv%E|Q6T5~Qfq1{`tci0da4*FLg6Vo8yr|2YH^ zX7e(_d`9}xY4Pxs5Addnp@TD6mR)A1b|xvNQBtkq({>^(L+BmM=w2%YL(sZq&-@@3 z?{Ha(9xcn}A++61Av9koa!O3(;ty3q*CLYidZbmGJv4_V^s%O)tpt*ivY5T6aa#oJ z5^2VgYkymHBvb0HdY^vsK)y!iQr~W@`eFMani3)5Np*a#X3~^noC?SZ#B6J`lmw@s9W>3(YLxfT-lqba!}Uwo@aq1M4OOjx-&j)pJfPi>#ZQBiYY5E6r}`l&O%V@{w&^f- z394K=JDR{xxaMU_k~zKdl4VFldm<^}`2Opr1*Kx>N$QvGL< zB?X3EIeuG*&$M)OPAwjz>fO_;e=6puHALToMx}InS9*rG(#kF~_UiCF*oC?Dx~M}b z?_(2mnzA3ZnRu^Cg7VNj%@L%Dj!uoQ14O=$o4>%cuJ$@nxR-G}ReXBxFBvy$!u>87EB&75v!yJbGydR6gizadkIR*m)HOz+o*kghvG z)N(tJ%?D}Nt!#>77P;;)f`E0Ro|>g6Rf?gCeRY2%vk5}-(wN0fgL0L|O|6Tg zhy+s%6v4dIIW`~VXE1Q`R^oa%DJra&-zbY!Y4CV)$7UhN*)D+|hs{EX9(y&P@Bl6> z4HrUGG0Xfg4W1)HOR~wlr(Bzb;!DXMl8QB z;^cNI%EZnE4*Z!_@UTiM4N<=ga+@wfm!c4&y2mqn?6k%b4qRVyxYdcqszPCzhfq7~;DdxCs&6R=AIErt-<$?s=!T>(fIl1y2|kP~^NEop8lq#EcTKzAc8j#CAXL7MC5PM5nO%KI=a zGYbYNHRdySTwKEs8Yoyubp7_L?2uHllZB{MLnC?Y+ajsIPGmfkO$f1oQUK1Mj3xQw zH2C5DkxZP;@Psjojw!}T8>^i&j0y=`@W{2j(Pk@SkHLb}t=b>%2PCJqgW4_viEn_H ze*t&jI>6M>_Px-$mEI{AWmjw%?@Hdu%73ebPH}c!S1h5-b?NxZSQXwbqwjxVqXZiJ zbJppRKn@OyxkYKPFp!M;af6WE-R#aGnK`8%Xh#0=j{1a+E8S(`QNO3)z-}bJS+!mcyj=*?p8tFF;x|jjF!tlBpZUcI zz2&nvVkL^o*?>mXg{JGx#1|zScyZMa*>=@L zW+t8F+HFeOp~9oXL~B7r6hray&~=^@%9=B046tG^2KH_uj>~MO(DN$8JhoMVj9=U` zNAw!iQ0&}g9CqkPuvFyxMGn)1)g<<{%J#`3nkLzlP4TlCg{~JbZSv+LuDnTgE2o`f zX&_WXl9e_~)`|^U`}nKC?QRMgn&i#!^wH?Xq=q7~p=p*FOkLcS{?tl+zge|B3%5gYk=;`^eQVi?RTRR>;MFrx@Atn)ckFj>4dNK-$!eIt@^)X3)ooxB~8wvwp8NAciZ8&CI|0gG)1WJR@Acb z(4(XvOSxEzGE=B1DJ!t5LVTRyJG3BBE)HK{`f4;e!IfPI5n%4*co}A1c4zw<0#8@z z(EFy-t!L}wLC(tO| zlKI9T_P2jneSE@m@y@A=I()u1omultop*> zWo?~OmFn!;wa@w1`oQd!s3<*Y>#A^>)in8FPwIV{bxGTibnY%RrPg|{x#4@#psXS( zBb5nJd0u!HYkc;g?3JC3STevp{3*l$cl)vs^NtF9pu6K`Y2yW$Rs7mF zrFuHo#~nwc;-^Nu!`!7XY0(c+{`czz&38havAw3-Jv21#uuwofjz>#bo&GdZ8MhES zV$zjIO>W~Icfu47Q=96edOV@Jd7rE7fv?Gao1u-j zD#N;+Gy^l3gii>>{^T!-MUB8*b|2t3k%K3Sb2giR)uyWF?BmL_)c1o2XNV2q!nIM= zrgE0)M;)~(kJO8sOshzsv4%ykhTv@+ERr-y^^5ymVO05Ay z@Bt6^z~(&YD^t$V=kfTupDneTZTScCZ{@QZ3TMpL&G0MgDdz))3Y)Zc?Q;=Vp5Gpb86sEBE4Ao|`RCNxNDOURvrgmx=v=*CI^w^`h!|-E< z_>2$v$zI>NZzmHdnGLoTI%eN&mDp^je9ogJw(NiGr1l-HIh|x6vTF;LiP01#7T=t6 zdeEYz1U4HVGKHuCQxgzk0dJ{P#k?s`fvU7l8d*PiTa-0Jkb~rBJudQ*TFLjCA~mtWg`MjK6qVSRHHl z*rT|TKa8$rYKLaq-wR47L*MUX@X18M@beQ#w8;dUTAP>9MOXoka&07#I9yzMO8wNG zmIkdVwoM(|63!TLZ~FeE1iTjr!2{OweQ#zW_W9g(GIsQ?yQ>BWxW6dGSvrri4IyAk zG3 z(b;qIq!V(*_13KGcUo%?z#D$r$R;<+>MYu0G>;6Nq#%3W(Hcorepym-qjGPgi)a(H zHpyq4+uD@0z$K%YE6ES1WuQ%ye}P$c@Xc_&?+je^)zvM!h!B$0(;fWHx?w-QbBomRKda_}7)#x1dqkFT(6)i}Fkma^N zHq3>JrrAM%zT9-4s_B$@0KAu%MW@1>vXA(+RK?&J{>D&Ln50u?C;sW{I7hT;o$3Hg z%;?-0>?bL=V>Dm=izp88b(s>`*tifK&d2AFm}Zn-G%nDbakFELwYy5?_IlNX9O6^7 z`R!KxDSt_*Z+Ty5f%h?eM@lIQm`pzWYjCGXiKbxR*so%41Z+YWvXqu-9l1xY%P2(0T?n zj&5MLh-(L7d&iLaKmn+FM+0DBzi7QAcs=q0?nR3zc}h_wvKSOq$28^7PkP-$N-$=H z3urQ?Ja!{1=}9irho~F&gitXI{In{^cKYStuStFig7;3s%1tTLt_QKUfB)$+rAJ&- zlBNF*thh@PiG!;rhOq(F|1+NBp;kXNHwQ=Nwt_bEeXlB;_4p>%EjKSDjh)^Gv=0L= zNSR{V9>v2^H6bWrkH3|2^-Y5xDu^DIgk=o@N&)$5k+qmpKmm9KBvjY@ktUL1O-$DY zCf)A(dn=Kaa@MJRk*SPkt0ZOEi_$lEB?(%xKst9mJD)6QxjG5E{cO!KofYI}BHbOV zl856XI+Ak2G)(rz*CY}fF(|ln66Khpalyj8ruswd6yiKdrb26VM`m%y$_w-(n!$XM zgvAk`Mb9rZgFq9}UH&`~^530QA%BVU+rig23tWD!ufNtFc|)zF(Q`@7R8ibrPGW2J z6Hff}t5H?PuB+TJe9bBMQ`PLQ34hI!`Y%THU-sf=@&UUQ_Nz5RDyLf#JLbMssQ&tN zAxs5mW4(-@NNKMO%gXJJ%p^ZSJPnYx6boTZ;|bZituYcD0Db*!}@dG{bPpMp8OYHgpha)O(9!P)g3tbh>@_zYr8KrtFE!2 zHQ_NO$CfCJ{Mf)SZYo{5>Y#Y@zf$eFK$Yyp$w^q(WZDw(}x>Q zr3Cu>Js?uzNbXybsPjtfE-9`Cn3BF%^ns@k<1mN^B`ZVGCu+oa(3&CUfvWzX?Q}BJ zVrB2?3ZGf#zz#?Bq^3DqNkdX7hHCsy^Yc@&$a-arWk7!b5}n4TXfWEkyE zh>gjexE2?S3F*nTBW=tvo@m*+bJb~G>xd{Q2LeG&y(E78X$I-C&IDZhF^qRIv#(zw z&NoUcFhCo)%G%0eFNUEdzrI^fQ^@oeqAmy?^`2`5x>7{95xmefSdfM^IkR2qSL^t} zf=tMa{Sb%@kRNKCyL-4ltJuvbjCJ$lb()3mg$%UjWM^B(NE{6b^t7&CP41^^5;8`@ zbSb5Aa|s%6HYK83duQi)=PVP)_s&5;!H|(o6J5A5 z_H;Wr1+VYrRpgn_n5pbJUmD!Iebhv{wQ_r191XY{hQPjdD{BolnMcAfHHva7l`qOU zW?bVU`ka2LZ4vd{sBP}d^S1e_*-i2=t)SU0D^aNe|I9%{DYwWh0tC1#@tK2{pDO8VQ^pxYhjc|l2`w_%NXR=` z?9fyYr(Urc&Nmoa`*0?T37l)5xg3nwq@2;pB%M+uO(g4fnUMcH5#W%FweNvD8ml&M zHlkBpiP5NqOGrns1jg7Y^4-UQb$Qfi-SOO~e4_g4Wph$b4E%H|KDDBP3`;=I3**@D z3-MihmOpwH*2v&|s{=BBew|-BrZtdDdAG(wVUin(cb2r9Nw`<*H$}xT8iRPf>n`zh z;YlBJGz|P62|CgaM{ti7l8xqdH7c{9f{CKq#PNQ-xcH5?h*i-s+0;aKpnKFcXKbE~ zqa>(BS%2dhxD~@}Qq0~fq#IW@fnOuyAvfr!@)JiQ)-qsk8BQA()aa~wND=HnekZZ1 zX|=@85y3uQ(RENOe(!a60fZcQyR5q;pyZIUSv2{dC$`reV0Ik|5fX!fVaI}>vSGY9 zAo}-ioI_&bA?3xG6F-2A^)s~|ubca_ijX3JcYg4WDZ(`ciey0<1!w{5WPQo?(wLo% zkSrjtsZ=xc;v@=5WF@j!oWlRB!&XoV!jM0BSC6Ez&YVNzr=NP16 zgL_fTN3GHg{?+BD^*3Vj0@^Z_wK>y_EeD2$m5-g+fpZ(iiZ8D!V8Auz1y*8LbdyXZE)*k#q2(!tDp#Q8Y6KbN5qcHSg%elxMAdOu6=6Nl0`+|pTQH-O*;Yoh@>a`Fbv@yLDiiXo2;&zHgrdxUxOjO|+z5FHUoQf2U_2TMTCJ zF{0tD0z1}A0G^BQJekly*M%%tG=L3G?fwFDIEjW<+oP$|E;33^gjbf*+A#tx%At5B z6Sd8szR}1^X_(RHII5B$7$*nfly?Z*wk>%K`$63ajHC)XCVnkiuSG{H|MqfVw^<%} zvU>9l5rC+4{ZF7c6C2Av%Z2?{d>;Mwh-#Ia|3UUZ?h;VYSbBO*& z{u3+n-&XugjPXttPNUwB3` zl{)RGI^NFkU8j3kpI_L0Kd#>Ir@5Oye%;G;93dD?|9U@g?bw^Zvo%#;+UftlwmYuhfr=W?>%bp(wJQ|1edcu!soA!aMI`%fv@LKwwO(R`Aww0z+ z*OxFneL>kE1{xCKk@zl>du`|upDAhg0>6-MDX`RZ&2-;LYv2`^c;;ap_5bp2$%{At z3Z8bQS9iG^svVMgRc9lx*yq{xa&+188JMHsgCvWu=hwSR-1lM1u_82+X>7vEIoRFE znyHy!@qmg403~=zpK*&}8js-KjVwURd%n)Q5EAS~y`W29X9433MmMw}43;Eo0K@oZ za*mwY5VGAKQy1czOd?UDwSl%(YRwNuad~xa`X|vFr6db7YRdv;?n24(Fh_onR-wFa z3VO7ww93x9igM^hum$c&ZypP2uD(dt19B{MuTm~+N*#rK*4IUeti?e|#&4C|aE}4p z?7$kSWHfbEjkQ=B{LLoKlCj8au?W!;TpC}Av+kCNy`w3Sqf z&MK(Lt1LK5i!7OWsRr4h8sbQWh@3S*Kl;L?Ba4Dq-*T%R!{SV%eh0QQc!#-N3ADAZ{_=^YqJX$^w=ybO4Yc`g)^qyNF zMcxCX5Mrc+W#bGEek>q#(34Z3h{5q+HSn~Ptenxz$5+0TFmfHR?JWx`%>g$bbxlBa zigvSD0d@Uo?v!4SFY)X1sPXKeT2LTZo*N%kcbSJGq*ymD)*}_(hYe;x-`z%B5mZIh zdBqeCaio|N2|4rcAG8+>o858RT8Zg?wv&aQq(4EpHJzJ#F}7st*emZ>(9;h=@y%R$ z*LOjkKDn^HJ3P6luu3+{xl#H2$RwBOUUuZZzMC#W^b-x$#m1B{71^ab3kDiFbDpu* za+It(?-F8}7nCX!#)@W{@)vSb6;_|RoRgF(iQ>$EaI z0b?@h`J&Fwy6c_6LsE%jqvq^918wkT+{hw4`8?FRp?3^o2A_cji9Qj0-RG{^FW~$>;+`T1 zl5-@rr_}0aO8$91Fgu?}K2`6R;uE6V)cw3{rB$JDV+N@>=&vv+?#E-%$E=7M4|$H+ zYz9RVbp(O&`Zpe)?I%Bb%xStb*FG+Io6INCjxSkr9;Re5%i%@tC8N4Abp}9zrDX66 zdJss!cmDM1XZ%Kj2g>@g)DDgJgS{l+cvz_Mp$7GPB#DF=jl&7iKV1Ya+?`YCwL#qZ zds+FV(!k;rBO>_J4XsG-oQ)7-XAvQrxQbI4s+v!sN&-$FQnbS<>(StrNWEqC%801# zT64J+AVU}w*63heQwhp;{oG0DJOn=>3J^r-LJQg>QWI9Xh-!r(<}tk_O#5?nxTf&D zgi7hGEAE>h&e9XB-tTj0a?gB?mM9r){N-rS4-4h?>6?vCuyhwE2}mRu2r<}KItGp` z$Q!8Z^%k8k^2h2i1vg*9Q(+5VS!8SyfmX&A68Yu`-$uUe{2D?jbUG#z(|g8Jj7h|Y zU-*_v2nIUW3R~YH!Z~+Yo=S3IQ*WcN2>Lv4KIZ{%>3GMQ8@YcH#1UUnQBs_LVrFd_^{ zv{K8(qluO0GYKC3tm>*AtGruh)+{PND=zDghQ^wjc1_z3oGNIq##u8$kWV=--QqL3 z+i_Sd%0Xp`9cn#p9UEVzS5nM_2i5Dub*^ z?A4$v0_Xnd`V3$qN8(l_n$lv=g^Xq}wpCe#JePs}7!-ZWq@asM@AxS6sdr2h>Q}^3 zSFZ3PRz|(hZBgo0FdVXg;I1f@ibm6X9bR`Yx?&qAg0+oGkvt_osahUv3SNxR*pEH_dBlu(pm36_ipAf%4D;1Lf_7ad_>Zp*XNT7W2~DF#w=i}_-te+63xbP z?JbP8)}C!*y|ky~!fn0S6-~?8(5`0dnz7Ir92U80GrPs&irb?ZK2lQ>AC40lNQSp! zgOsSEnh8B#s)5ejibAV=U&(h+q~JTZ-G69Oe)D~#$vJm{R;4>$PXPD?-Whw|ihv$B zc|)tkT(kU;s!w_3qP%aRyg=|i2{$okYo7a>)28ZCxo+ zQqr0e>ut#;DnDkds%(%LG43;YssAM_`p*3txN$@!NwQ}FZ% z`K-!&IcC<1@cRC^K#-Q+jd@t48{ z1re*Q4_gqPpi=2Qh(n*hNB$JMx;S-r+OAHbtdxVmoGp^!!IEZyG2vxSiZvBB@a{Yb zsom5ChTJvA*(BF@qwVHoLe{hc8)uF)Fe(K$0-^4otzBOekvbZ4q6(ktAKHX`9f#da>BVx-7)nuxX&v%vDbRnxA zA4;Cc`)_PWyw`SJrKNYp8Spx?@4jwI2F5)bF+o}-E2Fv9=`yhoV#E|&~RX%gb4lJOk+zq5HdR%~Q`F<0#u`+G>=FCwF$peG}d{H*naX%}S*!Q(q(`+3+eqI0%Y&DW6?RgfIt(^3 z+}r!*7%4aw*0zd`$+%Rrz=Uy`zufky4oy2ROCf&J@`-j!9~l07q3uajjdgr; zYb_EqpqcM=e!;uV-SdSh{7msvHM?C4Rj{y`{3gM_zy?xY!Z#dh9#p)R?tx61rz;>n z<7Bsf&So&&ZZ(@Ntz_2H>nml%>IZtfGm#Na<%SPkwS!POr|WXy*i)+BCf;3=Q0pdg z-^PLVe^aVUTJO1*&V-ht&$s+6ux0Q~2JrFHx8BUF#^UZefQum#$kl~s!^_M-f3cYa zd(u~}_*Hc}i}OEdG}KW@PL!THQSVA&rwX{Vl(KeooHm)bva7dHoB@0DRjsgBxphBI zoy#Z;F8Jc^+@McFIr`!eF3K5H^i|-@v*VXoC^U#nbd+f*zu7uUdoNNHC7LXCPtKo@ z`1zu2oZz&{h!G(U}9wZx6nKQdZlCKU?N~*0fgr< z1E4km8zVqY!}#AV9%5u>`vX+}4#i_-{~dw%mnZ|yzW{5%QD!z#KpFuv095}D%mX|N z7<2xX8nORQDfpXEJ%GsQ_p^T=d%z+nEGYVy*n_`)4M2Xx!~uxf`|E3j0Wckq7Wf;k z|CT6m3UIIhLJ>p-L;)%$P60qnf*>OxhL2T{Q;_ZVaZbkn2;BjtjK4Rx{BzQ!znNhs zfQE;Gg_8{+zWMzGI?{y!_715iF<`QJJJb1VJtWnh1D zrT_a3|8=D^GqBLH0WwDZccuTC{pCL+3H_TH2CQ^uc4h)*WvivG*1=s&A~|Ev9+1t9ii{v+;}1)zjw;9%$EAYf%; z_#~28HE4lx;Fa2Zihgsb3BY&vDe-Hj(rT!lLq4xeg z_=CLqd+x@TKd@B+Jumh@(+X&$>#1T@l_J28fV zA2jCqVLm-*CWNjED55s|uYyOszxW89iiT^Lvyq1}CNxs_i=I-j%QBa+#CIiT9-W(jJEP1r$ zyX^khLy)9=Rq#A`C||2EuX)JCf3(%TqO)aet%m)a9rf#Y`(hzFXkL{+##UTClZbOI zZ3yoAxVf6&V@06VvPBDg50K*44df6YA#|mljriH>_!1hYyiVO z0G>NAT)lwR$7>lY@+c+x3zO;*gm>zDOuWxVtRA-9qW$UShNFzp-kT35Lr}9ieQi%* zUkE~y^$A>Oq{YHAFZ2S6wU^9x+T@iLvB!`_I?9P!Fq;8dUHh7S@IqaAT~ zd7$^L@|bS!hJY5LQ!5H`c&&ViyR6dqSCMkM;k{+4`10eCW~nvE>Jpe&&LD*I^g6_}HrDeRRRSD4_S$)c_Pg@c?rZ|w*#aKb zD=#}Eg;KK8Be+musS}ppo%S<3)F2fbgA_Z{M9TWY|Cwgu5 z?+xEjs0D>dk5{$wbs@Av^NvA$_}!|jCGqU>Ldn?GOBi4ryxja*u^98(-hT$3b7>L@7Z>@h9j!y ztFUBog|C3*Y`1~7vfc@iwk|&+@oR1#uQnd}zP-qeBD}}s))B(q+J|x&8N8egTuugz zJ5+=p_mKR!Ja8q(TAm!iTbrH!Vu$vfZH8ZkQ3+iQKFw6 zbhBr3T@Wuz4z{X2J`i?MRKt5+0qFMTv*m^DI15zmipIe_Et15VNhDo*dR~Qj`;JkmT(%ET4>fY+$2KqxkX;_ z9F%!r6->YQs8*S%t*dXQ?MOTJh_9w+Q_?|%7Sy?DHNFTD z1ZA#&m)+A!i%5}7{dpLFA2=S!^Bj(cJ0%CIME3;jR@wkgYx@(F_pHfHj@`6lh>;gz zX&ybv(%@67{;wgEHuoQlS6qhVpq-)|CJs&nJKK4?B~6pHKjPVi!sD(7&2qrR39R4< z3x^^6NEmUUMmw)E2o+fFV=`4^SG|;Dc57USN{{k3Q9u7I{9YQeR!^VjZwAZ}5R<#3 zD1@W6>WL@4niRcG2`FkpYRhYd4={5%eeoQl=rW@BnWRV-fe&sQ*Bc}}0$r`v`@yrn zqgA?mE|eElu7JK;hd@F0&C8E#--?VyVyL`TxqZ_ehXGBn?Z_0USXsD$*_o@!Bq{BKE9cbea z(kmi#%z2N|(1|%a6|PD`K|b(cE|}KGyvlZV_yvi;xz4K6rOMK!P>(Hz``^NSq)Ue4&#k8;zTqp?I0t`)zNK4F7T9tUQm|GG#x`m~vp{C?Dm?R-8XB3Ut z`h`ItfkozLA)JC_?svB(`aWSE=cGX419i1o)cfsOCe~Ef@vJBku85@MK;@6!IKs}) z^F;ass1@VrN^1UlUd(l|pAKkLF4E#Zi>6ipE?JF=kbQn?1jo=a__A$YG}XF_y!Idb z5YPiKn|=!31M%bK>|tUeAk2mCr;Wv`w}|(wm+4>nyHvZ1N8|1>O%zfS)D?8uitHwf zls}Cv&Md;_jf`HH&w~6|tUiCSfc0NEZO^^ml8$f68lE&dq5^#YF*e8_C>XRXlgGEh z9<8D1=IGOcnF&f<8Nn2XiV*k-@4> z%vRGYY|J#~CV7rJ@aQs0>vQ0(q@P6>YEG50P}H0$V;O*W2X38|r*zV1Q*rVs4n^6c z#M6F|tMjv!Sts2S8s3z7mp2f8&XQr+h(1U_jJgET$YFWp!0@Xy%XusgGU&eQniPMh zJm~YnC#lWUOl5v!zF1IykSmF8y9BUoW-BpIZM_7$gM={B?@c7qqwuoNOWz3LiSfr2 zU|$>3X~3I@efE{FI3O)U&!{$j@@8YDwvl%N`G-p%Q;aS)q;cOp&R~7+q&fXoQ3711 zf|bs%vUhLpG?y}L{wSExhiUk=>RD<+?6h7yLrSKYYDPpW8TYUp>JxCw9;@SH;68X= zUPMtb3)RxNBHNve(QJfS9v5`P(Ai;wDS8l$r~QPvzo<1fzeA*0K_tYl+Z;_IL*9{^ z2XAzZFcKoA*M$?>&cXO_{aH-I|(M&zO9=y!)!Y-NAX@n zzUlG%m^7?+-B*RP(vBc$ZTS`dX+gLCf%yR3dhmsCDYO~+w7LptaDk6%#}TCM9?(FtQn_CkC_ttJQ_Kq_WjQ)oLo7f98TYG z16TDjcOwSL>>*W+vP|w%`_HvKcG?_gVCacIL|2qQPWM2)<{Ht}S_@-dv!<<$`{4!H ztU>&IBS32%o%6}V3yU6nHtYt&#}B06@is?kO)RJDYob_^3p|gH6XT1&Q5cwt`KD>& zo{A!?75Wgz@#r$WN!XASuEzgNl^&?E=Y%9MRhojE+Vh~$LJKU9NTo7d9RD~0zTsfL zE%vHt^?aL$KbdL~A__C?yUbqpaeYTX=!p2|m2&_}|63i_pMzwa0NnKlBx7e{q2mPH zLo+e60Wc>cz;=tB5r959S^fvmr>VJ_%p{+IjUqL9nfvv42y@8dj0ll@pxedLe zgCV`48509712e6@k&8Y6nHteLIp~`^Inr4h{WC}ksKx#NKYvDszjh7)l~pDd1_l6D zV_^bJ1?TVH0V@X`BRl(lX$r(_m2Llmz=a9E0J;Jk%#8mQfXoD_56i4Ne) z_1lN-|JB)G{ij^b|32L$>z_rofBZy$1KK~<>K}tYknKMxD*t%D|A0}MS=ku>3`X7f zYY?;mq2EO`a{F((;+GO62q*$^{?DC0VMe0@1W==r0>9~s8K#LcY@FN;5dlN6)76*d z)g2Zo7_h!QM^6qBsZ;K1o$fuq9xw`gy`R>6BiQlTE1#YY2M*T~DLCkLx;D;rtlgN$ z>*ufrRPw#d)8dCJ9y4>h+f1W&2F?mfW9xa#pG$3h=ycv%IlDpZ(t$4F`o3Ved9!p$ zC}P?Xo0yEz#^Y$0OMoofdEs^Q1z#a7pwMZyepLG3o2}&N5x0-r$#6UNSJtBrB-et# z)B<|wcEZ{C9+0*B{Q8ot*f{y0yDp^2MNZ!`t^>AE1JJfu!WPATbS?;bBkhpMj6o9V zKi%vsE&1O_*09{hl!26psu%NQt8=mXQ>*7kJU$&3-G9g0%$`9(v?{1&{7rpy#VNYc zf)R;LN?8bW5%(0EZG8|-cEbf{ceNU8JD5Ym`*P5)d0}u!ae}G)$?nOcl#yu-BTCg zN#G8U5J`E@uZ4312NVgeGtvq7^Cgx4{otKm556kWcW+nB>%H#Ri7CN5OzE4cRzPRQ zQ$S!bZjH*)6&pQ75b^?V6a^U3iVNP*V8of_7_q)@*p=#C<2sk z;ki<~_b;UqQ!Cxc#sMpXcX*%1Nj5U!4jS&X6?oOcy@SVx%OU=GPNgDercsYh{Aw$f zW7@rS#>?xScN?8Rq1AT(+f^wGv&EgYmNU!;nw(0q2hx$jEB27o?_?01fN2-uc4Zdhz(x4bHNlZ)(HvW%**lmH7!UD@-PiE<_^QV)9=~o*4 ztn@7V+t5m21#>gRAZmQsYkN?8us5zcgJ1Fes_LTf5TdTY0zDurhrd7|Tw$3Qo`15i zvY%?fT0~idH5vUXcQ&R&vZ*`iB@tD}LyAH+{N&auH4cKY=gRuYW<+DWb|40-DcA$t zIVJ&W1hl9XXvhU`9RpNg_!fD1wNcBGU%8j(!XK1>pwiKpUk~v)$UNp-rh}`&x)c%b z<<*tLW@Zd|W(gmA%02_{S4f ztKl>vK53uXX5(kQ{&O*$whb_Jlgl7?#-bCY1kzy$=C-KFCKENyoTkv`HXq>$piZGD1SQZmUMl#H7 zUxvGU9-RlfqhI=-r!_D{hAU&D$7>s5Q#|}ITb0XYbu_2YIgQ7D0cnV;JE&ljPOGKB zfT{K3s#_A%1P^xO*IjwwG$K**`L zy&!MrQWOvw%;jcI{3-v8{2u2^kKt&2mibE{_Zq2aZ8L@7s%48#^Z;td1&}B#yxYI+&yq zmzrc(w0|5#sl&FdPJy?o-@H{ZprF@3>btKT6dahAo-c62y}#ykj+btb%Hh{vD#BVn zy~8`8PE#NgbpJ%>e2B~R?uzkd zrT?{a-P5Kz1_TvmrYbp21XYb8bO#Ny!%F15KMz7)7`Da$-Uva&i!G%ui)SIj_0~_Y zBmQGr%B+A}HWaZ0ZpBOlFxHqoP0orw42#1a#;avelBpJzy#%Zk z+4gY%b`6Ecm6DHTQvoWJe+M z9gny5$yr7Cb7*aE>_NgefgDR;zl&`%22k2k>Xlk9XbA&$MhQM%*$VB@%r=!Gr&Hwh z&iPFN1qqx9xdNe#PI9MEA~LyiUd6=7*trYcM_bmF*mDm`$D=q@ysu_+&W*!5 ztFH2Z2&=2iUUp@AAx!u?@M8I76z<%?D+Mdx3_Ay5)eHDK+(6Ov(8|Ub_pfXeFWVZ$$u&nt z$UFlabBqiV9o5|TYtRz}6>}D$Tv<=R5At@3#3LTnW*@v86j{yH`jh9rPXajsXBG~vrvY8k zDkiS37(q#Su_a^D>U_}ltb99AizCV<2Q4xM<^w#4e{vS8waTA`SJ>*=Omix#gEl*Z z0u}=qNrTyYN*;+@7GT>1$l-M;3^L$aOPS=2)~BE5qXf7&V`e1=rtQ>z9c@ch!SW)y zYZK=!a+F*=QVOCPe!C4wj}lxIzfk+L1qD@aHon=XjN$MhR@_o-jg6 zYzRLWkI|$pSzK1gDWGB&)q?qHXVEB-BYWObE6}!%dq4pE(rHAAi|Tf2n3eK%P;bs; zQr1-5WZAKBwL~$l)Znnam8_mkHic&S9hLYKDb7#dkM^3|GN;#pBt2*$8cMB2RQV3$ zn3AWTS>0X{NxYqfPNG{*Xxr698Hqa8QNHqOTk4NHk^PCafv&#`= zV^r6`Y+~@o3(Bz@P}4>qZ(4_H20Lk5TB80E79#hu*~9{2C7muP&(uk;y=YC{*ec&b zV=#&^it=Wf%rS*@RKm)e;P1nbj4QI-Q`SP_)a)_|b|j;8FtDT_T8LCgwLspT?n8W> zd*#*k@sdNplw)GI)T&(e_p(YuB%CLOL|DbXjDsS4^9VAysB2(qayC)sJ7k+r3-?V{ zQ*rLvQMd52%Fv0shJ%Z@zb9&p4gr@uOt@Dtru@0fq{LkIBJs4Sq9}w+7M3fkQuAp+ zwoWl0L1jX%W-86LNx;c1Wx=Ixs>^zfYZbXYN#tO!CaC%;mvSAJu-(2llz`? zdfLDo$R|cLFUJCvWk1hWQ*mOrJ7H54!sMlaR53y5>qJGQ9a57xfqk~T7?%Up$~{bX z1a?nyePsJ!yroR1bpM(oK7>yc#+_%Tv5&O8>r2D8RjPl%-W&CuUSLB?d(sD#vP~^m=mLPrC zVMN37dmeI`xZs6RZ0Z>EkXN@|otBq*^D$S%$66_~*nTsHrpVGF8tBZBi$;(t zt^5G(L<5^|R&=SVyt4{__#*W&cptV_7}f7WDQZhs-tLV*@ezQ$zRR^-f`wh|%gU^l z?vYZBJ2{_0H~82vR0aie11XAV!ekC_K^^N*E^f6YJlTb`GC0!#GXp-3(?^;3rg&|U z%nFV~h{`Q%oP4TN<@6EDVvPsHH&|VRs4IN&3>|@{!U?}ytyH;~`n5A#t)gzp=6ES@ zljD}}yLV*M)33AKqg-ci)ZCTvk+v_w*izj3CY4jS3wZD+qJC12&c!eUOHX=J=$p45 zaOjT+(h}6iC558z4-;sMq$8}FOj7$R)!l3NwB8qjY90O!(m$w_ldIT(AX2BUr&rbH{_KI?XizF|fh-NBp9auMp4&f>JN=R4n+@JYcZE~*Ej zZ@yhiuVPI{-W#*;N=?nnx4I+@3$g!%J<0kH&CUPr4le7T^Wy$TH2e3QtN)YP#lgV( zXVB~gz#nK|6zO+#_FmXfWVBZLeaQVM9%ddtPR_6W5FwyC{fBzCpDZ1>w{DG3)D=%= zGcKK%cb2n#B-E3~$464rNoNIiwrrv3`{dCCVME!sHoTtcO?%uQr$6vEy?hJcw|d+? zZ%>Hv!{BRry4yUxg=hi$6`6`b@#{rQ?swPqc51T2W>eN+2(f52~*BIGwFUF>%+u_Yy2Cf{9B| z^lyALHBSO6vxx4dKgvr3Ik#ItRd~y{OFsz2`0WgP(^xh3CR*5scUz5#L!%b%{bLGW zh9I?Fms`j8aLAu8N908;qj>Iw5>zI`H?rR3Fzv1{)-rQ;F2z_eRp5%f9dEBPYajv$ zNIyhSqYW~IO8ec6?G!7O3%9MC$!spWbWg6fyl+($U#T!pxt)zsk4(H)3ct#G{UQ<`s|ZKIP3Z zc}vTrHdYnNBd@H2x%6W+#|oaI*|1Ur90Qu@hcVdjipqP*+#xoBj=-k!%D8C5A6mr= zT73#}JsC_w?%Q-kj^^Ne5l}KwdJ8W{RjLy3)iSASuM;p7Z0<^6)>V`;*E{YR{!eAg zFT3*ig{jdPlhE;L&Jzq z&B5aF>`)(b$_z}V>iQ>ipzFEzu<7=gaD75#^uwngs-n@=d99sOX0m9#sSBjvHurqu zIT6P)zk-}jPx*I3K!DcrbFAr1XkozFPH9P$jdQ}^h_Nn_N_kp6v17D^n5JC>T==Q9 zB&!%5!SfPo2E`HB~T;G41eK zO5bJHJtMJdzaJqnvI@O0&51WHST(1U5-B2LY z&_!V_dIY8U24@qdez^%>+2s#S+jDxdiVmUvLMyZ;w&}Wwe$1toiT=VCj9P%ng&(KW z{0=8_dQ9C*#7n}X(+rGuolOVabnEU3W`mk=>4k8~H%f&K_%EWL{UJB$clVW5$7%?a zty53XR>j3w`e{P?bK8W3ol2>;-#+vGg7A8jgf=adyN(mhUypUA&9z->H*jH4D#KB= zYL650o{pxRKZ%T zI*l%{;zxLerV06a7q&z6{u<%eG?!TCaJd%YkuX;i%2&5BS_?if6^(^%oyTp~2L&4m zellYoSwDjsXjr@yM?cJlN&rqqVaoHFFG93!P0>9Lm`R4~al}j;TUU*5ver3V04a30 z*3rC-rzW%hLxL;ytwrFd{zKtDu)MFZA$sEW%d%Bq1FW{jfms~V$z-}AS}pHkL|XM# zY|0UX@yJYaLCfLUR}hTlTHYg#DM4DPv|lTiHoiJfMV%~jbDg;9?PS|TDU;ujC8;E* zvP6rRZX7F)E-kC(q5h zmUOy}eG?U)s!Uc_TbsC*07@`u z?AkMcj|+Kf=zO(@qr0^!#A550!J)nof{!6yz#7Li#nzeNZ^Vgi=7E`2sJ(xY5TZcD z{u+FeQ=Jl0D$i*Ywue<#$MjqS>qJkF(2xNcSOdE*oQislG(V~%t5p(i3NMq>NmpZddweBO4{$SyXqq~ZkK%3PZ}69~BxW?c{0 zv?+{LFW>WZ;U<0xtQC};%a<`PH?*4&1)-|srvsu?W+D1lbMx?lJ?um88;dosoN&)* zpM}M?=o5wm+9;mu>%~RWS!l1+sSEs&w1;oSI))O&kUy1EmC9dH=)jV?T5iTXaPB{< zqSaT^L7$-Un(kucKkdj=vxRVTqowwezxH)qzv0anxiDX+RDd;^T#Ix&&2|>u<)T)ZU~WJx?QBWJfukYf{gaNg`)1^5Cd|Lo_j1%RMnS* z#@+51XWKkRZ6E%&XTts-5YDy{-e;(voEuAMdS0Xgk~0*lbKD$Ls)6y=gr0W;No17} z@gNHi{E7tKE)42NuAF)Mch2%V1?k)JX^vQ$AY+7%pDwi@Ft1mH>$ml0uqny zk_ZKG6+YRk5g%vf$%DG1Sn;lQb?5B5u+ys`xbooJvM_lojb@B{iZ!wp+zyd;aPh1z z?uX|y?4@*u-HDY)xBw0Qsxv#?_6p(`kiUuy2vA&(mhll0Y5(&J95;y3tG2@&G?tGAvvhdkxECFLDB6t~ z>dF@l2%Ath7ENW+aM62R+p|%7@(hqR0vRlWtl2K0r~?5@Z@7afL8bE2@GED1AyV3) zNk5Wu)1COL2oZ4)gBWHOMK0^Ml`II|( zStwSvjgk&FW$4usxSVTYiN;lel7tp21QPXp;}hhXY61Yy#xi3XC@>aue3f!bm@s^) z5W69wgTv0Y&H-^b2*$LtJQ*-_(S?hSuNYHTr)^64Dx3I(?-Ypv{y?Iihp+}49c6xT z^b7)3!s9h;Zk3zY^>mfCQ6)p>@wEJZ?7dZNWL<)8X{IzYGeer0nVFfH*=c6B(`=_H z&CG0vnVn{4W@e`GU(JfvH)4&Rt=^EI-#r8_!0o3#QFf2E{Xw1dV6jDSK#k-Hw~-k zPJt&`wHHTv;MP{>*m0&%(=JxICZP>aK&TRYOZJ>5CW1?bRn`Qe-)dv6jq8#jzD98X1@GT|*wmFe`W_Eur`W%W9p zQ3bM&I~`%L&lKCV&hS*_*0!p%yez0NA#00-6W1OAac5g~v0hr5+E>^+V0f7{ISq~m z>MB{5dU@_5m&+2=p5s9k-tw7<4+bXSsMhTf8Gb<})RN`JO~0qHK23?g%56x|5-cW5 z2h#++$QBf2%bN^;_1WKk+Uh!|*|qyH+5dA|0{DUN1bU>eCJR(_5Nm~dJ-GShT zTZoc5JF&u0QJ)t~K3W9|>r)Ub59ICrYdUZpMu7lFO6aA{VbItP7me=tY#cR2eqR+2 z+%Mv-o#Dptl73bgCH@W8uQDTElJ6*1&U?Ss#)YgHt=in8el%8lJ5uJqlk%R%ks(J1 zyR5doD41x)ZCmMUz~DN1(IjP_!M6K)QsAr^VHUb4FtL)SbZ1=O;}bDf%7Qz>o3WfM z1bQ^bo47Vos+sA8#JRTelapJw`;?(1&acUFbv#?FN;5G^u{y|T!O`)pGS_Q$Fzt}( z8UXsv;KKemZb=3lJ>D=qIzZr<3P)*MV@RwJ<5aR0(we1OvsM|L{5~)cdPW20qOylB z@YdJ9pQ^edkNd@(uS(m4^1?g?2IEvF@YZtR-&jVB?jvsurhrR*G8hxDi2MDb&MEwM zs3w<)m=)odu{tC)1Blz!Q=r+1;=?gleYrUSl1@9$C5Ka^eX>7}>u#L~`WRO?aMZzZ z&O`oMZIw;s!Z*WMtalG{Z!;(^;J2Uq`wC1kn>?me!hY^kwW?KSj>^g36q10zRup9;Cn#pG*8?>w*ZYku@+4Mc@->!TOxd6Eu$4`Z|9AJ}U@ zS6IkIj}fe6*o#SlJ=ZsB;S29thtw?}GXK_(zn8(tR&!Jrt6o2!GEJsLZ+yW4YRo#a zjdffp-lyAuZq$_S9Bw^+Flk_i{#CC|AY!V04OFQ|$M?9aqOg|AtOViqJCzA=Yj5}G z*D$pxJ^G@_{y+8lu9WrUJQ!ISf~L*2d47y~0jJ;V zOC+Ca__;9_bmNxBQRLGlzFF8lJaZvztUK^FZv-?#{#E~C1^;zr_m`QoOw3<}V*h50f$2XmhW}e-WMTipNd6KVzhuTQ z74bg-hJOYdzK&pJXa9PalbwN$^-Eb~6Z`@hzSIg~j{nddzmNtY!7smsQ&^DW3x4?0 z3coUkn7^hKWh|0Dcg z^c%MSiInmWr@&2LJyd{-+^k{hNgHpA62weJk~UrK(~OtKaffrTC8&+~1218NRZGza%g*OB)wcr>}b(Ll;vKQ)7D*)4#kf zXBQ_^Lt7Y+%yZpiJKQ0pk1qLI8KaEoOh@;7JO!|nAqX`@$WSn_nqz`^SZ*j%&|EyQ zAFtl5?vr<8cd)4`cu+HX^~ydf>WkN^_evMwAMb)YBi5Q81aBYXfOYdtt=sp$%};>e z?XKLJpZ9IwMLo%R;ab;=o%_2L1r9X@jD6*t7aj~v#Y&fF^Xto-9#lYBg?_28>V0{Y z{`dg~nGWnWE) ztMBUT8b4FdacD&zS^0MZDFahxG?l9&mri-B&P}%iuhiV^pKuV*SRl+Al%B5Kis3rh z3!Z6gRqjQlXY{6J7QG3pVG?*6o8P0-nqeo-0pufqm%*mV3uNpwA5VZa_xbloz4E-p z^Ne+Vx6OM@BJfXhqWA0V*Tur%f9yFlif-Pxfh+^pxb)c$qoI6=W3mr);?e@-@(kQO zDBs#r5ai>{UWyuaZY2Ibs-P%X&n(fh$X0$93!)3zRW}^MYXLb^*;C?0<>f@}$BX=_ zF4t|eP2}R{2!e$4bk2g#Dd_TR3D`p+7kqQ%G^1X|?d0p^NC<%?_3^};m}P025{#Rn zO0Op!NtvIB+d8|qLw^S6KWA27Qb1~-QigL2`e4#xoC!%q9)06eJKO1t+^^JVXV5|u zq%?0^txf{wi!#c;;I<6I<%+K%CL)FOx)hIR=Y3B-E*{ z*Zf=MV#WzJhC)(N$ob75OrM!wi2~LI?OKNdlA1Dhhoh3IC`3ZJDhhn^mwW9KvL0?Q zTSdViOr?UdA%$%mvKpQVi?{RB56e6x*%J*DIG3h)Y}Kmfc!D+*?Av_l#2QF5tH(+8 zzvrEX)+7&(Ix4L^p3?b?eXICU!!;2Ow>h>}drw(U1!@ zyl?2qEfRVea@o<_tQk?AiMq|#6;i7qZ0D-f%}1lDjd{qe406Ud$e=$`)}uJ_$q0=L^{ByG2;)xu&NTl*xtWRcG*%hrhdyo=BY-?5_5xfq^Py2 zqmYK@H!8{>jZd^mFMq6oINVaQ5(bGjjd5mGLrM$_#XI^2k*5t9PLNBq%n=6{qv{Y- zN4pSF@wP_DLV+dxQ5#mZ@=u~JnCrDu00ql+M?P=>XLkjX<{2s8E1I?erlL}&cWSk4 zVUes3enw=KIgp&y^2dFkFWO&JL!<=lj7udLd#hd^>v}TSmABZ{e?zu;qx1~m5*jmR z1`Y^m;htV8{>F*}op6Yf%e7oo#lTss0Z!EuP*r0Lw-;3sG5LHfzrI2$EmeyNTK7u+ zy1w`0Pt8fNE;+;i*>6=YBQ5&sq0u3P&`aS_jhO#ePsLXG!}>H zc2Nj-flPIdMEp3=n!O4wtzJ?Jk89Py2MsA!eqH*ArnzHsr>C9|iuOH`&nO(2bS4W~ z9CBH(J_{o)Js$y_9iSh{>Xy}DOj;VnWi!pCGuzV+2PdF2r_284+9~x8BY`(cPmnfK|b6NN5q~$30V@R)qNQze!t&{hJJrWyfNpv#Dc|tmJ z_r7z%U>VGhAC4d-{CUQz2=k*)3*;6#b1&Fn}Jc-cRrN_JvzDs*!Y z3A@&=cp|A|Td2$YX~R>h(4=N`4Qvhz*IrxiJz8^E(v<=bcZ$=svLc2XzS68=>l3Es zIl$ZwskR#BZ#Z9F(ZSJq83Xmuws9JyhDfo_!Ga38u%c~JS|c&%jJMI13RK&Ht*-~5 zBe-ibb{KvjRkIsKEITbZ@s*Pa#ut>Rzpl@Dd_xibk#IihbkIO>A8FcK$DpxTgK68x zp`D`3!vbopUYZ$aqyTF;g`I=ka4{l3;ji3^m`QkGv+s6+4D?;j=7}j zNb}~x820?~+GF0w>v0e~v&QniN<4_eF`>_=$K?B@>Q2_htI7}-x!Hq7>+u4|be}Sw zxrEF88*$}L4(B@b)^%dlU6|3w=aA8d+-UQPO~)6a6T9V?wD^ka#HU#A=b7nUYT?(} zeJP@OeH{E?uO6X-^^?Xlq1+k0`b08J}qG+M!CCY@x134)Dm=ZuD-DBn{OjqMMfO|58h zja-D+vKm8bEKW3gq4XNj5rwRE}d;jUMM^i((rA_;`|ygs&i& zQQh?mx78upMl1GH_AT*U$`?CI3g;W~m`^u50dSFQJm0;ai-4lBb6l-A2VzCR&xegM z!C|~#I5ZAvUEb#Qbc<2MFJ(0KTb54uqD!Qv!3o5o2UsVKBkoz>?}D`ygVyD&l!xH) z3)yb9K&kDxOLOtZtz7^!b-_!?7NW{le0AY-f{P^b6Mb;WR z$8hCGG9TCU781+v-eyFV+YjYZmy4@MX_DVAJ1J1LmSdBh1--guQKAwR{D&}1>pWko zo@6>t*bFJq%!AwRdj{FmDU>hrY#M}zQ6;b)`e5CxViB0qt~9BeJZ!YmKDFpsdq_G{ zW-S^PROfvV#Eo;4f|?+|+Pc?7`ID^nH$Yu)aM+4CjDx_FuidT{BZi?^jBPqXv0!D9 ziV_J45^w}Eqb+N`8~N~HJ+Czibd(%LoRgjNEIQF>qklL-SU)GenO6LbAy)^L=BN}V zl2wvKNA#>Z*w42u>L5RHRqU;Uv~uYJ%*Nl=%487hkr+Bc1m0laT5tNZqX)dPkom>EV2UrC}r^KRYH;pe@t50aqh(w zI+Iw2V|AH`wY;6DH_-P7f2l>raA}((Grs7FDO0h!bska}$i2HS;HgkhpUH^$lbT6e z{OIqD-0v*KQ)&%{%J?-a5KD7~^~VlxjALhDh7bbfq;PD`laU&6TrGzYs!=PZ1ygw= zvFq;wG#9pYGu>Pu_g3p_^C%aZyN)sg>7xXsZSPefeJd*jo6ze1s^-W-{GkcxI4Il6 z?k6!prPxMa-*BrtLHISD+V4r)kyo*9@!T>@r9*uboU5Irzq2p?U1rjn1D8hq7jLMR zeq&o%kb<=3fmL8TYiJ^*aGqovAPw#7c=GEMA> zR(#=S!=}1Vlc(q4vE`?J-2!W?Gj3*!GX3ts*CDje;zP$_ueic(mjxr4uaG@ z{Z$=39B9yiO!(qC^K?RghTtei!hn4$6e4qW=Tn#kt?5;tqd<*L0`3nnh7d66w*^fL8A6CMiAS;NeIJ!)Ib<)y?nWPGICroh|&#pXjCE9T6 z_5Q%+)x3)d7lFHeikF)TRk6R~1V$YxXb{-G-ghVcxhFmq!#7SHQ`&wu-^U=yNO1xVdm?Z&`i5 z|8joZB$IV$S9-Ui%;m`f)QltuYx;os`&OPLVl|o!AKxMDG93re@9cV}q7K?-(qJ>_ zYGp$a07w&wi4JnVewGBee>Zx~O4M@>sX8t}CbA(STZS=wBvx-Yo4zVEAA2(9oz_$t z5A9wwF2FIn17o7Jl`JMo!eUC~EK81nTdr;UIFUm~bRg^qGArq2`}URSjt8u=(v)h) z#D`ay&&Tq*1#d_M^bBVn0~Q=wRVjZ{Fmi(~`i- z2Nme?b~Z$*&?o&x_{Q%Qr1{Myq-lahDvBAU8~Q_80^+B-x8^JNZ0{ewtCoq8(dkxh z`&=Jgv0Zs;6CaQlLjJ)2V%wSZUnao)`vfVr|DGWAU%;`yed<5AVEzt{v9K}yx3)5L zR%5?X+kG~xF)6~4Md4-9FT16>$0lqLUnTt!K_|!s3IryC=m-<^ZXP)YI_olgaK<%a zJL1edivdxoJEh74M)mV@JDa~zI|CJogE8IgecPW;^e22jKYo9%cRV|gxD#x&1D;Q^ z-K5U-IyyMp+Z1DxQi(Z=$0kI!3uXc8{2OoQ2nb42-YPx?FD0k>r9U5zH{Gi{J2^Xq zw%ZguTyzdvLl(ss%M0c}_brN23dyO>Lw>3F%MUFczZ$>zs_QDY(LM6J8uIEk`56$l zjlRX8D2e1JxwFMYez_78=Sf$J5XEi$PcUG1u-IlX3s2X5F|{prBUfa`uCBRgmXnw% z*7U2CNvbA^-p(^rxmk0Di)f{pRrWTgXL7mS8`T7MZ4k{ArqwFTFVZ{|L{Ob(zAINb4z*QwUwY9b; z;Wfkt!DAw|c(|`Z1;LR8LTPc>fvXtO(|Q7h>E5MD^fT&;6CP`Fp)R!#i=aU>156B& z=s7Mp=ie8p zq@e?PiL*WNawCabNRAP9uTu~6U3Os(6mE56d^HIy9V#Ze>}^Odf4pkPXIHT@lUi*#f0~*b$Giw$`^Wc0mMXCblA+1f*#4ko+0hn}3d?n&X zRUsFJ0>@iC?Eyn=$mEA5SF{onOvYFV^`Y$Gl3)r6dEYLm)5fTZu7yNsl56%fDc)*P z$U&$Nyt_;!EG)V)YM;;D_}lR&uv+r`!Jq4pSiB#?z zS&F(arI#c9RFaB=WBl;;E^-QQy^oy!6D+_bsI5IWcOKj!JZNzmKJF8v?5I5S4aj1o zou-lxFK$RHYhvX})St!rhVQm>x0KHIZm6ErA$~ip7}oatb}KfR?&#RfNG3Wwie~cw z!64DOAXPU$IXi_pBRO05&b_aN z_y(%pVTqb=_ytqh;Q_V2&F^wpx*HwsZ${LPOpF0eVsWv9wzof=V{g`NL<#~?rL1xI z+3Dk_ducTKn@Z3vIjKNP={B;3@yuCyJ}6LD(s$*1Pn_#NM+-0xK&MP!G{WzPN!ZKK zWS=zkPl68dH3~EXfZ>V_bo)2k^7a|3gcAkq)X^+YTbgonT5AuS{GbAr`*bp=Vr?z^n1A*;^jbjP;p++n8tZM;FflWQa7$s*1?5_N#0MLI$le5W*BlWwD+ zdQ>Y5*J~}rM=Ij(t5bUnuRvl%5BAd%@xKLc4c{{6Cf_v4u~Ut0`lQiV{Pvr zorfmlW|)MC=Q+GU&H`N0BI}tWvIS-{l?%@WVQe)(-qqZVGJhvlEiXaWdcpO{k~Fu> zGNLn}@d6ilO6ENClwkNHe={5)ihZ-Mq=v=Jzijet{BvEHZC8_A_(^(7^PZQuq>0I6 z`%#@nM+P2+U_v~xYmfDC+|EL7{gyML0f3TNY+$`a3b>qYaMg9s1Jvo)S+o}?k0?zk95lh|xndvkNECL_yOjWgGjy|!fy6cu=)-3d)>MM%REszsihn)OS8~)GA*+yP-$~kqmrdMWtFkTOP~AI z>@qJ9RrvY-2|BRFr|Lq&bl0>-8@+SXz%niVuvD*{Tn6(3PAl5$QpJpPuHwVbWe zZHI7*{8H!0W=l-52Plw*aNW7efVhg~j#KuT^`Esf%zX+4)=(ziB>&R{;8Rc3Z(t zr?^Tl<>1(9pS2`^7~XnpoBo-Rxv5hSl#=zZg_xyVn*8v!ZH_CLkk&ZDNcdn&FMotp z7%J1?i=R8A_yx=|Y2ZH(>UFt-a5FZDOHC~9Fa^s5(ByiKtkwu^oT-8TCj(FB8m(GbO2-X8a3e+4x$nM|$BU9ggmc*qb&Rc4YepEkUPj3|vrp_MrT z6@wH@L(o~&W*@VE9_)M zpAkM*W&G0PjWRmDTT#DP{(OxJ!lSS+0eqll#S?SBM>ptrIKn$1-!VTpJCVmV_iE$r zKn7FTFL;Fpy#N(YG@G4HR=g+F?$vYsGxrt&bO~wk-dqyEA-a@O)7I-9c-PD4SWhWsZ zEls>#8C9nc0wcbX8tU>j^2zu<-)E(k5m3naebqMFWq}J^GNzvvPEC=sYwo2!(hvQM z3Zp)(AmyQVDE&&K@&SSq%Km;o=(Q2WtsyIW3=<2Bpu!nw*0%5X{V4Vg2jNdCqS?k4 zIk8w@y&OtLxTBHRamq%LqnAEET(T~ob?-Wr{CfJf_`F)(}lJZCUb>COcLTHsuhk|=f>xRD|uI9)|w*%qAQe$Q??kdj&&V!MHE&wt`38Y z23zxi-Xlh+CE^7@KJ?&}ilNq&W};TS^af9qmJq2Y$F=5fjWoa|Zj9rzn&(z#$CY4C z=B9}0%};*WiwK0SIC%W0D}L`l{Pep>3J?1Hh~7TNk1qiaDxU8GujQX#j|$F`slDcX zzmA4=+hUs*K%uGJxMc<;UT+fv*vy(jDq^n=9_?w*1}XV|1Qc4RS9i|Sbv z=Omt!k{pg73zBF6r0G$t6`8@+!m_!chbYr2NVX04G#<9YLbTq3WxC<1liuZny|0#h zc!jsC1@!*Y_m|)!1qU1VjIGvcpfItI%)D(I;)}1+4jqXPjIR?VlCKQ7W7KUQMK?1` zf2>f^c589Wtg(t4p6M9a5J0E{{St0HS=H_(>C|@&?VzG^ROLKbl9lWcpHPg|nA{3u zJy*Td#vZ1tbhQDFng`vY)FrYr5vs?@2V)gb%(Lte0AjWCKVI@U>cvrpmy_D>=c} zmDkOX`Td3n>mv#Uf`aF~uIgXGa|$KJ7RcXR2V+V2{DAUyfC+ZqV7>HP?|4a_?&A5l z?HYfT=U)CYiB>P>wQYdX!w>+gVR*ROnpByLIoSIl@uBHq`tE+8ZuEtF2rlMl6LVRr z?hEuE(>!lA06&ARB%ljf{~uIW7d8-C1!h1H-#TRAkfPD4qkvYkHyej0&##;N@N)1k z{J0E2bsqFRh~%34;^`%}(fnE4bkUYeLaSK`D^e%AkEL7s;M^i1i_nlhpIVgDFRfL! zQ)XORrrD3HOQx#2#zzGPrDvNi>A7+%`wqa63eU1n0X(`!9zps9?moYZqi(=d;JJLd zULP;|fZz!G`~*bAQ_38Bv#O(P(%dp1Oy(^`?T{r>;i$KPGHs{dPiA-NFSYV8 z;tjiM|)ow4|73!eqn8q<{sy=h6DrZ;zR{ z!EaI-#?*5$Ti{9l9wI{TD$N82f|{Fn)s+5b5WJwKR5pLwIURwQ%++F!d&V!`V9{l zAlYOv>Ayx4q9LvE!r;4Ow+ z)RP&GZPtJpPOJ#H#+|aSKEw73d>Mk@J+V=EdF*x`dMqbW{bWqlH`?;!2{k*cn7H6^ z<3jW5gpy{3(X7GUVZVKd>;Z-t25w>1GsSqiR}q=SFuMaJ63jxNBeEyKKc!wn;M5=? zK!4qYQO!e`p(g!9hh{~y3peQnQ;g+R0!Y&+ILv(Ur`$OH6Rawivv+r3H_q`qc3Bsn zMbjFX%>5OnbfjFS3cQ|XXgEwMt&Fv8=p}{B04H`s!GnIWwu8k2_1E^xnf$pvY9jc> z3E~H@IzUcD@u4fEPoKi*E&OoY({%}auavBYANG4A@e1DWED2Bx`r$S~ifXcUN80;) z*&ilnngeh{5n;@tQAwWd>YMZ&c^lq1r_K3#<#O%*Erc9ZML0C0yKTjVJy)%2v5U4*EwM$CHIfMnOjFHT4NM;%#o_@XHGvp5+i|=kA%Gx- z5N_y%U;8QGr|-Pg)9>*j5P=Wf5`s^Iu%Wg7Zfn_atW7aR!=uv{GRdL6hkq<-whDI} zo-FqFreg!PY~d^Na3OQy4j}HB0-f7z>aGt{Ohfu2N<&qAz_xg7P#pOhWv-cU)01eQ zE-VHqxNRsGh>G-s*Xy2EutlCOGO7~0xE#2tamOVPyE*j73(TgeCA$o1VQeO%HQ z5l!k|Yd|?0`Wr^+98z$F*u7rP%L*EGA(}OY$QzGx<;Ta3O$b+G!j?vqeZa1nNVagy zH>L|?OiityQofxV(Ewbffivo{lM{fIv@>x<9kJP;+|+NI>Qr6wbs)|1r~{R^gHpK@ zoYm0Mg%itd+!L}?`NveL9X1emW&-?>plt^ER`II9niDF(`ngb-&rSzqncUUr%_<3v zU1n5v@g55$19S=L>GI}Te2_S&kBWk}FE3FNSijL$-6p;9PuhTQRK0oiz?>JdVl`W= z?}(=FG#F&qbiE9dhEw3x)UUM6D&vrUEB08kLb_)usW;A7tK(^p*GsNzM z>NFTM#(X_)5z3pFQr;o$&_&h26kIaTqPt9^?z-siO>}Pjxa0;)8ZZ9FTlLZ${N1fp zs?CiowS13fKLkt*m`ehH6^h67>qSAYu~jEy^y@}`cwdNAFd<+3Z_j92bdt46l2qjH z7of;wlMHEL_7iBItBy+y5XU#@c7nm8-;Kn{fL-v)@f(qOY<5$}JYe&C6(t+AETzcX zVR7b_CV$UhiY;ggjuMCV)@J~meBAf7UYRNklI73*;(mD58Qht$b{Ve=iSZvAoSG%t zvpr*2Bzk>ub9ICnlAV!~AI|Kn<}D3X!4So)k%Wj;SdmC<|J4)g6ImqZhs9yv9h^oHmVNwWUoP zqr|l*m)pVxZX0lL0jkI{h3k2xZcfUq-mh5jX0E#H3dwjM0DoGR}_+Dl!-AN<(tXB+==3i;1Q`M;aZWcw>fQ0f183i;3RgMXhwva@skx2{&` zN;|K${H3|4>EL>u8w7~$surq>l4zDLQK*+bAn(Vy{>cb(FDHJj`}E~^kboy3gyu6D z1t`}^z=c`V1YA@T0IgclU*EEa1eueyBYa(@NL_#YY&Qof2?NV>B?~kViRZQ2@S{REzeF#e|xFw zB_}3M@JDgf!@MX(g9_7)ZsJ^STkXZI3p5zcZ@!BYIe84zpfVemSKr63^{_z!O03U; zTuSi7N4=+uv0>hVp^O~7=7WB@OzBpl^>}8V^ilKsJyvcO(!kWSnRhGqgaUa4{!bOk zl$>3il@8Pa0t>p3D09ni2U>U@f)hBVGrS7V1uk>p7{wo+ZEG_I=zrp6k$rxd%z+0S zO5Z$FFL&2FEC5U}_(`=5LZxdNinZxawKunmOEED$BiS*qXNz`4rKvu#5I)oVzbYc@ zwZ2Qe&ktyPHaeCn*#C~eCWkur&QJU%$qt5fo4PB1pjvDQQ=D+(&qi? zF&7ZWB+|p+|3)ME0aS$w8>!Pj88$Uu-9{J0j@vX@@lA_BNx8TQ1$lcnBN91>yF zU~e#|r@vRL9*j9HlVQ#(lB%n7AUsoSXT3%k$Zy8_ST}oK<}?=xpDiP?p-2$n#%!i? zv%haO9~X(DU0AcbGP?2%Y{x@;II11wBzRS3)(8VS;vU)?iO#e-v`NV`8*_)U9^xYv zi>0?w38`Z#agE=8_ZJ(psyq_(_!={K*^!|TVZ-;8@AZN!Upvx+>f=an-y_<)TSkTl zBM^tDQgMd6uL5id6pLv&B@^w^m?KFY;}c`dt=NGxa7QIoC9p~TQ5=?=uCdRFHXL3lU<58gNfz=bi_tvu6_3!jc?x&;=5eet@! zO*i0Ao)vjR(Rulpgu*JF>MRST2r`w&?nhM>+G};nL78e`;z-e;TtYgdcR_Aiu^SY( z3UB>b)U*}~{oZ|S%5$bnc%wVSU(r#}PzdV8>2lU3)f>bLeT?S$xzs+)IG8ji;lZ%= z>S4Toc&sGjk;%u3j9(m8C#cHSh9~2}!UUP!I1|1aPY-lc6F}A#j z#KD}fXFK7wDD zRiH?o_qmU$#5y2s_vetfGLBSZko!=28v~`I^cEtoG`D}4{izmg?F(WS3o*vI4iXOB zgIZgmyA472hhk{jeeT^i<{_W9XCJm?qt)O(_Xn1=l8zRq^)+%*| zf`0;c+DAD2knxp!?J<#9v+2zXdDW|IH@$EsXBPDvq8-hZwSG(<7F7Z+ZR0H{2D4pF z1e38alo4JF^M-GoAX?FUqWTfSfjrn4smU00ax^n&;3$U?om@59KaKi?0B-s>M|duIvuI|-i} zPOrA@t(#iv{$ZDlo>udop$o*FP3Gnm<`yQgNckm0>yZSThX<-&Kap83)We{m^H!hc z(s$JOOBbK!ps^pZ=n3w$ZTpdF43}rH!)2#h2w+fHaDi-hJ62aiTQ?@=vIp-sE=MS{7nYizv!DBA#927lVtxrNR)IZL@Gmy$kh*2IUZ^&iVfs;O> zE!yzDN;^teuk`L%v^tKA4xv>yuMRKl?6~IF-COzYxGUiH_+Qh$t0NBmst(`Zc?wsE zrSQKoandkrLL6cI@h5qt6zy(bh?Cr~`heaN0mih3ICvhpHD%oyc*GT)6mT!Ep&G)5 z952)yT%hV88O^n@Af;~j>@+|+`iFt$k7UYy;7I~Msr}V!TNQgy1> zm0Z*1;;~dB&SH9=2L0spnUwN18i9D!i41V8#Ow>T@|7>zvM5@NM3@Gp^nGN0hb4)d zcuPFkbfk00YhHz)N=jAae&C+#R~}iOlp-FcL~__l8~Lv}phr3AlHr;A@ua=P!~85!y0u!+rFJ7Rr($yQ(;>nC`ILTHlLH~gVbi38SjnvtP!aYtf);Y-0EyWdMZF7<2uHB8CjO!Nll%UZ{NpFEf0KYi z-#OlHvSCgUawm_h$`TuzS{?Gf;|4AGD_rxh3 zX?xsOq|Q_IF)od2JZ{^%C$R=8vpWe~LJ3$XuL!4bJP&6Ldc@__w^#2o$PAPEjP?9@ z3_&pMS!UjG^;&#=wDQnP%#Zib-2tf$jnlJ>zT$fJ&$*MKSHCy&$L(9JRiBTm+vN$`?8t~yPyH2%F-}t1+`TzCX>wHvifp$k^cO2a-Cf#*!OeY9etXqy+ASN*rr*cKtkh`_71J6F%Snc*Y<`V*Lf|R_d0P*Q+_Ls_&Ui_WDBv~81P@;qQ zi(4P0Ikue6anrNIB&!fZJNx_N2(#@(`r;d-)tHCGua{(+!SUPUe&g zk=pGifNkb-YryAV7mu|5VCh|yb!qa%iL_<%WaoEFy-A0ltr(XFOV0eSsnP#+vrSdRAMZ;O`lBjM}gBD5bT`X5X#41HuuEbx=%_cBa6U0F6gx5#8B z5xi{ETgxdiPk(wJ-9js**aJDw#p)hFA+JaJBaa7O=`W4Yi(MR<(M6LZbPX~rIFgZC zUq5zxCt#R`L2YqBX|Rt8lHrM$WTd$@_NQ*bd}R`=L`wkJqp~e$zM)s`GHbrVPBT%# zI4kGRL=^{k9|PSH&dcHOir#-xS739_aoZjJ;TJGQ{o^UERC*&s6@-w}>{b{oR(L$@_-9u(zAouAD{Zl5F#1PuZILZRC9sM?PeCOgdF5zSS)m`=#(xH z>L#oS^$c9KzHtRI=p2bDuAnD5Vka>OSgCJCSTi*C-TA9Ox`Bs4t!6!HrX$cdvBuOS zJ}=>nMa&O^KTNDv6@pS(NgV8gOauxGMBxl@KsIX}w-zuV^w_Sd#|Ueb(h0uS++dq* zh2hn%8&HT8nVXmv3iVo&kT7Ysbe2`ZsFB&bQ|qg1ShcV@WF&CL12sNIud!|{w#X%9 z-_>e;C+qR**@;c~<9(%H&&`dSXX=o()B2wflvk1e;AQyd-; z9swNPi!1KAew^Zlyw|mN{M)tx&i`LZ(c@r7R8B9>!UrakWyV z^RYYjBQ0cm`$Yl7r09zIoLU?cR0G9KPGOmvkSs;x!qYd?3@oEYM)VuZjE}R+HF#Z5 zu8(U|#eAS)lnA-}Br42P^a{_z^PDKP5*S;Rd>DzQ{nd&0SLBY+mJEvk9-QCUNkXVt zKCbFlsBNJnYVZN=9PQXFugrLrWGH(q(IE&XLx{f(9y!zj#$YxU$|0J?n=~OjOK> z7;SA0H8IwL0meVxS$u7Mgsr#wnRnkTWC|3woE7 z)zmqet4fMWewl_nyUKD+6$>`n3FX-Z*pSmDV3C$D4`w#yY#eWtB&Fjnv<6bO3H#bl zT*OT+RxWlHC>1Z(&!+7cVzL34C*?f#=iJRaE+gZ)mrn&y%37My?%LupfAcj0(zzfu zH;Ljb{Q`@Urm_*#=79bC=reT$8s7!)xz&7ch(Knj{A#B(YDdL55Jx(Prep9|L!PG}Bqa|mDwo^> zcGhfQ0rd?*Yx`0S`IrdXZe%{o1Ovg8HUc}M0+Lc}xS$#Od!*@aJsejW-pDcG;8PHJ z6w{h4z;7vq=p_w#F+}_#O^u3P zpw))O9U&GsJlNv$(_zFYR^$vF3m3hI48%OMj}c2!GqbH$>xdefC(>me0YCAzm7Aq3 z^*e7e;M9j>mS_X)FT}8jr?-#wdgrFXCi(#yGo(i!?N?uq=JZO7QR2;Xr*h2Hj8tR9 zw*X2<5y1sCZ8&(Mpxu0{k~n)G%;rucH|sZIA8;!rLULfLG2-6VNoboUdLAt zcG%cb!s7aDR{eyK1GREg5VOE$(`P%;j$FH1$}HzsuZapio<|wwr`J%vmFv)D<#W%_ z!#vnc$3R2zn#k}|qiuNg?l%dDTI24E)5*8)>qovY^^eYtzE5lVR})Q$?xk`l&AjSCMccS1 zt4mytOpTydHXKP;JG#nSw5F~bO5J#3>6d@k0Sz(5ANQv}PTpl$t=rFNPW@(OInnL_ zr)muAF5i6)-NFmpi~_RV8)8QS3&kmFIrBP-#ikEraH_c0UP0^6 zA#T9ZIBhW|(9&Mb2_(LxZuj1)280_g&;Z?j#{p!Q7_wtfs%gd(Vcnyhu%1LDurtm)dn9w0JoAJd;^)C!Vd#)gh$}mWl54xwa@;4vGz_;f<@W3 zZP>PLE5o*J+qP}nwr$&XWFW(~9XIQ|Q}4EFtv>49c7FE$-d}6?ImYVKi5X^ca;xz@ zD_#+4JNn!(mM@kw#8sQKgNk~LH0X|u^b2XXb86}ah(xY0ry_NdszC7GPFK>r5mP1u zsPViFAN(R8+5FI`3hqXPeA<<2Q1*kxRY~-zqHwbte|Vk}k{ZvD41&xKvSp6aV+p}6 zww0qwIA(t|gLYOmGt#(#jqxZ3Vi>*fRU7PET%Qkf>POb!$g{^16-GU2*TmKp4fo=f ziM89zJY4?Pq9mACHqTypE3?}sd3v*R0uqcIkN^T zV6F1q>+V*W)vW#sm+4nXV6mu18a#vYVj`vK3|SIQ4X~;6c`((<$H>MRVGJihP19D# zGBS%Bb4iL7Ag33DL)v;w4JS6JifVl;O+I=9^D4~Y1W=b?YU_x414zSzTMWPTYALPS zwsEE{8~BHjnu{$mpLPX>Ti(LEKnzzGEkXIIwJ{nZ9R{K+rbHO6ARuMVw~UgP`0d=!J}aMCm`$kr9_agC=sy6St_RIq zT-bl9!88GZ3a~f7R;I8hwvp0!FEo~A*9CBKH0SE-*t_aH1-&X9B9&w|Y3@3eLY$m3 z*$zwkpti{j5a=j;AOk*O;S7~ttxXl(uKZr|Fniz9>w~0^3#&j}a6uxE9MiX4S*2T- zu7ia$(OUDyJa;3ykENS3d3q70kr`E&u?&=}MjY~@h!tTFt0=;VkpOA?q}L@w;l%MA zvw7Eo!qfDy7kFmyBvG?EFKdP`CL}ned<};=E zYd;Mq8=v`{(+Q;u!N!9zif!}mnR%t8YR9x|ELTH={dhcxySzRd!~Ze!{k+rpsJo}` zm?x@#WdALhZk$g%vZlsJ4X39dZ}9^f6gWQjZ$b0l$&~&VyGH*{K4jK^O|Sk5nvBf< zS=UHgD+!eg)%Q=I;gCWwaH#Q-?yoS%P)wA{W;n?dcw2m&M;v?rsofF3o3viCv*NB7 z6R>&8^x11?Gg2!Pouq0stysT4w03sVbf+DgKfQmrzq%Iq{607RTJ893UZ0mX;j_x< z&8dfQ5!@d267?Tn^$v+${(!D-`gOq~uojCPmCirm}l+vo$`9OehxWZ&DG~%zUXAF9w*HurU6=7Z z#)}9xpL#$a3IV+vEFK$8s#6N}R?n-r8p;ss9#EgS_cF=J?H{#b8;#Z&XKWq`I6506Ue`=A9!u5XeJnppTF& z4-FhY(#lXsWa9;fdT$7*ljyx@%d@D+WC9(NCu`i97Lw4E8V>m44?{@>OOqnp5A@Zx zt#t0LWNJs7G>=Sd!vsYIJOW3Sq^8dc3D*{ofL2b`G9^$$R>=|wX&@Os2iY4fo?D5Z z2wkkYHBe@+^sFPm!md1Re!^6VI4t9@sFpS-S`lZm<9Q6~W~gyE0$T1Hi+M}mPA~*{ z_4+n42&3)=am83kiQ3C}g*^do@?!I5E&&HIJ=HROO5n+YCH1)}a)$~V-}&kqs>Evg ztR|77P1}%(nGyX6L+ev@J;#;guc!^CTf7`>zSK>g-`UYsc}wYuKyvcNvMU0s^4%be z$|*im38W^AVtK(y8_{W?J*0|5bOwhcMT7}iekC9SE=eV?vjJKW9GcUwei$jRU#!ES zERZVk3)gBldKW~SKS&+3896%yeHVfqmS+s)iiqX=Hu^y0Kzlc%C|rn14g)#3pEg+A zM@*kNs4uG7z(iIVZqJ|+SMh@^3({`u!)9XNC$A!taFTv_<~1obWBy?ckx>a^cRMyHe}1GOC*>$9eSdG}i{ox} z-L8Tg(2IzobvA(-zCee?qaGSV0z*^p;OJ z3Vlr6z`()Gj*_Ooe924xB1CmgmLQ$sD$%3e^c^C)lmIE%&hBLoVwx1l7$th{kvYw8pnL|{)jG(d_HcW8h_WXz0s!VpH-LZGI zC;JImwtu4O`@$f*8WE+A$a4|Gie=TJ;6!J_nQ;hn8m;|qHm&=C^u~LF{zz&SaZnUP zqHda(>57N=N##RmELALOK09#RDfWbN52cChG8~<=b4@$)ftT9&pd<9Kd1x$B9HX@5 z$Wd3DSP&{`MJB|=Gu_0dA3s3OeHWdsCtLG|qoX1m2+b%Y6@uGzTyK*~7Qg^h(@@2} z_u>t6kiUM5vLr)IcB~^tP(MFEmrF1eis3mirEq{6fJX*~qCP5G>>fj|1Hh;aXBAB| z2Z9u&L=c*jtd_RF-18@(D+l&wr{jn1=DW`IY>fsZFP{4$YBD+7?ZB`G89c@|`ssZ% zdsze8Rb83oW_!hF5EEG4sX%zWsuiuP(9K~%N81@4{Y!3G1jws<6twMuj;S*$y0>TC zyzLuf?Hs_&Cs{ddF$q*6w?9?PV~rzt`wmbM?w+LqL?8|t{qc2g9Zml-b*MXZ-`3LB)ICEY?9VQJ`#IKJdG{uL?=P(`oKlwkisqvsXa zk=P15!0DVu+n&J`0tZ@zzqJ9#3kc?$M_w76q4Lkgw}|P>i(>>@^}b!XVh;gz5vW;j_DU&QcA70i3+21`CeClT)vqJ3-kwi2U^H8SdX z#FGV`AKzsO3-jO17CMduIa?gR^`0>;r7|qEO%d?WI_YwG(dNT4e8Gl>Ep-Tz1ly2Fhg3?myG~B_Om>?1whI}}PGZA={QdoGRof!Xmqu&ptKLR7N zoa>hsi)Zz>u^#~&^PLBnMJJ;dtB^WEL|3~_nH^ASho|I4Vs@z=HI8MCs7u^0N;c44 zPtiPrVX;=!&BZNLN?or`KW}n{-`}zCU@S!eN=>Ryvlp)=;3gg3AVVkgMExBlB61)V zvj#~oh*89FE_lE@COVo7gSfZozU#z=sj2}_5FD`ZWT9oxY&a>vkK6uo-zcMA#0tn% zOgVrcuz)GO>9l;{(`Xb~$*w0Yl_Jvzek3Z1t2+M)yN+-+IO-c-6WdA%9jr!}GYC0( zKUhe!A{mMHS=GH=Xc~n+No5H-z$YkL0q%o_v`iNWKPNIy$OZo%-G+H>^Xyr@mih_m zt|hD_&$OSbr;(j6oQJ}2j~h`ABH){s5V=i`9W zgAI8aTqMk-?r$?lq~{PE#od%=za+=IX1|q}f$4eueC!aJ-UrXZ&kwWBeQUEH%GD9! z=Htvn?UO~0vvQ7<#_nyCT8?T}zX zQ|wi|WBR-ib~;L=Kq3-LT#p6KJpbaPU?u)t9+*k;I<@yaX7BNLK@$gdneulb(11Y< zU-efkLhHz}Q+=69+fTA8-Z^_n1)+#M`u`7v2YlDJ~!GFOv_h7}Kw8@J?@!KcH#?Qa51%k=(j zwgy<#N!K}Z44?J<2>d^+T(MZC9m~r?N6Ky$TWNsTlRT4u{#=^48TPe~%9H><>6NWv z4~)NS-@&H9Sk(+|{M!5L?g?&~#?Am^?Lf^x%-`sN@onu*8B15{bB`@VCS9-G7@hp4 z^l=!(;Ra>jQY&p_Ln&mMhY7gonU6H%8!#>$E}@&_G%=6#CgdzL+O*}pmt%1;MJ6Xg zcyNgE!7*EOw~gKH|1{su0k=1V-<{jL_q4S~mgz`4nID5=yB281{(;t$8Ox+bR;QCD zhR23)?(@T0D)ti|Lb~$<3~5ZO`nQ<$?}VuTiL}`D9q< zr%0>0sl2V9yl!0?H5|XbPzS)5fjG@}J$>M-)qR^jzQFr^y}W;oq3Zd0{}?=33Rw}Z zzWk}Fy;duz^UoO8&45Gv}KfmO(mSwRG7?c$^6!>gKye@-swYX7qU5M{pMGa&pJH$-l0 zf1HA_dTOcqs#)V;N1Oh%g}LAdDL1cQ!oW~dJRFCwDtXXBhKff?djYPKbR7$I^&3Am z{cwj}r^U{Wsx-vOy(P$8=0kVQ#1HzmP>-*=llLR58+@`z_D|h+?>ik)(C(fef$&hO z=ySZ6 zDAQHKpquZ)Cqf3CpXgp~qh0sY?yl2mJ*B>LS$1_`p z3~`<-bm;)>}8nj@Xya7 z0ljkaNopgYYXtsae{KVj%qPJSK&tTsAUTXoQ>cQD1+<3z!E1|c>P+bXnqTAs#nc+$g=pPN_-Dp0(Xryx70^72q7eWDFD+Jlqyyp#V`_**>@FN`kA*Zs_<;g`lY4!2d9_z6mqt`O#LB1+O$hKs5tr(Nce^IOqVeUb z(4hc*=Zpt#y=pYX>nzZ0LHGtqKLML#uWLD{&E?Rl!VP&@0n0@DtpZAGRhBM|@>mjU zQ&8P}Lf_Uf@WtRXTe2AK9r^pox-G8j{Yy``*nYX-#BxB9MD37E(B@@&l)7=x-qnwmBQ?ls+ts zKeJROg|@mT0Lm+OWe|0g!XLZE?44xPm>2^JD7xT(%>Zjp>)Vh6E-%E9HCK z@AX7VC{8e=N^g?RTJvxSX1TvTc9ivIdd}*^3*bo@uAfbqf-jim*Pa$OOBRS73Pkgl zNSJ<^7flF?7E3XSM+_=;AehK_^_cm~MJ5~%BB`_nU>Se8sCHsX5P4=4MKt#(1R=Wl zVI!6k-v8bPvXqyg#R2YN$Xnm zlD35^{JUsk9w}f9;?2dHL&`tdNc?v4u6E1}0@wiTOpv)Y8_o$kq@Q1a$IYL{M4u)x zrFvirfJYXFf}|K;$tk=nJD?#4&WgDvHW(>Tu>ceoY0Xq0rRS%Adp6W3X<1#LnB29^ijJkTL*n2UeguOB zPmu*KnNwPaK43n7uoLn-x0ys25N4#Uq;K%Zyb%T)vg2PWdTX_ziT6oK^qp4u0~dwe z$-v~JN%7;cWh(TP^Nz%Yu|TK9|Nqlc>H>G~lxF&NEriz)d*Ng?OrI?3-ToVa?I0_J zn>^iLT8gfxKKgH3B3d9LDh+wk*!XUpA7%pY49DaMxwVbs6Qct??yO~i1l!*?}E;8V6S9Yo9sju*^kv90s?o~nil*3MS#bRLO#yuvXcThhZf1;eHH zV3fd;aNVy+9_BB*=vyK?%WSSf2)+WHRZ$4_S2cNMYDC*1JTFOJ;hcCo9lc*U?wBx# zoW@){0=@aB;>47#Ly(gA7KwkI#97{Ul=BW%K@5Geg2z^nPXBbuePms?bPpCLfV$~M zGILYn3})cF`@Y~fsY>=n>+m|LZLOdDrXsU&ku}$ty~q!nA)|w`j5dKd-_cWRSs>U# z(HFuAr4D4{VAJVYE=vmfIFl@ySo}iW6Rg77{)jXvpQ3xMWKFSR3wm^stIj6iBX>?l z|6DgHJlIw_$St8kXln9@N;)KBB1Q7M387#xop7qG1T&3kvDCC@9P8Q)G$CRuYzGJv z&F$|f?kr=wX;qD2PTv*Nb`d}obIvCNMgd2Ooa#x$7!)6^^KF8LAW*UTGrf4M5tQbY z;dU1&x+j}LU7unTXOx^NFEMEEZ&@fVREXQC*+~dit?I3^+C@pLM;=QGu5}kG&|=SF zn}RMMaw5v`iUJ5RbX=)LpT5ph=v-K57=M^Uc|B1!QV{uy5H}l(@ae6&2w09Q@r;8l zXjwijc`7#{p_2ezssivW7YKC1dbOYZ#c}8ca zgl*|S;~LDzbe!v#g3U#h4Gp}*2kufT#@zdwnh^yI`~X(|B35E7vU03BqU73U^)L!Z zAAWLVdmGvJZhOu&A%BGWC!@Fb5)g&GMDL@`>=Qbdl6^u^@MOan5tes{F;TAi>ot_| zHc!_nv!=5+Vy^bLU)O;bh6RS9%MJ%Vgh`b;>o9r=jrJ=ZoTOvvX*33g8~;(>DCPi? zpvkI^BRj}_rLGf=tZ0}}`t!)QbNIEY3wQ7t;nRtbGn)rUirBVqATm)e&!8-Eu6-+> z{oa`y9Gxyx#uoRw(XR{sNaU;0lqR`I3jBA5))x!!HM$Zyi)xR?Fxq3bNO8k>>;`={ zfYUIRqO!$zJx_)$qe+{q%W*<<)fzB*1?LAsvvf|gau=Ta6a2(v8eu2X4Nh_(dYXG^ z#?fGOjxH5=TYWuGIsa}e!T%!V{3C1n zpHt4iCRG1TIV?=n&+4*#TSWAl&g!oi? zpv!Vw>ApDL?tb4qo>^mqxBI8Bz4h*R`yak`|7z`1Qa0hn(#0kS`@1h4?=OztZ{;7s zN~;$=86zHTSA70(Uo!%Q6<3F-)fxmY7Bg;BJBA0^@0&aNySR%?f80+|+3>I)gcnuu zUa>vTe!h$@7|ZU9r*y%H(HmbVG=^^wVf+T&*oGj? zsT`!@fWn?yGgz4TffIeJYKGEF!1Q6YL6?f#P1Si{Xz9Ig@Xv35{I7zc<#;?rmBo$L zDX_mA#E3(;4w?pC&~JNd`0N%Q_XOno&1%vE?{x8iJYbBx!iUt_Wk0|P;Wfqa?#(GI z3MKM;*{Ug5LfJm3e14Qn)DmhhA^5bW$#M9RriB2&^EqyHk_t#?Qtyyo-(eYCwg zlJuRC_%B-bK6vIWbYdh+xs`CM=`V$3WU$k30z{o%=1##i;X@U2g{mOFYMISR4V%fX z{irlc98+-j{c+~cTm!G){O~!{@kn_2{6qR@xV%}x#zTd}!(vH~RM*j2j)k~#rJ0oPVK>H^afS_Rmz{39$PF6nwsjW2uwxIMIU7pXFe-o*Kqm18Lf@B z0q;DQ-j5nfdno@sua%1ke`lJvb8;AY7!s>w*$P+-z|EIh(@suvXm=@23!0{x2tFfH zZ_m4?RWVmoAw0I{eMHZZrAP$K%z;5IVf(zD^{2t?z*|hA=?2;A;_0-8hSr>u24<4! ziHp%rm!}Q4mW3C)Soq@44)a_esQBHfnNw~92S`ZbnIi_| zeSt~HO|M01QQ&PBTeSH*8vku7?{#So6JDE$tVWKNY#TA=SZ%`TEeA;cK^VJ9Rth4sCAl39Y(f|29qDtP$Xm{XoEtE_{PTQbtB322hKNN^s(q`JGvV~gX4hdKG0Z%7`h%U9@~N5+1ydw zp1cTrgiPe>qS}xvIvAP0wcRYrz(!?ubFu0$Qm3av+h8rhSvy#crf@2zIE2tUYaZZuFLG z#Z!Egb+YCdvIMy55n6Km2{Fxtd0XIdye$nNj6ndklRj-q2C1`0unx0YloedP(r#MD z24`^YxFtxBVJqC5AgDTXsLyyPA+tZJ(@{T3v47v}W8{%IROae5N4}>NFZJvG*2;wX92mszrZcho$g26`*!`S0b>Z{fP07DtW^$ zOyL8_Wq@8Ul_RbJdXfxE2UK?Rs$!L1Go!$;2$E^8@uLXRI2{S8F;qeyKca8 z(SDYoL`XSL>`R(<|)D5*I;5w}+&I+*u(ZLYMOn>%YR9^Jvuo_~DX&)&IpQN~37 zp(bbh>3*vXgV}$y5*BW1Bc2dYPp<;NMcH48RkxG#^hnW_Avqo5-^ozus&Q(0_NnCq zO`~9!b1dy!tFe*u@MK*6=q|=CuOnD)nweZShLGHw|bEV3bnS&(b$%QT{nJ33EjR~0=EnK@d zjY#?_Rg~cE*&410wu{%%Dl9y)iRW&Ua@Wg+(wxm*#fVe{rKkzD)( zUj-D^N;VNPFHl8zYSZHvia5fEMz49Fi>X_TN7rz~;$O9?+mF8+o3Vj>K`|-S zH@X(mr!gS#P{hKrh&J3o;ziM)0CF}zN>!Jpjf}i!;AvdW* zw@R3!1CW)Z>=l8ts6g^uF);|>7?v{e(j|*!H;RVewOv1JPYSW|?pfuY3 zD^6+ZQ>XE-HgwsF4mm%cEby<^t^kW0=%!0Yt5UBwh4!V0)3)`S&38U zCRfuq+{P=UjB3pCyIGI4)_`tOOsNdI70E|ZUa1Ssu+6=sD(9Og-GniC_o0C)0Gr>j)VOv1uRpzhtWgKJLaPF{IKq(FN?*q5`t9J0_3vQq~ zW$-km&8Q^N9e$0g7Kxa%ri4%|hk=ALJUKU6^pJq~l_&LL*~ER;8hqT#a;Yo0?1aIN z7iN1)(Nrt$UW#J*F%}M+#!Tuo=TYWj!Za7k8?l&+nuviOUf>#tDbYoDVWtSUUP@e2 zCaUpN$d>Bvt|mX)d-G%OSRqbM@eIqW2NsAr5=%CrAq~c*UPXoz%KXiY@_-!r367t# z$qnZ5g3&+({w)|)PNs6?j79y7MGqlUhgs&trHPT(cMj9&_@c(tC8vpmil*@Gj?qpM z4-vtnjG%p=5P3i5c6+(i?5M!s3eP%vl(F0G$&Se*%7c;6_O{HE4gi76p!ck-+4)+# zp~TJ(o*NC=m5|ibyu(q|yDD$wC0p)XO35 zQ|yU8=fBWXD2jIyy-9MU8V3!^nP$O$%QU`1qWx_eamv`oIs)XH;9w5L6c9!ns`i_y zFt_N1|5nV!?%R68;&YgfYVBKRp~ZINIEXj>H1`6_yaf}oi@u#&qF$A;GxL50HBpKl zHu>4d;bcT+n;*ZAiA*V;rK6oIhrXP8Dglp3VJZ-}$y;zY+^$qa>KIoZ3tKEstjD2$ zOJaW)w&~}>H(P@Bqr|0f03r=W4wRMs!gd_U0SZh}f}qJUoaA18GVJ}aobLVR`dUmc-sm4s3UhE#we$JdTVwjTNpbTi>;fYX*9s>>gkOREimE0k=51fGMmbyVEwWvdT z5JYndd_+xkB5aOIeQ2(JQo6h>%+=+Ds85EaRIOB1W4a!oksGvMVNEej<6ty48^j6` zo>oDs>%CZU>v^wL`}1_(rR%e1QbhTS1nWiD=Gf(Izth=4r?Z_-M>~z~J1&(jlq_l^ z8Ad|Mv~f|#?Lz{&W}8%?9V6W!M3~U!Ldn%&%uq!2sqN5LqmvMf2yg0(Ey&?GtR$sZjU37Tj;$O7r zLRm#}n%PZWO^NbSW;nJ>2-=pBQA8vJ*Pfb2+DU``uI6SJIJWNu$?7hwvXkW5Q4d#N zJ+h{;=TvO91~~9$CbH@tSbr1K$8_$I1CF8-zB>!{MQal0PO1TS2sx@unb;~cPi9JH zx3p(rt1jX< zX0e++RAt!^MT4Fzs{G-xL30&(mVs)jZ&U4k{coo!km!Z>Em2AVcJzK!#?gA0x9cC% zl7-R>i{$)RXa6b_`k9);tK$4o6PD26u!4AI2obEHDMPuNV<@I8qoR9Ml6E52-|8Bt zz+jpi!V))f$`}#?PlUhpRqY!T3!vx#v7l9le?RiBbtRpVNm6-n295uM^a@3WIvdPI zibbj*C=-#txynWo0VBom^;IoEiU~>ddC9LAgdeJH)LGT*hI5eCwWwNMh9>bnj=&h) zfjb}TZ$0?wRhtxF`vuaGO2DT`Pd~HZy@`yML5NtRnN?fueNDd5E+KHR>0X|5fVN>4W9}Fu8EBar7-FM6CLt=i0gquwQZ9~=`0G1) zUq4UM%585g(y@m{39?SxDrsJ1<#7=%+&; z#cpzB>isTAdpE4=>%J$oFYH<&d)OXEFHK{Lw|7)-R4JN&2GszSZ`2M1C(r2ig14?D z4!tyNIF2Madrd>>21}sFZOM?A-ZR6WW64YayJiBvz%U#SKSPNxmypdd$Giw4AvH!1 z=~*!vgN2VsValRzC{O^n2gIN)lL>TQ{OnqT5CvcFoKt9h$p<&cZ7!bno^HIxk$zlf zr;ne>x5aNDZVhwud$Yi=f!d{?gz1+DpCKL1E!~wOw;Le85a}C}eE@rZ@KCWYk6KsP0BEvm3stw

    U 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%0A#y$blo)dY2b@r-f9+)ee!!;{up3*RmqR?YPc z5cK7zl;4wKiJL*S(SRfx5JG%o=nH#C!9l@4!1z`44PAf5v3tD6yBKi=BNM>qNQgol z<<4@-p(_5{*fe{SEDV%i6rPiw{^&PL6;&`fVl?d1a~+4b}~jf7AuR!YmCH?!21f;5VmQuTGGL)gf)stDZOEi zlLxGZ7y>FRzkScV{h!Ize3zbtX}MllQammuas~&9JTz9Zi0Fp#V7rsD8Vwk1{fEG z)%y5m4zPAT&CT~`4T>r;fcBNHb;d0g#~j5G&9r_@uoP&`kIGV5b&Qd`Sg(~%y`!oI zDHsLL>dv&27Z~YFSPj07c3B~4`g~8CL;qn6CP$?Ud*ADToAb;VxqoE`}+$>S(t$ol*20kHty5o)L1;4_?Bov7u-V zhN-G|Ij7Br!eUD^%F0^=<`(LhGIBaR9a;iPS7IBV$wiu+KNO>H$FpGP2Zz+-je#;O zd(43iGy_>i5K8I5FldwBZir;hIzqf6EcZc9`eAWg!Fw>f~+#)8ja|%<)pmO z1!U9e&w&j318ZjAbLPT2yc%CfbJ;VeGZeR)*+RjLh0^HM_OXekmDs6m7g=@%WmVC7 zRAXY19PGLVk@J1PLJC1qn#M+;$iVzK*P2h^0p#-UaQ%{ zNlT~__bJo5UEjNG{h_Kx5jweh1KSrgJQwejg1 z>+;5PD5)b$6f=Nw5G|Rz{QDq48sGq#VKgmlcOo#$C5&%*)W0q(oZD^R;!kz*MRkiw z*3QC^13vlrhewg1)Gf6VC~^mC!+bCSMrH77WojylFLS7P1IcA&2ZJ;UZ;n#VRfZtq zU2+q+1$(haiFe3)EO%yCWRS8~4l)Dtn2n{$?y-g(ccKUZ70=c9(7X$8 zZKj<47TdQlrjy`q3PXR={X;#wBWI@fRJ=4E8l8dOglkdza6UbYm|TrzjsatzKWJph zgDRf~OG^TOwCbr^mXB4)O?S8U^>tYkp{67stD5XtjAY@Nt=K9tt0gwoI!)ZnlXx&d zaOGfyswB=2>_|TxDp+R!mtB@cQk>?}%x^mpQqs^hQu5~_|89Osnj_6qodTx~qwR{; z0~7~y<$%Eb^M0_WPJ)7llNn~_P~`X<_MmjY$1n4Dx&=OaI&(TNuZEKkx*{!Q9YMm- zxih2JhC!T+u$A$6L~XHO&%9Lc4twM*?&Q8xY>+(eJA_&YP4XPqsBICa%+bwoFh?6~HxiQt(~cD#@$nTnb*7PSw!~sbA4E%vtJORropRP8Ke8gs8k<*% z3-#rYx2N~lSHoq}SII7d7(q~UYPD@a0DvQneMrv|$s@^ZSEXmSGncNYo{%}CTo`8C z^_%%){J}M+pFIa&w@vW4fALVq%=A~!bpK-yH30g*q0|4ht?J)T&HnMK|74Y7V5k3= zTA>S6C8E{^5jv-;uAvN}*c2D6QHWg6F)7xgAHi`%e*w!O#ls=(Zrv$1W$FJmMypS$ zDZ+nvKK+V%{2H2VF?Qx2a15f9HQ~e4dEQ;V_f>r=Sa;zRzurF1?F^_=9-e+|?6`Ps z>ndk+xJ@VGTB zVpy5=?%?V@NDV&Mv~&i7e0d@D`b_BJO~7O!-k9R9!A#tPfn_iTM_vF4OX{yc;Di8$ zl{E`i&EnVN%trL_M{uNhX1HgIX^s>;;vU3&D+c0_+B9E9#F^8<=I9 zDZzI2B{Cr?uSklbPQ1*+Jpy{7Sa<2j}U|Knbrii+j(GRZ+<_E&h8pwu3 zwZK{tB@>#6i+{)_{uP(zZ5wP4ohJ?*P%mT-c;eUr+Br1^}Fw z2ZtIGf=sEXoXJpcoiS2ngY^%6CHN199aLFRR zRM`T|wWgpg_$#BI^e4PhUfOt@T_Y`3k&D$(yHuq@zK;H&Axp;(LH8vyM2vfeR@u-m zRILWS8OC5IOo`!`=A#T{I4N?iu7>D3@M#9K0W2hT3wMn5GAfjN@I-0N+ zMG`W{P=mfqarIpB8#z=!mk#R!U)KH-ERmd)!?}}1Pf}y@fmweN&jd|#DoMwO17*tR zj?!DNn4c7pdM!`anmE6O6x_1`{7+T9M4~kX@7YX!kGhV&H8sgv&!G=pV|3poe_VCg z?oqI5{xUXI1fc|PZe97;tE)yk0trhoWi5XWRA=Ldatge3`6%_FZfTdO0Enr9PqPzd z5{P@hKr06Xss_I7!0Tqeab`UkAkH6UJ2{!c08@uJu|rc`?w%+cd7E^3J%S(S?!9dk zHyBwchji9ZRmx18GV>Ix9M8=c4o!t6px~Q9`&LoW`(_~I<-gZyyvDua?A1a6d5}*B zq95V*H7su1VuTji%rNcBQ#Ci58_y3SrLDZmpbvsfp`Nf&32~HYUPYLDb(*J_E2m5zDBt{eoBvL3j%JGz(-Y8Z)}fEEO02%I=i{4 z=<}8iN}=9^d69QVa_DB3M?_{EqmBi~&m{xy>ZM*ZUNqtc@trM$f^edU=4#{YTv4qx z7v>_IO4p=G!;qNPT2hnE*VxhkGUUBI%izTmi*A)Q=!!1c=u&UBbF(o%T+r#)k9aN3 zlYW0?n=Kl?As{6v#i>S_(2tjD9DtQo^=Yal|4*Nm`RjQLr*FY?3vy?ny{pKYiYnpM zP+aO9awWX99TJBk!(cz)%is<}JAL=!C^qt|eYR+q5{u_dK3YW+g@jGQI@WF|D^z0X zv>tZHv598DiCz%i1-d>mquMiVRbzFcFkpPkS&u=VET#$|_7wCCH)otoI3M;l_G_8U zLoa6*>#rK&UIFY0n-O+fPG7UC+ZJpkPvQ%2PpLQlixs3-go^{BK@R^g6LdW0Oy^a} z$Xqf=gtNB~oQG&GoH{{$(rF7Ivs}~uDMr5?3hZc>=^-Lr`*V=R%ZC#;yJa>#a`GAy z2YC}t%cZxEhkWj`u~wA{LnYn-zs5s$qAwfVOz2S>1cao9vQ1m_#4nEh?xM6xkXtQ? z3U|t`8REGUg=vJvj^C*!w0B&3Dy>&`@Qh-S)Y#t2Ad!e@fd+>zsm)U@HR8WB^Q8_Z zNu0MLcqaV4-GUo$&5AtAX+ouI;{0(d9+bjLQEu83OLy!%a$B@4XMMh5>2@40_ftuv zR*6>{mY~q)w>{XwvI@FARw<4VHe~4eH#Hi->(aWgc38)0t^S13Ksp$vRlC|b)3}gI zcKvpMp=@qw;if(A%;W}^x4sSMaKE=P;hup=ZKhVM`E}xqqN2%NC5iOfFGAtswXR5J znMsUw;8>4PC&~{H7RG<49zSIFrSc(jkHo+W>EaSm|CUH93pvkN8$P20>QGnf*-#T_WP)2bA#a$_)8dfoOzq)|@RNu-KsZ|vb7ftYD zC}%2Ch~LDrnottbb-}UW%>!S?o&z3)sUC;TjJ(v!)u7SU*0IVG?aC_&hedV@fo6!R znz+<6KG88a?~`$auW+sNAlw60TCV5MVcbZc$W}6CR3g4lH>pb#j=LFR--S$fJ<=i; z9iEJSI&{OE)pt4hRAH9Z$XOi1X0P}HC3^wMcc~8j)wY89uOd_a2e%dfnp^un zZY%!ws{g#L_~HWo6$f^MYRi`xhcNL(MM`fW7Fbf+iH(3pz>f3N>4y%}nh%LU(^_i2g zwkT&hy3>AlHy5uZ?sZ$-gA%C88upZBHoMpR>z&Ib<1R$RkCt`CmNPrn1FNi0Pq*h6 zE0^wlH~rgVgUKRktxGFX0|^kPQ$z|82?Jy7I`eN?m)3I+Sq|^X>MBupo|JJD7VJFT zi1xZRvhqUhL|752(g*sp}t(P=*N^?fnUxry{hP zDdybQi;#c4&R(B3PuB3@q_HzgBF;M6RvO;Xy;=QcILxx>5|k3ho7=}!xL|Tc*Iya5 z%i|^B)tODlbMvi6;E}lL8O@L<-0`~3*^xbt`sMqU7_XA98S>Up;_*7)_s)S2Ph1Cw z*?EkE?|M>$0uVDHoN6Px(fUox4%KeBrY*t7Fy3!$K4b7Ld@I-s zOyTLZJ8ou};#Ew&luVO1Mu^Ob*yy>S6Gfc*j`|UchMO2zdku24_U?(Xx33^Wb1&B8 z_lF!oT*TlNSb1=;T6L(1(^(}W^9*xwvIXv4-WLuF0uRZ}mQTk#b1TnLiW8awSHF;5>m z$b^$si|)~H?xvKJQwXy`IGQkTVl#&Ysm~#@f!O|*mB;iUCQ1F!#YNn&0K@7c*6(7# zSe6u4f_7)Gl|f5)i+&L)M^p^HzpW+$)Ig(8zP~N(48$m#hRm{y&lRd0hJrZ2C0t6` zGV{24VH6DEN>CyQFlyr}!%&HaxhsP_p~%xBQfpE#hoKy$XTvs>+7e?A#uNpL zWsZU+ZK9kcRp?O2kcPamp8&QD)2YQ6(w?n1^`K|Kint6QDhhpUd%9$fqQjksk%?XR zlS+k zC1e5>cKt{doJ@X33Olq`y@$sooChl(2hOl*9)Fo?@E|?v2o;u~xte`fJ;x`(dR@Gy z#qdRAcpOkTYC2;m3l)1H-yyWo*xO3Em>W2jBglr7)yDYaDLoS z<%;CtF>Bd67sFgIy!W zB1j+UY@K@fM~g<+)WD$$1)E%Gx6NJt9(g~IbvSOMe`+=NH7WLRPZ&hwd0Gz9^Rx6q zi3rRcP>sx?n24bdw&*Gz)suGSl_LGQ=EzHh`)Wu_yn2|v@_`Kjk&sggFLEjd`@#bz zrVTv-nCdb&#ERpaKZ-BXa*Khm_IGLjjT_a-{slf--^)PowB)LJU_aQ%nbQ=$G^M1{ zaaVmN<$8%CVLKj@H}vhyTaJj7&u;{rUIo{c=l!iz_!Wwxo@~`gm<=xW_f+sMVt(DM zPM12G(|LGYr}06&g-K0Inx(2AAkM2Emw$0vX9Rqqm;d$_`mY7Q{Tm7R3)W=*;t~N& zU$JkjU%_{*46L;D?Eh!@=3irG|NrD)1{xzr2S+l>4RYv;5no0oZAo83A8-?*HP-9IVYvt!eG-|8gaNMGO9yxab#W z3}6BSKo;RAVE_vQ2Q}OXWZn`#_c(+0}rnWvD zo>l^!n8Cn|O(6hD%KfC%rc?+!bv0mS0wp42p z`(P~kAIv|dIPH6|7iJuO=mi0>>5lXjf|a2MVz*iYPUIl zH5nnQFNL`6?M@==&V8BVMHRnuhYSkvB6PU1$c;*ey?U$cez4tNC(U${uR&RLx82?K z!CU9eI`Cm5woh}m*RMh$KPT)Zv6#g#pKNgcNy>ofRd@C1+0v=IV)h?3DY!ly;7+p=*j?EK8ZGMUvZ{Wr8x^KFht3$R|{73Fz5hJRJbDxMXbOBQo= zcd@~H)k&8aNKbZyVo&5$c_*ACQAN%BSvs9rEQbHE)p~}0lLwE5Boolj8_$0yTf&%i zZ#`-~Ygqcs;heeZo(T7y_sR}JIcH45<`0s@^})>)0;0at=Rg|W_4Cq(@|Mo)mhQx- zf0K$q-z;IlB{iSttBhy+8&Xz_G+*@m10_{kwt?-0i!8;(iiKhhn-zv7uYqA{V7)dK ziAdvaj>@ftMLf3V?bz{L)83kKT-;V!yOhzoa;N2LG`uiAPrNpq<{!q7dYr52+afUu z#WQOR=!C+-2x~cvz#7wNe&@+D18g+GP3I=3bOVl}FwZNn3sjcj>@#F+Q3oNH?Sg?W zfo}b%wd5r@?GjSlrS<$0mivs1CJCau9!195$JH3^(KI^s%5}tV;pX90r-QgM7K^v* ztvO8%Mq%G2-N2zPNt`rNr6)w}OeDRB7gMFIhB+^fqy$77T0}Wh`=~xX)ADI6W-#Vf zwneR%`55sI=MkmWJf~Yr;2r|Y(14JN3?2JjF>6(EHpAK*Dty2iSEa3Ej7heuD(09n z-atOzDw|9?wqt0=l{LLEyHBJ;b()H;?Q=6^3*CYq1)(Z!W*;+YQV@WYq<3F@hcFi- z;}L!n|6m_auE6cw$_n7ptHFW7qz2EdRJ;vV&(eJpINfvT1$a7m)Mr;0Ur$##HyZ@4 zW!kp1Lhd-es%73ZZzsB!3E+*MvEL7Y^q^az;||3B_QrHh_8-vn*IkQ%(8`iAWweb( zPj-XdTuY=NQ;nnY?5tX&1!hLhnH7x!<390-e_S%3phMw>1e~M^#a-n5`8{{pCVsc* z&c#)iZvI|Yb@a2wUkr@@^rn{zyyd2MiH5iUVI^Rc`Js%@|1lzhc;fhqL?c)}BmDwM z|HsSKd`Iq}FuCrLW;tWNc=z&z(E*u!s`m>JM)6{E{V|Tta;!fJKiBFb&}=GMWdXm% z*|z*2(cb~OYdX40-v(hV{Cy8sxy`T7+zcopgoY*H$_N&;hC!(PZu~Aryk%Y`+N;*v z41oK1Qu=n)f>}HLzELidgPqw5Vq4~Q__|`Rl!N6s7y%%OOv;+*2)f0K5r^CH$Md*) zJF(*=_vmX93rh&hvmFEIAvPv7uPXdiLF!^U1L*0dF(FSm&!hy7bGH!|kv{4#tm?IB z@K=@k_2pHzqS4vDF@RL-b1~}?Pwd+@>q{u7*QiypsiEs3A19*ur#aG*s3Fh4G99Lo7!lLAOy@p)6#5CRMuo}o4HSIh?=I*+!mCqL$ zeAzQ(A9ag^1bQ%gDw(|WJeVcmKQ3=%hM#)gs`=Fibr^^XrGysz%p5l@XA32*aQhHr zQ4Ag3Y}yWfgi=kLw%afblpn{4Y>OBY8~t%wfue=)+K_D$?gdAMjkh0nr1$3x!=i6^ zO`rL`g=TN(7!+eTYkLFd)jsHaq4u`1e>}fu)(pEaTH)Jq)j)uLvc_x(2*sj^}c<$Nxn$}1X*&dw8M8a5Ntuz zG%n8MsPqekP31HtB-zw>O(itJGC8L5da8ibhymYVS|HYZ5&yFK<=ynOM?P%-G<~18 zF7WN2b;9S!&HA?8@g(zUB@>P}RkcowpJuZ_@i7hh4=r8>FH(wN3*}Mc6JcPe^%*%L z3fE$Sk_$3GZaKzsQF^%{lzuCKP40;8&Hy;ULH){Ib2x%p-5gy4;Uod2daoE)7mS<| zEp(?U!Q>9_hUtR3I6Un1dOv!IH!TOO5$cM29D>a5IG@SdD z5frUqCSp!#)D6l+Xv|CTyMq#X!@Lur!rXuoTlPKde$eHuL`e{3h;DE|JC_co?jDJ8 zftw3jz%D;xA)-%vw0TFW!kKcEnEt00sJ2}s;qywnt5z)FU57XcC*T7q8}iTc)CTS% zNn6WnPId$Jn>P{tCP#!*k*w0>sE_)GO21vGRPtr6l zCEMb|U89_An)w|uc4k6tojB-eMGAPL^94*NCF8{rG?C1GOL;yFMiOjqU#^d}SSGre z*motGc7?!6`adF_EUth%S+UnvF*K@Uh#3+Z!bUzG3=fb^Ix#}g~%VDuY@{Ypr# ztrGmUkti;7dpFf<(a3R{(n-u$q72gFF5XjI4+X|eqS^8T8l?)QT9!XaO+>saB)OHb zm_GSZqc0JNrR0rm&p2dE_q025qFtP)LFbMFiN; zZ@!9A758ZW)PMgSCkgjd)wfQBn+QFFn7f+V+R=e!B9&xD*i(c zWhWA3jX*)Ygj=E6TZY!@SH@9wA*5Dh(o z$g2L7OKI|LyND<0)L|W_k_gyL3(~jVU-p{F8H3f=Pv#L-$|-89H2z`VTHuSUt+e&X+AVD#?eL3PO>&MXLsA|{hD(3e`muZb@5 zs$!~Yp@??1j6?a1NCXr;3$!qYm!ZpAVM%NwdUR>@G(kQ{aO9em<0zx$If~6tI0Welx5L{B5F3*Eah0vIjwm=V ziB3J4V{GE)-di5gYfjIJr0RRpSXL*N>&M3*X;UE@4*OQTNoH6e0i7h+c+XA}I}5o? zEt|C%A5l-LU#gGv8$&A;)%J~gFpOtH6alCQUOw^?X+lSUzPpT@CQu@EjDTOkvSo#hs z_pBu(0h_;v(D7=aeK1~{u{VS;!#PVsP;$`rA}fT6hLgTXM_pHgc-9QG7Dw zCxY3oo9gQ{rI!%Z#Os7)g$fNu!FV;v&|=boI80CkV?GUz7nFD9IGCSdVpnIx1hl+$ zW-$wDh`U$q{$?VNEsDP7S z9cZ&g*qGOy^boTV5N#W@3Jv-?uawzOPSxC+hljGXo?=*}8z#B#4=UY#g2| z#_)8CL|dty>^S|c6qubNgp`h-o)Y7GxUmIm&^5C$7#jjFiMO;dX5GYo3i1^bxW?G_ zeyIHeg*%Q@$2+D`*Czi zcRp3T2DAb@&_&?{?X;Uwhl|f7;fzbL8U@a-vBs$^`#C4i15|*LOmQ)-XRcvIx!(S2 z#Kl8(2X~3UDTd6Lu^x^Ba3fw++|`t2!kPybey1)L0%!;9ue0HcrymGQ^fR{OTg*{O zlphH+O%%!#svZU7G=3%q#c)WV>f^dUJtsk;CXw8@B3+uPz|Fd}xsVFoi#*6J+|!(s zSyY`$Vl0!jJO$p09qW|`a4+M;ZAPkO3gRRu>37hH8x*7iu9|;-2L{*0K9?4!mH8u7 zB9!ROH1en-*+9|$!G*!JDt;|1MEsg3BDLAO5nFSe0qd`@ov0`9jl#&~k6;}|!GIq5 z`2MpGdSt^DaDjn;q28&_c#B~@P$4=+{%Z-LN-6;r&F-t9?dOJB8W{g1Hv5gFC^r&% z*wG)6o*2D`u=aTp-w2aHJG=umy_O$BYL3zY3v%(xU`){y``@R^dQ8za*D=O^?=M;= zBT~!R$WkhYo*Jyf$SL0BY<7w^(3w^h#ZZjD1?m${k+ChD4edS`WQmV?5DCj?3dnx2 z5AD3)7fs(b?cvUia33(`u{)28ShH2hUW<^RXPF|c(y0;j@eT`986F8M+(Lgmlm4iJ zj?3~>4HOd|r^Ss2@JNrW+e4X`lR;7h=}!vq7;AbaBcLpLyUbiSsV3|f{-pkG{y!U>li()yOilevL=jzq0M z_3XcdOPQG%{@%3vUsqqOMdCCedSq2$us7-nIi*o=0=dSuoP$=!5Cnog_uLBn==%=5 z@^cZ`_m78kjkN*m8%tZ+H!*?>$tlS=DYP=_3`(tit?jKNBs#6J(YNg|+S81;uCzTG+B^bA6?1NNS|-h@tT!!hqvhc93sQ=x0kUfHCt^U&&mW|nol#X? z^If6~3vW?{wStKoVBoo*DcUyy#lDHNs>mWj=MQ*W7lsGE*GiA*e_)``nX!!O<({vt zir_q1^Iym;72XAu^WTK+TQ2>|9Bl9=T$9`}DakD8-#Udgn4cV@&b#qr< za;p@6zAh{2E(t?FNEW9heyY?X|!-= zxQ?xlhqR)3`gyrh;VMo-)9DjyL)tR%ug6A{{lV0TLn6Wf-O!qL^kRxa-#mIqh|VpJ z^{HspaB7i9UM49)3e0C6v!u*Tnpcb_w+>>AeMIw$4k8`q`BqIp>^S%Uw6K|5(wwL! zdP2wn z_9ecnhs|mY`$aW~*Yo4u_^;JXC#G)MMDbqFStYjnU~*YLJd2;Xc*7KQO$4R%Z!;Z` zmL>*ffCfsbe>=C6SFGVugVrt>^5q8qgPVKZ|3dy1na`yWq|Y+H>+KvigjQ`4FmRlyY?~KX z5wz>nAxuAH@L(9)ltxmVaz)|H z(yzja)Dc@CP9pS6!; z2gb}FIzN%r=w#E5<`Oz)6ezyB(T$wDS1QP)N}t1@*oR`AmMaptZLv1}bO@1gRi#R9 zV-OM=_6157>BvHp&5W)`kpK~nNtME@K*|DxL3(LCp>zjU& z9;*2yy