diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..f8414f0 --- /dev/null +++ b/404.html @@ -0,0 +1,3 @@ + +404 Not Found +

404 Not Found

diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..4831970 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +linebender.org \ No newline at end of file diff --git a/about/index.html b/about/index.html new file mode 100644 index 0000000..15ca3c0 --- /dev/null +++ b/about/index.html @@ -0,0 +1,99 @@ + + + + + + + + About - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

About

+

This is the website for the Linebender organization on GitHub. The Linebender organization contains a collection of repositories, which provide the tools and utilities to create graphical user interfaces for applications in the Rust programming language.

+

It is also a group of volunteers and enthusiasts who hang out on our Zulip, and who collaborate on designing and coding the different parts of the stack required for UI. We are a friendly bunch, and always welcome newcomers, whether they have any experience with 2D graphics and user interfaces or not.

+

All the work of the Linebender is done in the open, and the full history of all conversations is available on Zulip. In fact, we recommend searching the chat history for any topic that you are interested in, as there have been many discussions in the past with novel and valuable ideas. All code is dual-licensed under the MIT and Apache-2.0 licenses (where possible) and we aim to license non-code material under the CC-BY Creative Commons license. In fact, the non-code portion of this website is licensed under CC-BY, while all code, including any JavaScript written by the authors, is available under the Apache-2.0 license. A copy of the Apache-2.0 license is available in this website's repository. We reuse some code from the 'minima' Jekyll theme under the MIT license. The aim is to make any of the code on this website reusable, so if the licensing is causing friction please contact us on Zulip and we'll work together to solve the problem.

+

A separate page describes our contributor guidelines.

+

The organization was started by Raph Levien, and he informally leads and drives the work forward.

+ + +
+
+ + + diff --git a/atom.xml b/atom.xml new file mode 100644 index 0000000..867a68a --- /dev/null +++ b/atom.xml @@ -0,0 +1,1603 @@ + + + Linebender + Homepage for the Linebender organization + + + Zola + 2024-11-04T00:00:00+00:00 + https://linebender.org/atom.xml + + Linebender in October 2024: resvg stewardship + 2024-11-04T00:00:00+00:00 + 2024-11-04T00:00:00+00:00 + + + + Bruce Mitchener + + + + + + Daniel McNab + + + + + https://linebender.org/blog/tmix-10/ + + <p>Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for <a href="https://rust-lang.org">the Rust programming language</a>.</p> +<p>This month's update is very significant, featuring several crate releases and the adoption of resvg.</p> +<h2 id="resvg-tiny-skia-and-related-projects">Resvg, Tiny-Skia, and Related Projects</h2> +<p>We would like to thank <a href="https://github.com/RazrFalcon">Yevhenii Reizner (RazrFalcon)</a> for all his work on resvg, tiny-skia, and related projects. +Due to some changes in his personal circumstances, he has to give up working on his collection of excellent crates and he has been seeking new homes for them to help keep the lights on. +The following projects are now part of Linebender:</p> +<ul> +<li><a href="https://github.com/linebender/resvg">resvg</a> - an SVG rendering library, including <a href="https://crates.io/crates/usvg">usvg</a>;</li> +<li><a href="https://github.com/linebender/tiny-skia">tiny-skia</a> - a skia subset ported to Rust.</li> +</ul> +<p>These crates are widely used within the ecosystem and play an important role in many software projects, and not just in Rust! +Given that Linebender has a mission to provide high quality libraries for GUI and we have established processes for managing those libraries, we feel well positioned to step in and help out. +Several associated repositories and projects are also now part of Linebender. +These are <a href="https://github.com/linebender/simplecss">simplecss</a>, <a href="https://github.com/linebender/svgtypes">svgtypes</a>, and <a href="https://github.com/linebender/resvg-test-suite">resvg-test-suite</a>.</p> +<p>We do not expect this change to significantly impact current users of <code>resvg</code>, <code>usvg</code>, or <code>tiny-skia</code>. +Our role is a stewardship role, to allow updates to continue as needed by the community. +If things work for you now, they will continue to work for you going forward.</p> +<p>Our plans for the near future are:</p> +<ul> +<li>Integrate with existing Linebender <a href="https://github.com/linebender/rfcs/pull/5">practices for CI</a>, testing, and releases.</li> +<li>Review and respond to incoming pull requests and issues.</li> +<li>Re-license the <code>resvg</code> repository (including both <code>resvg</code> and <code>usvg</code>) from the MPL-2.0 license to a dual Apache 2.0 / MIT license as is common within the Rust world and the standard for Linebender projects.</li> +<li>Provide new releases as needed, working with the community to bring additional maintainers.</li> +</ul> +<p>In the longer term, we will look at how the ecosystem is evolving and what’s needed or useful. +The Linebender team has deep expertise in 2D rendering, including vector graphics, color and text layout, shaping, and rendering. +We look forward to seeing how we can apply this to these projects.</p> +<h3 id="relicensing">Relicensing</h3> +<p>We’ve already begun the process of re-licensing the <code>resvg</code> repository and are nearly done. +The change of license will be present in the next release, which will also be our first release under the Linebender umbrella. +This will allow us to share code between the Linebender crates more easily.</p> +<p>This process can be followed at <a href="https://github.com/linebender/resvg/pull/838">resvg#838</a>.</p> +<h3 id="help-wanted">Help Wanted</h3> +<p>We welcome pull requests and issues.</p> +<p>Also, with RazrFalcon becoming less involved, we’re losing a key source of knowledge about the code itself as well as the philosophy behind it. +We look forward to hearing from people who use the various crates to understand how you use it, what you use it for, and what you’d like to see.</p> +<p>For further discussion, please use the <a href="https://xi.zulipchat.com/#narrow/channel/465085-resvg">resvg channel on the Zulip</a>.</p> +<hr /> +<p></p> +<p>Alongside the work on resvg, we have been continuing work on our existing projects.</p> +<h2 id="xilem">Xilem</h2> +<p>Xilem is our flagship GUI project, inspired by SwiftUI. +It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.</p> +<ul> +<li><a href="https://github.com/linebender/xilem/pull/681">xilem#681</a>: <code>View::rebuild</code> was updated to reflect the ability to use reborrowing.</li> +<li><a href="https://github.com/linebender/xilem/pull/669">xilem#669</a>: The font weight for <code>label</code>s was exposed, by Marco Melorio.</li> +</ul> +<p>Work on Xilem Web continues.</p> +<h2 id="masonry">Masonry</h2> +<p>Masonry is the widget system used by Xilem. +It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.</p> +<ul> +<li><a href="https://github.com/linebender/xilem/pull/632">xilem#632</a>: Starts a Masonry book, including a guide on creating a To-Do List app.</li> +<li><a href="https://github.com/linebender/rfcs/pull/7">rfcs#7</a>: The pass specification RFC has been fully implemented, and the RFC has been merged.</li> +<li><a href="https://github.com/linebender/xilem/pull/705">xilem#705</a>: Moved methods for mutating widgets to free functions. +<ul> +<li>This decreases ergonomics in favour of increasing uniformity between Masonry and crates which create their own widgets.</li> +<li>This change is intended to improve rustdoc output, and the ergonomics should be restored once Rust has Arbitrary Self Types V2.</li> +</ul> +</li> +<li><a href="https://github.com/linebender/xilem/pull/615">xilem#615</a>: Our accessibility for text has been greatly improved, allowing by-character and by-word movement through accessibility tools.</li> +<li><a href="https://github.com/linebender/xilem/pull/660">xilem#660</a>: <code>request_paint</code> has been removed in favour of a new <code>request_render</code>, so that accessibility updates are less likely to be missed.</li> +<li><a href="https://github.com/linebender/xilem/pull/718">xilem#718</a>, <a href="https://github.com/linebender/xilem/pull/720">xilem#720</a>: restored the ability to embed Masonry in external projects by re-exporting required items.</li> +<li><a href="https://github.com/linebender/xilem/pull/612">xilem#612</a>: A built-in feature-gated integration with <a href="https://github.com/wolfpld/tracy">Tracy</a>.</li> +</ul> +<p>Daniel also provided a talk to <a href="https://china2024.gosim.org/">GOSIM China 2024</a> about Masonry. +The recording of this presentation is not yet available.</p> +<figure> +<img style="height: auto" src="masonry-tracy.png" alt="A tracing view of a single frame in Masonry. There are high-level spans with details underneath, and GPU operations are shown." height="613" width="1275"> +<figcaption> +<p>Masonry now has built-in support for tracing using Tracy, using the <a href="https://crates.io/crates/tracing-tracy">tracing-tracy</a> crate.</p> +</figcaption> +</figure> +<h2 id="vello">Vello</h2> +<p>Vello is our GPU vector renderer. +It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.</p> +<p>The main update is the release of version <a href="https://github.com/linebender/vello/releases/tag/v0.3.0">0.3.0</a>. +This release includes previously discussed support for emoji and blurred rounded rectangles. +We also now no longer consider Vello to be experimental, and so would encourage you to try Vello for your projects. +Raph has been working on Sparse Strip Path rendering; progress can be followed <a href="https://xi.zulipchat.com/#narrow/channel/197075-gpu/topic/Sparse.20strip.20path.20rendering">in the Zulip thread</a>.</p> +<p>We do still have several known issues, but are not aware of any issues which would block wider adoption.</p> +<figure> +<img style="height: auto" src="floem-todo-list.png" alt="A to-do list desktop app, in a vertical layout: Use Floem, unchecked; Create more TODOs, checked; Join the Linebender Zulip, unchecked. There is a button labelled 'New To-Do'." height="367" width="784"> +<figcaption> +<p>Vello is now supported as a renderer for the external <a href="https://lap.dev/floem/">Floem</a> project, developed for the Lapce editor. +Note that Lapce does not currently itself use Vello.</p> +</figcaption> +</figure> +<h2 id="parley">Parley</h2> +<p>Parley is a text layout library. +It handles text layout, mostly at the level of line breaking and resolving glyph positions.</p> +<p>We released <a href="https://github.com/linebender/parley/releases/tag/v0.2.0">Parley 0.2.0</a>. +This includes:</p> +<ul> +<li><a href="https://github.com/linebender/parley/pull/126">parley#126</a>: A new abstraction for text editing operations.</li> +<li><a href="https://github.com/linebender/parley/pull/129">parley#129</a>: Ergonomics improvements for style properties.</li> +<li><a href="https://github.com/linebender/parley/pull/76">parley#76</a>: A tree-style layout builder, useful for building up a text section (e.g. between elements).</li> +</ul> +<p>We have also done some follow up work, including:</p> +<ul> +<li><a href="https://github.com/linebender/parley/pull/143">parley#143</a>: Support for shortcutting drawing work if rendering has not changed.</li> +<li><a href="https://github.com/linebender/parley/pull/152">parley#152</a> (in progress): An example showing cursor blinking, by tannal.</li> +</ul> +<h2 id="piet">Piet</h2> +<p>Piet is a 2d graphics library which abstracts over platform-native graphics APIs. +Linebender is focused on <a href="https://linebender.org/blog/tmix-10/#vello">Vello</a> rather than Piet for performance reasons, but some users may find Piet useful, as it relies on more mature renderers and is more compatible with older platforms. +During October, we released <a href="https://github.com/linebender/piet/releases/tag/v0.7.0">Piet 0.7.0</a>.</p> +<p>Some key updates from October included in this release are:</p> +<ul> +<li><a href="https://github.com/linebender/piet/pull/572">piet#572</a>: Use of <code>Arc</code> over <code>Rc</code> for stroke dashing, by anesthetice.</li> +<li><a href="https://github.com/linebender/piet/pull/585">piet#585</a>: An update to the Rust 2018 edition, from Bruce Mitchener.</li> +<li><a href="https://github.com/linebender/piet/pull/578">piet#578</a>: Improved robustness of <code>copy_raw_pixels</code> on Direct2D by Kaur Kuut.</li> +<li>Many dependency updates.</li> +</ul> +<h2 id="druid">Druid</h2> +<p>Druid is a GUI library which was a predecessor to Xilem, and an ancestor of Masonry.</p> +<p>We are in the process of relicensing Druid from its current license of Apache 2.0 only to the Rust ecosystem standard Apache 2.0 OR MIT dual license. +If you have previously contributed to Druid, please read and respond to <a href="https://github.com/linebender/druid/pull/2414">druid#2414</a>. +This will greatly improve cross-compatibility with the rest of the Rust ecosystem, particularly for adapting code from Druid into newer toolkits. +We plan to archive the Druid repo after one more release, as we are not actively developing it; we are working to bring Xilem to parity in capability. +We will also apply this license change to Xilem and Masonry, as well as Glazier, which is currently archived.</p> +<h2 id="others">Others</h2> +<ul> +<li>Daniel and Olivier's "office hours" appointments can still be booked by anyone for open-ended discussion of the ecosystem. +<ul> +<li><a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2">See Daniel's schedule here</a>.</li> +<li><a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM">See Olivier's schedule here</a>.</li> +</ul> +</li> +</ul> + + + + + This Month in Linebender, September 2024 + 2024-10-15T00:00:00+00:00 + 2024-10-15T00:00:00+00:00 + + + + Daniel McNab + + + + + + Olivier Faure + + + + + https://linebender.org/blog/tmil-09/ + + <p>Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for <a href="https://rust-lang.org">the Rust programming language</a>.</p> +<img style="height: auto; margin: 0 auto" src="../../linebender.svg" alt="Linebender logo; smoothly stroked overlapping lowercase letters, an l and a b." height="200" width = "200"> +<h2 id="xilem">Xilem</h2> +<p>Xilem is our flagship GUI project, inspired by SwiftUI. +It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.</p> +<ul> +<li>HTTP cats example (<a href="https://github.com/linebender/xilem/pull/571">xilem#571</a>).</li> +<li><code>lens</code>, a shorthand for a common component pattern (<a href="https://github.com/linebender/xilem/pull/587">xilem#587</a>).</li> +<li>We added Views for some existing and new widgets: +<ul> +<li>Grid layout (<a href="https://github.com/linebender/xilem/pull/570">xilem#570</a>).</li> +<li>Images (<a href="https://github.com/linebender/xilem/pull/571">xilem#571</a>).</li> +</ul> +</li> +</ul> +<!-- TODO: Xilem Web seems to not have any especially relevant updates? --> +<figure> +<img style="height: auto" src="http_cats.png" alt="A list of HTTP status codes, with 'Select' buttons. HTTP code 418 'I'm a teapot' is selected, with a picture of a kitten hiding in a teapot." height="962" width="600"> +<figcaption> +<p>The HTTP cats example.</p> +</figcaption> +</figure> +<h2 id="masonry">Masonry</h2> +<p>Masonry is the widget system used by Xilem. +It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.</p> +<p>Our ongoing pass specification project has been largely implemented. +That work is now in a wrapping-up stage, which has allowed Olivier to work on improving the codebase's quality in general. +Some highlights of work from September:</p> +<ul> +<li><a href="https://github.com/linebender/xilem/pull/515">xilem#515</a>: Removes unimplemented functionality from our text handling code.</li> +<li><a href="https://github.com/linebender/xilem/pull/570">xilem#570</a>: An implementation of a grid layout, by Jared O'Connell.</li> +<li><a href="https://github.com/linebender/xilem/pull/550">xilem#550</a>: Restores scroll requests, as used by text inputs.</li> +<li><a href="https://github.com/linebender/xilem/pull/565">xilem#565</a>: Allows widgets to implement more efficient pointer position dispatching, by new Linebender member Tom Churchman.</li> +<li><a href="https://github.com/linebender/xilem/pull/580">xilem#580</a>: Adds screen reader support for the textbox widget.</li> +</ul> +<!-- No grid example, it's not really visual. --> +<p>Some ongoing work includes:</p> +<ul> +<li><a href="https://github.com/linebender/xilem/pull/615">xilem#615</a>: Detailed accessibility information for text input and prose widgets.</li> +<li><a href="https://github.com/linebender/xilem/pull/606">xilem#606</a>: Custom client side decorations for Wayland, by Marco Melorio.</li> +<li><a href="https://github.com/linebender/xilem/pull/605">xilem#605</a>: Greater flexibility in the layout of the <code>Image</code> widget, by failingprovince.</li> +<li><a href="https://github.com/linebender/xilem/pull/591">xilem#591</a>: An SVG-like widget for absolute positioning, by Muhammad Ragib Hasin.</li> +</ul> +<h2 id="vello">Vello</h2> +<p>Vello is our GPU vector renderer. +It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.</p> +<p>The month of september included a lot of progress towards the 0.3.0 release.</p> +<ul> +<li>We no longer consider Vello to be experimental (<a href="https://github.com/linebender/vello/pull/691">vello#691</a>). Please note that Vello is still an alpha, and has several known issues.</li> +<li>An implementation of the single pass scan described last month is being created by Thomas Smith in <a href="https://github.com/linebender/vello/pull/685">vello#685</a>.</li> +</ul> +<h2 id="parley">Parley</h2> +<p>Parley is a text layout library. +It handles text layout, mostly at the level of line breaking and resolving glyph positions.</p> +<ul> +<li>Nico Burns contributed a new way to assign layout properties in <a href="https://github.com/linebender/parley/pull/76">parley#76</a>.</li> +</ul> +<h2 id="others">Others</h2> +<ul> +<li>Daniel and Olivier's "office hours" appointments can still be booked by anyone for open-ended discussion of the ecosystem. +<ul> +<li><a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2">See Daniel's schedule here</a>.</li> +<li><a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM">See Olivier's schedule here</a>.</li> +</ul> +</li> +</ul> + + + + + This Month in Xilem, August 2024 + 2024-09-11T00:00:00+00:00 + 2024-09-11T00:00:00+00:00 + + + + Daniel McNab + + + + + https://linebender.org/blog/tmix-08/ + + <p>Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for <a href="https://rust-lang.org">the Rust programming language</a>.</p> +<figure> +<img style="height: auto; margin: 0 auto" src="../../linebender.svg" alt="Linebender logo; smoothly stroked overlapping lowercase letters, an l and a b." height="200" width = "200"> +<figcaption> +<p>Linebender has a new logo, which was contributed by <a href="https://github.com/msiglreith">Markus Siglreithmaier</a>. +We're seeking feedback on Zulip in <a href="https://xi.zulipchat.com/#narrow/stream/419691-linebender/topic/logo">#linebender&gt;logo</a>.</p> +</figcaption> +</figure> +<h2 id="xilem">Xilem</h2> +<p>Xilem is our flagship GUI project, inspired by SwiftUI.</p> +<ul> +<li>We integrated basic animated variable font rendering (<a href="https://github.com/linebender/xilem/pull/507">xilem#507</a>).</li> +<li>Philipp Mildenberger moved us back to using <code>ViewMarker</code> in <a href="https://github.com/linebender/xilem/pull/472">xilem#472</a>. +This restores the ability to return <code>ViewSequence</code>s, by making a tradeoff to work around Rust's faulty trait ambiguity rules.</li> +<li>We added Views for some existing and new widgets: +<ul> +<li>spinners, useful for showing indetermine progress (<a href="https://github.com/linebender/xilem/pull/497">xilem#497</a>);</li> +<li>progress bars (<a href="https://github.com/linebender/xilem/pull/513">xilem#513</a>); and</li> +<li>the <code>Portal</code> widget, which brings support for scroll areas to Xilem (<a href="https://github.com/linebender/xilem/pull/561">xilem#561</a>).</li> +</ul> +</li> +</ul> +<p>Xilem Web is a community managed experimental DOM implementation of the Xilem pattern. +This month, the updates include:</p> +<ul> +<li>Support for returning multiple views from the main logic (<a href="https://github.com/linebender/xilem/pull/482">xilem#482</a>).</li> +<li>Support for DOM templating, for efficient repeated creation of similar views (<a href="https://github.com/linebender/xilem/pull/495">xilem#495</a>).</li> +</ul> +<figure> +<img style="height: auto" src="stopwatch.png" alt="A timer with the value '0:00:26.4' (26.4 seconds) above two buttons, reset and start. Below these are 5 laps, labelled 'lap 5' to 'lap 1', each with a lap time of approximately 5 seconds and a corresponding elapsed time. This is all contained in an OS window titled 'Stopwatch'." height="388" width = "559"> +<figcaption> +<p>Jared O'Connell additionally contributed a stopwatch example in <a href="https://github.com/linebender/xilem/pull/492">xilem#492</a>.</p> +</figcaption> +</figure> +<h2 id="masonry">Masonry</h2> +<p>Masonry is the widget system used by Xilem. +This month has been dominated by Olivier's implementation of pass specification (<a href="https://github.com/linebender/rfcs/pull/7">rfcs#7</a>):</p> +<ul> +<li><a href="https://github.com/linebender/xilem/pull/512">xilem#512</a>: The new compose pass, which is used to minimise redraw when scrolling.</li> +<li><a href="https://github.com/linebender/xilem/pull/510">xilem#510</a>: Adds the mutate pass, which allows later passes to assume the tree structure is stable by limiting when tree mutation can occur.</li> +<li><a href="https://github.com/linebender/xilem/pull/522">xilem#522</a>: Implements paint and accessibility as passes, with follow-up by Tom Churchman in <a href="https://github.com/linebender/xilem/pull/557">xilem#557</a>.</li> +<li><a href="https://github.com/linebender/xilem/pull/488">xilem#488</a> and <a href="https://github.com/linebender/xilem/pull/540">xilem#540</a>: updated event and pointer handling, and disabled handling respectively.</li> +<li>In progress work includes layout in <a href="https://github.com/linebender/xilem/pull/529">xilem#529</a>, focus in <a href="https://github.com/linebender/xilem/pull/538">xilem#538</a>, animation in <a href="https://github.com/linebender/xilem/pull/539">xilem#539</a> and scroll requests in <a href="https://github.com/linebender/xilem/pull/550">xilem#550</a>.</li> +</ul> +<p>We also had some great community contributions, such as:</p> +<ul> +<li>Richard Dodd added a new progress Bar widget (<a href="https://github.com/linebender/xilem/pull/513">xilem#513</a>).</li> +<li>Fixes for Portal scrolling, by Tom Churchman (<a href="https://github.com/linebender/xilem/pull/563">xilem#563</a>).</li> +</ul> +<figure> +<img style="height: auto" src="progress_bar.png" alt="A horizontal progress bar which is 70% filled with blue, with white text overlaid saying 70%. Below this is a checkbox labelled 'set indetermine progress', and a button labelled 'change progress'." height="129" width = "431"> +<figcaption> +<p>The progress bar widget was contributed by Richard Dodd in <a href="https://github.com/linebender/xilem/pull/513">xilem#513</a>.</p> +</figcaption> +</figure> +<p>We continue to make progress on other key features.</p> +<ul> +<li>Snapshot tests now are cross-platform and run in CI (<a href="https://github.com/linebender/xilem/pull/233">xilem#233</a>).</li> +<li>Pan/flick gestures are being developed in <a href="https://github.com/linebender/xilem/pull/562">xilem#562</a>.</li> +<li>Progress continues on text input for Android. This involves creating our own <code>Activity</code>, with support for both text input and accessibility. +This new <code>Activity</code> will use <code>SurfaceView</code> like other modern native code based activities (<code>GameActivity</code>, <code>MakepadActivity</code>, etc.), and our aim is that it won't require a Java toolchain to build a simple application.</li> +<li>Progress continues on the Accessibility integration for Android. You can try this in <a href="https://github.com/linebender/xilem/pull/575">xilem#575</a>, or see it in the below video.</li> +</ul> +<figure> +<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/IObBk40MdJs?si=GXDNRNelhVz4nTjU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> +<figcaption> +<p>The Xilem <code>to_do_mvc</code> example running with <a href="https://en.wikipedia.org/wiki/Google_TalkBack">TalkBack</a> integration. +Video provided by Matt Campbell.</p> +</figcaption> +</figure> +<h2 id="vello">Vello</h2> +<p>Vello is our GPU vector renderer. +We have made some really great progress in August<!-- , TODO: and are actively planning a 0.3.0 release? -->.</p> +<ul> +<li>We now support blurred rounded rectangles, contributed by Markus Siglreithmaier (<a href="https://github.com/linebender/vello/pull/665">vello#665</a>)</li> +<li>Blend stack spilling was implemented, which allows blends more than four layers deep (<a href="https://github.com/linebender/vello/pull/661">vello#661</a>).</li> +<li>Fixes for some visual artifacts in <a href="https://github.com/linebender/vello/pull/651">vello#651</a>, <a href="https://github.com/linebender/vello/pull/659">vello#659</a> and <a href="https://github.com/linebender/vello/pull/673">vello#673</a>.</li> +<li>Embedding existing wgpu textures is now supported (<a href="https://github.com/linebender/vello/pull/636">vello#636</a>).</li> +<li>We now support bitmap glyphs (i.e. emoji), in addition to our previous COLR support (<a href="https://github.com/linebender/vello/pull/641">vello#641</a>).</li> +<li>Work has begun on sparse strips, which is tracked in <a href="https://github.com/linebender/vello/pull/670">vello#670</a>.</li> +<li>Frame pacing for Android is being investigated and developed in <a href="https://github.com/linebender/vello/pull/674">vello#674</a>.</li> +<li>Thomas Smith has been doing some deep-dives into parallel scan, which is the core operation in Vello. +This work can be found in <a href="https://xi.zulipchat.com/#narrow/stream/197075-gpu/topic/Progress.20for.20GPU&#x27;s.20Without.20Forward.20Progress.20Guarantees">#gpu&gt;Progress for GPU's Without Forward Progress Guarantees</a>.</li> +</ul> +<figure> +<img style="height: auto" src="rounded_rectangles.png" alt="A vertically split image. On the left are three blurred shapes: a blue rectangle with rounded corners, and two black ellipses. The ellipses are partially occluded by the boundaries of the image. On the right is a web page, showing three blog post titles and summaries, each in a box with a black box shadow." height="644" width = "944"> +<figcaption> +<p>Vello now supports blurred rounded rectangles, based on the maths from <a href="https://raphlinus.github.io/graphics/2020/04/21/blurred-rounded-rects.html">Raph's blog</a>. +Left: Vello's blurred rounded rectangles test scene. +Right: <a href="https://github.com/DioxusLabs/blitz/">Blitz</a>'s <code>servo</code> example which renders box shadows using this feature.</p> +</figcaption> +</figure> +<h2 id="parley">Parley</h2> +<p>Parley is a text layout library.</p> +<ul> +<li>Primitives required for robust text editing were added in <a href="https://github.com/linebender/parley/pull/106">parley#106</a>.</li> +</ul> +<h2 id="others">Others</h2> +<ul> +<li>Bruce Mitchener has started work on <a href="https://github.com/linebender/interpoli/">Interpoli</a>, an animation support library.</li> +<li>We have performed a <a href="https://linebender.org/blog/roadmap-may-2024-retro/">retrospective</a> on our last roadmap.</li> +<li>Daniel and Olivier's "office hours" appointments can still be booked by anyone for open-ended time-limited discussion of the ecosystem. +<ul> +<li><a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2">See Daniel's schedule here</a>.</li> +<li><a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM">See Olivier's schedule here</a>.</li> +</ul> +</li> +</ul> + + + + + Retrospective on the May-July roadmap + 2024-08-24T00:00:00+00:00 + 2024-08-24T00:00:00+00:00 + + + + Daniel McNab + + + + + https://linebender.org/blog/roadmap-may-2024-retro/ + + <p>Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for <a href="https://rust-lang.org">the Rust programming language</a>.</p> +<p>At the start of May, we created a <a href="https://linebender.org/blog/roadmap-may-2024/">roadmap</a> for the following three months. +We recently went through a process of analysing how well our progress was guided by the roadmap; this report summarises those results.</p> +<h2 id="vello-original">Vello <a href="https://linebender.org/blog/roadmap-may-2024/#vello">(original)</a></h2> +<h3 id="robust-dynamic-memory-original">Robust dynamic memory <a href="https://linebender.org/blog/roadmap-may-2024/#robust-dynamic-memory">(original)</a></h3> +<ul> +<li><strong>Priority:</strong> Highest.</li> +<li><strong>Status</strong>: Experimental PR (<a href="https://github.com/linebender/vello/pull/606">vello#606</a>), but hasn’t landed. +Work required on the CPU side API, but the GPU operations are well-understood. +This PR could not be released in its current form.</li> +</ul> +<h3 id="reliable-snapshot-tests-original">Reliable snapshot tests <a href="https://linebender.org/blog/roadmap-may-2024/#reliable-snapshot-tests">(original)</a></h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Status</strong>: This was implemented in <a href="https://github.com/linebender/vello/pull/610">vello#610</a>. +This has already been extremely useful in our review process, as it allows changes to be validated in the files changed view. +We also implemented an experiment to use <a href="https://git-lfs.com/">Git LFS</a>, which has been working really well to avoid increasing repository size.</li> +</ul> +<h3 id="sparse-strips-original">Sparse strips <a href="https://linebender.org/blog/roadmap-may-2024/#sparse-strips">(original)</a></h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Status</strong>: We are continuing this work, but there is no code currently available. +See <a href="https://xi.zulipchat.com/#narrow/stream/197075-gpu/topic/Sparse.20strip.20path.20rendering">#gpu &gt; Sparse strip path rendering</a> for details.</li> +</ul> +<h3 id="add-tests-original">Add tests <a href="https://linebender.org/blog/roadmap-may-2024/#add-tests">(original)</a></h3> +<ul> +<li><strong>Priority:</strong> Medium</li> +<li><strong>Status</strong>: This item had already been completed at the time the roadmap was written. +This was also expanded upon in. +During our retrospective meeting, we did determine some potential future expansions to testing, namely: +<ul> +<li>Running individual stages in isolation, to enable property testing (TODO: Make Vello issue).</li> +<li>Testing for additional platforms, such as DirectX on Windows and Android (TODO: Make Vello issue).</li> +</ul> +</li> +</ul> +<h3 id="vello-extras">Progress beyond roadmap</h3> +<p>We have also landed several important features which were not part of our planned roadmap. +These include:</p> +<ul> +<li>Blending which uses more than four deep layers (<a href="https://github.com/linebender/vello/pull/657">vello#657</a>).</li> +<li>Preliminary support for embedding pre-existing <code>wgpu</code> textures (<a href="https://github.com/linebender/vello/pull/636">vello#636</a>). +This was driven by user needs. +Further work in this direction is tracked in <a href="https://github.com/linebender/vello/issues/664">vello#664</a>.</li> +<li>Support for Emoji (COLRv1 in <a href="https://github.com/linebender/vello/pull/615">vello#615</a>, bitmap in <a href="https://github.com/linebender/vello/pull/641">vello#641</a>).</li> +</ul> +<p>The <a href="https://linebender.org/gpu-stroke-expansion-paper/">stroke expansion paper</a> documents a key part of Vello's pipeline. +This was presented at ACM High Performance Graphics (HPG) 2024, placing 3rd Place in the Best Paper Award.</p> +<h2 id="masonry-original">Masonry <a href="https://linebender.org/blog/roadmap-may-2024/#masonry">(original)</a></h2> +<h3 id="complete-text-input-original">Complete text input <a href="https://linebender.org/blog/roadmap-may-2024/#complete-text-input">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: Highest</li> +<li><strong>Status</strong>: Not that much progress. +This work is being continued, and indeed there has been significant progress as of the time of writing. +This is tracked in <a href="https://github.com/linebender/parley/issues/52">parley#52</a>.</li> +</ul> +<h3 id="better-tracing-for-debugging-original">Better tracing for debugging <a href="https://linebender.org/blog/roadmap-may-2024/#better-tracing-for-debugging">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: High</li> +<li><strong>Status</strong>: <a href="https://github.com/linebender/xilem/pull/384">xilem#384</a> implements most of this, the rest is deferred. +There are known issues with the size of the log files created by default in very large apps.</li> +</ul> +<h3 id="fix-glaring-documentation-problems-original">Fix glaring documentation problems <a href="https://linebender.org/blog/roadmap-may-2024/#fix-glaring-documentation-problems">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: High</li> +<li><strong>Status</strong>: The issues mentioned in this item were addressed in <a href="https://github.com/linebender/xilem/pull/329">xilem#329</a> and <a href="https://github.com/linebender/xilem/pull/503">xilem#503</a>.</li> +</ul> +<h3 id="finish-repository-port-original">Finish repository port <a href="https://linebender.org/blog/roadmap-may-2024/#fix-glaring-documentation-problems">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: High</li> +<li><strong>Status</strong>: This was completed. +We moved all Masonry issues into the Xilem repository, and updated all references in code to use full links. +This move was coordinated in <a href="https://xi.zulipchat.com/#narrow/stream/419691-linebender/topic/Moving.20Masonry.20into.20Xilem">#linebender &gt; Moving Masonry into Xilem</a>.</li> +</ul> +<h3 id="write-widgets-in-arena-rfc-original">Write “widgets in arena” RFC <a href="https://linebender.org/blog/roadmap-may-2024/#write-widgets-in-arena-rfc">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: High</li> +<li><strong>Status</strong>: The RFC was <a href="https://github.com/linebender/rfcs/pull/6">rfcs#6</a>, which was mostly implemented in <a href="https://github.com/linebender/xilem/pull/396">xilem#396</a>.</li> +</ul> +<h3 id="write-pass-order-rfc-original">Write “pass order” RFC <a href="https://linebender.org/blog/roadmap-may-2024/#write-pass-order-rfc">(original)</a></h3> +<ul> +<li><strong>Prioriy</strong>: High</li> +<li><strong>Status</strong>: <a href="https://github.com/linebender/rfcs/pull/7">rfcs#7</a> is in draft, and several important parts of the RFC have been completed.</li> +</ul> +<h3 id="rewrite-documentation-original">Rewrite documentation <a href="https://linebender.org/blog/roadmap-may-2024/#rewrite-documentation">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: Medium</li> +<li><strong>Status</strong>: This work has been deferred until the "pass order" refactor is complete, as we expect Masonry's core to be quite stable at that point.</li> +</ul> +<h3 id="improve-focus-handling-original">Improve focus handling <a href="https://linebender.org/blog/roadmap-may-2024/#improve-focus-handling">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: Medium</li> +<li><strong>Status</strong>: Not done.</li> +</ul> +<h3 id="improve-pointer-status-handling-original">Improve pointer status handling <a href="https://linebender.org/blog/roadmap-may-2024/#improve-pointer-status-handling">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: Medium</li> +<li><strong>Status</strong>: Basic translation of touch events was added in (<a href="https://github.com/linebender/xilem/pull/313">xilem#313</a>). +This unblocked using Masonry on devices where pointer input is not expected (primarily on Android). +We have split the remainder of this task into two tasks, with a priority placed on completing the parts which unblock other work (such as scrolling on Android).</li> +</ul> +<h3 id="masonry-extras">Progress beyond roadmap</h3> +<p>Masonry is in a state of flux, however is starting to see a few exploratory users. +To unblock these users, some additional important features were added outside of the roadmap, such as:</p> +<ul> +<li>Support for embedding Masonry inside a pre-existing event loop (<a href="https://github.com/linebender/xilem/commit/cf3530097baf0fc5c458593e215a19973572b991">xilem#417</a>).</li> +<li>Support for a <code>gap</code> property in the flexbox (<a href="https://github.com/linebender/xilem/pull/437">xilem#437</a>).</li> +<li>Fixes on iOS, including <a href="https://github.com/linebender/xilem/pull/418">xilem#418</a> and <a href="https://github.com/linebender/xilem/pull/421">xilem#421</a>.</li> +<li><a href="https://github.com/linebender/xilem/pull/233">xilem#233</a> allowed our tests to be run on CI in a consistent manner.</li> +</ul> +<h2 id="parley-original">Parley <a href="https://linebender.org/blog/roadmap-may-2024/#parley">(original)</a></h2> +<h3 id="create-abstractions-for-text-selection-and-editing-original">Create abstractions for text selection and editing <a href="https://linebender.org/blog/roadmap-may-2024/#write-pass-order-rfc">(original)</a> ?</h3> +<ul> +<li><strong>Priority</strong>: Highest</li> +<li><strong>Status</strong>: There have been useful discussions in <a href="https://github.com/linebender/parley/issues/52">parley#52</a>. +Work has started on this in <a href="https://github.com/linebender/parley/pull/106">parley#106</a> in response to this retrospective.</li> +</ul> +<h3 id="inline-block-layout-original">Inline block layout <a href="https://linebender.org/blog/roadmap-may-2024/#inline-block-layout">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: High</li> +<li><strong>Status</strong>: A first cut of this feature was added by Nico Burns in (<a href="https://github.com/linebender/parley/pull/67">parley#67</a>). +<a href="https://github.com/linebender/parley/pull/76">parley#76</a> expands upon this, and has been approved in principle, but is awaiting thorough review.</li> +</ul> +<h3 id="write-adequate-documentation-original">Write adequate documentation <a href="https://linebender.org/blog/roadmap-may-2024/#write-adequate-documentation">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: High</li> +<li><strong>Status</strong>: Some work was done towards this in <a href="https://github.com/linebender/parley/pull/26">parley#26</a>, which unfortunately could not be merged. +<a href="https://github.com/linebender/parley/pull/97">parley#97</a> added some documentation to Fontique. +Further documentation work from Nico is currently blocked on the tree-like styles PR <a href="https://github.com/linebender/parley/pull/76">parley#76</a> being merged (to avoid conflicts).</li> +</ul> +<h3 id="software-renderer-original">Software renderer <a href="https://linebender.org/blog/roadmap-may-2024/#software-renderer">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: Low</li> +<li><strong>Status</strong>: This was not completed in the form envisioned. +However, Nico contributed two examples, showing how to use Parley with Swash (<a href="https://github.com/linebender/parley/pull/54">parley#54</a>) and tiny-skia (<a href="https://github.com/linebender/parley/pull/55">parley#55</a>). +We have decided not to carry this forward into the next roadmap.</li> +</ul> +<h3 id="parley-extras">Progress beyond roadmap</h3> +<p><a href="https://github.com/linebender/parley/pull/56">parley#56</a> added support for Emoji, which is used with the <a href="https://linebender.org/blog/roadmap-may-2024-retro/#vello-extras">Vello PRs</a>.</p> +<p>Recently the <a href="https://github.com/harfbuzz/harfruzz">harfruzz</a> project, a fork of rustybuzz to be integrated fully with fontations, has emerged as an extremely promising direction for text shaping for the Rust ecosystem. We plan to use it as the basis for text layout.</p> +<h2 id="xilem">Xilem <a href="https://linebender.org/blog/roadmap-may-2024/#xilem">(original)</a></h2> +<h3 id="android-bringup-original">Android bringup <a href="https://linebender.org/blog/roadmap-may-2024/#android-bringup">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: Highest</li> +<li><strong>Status</strong>: Android is supported in several of our examples, with the primary work required for support completed in <a href="https://github.com/linebender/xilem/pull/309">xilem#309</a>. +No non-boilerplate code changes are required to get a Xilem application running on Android. +Some compromises were made, in particular cargo gives an un-silencable warning for each example which supports Android and cross-platform backends. +We did reach out to the Cargo team about this use case, but did not get a positive response.</li> +</ul> +<h3 id="update-repository-layout-original">Update repository layout <a href="https://linebender.org/blog/roadmap-may-2024/#update-repository-layout">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: High</li> +<li><strong>Status</strong>: This was completed in <a href="https://github.com/linebender/xilem/pull/302">xilem#302</a>. +Kaur applied the same change to Vello in <a href="https://github.com/linebender/vello/pull/590">vello#590</a>.</li> +</ul> +<h3 id="rework-core">Rework xilem_core to be compatible with Masonry backend <a href="https://linebender.org/blog/roadmap-may-2024/#rework-xilem-core-to-be-compatible-with-masonry-backend">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: High</li> +<li><strong>Status</strong>: This was completed in <a href="https://github.com/linebender/xilem/pull/310">xilem#310</a>. +Philipp then applied this to Xilem Web in <a href="https://github.com/linebender/xilem/pull/403">xilem#403</a>.</li> +</ul> +<h3 id="write-documentation-original">Write documentation <a href="https://linebender.org/blog/roadmap-may-2024/#write-documentation">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: High</li> +<li><strong>Status</strong>: This was not completed. +The work in <a href="https://github.com/linebender/xilem/pull/310">xilem#310</a> did document some of the core, but there is very little user-facing documentation of the Xilem level.</li> +</ul> +<h3 id="re-implement-async-integration-original">Re-implement async integration <a href="https://linebender.org/blog/roadmap-may-2024/#re-implement-async-integration">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: Medium</li> +<li><strong>Status</strong>: The core of this task was completed in <a href="https://github.com/linebender/xilem/pull/423">xilem#423</a> was the main implementation. +Two-way communication with the async tasks is not yet implemented</li> +</ul> +<h3 id="add-unit-tests-original">Add unit tests <a href="https://linebender.org/blog/roadmap-may-2024/#add-unit-tests">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: Low</li> +<li><strong>Status</strong>: This was not prioritised. +We have raised the priority of this item in our next roadmap.</li> +</ul> +<h3 id="add-basic-benchmarks-original">Add basic benchmarks <a href="https://linebender.org/blog/roadmap-may-2024/#add-basic-benchmarks">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: Low</li> +<li><strong>Status</strong>: There has been no progress on this item. +This will be a "highest" priority item in the next roadmap.</li> +</ul> +<h3 id="xilem-extras">Progress beyond roadmap</h3> +<p>Xilem has also seen some very useful changes not tracked above, including many community contributions. +Some highlights of these contributions are:</p> +<ul> +<li>Philipp Mildenberger contributed heavily to Xilem's core design, such as by restoring the ability to return <code>ViewSequence</code>s by returning to a previous workaround for Rust's overly-cautious trait solver (<a href="https://github.com/linebender/xilem/pull/394">xilem#472</a>). +He also extended the Xilem API by restoring <code>OneOf</code> (<a href="https://github.com/linebender/xilem/pull/394">xilem#394</a>), and implementing various <code>Adapt</code> nodes (<a href="https://github.com/linebender/xilem/pull/401">xilem#401</a>). +Additionally, he picked up the work to expand <code>Flex</code> to use the <a href="https://linebender.org/blog/roadmap-may-2024-retro/#rework-core">new Xilem Core</a> in <a href="https://github.com/linebender/xilem/pull/428">xilem#428</a>.</li> +<li>Jared O'Connell contributed two new examples, a calculator (<a href="https://github.com/linebender/xilem/pull/467">xilem#467</a>), and a stopwatch (<a href="https://github.com/linebender/xilem/pull/492">xilem#492</a>).</li> +</ul> +<p>There has also been lots of really good progress on Xilem Web, but we do not roadmap Xilem Web and so we do not cover that progress here.</p> +<h2 id="accesskit-original">AccessKit <a href="https://linebender.org/blog/roadmap-may-2024/#accesskit">(original)</a></h2> +<p>Matt Campbell's work on AccessKit has begun, and a proof-of-concept Android adapter is in progress.</p> +<!-- TODO: Can we point to a PR instead? --> +<p>At the time of writing there is not a permanent link to this work, but it can be seen in the <a href="https://github.com/AccessKit/accesskit/tree/android-basics">android-basics</a> branch.</p> +<h2 id="android-specific-work-original">Android specific work <a href="https://linebender.org/blog/roadmap-may-2024/#android-specific-work">(original)</a></h2> +<h3 id="subclassing">Subclassing View/Application/Activity <a href="https://linebender.org/blog/roadmap-may-2024/#subclassing-view-application-activity">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: Highest</li> +<li><strong>Status</strong>: This work is in progress, and unfortunately has required more research than expected. +We spent some time investigating DEX injection, which Matt has got implemented. +However, it’s now looking like a custom Activity and View is the way forward, which requires close collaboration with upstream tools. +We are continuing to prioritise this highly.</li> +</ul> +<h3 id="handling-ime-original">Handling IME <a href="https://linebender.org/blog/roadmap-may-2024/#handling-ime">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: Highest</li> +<li><strong>Status</strong>: This work is ongoing. +<a href="https://github.com/rust-windowing/winit/pull/3787">winit#3787</a> allows opening a virtual keyboard, however this does not integrate with full IME (so for example, it is incompatible with autocorrect). +Real IME requires the Activity to support it directly and therefore involves <a href="https://linebender.org/blog/roadmap-may-2024-retro/#subclassing">content view subclassing</a>.</li> +</ul> +<h3 id="gesture-recognition-original">Gesture recognition <a href="https://linebender.org/blog/roadmap-may-2024/#gesture-recognition">(original)</a></h3> +<ul> +<li><strong>Priority</strong>: Low</li> +<li><strong>Status</strong>: <a href="https://github.com/linebender/xilem/pull/313">xilem#313</a> added emulated mouse press and move from touches. +This unblocked use of Xilem on Android, but is not the intended final state. +The priority of detecting a scrolling gesture has been increased slightly.</li> +</ul> +<h2 id="conclusions">Conclusions</h2> +<p>Overall, the roadmap provided a useful guide of what to work on, and we have implemented many of the most important features from it. +One clear recurring issue is documentation - even where we have chosen to roadmap this, we have made little progress. +Similar concerns are clear for testing in Xilem, although we have laid some important groundwork there. +We firmly recognise the role of documentation as an aid to onboarding, which is becoming more important as we work towards alpha releases. +I believe that we can make good progress in this area before the end of 2024.</p> + + + + + This Month in Xilem, July 2024 + 2024-08-08T00:00:00+00:00 + 2024-08-08T00:00:00+00:00 + + + + Daniel McNab + + + + + + Olivier Faure + + + + + https://linebender.org/blog/tmix-07/ + + <p>Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for <a href="https://rust-lang.org">the Rust programming language</a>.</p> +<p>This month saw a lot of community contributions to Linebender projects. +Philipp Mildenberger especially is a major driver for progress on Xilem and especially the <code>xilem_web</code> crate. +Bruce Mitchener has been very active reviewing pull requests, which is an under-appreciated but essential task for any open-source project.</p> +<h2 id="xilem">Xilem</h2> +<p>Xilem is our flagship GUI project, inspired by SwiftUI.</p> +<ul> +<li><a href="https://github.com/linebender/xilem/pull/423">xilem#423</a> integrates Tokio into Xilem, showing how the Xilem model can interact with async work.</li> +<li><a href="https://github.com/linebender/xilem/pull/428">xilem#428</a> by Philipp adds explicit support for Flex parameters.</li> +<li>Philipp ported the async work to Xilem Web, and experimented with some extensions: +<ul> +<li><a href="https://github.com/linebender/xilem/pull/440">xilem#440</a> is an experiment into async event handling.</li> +<li><a href="https://github.com/linebender/xilem/pull/448">xilem#448</a> added the <code>MemoizedAwait</code> view, which runs a task whenever the input data has a new value.</li> +</ul> +</li> +<li><a href="https://github.com/linebender/xilem/pull/467">xilem#467</a> by Jared O'Connell adds a calculator example. +This example can also be run on Android (<a href="https://github.com/linebender/xilem/pull/474">xilem#474</a>).</li> +</ul> +<figure> +<img style="height: auto" src="calculator_example.png" alt="A calculator with display section showing the calculation 9994 + 3231 = 13225. Below this section is a grid of buttons 4 wide and 5 tall, containing the digits 0-9 and some other calculator operations." height="533" width = "931"> +<figcaption> +<p>The new <code>calc</code> example for Xilem.</p> +</figcaption> +</figure> +<h2 id="masonry">Masonry</h2> +<p>Masonry is the widget system used by Xilem. +The most impactful change was the implementation of the <a href="https://github.com/linebender/rfcs/blob/main/rfcs/0006-widgets-in-arenas.md">"Widgets in arenas" RFC</a> in <a href="https://github.com/linebender/xilem/pull/396">xilem#396</a>. +Widgets are now stored in a global arena, which has little impact on the public APIs but make future changes a lot easier to implement.</p> +<ul> +<li><a href="https://github.com/linebender/xilem/pull/417">xilem#417</a> exposes an unstable API for embedding Masonry and Xilem into an existing Winit application.</li> +<li><a href="https://github.com/linebender/xilem/pull/418">xilem#418</a>, <a href="https://github.com/linebender/xilem/pull/421">xilem#421</a> improved our unofficial support for iOS.</li> +<li><a href="https://github.com/linebender/rfcs/pull/7">rfcs#7</a> specifies a clearer architecture for passes, including simplifications necessary for compositor use. +Actually integrating with the compositor is still out of scope <a href="https://raphlinus.github.io/ui/graphics/2020/09/13/compositor-is-evil.html">for reasons Raph has laid out before</a>, but the new pass specification gives us a starting point when we get there.</li> +</ul> +<h2 id="vello">Vello</h2> +<p>Vello is our GPU vector renderer.</p> +<ul> +<li>The <a href="https://linebender.org/gpu-stroke-expansion-paper/">GPU-friendly Stroke Expansion</a> paper has been released. +Follow the link for the outline, the full paper, demos, and a talk at the HPG 2024 conference. +Note that the interactive demo is built with <code>xilem_web</code>.</li> +<li><a href="https://github.com/linebender/vello/releases/tag/v0.2.1">Vello 0.2.1</a> has been released. +This patch version resolves a longstanding crash around empty scenes.</li> +<li><a href="https://github.com/linebender/vello/pull/643">vello#643</a>, <a href="https://github.com/linebender/vello/pull/647">vello#647</a> switch to Git LFS for storing snapshot test files. +Git LFS is an open-source Git extension supported by Github, that lets users commit large files to a repository without permanently bloating it. +Using it has trade-offs around bandwidth usage in CI, but otherwise matches our use-case perfectly.</li> +</ul> +<figure> +<img style="height: auto" src="stroke_expansion_demo.png" alt="A screenshot containing a single bezier curve, split into several differently coloured segments. The control points of the curve are visible. The expanded stroke for this curve is shown as a filled section, with the generated line segment end points visible as small circles. There are several controls for settings of the stroke expansion above the curve." height="755" width = "868"> +<figcaption> +<p>The demo for the stroke expansion paper, which was created using Xilem Web. +An interactive version can be found on the <a href="https://linebender.org/gpu-stroke-expansion-paper/#beztoy-container">paper's website</a>.</p> +</figcaption> +</figure> +<h2 id="parley">Parley</h2> +<p>Parley is a text layout library. +Nico Burns contributed quite a few improvements to Parley this month:</p> +<ul> +<li><a href="https://github.com/linebender/parley/pull/67">parley#67</a> implements inline box layout, which lets us mix textual and non-textual content and have the non-textual content laid out in flow with the text.</li> +<li><a href="https://github.com/linebender/parley/pull/76">parley#76</a>, <a href="https://github.com/linebender/parley/pull/84">parley#84</a> gets style types closer to CSS engines.</li> +</ul> +<h2 id="others">Others</h2> +<ul> +<li><a href="https://github.com/linebender/glazier/">The Glazier repository</a> has been archived. +This is in continuity with our direction so far, as we've dropped support for it and committed to building our crates on top of Winit.</li> +<li>We are at the end of our documented <a href="https://linebender.org/blog/roadmap-may-2024/">May-July 2024 roadmap</a>. +We expect to do a full retrospective on it soon, including the items we shipped and those that slipped.</li> +<li>Daniel and Olivier are now accepting "office hours" style appointments, for open-ended discussion of the ecosystem. +<ul> +<li><a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ32eQYJ9DtZ_wJaYNtT36YioETiloZDIdImFpBFRo5-XsqGzpikgkg47LPsiHhpiwiQ1orOwwW2">See Daniel's schedule here</a>.</li> +<li><a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ2t767ZRETD_TkRI_VxK2ZTG0VrO9OZ4l7HvTxefhtJcg85iK0ZN7zWNnAEZtH0Dn7C1GKxrmYM">See Olivier's schedule here</a>.</li> +</ul> +</li> +</ul> + + + + + This Month in Xilem, June 2024 + 2024-07-03T00:00:00+00:00 + 2024-07-03T00:00:00+00:00 + + + + Daniel McNab + + + + + https://linebender.org/blog/tmix-06/ + + <p>We released <a href="https://github.com/linebender/vello/releases/tag/v0.2.0">Vello 0.2.0</a> at the start of the month, which included some key improvements discussed in previous months' updates. +We also merged initial handling of Emoji (<a href="https://github.com/linebender/vello/pull/615">vello#615</a>), which supports glyphs which use the COLR specification (Apple's system emoji font does not use this format and so currently will not render). +In-flight work includes an enhanced testing setup (<a href="https://github.com/linebender/vello/pull/610">vello#610</a>), GPU memory allocation robustness (<a href="https://github.com/linebender/vello/pull/606">vello#606</a>), and improved correctness for some unusual strokes (<a href="https://github.com/linebender/vello/pull/607">vello#607</a>). +The <a href="https://github.com/linebender/gpu-stroke-expansion-paper">GPU-Friendly Stroke Expansion</a> paper has been accepted to <a href="https://www.highperformancegraphics.org/2024/index.html">High Performance Graphics 2024</a>, and will be presented in Denver on July 26. +A revised draft of the paper is published on <a href="https://arxiv.org/abs/2405.00127">arXiv</a>.</p> +<figure> +<img src="Xilem Emoji Picker.png" style="height: auto" alt="Screenshot of an app, containing a 4x4 grid of labelled Emoji, zoom in and out buttons and pagination controls. 'cat face with wry smile' is selected" height="1132" width = "863"> +<figcaption> +<p>A toy Emoji viewer example (<a href="https://github.com/linebender/xilem/pull/420">xilem#420</a>) running on Android. +This example uses system fonts, so has limited platform support because of the caveat mentioned above.</p> +</figcaption> +</figure> +<p><a href="https://github.com/linebender/xilem/pull/310">xilem#310</a> brought in some new ideas about how Xilem Core can be structured, which enables support for specialised kinds of <code>View</code>, such as for window properties. +<code>Adapt</code> views built on this were used to create an <a href="https://elm-lang.org/">Elm</a>-inspired example in <a href="https://github.com/linebender/xilem/pull/401">xilem#401</a>, showing the flexibility of the Xilem architecture. +Philipp Mildenberger has been prolific in his work on Xilem, as a co-author of the new Xilem Core, and in adapting Xilem Web to use it. +He also worked to bring support for <code>OneOf</code> views to Xilem Core in <a href="https://github.com/linebender/xilem/pull/394">xilem#394</a> - these were previously only supported in Xilem Web.</p> +<p>Masonry's observability support has also been improved, with automatic tracing to a temporary file in debug builds added in <a href="https://github.com/linebender/xilem/pull/384">xilem#384</a>. +<a href="https://github.com/linebender/xilem/pull/396">xilem#396</a> implements <a href="https://github.com/linebender/rfcs/pull/6">rfcs#6</a>, changing the architecture of Masonry to make it easier to write new features and tests.</p> +<p>There was also some excellent community engagement with Xilem in June. +Veniamin Ilmer has created an open source <a href="https://github.com/veniamin-ilmer/minesweeper_xilem/">Minesweeper game</a> using Xilem. +The discussion on Zulip (in <a href="https://xi.zulipchat.com/#narrow/stream/354396-xilem/topic/Minesweeper.20converted.20from.20Iced.20to.20Xilem">#xilem &gt; Minesweeper converted from Iced to Xilem</a>) has been very useful in guiding areas for improvement.</p> +<figure> +<img style="height: auto" src="Minesweeper.png" alt="A window titled Minesweeper, with text in the top-left 'Mines: 82', a top-center button with a neutral ASCII emoticon, and a board represented by a grid of buttons 30 wide and 16 tall, where some buttons are replaced with colour labels containing digits, and some buttons contain an exclamation mark." height="589" width = "931"> +<figcaption> +<p>Screenshot by Veniamin Ilmer of their Minesweeper game, used under the <a href="https://github.com/veniamin-ilmer/minesweeper_xilem/blob/main/LICENSE">Apache 2.0</a> license.</p> +</figcaption> +</figure> +<p>Following on from May, Olivier wrote and published a <a href="https://linebender.org/blog/rustnl-2024-unconference/">report</a> on our experience of the RustNL unconference. +This led to some useful discussion online - see <a href="https://xi.zulipchat.com/#narrow/stream/181284-blogging/topic/Draft.20-.20Report.20on.20the.20RustNL.202024.20Conference/near/444974910">the zulip thread</a> corresponding with that post for links. +We are now in the final month of the <a href="https://linebender.org/blog/roadmap-may-2024/">May-July 2024 roadmap</a>. +In the intervening time much of the work has been started or completed, although there have been some changes of priorities. +I expect that we will soon be looking at prioritising items on our <a href="https://linebender.org/wiki/long-term-roadmap/">long-term roadmap</a>.</p> + + + + + #![doc = include_str!()] with intra-doc links + 2024-06-28T00:00:00+00:00 + 2024-06-28T00:00:00+00:00 + + + + Daniel McNab + + + + + https://linebender.org/blog/doc-include/ + + <p>Creating crate level documentation by <a href="https://doc.rust-lang.org/rustdoc/write-documentation/the-doc-attribute.html#the-doc-attribute">including</a> your README can lower maintenance burden, as you do not need to manually keep the crate level docs synchronised. +However, when writing this documentation, you will also want to link directly to some mentioned <a href="https://doc.rust-lang.org/reference/items.html">items</a>. +These links need to work in all the places that the README is rendered, such as on your package's <a href="https://crates.io">https://crates.io</a> homepage, in addition to in rustdoc output. +To achieve this, you can link to the online documentation for the items:</p> +<pre data-lang="md" style="background-color:#2b303b;color:#c0c5ce;" class="language-md "><code class="language-md" data-lang="md"><span>To get started with foobar, use the </span><span style="color:#d08770;">[</span><span style="color:#a3be8c;">`frobnicate`</span><span style="color:#d08770;">][]</span><span> function. +</span><span> +</span><span style="color:#d08770;">[`frobnicate`]: https://docs.rs/foobar/latest/foobar/fn.frobnicate.html +</span></code></pre> +<p>This would however mean that users of <code>cargo doc</code> will be redirected to your crate's online docs (as opposed to their local docs) when clicking on that link. +It is however possible to make links in included markdown files behave as intra-doc links, by adding a second link reference definition in the documentation comment. +This must be placed <em>before</em> the <code>doc = include_str!()</code> line, for example:</p> +<pre data-lang="rust" style="background-color:#2b303b;color:#c0c5ce;" class="language-rust "><code class="language-rust" data-lang="rust"><span style="color:#65737e;">//! [`frobnicate`]: frobnicate +</span><span>#![</span><span style="color:#bf616a;">doc </span><span>= </span><span style="color:#bf616a;">include_str</span><span>(&quot;</span><span style="color:#a3be8c;">../README.md</span><span>&quot;)] +</span></code></pre> +<p>This means that the link has the expected link target on <a href="https://crates.io">https://crates.io</a> <em>and</em> in rustdoc (including on <a href="https://docs.rs">https://docs.rs</a>). +This trick works because when there are duplicate markdown link reference definitions, <a href="https://spec.commonmark.org/0.31.2/#example-204">"the first one takes precedence"</a>. +rustdoc sees the intra-doc link before the link to the online docs, and so uses the intra-doc link. +However, when the README is rendered standalone, only the link reference definition for the online docs is present, and so that target is used.</p> +<h3 id="example">Example</h3> +<p>For an example of both of these techniques in action, see the Android Trace crate (<code>android_trace</code>). +In particular, the text of interest is: "the main entry point to the library is <strong>AndroidTrace</strong>". +You can observe that this link goes to version 0.1.1 on the docs page, but version 0.1.0 elsewhere.</p> +<ul> +<li><a href="https://github.com/linebender/android_trace/blob/v0.1.1/android_trace/README.md">GitHub rendered readme</a></li> +<li><a href="https://crates.io/crates/android_trace/0.1.1">crates.io page</a></li> +<li><a href="https://docs.rs/android_trace/0.1.1/android_trace/">docs.rs page</a></li> +</ul> +<p>And the corresponding source code:</p> +<ul> +<li><a href="https://github.com/linebender/android_trace/blob/v0.1.1/android_trace/README.md?plain=1">README.md</a></li> +<li><a href="https://github.com/linebender/android_trace/blob/v0.1.1/android_trace/src/lib.rs">lib.rs</a></li> +</ul> +<p>The links have since been updated to use <code>latest</code>, but the direct link being to version 0.1.0 shows how this pattern works.</p> +<h3 id="getting-external-documentation-links">Getting external documentation links</h3> +<p>rust-analyzer has an "Open External Docs" command when you have an item selected. +This will open the online documentation for the selected item, generally on <a href="https://docs.rs">https://docs.rs</a>. +This works even if the item is yet to be published, in which case it will open the URL where the item would be. +You may wish to replace the resolved version number in the URL with <code>latest</code>, e.g. <code>https://docs.rs/foobar/latest/foobar/</code></p> +<h3 id="limitations">Limitations</h3> +<p><code>#![doc = include_str!("../README.md")]</code> has two main relevant limitations which you may need to work around.</p> +<p>The first of these is in code blocks. +Normal rustdoc examples can include hidden setup lines, starting with a <code>#</code> character. +These will not be rendered by rustdoc.</p> +<pre data-lang="md" style="background-color:#2b303b;color:#c0c5ce;" class="language-md "><code class="language-md" data-lang="md"><span>```</span><span style="color:#d08770;">rust +</span><span># </span><span style="color:#b48ead;">use </span><span>foobar::frobnicate; +</span><span style="color:#96b5b4;">frobnicate</span><span>(); +</span><span>``` +</span></code></pre> +<p>However, other markdown renderers do not support this extension, so the example above will be rendered as something like:</p> +<pre data-lang="rust" style="background-color:#2b303b;color:#c0c5ce;" class="language-rust "><code class="language-rust" data-lang="rust"><span># </span><span style="color:#b48ead;">use </span><span>foobar::frobnicate; +</span><span style="color:#96b5b4;">frobnicate</span><span>(); +</span></code></pre> +<p>Unfortunately, I am not aware of a workaround for this; my current best suggestion is to avoid using these hidden lines in your README. +Doctests in included markdown files do also have some diagnostics issues, as reported in <a href="https://github.com/rust-lang/rust/issues/81070">rust-lang/rust#81070</a>.</p> +<p>The second limitation is with file links, such as a link to your license file of the form <code>[LICENSE-MIT](LICENSE-MIT)</code> (as recommended in <a href="https://rust-lang.github.io/api-guidelines/necessities.html#crate-and-its-dependencies-have-a-permissive-license-c-permissive">C-PERMISSIVE</a>). +This is because rustdoc does not support relative file links in Markdown. +This can be solved by using the "opposite" of this trick - you can use a web link in your <code>lib.rs</code>, and a file link in the README.</p> +<h2 id="a-second-trick">A second trick</h2> +<p>READMEs contain some content which are not expected to be present in a crate's documentation. +For example, a top-level title, which would duplicate the <code>crate foobar</code> header added by rustdoc. +This can be resolved by using css in your documentation to hide these items; rustdoc allows embedding CSS in your documentation. +However, this should only be included in your <code>lib.rs</code>, so that the header is shown in other contexts.</p> +<pre data-lang="rs" style="background-color:#2b303b;color:#c0c5ce;" class="language-rs "><code class="language-rs" data-lang="rs"><span style="color:#65737e;">//! &lt;style&gt; +</span><span style="color:#65737e;">//! .rustdoc-hidden { display: none; } +</span><span style="color:#65737e;">//! &lt;/style&gt; +</span></code></pre> +<p>Any text in the README which should be excluded from your docs page can then be surrounded by a <code>div</code> with the <code>rustdoc-hidden</code> class, for example:</p> +<pre data-lang="md" style="background-color:#2b303b;color:#c0c5ce;" class="language-md "><code class="language-md" data-lang="md"><span>&lt;</span><span style="color:#bf616a;">div </span><span style="color:#d08770;">class </span><span>= &quot;</span><span style="color:#a3be8c;">rustdoc-hidden</span><span>&quot;&gt; +</span><span> +</span><span style="color:#8fa1b3;"># Foobar +</span><span> +</span><span>&lt;/</span><span style="color:#bf616a;">div</span><span>&gt; +</span></code></pre> +<p>As far as I'm aware, this does not have any accessibility considerations, as browsers will not make <code>display: none</code> items available in their accessibility tree.</p> +<p>Tracing Android Trace (see <a href="https://linebender.org/blog/doc-include/#example">above</a>) also uses this trick to hide the license section from the crate docs. +The license information is already present in the crate's info box.</p> +<h2 id="conclusion">Conclusion</h2> +<p>Using <code>#![doc = include_str!("../README.md")]</code> can integrate nicely with intra-doc links, if you use some tricks. +I believe that this pattern reduces the quality gap between bespoke documentation in <code>lib.rs</code> enough that using README includes becomes the right pattern for most crates. +This avoids the maintenance burden of needing to ensure that text in the crate level docs and the README do not become out-of-sync. +I intend to evaluate this technique by applying it across Linebender crates. +It may still be better to have bespoke documentation for each location, for projects which can afford the maintenance costs of that solution. +But for other projects, this can provide an easy way to improve their crate level documentation.</p> +<p>These patterns can also be applied when including non-<code>README</code> markdown documents. +I suggest linking to this post when using these patterns, to allow future readers of your code to understand the technique being used.</p> +<p>Discuss on <a href="https://xi.zulipchat.com/#narrow/stream/181284-blogging/topic/.23!.5Bdoc.20.3D.20include_str!.28.29.5D.20with.20intra-doc.20links">the Linebender Zulip</a>.</p> + + + + + May-July roadmap for Linebender + 2024-06-17T00:00:00+00:00 + 2024-06-17T00:00:00+00:00 + + + + Olivier Faure + + + + + https://linebender.org/blog/roadmap-may-2024/ + + <p>On May 7 and 8, 2024, folks from the Linebender team went to <a href="https://2024.rustnl.org/">the RustNL conference</a> for two days, followed by two days of Unconference.</p> +<p>By that point, we all felt fairly exhausted, but <del>because Raph is a cruel taskmaster</del> since we wanted to use the opportunity we had, we came together in our hotel's conference room to discuss the Linebender project, and what we wanted from it.</p> +<p>We'd initially thought that this day would be an informal day of unstructured chatting about the ecosystem, but it fairly quickly turned into a semi-formal planning exercise, where we tried to figure out a roadmap for the next few months.</p> +<p>What follows is a comprehensive summary of what exactly we're planning to do. +We've tried to focus on blockers, where a missing feature in one project is stalling progress on other projects, because those are the hardest barriers to coordination, and we wanted to take advantage of being in the same room together to knock them down.</p> +<p>This is a snapshot of the project status at the time we're writing this. +It includes some work we already finished since RustNL, but will not be updated when further work finishes.</p> +<h2 id="vello">Vello</h2> +<h3 id="robust-dynamic-memory">Robust dynamic memory</h3> +<ul> +<li><strong>Priority:</strong> Highest.</li> +<li><strong>Assigned:</strong> Daniel McNab.</li> +<li><strong>Description:</strong> Allocating dynamic memory in a robust way is essential to display large scenes without graphical artifacts. We have several possible solutions, we need to implement one.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/vello/issues/366">vello#366</a></li> +</ul> +<h3 id="reliable-snapshot-tests">Reliable snapshot tests</h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Assigned:</strong> Daniel McNab.</li> +<li><strong>Description:</strong> Snapshot tests are essential to test regressions in graphic software. Masonry's test suite heavily depends on them. But it's flaky right now because even when the fonts and inputs are exactly the same, renderers can have subtle differences that make the snapshots slightly different. We either need to create a fully deterministic renderer or add testing infrastructure that can tolerate small differences. <a href="https://docs.rs/nv-flip/latest/nv_flip/"><code>nv-flip</code></a> might have what we want.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/vello/issues/608">vello#608</a></li> +</ul> +<h3 id="sparse-strips">Sparse strips</h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Assigned:</strong> Raph Levien.</li> +<li><strong>Description:</strong> Sparse strips are a new research direction that might significantly improve our rendering pipeline and our memory footprint. We want to write a prototype implementation so we can confirm the performance benefits.</li> +<li><strong>Zulip thread:</strong> <a href="https://xi.zulipchat.com/#narrow/stream/197075-gpu/topic/Sparse.20strip.20path.20rendering">Sparse strip path rendering</a></li> +</ul> +<h3 id="add-tests">Add tests</h3> +<ul> +<li><strong>Priority:</strong> Medium.</li> +<li><strong>Assigned:</strong> Olivier Faure.</li> +<li><strong>Description:</strong> Adding tests is often a "we'll do it later" item, but it has short-term benefits as well. Adding tests would help Vello contributors check that their modifications don't add regressions to the crate, and help us catch hidden bugs. As a first step, we'd want to at least add some extremely basic tests, such as checking that Vello doesn't crash when we run a sample image through the CPU shaders.</li> +<li><strong>PR:</strong> <a href="https://github.com/linebender/vello/pull/439">vello#439</a></li> +</ul> +<h2 id="masonry">Masonry</h2> +<h3 id="complete-text-input">Complete text input</h3> +<ul> +<li><strong>Priority:</strong> Highest.</li> +<li><strong>Assigned:</strong> Olivier Faure, Aaron Muir Hamilton.</li> +<li><strong>Description:</strong> We'd like to bring up Masonry's textbox widget to be best-in-class among Rust frameworks. We want to support native-feeling interactions out of the box, such as cursor movement (go to next word, go to beginning of line), selection (select to end of text) and editing (IME, deleting an entire word, etc). This is something other framework developers have expressed interest in, so we want to implement it in a composable way.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/xilem/issues/388">xilem#388</a></li> +</ul> +<h3 id="better-tracing-for-debugging">Better tracing for debugging</h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Assigned:</strong> Olivier Faure.</li> +<li><strong>Description:</strong> Masonry currently uses the <code>tracing</code> crate to produce logs usable for debugging. These logs could be improved, so that a user finding a bug can quickly narrow in on information relevant to the bug, without having to restart the app with changed log levels. The bulk of the improvement would be to implement a new subscriber with multiple layers.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/xilem/issues/250">xilem#250</a></li> +</ul> +<h3 id="fix-glaring-documentation-problems">Fix glaring documentation problems</h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Assigned:</strong> Olivier Faure.</li> +<li><strong>Description:</strong> Masonry's documentation hasn't been updated since the port to Winit. While a lot of the code is still in flux, and thus hard to document, we should at least do a quick rewrite pass to remove references to Piet, Glazier, etc.</li> +<li><strong>PR:</strong> <a href="https://github.com/linebender/xilem/pull/329">xilem#329</a></li> +</ul> +<h3 id="finish-repository-port">Finish repository port</h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Assigned:</strong> Daniel McNab.</li> +<li><strong>Description:</strong> We've ported the <code>masonry-rs</code> repository to the <code>linebender</code> organization, but that repository isn't where the crate's code lives anymore. We should update the README to reflect that information, port the issues to <code>linebender/xilem</code>, and archive <code>linebender/masonry</code>.</li> +<li><strong>Zulip thread:</strong> <a href="https://xi.zulipchat.com/#narrow/stream/317477-masonry/topic/.E2.9C.94.20Finishing.20the.20Masonry.20repository.20transition">Finishing the Masonry repository transition</a></li> +</ul> +<h3 id="write-widgets-in-arena-rfc">Write "Widgets in Arena" RFC</h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Assigned:</strong> Olivier Faure.</li> +<li><strong>Description:</strong> This was something alluded to in the January blog posts. We want to move Masonry from storing widgets in WidgetPod to storing them in a slotmap-like arena. This is a large enough change to write an RFC about it.</li> +<li><strong>PR:</strong> <a href="https://github.com/linebender/rfcs/pull/6">rfcs#6</a></li> +</ul> +<h3 id="write-pass-order-rfc">Write "Pass order" RFC</h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Assigned:</strong> Olivier Faure.</li> +<li><strong>Description:</strong> Right now widgets can use context methods in their different passes to request that other passes be run. What passes can run what other passes isn't clearly documented, especially around edge cases. We should write an RFC to nail down the passes, how they can communicate, and the rationale around them.</li> +<li><strong>PR:</strong> TBD.</li> +</ul> +<h3 id="rewrite-documentation">Rewrite documentation</h3> +<ul> +<li><strong>Priority:</strong> Medium.</li> +<li><strong>Assigned:</strong> Olivier Faure.</li> +<li><strong>Description:</strong> Masonry's documentation hasn't been updated since the port to Winit. Once other major changes are implemented, the documentation should be brought up to date. We should avoid procrastinating on documentation too much just because the architecture is still in progress.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/xilem/issues/389">xilem#389</a></li> +</ul> +<h3 id="improve-focus-handling">Improve focus handling</h3> +<ul> +<li><strong>Priority:</strong> Medium.</li> +<li><strong>Assigned:</strong> Olivier Faure.</li> +<li><strong>Description:</strong> We should improve tab focus in Masonry. Right now tab focus has some bugs, doesn't cover buttons, isn't updated by clicks, and uses architecture inherited from Druid that could be strongly simplified once other architectural changes are completed.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/xilem/issues/390">xilem#390</a></li> +</ul> +<h3 id="improve-pointer-status-handling">Improve pointer status handling</h3> +<ul> +<li><strong>Priority:</strong> Medium.</li> +<li><strong>Assigned:</strong> Olivier Faure.</li> +<li><strong>Description:</strong> We should centralize and improve how Masonry handles pointers. In particular, we should add an explicit "pointer capture" API that makes other widgets not get events from that pointer until the pointer is released or lost.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/xilem/issues/312">xilem#312</a></li> +</ul> +<h2 id="parley">Parley</h2> +<h3 id="create-abstractions-for-text-selection-and-editing">Create abstractions for text selection and editing</h3> +<ul> +<li><strong>Priority:</strong> Highest.</li> +<li><strong>Assigned:</strong> Chad Brokaw, Aaron Muir Hamilton.</li> +<li><strong>Description:</strong> We want Parley to implement types and methods that Masonry and other editors will be able to use to create a text-editing widget, or to handle selection in non-editable text. The initial implementation may be located in Masonry.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/parley/issues/52">parley#52</a></li> +</ul> +<h3 id="inline-block-layout">Inline block layout</h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Assigned:</strong> Chad Brokaw.</li> +<li><strong>Description:</strong> Parley should support laying out inline content the way web browsers do, where blocks are spliced into your text and will be laid out according to available inline space the same way words are.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/parley/issues/25">parley#25</a></li> +<li><strong>PRs:</strong> <a href="https://github.com/linebender/parley/pull/67">parley#67</a>, <a href="https://github.com/linebender/parley/pull/76">parley#76</a></li> +</ul> +<h3 id="write-adequate-documentation">Write adequate documentation</h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Assigned:</strong> Nico Burns.</li> +<li><strong>Description:</strong> Parley currently has virtually no documentation. If we want it to become a foundational crate, we need to tell people how to use it.</li> +<li><strong>PR:</strong> <a href="https://github.com/linebender/parley/pull/26">parley#26</a></li> +</ul> +<h3 id="software-renderer">Software renderer</h3> +<ul> +<li><strong>Priority:</strong> Low.</li> +<li><strong>Assigned:</strong> Chad Brokaw.</li> +<li><strong>Description:</strong> Create a software renderer for the glyphs created by Parley, so that users can easily import Parley in their library without depending on a graphics API like Vello. The software renderer should be black-and-white for simplicity. We'll call for volunteers to implement COLRv1 and other advanced features.</li> +<li><strong>PRs:</strong> <a href="https://github.com/linebender/parley/pull/54">parley#54</a>, <a href="https://github.com/linebender/parley/pull/55">parley#55</a></li> +</ul> +<h2 id="xilem">Xilem</h2> +<h3 id="android-bringup">Android bringup</h3> +<ul> +<li><strong>Priority:</strong> Highest.</li> +<li><strong>Assigned:</strong> Daniel McNab.</li> +<li><strong>Description:</strong> We want Xilem to reliably work on Android. Running your Xilem app should require a small number of steps. Ideally, it should be as simple as running <code>cargo some-command</code> in your project.</li> +<li><strong>PR:</strong> <a href="https://github.com/linebender/xilem/pull/309">xilem#309</a></li> +</ul> +<h3 id="update-repository-layout">Update repository layout.</h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Assigned:</strong> Olivier Faure.</li> +<li><strong>Description:</strong> We've agreed on a layout for Linebender repositories. We should move projects in the Xilem repo to match that layout.</li> +<li><strong>PRs:</strong> <a href="https://github.com/linebender/xilem/pull/302">xilem#302</a>, <a href="https://github.com/linebender/vello/pull/590">vello#590</a></li> +</ul> +<h3 id="rework-xilem-core-to-be-compatible-with-masonry-backend">Rework xilem_core to be compatible with Masonry backend</h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Assigned:</strong> Daniel McNab.</li> +<li><strong>Description:</strong> The version of Xilem that was ported to Masonry used a different <code>View</code> trait that is incompatible with the current <code>xilem_core</code> crate. We need to rework <code>xilem_core</code> to get traits that can be used by both Masonry and <code>xilem_web</code>. Doing so while keeping readable code is non-trivial.</li> +<li><strong>PR:</strong> <a href="https://github.com/linebender/xilem/pull/235">xilem#235</a>, <a href="https://github.com/linebender/xilem/pull/310">xilem#310</a></li> +</ul> +<h3 id="write-documentation">Write Documentation</h3> +<ul> +<li><strong>Priority:</strong> High.</li> +<li><strong>Assigned:</strong> Olivier Faure.</li> +<li><strong>Description:</strong> Xilem's lack of documentation is one of the problems new users complain about the most often. We need to avoid staying in that state for too long.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/xilem/issues/392">xilem#392</a></li> +</ul> +<h3 id="re-implement-async-integration">Re-implement async integration</h3> +<ul> +<li><strong>Priority:</strong> Medium.</li> +<li><strong>Assigned:</strong> Daniel McNab.</li> +<li><strong>Description:</strong> One of Xilem's selling points is the ability to handle virtual lists and async sources of data. That ability was temporarily removed for the Masonry port, but we'd like to add it back. We don't want Masonry to be aware of async stuff, but the AppDriver trait should at least provide a method which lets Xilem access Masonry internals on its own.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/xilem/issues/340">xilem#340</a></li> +</ul> +<h3 id="add-unit-tests">Add unit tests</h3> +<ul> +<li><strong>Priority:</strong> Low.</li> +<li><strong>Assigned:</strong> Olivier Faure.</li> +<li><strong>Description:</strong> We need to figure out an architecture for doing unit tests in Xilem. Tests can then be added by volunteer contributors. At some point we should hopefully switch to a "new test for every new feature" workflow.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/xilem/issues/393">xilem#393</a></li> +</ul> +<h3 id="add-basic-benchmarks">Add basic benchmarks</h3> +<ul> +<li><strong>Priority:</strong> Low.</li> +<li><strong>Assigned:</strong> Olivier Faure.</li> +<li><strong>Description:</strong> Right now we're mostly working off vibes to know whether or not any of our work improved performance or introduced regressions. +We should write at least <em>one</em> benchmark that would test a basic Xilem use-case, so we get a general idea of how our performance is progressing.</li> +<li><strong>Issue:</strong> <a href="https://github.com/linebender/xilem/issues/362">xilem#362</a></li> +</ul> +<h2 id="accesskit">AccessKit</h2> +<p>Matt Campbell's contract with Google hasn't started yet. +When it does, the top priority will likely be the Android backend.</p> +<p>The plan is to study existing Android accessibility implementations for non-Java toolkits, including Flutter, Chromium, and Gio, to get a better understanding of what's required to implement Android accessibility from scratch.</p> +<p>Beyond Android support, we've only had cursory discussions of what work Matt will do for the rest of the year. +Possible themes include scrollable containers, virtualized lists, richer text support (e.g. exposing font and style attributes) across platforms, and better integration into Xilem/Masonry.</p> +<h2 id="android-specific-work">Android-specific work</h2> +<p>Getting the Android port right involves a lot of small changes and making things feel non-broken.</p> +<p>Some notable sub-goals:</p> +<h3 id="subclassing-view-application-activity">Subclassing View/Application/Activity</h3> +<ul> +<li><strong>Priority:</strong> Highest.</li> +<li><strong>Assigned:</strong> Aaron Muir Hamilton, Raph Levien.</li> +<li><strong>Description:</strong> The Java classes of an Android application are where the rubber meets the road. We're investigating what we want our boilerplate to look like.</li> +</ul> +<h3 id="handling-ime">Handling IME</h3> +<ul> +<li><strong>Priority:</strong> Highest.</li> +<li><strong>Assigned:</strong> Aaron Muir Hamilton, Raph Levien.</li> +<li><strong>Description:</strong> We need to extend Winit to be compatible with Android IME interfaces. An Android application without support for the virtual keyboard and other input methods is a non-starter. Our design choices here will have some influence on accessibility as well.</li> +</ul> +<h3 id="gesture-recognition">Gesture recognition</h3> +<ul> +<li><strong>Priority:</strong> Low.</li> +<li><strong>Assigned:</strong> Aaron Muir Hamilton.</li> +<li><strong>Description:</strong> When the user swipes on the screen, we want to send some kind of scrolling event instead of a normal pointer event. Ideally there should be first-class support for that event to handle momentum scrolling, but a dumber solution would just emulate mouse wheel ticks.</li> +</ul> +<h2 id="conclusion">Conclusion</h2> +<p>Whew! We have our work cut out for us there.</p> +<p>Overall, I'm feeling very optimistic about the coming months. +In the weeks since we first drafted this roadmap, we've already made a lot of progress on our respective tasks (for instance Daniel is now running on what async experts call a "work-stealing" algorithm), so it does look like we'll meet our deadlines.</p> +<p>What comes after that is a bit hazier. +Our three areas of focus are likely to be Android support, accessibility, and developer experience.</p> +<p>As we fill out gaps in our feature set, Xilem is moving towards its faraway goal: becoming a stable, mature framework for GUI applications. +We're not GUI yet, but we certainly hope to be one day.</p> +<p>In the meantime, stay tuned!</p> + + + + + Report on the RustNL 2024 Unconference + 2024-06-15T00:00:00+00:00 + 2024-06-15T00:00:00+00:00 + + + + Olivier Faure + + + + + https://linebender.org/blog/rustnl-2024-unconference/ + + <p>On May 7 and 8, 2024, folks from the Linebender team went to <a href="https://2024.rustnl.org/">the RustNL conference</a> in Delft. +We listened to <a href="https://www.youtube.com/playlist?list=PL8Q1w7Ff68DBZZbJt3ie5MUoJV5v2HeA7">some Rust-related talks</a>, Raph <a href="https://www.youtube.com/watch?v=OvfNipIcRiQ&amp;list=PL8Q1w7Ff68DBZZbJt3ie5MUoJV5v2HeA7&amp;index=15">gave one on Xilem</a>, Rik Arends did the "hot-reload my entire editor live" thing that makes every other Rust GUI developer jealous, it was an all-around great time.</p> +<p>After RustNL, though, another less-documented event called <a href="https://2024.rustnl.org/unconf/">The Unconference</a>. +It was from roughly the same organizers and took place in the same city, but the format was fairly different.</p> +<p>The Unconference wasn't livestreamed, and I haven't found any public discussion of it, so I thought I'd take the time to describe a bit of what was going on.</p> +<h2 id="the-format">The format</h2> +<p>The "Unconference" was two days of loosely structured chats between members of various Rust project teams where people talked about ecosystem collaboration, complained to lang team members that their favorite feature wasn't implemented yet, <a href="https://poignardazur.github.io/2024/05/25/report-on-rustnl-variadics/">went to pester everyone else about variadic generics</a>, and other good fun.</p> +<p>Attendees were split into three teams:</p> +<ul> +<li>The Rust project.</li> +<li>GUI and Applications.</li> +<li>Embedded development.</li> +</ul> +<p>Discussions inside these teams were mostly self-organized, with cross-team discussions mostly taking place during lunch and recess.</p> +<h3 id="on-the-tyranny-of-structurelessness">On the tyranny of structurelessness</h3> +<p><em>Note: This section is very much my personal opinion and doesn't represent the Linebender project as a whole.</em></p> +<p>I'm not sure the self-organized format worked well.</p> +<p>From what I saw, the Embedded team took well to it, and the Rust team was kept productive thanks to Alice Cecile's efforts in marshaling everyone.</p> +<p>In the case of the GUI team, people were spread in a very large room, which should have been conducive to small side discussions and people splitting up to talk about the problems that interested them. +Instead, there was an unspoken accord to progress through agenda items one by one, with a few people dominating the discussions on these items.</p> +<p>Because those people we spread around a large room, they had to talk loudly to address each other, which left little room for side-discussions. +Because the people talking were naturally the most confident and extroverted, more introverted people ended up taking a passive role in the discussion.</p> +<p>To me, this feels like a strategic mistake. +It was a setup that encouraged bikeshedding and long back-and-forths and discouraged plurality of opinions. +It's no coincidence that the most interesting conversations of the Unconference happened at lunch: lunch was the point of the Unconference where people were most mixed, had the most spontaneous conversations, and were least constrained by having to follow what someone else was saying.</p> +<p>Our discussions were still productive, I just feel like the format could have been improved.</p> +<h2 id="the-gui-team">The GUI team</h2> +<p>As a member of the Linebender project, I was mostly exposed to the GUI team's proceedings.</p> +<p>The main topics of interest were:</p> +<ul> +<li>Build tooling (especially for Android and other non-desktop platforms).</li> +<li>Text layout and editing.</li> +<li>Winit adoption.</li> +<li>Accessibility.</li> +<li>Potential for further collaboration.</li> +<li>Requests for new Rust features.</li> +</ul> +<p>Note that I'm skipping a lot of topics from the agenda and other side discussions. +The topics above were the most prominent during those two days.</p> +<p>There was also a fair amount of informal chatter around LogLog Games' strongly critical <a href="https://loglog.games/blog/leaving-rust-gamedev/">Leaving Rust gamedev after 3 years</a> article. +I think those discussions mostly reflected the Bevy community's consensus, that the article had some flaws but overall pointed at very clear weaknesses in the Rust GUI / game engine ecosystem.</p> +<h3 id="build-tooling">Build tooling</h3> +<p>Everyone agreed that a better solution was needed to ship non-TUI Rust apps.</p> +<p>There was discussion about various platforms and build systems, and the difficulty of having to e.g. write Java code for an Android port, and whether anyone wanted to take responsibility for maintaining that glue layer for the rest of the ecosystem.</p> +<p>No actionable decisions were made, but the consensus seems to be that although integrated build tools are desirable, external build tooling for complex platforms (primarily Apple and Android) is likely to remain necessary. +Nobody seems to have stepped up to work on multi-target builds in Cargo, and since external build tools are required as it is, most people are okay with building everything several times when they release a multi-target package. +Most users are comfortable invoking platform-specific tools for bundling, signing, and manifest generation, so there is not much urgency for integrated tooling for these.</p> +<h3 id="text-layout-and-editing">Text layout and editing</h3> +<p>There was some widespread interest in the Linebender ecosystem's text-handling crates. +From what I remember, Rik Arends and others had concerns about whether e.g. Parley and Swash depend on our Vello renderer (they don't).</p> +<p>Some people also wanted Parley to be decoupled from Swash.</p> +<p>People were especially interested in the idea of having access to a common text-editing widget, or at least infrastructure for creating one. +That widget would handle IME, text selection, accessibility actions, etc, in a way that would feel native to different platforms with their own text-editing quirks (mobile, macOS, Linux with vim mode, etc).</p> +<h3 id="winit">Winit</h3> +<p>By now all of the Rust ecosystem has firmly converged on <a href="https://github.com/rust-windowing/winit"><code>winit</code></a> as the windowing platform-abstraction solution of choice.</p> +<p>(Well, not all! <a href="https://github.com/makepad/makepad">One small project</a> with indomitable maintainers still holds out against the invaders.)</p> +<p>The consensus during this discussion seemed to be that Winit was there to stay. +<a href="https://github.com/tauri-apps/tao">TAO</a> users present were generally interested in being able to use upstream Winit in the future, if its API adopts or supersedes the improvements made in TAO. +Most were happy to see Winit becoming more trait-oriented, and to see the <code>dpi</code> crate spun off from Winit.</p> +<p>Glazier is still shelved and we're planning to port its features to Winit until it reaches feature parity.</p> +<p>A discussion that came up was the idea of splitting more "vocabulary types" from Winit into standalone crates. +Vocabulary crates, e.g. crates that only define types and very little code, have a very low cost in memory and build times, while allowing projects to interop with e.g. Winit without actually adding a dependency on Winit.</p> +<p>This was connected with the discussions about text editing: having a vocabulary crate that would list Winit's events and also Parley's cursor movements would allow for a very low-dependency text editing widget.</p> +<h3 id="accessibility">Accessibility</h3> +<p><em>Note: This section is also my personal opinion and doesn't represent the Linebender project either.</em></p> +<p>The subject of Accessibility came up informally, but I'll claim it was underexplored.</p> +<p>While the subject was on the agenda, by the time we reached it the Unconference had been running long enough that everyone was tired and ready to leave or get to the catering. +This is an unfortunate pattern that I think is worth pointing out: if projects don't make a deliberate effort to prioritize discussions of accessibility, the subject will be left out.</p> +<p>Matt Campbell, the maintainer of AccessKit, could not attend the Unconference. +I'm concerned that, in his absence, other maintainers might have felt a dilution of responsibility: since the accessibility guy wasn't there, nobody felt empowered to bring up accessibility.</p> +<p>(This might sound like it contradicts my section about structurelessness above. +It doesn't. +I'm not saying organizers should have pushed harder for accessibility - they did try - I'm saying that we should strive for a culture where framework developers think about accessibility without waiting for someone to tell them to.)</p> +<p>One point did come up during the discussion which I'd like to hammer in: the Rust ecosystem should adopt a holistic view of accessibility. +Accessibility isn't just about screen readers, and making a framework accessible doesn't stop at adding AccessKit as a dependency, though doing so is a great first step.</p> +<p>Rik asked if there was a minimal set of ARIA attributes that people could start using in their UI, as the set of available attributes is gigantic. +The AccessKit framework is rich, and it's not obvious at first glance how much is needed versus nice-to-have. +The current reference in the Rust ecosystem is <a href="https://github.com/emilk/egui/pull/2294">the AccessKit implementation in egui</a>.</p> +<h3 id="requests-for-rust-features">Requests for Rust features</h3> +<p>Jon Kelley, the creator of Dioxus, had <a href="https://dioxus.notion.site/Dioxus-Labs-High-level-Rust-5fe1f1c9c8334815ad488410d948f05e">a laundry list of features</a> he wanted from the Rust language. +That list was later <a href="https://github.com/rust-lang/rust-project-goals/pull/10">filed in the Project Goals repository</a>.</p> +<p>The requests were well-documented, with motivating examples in existing Dioxus code that would clearly be improved by the features. +Most of them felt both self-contained and like they would tremendously both beginners and veteran Rust developers; though Jon made the point that the papercuts he wanted to remove were especially punishing for new developers trying to become familiar with Rust.</p> +<p>Overall people were very enthusiastic about them, and the lang team members in the room seemed pretty optimistic that those features could be added.</p> +<p>My favorite proposals were:</p> +<ul> +<li><code>Capture</code> trait for auto-cloning reference-counted types in closures.</li> +<li>Automatic partial borrows.</li> +<li>Optional struct attributes.</li> +</ul> +<p>Jon also wanted support for a remote cache of pre-built crates, so that users wouldn't suffer from having to rebuild dozens of crates every time you download your crate's dependencies. +The consensus from Rust maintainers was that such a cache would be essentially impossible with Rust's current architecture.</p> +<p>Niko Matsakis recently released <a href="https://smallcultfollowing.com/babysteps/blog/2024/06/02/the-borrow-checker-within/">The borrow checker within</a>, which feels like a follow-up to some of these discussions.</p> +<h2 id="collaboration-in-the-rust-gui-ecosystem">Collaboration in the Rust GUI ecosystem</h2> +<p>Over the last two years I've joked a few times that everybody in the Rust GUI ecosystem wants the ecosystem to standardize on common crates, as long as it's <em>their</em> crates.</p> +<p>After RustNL, I'm pleased to report this joke isn't accurate anymore.</p> +<p>A vibe that permeated all discussions was people wanting work to be pooled. +It felt like people didn't strongly care whose crate we adopted, as long as we all agreed the crate made sense: +we're slowly crawling out of the <a href="https://xkcd.com/927/">xkcd 927</a> dilemma.</p> +<p>The main ecosystem crates that people are enthusiastic about sharing are:</p> +<ul> +<li><a href="https://github.com/rust-windowing/winit">winit</a> for creating windows.</li> +<li><a href="https://github.com/AccessKit/accesskit/">AccessKit</a> for plugging into accessibility APIs.</li> +<li><a href="https://github.com/gfx-rs/wgpu/">wgpu</a> for using modern GPU features.</li> +</ul> +<p>Jon Kelley also said he would be interested in using Masonry as the native backend for Dioxus, though we haven't hashed out details yet.</p> +<h3 id="corporate-funding">Corporate funding</h3> +<p>For open-source projects, "Who funds this" is a difficult question: in any healthy project, there is a large scale of contributions, with individual non-corporate contributors at one end, and companies paying cash to the project's treasury at the other. +In-between are self-employed people like me contracted to work on an open-source project, and corporate employees who contribute to the project as part of their 9-to-5 job.</p> +<p>Some monetary contributions can also come from individual non-corporate donors: Servo has about fifty of them, for instance.</p> +<p>With that in mind, some notable sponsors for projects represented at the Unconference were:</p> +<ul> +<li><strong>Google Fonts:</strong> Linebender projects.</li> +<li><strong>Futurewei:</strong> Dioxus, Makepad, Robius and Servo.</li> +<li><strong>Embark:</strong> Bevy, winit and rust-gpu.</li> +<li><strong>Foresight Spatial Labs:</strong> Bevy.</li> +<li><strong>Rerun.io:</strong> egui.</li> +</ul> +<p>Not present at RustNL but relevant to the ecosystem are <strong>System76</strong> (funding COSMIC-Text and contributing to iced), <strong>Kraken</strong> (funding iced), and <strong>Slint</strong> who are self-funding as a startup targeting embedded UIs and couldn't attend due to time constraints.</p> +<p>Overall the number of different backers feels like a symptom of a healthy ecosystem: while some large corporate sponsors bring much more resources than others (Google and Futurewei especially), the ecosystem isn't in a state where any specific backer pulling out would completely collapse progress.</p> +<h2 id="conclusion">Conclusion</h2> +<p>Before anything else, I'd like to express a big thanks to the volunteers who helped organize RustNL.</p> +<p>Most of the attendees were absolutely exhausted after two days of talks and two more days of Unconference, but these folks had to <em>run</em> the darn thing. +I think everyone who attended was impressed with them.</p> +<p>Overall RustNL and the Unconference felt like getting a year of coordination done in a week. +It was a thoroughly productive time, and I couldn't be happier I attended. +Everyone I asked about it shared the same opinion.</p> +<p>And the discussions we had during the event showed there was a great appetite to push the ecosystem towards more cooperation, both between GUI projects and with Rust maintainers!</p> +<p>I'm feeling more hopeful about the future of Rust GUI than ever.</p> +<p>Now it's time to get back to work.</p> + + + + + This Month in Xilem, May 2024 + 2024-06-12T00:00:00+00:00 + 2024-06-12T00:00:00+00:00 + + + + Daniel McNab + + + + + https://linebender.org/blog/tmix-05/ + + <p>Several members of Linebender attended <a href="https://2024.rustnl.org/">RustNL</a> at the start of May. +Raph gave a talk titled <em>Xilem: Let's Build High Performance Rust UI</em> (<a href="https://youtu.be/OvfNipIcRiQ">YouTube</a>). +The conference also provided a great opportunity to meet with developers from other Rust user interface projects; +Olivier has produced a report on the unconference, which will be published here shortly. +In addition, those in attendance met after the conference and worked on a roadmap for Linebender, which we are also planning to share here.</p> +<p>We have taken several important steps on Xilem. +At the start of the month, we released <a href="https://github.com/linebender/xilem/releases/tag/v0.1.0">Xilem 0.1.0</a> and <a href="https://github.com/linebender/xilem/releases/tag/masonry%2Fv0.2.0">Masonry 0.2.0</a>. +This is the first published release of Xilem, and includes text input (<a href="https://github.com/linebender/xilem/pull/241">xilem#241</a>), AccessKit integration (<a href="https://github.com/linebender/xilem/pull/244">xilem#244</a>) and a TodoMVC inspired example (<a href="https://github.com/linebender/xilem/pull/257">xilem#257</a>). +Work through the rest of the month included explorations of a generic <code>View</code> trait (<a href="https://github.com/linebender/xilem/pull/310">xilem#310</a>), and an Android port (<a href="https://github.com/linebender/xilem/pull/309">xilem#309</a>, <a href="https://github.com/linebender/xilem/pull/313">xilem#313</a>). +<a href="https://github.com/linebender/rfcs/pull/6">rfcs#6</a> is designed to reduce boilerplate when using Masonry, which should help those creating custom Masonry widgets.</p> +<p>Other Linebender projects have seen steady improvements. +<a href="https://github.com/linebender/vello/pull/575">vello#575</a> significantly reduced shader compilation time at startup for projects using Vello, and <a href="https://github.com/linebender/vello/pull/516">vello#516</a> enabled clearer error handling. +Nico Burns has started an exciting project for inline box layout (<a href="https://github.com/linebender/parley/pull/67">parley#67</a>), which will enable Parley to be used in projects which must implement Web layout.</p> + + + + + This Month in Xilem, April 2024 + 2024-05-01T00:00:00+00:00 + 2024-05-01T00:00:00+00:00 + + + + Raph Levien + + + + + https://linebender.org/blog/tmix-04/ + + <p>Again, last month saw a substantial amount of infrastructure work in the development of Xilem. +The biggest change is landing Masonry as a crate within the Xilem repo (<a href="https://github.com/linebender/xilem/pull/203">xilem#203</a>) and adding a new xilem_masonry front-end. +The existing xilem widget tree remains in the tree during a transitional period, but the focus of development is now on Masonry.</p> +<p>Masonry is a principled abstraction layer within the stack. +While it is designed to work well with the Xilem reactive architecture, it is not dependent on it. +We'd love to see experimentation with alternative reactive frameworks, and also language bindings. +A lot more detail about the motivation and design of Masonry is in Olivier's <a href="https://linebender.org/blog/xilem-backend-roadmap/">roadmap blog</a>.</p> +<p>Two major infrastructural crates have been published. +<a href="https://crates.io/crates/parley">Parley</a> is our text layout crate, supporting variable fonts and other advanced features. +Supporting Parley is <a href="https://crates.io/crates/fontique">fontique</a>, a crate for enumerating the system fonts and making them available for itemization (choosing the right font to support a particular script).</p> +<p>In GPU rendering land, we have written a paper on GPU stroke expansion (<a href="https://arxiv.org/abs/2405.00127">arXiv</a>, <a href="https://github.com/linebender/gpu-stroke-expansion-paper">repo</a>) and submitted it to a conference. +This paper explains quite a bit of the math behind Vello's path rendering, and explains how we adapted it for high performance on the GPU. +It's also a good time to note the <a href="https://docs.rs/crate/wgpu/0.20.0">wgpu 0.20</a> release, which contains some work to improve on suboptimal zero initialization that will dramatically improve startup time on many platforms, including Android (<a href="https://github.com/gfx-rs/wgpu/pull/5508">wgpu#5508</a>). +It also has support for subgroups, which will unblock further performance improvements in Vello.</p> +<p>We're very much looking forward to participating in RustNL 2024, where Raph will present a talk on Xilem. +It looks like it will be a great opportunity to meet with other Rust UI ecosystem projects to find common ground and possibilities to collaborate.</p> + + + + + This Month in Xilem, March 2024 + 2024-04-04T00:00:00+00:00 + 2024-04-04T00:00:00+00:00 + + + + Daniel McNab + + + + + https://linebender.org/blog/tmix-03/ + + <p>Since the last update, there have been three newly released projects from Linebender:</p> +<ul> +<li><a href="https://crates.io/crates/velato"><img src="https://img.shields.io/crates/v/velato.svg" alt="Velato crates.io badge." /></a> +<a href="https://github.com/linebender/velato">Velato</a>: A parser and driver for Lottie animation files in applications using Vello</li> +<li><a href="https://crates.io/crates/vello_svg"><img src="https://img.shields.io/crates/v/vello_svg.svg" alt="Vello SVG crates.io badge." /></a> +<a href="https://github.com/linebender/vello_svg">Vello SVG</a>: Allows displaying (some) SVG documents in Vello applications</li> +<li><a href="https://crates.io/crates/tracing_android_trace"><img src="https://img.shields.io/crates/v/tracing_android_trace.svg" alt="Tracing Android Trace crates.io badge." /></a> +<a href="https://github.com/linebender/android_trace">Android Trace</a>: Resilient bindings to <a href="https://developer.android.com/ndk/reference/group/tracing">NDK Tracing</a> and an integration with <a href="https://crates.io/crates/tracing">tracing</a></li> +</ul> +<p>If you have a WebGPU capable browser you can check out the <a href="https://linebender.org/velato/">web demo of Velato</a>.</p> +<p>Implementation work for <a href="https://github.com/linebender/rfcs/blob/main/rfcs/0001-masonry-backend.md">rfcs#1</a> has started. Masonry is being ported to Vello in <a href="https://github.com/PoignardAzur/masonry-rs/pull/56">masonry#56</a>, with the next step being a move to Winit. +This work can be followed in the <a href="https://xi.zulipchat.com/#narrow/stream/317477-masonry">#masonry</a> stream on Zulip.</p> +<p>We have landed some important improvements to Vello. +Euler spiral based stroke expansion (<a href="https://github.com/linebender/vello/pull/496">vello#496</a>) enables GPU stroking by default, significantly improving performance in scenes which make heavy use of strokes. +Additionally, we now support scenes with more than 64k draw objects (<a href="https://github.com/linebender/vello/pull/526">vello#526</a>). +We have also been making progress on <a href="https://github.com/linebender/vello/issues/366">vello#366</a>, by evaluating different strategies for memory allocation. +The first part of this has landed in <a href="https://github.com/linebender/vello/pull/537">vello#537</a>, which avoids undefined behaviour in more out-of-memory cases.</p> +<p>Additionally, we have been able to continue taking advantage of improvements in the <a href="https://github.com/googlefonts/fontations">foundational font crates</a> from Google Fonts. +This has enabled support for font fallback in <a href="https://github.com/linebender/xilem/pull/196">xilem#196</a>. +Hinting has been unblocked by <a href="https://github.com/linebender/vello/pull/544">vello#544</a>, although the implementation has not yet landed in Xilem.</p> +<p><a href="https://github.com/linebender/rfcs/blob/main/rfcs/0005-version-matrix.md">rfcs#5</a> has been approved, which will improve the robustness of our continuous integration. +Kaur Kuut, the author of the RFC, has also landed these changes in <a href="https://github.com/linebender/vello/pull/523">vello#523</a>.</p> +<p>A focus for the next month is preparing for the <a href="https://2024.rustnl.org/">RustNL conference</a> at the beginning of May. +We are hoping to present a compelling demo there.</p> + + + + + This Month in Xilem, February 2024 + 2024-03-04T07:34:42+00:00 + 2024-03-04T07:34:42+00:00 + + + + Raph Levien + + + + + https://linebender.org/blog/tmix-02/ + + <p>Early this year, we made a decision to use the winit crate for window creation, as opposed to rolling our own. +That work has now landed in main (<a href="https://github.com/linebender/xilem/pull/176">xilem#176</a> was the main PR, with a number of followups). +A major motivation was to enable more platforms, with Android being a major goal. +That work is in progress; a major subtask is enumerating the system fonts. +As expected, this move has uncovered rough edges in winit and some regressions in behavior. +We plan to address those, with the improvements hopefully benefiting the entire Rust UI ecosystem.</p> +<p>The <a href="https://crates.io/crates/vello">Vello crate</a> has been published as version 0.1, with significant documentation improvements and a friendly example. +We consider this an alpha-quality release, as there are known issues. +Even so, we want to get a release out to facilitate integrations and shake out problems.</p> +<p>Another major area of work on Vello is investigation of startup time, which can take multiple seconds when the platform's GPU drivers are slow at compiling the compute shaders. +A number of techniques mitigate that. +One is to compile shaders in parallel, using multiple cores, and that has landed (<a href="https://github.com/linebender/vello/pull/455">vello#455</a>). +An even bigger improvement will be caching compiled shaders. +Daniel McNab has made an encouraging prototype (<a href="https://github.com/linebender/vello/pull/459">vello#459</a>), and the ultimate goal is to land that in wgpu so projects across the ecosystem can benefit from it (<a href="https://github.com/gfx-rs/wgpu/pull/5292">wgpu#5292</a>).</p> +<p>The work to compute strokes on the GPU using Euler spirals continues, but has not yet landed. +The current state is a draft PR that implements the logic in Rust code, which now needs to be translated to WGSL for GPU evaluation (<a href="https://github.com/linebender/vello/pull/496">vello#496</a>, draft PR).</p> +<p>There has been progress at higher levels of Xilem. +Among other things, Nico Burns landed a scroll view implementation (<a href="https://github.com/linebender/xilem/pull/155">xilem#155</a>), and Philipp Mildenberger has been steadily refining xilem_core and xilem_web, including fine grained tree structure tracking and minimal/efficient DOM-tree-updates (<a href="https://github.com/linebender/xilem/pull/160">xilem#160</a>).</p> + + + + + This Month in Xilem, January 2024 + 2024-02-06T07:28:42+00:00 + 2024-02-06T07:28:42+00:00 + + + + Raph Levien + + + + + https://linebender.org/blog/tmix-01/ + + <p>Welcome to the first in the “this month in Xilem” series, bringing updates on the <a href="https://github.com/linebender/xilem">Xilem</a> UI toolkit.</p> +<p>There were two blog posts on the new <a href="https://linebender.org/blog">Linebender blog</a>. +The first, <a href="https://linebender.org/blog/xilem-2024/">Xilem 2024 plans</a>, sets out the goals for the project for the year. +The second, <a href="https://linebender.org/blog/xilem-backend-roadmap/">Roadmap for the Xilem backend in 2024</a>, by Olivier Faure, presents a roadmap for the Xilem native widget set. +A major feature of the roadmap is a clean boundary between the Xilem reactive framework and the lower level widget set. +We hope that enables experimentation with other reactive frameworks and possibly integration with other projects, rather than requiring everybody to buy into the Xilem stack.</p> +<p>On the planning front, a major decision was whether to continue work on our own window creation library, <a href="https://github.com/linebender/glazier">Glazier</a>, or whether to join forces with <a href="https://github.com/rust-windowing/winit">winit</a>. +Among other things, since Android is a primary target for our work, and winit already has a working Android back-end, it offers an appealing path to getting that up quickly. +We have decided to try joining forces with winit, and look forward to future collaboration. +Over the next few weeks, that will entail porting Xilem over to winit (<a href="https://github.com/linebender/xilem/issues/163">xilem#163</a>) and also trying to land working Android IME (soft keyboard) support in winit (<a href="https://github.com/rust-windowing/winit/pull/2993">winit#2993</a>).</p> +<p>In Vello, a major advance was porting the low level font handling code from the experimental swash crate to the production-quality <a href="https://github.com/googlefonts/fontations">skrifa</a> (<a href="https://github.com/linebender/vello/pull/423">vello#423</a>). +Skrifa is being developed by Google Fonts as a memory safe library for loading font files, and is integrated into Chromium builds. +Over the coming weeks, a goal is to release Vello (and supporting crates) on crates.io.</p> + + + + + Roadmap for the Xilem backend in 2024 + 2024-01-19T13:00:00+00:00 + 2024-01-19T13:00:00+00:00 + + + + Olivier Faure + + + + + https://linebender.org/blog/xilem-backend-roadmap/ + + <p>As you may have heard by now, Google Fonts is funding me this year to work on Xilem.</p> +<p>I'm not alone in that: Aaron Muir Hamilton, Daniel McNab and Matt Campbell were funded as well to work on various parts of the ecosystem. I believe this is Matt's third year getting funding from Google Fonts.</p> +<p>Now, <em>what</em> I was hired to do might be unclear to you. The scope we agreed on was fairly broad and was stated as "contributing to Xilem's view tree and developer experience", but that could mean a lot of things.</p> +<p>The first thing I want to do is communicate a clearer picture. I have a a lot of plans for Xilem, and they involve major changes from the current architectures, changes that might be worrying to the community at large or even to Raph Levien. I certainly don't want to give the impression that I'm wresting the project away from the Linebender community for Google's interest, and that means being transparent early and often about the things I want to rework.</p> +<h2 id="what-i-want-for-xilem">What I want for Xilem</h2> +<p>Xilem is a research-and-development project, the latest in a series (Xi-Core, Druid, Crochet, Lasagna, Idiopath), that aims to explore how UI development can be made compatible with Rust.</p> +<p>This might feel a little banal now, because Rust GUI frameworks are popping up everywhere and starting to settle on similar patterns, but those patterns weren't obvious in 2019! Xilem is very different from Druid, and getting to its current architecture has been a process.</p> +<p>Xilem has been perma-experimental since May 2022. Once it got started, the main Druid maintainers stopped contributing almost entirely with the expectation that Xilem would replace Druid once it was ready. Unfortunately, it still hasn't made enough progress to be on parity with Druid, yet Druid still lies abandoned, which isn't great when people had started relying on it.</p> +<p>It's debatable how much this could have been avoided. As I've pointed out before, the Rust GUI ecosystem is subject to massive <a href="https://seths.blog/2005/03/dont_shave_that/">yak-shaving</a>: many of us came here because we wanted to build a text editor, and now we're all learning about <a href="https://faultlore.com/blah/text-hates-you/">text rendering</a>, <a href="https://lord.io/text-editing-hates-you-too/">text editing</a>, <a href="https://raphlinus.github.io/ui/graphics/2020/09/13/compositor-is-evil.html">compositing</a><sup class="footnote-reference"><a href="#1">1</a></sup>, <a href="https://accesskit.dev/accesskit-integration-makes-bevy-the-first-general-purpose-game-engine-with-built-in-accessibility-support/">accessibility trees</a>, <a href="https://raphlinus.github.io/gpu/2021/05/13/stack-monoid-revisited.html">using monoids to implement stuff on the GPU</a>, <a href="https://www.leafwing-studios.com/blog/ecs-gui-framework/">ECS</a>, and some concepts that I'm absolutely certain Raph made up like <a href="https://raphlinus.github.io/curves/2023/04/18/bezpath-simplify.html">Bézier paths</a> and <a href="https://raphlinus.github.io/rust/2023/04/01/rust-to-cpp.html">C++</a>.</p> +<p>And to a certain extent, yak-shaving is good! "I'm going to do better than X without learning how X works" is a child's attitude. It's the attitude we all start with, and it fills us with courage, but that courage is naive. True improvement comes from keeping that courage after spending years learning how immense the problem space is, and keeping faith that it's possible to do better. The Rust community is one that values not just doing things from scratch, but also learning from the past to get them right.</p> +<p>This is good, but the "get them right" part takes a lot of time, and in the meantime, I'd argue that we've neglected end users a bit. We've abandoned Druid before Xilem was ready as an alternative, and then we worked on foundational and experimental projects that would make Xilem stronger and sounder in the long term, but left the project in an awkward state in the meantime (except for the web backend, which made a lot of progress).</p> +<p>In the <a href="https://www.leafwing-studios.com/blog/ecs-gui-framework/">ECS-backed GUI framework</a> article I linked, Bevy maintainers have this to say:</p> +<blockquote> +<p>Not to be too harsh, but a lot of the existing Rust GUI solutions... just aren't very good. There's a lot of passable options, but they all have non-trivial drawbacks. No one has really risen to the top as a clear winner. [...] Deep down, we all know that we can do better, and we should.</p> +</blockquote> +<p>My ambition is to makes this paragraph obsolete before the end of the year. I want Xilem to get back to being suggested to newbies in the same breath as Iced and SlintUI. In the next few years, I want the entire ecosystem to get to a point where people talk about Rust GUI like they talk about ripgrep or rustls.</p> +<p>To give one specific example: my personal goal is to implement seamless hot reloading for Xilem before the end of 2024. I believe it's feasible, and I believe doing it will radically change the way people think about Rust GUI, along with <a href="https://poignardazur.github.io/2023/02/02/masonry-01-and-my-vision-for-rust-ui/">other improvements I hope to unlock over time</a>.</p> +<p>In the shorter term, my plan is to focus on basic features, widgets and styling options so people can experiment with Xilem, building on Raph's work on Vello over the past year. <a href="https://gist.github.com/giannissc/172c6c591997ee14f6120134a7990697">John Skottis's Xilem UX Notes</a> give a good picture of the kinds of things I'll be working on.</p> +<p>The other big short-term priority is going to be documentation. We've seen a lot of people complain that the Linebender project were poorly documented and hard to get into; it was the most popular reaction to our <a href="https://linebender.org/blog/xilem-2024/">2024 announcement</a>, but it echoed sentiments we'd seen before. We're aware of the problem, and we intend to work on it.</p> +<p>In the medium term, I also plan to work on the performance aspect of Xilem. People from Google Fonts have expressed interest in seeing how much performance we can get from Rust UI. While my mission isn't <em>limited</em> to performance work, it will be an ongoing focus, especially since it's an area where the Rust language brings unique opportunities. I'll go into more details on Rust performance and power efficiency in a later article.</p> +<h2 id="major-changes-i-want-to-implement-soon">Major changes I want to implement soon</h2> +<p>These are the big changes I want to work on soon. Realistically, "soon" is going to be relative, because some of these changes are going to be controversial, and part of the work is going to be convincing people of their value.</p> +<h3 id="switching-to-masonry-as-a-backend">Switching to Masonry as a backend</h3> +<p>Okay, this one makes me blush a little.</p> +<p>I'm the only maintainer of Masonry, a GUI crate with barely over 300 stars on Github and little outside interest. Can I really justify taking the money Google pays me to improve Xilem and spending my time on Masonry instead?</p> +<p>That choice isn't random, mind you: Masonry was forked from Druid, Xilem's ancestor, and in fact Xilem and Masonry share a lot of code right now.</p> +<p>In fact, I'd argue that Masonry's codebase is of better quality than Xilem's current native backend. This isn't meant to be a put-down of the work of Xilem maintainers; rather, it's the outcome of a difference in priorities. Nobody was very interested in Xilem's native backend (though Raph was aware of its importance, hence me getting paid to write this), and lots of people were very interested in the frontend and the web backends, therefore the frontend and web backends saw the most work.</p> +<p>From our <a href="https://github.com/linebender/rfcs/pull/1">RFC#0001</a>:</p> +<blockquote> +<p>As a result, Xilem's native backend is in a poor state:</p> +<ul> +<li>There is <a href="https://github.com/linebender/xilem/blob/ea45b9f8c14e3708f0fcbe0a0e1c760f59146323/src/widget/widget.rs#L113-L120">code commented out</a>.</li> +<li>There are <a href="https://github.com/linebender/xilem/blob/ea45b9f8c14e3708f0fcbe0a0e1c760f59146323/src/widget/mod.rs#L19-L20"><em>entire modules</em> commented out</a>.</li> +<li>There is <a href="https://github.com/linebender/xilem/blob/ea45b9f8c14e3708f0fcbe0a0e1c760f59146323/src/widget/widget.rs#L51-L71">documentation referring to items from Druid that no longer exist</a>.</li> +<li>There are <a href="https://github.com/linebender/xilem/blob/ea45b9f8c14e3708f0fcbe0a0e1c760f59146323/src/widget/core.rs#L569C5-L569C66">TODOs without an associated issue</a>.</li> +</ul> +</blockquote> +<p>Masonry's backend codebase is a healthier starting point. Masonry also comes with some built-in perks, like powerful unit tests and a structured widget graph.</p> +<p>It's not clear whether we want to import the Masonry codebase, the crate, or the entire repository, and it's not clear what the ultimate branding should be. The RFC lays out the different possibilities, and discussion is still ongoing, so the community can reach a consensus before doing more work (including possibly not using Masonry at all).</p> +<p>If we do move forward with this, then Masonry will need some porting work:</p> +<ul> +<li>Using Vello and Parley instead of Piet.</li> +<li>Using Glazier instead of druid-shell.</li> +<li>Integrating AccessKit.</li> +<li>Removing the dependency on GTK.</li> +</ul> +<p>AccessKit support in particular is table stakes, by now. The Rust ecosystem is converging on the idea that accessibility (or at least, screen reader support) should be integrated early on in the design of GUI frameworks, not tacked on at the end.</p> +<p>There are other things Xilem added over Druid (notably virtual lists and async support), but I believe Masonry doesn't need to implement them right away for parity. Both will be very important for eventual performance work.</p> +<h3 id="avoiding-custom-widgets">Avoiding custom Widgets</h3> +<p>I'm told by Raph this is a "molotov cocktail" which, uh, fair.</p> +<p>We should write Xilem's backend under the assumption that end users of the library (including the Xilem frontend) will very rarely create their own widgets. Instead, they will usually compose the primitives given to them the same way they compose DOM elements in the browser. There will be escape hatches, from a fixed-size canvas surface where end-users can use arbitrary paint primitives to full-on custom widget code, but we should design the framework under the assumption people will almost never <em>need</em> those hatches.</p> +<p>Clearly, this is a radical move. <strong>There will be a prototyping phase before we choose whether we commit to it</strong>, and RFCs to lay out the details. I'm confident it will pay off.</p> +<p>Developers of hobby GUI frameworks tend to provide a severely anemic set of primitives, under the assumption that if anyone wants other features in their widgets, they can implement them themselves. Both Druid and Xilem suffer from this.</p> +<p>On the other end of the spectrum, the web has shown that you can implement complex custom UIs given a rigid but rich set of primitives.</p> +<p>More importantly, the web is moving towards a powerful paradigm: declarative UI. As time goes on, people are realizing you can get better performance and composition by describing what things should look like and composing them than by imperatively making them do things.</p> +<p>Part of this is that native code is more performant than JS, but part of it just that declarative code is easier to work around than imperative code: its bounds are better defined, it lets you <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/contain">commit to limitations</a> that make the engine's job easier, and it's easier to analyze.</p> +<p>A set of proposals called <a href="https://developer.mozilla.org/en-US/docs/Web/API/Houdini">CSS Houdini</a> came out that went in the exact opposite direction: pushing the layout engine towards more customization and JavaScript code. The proposal hasn't seen much movement since 2021, and I don't think it's a coincidence that the part that would have given the most power to imperative code, the Layout API, hasn't been stabilized in any browser.</p> +<p>The bottom line is that, while implementing custom widgets <em>will always be possible</em>, I want to encourage developers to go as far as they can composing declarative elements instead, and see how far it's possible to go using those building blocks.</p> +<h4 id="more-opinionated-layout">More opinionated layout</h4> +<p>One major customization point I want to restrict in Xilem is layout.</p> +<p>Today all Rust GUI frameworks ship their own layout algorithm, but none of them are <em>competing</em> on their layout algorithm. Often the layout algorithm is just a means to an end; developers that do want to work on a state-of-the-art layout engine will provide it in a modular crate like <a href="https://github.com/vizia/morphorm">Morphorm</a> and <a href="https://github.com/DioxusLabs/taffy">Taffy</a>.</p> +<p>And here's the thing: realistically, most layout engines aren't that creative. Every Rust framework and every major GUI framework I'm aware of uses layout that boils down to "FlexBox with small variations". The number of meaningfully different ways to do GUI layout can be counted on, generously, two hands.</p> +<p>I'd argue we only need CSS Flow, FlexBox, CSS Grid, and maybe Morphorm to cover most people's needs. Conveniently, this is what Taffy aims to provide. There's already an experimental Taffy integration in Xilem, and I want to make it deeper.</p> +<p>That being said, there won't be a hard-coded set of layout algorithms. Rather, layout will rely on a web-inspired protocol between widgets (in other words, trait methods), and that protocol will be strongly opinionated to make implementation of these layout algorithms easier.</p> +<p>More on this in a latter blog post.</p> +<h4 id="no-boxing">No boxing</h4> +<p>Having a semi-fixed set of widgets means you can avoid using <code>Box&lt;dyn Widget&gt;</code>, which has some interesting performance implications.</p> +<p>It means you can add a lot of methods to the Widget trait without worrying about bloating the vtable. And you can write methods under the assumption that they'll be inlined, which opens up interesting DX improvements.</p> +<h3 id="using-ecs-maybe-sort-of">Using ECS, maybe, sort of</h3> +<p>In current Xilem code, if you want your FlexWidget to have children, it must have a <code>Vec&lt;Pod&lt;ChildWidget&gt;&gt;</code> member. Each Pod directly owns a Widget.</p> +<p>I think this is an interesting quirk of Rust GUI, tying directly to Rust's ownership semantics. Non-Rust frameworks often use pointers to child widgets, true, but they're often shared with the framework, with an understanding that the framework is charged with keeping track of how many widgets there are and which is a child of which. In Qt, for instance, it's preferred (but not mandatory) for parents to call <code>delete_later()</code> on their children instead of <code>delete</code>, because it plays better with event handling.</p> +<p>Xilem's approach of "you own your children" is a little bespoke. It means the framework has a hard time iterating over the entire widget tree (say, as part of a DOM inspector) unless each Widget specifically implements the iterating method. And it means if you want to target an event at a specific widget (say, the one with keyboard focus), you need to go through the entire ownership chain, using some heuristics to avoid visiting too many widgets.</p> +<p>I believe Widgets should be owned by the library. If your container has children, then the only thing the container will actually own is keys into a structure (probably a slotmap) where the widget is stored. This makes a lot of things easier, like serialization and debugging, but it has an impact on the entire backend. It's an infrastructure investment.</p> +<p>Lately, I've seen more and more discussion of implementing GUI through an ECS. A lot of that discussion comes from Bevy, which is natural, since the bevy community <del>is made up of ruthless cultists striving to feed ever more sacrifices to the ECS god until it consumes the Earth</del> is intimately familiar with the ECS pattern and has reached a phase where UI work is getting a lot of attention<sup class="footnote-reference"><a href="#2">2</a></sup>. But I've seen discussions about it in the Linebender community too.</p> +<p>Whether we actually want to use ECS is something we still need to research.</p> +<p>The way I understand it, the big draw of ECS is the "S" part, the Systems: it's about handling lots of similar data at once in arbitrary order. Which is why eg archetypes in bevy are useful: you're grouping together entities with the same components, so that you can say "execute this code for all entities with component X and component Y" and have this code be executed on arrays of values with minimal indirection or branching. And the "arbitrary order" part makes them work really well with slotmaps: since you can just read from the beginning of the slotmap, you don't pay the double-indirection penalty.</p> +<p>In other words, the ideal use case for ECS is code of the type <code>for (entity in entities) entity.position += entity.speed</code>.</p> +<p>GUI is pretty far from that ideal use-case: updates are sparse and should only run on a small number of changed widgets. Order often matters. And I'm not sure archetypes would work in a framework with a large variety of widgets and different attributes.</p> +<p>I think there are two things you really want from a Rust ECS library for GUI: slotmaps, and efficient ways to add and remove components from an entity.</p> +<p>Implementing those is going to be a major undertaking, which we'll have to divide into small experiments, but one I expect to pay many times over.</p> +<h2 id="community-involvement-and-more-to-come">Community involvement and more to come</h2> +<p>I want to really put emphasis on something: none of the above is set in stone.</p> +<p>Part of what Raph wants to achieve this year is to make Xilem more of a community project, and that means running more decisions by the community.</p> +<p>I've created <a href="https://github.com/linebender/rfcs/">an RFC repository</a> for this, and each of the sections above will get its own RFC, where I'll expand on my rationale in more detail.</p> +<p>This isn't a rubber-stamping process either: I want to implement those ideas, but if the community<sup class="footnote-reference"><a href="#3">3</a></sup> decides that they are bad, then we'll go another direction.</p> +<p>There's other ideas I haven't discussed yet that I want to come back to:</p> +<ul> +<li><strong>Declarative styling:</strong> Giving Widgets attributes similar to CSS properties, with modifiers for animations, pseudo-classes, media queries and container queries. While inspired by CSS, it wouldn't involve any CSS parsing, selector resolution, specificity resolution, etc.</li> +<li><strong>Compositing:</strong> Xilem is heading towards a "do everything in the GPU" approach. This is good for performance, but Firefox engineers who have gone down this road before us have warned us of the many perils they faced, especially regarding battery life. In general, after layout and painting, you really want a <code>composite()</code> phase to deal with scrolling and some simple animations without touching the GPU at all if possible. <a href="https://raphlinus.github.io/ui/graphics/2020/09/13/compositor-is-evil.html">This is a complex subject</a>, and it would be nice if we could hide most of that complexity from app developers while still giving them good performance.</li> +<li><strong>Resource loading:</strong> This is another area where we might want to crib from game engines. At the very least, we want to be able to ask "Load me this texture/shader/font/etc" without having to write disk I/O in user code. Then we can start thinking about progressive loading, fallbacks, sharing, etc.</li> +</ul> +<p>These ideas are likely to be the subject of further articles and/or RFCs in the near future.</p> +<h3 id="relations-with-other-projects">Relations with other projects</h3> +<p>Presenting the current state of the Rust GUI ecosystem would probably take its own article.</p> +<p>Things are moving quickly, and anything I write now might not be up to date in two weeks. The projects we're most interested in right now are Winit and Bevy, and there's some potential for cooperation with Servo. The COSMIC ecosystem looks pretty cool, but so far it looks like we have less to share with them.</p> +<p>People from parallel projects are communicating and exchanging much, <em>much</em> more than they were in 2022. Between Vello, Parley, wgpu, Taffy, COSMIC-Text and others, projects are converging and maintainers are making more effort to reach out and integrate other people's code.</p> +<p>Stay tuned for more!</p> +<h2 id="hey-this-is-really-cool">Hey, this is really cool!</h2> +<p>Something that came up in discussions I've had with Raph is that it's easy to miss the forest for the trees. In the middle of all the paperwork, blog-writing, RFC-writing, we can end up focusing on the process so much that we forget how excited we are.</p> +<p>So, I'm taking the moment to remind myself: this is really freaking exciting!</p> +<p>For all my criticisms and caveats and realistic assessments of the problems we need to overcome, I'm still feeling absolutely great about this!</p> +<p>I'm super thankful to Raph for getting us this far, to Google Fonts for sponsoring us, and to everyone else who contributed to the Linebender ecosystem. I think we can do something amazing and I'm honestly a little startled to be in this position at all.</p> +<p>To reiterate what I said: in the next few years, I want the entire ecosystem to get to a point where people talk about Rust GUI like they talk about ripgrep or rustls.</p> +<p>I legitimately think Rust has the potential to get best-in-class GUI frameworks, and now the time has come to prove it.</p> +<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> +<p>By the way, I love this style of writing where we start humanizing a software process and complaining about how much it wants to kill us. The articles I cited are very high-quality too.</p> +</div> +<div class="footnote-definition" id="2"><sup class="footnote-definition-label">2</sup> +<p>I'm told the Bevy community found that joke funny, but I was too afraid for my sanity to check on their Discord server.</p> +</div> +<div class="footnote-definition" id="3"><sup class="footnote-definition-label">3</sup> +<p>"The community" is a nebulous concept here. For obvious reason, we'll give more weight to the opinions of people who have already put work into the Linebender ecosystem, but the general hope is to get a consensus from everyone involved. And you're welcome to weigh in even if you haven't contributed before.</p> +</div> + + + + + Xilem 2024 plans + 2024-01-10T07:34:42+00:00 + 2024-01-10T07:34:42+00:00 + + + + Raph Levien + + + + + https://linebender.org/blog/xilem-2024/ + + <p>2024 promises to be an exciting year for Xilem. The big news is that Google Fonts is funding the work of four open source contributors to the project: Aaron Muir Hamilton, Daniel McNab, Matt Campbell, and Olivier Faure.</p> +<p>Aaron will be working on text layout, building on <a href="https://github.com/dfrg/parley">parley</a>, <a href="https://lord.io/text-editing-hates-you-too/">text input</a> including IME, and Android platform integration. Daniel will be working on GPU infrastructure and performance, with much of the work upstreamed to <a href="https://wgpu.rs/">wgpu</a>. Matt will be working on accessibility, and Olivier will be building the core widget tree, with a focus on developer experience.</p> +<p>Xilem is an ambitious project to explore the limits of UI performance, as described in my <a href="https://youtu.be/zVUTZlNCb8U">High Performance Rust UI</a> talk. The goals include gathering knowledge about the viability of Rust for UI, and what patterns work well. While there is a research focus, we plan to gather this information by building a real toolkit, solving many of the hard problems. The current state of the project is a fairly rough, though promising, prototype, so there is much work to be done. It’s exciting to have the bandwidth and experience of these people working toward that goal, but perhaps the most exciting prospect is bringing together more of the community, people passionate about building high quality UI. Our goal as an open source community is to facilitate that, and to coordinate the work efficiently. What we have now is not a production-ready product, but we wish to move in that direction, including quality documentation - some of the consistent feedback we’re getting about the current state.</p> +<p>Another goal is to bake in accessibility from the start. Too often, it’s an afterthought, tacked on at the end. We’re excited to have Matt, primary author of <a href="https://github.com/AccessKit/accesskit">AccessKit</a>, on board.</p> +<p>Xilem is designed in layers, with a reactivity layer on top, a widget tree adapted from <a href="https://github.com/linebender/druid">Druid</a>, and with <a href="https://github.com/linebender/vello">Vello</a> as the 2D rendering engine. These layers are designed to work well together, but the individual pieces may be useful in other contexts. The funded work will focus on Android as a target, but is intended to work well on desktop platforms as well; this is one of the core strengths of the Rust ecosystem. We don’t have iOS as an immediate priority, but attention from the open source community could change that, and the foundations should support it.</p> +<p>The status of the web backend for the Xilem widget set is more complex. Simply put, it is not a priority for us right now. We have done some explorations into generating DOM nodes from Xilem, but doing it well would increase scope and complexity beyond what we’re comfortable with. For applications deployed <em>primarily</em> on the web, xilem_web (which generates DOM nodes) should be a viable choice, with the possibility of Tauri or Electron for desktop deployment. To enable online demos of native applications, it is most likely that we will implement a version which draws to a canvas element. This has limitations in accessibility and native look and feel - for example, text input and scrolling may behave contrary to user expectations. Until more work is done refining the web backend, we would not recommend this approach for production applications using Xilem.</p> +<h2 id="2023-retrospective">2023 retrospective</h2> +<p>Looking back at 2023, there was a great deal of foundational work. Much of the effort was on Vello, the 2D rendering engine that serves as the graphical foundation of the project. A particular strength is high performance path rendering on GPU, which enables fully dynamic text effects including animation of variable font parameters. Though we had a reasonably good implementation of path rendering in place, much of the second half of the year was taken up by “stroke rework” which computes all stroke styles on the GPU, and also improves the performance and accuracy of antialiasing for all paths. To this end, we invented new computational geometry algorithms for computing parallel curves, the newest based on <a href="https://raphlinus.github.io/curves/2021/02/19/parallel-curves.html">Euler spirals</a>, with some elegant math tuned for GPU evaluation. A writeup explaining the details is in the pipeline.</p> +<p>There was slow and steady work on the higher levels of the stack as well, including factoring out the reactive layer into a generic xilem_core module, and validating that with generation of DOM nodes for browser deployment. The widget tree saw some development as well, including integration with the <a href="https://github.com/DioxusLabs/taffy">Taffy</a> layout engine.</p> +<h2 id="governance-and-community">Governance and community</h2> +<p>Though we now are funded to work on the project, the open source nature of the projects continues unchanged. We’ve been building up infrastructure for open source community, including a <a href="https://xi.zulipchat.com/">Zulip instance</a>, weekly office hours, <a href="https://linebender.org/wiki/">wiki</a>, and, as of this post, a shared <a href="https://linebender.org/blog/">blog</a>. Our <a href="https://linebender.org/contributor-guidelines/">contributor guidelines</a> explain a bit about our processes. Almost all decision making is by consensus. Only very rarely do I need to step in and tie-break. As we scale up, we’re going to be more systematic, starting to use <a href="https://github.com/linebender/rfcs">RFC documents</a> for major changes.</p> +<p>We’re intentionally designing our community to foster learning and collaboration. For example, discussions are on Zulip rather than Discord because it’s searchable, meaning that the same questions are less likely to come up over and over. Its grouping into topics lets participants quickly skim activity as opposed to getting drowned in chatter. It’s working well for us. We also invite others in the Rust UI ecosystem to use our Zulip and wiki. As the Kurzgesagt video <a href="https://www.youtube.com/watch?v=fuFlMtZmvY0">The Internet is Worse Than Ever – Now What?</a> observes, large social spaces are degrading, and the video recommends seeking out smaller, more focused communities. I hope ours is one such.</p> +<p>In any case, we are happy to share bits of infrastructure with other Rust UI efforts, and are always eager to learn from them. I see many of us working toward common goals rather than competing, even if there are different approaches and priorities.</p> +<h2 id="thoughts-on-the-rust-ui-ecosystem">Thoughts on the Rust UI ecosystem</h2> +<p>I’ve been thinking about doing UI in Rust for about 8 years now, and have explored many, many approaches. I’m not alone in this, there have been well over two dozen projects started.</p> +<p>As mentioned in a <a href="https://raphlinus.github.io/rust/gui/2022/07/15/next-dozen-guis.html">previous blog</a>, any given application will have a set of requirements. Is Web one of the main deployment targets? Will there be embedded video? Is there a need to integrate with some other subsystems, such as a game engine? Each of these has profound implications. Some problem spaces (compilers are an example) are “smooth,” in that continual refinement will lead to fairly similar outcomes no matter the starting point, but over time I’ve come to the conclusion that UI is especially lumpy. I believe this contributes to the continuing pattern of new UI toolkits coming out every couple months or so; the author surveys what’s available, finds none that match the specific set of requirements, and creates a new one.</p> +<p>In some ways, Xilem is in the same pattern, but there are <em>some</em> things we’re doing differently. For one, it’s explicitly a research project, with knowledge about how to build UI in Rust an outcome possibly as important as the codebase. We’re trying to be systematic about finding the best ways to do things, which ideally will make some solutions more general. And, increasingly, we’re designing things as modular layers that can be swapped out. With luck, even if people don’t end up adopting the entire stack, there will be some useful components for the ecosystem.</p> +<p>A good overview of the opportunities and challenges in Rust UI, particularly for making mobile apps, is <a href="https://wingolog.org/archives/2023/06/15/parallel-futures-in-mobile-application-development">parallel futures in mobile application development</a> by Andy Wingo. The linked blog posts in that series also go into considerable detail about JavaScript and TypeScript based approaches, which have important lessons as well.</p> +<h3 id="declarative-ui-patterns">Declarative UI patterns</h3> +<p>The trend in UI programming has been overwhelmingly away from a soup of mutable objects with interlinked references and toward various declarative or reactive patterns. That’s a good thing for Rust UI, because the former is very un-ergonomic in Rust.</p> +<p>In the JavaScript world, there is a Cambrian explosion of reactive techniques. React is by far the most popular, but there is a strong sentiment it’s possible to be better, particularly on performance, but also robustness, as the logic for deciding <a href="https://www.joshwcomeau.com/react/why-react-re-renders/">when to re-render</a> is fickle, and can <a href="https://arxiv.org/abs/2310.04368">miss re-renders</a>. Elm deserves special mention, as its avoidance of global shared mutability makes it particularly easy to adapt to Rust, so it serves as the reactive core of the <a href="https://github.com/iced-rs/iced">iced</a>, <a href="https://github.com/antoyo/relm">relm</a>, and <a href="https://github.com/vizia/vizia">vizia</a> UI toolkits, as well as <a href="https://yew.rs/">yew</a> on the WASM side. But there is also <a href="https://emberjs.com/editions/octane/">Ember Octane</a> (based on Adapton), a number of fine-grained reactivity approaches such as <a href="https://www.solidjs.com/">SolidJS</a>, and many, many more (not to mention the incredible diversity of solutions for state management).</p> +<p>We’re seeing much of that diversity mirrored into the Rust world. On the WASM side, we see <a href="https://dioxuslabs.com/">Dioxus</a> as a fairly faithful adaptation of React, <a href="https://github.com/leptos-rs/leptos">leptos</a> (also <a href="https://sycamore-rs.netlify.app/">sycamore</a> and <a href="https://github.com/gbj/tachys">tachys</a>) adhering fairly closely to SolidJS, yew as an adaption of elm, and <a href="https://github.com/flosse/rust-web-framework-comparison">more</a>.</p> +<p>A reactive layer such as Dioxus or leptos can be compiled to WASM and run in a browser to generate DOM nodes. More recently, we’re seeing that it can be decoupled from that environment, and a reactive core can drive a widget tree. Examples include <a href="https://github.com/marc2332/freya">Freya</a> which uses Dioxus, and <a href="https://github.com/lapce/floem">floem</a> which implements fine-grained reactivity inspired by leptos.</p> +<p>Xilem doesn’t directly correspond to any JavaScript framework; it relies on static typing and is actually closer to SwiftUI than anything web based.</p> +<p>One of the central questions in Rust UI going forward is: which approach to declarative UI is best? It’s possible a clear winner will emerge, or perhaps there will be a different answer depending on the use case, or it might just come down to a matter of personal style, with a number of viable contenders (arguably that’s where JavaScript is). We’re taking a two pronged approach. First, we’re moving forward with Xilem. There’s a specific reason - Xilem is designed to support multithreaded rendering easily, while many of the other frameworks rely on thread local storage for access to a store of observables, an approach with high impedance mismatch to multithreading. Since performance is a goal, we didn’t want to give that up by adopting another framework. I also think Xilem is pretty good, but that remains to be seen.</p> +<p>Another way to gather more evidence on the Xilem declarative layer is to use it to generate DOM nodes in a browser, in other words decouple it from the widget set. As described in the <a href="https://www.youtube.com/watch?v=XjbVnwBtVEk">Xilem Vector Graphics</a> talk, we have been experimenting with that a bit, and a major development in the last year was to factor out the core declarative logic into xilem_core, and also develop a xilem_web layer for creation of DOM nodes. Early indications suggest that this may be a viable alternative to frameworks such as Dioxus and leptos, and we're eager to learn more from those explorations.</p> +<p>Xilem is untested, though promising, and it may be that some other approach is better. If so, we’re prepared to pivot. We’ll be designing the widget set so that it doesn’t have a hard-coded dependency on the Xilem declarative layer, and could, at least in theory, be driven from other frameworks. Olivier is author of the <a href="https://github.com/PoignardAzur/masonry-rs">masonry</a> crate, where being agnostic to the declarative layer was an explicit goal. He’ll be adapting many of the ideas from that.</p> +<p>Making a widget set agnostic has other potential benefits. While writing app logic in Rust is very promising, there are still compelling reasons to use other languages. A widget tree implemented in Rust with fast graphics and smooth interactivity, scripted in some other language, is compelling. I made a <a href="https://github.com/linebender/druid/pull/2185">prototype</a> in Python, which, though rough, shows promise.</p> +<h2 id="infrastructure">Infrastructure</h2> +<p>A UI toolkit depends on a great deal of infrastructure. We’re making careful choices around that, and also looking for opportunities to collaborate with the rest of the ecosystem. One choice I’m particularly excited about is investing in <a href="https://wgpu.rs/">wgpu</a>. I think WebGPU will move modern GPU usage forward considerably, especially compute shaders, which are heavily used in Vello. This technology will make truly portable applications requiring high compute throughput possible for the first time, and we’re shooting for smooth UI integration with the GPU usage in these applications.</p> +<p>Whether to use <a href="https://github.com/rust-windowing/winit">winit</a> or build our own platform integration has long been a subject of discussion. We’re reopening that discussion with the winit maintainers as of this writing, but it’s still too early to say whether we’ll join forces, or decide that the goals of the project support having a separate codebase.</p> +<p>A huge part of any UI effort is text, and that’s also a long-standing interest of mine. I’m impressed with <a href="https://github.com/pop-os/cosmic-text">cosmic-text</a> but ultimately we decided to move forward with <a href="https://github.com/dfrg/parley">parley</a>, in part so we can test out ideas with variable fonts. The lower levels of the text stack will be rebased on the <a href="https://github.com/googlefonts/fontations">fontations</a> work of the Google Fonts team, which is rapidly becoming a production-quality implementation.</p> +<p>Building common infrastructure for accessibility also benefits the entire ecosystem, and we're thrilled to see the increasing adoption of AccessKit. Indeed, on all these topics, we’re happy to share what we’re doing with other projects, as most of the infrastructure described above is general in application, rather than specific to our projects.</p> +<h2 id="conclusion">Conclusion</h2> +<p>The potential for Rust UI is huge. The Rust language enables top-notch performance and reliability and is also expressive for high-level application logic. We plan to prove that out, based on encouraging existing research and explorations, as well as new research to discover the patterns for Rust UI that work best at scale. This involves work at all levels of the stack, including infrastructure we are happy to share with other Rust UI efforts.</p> +<p>Xilem is still an early prototype. For those who desire a “batteries included” toolkit for building UI, we ask your patience. For those who are interested, you are invited to come build this future with us.</p> + + + + diff --git a/blog/doc-include/index.html b/blog/doc-include/index.html new file mode 100644 index 0000000..52f00a9 --- /dev/null +++ b/blog/doc-include/index.html @@ -0,0 +1,181 @@ + + + + + + + + #![doc = include_str!()] with intra-doc links - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

#![doc = include_str!()] with intra-doc links

+

Daniel McNab, June 28, 2024

+

Creating crate level documentation by including your README can lower maintenance burden, as you do not need to manually keep the crate level docs synchronised. +However, when writing this documentation, you will also want to link directly to some mentioned items. +These links need to work in all the places that the README is rendered, such as on your package's https://crates.io homepage, in addition to in rustdoc output. +To achieve this, you can link to the online documentation for the items:

+
To get started with foobar, use the [`frobnicate`][] function.
+
+[`frobnicate`]: https://docs.rs/foobar/latest/foobar/fn.frobnicate.html
+
+

This would however mean that users of cargo doc will be redirected to your crate's online docs (as opposed to their local docs) when clicking on that link. +It is however possible to make links in included markdown files behave as intra-doc links, by adding a second link reference definition in the documentation comment. +This must be placed before the doc = include_str!() line, for example:

+
//! [`frobnicate`]: frobnicate
+#![doc = include_str("../README.md")]
+
+

This means that the link has the expected link target on https://crates.io and in rustdoc (including on https://docs.rs). +This trick works because when there are duplicate markdown link reference definitions, "the first one takes precedence". +rustdoc sees the intra-doc link before the link to the online docs, and so uses the intra-doc link. +However, when the README is rendered standalone, only the link reference definition for the online docs is present, and so that target is used.

+

Example

+

For an example of both of these techniques in action, see the Android Trace crate (android_trace). +In particular, the text of interest is: "the main entry point to the library is AndroidTrace". +You can observe that this link goes to version 0.1.1 on the docs page, but version 0.1.0 elsewhere.

+ +

And the corresponding source code:

+ +

The links have since been updated to use latest, but the direct link being to version 0.1.0 shows how this pattern works.

+ +

rust-analyzer has an "Open External Docs" command when you have an item selected. +This will open the online documentation for the selected item, generally on https://docs.rs. +This works even if the item is yet to be published, in which case it will open the URL where the item would be. +You may wish to replace the resolved version number in the URL with latest, e.g. https://docs.rs/foobar/latest/foobar/

+

Limitations

+

#![doc = include_str!("../README.md")] has two main relevant limitations which you may need to work around.

+

The first of these is in code blocks. +Normal rustdoc examples can include hidden setup lines, starting with a # character. +These will not be rendered by rustdoc.

+
```rust
+# use foobar::frobnicate;
+frobnicate();
+```
+
+

However, other markdown renderers do not support this extension, so the example above will be rendered as something like:

+
# use foobar::frobnicate;
+frobnicate();
+
+

Unfortunately, I am not aware of a workaround for this; my current best suggestion is to avoid using these hidden lines in your README. +Doctests in included markdown files do also have some diagnostics issues, as reported in rust-lang/rust#81070.

+

The second limitation is with file links, such as a link to your license file of the form [LICENSE-MIT](LICENSE-MIT) (as recommended in C-PERMISSIVE). +This is because rustdoc does not support relative file links in Markdown. +This can be solved by using the "opposite" of this trick - you can use a web link in your lib.rs, and a file link in the README.

+

A second trick

+

READMEs contain some content which are not expected to be present in a crate's documentation. +For example, a top-level title, which would duplicate the crate foobar header added by rustdoc. +This can be resolved by using css in your documentation to hide these items; rustdoc allows embedding CSS in your documentation. +However, this should only be included in your lib.rs, so that the header is shown in other contexts.

+
//! <style>
+//! .rustdoc-hidden { display: none; }
+//! </style>
+
+

Any text in the README which should be excluded from your docs page can then be surrounded by a div with the rustdoc-hidden class, for example:

+
<div class = "rustdoc-hidden">
+
+# Foobar
+
+</div>
+
+

As far as I'm aware, this does not have any accessibility considerations, as browsers will not make display: none items available in their accessibility tree.

+

Tracing Android Trace (see above) also uses this trick to hide the license section from the crate docs. +The license information is already present in the crate's info box.

+

Conclusion

+

Using #![doc = include_str!("../README.md")] can integrate nicely with intra-doc links, if you use some tricks. +I believe that this pattern reduces the quality gap between bespoke documentation in lib.rs enough that using README includes becomes the right pattern for most crates. +This avoids the maintenance burden of needing to ensure that text in the crate level docs and the README do not become out-of-sync. +I intend to evaluate this technique by applying it across Linebender crates. +It may still be better to have bespoke documentation for each location, for projects which can afford the maintenance costs of that solution. +But for other projects, this can provide an easy way to improve their crate level documentation.

+

These patterns can also be applied when including non-README markdown documents. +I suggest linking to this post when using these patterns, to allow future readers of your code to understand the technique being used.

+

Discuss on the Linebender Zulip.

+ + +
+
+ + + diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..40ac49a --- /dev/null +++ b/blog/index.html @@ -0,0 +1,225 @@ + + + + + + + + | Homepage for the Linebender organization + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Blog posts

+ + + +
+
+ + + diff --git a/blog/roadmap-may-2024-retro/index.html b/blog/roadmap-may-2024-retro/index.html new file mode 100644 index 0000000..6b3f645 --- /dev/null +++ b/blog/roadmap-may-2024-retro/index.html @@ -0,0 +1,323 @@ + + + + + + + + Retrospective on the May-July roadmap - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Retrospective on the May-July roadmap

+

Daniel McNab, August 24, 2024

+

Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for the Rust programming language.

+

At the start of May, we created a roadmap for the following three months. +We recently went through a process of analysing how well our progress was guided by the roadmap; this report summarises those results.

+

Vello (original)

+

Robust dynamic memory (original)

+ +

Reliable snapshot tests (original)

+ +

Sparse strips (original)

+ +

Add tests (original)

+ +

Progress beyond roadmap

+

We have also landed several important features which were not part of our planned roadmap. +These include:

+ +

The stroke expansion paper documents a key part of Vello's pipeline. +This was presented at ACM High Performance Graphics (HPG) 2024, placing 3rd Place in the Best Paper Award.

+

Masonry (original)

+

Complete text input (original)

+ +

Better tracing for debugging (original)

+ +

Fix glaring documentation problems (original)

+ +

Finish repository port (original)

+ +

Write “widgets in arena” RFC (original)

+ +

Write “pass order” RFC (original)

+ +

Rewrite documentation (original)

+ +

Improve focus handling (original)

+ +

Improve pointer status handling (original)

+ +

Progress beyond roadmap

+

Masonry is in a state of flux, however is starting to see a few exploratory users. +To unblock these users, some additional important features were added outside of the roadmap, such as:

+ +

Parley (original)

+

Create abstractions for text selection and editing (original) ?

+ +

Inline block layout (original)

+ +

Write adequate documentation (original)

+ +

Software renderer (original)

+ +

Progress beyond roadmap

+

parley#56 added support for Emoji, which is used with the Vello PRs.

+

Recently the harfruzz project, a fork of rustybuzz to be integrated fully with fontations, has emerged as an extremely promising direction for text shaping for the Rust ecosystem. We plan to use it as the basis for text layout.

+

Xilem (original)

+

Android bringup (original)

+ +

Update repository layout (original)

+ +

Rework xilem_core to be compatible with Masonry backend (original)

+ +

Write documentation (original)

+ +

Re-implement async integration (original)

+ +

Add unit tests (original)

+ +

Add basic benchmarks (original)

+ +

Progress beyond roadmap

+

Xilem has also seen some very useful changes not tracked above, including many community contributions. +Some highlights of these contributions are:

+ +

There has also been lots of really good progress on Xilem Web, but we do not roadmap Xilem Web and so we do not cover that progress here.

+

AccessKit (original)

+

Matt Campbell's work on AccessKit has begun, and a proof-of-concept Android adapter is in progress.

+ +

At the time of writing there is not a permanent link to this work, but it can be seen in the android-basics branch.

+

Android specific work (original)

+

Subclassing View/Application/Activity (original)

+ +

Handling IME (original)

+ +

Gesture recognition (original)

+ +

Conclusions

+

Overall, the roadmap provided a useful guide of what to work on, and we have implemented many of the most important features from it. +One clear recurring issue is documentation - even where we have chosen to roadmap this, we have made little progress. +Similar concerns are clear for testing in Xilem, although we have laid some important groundwork there. +We firmly recognise the role of documentation as an aid to onboarding, which is becoming more important as we work towards alpha releases. +I believe that we can make good progress in this area before the end of 2024.

+ + +
+
+ + + diff --git a/blog/roadmap-may-2024/index.html b/blog/roadmap-may-2024/index.html new file mode 100644 index 0000000..2e40288 --- /dev/null +++ b/blog/roadmap-may-2024/index.html @@ -0,0 +1,312 @@ + + + + + + + + May-July roadmap for Linebender - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

May-July roadmap for Linebender

+

Olivier Faure, June 17, 2024

+

On May 7 and 8, 2024, folks from the Linebender team went to the RustNL conference for two days, followed by two days of Unconference.

+

By that point, we all felt fairly exhausted, but because Raph is a cruel taskmaster since we wanted to use the opportunity we had, we came together in our hotel's conference room to discuss the Linebender project, and what we wanted from it.

+

We'd initially thought that this day would be an informal day of unstructured chatting about the ecosystem, but it fairly quickly turned into a semi-formal planning exercise, where we tried to figure out a roadmap for the next few months.

+

What follows is a comprehensive summary of what exactly we're planning to do. +We've tried to focus on blockers, where a missing feature in one project is stalling progress on other projects, because those are the hardest barriers to coordination, and we wanted to take advantage of being in the same room together to knock them down.

+

This is a snapshot of the project status at the time we're writing this. +It includes some work we already finished since RustNL, but will not be updated when further work finishes.

+

Vello

+

Robust dynamic memory

+ +

Reliable snapshot tests

+ +

Sparse strips

+ +

Add tests

+ +

Masonry

+

Complete text input

+ +

Better tracing for debugging

+ +

Fix glaring documentation problems

+ +

Finish repository port

+ +

Write "Widgets in Arena" RFC

+ +

Write "Pass order" RFC

+ +

Rewrite documentation

+ +

Improve focus handling

+ +

Improve pointer status handling

+ +

Parley

+

Create abstractions for text selection and editing

+ +

Inline block layout

+ +

Write adequate documentation

+ +

Software renderer

+ +

Xilem

+

Android bringup

+ +

Update repository layout.

+ +

Rework xilem_core to be compatible with Masonry backend

+ +

Write Documentation

+ +

Re-implement async integration

+ +

Add unit tests

+ +

Add basic benchmarks

+ +

AccessKit

+

Matt Campbell's contract with Google hasn't started yet. +When it does, the top priority will likely be the Android backend.

+

The plan is to study existing Android accessibility implementations for non-Java toolkits, including Flutter, Chromium, and Gio, to get a better understanding of what's required to implement Android accessibility from scratch.

+

Beyond Android support, we've only had cursory discussions of what work Matt will do for the rest of the year. +Possible themes include scrollable containers, virtualized lists, richer text support (e.g. exposing font and style attributes) across platforms, and better integration into Xilem/Masonry.

+

Android-specific work

+

Getting the Android port right involves a lot of small changes and making things feel non-broken.

+

Some notable sub-goals:

+

Subclassing View/Application/Activity

+ +

Handling IME

+ +

Gesture recognition

+ +

Conclusion

+

Whew! We have our work cut out for us there.

+

Overall, I'm feeling very optimistic about the coming months. +In the weeks since we first drafted this roadmap, we've already made a lot of progress on our respective tasks (for instance Daniel is now running on what async experts call a "work-stealing" algorithm), so it does look like we'll meet our deadlines.

+

What comes after that is a bit hazier. +Our three areas of focus are likely to be Android support, accessibility, and developer experience.

+

As we fill out gaps in our feature set, Xilem is moving towards its faraway goal: becoming a stable, mature framework for GUI applications. +We're not GUI yet, but we certainly hope to be one day.

+

In the meantime, stay tuned!

+ + +
+
+ + + diff --git a/blog/rustnl-2024-unconference/index.html b/blog/rustnl-2024-unconference/index.html new file mode 100644 index 0000000..a80ff48 --- /dev/null +++ b/blog/rustnl-2024-unconference/index.html @@ -0,0 +1,225 @@ + + + + + + + + Report on the RustNL 2024 Unconference - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Report on the RustNL 2024 Unconference

+

Olivier Faure, June 15, 2024

+

On May 7 and 8, 2024, folks from the Linebender team went to the RustNL conference in Delft. +We listened to some Rust-related talks, Raph gave one on Xilem, Rik Arends did the "hot-reload my entire editor live" thing that makes every other Rust GUI developer jealous, it was an all-around great time.

+

After RustNL, though, another less-documented event called The Unconference. +It was from roughly the same organizers and took place in the same city, but the format was fairly different.

+

The Unconference wasn't livestreamed, and I haven't found any public discussion of it, so I thought I'd take the time to describe a bit of what was going on.

+

The format

+

The "Unconference" was two days of loosely structured chats between members of various Rust project teams where people talked about ecosystem collaboration, complained to lang team members that their favorite feature wasn't implemented yet, went to pester everyone else about variadic generics, and other good fun.

+

Attendees were split into three teams:

+ +

Discussions inside these teams were mostly self-organized, with cross-team discussions mostly taking place during lunch and recess.

+

On the tyranny of structurelessness

+

Note: This section is very much my personal opinion and doesn't represent the Linebender project as a whole.

+

I'm not sure the self-organized format worked well.

+

From what I saw, the Embedded team took well to it, and the Rust team was kept productive thanks to Alice Cecile's efforts in marshaling everyone.

+

In the case of the GUI team, people were spread in a very large room, which should have been conducive to small side discussions and people splitting up to talk about the problems that interested them. +Instead, there was an unspoken accord to progress through agenda items one by one, with a few people dominating the discussions on these items.

+

Because those people we spread around a large room, they had to talk loudly to address each other, which left little room for side-discussions. +Because the people talking were naturally the most confident and extroverted, more introverted people ended up taking a passive role in the discussion.

+

To me, this feels like a strategic mistake. +It was a setup that encouraged bikeshedding and long back-and-forths and discouraged plurality of opinions. +It's no coincidence that the most interesting conversations of the Unconference happened at lunch: lunch was the point of the Unconference where people were most mixed, had the most spontaneous conversations, and were least constrained by having to follow what someone else was saying.

+

Our discussions were still productive, I just feel like the format could have been improved.

+

The GUI team

+

As a member of the Linebender project, I was mostly exposed to the GUI team's proceedings.

+

The main topics of interest were:

+ +

Note that I'm skipping a lot of topics from the agenda and other side discussions. +The topics above were the most prominent during those two days.

+

There was also a fair amount of informal chatter around LogLog Games' strongly critical Leaving Rust gamedev after 3 years article. +I think those discussions mostly reflected the Bevy community's consensus, that the article had some flaws but overall pointed at very clear weaknesses in the Rust GUI / game engine ecosystem.

+

Build tooling

+

Everyone agreed that a better solution was needed to ship non-TUI Rust apps.

+

There was discussion about various platforms and build systems, and the difficulty of having to e.g. write Java code for an Android port, and whether anyone wanted to take responsibility for maintaining that glue layer for the rest of the ecosystem.

+

No actionable decisions were made, but the consensus seems to be that although integrated build tools are desirable, external build tooling for complex platforms (primarily Apple and Android) is likely to remain necessary. +Nobody seems to have stepped up to work on multi-target builds in Cargo, and since external build tools are required as it is, most people are okay with building everything several times when they release a multi-target package. +Most users are comfortable invoking platform-specific tools for bundling, signing, and manifest generation, so there is not much urgency for integrated tooling for these.

+

Text layout and editing

+

There was some widespread interest in the Linebender ecosystem's text-handling crates. +From what I remember, Rik Arends and others had concerns about whether e.g. Parley and Swash depend on our Vello renderer (they don't).

+

Some people also wanted Parley to be decoupled from Swash.

+

People were especially interested in the idea of having access to a common text-editing widget, or at least infrastructure for creating one. +That widget would handle IME, text selection, accessibility actions, etc, in a way that would feel native to different platforms with their own text-editing quirks (mobile, macOS, Linux with vim mode, etc).

+

Winit

+

By now all of the Rust ecosystem has firmly converged on winit as the windowing platform-abstraction solution of choice.

+

(Well, not all! One small project with indomitable maintainers still holds out against the invaders.)

+

The consensus during this discussion seemed to be that Winit was there to stay. +TAO users present were generally interested in being able to use upstream Winit in the future, if its API adopts or supersedes the improvements made in TAO. +Most were happy to see Winit becoming more trait-oriented, and to see the dpi crate spun off from Winit.

+

Glazier is still shelved and we're planning to port its features to Winit until it reaches feature parity.

+

A discussion that came up was the idea of splitting more "vocabulary types" from Winit into standalone crates. +Vocabulary crates, e.g. crates that only define types and very little code, have a very low cost in memory and build times, while allowing projects to interop with e.g. Winit without actually adding a dependency on Winit.

+

This was connected with the discussions about text editing: having a vocabulary crate that would list Winit's events and also Parley's cursor movements would allow for a very low-dependency text editing widget.

+

Accessibility

+

Note: This section is also my personal opinion and doesn't represent the Linebender project either.

+

The subject of Accessibility came up informally, but I'll claim it was underexplored.

+

While the subject was on the agenda, by the time we reached it the Unconference had been running long enough that everyone was tired and ready to leave or get to the catering. +This is an unfortunate pattern that I think is worth pointing out: if projects don't make a deliberate effort to prioritize discussions of accessibility, the subject will be left out.

+

Matt Campbell, the maintainer of AccessKit, could not attend the Unconference. +I'm concerned that, in his absence, other maintainers might have felt a dilution of responsibility: since the accessibility guy wasn't there, nobody felt empowered to bring up accessibility.

+

(This might sound like it contradicts my section about structurelessness above. +It doesn't. +I'm not saying organizers should have pushed harder for accessibility - they did try - I'm saying that we should strive for a culture where framework developers think about accessibility without waiting for someone to tell them to.)

+

One point did come up during the discussion which I'd like to hammer in: the Rust ecosystem should adopt a holistic view of accessibility. +Accessibility isn't just about screen readers, and making a framework accessible doesn't stop at adding AccessKit as a dependency, though doing so is a great first step.

+

Rik asked if there was a minimal set of ARIA attributes that people could start using in their UI, as the set of available attributes is gigantic. +The AccessKit framework is rich, and it's not obvious at first glance how much is needed versus nice-to-have. +The current reference in the Rust ecosystem is the AccessKit implementation in egui.

+

Requests for Rust features

+

Jon Kelley, the creator of Dioxus, had a laundry list of features he wanted from the Rust language. +That list was later filed in the Project Goals repository.

+

The requests were well-documented, with motivating examples in existing Dioxus code that would clearly be improved by the features. +Most of them felt both self-contained and like they would tremendously both beginners and veteran Rust developers; though Jon made the point that the papercuts he wanted to remove were especially punishing for new developers trying to become familiar with Rust.

+

Overall people were very enthusiastic about them, and the lang team members in the room seemed pretty optimistic that those features could be added.

+

My favorite proposals were:

+ +

Jon also wanted support for a remote cache of pre-built crates, so that users wouldn't suffer from having to rebuild dozens of crates every time you download your crate's dependencies. +The consensus from Rust maintainers was that such a cache would be essentially impossible with Rust's current architecture.

+

Niko Matsakis recently released The borrow checker within, which feels like a follow-up to some of these discussions.

+

Collaboration in the Rust GUI ecosystem

+

Over the last two years I've joked a few times that everybody in the Rust GUI ecosystem wants the ecosystem to standardize on common crates, as long as it's their crates.

+

After RustNL, I'm pleased to report this joke isn't accurate anymore.

+

A vibe that permeated all discussions was people wanting work to be pooled. +It felt like people didn't strongly care whose crate we adopted, as long as we all agreed the crate made sense: +we're slowly crawling out of the xkcd 927 dilemma.

+

The main ecosystem crates that people are enthusiastic about sharing are:

+ +

Jon Kelley also said he would be interested in using Masonry as the native backend for Dioxus, though we haven't hashed out details yet.

+

Corporate funding

+

For open-source projects, "Who funds this" is a difficult question: in any healthy project, there is a large scale of contributions, with individual non-corporate contributors at one end, and companies paying cash to the project's treasury at the other. +In-between are self-employed people like me contracted to work on an open-source project, and corporate employees who contribute to the project as part of their 9-to-5 job.

+

Some monetary contributions can also come from individual non-corporate donors: Servo has about fifty of them, for instance.

+

With that in mind, some notable sponsors for projects represented at the Unconference were:

+ +

Not present at RustNL but relevant to the ecosystem are System76 (funding COSMIC-Text and contributing to iced), Kraken (funding iced), and Slint who are self-funding as a startup targeting embedded UIs and couldn't attend due to time constraints.

+

Overall the number of different backers feels like a symptom of a healthy ecosystem: while some large corporate sponsors bring much more resources than others (Google and Futurewei especially), the ecosystem isn't in a state where any specific backer pulling out would completely collapse progress.

+

Conclusion

+

Before anything else, I'd like to express a big thanks to the volunteers who helped organize RustNL.

+

Most of the attendees were absolutely exhausted after two days of talks and two more days of Unconference, but these folks had to run the darn thing. +I think everyone who attended was impressed with them.

+

Overall RustNL and the Unconference felt like getting a year of coordination done in a week. +It was a thoroughly productive time, and I couldn't be happier I attended. +Everyone I asked about it shared the same opinion.

+

And the discussions we had during the event showed there was a great appetite to push the ecosystem towards more cooperation, both between GUI projects and with Rust maintainers!

+

I'm feeling more hopeful about the future of Rust GUI than ever.

+

Now it's time to get back to work.

+ + +
+
+ + + diff --git a/blog/tmil-09/http_cats.png b/blog/tmil-09/http_cats.png new file mode 100644 index 0000000..5f0abd0 Binary files /dev/null and b/blog/tmil-09/http_cats.png differ diff --git a/blog/tmil-09/index.html b/blog/tmil-09/index.html new file mode 100644 index 0000000..455f64f --- /dev/null +++ b/blog/tmil-09/index.html @@ -0,0 +1,161 @@ + + + + + + + + This Month in Linebender, September 2024 - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

This Month in Linebender, September 2024

+

Daniel McNab, Olivier Faure, October 15, 2024

+

Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for the Rust programming language.

+Linebender logo; smoothly stroked overlapping lowercase letters, an l and a b. +

Xilem

+

Xilem is our flagship GUI project, inspired by SwiftUI. +It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.

+ + +
+A list of HTTP status codes, with 'Select' buttons. HTTP code 418 'I'm a teapot' is selected, with a picture of a kitten hiding in a teapot. +
+

The HTTP cats example.

+
+
+

Masonry

+

Masonry is the widget system used by Xilem. +It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.

+

Our ongoing pass specification project has been largely implemented. +That work is now in a wrapping-up stage, which has allowed Olivier to work on improving the codebase's quality in general. +Some highlights of work from September:

+ + +

Some ongoing work includes:

+ +

Vello

+

Vello is our GPU vector renderer. +It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.

+

The month of september included a lot of progress towards the 0.3.0 release.

+ +

Parley

+

Parley is a text layout library. +It handles text layout, mostly at the level of line breaking and resolving glyph positions.

+ +

Others

+ + + +
+
+ + + diff --git a/blog/tmix-01/index.html b/blog/tmix-01/index.html new file mode 100644 index 0000000..00d4b47 --- /dev/null +++ b/blog/tmix-01/index.html @@ -0,0 +1,108 @@ + + + + + + + + This Month in Xilem, January 2024 - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

This Month in Xilem, January 2024

+

Raph Levien, February 6, 2024

+

Welcome to the first in the “this month in Xilem” series, bringing updates on the Xilem UI toolkit.

+

There were two blog posts on the new Linebender blog. +The first, Xilem 2024 plans, sets out the goals for the project for the year. +The second, Roadmap for the Xilem backend in 2024, by Olivier Faure, presents a roadmap for the Xilem native widget set. +A major feature of the roadmap is a clean boundary between the Xilem reactive framework and the lower level widget set. +We hope that enables experimentation with other reactive frameworks and possibly integration with other projects, rather than requiring everybody to buy into the Xilem stack.

+

On the planning front, a major decision was whether to continue work on our own window creation library, Glazier, or whether to join forces with winit. +Among other things, since Android is a primary target for our work, and winit already has a working Android back-end, it offers an appealing path to getting that up quickly. +We have decided to try joining forces with winit, and look forward to future collaboration. +Over the next few weeks, that will entail porting Xilem over to winit (xilem#163) and also trying to land working Android IME (soft keyboard) support in winit (winit#2993).

+

In Vello, a major advance was porting the low level font handling code from the experimental swash crate to the production-quality skrifa (vello#423). +Skrifa is being developed by Google Fonts as a memory safe library for loading font files, and is integrated into Chromium builds. +Over the coming weeks, a goal is to release Vello (and supporting crates) on crates.io.

+ + +
+
+ + + diff --git a/blog/tmix-02/index.html b/blog/tmix-02/index.html new file mode 100644 index 0000000..0ae4cf8 --- /dev/null +++ b/blog/tmix-02/index.html @@ -0,0 +1,113 @@ + + + + + + + + This Month in Xilem, February 2024 - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

This Month in Xilem, February 2024

+

Raph Levien, March 4, 2024

+

Early this year, we made a decision to use the winit crate for window creation, as opposed to rolling our own. +That work has now landed in main (xilem#176 was the main PR, with a number of followups). +A major motivation was to enable more platforms, with Android being a major goal. +That work is in progress; a major subtask is enumerating the system fonts. +As expected, this move has uncovered rough edges in winit and some regressions in behavior. +We plan to address those, with the improvements hopefully benefiting the entire Rust UI ecosystem.

+

The Vello crate has been published as version 0.1, with significant documentation improvements and a friendly example. +We consider this an alpha-quality release, as there are known issues. +Even so, we want to get a release out to facilitate integrations and shake out problems.

+

Another major area of work on Vello is investigation of startup time, which can take multiple seconds when the platform's GPU drivers are slow at compiling the compute shaders. +A number of techniques mitigate that. +One is to compile shaders in parallel, using multiple cores, and that has landed (vello#455). +An even bigger improvement will be caching compiled shaders. +Daniel McNab has made an encouraging prototype (vello#459), and the ultimate goal is to land that in wgpu so projects across the ecosystem can benefit from it (wgpu#5292).

+

The work to compute strokes on the GPU using Euler spirals continues, but has not yet landed. +The current state is a draft PR that implements the logic in Rust code, which now needs to be translated to WGSL for GPU evaluation (vello#496, draft PR).

+

There has been progress at higher levels of Xilem. +Among other things, Nico Burns landed a scroll view implementation (xilem#155), and Philipp Mildenberger has been steadily refining xilem_core and xilem_web, including fine grained tree structure tracking and minimal/efficient DOM-tree-updates (xilem#160).

+ + +
+
+ + + diff --git a/blog/tmix-03/index.html b/blog/tmix-03/index.html new file mode 100644 index 0000000..ec3e5a9 --- /dev/null +++ b/blog/tmix-03/index.html @@ -0,0 +1,119 @@ + + + + + + + + This Month in Xilem, March 2024 - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

This Month in Xilem, March 2024

+

Daniel McNab, April 4, 2024

+

Since the last update, there have been three newly released projects from Linebender:

+ +

If you have a WebGPU capable browser you can check out the web demo of Velato.

+

Implementation work for rfcs#1 has started. Masonry is being ported to Vello in masonry#56, with the next step being a move to Winit. +This work can be followed in the #masonry stream on Zulip.

+

We have landed some important improvements to Vello. +Euler spiral based stroke expansion (vello#496) enables GPU stroking by default, significantly improving performance in scenes which make heavy use of strokes. +Additionally, we now support scenes with more than 64k draw objects (vello#526). +We have also been making progress on vello#366, by evaluating different strategies for memory allocation. +The first part of this has landed in vello#537, which avoids undefined behaviour in more out-of-memory cases.

+

Additionally, we have been able to continue taking advantage of improvements in the foundational font crates from Google Fonts. +This has enabled support for font fallback in xilem#196. +Hinting has been unblocked by vello#544, although the implementation has not yet landed in Xilem.

+

rfcs#5 has been approved, which will improve the robustness of our continuous integration. +Kaur Kuut, the author of the RFC, has also landed these changes in vello#523.

+

A focus for the next month is preparing for the RustNL conference at the beginning of May. +We are hoping to present a compelling demo there.

+ + +
+
+ + + diff --git a/blog/tmix-04/index.html b/blog/tmix-04/index.html new file mode 100644 index 0000000..b9e1bb9 --- /dev/null +++ b/blog/tmix-04/index.html @@ -0,0 +1,111 @@ + + + + + + + + This Month in Xilem, April 2024 - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

This Month in Xilem, April 2024

+

Raph Levien, May 1, 2024

+

Again, last month saw a substantial amount of infrastructure work in the development of Xilem. +The biggest change is landing Masonry as a crate within the Xilem repo (xilem#203) and adding a new xilem_masonry front-end. +The existing xilem widget tree remains in the tree during a transitional period, but the focus of development is now on Masonry.

+

Masonry is a principled abstraction layer within the stack. +While it is designed to work well with the Xilem reactive architecture, it is not dependent on it. +We'd love to see experimentation with alternative reactive frameworks, and also language bindings. +A lot more detail about the motivation and design of Masonry is in Olivier's roadmap blog.

+

Two major infrastructural crates have been published. +Parley is our text layout crate, supporting variable fonts and other advanced features. +Supporting Parley is fontique, a crate for enumerating the system fonts and making them available for itemization (choosing the right font to support a particular script).

+

In GPU rendering land, we have written a paper on GPU stroke expansion (arXiv, repo) and submitted it to a conference. +This paper explains quite a bit of the math behind Vello's path rendering, and explains how we adapted it for high performance on the GPU. +It's also a good time to note the wgpu 0.20 release, which contains some work to improve on suboptimal zero initialization that will dramatically improve startup time on many platforms, including Android (wgpu#5508). +It also has support for subgroups, which will unblock further performance improvements in Vello.

+

We're very much looking forward to participating in RustNL 2024, where Raph will present a talk on Xilem. +It looks like it will be a great opportunity to meet with other Rust UI ecosystem projects to find common ground and possibilities to collaborate.

+ + +
+
+ + + diff --git a/blog/tmix-05/index.html b/blog/tmix-05/index.html new file mode 100644 index 0000000..c033bc8 --- /dev/null +++ b/blog/tmix-05/index.html @@ -0,0 +1,108 @@ + + + + + + + + This Month in Xilem, May 2024 - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

This Month in Xilem, May 2024

+

Daniel McNab, June 12, 2024

+

Several members of Linebender attended RustNL at the start of May. +Raph gave a talk titled Xilem: Let's Build High Performance Rust UI (YouTube). +The conference also provided a great opportunity to meet with developers from other Rust user interface projects; +Olivier has produced a report on the unconference, which will be published here shortly. +In addition, those in attendance met after the conference and worked on a roadmap for Linebender, which we are also planning to share here.

+

We have taken several important steps on Xilem. +At the start of the month, we released Xilem 0.1.0 and Masonry 0.2.0. +This is the first published release of Xilem, and includes text input (xilem#241), AccessKit integration (xilem#244) and a TodoMVC inspired example (xilem#257). +Work through the rest of the month included explorations of a generic View trait (xilem#310), and an Android port (xilem#309, xilem#313). +rfcs#6 is designed to reduce boilerplate when using Masonry, which should help those creating custom Masonry widgets.

+

Other Linebender projects have seen steady improvements. +vello#575 significantly reduced shader compilation time at startup for projects using Vello, and vello#516 enabled clearer error handling. +Nico Burns has started an exciting project for inline box layout (parley#67), which will enable Parley to be used in projects which must implement Web layout.

+ + +
+
+ + + diff --git a/blog/tmix-06/Minesweeper.png b/blog/tmix-06/Minesweeper.png new file mode 100644 index 0000000..d854940 Binary files /dev/null and b/blog/tmix-06/Minesweeper.png differ diff --git a/blog/tmix-06/Xilem Emoji Picker.png b/blog/tmix-06/Xilem Emoji Picker.png new file mode 100644 index 0000000..f1b5e91 Binary files /dev/null and b/blog/tmix-06/Xilem Emoji Picker.png differ diff --git a/blog/tmix-06/index.html b/blog/tmix-06/index.html new file mode 100644 index 0000000..38f51f5 --- /dev/null +++ b/blog/tmix-06/index.html @@ -0,0 +1,127 @@ + + + + + + + + This Month in Xilem, June 2024 - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

This Month in Xilem, June 2024

+

Daniel McNab, July 3, 2024

+

We released Vello 0.2.0 at the start of the month, which included some key improvements discussed in previous months' updates. +We also merged initial handling of Emoji (vello#615), which supports glyphs which use the COLR specification (Apple's system emoji font does not use this format and so currently will not render). +In-flight work includes an enhanced testing setup (vello#610), GPU memory allocation robustness (vello#606), and improved correctness for some unusual strokes (vello#607). +The GPU-Friendly Stroke Expansion paper has been accepted to High Performance Graphics 2024, and will be presented in Denver on July 26. +A revised draft of the paper is published on arXiv.

+
+Screenshot of an app, containing a 4x4 grid of labelled Emoji, zoom in and out buttons and pagination controls. 'cat face with wry smile' is selected +
+

A toy Emoji viewer example (xilem#420) running on Android. +This example uses system fonts, so has limited platform support because of the caveat mentioned above.

+
+
+

xilem#310 brought in some new ideas about how Xilem Core can be structured, which enables support for specialised kinds of View, such as for window properties. +Adapt views built on this were used to create an Elm-inspired example in xilem#401, showing the flexibility of the Xilem architecture. +Philipp Mildenberger has been prolific in his work on Xilem, as a co-author of the new Xilem Core, and in adapting Xilem Web to use it. +He also worked to bring support for OneOf views to Xilem Core in xilem#394 - these were previously only supported in Xilem Web.

+

Masonry's observability support has also been improved, with automatic tracing to a temporary file in debug builds added in xilem#384. +xilem#396 implements rfcs#6, changing the architecture of Masonry to make it easier to write new features and tests.

+

There was also some excellent community engagement with Xilem in June. +Veniamin Ilmer has created an open source Minesweeper game using Xilem. +The discussion on Zulip (in #xilem > Minesweeper converted from Iced to Xilem) has been very useful in guiding areas for improvement.

+
+A window titled Minesweeper, with text in the top-left 'Mines: 82', a top-center button with a neutral ASCII emoticon, and a board represented by a grid of buttons 30 wide and 16 tall, where some buttons are replaced with colour labels containing digits, and some buttons contain an exclamation mark. +
+

Screenshot by Veniamin Ilmer of their Minesweeper game, used under the Apache 2.0 license.

+
+
+

Following on from May, Olivier wrote and published a report on our experience of the RustNL unconference. +This led to some useful discussion online - see the zulip thread corresponding with that post for links. +We are now in the final month of the May-July 2024 roadmap. +In the intervening time much of the work has been started or completed, although there have been some changes of priorities. +I expect that we will soon be looking at prioritising items on our long-term roadmap.

+ + +
+
+ + + diff --git a/blog/tmix-07/calculator_example.png b/blog/tmix-07/calculator_example.png new file mode 100644 index 0000000..bcb9d5e Binary files /dev/null and b/blog/tmix-07/calculator_example.png differ diff --git a/blog/tmix-07/index.html b/blog/tmix-07/index.html new file mode 100644 index 0000000..9132636 --- /dev/null +++ b/blog/tmix-07/index.html @@ -0,0 +1,168 @@ + + + + + + + + This Month in Xilem, July 2024 - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

This Month in Xilem, July 2024

+

Daniel McNab, Olivier Faure, August 8, 2024

+

Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for the Rust programming language.

+

This month saw a lot of community contributions to Linebender projects. +Philipp Mildenberger especially is a major driver for progress on Xilem and especially the xilem_web crate. +Bruce Mitchener has been very active reviewing pull requests, which is an under-appreciated but essential task for any open-source project.

+

Xilem

+

Xilem is our flagship GUI project, inspired by SwiftUI.

+ +
+A calculator with display section showing the calculation 9994 + 3231 = 13225. Below this section is a grid of buttons 4 wide and 5 tall, containing the digits 0-9 and some other calculator operations. +
+

The new calc example for Xilem.

+
+
+

Masonry

+

Masonry is the widget system used by Xilem. +The most impactful change was the implementation of the "Widgets in arenas" RFC in xilem#396. +Widgets are now stored in a global arena, which has little impact on the public APIs but make future changes a lot easier to implement.

+ +

Vello

+

Vello is our GPU vector renderer.

+ +
+A screenshot containing a single bezier curve, split into several differently coloured segments. The control points of the curve are visible. The expanded stroke for this curve is shown as a filled section, with the generated line segment end points visible as small circles. There are several controls for settings of the stroke expansion above the curve. +
+

The demo for the stroke expansion paper, which was created using Xilem Web. +An interactive version can be found on the paper's website.

+
+
+

Parley

+

Parley is a text layout library. +Nico Burns contributed quite a few improvements to Parley this month:

+ +

Others

+ + + +
+
+ + + diff --git a/blog/tmix-07/stroke_expansion_demo.png b/blog/tmix-07/stroke_expansion_demo.png new file mode 100644 index 0000000..3d7c9a3 Binary files /dev/null and b/blog/tmix-07/stroke_expansion_demo.png differ diff --git a/blog/tmix-08/index.html b/blog/tmix-08/index.html new file mode 100644 index 0000000..f30a6a1 --- /dev/null +++ b/blog/tmix-08/index.html @@ -0,0 +1,203 @@ + + + + + + + + This Month in Xilem, August 2024 - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

This Month in Xilem, August 2024

+

Daniel McNab, September 11, 2024

+

Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for the Rust programming language.

+
+Linebender logo; smoothly stroked overlapping lowercase letters, an l and a b. +
+

Linebender has a new logo, which was contributed by Markus Siglreithmaier. +We're seeking feedback on Zulip in #linebender>logo.

+
+
+

Xilem

+

Xilem is our flagship GUI project, inspired by SwiftUI.

+ +

Xilem Web is a community managed experimental DOM implementation of the Xilem pattern. +This month, the updates include:

+ +
+A timer with the value '0:00:26.4' (26.4 seconds) above two buttons, reset and start. Below these are 5 laps, labelled 'lap 5' to 'lap 1', each with a lap time of approximately 5 seconds and a corresponding elapsed time. This is all contained in an OS window titled 'Stopwatch'. +
+

Jared O'Connell additionally contributed a stopwatch example in xilem#492.

+
+
+

Masonry

+

Masonry is the widget system used by Xilem. +This month has been dominated by Olivier's implementation of pass specification (rfcs#7):

+ +

We also had some great community contributions, such as:

+ +
+A horizontal progress bar which is 70% filled with blue, with white text overlaid saying 70%. Below this is a checkbox labelled 'set indetermine progress', and a button labelled 'change progress'. +
+

The progress bar widget was contributed by Richard Dodd in xilem#513.

+
+
+

We continue to make progress on other key features.

+ +
+ +
+

The Xilem to_do_mvc example running with TalkBack integration. +Video provided by Matt Campbell.

+
+
+

Vello

+

Vello is our GPU vector renderer. +We have made some really great progress in August.

+ +
+A vertically split image. On the left are three blurred shapes: a blue rectangle with rounded corners, and two black ellipses. The ellipses are partially occluded by the boundaries of the image. On the right is a web page, showing three blog post titles and summaries, each in a box with a black box shadow. +
+

Vello now supports blurred rounded rectangles, based on the maths from Raph's blog. +Left: Vello's blurred rounded rectangles test scene. +Right: Blitz's servo example which renders box shadows using this feature.

+
+
+

Parley

+

Parley is a text layout library.

+ +

Others

+ + + +
+
+ + + diff --git a/blog/tmix-08/progress_bar.png b/blog/tmix-08/progress_bar.png new file mode 100644 index 0000000..1aacc03 Binary files /dev/null and b/blog/tmix-08/progress_bar.png differ diff --git a/blog/tmix-08/rounded_rectangles.png b/blog/tmix-08/rounded_rectangles.png new file mode 100644 index 0000000..791e504 Binary files /dev/null and b/blog/tmix-08/rounded_rectangles.png differ diff --git a/blog/tmix-08/stopwatch.png b/blog/tmix-08/stopwatch.png new file mode 100644 index 0000000..c9c11e7 Binary files /dev/null and b/blog/tmix-08/stopwatch.png differ diff --git a/blog/tmix-10/floem-todo-list.png b/blog/tmix-10/floem-todo-list.png new file mode 100644 index 0000000..f65913f Binary files /dev/null and b/blog/tmix-10/floem-todo-list.png differ diff --git a/blog/tmix-10/index.html b/blog/tmix-10/index.html new file mode 100644 index 0000000..eaf3f7f --- /dev/null +++ b/blog/tmix-10/index.html @@ -0,0 +1,225 @@ + + + + + + + + Linebender in October 2024: resvg stewardship - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Linebender in October 2024: resvg stewardship

+

Bruce Mitchener, Daniel McNab, November 4, 2024

+

Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for the Rust programming language.

+

This month's update is very significant, featuring several crate releases and the adoption of resvg.

+ +

We would like to thank Yevhenii Reizner (RazrFalcon) for all his work on resvg, tiny-skia, and related projects. +Due to some changes in his personal circumstances, he has to give up working on his collection of excellent crates and he has been seeking new homes for them to help keep the lights on. +The following projects are now part of Linebender:

+ +

These crates are widely used within the ecosystem and play an important role in many software projects, and not just in Rust! +Given that Linebender has a mission to provide high quality libraries for GUI and we have established processes for managing those libraries, we feel well positioned to step in and help out. +Several associated repositories and projects are also now part of Linebender. +These are simplecss, svgtypes, and resvg-test-suite.

+

We do not expect this change to significantly impact current users of resvg, usvg, or tiny-skia. +Our role is a stewardship role, to allow updates to continue as needed by the community. +If things work for you now, they will continue to work for you going forward.

+

Our plans for the near future are:

+ +

In the longer term, we will look at how the ecosystem is evolving and what’s needed or useful. +The Linebender team has deep expertise in 2D rendering, including vector graphics, color and text layout, shaping, and rendering. +We look forward to seeing how we can apply this to these projects.

+

Relicensing

+

We’ve already begun the process of re-licensing the resvg repository and are nearly done. +The change of license will be present in the next release, which will also be our first release under the Linebender umbrella. +This will allow us to share code between the Linebender crates more easily.

+

This process can be followed at resvg#838.

+

Help Wanted

+

We welcome pull requests and issues.

+

Also, with RazrFalcon becoming less involved, we’re losing a key source of knowledge about the code itself as well as the philosophy behind it. +We look forward to hearing from people who use the various crates to understand how you use it, what you use it for, and what you’d like to see.

+

For further discussion, please use the resvg channel on the Zulip.

+
+

+

Alongside the work on resvg, we have been continuing work on our existing projects.

+

Xilem

+

Xilem is our flagship GUI project, inspired by SwiftUI. +It lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.

+ +

Work on Xilem Web continues.

+

Masonry

+

Masonry is the widget system used by Xilem. +It provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.

+ +

Daniel also provided a talk to GOSIM China 2024 about Masonry. +The recording of this presentation is not yet available.

+
+A tracing view of a single frame in Masonry. There are high-level spans with details underneath, and GPU operations are shown. +
+

Masonry now has built-in support for tracing using Tracy, using the tracing-tracy crate.

+
+
+

Vello

+

Vello is our GPU vector renderer. +It can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.

+

The main update is the release of version 0.3.0. +This release includes previously discussed support for emoji and blurred rounded rectangles. +We also now no longer consider Vello to be experimental, and so would encourage you to try Vello for your projects. +Raph has been working on Sparse Strip Path rendering; progress can be followed in the Zulip thread.

+

We do still have several known issues, but are not aware of any issues which would block wider adoption.

+
+A to-do list desktop app, in a vertical layout: Use Floem, unchecked; Create more TODOs, checked; Join the Linebender Zulip, unchecked. There is a button labelled 'New To-Do'. +
+

Vello is now supported as a renderer for the external Floem project, developed for the Lapce editor. +Note that Lapce does not currently itself use Vello.

+
+
+

Parley

+

Parley is a text layout library. +It handles text layout, mostly at the level of line breaking and resolving glyph positions.

+

We released Parley 0.2.0. +This includes:

+ +

We have also done some follow up work, including:

+ +

Piet

+

Piet is a 2d graphics library which abstracts over platform-native graphics APIs. +Linebender is focused on Vello rather than Piet for performance reasons, but some users may find Piet useful, as it relies on more mature renderers and is more compatible with older platforms. +During October, we released Piet 0.7.0.

+

Some key updates from October included in this release are:

+ +

Druid

+

Druid is a GUI library which was a predecessor to Xilem, and an ancestor of Masonry.

+

We are in the process of relicensing Druid from its current license of Apache 2.0 only to the Rust ecosystem standard Apache 2.0 OR MIT dual license. +If you have previously contributed to Druid, please read and respond to druid#2414. +This will greatly improve cross-compatibility with the rest of the Rust ecosystem, particularly for adapting code from Druid into newer toolkits. +We plan to archive the Druid repo after one more release, as we are not actively developing it; we are working to bring Xilem to parity in capability. +We will also apply this license change to Xilem and Masonry, as well as Glazier, which is currently archived.

+

Others

+ + + +
+
+ + + diff --git a/blog/tmix-10/masonry-tracy.png b/blog/tmix-10/masonry-tracy.png new file mode 100644 index 0000000..066ba8f Binary files /dev/null and b/blog/tmix-10/masonry-tracy.png differ diff --git a/blog/xilem-2024/index.html b/blog/xilem-2024/index.html new file mode 100644 index 0000000..e3b7924 --- /dev/null +++ b/blog/xilem-2024/index.html @@ -0,0 +1,131 @@ + + + + + + + + Xilem 2024 plans - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Xilem 2024 plans

+

Raph Levien, January 10, 2024

+

2024 promises to be an exciting year for Xilem. The big news is that Google Fonts is funding the work of four open source contributors to the project: Aaron Muir Hamilton, Daniel McNab, Matt Campbell, and Olivier Faure.

+

Aaron will be working on text layout, building on parley, text input including IME, and Android platform integration. Daniel will be working on GPU infrastructure and performance, with much of the work upstreamed to wgpu. Matt will be working on accessibility, and Olivier will be building the core widget tree, with a focus on developer experience.

+

Xilem is an ambitious project to explore the limits of UI performance, as described in my High Performance Rust UI talk. The goals include gathering knowledge about the viability of Rust for UI, and what patterns work well. While there is a research focus, we plan to gather this information by building a real toolkit, solving many of the hard problems. The current state of the project is a fairly rough, though promising, prototype, so there is much work to be done. It’s exciting to have the bandwidth and experience of these people working toward that goal, but perhaps the most exciting prospect is bringing together more of the community, people passionate about building high quality UI. Our goal as an open source community is to facilitate that, and to coordinate the work efficiently. What we have now is not a production-ready product, but we wish to move in that direction, including quality documentation - some of the consistent feedback we’re getting about the current state.

+

Another goal is to bake in accessibility from the start. Too often, it’s an afterthought, tacked on at the end. We’re excited to have Matt, primary author of AccessKit, on board.

+

Xilem is designed in layers, with a reactivity layer on top, a widget tree adapted from Druid, and with Vello as the 2D rendering engine. These layers are designed to work well together, but the individual pieces may be useful in other contexts. The funded work will focus on Android as a target, but is intended to work well on desktop platforms as well; this is one of the core strengths of the Rust ecosystem. We don’t have iOS as an immediate priority, but attention from the open source community could change that, and the foundations should support it.

+

The status of the web backend for the Xilem widget set is more complex. Simply put, it is not a priority for us right now. We have done some explorations into generating DOM nodes from Xilem, but doing it well would increase scope and complexity beyond what we’re comfortable with. For applications deployed primarily on the web, xilem_web (which generates DOM nodes) should be a viable choice, with the possibility of Tauri or Electron for desktop deployment. To enable online demos of native applications, it is most likely that we will implement a version which draws to a canvas element. This has limitations in accessibility and native look and feel - for example, text input and scrolling may behave contrary to user expectations. Until more work is done refining the web backend, we would not recommend this approach for production applications using Xilem.

+

2023 retrospective

+

Looking back at 2023, there was a great deal of foundational work. Much of the effort was on Vello, the 2D rendering engine that serves as the graphical foundation of the project. A particular strength is high performance path rendering on GPU, which enables fully dynamic text effects including animation of variable font parameters. Though we had a reasonably good implementation of path rendering in place, much of the second half of the year was taken up by “stroke rework” which computes all stroke styles on the GPU, and also improves the performance and accuracy of antialiasing for all paths. To this end, we invented new computational geometry algorithms for computing parallel curves, the newest based on Euler spirals, with some elegant math tuned for GPU evaluation. A writeup explaining the details is in the pipeline.

+

There was slow and steady work on the higher levels of the stack as well, including factoring out the reactive layer into a generic xilem_core module, and validating that with generation of DOM nodes for browser deployment. The widget tree saw some development as well, including integration with the Taffy layout engine.

+

Governance and community

+

Though we now are funded to work on the project, the open source nature of the projects continues unchanged. We’ve been building up infrastructure for open source community, including a Zulip instance, weekly office hours, wiki, and, as of this post, a shared blog. Our contributor guidelines explain a bit about our processes. Almost all decision making is by consensus. Only very rarely do I need to step in and tie-break. As we scale up, we’re going to be more systematic, starting to use RFC documents for major changes.

+

We’re intentionally designing our community to foster learning and collaboration. For example, discussions are on Zulip rather than Discord because it’s searchable, meaning that the same questions are less likely to come up over and over. Its grouping into topics lets participants quickly skim activity as opposed to getting drowned in chatter. It’s working well for us. We also invite others in the Rust UI ecosystem to use our Zulip and wiki. As the Kurzgesagt video The Internet is Worse Than Ever – Now What? observes, large social spaces are degrading, and the video recommends seeking out smaller, more focused communities. I hope ours is one such.

+

In any case, we are happy to share bits of infrastructure with other Rust UI efforts, and are always eager to learn from them. I see many of us working toward common goals rather than competing, even if there are different approaches and priorities.

+

Thoughts on the Rust UI ecosystem

+

I’ve been thinking about doing UI in Rust for about 8 years now, and have explored many, many approaches. I’m not alone in this, there have been well over two dozen projects started.

+

As mentioned in a previous blog, any given application will have a set of requirements. Is Web one of the main deployment targets? Will there be embedded video? Is there a need to integrate with some other subsystems, such as a game engine? Each of these has profound implications. Some problem spaces (compilers are an example) are “smooth,” in that continual refinement will lead to fairly similar outcomes no matter the starting point, but over time I’ve come to the conclusion that UI is especially lumpy. I believe this contributes to the continuing pattern of new UI toolkits coming out every couple months or so; the author surveys what’s available, finds none that match the specific set of requirements, and creates a new one.

+

In some ways, Xilem is in the same pattern, but there are some things we’re doing differently. For one, it’s explicitly a research project, with knowledge about how to build UI in Rust an outcome possibly as important as the codebase. We’re trying to be systematic about finding the best ways to do things, which ideally will make some solutions more general. And, increasingly, we’re designing things as modular layers that can be swapped out. With luck, even if people don’t end up adopting the entire stack, there will be some useful components for the ecosystem.

+

A good overview of the opportunities and challenges in Rust UI, particularly for making mobile apps, is parallel futures in mobile application development by Andy Wingo. The linked blog posts in that series also go into considerable detail about JavaScript and TypeScript based approaches, which have important lessons as well.

+

Declarative UI patterns

+

The trend in UI programming has been overwhelmingly away from a soup of mutable objects with interlinked references and toward various declarative or reactive patterns. That’s a good thing for Rust UI, because the former is very un-ergonomic in Rust.

+

In the JavaScript world, there is a Cambrian explosion of reactive techniques. React is by far the most popular, but there is a strong sentiment it’s possible to be better, particularly on performance, but also robustness, as the logic for deciding when to re-render is fickle, and can miss re-renders. Elm deserves special mention, as its avoidance of global shared mutability makes it particularly easy to adapt to Rust, so it serves as the reactive core of the iced, relm, and vizia UI toolkits, as well as yew on the WASM side. But there is also Ember Octane (based on Adapton), a number of fine-grained reactivity approaches such as SolidJS, and many, many more (not to mention the incredible diversity of solutions for state management).

+

We’re seeing much of that diversity mirrored into the Rust world. On the WASM side, we see Dioxus as a fairly faithful adaptation of React, leptos (also sycamore and tachys) adhering fairly closely to SolidJS, yew as an adaption of elm, and more.

+

A reactive layer such as Dioxus or leptos can be compiled to WASM and run in a browser to generate DOM nodes. More recently, we’re seeing that it can be decoupled from that environment, and a reactive core can drive a widget tree. Examples include Freya which uses Dioxus, and floem which implements fine-grained reactivity inspired by leptos.

+

Xilem doesn’t directly correspond to any JavaScript framework; it relies on static typing and is actually closer to SwiftUI than anything web based.

+

One of the central questions in Rust UI going forward is: which approach to declarative UI is best? It’s possible a clear winner will emerge, or perhaps there will be a different answer depending on the use case, or it might just come down to a matter of personal style, with a number of viable contenders (arguably that’s where JavaScript is). We’re taking a two pronged approach. First, we’re moving forward with Xilem. There’s a specific reason - Xilem is designed to support multithreaded rendering easily, while many of the other frameworks rely on thread local storage for access to a store of observables, an approach with high impedance mismatch to multithreading. Since performance is a goal, we didn’t want to give that up by adopting another framework. I also think Xilem is pretty good, but that remains to be seen.

+

Another way to gather more evidence on the Xilem declarative layer is to use it to generate DOM nodes in a browser, in other words decouple it from the widget set. As described in the Xilem Vector Graphics talk, we have been experimenting with that a bit, and a major development in the last year was to factor out the core declarative logic into xilem_core, and also develop a xilem_web layer for creation of DOM nodes. Early indications suggest that this may be a viable alternative to frameworks such as Dioxus and leptos, and we're eager to learn more from those explorations.

+

Xilem is untested, though promising, and it may be that some other approach is better. If so, we’re prepared to pivot. We’ll be designing the widget set so that it doesn’t have a hard-coded dependency on the Xilem declarative layer, and could, at least in theory, be driven from other frameworks. Olivier is author of the masonry crate, where being agnostic to the declarative layer was an explicit goal. He’ll be adapting many of the ideas from that.

+

Making a widget set agnostic has other potential benefits. While writing app logic in Rust is very promising, there are still compelling reasons to use other languages. A widget tree implemented in Rust with fast graphics and smooth interactivity, scripted in some other language, is compelling. I made a prototype in Python, which, though rough, shows promise.

+

Infrastructure

+

A UI toolkit depends on a great deal of infrastructure. We’re making careful choices around that, and also looking for opportunities to collaborate with the rest of the ecosystem. One choice I’m particularly excited about is investing in wgpu. I think WebGPU will move modern GPU usage forward considerably, especially compute shaders, which are heavily used in Vello. This technology will make truly portable applications requiring high compute throughput possible for the first time, and we’re shooting for smooth UI integration with the GPU usage in these applications.

+

Whether to use winit or build our own platform integration has long been a subject of discussion. We’re reopening that discussion with the winit maintainers as of this writing, but it’s still too early to say whether we’ll join forces, or decide that the goals of the project support having a separate codebase.

+

A huge part of any UI effort is text, and that’s also a long-standing interest of mine. I’m impressed with cosmic-text but ultimately we decided to move forward with parley, in part so we can test out ideas with variable fonts. The lower levels of the text stack will be rebased on the fontations work of the Google Fonts team, which is rapidly becoming a production-quality implementation.

+

Building common infrastructure for accessibility also benefits the entire ecosystem, and we're thrilled to see the increasing adoption of AccessKit. Indeed, on all these topics, we’re happy to share what we’re doing with other projects, as most of the infrastructure described above is general in application, rather than specific to our projects.

+

Conclusion

+

The potential for Rust UI is huge. The Rust language enables top-notch performance and reliability and is also expressive for high-level application logic. We plan to prove that out, based on encouraging existing research and explorations, as well as new research to discover the patterns for Rust UI that work best at scale. This involves work at all levels of the stack, including infrastructure we are happy to share with other Rust UI efforts.

+

Xilem is still an early prototype. For those who desire a “batteries included” toolkit for building UI, we ask your patience. For those who are interested, you are invited to come build this future with us.

+ + +
+
+ + + diff --git a/blog/xilem-backend-roadmap/index.html b/blog/xilem-backend-roadmap/index.html new file mode 100644 index 0000000..8d7bb1a --- /dev/null +++ b/blog/xilem-backend-roadmap/index.html @@ -0,0 +1,208 @@ + + + + + + + + Roadmap for the Xilem backend in 2024 - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Roadmap for the Xilem backend in 2024

+

Olivier Faure, January 19, 2024

+

As you may have heard by now, Google Fonts is funding me this year to work on Xilem.

+

I'm not alone in that: Aaron Muir Hamilton, Daniel McNab and Matt Campbell were funded as well to work on various parts of the ecosystem. I believe this is Matt's third year getting funding from Google Fonts.

+

Now, what I was hired to do might be unclear to you. The scope we agreed on was fairly broad and was stated as "contributing to Xilem's view tree and developer experience", but that could mean a lot of things.

+

The first thing I want to do is communicate a clearer picture. I have a a lot of plans for Xilem, and they involve major changes from the current architectures, changes that might be worrying to the community at large or even to Raph Levien. I certainly don't want to give the impression that I'm wresting the project away from the Linebender community for Google's interest, and that means being transparent early and often about the things I want to rework.

+

What I want for Xilem

+

Xilem is a research-and-development project, the latest in a series (Xi-Core, Druid, Crochet, Lasagna, Idiopath), that aims to explore how UI development can be made compatible with Rust.

+

This might feel a little banal now, because Rust GUI frameworks are popping up everywhere and starting to settle on similar patterns, but those patterns weren't obvious in 2019! Xilem is very different from Druid, and getting to its current architecture has been a process.

+

Xilem has been perma-experimental since May 2022. Once it got started, the main Druid maintainers stopped contributing almost entirely with the expectation that Xilem would replace Druid once it was ready. Unfortunately, it still hasn't made enough progress to be on parity with Druid, yet Druid still lies abandoned, which isn't great when people had started relying on it.

+

It's debatable how much this could have been avoided. As I've pointed out before, the Rust GUI ecosystem is subject to massive yak-shaving: many of us came here because we wanted to build a text editor, and now we're all learning about text rendering, text editing, compositing1, accessibility trees, using monoids to implement stuff on the GPU, ECS, and some concepts that I'm absolutely certain Raph made up like Bézier paths and C++.

+

And to a certain extent, yak-shaving is good! "I'm going to do better than X without learning how X works" is a child's attitude. It's the attitude we all start with, and it fills us with courage, but that courage is naive. True improvement comes from keeping that courage after spending years learning how immense the problem space is, and keeping faith that it's possible to do better. The Rust community is one that values not just doing things from scratch, but also learning from the past to get them right.

+

This is good, but the "get them right" part takes a lot of time, and in the meantime, I'd argue that we've neglected end users a bit. We've abandoned Druid before Xilem was ready as an alternative, and then we worked on foundational and experimental projects that would make Xilem stronger and sounder in the long term, but left the project in an awkward state in the meantime (except for the web backend, which made a lot of progress).

+

In the ECS-backed GUI framework article I linked, Bevy maintainers have this to say:

+
+

Not to be too harsh, but a lot of the existing Rust GUI solutions... just aren't very good. There's a lot of passable options, but they all have non-trivial drawbacks. No one has really risen to the top as a clear winner. [...] Deep down, we all know that we can do better, and we should.

+
+

My ambition is to makes this paragraph obsolete before the end of the year. I want Xilem to get back to being suggested to newbies in the same breath as Iced and SlintUI. In the next few years, I want the entire ecosystem to get to a point where people talk about Rust GUI like they talk about ripgrep or rustls.

+

To give one specific example: my personal goal is to implement seamless hot reloading for Xilem before the end of 2024. I believe it's feasible, and I believe doing it will radically change the way people think about Rust GUI, along with other improvements I hope to unlock over time.

+

In the shorter term, my plan is to focus on basic features, widgets and styling options so people can experiment with Xilem, building on Raph's work on Vello over the past year. John Skottis's Xilem UX Notes give a good picture of the kinds of things I'll be working on.

+

The other big short-term priority is going to be documentation. We've seen a lot of people complain that the Linebender project were poorly documented and hard to get into; it was the most popular reaction to our 2024 announcement, but it echoed sentiments we'd seen before. We're aware of the problem, and we intend to work on it.

+

In the medium term, I also plan to work on the performance aspect of Xilem. People from Google Fonts have expressed interest in seeing how much performance we can get from Rust UI. While my mission isn't limited to performance work, it will be an ongoing focus, especially since it's an area where the Rust language brings unique opportunities. I'll go into more details on Rust performance and power efficiency in a later article.

+

Major changes I want to implement soon

+

These are the big changes I want to work on soon. Realistically, "soon" is going to be relative, because some of these changes are going to be controversial, and part of the work is going to be convincing people of their value.

+

Switching to Masonry as a backend

+

Okay, this one makes me blush a little.

+

I'm the only maintainer of Masonry, a GUI crate with barely over 300 stars on Github and little outside interest. Can I really justify taking the money Google pays me to improve Xilem and spending my time on Masonry instead?

+

That choice isn't random, mind you: Masonry was forked from Druid, Xilem's ancestor, and in fact Xilem and Masonry share a lot of code right now.

+

In fact, I'd argue that Masonry's codebase is of better quality than Xilem's current native backend. This isn't meant to be a put-down of the work of Xilem maintainers; rather, it's the outcome of a difference in priorities. Nobody was very interested in Xilem's native backend (though Raph was aware of its importance, hence me getting paid to write this), and lots of people were very interested in the frontend and the web backends, therefore the frontend and web backends saw the most work.

+

From our RFC#0001:

+
+

As a result, Xilem's native backend is in a poor state:

+ +
+

Masonry's backend codebase is a healthier starting point. Masonry also comes with some built-in perks, like powerful unit tests and a structured widget graph.

+

It's not clear whether we want to import the Masonry codebase, the crate, or the entire repository, and it's not clear what the ultimate branding should be. The RFC lays out the different possibilities, and discussion is still ongoing, so the community can reach a consensus before doing more work (including possibly not using Masonry at all).

+

If we do move forward with this, then Masonry will need some porting work:

+ +

AccessKit support in particular is table stakes, by now. The Rust ecosystem is converging on the idea that accessibility (or at least, screen reader support) should be integrated early on in the design of GUI frameworks, not tacked on at the end.

+

There are other things Xilem added over Druid (notably virtual lists and async support), but I believe Masonry doesn't need to implement them right away for parity. Both will be very important for eventual performance work.

+

Avoiding custom Widgets

+

I'm told by Raph this is a "molotov cocktail" which, uh, fair.

+

We should write Xilem's backend under the assumption that end users of the library (including the Xilem frontend) will very rarely create their own widgets. Instead, they will usually compose the primitives given to them the same way they compose DOM elements in the browser. There will be escape hatches, from a fixed-size canvas surface where end-users can use arbitrary paint primitives to full-on custom widget code, but we should design the framework under the assumption people will almost never need those hatches.

+

Clearly, this is a radical move. There will be a prototyping phase before we choose whether we commit to it, and RFCs to lay out the details. I'm confident it will pay off.

+

Developers of hobby GUI frameworks tend to provide a severely anemic set of primitives, under the assumption that if anyone wants other features in their widgets, they can implement them themselves. Both Druid and Xilem suffer from this.

+

On the other end of the spectrum, the web has shown that you can implement complex custom UIs given a rigid but rich set of primitives.

+

More importantly, the web is moving towards a powerful paradigm: declarative UI. As time goes on, people are realizing you can get better performance and composition by describing what things should look like and composing them than by imperatively making them do things.

+

Part of this is that native code is more performant than JS, but part of it just that declarative code is easier to work around than imperative code: its bounds are better defined, it lets you commit to limitations that make the engine's job easier, and it's easier to analyze.

+

A set of proposals called CSS Houdini came out that went in the exact opposite direction: pushing the layout engine towards more customization and JavaScript code. The proposal hasn't seen much movement since 2021, and I don't think it's a coincidence that the part that would have given the most power to imperative code, the Layout API, hasn't been stabilized in any browser.

+

The bottom line is that, while implementing custom widgets will always be possible, I want to encourage developers to go as far as they can composing declarative elements instead, and see how far it's possible to go using those building blocks.

+

More opinionated layout

+

One major customization point I want to restrict in Xilem is layout.

+

Today all Rust GUI frameworks ship their own layout algorithm, but none of them are competing on their layout algorithm. Often the layout algorithm is just a means to an end; developers that do want to work on a state-of-the-art layout engine will provide it in a modular crate like Morphorm and Taffy.

+

And here's the thing: realistically, most layout engines aren't that creative. Every Rust framework and every major GUI framework I'm aware of uses layout that boils down to "FlexBox with small variations". The number of meaningfully different ways to do GUI layout can be counted on, generously, two hands.

+

I'd argue we only need CSS Flow, FlexBox, CSS Grid, and maybe Morphorm to cover most people's needs. Conveniently, this is what Taffy aims to provide. There's already an experimental Taffy integration in Xilem, and I want to make it deeper.

+

That being said, there won't be a hard-coded set of layout algorithms. Rather, layout will rely on a web-inspired protocol between widgets (in other words, trait methods), and that protocol will be strongly opinionated to make implementation of these layout algorithms easier.

+

More on this in a latter blog post.

+

No boxing

+

Having a semi-fixed set of widgets means you can avoid using Box<dyn Widget>, which has some interesting performance implications.

+

It means you can add a lot of methods to the Widget trait without worrying about bloating the vtable. And you can write methods under the assumption that they'll be inlined, which opens up interesting DX improvements.

+

Using ECS, maybe, sort of

+

In current Xilem code, if you want your FlexWidget to have children, it must have a Vec<Pod<ChildWidget>> member. Each Pod directly owns a Widget.

+

I think this is an interesting quirk of Rust GUI, tying directly to Rust's ownership semantics. Non-Rust frameworks often use pointers to child widgets, true, but they're often shared with the framework, with an understanding that the framework is charged with keeping track of how many widgets there are and which is a child of which. In Qt, for instance, it's preferred (but not mandatory) for parents to call delete_later() on their children instead of delete, because it plays better with event handling.

+

Xilem's approach of "you own your children" is a little bespoke. It means the framework has a hard time iterating over the entire widget tree (say, as part of a DOM inspector) unless each Widget specifically implements the iterating method. And it means if you want to target an event at a specific widget (say, the one with keyboard focus), you need to go through the entire ownership chain, using some heuristics to avoid visiting too many widgets.

+

I believe Widgets should be owned by the library. If your container has children, then the only thing the container will actually own is keys into a structure (probably a slotmap) where the widget is stored. This makes a lot of things easier, like serialization and debugging, but it has an impact on the entire backend. It's an infrastructure investment.

+

Lately, I've seen more and more discussion of implementing GUI through an ECS. A lot of that discussion comes from Bevy, which is natural, since the bevy community is made up of ruthless cultists striving to feed ever more sacrifices to the ECS god until it consumes the Earth is intimately familiar with the ECS pattern and has reached a phase where UI work is getting a lot of attention2. But I've seen discussions about it in the Linebender community too.

+

Whether we actually want to use ECS is something we still need to research.

+

The way I understand it, the big draw of ECS is the "S" part, the Systems: it's about handling lots of similar data at once in arbitrary order. Which is why eg archetypes in bevy are useful: you're grouping together entities with the same components, so that you can say "execute this code for all entities with component X and component Y" and have this code be executed on arrays of values with minimal indirection or branching. And the "arbitrary order" part makes them work really well with slotmaps: since you can just read from the beginning of the slotmap, you don't pay the double-indirection penalty.

+

In other words, the ideal use case for ECS is code of the type for (entity in entities) entity.position += entity.speed.

+

GUI is pretty far from that ideal use-case: updates are sparse and should only run on a small number of changed widgets. Order often matters. And I'm not sure archetypes would work in a framework with a large variety of widgets and different attributes.

+

I think there are two things you really want from a Rust ECS library for GUI: slotmaps, and efficient ways to add and remove components from an entity.

+

Implementing those is going to be a major undertaking, which we'll have to divide into small experiments, but one I expect to pay many times over.

+

Community involvement and more to come

+

I want to really put emphasis on something: none of the above is set in stone.

+

Part of what Raph wants to achieve this year is to make Xilem more of a community project, and that means running more decisions by the community.

+

I've created an RFC repository for this, and each of the sections above will get its own RFC, where I'll expand on my rationale in more detail.

+

This isn't a rubber-stamping process either: I want to implement those ideas, but if the community3 decides that they are bad, then we'll go another direction.

+

There's other ideas I haven't discussed yet that I want to come back to:

+ +

These ideas are likely to be the subject of further articles and/or RFCs in the near future.

+

Relations with other projects

+

Presenting the current state of the Rust GUI ecosystem would probably take its own article.

+

Things are moving quickly, and anything I write now might not be up to date in two weeks. The projects we're most interested in right now are Winit and Bevy, and there's some potential for cooperation with Servo. The COSMIC ecosystem looks pretty cool, but so far it looks like we have less to share with them.

+

People from parallel projects are communicating and exchanging much, much more than they were in 2022. Between Vello, Parley, wgpu, Taffy, COSMIC-Text and others, projects are converging and maintainers are making more effort to reach out and integrate other people's code.

+

Stay tuned for more!

+

Hey, this is really cool!

+

Something that came up in discussions I've had with Raph is that it's easy to miss the forest for the trees. In the middle of all the paperwork, blog-writing, RFC-writing, we can end up focusing on the process so much that we forget how excited we are.

+

So, I'm taking the moment to remind myself: this is really freaking exciting!

+

For all my criticisms and caveats and realistic assessments of the problems we need to overcome, I'm still feeling absolutely great about this!

+

I'm super thankful to Raph for getting us this far, to Google Fonts for sponsoring us, and to everyone else who contributed to the Linebender ecosystem. I think we can do something amazing and I'm honestly a little startled to be in this position at all.

+

To reiterate what I said: in the next few years, I want the entire ecosystem to get to a point where people talk about Rust GUI like they talk about ripgrep or rustls.

+

I legitimately think Rust has the potential to get best-in-class GUI frameworks, and now the time has come to prove it.

+
1 +

By the way, I love this style of writing where we start humanizing a software process and complaining about how much it wants to kill us. The articles I cited are very high-quality too.

+
+
2 +

I'm told the Bevy community found that joke funny, but I was too afraid for my sanity to check on their Discord server.

+
+
3 +

"The community" is a nebulous concept here. For obvious reason, we'll give more weight to the opinions of people who have already put work into the Linebender ecosystem, but the general hope is to get a consensus from everyone involved. And you're welcome to weigh in even if you haven't contributed before.

+
+ + +
+
+ + + diff --git a/contributor-guidelines/index.html b/contributor-guidelines/index.html new file mode 100644 index 0000000..4f4512a --- /dev/null +++ b/contributor-guidelines/index.html @@ -0,0 +1,121 @@ + + + + + + + + Linebender contributor guidelines - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Linebender contributor guidelines

+

About the projects

+

The Linebender organization is an umbrella for a diverse and ambitious set of project, with the goal of creating high performance, accessible, high quality UI in Rust. An explicit goal is to push the boundary and fill in gaps in our understanding of UI infrastructure, as opposed to implementing existing cookbook techniques.

+

Discussions and community

+

We use a Zulip instance as the primary place for discussions. All are welcome, and everyone with a GitHub account can sign up. Additional discussion happens in issues in the individual repos, and we also have tracking issues. We don’t use GitHub discussions, preferring the Zulip.

+

We also hold weekly office hours. This is a chance to give status updates, make decisions, and discuss architectural directions. It is open to all, and there are public notes.

+

We have recently re-started a wiki, and eagerly encourage gardening. While the Zulip does have archives, they are not indexed by search engines (though search is available within Zulip), so the wiki represents the definitive place for the results of discussions and resources.

+

To propose a nontrivial change, it is better to file an issue first rather than sending a PR. Depending on the scope and disruption of the change, it might make sense to bring it up on Zulip. Especially if a clear consensus doesn’t emerge in a reasonable time, discuss it in office hours.

+

While the main focus of the Linebender community infrastructure is to develop Xilem, Vello, and related modules, we also want to help move the entire ecosystem forward. People from other Rust UI efforts are welcome, and discussions about how to join forces and share infrastructure especially so.

+

We use the Rust Code of Conduct and hold people to a much higher standard of conduct than is usual on the Internet. Don’t worry if you’re interacting in good faith, though, the moderators will work with you to try to resolve issues.

+

Code reviews

+

Here are our policies around code review:

+ +

We struggle with getting PRs approved and landed quickly. To try to improve that, here are some suggestions.

+

First, we encourage everybody to review PRs. It’s a good way for newcomers to get up to speed on the project, and contribute in a meaningful way. There are two goals of the code review process: to improve the quality of the code that lands, and for people to learn something; it’s worthwhile if some knowledge flows in either direction or ideally both.

+

If a PR goes unreviewed too long, it’s absolutely a good idea to ping it on Zulip. It’s also fine to ask for reviewers during office hours, especially if there’s a deeper issue to be discussed.

+

Responsibility

+

Linebender is a collection of open source projects, with a research flavor. We make no guarantees of any of them being suitable for production. We welcome contributions from anybody. Participating should be done out of joy and should not feel like a burden.

+

Sometimes PRs stall out, or people have an intent to work on an issue and don’t get to it. In those cases, we encourage others to take them over. We try to discourage “cookie licking” as much as possible.

+

Filing an issue does not come with a guarantee it will be worked on. We really value high quality issue reports, but they can be closed if there’s no clear action to be taken, and we encourage everybody in the project to feel empowered to do so, or otherwise garden such as asking for more details.

+

Over time, we hope that some of the projects will mature so that they are useful in production (this is already the case for pulldown-cmark, which is not officially part of the Linebender org). We very much welcome collaboration toward that goal, and use of the crates in all kinds of contexts including commercial projects. For such commercial use, we encourage a collaborative approach, where the organization dedicates sufficient staff time and energy to take responsibility for issues and feature requests, working collaboratively with the open source organization.

+ + +
+
+ + + diff --git a/cubic_robust_coincident.svg b/cubic_robust_coincident.svg new file mode 100644 index 0000000..0d3320f --- /dev/null +++ b/cubic_robust_coincident.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/cubic_robust_colinear.svg b/cubic_robust_colinear.svg new file mode 100644 index 0000000..d582602 --- /dev/null +++ b/cubic_robust_colinear.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/cubic_robust_hodograph.svg b/cubic_robust_hodograph.svg new file mode 100644 index 0000000..cbcb108 --- /dev/null +++ b/cubic_robust_hodograph.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/cubic_robust_simple.svg b/cubic_robust_simple.svg new file mode 100644 index 0000000..38e45bf --- /dev/null +++ b/cubic_robust_simple.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/curve_families_graph.svg b/curve_families_graph.svg new file mode 100644 index 0000000..e0e539d --- /dev/null +++ b/curve_families_graph.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/elasticlunr.min.js b/elasticlunr.min.js new file mode 100644 index 0000000..79dad65 --- /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.6 + * + * 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.toArray();o + + + + + + + | Homepage for the Linebender organization + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Welcome to the homepage for the Linebender organization.

+

We are a friendly group of people who share an interest in 2D graphics and user interface design, with everything that entails. +Most of our projects are developed in the Rust programming language. +We hang out on the Linebender Zulip and always welcome new people.

+

Linebender projects

+

Below is a list of the main Linebender projects, and a short description of each project's purpose, as of 2024-07-23.

+

Crates (actively developed)

+

These crates are under active development.

+
    +
  • +

    xilem - An experimental Rust architecture for reactive UI.

    +

    Xilem is a UI toolkit with a medium-grained reactive architecture strongly inspired by SwiftUI. +It is currently in a pre-alpha state, with several significant issues, but is improving rapidly.

    +
  • +
  • +

    masonry - A foundational framework for Rust GUI libraries.

    +

    Masonry is an evolution of Druid, designed to be driven by a higher-level UI toolkits. +It is currently used to power Xilem, but is designed to be usable by other libraries as well.

    +
  • +
  • +

    vello - An experimental GPU compute-centric 2D renderer.

    +

    Vello is an experimental 2D graphics rendering engine written in Rust, with a focus on GPU compute. +It can draw large 2D scenes with interactive or near-interactive performance, using wgpu for GPU access.

    +
  • +
  • +

    kurbo - A library for creating, manipulating and interrogating 2D curve shapes.

    +

    At its core, kurbo is a library for constructing paths and splines out of straight lines and Bézier curves up to order 3 (known as cubic Béziers). It turns out that a series of cubic Bézier curves can be used to approximate any smooth curve with a very high degree of accuracy, compared to the number of curves required. They are also relatively easy to work with, and form the basis of the approach to curve rendering used in vello. The key abstraction is kurbo::Shape, which provides the path_elements method. This method returns an iterator over Bézier curves that approximate the type implementing the Shape trait, which vello can then draw.

    +
  • +
  • +

    peniko - A library for non-geometric drawing primitives.

    +

    This crate provides a set of shared types for concepts that are important for drawing/stroking paths, but excluding the path geometry itself (which can be found in kurbo). It includes types for brush styles (including gradient) and color.

    +
  • +
  • +

    parley - A crate for rich text layouts. It is backed by swash.

    +
  • +
  • +

    fontique - A crate for font enumeration and fallback. Used by parley.

    +
  • +
  • +

    velato - A crate that converts Lottie animations to vello scenes for rendering.

    +
  • +
  • +

    vello_svg - A crate that converts SVG documents to vello scenes for rendering.

    +
  • +
  • +

    norad - A crate for reading, writing, and manipulating Unified Font Object files, a common font-design format.

    +
  • +
+

Crates (passively maintained)

+
    +
  • +

    druid - A GUI framework for Rust.

    +

    druid is the original Linebender UI framework, and was the main focus of development until early 2023. There are many good things about druid, but the data model it uses (primarily Lenses) gets complicated in Rust, and doesn't compose as well as it would in a GC'd functional programming language. However, a lot of the things that work will be copied straight over to xilem, and today druid is a solid choice for a new UI app projected to have low to medium complexity. The #druid-help channel on Zulip is still monitored and you will likely get good answers to any questions you have.

    +
  • +
  • +

    piet - An abstraction layer over platform 2D rendering facilities.

    +

    The purpose of the piet library is to provide abstraction over the libraries used for 2D rendering on any particular platform (Direct2D on Windows, Core Graphics on Mac, and cairo/pango on Linux). The goal is for piet to be superseded by the vello crate, which will provide state-of-the-art 2D rendering on any platform supported by WebGPU.

    +
  • +
  • +

    druid-shell - The windowing library for druid.

    +

    It lives in the druid repository. When our focus moved over to vello/xilem, there was debate over whether to split this code into its own crate, or move over to winit. We decided to keep using our own windowing library for now, to give us the flexibility to add or change what we need to. Thus glazier was born as a fork of druid-shell.

    +
  • +
  • +

    druid-widget-nursery - A crate with widgets for druid.

    +

    This crate contains lots of druid widgets that may be useful to UI developers. It includes things like widgets for Material Icons, and a tree view (a way to draw data stored in a tree). It followed the very liberal optimistic merging strategy for handling PRs to minimize contributor friction, but the widgets contributed are all robust and high quality.

    +
  • +
  • +

    runebender - An experimental font editor.

    +

    This was the motivating application for druid development. It is not currently seeing active development, but this may be revisited in the future.

    +
  • +
  • +

    skribo - A library for text layout.

    +

    This library aims to perform the conversion from text and font attributes to glyph runs, similar to harfbuzz. It's not recommended to use this library as better alternatives exist, for example parley or cosmic-text.

    +
  • +
+

Non-code repos

+
    +
  • +

    2d.graphics - A work-in-progress book explaining the current state of the art of different aspects of 2D graphics.

    +

    Currently the book mostly contains annotated reference lists, although some sections have written content. Pull requests welcome! The goal is to cover topics like color, shapes/curves, 2D GPU rendering, text, etc.

    +
  • +
  • +

    linebender.github.io - This website. If you see anything that looks incorrect, please submit a PR to the repo.

    +
  • +
+

Archived projects

+
    +
  • +

    glazier - A windowing library.

    +

    Glazier was created due to limitations with winit, however we have since decided to work together with the winit team to resolve those issues. +We now recommend the use of winit over Glazier.

    +
  • +
+ + +
+
+ + + diff --git a/linebender.svg b/linebender.svg new file mode 100644 index 0000000..cf68e13 --- /dev/null +++ b/linebender.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/main.css b/main.css new file mode 100644 index 0000000..112f95a --- /dev/null +++ b/main.css @@ -0,0 +1 @@ +body,h1,h2,h3,h4,h5,h6,p,blockquote,pre,hr,dl,dd,ol,ul,figure{margin:0;padding:0}body{font:400 16px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";color:#111;background-color:#fdfdfd;-webkit-text-size-adjust:100%;-webkit-font-feature-settings:"kern" 1;-moz-font-feature-settings:"kern" 1;-o-font-feature-settings:"kern" 1;font-feature-settings:"kern" 1;font-kerning:normal;display:flex;min-height:100vh;flex-direction:column}h1,h2,h3,h4,h5,h6,p,blockquote,pre,ul,ol,dl,figure,.highlight{margin-bottom:15px}main{display:block}img{max-width:100%;vertical-align:middle}figure>img{display:block}figcaption{font-size:14px}ul,ol{margin-left:30px}li>ul,li>ol{margin-bottom:0}h1,h2,h3,h4,h5,h6{font-weight:400}a{color:#2a7ae2;text-decoration:none}a:visited{color:#1756a9}a:hover{color:#111;text-decoration:underline}.social-media-list a:hover{text-decoration:none}.social-media-list a:hover .username{text-decoration:underline}blockquote{color:#828282;border-left:4px solid #e8e8e8;padding-left:15px;font-size:18px;letter-spacing:-1px;font-style:italic}blockquote>:last-child{margin-bottom:0}.wrapper{max-width:-webkit-calc(800px - (30px * 2));max-width:740px;margin-right:auto;margin-left:auto;padding-right:30px;padding-left:30px}@media screen and (max-width: 800px){.wrapper{max-width:-webkit-calc(800px - (30px));max-width:770px;padding-right:15px;padding-left:15px}}.wrapper:after,.footer-col-wrapper:after{content:"";display:table;clear:both}.svg-icon{width:16px;height:16px;display:inline-block;fill:#828282;padding-right:5px;vertical-align:text-top}.social-media-list li+li{padding-top:5px}table{margin-bottom:30px;width:100%;text-align:left;color:#3f3f3f;border-collapse:collapse;border:1px solid #e8e8e8}table tr:nth-child(even){background-color:#f7f7f7}table th,table td{padding:10px 15px}table th{background-color:#f0f0f0;border:1px solid #dedede;border-bottom-color:#c9c9c9}table td{border:1px solid #e8e8e8}.site-header{border-top:5px solid #424242;border-bottom:1px solid #e8e8e8;min-height:55.95px;position:relative}.site-title{font-size:26px;font-weight:300;line-height:54px;letter-spacing:-1px;margin-bottom:0;float:left}.site-title,.site-title:visited{color:#424242}.site-nav{float:right;line-height:54px}.site-nav .nav-trigger{display:none}.site-nav .menu-icon{display:none}.site-nav .page-link{color:#111;line-height:1.5}.site-nav .page-link:not(:last-child){margin-right:20px}@media screen and (max-width: 600px){.site-nav{position:absolute;top:9px;right:15px;background-color:#fdfdfd;border:1px solid #e8e8e8;border-radius:5px;text-align:right}.site-nav label[for=nav-trigger]{display:block;float:right;width:36px;height:36px;z-index:2;cursor:pointer}.site-nav .menu-icon{display:block;float:right;width:36px;height:26px;line-height:0;padding-top:10px;text-align:center}.site-nav .menu-icon>svg{fill:#424242}.site-nav input~.trigger{clear:both;display:none}.site-nav input:checked~.trigger{display:block;padding-bottom:5px}.site-nav .page-link{display:block;padding:5px 10px;margin-left:20px}.site-nav .page-link:not(:last-child){margin-right:0}}.site-footer{border-top:1px solid #e8e8e8;padding:30px 0}.footer-heading{font-size:18px;margin-bottom:15px}.contact-list,.social-media-list{list-style:none;margin-left:0}.footer-col-wrapper{font-size:15px;color:#828282;margin-left:-15px}.footer-col{float:left;margin-bottom:15px;padding-left:15px}.footer-col-1{width:-webkit-calc(35% - (30px / 2));width:calc(35% - 15px)}.footer-col-2{width:-webkit-calc(20% - (30px / 2));width:calc(20% - 15px)}.footer-col-3{width:-webkit-calc(45% - (30px / 2));width:calc(45% - 15px)}@media screen and (max-width: 800px){.footer-col-1,.footer-col-2{width:-webkit-calc(50% - (30px / 2));width:calc(50% - 15px)}.footer-col-3{width:-webkit-calc(100% - (30px / 2));width:calc(100% - 15px)}}@media screen and (max-width: 600px){.footer-col{float:none;width:-webkit-calc(100% - (30px / 2));width:calc(100% - 15px)}}.page-content{padding:30px 0;flex:1}.page-heading{font-size:32px}.post-list-heading{font-size:28px}.post-list{margin-left:0;list-style:none}.post-list>li{margin-bottom:30px}.post-meta{font-size:14px;color:#828282}.post-link{display:block;font-size:24px}.post-header{margin-bottom:30px}.post-title{font-size:42px;letter-spacing:-1px;line-height:1}@media screen and (max-width: 800px){.post-title{font-size:36px}}.post-content{margin-bottom:30px}.post-content h2{font-size:32px}@media screen and (max-width: 800px){.post-content h2{font-size:28px}}.post-content h3{font-size:26px}@media screen and (max-width: 800px){.post-content h3{font-size:22px}}.post-content h4{font-size:20px}@media screen and (max-width: 800px){.post-content h4{font-size:18px}}.highlight{background:#fff}.highlighter-rouge .highlight{background:#eef}.highlight .c{color:#998;font-style:italic}.highlight .err{color:#a61717;background-color:#e3d2d2}.highlight .k{font-weight:bold}.highlight .o{font-weight:bold}.highlight .cm{color:#998;font-style:italic}.highlight .cp{color:#999;font-weight:bold}.highlight .c1{color:#998;font-style:italic}.highlight .cs{color:#999;font-weight:bold;font-style:italic}.highlight .gd{color:#000;background-color:#fdd}.highlight .gd .x{color:#000;background-color:#faa}.highlight .ge{font-style:italic}.highlight .gr{color:#a00}.highlight .gh{color:#999}.highlight .gi{color:#000;background-color:#dfd}.highlight .gi .x{color:#000;background-color:#afa}.highlight .go{color:#888}.highlight .gp{color:#555}.highlight .gs{font-weight:bold}.highlight .gu{color:#aaa}.highlight .gt{color:#a00}.highlight .kc{font-weight:bold}.highlight .kd{font-weight:bold}.highlight .kp{font-weight:bold}.highlight .kr{font-weight:bold}.highlight .kt{color:#458;font-weight:bold}.highlight .m{color:#099}.highlight .s{color:#d14}.highlight .na{color:teal}.highlight .nb{color:#0086b3}.highlight .nc{color:#458;font-weight:bold}.highlight .no{color:teal}.highlight .ni{color:purple}.highlight .ne{color:#900;font-weight:bold}.highlight .nf{color:#900;font-weight:bold}.highlight .nn{color:#555}.highlight .nt{color:navy}.highlight .nv{color:teal}.highlight .ow{font-weight:bold}.highlight .w{color:#bbb}.highlight .mf{color:#099}.highlight .mh{color:#099}.highlight .mi{color:#099}.highlight .mo{color:#099}.highlight .sb{color:#d14}.highlight .sc{color:#d14}.highlight .sd{color:#d14}.highlight .s2{color:#d14}.highlight .se{color:#d14}.highlight .sh{color:#d14}.highlight .si{color:#d14}.highlight .sx{color:#d14}.highlight .sr{color:#009926}.highlight .s1{color:#d14}.highlight .ss{color:#990073}.highlight .bp{color:#999}.highlight .vc{color:teal}.highlight .vg{color:teal}.highlight .vi{color:teal}.highlight .il{color:#099}.blog-list{list-style:none}.blog-list li{margin-bottom:1em}.list-post-date{color:#666}.list-post-title{font-size:120%} \ No newline at end of file diff --git a/minima-social-icons.svg b/minima-social-icons.svg new file mode 100644 index 0000000..f7c3b81 --- /dev/null +++ b/minima-social-icons.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..dbd50f7 --- /dev/null +++ b/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Disallow: +Allow: / +Sitemap: https://linebender.org/sitemap.xml diff --git a/search_index.en.js b/search_index.en.js new file mode 100644 index 0000000..5d84732 --- /dev/null +++ b/search_index.en.js @@ -0,0 +1 @@ +window.searchIndex = {"fields":["title","body"],"pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5","index":{"body":{"root":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1,".":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":2},"1":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}},"2":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":3},"1":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}},"0":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":1}},"3":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":2}}},"7":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"8":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}},"7":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}},"1":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/text/":{"tf":2.0}},"df":5,"0":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1,"2":{"docs":{},"df":0,"4":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}},"1":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1},"2":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772}},"df":1,"6":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}},"4":{"docs":{},"df":0,"4":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}},"6":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":3,"5":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}},"k":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1},"m":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}},"9":{"docs":{},"df":0,"8":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1},"2":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}},"g":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}},"2":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":5,".":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/about/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":4},"8":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}},"0":{"docs":{},"df":0,"1":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":1},"4":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1},"6":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1},"8":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":2},"9":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"2":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":3},"1":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"2":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":2},"3":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":2},"4":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":17}}},"3":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1},"4":{"docs":{},"df":0,":":{"docs":{},"df":0,"1":{"docs":{},"df":0,"8":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"5":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}},"6":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1},"\\":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}}}}}}},"d":{"docs":{"https://linebender.org/":{"tf":3.1622776601683795},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":6,".":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}}}}}}},"i":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"f":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"{":{"docs":{},"df":0,"x":{"docs":{},"df":0,"'":{"docs":{},"df":0,"(":{"docs":{},"df":0,"s":{"docs":{},"df":0,")":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"^":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}},"3":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":5,"(":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}},".":{"docs":{},"df":0,"1":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}},"0":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"2":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":2.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2,"2":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}},"d":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1},"g":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}},"4":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.0}},"df":2,".":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1},"2":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1},"6":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1},"8":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}},"0":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}},"3":{"docs":{},"df":0,":":{"docs":{},"df":0,"5":{"docs":{},"df":0,"9":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"5":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1},"a":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1,"}":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"2":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/":{"tf":1.4142135623730951}},"df":1}}}}}}}},"5":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1,"1":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}},"6":{"docs":{},"df":0,"4":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1,"0":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}},"k":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}}},"7":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":2,".":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}},"8":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.449489742783178},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":5},"9":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1,"2":{"docs":{},"df":0,"7":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"a":{"docs":{},"df":0,"1":{"docs":{},"df":0,"4":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1},"7":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}},"3":{"docs":{},"df":0,"7":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}},"^":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}},"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4}}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}}}}},"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":6}},"o":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/canonical-lints/":{"tf":2.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":10}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":5}}}},"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":7}}}}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":3}},"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":3.7416573867739413},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":2.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":2.6457513110645907}},"df":12,"k":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":7}}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":2}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":2,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":2.0}},"df":4}}}}}},"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":4}}}},"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3}},"v":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":8}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6}}}}},"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.449489742783178},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":14,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":7,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.8284271247461903},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/canonical-lints/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":9,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":2.8284271247461903},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":11,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":3}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":3}}}}},"e":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772}},"df":3}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":8},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":3}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772}},"df":1}}}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":2.0}},"df":2}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}}}}}}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":1,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772}},"df":1}},"t":{"docs":{},"df":0,"_":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"x":{"docs":{},"df":0,"_":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"_":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}}},"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1},"m":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":5}},"l":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":3.605551275463989}},"df":5}}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":4},"w":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":9}},"u":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2,"g":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":3,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}}}}}},"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":4,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":8}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":6}}},"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":6}}}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":5}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"z":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}}}},"d":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":3}}}},"p":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":2.6457513110645907},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}},"y":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1,"i":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1},"z":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":3}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}}}},"d":{"docs":{},"df":0,"/":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":3.3166247903554},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.4641016151377544},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":2.23606797749979}},"df":14,"_":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}}}}}},"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}}}},"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":5}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":8}}},"s":{"docs":{},"df":0,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}}}},"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}}}},"y":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":6}},"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/about/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":4}},"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}}},"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":7},"p":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":7,"d":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3,"e":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}},"i":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":5,"c":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":3.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":11}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":4}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":3.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.23606797749979}},"df":7}}},"v":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772}},"df":3},"x":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":3}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1},"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":4}}}}}}},"c":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":2.6457513110645907},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":2.23606797749979},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":5,"1":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"7":{"docs":{},"df":0,"8":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":9}}}}}},"v":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":6}}}},"e":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772}},"df":8},"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}},"a":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951}},"df":3},"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1}}},"g":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":1,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}}},"i":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":9}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":3}},"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}},"t":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":7,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/curves/":{"tf":1.0}},"df":3}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2}}}}}},"x":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"+":{"docs":{},"df":0,"b":{"docs":{},"df":0,")":{"docs":{},"df":0,"/":{"docs":{},"df":0,"(":{"docs":{},"df":0,"c":{"docs":{},"df":0,"s":{"docs":{},"df":0,"^":{"docs":{},"df":0,"2":{"docs":{},"df":0,"+":{"docs":{},"df":0,"d":{"docs":{},"df":0,"s":{"docs":{},"df":0,"+":{"docs":{},"df":0,"e":{"docs":{},"df":0,")":{"docs":{},"df":0,"^":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}},"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}},"k":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":4},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":5.196152422706632},"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"u":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}}},"y":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":5}}}},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":2}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951}},"df":2,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1}},"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":4}}}}}}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951}},"df":1}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}}},"o":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":2}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/about/":{"tf":1.7320508075688772},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":12}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":8}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}},"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":4,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}},"y":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":2}},"k":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}},"x":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}},"b":{"docs":{"https://linebender.org/wiki/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":2,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":7,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.3166247903554}},"df":6}},"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.4142135623730951}},"df":1}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}}},"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"k":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772}},"df":1}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3}}}}}}},"r":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772}},"df":1,"e":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":3}}}},"{":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"}":{"docs":{},"df":0,"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1,"\\":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"{":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}}}}}},"s":{"docs":{},"df":0,"}":{"docs":{},"df":0,"'":{"docs":{},"df":0,"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}},"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}},"x":{"docs":{},"df":0,"}":{"docs":{},"df":0,"'":{"docs":{},"df":0,"'":{"docs":{},"df":0,"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}},"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1},"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"|":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"{":{"docs":{},"df":0,"x":{"docs":{},"df":0,"}":{"docs":{},"df":0,"'":{"docs":{},"df":0,"|":{"docs":{},"df":0,"^":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}},"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":7},"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":3,"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}}}},"e":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":14,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":9}}},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":6}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1},"{":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":1}}}}}}}},"u":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":3}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":3},"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":2}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979}},"df":4}}},"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":3}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951}},"df":2}}}}}},"d":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1},"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":4}}}}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":11}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.6457513110645907},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":10}}},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.7320508075688772}},"df":8}}}}},"v":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178}},"df":2}},"y":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":4}}}}},"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}},"g":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":3,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":2},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":1}}}}},"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":2}},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.8284271247461903}},"df":7,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3,"/":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"/":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951}},"df":2}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"z":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"b":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":1},"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":5,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}},"g":{"docs":{"https://linebender.org/blog/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":11}},"u":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1},"r":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":3},"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":3}}}}}},"m":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1},"o":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":4}},"r":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}},"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":9},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":3}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":2,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":3}}}}}},"x":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":6,"&":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"d":{"docs":{},"df":0,"y":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":2.23606797749979}},"df":4},"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":1}},"n":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":10,"u":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}}}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772}},"df":1}},"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":2}}}},"w":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":5}}}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":3}},"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}},"g":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0}},"df":1},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":3.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":3.1622776601683795},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":12,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}},"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":5}}},"l":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/about/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}}},"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":6}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}},"y":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":1}},"é":{"docs":{},"df":0,"z":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.8284271247461903},"https://linebender.org/wiki/curve-families/":{"tf":4.242640687119285}},"df":4,"3":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"2":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"5":{"docs":{},"df":0,".":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"9":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}},"4":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"2":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"5":{"docs":{},"df":0,".":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"9":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}},"8":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"4":{"docs":{},"df":0,"?":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"8":{"docs":{},"df":0,".":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"9":{"docs":{},"df":0,"9":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":3,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":3}},"d":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1},"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"/":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}}}}}}},"l":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1,"u":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":4}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}},"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":6}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":3},"p":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4,"l":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}}}}}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.4142135623730951}},"df":1}},"v":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"p":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":4}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.4142135623730951}},"df":1}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":2}}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1},"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2},"g":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":5,".":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":4.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":13},"h":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1},"t":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}},"t":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951}},"df":1,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":2}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}}},"c":{"docs":{"https://linebender.org/about/":{"tf":1.4142135623730951}},"df":1},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":3}}}}}}},"s":{"docs":{},"df":0,"à":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772}},"df":1}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772}},"df":1},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":4}}}}},"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1},"g":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.23606797749979},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.6457513110645907},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":15},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":2}}}},"p":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.7320508075688772}},"df":3,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}}}},"g":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":4,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1,"'":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0}},"df":1}}}}},"n":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":8}},"o":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":3}},"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":2}}}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951}},"df":2}}}}}}}},"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":4,"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":2.0}},"df":1}}},"m":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772}},"df":3},"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":5,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1},"f":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":2.6457513110645907}},"df":1,"i":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}},"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":7,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.4142135623730951}},"df":1},"y":{"docs":{},"df":0,":":{"docs":{},"df":0,":":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":1}}}}}}}}}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":2.449489742783178},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":6,"r":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":3}},"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772}},"df":2}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}},"y":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}},"o":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}},"d":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/about/":{"tf":2.6457513110645907},"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.872983346207417},"https://linebender.org/contributor-guidelines/":{"tf":2.449489742783178},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":18,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":3,"e":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":1}}}}}}},"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0}},"df":3}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":2.23606797749979}},"df":1}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772}},"df":7}}},"p":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3}}}},"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":4}},"r":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2,"v":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}}}},"m":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":7},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":3}},"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":2.0}},"df":3,"t":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":8}},"u":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.605551275463989},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":10,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"y":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1},"3":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2,"t":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}},"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":2},"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":3}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":3}}},"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":3.4641016151377544},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":4},"x":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":7}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0}},"df":3},"s":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":8,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951}},"df":1}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":3.1622776601683795},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":11}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":3,"u":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":2}}},"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":6}}}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1}},"u":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1,"t":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":1}}}},"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":6}},"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2},"r":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1,"3":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"5":{"docs":{},"df":0,".":{"docs":{},"df":0,".":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":4}}},"q":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":7,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":3}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":3}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":2,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/about/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":11}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2},"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951}},"df":5}},"x":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":5}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":2.449489742783178}},"df":10}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":2}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.23606797749979},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":10,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":6}}}}}},"o":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":3.605551275463989},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772}},"df":2},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":2},"t":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":2},"s":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":4},"t":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":4}},"x":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1},"y":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"_":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"k":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}},"i":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}},"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":5}}}}},"p":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4},"y":{"docs":{},"df":0,"_":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"w":{"docs":{},"df":0,"_":{"docs":{},"df":0,"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"x":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}}}}}},"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":9},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":4,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":5}}}}}}}},"s":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":4}}},"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":3}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1}}}}},"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":4}},"p":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":1}},"s":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":6}}}},"p":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":4}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":2}},"t":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":3.605551275463989},"https://linebender.org/blog/doc-include/":{"tf":3.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":3.605551275463989},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":2.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":15,"'":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":3},"s":{"docs":{},"df":0,".":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":3}}}}}},"w":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":17,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":5}},"v":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":7}}},"t":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178}},"df":3}},"u":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":3.3166247903554},"https://linebender.org/wiki/curve-families/":{"tf":2.449489742783178}},"df":3}}},"d":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1}},"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":2.23606797749979},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":12}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":3,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}},"v":{"docs":{"https://linebender.org/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":3.7416573867739413},"https://linebender.org/wiki/curve-families/":{"tf":7.416198487095663},"https://linebender.org/wiki/curve-offset/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":4.242640687119285},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":8,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":2.449489742783178},"https://linebender.org/wiki/curve-families/":{"tf":2.6457513110645907},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":2.23606797749979}},"df":3}}}},"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"f":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":4.795831523312719}},"df":1},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":5}}}},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}}},"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":1}}},"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":8,"'":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":4}}}}},"r":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":5},"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}},"y":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0}},"df":2}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"u":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}}},"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":5},"s":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":6}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0}},"df":4}}},"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":2}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":2.449489742783178},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772}},"df":6,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":4}}}}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"e":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":3}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"_":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}},"f":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":4}},"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":10}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"y":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":3.3166247903554}},"df":3}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":5},"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":5.196152422706632},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":2.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":12}},"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}},"k":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":2}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":11}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.6457513110645907}},"df":2}},"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"/":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"/":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/":{"tf":2.6457513110645907},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.6457513110645907},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":13}}}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"x":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}}}}},"x":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}},"f":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}}},"d":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"’":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":2}}},"f":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":3,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":11,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}}}}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":2.6457513110645907}},"df":1}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"x":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0}},"df":2}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772}},"df":10,"2":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":2}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":5}},"x":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.23606797749979}},"df":2}}}}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":3}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}}}},"v":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1}}}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":4.358898943540674},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178},"https://linebender.org/contributor-guidelines/":{"tf":3.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":2.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.23606797749979}},"df":18}}}},"k":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1},"y":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":4}}}},"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}}},"v":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1,"e":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1,"r":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":3}}},"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2}}}},"j":{"docs":{},"df":0,"m":{"docs":{},"df":0,"c":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":8,"c":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":4.47213595499958}},"df":1,"s":{"docs":{},"df":0,".":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":3.605551275463989},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":3.3166247903554},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.4641016151377544},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":14}}}}}},"d":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951}},"df":1}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":6}},"’":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}}}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/":{"tf":1.0}},"df":1}}}},"m":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":4,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2}}},"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":4}},"e":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":7},"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"’":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772}},"df":2}}},"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0}},"df":3,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}},"z":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3}}}},"p":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"f":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":5}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":1}}},"w":{"docs":{"https://linebender.org/":{"tf":2.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":7,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"/":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}}}}}}}}},"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":5,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":3},"r":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":4}}}},"o":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":2},"w":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":3.7416573867739413},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.4641016151377544}},"df":5,"#":{"docs":{},"df":0,"2":{"docs":{},"df":0,"4":{"docs":{},"df":0,"1":{"docs":{},"df":0,"4":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}}}}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":2}},"e":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":3},"m":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":5}}},"x":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":4}}}}},"e":{"docs":{},"df":0,".":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":5}},"^":{"docs":{},"df":0,"{":{"docs":{},"df":0,"i":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"f":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"{":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"^":{"docs":{},"df":0,"2":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1,"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}}},"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":9}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":5,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":5},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6}}}}},"c":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.1622776601683795}},"df":1,"h":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":3.7416573867739413},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":13,"'":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}}}}},"d":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":3},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":8,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":6}}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":5}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":4}}}}},"g":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":2.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":3,"u":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2}}},"l":{"docs":{},"df":0,"/":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1},"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":2.8284271247461903}},"df":1,"2":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"1":{"docs":{},"df":0,"~":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"8":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}},"3":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"1":{"docs":{},"df":0,"*":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"5":{"docs":{},"df":0,".":{"docs":{},"df":0,".":{"docs":{},"df":0,"~":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"8":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}},"g":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6,"/":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"/":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}},"m":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":2},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}}}}}}},"m":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":1,"b":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":7},"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3}}},"o":{"docs":{},"df":0,"j":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":6}}},"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"y":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}},"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}}},"n":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":1,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772}},"df":7}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":2.23606797749979},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.4142135623730951}},"df":7}}}}}},"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":12,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":2.23606797749979}},"df":2}}}}},"{":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":1}}}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":2}}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":7,"e":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6}}}},"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":2}}},"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":2}}}}}}},"i":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.8284271247461903},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":8},"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979}},"df":1},"y":{"docs":{},"df":0,".":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":3}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1}}}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2},"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":2.0}},"df":3}},"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1}}}}}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":10}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":5}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":7}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":3.1622776601683795},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":3.1622776601683795}},"df":5}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":6}}},"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":9,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":6,"u":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"y":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":3}}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":3}},"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}},"w":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":3.7416573867739413}},"df":2}},"v":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}},"x":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":3,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":2}}}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":2.6457513110645907},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.23606797749979},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":16}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":5},"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":3}},"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":2}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":2}}}},"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":15}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":3},"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":6}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":10}},"n":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.8284271247461903}},"df":9,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":9}}}}},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":6}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":5,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}}}}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":4,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":4}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4},"s":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":6},"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":3}},"r":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":3}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":5}},"o":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3},"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}}}},"t":{"docs":{"https://linebender.org/about/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":3}}}},"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}}}}}}}}}}},"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6}}},"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":3}}},"k":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":4}}}}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":4.47213595499958},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}}}},"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":5,"a":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1}}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}},"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.605551275463989},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":3}},"v":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":3.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":13}}}},"b":{"docs":{},"df":0,"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}}}}},"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":7}},"l":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979}},"df":2}},"w":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":7,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1},"l":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}},"i":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"y":{"docs":{},"df":0,"f":{"docs":{},"df":0,"x":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":2.8284271247461903}},"df":1}}}}}}}},"f":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":2}}},"l":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":2.449489742783178},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":2.23606797749979}},"df":11,"'":{"docs":{"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":1}},"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":6},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":2}},"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":9},"e":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":3},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0}},"df":2}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"x":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":2}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772}},"df":14}}},"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":2.6457513110645907},"https://linebender.org/wiki/curve-offset/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":3},"v":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}},"x":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":7}},"l":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"g":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":4}}}}},"k":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":2.0}},"df":2}}}},"v":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3}}},"w":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"x":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":2,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"x":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":2}}},"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":5}}},"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}}},"p":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}},"w":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3}},"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}},"x":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":9,"s":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":4}}},"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":1}}},"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":2},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":16,"u":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2}}}}}},"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":2.23606797749979},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-04/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":3.1622776601683795}},"df":14,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}},"i":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":3}}}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"k":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3},"m":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":7,"a":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.7320508075688772}},"df":4}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":2}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":2.23606797749979}},"df":1}}}},"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":12}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0}},"df":6}},"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}},"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":4}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/":{"tf":1.4142135623730951}},"df":1,"{":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1,"\\":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"{":{"docs":{},"df":0,"s":{"docs":{},"df":0,"}":{"docs":{},"df":0,"^":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}},"^":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"^":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1},"3":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}},"\\":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"{":{"docs":{},"df":0,"x":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}},"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"^":{"docs":{},"df":0,"2":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"^":{"docs":{},"df":0,"2":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"x":{"docs":{},"df":0,"'":{"docs":{},"df":0,"(":{"docs":{},"df":0,"s":{"docs":{},"df":0,")":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}}}}},"e":{"docs":{},"df":0,"^":{"docs":{},"df":0,"{":{"docs":{},"df":0,"i":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"(":{"docs":{},"df":0,"s":{"docs":{},"df":0,")":{"docs":{},"df":0,"}":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}}},"x":{"docs":{},"df":0,"'":{"docs":{},"df":0,"(":{"docs":{},"df":0,"s":{"docs":{},"df":0,")":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}},"g":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":1}}}}},"m":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":2,"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.7416573867739413}},"df":9}}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"e":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":2},"y":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0}},"df":2}}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":5}}}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":1}}}}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":5,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":5}}},"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":5}}}}},"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":3,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":8}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":10,"e":{"docs":{},"df":0,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1}}}}}}},"z":{"docs":{},"df":0,"z":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}},"g":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1,"0":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1},"1":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2},"2":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1},"4":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1},"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":5,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}}},"p":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":4},"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772}},"df":1}}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1}}}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":2}}},"c":{"docs":{},"df":0,"'":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.8284271247461903},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":3.605551275463989},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":2.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":11}},"t":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.449489742783178}},"df":4}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":4}}}},"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":9}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"o":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":3,"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":6}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":10,"n":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":6}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}},"z":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":8}}}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3}}}},"u":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":8}}}},"m":{"docs":{},"df":0,"t":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}},"o":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.3166247903554},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":6,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.8284271247461903},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":2.0}},"df":8}},"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"e":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3},"n":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178},"https://linebender.org/contributor-guidelines/":{"tf":2.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":11},"g":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/office-hours/":{"tf":1.4142135623730951}},"df":7,"e":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":3.1622776601683795},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":17,"&":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}}}}}}}}}}},"'":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"#":{"docs":{},"df":0,"3":{"docs":{},"df":0,"0":{"docs":{},"df":0,"1":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"4":{"docs":{},"df":0,"4":{"docs":{},"df":0,"3":{"docs":{},"df":0,"7":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":3}},"p":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4,"?":{"docs":{},"df":0,"&":{"docs":{},"df":0,"n":{"docs":{},"df":0,"b":{"docs":{},"df":0,"s":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/":{"tf":2.0},"https://linebender.org/about/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":9}}}},"y":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":6,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}}},"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":1,"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}}}},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3,"k":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"x":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":4}}}}}},"i":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":3.1622776601683795},"https://linebender.org/blog/tmil-09/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":4.358898943540674}},"df":9,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":3,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3}}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}}}},"y":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"l":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":12}},"g":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0}},"df":2}},"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}},"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":4,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}},"f":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"z":{"docs":{},"df":0,"z":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"z":{"docs":{},"df":0,"z":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"m":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":2}},"’":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":5,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":2}},"’":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}},"z":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951}},"df":1}}},"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":3}}}}},"l":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":9}},"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":13,"'":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"’":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}}},"e":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"g":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":3.605551275463989},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.4641016151377544},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":14,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":5},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.6457513110645907},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.449489742783178}},"df":2}}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":2}}}}}}},"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":1}}}},"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/about/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}}}}}},"l":{"docs":{},"df":0,"s":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":2.23606797749979}},"df":1}}}}}}},"l":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.4142135623730951}},"df":5},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"é":{"docs":{},"df":0,"r":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":2}}}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":7,"f":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":4}}}}}}},"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":4,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"r":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/office-hours/":{"tf":1.7320508075688772}},"df":7}}},"p":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":2}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951}},"df":1,"s":{"docs":{},"df":0,":":{"docs":{},"df":0,"/":{"docs":{},"df":0,"/":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,".":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951}},"df":1}}}}}}}}},"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"s":{"docs":{},"df":0,".":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951}},"df":1,"s":{"docs":{},"df":0,"/":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"/":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"/":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":1}},"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}},"y":{"docs":{},"df":0,"b":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":1}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"z":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":2.23606797749979}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"4":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"5":{"docs":{},"df":0,".":{"docs":{},"df":0,".":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"df":0,"'":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":2},"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":2}},"m":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.7416573867739413},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0}},"df":6},"v":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979}},"df":2}},".":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"/":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"\\":{"docs":{},"df":0,"f":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"{":{"docs":{},"df":0,"x":{"docs":{},"df":0,"'":{"docs":{},"df":0,"(":{"docs":{},"df":0,"s":{"docs":{},"df":0,")":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"^":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}}}}}}}}},"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"^":{"docs":{},"df":0,"{":{"docs":{},"df":0,"i":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"f":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"{":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"^":{"docs":{},"df":0,"2":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}},"x":{"docs":{},"df":0,"'":{"docs":{},"df":0,"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}},"c":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":7,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":5}}},"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951}},"df":1}}}},"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":7,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":5}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":5}}},"e":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1},"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":1}},"l":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":3.1622776601683795},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.3166247903554},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":2.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":2.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.4641016151377544},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":3.7416573867739413},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":20}}}}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.449489742783178},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-offset/":{"tf":1.0}},"df":11,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":4}}},"o":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.8284271247461903},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-03/":{"tf":2.0},"https://linebender.org/blog/tmix-04/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":2.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":20}}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":2.8284271247461903},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":2.8284271247461903},"https://linebender.org/blog/xilem-2024/":{"tf":3.1622776601683795},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":21,"e":{"docs":{},"df":0,"_":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951}},"df":1,"!":{"docs":{},"df":0,"(":{"docs":{},"df":0,"\"":{"docs":{},"df":0,".":{"docs":{},"df":0,".":{"docs":{},"df":0,"/":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,".":{"docs":{},"df":0,"m":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}}}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":4,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}}}},"d":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"d":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}}}}},"x":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":2}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":2},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":5}}}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":3.0}},"df":2}}},"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1,"r":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":12}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.8284271247461903},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772}},"df":6}}}}}}}}}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":3}}},"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":5}}},"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":11}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":4},"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":10}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":8}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178}},"df":3}}}}},"t":{"docs":{},"df":0,"_":{"docs":{},"df":0,"0":{"docs":{},"df":0,"^":{"docs":{},"df":0,"t":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"r":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"(":{"docs":{},"df":0,"s":{"docs":{},"df":0,")":{"docs":{},"df":0,"d":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}}}}}},"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":15}},"l":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":5},"t":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":6}}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":11}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":7}}},"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":2.23606797749979}},"df":1},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":2,"t":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2,"i":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":6}}}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":2}},"o":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1},"l":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0}},"df":6}}}}},"o":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":3},"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":4}},"’":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.449489742783178},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.7416573867739413},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":3.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":13}}},"t":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.872983346207417},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":11},"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":2.8284271247461903},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.23606797749979},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":9},"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":5}}}},"’":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.8284271247461903},"https://linebender.org/contributor-guidelines/":{"tf":2.23606797749979}},"df":3}},"’":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772}},"df":1},"v":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":1}}},"j":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":4}},"v":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}}}}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"k":{"docs":{},"df":0,"y":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/about/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":3},"h":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3}},"k":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0}},"df":1},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}},"y":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}},"s":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":5}},"n":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951}},"df":1}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}},"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"(":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772}},"df":2}}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":3}}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":6}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"y":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1}}}},"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"y":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.23606797749979}},"df":7,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}}}}}}},"h":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":4}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"w":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3}}}},"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":7}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":2,":":{"docs":{},"df":0,":":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}}}}}},"z":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}}}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":2}}}},"l":{"docs":{},"df":0,"'":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}}}}}},"a":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951}},"df":3}},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-03/":{"tf":2.0},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":8},"e":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1},"g":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1,"/":{"docs":{},"df":0,"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"#":{"docs":{},"df":0,"8":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,"7":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}}}}}}}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":12}}}}},"p":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.0}},"df":10,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":1}}}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":6}},"t":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":5},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":1}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":1}},"d":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":3.1622776601683795}},"df":9}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.872983346207417},"https://linebender.org/wiki/text/":{"tf":2.449489742783178}},"df":13}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2},"r":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3}},"v":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1}},"d":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1},"f":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1,"g":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":2.23606797749979}},"df":3}}},"s":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":2.0}},"df":1}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":8,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":6,"'":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":1,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":2.23606797749979},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.0}},"df":11}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}}}}},"f":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951}},"df":2},"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"b":{"docs":{},"df":0,".":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":2.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":2}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":3.605551275463989},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":10}}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/about/":{"tf":3.0},"https://linebender.org/blog/doc-include/":{"tf":2.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.8284271247461903},"https://linebender.org/wiki/formatting-scheme/":{"tf":2.0}},"df":5}}},"h":{"docs":{},"df":0,"t":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}},"k":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}},"f":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":1}}}},"h":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":2}}}}}}}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":2.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.23606797749979}},"df":8}}},"n":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.7320508075688772}},"df":12,"0":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}},"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}},"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":2.23606797749979},"https://linebender.org/about/":{"tf":1.7320508075688772},"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.449489742783178},"https://linebender.org/blog/tmil-09/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":3.3166247903554},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/contributor-guidelines/":{"tf":2.23606797749979},"https://linebender.org/wiki/canonical-lints/":{"tf":1.7320508075688772},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.4142135623730951},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":20,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"&":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}}}}}}},".":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,".":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0}},"df":2}}}}}}}}}},"/":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}}}},"x":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}}}}}}}}}},"k":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":5.0990195135927845},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":8},"t":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":2.6457513110645907}},"df":1},"u":{"docs":{},"df":0,"x":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":2}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":2.23606797749979}},"df":6,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-offset/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}}}},"t":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979}},"df":4}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":5,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}}}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":3}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":2.0}},"df":5},"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}}},"d":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1},"g":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772}},"df":3,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0}},"df":3}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"o":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":8,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}}}}}}},"o":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":10},"p":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.23606797749979}},"df":2,"/":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}}}},"s":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.7416573867739413},"https://linebender.org/wiki/canonical-lints/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":11,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":2}}},"u":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"w":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":5,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":5,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.4142135623730951}},"df":1}}}}}}},"s":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":2.0}},"df":1}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1},"k":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772}},"df":1}}}}},"m":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1,"1":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":2},"3":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1},"a":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2,"o":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":8}},"g":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":11,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979}},"df":5}}},"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":2}}}}},"j":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-02/":{"tf":2.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979}},"df":7}}},"k":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.3166247903554},"https://linebender.org/contributor-guidelines/":{"tf":2.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":19,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}},"’":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":5}},"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.8284271247461903},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":12,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":2}}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}},"p":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1},"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1},"o":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":2}},"k":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":2.449489742783178},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.4142135623730951}},"df":2}}}},"u":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951}},"df":1}},"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.6457513110645907},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.872983346207417},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":2.0},"https://linebender.org/blog/tmix-05/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":3.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.1622776601683795},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":15},"y":{"docs":{},"df":0,"#":{"docs":{},"df":0,"5":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}}},"'":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":4}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":3}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4}}},"h":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":6,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1}}}},"j":{"docs":{},"df":0,"a":{"docs":{},"df":0,"x":{"docs":{"https://linebender.org/wiki/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":7,"'":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3}}},"x":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":2}}}}},"y":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":2}}},"c":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.8284271247461903},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":5,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2,"f":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}}},"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":2}}}},"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}},"c":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.23606797749979},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}}}},"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":4}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":2}}}}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":5}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"z":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}}}}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":8}}}},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":6}}}}},"r":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":7,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1}}}}}}},"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":4.58257569495584}},"df":1},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}},"i":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}},"t":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.6457513110645907},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}},"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":7}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}}}}}}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"f":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}}}},"d":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}},"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":5}}}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2},"e":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1,"s":{"docs":{},"df":0,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.7320508075688772}},"df":1}}}}}},"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":7,"a":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2,"l":{"docs":{},"df":0,"/":{"docs":{},"df":0,"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}}}}}}}}},"i":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":3}}}},"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://linebender.org/about/":{"tf":1.4142135623730951},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":4,"]":{"docs":{},"df":0,"(":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}}}}},"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":3}}}},"i":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.449489742783178}},"df":2}}},"x":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":4}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":2}}},"d":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":3,"l":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":4},"r":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":5}},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":2}}},"u":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"u":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":2}}}}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"y":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}},"y":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-06/":{"tf":2.0},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":12,"'":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.6457513110645907},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":3.3166247903554},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":4.242640687119285},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":2.8284271247461903},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":17},"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":8}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":5}},"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}},"e":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772}},"df":11,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}}}}}}},"p":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.6457513110645907},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":10}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}},"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.449489742783178}},"df":2,"p":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":3,"i":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":1}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":1}},"t":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":2}}}},"v":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}},"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"v":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":2.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":4}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":8}},"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4}}}},"d":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.8284271247461903},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":5,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0}},"df":2}}}},"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":4,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}}}}}},"e":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.8284271247461903},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":12}},"g":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":2}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":1},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"w":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-10/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":18,"b":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}}},"x":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":6}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":4},"o":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":6}},"k":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}},"d":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.449489742783178}},"df":2}},"n":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/about/":{"tf":1.4142135623730951},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":12,"e":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":3},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":4}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":5}},"t":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}},"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":14},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/about/":{"tf":1.0}},"df":1}}},"w":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-10/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":17}},"s":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{},"df":0,"/":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}}}}}}}}},"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":2.6457513110645907},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":13}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":2.449489742783178}},"df":1}}},"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}}}},"v":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.23606797749979},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}}}},"o":{"docs":{},"df":0,"'":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":4}}}}}}},"(":{"docs":{},"df":0,"n":{"docs":{},"df":0,"^":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}},"4":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1},"6":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}},"b":{"docs":{},"df":0,"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":4}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":4}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":1}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":2}}}}},"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772}},"df":1}}}},"f":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/office-hours/":{"tf":1.7320508075688772}},"df":7,"i":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-offset/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":2}}}}},"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.605551275463989},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":8,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":5}}}}}}},"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.6457513110645907},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.6457513110645907},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":13,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}},"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":3},"e":{"docs":{},"df":0,"o":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":3.0}},"df":1}}}}}},"g":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":3}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":3}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":2.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":13,"t":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}}}},"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":4}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":4}}}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":5}}}},"s":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":4,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":4,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":4}}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4}}}}},"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":8}}},"g":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":2.0}},"df":10}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":5.744562646538029},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":7}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":9,"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}}}}}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1},"t":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.6457513110645907},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":20,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772}},"df":4}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":3}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":2.8284271247461903},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":12,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0}},"df":3}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":2}}},"f":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}}}},"w":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}}}}}}}}}},"w":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}}}}}}}}},"p":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1,"1":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":1},"3":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":1},"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":2},"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}}},"g":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":2.0},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":2.0}},"df":9}},"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":2}}},"n":{"docs":{},"df":0,"/":{"docs":{},"df":0,"f":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}}}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":8,"'":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1},"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772}},"df":2,"2":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"8":{"docs":{},"df":0,"3":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":2}}}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":8}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":4.69041575982343},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772}},"df":5,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":3}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"y":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":13,"#":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2}},"2":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1},"9":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"4":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"5":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}},"2":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"6":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}},"5":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2},"4":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2},"5":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2},"6":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}},"6":{"docs":{},"df":0,"7":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":4}},"7":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":5}},"8":{"docs":{},"df":0,"4":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}},"9":{"docs":{},"df":0,"7":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}},"'":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"s":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}}},"t":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.1622776601683795},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":11,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":10,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":4}}}}}}},"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":3.0}},"df":9,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"v":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":2}}},"t":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":3}},"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}},"h":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":10,"_":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":2.23606797749979},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":8}}}}},"y":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0}},"df":2,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}}}},"c":{"docs":{},"df":0,"3":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"7":{"docs":{},"df":0,"8":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}}},"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"k":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":4.123105625617661},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.605551275463989},"https://linebender.org/contributor-guidelines/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":9,"e":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}}}}},"r":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":4,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.8284271247461903},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.1622776601683795},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":3.0}},"df":15}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}}},"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"o":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}},"k":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"m":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":2}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":1}}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":5}}},"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}}}},"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}}}},"e":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1},"t":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":5,"#":{"docs":{},"df":0,"5":{"docs":{},"df":0,"7":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1},"8":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"8":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.23606797749979}},"df":4}}}}},"v":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":8}},"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":10,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":12,"'":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}}}}}},"y":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":5}}},"u":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1,"g":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":2},"m":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{"https://linebender.org/wiki/":{"tf":1.4142135623730951}},"df":1},"o":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/cubic-robustness/":{"tf":4.123105625617661},"https://linebender.org/wiki/curve-families/":{"tf":3.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":13,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":7}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-offset/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}},"y":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}}}},"o":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1},"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"p":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":4}}}}},"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.8284271247461903},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":10,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.0}},"df":3}},"l":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/about/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":12}}}},"t":{"docs":{"https://linebender.org/blog/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":12,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":8}}}}},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":4}}}},"r":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.1622776601683795},"https://linebender.org/blog/tmix-02/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":2.6457513110645907},"https://linebender.org/wiki/long-term-roadmap/":{"tf":2.0}},"df":6,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":4}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"č":{"docs":{},"df":0,"i":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}}}}}},"e":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":3,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1}}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}}}},"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1},"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":11}},"r":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}},"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3},"u":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":3}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":5,"s":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":2}}}}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":4,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":4}}}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.8284271247461903},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":7}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":3}}}},"t":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.7320508075688772}},"df":1}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":2,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":5.477225575051661},"https://linebender.org/blog/roadmap-may-2024/":{"tf":5.291502622129181},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":5,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":2}}},"y":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":4}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":11}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":10,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}}}},"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":5,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":6}}}},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":10}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":3.7416573867739413},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":3.1622776601683795},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":14}}}}},"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":2.23606797749979},"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":4.0},"https://linebender.org/blog/tmil-09/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-07/":{"tf":2.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":3.605551275463989},"https://linebender.org/blog/xilem-2024/":{"tf":3.3166247903554},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.1622776601683795},"https://linebender.org/contributor-guidelines/":{"tf":2.6457513110645907},"https://linebender.org/wiki/canonical-lints/":{"tf":2.449489742783178},"https://linebender.org/wiki/capitalization-scheme/":{"tf":2.6457513110645907},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":23,"'":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":4}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":2},"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3}}},"n":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772}},"df":6}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}},"s":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":6}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}}},"t":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2},"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":2.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":10}},"o":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"u":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3},"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6}}}}},"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/wiki/":{"tf":1.0}},"df":5,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":5}},"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":3}},"y":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}}},"q":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1}},"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":2.449489742783178},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":3,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1}}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772}},"df":9}}}},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":3}}}}},"u":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":1}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":5}}}},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772}},"df":1}}}},"r":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":3}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1},"u":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1},"x":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":2.449489742783178}},"df":1}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"g":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":3.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2},"k":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.6457513110645907},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":10,"'":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":3.0}},"df":3},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":4}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.6457513110645907},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":2}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":2.0}},"df":1,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}}}},"z":{"docs":{},"df":0,"r":{"docs":{},"df":0,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":1}}}}}}}}},"c":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1},"d":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}},"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":5,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":4},"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"v":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":3.0}},"df":4}}}},"d":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":4,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":5}},"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":3,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3}}},"m":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":3.3166247903554},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,".":{"docs":{},"df":0,"m":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":5,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":1}},"z":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.8284271247461903},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":4}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":8}}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":4}},"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":3}}}},"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":5}}}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}}},"t":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":2},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":2.0}},"df":1}}}}}}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":4,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":12}},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":2}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":3}}}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":2}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"z":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":4,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":6,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":3.3166247903554},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":13}},"v":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":6}},"i":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":5,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":3}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":1}}}}},"m":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":3}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":4,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1},"v":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":6}}},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":3.0},"https://linebender.org/blog/doc-include/":{"tf":2.449489742783178},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":2.8284271247461903},"https://linebender.org/blog/xilem-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/text/":{"tf":1.7320508075688772}},"df":16}}}},"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"o":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0}},"df":6,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":6}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":10}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":3.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}}}}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":10,"_":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}}}},"i":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.449489742783178},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":14}}}},"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,".":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":5}}}}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}},"v":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":7}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":7}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":4}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":1},"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":3}}}},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":6,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":4}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":3}}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":2.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":2.23606797749979},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":7}}},"v":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":3.4641016151377544}},"df":1,"#":{"docs":{},"df":0,"8":{"docs":{},"df":0,"3":{"docs":{},"df":0,"8":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":2}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":4}}}}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951}},"df":3}}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/about/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/about/":{"tf":1.0}},"df":1}}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":2.449489742783178},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":7}},"s":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}}},"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951}},"df":2}}}}},"f":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178}},"df":7,"#":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"#":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1},"5":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1},"6":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":4},"7":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":4}}}}},"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":1}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951}},"df":1}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2}}}},"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979}},"df":6}},"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"k":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772}},"df":1},"p":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":4.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":2.23606797749979}},"df":10}}}}},"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.23606797749979}},"df":9}}}},"l":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772}},"df":3},"l":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3},"t":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":2,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2}}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":3}}}},"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":1}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}},"l":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2}},"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":14,"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":2.449489742783178},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":4.69041575982343},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.8284271247461903},"https://linebender.org/blog/xilem-2024/":{"tf":4.47213595499958},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":4.358898943540674},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.4142135623730951}},"df":18,"'":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4},"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":3.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":2}}},"f":{"docs":{},"df":0,"m":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":1}}},"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1},"n":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.6457513110645907},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":7}},"y":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"z":{"docs":{},"df":0,"z":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}},"x":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}},"s":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":2.0}},"df":4,"^":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1},"6":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1},"\\":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}},"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":1}}},"m":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":10},"p":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"w":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":5},"y":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772}},"df":1}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":2.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6}},"n":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.0}},"df":4}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":7}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":4}}},"m":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":3}}}},"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":4}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":5,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":8,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":2,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772}},"df":6}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":3.0},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":8}}}}},"e":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":19,"k":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":3},"m":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0}},"df":1},"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979}},"df":4}},"g":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":2.8284271247461903},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.23606797749979},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":5}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":5,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"f":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4},"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0}},"df":3},"s":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.7320508075688772}},"df":1}}}}},"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"v":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"o":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4}}},"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":11,"t":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":3}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":9}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":5.916079783099616}},"df":9}},"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2}}},"k":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":2.0},"https://linebender.org/wiki/text/":{"tf":2.0}},"df":6,"s":{"docs":{},"df":0,"/":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":9},"p":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}}},"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2},"v":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}},"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":5,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}}}},"w":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":11,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":3}}}},"i":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1,"d":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":5,"?":{"docs":{},"df":0,"&":{"docs":{},"df":0,"n":{"docs":{},"df":0,"b":{"docs":{},"df":0,"s":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}}}}},"g":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951}},"df":1}}}}}}}}},"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":4,"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":6,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":5}}}}}}}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"d":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{},"df":0,"_":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}}}}}}}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":6}}}},"p":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.6457513110645907},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":8,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}},"r":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":2}},"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1,"c":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"f":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":2}}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":5}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}},"z":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":3.3166247903554},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":6}}},"k":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.23606797749979}},"df":2},"m":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1},"p":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}},"f":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951}},"df":1}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":3}}}}},"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1,"u":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"p":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0}},"df":2}}}},"w":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":7,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3,"a":{"docs":{},"df":0,"y":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":4}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":4}}}}}},"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2}}}},"f":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1,"j":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":1}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":8}},"v":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":4,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":3}},"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":5},"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":3}},"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":5.656854249492381},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"p":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":14}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772}},"df":5}},"n":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":7}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"w":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}},"c":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}}}},"f":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":13,"i":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1,"u":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":3.1622776601683795},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":3.1622776601683795}},"df":5,"2":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"7":{"docs":{},"df":0,"8":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}}}},"o":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1,"4":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"3":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}}}}}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1,"#":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":2.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":4}},"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.23606797749979},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":6}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1}}}},"u":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"q":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"{":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"1":{"docs":{},"df":0,"2":{"docs":{},"df":0,"5":{"docs":{},"df":0,"|":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"{":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"}":{"docs":{},"df":0,"(":{"docs":{},"df":0,"s":{"docs":{},"df":0,")":{"docs":{},"df":0,"|":{"docs":{},"df":0,"}":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"f":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"{":{"docs":{},"df":0,"d":{"docs":{},"df":0,"\\":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"{":{"docs":{},"df":0,"s":{"docs":{},"df":0,"}":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"\\":{"docs":{},"df":0,"f":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"{":{"docs":{},"df":0,"1":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"8":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"}":{"docs":{},"df":0,"{":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}}}}}},"b":{"docs":{},"df":0,"^":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/":{"tf":1.4142135623730951}},"df":1}}}}}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2},"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":2}},"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":3}},"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":6}},"f":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":3.1622776601683795}},"df":3}},"k":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3}},"m":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":4}}}}},"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"t":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.6457513110645907},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":18,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":4}}}},"t":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":13},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"u":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":5.291502622129181},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":4}},"y":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}}}},"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"p":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":6},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":1}}}}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":11}}},"o":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":1}},"n":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"p":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"e":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":6}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951}},"df":1,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}}}}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":2}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":2}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":1}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":1}}}},"p":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":7},"v":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":11}},"n":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2},"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":6}}}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":2,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":8,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1}}}}}}}}},"g":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2}},"f":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":4}}},"y":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/long-term-roadmap/":{"tf":2.0}},"df":8}}}},"u":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2,"c":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":3}}}}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/gpu/":{"tf":1.0}},"df":1}}}}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2},"s":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":2.6457513110645907},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":2.0}},"df":3}}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":3.605551275463989}},"df":2}}}}},"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":4}}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}}},"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}},"h":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":10}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":3}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}},"g":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":6}}}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}}}}},"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1,"s":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":2.449489742783178}},"df":1},"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":2.23606797749979}},"df":1}}}}}},"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":3}}}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":3.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":2.0},"https://linebender.org/blog/tmix-06/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-07/":{"tf":2.0},"https://linebender.org/blog/tmix-08/":{"tf":3.1622776601683795},"https://linebender.org/blog/tmix-10/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":18}}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"y":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}},"v":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":4,"t":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":4}}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":6}}}},"p":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}}}}},"y":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772}},"df":1}}}},"p":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1,"h":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":10,"7":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":1}}}}}}}},"t":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951}},"df":1,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}},"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"k":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0}},"df":2}}},"k":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":10,"n":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":3}}},"l":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":9,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772}},"df":2}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}},"o":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2},"p":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":5}}}},"s":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.0}},"df":4,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"b":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":3.3166247903554},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":6,"'":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":8}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}}}},"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":2}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}}}}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1}}}}},"r":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":8,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}}},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.8284271247461903},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.7416573867739413},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":9}},"x":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":2.23606797749979},"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":3.0},"https://linebender.org/blog/tmil-09/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":2.0},"https://linebender.org/blog/tmix-10/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-2024/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/text/":{"tf":3.0}},"df":14,"/":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}}}}}}}}},"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"x":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":2}}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772}},"df":1}},"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"/":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"/":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"/":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":5}},"t":{"docs":{},"df":0,"’":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772}},"df":1}}},"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":2}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}},"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":3},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"’":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951}},"df":2}}},"s":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":3.0}},"df":1}},"t":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1,"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}},"y":{"docs":{},"df":0,"'":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}},"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1,"g":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.605551275463989},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.7320508075688772}},"df":11},"k":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.6457513110645907},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":4}},"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":3}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":13}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":8,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":3}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.4142135623730951}},"df":8,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}}},"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":7}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":9,"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}}}}},"u":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":7}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"e":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1},"m":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":3.1622776601683795},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.6457513110645907},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":14},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":2.0}},"df":2}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"_":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"_":{"docs":{},"df":0,"m":{"docs":{},"df":0,"v":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}}}}}},"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}},"o":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":4,"m":{"docs":{},"df":0,"v":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":1}}}}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":7}}}},"k":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}},"m":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951}},"df":2,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951}},"df":1},"l":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.6457513110645907},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":5,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}}}},"k":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979}},"df":5}}}}},"p":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":5,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-offset/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":6}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":7}}}},"y":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951}},"df":6},"i":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772}},"df":1},"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":5},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1,"o":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.23606797749979},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":7}},"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":2.23606797749979},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":3}}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":2}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":4}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":11},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":8,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772}},"df":1}}}},"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":2.23606797749979}},"df":1,"i":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}}},"u":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1,"t":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1}}}},"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1},"n":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":4}},"r":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.0}},"df":1},"n":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":3}}},"w":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.0},"https://linebender.org/wiki/curve-families/":{"tf":2.449489742783178},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":15}},"y":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"p":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.7320508075688772}},"df":11,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/text/":{"tf":2.0}},"df":1}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}}},"u":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1},"i":{"docs":{"https://linebender.org/":{"tf":2.449489742783178},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":5.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":12},"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":4}}}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}}}}}}},"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}},"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":3}}}}},"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":3.3166247903554},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":4}}}},"v":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}}},"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":2.6457513110645907},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":11,"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":7}}},"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}},"f":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":2}}}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}}},"q":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":5,"i":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1},"y":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"#":{"docs":{},"df":0,"8":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":1}}}},"k":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2}}}}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":7}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.8284271247461903},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.6457513110645907},"https://linebender.org/contributor-guidelines/":{"tf":2.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":14,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":3.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":12}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951}},"df":1}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":3}}}}}}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1},"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}},"l":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951}},"df":1}},"s":{"docs":{"https://linebender.org/":{"tf":3.3166247903554},"https://linebender.org/blog/doc-include/":{"tf":3.605551275463989},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":3.7416573867739413},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmil-09/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-02/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-06/":{"tf":3.0},"https://linebender.org/blog/tmix-07/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-08/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-10/":{"tf":3.872983346207417},"https://linebender.org/blog/xilem-2024/":{"tf":3.3166247903554},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":3.872983346207417},"https://linebender.org/contributor-guidelines/":{"tf":2.449489742783178},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":2.23606797749979},"https://linebender.org/wiki/curve-families/":{"tf":2.6457513110645907},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":3.4641016151377544},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":23,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}},"g":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951}},"df":3}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.4142135623730951},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772}},"df":13}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":6}}},"v":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772}},"df":1}}},"t":{"docs":{},"df":0,"f":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.4142135623730951}},"df":1},"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/about/":{"tf":1.0}},"df":1}}},"x":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1},"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":3}},"u":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772}},"df":5,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}}},"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":1}}},"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":3,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":5}},"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1},"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951}},"df":1}}}}},"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":8}}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"&":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"&":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"&":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"&":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":8}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951}},"df":2}}},"l":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/":{"tf":2.6457513110645907},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.23606797749979},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":2.0},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":2.0},"https://linebender.org/blog/tmix-10/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.7320508075688772}},"df":19,"#":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":1},"3":{"docs":{},"df":0,"6":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":2}}},"4":{"docs":{},"df":0,"2":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":1}},"3":{"docs":{},"df":0,"9":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"5":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1},"9":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}},"9":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":2}}},"5":{"docs":{},"df":0,"1":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":1}},"2":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1},"6":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}},"3":{"docs":{},"df":0,"7":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}},"4":{"docs":{},"df":0,"4":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}},"7":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":1}},"9":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}}},"6":{"docs":{},"df":0,"0":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":2},"7":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1},"8":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"1":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":2},"5":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":2}},"3":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2}},"4":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2},"3":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1},"7":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}},"5":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"7":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1},"9":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"6":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"4":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1},"5":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"7":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"3":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"4":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"8":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}},"9":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}}}},"'":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":3},"/":{"docs":{},"df":0,"x":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}}}},"_":{"docs":{},"df":0,"s":{"docs":{},"df":0,"v":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}}}}},"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951}},"df":1}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.6457513110645907},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.8284271247461903},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":16},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":9}}},"u":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":3.1622776601683795}},"df":1,"/":{"docs":{},"df":0,"f":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.7320508075688772}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":2}}},"b":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":2}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":5}}},"e":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":13,"/":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"/":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":3}}}}}}}}}}}}}}}},":":{"docs":{},"df":0,":":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}}}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2}}}}}},"m":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}},"z":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}}},"k":{"docs":{},"df":0,"_":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"t":{"docs":{},"df":0,"_":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"_":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2}}}}}}}},"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":3}}}}},"s":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.7320508075688772}},"df":2},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.23606797749979}},"df":1}}}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}},"n":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":1},"t":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.872983346207417},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":5.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.7320508075688772},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":10}},"r":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":3},"p":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":3.1622776601683795}},"df":1}},"s":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772}},"df":1},"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}},"y":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178},"https://linebender.org/contributor-guidelines/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":12,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":2}}}}}},"e":{"docs":{},"df":0,"'":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":3},"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772}},"df":4}},"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":6},"v":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772}},"df":3}},"a":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":3}},"b":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.23606797749979},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.449489742783178},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":12,"g":{"docs":{},"df":0,"p":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":2.8284271247461903}},"df":5}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":3,"e":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/about/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":3}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1,"t":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}}}},"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/":{"tf":1.7320508075688772},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":2.0},"https://linebender.org/wiki/":{"tf":1.0}},"df":7}}},"l":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.7320508075688772},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.7320508075688772},"https://linebender.org/blog/xilem-2024/":{"tf":3.4641016151377544},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.7320508075688772}},"df":12}},"n":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":4}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}},"’":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":4.242640687119285}},"df":2},"v":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}}},"g":{"docs":{},"df":0,"p":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":10,"#":{"docs":{},"df":0,"5":{"docs":{},"df":0,"2":{"docs":{},"df":0,"9":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}}},"5":{"docs":{},"df":0,"0":{"docs":{},"df":0,"8":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":1}}}}}}},"s":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"’":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951}},"df":8}}}},"w":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":2.0}},"df":3,"r":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":2}}}}}}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":2.23606797749979},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.449489742783178},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmil-09/":{"tf":2.8284271247461903},"https://linebender.org/blog/tmix-01/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-10/":{"tf":2.0},"https://linebender.org/blog/xilem-2024/":{"tf":3.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":4.69041575982343},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":14,"&":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"/":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}}}}}}}},"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"'":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}}}}},"k":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":5}},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":6,"s":{"docs":{},"df":0,"/":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"/":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{},"df":0,"x":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}}}}}}}}}}}},"g":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":3.605551275463989},"https://linebender.org/blog/tmix-01/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":2.23606797749979}},"df":10,"#":{"docs":{},"df":0,"2":{"docs":{},"df":0,"9":{"docs":{},"df":0,"9":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":1}}}},"3":{"docs":{},"df":0,"7":{"docs":{},"df":0,"8":{"docs":{},"df":0,"7":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}},"'":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":2}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951}},"df":5}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":2.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.23606797749979},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":9}}}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":5},"k":{"docs":{"https://linebender.org/":{"tf":2.0},"https://linebender.org/about/":{"tf":1.7320508075688772},"https://linebender.org/blog/doc-include/":{"tf":2.23606797749979},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":4.58257569495584},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":2.23606797749979},"https://linebender.org/blog/tmil-09/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-01/":{"tf":2.0},"https://linebender.org/blog/tmix-02/":{"tf":2.0},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-05/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-06/":{"tf":2.0},"https://linebender.org/blog/tmix-07/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-08/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-10/":{"tf":3.7416573867739413},"https://linebender.org/blog/xilem-2024/":{"tf":4.58257569495584},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":4.69041575982343},"https://linebender.org/contributor-guidelines/":{"tf":2.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.4142135623730951},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":24,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":2}}}}}},"f":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":2.449489742783178},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}}}}},"l":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":3}},"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951},"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":2}},"s":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":5,"w":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":2}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/":{"tf":1.0},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":2.449489742783178},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.8284271247461903},"https://linebender.org/contributor-guidelines/":{"tf":1.7320508075688772},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":11,"u":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/about/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/text/":{"tf":1.0}},"df":7}}}}},"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}}}},"w":{"docs":{},"df":0,"d":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}},"x":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.7320508075688772},"https://linebender.org/wiki/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":3,"'":{"docs":{},"df":0,"'":{"docs":{},"df":0,"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1},"×":{"docs":{},"df":0,"x":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}},"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.7320508075688772}},"df":1}},"(":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1},"^":{"docs":{},"df":0,"1":{"docs":{},"df":0,".":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}},"i":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":2,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/":{"tf":2.0},"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":3.605551275463989},"https://linebender.org/blog/roadmap-may-2024/":{"tf":3.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":3.0},"https://linebender.org/blog/tmix-02/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-04/":{"tf":2.449489742783178},"https://linebender.org/blog/tmix-05/":{"tf":2.23606797749979},"https://linebender.org/blog/tmix-06/":{"tf":3.4641016151377544},"https://linebender.org/blog/tmix-07/":{"tf":3.3166247903554},"https://linebender.org/blog/tmix-08/":{"tf":2.8284271247461903},"https://linebender.org/blog/tmix-10/":{"tf":2.6457513110645907},"https://linebender.org/blog/xilem-2024/":{"tf":4.123105625617661},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":5.0990195135927845},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":18,"#":{"docs":{},"df":0,"1":{"docs":{},"df":0,"5":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}},"6":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1},"3":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":1}},"7":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}},"9":{"docs":{},"df":0,"6":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}}},"2":{"docs":{},"df":0,"0":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":1}},"3":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2},"5":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"4":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":1},"4":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":1}},"5":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"7":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":1}}},"3":{"docs":{},"df":0,"0":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2},"9":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":3}},"1":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":4},"2":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"3":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":2}},"2":{"docs":{},"df":0,"9":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":2}},"4":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"6":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"8":{"docs":{},"df":0,"4":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":2},"8":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"9":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}},"9":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"2":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"3":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1},"4":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":2},"6":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":3}}},"4":{"docs":{},"df":0,"0":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":2},"3":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}},"1":{"docs":{},"df":0,"7":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":2},"8":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":2}},"2":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1},"1":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":2},"3":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":2},"8":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":2}},"3":{"docs":{},"df":0,"7":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}},"4":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1},"8":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}},"6":{"docs":{},"df":0,"7":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":2}},"7":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2},"4":{"docs":{"https://linebender.org/blog/tmix-07/":{"tf":1.0}},"df":1}},"8":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"8":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"9":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2},"5":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"7":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}},"5":{"docs":{},"df":0,"0":{"docs":{},"df":0,"3":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1},"7":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"1":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"2":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"3":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.7320508075688772}},"df":1},"5":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}},"2":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"9":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"3":{"docs":{},"df":0,"8":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"9":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"4":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"5":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":2},"7":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"6":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"2":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"3":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1},"5":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}},"7":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951}},"df":1},"1":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.4142135623730951}},"df":1},"5":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}},"8":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1},"7":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}},"9":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}}},"6":{"docs":{},"df":0,"0":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1},"6":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}},"1":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1},"5":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":2}},"3":{"docs":{},"df":0,"2":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"6":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1},"9":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"8":{"docs":{},"df":0,"1":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}},"7":{"docs":{},"df":0,"0":{"docs":{},"df":0,"5":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"1":{"docs":{},"df":0,"8":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}},"2":{"docs":{},"df":0,"0":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}},"'":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.6457513110645907}},"df":3},"/":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0}},"df":1}}}}}}}},"_":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":4}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":1}}}}}}},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":4}}}}}}}},"k":{"docs":{},"df":0,"c":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}},"x":{"docs":{},"df":0,"x":{"docs":{},"df":0,"x":{"docs":{"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":1}}}},"y":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.4142135623730951},"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":3,"a":{"docs":{},"df":0,"k":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.7320508075688772},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":2.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":2.8284271247461903},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.4142135623730951}},"df":7}},"v":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}},"w":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.4142135623730951}},"df":1}}}}},"u":{"docs":{},"df":0,"'":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.4142135623730951}},"df":1}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/tmix-05/":{"tf":1.0}},"df":1}}},"’":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1},"r":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}},"z":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0},"https://linebender.org/wiki/curve-families/":{"tf":1.7320508075688772},"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":4}}},"o":{"docs":{},"df":0,"o":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/":{"tf":1.4142135623730951},"https://linebender.org/about/":{"tf":1.7320508075688772},"https://linebender.org/blog/doc-include/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.4142135623730951},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.4142135623730951},"https://linebender.org/blog/xilem-2024/":{"tf":1.7320508075688772},"https://linebender.org/contributor-guidelines/":{"tf":2.449489742783178},"https://linebender.org/wiki/curve-families/":{"tf":1.4142135623730951},"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0},"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":13}}}}}}},"title":{"root":{"docs":{},"df":0,"2":{"docs":{},"df":0,"0":{"docs":{},"df":0,"2":{"docs":{},"df":0,"4":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":13}}}},"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/tmix-04/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":1}}}}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/":{"tf":1.0}},"df":1}}},"é":{"docs":{},"df":0,"z":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}}}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"v":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0},"https://linebender.org/wiki/curve-offset/":{"tf":1.0},"https://linebender.org/wiki/curves/":{"tf":1.0}},"df":3}}}},"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.4142135623730951}},"df":1}}},"e":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/curve-families/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-02/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-offset/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":1}}}}}},"g":{"docs":{},"df":0,"p":{"docs":{},"df":0,"u":{"docs":{"https://linebender.org/wiki/gpu/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/contributor-guidelines/":{"tf":1.0}},"df":1}}}}}}}},"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"_":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}}}}}},"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1}}}}},"j":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4}},"n":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/blog/tmix-06/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-10/":{"tf":1.0},"https://linebender.org/contributor-guidelines/":{"tf":1.0},"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":8}}}}},"k":{"docs":{"https://linebender.org/blog/doc-include/":{"tf":1.0}},"df":1},"t":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/tmix-03/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0},"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0}},"df":9}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/office-hours/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/curve-offset/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://linebender.org/blog/xilem-2024/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0},"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":3}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{"https://linebender.org/wiki/gpu/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"g":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0}},"df":1}}}}}}}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/roadmap-may-2024-retro/":{"tf":1.0},"https://linebender.org/blog/roadmap-may-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0},"https://linebender.org/wiki/long-term-roadmap/":{"tf":1.0}},"df":4}}}}},"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/cubic-robustness/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"n":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://linebender.org/wiki/capitalization-scheme/":{"tf":1.0},"https://linebender.org/wiki/formatting-scheme/":{"tf":1.0}},"df":2}}}}},"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"b":{"docs":{"https://linebender.org/blog/tmil-09/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{"https://linebender.org/wiki/canonical-lints/":{"tf":1.0}},"df":1}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/wiki/gpu/mesh-shaders/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/gpu/sorting/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"https://linebender.org/blog/tmix-10/":{"tf":1.0}},"df":1}}}}}}}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"t":{"docs":{"https://linebender.org/wiki/text/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://linebender.org/blog/rustnl-2024-unconference/":{"tf":1.0}},"df":1}}}}}}}},"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"k":{"docs":{},"df":0,"i":{"docs":{"https://linebender.org/wiki/":{"tf":1.0}},"df":1}}}},"x":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://linebender.org/blog/tmix-01/":{"tf":1.0},"https://linebender.org/blog/tmix-02/":{"tf":1.0},"https://linebender.org/blog/tmix-03/":{"tf":1.0},"https://linebender.org/blog/tmix-04/":{"tf":1.0},"https://linebender.org/blog/tmix-05/":{"tf":1.0},"https://linebender.org/blog/tmix-06/":{"tf":1.0},"https://linebender.org/blog/tmix-07/":{"tf":1.0},"https://linebender.org/blog/tmix-08/":{"tf":1.0},"https://linebender.org/blog/xilem-2024/":{"tf":1.0},"https://linebender.org/blog/xilem-backend-roadmap/":{"tf":1.0}},"df":10}}}}}}}},"documentStore":{"save":true,"docs":{"https://linebender.org/":{"body":"Welcome to the homepage for the Linebender organization.\nWe are a friendly group of people who share an interest in 2D graphics and user interface design, with everything that entails.\nMost of our projects are developed in the Rust programming language.\nWe hang out on the Linebender Zulip and always welcome new people.\nLinebender projects\nBelow is a list of the main Linebender projects, and a short description of each project's purpose, as of 2024-07-23.\nCrates (actively developed)\nThese crates are under active development.\n\n\nxilem - An experimental Rust architecture for reactive UI.\nXilem is a UI toolkit with a medium-grained reactive architecture strongly inspired by SwiftUI.\nIt is currently in a pre-alpha state, with several significant issues, but is improving rapidly.\n\n\nmasonry - A foundational framework for Rust GUI libraries.\nMasonry is an evolution of Druid, designed to be driven by a higher-level UI toolkits.\nIt is currently used to power Xilem, but is designed to be usable by other libraries as well.\n\n\nvello - An experimental GPU compute-centric 2D renderer.\nVello is an experimental 2D graphics rendering engine written in Rust, with a focus on GPU compute.\nIt can draw large 2D scenes with interactive or near-interactive performance, using wgpu for GPU access.\n\n\nkurbo - A library for creating, manipulating and interrogating 2D curve shapes.\nAt its core, kurbo is a library for constructing paths and splines out of straight lines and Bézier curves up to order 3 (known as cubic Béziers). It turns out that a series of cubic Bézier curves can be used to approximate any smooth curve with a very high degree of accuracy, compared to the number of curves required. They are also relatively easy to work with, and form the basis of the approach to curve rendering used in vello. The key abstraction is kurbo::Shape, which provides the path_elements method. This method returns an iterator over Bézier curves that approximate the type implementing the Shape trait, which vello can then draw.\n\n\npeniko - A library for non-geometric drawing primitives.\nThis crate provides a set of shared types for concepts that are important for drawing/stroking paths, but excluding the path geometry itself (which can be found in kurbo). It includes types for brush styles (including gradient) and color.\n\n\nparley - A crate for rich text layouts. It is backed by swash.\n\n\nfontique - A crate for font enumeration and fallback. Used by parley.\n\n\nvelato - A crate that converts Lottie animations to vello scenes for rendering.\n\n\nvello_svg - A crate that converts SVG documents to vello scenes for rendering.\n\n\nnorad - A crate for reading, writing, and manipulating Unified Font Object files, a common font-design format.\n\n\nCrates (passively maintained)\n\n\ndruid - A GUI framework for Rust.\ndruid is the original Linebender UI framework, and was the main focus of development until early 2023. There are many good things about druid, but the data model it uses (primarily Lenses) gets complicated in Rust, and doesn't compose as well as it would in a GC'd functional programming language. However, a lot of the things that work will be copied straight over to xilem, and today druid is a solid choice for a new UI app projected to have low to medium complexity. The #druid-help channel on Zulip is still monitored and you will likely get good answers to any questions you have.\n\n\npiet - An abstraction layer over platform 2D rendering facilities.\nThe purpose of the piet library is to provide abstraction over the libraries used for 2D rendering on any particular platform (Direct2D on Windows, Core Graphics on Mac, and cairo/pango on Linux). The goal is for piet to be superseded by the vello crate, which will provide state-of-the-art 2D rendering on any platform supported by WebGPU.\n\n\ndruid-shell - The windowing library for druid.\nIt lives in the druid repository. When our focus moved over to vello/xilem, there was debate over whether to split this code into its own crate, or move over to winit. We decided to keep using our own windowing library for now, to give us the flexibility to add or change what we need to. Thus glazier was born as a fork of druid-shell.\n\n\ndruid-widget-nursery - A crate with widgets for druid.\nThis crate contains lots of druid widgets that may be useful to UI developers. It includes things like widgets for Material Icons, and a tree view (a way to draw data stored in a tree). It followed the very liberal optimistic merging strategy for handling PRs to minimize contributor friction, but the widgets contributed are all robust and high quality.\n\n\nrunebender - An experimental font editor.\nThis was the motivating application for druid development. It is not currently seeing active development, but this may be revisited in the future.\n\n\nskribo - A library for text layout.\nThis library aims to perform the conversion from text and font attributes to glyph runs, similar to harfbuzz. It's not recommended to use this library as better alternatives exist, for example parley or cosmic-text.\n\n\nNon-code repos\n\n\n2d.graphics - A work-in-progress book explaining the current state of the art of different aspects of 2D graphics.\nCurrently the book mostly contains annotated reference lists, although some sections have written content. Pull requests welcome! The goal is to cover topics like color, shapes/curves, 2D GPU rendering, text, etc.\n\n\nlinebender.github.io - This website. If you see anything that looks incorrect, please submit a PR to the repo.\n\n\nArchived projects\n\n\nglazier - A windowing library.\nGlazier was created due to limitations with winit, however we have since decided to work together with the winit team to resolve those issues.\nWe now recommend the use of winit over Glazier.\n\n\n","id":"https://linebender.org/","title":"Homepage"},"https://linebender.org/about/":{"body":"This is the website for the Linebender organization on GitHub. The Linebender organization contains a collection of repositories, which provide the tools and utilities to create graphical user interfaces for applications in the Rust programming language.\nIt is also a group of volunteers and enthusiasts who hang out on our Zulip, and who collaborate on designing and coding the different parts of the stack required for UI. We are a friendly bunch, and always welcome newcomers, whether they have any experience with 2D graphics and user interfaces or not.\nAll the work of the Linebender is done in the open, and the full history of all conversations is available on Zulip. In fact, we recommend searching the chat history for any topic that you are interested in, as there have been many discussions in the past with novel and valuable ideas. All code is dual-licensed under the MIT and Apache-2.0 licenses (where possible) and we aim to license non-code material under the CC-BY Creative Commons license. In fact, the non-code portion of this website is licensed under CC-BY, while all code, including any JavaScript written by the authors, is available under the Apache-2.0 license. A copy of the Apache-2.0 license is available in this website's repository. We reuse some code from the 'minima' Jekyll theme under the MIT license. The aim is to make any of the code on this website reusable, so if the licensing is causing friction please contact us on Zulip and we'll work together to solve the problem.\nA separate page describes our contributor guidelines.\nThe organization was started by Raph Levien, and he informally leads and drives the work forward.\n","id":"https://linebender.org/about/","title":"About"},"https://linebender.org/blog/":{"body":"Blog posts\n","id":"https://linebender.org/blog/","title":"Blog"},"https://linebender.org/blog/doc-include/":{"body":"Creating crate level documentation by including your README can lower maintenance burden, as you do not need to manually keep the crate level docs synchronised.\nHowever, when writing this documentation, you will also want to link directly to some mentioned items.\nThese links need to work in all the places that the README is rendered, such as on your package's https://crates.io homepage, in addition to in rustdoc output.\nTo achieve this, you can link to the online documentation for the items:\n\nThis would however mean that users of cargo doc will be redirected to your crate's online docs (as opposed to their local docs) when clicking on that link.\nIt is however possible to make links in included markdown files behave as intra-doc links, by adding a second link reference definition in the documentation comment.\nThis must be placed before the doc = include_str!() line, for example:\n\nThis means that the link has the expected link target on https://crates.io and in rustdoc (including on https://docs.rs).\nThis trick works because when there are duplicate markdown link reference definitions, \"the first one takes precedence\".\nrustdoc sees the intra-doc link before the link to the online docs, and so uses the intra-doc link.\nHowever, when the README is rendered standalone, only the link reference definition for the online docs is present, and so that target is used.\nExample\nFor an example of both of these techniques in action, see the Android Trace crate (android_trace).\nIn particular, the text of interest is: \"the main entry point to the library is AndroidTrace\".\nYou can observe that this link goes to version 0.1.1 on the docs page, but version 0.1.0 elsewhere.\n\nGitHub rendered readme\ncrates.io page\ndocs.rs page\n\nAnd the corresponding source code:\n\nREADME.md\nlib.rs\n\nThe links have since been updated to use latest, but the direct link being to version 0.1.0 shows how this pattern works.\nGetting external documentation links\nrust-analyzer has an \"Open External Docs\" command when you have an item selected.\nThis will open the online documentation for the selected item, generally on https://docs.rs.\nThis works even if the item is yet to be published, in which case it will open the URL where the item would be.\nYou may wish to replace the resolved version number in the URL with latest, e.g. https://docs.rs/foobar/latest/foobar/\nLimitations\n#![doc = include_str!(\"../README.md\")] has two main relevant limitations which you may need to work around.\nThe first of these is in code blocks.\nNormal rustdoc examples can include hidden setup lines, starting with a # character.\nThese will not be rendered by rustdoc.\n\nHowever, other markdown renderers do not support this extension, so the example above will be rendered as something like:\n\nUnfortunately, I am not aware of a workaround for this; my current best suggestion is to avoid using these hidden lines in your README.\nDoctests in included markdown files do also have some diagnostics issues, as reported in rust-lang/rust#81070.\nThe second limitation is with file links, such as a link to your license file of the form [LICENSE-MIT](LICENSE-MIT) (as recommended in C-PERMISSIVE).\nThis is because rustdoc does not support relative file links in Markdown.\nThis can be solved by using the \"opposite\" of this trick - you can use a web link in your lib.rs, and a file link in the README.\nA second trick\nREADMEs contain some content which are not expected to be present in a crate's documentation.\nFor example, a top-level title, which would duplicate the crate foobar header added by rustdoc.\nThis can be resolved by using css in your documentation to hide these items; rustdoc allows embedding CSS in your documentation.\nHowever, this should only be included in your lib.rs, so that the header is shown in other contexts.\n\nAny text in the README which should be excluded from your docs page can then be surrounded by a div with the rustdoc-hidden class, for example:\n\nAs far as I'm aware, this does not have any accessibility considerations, as browsers will not make display: none items available in their accessibility tree.\nTracing Android Trace (see above) also uses this trick to hide the license section from the crate docs.\nThe license information is already present in the crate's info box.\nConclusion\nUsing #![doc = include_str!(\"../README.md\")] can integrate nicely with intra-doc links, if you use some tricks.\nI believe that this pattern reduces the quality gap between bespoke documentation in lib.rs enough that using README includes becomes the right pattern for most crates.\nThis avoids the maintenance burden of needing to ensure that text in the crate level docs and the README do not become out-of-sync.\nI intend to evaluate this technique by applying it across Linebender crates.\nIt may still be better to have bespoke documentation for each location, for projects which can afford the maintenance costs of that solution.\nBut for other projects, this can provide an easy way to improve their crate level documentation.\nThese patterns can also be applied when including non-README markdown documents.\nI suggest linking to this post when using these patterns, to allow future readers of your code to understand the technique being used.\nDiscuss on the Linebender Zulip.\n","id":"https://linebender.org/blog/doc-include/","title":"#![doc = include_str!()] with intra-doc links"},"https://linebender.org/blog/roadmap-may-2024-retro/":{"body":"Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for the Rust programming language.\nAt the start of May, we created a roadmap for the following three months.\nWe recently went through a process of analysing how well our progress was guided by the roadmap; this report summarises those results.\nVello (original)\nRobust dynamic memory (original)\n\nPriority: Highest.\nStatus: Experimental PR (vello#606), but hasn’t landed.\nWork required on the CPU side API, but the GPU operations are well-understood.\nThis PR could not be released in its current form.\n\nReliable snapshot tests (original)\n\nPriority: High.\nStatus: This was implemented in vello#610.\nThis has already been extremely useful in our review process, as it allows changes to be validated in the files changed view.\nWe also implemented an experiment to use Git LFS, which has been working really well to avoid increasing repository size.\n\nSparse strips (original)\n\nPriority: High.\nStatus: We are continuing this work, but there is no code currently available.\nSee #gpu > Sparse strip path rendering for details.\n\nAdd tests (original)\n\nPriority: Medium\nStatus: This item had already been completed at the time the roadmap was written.\nThis was also expanded upon in.\nDuring our retrospective meeting, we did determine some potential future expansions to testing, namely:\n\nRunning individual stages in isolation, to enable property testing (TODO: Make Vello issue).\nTesting for additional platforms, such as DirectX on Windows and Android (TODO: Make Vello issue).\n\n\n\nProgress beyond roadmap\nWe have also landed several important features which were not part of our planned roadmap.\nThese include:\n\nBlending which uses more than four deep layers (vello#657).\nPreliminary support for embedding pre-existing wgpu textures (vello#636).\nThis was driven by user needs.\nFurther work in this direction is tracked in vello#664.\nSupport for Emoji (COLRv1 in vello#615, bitmap in vello#641).\n\nThe stroke expansion paper documents a key part of Vello's pipeline.\nThis was presented at ACM High Performance Graphics (HPG) 2024, placing 3rd Place in the Best Paper Award.\nMasonry (original)\nComplete text input (original)\n\nPriority: Highest\nStatus: Not that much progress.\nThis work is being continued, and indeed there has been significant progress as of the time of writing.\nThis is tracked in parley#52.\n\nBetter tracing for debugging (original)\n\nPriority: High\nStatus: xilem#384 implements most of this, the rest is deferred.\nThere are known issues with the size of the log files created by default in very large apps.\n\nFix glaring documentation problems (original)\n\nPriority: High\nStatus: The issues mentioned in this item were addressed in xilem#329 and xilem#503.\n\nFinish repository port (original)\n\nPriority: High\nStatus: This was completed.\nWe moved all Masonry issues into the Xilem repository, and updated all references in code to use full links.\nThis move was coordinated in #linebender > Moving Masonry into Xilem.\n\nWrite “widgets in arena” RFC (original)\n\nPriority: High\nStatus: The RFC was rfcs#6, which was mostly implemented in xilem#396.\n\nWrite “pass order” RFC (original)\n\nPrioriy: High\nStatus: rfcs#7 is in draft, and several important parts of the RFC have been completed.\n\nRewrite documentation (original)\n\nPriority: Medium\nStatus: This work has been deferred until the \"pass order\" refactor is complete, as we expect Masonry's core to be quite stable at that point.\n\nImprove focus handling (original)\n\nPriority: Medium\nStatus: Not done.\n\nImprove pointer status handling (original)\n\nPriority: Medium\nStatus: Basic translation of touch events was added in (xilem#313).\nThis unblocked using Masonry on devices where pointer input is not expected (primarily on Android).\nWe have split the remainder of this task into two tasks, with a priority placed on completing the parts which unblock other work (such as scrolling on Android).\n\nProgress beyond roadmap\nMasonry is in a state of flux, however is starting to see a few exploratory users.\nTo unblock these users, some additional important features were added outside of the roadmap, such as:\n\nSupport for embedding Masonry inside a pre-existing event loop (xilem#417).\nSupport for a gap property in the flexbox (xilem#437).\nFixes on iOS, including xilem#418 and xilem#421.\nxilem#233 allowed our tests to be run on CI in a consistent manner.\n\nParley (original)\nCreate abstractions for text selection and editing (original) ?\n\nPriority: Highest\nStatus: There have been useful discussions in parley#52.\nWork has started on this in parley#106 in response to this retrospective.\n\nInline block layout (original)\n\nPriority: High\nStatus: A first cut of this feature was added by Nico Burns in (parley#67).\nparley#76 expands upon this, and has been approved in principle, but is awaiting thorough review.\n\nWrite adequate documentation (original)\n\nPriority: High\nStatus: Some work was done towards this in parley#26, which unfortunately could not be merged.\nparley#97 added some documentation to Fontique.\nFurther documentation work from Nico is currently blocked on the tree-like styles PR parley#76 being merged (to avoid conflicts).\n\nSoftware renderer (original)\n\nPriority: Low\nStatus: This was not completed in the form envisioned.\nHowever, Nico contributed two examples, showing how to use Parley with Swash (parley#54) and tiny-skia (parley#55).\nWe have decided not to carry this forward into the next roadmap.\n\nProgress beyond roadmap\nparley#56 added support for Emoji, which is used with the Vello PRs.\nRecently the harfruzz project, a fork of rustybuzz to be integrated fully with fontations, has emerged as an extremely promising direction for text shaping for the Rust ecosystem. We plan to use it as the basis for text layout.\nXilem (original)\nAndroid bringup (original)\n\nPriority: Highest\nStatus: Android is supported in several of our examples, with the primary work required for support completed in xilem#309.\nNo non-boilerplate code changes are required to get a Xilem application running on Android.\nSome compromises were made, in particular cargo gives an un-silencable warning for each example which supports Android and cross-platform backends.\nWe did reach out to the Cargo team about this use case, but did not get a positive response.\n\nUpdate repository layout (original)\n\nPriority: High\nStatus: This was completed in xilem#302.\nKaur applied the same change to Vello in vello#590.\n\nRework xilem_core to be compatible with Masonry backend (original)\n\nPriority: High\nStatus: This was completed in xilem#310.\nPhilipp then applied this to Xilem Web in xilem#403.\n\nWrite documentation (original)\n\nPriority: High\nStatus: This was not completed.\nThe work in xilem#310 did document some of the core, but there is very little user-facing documentation of the Xilem level.\n\nRe-implement async integration (original)\n\nPriority: Medium\nStatus: The core of this task was completed in xilem#423 was the main implementation.\nTwo-way communication with the async tasks is not yet implemented\n\nAdd unit tests (original)\n\nPriority: Low\nStatus: This was not prioritised.\nWe have raised the priority of this item in our next roadmap.\n\nAdd basic benchmarks (original)\n\nPriority: Low\nStatus: There has been no progress on this item.\nThis will be a \"highest\" priority item in the next roadmap.\n\nProgress beyond roadmap\nXilem has also seen some very useful changes not tracked above, including many community contributions.\nSome highlights of these contributions are:\n\nPhilipp Mildenberger contributed heavily to Xilem's core design, such as by restoring the ability to return ViewSequences by returning to a previous workaround for Rust's overly-cautious trait solver (xilem#472).\nHe also extended the Xilem API by restoring OneOf (xilem#394), and implementing various Adapt nodes (xilem#401).\nAdditionally, he picked up the work to expand Flex to use the new Xilem Core in xilem#428.\nJared O'Connell contributed two new examples, a calculator (xilem#467), and a stopwatch (xilem#492).\n\nThere has also been lots of really good progress on Xilem Web, but we do not roadmap Xilem Web and so we do not cover that progress here.\nAccessKit (original)\nMatt Campbell's work on AccessKit has begun, and a proof-of-concept Android adapter is in progress.\n\nAt the time of writing there is not a permanent link to this work, but it can be seen in the android-basics branch.\nAndroid specific work (original)\nSubclassing View/Application/Activity (original)\n\nPriority: Highest\nStatus: This work is in progress, and unfortunately has required more research than expected.\nWe spent some time investigating DEX injection, which Matt has got implemented.\nHowever, it’s now looking like a custom Activity and View is the way forward, which requires close collaboration with upstream tools.\nWe are continuing to prioritise this highly.\n\nHandling IME (original)\n\nPriority: Highest\nStatus: This work is ongoing.\nwinit#3787 allows opening a virtual keyboard, however this does not integrate with full IME (so for example, it is incompatible with autocorrect).\nReal IME requires the Activity to support it directly and therefore involves content view subclassing.\n\nGesture recognition (original)\n\nPriority: Low\nStatus: xilem#313 added emulated mouse press and move from touches.\nThis unblocked use of Xilem on Android, but is not the intended final state.\nThe priority of detecting a scrolling gesture has been increased slightly.\n\nConclusions\nOverall, the roadmap provided a useful guide of what to work on, and we have implemented many of the most important features from it.\nOne clear recurring issue is documentation - even where we have chosen to roadmap this, we have made little progress.\nSimilar concerns are clear for testing in Xilem, although we have laid some important groundwork there.\nWe firmly recognise the role of documentation as an aid to onboarding, which is becoming more important as we work towards alpha releases.\nI believe that we can make good progress in this area before the end of 2024.\n","id":"https://linebender.org/blog/roadmap-may-2024-retro/","title":"Retrospective on the May-July roadmap"},"https://linebender.org/blog/roadmap-may-2024/":{"body":"On May 7 and 8, 2024, folks from the Linebender team went to the RustNL conference for two days, followed by two days of Unconference.\nBy that point, we all felt fairly exhausted, but because Raph is a cruel taskmaster since we wanted to use the opportunity we had, we came together in our hotel's conference room to discuss the Linebender project, and what we wanted from it.\nWe'd initially thought that this day would be an informal day of unstructured chatting about the ecosystem, but it fairly quickly turned into a semi-formal planning exercise, where we tried to figure out a roadmap for the next few months.\nWhat follows is a comprehensive summary of what exactly we're planning to do.\nWe've tried to focus on blockers, where a missing feature in one project is stalling progress on other projects, because those are the hardest barriers to coordination, and we wanted to take advantage of being in the same room together to knock them down.\nThis is a snapshot of the project status at the time we're writing this.\nIt includes some work we already finished since RustNL, but will not be updated when further work finishes.\nVello\nRobust dynamic memory\n\nPriority: Highest.\nAssigned: Daniel McNab.\nDescription: Allocating dynamic memory in a robust way is essential to display large scenes without graphical artifacts. We have several possible solutions, we need to implement one.\nIssue: vello#366\n\nReliable snapshot tests\n\nPriority: High.\nAssigned: Daniel McNab.\nDescription: Snapshot tests are essential to test regressions in graphic software. Masonry's test suite heavily depends on them. But it's flaky right now because even when the fonts and inputs are exactly the same, renderers can have subtle differences that make the snapshots slightly different. We either need to create a fully deterministic renderer or add testing infrastructure that can tolerate small differences. nv-flip might have what we want.\nIssue: vello#608\n\nSparse strips\n\nPriority: High.\nAssigned: Raph Levien.\nDescription: Sparse strips are a new research direction that might significantly improve our rendering pipeline and our memory footprint. We want to write a prototype implementation so we can confirm the performance benefits.\nZulip thread: Sparse strip path rendering\n\nAdd tests\n\nPriority: Medium.\nAssigned: Olivier Faure.\nDescription: Adding tests is often a \"we'll do it later\" item, but it has short-term benefits as well. Adding tests would help Vello contributors check that their modifications don't add regressions to the crate, and help us catch hidden bugs. As a first step, we'd want to at least add some extremely basic tests, such as checking that Vello doesn't crash when we run a sample image through the CPU shaders.\nPR: vello#439\n\nMasonry\nComplete text input\n\nPriority: Highest.\nAssigned: Olivier Faure, Aaron Muir Hamilton.\nDescription: We'd like to bring up Masonry's textbox widget to be best-in-class among Rust frameworks. We want to support native-feeling interactions out of the box, such as cursor movement (go to next word, go to beginning of line), selection (select to end of text) and editing (IME, deleting an entire word, etc). This is something other framework developers have expressed interest in, so we want to implement it in a composable way.\nIssue: xilem#388\n\nBetter tracing for debugging\n\nPriority: High.\nAssigned: Olivier Faure.\nDescription: Masonry currently uses the tracing crate to produce logs usable for debugging. These logs could be improved, so that a user finding a bug can quickly narrow in on information relevant to the bug, without having to restart the app with changed log levels. The bulk of the improvement would be to implement a new subscriber with multiple layers.\nIssue: xilem#250\n\nFix glaring documentation problems\n\nPriority: High.\nAssigned: Olivier Faure.\nDescription: Masonry's documentation hasn't been updated since the port to Winit. While a lot of the code is still in flux, and thus hard to document, we should at least do a quick rewrite pass to remove references to Piet, Glazier, etc.\nPR: xilem#329\n\nFinish repository port\n\nPriority: High.\nAssigned: Daniel McNab.\nDescription: We've ported the masonry-rs repository to the linebender organization, but that repository isn't where the crate's code lives anymore. We should update the README to reflect that information, port the issues to linebender/xilem, and archive linebender/masonry.\nZulip thread: Finishing the Masonry repository transition\n\nWrite \"Widgets in Arena\" RFC\n\nPriority: High.\nAssigned: Olivier Faure.\nDescription: This was something alluded to in the January blog posts. We want to move Masonry from storing widgets in WidgetPod to storing them in a slotmap-like arena. This is a large enough change to write an RFC about it.\nPR: rfcs#6\n\nWrite \"Pass order\" RFC\n\nPriority: High.\nAssigned: Olivier Faure.\nDescription: Right now widgets can use context methods in their different passes to request that other passes be run. What passes can run what other passes isn't clearly documented, especially around edge cases. We should write an RFC to nail down the passes, how they can communicate, and the rationale around them.\nPR: TBD.\n\nRewrite documentation\n\nPriority: Medium.\nAssigned: Olivier Faure.\nDescription: Masonry's documentation hasn't been updated since the port to Winit. Once other major changes are implemented, the documentation should be brought up to date. We should avoid procrastinating on documentation too much just because the architecture is still in progress.\nIssue: xilem#389\n\nImprove focus handling\n\nPriority: Medium.\nAssigned: Olivier Faure.\nDescription: We should improve tab focus in Masonry. Right now tab focus has some bugs, doesn't cover buttons, isn't updated by clicks, and uses architecture inherited from Druid that could be strongly simplified once other architectural changes are completed.\nIssue: xilem#390\n\nImprove pointer status handling\n\nPriority: Medium.\nAssigned: Olivier Faure.\nDescription: We should centralize and improve how Masonry handles pointers. In particular, we should add an explicit \"pointer capture\" API that makes other widgets not get events from that pointer until the pointer is released or lost.\nIssue: xilem#312\n\nParley\nCreate abstractions for text selection and editing\n\nPriority: Highest.\nAssigned: Chad Brokaw, Aaron Muir Hamilton.\nDescription: We want Parley to implement types and methods that Masonry and other editors will be able to use to create a text-editing widget, or to handle selection in non-editable text. The initial implementation may be located in Masonry.\nIssue: parley#52\n\nInline block layout\n\nPriority: High.\nAssigned: Chad Brokaw.\nDescription: Parley should support laying out inline content the way web browsers do, where blocks are spliced into your text and will be laid out according to available inline space the same way words are.\nIssue: parley#25\nPRs: parley#67, parley#76\n\nWrite adequate documentation\n\nPriority: High.\nAssigned: Nico Burns.\nDescription: Parley currently has virtually no documentation. If we want it to become a foundational crate, we need to tell people how to use it.\nPR: parley#26\n\nSoftware renderer\n\nPriority: Low.\nAssigned: Chad Brokaw.\nDescription: Create a software renderer for the glyphs created by Parley, so that users can easily import Parley in their library without depending on a graphics API like Vello. The software renderer should be black-and-white for simplicity. We'll call for volunteers to implement COLRv1 and other advanced features.\nPRs: parley#54, parley#55\n\nXilem\nAndroid bringup\n\nPriority: Highest.\nAssigned: Daniel McNab.\nDescription: We want Xilem to reliably work on Android. Running your Xilem app should require a small number of steps. Ideally, it should be as simple as running cargo some-command in your project.\nPR: xilem#309\n\nUpdate repository layout.\n\nPriority: High.\nAssigned: Olivier Faure.\nDescription: We've agreed on a layout for Linebender repositories. We should move projects in the Xilem repo to match that layout.\nPRs: xilem#302, vello#590\n\nRework xilem_core to be compatible with Masonry backend\n\nPriority: High.\nAssigned: Daniel McNab.\nDescription: The version of Xilem that was ported to Masonry used a different View trait that is incompatible with the current xilem_core crate. We need to rework xilem_core to get traits that can be used by both Masonry and xilem_web. Doing so while keeping readable code is non-trivial.\nPR: xilem#235, xilem#310\n\nWrite Documentation\n\nPriority: High.\nAssigned: Olivier Faure.\nDescription: Xilem's lack of documentation is one of the problems new users complain about the most often. We need to avoid staying in that state for too long.\nIssue: xilem#392\n\nRe-implement async integration\n\nPriority: Medium.\nAssigned: Daniel McNab.\nDescription: One of Xilem's selling points is the ability to handle virtual lists and async sources of data. That ability was temporarily removed for the Masonry port, but we'd like to add it back. We don't want Masonry to be aware of async stuff, but the AppDriver trait should at least provide a method which lets Xilem access Masonry internals on its own.\nIssue: xilem#340\n\nAdd unit tests\n\nPriority: Low.\nAssigned: Olivier Faure.\nDescription: We need to figure out an architecture for doing unit tests in Xilem. Tests can then be added by volunteer contributors. At some point we should hopefully switch to a \"new test for every new feature\" workflow.\nIssue: xilem#393\n\nAdd basic benchmarks\n\nPriority: Low.\nAssigned: Olivier Faure.\nDescription: Right now we're mostly working off vibes to know whether or not any of our work improved performance or introduced regressions.\nWe should write at least one benchmark that would test a basic Xilem use-case, so we get a general idea of how our performance is progressing.\nIssue: xilem#362\n\nAccessKit\nMatt Campbell's contract with Google hasn't started yet.\nWhen it does, the top priority will likely be the Android backend.\nThe plan is to study existing Android accessibility implementations for non-Java toolkits, including Flutter, Chromium, and Gio, to get a better understanding of what's required to implement Android accessibility from scratch.\nBeyond Android support, we've only had cursory discussions of what work Matt will do for the rest of the year.\nPossible themes include scrollable containers, virtualized lists, richer text support (e.g. exposing font and style attributes) across platforms, and better integration into Xilem/Masonry.\nAndroid-specific work\nGetting the Android port right involves a lot of small changes and making things feel non-broken.\nSome notable sub-goals:\nSubclassing View/Application/Activity\n\nPriority: Highest.\nAssigned: Aaron Muir Hamilton, Raph Levien.\nDescription: The Java classes of an Android application are where the rubber meets the road. We're investigating what we want our boilerplate to look like.\n\nHandling IME\n\nPriority: Highest.\nAssigned: Aaron Muir Hamilton, Raph Levien.\nDescription: We need to extend Winit to be compatible with Android IME interfaces. An Android application without support for the virtual keyboard and other input methods is a non-starter. Our design choices here will have some influence on accessibility as well.\n\nGesture recognition\n\nPriority: Low.\nAssigned: Aaron Muir Hamilton.\nDescription: When the user swipes on the screen, we want to send some kind of scrolling event instead of a normal pointer event. Ideally there should be first-class support for that event to handle momentum scrolling, but a dumber solution would just emulate mouse wheel ticks.\n\nConclusion\nWhew! We have our work cut out for us there.\nOverall, I'm feeling very optimistic about the coming months.\nIn the weeks since we first drafted this roadmap, we've already made a lot of progress on our respective tasks (for instance Daniel is now running on what async experts call a \"work-stealing\" algorithm), so it does look like we'll meet our deadlines.\nWhat comes after that is a bit hazier.\nOur three areas of focus are likely to be Android support, accessibility, and developer experience.\nAs we fill out gaps in our feature set, Xilem is moving towards its faraway goal: becoming a stable, mature framework for GUI applications.\nWe're not GUI yet, but we certainly hope to be one day.\nIn the meantime, stay tuned!\n","id":"https://linebender.org/blog/roadmap-may-2024/","title":"May-July roadmap for Linebender"},"https://linebender.org/blog/rustnl-2024-unconference/":{"body":"On May 7 and 8, 2024, folks from the Linebender team went to the RustNL conference in Delft.\nWe listened to some Rust-related talks, Raph gave one on Xilem, Rik Arends did the \"hot-reload my entire editor live\" thing that makes every other Rust GUI developer jealous, it was an all-around great time.\nAfter RustNL, though, another less-documented event called The Unconference.\nIt was from roughly the same organizers and took place in the same city, but the format was fairly different.\nThe Unconference wasn't livestreamed, and I haven't found any public discussion of it, so I thought I'd take the time to describe a bit of what was going on.\nThe format\nThe \"Unconference\" was two days of loosely structured chats between members of various Rust project teams where people talked about ecosystem collaboration, complained to lang team members that their favorite feature wasn't implemented yet, went to pester everyone else about variadic generics, and other good fun.\nAttendees were split into three teams:\n\nThe Rust project.\nGUI and Applications.\nEmbedded development.\n\nDiscussions inside these teams were mostly self-organized, with cross-team discussions mostly taking place during lunch and recess.\nOn the tyranny of structurelessness\nNote: This section is very much my personal opinion and doesn't represent the Linebender project as a whole.\nI'm not sure the self-organized format worked well.\nFrom what I saw, the Embedded team took well to it, and the Rust team was kept productive thanks to Alice Cecile's efforts in marshaling everyone.\nIn the case of the GUI team, people were spread in a very large room, which should have been conducive to small side discussions and people splitting up to talk about the problems that interested them.\nInstead, there was an unspoken accord to progress through agenda items one by one, with a few people dominating the discussions on these items.\nBecause those people we spread around a large room, they had to talk loudly to address each other, which left little room for side-discussions.\nBecause the people talking were naturally the most confident and extroverted, more introverted people ended up taking a passive role in the discussion.\nTo me, this feels like a strategic mistake.\nIt was a setup that encouraged bikeshedding and long back-and-forths and discouraged plurality of opinions.\nIt's no coincidence that the most interesting conversations of the Unconference happened at lunch: lunch was the point of the Unconference where people were most mixed, had the most spontaneous conversations, and were least constrained by having to follow what someone else was saying.\nOur discussions were still productive, I just feel like the format could have been improved.\nThe GUI team\nAs a member of the Linebender project, I was mostly exposed to the GUI team's proceedings.\nThe main topics of interest were:\n\nBuild tooling (especially for Android and other non-desktop platforms).\nText layout and editing.\nWinit adoption.\nAccessibility.\nPotential for further collaboration.\nRequests for new Rust features.\n\nNote that I'm skipping a lot of topics from the agenda and other side discussions.\nThe topics above were the most prominent during those two days.\nThere was also a fair amount of informal chatter around LogLog Games' strongly critical Leaving Rust gamedev after 3 years article.\nI think those discussions mostly reflected the Bevy community's consensus, that the article had some flaws but overall pointed at very clear weaknesses in the Rust GUI / game engine ecosystem.\nBuild tooling\nEveryone agreed that a better solution was needed to ship non-TUI Rust apps.\nThere was discussion about various platforms and build systems, and the difficulty of having to e.g. write Java code for an Android port, and whether anyone wanted to take responsibility for maintaining that glue layer for the rest of the ecosystem.\nNo actionable decisions were made, but the consensus seems to be that although integrated build tools are desirable, external build tooling for complex platforms (primarily Apple and Android) is likely to remain necessary.\nNobody seems to have stepped up to work on multi-target builds in Cargo, and since external build tools are required as it is, most people are okay with building everything several times when they release a multi-target package.\nMost users are comfortable invoking platform-specific tools for bundling, signing, and manifest generation, so there is not much urgency for integrated tooling for these.\nText layout and editing\nThere was some widespread interest in the Linebender ecosystem's text-handling crates.\nFrom what I remember, Rik Arends and others had concerns about whether e.g. Parley and Swash depend on our Vello renderer (they don't).\nSome people also wanted Parley to be decoupled from Swash.\nPeople were especially interested in the idea of having access to a common text-editing widget, or at least infrastructure for creating one.\nThat widget would handle IME, text selection, accessibility actions, etc, in a way that would feel native to different platforms with their own text-editing quirks (mobile, macOS, Linux with vim mode, etc).\nWinit\nBy now all of the Rust ecosystem has firmly converged on winit as the windowing platform-abstraction solution of choice.\n(Well, not all! One small project with indomitable maintainers still holds out against the invaders.)\nThe consensus during this discussion seemed to be that Winit was there to stay.\nTAO users present were generally interested in being able to use upstream Winit in the future, if its API adopts or supersedes the improvements made in TAO.\nMost were happy to see Winit becoming more trait-oriented, and to see the dpi crate spun off from Winit.\nGlazier is still shelved and we're planning to port its features to Winit until it reaches feature parity.\nA discussion that came up was the idea of splitting more \"vocabulary types\" from Winit into standalone crates.\nVocabulary crates, e.g. crates that only define types and very little code, have a very low cost in memory and build times, while allowing projects to interop with e.g. Winit without actually adding a dependency on Winit.\nThis was connected with the discussions about text editing: having a vocabulary crate that would list Winit's events and also Parley's cursor movements would allow for a very low-dependency text editing widget.\nAccessibility\nNote: This section is also my personal opinion and doesn't represent the Linebender project either.\nThe subject of Accessibility came up informally, but I'll claim it was underexplored.\nWhile the subject was on the agenda, by the time we reached it the Unconference had been running long enough that everyone was tired and ready to leave or get to the catering.\nThis is an unfortunate pattern that I think is worth pointing out: if projects don't make a deliberate effort to prioritize discussions of accessibility, the subject will be left out.\nMatt Campbell, the maintainer of AccessKit, could not attend the Unconference.\nI'm concerned that, in his absence, other maintainers might have felt a dilution of responsibility: since the accessibility guy wasn't there, nobody felt empowered to bring up accessibility.\n(This might sound like it contradicts my section about structurelessness above.\nIt doesn't.\nI'm not saying organizers should have pushed harder for accessibility - they did try - I'm saying that we should strive for a culture where framework developers think about accessibility without waiting for someone to tell them to.)\nOne point did come up during the discussion which I'd like to hammer in: the Rust ecosystem should adopt a holistic view of accessibility.\nAccessibility isn't just about screen readers, and making a framework accessible doesn't stop at adding AccessKit as a dependency, though doing so is a great first step.\nRik asked if there was a minimal set of ARIA attributes that people could start using in their UI, as the set of available attributes is gigantic.\nThe AccessKit framework is rich, and it's not obvious at first glance how much is needed versus nice-to-have.\nThe current reference in the Rust ecosystem is the AccessKit implementation in egui.\nRequests for Rust features\nJon Kelley, the creator of Dioxus, had a laundry list of features he wanted from the Rust language.\nThat list was later filed in the Project Goals repository.\nThe requests were well-documented, with motivating examples in existing Dioxus code that would clearly be improved by the features.\nMost of them felt both self-contained and like they would tremendously both beginners and veteran Rust developers; though Jon made the point that the papercuts he wanted to remove were especially punishing for new developers trying to become familiar with Rust.\nOverall people were very enthusiastic about them, and the lang team members in the room seemed pretty optimistic that those features could be added.\nMy favorite proposals were:\n\nCapture trait for auto-cloning reference-counted types in closures.\nAutomatic partial borrows.\nOptional struct attributes.\n\nJon also wanted support for a remote cache of pre-built crates, so that users wouldn't suffer from having to rebuild dozens of crates every time you download your crate's dependencies.\nThe consensus from Rust maintainers was that such a cache would be essentially impossible with Rust's current architecture.\nNiko Matsakis recently released The borrow checker within, which feels like a follow-up to some of these discussions.\nCollaboration in the Rust GUI ecosystem\nOver the last two years I've joked a few times that everybody in the Rust GUI ecosystem wants the ecosystem to standardize on common crates, as long as it's their crates.\nAfter RustNL, I'm pleased to report this joke isn't accurate anymore.\nA vibe that permeated all discussions was people wanting work to be pooled.\nIt felt like people didn't strongly care whose crate we adopted, as long as we all agreed the crate made sense:\nwe're slowly crawling out of the xkcd 927 dilemma.\nThe main ecosystem crates that people are enthusiastic about sharing are:\n\nwinit for creating windows.\nAccessKit for plugging into accessibility APIs.\nwgpu for using modern GPU features.\n\nJon Kelley also said he would be interested in using Masonry as the native backend for Dioxus, though we haven't hashed out details yet.\nCorporate funding\nFor open-source projects, \"Who funds this\" is a difficult question: in any healthy project, there is a large scale of contributions, with individual non-corporate contributors at one end, and companies paying cash to the project's treasury at the other.\nIn-between are self-employed people like me contracted to work on an open-source project, and corporate employees who contribute to the project as part of their 9-to-5 job.\nSome monetary contributions can also come from individual non-corporate donors: Servo has about fifty of them, for instance.\nWith that in mind, some notable sponsors for projects represented at the Unconference were:\n\nGoogle Fonts: Linebender projects.\nFuturewei: Dioxus, Makepad, Robius and Servo.\nEmbark: Bevy, winit and rust-gpu.\nForesight Spatial Labs: Bevy.\nRerun.io: egui.\n\nNot present at RustNL but relevant to the ecosystem are System76 (funding COSMIC-Text and contributing to iced), Kraken (funding iced), and Slint who are self-funding as a startup targeting embedded UIs and couldn't attend due to time constraints.\nOverall the number of different backers feels like a symptom of a healthy ecosystem: while some large corporate sponsors bring much more resources than others (Google and Futurewei especially), the ecosystem isn't in a state where any specific backer pulling out would completely collapse progress.\nConclusion\nBefore anything else, I'd like to express a big thanks to the volunteers who helped organize RustNL.\nMost of the attendees were absolutely exhausted after two days of talks and two more days of Unconference, but these folks had to run the darn thing.\nI think everyone who attended was impressed with them.\nOverall RustNL and the Unconference felt like getting a year of coordination done in a week.\nIt was a thoroughly productive time, and I couldn't be happier I attended.\nEveryone I asked about it shared the same opinion.\nAnd the discussions we had during the event showed there was a great appetite to push the ecosystem towards more cooperation, both between GUI projects and with Rust maintainers!\nI'm feeling more hopeful about the future of Rust GUI than ever.\nNow it's time to get back to work.\n","id":"https://linebender.org/blog/rustnl-2024-unconference/","title":"Report on the RustNL 2024 Unconference"},"https://linebender.org/blog/tmil-09/":{"body":"Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for the Rust programming language.\n\nXilem\nXilem is our flagship GUI project, inspired by SwiftUI.\nIt lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.\n\nHTTP cats example (xilem#571).\nlens, a shorthand for a common component pattern (xilem#587).\nWe added Views for some existing and new widgets:\n\nGrid layout (xilem#570).\nImages (xilem#571).\n\n\n\n\n\n\n\nThe HTTP cats example.\n\n\nMasonry\nMasonry is the widget system used by Xilem.\nIt provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.\nOur ongoing pass specification project has been largely implemented.\nThat work is now in a wrapping-up stage, which has allowed Olivier to work on improving the codebase's quality in general.\nSome highlights of work from September:\n\nxilem#515: Removes unimplemented functionality from our text handling code.\nxilem#570: An implementation of a grid layout, by Jared O'Connell.\nxilem#550: Restores scroll requests, as used by text inputs.\nxilem#565: Allows widgets to implement more efficient pointer position dispatching, by new Linebender member Tom Churchman.\nxilem#580: Adds screen reader support for the textbox widget.\n\n\nSome ongoing work includes:\n\nxilem#615: Detailed accessibility information for text input and prose widgets.\nxilem#606: Custom client side decorations for Wayland, by Marco Melorio.\nxilem#605: Greater flexibility in the layout of the Image widget, by failingprovince.\nxilem#591: An SVG-like widget for absolute positioning, by Muhammad Ragib Hasin.\n\nVello\nVello is our GPU vector renderer.\nIt can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.\nThe month of september included a lot of progress towards the 0.3.0 release.\n\nWe no longer consider Vello to be experimental (vello#691). Please note that Vello is still an alpha, and has several known issues.\nAn implementation of the single pass scan described last month is being created by Thomas Smith in vello#685.\n\nParley\nParley is a text layout library.\nIt handles text layout, mostly at the level of line breaking and resolving glyph positions.\n\nNico Burns contributed a new way to assign layout properties in parley#76.\n\nOthers\n\nDaniel and Olivier's \"office hours\" appointments can still be booked by anyone for open-ended discussion of the ecosystem.\n\nSee Daniel's schedule here.\nSee Olivier's schedule here.\n\n\n\n","id":"https://linebender.org/blog/tmil-09/","title":"This Month in Linebender, September 2024"},"https://linebender.org/blog/tmix-01/":{"body":"Welcome to the first in the “this month in Xilem” series, bringing updates on the Xilem UI toolkit.\nThere were two blog posts on the new Linebender blog.\nThe first, Xilem 2024 plans, sets out the goals for the project for the year.\nThe second, Roadmap for the Xilem backend in 2024, by Olivier Faure, presents a roadmap for the Xilem native widget set.\nA major feature of the roadmap is a clean boundary between the Xilem reactive framework and the lower level widget set.\nWe hope that enables experimentation with other reactive frameworks and possibly integration with other projects, rather than requiring everybody to buy into the Xilem stack.\nOn the planning front, a major decision was whether to continue work on our own window creation library, Glazier, or whether to join forces with winit.\nAmong other things, since Android is a primary target for our work, and winit already has a working Android back-end, it offers an appealing path to getting that up quickly.\nWe have decided to try joining forces with winit, and look forward to future collaboration.\nOver the next few weeks, that will entail porting Xilem over to winit (xilem#163) and also trying to land working Android IME (soft keyboard) support in winit (winit#2993).\nIn Vello, a major advance was porting the low level font handling code from the experimental swash crate to the production-quality skrifa (vello#423).\nSkrifa is being developed by Google Fonts as a memory safe library for loading font files, and is integrated into Chromium builds.\nOver the coming weeks, a goal is to release Vello (and supporting crates) on crates.io.\n","id":"https://linebender.org/blog/tmix-01/","title":"This Month in Xilem, January 2024"},"https://linebender.org/blog/tmix-02/":{"body":"Early this year, we made a decision to use the winit crate for window creation, as opposed to rolling our own.\nThat work has now landed in main (xilem#176 was the main PR, with a number of followups).\nA major motivation was to enable more platforms, with Android being a major goal.\nThat work is in progress; a major subtask is enumerating the system fonts.\nAs expected, this move has uncovered rough edges in winit and some regressions in behavior.\nWe plan to address those, with the improvements hopefully benefiting the entire Rust UI ecosystem.\nThe Vello crate has been published as version 0.1, with significant documentation improvements and a friendly example.\nWe consider this an alpha-quality release, as there are known issues.\nEven so, we want to get a release out to facilitate integrations and shake out problems.\nAnother major area of work on Vello is investigation of startup time, which can take multiple seconds when the platform's GPU drivers are slow at compiling the compute shaders.\nA number of techniques mitigate that.\nOne is to compile shaders in parallel, using multiple cores, and that has landed (vello#455).\nAn even bigger improvement will be caching compiled shaders.\nDaniel McNab has made an encouraging prototype (vello#459), and the ultimate goal is to land that in wgpu so projects across the ecosystem can benefit from it (wgpu#5292).\nThe work to compute strokes on the GPU using Euler spirals continues, but has not yet landed.\nThe current state is a draft PR that implements the logic in Rust code, which now needs to be translated to WGSL for GPU evaluation (vello#496, draft PR).\nThere has been progress at higher levels of Xilem.\nAmong other things, Nico Burns landed a scroll view implementation (xilem#155), and Philipp Mildenberger has been steadily refining xilem_core and xilem_web, including fine grained tree structure tracking and minimal/efficient DOM-tree-updates (xilem#160).\n","id":"https://linebender.org/blog/tmix-02/","title":"This Month in Xilem, February 2024"},"https://linebender.org/blog/tmix-03/":{"body":"Since the last update, there have been three newly released projects from Linebender:\n\n\nVelato: A parser and driver for Lottie animation files in applications using Vello\n\nVello SVG: Allows displaying (some) SVG documents in Vello applications\n\nAndroid Trace: Resilient bindings to NDK Tracing and an integration with tracing\n\nIf you have a WebGPU capable browser you can check out the web demo of Velato.\nImplementation work for rfcs#1 has started. Masonry is being ported to Vello in masonry#56, with the next step being a move to Winit.\nThis work can be followed in the #masonry stream on Zulip.\nWe have landed some important improvements to Vello.\nEuler spiral based stroke expansion (vello#496) enables GPU stroking by default, significantly improving performance in scenes which make heavy use of strokes.\nAdditionally, we now support scenes with more than 64k draw objects (vello#526).\nWe have also been making progress on vello#366, by evaluating different strategies for memory allocation.\nThe first part of this has landed in vello#537, which avoids undefined behaviour in more out-of-memory cases.\nAdditionally, we have been able to continue taking advantage of improvements in the foundational font crates from Google Fonts.\nThis has enabled support for font fallback in xilem#196.\nHinting has been unblocked by vello#544, although the implementation has not yet landed in Xilem.\nrfcs#5 has been approved, which will improve the robustness of our continuous integration.\nKaur Kuut, the author of the RFC, has also landed these changes in vello#523.\nA focus for the next month is preparing for the RustNL conference at the beginning of May.\nWe are hoping to present a compelling demo there.\n","id":"https://linebender.org/blog/tmix-03/","title":"This Month in Xilem, March 2024"},"https://linebender.org/blog/tmix-04/":{"body":"Again, last month saw a substantial amount of infrastructure work in the development of Xilem.\nThe biggest change is landing Masonry as a crate within the Xilem repo (xilem#203) and adding a new xilem_masonry front-end.\nThe existing xilem widget tree remains in the tree during a transitional period, but the focus of development is now on Masonry.\nMasonry is a principled abstraction layer within the stack.\nWhile it is designed to work well with the Xilem reactive architecture, it is not dependent on it.\nWe'd love to see experimentation with alternative reactive frameworks, and also language bindings.\nA lot more detail about the motivation and design of Masonry is in Olivier's roadmap blog.\nTwo major infrastructural crates have been published.\nParley is our text layout crate, supporting variable fonts and other advanced features.\nSupporting Parley is fontique, a crate for enumerating the system fonts and making them available for itemization (choosing the right font to support a particular script).\nIn GPU rendering land, we have written a paper on GPU stroke expansion (arXiv, repo) and submitted it to a conference.\nThis paper explains quite a bit of the math behind Vello's path rendering, and explains how we adapted it for high performance on the GPU.\nIt's also a good time to note the wgpu 0.20 release, which contains some work to improve on suboptimal zero initialization that will dramatically improve startup time on many platforms, including Android (wgpu#5508).\nIt also has support for subgroups, which will unblock further performance improvements in Vello.\nWe're very much looking forward to participating in RustNL 2024, where Raph will present a talk on Xilem.\nIt looks like it will be a great opportunity to meet with other Rust UI ecosystem projects to find common ground and possibilities to collaborate.\n","id":"https://linebender.org/blog/tmix-04/","title":"This Month in Xilem, April 2024"},"https://linebender.org/blog/tmix-05/":{"body":"Several members of Linebender attended RustNL at the start of May.\nRaph gave a talk titled Xilem: Let's Build High Performance Rust UI (YouTube).\nThe conference also provided a great opportunity to meet with developers from other Rust user interface projects;\nOlivier has produced a report on the unconference, which will be published here shortly.\nIn addition, those in attendance met after the conference and worked on a roadmap for Linebender, which we are also planning to share here.\nWe have taken several important steps on Xilem.\nAt the start of the month, we released Xilem 0.1.0 and Masonry 0.2.0.\nThis is the first published release of Xilem, and includes text input (xilem#241), AccessKit integration (xilem#244) and a TodoMVC inspired example (xilem#257).\nWork through the rest of the month included explorations of a generic View trait (xilem#310), and an Android port (xilem#309, xilem#313).\nrfcs#6 is designed to reduce boilerplate when using Masonry, which should help those creating custom Masonry widgets.\nOther Linebender projects have seen steady improvements.\nvello#575 significantly reduced shader compilation time at startup for projects using Vello, and vello#516 enabled clearer error handling.\nNico Burns has started an exciting project for inline box layout (parley#67), which will enable Parley to be used in projects which must implement Web layout.\n","id":"https://linebender.org/blog/tmix-05/","title":"This Month in Xilem, May 2024"},"https://linebender.org/blog/tmix-06/":{"body":"We released Vello 0.2.0 at the start of the month, which included some key improvements discussed in previous months' updates.\nWe also merged initial handling of Emoji (vello#615), which supports glyphs which use the COLR specification (Apple's system emoji font does not use this format and so currently will not render).\nIn-flight work includes an enhanced testing setup (vello#610), GPU memory allocation robustness (vello#606), and improved correctness for some unusual strokes (vello#607).\nThe GPU-Friendly Stroke Expansion paper has been accepted to High Performance Graphics 2024, and will be presented in Denver on July 26.\nA revised draft of the paper is published on arXiv.\n\n\n\nA toy Emoji viewer example (xilem#420) running on Android.\nThis example uses system fonts, so has limited platform support because of the caveat mentioned above.\n\n\nxilem#310 brought in some new ideas about how Xilem Core can be structured, which enables support for specialised kinds of View, such as for window properties.\nAdapt views built on this were used to create an Elm-inspired example in xilem#401, showing the flexibility of the Xilem architecture.\nPhilipp Mildenberger has been prolific in his work on Xilem, as a co-author of the new Xilem Core, and in adapting Xilem Web to use it.\nHe also worked to bring support for OneOf views to Xilem Core in xilem#394 - these were previously only supported in Xilem Web.\nMasonry's observability support has also been improved, with automatic tracing to a temporary file in debug builds added in xilem#384.\nxilem#396 implements rfcs#6, changing the architecture of Masonry to make it easier to write new features and tests.\nThere was also some excellent community engagement with Xilem in June.\nVeniamin Ilmer has created an open source Minesweeper game using Xilem.\nThe discussion on Zulip (in #xilem > Minesweeper converted from Iced to Xilem) has been very useful in guiding areas for improvement.\n\n\n\nScreenshot by Veniamin Ilmer of their Minesweeper game, used under the Apache 2.0 license.\n\n\nFollowing on from May, Olivier wrote and published a report on our experience of the RustNL unconference.\nThis led to some useful discussion online - see the zulip thread corresponding with that post for links.\nWe are now in the final month of the May-July 2024 roadmap.\nIn the intervening time much of the work has been started or completed, although there have been some changes of priorities.\nI expect that we will soon be looking at prioritising items on our long-term roadmap.\n","id":"https://linebender.org/blog/tmix-06/","title":"This Month in Xilem, June 2024"},"https://linebender.org/blog/tmix-07/":{"body":"Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for the Rust programming language.\nThis month saw a lot of community contributions to Linebender projects.\nPhilipp Mildenberger especially is a major driver for progress on Xilem and especially the xilem_web crate.\nBruce Mitchener has been very active reviewing pull requests, which is an under-appreciated but essential task for any open-source project.\nXilem\nXilem is our flagship GUI project, inspired by SwiftUI.\n\nxilem#423 integrates Tokio into Xilem, showing how the Xilem model can interact with async work.\nxilem#428 by Philipp adds explicit support for Flex parameters.\nPhilipp ported the async work to Xilem Web, and experimented with some extensions:\n\nxilem#440 is an experiment into async event handling.\nxilem#448 added the MemoizedAwait view, which runs a task whenever the input data has a new value.\n\n\nxilem#467 by Jared O'Connell adds a calculator example.\nThis example can also be run on Android (xilem#474).\n\n\n\n\nThe new calc example for Xilem.\n\n\nMasonry\nMasonry is the widget system used by Xilem.\nThe most impactful change was the implementation of the \"Widgets in arenas\" RFC in xilem#396.\nWidgets are now stored in a global arena, which has little impact on the public APIs but make future changes a lot easier to implement.\n\nxilem#417 exposes an unstable API for embedding Masonry and Xilem into an existing Winit application.\nxilem#418, xilem#421 improved our unofficial support for iOS.\nrfcs#7 specifies a clearer architecture for passes, including simplifications necessary for compositor use.\nActually integrating with the compositor is still out of scope for reasons Raph has laid out before, but the new pass specification gives us a starting point when we get there.\n\nVello\nVello is our GPU vector renderer.\n\nThe GPU-friendly Stroke Expansion paper has been released.\nFollow the link for the outline, the full paper, demos, and a talk at the HPG 2024 conference.\nNote that the interactive demo is built with xilem_web.\nVello 0.2.1 has been released.\nThis patch version resolves a longstanding crash around empty scenes.\nvello#643, vello#647 switch to Git LFS for storing snapshot test files.\nGit LFS is an open-source Git extension supported by Github, that lets users commit large files to a repository without permanently bloating it.\nUsing it has trade-offs around bandwidth usage in CI, but otherwise matches our use-case perfectly.\n\n\n\n\nThe demo for the stroke expansion paper, which was created using Xilem Web.\nAn interactive version can be found on the paper's website.\n\n\nParley\nParley is a text layout library.\nNico Burns contributed quite a few improvements to Parley this month:\n\nparley#67 implements inline box layout, which lets us mix textual and non-textual content and have the non-textual content laid out in flow with the text.\nparley#76, parley#84 gets style types closer to CSS engines.\n\nOthers\n\nThe Glazier repository has been archived.\nThis is in continuity with our direction so far, as we've dropped support for it and committed to building our crates on top of Winit.\nWe are at the end of our documented May-July 2024 roadmap.\nWe expect to do a full retrospective on it soon, including the items we shipped and those that slipped.\nDaniel and Olivier are now accepting \"office hours\" style appointments, for open-ended discussion of the ecosystem.\n\nSee Daniel's schedule here.\nSee Olivier's schedule here.\n\n\n\n","id":"https://linebender.org/blog/tmix-07/","title":"This Month in Xilem, July 2024"},"https://linebender.org/blog/tmix-08/":{"body":"Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for the Rust programming language.\n\n\n\nLinebender has a new logo, which was contributed by Markus Siglreithmaier.\nWe're seeking feedback on Zulip in #linebender>logo.\n\n\nXilem\nXilem is our flagship GUI project, inspired by SwiftUI.\n\nWe integrated basic animated variable font rendering (xilem#507).\nPhilipp Mildenberger moved us back to using ViewMarker in xilem#472.\nThis restores the ability to return ViewSequences, by making a tradeoff to work around Rust's faulty trait ambiguity rules.\nWe added Views for some existing and new widgets:\n\nspinners, useful for showing indetermine progress (xilem#497);\nprogress bars (xilem#513); and\nthe Portal widget, which brings support for scroll areas to Xilem (xilem#561).\n\n\n\nXilem Web is a community managed experimental DOM implementation of the Xilem pattern.\nThis month, the updates include:\n\nSupport for returning multiple views from the main logic (xilem#482).\nSupport for DOM templating, for efficient repeated creation of similar views (xilem#495).\n\n\n\n\nJared O'Connell additionally contributed a stopwatch example in xilem#492.\n\n\nMasonry\nMasonry is the widget system used by Xilem.\nThis month has been dominated by Olivier's implementation of pass specification (rfcs#7):\n\nxilem#512: The new compose pass, which is used to minimise redraw when scrolling.\nxilem#510: Adds the mutate pass, which allows later passes to assume the tree structure is stable by limiting when tree mutation can occur.\nxilem#522: Implements paint and accessibility as passes, with follow-up by Tom Churchman in xilem#557.\nxilem#488 and xilem#540: updated event and pointer handling, and disabled handling respectively.\nIn progress work includes layout in xilem#529, focus in xilem#538, animation in xilem#539 and scroll requests in xilem#550.\n\nWe also had some great community contributions, such as:\n\nRichard Dodd added a new progress Bar widget (xilem#513).\nFixes for Portal scrolling, by Tom Churchman (xilem#563).\n\n\n\n\nThe progress bar widget was contributed by Richard Dodd in xilem#513.\n\n\nWe continue to make progress on other key features.\n\nSnapshot tests now are cross-platform and run in CI (xilem#233).\nPan/flick gestures are being developed in xilem#562.\nProgress continues on text input for Android. This involves creating our own Activity, with support for both text input and accessibility.\nThis new Activity will use SurfaceView like other modern native code based activities (GameActivity, MakepadActivity, etc.), and our aim is that it won't require a Java toolchain to build a simple application.\nProgress continues on the Accessibility integration for Android. You can try this in xilem#575, or see it in the below video.\n\n\n\n\nThe Xilem to_do_mvc example running with TalkBack integration.\nVideo provided by Matt Campbell.\n\n\nVello\nVello is our GPU vector renderer.\nWe have made some really great progress in August.\n\nWe now support blurred rounded rectangles, contributed by Markus Siglreithmaier (vello#665)\nBlend stack spilling was implemented, which allows blends more than four layers deep (vello#661).\nFixes for some visual artifacts in vello#651, vello#659 and vello#673.\nEmbedding existing wgpu textures is now supported (vello#636).\nWe now support bitmap glyphs (i.e. emoji), in addition to our previous COLR support (vello#641).\nWork has begun on sparse strips, which is tracked in vello#670.\nFrame pacing for Android is being investigated and developed in vello#674.\nThomas Smith has been doing some deep-dives into parallel scan, which is the core operation in Vello.\nThis work can be found in #gpu>Progress for GPU's Without Forward Progress Guarantees.\n\n\n\n\nVello now supports blurred rounded rectangles, based on the maths from Raph's blog.\nLeft: Vello's blurred rounded rectangles test scene.\nRight: Blitz's servo example which renders box shadows using this feature.\n\n\nParley\nParley is a text layout library.\n\nPrimitives required for robust text editing were added in parley#106.\n\nOthers\n\nBruce Mitchener has started work on Interpoli, an animation support library.\nWe have performed a retrospective on our last roadmap.\nDaniel and Olivier's \"office hours\" appointments can still be booked by anyone for open-ended time-limited discussion of the ecosystem.\n\nSee Daniel's schedule here.\nSee Olivier's schedule here.\n\n\n\n","id":"https://linebender.org/blog/tmix-08/","title":"This Month in Xilem, August 2024"},"https://linebender.org/blog/tmix-10/":{"body":"Linebender is an informal open-source organization working on various projects to advance the state of the art in GUI for the Rust programming language.\nThis month's update is very significant, featuring several crate releases and the adoption of resvg.\nResvg, Tiny-Skia, and Related Projects\nWe would like to thank Yevhenii Reizner (RazrFalcon) for all his work on resvg, tiny-skia, and related projects.\nDue to some changes in his personal circumstances, he has to give up working on his collection of excellent crates and he has been seeking new homes for them to help keep the lights on.\nThe following projects are now part of Linebender:\n\nresvg - an SVG rendering library, including usvg;\ntiny-skia - a skia subset ported to Rust.\n\nThese crates are widely used within the ecosystem and play an important role in many software projects, and not just in Rust!\nGiven that Linebender has a mission to provide high quality libraries for GUI and we have established processes for managing those libraries, we feel well positioned to step in and help out.\nSeveral associated repositories and projects are also now part of Linebender.\nThese are simplecss, svgtypes, and resvg-test-suite.\nWe do not expect this change to significantly impact current users of resvg, usvg, or tiny-skia.\nOur role is a stewardship role, to allow updates to continue as needed by the community.\nIf things work for you now, they will continue to work for you going forward.\nOur plans for the near future are:\n\nIntegrate with existing Linebender practices for CI, testing, and releases.\nReview and respond to incoming pull requests and issues.\nRe-license the resvg repository (including both resvg and usvg) from the MPL-2.0 license to a dual Apache 2.0 / MIT license as is common within the Rust world and the standard for Linebender projects.\nProvide new releases as needed, working with the community to bring additional maintainers.\n\nIn the longer term, we will look at how the ecosystem is evolving and what’s needed or useful.\nThe Linebender team has deep expertise in 2D rendering, including vector graphics, color and text layout, shaping, and rendering.\nWe look forward to seeing how we can apply this to these projects.\nRelicensing\nWe’ve already begun the process of re-licensing the resvg repository and are nearly done.\nThe change of license will be present in the next release, which will also be our first release under the Linebender umbrella.\nThis will allow us to share code between the Linebender crates more easily.\nThis process can be followed at resvg#838.\nHelp Wanted\nWe welcome pull requests and issues.\nAlso, with RazrFalcon becoming less involved, we’re losing a key source of knowledge about the code itself as well as the philosophy behind it.\nWe look forward to hearing from people who use the various crates to understand how you use it, what you use it for, and what you’d like to see.\nFor further discussion, please use the resvg channel on the Zulip.\n\n\nAlongside the work on resvg, we have been continuing work on our existing projects.\nXilem\nXilem is our flagship GUI project, inspired by SwiftUI.\nIt lets you build user interfaces declaratively by composing lightweight views together, and will diff them to provide minimal updates to a retained layer.\n\nxilem#681: View::rebuild was updated to reflect the ability to use reborrowing.\nxilem#669: The font weight for labels was exposed, by Marco Melorio.\n\nWork on Xilem Web continues.\nMasonry\nMasonry is the widget system used by Xilem.\nIt provides a non-opinionated retained widget tree, designed as a base layer for high-level GUI frameworks.\n\nxilem#632: Starts a Masonry book, including a guide on creating a To-Do List app.\nrfcs#7: The pass specification RFC has been fully implemented, and the RFC has been merged.\nxilem#705: Moved methods for mutating widgets to free functions.\n\nThis decreases ergonomics in favour of increasing uniformity between Masonry and crates which create their own widgets.\nThis change is intended to improve rustdoc output, and the ergonomics should be restored once Rust has Arbitrary Self Types V2.\n\n\nxilem#615: Our accessibility for text has been greatly improved, allowing by-character and by-word movement through accessibility tools.\nxilem#660: request_paint has been removed in favour of a new request_render, so that accessibility updates are less likely to be missed.\nxilem#718, xilem#720: restored the ability to embed Masonry in external projects by re-exporting required items.\nxilem#612: A built-in feature-gated integration with Tracy.\n\nDaniel also provided a talk to GOSIM China 2024 about Masonry.\nThe recording of this presentation is not yet available.\n\n\n\nMasonry now has built-in support for tracing using Tracy, using the tracing-tracy crate.\n\n\nVello\nVello is our GPU vector renderer.\nIt can draw large 2D scenes with high performance, using GPU compute shaders for most of the work.\nThe main update is the release of version 0.3.0.\nThis release includes previously discussed support for emoji and blurred rounded rectangles.\nWe also now no longer consider Vello to be experimental, and so would encourage you to try Vello for your projects.\nRaph has been working on Sparse Strip Path rendering; progress can be followed in the Zulip thread.\nWe do still have several known issues, but are not aware of any issues which would block wider adoption.\n\n\n\nVello is now supported as a renderer for the external Floem project, developed for the Lapce editor.\nNote that Lapce does not currently itself use Vello.\n\n\nParley\nParley is a text layout library.\nIt handles text layout, mostly at the level of line breaking and resolving glyph positions.\nWe released Parley 0.2.0.\nThis includes:\n\nparley#126: A new abstraction for text editing operations.\nparley#129: Ergonomics improvements for style properties.\nparley#76: A tree-style layout builder, useful for building up a text section (e.g. between elements).\n\nWe have also done some follow up work, including:\n\nparley#143: Support for shortcutting drawing work if rendering has not changed.\nparley#152 (in progress): An example showing cursor blinking, by tannal.\n\nPiet\nPiet is a 2d graphics library which abstracts over platform-native graphics APIs.\nLinebender is focused on Vello rather than Piet for performance reasons, but some users may find Piet useful, as it relies on more mature renderers and is more compatible with older platforms.\nDuring October, we released Piet 0.7.0.\nSome key updates from October included in this release are:\n\npiet#572: Use of Arc over Rc for stroke dashing, by anesthetice.\npiet#585: An update to the Rust 2018 edition, from Bruce Mitchener.\npiet#578: Improved robustness of copy_raw_pixels on Direct2D by Kaur Kuut.\nMany dependency updates.\n\nDruid\nDruid is a GUI library which was a predecessor to Xilem, and an ancestor of Masonry.\nWe are in the process of relicensing Druid from its current license of Apache 2.0 only to the Rust ecosystem standard Apache 2.0 OR MIT dual license.\nIf you have previously contributed to Druid, please read and respond to druid#2414.\nThis will greatly improve cross-compatibility with the rest of the Rust ecosystem, particularly for adapting code from Druid into newer toolkits.\nWe plan to archive the Druid repo after one more release, as we are not actively developing it; we are working to bring Xilem to parity in capability.\nWe will also apply this license change to Xilem and Masonry, as well as Glazier, which is currently archived.\nOthers\n\nDaniel and Olivier's \"office hours\" appointments can still be booked by anyone for open-ended discussion of the ecosystem.\n\nSee Daniel's schedule here.\nSee Olivier's schedule here.\n\n\n\n","id":"https://linebender.org/blog/tmix-10/","title":"Linebender in October 2024: resvg stewardship"},"https://linebender.org/blog/xilem-2024/":{"body":"2024 promises to be an exciting year for Xilem. The big news is that Google Fonts is funding the work of four open source contributors to the project: Aaron Muir Hamilton, Daniel McNab, Matt Campbell, and Olivier Faure.\nAaron will be working on text layout, building on parley, text input including IME, and Android platform integration. Daniel will be working on GPU infrastructure and performance, with much of the work upstreamed to wgpu. Matt will be working on accessibility, and Olivier will be building the core widget tree, with a focus on developer experience.\nXilem is an ambitious project to explore the limits of UI performance, as described in my High Performance Rust UI talk. The goals include gathering knowledge about the viability of Rust for UI, and what patterns work well. While there is a research focus, we plan to gather this information by building a real toolkit, solving many of the hard problems. The current state of the project is a fairly rough, though promising, prototype, so there is much work to be done. It’s exciting to have the bandwidth and experience of these people working toward that goal, but perhaps the most exciting prospect is bringing together more of the community, people passionate about building high quality UI. Our goal as an open source community is to facilitate that, and to coordinate the work efficiently. What we have now is not a production-ready product, but we wish to move in that direction, including quality documentation - some of the consistent feedback we’re getting about the current state.\nAnother goal is to bake in accessibility from the start. Too often, it’s an afterthought, tacked on at the end. We’re excited to have Matt, primary author of AccessKit, on board.\nXilem is designed in layers, with a reactivity layer on top, a widget tree adapted from Druid, and with Vello as the 2D rendering engine. These layers are designed to work well together, but the individual pieces may be useful in other contexts. The funded work will focus on Android as a target, but is intended to work well on desktop platforms as well; this is one of the core strengths of the Rust ecosystem. We don’t have iOS as an immediate priority, but attention from the open source community could change that, and the foundations should support it.\nThe status of the web backend for the Xilem widget set is more complex. Simply put, it is not a priority for us right now. We have done some explorations into generating DOM nodes from Xilem, but doing it well would increase scope and complexity beyond what we’re comfortable with. For applications deployed primarily on the web, xilem_web (which generates DOM nodes) should be a viable choice, with the possibility of Tauri or Electron for desktop deployment. To enable online demos of native applications, it is most likely that we will implement a version which draws to a canvas element. This has limitations in accessibility and native look and feel - for example, text input and scrolling may behave contrary to user expectations. Until more work is done refining the web backend, we would not recommend this approach for production applications using Xilem.\n2023 retrospective\nLooking back at 2023, there was a great deal of foundational work. Much of the effort was on Vello, the 2D rendering engine that serves as the graphical foundation of the project. A particular strength is high performance path rendering on GPU, which enables fully dynamic text effects including animation of variable font parameters. Though we had a reasonably good implementation of path rendering in place, much of the second half of the year was taken up by “stroke rework” which computes all stroke styles on the GPU, and also improves the performance and accuracy of antialiasing for all paths. To this end, we invented new computational geometry algorithms for computing parallel curves, the newest based on Euler spirals, with some elegant math tuned for GPU evaluation. A writeup explaining the details is in the pipeline.\nThere was slow and steady work on the higher levels of the stack as well, including factoring out the reactive layer into a generic xilem_core module, and validating that with generation of DOM nodes for browser deployment. The widget tree saw some development as well, including integration with the Taffy layout engine.\nGovernance and community\nThough we now are funded to work on the project, the open source nature of the projects continues unchanged. We’ve been building up infrastructure for open source community, including a Zulip instance, weekly office hours, wiki, and, as of this post, a shared blog. Our contributor guidelines explain a bit about our processes. Almost all decision making is by consensus. Only very rarely do I need to step in and tie-break. As we scale up, we’re going to be more systematic, starting to use RFC documents for major changes.\nWe’re intentionally designing our community to foster learning and collaboration. For example, discussions are on Zulip rather than Discord because it’s searchable, meaning that the same questions are less likely to come up over and over. Its grouping into topics lets participants quickly skim activity as opposed to getting drowned in chatter. It’s working well for us. We also invite others in the Rust UI ecosystem to use our Zulip and wiki. As the Kurzgesagt video The Internet is Worse Than Ever – Now What? observes, large social spaces are degrading, and the video recommends seeking out smaller, more focused communities. I hope ours is one such.\nIn any case, we are happy to share bits of infrastructure with other Rust UI efforts, and are always eager to learn from them. I see many of us working toward common goals rather than competing, even if there are different approaches and priorities.\nThoughts on the Rust UI ecosystem\nI’ve been thinking about doing UI in Rust for about 8 years now, and have explored many, many approaches. I’m not alone in this, there have been well over two dozen projects started.\nAs mentioned in a previous blog, any given application will have a set of requirements. Is Web one of the main deployment targets? Will there be embedded video? Is there a need to integrate with some other subsystems, such as a game engine? Each of these has profound implications. Some problem spaces (compilers are an example) are “smooth,” in that continual refinement will lead to fairly similar outcomes no matter the starting point, but over time I’ve come to the conclusion that UI is especially lumpy. I believe this contributes to the continuing pattern of new UI toolkits coming out every couple months or so; the author surveys what’s available, finds none that match the specific set of requirements, and creates a new one.\nIn some ways, Xilem is in the same pattern, but there are some things we’re doing differently. For one, it’s explicitly a research project, with knowledge about how to build UI in Rust an outcome possibly as important as the codebase. We’re trying to be systematic about finding the best ways to do things, which ideally will make some solutions more general. And, increasingly, we’re designing things as modular layers that can be swapped out. With luck, even if people don’t end up adopting the entire stack, there will be some useful components for the ecosystem.\nA good overview of the opportunities and challenges in Rust UI, particularly for making mobile apps, is parallel futures in mobile application development by Andy Wingo. The linked blog posts in that series also go into considerable detail about JavaScript and TypeScript based approaches, which have important lessons as well.\nDeclarative UI patterns\nThe trend in UI programming has been overwhelmingly away from a soup of mutable objects with interlinked references and toward various declarative or reactive patterns. That’s a good thing for Rust UI, because the former is very un-ergonomic in Rust.\nIn the JavaScript world, there is a Cambrian explosion of reactive techniques. React is by far the most popular, but there is a strong sentiment it’s possible to be better, particularly on performance, but also robustness, as the logic for deciding when to re-render is fickle, and can miss re-renders. Elm deserves special mention, as its avoidance of global shared mutability makes it particularly easy to adapt to Rust, so it serves as the reactive core of the iced, relm, and vizia UI toolkits, as well as yew on the WASM side. But there is also Ember Octane (based on Adapton), a number of fine-grained reactivity approaches such as SolidJS, and many, many more (not to mention the incredible diversity of solutions for state management).\nWe’re seeing much of that diversity mirrored into the Rust world. On the WASM side, we see Dioxus as a fairly faithful adaptation of React, leptos (also sycamore and tachys) adhering fairly closely to SolidJS, yew as an adaption of elm, and more.\nA reactive layer such as Dioxus or leptos can be compiled to WASM and run in a browser to generate DOM nodes. More recently, we’re seeing that it can be decoupled from that environment, and a reactive core can drive a widget tree. Examples include Freya which uses Dioxus, and floem which implements fine-grained reactivity inspired by leptos.\nXilem doesn’t directly correspond to any JavaScript framework; it relies on static typing and is actually closer to SwiftUI than anything web based.\nOne of the central questions in Rust UI going forward is: which approach to declarative UI is best? It’s possible a clear winner will emerge, or perhaps there will be a different answer depending on the use case, or it might just come down to a matter of personal style, with a number of viable contenders (arguably that’s where JavaScript is). We’re taking a two pronged approach. First, we’re moving forward with Xilem. There’s a specific reason - Xilem is designed to support multithreaded rendering easily, while many of the other frameworks rely on thread local storage for access to a store of observables, an approach with high impedance mismatch to multithreading. Since performance is a goal, we didn’t want to give that up by adopting another framework. I also think Xilem is pretty good, but that remains to be seen.\nAnother way to gather more evidence on the Xilem declarative layer is to use it to generate DOM nodes in a browser, in other words decouple it from the widget set. As described in the Xilem Vector Graphics talk, we have been experimenting with that a bit, and a major development in the last year was to factor out the core declarative logic into xilem_core, and also develop a xilem_web layer for creation of DOM nodes. Early indications suggest that this may be a viable alternative to frameworks such as Dioxus and leptos, and we're eager to learn more from those explorations.\nXilem is untested, though promising, and it may be that some other approach is better. If so, we’re prepared to pivot. We’ll be designing the widget set so that it doesn’t have a hard-coded dependency on the Xilem declarative layer, and could, at least in theory, be driven from other frameworks. Olivier is author of the masonry crate, where being agnostic to the declarative layer was an explicit goal. He’ll be adapting many of the ideas from that.\nMaking a widget set agnostic has other potential benefits. While writing app logic in Rust is very promising, there are still compelling reasons to use other languages. A widget tree implemented in Rust with fast graphics and smooth interactivity, scripted in some other language, is compelling. I made a prototype in Python, which, though rough, shows promise.\nInfrastructure\nA UI toolkit depends on a great deal of infrastructure. We’re making careful choices around that, and also looking for opportunities to collaborate with the rest of the ecosystem. One choice I’m particularly excited about is investing in wgpu. I think WebGPU will move modern GPU usage forward considerably, especially compute shaders, which are heavily used in Vello. This technology will make truly portable applications requiring high compute throughput possible for the first time, and we’re shooting for smooth UI integration with the GPU usage in these applications.\nWhether to use winit or build our own platform integration has long been a subject of discussion. We’re reopening that discussion with the winit maintainers as of this writing, but it’s still too early to say whether we’ll join forces, or decide that the goals of the project support having a separate codebase.\nA huge part of any UI effort is text, and that’s also a long-standing interest of mine. I’m impressed with cosmic-text but ultimately we decided to move forward with parley, in part so we can test out ideas with variable fonts. The lower levels of the text stack will be rebased on the fontations work of the Google Fonts team, which is rapidly becoming a production-quality implementation.\nBuilding common infrastructure for accessibility also benefits the entire ecosystem, and we're thrilled to see the increasing adoption of AccessKit. Indeed, on all these topics, we’re happy to share what we’re doing with other projects, as most of the infrastructure described above is general in application, rather than specific to our projects.\nConclusion\nThe potential for Rust UI is huge. The Rust language enables top-notch performance and reliability and is also expressive for high-level application logic. We plan to prove that out, based on encouraging existing research and explorations, as well as new research to discover the patterns for Rust UI that work best at scale. This involves work at all levels of the stack, including infrastructure we are happy to share with other Rust UI efforts.\nXilem is still an early prototype. For those who desire a “batteries included” toolkit for building UI, we ask your patience. For those who are interested, you are invited to come build this future with us.\n","id":"https://linebender.org/blog/xilem-2024/","title":"Xilem 2024 plans"},"https://linebender.org/blog/xilem-backend-roadmap/":{"body":"As you may have heard by now, Google Fonts is funding me this year to work on Xilem.\nI'm not alone in that: Aaron Muir Hamilton, Daniel McNab and Matt Campbell were funded as well to work on various parts of the ecosystem. I believe this is Matt's third year getting funding from Google Fonts.\nNow, what I was hired to do might be unclear to you. The scope we agreed on was fairly broad and was stated as \"contributing to Xilem's view tree and developer experience\", but that could mean a lot of things.\nThe first thing I want to do is communicate a clearer picture. I have a a lot of plans for Xilem, and they involve major changes from the current architectures, changes that might be worrying to the community at large or even to Raph Levien. I certainly don't want to give the impression that I'm wresting the project away from the Linebender community for Google's interest, and that means being transparent early and often about the things I want to rework.\nWhat I want for Xilem\nXilem is a research-and-development project, the latest in a series (Xi-Core, Druid, Crochet, Lasagna, Idiopath), that aims to explore how UI development can be made compatible with Rust.\nThis might feel a little banal now, because Rust GUI frameworks are popping up everywhere and starting to settle on similar patterns, but those patterns weren't obvious in 2019! Xilem is very different from Druid, and getting to its current architecture has been a process.\nXilem has been perma-experimental since May 2022. Once it got started, the main Druid maintainers stopped contributing almost entirely with the expectation that Xilem would replace Druid once it was ready. Unfortunately, it still hasn't made enough progress to be on parity with Druid, yet Druid still lies abandoned, which isn't great when people had started relying on it.\nIt's debatable how much this could have been avoided. As I've pointed out before, the Rust GUI ecosystem is subject to massive yak-shaving: many of us came here because we wanted to build a text editor, and now we're all learning about text rendering, text editing, compositing1, accessibility trees, using monoids to implement stuff on the GPU, ECS, and some concepts that I'm absolutely certain Raph made up like Bézier paths and C++.\nAnd to a certain extent, yak-shaving is good! \"I'm going to do better than X without learning how X works\" is a child's attitude. It's the attitude we all start with, and it fills us with courage, but that courage is naive. True improvement comes from keeping that courage after spending years learning how immense the problem space is, and keeping faith that it's possible to do better. The Rust community is one that values not just doing things from scratch, but also learning from the past to get them right.\nThis is good, but the \"get them right\" part takes a lot of time, and in the meantime, I'd argue that we've neglected end users a bit. We've abandoned Druid before Xilem was ready as an alternative, and then we worked on foundational and experimental projects that would make Xilem stronger and sounder in the long term, but left the project in an awkward state in the meantime (except for the web backend, which made a lot of progress).\nIn the ECS-backed GUI framework article I linked, Bevy maintainers have this to say:\n\nNot to be too harsh, but a lot of the existing Rust GUI solutions... just aren't very good. There's a lot of passable options, but they all have non-trivial drawbacks. No one has really risen to the top as a clear winner. [...] Deep down, we all know that we can do better, and we should.\n\nMy ambition is to makes this paragraph obsolete before the end of the year. I want Xilem to get back to being suggested to newbies in the same breath as Iced and SlintUI. In the next few years, I want the entire ecosystem to get to a point where people talk about Rust GUI like they talk about ripgrep or rustls.\nTo give one specific example: my personal goal is to implement seamless hot reloading for Xilem before the end of 2024. I believe it's feasible, and I believe doing it will radically change the way people think about Rust GUI, along with other improvements I hope to unlock over time.\nIn the shorter term, my plan is to focus on basic features, widgets and styling options so people can experiment with Xilem, building on Raph's work on Vello over the past year. John Skottis's Xilem UX Notes give a good picture of the kinds of things I'll be working on.\nThe other big short-term priority is going to be documentation. We've seen a lot of people complain that the Linebender project were poorly documented and hard to get into; it was the most popular reaction to our 2024 announcement, but it echoed sentiments we'd seen before. We're aware of the problem, and we intend to work on it.\nIn the medium term, I also plan to work on the performance aspect of Xilem. People from Google Fonts have expressed interest in seeing how much performance we can get from Rust UI. While my mission isn't limited to performance work, it will be an ongoing focus, especially since it's an area where the Rust language brings unique opportunities. I'll go into more details on Rust performance and power efficiency in a later article.\nMajor changes I want to implement soon\nThese are the big changes I want to work on soon. Realistically, \"soon\" is going to be relative, because some of these changes are going to be controversial, and part of the work is going to be convincing people of their value.\nSwitching to Masonry as a backend\nOkay, this one makes me blush a little.\nI'm the only maintainer of Masonry, a GUI crate with barely over 300 stars on Github and little outside interest. Can I really justify taking the money Google pays me to improve Xilem and spending my time on Masonry instead?\nThat choice isn't random, mind you: Masonry was forked from Druid, Xilem's ancestor, and in fact Xilem and Masonry share a lot of code right now.\nIn fact, I'd argue that Masonry's codebase is of better quality than Xilem's current native backend. This isn't meant to be a put-down of the work of Xilem maintainers; rather, it's the outcome of a difference in priorities. Nobody was very interested in Xilem's native backend (though Raph was aware of its importance, hence me getting paid to write this), and lots of people were very interested in the frontend and the web backends, therefore the frontend and web backends saw the most work.\nFrom our RFC#0001:\n\nAs a result, Xilem's native backend is in a poor state:\n\nThere is code commented out.\nThere are entire modules commented out.\nThere is documentation referring to items from Druid that no longer exist.\nThere are TODOs without an associated issue.\n\n\nMasonry's backend codebase is a healthier starting point. Masonry also comes with some built-in perks, like powerful unit tests and a structured widget graph.\nIt's not clear whether we want to import the Masonry codebase, the crate, or the entire repository, and it's not clear what the ultimate branding should be. The RFC lays out the different possibilities, and discussion is still ongoing, so the community can reach a consensus before doing more work (including possibly not using Masonry at all).\nIf we do move forward with this, then Masonry will need some porting work:\n\nUsing Vello and Parley instead of Piet.\nUsing Glazier instead of druid-shell.\nIntegrating AccessKit.\nRemoving the dependency on GTK.\n\nAccessKit support in particular is table stakes, by now. The Rust ecosystem is converging on the idea that accessibility (or at least, screen reader support) should be integrated early on in the design of GUI frameworks, not tacked on at the end.\nThere are other things Xilem added over Druid (notably virtual lists and async support), but I believe Masonry doesn't need to implement them right away for parity. Both will be very important for eventual performance work.\nAvoiding custom Widgets\nI'm told by Raph this is a \"molotov cocktail\" which, uh, fair.\nWe should write Xilem's backend under the assumption that end users of the library (including the Xilem frontend) will very rarely create their own widgets. Instead, they will usually compose the primitives given to them the same way they compose DOM elements in the browser. There will be escape hatches, from a fixed-size canvas surface where end-users can use arbitrary paint primitives to full-on custom widget code, but we should design the framework under the assumption people will almost never need those hatches.\nClearly, this is a radical move. There will be a prototyping phase before we choose whether we commit to it, and RFCs to lay out the details. I'm confident it will pay off.\nDevelopers of hobby GUI frameworks tend to provide a severely anemic set of primitives, under the assumption that if anyone wants other features in their widgets, they can implement them themselves. Both Druid and Xilem suffer from this.\nOn the other end of the spectrum, the web has shown that you can implement complex custom UIs given a rigid but rich set of primitives.\nMore importantly, the web is moving towards a powerful paradigm: declarative UI. As time goes on, people are realizing you can get better performance and composition by describing what things should look like and composing them than by imperatively making them do things.\nPart of this is that native code is more performant than JS, but part of it just that declarative code is easier to work around than imperative code: its bounds are better defined, it lets you commit to limitations that make the engine's job easier, and it's easier to analyze.\nA set of proposals called CSS Houdini came out that went in the exact opposite direction: pushing the layout engine towards more customization and JavaScript code. The proposal hasn't seen much movement since 2021, and I don't think it's a coincidence that the part that would have given the most power to imperative code, the Layout API, hasn't been stabilized in any browser.\nThe bottom line is that, while implementing custom widgets will always be possible, I want to encourage developers to go as far as they can composing declarative elements instead, and see how far it's possible to go using those building blocks.\nMore opinionated layout\nOne major customization point I want to restrict in Xilem is layout.\nToday all Rust GUI frameworks ship their own layout algorithm, but none of them are competing on their layout algorithm. Often the layout algorithm is just a means to an end; developers that do want to work on a state-of-the-art layout engine will provide it in a modular crate like Morphorm and Taffy.\nAnd here's the thing: realistically, most layout engines aren't that creative. Every Rust framework and every major GUI framework I'm aware of uses layout that boils down to \"FlexBox with small variations\". The number of meaningfully different ways to do GUI layout can be counted on, generously, two hands.\nI'd argue we only need CSS Flow, FlexBox, CSS Grid, and maybe Morphorm to cover most people's needs. Conveniently, this is what Taffy aims to provide. There's already an experimental Taffy integration in Xilem, and I want to make it deeper.\nThat being said, there won't be a hard-coded set of layout algorithms. Rather, layout will rely on a web-inspired protocol between widgets (in other words, trait methods), and that protocol will be strongly opinionated to make implementation of these layout algorithms easier.\nMore on this in a latter blog post.\nNo boxing\nHaving a semi-fixed set of widgets means you can avoid using Box<dyn Widget>, which has some interesting performance implications.\nIt means you can add a lot of methods to the Widget trait without worrying about bloating the vtable. And you can write methods under the assumption that they'll be inlined, which opens up interesting DX improvements.\nUsing ECS, maybe, sort of\nIn current Xilem code, if you want your FlexWidget to have children, it must have a Vec<Pod<ChildWidget>> member. Each Pod directly owns a Widget.\nI think this is an interesting quirk of Rust GUI, tying directly to Rust's ownership semantics. Non-Rust frameworks often use pointers to child widgets, true, but they're often shared with the framework, with an understanding that the framework is charged with keeping track of how many widgets there are and which is a child of which. In Qt, for instance, it's preferred (but not mandatory) for parents to call delete_later() on their children instead of delete, because it plays better with event handling.\nXilem's approach of \"you own your children\" is a little bespoke. It means the framework has a hard time iterating over the entire widget tree (say, as part of a DOM inspector) unless each Widget specifically implements the iterating method. And it means if you want to target an event at a specific widget (say, the one with keyboard focus), you need to go through the entire ownership chain, using some heuristics to avoid visiting too many widgets.\nI believe Widgets should be owned by the library. If your container has children, then the only thing the container will actually own is keys into a structure (probably a slotmap) where the widget is stored. This makes a lot of things easier, like serialization and debugging, but it has an impact on the entire backend. It's an infrastructure investment.\nLately, I've seen more and more discussion of implementing GUI through an ECS. A lot of that discussion comes from Bevy, which is natural, since the bevy community is made up of ruthless cultists striving to feed ever more sacrifices to the ECS god until it consumes the Earth is intimately familiar with the ECS pattern and has reached a phase where UI work is getting a lot of attention2. But I've seen discussions about it in the Linebender community too.\nWhether we actually want to use ECS is something we still need to research.\nThe way I understand it, the big draw of ECS is the \"S\" part, the Systems: it's about handling lots of similar data at once in arbitrary order. Which is why eg archetypes in bevy are useful: you're grouping together entities with the same components, so that you can say \"execute this code for all entities with component X and component Y\" and have this code be executed on arrays of values with minimal indirection or branching. And the \"arbitrary order\" part makes them work really well with slotmaps: since you can just read from the beginning of the slotmap, you don't pay the double-indirection penalty.\nIn other words, the ideal use case for ECS is code of the type for (entity in entities) entity.position += entity.speed.\nGUI is pretty far from that ideal use-case: updates are sparse and should only run on a small number of changed widgets. Order often matters. And I'm not sure archetypes would work in a framework with a large variety of widgets and different attributes.\nI think there are two things you really want from a Rust ECS library for GUI: slotmaps, and efficient ways to add and remove components from an entity.\nImplementing those is going to be a major undertaking, which we'll have to divide into small experiments, but one I expect to pay many times over.\nCommunity involvement and more to come\nI want to really put emphasis on something: none of the above is set in stone.\nPart of what Raph wants to achieve this year is to make Xilem more of a community project, and that means running more decisions by the community.\nI've created an RFC repository for this, and each of the sections above will get its own RFC, where I'll expand on my rationale in more detail.\nThis isn't a rubber-stamping process either: I want to implement those ideas, but if the community3 decides that they are bad, then we'll go another direction.\nThere's other ideas I haven't discussed yet that I want to come back to:\n\nDeclarative styling: Giving Widgets attributes similar to CSS properties, with modifiers for animations, pseudo-classes, media queries and container queries. While inspired by CSS, it wouldn't involve any CSS parsing, selector resolution, specificity resolution, etc.\nCompositing: Xilem is heading towards a \"do everything in the GPU\" approach. This is good for performance, but Firefox engineers who have gone down this road before us have warned us of the many perils they faced, especially regarding battery life. In general, after layout and painting, you really want a composite() phase to deal with scrolling and some simple animations without touching the GPU at all if possible. This is a complex subject, and it would be nice if we could hide most of that complexity from app developers while still giving them good performance.\nResource loading: This is another area where we might want to crib from game engines. At the very least, we want to be able to ask \"Load me this texture/shader/font/etc\" without having to write disk I/O in user code. Then we can start thinking about progressive loading, fallbacks, sharing, etc.\n\nThese ideas are likely to be the subject of further articles and/or RFCs in the near future.\nRelations with other projects\nPresenting the current state of the Rust GUI ecosystem would probably take its own article.\nThings are moving quickly, and anything I write now might not be up to date in two weeks. The projects we're most interested in right now are Winit and Bevy, and there's some potential for cooperation with Servo. The COSMIC ecosystem looks pretty cool, but so far it looks like we have less to share with them.\nPeople from parallel projects are communicating and exchanging much, much more than they were in 2022. Between Vello, Parley, wgpu, Taffy, COSMIC-Text and others, projects are converging and maintainers are making more effort to reach out and integrate other people's code.\nStay tuned for more!\nHey, this is really cool!\nSomething that came up in discussions I've had with Raph is that it's easy to miss the forest for the trees. In the middle of all the paperwork, blog-writing, RFC-writing, we can end up focusing on the process so much that we forget how excited we are.\nSo, I'm taking the moment to remind myself: this is really freaking exciting!\nFor all my criticisms and caveats and realistic assessments of the problems we need to overcome, I'm still feeling absolutely great about this!\nI'm super thankful to Raph for getting us this far, to Google Fonts for sponsoring us, and to everyone else who contributed to the Linebender ecosystem. I think we can do something amazing and I'm honestly a little startled to be in this position at all.\nTo reiterate what I said: in the next few years, I want the entire ecosystem to get to a point where people talk about Rust GUI like they talk about ripgrep or rustls.\nI legitimately think Rust has the potential to get best-in-class GUI frameworks, and now the time has come to prove it.\n1\nBy the way, I love this style of writing where we start humanizing a software process and complaining about how much it wants to kill us. The articles I cited are very high-quality too.\n\n2\nI'm told the Bevy community found that joke funny, but I was too afraid for my sanity to check on their Discord server.\n\n3\n\"The community\" is a nebulous concept here. For obvious reason, we'll give more weight to the opinions of people who have already put work into the Linebender ecosystem, but the general hope is to get a consensus from everyone involved. And you're welcome to weigh in even if you haven't contributed before.\n\n","id":"https://linebender.org/blog/xilem-backend-roadmap/","title":"Roadmap for the Xilem backend in 2024"},"https://linebender.org/contributor-guidelines/":{"body":"About the projects\nThe Linebender organization is an umbrella for a diverse and ambitious set of project, with the goal of creating high performance, accessible, high quality UI in Rust. An explicit goal is to push the boundary and fill in gaps in our understanding of UI infrastructure, as opposed to implementing existing cookbook techniques.\nDiscussions and community\nWe use a Zulip instance as the primary place for discussions. All are welcome, and everyone with a GitHub account can sign up. Additional discussion happens in issues in the individual repos, and we also have tracking issues. We don’t use GitHub discussions, preferring the Zulip.\nWe also hold weekly office hours. This is a chance to give status updates, make decisions, and discuss architectural directions. It is open to all, and there are public notes.\nWe have recently re-started a wiki, and eagerly encourage gardening. While the Zulip does have archives, they are not indexed by search engines (though search is available within Zulip), so the wiki represents the definitive place for the results of discussions and resources.\nTo propose a nontrivial change, it is better to file an issue first rather than sending a PR. Depending on the scope and disruption of the change, it might make sense to bring it up on Zulip. Especially if a clear consensus doesn’t emerge in a reasonable time, discuss it in office hours.\nWhile the main focus of the Linebender community infrastructure is to develop Xilem, Vello, and related modules, we also want to help move the entire ecosystem forward. People from other Rust UI efforts are welcome, and discussions about how to join forces and share infrastructure especially so.\nWe use the Rust Code of Conduct and hold people to a much higher standard of conduct than is usual on the Internet. Don’t worry if you’re interacting in good faith, though, the moderators will work with you to try to resolve issues.\nCode reviews\nHere are our policies around code review:\n\nEvery PR must be approved by someone with write access before committing.\nThe wiki is an exception; there we optimistically merge without review\nUsually we wait for the original author of the PR to commit if they have write access.\nBoth merge and squash commits are fine, it’s up to the committer.\nWe give write access to everyone with a good faith intent to improve the code. Usually this is shortly after the first commit.\nThere are currently five owners: @raphlinus, @dfrg, @DJMcNab, @xStrom, and @cmyr. They approve new committers and can make changes to the organization.\n\nWe struggle with getting PRs approved and landed quickly. To try to improve that, here are some suggestions.\nFirst, we encourage everybody to review PRs. It’s a good way for newcomers to get up to speed on the project, and contribute in a meaningful way. There are two goals of the code review process: to improve the quality of the code that lands, and for people to learn something; it’s worthwhile if some knowledge flows in either direction or ideally both.\nIf a PR goes unreviewed too long, it’s absolutely a good idea to ping it on Zulip. It’s also fine to ask for reviewers during office hours, especially if there’s a deeper issue to be discussed.\nResponsibility\nLinebender is a collection of open source projects, with a research flavor. We make no guarantees of any of them being suitable for production. We welcome contributions from anybody. Participating should be done out of joy and should not feel like a burden.\nSometimes PRs stall out, or people have an intent to work on an issue and don’t get to it. In those cases, we encourage others to take them over. We try to discourage “cookie licking” as much as possible.\nFiling an issue does not come with a guarantee it will be worked on. We really value high quality issue reports, but they can be closed if there’s no clear action to be taken, and we encourage everybody in the project to feel empowered to do so, or otherwise garden such as asking for more details.\nOver time, we hope that some of the projects will mature so that they are useful in production (this is already the case for pulldown-cmark, which is not officially part of the Linebender org). We very much welcome collaboration toward that goal, and use of the crates in all kinds of contexts including commercial projects. For such commercial use, we encourage a collaborative approach, where the organization dedicates sufficient staff time and energy to take responsibility for issues and feature requests, working collaboratively with the open source organization.\n","id":"https://linebender.org/contributor-guidelines/","title":"Linebender contributor guidelines"},"https://linebender.org/wiki/":{"body":"Changes to this Wiki are welcome; send a pull request to the linebender.github.io repo, which will be merged without\ndetailed review.\nNote that math is supported between two dollar signs $$ thanks to MathJax.\nFor example, $$x = \\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}$$ outputs $$x = \\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}$$\nWiki pages available:\n","id":"https://linebender.org/wiki/","title":"Wiki"},"https://linebender.org/wiki/canonical-lints/":{"body":"All Linebender projects should include the following set of lints in their Cargo.toml:\n\nAnd in their lib.rs:\n\nThis is a curated list: Clippy has a lot of lints, and most of them are not included above.\nYou may occasionally want to run cargo clippy with clippy::pedantic on your codebase, which will cast a very wide nets and catch a lot of very minor issues.\nThe lint set above focuses on problems that either impact correctness or tend to snowball over time.\nThe list above should be considered canonical.\nIf you think a new lint should be added to Linebender projects, add it to this file in alphabetical order, then copy-paste the list across projects.\nTo keep this process simple, avoid modifying this list in individual projects.\nIf you want to add other per-project lints, add them above the list.\nIf you want to remove a lint, #![allow] or #![expect] it at the crate root.\n","id":"https://linebender.org/wiki/canonical-lints/","title":"Canonical lint set for Linebender projects"},"https://linebender.org/wiki/capitalization-scheme/":{"body":"All Linebender projects should follow this capitalization scheme:\n\nThe project's name should start with an uppercase letter when referring to the project itself, eg Vello.\nThe name should be all-lowercase where referring to the project as a Rust crate (for instance, in relation to crates.io).\nIn that case, it's encouraged to use backticks to put the project name in a codeblock, eg vello.\nThe name should be all-lowercase where referring to the project as a Github repository.\nIn that case, it's encouraged to either use backticks or make it a link, eg vello#1.\n\nFeel free to correct any documentation you see to follow this scheme, unless the project is explicitly discontinued or in maintenance mode (eg Xi-Editor, Piet).\n","id":"https://linebender.org/wiki/capitalization-scheme/","title":"Capitalization scheme for Linebender projects"},"https://linebender.org/wiki/cubic-robustness/":{"body":"Cubic Béziers have a clean and simple definition as a parametric curve (the coordinates are a cubic polynomial in the parameter), but they can also exhibit cusps and other degenerate behavior, which makes numerically robust algorithms challenging in some cases, especially stroking. Cusps and near-cusps also reduce the accuracy of numerical integration techniques for computing arc lengths.\nAt heart, the robustness problems are caused by the derivative of the curve becoming or nearing zero. In the latter case, the curve is not regular, which among other things means it may not be G1 continuous, even though the curve segment itself is C∞. Freya Holmér's Continuity of Splines video does an excellent job explaining that distinction.\nThis page will discuss techniques for detecting and mitigating these robustness issues.\nThree cases\nIt's useful to consider three different cases, as they have different consequences for mitigation. Roughly in order from easiest to hardest, they are coincident control points, simple cusp, and colinear.\nCoincident control points\nThis case has a control point coincident (or nearly so) with an endpoint. It is extremely easy to detect.\nThe tangent vector is well defined at the endpoint, thanks to L'Hopital's rule; it is equal to the vector from the control point to the other control point.\nA good mitigation is to displace the control point slightly in the direction of the other control point. This has a minimal impact on the shape,\n\nSimple cusp\nThe simple cusp is in some ways a generalization of the coincident control point case, but with the cusp in the interior of the curve rather than at the endpoint.\nThe classic simple cusp is a semicubical parabola, which can be represented as y = x^1.5, as well as a parametric cubic curve. All cusp cases in a cubic Bézier can be represented as as affine transformations of this curve. There is always a single cusp.\nDetection is in two parts. First, this case can only occur when the control polygon is self-intersecting, which can be readily computed as alternating signs of cross-products. This is rare in non-adversarial inputs. Then, either a curve classification or hodograph technique can be used to detect the near-cusp, see below.\nA reasonable mitigation is to displace the control points along the tangent lines, either making the loop bigger or the inflection points farther apart, in either cases reducing the curvature.\n\nColinear\nLike the previous two cases, the colinear case is characterized by a (nearly) vanishing derivative, but is different in a number of important respects. Detection is reasonably straightforward, as the control points are close to colinear (which can be evaluated numerically as very small cross products relative to the magnitude of dot products).\nFrom a classification perspective, the colinear case can either an S-shaped or loop curve, subject to an extreme nonuniform scale, squashing the gentle curve into a nearly flattened form, with high curvature. Unlike the simple cusp case, there are generally two cusps.\nA few more observations. The line is not necessarily (nearly) parallel with the chord, as the chord may be very short.\nMitigating this case may require a different approach than for the other cusp cases. Moving the control points along the tangent (preserving G1 continuity) may not resolve the cusp. For stroking, it is possibly best to divide the cubic at the (near) cusps and stroke each as a line, using round end caps.\n\nBézier classification\nOne approach to detecting the simple cusp is Bézier classification. There's a classic paper on this, Wang 1981, which is cited by a number of later references (see relevant Stack Overflow thread).\nThe core element of the classification is x''×x', which is a quadratic polynomial. This is the numerator of the equation for curvature. A \"loop\" shape has no inflection points, and no real solutions of this polynomial. Thus, the discriminant (b² - 4ac) is a valid classifier. That said, choosing an epsilon value for near-cusp instances is tricky. This discriminant scales as the square of area under affine transformation, which is not particularly helpful in choosing an epsilon. For one, as the line case shows, extreme affine transformation can strongly affect the sharpness of the cusp.\nEven so, the sign is useful for determining the mitigation; if it's a loop, then the control points should be moved farther from the endpoints to make the loop bigger (and lower in curvature), and conversely closer if it's two closely spaced inflection points.\nHodograph\nAnother approach is the hodograph, or analysis of the derivative of the cubic curve, which is a quadratic Bézier.\nDetermining the minimum absolute value of the derivative is equivalent to the \"nearest\" method, finding the point on the hodograph nearest the origin. This is a cubic solve, and exists in kurbo. That may not be the exact curvature maximum (given that the numerator also varies), but is close enough for robustness work, and calibrated in more useful units.\nThe loop/double inflection classification as stated above can also be geometrically interpreted in terms of the hodograph: whether the origin is inside or outside the concave part of the parabola, respectively. The math turns out equivalent.\n\nArc lengths\nNote: this section could move to another page on arc length, with more detail. Here are just observations on cusp behavior.\nIt's been noted that Gauss-Legendre quadrature has excellent accuracy for smooth curves, scaling impressively with the degree of quadrature, but that accuracy suffers in (near) cusp conditions, or that it provokes numerical stability issues in analytical techniques. Henkel 2014 contains some experimental results, and it was also noted in the How long is that Bézier? blog post and followup. The current implementation in kurbo employs an error metric and subdivides; note from the illustrations that the near-cusp conditions (near the bottom edge of the graph) require many more subdivisions. It might be worth investigating whether explicit cusp detection, splitting at the point of maximum curvature, might require fewer subdivisions for the same accuracy, and thus be faster.\nReferences\n\nConverting stroked primitives to filled primitives, Diego Nehab, 2020\nShape classification of the parametric cubic curve and parametric B-spline cubic curve, C. Y. Wang, 1981\nCalculating the Cubic Bézier Arc Length by Elliptic Integrals, Hartmut Henkel, 2014\n\n","id":"https://linebender.org/wiki/cubic-robustness/","title":"Cubic Bézier robustness"},"https://linebender.org/wiki/curve-families/":{"body":"CurveParamsSubdivAffineInflectionsSuperellipse\nLine0yesyes00.5\nArc1yesno00.785\nParabola2yesyes00.833\nEuler spiral2yesno10.785\nRectangular elastica2yesno1~0.8\nElastica3yesno1*0.5..~0.85\nBalanced Bézier3nono20.5..0.95\nEuler spiral PC3yesno10.785\nConic3yesyes00.5..1\nCubic Bézier4yesyes20.5..0.95\nSpiro4yesno3TODO\nHyperbezier4yesno10.5..1\nQuintic Bézier8yesyes4?0.8..0.996\n\nRelationship graph\n\nThis graph has an arrow when one curve family fully includes the parameter space of another. A dotted line represents an approximation which is better than can be expected from scaling based on the number of parameters.\nProperties\nNumber of parameters\nWe use the same parameter counting policy as Raph's thesis (section 2.8). The endpoints are considered to be fixed, so to use in an actual application, there is an additional transform consisting of translation, rotation, and scaling. This additional transformation is the same for all curves.\nThe number of parameters is a tradeoff. To represent an arbitrary curve, with a small number of parameters more subdivisions are needed. Increasing the number of parameters has a cost, for representing the parameter values, presenting them in a UI for humans to manipulate, and for doing computations. Generally, higher degrees of continuity requires more parameters.\nIn general, the accuracy of curve fitting scales with an exponent equal to the number of parameters plus 2. For example, fitting with a quadratic Bézier or Euler spiral has O(n^4) scaling, meaning that subdivision in half improves accuracy by a factor of 16. That said, actually achieving optimal curve fitting may be challenging; I'm\nClosure under subdivision\nIf a curve is subdivided at an arbitrary point, will the two subdivisions also be members of the curve family?\nTwo-parameter curve families closed under subdivision are all derived by taking a segment of a fixed generating curve (section 4.1 of Raph's thesis). Thus, such families can be characterized entirely by the generating curve (parabola, Euler spiral, rectangular elastica). More or less any generating curve can work, and the properties of the generating curve (monotone curvature, periodicity, presence of an inflection point) map to the properties of the curve family. Section 4.8 of Raph's thesis explores this space somewhat.\nClosure under affine transformation\nWhen an arbitrary affine transformation is applied to a curve, is that a member of the curve family?\nAs a general pattern, Bézier curves are closed under affine, including the rational variants, but spirals and curves defined variationally are not. However, it is certainly possible to mix the two. The affine closure of Euler spirals is a potentially interesting curve family.\nInflections\nAn S-shaped curve has an inflection point. Some curve families only contain convex curves, while others can represent inflections. Arguably, having too many inflection points is a drawback, as it is not intuitive to control the curve.\nSuperellipses\nSuperellipse-like shapes are very important in graphic design. The ability of a curve family to approximate a superellipse varies widely. As a general principle, curves defined variationally do not easily form superellipses, those with a rational polynomial at their core can represent the entire range, and Béziers are in the middle (they're reasonably good at representing arbitrary curves, but have a limit, beyond which the curve develops unwanted additional inflections).\nTo quantify this more precisely, we define the superellipticity range of a curve family as follows. Set both endpoint tangents to π/4 (45°), so the curve covers a quarter-circle of arc. Use the curve to define one quadrant of a superellipse shape, with an extent of 1 on both x and y axes. Compute the area of the resulting quadrant. For a circle, it is π/4 (≈0.785), and for a square it is 1. As the remaining parameters are varied, what is the range of areas that can result? The range is further constrained by the curve having no inflection points (though curvature is allowed to reach zero at the endpoints) and being symmetrical, as these are visually important features of a real superellipse.\nNote that a two parameter curve family has a single value, as there are no additional parameters to vary after the endpoint tangents are set.\nThe curves\nHere we mostly point to a reference for the curve family. Each section could be expanded greatly, perhaps by giving the curve family its own page.\nLine segment\nA line segment has zero curvature. A polyline has G0 continuity only.\nCircular arc\nA circle has constant curvature. A circular arc is a segment of a circle.\nIn general, circular arcs can only achieve G0 continuity, though there are techniques to achieve G1 by applying additional constraints, notably biarcs.\nThey are popular in CAD, partly because they are the only widely implemented curve family in G-code.\nQuadratic Bézier (parabola)\nA quadratic Bézier is a segment of a parabola.\nQuadratic Béziers are in widespread use as the curve family of TrueType fonts (and thus TrueType-flavored OpenType).\nEuler spiral\nAn Euler spiral has curvature linear with arc length. It is extensively discussed in section 4.6 of Raph's thesis. It is an especially good choice for making a G2 continuous interpolating spline (for reasons discussed in the thesis), but a weakness is representing curves with significant curvature variation.\nAnother benefit of the Euler spiral is that its parallel curve is mathematically tractable to compute. See Cleaner parallel curves with Euler spirals.\nRectangular elastica\nThe minimum energy curve (MEC) is the curve minimizing the total bending energy when constrained to pass through the given control points, so is a mathematical idealization of a physical spline made out of a thin strip of flexible material. Each segment is a segment of the \"rectangular elastica\", which is a particular solution of the general elastica. It is extensively discussed in section 4.2 of Raph's thesis.\nElastica\nThe general elastica has an additional parameter, which corresponds to tension, resulting in a three-parameter curve. It has a narrow superelliptical range. In addition, it is symmetrical around the inflection point, which means it cannot model an asymmetrical S-shape. More precisely, when the endpoint tangents are anti-symmetrical, the area is zero for all values of the tension parameter. It is rarely used directly, but because of its physical importance, it is worth evaluating other curve families in their ability to accurately approximate an elastica.\nProbably worth noting here, the SI-MEC is a two parameter curve family which is not closed under subdivision. It is analyzed in section 3.11 of Raph's thesis, with the conclusion being that the Euler spiral is superior in most cases.\nA definitive treatment of the elastica is in chapter 3 of Raph's thesis.\nBalanced Bézier\nA \"balanced Bézier\" is work in progress to restrict the parameter space of cubic Béziers to those with a smooth parametrization. See the Sweet Béziers Zulip thread for more information.\nIt approximates circular arcs with O(n^6) accuracy.\nRational quadratic Bézier\nA rational quadratic Bézier is a segment of a conic section. It is fairly widely used in CAD, less so in graphic design applications. It cannot represent an inflection point, but does have the full range of superellipticity.\nAn additional superpower is that it is closed under perspective transformation.\nCubic Bézier\nA cubic Bézier is by far the most common curve representation. It can accurately represent an extremely wide range of curves, and also has a control scheme suitable for direct manipulation in a UI. See A Primer on Bézier Curves for more information.\nCurve-fitting is challenging; no good general technique was known until Raph's [Bézier curve fitting] blog posts. In general, it requires solution of a quartic equation, and the process is discontinuous; there exist input curves extremely close to each other with very different best fits.\nSpiro\nThe Spiro curve family was an attempt to create a tool more suitable for interactive curve editing. It is defined as the curvature being a cubic function of arc length. It is the basis of a practical G4-continuous interpolating spline, and is an excellent choice when high degrees of continuity are required. One weakness is the limited superellipticity range. It is discussed in section 7.3 of Raph's thesis, and has had some limited implementation success.\nHyperbezier\nThe hyperbezier is defined as $$\\kappa(s) = (as+b)/(cs^2+ds+e)^2$$. There are four parameters as multiplying all five coefficients by a constant does not change the result.\nDevelopment of this curve family is work in progress. Two Zulip threads are Hyperbezier progress and Hyperbezier parameter mapping.\nAn earlier draft is presented in The hyperbezier pen tool and is implemented in the spline library. That draft had some weaknesses (not closed under subdivision, limited superellipticity range), so will be superseded by the new version.\nQuintic Bézier\nThe quintic Bézier pushes the number of parameters into unmanageable territory. It is not clear that there is any practical way to achieve the theoretical O(n^10) curve fitting accuracy; from experience with cubics it is clear that it is a highly nonlinear optimization problem with many local minima. That said, it does have some uses.\n","id":"https://linebender.org/wiki/curve-families/","title":"Curve families"},"https://linebender.org/wiki/curve-offset/":{"body":"Curve offsetting and fitting is an important foundational topic that necessary for stroking paths, in addition to\nmany other places. For now, I'm just posting relevant literature here. Hopefully over time, it will become a review\nof the literature on this topic.\n\nPolar Stroking: New Theory and Methods for Stroking Paths\n\n","id":"https://linebender.org/wiki/curve-offset/","title":"Curve offsetting and fitting"},"https://linebender.org/wiki/curves/":{"body":"Articles about curves:\n","id":"https://linebender.org/wiki/curves/","title":"Curves"},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"body":"The evolute of the Euler spiral has a simple representation as a Cesàro equation.\nEvolutes of curves are interesting because the Nehab 2020 paper shows us that for strongly correct stroke expansion, the evolute of a curve is needed in addition to the parallel curve (see Figure 11 and related discussion).\nThis page contains that derivation, as well as related results on near-optimal flattening of the evolute to line segments.\nIn this image, the Euler spiral segment is in gray, and its evolute is in blue:\n\n\nWe'll start with an Euler spiral defined (in Cesàro form) as follows:\n$$\\kappa(s) = as$$\nIntegrating this equation results in the Whewell form:\n$$\\theta(s) = \\frac{as^2}{2}$$\nAnd we have an equation for the derivative of the curve.\nIn this derivation, we'll fluidly mix complex numbers and 2D vectors, writing unit vector in the direction of $\\theta$ as $e^{i\\theta}$.\nThis choice, while a bit of an abuse of notation, will be very convenient when calculating derivatives.\n$$x'(s) = e^{i\\theta(s)} = e^{i\\frac{as^2}{2}}$$\n$$x''(s) = iase^{i\\frac{as^2}{2}} = iasx'(s)$$\nThe evolute is defined as points offset from the source curve in the normal direction, by the radius of curvature.\nGenerally:\n$$\\bar{x}(s) = x(s) + \\frac{ie^{i\\theta(s)}}{\\kappa(s)}$$\nPlugging in the Euler spiral, we can thus easily obtain the derivative of the evolute with respect to the s parameter.\n$$\n\\begin{align}\n\\bar{x}'(s) &= x'(s) + \\frac{i^2asx'(s)}{as} - i\\frac{x'(s)}{as^2} \\\\\n&= -i\\frac{x'(s)}{as^2}\n\\end{align}\n$$\nProceeding, we'll get the arc length (using s, arc length along original Euler spiral, as a parameter), and also obtain a second derivative for use in calculating the curvature.\n$$\\bar{s}'(s) = |x'(s)| = \\frac{1}{as^2}$$\n$$\\bar{s}(s) = -\\frac{1}{as}$$\nA note: the formula for arc length follows readily from a well-known result in differential geometry, as cited in the Stoer paper (the bottom of page 322).\nHowever, given that we already have the derivatives for the purpose of computing curvature, it's maybe easier to just derive than rely on a cited method.\n$$\\bar{x}''(s) = \\frac{x'(s)}{s} + 2i\\frac{x'(s)}{as^3}$$\nWhen computing the cross-product for the standard curvature formula, the second term above drops out because it's in the same direction as the first derivative, while the first is orthogonal.\n$$\n\\begin{align}\n\\bar{\\kappa}(s) &= \\frac{\\bar{x}'' \\times \\bar{x}'}{|\\bar{x}'|^3} \\\\\n&= \\frac{1}{as^3} / \\frac{1}{a^3 s^6} \\\\\n&= a^2 s^3\n\\end{align}\n$$\nAnd then this gives the Cesàro equation for the evolute in terms of its own arc length:\n$$\\bar{\\kappa}(\\bar{s}) = -\\frac{1}{a\\bar{s}^3}$$\nGeneral evolute of log-aesthetic curves\nThe family of curves in which curvature is a power of the arc length is called \"log-aesthetic curves,\" and there is a small industry of papers on this curve family.\nThis family is closed under evolute, see Yoshida & Saito 2012 for the result.\nThus, the formula derived in this page is an instance of the general result, and is also shown in Figure 3(c) of the above cite.\nIn general, the evolute of the curve defined by $\\kappa(s) = s^\\gamma$ is another curve with $\\kappa(s) = s^{-\\frac{1 + 2\\gamma}{\\gamma}}$.\n(There may be a uniform scaling factor; someone should go over the math in detail)\nSubdivision density\nFollowing the derivation for the parallel curve of the Euler spiral, the subdivision density for flattening to lines of a curve with respect to the source curve parameter s is given by this formula:\n$$\\rho(s) = \\sqrt{0.125|\\bar{\\kappa}(s)|}\\frac{d\\bar{s}}{ds}$$\nPlugging in the formulae above and simplifying, we get:\n$$\\rho(s) = \\sqrt{\\frac{1}{8s}}$$\nAnd to do subdivision, we need the integral of this (and its inverse):\n$$\\int_0^t\\rho(s)dt= \\sqrt{\\frac{t}{2}}$$\nThus, finding the subdivision points for near-optimal flattening of an Euler spiral evolute is even simpler than the flattening of the Euler spiral itself, much less the parallel curve of an Euler spiral.\nReferences\n\nCurve Fitting with Clothoidal Splines, Josef Stoer, 1982\nConverting stroked primitives to filled primitives, Diego Nehab, 2020\nThe Evolutes of Log-Aesthetic Planar Curves and the Drawable Boundaries of the Curve Segments, N. Yoshida & T. Saito, 2012\n\n","id":"https://linebender.org/wiki/curves/euler-spiral-evolute/","title":"Evolute of the Euler spiral"},"https://linebender.org/wiki/formatting-scheme/":{"body":"Copyright\nCode files should start with a copypright notice composed of two comments following this format:\n\nThe year should be the file's creation year.\n\"XXXX\" should be the project's name.\nThe license depends on the project and the file type, but is usually \"either Apache 2.0 or MIT License, whichever is least restrictive\".\nShaders are usually licensed under the former two licenses OR the Unlicense.\nRust\nMost Linebender projects files are written in Rust.\nFor those files, the formatting produced by rustfmt is required.\nMarkdown\nIn Markdown files, every paragraph should have one line per sentence.\nThis makes git diff easier to read.\n[1] [2]\n","id":"https://linebender.org/wiki/formatting-scheme/","title":"Formatting scheme for Linebender projects"},"https://linebender.org/wiki/gpu/":{"body":"This wiki subdirectory holds resources for GPU programming techniques, especially compute shaders.\n","id":"https://linebender.org/wiki/gpu/","title":"GPU resources"},"https://linebender.org/wiki/gpu/mesh-shaders/":{"body":"Mesh shaders are a compute-centric approach to producing geometry for rasterization.\nThey are significantly more powerful than the traditional vertex shader approach, and also simpler than the complex zoo of shader types (hull, domain, tessellation, geometry) that were originally proposed to overcome the limitations of simple vertex shading.\nThey were originally introduced by Nvidia in 2018 in the Turing microarchitecture.\nIn Vulkan, the capability was originally an Nvidia-specific extension, but is now the cross-platform VK_EXT_mesh_shader extension.\nAs of early 2024, representative lower-bound cards include GTX 1650, AMD Radeon RX 6400 (RDNA 2), and Intel Arc A370.\nIt is added to Metal 3 (2022) and hardware support is new in M3 and A17 (though the example project will run on M1 and A14).\nThe feature is present in DirectX 12 Ultimate, released in 2020.\nIt is not yet available in WebGPU (gpuweb#3015 is the feature request).\nMesh shaders are a fusion of compute and traditional rasterization.\nThey bring three new capabilities to the compute side, and of course the ability to drive the rasterization pipeline.\nThe three new compute-only capabilities are:\n\nAbility to spawn variable amounts of work\nCommunication through two shader stages through a queue\nOrdering of elements processed through the shader stages\n\nThese are potentially of interest even with rasterization disabled.\nMainstream usage includes generating primitives (usually triangles) from the second stage.\nThese are then rasterized (in hardware) and shaded using fragment shaders in exactly the same way as the traditional vertex/fragment pipeline.\nThe main motivation for mesh shaders is improving the efficiency and flexibility of traditional 3D rasterization, most prominently culling of larger chunks of unneeded geometry, dynamic level-of-detail (LOD) selection, and procedural generation of geometry.\nThese uses build on the use of compute shaders for these tasks, advocated in Graham Wihlidal's GDC 2016 talk, Optimizing the Graphics Pipeline with Compute.\nMesh shaders have a number of advantages over using a compute shader to fill a vertex buffer: you don't have to allocate the intermediate vertex buffer (which can fail if the size is not estimated correctly), there's less traffic to device memory as the queues mostly live in shared memory, and there's no pipeline barrier between the compute and rasterization stages.\nBasic computational model\nThere are two stages, but the first stage is optional.\nFollowing the GPU ecosystem tradition of diversity of terminology, the first stage is called a \"task shader\" in Vulkan, an \"amplification shader\" in DirectX, and an \"object shader\" in Metal.\nThe second stage is called a mesh shader.\nThe first stage is dispatched like a compute shader.\nThere is an output user-defined \"payload\" structure (analogous to the interface between vertex and fragment shaders, but can be larger; on DirectX 12 and Metal the limit is 16k), and then each workgroup dispatches a variable number of workgroups of the mesh shader.\nThat number can be zero.\nOn Metal, it is limited to 1024 workgroups.\nThe second stage (the mesh shader) accepts the input from the task shader, and can also access the index of the parent task shader workgroup that spawned it.\nThere are two arrays in workgroup shared memory, one for vertices, the other for vertex indices for primitives.\nOn output, the vertex and primitive counts are set, up to the maximum allocation of the arrays.\nNvidia recommends 64 vertices and 126 primitives, though (as is typical in the GPU ecosystem) the exact limits vary.\nOn Metal, the limits are 256 vertices and 512 primitives.\nThe primitive is usually a triangle, but all implementations support lines, and Vulkan and Metal support points as well.\nFor triangles, there are 3 vertex indices per primitive.\nThere is a per-vertex user defined struct (essentially the same as the output of a vertex shader) and also a new per-primitive user-defined struct.\nExecution model\nOn Nvidia, there is a strong forward progress guarantee, and the workgroups of a mesh shader are launched in order.\nThus, doing a single-pass scan inside the mesh shader is viable (source: launch ordering is discussed at 24:18 and the single-pass scan is at 43:59 of the Turing Mesh Shaders video).\nTODO: find out ordering guarantees on other hardware.\nPresumably it's weak on Apple.\nPerformance\nThe Vulkan blog warns that portability in performance across hardware is difficult.\nThe Mesh shaders: Optimization and best practices page from AMD contains recommendations and quantitative measurements of how to tune mesh shader usage.\nIn addition, Timur's blog post How mesh shaders are implemented in an AMD driver gives insight into their implementation (at least on AMD).\nResources\nThese are authoritative references and particularly helpful documents to explain mesh shaders.\n\nIntroduction to Turing Mesh Shaders from Nvidia\n\nTuring Mesh Shaders at Siggraph 2018 (video)\n\n\nMesh Shading for Vulkan, Khronos blog\nReinventing the Geometry Pipeline: Mesh Shaders in DirectX 12 (video)\nTransform your geometry with Metal mesh shaders, WWDC 2022 (video)\nDirectX Mesh Shader spec\n\n","id":"https://linebender.org/wiki/gpu/mesh-shaders/","title":"Mesh shaders"},"https://linebender.org/wiki/gpu/sorting/":{"body":"Many rendering algorithms (including a proposed sparse strip technique for path rendering, and also Gaussian Splatting) rely on sorting.\nBecause the GPU has a different architecture to the CPU, programs running on the GPU have different performance characteristics, and this changes which sorting algorithms are optimal for a particular context.\nIn particular, sorting algorithms that exploit parallelism tend to be more suited to the GPU.\nThe literature on parallel sorting algorithms is extremely well developed, and there are many excellent implementations for CUDA.\nIn WebGPU, the situation is still evolving.\nThis page has pointers to the potentially useful resources for understanding existing implementations and developing new ones.\nClasses of sorting algorithms\nThe most promising sorting algorithms for GPU are merge sort and radix sort.\nWithin radix sort there are further distinctions, most notably least significant digit (LSD) vs most significant digit.\nKey size and segmentation\nGPU sorting works best when the key is small and fixed-size.\nFor many rendering applications, this is a reasonable assumption.\nIn some cases (especially path rendering), a segmented sort may be a better choice than one that sorts the entire buffer.\nAn especially good writeup is segmented sort from Modern GPU, which builds on their mergesort.\nLSD implementations\nThe LSD sort algorithm with the strongest claims to being fastest is Onesweep.\nThis has an authoritative implementation in CUB, for which a good starting point is agent_radix_sort_onesweep.\nA very popular sorting algorithm in gamedev circles is FidelityFX sort from AMD, for which the original source is HLSL.\nThis is has enough similarity to Onesweep that it is worth considering the differences.\n\nOnesweep uses a single pass scan for the digit histograms, while FidelityFX uses a traditional multi-dispatch tree reduction approach.\nOnesweep uses 8 bit digits (so 4 passes for a 32 bit key), while FidelityFX uses 4.\nOnesweep uses warp-level multi-split for ranking, while FidelityFX uses two 2-bit LSD passes.\n\nBoth original code bases use subgroups extensively.\nThe FidelityFX implementation works with a subgroup size of 16 or greater, and will produce incorrect results if deployed for a smaller subgroup size.\nOnesweep depends on a hardcoded subgroup (warp) size of 32 and is difficult to make portable to GPUs with other subgroup sizes.\nWebGPU experiment\nRaph did an experiment of a hybrid algorithm largely based on FidelityFX, but adapted to WebGPU, and with a version of warp-level multi-split.\nIt achieves approximately 1G elements/s on M1 Max.\nFor radix sorts, element/s on large arrays (16M elements) is meaningful, as the algorithm scales linearly with the array size and is usually insensitive to the distribution of keys.\nLike FidelityFX, it uses 4 bit digits and a tree reduction approach to histogram scan.\nIt's also basically patterned after FidelityFX in the structure of dispatches.\nBecause WebGPU doesn't have subgroups (yet), the warp-level multi-split algorithm fakes it using workgroup shared memory.\nThe terms \"warp\" and \"lane\" are borrowed from CUDA but in this case represent a more or less arbitrary partitioning.\nA \"warp\" size of 16 was found to outperform 32, which is not surprising because the fake \"ballot\" operation to determine which neighbors in the warp hold the same key does linear iteration proportional to warp size.\nRaph has also done experiments (code not yet published) porting this to Metal and using actual subgroup ballot operations.\nThat results in ~3G el/s, though some of the speedup is vanilla wgpu inefficiency.\nAlso note that to implement this algorithm correctly requires a subgroup barrier (simdgroup_barrier in Metal Shading Language), and that this primitive is not in the WebGPU subgroup proposal (see gpuweb#4437).\nHowever, on M1 Max, placing a stronger threadgroup barrier is only a 2% slowdown, so this matter is not urgent.\nAttempts to push this experiment to 8 bits per digit have not yet yielded sustainable performance improvement.\nSeveral people have pointed out the Onesweep inspired sort from Lichtso, part of the splatter Gaussian Splat implementation.\nHowever, as discussed in splatter#2, it is an approximate sort only, and may rely on luck that the particular GPU will process atomics within a subgroup in order.\nIn addition, because it is one-pass, on GPUs without a forward progress guarantee (of which Apple Silicon is especially noticeable), the algorithm may deadlock or experience extended stalls.\nThe experiment mentioned above has neither of these shortcomings.\nNote that it does achieve 8 bits per pass; it is entirely likely that a high performance implementation could draw inspiration from it, more so after subgroups land in WebGPU and thus real warp-level multi-split is possible.\nDeviceRadixSort\nAras Pranckevičius has been doing lots of experiments with sorting in his UnityGaussianSplatting implementation, all written in the Unity flavor of HLSL.\nUnityGaussianSplatting#82 adds something called DeviceRadixSort which shows a modest performance improvement (the discussion thread also speaks to the difficulty of implementing such things portably).\nIt uses 8 bit digits, and a subgroup implementation of warp-local multi-split.\nThis implementation is attempting to be portable to a range of subgroup sizes, but is untested on wave sizes other than 32 and is still under development.\nThe author, Thomas Smith, has done experiments comparing reduce-then-scan against a chained single-pass approach for the global histogram scan, which suggest that the latter has approximately a 10% performance gain on Nvidia hardware, but pose considerable challenges for portability.\nSingle-pass approaches will not perform well on devices without a forward progress guarantee.\nHybrid Radix Sort\nHybrid Radix sort is another strong contender, fundamentally based on an MSD approach but with additional mechanisms to reduce memory bandwidth.\nIt has better performance in some cases than Onesweep.\nLike Onesweep, it manages 8 bits per pass.\nThat said, it is considerably more complicated, and it's also not clear how easily it would translate to WebGPU.\nMerge sort\nModern GPU has a well documented mergesort, also readily adapted to segmented sort.\nIt is older, and performance numbers from newer papers suggest that it has been surpassed.\nThat said, the segmented sort capability may be valuable.\nForma has a sorting implementation called conveyor_sort.\nThis is a merge sort and is in vanilla WebGPU.\nPerformance has not been characterized yet.\nBitonic sort\nBitonic sort is often proposed as it is conceptually fairly simple and the parallelism is easy to exploit, but when applied to large problems it is clear that the number of passes is unacceptably large; typically in the dozens where a radix sort would have 4 or 8.\nDiscussion\nThere is active discussion of this issue in the Sorting revisited Zulip thread.\nResources and measurements from implementations can be discussed there, then hopefully added to this wiki page.\n","id":"https://linebender.org/wiki/gpu/sorting/","title":"Sorting"},"https://linebender.org/wiki/long-term-roadmap/":{"body":"Unstructured notes from the RustNL roadmap brainstorming that were left out of the May-July roadmap blog post.\nThis may become a living document, eg a long-term roadmap for the project. For now it's the post-July roadmap.\nVello\n\nEmoji\nImage filters / blur / shadows\n\nRender graph (Raph to drive, see thread)\n\n\nGpu embedding / wgpu engine abstraction (see Servo thread)\nGlyph caching\n\nRender graph? \nor CPU side? \n(sparse strips probably)\n\n\nFrame pacing\nDamage regions\n\nMVP: just render sub-rects\n\n\nCPU impl\n\nTesting\nDownlevel\n\n\nFuzzing?\n\nMasonry\n\n‘Compositing’\nFrame pacing (relevant to Vello and AccessKit)\nDamage regions\nStyling options\nCopy features from Tomorrow Corporation Tech Demo\n\nParley\n\nIME support\n\nSuggestion regions?\n\n\nSplit out blob & other vocabulary types\n\nBlob may be prioritized by other project needs\n\n\n\nXilem\n\nAndroid\n\nMaterial UI style widgets/views? Requires styling\n\n\nStyling\nHot reloading\nAsync behavior in Masonry widgets (image loading etc)\nCleanup run for issues and PRs\n\nAccessKit\n\n\nHaven’t talked about it a lot\n\nImprove documentation (see #402)\nPoint to / create a repository of accessibility best practices.\nNot just code, also social: Have people with disabilities test your stuff!\nPoint to resources, forums, etc? Need to talk to Matt about this. (What were the best practices at Microsoft?)\nAccessibility isn’t just screen readers. Also color contrast, customizing size, IME support, motor disabilities (avoid stuff that requires simultaneous input).\n\n\n\n“Accessibility is more than adding a dependency to AccessKit”\n\n(Olivier: Note to self: include GMTK video about Celeste Assist Mode)\n\n\n\nAndroid specific work\n\nNeed to prioritize Android\n\nMasonry:\n\nHot state for pointer pressed?\nGesture recognition (scrolling) P3\n\nThere is a dumb solution for scrolling without momentum\nPotentially adapt code from egui (used in vello demo)\n\n\nPencil gestures\nMultitouch\nIME\n\nLanding the Lucas Meurer winit PR P1\nExtend winit IME PR for richer functionality\nReview glazier IME API & come up with design proposal P3 (aaron)\nPlumbing suggestion spans etc (winit)\n\n\nAccessibility (matt, jul 1+) P-1\nStudy Tao\nTo what extent do we tap into Android View etc\n\n\nwinit future\n\nshort term plan: PR functionality into winit\nlook for natural extension points\n\nthese will be platform-specific\nMac: subclassing the NSView/NSApplication subclasses\nwayland: messy / smithay has message dispatcher\nAndroid: do we subclass View/Application/Activity? raph will investigate P1\n\nAccessibility (matt, jul 1+)\nCan we access accessibility from native-activity / game-activity?\nNote: React Native requires writing Java-land activity\nWhat minimum platform version?\n\n\n\n\n\n\nLook at Makepad’s implementation (momentum scrolling etc)\n\n\n\n","id":"https://linebender.org/wiki/long-term-roadmap/","title":"Post-July Linebender roadmap"},"https://linebender.org/wiki/office-hours/":{"body":"Linebender holds weekly office hours, open to anyone interested in following the project. The best place to find more information is the #office-hours stream on the Zulip chat. The invite is also available through Google Calendar.\nA Google drive folder holds the archives of the notes.\n","id":"https://linebender.org/wiki/office-hours/","title":"Office hours"},"https://linebender.org/wiki/text/":{"body":"Storing, editing and displaying text is hard. As a newcomer to the world of text, I faced almost unfathomable complexity. The aim of this page is to compartmentalize the different aspects of text, to make the complexity as manageable as possible.\nOverview\nHistory\nAlthough not strictly necessary to understand text rendering, a brief understanding of how words have been recorded over the millennia helps to explain some of the confusing names and conventions of modern typesetting.\n\nWritten text/calligraphy\nThe movable-type printing press (Gutenberg 1440)\n\nBrief description of the process of casting type in a foundry, compositing with composing sticks, fixing in a forme with furniture and printing. Sorts (em en quad) Perhaps justification.\nfi, fl, ffi, ffl ligatures (nice introduction to the fact there isn't a 1-1 correspondence between characters and glyphs)\n\n\nDistinction between font (specific set of type, with a weight, size, etc) and typeface (family of fonts)\n\nNon-latin typefaces and letterpress printing\n\n\nHot metal typesetting\nCRT displays - an alternative to paper\nRaster image processors, dots, PostScript, DPI?\n\nText data\nThe usual suspects:\n\nASCII\nUnicode\n\nGraphemes, grapheme clusters, normalization, segmentation: all that good stuff\n\nin particular, things like sentence break, soft line break, hard line break, character classes\nRTL, Bidi\n\n\nUTF-{8, 16, 32}\n\nin particular, UTF-16 surrogates, BOM\n\n\n\nFonts\n\nFonts vs. typefaces\nClasses of typefaces (monotype, italic, ...)\nComputer representations of fonts. Bitmap/truetype/opentype (raster vs vector)\nSystem default fonts, font fallback chains, locations of fonts on windows/mac/linux\nModern opentype tables for things like font color, variable fonts\nEmojis 😊\nem quadrat (width of 'M'), en quadrat\n\nShaping\nShaping is essentially characters -> glyphs\n\nLatin is almost 1-1 (apart from ligatures, other things?)\nDevanagari/Arabic/Hebrew (also RTL)\n\nLayout\n\nLine breaks\nPage breaks & layout when you have pages (e.g. not on the web)\nOften backwards-and-forwards between layout and shaping - try different shaping runs and see how much room they take up, ...\nText layout data structures\n\nLayout is expensive, so if the text doesn't change you probably want to compute the layout and store it.\n\n\n\nRendering\n\nBitmap vs\nLink to curves page\n\nLocalization\nAlthough not strictly a part of text rendering, it is also worth mentioning localization alongside the other sections, many of which also deal implicitly with localization themselves. Here we cover some topics in localization that are not explicitly mentioned elsewhere.\n\nDates\nNumbers\n\nMisc\nTODO find a suitable section for these topics\n\nIME\n\n","id":"https://linebender.org/wiki/text/","title":"Text"}},"docInfo":{"https://linebender.org/":{"body":569,"title":1},"https://linebender.org/about/":{"body":149,"title":0},"https://linebender.org/blog/":{"body":2,"title":1},"https://linebender.org/blog/doc-include/":{"body":460,"title":5},"https://linebender.org/blog/roadmap-may-2024-retro/":{"body":963,"title":3},"https://linebender.org/blog/roadmap-may-2024/":{"body":1222,"title":3},"https://linebender.org/blog/rustnl-2024-unconference/":{"body":1199,"title":4},"https://linebender.org/blog/tmil-09/":{"body":269,"title":4},"https://linebender.org/blog/tmix-01/":{"body":164,"title":4},"https://linebender.org/blog/tmix-02/":{"body":184,"title":4},"https://linebender.org/blog/tmix-03/":{"body":155,"title":4},"https://linebender.org/blog/tmix-04/":{"body":178,"title":4},"https://linebender.org/blog/tmix-05/":{"body":135,"title":3},"https://linebender.org/blog/tmix-06/":{"body":239,"title":4},"https://linebender.org/blog/tmix-07/":{"body":355,"title":4},"https://linebender.org/blog/tmix-08/":{"body":438,"title":4},"https://linebender.org/blog/tmix-10/":{"body":748,"title":5},"https://linebender.org/blog/xilem-2024/":{"body":1328,"title":3},"https://linebender.org/blog/xilem-backend-roadmap/":{"body":1866,"title":4},"https://linebender.org/contributor-guidelines/":{"body":427,"title":3},"https://linebender.org/wiki/":{"body":38,"title":1},"https://linebender.org/wiki/canonical-lints/":{"body":83,"title":5},"https://linebender.org/wiki/capitalization-scheme/":{"body":67,"title":4},"https://linebender.org/wiki/cubic-robustness/":{"body":598,"title":3},"https://linebender.org/wiki/curve-families/":{"body":863,"title":2},"https://linebender.org/wiki/curve-offset/":{"body":32,"title":3},"https://linebender.org/wiki/curves/":{"body":2,"title":1},"https://linebender.org/wiki/curves/euler-spiral-evolute/":{"body":376,"title":3},"https://linebender.org/wiki/formatting-scheme/":{"body":65,"title":4},"https://linebender.org/wiki/gpu/":{"body":10,"title":2},"https://linebender.org/wiki/gpu/mesh-shaders/":{"body":513,"title":2},"https://linebender.org/wiki/gpu/sorting/":{"body":665,"title":1},"https://linebender.org/wiki/long-term-roadmap/":{"body":309,"title":4},"https://linebender.org/wiki/office-hours/":{"body":31,"title":2},"https://linebender.org/wiki/text/":{"body":279,"title":1}},"length":35},"lang":"English"} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..49891c2 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,124 @@ + + + + https://linebender.org/ + + + https://linebender.org/about/ + + + https://linebender.org/blog/ + + + https://linebender.org/blog/doc-include/ + 2024-06-28 + + + https://linebender.org/blog/roadmap-may-2024-retro/ + 2024-08-24 + + + https://linebender.org/blog/roadmap-may-2024/ + 2024-06-17 + + + https://linebender.org/blog/rustnl-2024-unconference/ + 2024-06-15 + + + https://linebender.org/blog/tmil-09/ + 2024-10-15 + + + https://linebender.org/blog/tmix-01/ + 2024-02-06T07:28:42 + + + https://linebender.org/blog/tmix-02/ + 2024-03-04T07:34:42 + + + https://linebender.org/blog/tmix-03/ + 2024-04-04 + + + https://linebender.org/blog/tmix-04/ + 2024-05-01 + + + https://linebender.org/blog/tmix-05/ + 2024-06-12 + + + https://linebender.org/blog/tmix-06/ + 2024-07-03 + + + https://linebender.org/blog/tmix-07/ + 2024-08-08 + + + https://linebender.org/blog/tmix-08/ + 2024-09-11 + + + https://linebender.org/blog/tmix-10/ + 2024-11-04 + + + https://linebender.org/blog/xilem-2024/ + 2024-01-10T07:34:42 + + + https://linebender.org/blog/xilem-backend-roadmap/ + 2024-01-19T13:00:00 + + + https://linebender.org/contributor-guidelines/ + + + https://linebender.org/wiki/ + + + https://linebender.org/wiki/canonical-lints/ + + + https://linebender.org/wiki/capitalization-scheme/ + + + https://linebender.org/wiki/cubic-robustness/ + + + https://linebender.org/wiki/curve-families/ + + + https://linebender.org/wiki/curve-offset/ + + + https://linebender.org/wiki/curves/ + + + https://linebender.org/wiki/curves/euler-spiral-evolute/ + + + https://linebender.org/wiki/formatting-scheme/ + + + https://linebender.org/wiki/gpu/ + + + https://linebender.org/wiki/gpu/mesh-shaders/ + + + https://linebender.org/wiki/gpu/sorting/ + + + https://linebender.org/wiki/long-term-roadmap/ + + + https://linebender.org/wiki/office-hours/ + + + https://linebender.org/wiki/text/ + + diff --git a/wiki/canonical-lints/index.html b/wiki/canonical-lints/index.html new file mode 100644 index 0000000..367075f --- /dev/null +++ b/wiki/canonical-lints/index.html @@ -0,0 +1,173 @@ + + + + + + + + Canonical lint set for Linebender projects - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Canonical lint set for Linebender projects

+

All Linebender projects should include the following set of lints in their Cargo.toml:

+
[lints]
+# This one may vary depending on the project.
+rust.unsafe_code = "forbid"
+
+# LINEBENDER LINT SET - v1
+# See https://linebender.org/wiki/canonical-lints/
+rust.keyword_idents_2024 = "forbid"
+rust.non_ascii_idents = "forbid"
+rust.non_local_definitions = "forbid"
+rust.unsafe_op_in_unsafe_fn = "forbid"
+
+rust.elided_lifetimes_in_paths = "warn"
+rust.let_underscore_drop = "warn"
+rust.missing_debug_implementations = "warn"
+rust.missing_docs = "warn"
+rust.single_use_lifetimes = "warn"
+rust.trivial_numeric_casts = "warn"
+rust.unexpected_cfgs = "warn"
+rust.unit_bindings = "warn"
+rust.unnameable_types = "warn"
+rust.unreachable_pub = "warn"
+rust.unused_import_braces = "warn"
+rust.unused_lifetimes = "warn"
+rust.unused_macro_rules = "warn"
+rust.unused_qualifications = "warn"
+rust.variant_size_differences = "warn"
+
+clippy.allow_attributes = "warn"
+clippy.allow_attributes_without_reason = "warn"
+clippy.cast_possible_truncation = "warn"
+clippy.collection_is_never_read = "warn"
+clippy.dbg_macro = "warn"
+clippy.debug_assert_with_mut_call = "warn"
+clippy.doc_markdown = "warn"
+clippy.exhaustive_enums = "warn"
+clippy.fn_to_numeric_cast_any = "forbid"
+clippy.infinite_loop = "warn"
+clippy.large_include_file = "warn"
+clippy.large_stack_arrays = "warn"
+clippy.match_same_arms = "warn"
+clippy.mismatching_type_param_order = "warn"
+clippy.missing_assert_message = "warn"
+clippy.missing_errors_doc = "warn"
+clippy.missing_fields_in_debug = "warn"
+clippy.missing_panics_doc = "warn"
+clippy.partial_pub_fields = "warn"
+clippy.return_self_not_must_use = "warn"
+clippy.same_functions_in_if_condition = "warn"
+clippy.semicolon_if_nothing_returned = "warn"
+clippy.shadow_unrelated = "warn"
+clippy.should_panic_without_expect = "warn"
+clippy.todo = "warn"
+clippy.unseparated_literal_suffix = "warn"
+clippy.use_self = "warn"
+clippy.wildcard_imports = "warn"
+
+clippy.cargo_common_metadata = "warn"
+clippy.negative_feature_names = "warn"
+clippy.redundant_feature_names = "warn"
+clippy.wildcard_dependencies = "warn"
+# END LINEBENDER LINT SET
+
+

And in their lib.rs:

+
// LINEBENDER LINT SET - v1
+// See https://linebender.org/wiki/canonical-lints/
+// These lints aren't included in Cargo.toml because they
+// shouldn't apply to examples and tests
+#![warn(unused_crate_dependencies)]
+#![warn(clippy::print_stdout, clippy::print_stderr)]
+
+

This is a curated list: Clippy has a lot of lints, and most of them are not included above.

+

You may occasionally want to run cargo clippy with clippy::pedantic on your codebase, which will cast a very wide nets and catch a lot of very minor issues. +The lint set above focuses on problems that either impact correctness or tend to snowball over time.

+

The list above should be considered canonical. +If you think a new lint should be added to Linebender projects, add it to this file in alphabetical order, then copy-paste the list across projects.

+

To keep this process simple, avoid modifying this list in individual projects. +If you want to add other per-project lints, add them above the list. +If you want to remove a lint, #![allow] or #![expect] it at the crate root.

+ + +
+
+ + + diff --git a/wiki/capitalization-scheme/index.html b/wiki/capitalization-scheme/index.html new file mode 100644 index 0000000..3bb21b6 --- /dev/null +++ b/wiki/capitalization-scheme/index.html @@ -0,0 +1,103 @@ + + + + + + + + Capitalization scheme for Linebender projects - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Capitalization scheme for Linebender projects

+

All Linebender projects should follow this capitalization scheme:

+
    +
  • The project's name should start with an uppercase letter when referring to the project itself, eg Vello.
  • +
  • The name should be all-lowercase where referring to the project as a Rust crate (for instance, in relation to crates.io). +In that case, it's encouraged to use backticks to put the project name in a codeblock, eg vello.
  • +
  • The name should be all-lowercase where referring to the project as a Github repository. +In that case, it's encouraged to either use backticks or make it a link, eg vello#1.
  • +
+

Feel free to correct any documentation you see to follow this scheme, unless the project is explicitly discontinued or in maintenance mode (eg Xi-Editor, Piet).

+ + +
+
+ + + diff --git a/wiki/cubic-robustness/index.html b/wiki/cubic-robustness/index.html new file mode 100644 index 0000000..6f7d5bb --- /dev/null +++ b/wiki/cubic-robustness/index.html @@ -0,0 +1,134 @@ + + + + + + + + Cubic Bézier robustness - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Cubic Bézier robustness

+

Cubic Béziers have a clean and simple definition as a parametric curve (the coordinates are a cubic polynomial in the parameter), but they can also exhibit cusps and other degenerate behavior, which makes numerically robust algorithms challenging in some cases, especially stroking. Cusps and near-cusps also reduce the accuracy of numerical integration techniques for computing arc lengths.

+

At heart, the robustness problems are caused by the derivative of the curve becoming or nearing zero. In the latter case, the curve is not regular, which among other things means it may not be G1 continuous, even though the curve segment itself is C∞. Freya Holmér's Continuity of Splines video does an excellent job explaining that distinction.

+

This page will discuss techniques for detecting and mitigating these robustness issues.

+

Three cases

+

It's useful to consider three different cases, as they have different consequences for mitigation. Roughly in order from easiest to hardest, they are coincident control points, simple cusp, and colinear.

+

Coincident control points

+

This case has a control point coincident (or nearly so) with an endpoint. It is extremely easy to detect.

+

The tangent vector is well defined at the endpoint, thanks to L'Hopital's rule; it is equal to the vector from the control point to the other control point.

+

A good mitigation is to displace the control point slightly in the direction of the other control point. This has a minimal impact on the shape,

+

Illustration of cubic Bézier with coincident endpoint

+

Simple cusp

+

The simple cusp is in some ways a generalization of the coincident control point case, but with the cusp in the interior of the curve rather than at the endpoint.

+

The classic simple cusp is a semicubical parabola, which can be represented as y = x^1.5, as well as a parametric cubic curve. All cusp cases in a cubic Bézier can be represented as as affine transformations of this curve. There is always a single cusp.

+

Detection is in two parts. First, this case can only occur when the control polygon is self-intersecting, which can be readily computed as alternating signs of cross-products. This is rare in non-adversarial inputs. Then, either a curve classification or hodograph technique can be used to detect the near-cusp, see below.

+

A reasonable mitigation is to displace the control points along the tangent lines, either making the loop bigger or the inflection points farther apart, in either cases reducing the curvature.

+

Illustration of cubic Bézier with simple cusp

+

Colinear

+

Like the previous two cases, the colinear case is characterized by a (nearly) vanishing derivative, but is different in a number of important respects. Detection is reasonably straightforward, as the control points are close to colinear (which can be evaluated numerically as very small cross products relative to the magnitude of dot products).

+

From a classification perspective, the colinear case can either an S-shaped or loop curve, subject to an extreme nonuniform scale, squashing the gentle curve into a nearly flattened form, with high curvature. Unlike the simple cusp case, there are generally two cusps.

+

A few more observations. The line is not necessarily (nearly) parallel with the chord, as the chord may be very short.

+

Mitigating this case may require a different approach than for the other cusp cases. Moving the control points along the tangent (preserving G1 continuity) may not resolve the cusp. For stroking, it is possibly best to divide the cubic at the (near) cusps and stroke each as a line, using round end caps.

+

Vector image

+

Bézier classification

+

One approach to detecting the simple cusp is Bézier classification. There's a classic paper on this, Wang 1981, which is cited by a number of later references (see relevant Stack Overflow thread).

+

The core element of the classification is x''×x', which is a quadratic polynomial. This is the numerator of the equation for curvature. A "loop" shape has no inflection points, and no real solutions of this polynomial. Thus, the discriminant (b² - 4ac) is a valid classifier. That said, choosing an epsilon value for near-cusp instances is tricky. This discriminant scales as the square of area under affine transformation, which is not particularly helpful in choosing an epsilon. For one, as the line case shows, extreme affine transformation can strongly affect the sharpness of the cusp.

+

Even so, the sign is useful for determining the mitigation; if it's a loop, then the control points should be moved farther from the endpoints to make the loop bigger (and lower in curvature), and conversely closer if it's two closely spaced inflection points.

+

Hodograph

+

Another approach is the hodograph, or analysis of the derivative of the cubic curve, which is a quadratic Bézier.

+

Determining the minimum absolute value of the derivative is equivalent to the "nearest" method, finding the point on the hodograph nearest the origin. This is a cubic solve, and exists in kurbo. That may not be the exact curvature maximum (given that the numerator also varies), but is close enough for robustness work, and calibrated in more useful units.

+

The loop/double inflection classification as stated above can also be geometrically interpreted in terms of the hodograph: whether the origin is inside or outside the concave part of the parabola, respectively. The math turns out equivalent.

+

Illustration of three near-cusp cubics with hodograph

+

Arc lengths

+

Note: this section could move to another page on arc length, with more detail. Here are just observations on cusp behavior.

+

It's been noted that Gauss-Legendre quadrature has excellent accuracy for smooth curves, scaling impressively with the degree of quadrature, but that accuracy suffers in (near) cusp conditions, or that it provokes numerical stability issues in analytical techniques. Henkel 2014 contains some experimental results, and it was also noted in the How long is that Bézier? blog post and followup. The current implementation in kurbo employs an error metric and subdivides; note from the illustrations that the near-cusp conditions (near the bottom edge of the graph) require many more subdivisions. It might be worth investigating whether explicit cusp detection, splitting at the point of maximum curvature, might require fewer subdivisions for the same accuracy, and thus be faster.

+

References

+ + + +
+
+ + + diff --git a/wiki/curve-families/index.html b/wiki/curve-families/index.html new file mode 100644 index 0000000..906037e --- /dev/null +++ b/wiki/curve-families/index.html @@ -0,0 +1,166 @@ + + + + + + + + Curve families - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Curve families

+ + + + + + + + + + + + + + +
CurveParamsSubdivAffineInflectionsSuperellipse
Line0yesyes00.5
Arc1yesno00.785
Parabola2yesyes00.833
Euler spiral2yesno10.785
Rectangular elastica2yesno1~0.8
Elastica3yesno1*0.5..~0.85
Balanced Bézier3nono20.5..0.95
Euler spiral PC3yesno10.785
Conic3yesyes00.5..1
Cubic Bézier4yesyes20.5..0.95
Spiro4yesno3TODO
Hyperbezier4yesno10.5..1
Quintic Bézier8yesyes4?0.8..0.996
+

Relationship graph

+

graph of relations

+

This graph has an arrow when one curve family fully includes the parameter space of another. A dotted line represents an approximation which is better than can be expected from scaling based on the number of parameters.

+

Properties

+

Number of parameters

+

We use the same parameter counting policy as Raph's thesis (section 2.8). The endpoints are considered to be fixed, so to use in an actual application, there is an additional transform consisting of translation, rotation, and scaling. This additional transformation is the same for all curves.

+

The number of parameters is a tradeoff. To represent an arbitrary curve, with a small number of parameters more subdivisions are needed. Increasing the number of parameters has a cost, for representing the parameter values, presenting them in a UI for humans to manipulate, and for doing computations. Generally, higher degrees of continuity requires more parameters.

+

In general, the accuracy of curve fitting scales with an exponent equal to the number of parameters plus 2. For example, fitting with a quadratic Bézier or Euler spiral has O(n^4) scaling, meaning that subdivision in half improves accuracy by a factor of 16. That said, actually achieving optimal curve fitting may be challenging; I'm

+

Closure under subdivision

+

If a curve is subdivided at an arbitrary point, will the two subdivisions also be members of the curve family?

+

Two-parameter curve families closed under subdivision are all derived by taking a segment of a fixed generating curve (section 4.1 of Raph's thesis). Thus, such families can be characterized entirely by the generating curve (parabola, Euler spiral, rectangular elastica). More or less any generating curve can work, and the properties of the generating curve (monotone curvature, periodicity, presence of an inflection point) map to the properties of the curve family. Section 4.8 of Raph's thesis explores this space somewhat.

+

Closure under affine transformation

+

When an arbitrary affine transformation is applied to a curve, is that a member of the curve family?

+

As a general pattern, Bézier curves are closed under affine, including the rational variants, but spirals and curves defined variationally are not. However, it is certainly possible to mix the two. The affine closure of Euler spirals is a potentially interesting curve family.

+

Inflections

+

An S-shaped curve has an inflection point. Some curve families only contain convex curves, while others can represent inflections. Arguably, having too many inflection points is a drawback, as it is not intuitive to control the curve.

+

Superellipses

+

Superellipse-like shapes are very important in graphic design. The ability of a curve family to approximate a superellipse varies widely. As a general principle, curves defined variationally do not easily form superellipses, those with a rational polynomial at their core can represent the entire range, and Béziers are in the middle (they're reasonably good at representing arbitrary curves, but have a limit, beyond which the curve develops unwanted additional inflections).

+

To quantify this more precisely, we define the superellipticity range of a curve family as follows. Set both endpoint tangents to π/4 (45°), so the curve covers a quarter-circle of arc. Use the curve to define one quadrant of a superellipse shape, with an extent of 1 on both x and y axes. Compute the area of the resulting quadrant. For a circle, it is π/4 (≈0.785), and for a square it is 1. As the remaining parameters are varied, what is the range of areas that can result? The range is further constrained by the curve having no inflection points (though curvature is allowed to reach zero at the endpoints) and being symmetrical, as these are visually important features of a real superellipse.

+

Note that a two parameter curve family has a single value, as there are no additional parameters to vary after the endpoint tangents are set.

+

The curves

+

Here we mostly point to a reference for the curve family. Each section could be expanded greatly, perhaps by giving the curve family its own page.

+

Line segment

+

A line segment has zero curvature. A polyline has G0 continuity only.

+

Circular arc

+

A circle has constant curvature. A circular arc is a segment of a circle.

+

In general, circular arcs can only achieve G0 continuity, though there are techniques to achieve G1 by applying additional constraints, notably biarcs.

+

They are popular in CAD, partly because they are the only widely implemented curve family in G-code.

+

Quadratic Bézier (parabola)

+

A quadratic Bézier is a segment of a parabola.

+

Quadratic Béziers are in widespread use as the curve family of TrueType fonts (and thus TrueType-flavored OpenType).

+

Euler spiral

+

An Euler spiral has curvature linear with arc length. It is extensively discussed in section 4.6 of Raph's thesis. It is an especially good choice for making a G2 continuous interpolating spline (for reasons discussed in the thesis), but a weakness is representing curves with significant curvature variation.

+

Another benefit of the Euler spiral is that its parallel curve is mathematically tractable to compute. See Cleaner parallel curves with Euler spirals.

+

Rectangular elastica

+

The minimum energy curve (MEC) is the curve minimizing the total bending energy when constrained to pass through the given control points, so is a mathematical idealization of a physical spline made out of a thin strip of flexible material. Each segment is a segment of the "rectangular elastica", which is a particular solution of the general elastica. It is extensively discussed in section 4.2 of Raph's thesis.

+

Elastica

+

The general elastica has an additional parameter, which corresponds to tension, resulting in a three-parameter curve. It has a narrow superelliptical range. In addition, it is symmetrical around the inflection point, which means it cannot model an asymmetrical S-shape. More precisely, when the endpoint tangents are anti-symmetrical, the area is zero for all values of the tension parameter. It is rarely used directly, but because of its physical importance, it is worth evaluating other curve families in their ability to accurately approximate an elastica.

+

Probably worth noting here, the SI-MEC is a two parameter curve family which is not closed under subdivision. It is analyzed in section 3.11 of Raph's thesis, with the conclusion being that the Euler spiral is superior in most cases.

+

A definitive treatment of the elastica is in chapter 3 of Raph's thesis.

+

Balanced Bézier

+

A "balanced Bézier" is work in progress to restrict the parameter space of cubic Béziers to those with a smooth parametrization. See the Sweet Béziers Zulip thread for more information.

+

It approximates circular arcs with O(n^6) accuracy.

+

Rational quadratic Bézier

+

A rational quadratic Bézier is a segment of a conic section. It is fairly widely used in CAD, less so in graphic design applications. It cannot represent an inflection point, but does have the full range of superellipticity.

+

An additional superpower is that it is closed under perspective transformation.

+

Cubic Bézier

+

A cubic Bézier is by far the most common curve representation. It can accurately represent an extremely wide range of curves, and also has a control scheme suitable for direct manipulation in a UI. See A Primer on Bézier Curves for more information.

+

Curve-fitting is challenging; no good general technique was known until Raph's [Bézier curve fitting] blog posts. In general, it requires solution of a quartic equation, and the process is discontinuous; there exist input curves extremely close to each other with very different best fits.

+

Spiro

+

The Spiro curve family was an attempt to create a tool more suitable for interactive curve editing. It is defined as the curvature being a cubic function of arc length. It is the basis of a practical G4-continuous interpolating spline, and is an excellent choice when high degrees of continuity are required. One weakness is the limited superellipticity range. It is discussed in section 7.3 of Raph's thesis, and has had some limited implementation success.

+

Hyperbezier

+

The hyperbezier is defined as $$\kappa(s) = (as+b)/(cs^2+ds+e)^2$$. There are four parameters as multiplying all five coefficients by a constant does not change the result.

+

Development of this curve family is work in progress. Two Zulip threads are Hyperbezier progress and Hyperbezier parameter mapping.

+

An earlier draft is presented in The hyperbezier pen tool and is implemented in the spline library. That draft had some weaknesses (not closed under subdivision, limited superellipticity range), so will be superseded by the new version.

+

Quintic Bézier

+

The quintic Bézier pushes the number of parameters into unmanageable territory. It is not clear that there is any practical way to achieve the theoretical O(n^10) curve fitting accuracy; from experience with cubics it is clear that it is a highly nonlinear optimization problem with many local minima. That said, it does have some uses.

+ + +
+
+ + + diff --git a/wiki/curve-offset/index.html b/wiki/curve-offset/index.html new file mode 100644 index 0000000..cf4c8bb --- /dev/null +++ b/wiki/curve-offset/index.html @@ -0,0 +1,100 @@ + + + + + + + + Curve offsetting and fitting - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Curve offsetting and fitting

+

Curve offsetting and fitting is an important foundational topic that necessary for stroking paths, in addition to +many other places. For now, I'm just posting relevant literature here. Hopefully over time, it will become a review +of the literature on this topic.

+ + + +
+
+ + + diff --git a/wiki/curves/euler-spiral-evolute/index.html b/wiki/curves/euler-spiral-evolute/index.html new file mode 100644 index 0000000..0762d17 --- /dev/null +++ b/wiki/curves/euler-spiral-evolute/index.html @@ -0,0 +1,155 @@ + + + + + + + + Evolute of the Euler spiral - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Evolute of the Euler spiral

+

The evolute of the Euler spiral has a simple representation as a Cesàro equation. +Evolutes of curves are interesting because the Nehab 2020 paper shows us that for strongly correct stroke expansion, the evolute of a curve is needed in addition to the parallel curve (see Figure 11 and related discussion). +This page contains that derivation, as well as related results on near-optimal flattening of the evolute to line segments.

+

In this image, the Euler spiral segment is in gray, and its evolute is in blue:

+ +

Image of Euler spiral and its evolute

+

We'll start with an Euler spiral defined (in Cesàro form) as follows:

+

$$\kappa(s) = as$$

+

Integrating this equation results in the Whewell form:

+

$$\theta(s) = \frac{as^2}{2}$$

+

And we have an equation for the derivative of the curve. +In this derivation, we'll fluidly mix complex numbers and 2D vectors, writing unit vector in the direction of $\theta$ as $e^{i\theta}$. +This choice, while a bit of an abuse of notation, will be very convenient when calculating derivatives.

+

$$x'(s) = e^{i\theta(s)} = e^{i\frac{as^2}{2}}$$

+

$$x''(s) = iase^{i\frac{as^2}{2}} = iasx'(s)$$

+

The evolute is defined as points offset from the source curve in the normal direction, by the radius of curvature. +Generally:

+

$$\bar{x}(s) = x(s) + \frac{ie^{i\theta(s)}}{\kappa(s)}$$

+

Plugging in the Euler spiral, we can thus easily obtain the derivative of the evolute with respect to the s parameter.

+

$$ +\begin{align} +\bar{x}'(s) &= x'(s) + \frac{i^2asx'(s)}{as} - i\frac{x'(s)}{as^2} \\ +&= -i\frac{x'(s)}{as^2} +\end{align} +$$

+

Proceeding, we'll get the arc length (using s, arc length along original Euler spiral, as a parameter), and also obtain a second derivative for use in calculating the curvature.

+

$$\bar{s}'(s) = |x'(s)| = \frac{1}{as^2}$$

+

$$\bar{s}(s) = -\frac{1}{as}$$

+

A note: the formula for arc length follows readily from a well-known result in differential geometry, as cited in the Stoer paper (the bottom of page 322). +However, given that we already have the derivatives for the purpose of computing curvature, it's maybe easier to just derive than rely on a cited method.

+

$$\bar{x}''(s) = \frac{x'(s)}{s} + 2i\frac{x'(s)}{as^3}$$

+

When computing the cross-product for the standard curvature formula, the second term above drops out because it's in the same direction as the first derivative, while the first is orthogonal.

+

$$ +\begin{align} +\bar{\kappa}(s) &= \frac{\bar{x}'' \times \bar{x}'}{|\bar{x}'|^3} \\ +&= \frac{1}{as^3} / \frac{1}{a^3 s^6} \\ +&= a^2 s^3 +\end{align} +$$

+

And then this gives the Cesàro equation for the evolute in terms of its own arc length:

+

$$\bar{\kappa}(\bar{s}) = -\frac{1}{a\bar{s}^3}$$

+

General evolute of log-aesthetic curves

+

The family of curves in which curvature is a power of the arc length is called "log-aesthetic curves," and there is a small industry of papers on this curve family. +This family is closed under evolute, see Yoshida & Saito 2012 for the result.

+

Thus, the formula derived in this page is an instance of the general result, and is also shown in Figure 3(c) of the above cite. +In general, the evolute of the curve defined by $\kappa(s) = s^\gamma$ is another curve with $\kappa(s) = s^{-\frac{1 + 2\gamma}{\gamma}}$. +(There may be a uniform scaling factor; someone should go over the math in detail)

+

Subdivision density

+

Following the derivation for the parallel curve of the Euler spiral, the subdivision density for flattening to lines of a curve with respect to the source curve parameter s is given by this formula:

+

$$\rho(s) = \sqrt{0.125|\bar{\kappa}(s)|}\frac{d\bar{s}}{ds}$$

+

Plugging in the formulae above and simplifying, we get:

+

$$\rho(s) = \sqrt{\frac{1}{8s}}$$

+

And to do subdivision, we need the integral of this (and its inverse):

+

$$\int_0^t\rho(s)dt= \sqrt{\frac{t}{2}}$$

+

Thus, finding the subdivision points for near-optimal flattening of an Euler spiral evolute is even simpler than the flattening of the Euler spiral itself, much less the parallel curve of an Euler spiral.

+

References

+ + + +
+
+ + + diff --git a/wiki/curves/index.html b/wiki/curves/index.html new file mode 100644 index 0000000..06408b3 --- /dev/null +++ b/wiki/curves/index.html @@ -0,0 +1,101 @@ + + + + + + + + | Homepage for the Linebender organization + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Curves

+

Articles about curves:

+ + + +
+
+ + + diff --git a/wiki/formatting-scheme/index.html b/wiki/formatting-scheme/index.html new file mode 100644 index 0000000..a31a173 --- /dev/null +++ b/wiki/formatting-scheme/index.html @@ -0,0 +1,110 @@ + + + + + + + + Formatting scheme for Linebender projects - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Formatting scheme for Linebender projects

+ +

Code files should start with a copypright notice composed of two comments following this format:

+
// Copyright 2024 the XXXX Authors
+// SPDX-License-Identifier: Apache-2.0 OR MIT
+
+

The year should be the file's creation year. +"XXXX" should be the project's name. +The license depends on the project and the file type, but is usually "either Apache 2.0 or MIT License, whichever is least restrictive". +Shaders are usually licensed under the former two licenses OR the Unlicense.

+

Rust

+

Most Linebender projects files are written in Rust. +For those files, the formatting produced by rustfmt is required.

+

Markdown

+

In Markdown files, every paragraph should have one line per sentence. +This makes git diff easier to read. +[1] [2]

+ + +
+
+ + + diff --git a/wiki/gpu/index.html b/wiki/gpu/index.html new file mode 100644 index 0000000..e9cf205 --- /dev/null +++ b/wiki/gpu/index.html @@ -0,0 +1,103 @@ + + + + + + + + | Homepage for the Linebender organization + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

GPU resources

+

This wiki subdirectory holds resources for GPU programming techniques, especially compute shaders.

+ + + +
+
+ + + diff --git a/wiki/gpu/mesh-shaders/index.html b/wiki/gpu/mesh-shaders/index.html new file mode 100644 index 0000000..b1f1eaa --- /dev/null +++ b/wiki/gpu/mesh-shaders/index.html @@ -0,0 +1,154 @@ + + + + + + + + Mesh shaders - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Mesh shaders

+

Mesh shaders are a compute-centric approach to producing geometry for rasterization. +They are significantly more powerful than the traditional vertex shader approach, and also simpler than the complex zoo of shader types (hull, domain, tessellation, geometry) that were originally proposed to overcome the limitations of simple vertex shading.

+

They were originally introduced by Nvidia in 2018 in the Turing microarchitecture. +In Vulkan, the capability was originally an Nvidia-specific extension, but is now the cross-platform VK_EXT_mesh_shader extension. +As of early 2024, representative lower-bound cards include GTX 1650, AMD Radeon RX 6400 (RDNA 2), and Intel Arc A370. +It is added to Metal 3 (2022) and hardware support is new in M3 and A17 (though the example project will run on M1 and A14). +The feature is present in DirectX 12 Ultimate, released in 2020. +It is not yet available in WebGPU (gpuweb#3015 is the feature request).

+

Mesh shaders are a fusion of compute and traditional rasterization. +They bring three new capabilities to the compute side, and of course the ability to drive the rasterization pipeline.

+

The three new compute-only capabilities are:

+
    +
  • Ability to spawn variable amounts of work
  • +
  • Communication through two shader stages through a queue
  • +
  • Ordering of elements processed through the shader stages
  • +
+

These are potentially of interest even with rasterization disabled. +Mainstream usage includes generating primitives (usually triangles) from the second stage. +These are then rasterized (in hardware) and shaded using fragment shaders in exactly the same way as the traditional vertex/fragment pipeline.

+

The main motivation for mesh shaders is improving the efficiency and flexibility of traditional 3D rasterization, most prominently culling of larger chunks of unneeded geometry, dynamic level-of-detail (LOD) selection, and procedural generation of geometry. +These uses build on the use of compute shaders for these tasks, advocated in Graham Wihlidal's GDC 2016 talk, Optimizing the Graphics Pipeline with Compute. +Mesh shaders have a number of advantages over using a compute shader to fill a vertex buffer: you don't have to allocate the intermediate vertex buffer (which can fail if the size is not estimated correctly), there's less traffic to device memory as the queues mostly live in shared memory, and there's no pipeline barrier between the compute and rasterization stages.

+

Basic computational model

+

There are two stages, but the first stage is optional. +Following the GPU ecosystem tradition of diversity of terminology, the first stage is called a "task shader" in Vulkan, an "amplification shader" in DirectX, and an "object shader" in Metal. +The second stage is called a mesh shader.

+

The first stage is dispatched like a compute shader. +There is an output user-defined "payload" structure (analogous to the interface between vertex and fragment shaders, but can be larger; on DirectX 12 and Metal the limit is 16k), and then each workgroup dispatches a variable number of workgroups of the mesh shader. +That number can be zero. +On Metal, it is limited to 1024 workgroups.

+

The second stage (the mesh shader) accepts the input from the task shader, and can also access the index of the parent task shader workgroup that spawned it. +There are two arrays in workgroup shared memory, one for vertices, the other for vertex indices for primitives. +On output, the vertex and primitive counts are set, up to the maximum allocation of the arrays. +Nvidia recommends 64 vertices and 126 primitives, though (as is typical in the GPU ecosystem) the exact limits vary. +On Metal, the limits are 256 vertices and 512 primitives.

+

The primitive is usually a triangle, but all implementations support lines, and Vulkan and Metal support points as well. +For triangles, there are 3 vertex indices per primitive.

+

There is a per-vertex user defined struct (essentially the same as the output of a vertex shader) and also a new per-primitive user-defined struct.

+

Execution model

+

On Nvidia, there is a strong forward progress guarantee, and the workgroups of a mesh shader are launched in order. +Thus, doing a single-pass scan inside the mesh shader is viable (source: launch ordering is discussed at 24:18 and the single-pass scan is at 43:59 of the Turing Mesh Shaders video).

+

TODO: find out ordering guarantees on other hardware. +Presumably it's weak on Apple.

+

Performance

+

The Vulkan blog warns that portability in performance across hardware is difficult.

+

The Mesh shaders: Optimization and best practices page from AMD contains recommendations and quantitative measurements of how to tune mesh shader usage. +In addition, Timur's blog post How mesh shaders are implemented in an AMD driver gives insight into their implementation (at least on AMD).

+

Resources

+

These are authoritative references and particularly helpful documents to explain mesh shaders.

+ + + +
+
+ + + diff --git a/wiki/gpu/sorting/index.html b/wiki/gpu/sorting/index.html new file mode 100644 index 0000000..d55a50e --- /dev/null +++ b/wiki/gpu/sorting/index.html @@ -0,0 +1,164 @@ + + + + + + + + Sorting - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Sorting

+

Many rendering algorithms (including a proposed sparse strip technique for path rendering, and also Gaussian Splatting) rely on sorting. +Because the GPU has a different architecture to the CPU, programs running on the GPU have different performance characteristics, and this changes which sorting algorithms are optimal for a particular context. +In particular, sorting algorithms that exploit parallelism tend to be more suited to the GPU. +The literature on parallel sorting algorithms is extremely well developed, and there are many excellent implementations for CUDA. +In WebGPU, the situation is still evolving. +This page has pointers to the potentially useful resources for understanding existing implementations and developing new ones.

+

Classes of sorting algorithms

+

The most promising sorting algorithms for GPU are merge sort and radix sort. +Within radix sort there are further distinctions, most notably least significant digit (LSD) vs most significant digit.

+

Key size and segmentation

+

GPU sorting works best when the key is small and fixed-size. +For many rendering applications, this is a reasonable assumption.

+

In some cases (especially path rendering), a segmented sort may be a better choice than one that sorts the entire buffer. +An especially good writeup is segmented sort from Modern GPU, which builds on their mergesort.

+

LSD implementations

+

The LSD sort algorithm with the strongest claims to being fastest is Onesweep. +This has an authoritative implementation in CUB, for which a good starting point is agent_radix_sort_onesweep.

+

A very popular sorting algorithm in gamedev circles is FidelityFX sort from AMD, for which the original source is HLSL. +This is has enough similarity to Onesweep that it is worth considering the differences.

+
    +
  • Onesweep uses a single pass scan for the digit histograms, while FidelityFX uses a traditional multi-dispatch tree reduction approach.
  • +
  • Onesweep uses 8 bit digits (so 4 passes for a 32 bit key), while FidelityFX uses 4.
  • +
  • Onesweep uses warp-level multi-split for ranking, while FidelityFX uses two 2-bit LSD passes.
  • +
+

Both original code bases use subgroups extensively. +The FidelityFX implementation works with a subgroup size of 16 or greater, and will produce incorrect results if deployed for a smaller subgroup size. +Onesweep depends on a hardcoded subgroup (warp) size of 32 and is difficult to make portable to GPUs with other subgroup sizes.

+

WebGPU experiment

+

Raph did an experiment of a hybrid algorithm largely based on FidelityFX, but adapted to WebGPU, and with a version of warp-level multi-split. +It achieves approximately 1G elements/s on M1 Max. +For radix sorts, element/s on large arrays (16M elements) is meaningful, as the algorithm scales linearly with the array size and is usually insensitive to the distribution of keys.

+

Like FidelityFX, it uses 4 bit digits and a tree reduction approach to histogram scan. +It's also basically patterned after FidelityFX in the structure of dispatches.

+

Because WebGPU doesn't have subgroups (yet), the warp-level multi-split algorithm fakes it using workgroup shared memory. +The terms "warp" and "lane" are borrowed from CUDA but in this case represent a more or less arbitrary partitioning. +A "warp" size of 16 was found to outperform 32, which is not surprising because the fake "ballot" operation to determine which neighbors in the warp hold the same key does linear iteration proportional to warp size.

+

Raph has also done experiments (code not yet published) porting this to Metal and using actual subgroup ballot operations. +That results in ~3G el/s, though some of the speedup is vanilla wgpu inefficiency. +Also note that to implement this algorithm correctly requires a subgroup barrier (simdgroup_barrier in Metal Shading Language), and that this primitive is not in the WebGPU subgroup proposal (see gpuweb#4437). +However, on M1 Max, placing a stronger threadgroup barrier is only a 2% slowdown, so this matter is not urgent.

+

Attempts to push this experiment to 8 bits per digit have not yet yielded sustainable performance improvement.

+

Several people have pointed out the Onesweep inspired sort from Lichtso, part of the splatter Gaussian Splat implementation. +However, as discussed in splatter#2, it is an approximate sort only, and may rely on luck that the particular GPU will process atomics within a subgroup in order. +In addition, because it is one-pass, on GPUs without a forward progress guarantee (of which Apple Silicon is especially noticeable), the algorithm may deadlock or experience extended stalls. +The experiment mentioned above has neither of these shortcomings. +Note that it does achieve 8 bits per pass; it is entirely likely that a high performance implementation could draw inspiration from it, more so after subgroups land in WebGPU and thus real warp-level multi-split is possible.

+

DeviceRadixSort

+

Aras Pranckevičius has been doing lots of experiments with sorting in his UnityGaussianSplatting implementation, all written in the Unity flavor of HLSL. +UnityGaussianSplatting#82 adds something called DeviceRadixSort which shows a modest performance improvement (the discussion thread also speaks to the difficulty of implementing such things portably). +It uses 8 bit digits, and a subgroup implementation of warp-local multi-split. +This implementation is attempting to be portable to a range of subgroup sizes, but is untested on wave sizes other than 32 and is still under development.

+

The author, Thomas Smith, has done experiments comparing reduce-then-scan against a chained single-pass approach for the global histogram scan, which suggest that the latter has approximately a 10% performance gain on Nvidia hardware, but pose considerable challenges for portability. +Single-pass approaches will not perform well on devices without a forward progress guarantee.

+

Hybrid Radix Sort

+

Hybrid Radix sort is another strong contender, fundamentally based on an MSD approach but with additional mechanisms to reduce memory bandwidth. +It has better performance in some cases than Onesweep. +Like Onesweep, it manages 8 bits per pass. +That said, it is considerably more complicated, and it's also not clear how easily it would translate to WebGPU.

+

Merge sort

+

Modern GPU has a well documented mergesort, also readily adapted to segmented sort. +It is older, and performance numbers from newer papers suggest that it has been surpassed. +That said, the segmented sort capability may be valuable.

+

Forma has a sorting implementation called conveyor_sort. +This is a merge sort and is in vanilla WebGPU. +Performance has not been characterized yet.

+

Bitonic sort

+

Bitonic sort is often proposed as it is conceptually fairly simple and the parallelism is easy to exploit, but when applied to large problems it is clear that the number of passes is unacceptably large; typically in the dozens where a radix sort would have 4 or 8.

+

Discussion

+

There is active discussion of this issue in the Sorting revisited Zulip thread. +Resources and measurements from implementations can be discussed there, then hopefully added to this wiki page.

+ + +
+
+ + + diff --git a/wiki/index.html b/wiki/index.html new file mode 100644 index 0000000..4a97870 --- /dev/null +++ b/wiki/index.html @@ -0,0 +1,128 @@ + + + + + + + + | Homepage for the Linebender organization + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Wiki

+

Changes to this Wiki are welcome; send a pull request to the linebender.github.io repo, which will be merged without +detailed review.

+

Note that math is supported between two dollar signs $$ thanks to MathJax. +For example, $$x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$$ outputs $$x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$$

+

Wiki pages available:

+ + + +
+
+ + + diff --git a/wiki/long-term-roadmap/index.html b/wiki/long-term-roadmap/index.html new file mode 100644 index 0000000..46d524d --- /dev/null +++ b/wiki/long-term-roadmap/index.html @@ -0,0 +1,230 @@ + + + + + + + + Post-July Linebender roadmap - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Post-July Linebender roadmap

+

Unstructured notes from the RustNL roadmap brainstorming that were left out of the May-July roadmap blog post.

+

This may become a living document, eg a long-term roadmap for the project. For now it's the post-July roadmap.

+

Vello

+
    +
  • Emoji
  • +
  • Image filters / blur / shadows +
      +
    • Render graph (Raph to drive, see thread)
    • +
    +
  • +
  • Gpu embedding / wgpu engine abstraction (see Servo thread)
  • +
  • Glyph caching +
      +
    • Render graph? 
    • +
    • or CPU side? 
    • +
    • (sparse strips probably)
    • +
    +
  • +
  • Frame pacing
  • +
  • Damage regions +
      +
    • MVP: just render sub-rects
    • +
    +
  • +
  • CPU impl +
      +
    • Testing
    • +
    • Downlevel
    • +
    +
  • +
  • Fuzzing?
  • +
+

Masonry

+
    +
  • ‘Compositing’
  • +
  • Frame pacing (relevant to Vello and AccessKit)
  • +
  • Damage regions
  • +
  • Styling options
  • +
  • Copy features from Tomorrow Corporation Tech Demo
  • +
+

Parley

+
    +
  • IME support +
      +
    • Suggestion regions?
    • +
    +
  • +
  • Split out blob & other vocabulary types +
      +
    • Blob may be prioritized by other project needs
    • +
    +
  • +
+

Xilem

+
    +
  • Android +
      +
    • Material UI style widgets/views? Requires styling
    • +
    +
  • +
  • Styling
  • +
  • Hot reloading
  • +
  • Async behavior in Masonry widgets (image loading etc)
  • +
  • Cleanup run for issues and PRs
  • +
+

AccessKit

+
    +
  • +

    Haven’t talked about it a lot

    +
      +
    • Improve documentation (see #402)
    • +
    • Point to / create a repository of accessibility best practices.
    • +
    • Not just code, also social: Have people with disabilities test your stuff!
    • +
    • Point to resources, forums, etc? Need to talk to Matt about this. (What were the best practices at Microsoft?)
    • +
    • Accessibility isn’t just screen readers. Also color contrast, customizing size, IME support, motor disabilities (avoid stuff that requires simultaneous input).
    • +
    +
  • +
  • +

    “Accessibility is more than adding a dependency to AccessKit”

    +
      +
    • (Olivier: Note to self: include GMTK video about Celeste Assist Mode)
    • +
    +
  • +
+

Android specific work

+
    +
  • Need to prioritize Android +
      +
    • Masonry: +
        +
      • Hot state for pointer pressed?
      • +
      • Gesture recognition (scrolling) P3 +
          +
        • There is a dumb solution for scrolling without momentum
        • +
        • Potentially adapt code from egui (used in vello demo)
        • +
        +
      • +
      • Pencil gestures
      • +
      • Multitouch
      • +
      • IME +
          +
        • Landing the Lucas Meurer winit PR P1
        • +
        • Extend winit IME PR for richer functionality
        • +
        • Review glazier IME API & come up with design proposal P3 (aaron)
        • +
        • Plumbing suggestion spans etc (winit)
        • +
        +
      • +
      • Accessibility (matt, jul 1+) P-1
      • +
      • Study Tao
      • +
      • To what extent do we tap into Android View etc
      • +
      +
    • +
    • winit future +
        +
      • short term plan: PR functionality into winit
      • +
      • look for natural extension points +
          +
        • these will be platform-specific
        • +
        • Mac: subclassing the NSView/NSApplication subclasses
        • +
        • wayland: messy / smithay has message dispatcher
        • +
        • Android: do we subclass View/Application/Activity? raph will investigate P1 +
            +
          • Accessibility (matt, jul 1+)
          • +
          • Can we access accessibility from native-activity / game-activity?
          • +
          • Note: React Native requires writing Java-land activity
          • +
          • What minimum platform version?
          • +
          +
        • +
        +
      • +
      +
    • +
    • Look at Makepad’s implementation (momentum scrolling etc)
    • +
    +
  • +
+ + +
+
+ + + diff --git a/wiki/office-hours/index.html b/wiki/office-hours/index.html new file mode 100644 index 0000000..f926647 --- /dev/null +++ b/wiki/office-hours/index.html @@ -0,0 +1,96 @@ + + + + + + + + Office hours - Linebender + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Office hours

+

Linebender holds weekly office hours, open to anyone interested in following the project. The best place to find more information is the #office-hours stream on the Zulip chat. The invite is also available through Google Calendar.

+

A Google drive folder holds the archives of the notes.

+ + +
+
+ + + diff --git a/wiki/text/index.html b/wiki/text/index.html new file mode 100644 index 0000000..07823d5 --- /dev/null +++ b/wiki/text/index.html @@ -0,0 +1,180 @@ + + + + + + + + | Homepage for the Linebender organization + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Text

+

Storing, editing and displaying text is hard. As a newcomer to the world of text, I faced almost unfathomable complexity. The aim of this page is to compartmentalize the different aspects of text, to make the complexity as manageable as possible.

+

Overview

+

History

+

Although not strictly necessary to understand text rendering, a brief understanding of how words have been recorded over the millennia helps to explain some of the confusing names and conventions of modern typesetting.

+
    +
  • Written text/calligraphy
  • +
  • The movable-type printing press (Gutenberg 1440) +
      +
    • Brief description of the process of casting type in a foundry, compositing with composing sticks, fixing in a forme with furniture and printing. Sorts (em en quad) Perhaps justification.
    • +
    • fi, fl, ffi, ffl ligatures (nice introduction to the fact there isn't a 1-1 correspondence between characters and glyphs)
    • +
    +
  • +
  • Distinction between font (specific set of type, with a weight, size, etc) and typeface (family of fonts) + +
  • +
  • Hot metal typesetting
  • +
  • CRT displays - an alternative to paper
  • +
  • Raster image processors, dots, PostScript, DPI?
  • +
+

Text data

+

The usual suspects:

+
    +
  • ASCII
  • +
  • Unicode +
      +
    • Graphemes, grapheme clusters, normalization, segmentation: all that good stuff
    • +
    • +
    • in particular, things like sentence break, soft line break, hard line break, character classes
    • +
    • RTL, Bidi
    • +
    +
  • +
  • UTF-{8, 16, 32} +
      +
    • in particular, UTF-16 surrogates, BOM
    • +
    +
  • +
+

Fonts

+
    +
  • Fonts vs. typefaces
  • +
  • Classes of typefaces (monotype, italic, ...)
  • +
  • Computer representations of fonts. Bitmap/truetype/opentype (raster vs vector)
  • +
  • System default fonts, font fallback chains, locations of fonts on windows/mac/linux
  • +
  • Modern opentype tables for things like font color, variable fonts
  • +
  • Emojis 😊
  • +
  • em quadrat (width of 'M'), en quadrat
  • +
+

Shaping

+

Shaping is essentially characters -> glyphs

+
    +
  • Latin is almost 1-1 (apart from ligatures, other things?)
  • +
  • Devanagari/Arabic/Hebrew (also RTL)
  • +
+

Layout

+
    +
  • Line breaks
  • +
  • Page breaks & layout when you have pages (e.g. not on the web)
  • +
  • Often backwards-and-forwards between layout and shaping - try different shaping runs and see how much room they take up, ...
  • +
  • Text layout data structures +
      +
    • Layout is expensive, so if the text doesn't change you probably want to compute the layout and store it.
    • +
    +
  • +
+

Rendering

+
    +
  • Bitmap vs
  • +
  • Link to curves page
  • +
+

Localization

+

Although not strictly a part of text rendering, it is also worth mentioning localization alongside the other sections, many of which also deal implicitly with localization themselves. Here we cover some topics in localization that are not explicitly mentioned elsewhere.

+
    +
  • Dates
  • +
  • Numbers
  • +
+

Misc

+

TODO find a suitable section for these topics

+
    +
  • IME
  • +
+ +
    + + +
+ +
+
+ + +